PCEtLQ0KICAgIA0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KICAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCiAgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAgICANCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCiAgICANCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoNCi0tPg0KPCEtLSAkUmV2OiAzNTYwNTIgJCAkRGF0ZTogMjAwNS0xMi0xMSAxNDo0MToyMCAtMDgwMCAoZGltLiwgMTEgZHapYy4gMjAwNSkgJCAtLT4NCjxodG1sPg0KPGhlYWQ+DQo8dGl0bGU+U2VydmljZU1peCBCcmlkZ2UgRXhhbXBsZTwvdGl0bGU+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQp2YXIgdXJsVG9PcGVuID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODE5Mi9icmlkZ2UvIjsgLy9kZWZhdWx0IFVSTCB0byBvcGVuDQoNCmZ1bmN0aW9uIGdldEhUVFBPYmplY3QoKSB7DQogIHZhciB4bWxodHRwID0gZmFsc2U7DQoNCiAgLyogQ29tcGlsYXRpb24gY29uZGl0aW9ubmVsbGUgZCdJRSAqLw0KICAvKkBjY19vbg0KICBAaWYgKEBfanNjcmlwdF92ZXJzaW9uID49IDUpDQogICAgIHRyeSB7DQogICAgICAgIHhtbGh0dHAgPSBuZXcgQWN0aXZlWE9iamVjdCgiTXN4bWwyLlhNTEhUVFAiKTsNCiAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICB0cnkgew0KICAgICAgICAgICB4bWxodHRwID0gbmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIik7DQogICAgICAgIH0gY2F0Y2ggKEUpIHsNCiAgICAgICAgICAgeG1saHR0cCA9IGZhbHNlOw0KICAgICAgICB9DQogICAgIH0NCiAgQGVsc2UNCiAgICAgeG1saHR0cCA9IGZhbHNlOw0KICBAZW5kIEAqLw0KDQogIC8qIG9uIGVzc2FpZSBkZSBjcullciBsJ29iamV0IHNpIGNlIG4nZXN0IHBhcyBk6WrgIGZhaXQgKi8NCiAgaWYgKCF4bWxodHRwICYmIHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPSAndW5kZWZpbmVkJykgew0KICAgICB0cnkgew0KICAgICAgICB4bWxodHRwID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7DQogICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgeG1saHR0cCA9IGZhbHNlOw0KICAgICB9DQogIH0NCg0KICBpZiAoeG1saHR0cCkgew0KICAgICAvKiBvbiBk6WZpbml0IGNlIHF1aSBkb2l0IHNlIHBhc3NlciBxdWFuZCBsYSBwYWdlIHLpcG9uZHJhICovDQogICAgIHhtbGh0dHAub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAoeG1saHR0cC5yZWFkeVN0YXRlID09IDQpIHsgLyogNCA6IOl0YXQgImNvbXBsZXRlIiAqLw0KICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVzcG9uc2UiKTsNCiAgICAgICAgICAgdmFyIHJlc3BvbnNlU3RhdHVzID0gIiI7DQogICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgcmVzcG9uc2VTdGF0dXMgPSB4bWxodHRwLnN0YXR1cyArICIiOw0KICAgICAgICAgICB9IGNhdGNoIChlKSB7DQogICAgICAgICAgICAgcmVzcG9uc2VTdGF0dXMgPSAiRVJST1IgV0hJTEUgUkVUUklFVklORyBTVEFUVVM7IE1BWUJFIFVOQUJMRSBUTyBDT05ORUNULiI7DQogICAgICAgICAgIH0NCiAgICAgICAgICAgcmVzcG9uc2UudmFsdWUgPSAiU1RBVFVTOiAiICsgcmVzcG9uc2VTdGF0dXMgKyAiXG4iICsgeG1saHR0cC5yZXNwb25zZVRleHQ7DQogICAgICAgIH0NCiAgICAgfQ0KICB9DQogIHJldHVybiB4bWxodHRwOw0KfQ0KDQpmdW5jdGlvbiBzZW5kKCkgew0KICBpZiAoKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ1cmxUb09wZW4iKS52YWx1ZSAhPSB1cmxUb09wZW4pICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidXJsVG9PcGVuIikudmFsdWUgIT0gIiIpKSB7DQogICAgLy91c2UgdXNlciBlbnRyeSBvbmx5IGlmIGl0IGF0IGxlYXN0IGNhbiBiZSBva2F5DQogICAgdXJsVG9PcGVuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInVybFRvT3BlbiIpLnZhbHVlOw0KICB9ICANCiAgdmFyIHhtbGh0dHAgPSBnZXRIVFRQT2JqZWN0KCk7DQogIGlmICgheG1saHR0cCkgew0KICAgIGFsZXJ0KCdjb3VuZCBub3QgY3JlYXRlIFhNTEh0dHBSZXF1ZXN0IG9iamVjdCcpOw0KICAgIHJldHVybjsNCiAgfQ0KICB2YXIgcmVxdWVzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXF1ZXN0Iik7DQogIHZhciByZXNwb25zZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXNwb25zZSIpOyAgDQogIHRyeSB7DQogICAgbmV0c2NhcGUuc2VjdXJpdHkuUHJpdmlsZWdlTWFuYWdlci5lbmFibGVQcml2aWxlZ2UoIlVuaXZlcnNhbEJyb3dzZXJSZWFkIFVuaXZlcnNhbEJyb3dzZXJXcml0ZSIpOw0KICB9IGNhdGNoIChlKSB7DQogIH0NCiAgdHJ5IHsNCiAgICB4bWxodHRwLm9wZW4oIlBPU1QiLCB1cmxUb09wZW4sIHRydWUpOw0KICB9IGNhdGNoIChlKSB7DQogICAgYWxlcnQoJ0Vycm9yIG9wZW5pbmcgY29ubmVjdGlvbicpOw0KICB9DQogIHhtbGh0dHAuc2VuZChyZXF1ZXN0LnZhbHVlKTsNCn0NCg0KPC9zY3JpcHQ+DQo8L2hlYWQ+DQoNCjxib2R5Pg0KDQo8aDE+U2VydmljZU1peCBCcmlkZ2UgRXhhbXBsZTwvaDE+DQoNCjxwPldlbGNvbWUgdG8gdGhlIEJyaWRnZSBleGFtcGxlIGZvciBTZXJ2aWNlTWl4LjwvcD4NCg0KPHA+UGVyZm9ybSBhIFBPU1QgaW50byB0aGUgSFRUUCBiaW5kaW5nLiBUaGlzIHJlcXVpcmVzIEphdmFTY3JpcHQuPC9wPiANCjxwPlRhcmdldDogPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjUwIiBpZD0idXJsVG9PcGVuIiB2YWx1ZT0iIj48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInVybFRvT3BlbiIpLnZhbHVlID0gdXJsVG9PcGVuOzwvc2NyaXB0Pi48L3A+DQoNCg0KPHRhYmxlPg0KICA8dHI+DQogICAgPHRkPg0KICA8dGV4dGFyZWEgaWQ9InJlcXVlc3QiIHN0eWxlPSJ3aWR0aDo2MDBweDtoZWlnaHQ6NDAwcHgiIG9uS2V5VXA9InNlbmQoKTsiPjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQo8ZTpFbnZlbG9wZSB4bWxuczplPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+DQogIDxlOkJvZHk+DQogICAgPHBpbmc+DQogICAgICA8cGluZ1JlcXVlc3Q+DQogICAgICAgIDxtZXNzYWdlIHhtbG5zPSJodHRwOi8vc29hcCI+aGVsIGxvPC9tZXNzYWdlPg0KICAgICAgPC9waW5nUmVxdWVzdD4NCiAgICA8L3Bpbmc+DQogIDwvZTpCb2R5Pg0KPC9lOkVudmVsb3BlPg0KDQogIDwvdGV4dGFyZWE+DQogICAgPC90ZD4NCiAgICA8dGQ+DQogIDx0ZXh0YXJlYSBpZD0icmVzcG9uc2UiIHN0eWxlPSJ3aWR0aDo2MDBweDtoZWlnaHQ6NDAwcHgiPg0KICA8L3RleHRhcmVhPg0KICAgIDwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQgY29sc3Bhbj0yPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iU2VuZCIgb25DbGljaz0ic2VuZCgpOyIvPg0KICAgIDwvdGQ+DQogIDwvdHI+DQo8L3RhYmxlPg0KPC9ib2R5Pg0KPC9odG1sPg0K