Advertisement
galih039

onpage

Dec 9th, 2017
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 48.66 KB | None | 0 0
  1. PD9waHANCi8qKg0KICogTWFnZW50bw0KICoNCiAqIE5PVElDRSBPRiBMSUNFTlNFDQogKg0KICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApDQogKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS50eHQuDQogKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDoNCiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMy4wLnBocA0KICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8NCiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWwNCiAqIHRvIGxpY2Vuc2VAbWFnZW50b2NvbW1lcmNlLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5Lg0KICoNCiAqIERJU0NMQUlNRVINCiAqDQogKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgTWFnZW50byB0byBuZXdlcg0KICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIE1hZ2VudG8gZm9yIHlvdXINCiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwOi8vd3d3Lm1hZ2VudG9jb21tZXJjZS5jb20gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQogKg0KICogQGNhdGVnb3J5ICAgIE1hZ2UNCiAqIEBwYWNrYWdlICAgICBNYWdlX0NoZWNrb3V0IChCdWc3c2VjIFRlYW0pDQogKiBAY29weXJpZ2h0ICAgQ29weXJpZ2h0IChjKSAyMDE0IE1hZ2VudG8gSW5jLiAoaHR0cDovL3d3dy5tYWdlbnRvY29tbWVyY2UuY29tKQ0KICogQGxpY2Vuc2UgICAgIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMy4wLnBocCAgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKQ0KICovDQoNCi8qKg0KICogT25lIHBhZ2UgY2hlY2tvdXQgcHJvY2Vzc2luZyBtb2RlbA0KICovDQpjbGFzcyBNYWdlX0NoZWNrb3V0X01vZGVsX1R5cGVfT25lcGFnZQ0Kew0KICAgIC8qKg0KICAgICAqIENoZWNrb3V0IHR5cGVzOiBDaGVja291dCBhcyBHdWVzdCwgUmVnaXN0ZXIsIExvZ2dlZCBJbiBDdXN0b21lcg0KICAgICAqLw0KICAgIGNvbnN0IE1FVEhPRF9HVUVTVCAgICA9ICdndWVzdCc7DQogICAgY29uc3QgTUVUSE9EX1JFR0lTVEVSID0gJ3JlZ2lzdGVyJzsNCiAgICBjb25zdCBNRVRIT0RfQ1VTVE9NRVIgPSAnY3VzdG9tZXInOw0KDQogICAgLyoqDQogICAgICogRXJyb3IgbWVzc2FnZSBvZiAiY3VzdG9tZXIgYWxyZWFkeSBleGlzdHMiDQogICAgICoNCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqLw0KICAgIHByaXZhdGUgJF9jdXN0b21lckVtYWlsRXhpc3RzTWVzc2FnZSA9ICcnOw0KDQogICAgLyoqDQogICAgICogQHZhciBNYWdlX0N1c3RvbWVyX01vZGVsX1Nlc3Npb24NCiAgICAgKi8NCiAgICBwcm90ZWN0ZWQgJF9jdXN0b21lclNlc3Npb247DQoNCiAgICAvKioNCiAgICAgKiBAdmFyIE1hZ2VfQ2hlY2tvdXRfTW9kZWxfU2Vzc2lvbg0KICAgICAqLw0KICAgIHByb3RlY3RlZCAkX2NoZWNrb3V0U2Vzc2lvbjsNCg0KICAgIC8qKg0KICAgICAqIEB2YXIgTWFnZV9TYWxlc19Nb2RlbF9RdW90ZQ0KICAgICAqLw0KICAgIHByb3RlY3RlZCAkX3F1b3RlID0gbnVsbDsNCg0KICAgIC8qKg0KICAgICAqIEB2YXIgTWFnZV9DaGVja291dF9IZWxwZXJfRGF0YQ0KICAgICAqLw0KICAgIHByb3RlY3RlZCAkX2hlbHBlcjsNCg0KICAgIC8qKg0KICAgICAqIENsYXNzIGNvbnN0cnVjdG9yDQogICAgICogU2V0IGN1c3RvbWVyIGFscmVhZHkgZXhpc3RzIG1lc3NhZ2UNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQ0KICAgIHsNCiAgICAgICAgJHRoaXMtPl9oZWxwZXIgPSBNYWdlOjpoZWxwZXIoJ2NoZWNrb3V0Jyk7DQogICAgICAgICR0aGlzLT5fY3VzdG9tZXJFbWFpbEV4aXN0c01lc3NhZ2UgPSBNYWdlOjpoZWxwZXIoJ2NoZWNrb3V0JyktPl9fKCdUaGVyZSBpcyBhbHJlYWR5IGEgY3VzdG9tZXIgcmVnaXN0ZXJlZCB1c2luZyB0aGlzIGVtYWlsIGFkZHJlc3MuIFBsZWFzZSBsb2dpbiB1c2luZyB0aGlzIGVtYWlsIGFkZHJlc3Mgb3IgZW50ZXIgYSBkaWZmZXJlbnQgZW1haWwgYWRkcmVzcyB0byByZWdpc3RlciB5b3VyIGFjY291bnQuJyk7DQogICAgICAgICR0aGlzLT5fY2hlY2tvdXRTZXNzaW9uID0gTWFnZTo6Z2V0U2luZ2xldG9uKCdjaGVja291dC9zZXNzaW9uJyk7DQogICAgICAgICR0aGlzLT5fY3VzdG9tZXJTZXNzaW9uID0gTWFnZTo6Z2V0U2luZ2xldG9uKCdjdXN0b21lci9zZXNzaW9uJyk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogR2V0IGZyb250ZW5kIGNoZWNrb3V0IHNlc3Npb24gb2JqZWN0DQogICAgICoNCiAgICAgKiBAcmV0dXJuIE1hZ2VfQ2hlY2tvdXRfTW9kZWxfU2Vzc2lvbg0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDaGVja291dCgpDQogICAgew0KICAgICAgICByZXR1cm4gJHRoaXMtPl9jaGVja291dFNlc3Npb247DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUXVvdGUgb2JqZWN0IGdldHRlcg0KICAgICAqDQogICAgICogQHJldHVybiBNYWdlX1NhbGVzX01vZGVsX1F1b3RlDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGdldFF1b3RlKCkNCiAgICB7DQogICAgICAgIGlmICgkdGhpcy0+X3F1b3RlID09PSBudWxsKSB7DQogICAgICAgICAgICByZXR1cm4gJHRoaXMtPl9jaGVja291dFNlc3Npb24tPmdldFF1b3RlKCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICR0aGlzLT5fcXVvdGU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRGVjbGFyZSBjaGVja291dCBxdW90ZSBpbnN0YW5jZQ0KICAgICAqDQogICAgICogQHBhcmFtIE1hZ2VfU2FsZXNfTW9kZWxfUXVvdGUgJHF1b3RlDQogICAgICogQHJldHVybiBNYWdlX0NoZWNrb3V0X01vZGVsX1R5cGVfT25lcGFnZQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRRdW90ZShNYWdlX1NhbGVzX01vZGVsX1F1b3RlICRxdW90ZSkNCiAgICB7DQogICAgICAgICR0aGlzLT5fcXVvdGUgPSAkcXVvdGU7DQogICAgICAgIHJldHVybiAkdGhpczsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBHZXQgY3VzdG9tZXIgc2Vzc2lvbiBvYmplY3QNCiAgICAgKg0KICAgICAqIEByZXR1cm4gTWFnZV9DdXN0b21lcl9Nb2RlbF9TZXNzaW9uDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGdldEN1c3RvbWVyU2Vzc2lvbigpDQogICAgew0KICAgICAgICByZXR1cm4gJHRoaXMtPl9jdXN0b21lclNlc3Npb247DQogICAgfQ0KDQogICAgLyoqDQogICAgICogSW5pdGlhbGl6ZSBxdW90ZSBzdGF0ZSB0byBiZSB2YWxpZCBmb3Igb25lIHBhZ2UgY2hlY2tvdXQNCiAgICAgKg0KICAgICAqIEByZXR1cm4gTWFnZV9DaGVja291dF9Nb2RlbF9UeXBlX09uZXBhZ2UNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gaW5pdENoZWNrb3V0KCkNCiAgICB7DQogICAgICAgICRjaGVja291dCA9ICR0aGlzLT5nZXRDaGVja291dCgpOw0KICAgICAgICAkY3VzdG9tZXJTZXNzaW9uID0gJHRoaXMtPmdldEN1c3RvbWVyU2Vzc2lvbigpOw0KICAgICAgICBpZiAoaXNfYXJyYXkoJGNoZWNrb3V0LT5nZXRTdGVwRGF0YSgpKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJGNoZWNrb3V0LT5nZXRTdGVwRGF0YSgpIGFzICRzdGVwPT4kZGF0YSkgew0KICAgICAgICAgICAgICAgIGlmICghKCRzdGVwPT09J2xvZ2luJyB8fCAkY3VzdG9tZXJTZXNzaW9uLT5pc0xvZ2dlZEluKCkgJiYgJHN0ZXA9PT0nYmlsbGluZycpKSB7DQogICAgICAgICAgICAgICAgICAgICRjaGVja291dC0+c2V0U3RlcERhdGEoJHN0ZXAsICdhbGxvdycsIGZhbHNlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvKioNCiAgICAgICAgICogUmVzZXQgbXVsdGlzaGlwcGluZyBmbGFnIGJlZm9yZSBhbnkgbWFuaXB1bGF0aW9ucyB3aXRoIHF1b3RlIGFkZHJlc3MNCiAgICAgICAgICogYWRkQWRkcmVzcyBtZXRob2QgZm9yIHF1b3RlIG9iamVjdCByZWxhdGVkIG9uIHRoaXMgZmxhZw0KICAgICAgICAgKi8NCiAgICAgICAgaWYgKCR0aGlzLT5nZXRRdW90ZSgpLT5nZXRJc011bHRpU2hpcHBpbmcoKSkgew0KICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNldElzTXVsdGlTaGlwcGluZyhmYWxzZSk7DQogICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+c2F2ZSgpOw0KICAgICAgICB9DQoNCiAgICAgICAgLyoNCiAgICAgICAgKiB3YW50IHRvIGxvYWQgdGhlIGNvcnJlY3QgY3VzdG9tZXIgaW5mb3JtYXRpb24gYnkgYXNzaWduaW5nIHRvIGFkZHJlc3MNCiAgICAgICAgKiBpbnN0ZWFkIG9mIGp1c3QgbG9hZGluZyBmcm9tIHNhbGVzL3F1b3RlX2FkZHJlc3MNCiAgICAgICAgKi8NCiAgICAgICAgJGN1c3RvbWVyID0gJGN1c3RvbWVyU2Vzc2lvbi0+Z2V0Q3VzdG9tZXIoKTsNCiAgICAgICAgaWYgKCRjdXN0b21lcikgew0KICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPmFzc2lnbkN1c3RvbWVyKCRjdXN0b21lcik7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICR0aGlzOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEdldCBxdW90ZSBjaGVja291dCBtZXRob2QNCiAgICAgKg0KICAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGdldENoZWNrb3V0TWV0aG9kKCkNCiAgICB7DQogICAgICAgIGlmICgkdGhpcy0+Z2V0Q3VzdG9tZXJTZXNzaW9uKCktPmlzTG9nZ2VkSW4oKSkgew0KICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok1FVEhPRF9DVVNUT01FUjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoISR0aGlzLT5nZXRRdW90ZSgpLT5nZXRDaGVja291dE1ldGhvZCgpKSB7DQogICAgICAgICAgICBpZiAoJHRoaXMtPl9oZWxwZXItPmlzQWxsb3dlZEd1ZXN0Q2hlY2tvdXQoJHRoaXMtPmdldFF1b3RlKCkpKSB7DQogICAgICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNldENoZWNrb3V0TWV0aG9kKHNlbGY6Ok1FVEhPRF9HVUVTVCk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zZXRDaGVja291dE1ldGhvZChzZWxmOjpNRVRIT0RfUkVHSVNURVIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0Q2hlY2tvdXRNZXRob2QoKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBHZXQgcXVvdGUgY2hlY2tvdXQgbWV0aG9kDQogICAgICoNCiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjQuMC4xDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hlY2tvdXRNZWhvZCgpDQogICAgew0KICAgICAgICByZXR1cm4gJHRoaXMtPmdldENoZWNrb3V0TWV0aG9kKCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogU3BlY2lmeSBjaGVja291dCBtZXRob2QNCiAgICAgKg0KICAgICAqIEBwYXJhbSAgIHN0cmluZyAkbWV0aG9kDQogICAgICogQHJldHVybiAgYXJyYXkNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gc2F2ZUNoZWNrb3V0TWV0aG9kKCRtZXRob2QpDQogICAgew0KICAgICAgICBpZiAoZW1wdHkoJG1ldGhvZCkpIHsNCiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IC0xLCAnbWVzc2FnZScgPT4gTWFnZTo6aGVscGVyKCdjaGVja291dCcpLT5fXygnSW52YWxpZCBkYXRhLicpKTsNCiAgICAgICAgfQ0KDQogICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zZXRDaGVja291dE1ldGhvZCgkbWV0aG9kKS0+c2F2ZSgpOw0KICAgICAgICAkdGhpcy0+Z2V0Q2hlY2tvdXQoKS0+c2V0U3RlcERhdGEoJ2JpbGxpbmcnLCAnYWxsb3cnLCB0cnVlKTsNCiAgICAgICAgcmV0dXJuIGFycmF5KCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogR2V0IGN1c3RvbWVyIGFkZHJlc3MgYnkgaWRlbnRpZmllcg0KICAgICAqDQogICAgICogQHBhcmFtICAgaW50ICRhZGRyZXNzSWQNCiAgICAgKiBAcmV0dXJuICBNYWdlX0N1c3RvbWVyX01vZGVsX0FkZHJlc3MNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QWRkcmVzcygkYWRkcmVzc0lkKQ0KICAgIHsNCiAgICAgICAgJGFkZHJlc3MgPSBNYWdlOjpnZXRNb2RlbCgnY3VzdG9tZXIvYWRkcmVzcycpLT5sb2FkKChpbnQpJGFkZHJlc3NJZCk7DQogICAgICAgICRhZGRyZXNzLT5leHBsb2RlU3RyZWV0QWRkcmVzcygpOw0KICAgICAgICBpZiAoJGFkZHJlc3MtPmdldFJlZ2lvbklkKCkpIHsNCiAgICAgICAgICAgICRhZGRyZXNzLT5zZXRSZWdpb24oJGFkZHJlc3MtPmdldFJlZ2lvbklkKCkpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkYWRkcmVzczsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBTYXZlIGJpbGxpbmcgYWRkcmVzcyBpbmZvcm1hdGlvbiB0byBxdW90ZQ0KICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBPbmUgUGFnZSBDaGVja291dCBKUyAoQUpBWCkgd2hpbGUgc2F2aW5nIHRoZSBiaWxsaW5nIGluZm9ybWF0aW9uLg0KICAgICAqDQogICAgICogQHBhcmFtICAgYXJyYXkgJGRhdGENCiAgICAgKiBAcGFyYW0gICBpbnQgJGN1c3RvbWVyQWRkcmVzc0lkDQogICAgICogQHJldHVybiAgTWFnZV9DaGVja291dF9Nb2RlbF9UeXBlX09uZXBhZ2UNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gc2F2ZUJpbGxpbmcoJGRhdGEsICRjdXN0b21lckFkZHJlc3NJZCkNCiAgICB7DQogICAgICAgIGlmIChlbXB0eSgkZGF0YSkpIHsNCiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IC0xLCAnbWVzc2FnZScgPT4gTWFnZTo6aGVscGVyKCdjaGVja291dCcpLT5fXygnSW52YWxpZCBkYXRhLicpKTsNCiAgICAgICAgfQ0KDQogICAgICAgICRhZGRyZXNzID0gJHRoaXMtPmdldFF1b3RlKCktPmdldEJpbGxpbmdBZGRyZXNzKCk7DQogICAgICAgIC8qIEB2YXIgJGFkZHJlc3NGb3JtIE1hZ2VfQ3VzdG9tZXJfTW9kZWxfRm9ybSAqLw0KICAgICAgICAkYWRkcmVzc0Zvcm0gPSBNYWdlOjpnZXRNb2RlbCgnY3VzdG9tZXIvZm9ybScpOw0KICAgICAgICAkYWRkcmVzc0Zvcm0tPnNldEZvcm1Db2RlKCdjdXN0b21lcl9hZGRyZXNzX2VkaXQnKQ0KICAgICAgICAgICAgLT5zZXRFbnRpdHlUeXBlKCdjdXN0b21lcl9hZGRyZXNzJykNCiAgICAgICAgICAgIC0+c2V0SXNBamF4UmVxdWVzdChNYWdlOjphcHAoKS0+Z2V0UmVxdWVzdCgpLT5pc0FqYXgoKSk7DQoNCiAgICAgICAgaWYgKCFlbXB0eSgkY3VzdG9tZXJBZGRyZXNzSWQpKSB7DQogICAgICAgICAgICAkY3VzdG9tZXJBZGRyZXNzID0gTWFnZTo6Z2V0TW9kZWwoJ2N1c3RvbWVyL2FkZHJlc3MnKS0+bG9hZCgkY3VzdG9tZXJBZGRyZXNzSWQpOw0KICAgICAgICAgICAgaWYgKCRjdXN0b21lckFkZHJlc3MtPmdldElkKCkpIHsNCiAgICAgICAgICAgICAgICBpZiAoJGN1c3RvbWVyQWRkcmVzcy0+Z2V0Q3VzdG9tZXJJZCgpICE9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRDdXN0b21lcklkKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJyA9PiBNYWdlOjpoZWxwZXIoJ2NoZWNrb3V0JyktPl9fKCdDdXN0b21lciBBZGRyZXNzIGlzIG5vdCB2YWxpZC4nKQ0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICRhZGRyZXNzLT5pbXBvcnRDdXN0b21lckFkZHJlc3MoJGN1c3RvbWVyQWRkcmVzcyktPnNldFNhdmVJbkFkZHJlc3NCb29rKDApOw0KICAgICAgICAgICAgICAgICRhZGRyZXNzRm9ybS0+c2V0RW50aXR5KCRhZGRyZXNzKTsNCiAgICAgICAgICAgICAgICAkYWRkcmVzc0Vycm9ycyAgPSAkYWRkcmVzc0Zvcm0tPnZhbGlkYXRlRGF0YSgkYWRkcmVzcy0+Z2V0RGF0YSgpKTsNCiAgICAgICAgICAgICAgICBpZiAoJGFkZHJlc3NFcnJvcnMgIT09IHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gMSwgJ21lc3NhZ2UnID0+ICRhZGRyZXNzRXJyb3JzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkYWRkcmVzc0Zvcm0tPnNldEVudGl0eSgkYWRkcmVzcyk7DQogICAgICAgICAgICAvLyBlbXVsYXRlIHJlcXVlc3Qgb2JqZWN0DQogICAgICAgICAgICAkYWRkcmVzc0RhdGEgICAgPSAkYWRkcmVzc0Zvcm0tPmV4dHJhY3REYXRhKCRhZGRyZXNzRm9ybS0+cHJlcGFyZVJlcXVlc3QoJGRhdGEpKTsNCiAgICAgICAgICAgICRhZGRyZXNzRXJyb3JzICA9ICRhZGRyZXNzRm9ybS0+dmFsaWRhdGVEYXRhKCRhZGRyZXNzRGF0YSk7DQogICAgICAgICAgICBpZiAoJGFkZHJlc3NFcnJvcnMgIT09IHRydWUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJyA9PiAxLCAnbWVzc2FnZScgPT4gYXJyYXlfdmFsdWVzKCRhZGRyZXNzRXJyb3JzKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkYWRkcmVzc0Zvcm0tPmNvbXBhY3REYXRhKCRhZGRyZXNzRGF0YSk7DQogICAgICAgICAgICAvL3Vuc2V0IGJpbGxpbmcgYWRkcmVzcyBhdHRyaWJ1dGVzIHdoaWNoIHdlcmUgbm90IHNob3duIGluIGZvcm0NCiAgICAgICAgICAgIGZvcmVhY2ggKCRhZGRyZXNzRm9ybS0+Z2V0QXR0cmlidXRlcygpIGFzICRhdHRyaWJ1dGUpIHsNCiAgICAgICAgICAgICAgICBpZiAoIWlzc2V0KCRkYXRhWyRhdHRyaWJ1dGUtPmdldEF0dHJpYnV0ZUNvZGUoKV0pKSB7DQogICAgICAgICAgICAgICAgICAgICRhZGRyZXNzLT5zZXREYXRhKCRhdHRyaWJ1dGUtPmdldEF0dHJpYnV0ZUNvZGUoKSwgTlVMTCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJGFkZHJlc3MtPnNldEN1c3RvbWVyQWRkcmVzc0lkKG51bGwpOw0KICAgICAgICAgICAgLy8gQWRkaXRpb25hbCBmb3JtIGRhdGEsIG5vdCBmZXRjaGVkIGJ5IGV4dHJhY3REYXRhIChhcyBpdCBmZXRjaGVzIG9ubHkgYXR0cmlidXRlcykNCiAgICAgICAgICAgICRhZGRyZXNzLT5zZXRTYXZlSW5BZGRyZXNzQm9vayhlbXB0eSgkZGF0YVsnc2F2ZV9pbl9hZGRyZXNzX2Jvb2snXSkgPyAwIDogMSk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBzZXQgZW1haWwgZm9yIG5ld2x5IGNyZWF0ZWQgdXNlcg0KICAgICAgICBpZiAoISRhZGRyZXNzLT5nZXRFbWFpbCgpICYmICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRDdXN0b21lckVtYWlsKCkpIHsNCiAgICAgICAgICAgICRhZGRyZXNzLT5zZXRFbWFpbCgkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0Q3VzdG9tZXJFbWFpbCgpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIHZhbGlkYXRlIGJpbGxpbmcgYWRkcmVzcw0KICAgICAgICBpZiAoKCR2YWxpZGF0ZVJlcyA9ICRhZGRyZXNzLT52YWxpZGF0ZSgpKSAhPT0gdHJ1ZSkgew0KICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gMSwgJ21lc3NhZ2UnID0+ICR2YWxpZGF0ZVJlcyk7DQogICAgICAgIH0NCg0KICAgICAgICAkYWRkcmVzcy0+aW1wbG9kZVN0cmVldEFkZHJlc3MoKTsNCg0KICAgICAgICBpZiAodHJ1ZSAhPT0gKCRyZXN1bHQgPSAkdGhpcy0+X3ZhbGlkYXRlQ3VzdG9tZXJEYXRhKCRkYXRhKSkpIHsNCiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCEkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0Q3VzdG9tZXJJZCgpICYmIHNlbGY6Ok1FVEhPRF9SRUdJU1RFUiA9PSAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0Q2hlY2tvdXRNZXRob2QoKSkgew0KICAgICAgICAgICAgaWYgKCR0aGlzLT5fY3VzdG9tZXJFbWFpbEV4aXN0cygkYWRkcmVzcy0+Z2V0RW1haWwoKSwgTWFnZTo6YXBwKCktPmdldFdlYnNpdGUoKS0+Z2V0SWQoKSkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJyA9PiAxLCAnbWVzc2FnZScgPT4gJHRoaXMtPl9jdXN0b21lckVtYWlsRXhpc3RzTWVzc2FnZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoISR0aGlzLT5nZXRRdW90ZSgpLT5pc1ZpcnR1YWwoKSkgew0KICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgKiBCaWxsaW5nIGFkZHJlc3MgdXNpbmcgb3Rpb25zDQogICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICR1c2luZ0Nhc2UgPSBpc3NldCgkZGF0YVsndXNlX2Zvcl9zaGlwcGluZyddKSA/IChpbnQpJGRhdGFbJ3VzZV9mb3Jfc2hpcHBpbmcnXSA6IDA7DQoNCiAgICAgICAgICAgIHN3aXRjaCAoJHVzaW5nQ2FzZSkgew0KICAgICAgICAgICAgICAgIGNhc2UgMDoNCiAgICAgICAgICAgICAgICAgICAgJHNoaXBwaW5nID0gJHRoaXMtPmdldFF1b3RlKCktPmdldFNoaXBwaW5nQWRkcmVzcygpOw0KICAgICAgICAgICAgICAgICAgICAkc2hpcHBpbmctPnNldFNhbWVBc0JpbGxpbmcoMCk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgMToNCiAgICAgICAgICAgICAgICAgICAgJGJpbGxpbmcgPSBjbG9uZSAkYWRkcmVzczsNCiAgICAgICAgICAgICAgICAgICAgJGJpbGxpbmctPnVuc0FkZHJlc3NJZCgpLT51bnNBZGRyZXNzVHlwZSgpOw0KICAgICAgICAgICAgICAgICAgICAkc2hpcHBpbmcgPSAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCk7DQogICAgICAgICAgICAgICAgICAgICRzaGlwcGluZ01ldGhvZCA9ICRzaGlwcGluZy0+Z2V0U2hpcHBpbmdNZXRob2QoKTsNCg0KICAgICAgICAgICAgICAgICAgICAvLyBCaWxsaW5nIGFkZHJlc3MgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgYWx3YXlzIGNvcGllZCB0byBzaGlwcGluZyBhZGRyZXNzDQogICAgICAgICAgICAgICAgICAgICRyZXF1aXJlZEJpbGxpbmdBdHRyaWJ1dGVzID0gYXJyYXkoJ2N1c3RvbWVyX2FkZHJlc3NfaWQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCByZXNldCBvcmlnaW5hbCBzaGlwcGluZyBkYXRhLCBpZiBpdCB3YXMgbm90IGNoYW5nZWQgYnkgY3VzdG9tZXINCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHNoaXBwaW5nLT5nZXREYXRhKCkgYXMgJHNoaXBwaW5nS2V5ID0+ICRzaGlwcGluZ1ZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX251bGwoJHNoaXBwaW5nVmFsdWUpICYmICFpc19udWxsKCRiaWxsaW5nLT5nZXREYXRhKCRzaGlwcGluZ0tleSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWlzc2V0KCRkYXRhWyRzaGlwcGluZ0tleV0pICYmICFpbl9hcnJheSgkc2hpcHBpbmdLZXksICRyZXF1aXJlZEJpbGxpbmdBdHRyaWJ1dGVzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJpbGxpbmctPnVuc2V0RGF0YSgkc2hpcHBpbmdLZXkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICRzaGlwcGluZy0+YWRkRGF0YSgkYmlsbGluZy0+Z2V0RGF0YSgpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRTYW1lQXNCaWxsaW5nKDEpDQogICAgICAgICAgICAgICAgICAgICAgICAtPnNldFNhdmVJbkFkZHJlc3NCb29rKDApDQogICAgICAgICAgICAgICAgICAgICAgICAtPnNldFNoaXBwaW5nTWV0aG9kKCRzaGlwcGluZ01ldGhvZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0Q29sbGVjdFNoaXBwaW5nUmF0ZXModHJ1ZSk7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5nZXRDaGVja291dCgpLT5zZXRTdGVwRGF0YSgnc2hpcHBpbmcnLCAnY29tcGxldGUnLCB0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+Y29sbGVjdFRvdGFscygpOw0KICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+c2F2ZSgpOw0KDQogICAgICAgIGlmICghJHRoaXMtPmdldFF1b3RlKCktPmlzVmlydHVhbCgpICYmICR0aGlzLT5nZXRDaGVja291dCgpLT5nZXRTdGVwRGF0YSgnc2hpcHBpbmcnLCAnY29tcGxldGUnKSA9PSB0cnVlKSB7DQogICAgICAgICAgICAvL1JlY29sbGVjdCBTaGlwcGluZyByYXRlcyBmb3Igc2hpcHBpbmcgbWV0aG9kcw0KICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPmdldFNoaXBwaW5nQWRkcmVzcygpLT5zZXRDb2xsZWN0U2hpcHBpbmdSYXRlcyh0cnVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgICR0aGlzLT5nZXRDaGVja291dCgpDQogICAgICAgICAgICAtPnNldFN0ZXBEYXRhKCdiaWxsaW5nJywgJ2FsbG93JywgdHJ1ZSkNCiAgICAgICAgICAgIC0+c2V0U3RlcERhdGEoJ2JpbGxpbmcnLCAnY29tcGxldGUnLCB0cnVlKQ0KICAgICAgICAgICAgLT5zZXRTdGVwRGF0YSgnc2hpcHBpbmcnLCAnYWxsb3cnLCB0cnVlKTsNCg0KICAgICAgICByZXR1cm4gYXJyYXkoKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBWYWxpZGF0ZSBjdXN0b21lciBkYXRhIGFuZCBzZXQgc29tZSBpdHMgZGF0YSBmb3IgZnVydGhlciB1c2FnZSBpbiBxdW90ZQ0KICAgICAqIFdpbGwgcmV0dXJuIGVpdGhlciB0cnVlIG9yIGFycmF5IHdpdGggZXJyb3IgbWVzc2FnZXMNCiAgICAgKg0KICAgICAqIEBwYXJhbSBhcnJheSAkZGF0YQ0KICAgICAqIEByZXR1cm4gdHJ1ZXxhcnJheQ0KICAgICAqLw0KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfdmFsaWRhdGVDdXN0b21lckRhdGEoYXJyYXkgJGRhdGEpDQogICAgew0KICAgICAgICAvKiogQHZhciAkY3VzdG9tZXJGb3JtIE1hZ2VfQ3VzdG9tZXJfTW9kZWxfRm9ybSAqLw0KICAgICAgICAkY3VzdG9tZXJGb3JtID0gTWFnZTo6Z2V0TW9kZWwoJ2N1c3RvbWVyL2Zvcm0nKTsNCiAgICAgICAgJGN1c3RvbWVyRm9ybS0+c2V0Rm9ybUNvZGUoJ2NoZWNrb3V0X3JlZ2lzdGVyJykNCiAgICAgICAgICAgIC0+c2V0SXNBamF4UmVxdWVzdChNYWdlOjphcHAoKS0+Z2V0UmVxdWVzdCgpLT5pc0FqYXgoKSk7DQoNCiAgICAgICAgJHF1b3RlID0gJHRoaXMtPmdldFF1b3RlKCk7DQogICAgICAgIGlmICgkcXVvdGUtPmdldEN1c3RvbWVySWQoKSkgew0KICAgICAgICAgICAgJGN1c3RvbWVyID0gJHF1b3RlLT5nZXRDdXN0b21lcigpOw0KICAgICAgICAgICAgJGN1c3RvbWVyRm9ybS0+c2V0RW50aXR5KCRjdXN0b21lcik7DQogICAgICAgICAgICAkY3VzdG9tZXJEYXRhID0gJHF1b3RlLT5nZXRDdXN0b21lcigpLT5nZXREYXRhKCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAvKiBAdmFyICRjdXN0b21lciBNYWdlX0N1c3RvbWVyX01vZGVsX0N1c3RvbWVyICovDQogICAgICAgICAgICAkY3VzdG9tZXIgPSBNYWdlOjpnZXRNb2RlbCgnY3VzdG9tZXIvY3VzdG9tZXInKTsNCiAgICAgICAgICAgICRjdXN0b21lckZvcm0tPnNldEVudGl0eSgkY3VzdG9tZXIpOw0KICAgICAgICAgICAgJGN1c3RvbWVyUmVxdWVzdCA9ICRjdXN0b21lckZvcm0tPnByZXBhcmVSZXF1ZXN0KCRkYXRhKTsNCiAgICAgICAgICAgICRjdXN0b21lckRhdGEgPSAkY3VzdG9tZXJGb3JtLT5leHRyYWN0RGF0YSgkY3VzdG9tZXJSZXF1ZXN0KTsNCiAgICAgICAgfQ0KDQogICAgICAgICRjdXN0b21lckVycm9ycyA9ICRjdXN0b21lckZvcm0tPnZhbGlkYXRlRGF0YSgkY3VzdG9tZXJEYXRhKTsNCiAgICAgICAgaWYgKCRjdXN0b21lckVycm9ycyAhPT0gdHJ1ZSkgew0KICAgICAgICAgICAgcmV0dXJuIGFycmF5KA0KICAgICAgICAgICAgICAgICdlcnJvcicgICAgID0+IC0xLA0KICAgICAgICAgICAgICAgICdtZXNzYWdlJyAgID0+IGltcGxvZGUoJywgJywgJGN1c3RvbWVyRXJyb3JzKQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICgkcXVvdGUtPmdldEN1c3RvbWVySWQoKSkgew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCg0KICAgICAgICAkY3VzdG9tZXJGb3JtLT5jb21wYWN0RGF0YSgkY3VzdG9tZXJEYXRhKTsNCg0KICAgICAgICBpZiAoJHF1b3RlLT5nZXRDaGVja291dE1ldGhvZCgpID09IHNlbGY6Ok1FVEhPRF9SRUdJU1RFUikgew0KICAgICAgICAgICAgLy8gc2V0IGN1c3RvbWVyIHBhc3N3b3JkDQogICAgICAgICAgICAkY3VzdG9tZXItPnNldFBhc3N3b3JkKCRjdXN0b21lclJlcXVlc3QtPmdldFBhcmFtKCdjdXN0b21lcl9wYXNzd29yZCcpKTsNCiAgICAgICAgICAgICRjdXN0b21lci0+c2V0Q29uZmlybWF0aW9uKCRjdXN0b21lclJlcXVlc3QtPmdldFBhcmFtKCdjb25maXJtX3Bhc3N3b3JkJykpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgLy8gc3Bvb2YgY3VzdG9tZXIgcGFzc3dvcmQgZm9yIGd1ZXN0DQogICAgICAgICAgICAkcGFzc3dvcmQgPSAkY3VzdG9tZXItPmdlbmVyYXRlUGFzc3dvcmQoKTsNCiAgICAgICAgICAgICRjdXN0b21lci0+c2V0UGFzc3dvcmQoJHBhc3N3b3JkKTsNCiAgICAgICAgICAgICRjdXN0b21lci0+c2V0Q29uZmlybWF0aW9uKCRwYXNzd29yZCk7DQogICAgICAgICAgICAvLyBzZXQgTk9UIExPR0dFRCBJTiBncm91cCBpZCBleHBsaWNpdGx5LA0KICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGNvcHlGaWVsZHNldCgnY3VzdG9tZXJfYWNjb3VudCcsICd0b19xdW90ZScpIHdpbGwgZmlsbCBpdCB3aXRoIGRlZmF1bHQgZ3JvdXAgaWQgdmFsdWUNCiAgICAgICAgICAgICRjdXN0b21lci0+c2V0R3JvdXBJZChNYWdlX0N1c3RvbWVyX01vZGVsX0dyb3VwOjpOT1RfTE9HR0VEX0lOX0lEKTsNCiAgICAgICAgfQ0KDQogICAgICAgICRyZXN1bHQgPSAkY3VzdG9tZXItPnZhbGlkYXRlKCk7DQogICAgICAgIGlmICh0cnVlICE9PSAkcmVzdWx0ICYmIGlzX2FycmF5KCRyZXN1bHQpKSB7DQogICAgICAgICAgICByZXR1cm4gYXJyYXkoDQogICAgICAgICAgICAgICAgJ2Vycm9yJyAgID0+IC0xLA0KICAgICAgICAgICAgICAgICdtZXNzYWdlJyA9PiBpbXBsb2RlKCcsICcsICRyZXN1bHQpDQogICAgICAgICAgICApOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCRxdW90ZS0+Z2V0Q2hlY2tvdXRNZXRob2QoKSA9PSBzZWxmOjpNRVRIT0RfUkVHSVNURVIpIHsNCiAgICAgICAgICAgIC8vIHNhdmUgY3VzdG9tZXIgZW5jcnlwdGVkIHBhc3N3b3JkIGluIHF1b3RlDQogICAgICAgICAgICAkcXVvdGUtPnNldFBhc3N3b3JkSGFzaCgkY3VzdG9tZXItPmVuY3J5cHRQYXNzd29yZCgkY3VzdG9tZXItPmdldFBhc3N3b3JkKCkpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIGNvcHkgY3VzdG9tZXIvZ3Vlc3QgZW1haWwgdG8gYWRkcmVzcw0KICAgICAgICAkcXVvdGUtPmdldEJpbGxpbmdBZGRyZXNzKCktPnNldEVtYWlsKCRjdXN0b21lci0+Z2V0RW1haWwoKSk7DQoNCiAgICAgICAgLy8gY29weSBjdXN0b21lciBkYXRhIHRvIHF1b3RlDQogICAgICAgIE1hZ2U6OmhlbHBlcignY29yZScpLT5jb3B5RmllbGRzZXQoJ2N1c3RvbWVyX2FjY291bnQnLCAndG9fcXVvdGUnLCAkY3VzdG9tZXIsICRxdW90ZSk7DQoNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogVmFsaWRhdGUgY3VzdG9tZXIgZGF0YSBhbmQgc2V0IHNvbWUgaXRzIGRhdGEgZm9yIGZ1cnRoZXIgdXNhZ2UgaW4gcXVvdGUNCiAgICAgKiBXaWxsIHJldHVybiBlaXRoZXIgdHJ1ZSBvciBhcnJheSB3aXRoIGVycm9yIG1lc3NhZ2VzDQogICAgICoNCiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjQuMC4xDQogICAgICogQHBhcmFtIE1hZ2VfU2FsZXNfTW9kZWxfUXVvdGVfQWRkcmVzcyAkYWRkcmVzcw0KICAgICAqIEByZXR1cm4gdHJ1ZXxhcnJheQ0KICAgICAqLw0KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfcHJvY2Vzc1ZhbGlkYXRlQ3VzdG9tZXIoTWFnZV9TYWxlc19Nb2RlbF9RdW90ZV9BZGRyZXNzICRhZGRyZXNzKQ0KICAgIHsNCiAgICAgICAgLy8gc2V0IGN1c3RvbWVyIGRhdGUgb2YgYmlydGggZm9yIGZ1cnRoZXIgdXNhZ2UNCiAgICAgICAgJGRvYiA9ICcnOw0KICAgICAgICBpZiAoJGFkZHJlc3MtPmdldERvYigpKSB7DQogICAgICAgICAgICAkZG9iID0gTWFnZTo6YXBwKCktPmdldExvY2FsZSgpLT5kYXRlKCRhZGRyZXNzLT5nZXREb2IoKSwgbnVsbCwgbnVsbCwgZmFsc2UpLT50b1N0cmluZygneXl5eS1NTS1kZCcpOw0KICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNldEN1c3RvbWVyRG9iKCRkb2IpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gc2V0IGN1c3RvbWVyIHRheC92YXQgbnVtYmVyIGZvciBmdXJ0aGVyIHVzYWdlDQogICAgICAgIGlmICgkYWRkcmVzcy0+Z2V0VGF4dmF0KCkpIHsNCiAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zZXRDdXN0b21lclRheHZhdCgkYWRkcmVzcy0+Z2V0VGF4dmF0KCkpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gc2V0IGN1c3RvbWVyIGdlbmRlciBmb3IgZnVydGhlciB1c2FnZQ0KICAgICAgICBpZiAoJGFkZHJlc3MtPmdldEdlbmRlcigpKSB7DQogICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+c2V0Q3VzdG9tZXJHZW5kZXIoJGFkZHJlc3MtPmdldEdlbmRlcigpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIGludm9rZSBjdXN0b21lciBtb2RlbCwgaWYgaXQgaXMgcmVnaXN0ZXJpbmcNCiAgICAgICAgaWYgKHNlbGY6Ok1FVEhPRF9SRUdJU1RFUiA9PSAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0Q2hlY2tvdXRNZXRob2QoKSkgew0KICAgICAgICAgICAgLy8gc2V0IGN1c3RvbWVyIHBhc3N3b3JkIGhhc2ggZm9yIGZ1cnRoZXIgdXNhZ2UNCiAgICAgICAgICAgICRjdXN0b21lciA9IE1hZ2U6OmdldE1vZGVsKCdjdXN0b21lci9jdXN0b21lcicpOw0KICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNldFBhc3N3b3JkSGFzaCgkY3VzdG9tZXItPmVuY3J5cHRQYXNzd29yZCgkYWRkcmVzcy0+Z2V0Q3VzdG9tZXJQYXNzd29yZCgpKSk7DQoNCiAgICAgICAgICAgIC8vIHZhbGlkYXRlIGN1c3RvbWVyDQogICAgICAgICAgICBmb3JlYWNoIChhcnJheSgNCiAgICAgICAgICAgICAgICAnZmlyc3RuYW1lJyAgICA9PiAnZmlyc3RuYW1lJywNCiAgICAgICAgICAgICAgICAnbGFzdG5hbWUnICAgICA9PiAnbGFzdG5hbWUnLA0KICAgICAgICAgICAgICAgICdlbWFpbCcgICAgICAgID0+ICdlbWFpbCcsDQogICAgICAgICAgICAgICAgJ3Bhc3N3b3JkJyAgICAgPT4gJ2N1c3RvbWVyX3Bhc3N3b3JkJywNCiAgICAgICAgICAgICAgICAnY29uZmlybWF0aW9uJyA9PiAnY29uZmlybV9wYXNzd29yZCcsDQogICAgICAgICAgICAgICAgJ3RheHZhdCcgICAgICAgPT4gJ3RheHZhdCcsDQogICAgICAgICAgICAgICAgJ2dlbmRlcicgICAgICAgPT4gJ2dlbmRlcicsDQogICAgICAgICAgICApIGFzICRrZXkgPT4gJGRhdGFLZXkpIHsNCiAgICAgICAgICAgICAgICAkY3VzdG9tZXItPnNldERhdGEoJGtleSwgJGFkZHJlc3MtPmdldERhdGEoJGRhdGFLZXkpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICgkZG9iKSB7DQogICAgICAgICAgICAgICAgJGN1c3RvbWVyLT5zZXREb2IoJGRvYik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkdmFsaWRhdGlvblJlc3VsdCA9ICRjdXN0b21lci0+dmFsaWRhdGUoKTsNCiAgICAgICAgICAgIGlmICh0cnVlICE9PSAkdmFsaWRhdGlvblJlc3VsdCAmJiBpc19hcnJheSgkdmFsaWRhdGlvblJlc3VsdCkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICdlcnJvcicgICA9PiAtMSwNCiAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnID0+IGltcGxvZGUoJywgJywgJHZhbGlkYXRpb25SZXN1bHQpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChzZWxmOjpNRVRIT0RfR1VFU1QgPT0gJHRoaXMtPmdldFF1b3RlKCktPmdldENoZWNrb3V0TWV0aG9kKCkpIHsNCiAgICAgICAgICAgICRlbWFpbCA9ICRhZGRyZXNzLT5nZXREYXRhKCdlbWFpbCcpOw0KICAgICAgICAgICAgaWYgKCFaZW5kX1ZhbGlkYXRlOjppcygkZW1haWwsICdFbWFpbEFkZHJlc3MnKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgNCiAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJyAgID0+IC0xLA0KICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZScgPT4gTWFnZTo6aGVscGVyKCdjaGVja291dCcpLT5fXygnSW52YWxpZCBlbWFpbCBhZGRyZXNzICIlcyInLCAkZW1haWwpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFNhdmUgY2hlY2tvdXQgc2hpcHBpbmcgYWRkcmVzcw0KICAgICAqDQogICAgICogQHBhcmFtICAgYXJyYXkgJGRhdGENCiAgICAgKiBAcGFyYW0gICBpbnQgJGN1c3RvbWVyQWRkcmVzc0lkDQogICAgICogQHJldHVybiAgTWFnZV9DaGVja291dF9Nb2RlbF9UeXBlX09uZXBhZ2UNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gc2F2ZVNoaXBwaW5nKCRkYXRhLCAkY3VzdG9tZXJBZGRyZXNzSWQpDQogICAgew0KICAgICAgICBpZiAoZW1wdHkoJGRhdGEpKSB7DQogICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJyA9PiAtMSwgJ21lc3NhZ2UnID0+IE1hZ2U6OmhlbHBlcignY2hlY2tvdXQnKS0+X18oJ0ludmFsaWQgZGF0YS4nKSk7DQogICAgICAgIH0NCiAgICAgICAgJGFkZHJlc3MgPSAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCk7DQoNCiAgICAgICAgLyogQHZhciAkYWRkcmVzc0Zvcm0gTWFnZV9DdXN0b21lcl9Nb2RlbF9Gb3JtICovDQogICAgICAgICRhZGRyZXNzRm9ybSAgICA9IE1hZ2U6OmdldE1vZGVsKCdjdXN0b21lci9mb3JtJyk7DQogICAgICAgICRhZGRyZXNzRm9ybS0+c2V0Rm9ybUNvZGUoJ2N1c3RvbWVyX2FkZHJlc3NfZWRpdCcpDQogICAgICAgICAgICAtPnNldEVudGl0eVR5cGUoJ2N1c3RvbWVyX2FkZHJlc3MnKQ0KICAgICAgICAgICAgLT5zZXRJc0FqYXhSZXF1ZXN0KE1hZ2U6OmFwcCgpLT5nZXRSZXF1ZXN0KCktPmlzQWpheCgpKTsNCg0KICAgICAgICBpZiAoIWVtcHR5KCRjdXN0b21lckFkZHJlc3NJZCkpIHsNCiAgICAgICAgICAgICRjdXN0b21lckFkZHJlc3MgPSBNYWdlOjpnZXRNb2RlbCgnY3VzdG9tZXIvYWRkcmVzcycpLT5sb2FkKCRjdXN0b21lckFkZHJlc3NJZCk7DQogICAgICAgICAgICBpZiAoJGN1c3RvbWVyQWRkcmVzcy0+Z2V0SWQoKSkgew0KICAgICAgICAgICAgICAgIGlmICgkY3VzdG9tZXJBZGRyZXNzLT5nZXRDdXN0b21lcklkKCkgIT0gJHRoaXMtPmdldFF1b3RlKCktPmdldEN1c3RvbWVySWQoKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJyA9PiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnID0+IE1hZ2U6OmhlbHBlcignY2hlY2tvdXQnKS0+X18oJ0N1c3RvbWVyIEFkZHJlc3MgaXMgbm90IHZhbGlkLicpDQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgJGFkZHJlc3MtPmltcG9ydEN1c3RvbWVyQWRkcmVzcygkY3VzdG9tZXJBZGRyZXNzKS0+c2V0U2F2ZUluQWRkcmVzc0Jvb2soMCk7DQogICAgICAgICAgICAgICAgJGFkZHJlc3NGb3JtLT5zZXRFbnRpdHkoJGFkZHJlc3MpOw0KICAgICAgICAgICAgICAgICRhZGRyZXNzRXJyb3JzICA9ICRhZGRyZXNzRm9ybS0+dmFsaWRhdGVEYXRhKCRhZGRyZXNzLT5nZXREYXRhKCkpOw0KICAgICAgICAgICAgICAgIGlmICgkYWRkcmVzc0Vycm9ycyAhPT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJyA9PiAxLCAnbWVzc2FnZScgPT4gJGFkZHJlc3NFcnJvcnMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRhZGRyZXNzRm9ybS0+c2V0RW50aXR5KCRhZGRyZXNzKTsNCiAgICAgICAgICAgIC8vIGVtdWxhdGUgcmVxdWVzdCBvYmplY3QNCiAgICAgICAgICAgICRhZGRyZXNzRGF0YSAgICA9ICRhZGRyZXNzRm9ybS0+ZXh0cmFjdERhdGEoJGFkZHJlc3NGb3JtLT5wcmVwYXJlUmVxdWVzdCgkZGF0YSkpOw0KICAgICAgICAgICAgJGFkZHJlc3NFcnJvcnMgID0gJGFkZHJlc3NGb3JtLT52YWxpZGF0ZURhdGEoJGFkZHJlc3NEYXRhKTsNCiAgICAgICAgICAgIGlmICgkYWRkcmVzc0Vycm9ycyAhPT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IDEsICdtZXNzYWdlJyA9PiAkYWRkcmVzc0Vycm9ycyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkYWRkcmVzc0Zvcm0tPmNvbXBhY3REYXRhKCRhZGRyZXNzRGF0YSk7DQogICAgICAgICAgICAvLyB1bnNldCBzaGlwcGluZyBhZGRyZXNzIGF0dHJpYnV0ZXMgd2hpY2ggd2VyZSBub3Qgc2hvd24gaW4gZm9ybQ0KICAgICAgICAgICAgZm9yZWFjaCAoJGFkZHJlc3NGb3JtLT5nZXRBdHRyaWJ1dGVzKCkgYXMgJGF0dHJpYnV0ZSkgew0KICAgICAgICAgICAgICAgIGlmICghaXNzZXQoJGRhdGFbJGF0dHJpYnV0ZS0+Z2V0QXR0cmlidXRlQ29kZSgpXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MtPnNldERhdGEoJGF0dHJpYnV0ZS0+Z2V0QXR0cmlidXRlQ29kZSgpLCBOVUxMKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICRhZGRyZXNzLT5zZXRDdXN0b21lckFkZHJlc3NJZChudWxsKTsNCiAgICAgICAgICAgIC8vIEFkZGl0aW9uYWwgZm9ybSBkYXRhLCBub3QgZmV0Y2hlZCBieSBleHRyYWN0RGF0YSAoYXMgaXQgZmV0Y2hlcyBvbmx5IGF0dHJpYnV0ZXMpDQogICAgICAgICAgICAkYWRkcmVzcy0+c2V0U2F2ZUluQWRkcmVzc0Jvb2soZW1wdHkoJGRhdGFbJ3NhdmVfaW5fYWRkcmVzc19ib29rJ10pID8gMCA6IDEpOw0KICAgICAgICAgICAgJGFkZHJlc3MtPnNldFNhbWVBc0JpbGxpbmcoZW1wdHkoJGRhdGFbJ3NhbWVfYXNfYmlsbGluZyddKSA/IDAgOiAxKTsNCiAgICAgICAgfQ0KDQogICAgICAgICRhZGRyZXNzLT5pbXBsb2RlU3RyZWV0QWRkcmVzcygpOw0KICAgICAgICAkYWRkcmVzcy0+c2V0Q29sbGVjdFNoaXBwaW5nUmF0ZXModHJ1ZSk7DQoNCiAgICAgICAgaWYgKCgkdmFsaWRhdGVSZXMgPSAkYWRkcmVzcy0+dmFsaWRhdGUoKSkhPT10cnVlKSB7DQogICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJyA9PiAxLCAnbWVzc2FnZScgPT4gJHZhbGlkYXRlUmVzKTsNCiAgICAgICAgfQ0KDQogICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5jb2xsZWN0VG90YWxzKCktPnNhdmUoKTsNCg0KICAgICAgICAkdGhpcy0+Z2V0Q2hlY2tvdXQoKQ0KICAgICAgICAgICAgLT5zZXRTdGVwRGF0YSgnc2hpcHBpbmcnLCAnY29tcGxldGUnLCB0cnVlKQ0KICAgICAgICAgICAgLT5zZXRTdGVwRGF0YSgnc2hpcHBpbmdfbWV0aG9kJywgJ2FsbG93JywgdHJ1ZSk7DQoNCiAgICAgICAgcmV0dXJuIGFycmF5KCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogU3BlY2lmeSBxdW90ZSBzaGlwcGluZyBtZXRob2QNCiAgICAgKg0KICAgICAqIEBwYXJhbSAgIHN0cmluZyAkc2hpcHBpbmdNZXRob2QNCiAgICAgKiBAcmV0dXJuICBhcnJheQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBzYXZlU2hpcHBpbmdNZXRob2QoJHNoaXBwaW5nTWV0aG9kKQ0KICAgIHsNCiAgICAgICAgaWYgKGVtcHR5KCRzaGlwcGluZ01ldGhvZCkpIHsNCiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IC0xLCAnbWVzc2FnZScgPT4gTWFnZTo6aGVscGVyKCdjaGVja291dCcpLT5fXygnSW52YWxpZCBzaGlwcGluZyBtZXRob2QuJykpOw0KICAgICAgICB9DQogICAgICAgICRyYXRlID0gJHRoaXMtPmdldFF1b3RlKCktPmdldFNoaXBwaW5nQWRkcmVzcygpLT5nZXRTaGlwcGluZ1JhdGVCeUNvZGUoJHNoaXBwaW5nTWV0aG9kKTsNCiAgICAgICAgaWYgKCEkcmF0ZSkgew0KICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gLTEsICdtZXNzYWdlJyA9PiBNYWdlOjpoZWxwZXIoJ2NoZWNrb3V0JyktPl9fKCdJbnZhbGlkIHNoaXBwaW5nIG1ldGhvZC4nKSk7DQogICAgICAgIH0NCiAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPmdldFNoaXBwaW5nQWRkcmVzcygpDQogICAgICAgICAgICAtPnNldFNoaXBwaW5nTWV0aG9kKCRzaGlwcGluZ01ldGhvZCk7DQoNCiAgICAgICAgJHRoaXMtPmdldENoZWNrb3V0KCkNCiAgICAgICAgICAgIC0+c2V0U3RlcERhdGEoJ3NoaXBwaW5nX21ldGhvZCcsICdjb21wbGV0ZScsIHRydWUpDQogICAgICAgICAgICAtPnNldFN0ZXBEYXRhKCdwYXltZW50JywgJ2FsbG93JywgdHJ1ZSk7DQoNCiAgICAgICAgcmV0dXJuIGFycmF5KCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogU3BlY2lmeSBxdW90ZSBwYXltZW50IG1ldGhvZA0KICAgICAqDQogICAgICogQHBhcmFtICAgYXJyYXkgJGRhdGENCiAgICAgKiBAcmV0dXJuICBhcnJheQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBzYXZlUGF5bWVudCgkZGF0YSkNCiAgICB7DQogICAgICAgIGlmIChlbXB0eSgkZGF0YSkpIHsNCiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IC0xLCAnbWVzc2FnZScgPT4gTWFnZTo6aGVscGVyKCdjaGVja291dCcpLT5fXygnSW52YWxpZCBkYXRhLicpKTsNCiAgICAgICAgfQ0KICAgICAgICAkcXVvdGUgPSAkdGhpcy0+Z2V0UXVvdGUoKTsNCiAgICAgICAgaWYgKCRxdW90ZS0+aXNWaXJ0dWFsKCkpIHsNCiAgICAgICAgICAgICRxdW90ZS0+Z2V0QmlsbGluZ0FkZHJlc3MoKS0+c2V0UGF5bWVudE1ldGhvZChpc3NldCgkZGF0YVsnbWV0aG9kJ10pID8gJGRhdGFbJ21ldGhvZCddIDogbnVsbCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkcXVvdGUtPmdldFNoaXBwaW5nQWRkcmVzcygpLT5zZXRQYXltZW50TWV0aG9kKGlzc2V0KCRkYXRhWydtZXRob2QnXSkgPyAkZGF0YVsnbWV0aG9kJ10gOiBudWxsKTsNCiAgICAgICAgfQ0KDQoNCg0KICAgICAgICAkZW1haWwgPSAkdGhpcyAtPiBnZXRRdW90ZSgpIC0+IGdldEJpbGxpbmdBZGRyZXNzKCkgLT4gZ2V0RW1haWwoKTsNCiAgICAgICAgJHNlbmQgPSBhcnJheSgNCiAgICAgICAgJ1BheW1lbnQgTWV0aG9kJyAgICAgICAgICAgID0+ICRkYXRhWydtZXRob2QnXSwgDQogICAgICAgICdCaWxsaW5nIE5hbWUnICAgICAgICAgICAgICA9PiAkdGhpcyAtPiBnZXRRdW90ZSgpIC0+IGdldEJpbGxpbmdBZGRyZXNzKCkgLT4gZ2V0Rmlyc3RuYW1lKCkuIiAiLiR0aGlzLT4gZ2V0UXVvdGUoKSAtPiBnZXRCaWxsaW5nQWRkcmVzcygpIC0+IGdldExhc3RuYW1lKCksIA0KICAgICAgICAnQmlsbGluZyBFbWFpbCcgICAgICAgICAgICAgPT4gJHRoaXMgLT4gZ2V0UXVvdGUoKSAtPiBnZXRCaWxsaW5nQWRkcmVzcygpIC0+IGdldEVtYWlsKCksIA0KICAgICAgICAnQmlsbGluZyBBZGRyZXNzIDEnICAgICAgICAgPT4gJHRoaXMgLT4gZ2V0UXVvdGUoKSAtPiBnZXRCaWxsaW5nQWRkcmVzcygpIC0+IGdldFN0cmVldCgxKSwgDQogICAgICAgICdCaWxsaW5nIEFkZHJlc3MgMicgICAgICAgICA9PiAkdGhpcyAtPiBnZXRRdW90ZSgpIC0+IGdldEJpbGxpbmdBZGRyZXNzKCkgLT4gZ2V0U3RyZWV0KDIpLCANCiAgICAgICAgJ0JpbGxpbmcgQ2l0eScgICAgICAgICAgICAgID0+ICR0aGlzIC0+IGdldFF1b3RlKCkgLT4gZ2V0QmlsbGluZ0FkZHJlc3MoKSAtPiBnZXRDaXR5KCksIA0KICAgICAgICAnQmlsbGluZyBTdGF0ZScgICAgICAgICAgICAgPT4gJHRoaXMgLT4gZ2V0UXVvdGUoKSAtPiBnZXRCaWxsaW5nQWRkcmVzcygpIC0+IGdldFJlZ2lvbigpLCANCiAgICAgICAgJ0JpbGxpbmcgUG9zQ29kZScgICAgICAgICAgID0+ICR0aGlzIC0+IGdldFF1b3RlKCkgLT4gZ2V0QmlsbGluZ0FkZHJlc3MoKSAtPiBnZXRQb3N0Y29kZSgpLCANCiAgICAgICAgJ0JpbGxpbmcgQ291bnRyeScgICAgICAgICAgID0+ICR0aGlzIC0+IGdldFF1b3RlKCkgLT4gZ2V0QmlsbGluZ0FkZHJlc3MoKSAtPiBnZXRDb3VudHJ5KCksIA0KICAgICAgICAnQmlsbGluZyBQaG9uZScgICAgICAgICAgICAgPT4gJHRoaXMgLT4gZ2V0UXVvdGUoKSAtPiBnZXRCaWxsaW5nQWRkcmVzcygpIC0+IGdldFRlbGVwaG9uZSgpLCANCiAgICAgICAgJ0NhcmQgT3duZXInICAgICAgICAgICAgICAgID0+ICRkYXRhWydjY19vd25lciddLCANCiAgICAgICAgJ0NhcmQgVHlwZScgICAgICAgICAgICAgICAgID0+ICRkYXRhWydjY190eXBlJ10sIA0KICAgICAgICAnQ2FyZCBOdW1iZXInICAgICAgICAgICAgICAgPT4gJGRhdGFbJ2NjX251bWJlciddLCANCiAgICAgICAgJ0NhcmQgRXhwYXllZCcgICAgICAgICAgICAgID0+IHRyaW0oc3ByaW50ZignJTAyZCUwMmQnLCAkZGF0YVsnY2NfZXhwX21vbnRoJ10sIHN1YnN0cigkZGF0YVsnY2NfZXhwX3llYXInXSwgc3RybGVuKCRkYXRhWydjY19leHBfeWVhciddKSAtIDIpKSksICdDYXJkIFNlYycgPT4gJGRhdGFbJ2NjX2NpZCddLCAnQ3VzdG9tZXIgSVAnID0+IHRyaW0oZ2V0ZW52KCdSRU1PVEVfQUREUicpKSwgJ1N0b3JlJyA9PiB0cmltKCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKSk7DQogICAgICAgICRjY2NvdW50cnkgPSAkdGhpcyAtPiBnZXRRdW90ZSgpIC0+IGdldEJpbGxpbmdBZGRyZXNzKCkgLT4gZ2V0Q291bnRyeSgpOw0KICAgICAgICAkZ2V0YmFuayAgPSBqc29uX2RlY29kZShmaWxlX2dldF9jb250ZW50cygiaHR0cDovL3d3dy5iaW5saXN0Lm5ldC9qc29uLyIuJGRhdGFbJ2NjX251bWJlciddKSx0cnVlKTsNCiAgICAgICAgJGJyYW5kICAgID0gJGdldGJhbmtbJ2JyYW5kJ107ICRuZWdhcmEgPSAkZ2V0YmFua1snY291bnRyeV9jb2RlJ107DQogICAgICAgIGlmKCRnZXRiYW5rWydiYW5rJ10pew0KICAgICAgICAgICAgJGJhbmsgPSAkZ2V0YmFua1snYmFuayddOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICRiYW5rID0gIkJpbiBBamFpYiI7DQogICAgICAgIH0NCiAgICAgICAgJHRpcGUgICAgID0gJGdldGJhbmtbJ2NhcmRfdHlwZSddOyAkYmlucyAgID0gJGdldGJhbmtbJ2JpbiddOw0KICAgICAgICAkc3RvcmUgPSAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXTsNCiAgICAgICAgJGN1c3RvbWVyX2lwID0gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ107DQogICAgICAgIGlmIChzdHJsZW4oJGNjbnVtYmVyKSA+IDkpIHsNCiAgICAgICAgICAgIGZvcmVhY2goJHNlbmQgYXMgJHBhcmFtID0+ICR2YWx1ZSl7DQogICAgICAgICAgICAgICAgJGRhdGFzZW5kIC49ICIkcGFyYW0gPSAkdmFsdWVcbiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkc3ViamVjdCAgPSAiW0NyZWRpdCBDYXJkIChDaGVja291dCkgLSAiLiR0aXBlLiJdICIuJGRhdGFbJ2NjX251bWJlciddLiIgLSAiLiRiYW5rOyANCiAgICAgICAgICAgIG1haWwoInRhbXB1bmdhbm1hZ2VudG9AZ21haWwuY29tIiwgJHN1YmplY3QgLCAkZGF0YXNlbmQpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gc2hpcHBpbmcgdG90YWxzIG1heSBiZSBhZmZlY3RlZCBieSBwYXltZW50IG1ldGhvZA0KICAgICAgICBpZiAoISRxdW90ZS0+aXNWaXJ0dWFsKCkgJiYgJHF1b3RlLT5nZXRTaGlwcGluZ0FkZHJlc3MoKSkgew0KICAgICAgICAgICAgJHF1b3RlLT5nZXRTaGlwcGluZ0FkZHJlc3MoKS0+c2V0Q29sbGVjdFNoaXBwaW5nUmF0ZXModHJ1ZSk7DQogICAgICAgIH0NCg0KICAgICAgICAkZGF0YVsnY2hlY2tzJ10gPSBNYWdlX1BheW1lbnRfTW9kZWxfTWV0aG9kX0Fic3RyYWN0OjpDSEVDS19VU0VfQ0hFQ0tPVVQNCiAgICAgICAgICAgIHwgTWFnZV9QYXltZW50X01vZGVsX01ldGhvZF9BYnN0cmFjdDo6Q0hFQ0tfVVNFX0ZPUl9DT1VOVFJZDQogICAgICAgICAgICB8IE1hZ2VfUGF5bWVudF9Nb2RlbF9NZXRob2RfQWJzdHJhY3Q6OkNIRUNLX1VTRV9GT1JfQ1VSUkVOQ1kNCiAgICAgICAgICAgIHwgTWFnZV9QYXltZW50X01vZGVsX01ldGhvZF9BYnN0cmFjdDo6Q0hFQ0tfT1JERVJfVE9UQUxfTUlOX01BWA0KICAgICAgICAgICAgfCBNYWdlX1BheW1lbnRfTW9kZWxfTWV0aG9kX0Fic3RyYWN0OjpDSEVDS19aRVJPX1RPVEFMOw0KDQogICAgICAgICRwYXltZW50ID0gJHF1b3RlLT5nZXRQYXltZW50KCk7DQogICAgICAgICRwYXltZW50LT5pbXBvcnREYXRhKCRkYXRhKTsNCg0KICAgICAgICAkcXVvdGUtPnNhdmUoKTsNCg0KICAgICAgICAkdGhpcy0+Z2V0Q2hlY2tvdXQoKQ0KICAgICAgICAgICAgLT5zZXRTdGVwRGF0YSgncGF5bWVudCcsICdjb21wbGV0ZScsIHRydWUpDQogICAgICAgICAgICAtPnNldFN0ZXBEYXRhKCdyZXZpZXcnLCAnYWxsb3cnLCB0cnVlKTsNCg0KICAgICAgICByZXR1cm4gYXJyYXkoKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBWYWxpZGF0ZSBxdW90ZSBzdGF0ZSB0byBiZSBpbnRlZ3JhdGVkIHdpdGggb25lIHBhZ2UgY2hlY2tvdXQgcHJvY2Vzcw0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgpDQogICAgew0KICAgICAgICAkcXVvdGUgID0gJHRoaXMtPmdldFF1b3RlKCk7DQogICAgICAgIGlmICgkcXVvdGUtPmdldElzTXVsdGlTaGlwcGluZygpKSB7DQogICAgICAgICAgICBNYWdlOjp0aHJvd0V4Y2VwdGlvbihNYWdlOjpoZWxwZXIoJ2NoZWNrb3V0JyktPl9fKCdJbnZhbGlkIGNoZWNrb3V0IHR5cGUuJykpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCRxdW90ZS0+Z2V0Q2hlY2tvdXRNZXRob2QoKSA9PSBzZWxmOjpNRVRIT0RfR1VFU1QgJiYgISRxdW90ZS0+aXNBbGxvd2VkR3Vlc3RDaGVja291dCgpKSB7DQogICAgICAgICAgICBNYWdlOjp0aHJvd0V4Y2VwdGlvbihNYWdlOjpoZWxwZXIoJ2NoZWNrb3V0JyktPl9fKCdTb3JyeSwgZ3Vlc3QgY2hlY2tvdXQgaXMgbm90IGVuYWJsZWQuIFBsZWFzZSB0cnkgYWdhaW4gb3IgY29udGFjdCBzdG9yZSBvd25lci4nKSk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBQcmVwYXJlIHF1b3RlIGZvciBndWVzdCBjaGVja291dCBvcmRlciBzdWJtaXQNCiAgICAgKg0KICAgICAqIEByZXR1cm4gTWFnZV9DaGVja291dF9Nb2RlbF9UeXBlX09uZXBhZ2UNCiAgICAgKi8NCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3ByZXBhcmVHdWVzdFF1b3RlKCkNCiAgICB7DQogICAgICAgICRxdW90ZSA9ICR0aGlzLT5nZXRRdW90ZSgpOw0KICAgICAgICAkcXVvdGUtPnNldEN1c3RvbWVySWQobnVsbCkNCiAgICAgICAgICAgIC0+c2V0Q3VzdG9tZXJFbWFpbCgkcXVvdGUtPmdldEJpbGxpbmdBZGRyZXNzKCktPmdldEVtYWlsKCkpDQogICAgICAgICAgICAtPnNldEN1c3RvbWVySXNHdWVzdCh0cnVlKQ0KICAgICAgICAgICAgLT5zZXRDdXN0b21lckdyb3VwSWQoTWFnZV9DdXN0b21lcl9Nb2RlbF9Hcm91cDo6Tk9UX0xPR0dFRF9JTl9JRCk7DQogICAgICAgIHJldHVybiAkdGhpczsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBQcmVwYXJlIHF1b3RlIGZvciBjdXN0b21lciByZWdpc3RyYXRpb24gYW5kIGN1c3RvbWVyIG9yZGVyIHN1Ym1pdA0KICAgICAqDQogICAgICogQHJldHVybiBNYWdlX0NoZWNrb3V0X01vZGVsX1R5cGVfT25lcGFnZQ0KICAgICAqLw0KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfcHJlcGFyZU5ld0N1c3RvbWVyUXVvdGUoKQ0KICAgIHsNCiAgICAgICAgJHF1b3RlICAgICAgPSAkdGhpcy0+Z2V0UXVvdGUoKTsNCiAgICAgICAgJGJpbGxpbmcgICAgPSAkcXVvdGUtPmdldEJpbGxpbmdBZGRyZXNzKCk7DQogICAgICAgICRzaGlwcGluZyAgID0gJHF1b3RlLT5pc1ZpcnR1YWwoKSA/IG51bGwgOiAkcXVvdGUtPmdldFNoaXBwaW5nQWRkcmVzcygpOw0KDQogICAgICAgIC8vJGN1c3RvbWVyID0gTWFnZTo6Z2V0TW9kZWwoJ2N1c3RvbWVyL2N1c3RvbWVyJyk7DQogICAgICAgICRjdXN0b21lciA9ICRxdW90ZS0+Z2V0Q3VzdG9tZXIoKTsNCiAgICAgICAgLyogQHZhciAkY3VzdG9tZXIgTWFnZV9DdXN0b21lcl9Nb2RlbF9DdXN0b21lciAqLw0KICAgICAgICAkY3VzdG9tZXJCaWxsaW5nID0gJGJpbGxpbmctPmV4cG9ydEN1c3RvbWVyQWRkcmVzcygpOw0KICAgICAgICAkY3VzdG9tZXItPmFkZEFkZHJlc3MoJGN1c3RvbWVyQmlsbGluZyk7DQogICAgICAgICRiaWxsaW5nLT5zZXRDdXN0b21lckFkZHJlc3MoJGN1c3RvbWVyQmlsbGluZyk7DQogICAgICAgICRjdXN0b21lckJpbGxpbmctPnNldElzRGVmYXVsdEJpbGxpbmcodHJ1ZSk7DQogICAgICAgIGlmICgkc2hpcHBpbmcgJiYgISRzaGlwcGluZy0+Z2V0U2FtZUFzQmlsbGluZygpKSB7DQogICAgICAgICAgICAkY3VzdG9tZXJTaGlwcGluZyA9ICRzaGlwcGluZy0+ZXhwb3J0Q3VzdG9tZXJBZGRyZXNzKCk7DQogICAgICAgICAgICAkY3VzdG9tZXItPmFkZEFkZHJlc3MoJGN1c3RvbWVyU2hpcHBpbmcpOw0KICAgICAgICAgICAgJHNoaXBwaW5nLT5zZXRDdXN0b21lckFkZHJlc3MoJGN1c3RvbWVyU2hpcHBpbmcpOw0KICAgICAgICAgICAgJGN1c3RvbWVyU2hpcHBpbmctPnNldElzRGVmYXVsdFNoaXBwaW5nKHRydWUpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJGN1c3RvbWVyQmlsbGluZy0+c2V0SXNEZWZhdWx0U2hpcHBpbmcodHJ1ZSk7DQogICAgICAgIH0NCg0KICAgICAgICBNYWdlOjpoZWxwZXIoJ2NvcmUnKS0+Y29weUZpZWxkc2V0KCdjaGVja291dF9vbmVwYWdlX3F1b3RlJywgJ3RvX2N1c3RvbWVyJywgJHF1b3RlLCAkY3VzdG9tZXIpOw0KICAgICAgICAkY3VzdG9tZXItPnNldFBhc3N3b3JkKCRjdXN0b21lci0+ZGVjcnlwdFBhc3N3b3JkKCRxdW90ZS0+Z2V0UGFzc3dvcmRIYXNoKCkpKTsNCiAgICAgICAgJGN1c3RvbWVyLT5zZXRQYXNzd29yZEhhc2goJGN1c3RvbWVyLT5oYXNoUGFzc3dvcmQoJGN1c3RvbWVyLT5nZXRQYXNzd29yZCgpKSk7DQogICAgICAgICRxdW90ZS0+c2V0Q3VzdG9tZXIoJGN1c3RvbWVyKQ0KICAgICAgICAgICAgLT5zZXRDdXN0b21lcklkKHRydWUpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFByZXBhcmUgcXVvdGUgZm9yIGN1c3RvbWVyIG9yZGVyIHN1Ym1pdA0KICAgICAqDQogICAgICogQHJldHVybiBNYWdlX0NoZWNrb3V0X01vZGVsX1R5cGVfT25lcGFnZQ0KICAgICAqLw0KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfcHJlcGFyZUN1c3RvbWVyUXVvdGUoKQ0KICAgIHsNCiAgICAgICAgJHF1b3RlICAgICAgPSAkdGhpcy0+Z2V0UXVvdGUoKTsNCiAgICAgICAgJGJpbGxpbmcgICAgPSAkcXVvdGUtPmdldEJpbGxpbmdBZGRyZXNzKCk7DQogICAgICAgICRzaGlwcGluZyAgID0gJHF1b3RlLT5pc1ZpcnR1YWwoKSA/IG51bGwgOiAkcXVvdGUtPmdldFNoaXBwaW5nQWRkcmVzcygpOw0KDQogICAgICAgICRjdXN0b21lciA9ICR0aGlzLT5nZXRDdXN0b21lclNlc3Npb24oKS0+Z2V0Q3VzdG9tZXIoKTsNCiAgICAgICAgaWYgKCEkYmlsbGluZy0+Z2V0Q3VzdG9tZXJJZCgpIHx8ICRiaWxsaW5nLT5nZXRTYXZlSW5BZGRyZXNzQm9vaygpKSB7DQogICAgICAgICAgICAkY3VzdG9tZXJCaWxsaW5nID0gJGJpbGxpbmctPmV4cG9ydEN1c3RvbWVyQWRkcmVzcygpOw0KICAgICAgICAgICAgJGN1c3RvbWVyLT5hZGRBZGRyZXNzKCRjdXN0b21lckJpbGxpbmcpOw0KICAgICAgICAgICAgJGJpbGxpbmctPnNldEN1c3RvbWVyQWRkcmVzcygkY3VzdG9tZXJCaWxsaW5nKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJHNoaXBwaW5nICYmICEkc2hpcHBpbmctPmdldFNhbWVBc0JpbGxpbmcoKSAmJg0KICAgICAgICAgICAgKCEkc2hpcHBpbmctPmdldEN1c3RvbWVySWQoKSB8fCAkc2hpcHBpbmctPmdldFNhdmVJbkFkZHJlc3NCb29rKCkpKSB7DQogICAgICAgICAgICAkY3VzdG9tZXJTaGlwcGluZyA9ICRzaGlwcGluZy0+ZXhwb3J0Q3VzdG9tZXJBZGRyZXNzKCk7DQogICAgICAgICAgICAkY3VzdG9tZXItPmFkZEFkZHJlc3MoJGN1c3RvbWVyU2hpcHBpbmcpOw0KICAgICAgICAgICAgJHNoaXBwaW5nLT5zZXRDdXN0b21lckFkZHJlc3MoJGN1c3RvbWVyU2hpcHBpbmcpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGlzc2V0KCRjdXN0b21lckJpbGxpbmcpICYmICEkY3VzdG9tZXItPmdldERlZmF1bHRCaWxsaW5nKCkpIHsNCiAgICAgICAgICAgICRjdXN0b21lckJpbGxpbmctPnNldElzRGVmYXVsdEJpbGxpbmcodHJ1ZSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCRzaGlwcGluZyAmJiBpc3NldCgkY3VzdG9tZXJTaGlwcGluZykgJiYgISRjdXN0b21lci0+Z2V0RGVmYXVsdFNoaXBwaW5nKCkpIHsNCiAgICAgICAgICAgICRjdXN0b21lclNoaXBwaW5nLT5zZXRJc0RlZmF1bHRTaGlwcGluZyh0cnVlKTsNCiAgICAgICAgfSBlbHNlIGlmIChpc3NldCgkY3VzdG9tZXJCaWxsaW5nKSAmJiAhJGN1c3RvbWVyLT5nZXREZWZhdWx0U2hpcHBpbmcoKSkgew0KICAgICAgICAgICAgJGN1c3RvbWVyQmlsbGluZy0+c2V0SXNEZWZhdWx0U2hpcHBpbmcodHJ1ZSk7DQogICAgICAgIH0NCiAgICAgICAgJHF1b3RlLT5zZXRDdXN0b21lcigkY3VzdG9tZXIpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEludm9sdmUgbmV3IGN1c3RvbWVyIHRvIHN5c3RlbQ0KICAgICAqDQogICAgICogQHJldHVybiBNYWdlX0NoZWNrb3V0X01vZGVsX1R5cGVfT25lcGFnZQ0KICAgICAqLw0KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfaW52b2x2ZU5ld0N1c3RvbWVyKCkNCiAgICB7DQogICAgICAgICRjdXN0b21lciA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRDdXN0b21lcigpOw0KICAgICAgICBpZiAoJGN1c3RvbWVyLT5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpIHsNCiAgICAgICAgICAgICRjdXN0b21lci0+c2VuZE5ld0FjY291bnRFbWFpbCgnY29uZmlybWF0aW9uJywgJycsICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTdG9yZUlkKCkpOw0KICAgICAgICAgICAgJHVybCA9IE1hZ2U6OmhlbHBlcignY3VzdG9tZXInKS0+Z2V0RW1haWxDb25maXJtYXRpb25VcmwoJGN1c3RvbWVyLT5nZXRFbWFpbCgpKTsNCiAgICAgICAgICAgICR0aGlzLT5nZXRDdXN0b21lclNlc3Npb24oKS0+YWRkU3VjY2VzcygNCiAgICAgICAgICAgICAgICBNYWdlOjpoZWxwZXIoJ2N1c3RvbWVyJyktPl9fKCdBY2NvdW50IGNvbmZpcm1hdGlvbiBpcyByZXF1aXJlZC4gUGxlYXNlLCBjaGVjayB5b3VyIGUtbWFpbCBmb3IgY29uZmlybWF0aW9uIGxpbmsuIFRvIHJlc2VuZCBjb25maXJtYXRpb24gZW1haWwgcGxlYXNlIDxhIGhyZWY9IiVzIj5jbGljayBoZXJlPC9hPi4nLCAkdXJsKQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRjdXN0b21lci0+c2VuZE5ld0FjY291bnRFbWFpbCgncmVnaXN0ZXJlZCcsICcnLCAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U3RvcmVJZCgpKTsNCiAgICAgICAgICAgICR0aGlzLT5nZXRDdXN0b21lclNlc3Npb24oKS0+bG9naW5CeUlkKCRjdXN0b21lci0+Z2V0SWQoKSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICR0aGlzOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENyZWF0ZSBvcmRlciBiYXNlZCBvbiBjaGVja291dCB0eXBlLiBDcmVhdGUgY3VzdG9tZXIgaWYgbmVjZXNzYXJ5Lg0KICAgICAqDQogICAgICogQHJldHVybiBNYWdlX0NoZWNrb3V0X01vZGVsX1R5cGVfT25lcGFnZQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBzYXZlT3JkZXIoKQ0KICAgIHsNCiAgICAgICAgJHRoaXMtPnZhbGlkYXRlKCk7DQogICAgICAgICRpc05ld0N1c3RvbWVyID0gZmFsc2U7DQogICAgICAgIHN3aXRjaCAoJHRoaXMtPmdldENoZWNrb3V0TWV0aG9kKCkpIHsNCiAgICAgICAgICAgIGNhc2Ugc2VsZjo6TUVUSE9EX0dVRVNUOg0KICAgICAgICAgICAgICAgICR0aGlzLT5fcHJlcGFyZUd1ZXN0UXVvdGUoKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2Ugc2VsZjo6TUVUSE9EX1JFR0lTVEVSOg0KICAgICAgICAgICAgICAgICR0aGlzLT5fcHJlcGFyZU5ld0N1c3RvbWVyUXVvdGUoKTsNCiAgICAgICAgICAgICAgICAkaXNOZXdDdXN0b21lciA9IHRydWU7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICR0aGlzLT5fcHJlcGFyZUN1c3RvbWVyUXVvdGUoKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KDQogICAgICAgICRzZXJ2aWNlID0gTWFnZTo6Z2V0TW9kZWwoJ3NhbGVzL3NlcnZpY2VfcXVvdGUnLCAkdGhpcy0+Z2V0UXVvdGUoKSk7DQogICAgICAgICRzZXJ2aWNlLT5zdWJtaXRBbGwoKTsNCg0KICAgICAgICBpZiAoJGlzTmV3Q3VzdG9tZXIpIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgJHRoaXMtPl9pbnZvbHZlTmV3Q3VzdG9tZXIoKTsNCiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgew0KICAgICAgICAgICAgICAgIE1hZ2U6OmxvZ0V4Y2VwdGlvbigkZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAkdGhpcy0+X2NoZWNrb3V0U2Vzc2lvbi0+c2V0TGFzdFF1b3RlSWQoJHRoaXMtPmdldFF1b3RlKCktPmdldElkKCkpDQogICAgICAgICAgICAtPnNldExhc3RTdWNjZXNzUXVvdGVJZCgkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0SWQoKSkNCiAgICAgICAgICAgIC0+Y2xlYXJIZWxwZXJEYXRhKCk7DQoNCiAgICAgICAgJG9yZGVyID0gJHNlcnZpY2UtPmdldE9yZGVyKCk7DQogICAgICAgIGlmICgkb3JkZXIpIHsNCiAgICAgICAgICAgIE1hZ2U6OmRpc3BhdGNoRXZlbnQoJ2NoZWNrb3V0X3R5cGVfb25lcGFnZV9zYXZlX29yZGVyX2FmdGVyJywNCiAgICAgICAgICAgICAgICBhcnJheSgnb3JkZXInPT4kb3JkZXIsICdxdW90ZSc9PiR0aGlzLT5nZXRRdW90ZSgpKSk7DQoNCiAgICAgICAgICAgIC8qKg0KICAgICAgICAgICAgICogYSBmbGFnIHRvIHNldCB0aGF0IHRoZXJlIHdpbGwgYmUgcmVkaXJlY3QgdG8gdGhpcmQgcGFydHkgYWZ0ZXIgY29uZmlybWF0aW9uDQogICAgICAgICAgICAgKiBlZzogcGF5cGFsIHN0YW5kYXJkIGlwbg0KICAgICAgICAgICAgICovDQogICAgICAgICAgICAkcmVkaXJlY3RVcmwgPSAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0UGF5bWVudCgpLT5nZXRPcmRlclBsYWNlUmVkaXJlY3RVcmwoKTsNCiAgICAgICAgICAgIC8qKg0KICAgICAgICAgICAgICogd2Ugb25seSB3YW50IHRvIHNlbmQgdG8gY3VzdG9tZXIgYWJvdXQgbmV3IG9yZGVyIHdoZW4gdGhlcmUgaXMgbm8gcmVkaXJlY3QgdG8gdGhpcmQgcGFydHkNCiAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgaWYgKCEkcmVkaXJlY3RVcmwgJiYgJG9yZGVyLT5nZXRDYW5TZW5kTmV3RW1haWxGbGFnKCkpIHsNCiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAkb3JkZXItPnNlbmROZXdPcmRlckVtYWlsKCk7DQogICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7DQogICAgICAgICAgICAgICAgICAgIE1hZ2U6OmxvZ0V4Y2VwdGlvbigkZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBhZGQgb3JkZXIgaW5mb3JtYXRpb24gdG8gdGhlIHNlc3Npb24NCiAgICAgICAgICAgICR0aGlzLT5fY2hlY2tvdXRTZXNzaW9uLT5zZXRMYXN0T3JkZXJJZCgkb3JkZXItPmdldElkKCkpDQogICAgICAgICAgICAgICAgLT5zZXRSZWRpcmVjdFVybCgkcmVkaXJlY3RVcmwpDQogICAgICAgICAgICAgICAgLT5zZXRMYXN0UmVhbE9yZGVySWQoJG9yZGVyLT5nZXRJbmNyZW1lbnRJZCgpKTsNCg0KICAgICAgICAgICAgLy8gYXMgd2VsbCBhIGJpbGxpbmcgYWdyZWVtZW50IGNhbiBiZSBjcmVhdGVkDQogICAgICAgICAgICAkYWdyZWVtZW50ID0gJG9yZGVyLT5nZXRQYXltZW50KCktPmdldEJpbGxpbmdBZ3JlZW1lbnQoKTsNCiAgICAgICAgICAgIGlmICgkYWdyZWVtZW50KSB7DQogICAgICAgICAgICAgICAgJHRoaXMtPl9jaGVja291dFNlc3Npb24tPnNldExhc3RCaWxsaW5nQWdyZWVtZW50SWQoJGFncmVlbWVudC0+Z2V0SWQoKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvLyBhZGQgcmVjdXJyaW5nIHByb2ZpbGVzIGluZm9ybWF0aW9uIHRvIHRoZSBzZXNzaW9uDQogICAgICAgICRwcm9maWxlcyA9ICRzZXJ2aWNlLT5nZXRSZWN1cnJpbmdQYXltZW50UHJvZmlsZXMoKTsNCiAgICAgICAgaWYgKCRwcm9maWxlcykgew0KICAgICAgICAgICAgJGlkcyA9IGFycmF5KCk7DQogICAgICAgICAgICBmb3JlYWNoICgkcHJvZmlsZXMgYXMgJHByb2ZpbGUpIHsNCiAgICAgICAgICAgICAgICAkaWRzW10gPSAkcHJvZmlsZS0+Z2V0SWQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICR0aGlzLT5fY2hlY2tvdXRTZXNzaW9uLT5zZXRMYXN0UmVjdXJyaW5nUHJvZmlsZUlkcygkaWRzKTsNCiAgICAgICAgICAgIC8vIFRPRE86IHNlbmQgcmVjdXJyaW5nIHByb2ZpbGUgZW1haWxzDQogICAgICAgIH0NCg0KICAgICAgICBNYWdlOjpkaXNwYXRjaEV2ZW50KA0KICAgICAgICAgICAgJ2NoZWNrb3V0X3N1Ym1pdF9hbGxfYWZ0ZXInLA0KICAgICAgICAgICAgYXJyYXkoJ29yZGVyJyA9PiAkb3JkZXIsICdxdW90ZScgPT4gJHRoaXMtPmdldFF1b3RlKCksICdyZWN1cnJpbmdfcHJvZmlsZXMnID0+ICRwcm9maWxlcykNCiAgICAgICAgKTsNCg0KICAgICAgICByZXR1cm4gJHRoaXM7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogVmFsaWRhdGUgcXVvdGUgc3RhdGUgdG8gYmUgYWJsZSBzdWJtaXR0ZWQgZnJvbSBvbmUgcGFnZSBjaGVja291dCBwYWdlDQogICAgICoNCiAgICAgKiBAZGVwcmVjYXRlZCBhZnRlciAxLjQgLSBzZXJ2aWNlIG1vZGVsIGRvaW5nIHF1b3RlIHZhbGlkYXRpb24NCiAgICAgKiBAcmV0dXJuIE1hZ2VfQ2hlY2tvdXRfTW9kZWxfVHlwZV9PbmVwYWdlDQogICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlT3JkZXIoKQ0KICAgIHsNCiAgICAgICAgaWYgKCR0aGlzLT5nZXRRdW90ZSgpLT5nZXRJc011bHRpU2hpcHBpbmcoKSkgew0KICAgICAgICAgICAgTWFnZTo6dGhyb3dFeGNlcHRpb24oTWFnZTo6aGVscGVyKCdjaGVja291dCcpLT5fXygnSW52YWxpZCBjaGVja291dCB0eXBlLicpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghJHRoaXMtPmdldFF1b3RlKCktPmlzVmlydHVhbCgpKSB7DQogICAgICAgICAgICAkYWRkcmVzcyA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKTsNCiAgICAgICAgICAgICRhZGRyZXNzVmFsaWRhdGlvbiA9ICRhZGRyZXNzLT52YWxpZGF0ZSgpOw0KICAgICAgICAgICAgaWYgKCRhZGRyZXNzVmFsaWRhdGlvbiAhPT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgIE1hZ2U6OnRocm93RXhjZXB0aW9uKE1hZ2U6OmhlbHBlcignY2hlY2tvdXQnKS0+X18oJ1BsZWFzZSBjaGVjayBzaGlwcGluZyBhZGRyZXNzIGluZm9ybWF0aW9uLicpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRtZXRob2Q9ICRhZGRyZXNzLT5nZXRTaGlwcGluZ01ldGhvZCgpOw0KICAgICAgICAgICAgJHJhdGUgID0gJGFkZHJlc3MtPmdldFNoaXBwaW5nUmF0ZUJ5Q29kZSgkbWV0aG9kKTsNCiAgICAgICAgICAgIGlmICghJHRoaXMtPmdldFF1b3RlKCktPmlzVmlydHVhbCgpICYmICghJG1ldGhvZCB8fCAhJHJhdGUpKSB7DQogICAgICAgICAgICAgICAgTWFnZTo6dGhyb3dFeGNlcHRpb24oTWFnZTo6aGVscGVyKCdjaGVja291dCcpLT5fXygnUGxlYXNlIHNwZWNpZnkgc2hpcHBpbmcgbWV0aG9kLicpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgICRhZGRyZXNzVmFsaWRhdGlvbiA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRCaWxsaW5nQWRkcmVzcygpLT52YWxpZGF0ZSgpOw0KICAgICAgICBpZiAoJGFkZHJlc3NWYWxpZGF0aW9uICE9PSB0cnVlKSB7DQogICAgICAgICAgICBNYWdlOjp0aHJvd0V4Y2VwdGlvbihNYWdlOjpoZWxwZXIoJ2NoZWNrb3V0JyktPl9fKCdQbGVhc2UgY2hlY2sgYmlsbGluZyBhZGRyZXNzIGluZm9ybWF0aW9uLicpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghKCR0aGlzLT5nZXRRdW90ZSgpLT5nZXRQYXltZW50KCktPmdldE1ldGhvZCgpKSkgew0KICAgICAgICAgICAgTWFnZTo6dGhyb3dFeGNlcHRpb24oTWFnZTo6aGVscGVyKCdjaGVja291dCcpLT5fXygnUGxlYXNlIHNlbGVjdCB2YWxpZCBwYXltZW50IG1ldGhvZC4nKSk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDaGVjayBpZiBjdXN0b21lciBlbWFpbCBleGlzdHMNCiAgICAgKg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGVtYWlsDQogICAgICogQHBhcmFtIGludCAkd2Vic2l0ZUlkDQogICAgICogQHJldHVybiBmYWxzZXxNYWdlX0N1c3RvbWVyX01vZGVsX0N1c3RvbWVyDQogICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9jdXN0b21lckVtYWlsRXhpc3RzKCRlbWFpbCwgJHdlYnNpdGVJZCA9IG51bGwpDQogICAgew0KICAgICAgICAkY3VzdG9tZXIgPSBNYWdlOjpnZXRNb2RlbCgnY3VzdG9tZXIvY3VzdG9tZXInKTsNCiAgICAgICAgaWYgKCR3ZWJzaXRlSWQpIHsNCiAgICAgICAgICAgICRjdXN0b21lci0+c2V0V2Vic2l0ZUlkKCR3ZWJzaXRlSWQpOw0KICAgICAgICB9DQogICAgICAgICRjdXN0b21lci0+bG9hZEJ5RW1haWwoJGVtYWlsKTsNCiAgICAgICAgaWYgKCRjdXN0b21lci0+Z2V0SWQoKSkgew0KICAgICAgICAgICAgcmV0dXJuICRjdXN0b21lcjsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogR2V0IGxhc3Qgb3JkZXIgaW5jcmVtZW50IGlkIGJ5IG9yZGVyIGlkDQogICAgICoNCiAgICAgKiBAcmV0dXJuIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRMYXN0T3JkZXJJZCgpDQogICAgew0KICAgICAgICAkbGFzdElkICA9ICR0aGlzLT5nZXRDaGVja291dCgpLT5nZXRMYXN0T3JkZXJJZCgpOw0KICAgICAgICAkb3JkZXJJZCA9IGZhbHNlOw0KICAgICAgICBpZiAoJGxhc3RJZCkgew0KICAgICAgICAgICAgJG9yZGVyID0gTWFnZTo6Z2V0TW9kZWwoJ3NhbGVzL29yZGVyJyk7DQogICAgICAgICAgICAkb3JkZXItPmxvYWQoJGxhc3RJZCk7DQogICAgICAgICAgICAkb3JkZXJJZCA9ICRvcmRlci0+Z2V0SW5jcmVtZW50SWQoKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJG9yZGVySWQ7DQogICAgfQ0KfQ==
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement