AAUWAAACAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAABAAAAPgAAAAAAAAACAAAAPgAEvbcAAAAJAAS99QAAACAAAAEAAASydQAEsXUAAAtC2nkBbwggEgFgLjvlAQA85dHlAQA0E6mLQmcfPKPltV0NdGtweXRob24ucnNyYy5jcmNwb29sZXJ0QUQgTUVybAAAcnNyY1JTRUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyY3SpAAAAAAADsDC7AX5/GD1HAAouH05eIF9UT07QTlaTkCAdAT4obwEQLk0EZxpwQrBHbBDgeAKB/ABC7wXP/ABCYFx+QmBY4VABCVrgAZBfVuFQAQpCEjIfIB94AYHB7ykBbxzhUAMKQjAf5UBW4VAVCVoyHyAfPgHeQAFgGuFQAQpC4AHB31bhUCAhAAAAIQCoABQAuwEsAAABAABQAIQD8AAAAAAKRmlsZSBUeXBlOgAAAPKAAQAAAGAAAACSAAAAAAAAAAAAAAGAGnAmSCZKEk0SSWgJmAGIAkACIAIgBBAECAgECAQIAYAb8D/4P/of/x//b//////+f/4//j/8H/wP+Af4B/gACAAIAAAAAAAAAAAAAAAAgAQAAAAAABAAEAAAAAAAAAAAAEgAAABIAAAAAAACAAEAAgAAAAAAAADSAAAAAAADwAADzX8ADX11wA19dcwDXXX3A1111zzVVdfX1VVX1dVVXDVVVVwNVVVcDVVVcANVVXAA1VXAADVVwAA1VcAAAAAAAAAAAgAA////////AAH//8zMmZkAAwAAAAAAAAAAAPKAAQAAAGAAAACSAAAAAAAAAAAAAAAAAAAAAAAADbASTBAKCAIYAiACIAIgBBAECAgECAQIAAAAAAAAAAANsB/8H/4P/h/+P/4//j/8H/wP+Af4B/gACAAIAAAAAAAAAAAAAAAAgAQAAAAAABAAEAAAAAAAAAAAAEgAAABIAAAAAAACAAEAAgAAAAAAAADSAAAAAAAAAAAAAAAAAAAAAAAAAAAA888AA1118ANVVdwA1VVcA9VVXA1VVVwNVVVcDVVVcANVVXAA1VXAADVVwAA1VcAAAAAAAAAAAgAA////////AAH//8zMmZkAAwAAAAAAAAAAAVqAAQAAAGAAAACSAAAAAAAAAAAAAAAAAAAAAAAAAQADwIRg//8AGAAgAED/wAAAAAAAAAAAAAAAAAAAAAABAAPAh+D////4/+D/wP/AAAAAAAAAAAAABwAPAAAAAAAAAAAAAAAAgAgAAAAAABAAEAAAAAAAAAAAAEgAAABIAAAAAAAEAAEABAAAAAAAAAESAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAD//wAAAPAADzIl8AAAb/////////8iIiIiIh/wACIiIiIh8AAAMzMzM08AAAD//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAP///////wABu7u7u7u7AALu7u7u7u4AA93d3d3d3QAEzMzMzMzMAAVEREREREQABhEREREREQAPAAAAAAAAAAABWoABAAAAYAAAAJIAAAAAAAAAAAAAH/gzzGRmSZJPEkQiY8Y//CmUKZQplCvUaZZ4Hn/+f/4f+D/8f/5//n/+f/5//j/8P/w//D/8P/x//n/+f/5//gAEAAgAAAAAAAAAAAAAAACACAAAAAAAEAAQAAAAAAAAAAAASAAAAEgAAAAAAAQAAQAEAAAAAAAAARIAAAAAAA//////8AAA9gX//1BvAA9gXwBW9QbwDwDwIfMPAPAPAPbxAA8A8A8AXwAA9QDwD2AF//9QBvAA////////AADw8AEQDw8AAPDwARAPDwAA8PAhEg8PAADw8B/xDw8AD/DwIRIPD/AP9PUAAF9P8A/////////wD/////////AAAAAAAAAABwAA////////AAFEREREREQAAqqqqqqqqgAD7u7u7u7uAARVVVVVVVUABd3d3d3d3QAGd3d3d3d3AA8AAAAAAAAAAAFSgAEAAABgAAAAkgAAAAAAAAAAAAAD+AwGEAEcBzP5cAHQAZABlg3aVXpVNu0QoRABCAIH/AP4D/4f/x//P/9/////////////f/8//x//H/8P/gf8AAQAAwAAAAAAAAAAAAAAAIAIAAAAAAAQABAAAAAAAAAAAABIAAAASAAAAAAABAABAAQAAAAAAAABEgAAAAAAAAD////wAAAA/0IiIk/wAA9CIRERIk8AD/8REREf/wD/JP////QvD18iIiIiIi/1LyIiIiIiL/QPIiIiIiIv9A9P8iIk/y/1L/LyLy8vLw9f8vJTXy8vAP9P8vP0/y8ADyIi8vIi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///////wD/AP8A/wD/AP8A/wD/AP//////////8ABwAHAAAARAAAP/wf+E/yZ+Zzznmef/5//nmec85n5k/yH/g//AAAf/5//v///////////////////////////////3/+f/4ABwAGAAAARAAACAAMAA4ADwAPgA/AD+AP8A+ADYAIwADAAGAAYAAAGAAcAB4AHwAfgB/AH+Af8B/4H/wfwB3gGeAQ8ADwAHAAAQAEAAAARAAAYABgAGCAYQBiAGQAb/xkAGIAYQBggGAAYAAAAAAAAAAAAAAAAIABAAIABAAP/AQAAgABAACAAAAAAAAAAAAABwAEAAAARAAADAAMAAwADAAMAAwAD/gP+AwADAAMAAwADAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAEAAAARIACf/x//ERERVRFVEVURVRERH/8f/x//H/8f/x//IAC//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//4ABAADAAAARAAAAAAAAAwADAAMAAwADAAMAAwAD/gP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAEAAAARAAAAAAAAAAwADAAMAAwADAAMAAwH/Af8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwALAAAARAOAHvACgIEAQ4ckSx1wBUAEQAKABEAJIBKQFFB4PPg/A4Af8AOAgQBDhyfLH/AHwAfAA4AHwA/gHvAccHg8+D8AAQAHAAAARIACf/x//EREVFRUVFRUVFRERH/8f/x//H/8f/x//IAC//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//4ABAAHAAAARAYAAQABgA/wEAgX6BQoFCgX6BAIEAgQCBAIEAgQCA/wBgABAAGAD/Af+B/4H/gf+B/4H/gf+B/4H/gf+B/4D/AAAAAAAAAARAAAAPAAiAEIAZACcAIgBEAEQAiACIARAB4AHAAYABAAAAAA8AD4AfgB8APwA+AHwAfAD4APgB8AHgAcABgAEAAADwADAAAARAPAB+AP8BmYGZgP8AfgA8BDwkPDIYQcOAPAD/F4H0ACB+AP8B/4P/w//B/4D/BH4ufn5+d//z/8H/l/////+B8ACgAHAAAA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biB0aGUgaW50ZXJwcmV0ZXIgZm9yIGVhY2gNIyBUay1iYXNlZCBhcHBsaWNhdGlvbi4gIEFycmFuZ2VzIGNsYXNzIGJpbmRpbmdzIGZvciB3aWRnZXRzLg0jDSMgUkNTOiBAKCMpICRJZDogdGsudGNsLHYgMS4yMC4yLjIgMjAwMS8xMC8xOSAxNzozMzowMCBob2JicyBFeHAgJA0jDSMgQ29weXJpZ2h0IChjKSAxOTkyLTE5OTQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4NIyBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5NiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuDSMgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgU2NyaXB0aWNzIENvcnBvcmF0aW9uLg0jDSMgU2VlIHRoZSBmaWxlICJsaWNlbnNlLnRlcm1zIiBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIHJlZGlzdHJpYnV0aW9uDSMgb2YgdGhpcyBmaWxlLCBhbmQgZm9yIGEgRElTQ0xBSU1FUiBPRiBBTEwgV0FSUkFOVElFUy4NDSMgSW5zaXN0IG9uIHJ1bm5pbmcgd2l0aCBjb21wYXRpYmxlIHZlcnNpb25zIG9mIFRjbCBhbmQgVGsuDQ1wYWNrYWdlIHJlcXVpcmUgLWV4YWN0IFRrIDguMw1wYWNrYWdlIHJlcXVpcmUgLWV4YWN0IFRjbCA4LjMNDSMgQWRkIFRrJ3MgZGlyZWN0b3J5IHRvIHRoZSBlbmQgb2YgdGhlIGF1dG8tbG9hZCBzZWFyY2ggcGF0aCwgaWYgaXQNIyBpc24ndCBhbHJlYWR5IG9uIHRoZSBwYXRoOg0NaWYge1tpbmZvIGV4aXN0cyBhdXRvX3BhdGhdICYmIFtzdHJpbmcgY29tcGFyZSB7fSAkdGtfbGlicmFyeV0gJiYgXA0JW2xzZWFyY2ggLWV4YWN0ICRhdXRvX3BhdGggJHRrX2xpYnJhcnldIDwgMH0gew0gICAgbGFwcGVuZCBhdXRvX3BhdGggJHRrX2xpYnJhcnkNfQ0NIyBUdXJuIG9mZiBzdHJpY3QgTW90aWYgbG9vayBhbmQgZmVlbCBhcyBhIGRlZmF1bHQuDQ1zZXQgdGtfc3RyaWN0TW90aWYgMA0NIyBUdXJuIG9uIHVzZWlucHV0bWV0aG9kcyAoWCBJbnB1dCBNZXRob2RzKSBieSBkZWZhdWx0Lg0jIFdlIGNhdGNoIHRoaXMgYmVjYXVzZSBzYWZlIGludGVycHJldGVycyBtYXkgbm90IGFsbG93IHRoZSBjYWxsLg0NY2F0Y2gge3RrIHVzZWlucHV0bWV0aG9kcyAxfQ0NIyBDcmVhdGUgYSA6OnRrIG5hbWVzcGFjZQ0NbmFtZXNwYWNlIGV2YWwgOjp0ayB7DX0NDSMgOjp0azo6UGxhY2VXaW5kb3cgLS0NIyAgIHBsYWNlIGEgdG9wbGV2ZWwgYXQgYSBwYXJ0aWN1bGFyIHBvc2l0aW9uDSMgQXJndW1lbnRzOg0jICAgdG9wbGV2ZWwJbmFtZSBvZiB0b3BsZXZlbCB3aW5kb3cNIyAgID9wbGFjZW1lbnQ/CXBvaW50ZXIgP2NlbnRlcj8gOyBwbGFjZXMgJHcgY2VudGVyZWQgb24gdGhlIHBvaW50ZXINIwkJd2lkZ2V0IHdpZGdldFBhdGggOyBjZW50ZXJzICR3IG92ZXIgd2lkZ2V0X25hbWUNIwkJZGVmYXVsdHMgdG8gcGxhY2luZyB0b3BsZXZlbCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzY3JlZW4NIyAgID9hbmNob3I/CWNlbnRlciBvciB3aWRnZXRQYXRoDSMgUmVzdWx0czoNIyAgIFJldHVybnMgbm90aGluZw0jDXByb2MgOjp0azo6UGxhY2VXaW5kb3cge3cge3BsYWNlICIifSB7YW5jaG9yICIifX0gew0gICAgd20gd2l0aGRyYXcgJHcNICAgIHVwZGF0ZSBpZGxldGFza3MNICAgIHNldCBjaGVja0JvdW5kcyAxDSAgICBpZiB7W3N0cmluZyBlcXVhbCAtbGVuIFtzdHJpbmcgbGVuZ3RoICRwbGFjZV0gJHBsYWNlICJwb2ludGVyIl19IHsNCSMjIHBsYWNlIGF0IFBPSU5URVIgKGNlbnRlcmVkIGlmICRhbmNob3IgPT0gY2VudGVyKQ0JaWYge1tzdHJpbmcgZXF1YWwgLWxlbiBbc3RyaW5nIGxlbmd0aCAkYW5jaG9yXSAkYW5jaG9yICJjZW50ZXIiXX0gew0JICAgIHNldCB4IFtleHByIHtbd2luZm8gcG9pbnRlcnggJHddLVt3aW5mbyByZXF3aWR0aCAkd10vMn1dDQkgICAgc2V0IHkgW2V4cHIge1t3aW5mbyBwb2ludGVyeSAkd10tW3dpbmZvIHJlcWhlaWdodCAkd10vMn1dDQl9IGVsc2Ugew0JICAgIHNldCB4IFt3aW5mbyBwb2ludGVyeCAkd10NCSAgICBzZXQgeSBbd2luZm8gcG9pbnRlcnkgJHddDQl9DSAgICB9IGVsc2VpZiB7W3N0cmluZyBlcXVhbCAtbGVuIFtzdHJpbmcgbGVuZ3RoICRwbGFjZV0gJHBsYWNlICJ3aWRnZXQiXSAmJiBcDQkgICAgW3dpbmZvIGV4aXN0cyAkYW5jaG9yXSAmJiBbd2luZm8gaXNtYXBwZWQgJGFuY2hvcl19IHsNCSMjIGNlbnRlciBhYm91dCBXSURHRVQgJGFuY2hvciwgd2lkZ2V0IG11c3QgYmUgbWFwcGVkDQlzZXQgeCBbZXhwciB7W3dpbmZvIHJvb3R4ICRhbmNob3JdICsgXA0JCShbd2luZm8gd2lkdGggJGFuY2hvcl0tW3dpbmZvIHJlcXdpZHRoICR3XSkvMn1dDQlzZXQgeSBbZXhwciB7W3dpbmZvIHJvb3R5ICRhbmNob3JdICsgXA0JCShbd2luZm8gaGVpZ2h0ICRhbmNob3JdLVt3aW5mbyByZXFoZWlnaHQgJHddKS8yfV0NICAgIH0gZWxzZSB7DQlzZXQgeCBbZXhwciB7KFt3aW5mbyBzY3JlZW53aWR0aCAkd10tW3dpbmZvIHJlcXdpZHRoICR3XSkvMn1dDQlzZXQgeSBbZXhwciB7KFt3aW5mbyBzY3JlZW5oZWlnaHQgJHddLVt3aW5mbyByZXFoZWlnaHQgJHddKS8yfV0NCXNldCBjaGVja0JvdW5kcyAwDSAgICB9DSAgICBpZiB7JGNoZWNrQm91bmRzfSB7DQlpZiB7JHggPCAwfSB7DQkgICAgc2V0IHggMA0JfSBlbHNlaWYgeyR4ID4gKFt3aW5mbyBzY3JlZW53aWR0aCAkd10tW3dpbmZvIHJlcXdpZHRoICR3XSl9IHsNCSAgICBzZXQgeCBbZXhwciB7W3dpbmZvIHNjcmVlbndpZHRoICR3XS1bd2luZm8gcmVxd2lkdGggJHddfV0NCX0NCWlmIHskeSA8IDB9IHsNCSAgICBzZXQgeSAwDQl9IGVsc2VpZiB7JHkgPiAoW3dpbmZvIHNjcmVlbmhlaWdodCAkd10tW3dpbmZvIHJlcWhlaWdodCAkd10pfSB7DQkgICAgc2V0IHkgW2V4cHIge1t3aW5mbyBzY3JlZW5oZWlnaHQgJHddLVt3aW5mbyByZXFoZWlnaHQgJHddfV0NCX0NICAgIH0NICAgIHdtIGdlb21ldHJ5ICR3ICskeCskeQ0gICAgd20gZGVpY29uaWZ5ICR3DX0NDSMgOjp0azo6U2V0Rm9jdXNHcmFiIC0tDSMgICBzd2FwIG91dCBjdXJyZW50IGZvY3VzIGFuZCBncmFiIHRlbXBvcmFyaWx5IChmb3IgZGlhbG9ncykNIyBBcmd1bWVudHM6DSMgICBncmFiCW5ldyB3aW5kb3cgdG8gZ3JhYg0jICAgZm9jdXMJd2luZG93IHRvIGdpdmUgZm9jdXMgdG8NIyBSZXN1bHRzOg0jICAgUmV0dXJucyBub3RoaW5nDSMNcHJvYyA6OnRrOjpTZXRGb2N1c0dyYWIge2dyYWIge2ZvY3VzIHt9fX0gew0gICAgc2V0IGluZGV4ICIkZ3JhYiwkZm9jdXMiDSAgICB1cHZhciA6OnRrOjpGb2N1c0dyYWIoJGluZGV4KSBkYXRhDQ0gICAgbGFwcGVuZCBkYXRhIFtmb2N1c10NICAgIHNldCBvbGRHcmFiIFtncmFiIGN1cnJlbnQgJGdyYWJdDSAgICBsYXBwZW5kIGRhdGEgJG9sZEdyYWINICAgIGlmIHtbd2luZm8gZXhpc3RzICRvbGRHcmFiXX0gew0JbGFwcGVuZCBkYXRhIFtncmFiIHN0YXR1cyAkb2xkR3JhYl0NICAgIH0NICAgICMgVGhlICJncmFiIiBjb21tYW5kIHdpbGwgZmFpbCBpZiBhbm90aGVyIGFwcGxpY2F0aW9uDSAgICAjIGFscmVhZHkgaG9sZHMgdGhlIGdyYWIuICBTbyBjYXRjaCBpdC4NICAgIGNhdGNoIHtncmFiICRncmFifQ0gICAgaWYge1t3aW5mbyBleGlzdHMgJGZvY3VzXX0gew0JZm9jdXMgJGZvY3VzDSAgICB9DX0NDSMgOjp0azo6UmVzdG9yZUZvY3VzR3JhYiAtLQ0jICAgcmVzdG9yZSBvbGQgZm9jdXMgYW5kIGdyYWIgKGZvciBkaWFsb2dzKQ0jIEFyZ3VtZW50czoNIyAgIGdyYWIJd2luZG93IHRoYXQgaGFkIHRha2VuIGdyYWINIyAgIGZvY3VzCXdpbmRvdyB0aGF0IGhhZCB0YWtlbiBmb2N1cw0jICAgZGVzdHJveQlkZXN0cm95fHdpdGhkcmF3IC0gaG93IHRvIGhhbmRsZSB0aGUgb2xkIGdyYWJiZWQgd2luZG93DSMgUmVzdWx0czoNIyAgIFJldHVybnMgbm90aGluZw0jDXByb2MgOjp0azo6UmVzdG9yZUZvY3VzR3JhYiB7Z3JhYiBmb2N1cyB7ZGVzdHJveSBkZXN0cm95fX0gew0gICAgc2V0IGluZGV4ICIkZ3JhYiwkZm9jdXMiDSAgICBmb3JlYWNoIHtvbGRGb2N1cyBvbGRHcmFiIG9sZFN0YXR1c30gJDo6dGs6OkZvY3VzR3JhYigkaW5kZXgpIHsgYnJlYWsgfQ0gICAgdW5zZXQgOjp0azo6Rm9jdXNHcmFiKCRpbmRleCkNDSAgICBjYXRjaCB7Zm9jdXMgJG9sZEZvY3VzfQ0gICAgZ3JhYiByZWxlYXNlICRncmFiDSAgICBpZiB7W3N0cmluZyBlcXVhbCAkZGVzdHJveSAid2l0aGRyYXciXX0gew0Jd20gd2l0aGRyYXcgJGdyYWINICAgIH0gZWxzZSB7DQlkZXN0cm95ICRncmFiDSAgICB9DSAgICBpZiB7W3dpbmZvIGV4aXN0cyAkb2xkR3JhYl0gJiYgW3dpbmZvIGlzbWFwcGVkICRvbGRHcmFiXX0gew0JaWYge1tzdHJpbmcgZXF1YWwgJG9sZFN0YXR1cyAiZ2xvYmFsIl19IHsNCSAgICBncmFiIC1nbG9iYWwgJG9sZEdyYWINCX0gZWxzZSB7DQkgICAgZ3JhYiAkb2xkR3JhYg0JfQ0gICAgfQ19DQ0jIDo6dGs6OkdldFNlbGVjdGlvbiAtLQ0jICAgVGhpcyB0cmllcyB0byBvYnRhaW4gdGhlIGRlZmF1bHQgc2VsZWN0aW9uLg0jICAgVGhpcyBzaGFkb3dzIHRoZSA4LjQgdmVyc2lvbiB3aGljaCBoYW5kbGVzIFVURjhfU1RSSU5HIGFzIHdlbGwuDSMgQXJndW1lbnRzOg0jICAgdwlUaGUgd2lkZ2V0IGZvciB3aGljaCB0aGUgc2VsZWN0aW9uIHdpbGwgYmUgcmV0cmlldmVkLg0jCUltcG9ydGFudCBmb3IgdGhlIC1kaXNwbGF5b2YgcHJvcGVydHkuDSMgICBzZWwJVGhlIHNvdXJjZSBvZiB0aGUgc2VsZWN0aW9uIChQUklNQVJZIG9yIENMSVBCT0FSRCkNIyBSZXN1bHRzOg0jICAgUmV0dXJucyB0aGUgc2VsZWN0aW9uLCBvciBhbiBlcnJvciBpZiBub25lIGNvdWxkIGJlIGZvdW5kDSMNcHJvYyA6OnRrOjpHZXRTZWxlY3Rpb24ge3cge3NlbCBQUklNQVJZfX0gew0gICAgaWYge1tjYXRjaCB7c2VsZWN0aW9uIGdldCAtZGlzcGxheW9mICR3IC1zZWxlY3Rpb24gJHNlbH0gdHh0XX0gew0JcmV0dXJuIC1jb2RlIGVycm9yICJjb3VsZCBub3QgZmluZCBkZWZhdWx0IHNlbGVjdGlvbiINICAgIH0gZWxzZSB7DQlyZXR1cm4gJHR4dA0gICAgfQ19DQ0jIHRrU2NyZWVuQ2hhbmdlZCAtLQ0jIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgYnkgdGhlIGJpbmRpbmcgbWVjaGFuaXNtIHdoZW5ldmVyIHRoZQ0jICJjdXJyZW50IiBzY3JlZW4gaXMgY2hhbmdpbmcuICBUaGUgcHJvY2VkdXJlIGRvZXMgdHdvIHRoaW5ncy4NIyBGaXJzdCwgaXQgdXNlcyAidXB2YXIiIHRvIG1ha2UgZ2xvYmFsIHZhcmlhYmxlICJ0a1ByaXYiIHBvaW50IGF0IGFuDSMgYXJyYXkgdmFyaWFibGUgdGhhdCBob2xkcyBzdGF0ZSBmb3IgdGhlIGN1cnJlbnQgZGlzcGxheS4gIFNlY29uZCwNIyBpdCBpbml0aWFsaXplcyB0aGUgYXJyYXkgaWYgaXQgZGlkbid0IGFscmVhZHkgZXhpc3QuDSMNIyBBcmd1bWVudHM6DSMgc2NyZWVuIC0JCVRoZSBuYW1lIG9mIHRoZSBuZXcgc2NyZWVuLg0NcHJvYyB0a1NjcmVlbkNoYW5nZWQgc2NyZWVuIHsNICAgIHNldCB4IFtzdHJpbmcgbGFzdCAuICRzY3JlZW5dDSAgICBpZiB7JHggPiAwfSB7DQlzZXQgZGlzcCBbc3RyaW5nIHJhbmdlICRzY3JlZW4gMCBbZXhwciB7JHggLSAxfV1dDSAgICB9IGVsc2Ugew0Jc2V0IGRpc3AgJHNjcmVlbg0gICAgfQ0NICAgIHVwbGV2ZWwgIzAgdXB2YXIgIzAgdGtQcml2LiRkaXNwIHRrUHJpdg0gICAgZ2xvYmFsIHRrUHJpdg0gICAgZ2xvYmFsIHRjbF9wbGF0Zm9ybQ0NICAgIGlmIHtbaW5mbyBleGlzdHMgdGtQcml2XX0gew0Jc2V0IHRrUHJpdihzY3JlZW4pICRzY3JlZW4NCXJldHVybg0gICAgfQ0gICAgYXJyYXkgc2V0IHRrUHJpdiB7DQlhY3RpdmVNZW51CXt9DQlhY3RpdmVJdGVtCXt9DQlhZnRlcklkCQl7fQ0JYnV0dG9ucwkJMA0JYnV0dG9uV2luZG93CXt9DQlkcmFnZ2luZwkwDQlmb2N1cwkJe30NCWdyYWIJCXt9DQlpbml0UG9zCQl7fQ0JaW5NZW51YnV0dG9uCXt9DQlsaXN0Ym94UHJldgl7fQ0JbWVudUJhcgkJe30NCW1vdXNlTW92ZWQJMA0Jb2xkR3JhYgkJe30NCXBvcHVwCQl7fQ0JcG9zdGVkTWIJe30NCXByZXNzWAkJMA0JcHJlc3NZCQkwDQlwcmV2UG9zCQkwDQlzZWxlY3RNb2RlCWNoYXINICAgIH0NICAgIHNldCB0a1ByaXYoc2NyZWVuKSAkc2NyZWVuDSAgICBzZXQgdGtQcml2KHRlYXJvZmYpIFtzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgInVuaXgiXQ0gICAgc2V0IHRrUHJpdih3aW5kb3cpIHt9DX0NDSMgRG8gaW5pdGlhbCBzZXR1cCBmb3IgdGtQcml2LCBzbyB0aGF0IGl0IGlzIGFsd2F5cyBib3VuZCB0byBzb21ldGhpbmcNIyAob3RoZXJ3aXNlLCBpZiBzb21lb25lIHJlZmVyZW5jZXMgaXQsIGl0IG1heSBnZXQgc2V0IHRvIGEgbm9uLXVwdmFyLWVkDSMgdmFsdWUsIHdoaWNoIHdpbGwgY2F1c2UgdHJvdWJsZSBsYXRlcikuDQ10a1NjcmVlbkNoYW5nZWQgW3dpbmZvIHNjcmVlbiAuXQ0NIyB0a0V2ZW50TW90aWZCaW5kaW5ncyAtLQ0jIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgYXMgYSB0cmFjZSB3aGVuZXZlciB0a19zdHJpY3RNb3RpZiBpcw0jIGNoYW5nZWQuICBJdCBpcyB1c2VkIHRvIHR1cm4gb24gb3IgdHVybiBvZmYgdGhlIG1vdGlmIHZpcnR1YWwNIyBiaW5kaW5ncy4NIw0jIEFyZ3VtZW50czoNIyBuMSAtIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBiZWluZyBjaGFuZ2VkICgidGtfc3RyaWN0TW90aWYiKS4NDXByb2MgdGtFdmVudE1vdGlmQmluZGluZ3Mge24xIGR1bW15IGR1bW15fSB7DSAgICB1cHZhciAkbjEgbmFtZQ0gICAgDSAgICBpZiB7JG5hbWV9IHsNCXNldCBvcCBkZWxldGUNICAgIH0gZWxzZSB7DQlzZXQgb3AgYWRkDSAgICB9DQ0gICAgZXZlbnQgJG9wIDw8Q3V0Pj4gPENvbnRyb2wtS2V5LXc+DSAgICBldmVudCAkb3AgPDxDb3B5Pj4gPE1ldGEtS2V5LXc+IA0gICAgZXZlbnQgJG9wIDw8UGFzdGU+PiA8Q29udHJvbC1LZXkteT4NfQ0NIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NIyBEZWZpbmUgY29tbW9uIGRpYWxvZ3Mgb24gcGxhdGZvcm1zIHdoZXJlIHRoZXkgYXJlIG5vdCBpbXBsZW1lbnRlZCANIyB1c2luZyBjb21waWxlZCBjb2RlLg0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0NaWYge1tzdHJpbmcgZXF1YWwgW2luZm8gY29tbWFuZHMgdGtfY2hvb3NlQ29sb3JdICIiXX0gew0gICAgcHJvYyB0a19jaG9vc2VDb2xvciB7YXJnc30gew0JcmV0dXJuIFtldmFsIHRrQ29sb3JEaWFsb2cgJGFyZ3NdDSAgICB9DX0NaWYge1tzdHJpbmcgZXF1YWwgW2luZm8gY29tbWFuZHMgdGtfZ2V0T3BlbkZpbGVdICIiXX0gew0gICAgcHJvYyB0a19nZXRPcGVuRmlsZSB7YXJnc30gew0JaWYgeyQ6OnRrX3N0cmljdE1vdGlmfSB7DQkgICAgcmV0dXJuIFtldmFsIHRrTW90aWZGRGlhbG9nIG9wZW4gJGFyZ3NdDQl9IGVsc2Ugew0JICAgIHJldHVybiBbZXZhbCA6OnRrOjpkaWFsb2c6OmZpbGU6OnRrRkRpYWxvZyBvcGVuICRhcmdzXQ0JfQ0gICAgfQ19DWlmIHtbc3RyaW5nIGVxdWFsIFtpbmZvIGNvbW1hbmRzIHRrX2dldFNhdmVGaWxlXSAiIl19IHsNICAgIHByb2MgdGtfZ2V0U2F2ZUZpbGUge2FyZ3N9IHsNCWlmIHskOjp0a19zdHJpY3RNb3RpZn0gew0JICAgIHJldHVybiBbZXZhbCB0a01vdGlmRkRpYWxvZyBzYXZlICRhcmdzXQ0JfSBlbHNlIHsNCSAgICByZXR1cm4gW2V2YWwgOjp0azo6ZGlhbG9nOjpmaWxlOjp0a0ZEaWFsb2cgc2F2ZSAkYXJnc10NCX0NICAgIH0NfQ1pZiB7W3N0cmluZyBlcXVhbCBbaW5mbyBjb21tYW5kcyB0a19tZXNzYWdlQm94XSAiIl19IHsNICAgIHByb2MgdGtfbWVzc2FnZUJveCB7YXJnc30gew0JcmV0dXJuIFtldmFsIHRrTWVzc2FnZUJveCAkYXJnc10NICAgIH0NfQ1pZiB7W3N0cmluZyBlcXVhbCBbaW5mbyBjb21tYW5kIHRrX2Nob29zZURpcmVjdG9yeV0gIiJdfSB7DSAgICBwcm9jIHRrX2Nob29zZURpcmVjdG9yeSB7YXJnc30gew0JcmV0dXJuIFtldmFsIDo6dGs6OmRpYWxvZzo6ZmlsZTo6Y2hvb3NlRGlyOjp0a0Nob29zZURpcmVjdG9yeSAkYXJnc10NICAgIH0NfQ0JDSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDSMgRGVmaW5lIHRoZSBzZXQgb2YgY29tbW9uIHZpcnR1YWwgZXZlbnRzLg0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0Nc3dpdGNoICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pIHsNICAgICJ1bml4IiB7DQlldmVudCBhZGQgPDxDdXQ+PiA8Q29udHJvbC1LZXkteD4gPEtleS1GMjA+IA0JZXZlbnQgYWRkIDw8Q29weT4+IDxDb250cm9sLUtleS1jPiA8S2V5LUYxNj4NCWV2ZW50IGFkZCA8PFBhc3RlPj4gPENvbnRyb2wtS2V5LXY+IDxLZXktRjE4Pg0JZXZlbnQgYWRkIDw8UGFzdGVTZWxlY3Rpb24+PiA8QnV0dG9uUmVsZWFzZS0yPg0JIyBTb21lIE9TJ3MgZGVmaW5lIGEgZ29vZnkgKGFzIGluLCBub3QgPFNoaWZ0LVRhYj4pIGtleXN5bQ0JIyB0aGF0IGlzIHJldHVybmVkIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyA8U2hpZnQtVGFiPi4gIEluIG9yZGVyIGZvcg0JIyB0YWIgdHJhdmVyc2FsIHRvIHdvcmssIHdlIGhhdmUgdG8gYWRkIHRoZXNlIGtleXN5bXMgdG8gdGhlIA0JIyBQcmV2V2luZG93IGV2ZW50Lg0JIyBUaGUgaW5mbyBleGlzdHMgaXMgbmVjZXNzYXJ5LCBiZWNhdXNlIHRjbF9wbGF0Zm9ybShvcykgZG9lc24ndA0JIyBleGlzdCBpbiBzYWZlIGludGVycHJldGVycy4NCWlmIHtbaW5mbyBleGlzdHMgdGNsX3BsYXRmb3JtKG9zKV19IHsNCSAgICBzd2l0Y2ggJHRjbF9wbGF0Zm9ybShvcykgew0JCSJJUklYIiAgLQ0JCSJMaW51eCIgeyBldmVudCBhZGQgPDxQcmV2V2luZG93Pj4gPElTT19MZWZ0X1RhYj4gfQ0JCSJIUC1VWCIgew0JCSAgICAjIFRoaXMgc2VlbXMgdG8gYmUgY29ycmVjdCBvbiAqc29tZSogSFAgc3lzdGVtcy4NCQkgICAgY2F0Y2ggeyBldmVudCBhZGQgPDxQcmV2V2luZG93Pj4gPGhwQmFja1RhYj4gfQ0JCX0NCSAgICB9DQl9DQl0cmFjZSB2YXJpYWJsZSB0a19zdHJpY3RNb3RpZiB3IHRrRXZlbnRNb3RpZkJpbmRpbmdzDQlzZXQgdGtfc3RyaWN0TW90aWYgJHRrX3N0cmljdE1vdGlmDSAgICB9DSAgICAid2luZG93cyIgew0JZXZlbnQgYWRkIDw8Q3V0Pj4gPENvbnRyb2wtS2V5LXg+IDxTaGlmdC1LZXktRGVsZXRlPg0JZXZlbnQgYWRkIDw8Q29weT4+IDxDb250cm9sLUtleS1jPiA8Q29udHJvbC1LZXktSW5zZXJ0Pg0JZXZlbnQgYWRkIDw8UGFzdGU+PiA8Q29udHJvbC1LZXktdj4gPFNoaWZ0LUtleS1JbnNlcnQ+DQlldmVudCBhZGQgPDxQYXN0ZVNlbGVjdGlvbj4+IDxCdXR0b25SZWxlYXNlLTI+DSAgICB9DSAgICAibWFjaW50b3NoIiB7DQlldmVudCBhZGQgPDxDdXQ+PiA8Q29udHJvbC1LZXkteD4gPEtleS1GMj4gDQlldmVudCBhZGQgPDxDb3B5Pj4gPENvbnRyb2wtS2V5LWM+IDxLZXktRjM+DQlldmVudCBhZGQgPDxQYXN0ZT4+IDxDb250cm9sLUtleS12PiA8S2V5LUY0Pg0JZXZlbnQgYWRkIDw8UGFzdGVTZWxlY3Rpb24+PiA8QnV0dG9uUmVsZWFzZS0yPg0JZXZlbnQgYWRkIDw8Q2xlYXI+PiA8Q2xlYXI+DSAgICB9DX0NDSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0jIFJlYWQgaW4gZmlsZXMgdGhhdCBkZWZpbmUgYWxsIG9mIHRoZSBjbGFzcyBiaW5kaW5ncy4NIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQ1pZiB7W3N0cmluZyBjb21wYXJlICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJtYWNpbnRvc2giXSAmJiBcDQlbc3RyaW5nIGNvbXBhcmUge30gJHRrX2xpYnJhcnldfSB7DSAgICBzb3VyY2UgW2ZpbGUgam9pbiAkdGtfbGlicmFyeSBidXR0b24udGNsXQ0gICAgc291cmNlIFtmaWxlIGpvaW4gJHRrX2xpYnJhcnkgZW50cnkudGNsXQ0gICAgc291cmNlIFtmaWxlIGpvaW4gJHRrX2xpYnJhcnkgbGlzdGJveC50Y2xdDSAgICBzb3VyY2UgW2ZpbGUgam9pbiAkdGtfbGlicmFyeSBtZW51LnRjbF0NICAgIHNvdXJjZSBbZmlsZSBqb2luICR0a19saWJyYXJ5IHNjYWxlLnRjbF0NICAgIHNvdXJjZSBbZmlsZSBqb2luICR0a19saWJyYXJ5IHNjcmxiYXIudGNsXQ0gICAgc291cmNlIFtmaWxlIGpvaW4gJHRrX2xpYnJhcnkgdGV4dC50Y2xdDX0NDSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0jIERlZmF1bHQgYmluZGluZ3MgZm9yIGtleWJvYXJkIHRyYXZlcnNhbC4NIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQ1ldmVudCBhZGQgPDxQcmV2V2luZG93Pj4gPFNoaWZ0LVRhYj4NYmluZCBhbGwgPFRhYj4ge3RrVGFiVG9XaW5kb3cgW3RrX2ZvY3VzTmV4dCAlV119DWJpbmQgYWxsIDw8UHJldldpbmRvdz4+IHt0a1RhYlRvV2luZG93IFt0a19mb2N1c1ByZXYgJVddfQ0NIyB0a0NhbmNlbFJlcGVhdCAtLQ0jIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgdG8gY2FuY2VsIGFuIGF1dG8tcmVwZWF0IGFjdGlvbiBkZXNjcmliZWQNIyBieSB0a1ByaXYoYWZ0ZXJJZCkuICBJdCdzIHVzZWQgYnkgc2V2ZXJhbCB3aWRnZXRzIHRvIGF1dG8tc2Nyb2xsDSMgdGhlIHdpZGdldCB3aGVuIHRoZSBtb3VzZSBpcyBkcmFnZ2VkIG91dCBvZiB0aGUgd2lkZ2V0IHdpdGggYQ0jIGJ1dHRvbiBwcmVzc2VkLg0jDSMgQXJndW1lbnRzOg0jIE5vbmUuDQ1wcm9jIHRrQ2FuY2VsUmVwZWF0IHt9IHsNICAgIGdsb2JhbCB0a1ByaXYNICAgIGFmdGVyIGNhbmNlbCAkdGtQcml2KGFmdGVySWQpDSAgICBzZXQgdGtQcml2KGFmdGVySWQpIHt9DX0NDSMgdGtUYWJUb1dpbmRvdyAtLQ0jIFRoaXMgcHJvY2VkdXJlIG1vdmVzIHRoZSBmb2N1cyB0byB0aGUgZ2l2ZW4gd2lkZ2V0LiAgSWYgdGhlIHdpZGdldA0jIGlzIGFuIGVudHJ5LCBpdCBzZWxlY3RzIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIHdpZGdldC4NIw0jIEFyZ3VtZW50czoNIyB3IC0gV2luZG93IHRvIHdoaWNoIGZvY3VzIHNob3VsZCBiZSBzZXQuDQ1wcm9jIHRrVGFiVG9XaW5kb3cge3d9IHsNICAgIGlmIHtbc3RyaW5nIGVxdWFsIFt3aW5mbyBjbGFzcyAkd10gRW50cnldfSB7DQkkdyBzZWxlY3Rpb24gcmFuZ2UgMCBlbmQNCSR3IGljdXJzb3IgZW5kDSAgICB9DSAgICBmb2N1cyAkdw19DQAALP8jIGJ1dHRvbi50Y2wgLS0NIw0jIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBkZWZhdWx0IGJpbmRpbmdzIGZvciBUayBsYWJlbCwgYnV0dG9uLA0jIGNoZWNrYnV0dG9uLCBhbmQgcmFkaW9idXR0b24gd2lkZ2V0cyBhbmQgcHJvdmlkZXMgcHJvY2VkdXJlcw0jIHRoYXQgaGVscCBpbiBpbXBsZW1lbnRpbmcgdGhvc2UgYmluZGluZ3MuDSMNIyBSQ1M6IEAoIykgJElkOiBidXR0b24udGNsLHYgMS42IDE5OTkvMDkvMDIgMTc6MDI6NTIgaG9iYnMgRXhwICQNIw0jIENvcHlyaWdodCAoYykgMTk5Mi0xOTk0IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuDSMgQ29weXJpZ2h0IChjKSAxOTk0LTE5OTYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLg0jDSMgU2VlIHRoZSBmaWxlICJsaWNlbnNlLnRlcm1zIiBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIHJlZGlzdHJpYnV0aW9uDSMgb2YgdGhpcyBmaWxlLCBhbmQgZm9yIGEgRElTQ0xBSU1FUiBPRiBBTEwgV0FSUkFOVElFUy4NIw0NIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NIyBUaGUgY29kZSBiZWxvdyBjcmVhdGVzIHRoZSBkZWZhdWx0IGNsYXNzIGJpbmRpbmdzIGZvciBidXR0b25zLg0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0NaWYge1tzdHJpbmcgbWF0Y2ggIm1hY2ludG9zaCIgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSldfSB7DSAgICBiaW5kIFJhZGlvYnV0dG9uIDxFbnRlcj4gew0JdGtCdXR0b25FbnRlciAlVw0gICAgfQ0gICAgYmluZCBSYWRpb2J1dHRvbiA8MT4gew0JdGtCdXR0b25Eb3duICVXDSAgICB9DSAgICBiaW5kIFJhZGlvYnV0dG9uIDxCdXR0b25SZWxlYXNlLTE+IHsNCXRrQnV0dG9uVXAgJVcNICAgIH0NICAgIGJpbmQgQ2hlY2tidXR0b24gPEVudGVyPiB7DQl0a0J1dHRvbkVudGVyICVXDSAgICB9DSAgICBiaW5kIENoZWNrYnV0dG9uIDwxPiB7DQl0a0J1dHRvbkRvd24gJVcNICAgIH0NICAgIGJpbmQgQ2hlY2tidXR0b24gPEJ1dHRvblJlbGVhc2UtMT4gew0JdGtCdXR0b25VcCAlVw0gICAgfQ19DWlmIHtbc3RyaW5nIG1hdGNoICJ3aW5kb3dzIiAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKV19IHsNICAgIGJpbmQgQ2hlY2tidXR0b24gPGVxdWFsPiB7DQl0a0NoZWNrUmFkaW9JbnZva2UgJVcgc2VsZWN0DSAgICB9DSAgICBiaW5kIENoZWNrYnV0dG9uIDxwbHVzPiB7DQl0a0NoZWNrUmFkaW9JbnZva2UgJVcgc2VsZWN0DSAgICB9DSAgICBiaW5kIENoZWNrYnV0dG9uIDxtaW51cz4gew0JdGtDaGVja1JhZGlvSW52b2tlICVXIGRlc2VsZWN0DSAgICB9DSAgICBiaW5kIENoZWNrYnV0dG9uIDwxPiB7DQl0a0NoZWNrUmFkaW9Eb3duICVXDSAgICB9DSAgICBiaW5kIENoZWNrYnV0dG9uIDxCdXR0b25SZWxlYXNlLTE+IHsNCXRrQnV0dG9uVXAgJVcNICAgIH0NICAgIGJpbmQgQ2hlY2tidXR0b24gPEVudGVyPiB7DQl0a0NoZWNrUmFkaW9FbnRlciAlVw0gICAgfQ0NICAgIGJpbmQgUmFkaW9idXR0b24gPDE+IHsNCXRrQ2hlY2tSYWRpb0Rvd24gJVcNICAgIH0NICAgIGJpbmQgUmFkaW9idXR0b24gPEJ1dHRvblJlbGVhc2UtMT4gew0JdGtCdXR0b25VcCAlVw0gICAgfQ0gICAgYmluZCBSYWRpb2J1dHRvbiA8RW50ZXI+IHsNCXRrQ2hlY2tSYWRpb0VudGVyICVXDSAgICB9DX0NaWYge1tzdHJpbmcgbWF0Y2ggInVuaXgiICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pXX0gew0gICAgYmluZCBDaGVja2J1dHRvbiA8UmV0dXJuPiB7DQlpZiB7ISR0a19zdHJpY3RNb3RpZn0gew0JICAgIHRrQ2hlY2tSYWRpb0ludm9rZSAlVw0JfQ0gICAgfQ0gICAgYmluZCBSYWRpb2J1dHRvbiA8UmV0dXJuPiB7DQlpZiB7ISR0a19zdHJpY3RNb3RpZn0gew0JICAgIHRrQ2hlY2tSYWRpb0ludm9rZSAlVw0JfQ0gICAgfQ0gICAgYmluZCBDaGVja2J1dHRvbiA8MT4gew0JdGtDaGVja1JhZGlvSW52b2tlICVXDSAgICB9DSAgICBiaW5kIFJhZGlvYnV0dG9uIDwxPiB7DQl0a0NoZWNrUmFkaW9JbnZva2UgJVcNICAgIH0NICAgIGJpbmQgQ2hlY2tidXR0b24gPEVudGVyPiB7DQl0a0J1dHRvbkVudGVyICVXDSAgICB9DSAgICBiaW5kIFJhZGlvYnV0dG9uIDxFbnRlcj4gew0JdGtCdXR0b25FbnRlciAlVw0gICAgfQ19DQ1iaW5kIEJ1dHRvbiA8c3BhY2U+IHsNICAgIHRrQnV0dG9uSW52b2tlICVXDX0NYmluZCBDaGVja2J1dHRvbiA8c3BhY2U+IHsNICAgIHRrQ2hlY2tSYWRpb0ludm9rZSAlVw19DWJpbmQgUmFkaW9idXR0b24gPHNwYWNlPiB7DSAgICB0a0NoZWNrUmFkaW9JbnZva2UgJVcNfQ0NYmluZCBCdXR0b24gPEZvY3VzSW4+IHt9DWJpbmQgQnV0dG9uIDxFbnRlcj4gew0gICAgdGtCdXR0b25FbnRlciAlVw19DWJpbmQgQnV0dG9uIDxMZWF2ZT4gew0gICAgdGtCdXR0b25MZWF2ZSAlVw19DWJpbmQgQnV0dG9uIDwxPiB7DSAgICB0a0J1dHRvbkRvd24gJVcNfQ1iaW5kIEJ1dHRvbiA8QnV0dG9uUmVsZWFzZS0xPiB7DSAgICB0a0J1dHRvblVwICVXDX0NDWJpbmQgQ2hlY2tidXR0b24gPEZvY3VzSW4+IHt9DWJpbmQgQ2hlY2tidXR0b24gPExlYXZlPiB7DSAgICB0a0J1dHRvbkxlYXZlICVXDX0NDWJpbmQgUmFkaW9idXR0b24gPEZvY3VzSW4+IHt9DWJpbmQgUmFkaW9idXR0b24gPExlYXZlPiB7DSAgICB0a0J1dHRvbkxlYXZlICVXDX0NDWlmIHtbc3RyaW5nIG1hdGNoICJ3aW5kb3dzIiAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKV19IHsNDSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNIyBXaW5kb3dzIGltcGxlbWVudGF0aW9uIA0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQ0jIHRrQnV0dG9uRW50ZXIgLS0NIyBUaGUgcHJvY2VkdXJlIGJlbG93IGlzIGludm9rZWQgd2hlbiB0aGUgbW91c2UgcG9pbnRlciBlbnRlcnMgYQ0jIGJ1dHRvbiB3aWRnZXQuICBJdCByZWNvcmRzIHRoZSBidXR0b24gd2UncmUgaW4gYW5kIGNoYW5nZXMgdGhlDSMgc3RhdGUgb2YgdGhlIGJ1dHRvbiB0byBhY3RpdmUgdW5sZXNzIHRoZSBidXR0b24gaXMgZGlzYWJsZWQuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgbmFtZSBvZiB0aGUgd2lkZ2V0Lg0NcHJvYyB0a0J1dHRvbkVudGVyIHcgew0gICAgZ2xvYmFsIHRrUHJpdg0gICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJHcgY2dldCAtc3RhdGVdICJkaXNhYmxlZCJdIFwNCSAgICAmJiBbc3RyaW5nIGVxdWFsICR0a1ByaXYoYnV0dG9uV2luZG93KSAkd119IHsNCSR3IGNvbmZpZ3VyZSAtc3RhdGUgYWN0aXZlIC1yZWxpZWYgc3Vua2VuDSAgICB9DSAgICBzZXQgdGtQcml2KHdpbmRvdykgJHcNfQ0NIyB0a0J1dHRvbkxlYXZlIC0tDSMgVGhlIHByb2NlZHVyZSBiZWxvdyBpcyBpbnZva2VkIHdoZW4gdGhlIG1vdXNlIHBvaW50ZXIgbGVhdmVzIGENIyBidXR0b24gd2lkZ2V0LiAgSXQgY2hhbmdlcyB0aGUgc3RhdGUgb2YgdGhlIGJ1dHRvbiBiYWNrIHRvDSMgaW5hY3RpdmUuICBJZiB3ZSdyZSBsZWF2aW5nIHRoZSBidXR0b24gd2luZG93IHdpdGggYSBtb3VzZSBidXR0b24NIyBwcmVzc2VkICh0a1ByaXYoYnV0dG9uV2luZG93KSA9PSAkdyksIHJlc3RvcmUgdGhlIHJlbGllZiBvZiB0aGUNIyBidXR0b24gdG9vLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIG5hbWUgb2YgdGhlIHdpZGdldC4NDXByb2MgdGtCdXR0b25MZWF2ZSB3IHsNICAgIGdsb2JhbCB0a1ByaXYNICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgWyR3IGNnZXQgLXN0YXRlXSAiZGlzYWJsZWQiXX0gew0JJHcgY29uZmlndXJlIC1zdGF0ZSBub3JtYWwNICAgIH0NICAgIGlmIHtbc3RyaW5nIGVxdWFsICR0a1ByaXYoYnV0dG9uV2luZG93KSAkd119IHsNCSR3IGNvbmZpZ3VyZSAtcmVsaWVmICR0a1ByaXYocmVsaWVmKQ0gICAgfQ0gICAgc2V0IHRrUHJpdih3aW5kb3cpICIiDX0NDSMgdGtDaGVja1JhZGlvRW50ZXIgLS0NIyBUaGUgcHJvY2VkdXJlIGJlbG93IGlzIGludm9rZWQgd2hlbiB0aGUgbW91c2UgcG9pbnRlciBlbnRlcnMgYQ0jIGNoZWNrYnV0dG9uIG9yIHJhZGlvYnV0dG9uIHdpZGdldC4gIEl0IHJlY29yZHMgdGhlIGJ1dHRvbiB3ZSdyZSBpbg0jIGFuZCBjaGFuZ2VzIHRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9uIHRvIGFjdGl2ZSB1bmxlc3MgdGhlIGJ1dHRvbiBpcw0jIGRpc2FibGVkLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIG5hbWUgb2YgdGhlIHdpZGdldC4NDXByb2MgdGtDaGVja1JhZGlvRW50ZXIgdyB7DSAgICBnbG9iYWwgdGtQcml2DSAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskdyBjZ2V0IC1zdGF0ZV0gImRpc2FibGVkIl0gXA0JICAgICYmIFtzdHJpbmcgZXF1YWwgJHRrUHJpdihidXR0b25XaW5kb3cpICR3XX0gew0JJHcgY29uZmlndXJlIC1zdGF0ZSBhY3RpdmUNICAgIH0NICAgIHNldCB0a1ByaXYod2luZG93KSAkdw19DQ0jIHRrQnV0dG9uRG93biAtLQ0jIFRoZSBwcm9jZWR1cmUgYmVsb3cgaXMgaW52b2tlZCB3aGVuIHRoZSBtb3VzZSBidXR0b24gaXMgcHJlc3NlZCBpbg0jIGEgYnV0dG9uIHdpZGdldC4gIEl0IHJlY29yZHMgdGhlIGZhY3QgdGhhdCB0aGUgbW91c2UgaXMgaW4gdGhlIGJ1dHRvbiwNIyBzYXZlcyB0aGUgYnV0dG9uJ3MgcmVsaWVmIHNvIGl0IGNhbiBiZSByZXN0b3JlZCBsYXRlciwgYW5kIGNoYW5nZXMNIyB0aGUgcmVsaWVmIHRvIHN1bmtlbi4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSBuYW1lIG9mIHRoZSB3aWRnZXQuDQ1wcm9jIHRrQnV0dG9uRG93biB3IHsNICAgIGdsb2JhbCB0a1ByaXYNICAgIHNldCB0a1ByaXYocmVsaWVmKSBbJHcgY2dldCAtcmVsaWVmXQ0gICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJHcgY2dldCAtc3RhdGVdICJkaXNhYmxlZCJdfSB7DQlzZXQgdGtQcml2KGJ1dHRvbldpbmRvdykgJHcNCSR3IGNvbmZpZ3VyZSAtcmVsaWVmIHN1bmtlbiAtc3RhdGUgYWN0aXZlDSAgICB9DX0NDSMgdGtDaGVja1JhZGlvRG93biAtLQ0jIFRoZSBwcm9jZWR1cmUgYmVsb3cgaXMgaW52b2tlZCB3aGVuIHRoZSBtb3VzZSBidXR0b24gaXMgcHJlc3NlZCBpbg0jIGEgYnV0dG9uIHdpZGdldC4gIEl0IHJlY29yZHMgdGhlIGZhY3QgdGhhdCB0aGUgbW91c2UgaXMgaW4gdGhlIGJ1dHRvbiwNIyBzYXZlcyB0aGUgYnV0dG9uJ3MgcmVsaWVmIHNvIGl0IGNhbiBiZSByZXN0b3JlZCBsYXRlciwgYW5kIGNoYW5nZXMNIyB0aGUgcmVsaWVmIHRvIHN1bmtlbi4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSBuYW1lIG9mIHRoZSB3aWRnZXQuDQ1wcm9jIHRrQ2hlY2tSYWRpb0Rvd24gdyB7DSAgICBnbG9iYWwgdGtQcml2DSAgICBzZXQgdGtQcml2KHJlbGllZikgWyR3IGNnZXQgLXJlbGllZl0NICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgWyR3IGNnZXQgLXN0YXRlXSAiZGlzYWJsZWQiXX0gew0Jc2V0IHRrUHJpdihidXR0b25XaW5kb3cpICR3DQkkdyBjb25maWd1cmUgLXN0YXRlIGFjdGl2ZQ0gICAgfQ19DQ0jIHRrQnV0dG9uVXAgLS0NIyBUaGUgcHJvY2VkdXJlIGJlbG93IGlzIGludm9rZWQgd2hlbiB0aGUgbW91c2UgYnV0dG9uIGlzIHJlbGVhc2VkDSMgaW4gYSBidXR0b24gd2lkZ2V0LiAgSXQgcmVzdG9yZXMgdGhlIGJ1dHRvbidzIHJlbGllZiBhbmQgaW52b2tlcw0jIHRoZSBjb21tYW5kIGFzIGxvbmcgYXMgdGhlIG1vdXNlIGhhc24ndCBsZWZ0IHRoZSBidXR0b24uDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgbmFtZSBvZiB0aGUgd2lkZ2V0Lg0NcHJvYyB0a0J1dHRvblVwIHcgew0gICAgZ2xvYmFsIHRrUHJpdg0gICAgaWYge1tzdHJpbmcgZXF1YWwgJHRrUHJpdihidXR0b25XaW5kb3cpICR3XX0gew0Jc2V0IHRrUHJpdihidXR0b25XaW5kb3cpICIiDQkkdyBjb25maWd1cmUgLXJlbGllZiAkdGtQcml2KHJlbGllZikNCWlmIHtbc3RyaW5nIGVxdWFsICR0a1ByaXYod2luZG93KSAkd10NICAgICAgICAgICAgICAmJiBbc3RyaW5nIGNvbXBhcmUgWyR3IGNnZXQgLXN0YXRlXSAiZGlzYWJsZWQiXX0gew0JICAgICR3IGNvbmZpZ3VyZSAtc3RhdGUgbm9ybWFsDQkgICAgdXBsZXZlbCAjMCBbbGlzdCAkdyBpbnZva2VdDQl9DSAgICB9DX0NDX0NDWlmIHtbc3RyaW5nIG1hdGNoICJ1bml4IiAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKV19IHsNDSMjIyMjIyMjIyMjIyMjIyMjIyMjIw0jIFVuaXggaW1wbGVtZW50YXRpb24NIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQ0jIHRrQnV0dG9uRW50ZXIgLS0NIyBUaGUgcHJvY2VkdXJlIGJlbG93IGlzIGludm9rZWQgd2hlbiB0aGUgbW91c2UgcG9pbnRlciBlbnRlcnMgYQ0jIGJ1dHRvbiB3aWRnZXQuICBJdCByZWNvcmRzIHRoZSBidXR0b24gd2UncmUgaW4gYW5kIGNoYW5nZXMgdGhlDSMgc3RhdGUgb2YgdGhlIGJ1dHRvbiB0byBhY3RpdmUgdW5sZXNzIHRoZSBidXR0b24gaXMgZGlzYWJsZWQuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgbmFtZSBvZiB0aGUgd2lkZ2V0Lg0NcHJvYyB0a0J1dHRvbkVudGVyIHt3fSB7DSAgICBnbG9iYWwgdGtQcml2DSAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskdyBjZ2V0IC1zdGF0ZV0gImRpc2FibGVkIl19IHsNCSR3IGNvbmZpZ3VyZSAtc3RhdGUgYWN0aXZlDQlpZiB7W3N0cmluZyBlcXVhbCAkdGtQcml2KGJ1dHRvbldpbmRvdykgJHddfSB7DQkgICAgJHcgY29uZmlndXJlIC1zdGF0ZSBhY3RpdmUgLXJlbGllZiBzdW5rZW4NCX0NICAgIH0NICAgIHNldCB0a1ByaXYod2luZG93KSAkdw19DQ0jIHRrQnV0dG9uTGVhdmUgLS0NIyBUaGUgcHJvY2VkdXJlIGJlbG93IGlzIGludm9rZWQgd2hlbiB0aGUgbW91c2UgcG9pbnRlciBsZWF2ZXMgYQ0jIGJ1dHRvbiB3aWRnZXQuICBJdCBjaGFuZ2VzIHRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9uIGJhY2sgdG8NIyBpbmFjdGl2ZS4gIElmIHdlJ3JlIGxlYXZpbmcgdGhlIGJ1dHRvbiB3aW5kb3cgd2l0aCBhIG1vdXNlIGJ1dHRvbg0jIHByZXNzZWQgKHRrUHJpdihidXR0b25XaW5kb3cpID09ICR3KSwgcmVzdG9yZSB0aGUgcmVsaWVmIG9mIHRoZQ0jIGJ1dHRvbiB0b28uDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgbmFtZSBvZiB0aGUgd2lkZ2V0Lg0NcHJvYyB0a0J1dHRvbkxlYXZlIHcgew0gICAgZ2xvYmFsIHRrUHJpdg0gICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJHcgY2dldCAtc3RhdGVdICJkaXNhYmxlZCJdfSB7DQkkdyBjb25maWd1cmUgLXN0YXRlIG5vcm1hbA0gICAgfQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgJHRrUHJpdihidXR0b25XaW5kb3cpICR3XX0gew0JJHcgY29uZmlndXJlIC1yZWxpZWYgJHRrUHJpdihyZWxpZWYpDSAgICB9DSAgICBzZXQgdGtQcml2KHdpbmRvdykgIiINfQ0NIyB0a0J1dHRvbkRvd24gLS0NIyBUaGUgcHJvY2VkdXJlIGJlbG93IGlzIGludm9rZWQgd2hlbiB0aGUgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQgaW4NIyBhIGJ1dHRvbiB3aWRnZXQuICBJdCByZWNvcmRzIHRoZSBmYWN0IHRoYXQgdGhlIG1vdXNlIGlzIGluIHRoZSBidXR0b24sDSMgc2F2ZXMgdGhlIGJ1dHRvbidzIHJlbGllZiBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgbGF0ZXIsIGFuZCBjaGFuZ2VzDSMgdGhlIHJlbGllZiB0byBzdW5rZW4uDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgbmFtZSBvZiB0aGUgd2lkZ2V0Lg0NcHJvYyB0a0J1dHRvbkRvd24gdyB7DSAgICBnbG9iYWwgdGtQcml2DSAgICBzZXQgdGtQcml2KHJlbGllZikgWyR3IGNnZXQgLXJlbGllZl0NICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgWyR3IGNnZXQgLXN0YXRlXSAiZGlzYWJsZWQiXX0gew0Jc2V0IHRrUHJpdihidXR0b25XaW5kb3cpICR3DQkkdyBjb25maWd1cmUgLXJlbGllZiBzdW5rZW4NICAgIH0NfQ0NIyB0a0J1dHRvblVwIC0tDSMgVGhlIHByb2NlZHVyZSBiZWxvdyBpcyBpbnZva2VkIHdoZW4gdGhlIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZA0jIGluIGEgYnV0dG9uIHdpZGdldC4gIEl0IHJlc3RvcmVzIHRoZSBidXR0b24ncyByZWxpZWYgYW5kIGludm9rZXMNIyB0aGUgY29tbWFuZCBhcyBsb25nIGFzIHRoZSBtb3VzZSBoYXNuJ3QgbGVmdCB0aGUgYnV0dG9uLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIG5hbWUgb2YgdGhlIHdpZGdldC4NDXByb2MgdGtCdXR0b25VcCB3IHsNICAgIGdsb2JhbCB0a1ByaXYNICAgIGlmIHtbc3RyaW5nIGVxdWFsICR3ICR0a1ByaXYoYnV0dG9uV2luZG93KV19IHsNCXNldCB0a1ByaXYoYnV0dG9uV2luZG93KSAiIg0JJHcgY29uZmlndXJlIC1yZWxpZWYgJHRrUHJpdihyZWxpZWYpDQlpZiB7W3N0cmluZyBlcXVhbCAkdyAkdGtQcml2KHdpbmRvdyldIFwNCQkmJiBbc3RyaW5nIGNvbXBhcmUgWyR3IGNnZXQgLXN0YXRlXSAiZGlzYWJsZWQiXX0gew0JICAgIHVwbGV2ZWwgIzAgW2xpc3QgJHcgaW52b2tlXQ0JfQ0gICAgfQ19DQ19DQ1pZiB7W3N0cmluZyBtYXRjaCAibWFjaW50b3NoIiAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKV19IHsNDSMjIyMjIyMjIyMjIyMjIyMjIyMjDSMgTWFjIGltcGxlbWVudGF0aW9uDSMjIyMjIyMjIyMjIyMjIyMjIyMjDQ0jIHRrQnV0dG9uRW50ZXIgLS0NIyBUaGUgcHJvY2VkdXJlIGJlbG93IGlzIGludm9rZWQgd2hlbiB0aGUgbW91c2UgcG9pbnRlciBlbnRlcnMgYQ0jIGJ1dHRvbiB3aWRnZXQuICBJdCByZWNvcmRzIHRoZSBidXR0b24gd2UncmUgaW4gYW5kIGNoYW5nZXMgdGhlDSMgc3RhdGUgb2YgdGhlIGJ1dHRvbiB0byBhY3RpdmUgdW5sZXNzIHRoZSBidXR0b24gaXMgZGlzYWJsZWQuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgbmFtZSBvZiB0aGUgd2lkZ2V0Lg0NcHJvYyB0a0J1dHRvbkVudGVyIHt3fSB7DSAgICBnbG9iYWwgdGtQcml2DSAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskdyBjZ2V0IC1zdGF0ZV0gImRpc2FibGVkIl19IHsNICAgICAgaWYge1tzdHJpbmcgZXF1YWwgJHcgJHRrUHJpdihidXR0b25XaW5kb3cpXX0gew0JICAgICR3IGNvbmZpZ3VyZSAtc3RhdGUgYWN0aXZlDQl9DSAgICB9DSAgICBzZXQgdGtQcml2KHdpbmRvdykgJHcNfQ0NIyB0a0J1dHRvbkxlYXZlIC0tDSMgVGhlIHByb2NlZHVyZSBiZWxvdyBpcyBpbnZva2VkIHdoZW4gdGhlIG1vdXNlIHBvaW50ZXIgbGVhdmVzIGENIyBidXR0b24gd2lkZ2V0LiAgSXQgY2hhbmdlcyB0aGUgc3RhdGUgb2YgdGhlIGJ1dHRvbiBiYWNrIHRvDSMgaW5hY3RpdmUuICBJZiB3ZSdyZSBsZWF2aW5nIHRoZSBidXR0b24gd2luZG93IHdpdGggYSBtb3VzZSBidXR0b24NIyBwcmVzc2VkICh0a1ByaXYoYnV0dG9uV2luZG93KSA9PSAkdyksIHJlc3RvcmUgdGhlIHJlbGllZiBvZiB0aGUNIyBidXR0b24gdG9vLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIG5hbWUgb2YgdGhlIHdpZGdldC4NDXByb2MgdGtCdXR0b25MZWF2ZSB3IHsNICAgIGdsb2JhbCB0a1ByaXYNICAgIGlmIHtbc3RyaW5nIGVxdWFsICR3ICR0a1ByaXYoYnV0dG9uV2luZG93KV19IHsNCSR3IGNvbmZpZ3VyZSAtc3RhdGUgbm9ybWFsDSAgICB9DSAgICBzZXQgdGtQcml2KHdpbmRvdykgIiINfQ0NIyB0a0J1dHRvbkRvd24gLS0NIyBUaGUgcHJvY2VkdXJlIGJlbG93IGlzIGludm9rZWQgd2hlbiB0aGUgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQgaW4NIyBhIGJ1dHRvbiB3aWRnZXQuICBJdCByZWNvcmRzIHRoZSBmYWN0IHRoYXQgdGhlIG1vdXNlIGlzIGluIHRoZSBidXR0b24sDSMgc2F2ZXMgdGhlIGJ1dHRvbidzIHJlbGllZiBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgbGF0ZXIsIGFuZCBjaGFuZ2VzDSMgdGhlIHJlbGllZiB0byBzdW5rZW4uDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgbmFtZSBvZiB0aGUgd2lkZ2V0Lg0NcHJvYyB0a0J1dHRvbkRvd24gdyB7DSAgICBnbG9iYWwgdGtQcml2DSAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskdyBjZ2V0IC1zdGF0ZV0gImRpc2FibGVkIl19IHsNCXNldCB0a1ByaXYoYnV0dG9uV2luZG93KSAkdw0JJHcgY29uZmlndXJlIC1zdGF0ZSBhY3RpdmUNICAgIH0NfQ0NIyB0a0J1dHRvblVwIC0tDSMgVGhlIHByb2NlZHVyZSBiZWxvdyBpcyBpbnZva2VkIHdoZW4gdGhlIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZA0jIGluIGEgYnV0dG9uIHdpZGdldC4gIEl0IHJlc3RvcmVzIHRoZSBidXR0b24ncyByZWxpZWYgYW5kIGludm9rZXMNIyB0aGUgY29tbWFuZCBhcyBsb25nIGFzIHRoZSBtb3VzZSBoYXNuJ3QgbGVmdCB0aGUgYnV0dG9uLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIG5hbWUgb2YgdGhlIHdpZGdldC4NDXByb2MgdGtCdXR0b25VcCB3IHsNICAgIGdsb2JhbCB0a1ByaXYNICAgIGlmIHtbc3RyaW5nIGVxdWFsICR3ICR0a1ByaXYoYnV0dG9uV2luZG93KV19IHsNCSR3IGNvbmZpZ3VyZSAtc3RhdGUgbm9ybWFsDQlzZXQgdGtQcml2KGJ1dHRvbldpbmRvdykgIiINCWlmIHtbc3RyaW5nIGVxdWFsICR3ICR0a1ByaXYod2luZG93KV0NICAgICAgICAgICAgICAmJiBbc3RyaW5nIGNvbXBhcmUgWyR3IGNnZXQgLXN0YXRlXSAiZGlzYWJsZWQiXX0gew0JICAgIHVwbGV2ZWwgIzAgW2xpc3QgJHcgaW52b2tlXQ0JfQ0gICAgfQ19DQ19DQ0jIyMjIyMjIyMjIyMjIyMjIyMNIyBTaGFyZWQgcm91dGluZXMNIyMjIyMjIyMjIyMjIyMjIyMjDQ0jIHRrQnV0dG9uSW52b2tlIC0tDSMgVGhlIHByb2NlZHVyZSBiZWxvdyBpcyBjYWxsZWQgd2hlbiBhIGJ1dHRvbiBpcyBpbnZva2VkIHRocm91Z2gNIyB0aGUga2V5Ym9hcmQuICBJdCBzaW11bGF0ZSBhIHByZXNzIG9mIHRoZSBidXR0b24gdmlhIHRoZSBtb3VzZS4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSBuYW1lIG9mIHRoZSB3aWRnZXQuDQ1wcm9jIHRrQnV0dG9uSW52b2tlIHcgew0gICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJHcgY2dldCAtc3RhdGVdICJkaXNhYmxlZCJdfSB7DQlzZXQgb2xkUmVsaWVmIFskdyBjZ2V0IC1yZWxpZWZdDQlzZXQgb2xkU3RhdGUgWyR3IGNnZXQgLXN0YXRlXQ0JJHcgY29uZmlndXJlIC1zdGF0ZSBhY3RpdmUgLXJlbGllZiBzdW5rZW4NCXVwZGF0ZSBpZGxldGFza3MNCWFmdGVyIDEwMA0JJHcgY29uZmlndXJlIC1zdGF0ZSAkb2xkU3RhdGUgLXJlbGllZiAkb2xkUmVsaWVmDQl1cGxldmVsICMwIFtsaXN0ICR3IGludm9rZV0NICAgIH0NfQ0NIyB0a0NoZWNrUmFkaW9JbnZva2UgLS0NIyBUaGUgcHJvY2VkdXJlIGJlbG93IGlzIGludm9rZWQgd2hlbiB0aGUgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQgaW4NIyBhIGNoZWNrYnV0dG9uIG9yIHJhZGlvYnV0dG9uIHdpZGdldCwgb3Igd2hlbiB0aGUgd2lkZ2V0IGlzIGludm9rZWQNIyB0aHJvdWdoIHRoZSBrZXlib2FyZC4gIEl0IGludm9rZXMgdGhlIHdpZGdldCBpZiBpdA0jIGlzbid0IGRpc2FibGVkLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIG5hbWUgb2YgdGhlIHdpZGdldC4NIyBjbWQgLQkJVGhlIHN1YmNvbW1hbmQgdG8gaW52b2tlIChvbmUgb2YgaW52b2tlLCBzZWxlY3QsIG9yIGRlc2VsZWN0KS4NDXByb2MgdGtDaGVja1JhZGlvSW52b2tlIHt3IHtjbWQgaW52b2tlfX0gew0gICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJHcgY2dldCAtc3RhdGVdICJkaXNhYmxlZCJdfSB7DQl1cGxldmVsICMwIFtsaXN0ICR3ICRjbWRdDSAgICB9DX0NDQAAGEojIGRpYWxvZy50Y2wgLS0NIw0jIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwcm9jZWR1cmUgdGtfZGlhbG9nLCB3aGljaCBjcmVhdGVzIGEgZGlhbG9nDSMgYm94IGNvbnRhaW5pbmcgYSBiaXRtYXAsIGEgbWVzc2FnZSwgYW5kIG9uZSBvciBtb3JlIGJ1dHRvbnMuDSMNIyBSQ1M6IEAoIykgJElkOiBkaWFsb2cudGNsLHYgMS44IDIwMDAvMDQvMTggMDI6MTg6MzMgZXJpY20gRXhwICQNIw0jIENvcHlyaWdodCAoYykgMTk5Mi0xOTkzIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuDSMgQ29weXJpZ2h0IChjKSAxOTk0LTE5OTcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLg0jDSMgU2VlIHRoZSBmaWxlICJsaWNlbnNlLnRlcm1zIiBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIHJlZGlzdHJpYnV0aW9uDSMgb2YgdGhpcyBmaWxlLCBhbmQgZm9yIGEgRElTQ0xBSU1FUiBPRiBBTEwgV0FSUkFOVElFUy4NIw0NIw0jIHRrX2RpYWxvZzoNIw0jIFRoaXMgcHJvY2VkdXJlIGRpc3BsYXlzIGEgZGlhbG9nIGJveCwgd2FpdHMgZm9yIGEgYnV0dG9uIGluIHRoZSBkaWFsb2cNIyB0byBiZSBpbnZva2VkLCB0aGVuIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBidXR0b24uICBJZiB0aGUNIyBkaWFsb2cgc29tZWhvdyBnZXRzIGRlc3Ryb3llZCwgLTEgaXMgcmV0dXJuZWQuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlXaW5kb3cgdG8gdXNlIGZvciBkaWFsb2cgdG9wLWxldmVsLg0jIHRpdGxlIC0JVGl0bGUgdG8gZGlzcGxheSBpbiBkaWFsb2cncyBkZWNvcmF0aXZlIGZyYW1lLg0jIHRleHQgLQlNZXNzYWdlIHRvIGRpc3BsYXkgaW4gZGlhbG9nLg0jIGJpdG1hcCAtCUJpdG1hcCB0byBkaXNwbGF5IGluIGRpYWxvZyAoZW1wdHkgc3RyaW5nIG1lYW5zIG5vbmUpLg0jIGRlZmF1bHQgLQlJbmRleCBvZiBidXR0b24gdGhhdCBpcyB0byBkaXNwbGF5IHRoZSBkZWZhdWx0IHJpbmcNIwkJKC0xIG1lYW5zIG5vbmUpLg0jIGFyZ3MgLQlPbmUgb3IgbW9yZSBzdHJpbmdzIHRvIGRpc3BsYXkgaW4gYnV0dG9ucyBhY3Jvc3MgdGhlDSMJCWJvdHRvbSBvZiB0aGUgZGlhbG9nIGJveC4NDXByb2MgdGtfZGlhbG9nIHt3IHRpdGxlIHRleHQgYml0bWFwIGRlZmF1bHQgYXJnc30gew0gICAgZ2xvYmFsIHRrUHJpdiB0Y2xfcGxhdGZvcm0NDSAgICAjIENoZWNrIHRoYXQgJGRlZmF1bHQgd2FzIHByb3Blcmx5IGdpdmVuDSAgICBpZiB7W3N0cmluZyBpcyBpbnQgJGRlZmF1bHRdfSB7DQlpZiB7JGRlZmF1bHQgPj0gW2xsZW5ndGggJGFyZ3NdfSB7DQkgICAgcmV0dXJuIC1jb2RlIGVycm9yICJkZWZhdWx0IGJ1dHRvbiBpbmRleCBncmVhdGVyIHRoYW4gbnVtYmVyIG9mXA0JCSAgICBidXR0b25zIHNwZWNpZmllZCBmb3IgdGtfZGlhbG9nIg0JfQ0gICAgfSBlbHNlaWYge1tzdHJpbmcgZXF1YWwge30gJGRlZmF1bHRdfSB7DQlzZXQgZGVmYXVsdCAtMQ0gICAgfSBlbHNlIHsNCXNldCBkZWZhdWx0IFtsc2VhcmNoIC1leGFjdCAkYXJncyAkZGVmYXVsdF0NICAgIH0NDSAgICAjIDEuIENyZWF0ZSB0aGUgdG9wLWxldmVsIHdpbmRvdyBhbmQgZGl2aWRlIGl0IGludG8gdG9wDSAgICAjIGFuZCBib3R0b20gcGFydHMuDQ0gICAgY2F0Y2gge2Rlc3Ryb3kgJHd9DSAgICB0b3BsZXZlbCAkdyAtY2xhc3MgRGlhbG9nDSAgICB3bSB0aXRsZSAkdyAkdGl0bGUNICAgIHdtIGljb25uYW1lICR3IERpYWxvZw0gICAgd20gcHJvdG9jb2wgJHcgV01fREVMRVRFX1dJTkRPVyB7IH0NDSAgICAjIERpYWxvZyBib3hlcyBzaG91bGQgYmUgdHJhbnNpZW50IHdpdGggcmVzcGVjdCB0byB0aGVpciBwYXJlbnQsDSAgICAjIHNvIHRoYXQgdGhleSB3aWxsIGFsd2F5cyBzdGF5IG9uIHRvcCBvZiB0aGVpciBwYXJlbnQgd2luZG93LiAgSG93ZXZlciwNICAgICMgc29tZSB3aW5kb3cgbWFuYWdlcnMgd2lsbCBjcmVhdGUgdGhlIHdpbmRvdyBhcyB3aXRoZHJhd24gaWYgdGhlIHBhcmVudA0gICAgIyB3aW5kb3cgaXMgd2l0aGRyYXduIG9yIGljb25pZmllZC4gIENvbWJpbmVkIHdpdGggdGhlIGdyYWIgd2UgcHV0IG9uIHRoZQ0gICAgIyB3aW5kb3csIHRoaXMgY2FuIGhhbmcgdGhlIGVudGlyZSBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSB3ZSBvbmx5IG1ha2UNICAgICMgdGhlIGRpYWxvZyB0cmFuc2llbnQgaWYgdGhlIHBhcmVudCBpcyB2aWV3YWJsZS4NICAgICMNICAgIGlmIHsgW3dpbmZvIHZpZXdhYmxlIFt3aW5mbyB0b3BsZXZlbCBbd2luZm8gcGFyZW50ICR3XV1dIH0gew0Jd20gdHJhbnNpZW50ICR3IFt3aW5mbyB0b3BsZXZlbCBbd2luZm8gcGFyZW50ICR3XV0NICAgIH0gICAgDQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIm1hY2ludG9zaCJdfSB7DQl1bnN1cHBvcnRlZDEgc3R5bGUgJHcgZEJveFByb2MNICAgIH0NDSAgICBmcmFtZSAkdy5ib3QNICAgIGZyYW1lICR3LnRvcA0gICAgaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgInVuaXgiXX0gew0JJHcuYm90IGNvbmZpZ3VyZSAtcmVsaWVmIHJhaXNlZCAtYmQgMQ0JJHcudG9wIGNvbmZpZ3VyZSAtcmVsaWVmIHJhaXNlZCAtYmQgMQ0gICAgfQ0gICAgcGFjayAkdy5ib3QgLXNpZGUgYm90dG9tIC1maWxsIGJvdGgNICAgIHBhY2sgJHcudG9wIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQ0NICAgICMgMi4gRmlsbCB0aGUgdG9wIHBhcnQgd2l0aCBiaXRtYXAgYW5kIG1lc3NhZ2UgKHVzZSB0aGUgb3B0aW9uDSAgICAjIGRhdGFiYXNlIGZvciAtd3JhcGxlbmd0aCBhbmQgLWZvbnQgc28gdGhhdCB0aGV5IGNhbiBiZQ0gICAgIyBvdmVycmlkZGVuIGJ5IHRoZSBjYWxsZXIpLg0NICAgIG9wdGlvbiBhZGQgKkRpYWxvZy5tc2cud3JhcExlbmd0aCAzaSB3aWRnZXREZWZhdWx0DSAgICBpZiB7W3N0cmluZyBlcXVhbCAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAibWFjaW50b3NoIl19IHsNCW9wdGlvbiBhZGQgKkRpYWxvZy5tc2cuZm9udCBzeXN0ZW0gd2lkZ2V0RGVmYXVsdA0gICAgfSBlbHNlIHsNCW9wdGlvbiBhZGQgKkRpYWxvZy5tc2cuZm9udCB7VGltZXMgMTJ9IHdpZGdldERlZmF1bHQNICAgIH0NDSAgICBsYWJlbCAkdy5tc2cgLWp1c3RpZnkgbGVmdCAtdGV4dCAkdGV4dA0gICAgcGFjayAkdy5tc2cgLWluICR3LnRvcCAtc2lkZSByaWdodCAtZXhwYW5kIDEgLWZpbGwgYm90aCAtcGFkeCAzbSAtcGFkeSAzbQ0gICAgaWYge1tzdHJpbmcgY29tcGFyZSAkYml0bWFwICIiXX0gew0JaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIm1hY2ludG9zaCJdICYmIFwNCQlbc3RyaW5nIGVxdWFsICRiaXRtYXAgImVycm9yIl19IHsNCSAgICBzZXQgYml0bWFwICJzdG9wIg0JfQ0JbGFiZWwgJHcuYml0bWFwIC1iaXRtYXAgJGJpdG1hcA0JcGFjayAkdy5iaXRtYXAgLWluICR3LnRvcCAtc2lkZSBsZWZ0IC1wYWR4IDNtIC1wYWR5IDNtDSAgICB9DQ0gICAgIyAzLiBDcmVhdGUgYSByb3cgb2YgYnV0dG9ucyBhdCB0aGUgYm90dG9tIG9mIHRoZSBkaWFsb2cuDQ0gICAgc2V0IGkgMA0gICAgZm9yZWFjaCBidXQgJGFyZ3Mgew0JYnV0dG9uICR3LmJ1dHRvbiRpIC10ZXh0ICRidXQgLWNvbW1hbmQgW2xpc3Qgc2V0IHRrUHJpdihidXR0b24pICRpXQ0JaWYgeyRpID09ICRkZWZhdWx0fSB7DQkgICAgJHcuYnV0dG9uJGkgY29uZmlndXJlIC1kZWZhdWx0IGFjdGl2ZQ0JfSBlbHNlIHsNCSAgICAkdy5idXR0b24kaSBjb25maWd1cmUgLWRlZmF1bHQgbm9ybWFsDQl9DQlncmlkICR3LmJ1dHRvbiRpIC1pbiAkdy5ib3QgLWNvbHVtbiAkaSAtcm93IDAgLXN0aWNreSBldyAtcGFkeCAxMA0JZ3JpZCBjb2x1bW5jb25maWd1cmUgJHcuYm90ICRpDQkjIFdlIGJvb3N0IHRoZSBzaXplIG9mIHNvbWUgTWFjIGJ1dHRvbnMgZm9yIGwmZg0JaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIm1hY2ludG9zaCJdfSB7DQkgICAgc2V0IHRtcCBbc3RyaW5nIHRvbG93ZXIgJGJ1dF0NCSAgICBpZiB7W3N0cmluZyBlcXVhbCAkdG1wICJvayJdIHx8IFtzdHJpbmcgZXF1YWwgJHRtcCAiY2FuY2VsIl19IHsNCQlncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdy5ib3QgJGkgLW1pbnNpemUgW2V4cHIgezU5ICsgMjB9XQ0JICAgIH0NCX0NCWluY3IgaQ0gICAgfQ0NICAgICMgNC4gQ3JlYXRlIGEgYmluZGluZyBmb3IgPFJldHVybj4gb24gdGhlIGRpYWxvZyBpZiB0aGVyZSBpcyBhDSAgICAjIGRlZmF1bHQgYnV0dG9uLg0NICAgIGlmIHskZGVmYXVsdCA+PSAwfSB7DQliaW5kICR3IDxSZXR1cm4+ICINCVtsaXN0ICR3LmJ1dHRvbiRkZWZhdWx0XSBjb25maWd1cmUgLXN0YXRlIGFjdGl2ZSAtcmVsaWVmIHN1bmtlbg0JdXBkYXRlIGlkbGV0YXNrcw0JYWZ0ZXIgMTAwDQlzZXQgdGtQcml2KGJ1dHRvbikgJGRlZmF1bHQNCSINICAgIH0NDSAgICAjIDUuIENyZWF0ZSBhIDxEZXN0cm95PiBiaW5kaW5nIGZvciB0aGUgd2luZG93IHRoYXQgc2V0cyB0aGUNICAgICMgYnV0dG9uIHZhcmlhYmxlIHRvIC0xOyAgdGhpcyBpcyBuZWVkZWQgaW4gY2FzZSBzb21ldGhpbmcgaGFwcGVucw0gICAgIyB0aGF0IGRlc3Ryb3lzIHRoZSB3aW5kb3csIHN1Y2ggYXMgaXRzIHBhcmVudCB3aW5kb3cgYmVpbmcgZGVzdHJveWVkLg0NICAgIGJpbmQgJHcgPERlc3Ryb3k+IHtzZXQgdGtQcml2KGJ1dHRvbikgLTF9DQ0gICAgIyA2LiBXaXRoZHJhdyB0aGUgd2luZG93LCB0aGVuIHVwZGF0ZSBhbGwgdGhlIGdlb21ldHJ5IGluZm9ybWF0aW9uDSAgICAjIHNvIHdlIGtub3cgaG93IGJpZyBpdCB3YW50cyB0byBiZSwgdGhlbiBjZW50ZXIgdGhlIHdpbmRvdyBpbiB0aGUNICAgICMgZGlzcGxheSBhbmQgZGUtaWNvbmlmeSBpdC4NDSAgICB3bSB3aXRoZHJhdyAkdw0gICAgdXBkYXRlIGlkbGV0YXNrcw0gICAgc2V0IHggW2V4cHIge1t3aW5mbyBzY3JlZW53aWR0aCAkd10vMiAtIFt3aW5mbyByZXF3aWR0aCAkd10vMiBcDQkgICAgLSBbd2luZm8gdnJvb3R4IFt3aW5mbyBwYXJlbnQgJHddXX1dDSAgICBzZXQgeSBbZXhwciB7W3dpbmZvIHNjcmVlbmhlaWdodCAkd10vMiAtIFt3aW5mbyByZXFoZWlnaHQgJHddLzIgXA0JICAgIC0gW3dpbmZvIHZyb290eSBbd2luZm8gcGFyZW50ICR3XV19XQ0gICAgd20gZ2VvbSAkdyArJHgrJHkNICAgIHdtIGRlaWNvbmlmeSAkdw0NICAgICMgNy4gU2V0IGEgZ3JhYiBhbmQgY2xhaW0gdGhlIGZvY3VzIHRvby4NDSAgICBzZXQgb2xkRm9jdXMgW2ZvY3VzXQ0gICAgc2V0IG9sZEdyYWIgW2dyYWIgY3VycmVudCAkd10NICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJG9sZEdyYWIgIiJdfSB7DQlzZXQgZ3JhYlN0YXR1cyBbZ3JhYiBzdGF0dXMgJG9sZEdyYWJdDSAgICB9DSAgICBncmFiICR3DSAgICBpZiB7JGRlZmF1bHQgPj0gMH0gew0JZm9jdXMgJHcuYnV0dG9uJGRlZmF1bHQNICAgIH0gZWxzZSB7DQlmb2N1cyAkdw0gICAgfQ0NICAgICMgOC4gV2FpdCBmb3IgdGhlIHVzZXIgdG8gcmVzcG9uZCwgdGhlbiByZXN0b3JlIHRoZSBmb2N1cyBhbmQNICAgICMgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgYnV0dG9uLiAgUmVzdG9yZSB0aGUgZm9jdXMNICAgICMgYmVmb3JlIGRlbGV0aW5nIHRoZSB3aW5kb3csIHNpbmNlIG90aGVyd2lzZSB0aGUgd2luZG93IG1hbmFnZXINICAgICMgbWF5IHRha2UgdGhlIGZvY3VzIGF3YXkgc28gd2UgY2FuJ3QgcmVkaXJlY3QgaXQuICBGaW5hbGx5LA0gICAgIyByZXN0b3JlIGFueSBncmFiIHRoYXQgd2FzIGluIGVmZmVjdC4NDSAgICB0a3dhaXQgdmFyaWFibGUgdGtQcml2KGJ1dHRvbikNICAgIGNhdGNoIHtmb2N1cyAkb2xkRm9jdXN9DSAgICBjYXRjaCB7DQkjIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgd2luZG93IGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkLA0JIyBoZW5jZSB0aGlzICJjYXRjaCIuICBEZWxldGUgdGhlIERlc3Ryb3kgaGFuZGxlciBzbyB0aGF0DQkjIHRrUHJpdihidXR0b24pIGRvZXNuJ3QgZ2V0IHJlc2V0IGJ5IGl0Lg0NCWJpbmQgJHcgPERlc3Ryb3k+IHt9DQlkZXN0cm95ICR3DSAgICB9DSAgICBpZiB7W3N0cmluZyBjb21wYXJlICRvbGRHcmFiICIiXX0gew0gICAgICBpZiB7W3N0cmluZyBjb21wYXJlICRncmFiU3RhdHVzICJnbG9iYWwiXX0gew0JICAgIGdyYWIgJG9sZEdyYWINICAgICAgfSBlbHNlIHsNICAgICAgICAgIGdyYWIgLWdsb2JhbCAkb2xkR3JhYg0JfQ0gICAgfQ0gICAgcmV0dXJuICR0a1ByaXYoYnV0dG9uKQ19DQAAPkMjIGVudHJ5LnRjbCAtLQ0jDSMgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGRlZmF1bHQgYmluZGluZ3MgZm9yIFRrIGVudHJ5IHdpZGdldHMgYW5kIHByb3ZpZGVzDSMgcHJvY2VkdXJlcyB0aGF0IGhlbHAgaW4gaW1wbGVtZW50aW5nIHRob3NlIGJpbmRpbmdzLg0jDSMgUkNTOiBAKCMpICRJZDogZW50cnkudGNsLHYgMS4xMS4yLjEgMjAwMS8wNC8wNCAwNzo1NzoxNyBob2JicyBFeHAgJA0jDSMgQ29weXJpZ2h0IChjKSAxOTkyLTE5OTQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4NIyBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5NyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuDSMNIyBTZWUgdGhlIGZpbGUgImxpY2Vuc2UudGVybXMiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24NIyBvZiB0aGlzIGZpbGUsIGFuZCBmb3IgYSBESVNDTEFJTUVSIE9GIEFMTCBXQVJSQU5USUVTLg0jDQ0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0jIEVsZW1lbnRzIG9mIHRrUHJpdiB0aGF0IGFyZSB1c2VkIGluIHRoaXMgZmlsZToNIw0jIGFmdGVySWQgLQkJSWYgbm9uLW51bGwsIGl0IG1lYW5zIHRoYXQgYXV0by1zY2FubmluZyBpcyB1bmRlcndheQ0jCQkJYW5kIGl0IGdpdmVzIHRoZSAiYWZ0ZXIiIGlkIGZvciB0aGUgbmV4dCBhdXRvLXNjYW4NIwkJCWNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQuDSMgbW91c2VNb3ZlZCAtCQlOb24temVybyBtZWFucyB0aGUgbW91c2UgaGFzIG1vdmVkIGEgc2lnbmlmaWNhbnQNIwkJCWFtb3VudCBzaW5jZSB0aGUgYnV0dG9uIHdlbnQgZG93biAoc28sIGZvciBleGFtcGxlLA0jCQkJc3RhcnQgZHJhZ2dpbmcgb3V0IGEgc2VsZWN0aW9uKS4NIyBwcmVzc1ggLQkJWC1jb29yZGluYXRlIGF0IHdoaWNoIHRoZSBtb3VzZSBidXR0b24gd2FzIHByZXNzZWQuDSMgc2VsZWN0TW9kZSAtCQlUaGUgc3R5bGUgb2Ygc2VsZWN0aW9uIGN1cnJlbnRseSB1bmRlcndheToNIwkJCWNoYXIsIHdvcmQsIG9yIGxpbmUuDSMgeCwgeSAtCQlMYXN0IGtub3duIG1vdXNlIGNvb3JkaW5hdGVzIGZvciBzY2FubmluZw0jCQkJYW5kIGF1dG8tc2Nhbm5pbmcuDSMgZGF0YSAtCQlVc2VkIGZvciBDdXQgYW5kIENvcHkNIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NDSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDSMgVGhlIGNvZGUgYmVsb3cgY3JlYXRlcyB0aGUgZGVmYXVsdCBjbGFzcyBiaW5kaW5ncyBmb3IgZW50cmllcy4NIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NYmluZCBFbnRyeSA8PEN1dD4+IHsNICAgIGlmIHshW2NhdGNoIHt0a0VudHJ5R2V0U2VsZWN0aW9uICVXfSB0a1ByaXYoZGF0YSldfSB7DQljbGlwYm9hcmQgY2xlYXIgLWRpc3BsYXlvZiAlVw0JY2xpcGJvYXJkIGFwcGVuZCAtZGlzcGxheW9mICVXICR0a1ByaXYoZGF0YSkNCSVXIGRlbGV0ZSBzZWwuZmlyc3Qgc2VsLmxhc3QNCXVuc2V0IHRrUHJpdihkYXRhKQ0gICAgfQ19DWJpbmQgRW50cnkgPDxDb3B5Pj4gew0gICAgaWYgeyFbY2F0Y2gge3RrRW50cnlHZXRTZWxlY3Rpb24gJVd9IHRrUHJpdihkYXRhKV19IHsNCWNsaXBib2FyZCBjbGVhciAtZGlzcGxheW9mICVXDQljbGlwYm9hcmQgYXBwZW5kIC1kaXNwbGF5b2YgJVcgJHRrUHJpdihkYXRhKQ0JdW5zZXQgdGtQcml2KGRhdGEpDSAgICB9DX0NYmluZCBFbnRyeSA8PFBhc3RlPj4gew0gICAgZ2xvYmFsIHRjbF9wbGF0Zm9ybQ0gICAgY2F0Y2ggew0JaWYge1tzdHJpbmcgY29tcGFyZSAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAidW5peCJdfSB7DQkgICAgY2F0Y2ggew0JCSVXIGRlbGV0ZSBzZWwuZmlyc3Qgc2VsLmxhc3QNCSAgICB9DQl9DQklVyBpbnNlcnQgaW5zZXJ0IFtzZWxlY3Rpb24gZ2V0IC1kaXNwbGF5b2YgJVcgLXNlbGVjdGlvbiBDTElQQk9BUkRdDQl0a0VudHJ5U2VlSW5zZXJ0ICVXDSAgICB9DX0NYmluZCBFbnRyeSA8PENsZWFyPj4gew0gICAgJVcgZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdA19DWJpbmQgRW50cnkgPDxQYXN0ZVNlbGVjdGlvbj4+IHsNICAgIGlmIHshJHRrUHJpdihtb3VzZU1vdmVkKSB8fCAkdGtfc3RyaWN0TW90aWZ9IHsNCXRrRW50cnlQYXN0ZSAlVyAleA0gICAgfQ19DQ0jIFN0YW5kYXJkIE1vdGlmIGJpbmRpbmdzOg0NYmluZCBFbnRyeSA8MT4gew0gICAgdGtFbnRyeUJ1dHRvbjEgJVcgJXgNICAgICVXIHNlbGVjdGlvbiBjbGVhcg19DWJpbmQgRW50cnkgPEIxLU1vdGlvbj4gew0gICAgc2V0IHRrUHJpdih4KSAleA0gICAgdGtFbnRyeU1vdXNlU2VsZWN0ICVXICV4DX0NYmluZCBFbnRyeSA8RG91YmxlLTE+IHsNICAgIHNldCB0a1ByaXYoc2VsZWN0TW9kZSkgd29yZA0gICAgdGtFbnRyeU1vdXNlU2VsZWN0ICVXICV4DSAgICBjYXRjaCB7JVcgaWN1cnNvciBzZWwuZmlyc3R9DX0NYmluZCBFbnRyeSA8VHJpcGxlLTE+IHsNICAgIHNldCB0a1ByaXYoc2VsZWN0TW9kZSkgbGluZQ0gICAgdGtFbnRyeU1vdXNlU2VsZWN0ICVXICV4DSAgICAlVyBpY3Vyc29yIDANfQ1iaW5kIEVudHJ5IDxTaGlmdC0xPiB7DSAgICBzZXQgdGtQcml2KHNlbGVjdE1vZGUpIGNoYXINICAgICVXIHNlbGVjdGlvbiBhZGp1c3QgQCV4DX0NYmluZCBFbnRyeSA8RG91YmxlLVNoaWZ0LTE+CXsNICAgIHNldCB0a1ByaXYoc2VsZWN0TW9kZSkgd29yZA0gICAgdGtFbnRyeU1vdXNlU2VsZWN0ICVXICV4DX0NYmluZCBFbnRyeSA8VHJpcGxlLVNoaWZ0LTE+CXsNICAgIHNldCB0a1ByaXYoc2VsZWN0TW9kZSkgbGluZQ0gICAgdGtFbnRyeU1vdXNlU2VsZWN0ICVXICV4DX0NYmluZCBFbnRyeSA8QjEtTGVhdmU+IHsNICAgIHNldCB0a1ByaXYoeCkgJXgNICAgIHRrRW50cnlBdXRvU2NhbiAlVw19DWJpbmQgRW50cnkgPEIxLUVudGVyPiB7DSAgICB0a0NhbmNlbFJlcGVhdA19DWJpbmQgRW50cnkgPEJ1dHRvblJlbGVhc2UtMT4gew0gICAgdGtDYW5jZWxSZXBlYXQNfQ1iaW5kIEVudHJ5IDxDb250cm9sLTE+IHsNICAgICVXIGljdXJzb3IgQCV4DX0NDWJpbmQgRW50cnkgPExlZnQ+IHsNICAgIHRrRW50cnlTZXRDdXJzb3IgJVcgW2V4cHIge1slVyBpbmRleCBpbnNlcnRdIC0gMX1dDX0NYmluZCBFbnRyeSA8UmlnaHQ+IHsNICAgIHRrRW50cnlTZXRDdXJzb3IgJVcgW2V4cHIge1slVyBpbmRleCBpbnNlcnRdICsgMX1dDX0NYmluZCBFbnRyeSA8U2hpZnQtTGVmdD4gew0gICAgdGtFbnRyeUtleVNlbGVjdCAlVyBbZXhwciB7WyVXIGluZGV4IGluc2VydF0gLSAxfV0NICAgIHRrRW50cnlTZWVJbnNlcnQgJVcNfQ1iaW5kIEVudHJ5IDxTaGlmdC1SaWdodD4gew0gICAgdGtFbnRyeUtleVNlbGVjdCAlVyBbZXhwciB7WyVXIGluZGV4IGluc2VydF0gKyAxfV0NICAgIHRrRW50cnlTZWVJbnNlcnQgJVcNfQ1iaW5kIEVudHJ5IDxDb250cm9sLUxlZnQ+IHsNICAgIHRrRW50cnlTZXRDdXJzb3IgJVcgW3RrRW50cnlQcmV2aW91c1dvcmQgJVcgaW5zZXJ0XQ19DWJpbmQgRW50cnkgPENvbnRyb2wtUmlnaHQ+IHsNICAgIHRrRW50cnlTZXRDdXJzb3IgJVcgW3RrRW50cnlOZXh0V29yZCAlVyBpbnNlcnRdDX0NYmluZCBFbnRyeSA8U2hpZnQtQ29udHJvbC1MZWZ0PiB7DSAgICB0a0VudHJ5S2V5U2VsZWN0ICVXIFt0a0VudHJ5UHJldmlvdXNXb3JkICVXIGluc2VydF0NICAgIHRrRW50cnlTZWVJbnNlcnQgJVcNfQ1iaW5kIEVudHJ5IDxTaGlmdC1Db250cm9sLVJpZ2h0PiB7DSAgICB0a0VudHJ5S2V5U2VsZWN0ICVXIFt0a0VudHJ5TmV4dFdvcmQgJVcgaW5zZXJ0XQ0gICAgdGtFbnRyeVNlZUluc2VydCAlVw19DWJpbmQgRW50cnkgPEhvbWU+IHsNICAgIHRrRW50cnlTZXRDdXJzb3IgJVcgMA19DWJpbmQgRW50cnkgPFNoaWZ0LUhvbWU+IHsNICAgIHRrRW50cnlLZXlTZWxlY3QgJVcgMA0gICAgdGtFbnRyeVNlZUluc2VydCAlVw19DWJpbmQgRW50cnkgPEVuZD4gew0gICAgdGtFbnRyeVNldEN1cnNvciAlVyBlbmQNfQ1iaW5kIEVudHJ5IDxTaGlmdC1FbmQ+IHsNICAgIHRrRW50cnlLZXlTZWxlY3QgJVcgZW5kDSAgICB0a0VudHJ5U2VlSW5zZXJ0ICVXDX0NDWJpbmQgRW50cnkgPERlbGV0ZT4gew0gICAgaWYge1slVyBzZWxlY3Rpb24gcHJlc2VudF19IHsNCSVXIGRlbGV0ZSBzZWwuZmlyc3Qgc2VsLmxhc3QNICAgIH0gZWxzZSB7DQklVyBkZWxldGUgaW5zZXJ0DSAgICB9DX0NYmluZCBFbnRyeSA8QmFja1NwYWNlPiB7DSAgICB0a0VudHJ5QmFja3NwYWNlICVXDX0NDWJpbmQgRW50cnkgPENvbnRyb2wtc3BhY2U+IHsNICAgICVXIHNlbGVjdGlvbiBmcm9tIGluc2VydA19DWJpbmQgRW50cnkgPFNlbGVjdD4gew0gICAgJVcgc2VsZWN0aW9uIGZyb20gaW5zZXJ0DX0NYmluZCBFbnRyeSA8Q29udHJvbC1TaGlmdC1zcGFjZT4gew0gICAgJVcgc2VsZWN0aW9uIGFkanVzdCBpbnNlcnQNfQ1iaW5kIEVudHJ5IDxTaGlmdC1TZWxlY3Q+IHsNICAgICVXIHNlbGVjdGlvbiBhZGp1c3QgaW5zZXJ0DX0NYmluZCBFbnRyeSA8Q29udHJvbC1zbGFzaD4gew0gICAgJVcgc2VsZWN0aW9uIHJhbmdlIDAgZW5kDX0NYmluZCBFbnRyeSA8Q29udHJvbC1iYWNrc2xhc2g+IHsNICAgICVXIHNlbGVjdGlvbiBjbGVhcg19DWJpbmQgRW50cnkgPEtleVByZXNzPiB7DSAgICB0a0VudHJ5SW5zZXJ0ICVXICVBDX0NDSMgSWdub3JlIGFsbCBBbHQsIE1ldGEsIGFuZCBDb250cm9sIGtleXByZXNzZXMgdW5sZXNzIGV4cGxpY2l0bHkgYm91bmQuDSMgT3RoZXJ3aXNlLCBpZiBhIHdpZGdldCBiaW5kaW5nIGZvciBvbmUgb2YgdGhlc2UgaXMgZGVmaW5lZCwgdGhlDSMgPEtleVByZXNzPiBjbGFzcyBiaW5kaW5nIHdpbGwgYWxzbyBmaXJlIGFuZCBpbnNlcnQgdGhlIGNoYXJhY3RlciwNIyB3aGljaCBpcyB3cm9uZy4gIERpdHRvIGZvciBFc2NhcGUsIFJldHVybiwgYW5kIFRhYi4NDWJpbmQgRW50cnkgPEFsdC1LZXlQcmVzcz4geyMgbm90aGluZ30NYmluZCBFbnRyeSA8TWV0YS1LZXlQcmVzcz4geyMgbm90aGluZ30NYmluZCBFbnRyeSA8Q29udHJvbC1LZXlQcmVzcz4geyMgbm90aGluZ30NYmluZCBFbnRyeSA8RXNjYXBlPiB7IyBub3RoaW5nfQ1iaW5kIEVudHJ5IDxSZXR1cm4+IHsjIG5vdGhpbmd9DWJpbmQgRW50cnkgPEtQX0VudGVyPiB7IyBub3RoaW5nfQ1iaW5kIEVudHJ5IDxUYWI+IHsjIG5vdGhpbmd9DWlmIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJtYWNpbnRvc2giXX0gew0JYmluZCBFbnRyeSA8Q29tbWFuZC1LZXlQcmVzcz4geyMgbm90aGluZ30NfQ0NIyBPbiBXaW5kb3dzLCBwYXN0ZSBpcyBkb25lIHVzaW5nIFNoaWZ0LUluc2VydC4gIFNoaWZ0LUluc2VydCBhbHJlYWR5DSMgZ2VuZXJhdGVzIHRoZSA8PFBhc3RlPj4gZXZlbnQsIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZS4NaWYge1tzdHJpbmcgY29tcGFyZSAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAid2luZG93cyJdfSB7DSAgICBiaW5kIEVudHJ5IDxJbnNlcnQ+IHsNCWNhdGNoIHt0a0VudHJ5SW5zZXJ0ICVXIFtzZWxlY3Rpb24gZ2V0IC1kaXNwbGF5b2YgJVddfQ0gICAgfQ19DQ0jIEFkZGl0aW9uYWwgZW1hY3MtbGlrZSBiaW5kaW5nczoNDWJpbmQgRW50cnkgPENvbnRyb2wtYT4gew0gICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsNCXRrRW50cnlTZXRDdXJzb3IgJVcgMA0gICAgfQ19DWJpbmQgRW50cnkgPENvbnRyb2wtYj4gew0gICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsNCXRrRW50cnlTZXRDdXJzb3IgJVcgW2V4cHIge1slVyBpbmRleCBpbnNlcnRdIC0gMX1dDSAgICB9DX0NYmluZCBFbnRyeSA8Q29udHJvbC1kPiB7DSAgICBpZiB7ISR0a19zdHJpY3RNb3RpZn0gew0JJVcgZGVsZXRlIGluc2VydA0gICAgfQ19DWJpbmQgRW50cnkgPENvbnRyb2wtZT4gew0gICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsNCXRrRW50cnlTZXRDdXJzb3IgJVcgZW5kDSAgICB9DX0NYmluZCBFbnRyeSA8Q29udHJvbC1mPiB7DSAgICBpZiB7ISR0a19zdHJpY3RNb3RpZn0gew0JdGtFbnRyeVNldEN1cnNvciAlVyBbZXhwciB7WyVXIGluZGV4IGluc2VydF0gKyAxfV0NICAgIH0NfQ1iaW5kIEVudHJ5IDxDb250cm9sLWg+IHsNICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7DQl0a0VudHJ5QmFja3NwYWNlICVXDSAgICB9DX0NYmluZCBFbnRyeSA8Q29udHJvbC1rPiB7DSAgICBpZiB7ISR0a19zdHJpY3RNb3RpZn0gew0JJVcgZGVsZXRlIGluc2VydCBlbmQNICAgIH0NfQ1iaW5kIEVudHJ5IDxDb250cm9sLXQ+IHsNICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7DQl0a0VudHJ5VHJhbnNwb3NlICVXDSAgICB9DX0NYmluZCBFbnRyeSA8TWV0YS1iPiB7DSAgICBpZiB7ISR0a19zdHJpY3RNb3RpZn0gew0JdGtFbnRyeVNldEN1cnNvciAlVyBbdGtFbnRyeVByZXZpb3VzV29yZCAlVyBpbnNlcnRdDSAgICB9DX0NYmluZCBFbnRyeSA8TWV0YS1kPiB7DSAgICBpZiB7ISR0a19zdHJpY3RNb3RpZn0gew0JJVcgZGVsZXRlIGluc2VydCBbdGtFbnRyeU5leHRXb3JkICVXIGluc2VydF0NICAgIH0NfQ1iaW5kIEVudHJ5IDxNZXRhLWY+IHsNICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7DQl0a0VudHJ5U2V0Q3Vyc29yICVXIFt0a0VudHJ5TmV4dFdvcmQgJVcgaW5zZXJ0XQ0gICAgfQ19DWJpbmQgRW50cnkgPE1ldGEtQmFja1NwYWNlPiB7DSAgICBpZiB7ISR0a19zdHJpY3RNb3RpZn0gew0JJVcgZGVsZXRlIFt0a0VudHJ5UHJldmlvdXNXb3JkICVXIGluc2VydF0gaW5zZXJ0DSAgICB9DX0NYmluZCBFbnRyeSA8TWV0YS1EZWxldGU+IHsNICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7DQklVyBkZWxldGUgW3RrRW50cnlQcmV2aW91c1dvcmQgJVcgaW5zZXJ0XSBpbnNlcnQNICAgIH0NfQ0NIyBBIGZldyBhZGRpdGlvbmFsIGJpbmRpbmdzIG9mIG15IG93bi4NDWJpbmQgRW50cnkgPDI+IHsNICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7DQklVyBzY2FuIG1hcmsgJXgNCXNldCB0a1ByaXYoeCkgJXgNCXNldCB0a1ByaXYoeSkgJXkNCXNldCB0a1ByaXYobW91c2VNb3ZlZCkgMA0gICAgfQ19DWJpbmQgRW50cnkgPEIyLU1vdGlvbj4gew0gICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsNCWlmIHthYnMoJXgtJHRrUHJpdih4KSkgPiAyfSB7DQkgICAgc2V0IHRrUHJpdihtb3VzZU1vdmVkKSAxDQl9DQklVyBzY2FuIGRyYWd0byAleA0gICAgfQ19DQ0jIHRrRW50cnlDbG9zZXN0R2FwIC0tDSMgR2l2ZW4geCBhbmQgeSBjb29yZGluYXRlcywgdGhpcyBwcm9jZWR1cmUgZmluZHMgdGhlIGNsb3Nlc3QgYm91bmRhcnkNIyBiZXR3ZWVuIGNoYXJhY3RlcnMgdG8gdGhlIGdpdmVuIGNvb3JkaW5hdGVzIGFuZCByZXR1cm5zIHRoZSBpbmRleA0jIG9mIHRoZSBjaGFyYWN0ZXIganVzdCBhZnRlciB0aGUgYm91bmRhcnkuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgZW50cnkgd2luZG93Lg0jIHggLQkJWC1jb29yZGluYXRlIHdpdGhpbiB0aGUgd2luZG93Lg0NcHJvYyB0a0VudHJ5Q2xvc2VzdEdhcCB7dyB4fSB7DSAgICBzZXQgcG9zIFskdyBpbmRleCBAJHhdDSAgICBzZXQgYmJveCBbJHcgYmJveCAkcG9zXQ0gICAgaWYgeygkeCAtIFtsaW5kZXggJGJib3ggMF0pIDwgKFtsaW5kZXggJGJib3ggMl0vMil9IHsNCXJldHVybiAkcG9zDSAgICB9DSAgICBpbmNyIHBvcw19DQ0jIHRrRW50cnlCdXR0b24xIC0tDSMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCB0byBoYW5kbGUgYnV0dG9uLTEgcHJlc3NlcyBpbiBlbnRyeQ0jIHdpZGdldHMuICBJdCBtb3ZlcyB0aGUgaW5zZXJ0aW9uIGN1cnNvciwgc2V0cyB0aGUgc2VsZWN0aW9uIGFuY2hvciwNIyBhbmQgY2xhaW1zIHRoZSBpbnB1dCBmb2N1cy4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSBlbnRyeSB3aW5kb3cgaW4gd2hpY2ggdGhlIGJ1dHRvbiB3YXMgcHJlc3NlZC4NIyB4IC0JCVRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGJ1dHRvbiBwcmVzcy4NDXByb2MgdGtFbnRyeUJ1dHRvbjEge3cgeH0gew0gICAgZ2xvYmFsIHRrUHJpdg0NICAgIHNldCB0a1ByaXYoc2VsZWN0TW9kZSkgY2hhcg0gICAgc2V0IHRrUHJpdihtb3VzZU1vdmVkKSAwDSAgICBzZXQgdGtQcml2KHByZXNzWCkgJHgNICAgICR3IGljdXJzb3IgW3RrRW50cnlDbG9zZXN0R2FwICR3ICR4XQ0gICAgJHcgc2VsZWN0aW9uIGZyb20gaW5zZXJ0DSAgICBpZiB7W3N0cmluZyBjb21wYXJlICJkaXNhYmxlZCIgWyR3IGNnZXQgLXN0YXRlXV19IHtmb2N1cyAkd30NfQ0NIyB0a0VudHJ5TW91c2VTZWxlY3QgLS0NIyBUaGlzIHByb2NlZHVyZSBpcyBpbnZva2VkIHdoZW4gZHJhZ2dpbmcgb3V0IGEgc2VsZWN0aW9uIHdpdGgNIyB0aGUgbW91c2UuICBEZXBlbmRpbmcgb24gdGhlIHNlbGVjdGlvbiBtb2RlIChjaGFyYWN0ZXIsIHdvcmQsDSMgbGluZSkgaXQgc2VsZWN0cyBpbiBkaWZmZXJlbnQtc2l6ZWQgdW5pdHMuICBUaGlzIHByb2NlZHVyZQ0jIGlnbm9yZXMgbW91c2UgbW90aW9ucyBpbml0aWFsbHkgdW50aWwgdGhlIG1vdXNlIGhhcyBtb3ZlZCBmcm9tDSMgb25lIGNoYXJhY3RlciB0byBhbm90aGVyIG9yIHVudGlsIHRoZXJlIGhhdmUgYmVlbiBtdWx0aXBsZSBjbGlja3MuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgZW50cnkgd2luZG93IGluIHdoaWNoIHRoZSBidXR0b24gd2FzIHByZXNzZWQuDSMgeCAtCQlUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBtb3VzZS4NDXByb2MgdGtFbnRyeU1vdXNlU2VsZWN0IHt3IHh9IHsNICAgIGdsb2JhbCB0a1ByaXYNDSAgICBzZXQgY3VyIFt0a0VudHJ5Q2xvc2VzdEdhcCAkdyAkeF0NICAgIHNldCBhbmNob3IgWyR3IGluZGV4IGFuY2hvcl0NICAgIGlmIHsoJGN1ciAhPSAkYW5jaG9yKSB8fCAoYWJzKCR0a1ByaXYocHJlc3NYKSAtICR4KSA+PSAzKX0gew0Jc2V0IHRrUHJpdihtb3VzZU1vdmVkKSAxDSAgICB9DSAgICBzd2l0Y2ggJHRrUHJpdihzZWxlY3RNb2RlKSB7DQljaGFyIHsNCSAgICBpZiB7JHRrUHJpdihtb3VzZU1vdmVkKX0gew0JCWlmIHskY3VyIDwgJGFuY2hvcn0gew0JCSAgICAkdyBzZWxlY3Rpb24gcmFuZ2UgJGN1ciAkYW5jaG9yDQkJfSBlbHNlaWYgeyRjdXIgPiAkYW5jaG9yfSB7DQkJICAgICR3IHNlbGVjdGlvbiByYW5nZSAkYW5jaG9yICRjdXINCQl9IGVsc2Ugew0JCSAgICAkdyBzZWxlY3Rpb24gY2xlYXINCQl9DQkgICAgfQ0JfQ0Jd29yZCB7DQkgICAgaWYgeyRjdXIgPCBbJHcgaW5kZXggYW5jaG9yXX0gew0JCXNldCBiZWZvcmUgW3RjbF93b3JkQnJlYWtCZWZvcmUgWyR3IGdldF0gJGN1cl0NCQlzZXQgYWZ0ZXIgW3RjbF93b3JkQnJlYWtBZnRlciBbJHcgZ2V0XSBbZXhwciB7JGFuY2hvci0xfV1dDQkgICAgfSBlbHNlIHsNCQlzZXQgYmVmb3JlIFt0Y2xfd29yZEJyZWFrQmVmb3JlIFskdyBnZXRdICRhbmNob3JdDQkJc2V0IGFmdGVyIFt0Y2xfd29yZEJyZWFrQWZ0ZXIgWyR3IGdldF0gW2V4cHIgeyRjdXIgLSAxfV1dDQkgICAgfQ0JICAgIGlmIHskYmVmb3JlIDwgMH0gew0JCXNldCBiZWZvcmUgMA0JICAgIH0NCSAgICBpZiB7JGFmdGVyIDwgMH0gew0JCXNldCBhZnRlciBlbmQNCSAgICB9DQkgICAgJHcgc2VsZWN0aW9uIHJhbmdlICRiZWZvcmUgJGFmdGVyDQl9DQlsaW5lIHsNCSAgICAkdyBzZWxlY3Rpb24gcmFuZ2UgMCBlbmQNCX0NICAgIH0NICAgIGlmIHskdGtQcml2KG1vdXNlTW92ZWQpfSB7DSAgICAgICAgJHcgaWN1cnNvciAkY3VyDSAgICB9DSAgICB1cGRhdGUgaWRsZXRhc2tzDX0NDSMgdGtFbnRyeVBhc3RlIC0tDSMgVGhpcyBwcm9jZWR1cmUgc2V0cyB0aGUgaW5zZXJ0aW9uIGN1cnNvciB0byB0aGUgY3VycmVudCBtb3VzZSBwb3NpdGlvbiwNIyBwYXN0ZXMgdGhlIHNlbGVjdGlvbiB0aGVyZSwgYW5kIHNldHMgdGhlIGZvY3VzIHRvIHRoZSB3aW5kb3cuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgZW50cnkgd2luZG93Lg0jIHggLQkJWCBwb3NpdGlvbiBvZiB0aGUgbW91c2UuDQ1wcm9jIHRrRW50cnlQYXN0ZSB7dyB4fSB7DSAgICBnbG9iYWwgdGtQcml2DQ0gICAgJHcgaWN1cnNvciBbdGtFbnRyeUNsb3Nlc3RHYXAgJHcgJHhdDSAgICBjYXRjaCB7JHcgaW5zZXJ0IGluc2VydCBbc2VsZWN0aW9uIGdldCAtZGlzcGxheW9mICR3XX0NICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgImRpc2FibGVkIiBbJHcgY2dldCAtc3RhdGVdXX0ge2ZvY3VzICR3fQ19DQ0jIHRrRW50cnlBdXRvU2NhbiAtLQ0jIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgd2hlbiB0aGUgbW91c2UgbGVhdmVzIGFuIGVudHJ5IHdpbmRvdw0jIHdpdGggYnV0dG9uIDEgZG93bi4gIEl0IHNjcm9sbHMgdGhlIHdpbmRvdyBsZWZ0IG9yIHJpZ2h0LA0jIGRlcGVuZGluZyBvbiB3aGVyZSB0aGUgbW91c2UgaXMsIGFuZCByZXNjaGVkdWxlcyBpdHNlbGYgYXMgYW4NIyAiYWZ0ZXIiIGNvbW1hbmQgc28gdGhhdCB0aGUgd2luZG93IGNvbnRpbnVlcyB0byBzY3JvbGwgdW50aWwgdGhlDSMgbW91c2UgbW92ZXMgYmFjayBpbnRvIHRoZSB3aW5kb3cgb3IgdGhlIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZC4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSBlbnRyeSB3aW5kb3cuDQ1wcm9jIHRrRW50cnlBdXRvU2NhbiB7d30gew0gICAgZ2xvYmFsIHRrUHJpdg0gICAgc2V0IHggJHRrUHJpdih4KQ0gICAgaWYgeyFbd2luZm8gZXhpc3RzICR3XX0gcmV0dXJuDSAgICBpZiB7JHggPj0gW3dpbmZvIHdpZHRoICR3XX0gew0JJHcgeHZpZXcgc2Nyb2xsIDIgdW5pdHMNCXRrRW50cnlNb3VzZVNlbGVjdCAkdyAkeA0gICAgfSBlbHNlaWYgeyR4IDwgMH0gew0JJHcgeHZpZXcgc2Nyb2xsIC0yIHVuaXRzDQl0a0VudHJ5TW91c2VTZWxlY3QgJHcgJHgNICAgIH0NICAgIHNldCB0a1ByaXYoYWZ0ZXJJZCkgW2FmdGVyIDUwIFtsaXN0IHRrRW50cnlBdXRvU2NhbiAkd11dDX0NDSMgdGtFbnRyeUtleVNlbGVjdCAtLQ0jIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgd2hlbiBzdHJva2luZyBvdXQgc2VsZWN0aW9ucyB1c2luZyB0aGUNIyBrZXlib2FyZC4gIEl0IG1vdmVzIHRoZSBjdXJzb3IgdG8gYSBuZXcgcG9zaXRpb24sIHRoZW4gZXh0ZW5kcw0jIHRoZSBzZWxlY3Rpb24gdG8gdGhhdCBwb3NpdGlvbi4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSBlbnRyeSB3aW5kb3cuDSMgbmV3IC0JCUEgbmV3IHBvc2l0aW9uIGZvciB0aGUgaW5zZXJ0aW9uIGN1cnNvciAodGhlIGN1cnNvciBoYXNuJ3QNIwkJYWN0dWFsbHkgYmVlbiBtb3ZlZCB0byB0aGlzIHBvc2l0aW9uIHlldCkuDQ1wcm9jIHRrRW50cnlLZXlTZWxlY3Qge3cgbmV3fSB7DSAgICBpZiB7IVskdyBzZWxlY3Rpb24gcHJlc2VudF19IHsNCSR3IHNlbGVjdGlvbiBmcm9tIGluc2VydA0JJHcgc2VsZWN0aW9uIHRvICRuZXcNICAgIH0gZWxzZSB7DQkkdyBzZWxlY3Rpb24gYWRqdXN0ICRuZXcNICAgIH0NICAgICR3IGljdXJzb3IgJG5ldw19DQ0jIHRrRW50cnlJbnNlcnQgLS0NIyBJbnNlcnQgYSBzdHJpbmcgaW50byBhbiBlbnRyeSBhdCB0aGUgcG9pbnQgb2YgdGhlIGluc2VydGlvbiBjdXJzb3IuDSMgSWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24gaW4gdGhlIGVudHJ5LCBhbmQgaXQgY292ZXJzIHRoZSBwb2ludCBvZiB0aGUNIyBpbnNlcnRpb24gY3Vyc29yLCB0aGVuIGRlbGV0ZSB0aGUgc2VsZWN0aW9uIGJlZm9yZSBpbnNlcnRpbmcuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgZW50cnkgd2luZG93IGluIHdoaWNoIHRvIGluc2VydCB0aGUgc3RyaW5nDSMgcyAtCQlUaGUgc3RyaW5nIHRvIGluc2VydCAodXN1YWxseSBqdXN0IGEgc2luZ2xlIGNoYXJhY3RlcikNDXByb2MgdGtFbnRyeUluc2VydCB7dyBzfSB7DSAgICBpZiB7W3N0cmluZyBlcXVhbCAkcyAiIl19IHsNCXJldHVybg0gICAgfQ0gICAgY2F0Y2ggew0Jc2V0IGluc2VydCBbJHcgaW5kZXggaW5zZXJ0XQ0JaWYgeyhbJHcgaW5kZXggc2VsLmZpcnN0XSA8PSAkaW5zZXJ0KQ0JCSYmIChbJHcgaW5kZXggc2VsLmxhc3RdID49ICRpbnNlcnQpfSB7DQkgICAgJHcgZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdA0JfQ0gICAgfQ0gICAgJHcgaW5zZXJ0IGluc2VydCAkcw0gICAgdGtFbnRyeVNlZUluc2VydCAkdw19DQ0jIHRrRW50cnlCYWNrc3BhY2UgLS0NIyBCYWNrc3BhY2Ugb3ZlciB0aGUgY2hhcmFjdGVyIGp1c3QgYmVmb3JlIHRoZSBpbnNlcnRpb24gY3Vyc29yLg0jIElmIGJhY2tzcGFjaW5nIHdvdWxkIG1vdmUgdGhlIGN1cnNvciBvZmYgdGhlIGxlZnQgZWRnZSBvZiB0aGUNIyB3aW5kb3csIHJlcG9zaXRpb24gdGhlIGN1cnNvciBhdCBhYm91dCB0aGUgbWlkZGxlIG9mIHRoZSB3aW5kb3cuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgZW50cnkgd2luZG93IGluIHdoaWNoIHRvIGJhY2tzcGFjZS4NDXByb2MgdGtFbnRyeUJhY2tzcGFjZSB3IHsNICAgIGlmIHtbJHcgc2VsZWN0aW9uIHByZXNlbnRdfSB7DQkkdyBkZWxldGUgc2VsLmZpcnN0IHNlbC5sYXN0DSAgICB9IGVsc2Ugew0Jc2V0IHggW2V4cHIge1skdyBpbmRleCBpbnNlcnRdIC0gMX1dDQlpZiB7JHggPj0gMH0geyR3IGRlbGV0ZSAkeH0NCWlmIHtbJHcgaW5kZXggQDBdID49IFskdyBpbmRleCBpbnNlcnRdfSB7DQkgICAgc2V0IHJhbmdlIFskdyB4dmlld10NCSAgICBzZXQgbGVmdCBbbGluZGV4ICRyYW5nZSAwXQ0JICAgIHNldCByaWdodCBbbGluZGV4ICRyYW5nZSAxXQ0JICAgICR3IHh2aWV3IG1vdmV0byBbZXhwciB7JGxlZnQgLSAoJHJpZ2h0IC0gJGxlZnQpLzIuMH1dDQl9DSAgICB9DX0NDSMgdGtFbnRyeVNlZUluc2VydCAtLQ0jIE1ha2Ugc3VyZSB0aGF0IHRoZSBpbnNlcnRpb24gY3Vyc29yIGlzIHZpc2libGUgaW4gdGhlIGVudHJ5IHdpbmRvdy4NIyBJZiBub3QsIGFkanVzdCB0aGUgdmlldyBzbyB0aGF0IGl0IGlzLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIGVudHJ5IHdpbmRvdy4NDXByb2MgdGtFbnRyeVNlZUluc2VydCB3IHsNICAgIHNldCBjIFskdyBpbmRleCBpbnNlcnRdDSAgICBpZiB7KCRjIDwgWyR3IGluZGV4IEAwXSkgfHwgKCRjID4gWyR3IGluZGV4IEBbd2luZm8gd2lkdGggJHddXSl9IHsNCSR3IHh2aWV3ICRjDSAgICB9DX0NDSMgdGtFbnRyeVNldEN1cnNvciAtDSMgTW92ZSB0aGUgaW5zZXJ0aW9uIGN1cnNvciB0byBhIGdpdmVuIHBvc2l0aW9uIGluIGFuIGVudHJ5LiAgQWxzbw0jIGNsZWFycyB0aGUgc2VsZWN0aW9uLCBpZiB0aGVyZSBpcyBvbmUgaW4gdGhlIGVudHJ5LCBhbmQgbWFrZXMgc3VyZQ0jIHRoYXQgdGhlIGluc2VydGlvbiBjdXJzb3IgaXMgdmlzaWJsZS4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSBlbnRyeSB3aW5kb3cuDSMgcG9zIC0JCVRoZSBkZXNpcmVkIG5ldyBwb3NpdGlvbiBmb3IgdGhlIGN1cnNvciBpbiB0aGUgd2luZG93Lg0NcHJvYyB0a0VudHJ5U2V0Q3Vyc29yIHt3IHBvc30gew0gICAgJHcgaWN1cnNvciAkcG9zDSAgICAkdyBzZWxlY3Rpb24gY2xlYXINICAgIHRrRW50cnlTZWVJbnNlcnQgJHcNfQ0NIyB0a0VudHJ5VHJhbnNwb3NlIC0NIyBUaGlzIHByb2NlZHVyZSBpbXBsZW1lbnRzIHRoZSAidHJhbnNwb3NlIiBmdW5jdGlvbiBmb3IgZW50cnkgd2lkZ2V0cy4NIyBJdCB0cmFucG9zZXMgdGhlIGNoYXJhY3RlcnMgb24gZWl0aGVyIHNpZGUgb2YgdGhlIGluc2VydGlvbiBjdXJzb3IsDSMgdW5sZXNzIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4gIEluIHRoaXMgY2FzZSBpdA0jIHRyYW5zcG9zZXMgdGhlIHR3byBjaGFyYWN0ZXJzIHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJzb3IuICBJbiBlaXRoZXINIyBjYXNlLCB0aGUgY3Vyc29yIGVuZHMgdXAgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0cmFuc3Bvc2VkIGNoYXJhY3RlcnMuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgZW50cnkgd2luZG93Lg0NcHJvYyB0a0VudHJ5VHJhbnNwb3NlIHcgew0gICAgc2V0IGkgWyR3IGluZGV4IGluc2VydF0NICAgIGlmIHskaSA8IFskdyBpbmRleCBlbmRdfSB7DQlpbmNyIGkNICAgIH0NICAgIHNldCBmaXJzdCBbZXhwciB7JGktMn1dDSAgICBpZiB7JGZpcnN0IDwgMH0gew0JcmV0dXJuDSAgICB9DSAgICBzZXQgbmV3IFtzdHJpbmcgaW5kZXggWyR3IGdldF0gW2V4cHIgeyRpLTF9XV1bc3RyaW5nIGluZGV4IFskdyBnZXRdICRmaXJzdF0NICAgICR3IGRlbGV0ZSAkZmlyc3QgJGkNICAgICR3IGluc2VydCBpbnNlcnQgJG5ldw0gICAgdGtFbnRyeVNlZUluc2VydCAkdw19DQ0jIHRrRW50cnlOZXh0V29yZCAtLQ0jIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IHdvcmQgcG9zaXRpb24gYWZ0ZXIgYSBnaXZlbiBwb3NpdGlvbiBpbiB0aGUNIyBlbnRyeS4gIFRoZSBuZXh0IHdvcmQgaXMgcGxhdGZvcm0gZGVwZW5kZW50IGFuZCBtYXkgYmUgZWl0aGVyIHRoZSBuZXh0DSMgZW5kLW9mLXdvcmQgcG9zaXRpb24gb3IgdGhlIG5leHQgc3RhcnQtb2Ytd29yZCBwb3NpdGlvbiBhZnRlciB0aGUgbmV4dA0jIGVuZC1vZi13b3JkIHBvc2l0aW9uLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIGVudHJ5IHdpbmRvdyBpbiB3aGljaCB0aGUgY3Vyc29yIGlzIHRvIG1vdmUuDSMgc3RhcnQgLQlQb3NpdGlvbiBhdCB3aGljaCB0byBzdGFydCBzZWFyY2guDQ1pZiB7W3N0cmluZyBlcXVhbCAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAid2luZG93cyJdfSAgew0gICAgcHJvYyB0a0VudHJ5TmV4dFdvcmQge3cgc3RhcnR9IHsNCXNldCBwb3MgW3RjbF9lbmRPZldvcmQgWyR3IGdldF0gWyR3IGluZGV4ICRzdGFydF1dDQlpZiB7JHBvcyA+PSAwfSB7DQkgICAgc2V0IHBvcyBbdGNsX3N0YXJ0T2ZOZXh0V29yZCBbJHcgZ2V0XSAkcG9zXQ0JfQ0JaWYgeyRwb3MgPCAwfSB7DQkgICAgcmV0dXJuIGVuZA0JfQ0JcmV0dXJuICRwb3MNICAgIH0NfSBlbHNlIHsNICAgIHByb2MgdGtFbnRyeU5leHRXb3JkIHt3IHN0YXJ0fSB7DQlzZXQgcG9zIFt0Y2xfZW5kT2ZXb3JkIFskdyBnZXRdIFskdyBpbmRleCAkc3RhcnRdXQ0JaWYgeyRwb3MgPCAwfSB7DQkgICAgcmV0dXJuIGVuZA0JfQ0JcmV0dXJuICRwb3MNICAgIH0NfQ0NIyB0a0VudHJ5UHJldmlvdXNXb3JkIC0tDSMNIyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgcHJldmlvdXMgd29yZCBwb3NpdGlvbiBiZWZvcmUgYSBnaXZlbg0jIHBvc2l0aW9uIGluIHRoZSBlbnRyeS4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSBlbnRyeSB3aW5kb3cgaW4gd2hpY2ggdGhlIGN1cnNvciBpcyB0byBtb3ZlLg0jIHN0YXJ0IC0JUG9zaXRpb24gYXQgd2hpY2ggdG8gc3RhcnQgc2VhcmNoLg0NcHJvYyB0a0VudHJ5UHJldmlvdXNXb3JkIHt3IHN0YXJ0fSB7DSAgICBzZXQgcG9zIFt0Y2xfc3RhcnRPZlByZXZpb3VzV29yZCBbJHcgZ2V0XSBbJHcgaW5kZXggJHN0YXJ0XV0NICAgIGlmIHskcG9zIDwgMH0gew0JcmV0dXJuIDANICAgIH0NICAgIHJldHVybiAkcG9zDX0NIyB0a0VudHJ5R2V0U2VsZWN0aW9uIC0tDSMNIyBSZXR1cm5zIHRoZSBzZWxlY3RlZCB0ZXh0IG9mIHRoZSBlbnRyeSB3aXRoIHJlc3BlY3QgdG8gdGhlIC1zaG93IG9wdGlvbi4NIw0jIEFyZ3VtZW50czoNIyB3IC0gICAgICAgICBUaGUgZW50cnkgd2luZG93IGZyb20gd2hpY2ggdGhlIHRleHQgdG8gZ2V0DQ1wcm9jIHRrRW50cnlHZXRTZWxlY3Rpb24ge3d9IHsNICAgIHNldCBlbnRyeVN0cmluZyBbc3RyaW5nIHJhbmdlIFskdyBnZXRdIFskdyBpbmRleCBzZWwuZmlyc3RdIFwNCSAgICBbZXhwciB7WyR3IGluZGV4IHNlbC5sYXN0XSAtIDF9XV0NICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgWyR3IGNnZXQgLXNob3ddICIiXX0gew0JcmVnc3ViIC1hbGwgLiAkZW50cnlTdHJpbmcgW3N0cmluZyBpbmRleCBbJHcgY2dldCAtc2hvd10gMF0gZW50cnlTdHJpbmcNICAgIH0NICAgIHJldHVybiAkZW50cnlTdHJpbmcNfQ0AABO8IyBmb2N1cy50Y2wgLS0NIw0jIFRoaXMgZmlsZSBkZWZpbmVzIHNldmVyYWwgcHJvY2VkdXJlcyBmb3IgbWFuYWdpbmcgdGhlIGlucHV0DSMgZm9jdXMuDSMNIyBSQ1M6IEAoIykgJElkOiBmb2N1cy50Y2wsdiAxLjcuMi4xIDIwMDAvMDgvMDUgMjM6NTM6MTMgaG9iYnMgRXhwICQNIw0jIENvcHlyaWdodCAoYykgMTk5NC0xOTk1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4NIw0jIFNlZSB0aGUgZmlsZSAibGljZW5zZS50ZXJtcyIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbg0jIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuDSMNDSMgdGtfZm9jdXNOZXh0IC0tDSMgVGhpcyBwcm9jZWR1cmUgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbmV4dCB3aW5kb3cgYWZ0ZXIgInciIGluDSMgImZvY3VzIG9yZGVyIiAodGhlIHdpbmRvdyB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSBmb2N1cyBuZXh0IGlmDSMgVGFiIGlzIHR5cGVkIGluIHcpLiAgIk5leHQiIGlzIGRlZmluZWQgYnkgYSBwcmUtb3JkZXIgc2VhcmNoDSMgb2YgYSB0b3AtbGV2ZWwgYW5kIGl0cyBub24tdG9wLWxldmVsIGRlc2NlbmRhbnRzLCB3aXRoIHRoZSBzdGFja2luZw0jIG9yZGVyIGRldGVybWluaW5nIHRoZSBvcmRlciBvZiBzaWJsaW5ncy4gIFRoZSAiLXRha2Vmb2N1cyIgb3B0aW9ucw0jIG9uIHdpbmRvd3MgZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZXkgc2hvdWxkIGJlIHNraXBwZWQuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlOYW1lIG9mIGEgd2luZG93Lg0NcHJvYyB0a19mb2N1c05leHQgdyB7DSAgICBzZXQgY3VyICR3DSAgICB3aGlsZSB7MX0gew0NCSMgRGVzY2VuZCB0byBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGN1cnJlbnQgd2lkZ2V0Lg0NCXNldCBwYXJlbnQgJGN1cg0Jc2V0IGNoaWxkcmVuIFt3aW5mbyBjaGlsZHJlbiAkY3VyXQ0Jc2V0IGkgLTENDQkjIExvb2sgZm9yIHRoZSBuZXh0IHNpYmxpbmcgdGhhdCBpc24ndCBhIHRvcC1sZXZlbC4NDQl3aGlsZSB7MX0gew0JICAgIGluY3IgaQ0JICAgIGlmIHskaSA8IFtsbGVuZ3RoICRjaGlsZHJlbl19IHsNCQlzZXQgY3VyIFtsaW5kZXggJGNoaWxkcmVuICRpXQ0gICAgICAgICAgICAgIGlmIHtbc3RyaW5nIGVxdWFsIFt3aW5mbyB0b3BsZXZlbCAkY3VyXSAkY3VyXX0gew0JCSAgICBjb250aW51ZQ0JCX0gZWxzZSB7DQkJICAgIGJyZWFrDQkJfQ0JICAgIH0NDQkgICAgIyBObyBtb3JlIHNpYmxpbmdzLCBzbyBnbyB0byB0aGUgY3VycmVudCB3aWRnZXQncyBwYXJlbnQuDQkgICAgIyBJZiBpdCdzIGEgdG9wLWxldmVsLCBicmVhayBvdXQgb2YgdGhlIGxvb3AsIG90aGVyd2lzZQ0JICAgICMgbG9vayBmb3IgaXRzIG5leHQgc2libGluZy4NDQkgICAgc2V0IGN1ciAkcGFyZW50DQkgICAgaWYge1tzdHJpbmcgZXF1YWwgW3dpbmZvIHRvcGxldmVsICRjdXJdICRjdXJdfSB7DQkJYnJlYWsNCSAgICB9DQkgICAgc2V0IHBhcmVudCBbd2luZm8gcGFyZW50ICRwYXJlbnRdDQkgICAgc2V0IGNoaWxkcmVuIFt3aW5mbyBjaGlsZHJlbiAkcGFyZW50XQ0JICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkY2hpbGRyZW4gJGN1cl0NCX0NCWlmIHtbc3RyaW5nIGVxdWFsICR3ICRjdXJdIHx8IFt0a0ZvY3VzT0sgJGN1cl19IHsNCSAgICByZXR1cm4gJGN1cg0JfQ0gICAgfQ19DQ0jIHRrX2ZvY3VzUHJldiAtLQ0jIFRoaXMgcHJvY2VkdXJlIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByZXZpb3VzIHdpbmRvdyBiZWZvcmUgInciIGluDSMgImZvY3VzIG9yZGVyIiAodGhlIHdpbmRvdyB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSBmb2N1cyBuZXh0IGlmDSMgU2hpZnQtVGFiIGlzIHR5cGVkIGluIHcpLiAgIk5leHQiIGlzIGRlZmluZWQgYnkgYSBwcmUtb3JkZXIgc2VhcmNoDSMgb2YgYSB0b3AtbGV2ZWwgYW5kIGl0cyBub24tdG9wLWxldmVsIGRlc2NlbmRhbnRzLCB3aXRoIHRoZSBzdGFja2luZw0jIG9yZGVyIGRldGVybWluaW5nIHRoZSBvcmRlciBvZiBzaWJsaW5ncy4gIFRoZSAiLXRha2Vmb2N1cyIgb3B0aW9ucw0jIG9uIHdpbmRvd3MgZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZXkgc2hvdWxkIGJlIHNraXBwZWQuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlOYW1lIG9mIGEgd2luZG93Lg0NcHJvYyB0a19mb2N1c1ByZXYgdyB7DSAgICBzZXQgY3VyICR3DSAgICB3aGlsZSB7MX0gew0NCSMgQ29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCB3aW5kb3cncyBwb3NpdGlvbg0JIyBhbW9uZyBpdHMgc2libGluZ3MuICBBbHNvLCBpZiB0aGUgd2luZG93IGlzIGEgdG9wLWxldmVsLA0JIyB0aGVuIHJlcG9zaXRpb24gdG8ganVzdCBhZnRlciB0aGUgbGFzdCBjaGlsZCBvZiB0aGUgd2luZG93Lg0NCWlmIHtbc3RyaW5nIGVxdWFsIFt3aW5mbyB0b3BsZXZlbCAkY3VyXSAkY3VyXX0gIHsNCSAgICBzZXQgcGFyZW50ICRjdXINCSAgICBzZXQgY2hpbGRyZW4gW3dpbmZvIGNoaWxkcmVuICRjdXJdDQkgICAgc2V0IGkgW2xsZW5ndGggJGNoaWxkcmVuXQ0JfSBlbHNlIHsNCSAgICBzZXQgcGFyZW50IFt3aW5mbyBwYXJlbnQgJGN1cl0NCSAgICBzZXQgY2hpbGRyZW4gW3dpbmZvIGNoaWxkcmVuICRwYXJlbnRdDQkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRjaGlsZHJlbiAkY3VyXQ0JfQ0NCSMgR28gdG8gdGhlIHByZXZpb3VzIHNpYmxpbmcsIHRoZW4gZGVzY2VuZCB0byBpdHMgbGFzdCBkZXNjZW5kYW50DQkjIChoaWdoZXN0IGluIHN0YWNraW5nIG9yZGVyLiAgV2hpbGUgZG9pbmcgdGhpcywgaWdub3JlIHRvcC1sZXZlbHMNCSMgYW5kIHRoZWlyIGRlc2NlbmRhbnRzLiAgV2hlbiB3ZSBydW4gb3V0IG9mIGRlc2NlbmRhbnRzLCBnbyB1cA0JIyBvbmUgbGV2ZWwgdG8gdGhlIHBhcmVudC4NDQl3aGlsZSB7JGkgPiAwfSB7DQkgICAgaW5jciBpIC0xDQkgICAgc2V0IGN1ciBbbGluZGV4ICRjaGlsZHJlbiAkaV0NCSAgICBpZiB7W3N0cmluZyBlcXVhbCBbd2luZm8gdG9wbGV2ZWwgJGN1cl0gJGN1cl19IHsNCQljb250aW51ZQ0JICAgIH0NCSAgICBzZXQgcGFyZW50ICRjdXINCSAgICBzZXQgY2hpbGRyZW4gW3dpbmZvIGNoaWxkcmVuICRwYXJlbnRdDQkgICAgc2V0IGkgW2xsZW5ndGggJGNoaWxkcmVuXQ0JfQ0Jc2V0IGN1ciAkcGFyZW50DQlpZiB7W3N0cmluZyBlcXVhbCAkdyAkY3VyXSB8fCBbdGtGb2N1c09LICRjdXJdfSB7DQkgICAgcmV0dXJuICRjdXINCX0NICAgIH0NfQ0NIyB0a0ZvY3VzT0sgLS0NIw0jIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgdG8gZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIGZvY3VzIG9uDSMgYSBnaXZlbiB3aW5kb3cuICBJdCByZXR1cm5zIDEgaWYgaXQncyBPSyB0byBmb2N1cyBvbiB0aGUgd2luZG93LA0jIDAgaWYgaXQncyBub3QgT0suICBUaGUgY29kZSBmaXJzdCBjaGVja3Mgd2hldGhlciB0aGUgd2luZG93IGlzDSMgdmlld2FibGUuICBJZiBub3QsIHRoZW4gaXQgbmV2ZXIgZm9jdXNlcyBvbiB0aGUgd2luZG93LiAgVGhlbiBpdA0jIGNoZWNrcyB0aGUgLXRha2Vmb2N1cyBvcHRpb24gZm9yIHRoZSB3aW5kb3cgYW5kIHVzZXMgaXQgaWYgaXQncw0jIHNldC4gIElmIHRoZXJlJ3Mgbm8gLXRha2Vmb2N1cyBvcHRpb24sIHRoZSBwcm9jZWR1cmUgY2hlY2tzIHRvDSMgc2VlIGlmIChhKSB0aGUgd2lkZ2V0IGlzbid0IGRpc2FibGVkLCBhbmQgKGIpIGl0IGhhcyBzb21lIGtleQ0jIGJpbmRpbmdzLiAgSWYgYWxsIG9mIHRoZXNlIGFyZSB0cnVlLCB0aGVuIDEgaXMgcmV0dXJuZWQuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlOYW1lIG9mIGEgd2luZG93Lg0NcHJvYyB0a0ZvY3VzT0sgdyB7DSAgICBzZXQgY29kZSBbY2F0Y2ggeyR3IGNnZXQgLXRha2Vmb2N1c30gdmFsdWVdDSAgICBpZiB7KCRjb2RlID09IDApICYmICgkdmFsdWUgIT0gIiIpfSB7DQlpZiB7JHZhbHVlID09IDB9IHsNCSAgICByZXR1cm4gMA0JfSBlbHNlaWYgeyR2YWx1ZSA9PSAxfSB7DQkgICAgcmV0dXJuIFt3aW5mbyB2aWV3YWJsZSAkd10NCX0gZWxzZSB7DQkgICAgc2V0IHZhbHVlIFt1cGxldmVsICMwICR2YWx1ZSBbbGlzdCAkd11dDQkgICAgaWYgeyR2YWx1ZSAhPSAiIn0gew0JCXJldHVybiAkdmFsdWUNCSAgICB9DQl9DSAgICB9DSAgICBpZiB7IVt3aW5mbyB2aWV3YWJsZSAkd119IHsNCXJldHVybiAwDSAgICB9DSAgICBzZXQgY29kZSBbY2F0Y2ggeyR3IGNnZXQgLXN0YXRlfSB2YWx1ZV0NICAgIGlmIHsoJGNvZGUgPT0gMCkgJiYgW3N0cmluZyBlcXVhbCAkdmFsdWUgImRpc2FibGVkIl19IHsNCXJldHVybiAwDSAgICB9DSAgICByZWdleHAgS2V5fEZvY3VzICJbYmluZCAkd10gW2JpbmQgW3dpbmZvIGNsYXNzICR3XV0iDX0NDSMgdGtfZm9jdXNGb2xsb3dzTW91c2UgLS0NIw0jIElmIHRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQsIFRrIHdpbGwgZW50ZXIgImZvY3VzLWZvbGxvd3MtbW91c2UiDSMgbW9kZSwgd2hlcmUgdGhlIGZvY3VzIGlzIGFsd2F5cyBvbiB3aGF0ZXZlciB3aW5kb3cgY29udGFpbnMgdGhlDSMgbW91c2UuICBJZiB0aGlzIHByb2NlZHVyZSBpc24ndCBpbnZva2VkLCB0aGVuIHRoZSB1c2VyIHR5cGljYWxseQ0jIGhhcyB0byBjbGljayBvbiBhIHdpbmRvdyB0byBnaXZlIGl0IHRoZSBmb2N1cy4NIw0jIEFyZ3VtZW50czoNIyBOb25lLg0NcHJvYyB0a19mb2N1c0ZvbGxvd3NNb3VzZSB7fSB7DSAgICBzZXQgb2xkIFtiaW5kIGFsbCA8RW50ZXI+XQ0gICAgc2V0IHNjcmlwdCB7DQlpZiB7W3N0cmluZyBlcXVhbCAiJWQiICJOb3RpZnlBbmNlc3RvciJdIFwNCQl8fCBbc3RyaW5nIGVxdWFsICIlZCIgIk5vdGlmeU5vbmxpbmVhciJdIFwNCQl8fCBbc3RyaW5nIGVxdWFsICIlZCIgIk5vdGlmeUluZmVyaW9yIl19IHsNCSAgICBpZiB7W3RrRm9jdXNPSyAlV119IHsNCQlmb2N1cyAlVw0JICAgIH0NCX0NICAgIH0NICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJG9sZCAiIl19IHsNCWJpbmQgYWxsIDxFbnRlcj4gIiRvbGQ7ICRzY3JpcHQiDSAgICB9IGVsc2Ugew0JYmluZCBhbGwgPEVudGVyPiAkc2NyaXB0DSAgICB9DX0NAAA0wyMgbGlzdGJveC50Y2wgLS0NIw0jIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBkZWZhdWx0IGJpbmRpbmdzIGZvciBUayBsaXN0Ym94IHdpZGdldHMNIyBhbmQgcHJvdmlkZXMgcHJvY2VkdXJlcyB0aGF0IGhlbHAgaW4gaW1wbGVtZW50aW5nIHRob3NlIGJpbmRpbmdzLg0jDSMgUkNTOiBAKCMpICRJZDogbGlzdGJveC50Y2wsdiAxLjExIDIwMDAvMDMvMjQgMTk6Mzg6NTcgZXJpY20gRXhwICQNIw0jIENvcHlyaWdodCAoYykgMTk5NCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLg0jIENvcHlyaWdodCAoYykgMTk5NC0xOTk1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4NIyBDb3B5cmlnaHQgKGMpIDE5OTggYnkgU2NyaXB0aWNzIENvcnBvcmF0aW9uLg0jDSMgU2VlIHRoZSBmaWxlICJsaWNlbnNlLnRlcm1zIiBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIHJlZGlzdHJpYnV0aW9uDSMgb2YgdGhpcyBmaWxlLCBhbmQgZm9yIGEgRElTQ0xBSU1FUiBPRiBBTEwgV0FSUkFOVElFUy4NDSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0jIHRrUHJpdiBlbGVtZW50cyB1c2VkIGluIHRoaXMgZmlsZToNIw0jIGFmdGVySWQgLQkJVG9rZW4gcmV0dXJuZWQgYnkgImFmdGVyIiBmb3IgYXV0b3NjYW5uaW5nLg0jIGxpc3Rib3hQcmV2IC0JCVRoZSBsYXN0IGVsZW1lbnQgdG8gYmUgc2VsZWN0ZWQgb3IgZGVzZWxlY3RlZA0jCQkJZHVyaW5nIGEgc2VsZWN0aW9uIG9wZXJhdGlvbi4NIyBsaXN0Ym94U2VsZWN0aW9uIC0JQWxsIG9mIHRoZSBpdGVtcyB0aGF0IHdlcmUgc2VsZWN0ZWQgYmVmb3JlIHRoZQ0jCQkJY3VycmVudCBzZWxlY3Rpb24gb3BlcmF0aW9uIChzdWNoIGFzIGEgbW91c2UNIwkJCWRyYWcpIHN0YXJ0ZWQ7ICB1c2VkIHRvIGNhbmNlbCBhbiBvcGVyYXRpb24uDSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0NIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NIyBUaGUgY29kZSBiZWxvdyBjcmVhdGVzIHRoZSBkZWZhdWx0IGNsYXNzIGJpbmRpbmdzIGZvciBsaXN0Ym94ZXMuDSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQ0jIE5vdGU6IHRoZSBjaGVjayBmb3IgZXhpc3RlbmNlIG9mICVXIGJlbG93IGlzIGJlY2F1c2UgdGhpcyBiaW5kaW5nDSMgaXMgc29tZXRpbWVzIGludm9rZWQgYWZ0ZXIgYSB3aW5kb3cgaGFzIGJlZW4gZGVsZXRlZCAoZS5nLiBiZWNhdXNlDSMgdGhlcmUgaXMgYSBkb3VibGUtY2xpY2sgYmluZGluZyBvbiB0aGUgd2lkZ2V0IHRoYXQgZGVsZXRlcyBpdCkuICBVc2Vycw0jIGNhbiBwdXQgImJyZWFrInMgaW4gdGhlaXIgYmluZGluZ3MgdG8gYXZvaWQgdGhlIGVycm9yLCBidXQgdGhpcyBjaGVjaw0jIG1ha2VzIHRoYXQgdW5uZWNlc3NhcnkuDQ1iaW5kIExpc3Rib3ggPDE+IHsNICAgIGlmIHtbd2luZm8gZXhpc3RzICVXXX0gew0JdGtMaXN0Ym94QmVnaW5TZWxlY3QgJVcgWyVXIGluZGV4IEAleCwleV0NICAgIH0NfQ0NIyBJZ25vcmUgZG91YmxlIGNsaWNrcyBzbyB0aGF0IHVzZXJzIGNhbiBkZWZpbmUgdGhlaXIgb3duIGJlaGF2aW9ycy4NIyBBbW9uZyBvdGhlciB0aGluZ3MsIHRoaXMgcHJldmVudHMgZXJyb3JzIGlmIHRoZSB1c2VyIGRlbGV0ZXMgdGhlDSMgbGlzdGJveCBvbiBhIGRvdWJsZSBjbGljay4NDWJpbmQgTGlzdGJveCA8RG91YmxlLTE+IHsNICAgICMgRW1wdHkgc2NyaXB0DX0NDWJpbmQgTGlzdGJveCA8QjEtTW90aW9uPiB7DSAgICBzZXQgdGtQcml2KHgpICV4DSAgICBzZXQgdGtQcml2KHkpICV5DSAgICB0a0xpc3Rib3hNb3Rpb24gJVcgWyVXIGluZGV4IEAleCwleV0NfQ1iaW5kIExpc3Rib3ggPEJ1dHRvblJlbGVhc2UtMT4gew0gICAgdGtDYW5jZWxSZXBlYXQNICAgICVXIGFjdGl2YXRlIEAleCwleQ19DWJpbmQgTGlzdGJveCA8U2hpZnQtMT4gew0gICAgdGtMaXN0Ym94QmVnaW5FeHRlbmQgJVcgWyVXIGluZGV4IEAleCwleV0NfQ1iaW5kIExpc3Rib3ggPENvbnRyb2wtMT4gew0gICAgdGtMaXN0Ym94QmVnaW5Ub2dnbGUgJVcgWyVXIGluZGV4IEAleCwleV0NfQ1iaW5kIExpc3Rib3ggPEIxLUxlYXZlPiB7DSAgICBzZXQgdGtQcml2KHgpICV4DSAgICBzZXQgdGtQcml2KHkpICV5DSAgICB0a0xpc3Rib3hBdXRvU2NhbiAlVw19DWJpbmQgTGlzdGJveCA8QjEtRW50ZXI+IHsNICAgIHRrQ2FuY2VsUmVwZWF0DX0NDWJpbmQgTGlzdGJveCA8VXA+IHsNICAgIHRrTGlzdGJveFVwRG93biAlVyAtMQ19DWJpbmQgTGlzdGJveCA8U2hpZnQtVXA+IHsNICAgIHRrTGlzdGJveEV4dGVuZFVwRG93biAlVyAtMQ19DWJpbmQgTGlzdGJveCA8RG93bj4gew0gICAgdGtMaXN0Ym94VXBEb3duICVXIDENfQ1iaW5kIExpc3Rib3ggPFNoaWZ0LURvd24+IHsNICAgIHRrTGlzdGJveEV4dGVuZFVwRG93biAlVyAxDX0NYmluZCBMaXN0Ym94IDxMZWZ0PiB7DSAgICAlVyB4dmlldyBzY3JvbGwgLTEgdW5pdHMNfQ1iaW5kIExpc3Rib3ggPENvbnRyb2wtTGVmdD4gew0gICAgJVcgeHZpZXcgc2Nyb2xsIC0xIHBhZ2VzDX0NYmluZCBMaXN0Ym94IDxSaWdodD4gew0gICAgJVcgeHZpZXcgc2Nyb2xsIDEgdW5pdHMNfQ1iaW5kIExpc3Rib3ggPENvbnRyb2wtUmlnaHQ+IHsNICAgICVXIHh2aWV3IHNjcm9sbCAxIHBhZ2VzDX0NYmluZCBMaXN0Ym94IDxQcmlvcj4gew0gICAgJVcgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzDSAgICAlVyBhY3RpdmF0ZSBAMCwwDX0NYmluZCBMaXN0Ym94IDxOZXh0PiB7DSAgICAlVyB5dmlldyBzY3JvbGwgMSBwYWdlcw0gICAgJVcgYWN0aXZhdGUgQDAsMA19DWJpbmQgTGlzdGJveCA8Q29udHJvbC1Qcmlvcj4gew0gICAgJVcgeHZpZXcgc2Nyb2xsIC0xIHBhZ2VzDX0NYmluZCBMaXN0Ym94IDxDb250cm9sLU5leHQ+IHsNICAgICVXIHh2aWV3IHNjcm9sbCAxIHBhZ2VzDX0NYmluZCBMaXN0Ym94IDxIb21lPiB7DSAgICAlVyB4dmlldyBtb3ZldG8gMA19DWJpbmQgTGlzdGJveCA8RW5kPiB7DSAgICAlVyB4dmlldyBtb3ZldG8gMQ19DWJpbmQgTGlzdGJveCA8Q29udHJvbC1Ib21lPiB7DSAgICAlVyBhY3RpdmF0ZSAwDSAgICAlVyBzZWUgMA0gICAgJVcgc2VsZWN0aW9uIGNsZWFyIDAgZW5kDSAgICAlVyBzZWxlY3Rpb24gc2V0IDANICAgIGV2ZW50IGdlbmVyYXRlICVXIDw8TGlzdGJveFNlbGVjdD4+DX0NYmluZCBMaXN0Ym94IDxTaGlmdC1Db250cm9sLUhvbWU+IHsNICAgIHRrTGlzdGJveERhdGFFeHRlbmQgJVcgMA19DWJpbmQgTGlzdGJveCA8Q29udHJvbC1FbmQ+IHsNICAgICVXIGFjdGl2YXRlIGVuZA0gICAgJVcgc2VlIGVuZA0gICAgJVcgc2VsZWN0aW9uIGNsZWFyIDAgZW5kDSAgICAlVyBzZWxlY3Rpb24gc2V0IGVuZA0gICAgZXZlbnQgZ2VuZXJhdGUgJVcgPDxMaXN0Ym94U2VsZWN0Pj4NfQ1iaW5kIExpc3Rib3ggPFNoaWZ0LUNvbnRyb2wtRW5kPiB7DSAgICB0a0xpc3Rib3hEYXRhRXh0ZW5kICVXIFslVyBpbmRleCBlbmRdDX0NYmluZCBMaXN0Ym94IDw8Q29weT4+IHsNICAgIGlmIHtbc3RyaW5nIGVxdWFsIFtzZWxlY3Rpb24gb3duIC1kaXNwbGF5b2YgJVddICIlVyJdfSB7DQljbGlwYm9hcmQgY2xlYXIgLWRpc3BsYXlvZiAlVw0JY2xpcGJvYXJkIGFwcGVuZCAtZGlzcGxheW9mICVXIFtzZWxlY3Rpb24gZ2V0IC1kaXNwbGF5b2YgJVddDSAgICB9DX0NYmluZCBMaXN0Ym94IDxzcGFjZT4gew0gICAgdGtMaXN0Ym94QmVnaW5TZWxlY3QgJVcgWyVXIGluZGV4IGFjdGl2ZV0NfQ1iaW5kIExpc3Rib3ggPFNlbGVjdD4gew0gICAgdGtMaXN0Ym94QmVnaW5TZWxlY3QgJVcgWyVXIGluZGV4IGFjdGl2ZV0NfQ1iaW5kIExpc3Rib3ggPENvbnRyb2wtU2hpZnQtc3BhY2U+IHsNICAgIHRrTGlzdGJveEJlZ2luRXh0ZW5kICVXIFslVyBpbmRleCBhY3RpdmVdDX0NYmluZCBMaXN0Ym94IDxTaGlmdC1TZWxlY3Q+IHsNICAgIHRrTGlzdGJveEJlZ2luRXh0ZW5kICVXIFslVyBpbmRleCBhY3RpdmVdDX0NYmluZCBMaXN0Ym94IDxFc2NhcGU+IHsNICAgIHRrTGlzdGJveENhbmNlbCAlVw19DWJpbmQgTGlzdGJveCA8Q29udHJvbC1zbGFzaD4gew0gICAgdGtMaXN0Ym94U2VsZWN0QWxsICVXDX0NYmluZCBMaXN0Ym94IDxDb250cm9sLWJhY2tzbGFzaD4gew0gICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJVcgY2dldCAtc2VsZWN0bW9kZV0gImJyb3dzZSJdfSB7DQklVyBzZWxlY3Rpb24gY2xlYXIgMCBlbmQNCWV2ZW50IGdlbmVyYXRlICVXIDw8TGlzdGJveFNlbGVjdD4+DSAgICB9DX0NDSMgQWRkaXRpb25hbCBUayBiaW5kaW5ncyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBNb3RpZiBsb29rIGFuZCBmZWVsOg0NYmluZCBMaXN0Ym94IDwyPiB7DSAgICAlVyBzY2FuIG1hcmsgJXggJXkNfQ1iaW5kIExpc3Rib3ggPEIyLU1vdGlvbj4gew0gICAgJVcgc2NhbiBkcmFndG8gJXggJXkNfQ0NIyBUaGUgTW91c2VXaGVlbCB3aWxsIHR5cGljYWxseSBvbmx5IGZpcmUgb24gV2luZG93cy4gIEhvd2V2ZXIsDSMgc29tZW9uZSBjb3VsZCB1c2UgdGhlICJldmVudCBnZW5lcmF0ZSIgY29tbWFuZCB0byBwcm9kdWNlIG9uZQ0jIG9uIG90aGVyIHBsYXRmb3Jtcy4NDWJpbmQgTGlzdGJveCA8TW91c2VXaGVlbD4gew0gICAgJVcgeXZpZXcgc2Nyb2xsIFtleHByIHstICglRCAvIDEyMCkgKiA0fV0gdW5pdHMNfQ0NaWYge1tzdHJpbmcgZXF1YWwgInVuaXgiICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pXX0gew0gICAgIyBTdXBwb3J0IGZvciBtb3VzZXdoZWVscyBvbiBMaW51eC9Vbml4IGNvbW1vbmx5IGNvbWVzIHRocm91Z2ggbWFwcGluZw0gICAgIyB0aGUgd2hlZWwgdG8gdGhlIGV4dGVuZGVkIGJ1dHRvbnMuICBJZiB5b3UgaGF2ZSBhIG1vdXNld2hlZWwsIGZpbmQNICAgICMgTGludXggY29uZmlndXJhdGlvbiBpbmZvIGF0Og0gICAgIwlodHRwOi8vd3d3LmlucmlhLmZyL2tvYWxhL2NvbGFzL21vdXNlLXdoZWVsLXNjcm9sbC8NICAgIGJpbmQgTGlzdGJveCA8ND4gew0JaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsNCSAgICAlVyB5dmlldyBzY3JvbGwgLTUgdW5pdHMNCX0NICAgIH0NICAgIGJpbmQgTGlzdGJveCA8NT4gew0JaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsNCSAgICAlVyB5dmlldyBzY3JvbGwgNSB1bml0cw0JfQ0gICAgfQ19DQ0jIHRrTGlzdGJveEJlZ2luU2VsZWN0IC0tDSMNIyBUaGlzIHByb2NlZHVyZSBpcyB0eXBpY2FsbHkgaW52b2tlZCBvbiBidXR0b24tMSBwcmVzc2VzLiAgSXQgYmVnaW5zDSMgdGhlIHByb2Nlc3Mgb2YgbWFraW5nIGEgc2VsZWN0aW9uIGluIHRoZSBsaXN0Ym94LiAgSXRzIGV4YWN0IGJlaGF2aW9yDSMgZGVwZW5kcyBvbiB0aGUgc2VsZWN0aW9uIG1vZGUgY3VycmVudGx5IGluIGVmZmVjdCBmb3IgdGhlIGxpc3Rib3g7DSMgc2VlIHRoZSBNb3RpZiBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIGxpc3Rib3ggd2lkZ2V0Lg0jIGVsIC0JCVRoZSBlbGVtZW50IGZvciB0aGUgc2VsZWN0aW9uIG9wZXJhdGlvbiAodHlwaWNhbGx5IHRoZQ0jCQlvbmUgdW5kZXIgdGhlIHBvaW50ZXIpLiAgTXVzdCBiZSBpbiBudW1lcmljYWwgZm9ybS4NDXByb2MgdGtMaXN0Ym94QmVnaW5TZWxlY3Qge3cgZWx9IHsNICAgIGdsb2JhbCB0a1ByaXYNICAgIGlmIHtbc3RyaW5nIGVxdWFsIFskdyBjZ2V0IC1zZWxlY3Rtb2RlXSAibXVsdGlwbGUiXX0gew0JaWYge1skdyBzZWxlY3Rpb24gaW5jbHVkZXMgJGVsXX0gew0JICAgICR3IHNlbGVjdGlvbiBjbGVhciAkZWwNCX0gZWxzZSB7DQkgICAgJHcgc2VsZWN0aW9uIHNldCAkZWwNCX0NICAgIH0gZWxzZSB7DQkkdyBzZWxlY3Rpb24gY2xlYXIgMCBlbmQNCSR3IHNlbGVjdGlvbiBzZXQgJGVsDQkkdyBzZWxlY3Rpb24gYW5jaG9yICRlbA0Jc2V0IHRrUHJpdihsaXN0Ym94U2VsZWN0aW9uKSB7fQ0Jc2V0IHRrUHJpdihsaXN0Ym94UHJldikgJGVsDSAgICB9DSAgICBldmVudCBnZW5lcmF0ZSAkdyA8PExpc3Rib3hTZWxlY3Q+Pg19DQ0jIHRrTGlzdGJveE1vdGlvbiAtLQ0jDSMgVGhpcyBwcm9jZWR1cmUgaXMgY2FsbGVkIHRvIHByb2Nlc3MgbW91c2UgbW90aW9uIGV2ZW50cyB3aGlsZQ0jIGJ1dHRvbiAxIGlzIGRvd24uICBJdCBtYXkgbW92ZSBvciBleHRlbmQgdGhlIHNlbGVjdGlvbiwgZGVwZW5kaW5nDSMgb24gdGhlIGxpc3Rib3gncyBzZWxlY3Rpb24gbW9kZS4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSBsaXN0Ym94IHdpZGdldC4NIyBlbCAtCQlUaGUgZWxlbWVudCB1bmRlciB0aGUgcG9pbnRlciAobXVzdCBiZSBhIG51bWJlcikuDQ1wcm9jIHRrTGlzdGJveE1vdGlvbiB7dyBlbH0gew0gICAgZ2xvYmFsIHRrUHJpdg0gICAgaWYgeyRlbCA9PSAkdGtQcml2KGxpc3Rib3hQcmV2KX0gew0JcmV0dXJuDSAgICB9DSAgICBzZXQgYW5jaG9yIFskdyBpbmRleCBhbmNob3JdDSAgICBzd2l0Y2ggWyR3IGNnZXQgLXNlbGVjdG1vZGVdIHsNCWJyb3dzZSB7DQkgICAgJHcgc2VsZWN0aW9uIGNsZWFyIDAgZW5kDQkgICAgJHcgc2VsZWN0aW9uIHNldCAkZWwNCSAgICBzZXQgdGtQcml2KGxpc3Rib3hQcmV2KSAkZWwNCSAgICBldmVudCBnZW5lcmF0ZSAkdyA8PExpc3Rib3hTZWxlY3Q+Pg0JfQ0JZXh0ZW5kZWQgew0JICAgIHNldCBpICR0a1ByaXYobGlzdGJveFByZXYpDQkgICAgaWYge1tzdHJpbmcgZXF1YWwge30gJGldfSB7DQkJc2V0IGkgJGVsDQkJJHcgc2VsZWN0aW9uIHNldCAkZWwNCSAgICB9DQkgICAgaWYge1skdyBzZWxlY3Rpb24gaW5jbHVkZXMgYW5jaG9yXX0gew0JCSR3IHNlbGVjdGlvbiBjbGVhciAkaSAkZWwNCQkkdyBzZWxlY3Rpb24gc2V0IGFuY2hvciAkZWwNCSAgICB9IGVsc2Ugew0JCSR3IHNlbGVjdGlvbiBjbGVhciAkaSAkZWwNCQkkdyBzZWxlY3Rpb24gY2xlYXIgYW5jaG9yICRlbA0JICAgIH0NCSAgICBpZiB7IVtpbmZvIGV4aXN0cyB0a1ByaXYobGlzdGJveFNlbGVjdGlvbildfSB7DQkJc2V0IHRrUHJpdihsaXN0Ym94U2VsZWN0aW9uKSBbJHcgY3Vyc2VsZWN0aW9uXQ0JICAgIH0NCSAgICB3aGlsZSB7KCRpIDwgJGVsKSAmJiAoJGkgPCAkYW5jaG9yKX0gew0JCWlmIHtbbHNlYXJjaCAkdGtQcml2KGxpc3Rib3hTZWxlY3Rpb24pICRpXSA+PSAwfSB7DQkJICAgICR3IHNlbGVjdGlvbiBzZXQgJGkNCQl9DQkJaW5jciBpDQkgICAgfQ0JICAgIHdoaWxlIHsoJGkgPiAkZWwpICYmICgkaSA+ICRhbmNob3IpfSB7DQkJaWYge1tsc2VhcmNoICR0a1ByaXYobGlzdGJveFNlbGVjdGlvbikgJGldID49IDB9IHsNCQkgICAgJHcgc2VsZWN0aW9uIHNldCAkaQ0JCX0NCQlpbmNyIGkgLTENCSAgICB9DQkgICAgc2V0IHRrUHJpdihsaXN0Ym94UHJldikgJGVsDQkgICAgZXZlbnQgZ2VuZXJhdGUgJHcgPDxMaXN0Ym94U2VsZWN0Pj4NCX0NICAgIH0NfQ0NIyB0a0xpc3Rib3hCZWdpbkV4dGVuZCAtLQ0jDSMgVGhpcyBwcm9jZWR1cmUgaXMgdHlwaWNhbGx5IGludm9rZWQgb24gc2hpZnQtYnV0dG9uLTEgcHJlc3Nlcy4gIEl0DSMgYmVnaW5zIHRoZSBwcm9jZXNzIG9mIGV4dGVuZGluZyBhIHNlbGVjdGlvbiBpbiB0aGUgbGlzdGJveC4gIEl0cw0jIGV4YWN0IGJlaGF2aW9yIGRlcGVuZHMgb24gdGhlIHNlbGVjdGlvbiBtb2RlIGN1cnJlbnRseSBpbiBlZmZlY3QNIyBmb3IgdGhlIGxpc3Rib3g7ICBzZWUgdGhlIE1vdGlmIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgbGlzdGJveCB3aWRnZXQuDSMgZWwgLQkJVGhlIGVsZW1lbnQgZm9yIHRoZSBzZWxlY3Rpb24gb3BlcmF0aW9uICh0eXBpY2FsbHkgdGhlDSMJCW9uZSB1bmRlciB0aGUgcG9pbnRlcikuICBNdXN0IGJlIGluIG51bWVyaWNhbCBmb3JtLg0NcHJvYyB0a0xpc3Rib3hCZWdpbkV4dGVuZCB7dyBlbH0gew0gICAgaWYge1tzdHJpbmcgZXF1YWwgWyR3IGNnZXQgLXNlbGVjdG1vZGVdICJleHRlbmRlZCJdfSB7DQlpZiB7WyR3IHNlbGVjdGlvbiBpbmNsdWRlcyBhbmNob3JdfSB7DQkgICAgdGtMaXN0Ym94TW90aW9uICR3ICRlbA0JfSBlbHNlIHsNCSAgICAjIE5vIHNlbGVjdGlvbiB5ZXQ7IHNpbXVsYXRlIHRoZSBiZWdpbi1zZWxlY3Qgb3BlcmF0aW9uLg0JICAgIHRrTGlzdGJveEJlZ2luU2VsZWN0ICR3ICRlbA0JfQ0gICAgfQ19DQ0jIHRrTGlzdGJveEJlZ2luVG9nZ2xlIC0tDSMNIyBUaGlzIHByb2NlZHVyZSBpcyB0eXBpY2FsbHkgaW52b2tlZCBvbiBjb250cm9sLWJ1dHRvbi0xIHByZXNzZXMuICBJdA0jIGJlZ2lucyB0aGUgcHJvY2VzcyBvZiB0b2dnbGluZyBhIHNlbGVjdGlvbiBpbiB0aGUgbGlzdGJveC4gIEl0cw0jIGV4YWN0IGJlaGF2aW9yIGRlcGVuZHMgb24gdGhlIHNlbGVjdGlvbiBtb2RlIGN1cnJlbnRseSBpbiBlZmZlY3QNIyBmb3IgdGhlIGxpc3Rib3g7ICBzZWUgdGhlIE1vdGlmIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgbGlzdGJveCB3aWRnZXQuDSMgZWwgLQkJVGhlIGVsZW1lbnQgZm9yIHRoZSBzZWxlY3Rpb24gb3BlcmF0aW9uICh0eXBpY2FsbHkgdGhlDSMJCW9uZSB1bmRlciB0aGUgcG9pbnRlcikuICBNdXN0IGJlIGluIG51bWVyaWNhbCBmb3JtLg0NcHJvYyB0a0xpc3Rib3hCZWdpblRvZ2dsZSB7dyBlbH0gew0gICAgZ2xvYmFsIHRrUHJpdg0gICAgaWYge1tzdHJpbmcgZXF1YWwgWyR3IGNnZXQgLXNlbGVjdG1vZGVdICJleHRlbmRlZCJdfSB7DQlzZXQgdGtQcml2KGxpc3Rib3hTZWxlY3Rpb24pIFskdyBjdXJzZWxlY3Rpb25dDQlzZXQgdGtQcml2KGxpc3Rib3hQcmV2KSAkZWwNCSR3IHNlbGVjdGlvbiBhbmNob3IgJGVsDQlpZiB7WyR3IHNlbGVjdGlvbiBpbmNsdWRlcyAkZWxdfSB7DQkgICAgJHcgc2VsZWN0aW9uIGNsZWFyICRlbA0JfSBlbHNlIHsNCSAgICAkdyBzZWxlY3Rpb24gc2V0ICRlbA0JfQ0JZXZlbnQgZ2VuZXJhdGUgJHcgPDxMaXN0Ym94U2VsZWN0Pj4NICAgIH0NfQ0NIyB0a0xpc3Rib3hBdXRvU2NhbiAtLQ0jIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgd2hlbiB0aGUgbW91c2UgbGVhdmVzIGFuIGVudHJ5IHdpbmRvdw0jIHdpdGggYnV0dG9uIDEgZG93bi4gIEl0IHNjcm9sbHMgdGhlIHdpbmRvdyB1cCwgZG93biwgbGVmdCwgb3INIyByaWdodCwgZGVwZW5kaW5nIG9uIHdoZXJlIHRoZSBtb3VzZSBsZWZ0IHRoZSB3aW5kb3csIGFuZCByZXNjaGVkdWxlcw0jIGl0c2VsZiBhcyBhbiAiYWZ0ZXIiIGNvbW1hbmQgc28gdGhhdCB0aGUgd2luZG93IGNvbnRpbnVlcyB0byBzY3JvbGwgdW50aWwNIyB0aGUgbW91c2UgbW92ZXMgYmFjayBpbnRvIHRoZSB3aW5kb3cgb3IgdGhlIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZC4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSBlbnRyeSB3aW5kb3cuDQ1wcm9jIHRrTGlzdGJveEF1dG9TY2FuIHt3fSB7DSAgICBnbG9iYWwgdGtQcml2DSAgICBpZiB7IVt3aW5mbyBleGlzdHMgJHddfSByZXR1cm4NICAgIHNldCB4ICR0a1ByaXYoeCkNICAgIHNldCB5ICR0a1ByaXYoeSkNICAgIGlmIHskeSA+PSBbd2luZm8gaGVpZ2h0ICR3XX0gew0JJHcgeXZpZXcgc2Nyb2xsIDEgdW5pdHMNICAgIH0gZWxzZWlmIHskeSA8IDB9IHsNCSR3IHl2aWV3IHNjcm9sbCAtMSB1bml0cw0gICAgfSBlbHNlaWYgeyR4ID49IFt3aW5mbyB3aWR0aCAkd119IHsNCSR3IHh2aWV3IHNjcm9sbCAyIHVuaXRzDSAgICB9IGVsc2VpZiB7JHggPCAwfSB7DQkkdyB4dmlldyBzY3JvbGwgLTIgdW5pdHMNICAgIH0gZWxzZSB7DQlyZXR1cm4NICAgIH0NICAgIHRrTGlzdGJveE1vdGlvbiAkdyBbJHcgaW5kZXggQCR4LCR5XQ0gICAgc2V0IHRrUHJpdihhZnRlcklkKSBbYWZ0ZXIgNTAgW2xpc3QgdGtMaXN0Ym94QXV0b1NjYW4gJHddXQ19DQ0jIHRrTGlzdGJveFVwRG93biAtLQ0jDSMgTW92ZXMgdGhlIGxvY2F0aW9uIGN1cnNvciAoYWN0aXZlIGVsZW1lbnQpIHVwIG9yIGRvd24gYnkgb25lIGVsZW1lbnQsDSMgYW5kIGNoYW5nZXMgdGhlIHNlbGVjdGlvbiBpZiB3ZSdyZSBpbiBicm93c2Ugb3IgZXh0ZW5kZWQgc2VsZWN0aW9uDSMgbW9kZS4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSBsaXN0Ym94IHdpZGdldC4NIyBhbW91bnQgLQkrMSB0byBtb3ZlIGRvd24gb25lIGl0ZW0sIC0xIHRvIG1vdmUgYmFjayBvbmUgaXRlbS4NDXByb2MgdGtMaXN0Ym94VXBEb3duIHt3IGFtb3VudH0gew0gICAgZ2xvYmFsIHRrUHJpdg0gICAgJHcgYWN0aXZhdGUgW2V4cHIge1skdyBpbmRleCBhY3RpdmVdICsgJGFtb3VudH1dDSAgICAkdyBzZWUgYWN0aXZlDSAgICBzd2l0Y2ggWyR3IGNnZXQgLXNlbGVjdG1vZGVdIHsNCWJyb3dzZSB7DQkgICAgJHcgc2VsZWN0aW9uIGNsZWFyIDAgZW5kDQkgICAgJHcgc2VsZWN0aW9uIHNldCBhY3RpdmUNCSAgICBldmVudCBnZW5lcmF0ZSAkdyA8PExpc3Rib3hTZWxlY3Q+Pg0JfQ0JZXh0ZW5kZWQgew0JICAgICR3IHNlbGVjdGlvbiBjbGVhciAwIGVuZA0JICAgICR3IHNlbGVjdGlvbiBzZXQgYWN0aXZlDQkgICAgJHcgc2VsZWN0aW9uIGFuY2hvciBhY3RpdmUNCSAgICBzZXQgdGtQcml2KGxpc3Rib3hQcmV2KSBbJHcgaW5kZXggYWN0aXZlXQ0JICAgIHNldCB0a1ByaXYobGlzdGJveFNlbGVjdGlvbikge30NCSAgICBldmVudCBnZW5lcmF0ZSAkdyA8PExpc3Rib3hTZWxlY3Q+Pg0JfQ0gICAgfQ19DQ0jIHRrTGlzdGJveEV4dGVuZFVwRG93biAtLQ0jDSMgRG9lcyBub3RoaW5nIHVubGVzcyB3ZSdyZSBpbiBleHRlbmRlZCBzZWxlY3Rpb24gbW9kZTsgIGluIHRoaXMNIyBjYXNlIGl0IG1vdmVzIHRoZSBsb2NhdGlvbiBjdXJzb3IgKGFjdGl2ZSBlbGVtZW50KSB1cCBvciBkb3duIGJ5DSMgb25lIGVsZW1lbnQsIGFuZCBleHRlbmRzIHRoZSBzZWxlY3Rpb24gdG8gdGhhdCBwb2ludC4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSBsaXN0Ym94IHdpZGdldC4NIyBhbW91bnQgLQkrMSB0byBtb3ZlIGRvd24gb25lIGl0ZW0sIC0xIHRvIG1vdmUgYmFjayBvbmUgaXRlbS4NDXByb2MgdGtMaXN0Ym94RXh0ZW5kVXBEb3duIHt3IGFtb3VudH0gew0gICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJHcgY2dldCAtc2VsZWN0bW9kZV0gImV4dGVuZGVkIl19IHsNCXJldHVybg0gICAgfQ0gICAgc2V0IGFjdGl2ZSBbJHcgaW5kZXggYWN0aXZlXQ0gICAgaWYgeyFbaW5mbyBleGlzdHMgdGtQcml2KGxpc3Rib3hTZWxlY3Rpb24pXX0gew0JZ2xvYmFsIHRrUHJpdg0JJHcgc2VsZWN0aW9uIHNldCAkYWN0aXZlDQlzZXQgdGtQcml2KGxpc3Rib3hTZWxlY3Rpb24pIFskdyBjdXJzZWxlY3Rpb25dDSAgICB9DSAgICAkdyBhY3RpdmF0ZSBbZXhwciB7JGFjdGl2ZSArICRhbW91bnR9XQ0gICAgJHcgc2VlIGFjdGl2ZQ0gICAgdGtMaXN0Ym94TW90aW9uICR3IFskdyBpbmRleCBhY3RpdmVdDX0NDSMgdGtMaXN0Ym94RGF0YUV4dGVuZA0jDSMgVGhpcyBwcm9jZWR1cmUgaXMgY2FsbGVkIGZvciBrZXktcHJlc3NlcyBzdWNoIGFzIFNoaWZ0LUtFbmREYXRhLg0jIElmIHRoZSBzZWxlY3Rpb24gbW9kZSBpc24ndCBtdWx0aXBsZSBvciBleHRlbmQgdGhlbiBpdCBkb2VzIG5vdGhpbmcuDSMgT3RoZXJ3aXNlIGl0IG1vdmVzIHRoZSBhY3RpdmUgZWxlbWVudCB0byBlbCBhbmQsIGlmIHdlJ3JlIGluDSMgZXh0ZW5kZWQgbW9kZSwgZXh0ZW5kcyB0aGUgc2VsZWN0aW9uIHRvIHRoYXQgcG9pbnQuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgbGlzdGJveCB3aWRnZXQuDSMgZWwgLQkJQW4gaW50ZWdlciBlbGVtZW50IG51bWJlci4NDXByb2MgdGtMaXN0Ym94RGF0YUV4dGVuZCB7dyBlbH0gew0gICAgc2V0IG1vZGUgWyR3IGNnZXQgLXNlbGVjdG1vZGVdDSAgICBpZiB7W3N0cmluZyBlcXVhbCAkbW9kZSAiZXh0ZW5kZWQiXX0gew0JJHcgYWN0aXZhdGUgJGVsDQkkdyBzZWUgJGVsDSAgICAgICAgaWYge1skdyBzZWxlY3Rpb24gaW5jbHVkZXMgYW5jaG9yXX0gew0JICAgIHRrTGlzdGJveE1vdGlvbiAkdyAkZWwNCX0NICAgIH0gZWxzZWlmIHtbc3RyaW5nIGVxdWFsICRtb2RlICJtdWx0aXBsZSJdfSB7DQkkdyBhY3RpdmF0ZSAkZWwNCSR3IHNlZSAkZWwNICAgIH0NfQ0NIyB0a0xpc3Rib3hDYW5jZWwNIw0jIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgdG8gY2FuY2VsIGFuIGV4dGVuZGVkIHNlbGVjdGlvbiBpbg0jIHByb2dyZXNzLiAgSWYgdGhlcmUgaXMgYW4gZXh0ZW5kZWQgc2VsZWN0aW9uIGluIHByb2dyZXNzLCBpdA0jIHJlc3RvcmVzIGFsbCBvZiB0aGUgaXRlbXMgYmV0d2VlbiB0aGUgYWN0aXZlIG9uZSBhbmQgdGhlIGFuY2hvcg0jIHRvIHRoZWlyIHByZXZpb3VzIHNlbGVjdGlvbiBzdGF0ZS4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSBsaXN0Ym94IHdpZGdldC4NDXByb2MgdGtMaXN0Ym94Q2FuY2VsIHcgew0gICAgZ2xvYmFsIHRrUHJpdg0gICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJHcgY2dldCAtc2VsZWN0bW9kZV0gImV4dGVuZGVkIl19IHsNCXJldHVybg0gICAgfQ0gICAgc2V0IGZpcnN0IFskdyBpbmRleCBhbmNob3JdDSAgICBzZXQgbGFzdCAkdGtQcml2KGxpc3Rib3hQcmV2KQ0gICAgaWYgeyBbc3RyaW5nIGVxdWFsICRsYXN0ICIiXSB9IHsNCSMgTm90IGFjdHVhbGx5IGRvaW5nIGFueSBzZWxlY3Rpb24gcmlnaHQgbm93DQlyZXR1cm4NICAgIH0NICAgIGlmIHskZmlyc3QgPiAkbGFzdH0gew0Jc2V0IHRtcCAkZmlyc3QNCXNldCBmaXJzdCAkbGFzdA0Jc2V0IGxhc3QgJHRtcA0gICAgfQ0gICAgJHcgc2VsZWN0aW9uIGNsZWFyICRmaXJzdCAkbGFzdA0gICAgd2hpbGUgeyRmaXJzdCA8PSAkbGFzdH0gew0JaWYge1tsc2VhcmNoICR0a1ByaXYobGlzdGJveFNlbGVjdGlvbikgJGZpcnN0XSA+PSAwfSB7DQkgICAgJHcgc2VsZWN0aW9uIHNldCAkZmlyc3QNCX0NCWluY3IgZmlyc3QNICAgIH0NICAgIGV2ZW50IGdlbmVyYXRlICR3IDw8TGlzdGJveFNlbGVjdD4+DX0NDSMgdGtMaXN0Ym94U2VsZWN0QWxsDSMNIyBUaGlzIHByb2NlZHVyZSBpcyBpbnZva2VkIHRvIGhhbmRsZSB0aGUgInNlbGVjdCBhbGwiIG9wZXJhdGlvbi4NIyBGb3Igc2luZ2xlIGFuZCBicm93c2UgbW9kZSwgaXQganVzdCBzZWxlY3RzIHRoZSBhY3RpdmUgZWxlbWVudC4NIyBPdGhlcndpc2UgaXQgc2VsZWN0cyBldmVyeXRoaW5nIGluIHRoZSB3aWRnZXQuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgbGlzdGJveCB3aWRnZXQuDQ1wcm9jIHRrTGlzdGJveFNlbGVjdEFsbCB3IHsNICAgIHNldCBtb2RlIFskdyBjZ2V0IC1zZWxlY3Rtb2RlXQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgJG1vZGUgInNpbmdsZSJdIHx8IFtzdHJpbmcgZXF1YWwgJG1vZGUgImJyb3dzZSJdfSB7DQkkdyBzZWxlY3Rpb24gY2xlYXIgMCBlbmQNCSR3IHNlbGVjdGlvbiBzZXQgYWN0aXZlDSAgICB9IGVsc2Ugew0JJHcgc2VsZWN0aW9uIHNldCAwIGVuZA0gICAgfQ0gICAgZXZlbnQgZ2VuZXJhdGUgJHcgPDxMaXN0Ym94U2VsZWN0Pj4NfQ0AAI+cIyBtZW51LnRjbCAtLQ0jDSMgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGRlZmF1bHQgYmluZGluZ3MgZm9yIFRrIG1lbnVzIGFuZCBtZW51YnV0dG9ucy4NIyBJdCBhbHNvIGltcGxlbWVudHMga2V5Ym9hcmQgdHJhdmVyc2FsIG9mIG1lbnVzIGFuZCBpbXBsZW1lbnRzIGEgZmV3DSMgb3RoZXIgdXRpbGl0eSBwcm9jZWR1cmVzIHJlbGF0ZWQgdG8gbWVudXMuDSMNIyBSQ1M6IEAoIykgJElkOiBtZW51LnRjbCx2IDEuMTIgMjAwMC8wNC8xNyAxOTozMjowMCBlcmljbSBFeHAgJA0jDSMgQ29weXJpZ2h0IChjKSAxOTkyLTE5OTQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4NIyBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5NyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuDSMgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgYnkgU2NyaXB0aWNzIENvcnBvcmF0aW9uLg0jDSMgU2VlIHRoZSBmaWxlICJsaWNlbnNlLnRlcm1zIiBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIHJlZGlzdHJpYnV0aW9uDSMgb2YgdGhpcyBmaWxlLCBhbmQgZm9yIGEgRElTQ0xBSU1FUiBPRiBBTEwgV0FSUkFOVElFUy4NIw0NIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NIyBFbGVtZW50cyBvZiB0a1ByaXYgdGhhdCBhcmUgdXNlZCBpbiB0aGlzIGZpbGU6DSMNIyBjdXJzb3IgLQkJU2F2ZXMgdGhlIC1jdXJzb3Igb3B0aW9uIGZvciB0aGUgcG9zdGVkIG1lbnVidXR0b24uDSMgZm9jdXMgLQkJU2F2ZXMgdGhlIGZvY3VzIGR1cmluZyBhIG1lbnUgc2VsZWN0aW9uIG9wZXJhdGlvbi4NIwkJCUZvY3VzIGdldHMgcmVzdG9yZWQgaGVyZSB3aGVuIHRoZSBtZW51IGlzIHVucG9zdGVkLg0jIGdyYWJHbG9iYWwgLQkJVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRrUHJpdihvbGRHcmFiKTogIGlmDSMJCQl0a1ByaXYob2xkR3JhYikgaXMgbm9uLWVtcHR5LCB0aGVuIHRrUHJpdihncmFiR2xvYmFsKQ0jCQkJY29udGFpbnMgZWl0aGVyIGFuIGVtcHR5IHN0cmluZyBvciAiLWdsb2JhbCIgdG8NIwkJCWluZGljYXRlIHdoZXRoZXIgdGhlIG9sZCBncmFiIHdhcyBhIGxvY2FsIG9uZSBvcg0jCQkJYSBnbG9iYWwgb25lLg0jIGluTWVudWJ1dHRvbiAtCVRoZSBuYW1lIG9mIHRoZSBtZW51YnV0dG9uIHdpZGdldCBjb250YWluaW5nDSMJCQl0aGUgbW91c2UsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgbW91c2UgaXMNIwkJCW5vdCBvdmVyIGFueSBtZW51YnV0dG9uLg0jIG1lbnVCYXIgLQkJVGhlIG5hbWUgb2YgdGhlIG1lbnViYXIgdGhhdCBpcyB0aGUgcm9vdA0jCQkJb2YgdGhlIGNhc2NhZGUgaGllcmFyY2h5IHdoaWNoIGlzIGN1cnJlbnRseQ0jCQkJcG9zdGVkLiBUaGlzIGlzIG51bGwgd2hlbiB0aGVyZSBpcyBubyBtZW51IGN1cnJlbnRseQ0jCQkJYmVpbmcgcHVsbGVkIGRvd24gZnJvbSBhIG1lbnUgYmFyLg0jIG9sZEdyYWIgLQkJV2luZG93IHRoYXQgaGFkIHRoZSBncmFiIGJlZm9yZSBhIG1lbnUgd2FzIHBvc3RlZC4NIwkJCVVzZWQgdG8gcmVzdG9yZSB0aGUgZ3JhYiBzdGF0ZSBhZnRlciB0aGUgbWVudQ0jCQkJaXMgdW5wb3N0ZWQuICBFbXB0eSBzdHJpbmcgbWVhbnMgdGhlcmUgd2FzIG5vDSMJCQlncmFiIHByZXZpb3VzbHkgc2V0Lg0jIHBvcHVwIC0JCUlmIGEgbWVudSBoYXMgYmVlbiBwb3BwZWQgdXAgdmlhIHRrX3BvcHVwLCB0aGlzDSMJCQlnaXZlcyB0aGUgbmFtZSBvZiB0aGUgbWVudS4gIE90aGVyd2lzZSB0aGlzDSMJCQl2YWx1ZSBpcyBlbXB0eS4NIyBwb3N0ZWRNYiAtCQlOYW1lIG9mIHRoZSBtZW51YnV0dG9uIHdob3NlIG1lbnUgaXMgY3VycmVudGx5DSMJCQlwb3N0ZWQsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIGlzIHBvc3RlZA0jCQkJQSBncmFiIGlzIHNldCBvbiB0aGlzIHdpZGdldC4NIyByZWxpZWYgLQkJVXNlZCB0byBzYXZlIHRoZSBvcmlnaW5hbCByZWxpZWYgb2YgdGhlIGN1cnJlbnQNIwkJCW1lbnVidXR0b24uDSMgd2luZG93IC0JCVdoZW4gdGhlIG1vdXNlIGlzIG92ZXIgYSBtZW51LCB0aGlzIGhvbGRzIHRoZQ0jCQkJbmFtZSBvZiB0aGUgbWVudTsgIGl0J3MgY2xlYXJlZCB3aGVuIHRoZSBtb3VzZQ0jCQkJbGVhdmVzIHRoZSBtZW51Lg0jIHRlYXJvZmYgLQkJV2hldGhlciB0aGUgbGFzdCBtZW51IHBvc3RlZCB3YXMgYSB0ZWFyb2ZmIG9yIG5vdC4NIwkJCVRoaXMgaXMgdHJ1ZSBhbHdheXMgZm9yIHVuaXgsIGZvciB0ZWFyb2ZmcyBmb3IgTWFjDSMJCQlhbmQgV2luZG93cy4NIyBhY3RpdmVNZW51IC0JCVRoaXMgaXMgdGhlIGxhc3QgYWN0aXZlIG1lbnUgZm9yIHVzZQ0jCQkJd2l0aCB0aGUgPDxNZW51U2VsZWN0Pj4gdmlydHVhbCBldmVudC4NIyBhY3RpdmVJdGVtIC0JCVRoaXMgaXMgdGhlIGxhc3QgYWN0aXZlIG1lbnUgaXRlbSBmb3INIwkJCXVzZSB3aXRoIHRoZSA8PE1lbnVTZWxlY3Q+PiB2aXJ0dWFsIGV2ZW50Lg0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0NIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NIyBPdmVyYWxsIG5vdGU6DSMgVGhpcyBmaWxlIGlzIHRyaWNreSBiZWNhdXNlIHRoZXJlIGFyZSBmaXZlIGRpZmZlcmVudCB3YXlzIHRoYXQgbWVudXMNIyBjYW4gYmUgdXNlZDoNIw0jIDEuIEFzIGEgcHVsbGRvd24gZnJvbSBhIG1lbnVidXR0b24uIEluIHRoaXMgc3R5bGUsIHRoZSB2YXJpYWJsZSANIyAgICB0a1ByaXYocG9zdGVkTWIpIGlkZW50aWZpZXMgdGhlIHBvc3RlZCBtZW51YnV0dG9uLg0jIDIuIEFzIGEgdG9ybi1vZmYgbWVudSBjb3BpZWQgZnJvbSBzb21lIG90aGVyIG1lbnUuICBJbiB0aGlzIHN0eWxlDSMgICAgdGtQcml2KHBvc3RlZE1iKSBpcyBlbXB0eSwgYW5kIG1lbnUncyB0eXBlIGlzICJ0ZWFyb2ZmIi4NIyAzLiBBcyBhbiBvcHRpb24gbWVudSwgdHJpZ2dlcmVkIGZyb20gYW4gb3B0aW9uIG1lbnVidXR0b24uICBJbiB0aGlzDSMgICAgc3R5bGUgdGtQcml2KHBvc3RlZE1iKSBpZGVudGlmaWVzIHRoZSBwb3N0ZWQgbWVudWJ1dHRvbi4NIyA0LiBBcyBhIHBvcHVwIG1lbnUuICBJbiB0aGlzIHN0eWxlIHRrUHJpdihwb3N0ZWRNYikgaXMgZW1wdHkgYW5kDSMgICAgdGhlIHRvcC1sZXZlbCBtZW51J3MgdHlwZSBpcyAibm9ybWFsIi4NIyA1LiBBcyBhIHB1bGxkb3duIGZyb20gYSBtZW51YmFyLiBUaGUgdmFyaWFibGUgdGtQcml2KG1lbnViYXIpIGhhcw0jICAgIHRoZSBvd25pbmcgbWVudWJhciwgYW5kIHRoZSBtZW51IGl0c2VsZiBpcyBvZiB0eXBlICJub3JtYWwiLg0jDSMgVGhlIHZhcmlvdXMgYmluZGluZyBwcm9jZWR1cmVzIHVzZSB0aGUgIHN0YXRlIGRlc2NyaWJlZCBhYm92ZSB0bw0jIGRpc3Rpbmd1aXNoIHRoZSB2YXJpb3VzIGNhc2VzIGFuZCB0YWtlIGRpZmZlcmVudCBhY3Rpb25zIGluIGVhY2gNIyBjYXNlLg0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0NIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NIyBUaGUgY29kZSBiZWxvdyBjcmVhdGVzIHRoZSBkZWZhdWx0IGNsYXNzIGJpbmRpbmdzIGZvciBtZW51cw0jIGFuZCBtZW51YnV0dG9ucy4NIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NDWJpbmQgTWVudWJ1dHRvbiA8Rm9jdXNJbj4ge30NYmluZCBNZW51YnV0dG9uIDxFbnRlcj4gew0gICAgdGtNYkVudGVyICVXDX0NYmluZCBNZW51YnV0dG9uIDxMZWF2ZT4gew0gICAgdGtNYkxlYXZlICVXDX0NYmluZCBNZW51YnV0dG9uIDwxPiB7DSAgICBpZiB7W3N0cmluZyBjb21wYXJlICR0a1ByaXYoaW5NZW51YnV0dG9uKSAiIl19IHsNCXRrTWJQb3N0ICR0a1ByaXYoaW5NZW51YnV0dG9uKSAlWCAlWQ0gICAgfQ19DWJpbmQgTWVudWJ1dHRvbiA8TW90aW9uPiB7DSAgICB0a01iTW90aW9uICVXIHVwICVYICVZDX0NYmluZCBNZW51YnV0dG9uIDxCMS1Nb3Rpb24+IHsNICAgIHRrTWJNb3Rpb24gJVcgZG93biAlWCAlWQ19DWJpbmQgTWVudWJ1dHRvbiA8QnV0dG9uUmVsZWFzZS0xPiB7DSAgICB0a01iQnV0dG9uVXAgJVcNfQ1iaW5kIE1lbnVidXR0b24gPHNwYWNlPiB7DSAgICB0a01iUG9zdCAlVw0gICAgdGtNZW51Rmlyc3RFbnRyeSBbJVcgY2dldCAtbWVudV0NfQ0NIyBNdXN0IHNldCBmb2N1cyB3aGVuIG1vdXNlIGVudGVycyBhIG1lbnUsIGluIG9yZGVyIHRvIGFsbG93DSMgbWl4ZWQtbW9kZSBwcm9jZXNzaW5nIHVzaW5nIGJvdGggdGhlIG1vdXNlIGFuZCB0aGUga2V5Ym9hcmQuDSMgRG9uJ3Qgc2V0IHRoZSBmb2N1cyBpZiB0aGUgZXZlbnQgY29tZXMgZnJvbSBhIGdyYWIgcmVsZWFzZSwNIyB0aG91Z2g6ICBzdWNoIGFuIGV2ZW50IGNhbiBoYXBwZW4gYWZ0ZXIgYXMgcGFydCBvZiB1bnBvc3RpbmcNIyBhIGNhc2NhZGVkIGNoYWluIG9mIG1lbnVzLCBhZnRlciB0aGUgZm9jdXMgaGFzIGFscmVhZHkgYmVlbg0jIHJlc3RvcmVkIHRvIHdoZXJldmVyIGl0IHdhcyBiZWZvcmUgbWVudSBzZWxlY3Rpb24gc3RhcnRlZC4NDWJpbmQgTWVudSA8Rm9jdXNJbj4ge30NDWJpbmQgTWVudSA8RW50ZXI+IHsNICAgIHNldCB0a1ByaXYod2luZG93KSAlVw0gICAgaWYge1tzdHJpbmcgZXF1YWwgWyVXIGNnZXQgLXR5cGVdICJ0ZWFyb2ZmIl19IHsNCWlmIHtbc3RyaW5nIGNvbXBhcmUgIiVtIiAiTm90aWZ5VW5ncmFiIl19IHsNCSAgICBpZiB7W3N0cmluZyBlcXVhbCAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAidW5peCJdfSB7DQkJdGtfbWVudVNldEZvY3VzICVXDQkgICAgfQ0JfQ0gICAgfQ0gICAgdGtNZW51TW90aW9uICVXICV4ICV5ICVzDX0NDWJpbmQgTWVudSA8TGVhdmU+IHsNICAgIHRrTWVudUxlYXZlICVXICVYICVZICVzDX0NYmluZCBNZW51IDxNb3Rpb24+IHsNICAgIHRrTWVudU1vdGlvbiAlVyAleCAleSAlcw19DWJpbmQgTWVudSA8QnV0dG9uUHJlc3M+IHsNICAgIHRrTWVudUJ1dHRvbkRvd24gJVcNfQ1iaW5kIE1lbnUgPEJ1dHRvblJlbGVhc2U+IHsNICAgdGtNZW51SW52b2tlICVXIDENfQ1iaW5kIE1lbnUgPHNwYWNlPiB7DSAgICB0a01lbnVJbnZva2UgJVcgMA19DWJpbmQgTWVudSA8UmV0dXJuPiB7DSAgICB0a01lbnVJbnZva2UgJVcgMA19DWJpbmQgTWVudSA8RXNjYXBlPiB7DSAgICB0a01lbnVFc2NhcGUgJVcNfQ1iaW5kIE1lbnUgPExlZnQ+IHsNICAgIHRrTWVudUxlZnRBcnJvdyAlVw19DWJpbmQgTWVudSA8UmlnaHQ+IHsNICAgIHRrTWVudVJpZ2h0QXJyb3cgJVcNfQ1iaW5kIE1lbnUgPFVwPiB7DSAgICB0a01lbnVVcEFycm93ICVXDX0NYmluZCBNZW51IDxEb3duPiB7DSAgICB0a01lbnVEb3duQXJyb3cgJVcNfQ1iaW5kIE1lbnUgPEtleVByZXNzPiB7DSAgICB0a1RyYXZlcnNlV2l0aGluTWVudSAlVyAlQQ19DQ0jIFRoZSBmb2xsb3dpbmcgYmluZGluZ3MgYXBwbHkgdG8gYWxsIHdpbmRvd3MsIGFuZCBhcmUgdXNlZCB0bw0jIGltcGxlbWVudCBrZXlib2FyZCBtZW51IHRyYXZlcnNhbC4NDWlmIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJ1bml4Il19IHsNICAgIGJpbmQgYWxsIDxBbHQtS2V5UHJlc3M+IHsNCXRrVHJhdmVyc2VUb01lbnUgJVcgJUENICAgIH0NDSAgICBiaW5kIGFsbCA8RjEwPiB7DQl0a0ZpcnN0TWVudSAlVw0gICAgfQ19IGVsc2Ugew0gICAgYmluZCBNZW51YnV0dG9uIDxBbHQtS2V5UHJlc3M+IHsNCXRrVHJhdmVyc2VUb01lbnUgJVcgJUENICAgIH0NDSAgICBiaW5kIE1lbnVidXR0b24gPEYxMD4gew0JdGtGaXJzdE1lbnUgJVcNICAgIH0NfQ0NIyB0a01iRW50ZXIgLS0NIyBUaGlzIHByb2NlZHVyZSBpcyBpbnZva2VkIHdoZW4gdGhlIG1vdXNlIGVudGVycyBhIG1lbnVidXR0b24NIyB3aWRnZXQuICBJdCBhY3RpdmF0ZXMgdGhlIHdpZGdldCB1bmxlc3MgaXQgaXMgZGlzYWJsZWQuICBOb3RlOg0jIHRoaXMgcHJvY2VkdXJlIGlzIG9ubHkgaW52b2tlZCB3aGVuIG1vdXNlIGJ1dHRvbiAxIGlzICpub3QqIGRvd24uDSMgVGhlIHByb2NlZHVyZSB0a01iQjFFbnRlciBpcyBpbnZva2VkIGlmIHRoZSBidXR0b24gaXMgZG93bi4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCQlUaGUgIG5hbWUgb2YgdGhlIHdpZGdldC4NDXByb2MgdGtNYkVudGVyIHcgew0gICAgZ2xvYmFsIHRrUHJpdg0NICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJHRrUHJpdihpbk1lbnVidXR0b24pICIiXX0gew0JdGtNYkxlYXZlICR0a1ByaXYoaW5NZW51YnV0dG9uKQ0gICAgfQ0gICAgc2V0IHRrUHJpdihpbk1lbnVidXR0b24pICR3DSAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskdyBjZ2V0IC1zdGF0ZV0gImRpc2FibGVkIl19IHsNCSR3IGNvbmZpZ3VyZSAtc3RhdGUgYWN0aXZlDSAgICB9DX0NDSMgdGtNYkxlYXZlIC0tDSMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgYSBtZW51YnV0dG9uIHdpZGdldC4NIyBJdCBkZS1hY3RpdmF0ZXMgdGhlIHdpZGdldCwgaWYgdGhlIHdpZGdldCBzdGlsbCBleGlzdHMuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQkJVGhlICBuYW1lIG9mIHRoZSB3aWRnZXQuDQ1wcm9jIHRrTWJMZWF2ZSB3IHsNICAgIGdsb2JhbCB0a1ByaXYNDSAgICBzZXQgdGtQcml2KGluTWVudWJ1dHRvbikge30NICAgIGlmIHshW3dpbmZvIGV4aXN0cyAkd119IHsNCXJldHVybg0gICAgfQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgWyR3IGNnZXQgLXN0YXRlXSAiYWN0aXZlIl19IHsNCSR3IGNvbmZpZ3VyZSAtc3RhdGUgbm9ybWFsDSAgICB9DX0NDSMgdGtNYlBvc3QgLS0NIyBHaXZlbiBhIG1lbnVidXR0b24sIHRoaXMgcHJvY2VkdXJlIGRvZXMgYWxsIHRoZSB3b3JrIG9mIHBvc3RpbmcNIyBpdHMgYXNzb2NpYXRlZCBtZW51IGFuZCB1bnBvc3RpbmcgYW55IG90aGVyIG1lbnUgdGhhdCBpcyBjdXJyZW50bHkNIyBwb3N0ZWQuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQkJVGhlIG5hbWUgb2YgdGhlIG1lbnVidXR0b24gd2lkZ2V0IHdob3NlIG1lbnUNIwkJCWlzIHRvIGJlIHBvc3RlZC4NIyB4LCB5IC0JCVJvb3QgY29vcmRpbmF0ZXMgb2YgY3Vyc29yLCB1c2VkIGZvciBwb3NpdGlvbmluZw0jCQkJb3B0aW9uIG1lbnVzLiAgSWYgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgY2VudGVyDSMJCQlvZiB0aGUgbWVudWJ1dHRvbiBpcyB1c2VkIGZvciBhbiBvcHRpb24gbWVudS4NDXByb2MgdGtNYlBvc3Qge3cge3gge319IHt5IHt9fX0gew0gICAgZ2xvYmFsIHRrUHJpdiBlcnJvckluZm8NICAgIGdsb2JhbCB0Y2xfcGxhdGZvcm0NDSAgICBpZiB7W3N0cmluZyBlcXVhbCBbJHcgY2dldCAtc3RhdGVdICJkaXNhYmxlZCJdIHx8IFwNCSAgICBbc3RyaW5nIGVxdWFsICR3ICR0a1ByaXYocG9zdGVkTWIpXX0gew0JcmV0dXJuDSAgICB9DSAgICBzZXQgbWVudSBbJHcgY2dldCAtbWVudV0NICAgIGlmIHtbc3RyaW5nIGVxdWFsICRtZW51ICIiXX0gew0JcmV0dXJuDSAgICB9DSAgICBzZXQgdGVhcm9mZiBbZXhwciB7W3N0cmluZyBlcXVhbCAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAidW5peCJdIFwNCSAgICB8fCBbc3RyaW5nIGVxdWFsIFskbWVudSBjZ2V0IC10eXBlXSAidGVhcm9mZiJdfV0NICAgIGlmIHtbc3RyaW5nIGZpcnN0ICR3ICRtZW51XSAhPSAwfSB7DQllcnJvciAiY2FuJ3QgcG9zdCAkbWVudTogIGl0IGlzbid0IGEgZGVzY2VuZGFudCBvZiAkdyAodGhpcyBpcyBhIG5ldyByZXF1aXJlbWVudCBpbiBUayB2ZXJzaW9ucyAzLjAgYW5kIGxhdGVyKSINICAgIH0NICAgIHNldCBjdXIgJHRrUHJpdihwb3N0ZWRNYikNICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJGN1ciAiIl19IHsNCXRrTWVudVVucG9zdCB7fQ0gICAgfQ0gICAgc2V0IHRrUHJpdihjdXJzb3IpIFskdyBjZ2V0IC1jdXJzb3JdDSAgICBzZXQgdGtQcml2KHJlbGllZikgWyR3IGNnZXQgLXJlbGllZl0NICAgICR3IGNvbmZpZ3VyZSAtY3Vyc29yIGFycm93DSAgICAkdyBjb25maWd1cmUgLXJlbGllZiByYWlzZWQNDSAgICBzZXQgdGtQcml2KHBvc3RlZE1iKSAkdw0gICAgc2V0IHRrUHJpdihmb2N1cykgW2ZvY3VzXQ0gICAgJG1lbnUgYWN0aXZhdGUgbm9uZQ0gICAgdGtHZW5lcmF0ZU1lbnVTZWxlY3QgJG1lbnUNDSAgICAjIElmIHRoaXMgbG9va3MgbGlrZSBhbiBvcHRpb24gbWVudWJ1dHRvbiB0aGVuIHBvc3QgdGhlIG1lbnUgc28NICAgICMgdGhhdCB0aGUgY3VycmVudCBlbnRyeSBpcyBvbiB0b3Agb2YgdGhlIG1vdXNlLiAgT3RoZXJ3aXNlIHBvc3QNICAgICMgdGhlIG1lbnUganVzdCBiZWxvdyB0aGUgbWVudWJ1dHRvbiwgYXMgZm9yIGEgcHVsbC1kb3duLg0NICAgIHVwZGF0ZSBpZGxldGFza3MNICAgIGlmIHtbY2F0Y2ggew0Jc3dpdGNoIFskdyBjZ2V0IC1kaXJlY3Rpb25dIHsNICAgIAkgICAgYWJvdmUgew0gICAgCSAgICAJc2V0IHggW3dpbmZvIHJvb3R4ICR3XQ0gICAgCSAgICAJc2V0IHkgW2V4cHIge1t3aW5mbyByb290eSAkd10gLSBbd2luZm8gcmVxaGVpZ2h0ICRtZW51XX1dDSAgICAJICAgIAkkbWVudSBwb3N0ICR4ICR5DSAgICAJICAgIH0NICAgIAkgICAgYmVsb3cgew0gICAgCSAgICAJc2V0IHggW3dpbmZvIHJvb3R4ICR3XQ0gICAgCSAgICAJc2V0IHkgW2V4cHIge1t3aW5mbyByb290eSAkd10gKyBbd2luZm8gaGVpZ2h0ICR3XX1dDSAgICAJICAgIAkkbWVudSBwb3N0ICR4ICR5DSAgICAJICAgIH0NICAgIAkgICAgbGVmdCB7DSAgICAJICAgIAlzZXQgeCBbZXhwciB7W3dpbmZvIHJvb3R4ICR3XSAtIFt3aW5mbyByZXF3aWR0aCAkbWVudV19XQ0gICAgCSAgICAJc2V0IHkgW2V4cHIgeygyICogW3dpbmZvIHJvb3R5ICR3XSArIFt3aW5mbyBoZWlnaHQgJHddKSAvIDJ9XQ0gICAgCSAgICAJc2V0IGVudHJ5IFt0a01lbnVGaW5kTmFtZSAkbWVudSBbJHcgY2dldCAtdGV4dF1dDSAgICAJICAgIAlpZiB7WyR3IGNnZXQgLWluZGljYXRvcm9uXX0gew0JCSAgICBpZiB7JGVudHJ5ID09IFskbWVudSBpbmRleCBsYXN0XX0gew0JCSAgICAJaW5jciB5IFtleHByIHstKFskbWVudSB5cG9zaXRpb24gJGVudHJ5XSBcDQkJCSAgICAJKyBbd2luZm8gcmVxaGVpZ2h0ICRtZW51XSkvMn1dDQkJICAgIH0gZWxzZSB7DQkJICAgIAlpbmNyIHkgW2V4cHIgey0oWyRtZW51IHlwb3NpdGlvbiAkZW50cnldIFwNCQkJICAgICAgICArIFskbWVudSB5cG9zaXRpb24gW2V4cHIgeyRlbnRyeSsxfV1dKS8yfV0NCQkgICAgfQ0gICAgCSAgICAJfQ0gICAgCSAgICAJJG1lbnUgcG9zdCAkeCAkeQ0JCWlmIHtbc3RyaW5nIGNvbXBhcmUgJGVudHJ5IHt9XSAmJiBbc3RyaW5nIGNvbXBhcmUgWyRtZW51IGVudHJ5Y2dldCAkZW50cnkgLXN0YXRlXSAiZGlzYWJsZWQiXX0gew0gICAgCSAgICAJICAgICRtZW51IGFjdGl2YXRlICRlbnRyeQ0JCSAgICB0a0dlbmVyYXRlTWVudVNlbGVjdCAkbWVudQ0gICAgCSAgICAJfQ0gICAgCSAgICB9DSAgICAJICAgIHJpZ2h0IHsNICAgIAkgICAgCXNldCB4IFtleHByIHtbd2luZm8gcm9vdHggJHddICsgW3dpbmZvIHdpZHRoICR3XX1dDSAgICAJICAgIAlzZXQgeSBbZXhwciB7KDIgKiBbd2luZm8gcm9vdHkgJHddICsgW3dpbmZvIGhlaWdodCAkd10pIC8gMn1dDSAgICAJICAgIAlzZXQgZW50cnkgW3RrTWVudUZpbmROYW1lICRtZW51IFskdyBjZ2V0IC10ZXh0XV0NICAgIAkgICAgCWlmIHtbJHcgY2dldCAtaW5kaWNhdG9yb25dfSB7DQkJICAgIGlmIHskZW50cnkgPT0gWyRtZW51IGluZGV4IGxhc3RdfSB7DQkJICAgIAlpbmNyIHkgW2V4cHIgey0oWyRtZW51IHlwb3NpdGlvbiAkZW50cnldIFwNCQkJICAgIAkrIFt3aW5mbyByZXFoZWlnaHQgJG1lbnVdKS8yfV0NCQkgICAgfSBlbHNlIHsNCQkgICAgCWluY3IgeSBbZXhwciB7LShbJG1lbnUgeXBvc2l0aW9uICRlbnRyeV0gXA0JCQkgICAgICAgICsgWyRtZW51IHlwb3NpdGlvbiBbZXhwciB7JGVudHJ5KzF9XV0pLzJ9XQ0JCSAgICB9DSAgICAJICAgIAl9DSAgICAJICAgIAkkbWVudSBwb3N0ICR4ICR5DQkJaWYge1tzdHJpbmcgY29tcGFyZSAkZW50cnkge31dICYmIFtzdHJpbmcgY29tcGFyZSBbJG1lbnUgZW50cnljZ2V0ICRlbnRyeSAtc3RhdGVdICJkaXNhYmxlZCJdfSB7DSAgICAJICAgIAkgICAgJG1lbnUgYWN0aXZhdGUgJGVudHJ5DQkJICAgIHRrR2VuZXJhdGVNZW51U2VsZWN0ICRtZW51DSAgICAJICAgIAl9DSAgICAJICAgIH0NICAgIAkgICAgZGVmYXVsdCB7DSAgICAJICAgIAlpZiB7WyR3IGNnZXQgLWluZGljYXRvcm9uXX0gew0JCSAgICBpZiB7W3N0cmluZyBlcXVhbCAkeSB7fV19IHsNCQkJc2V0IHggW2V4cHIge1t3aW5mbyByb290eCAkd10gKyBbd2luZm8gd2lkdGggJHddLzJ9XQ0JCQlzZXQgeSBbZXhwciB7W3dpbmZvIHJvb3R5ICR3XSArIFt3aW5mbyBoZWlnaHQgJHddLzJ9XQ0JICAgIAkgICAgfQ0JICAgICAgICAgICAgdGtQb3N0T3ZlclBvaW50ICRtZW51ICR4ICR5IFt0a01lbnVGaW5kTmFtZSAkbWVudSBbJHcgY2dldCAtdGV4dF1dDQkJfSBlbHNlIHsNCSAgICAJICAgICRtZW51IHBvc3QgW3dpbmZvIHJvb3R4ICR3XSBbZXhwciB7W3dpbmZvIHJvb3R5ICR3XStbd2luZm8gaGVpZ2h0ICR3XX1dDSAgICAJICAgIAl9ICANICAgIAkgICAgfQ0JfQ0gICAgfSBtc2ddfSB7DQkjIEVycm9yIHBvc3RpbmcgbWVudSAoZS5nLiBib2d1cyAtcG9zdGNvbW1hbmQpLiBVbnBvc3QgaXQgYW5kDQkjIHJlZmxlY3QgdGhlIGVycm9yLg0JDQlzZXQgc2F2ZWRJbmZvICRlcnJvckluZm8NCXRrTWVudVVucG9zdCB7fQ0JZXJyb3IgJG1zZyAkc2F2ZWRJbmZvDQ0gICAgfQ0NICAgIHNldCB0a1ByaXYodGVhcm9mZikgJHRlYXJvZmYNICAgIGlmIHskdGVhcm9mZiAhPSAwfSB7DSAgICAJZm9jdXMgJG1lbnUNCWlmIHtbd2luZm8gdmlld2FibGUgJHddfSB7DQkgICAgdGtTYXZlR3JhYkluZm8gJHcNCSAgICBncmFiIC1nbG9iYWwgJHcNCX0NICAgIH0NfQ0NIyB0a01lbnVVbnBvc3QgLS0NIyBUaGlzIHByb2NlZHVyZSB1bnBvc3RzIGEgZ2l2ZW4gbWVudSwgcGx1cyBhbGwgb2YgaXRzIGFuY2VzdG9ycyB1cA0jIHRvIChhbmQgaW5jbHVkaW5nKSBhIG1lbnVidXR0b24sIGlmIGFueS4gIEl0IGFsc28gcmVzdG9yZXMgdmFyaW91cw0jIHZhbHVlcyB0byB3aGF0IHRoZXkgd2VyZSBiZWZvcmUgdGhlIG1lbnUgd2FzIHBvc3RlZCwgYW5kIHJlbGVhc2VzDSMgYSBncmFiIGlmIHRoZXJlJ3MgYSBtZW51YnV0dG9uIGludm9sdmVkLiAgU3BlY2lhbCBub3RlczoNIyAxLiBJdCdzIGltcG9ydGFudCB0byB1bnBvc3QgYWxsIG1lbnVzIGJlZm9yZSByZWxlYXNpbmcgdGhlIGdyYWIsIHNvDSMgICAgdGhhdCBhbnkgRW50ZXItTGVhdmUgZXZlbnRzIChlLmcuIGZyb20gbWVudSBiYWNrIHRvIG1haW4NIyAgICBhcHBsaWNhdGlvbikgaGF2ZSBtb2RlIE5vdGlmeUdyYWIuDSMgMi4gQmUgc3VyZSB0byBlbmNsb3NlIHZhcmlvdXMgZ3JvdXBzIG9mIGNvbW1hbmRzIGluICJjYXRjaCIgc28gdGhhdA0jICAgIHRoZSBwcm9jZWR1cmUgd2lsbCBjb21wbGV0ZSBldmVuIGlmIHRoZSBtZW51YnV0dG9uIG9yIHRoZSBtZW51DSMgICAgb3IgdGhlIGdyYWIgd2luZG93IGhhcyBiZWVuIGRlbGV0ZWQuDSMNIyBBcmd1bWVudHM6DSMgbWVudSAtCQlOYW1lIG9mIGEgbWVudSB0byB1bnBvc3QuICBJZ25vcmVkIGlmIHRoZXJlDSMJCQlpcyBhIHBvc3RlZCBtZW51YnV0dG9uLg0NcHJvYyB0a01lbnVVbnBvc3QgbWVudSB7DSAgICBnbG9iYWwgdGNsX3BsYXRmb3JtDSAgICBnbG9iYWwgdGtQcml2DSAgICBzZXQgbWIgJHRrUHJpdihwb3N0ZWRNYikNDSAgICAjIFJlc3RvcmUgZm9jdXMgcmlnaHQgYXdheSAob3RoZXJ3aXNlIFggd2lsbCB0YWtlIGZvY3VzIGF3YXkgd2hlbg0gICAgIyB0aGUgbWVudSBpcyB1bm1hcHBlZCBhbmQgdW5kZXIgc29tZSB3aW5kb3cgbWFuYWdlcnMgKGUuZy4gb2x2d20pDSAgICAjIHdlJ2xsIGxvc2UgdGhlIGZvY3VzIGNvbXBsZXRlbHkpLg0NICAgIGNhdGNoIHtmb2N1cyAkdGtQcml2KGZvY3VzKX0NICAgIHNldCB0a1ByaXYoZm9jdXMpICIiDQ0gICAgIyBVbnBvc3QgbWVudShzKSBhbmQgcmVzdG9yZSBzb21lIHN0dWZmIHRoYXQncyBkZXBlbmRlbnQgb24NICAgICMgd2hhdCB3YXMgcG9zdGVkLg0NICAgIGNhdGNoIHsNCWlmIHtbc3RyaW5nIGNvbXBhcmUgJG1iICIiXX0gew0JICAgIHNldCBtZW51IFskbWIgY2dldCAtbWVudV0NCSAgICAkbWVudSB1bnBvc3QNCSAgICBzZXQgdGtQcml2KHBvc3RlZE1iKSB7fQ0JICAgICRtYiBjb25maWd1cmUgLWN1cnNvciAkdGtQcml2KGN1cnNvcikNCSAgICAkbWIgY29uZmlndXJlIC1yZWxpZWYgJHRrUHJpdihyZWxpZWYpDQl9IGVsc2VpZiB7W3N0cmluZyBjb21wYXJlICR0a1ByaXYocG9wdXApICIiXX0gew0JICAgICR0a1ByaXYocG9wdXApIHVucG9zdA0JICAgIHNldCB0a1ByaXYocG9wdXApIHt9DQl9IGVsc2VpZiB7W3N0cmluZyBjb21wYXJlIFskbWVudSBjZ2V0IC10eXBlXSAibWVudWJhciJdIFwNCQkmJiBbc3RyaW5nIGNvbXBhcmUgWyRtZW51IGNnZXQgLXR5cGVdICJ0ZWFyb2ZmIl19IHsNCSAgICAjIFdlJ3JlIGluIGEgY2FzY2FkZWQgc3ViLW1lbnUgZnJvbSBhIHRvcm4tb2ZmIG1lbnUgb3IgcG9wdXAuDQkgICAgIyBVbnBvc3QgYWxsIHRoZSBtZW51cyB1cCB0byB0aGUgdG9wbGV2ZWwgb25lIChidXQgbm90DQkgICAgIyBpbmNsdWRpbmcgdGhlIHRvcC1sZXZlbCB0b3JuLW9mZiBvbmUpIGFuZCBkZWFjdGl2YXRlIHRoZQ0JICAgICMgdG9wLWxldmVsIHRvcm4gb2ZmIG1lbnUgaWYgdGhlcmUgaXMgb25lLg0NCSAgICB3aGlsZSB7MX0gew0JCXNldCBwYXJlbnQgW3dpbmZvIHBhcmVudCAkbWVudV0NCQlpZiB7W3N0cmluZyBjb21wYXJlIFt3aW5mbyBjbGFzcyAkcGFyZW50XSAiTWVudSJdIFwNCQkJfHwgIVt3aW5mbyBpc21hcHBlZCAkcGFyZW50XX0gew0JCSAgICBicmVhaw0JCX0NCQkkcGFyZW50IGFjdGl2YXRlIG5vbmUNCQkkcGFyZW50IHBvc3RjYXNjYWRlIG5vbmUNCQl0a0dlbmVyYXRlTWVudVNlbGVjdCAkcGFyZW50DQkJc2V0IHR5cGUgWyRwYXJlbnQgY2dldCAtdHlwZV0NCQlpZiB7W3N0cmluZyBlcXVhbCAkdHlwZSAibWVudWJhciJdIHx8IFwNCQkJW3N0cmluZyBlcXVhbCAkdHlwZSAidGVhcm9mZiJdfSB7DQkJICAgIGJyZWFrDQkJfQ0JCXNldCBtZW51ICRwYXJlbnQNCSAgICB9DQkgICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJG1lbnUgY2dldCAtdHlwZV0gIm1lbnViYXIiXX0gew0JCSRtZW51IHVucG9zdA0JICAgIH0NCX0NICAgIH0NDSAgICBpZiB7KCR0a1ByaXYodGVhcm9mZikgIT0gMCkgfHwgW3N0cmluZyBjb21wYXJlICR0a1ByaXYobWVudUJhcikgIiJdfSB7DSAgICAJIyBSZWxlYXNlIGdyYWIsIGlmIGFueSwgYW5kIHJlc3RvcmUgdGhlIHByZXZpb3VzIGdyYWIsIGlmIHRoZXJlDSAgICAJIyB3YXMgb25lLg0JaWYge1tzdHJpbmcgY29tcGFyZSAkbWVudSAiIl19IHsNCSAgICBzZXQgZ3JhYiBbZ3JhYiBjdXJyZW50ICRtZW51XQ0JICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJGdyYWIgIiJdfSB7DQkJZ3JhYiByZWxlYXNlICRncmFiDQkgICAgfQ0JfQ0JdGtSZXN0b3JlT2xkR3JhYg0JaWYge1tzdHJpbmcgY29tcGFyZSAkdGtQcml2KG1lbnVCYXIpICIiXX0gew0JICAgICR0a1ByaXYobWVudUJhcikgY29uZmlndXJlIC1jdXJzb3IgJHRrUHJpdihjdXJzb3IpDQkgICAgc2V0IHRrUHJpdihtZW51QmFyKSB7fQ0JfQ0JaWYge1tzdHJpbmcgY29tcGFyZSAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAidW5peCJdfSB7DQkgICAgc2V0IHRrUHJpdih0ZWFyb2ZmKSAwDQl9DSAgICB9DX0NDSMgdGtNYk1vdGlvbiAtLQ0jIFRoaXMgcHJvY2VkdXJlIGhhbmRsZXMgbW91c2UgbW90aW9uIGV2ZW50cyBpbnNpZGUgbWVudWJ1dHRvbnMsIGFuZA0jIGFsc28gb3V0c2lkZSBtZW51YnV0dG9ucyB3aGVuIGEgbWVudWJ1dHRvbiBoYXMgYSBncmFiIChlLmcuIHdoZW4gYQ0jIG1lbnUgc2VsZWN0aW9uIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcykuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQkJVGhlIG5hbWUgb2YgdGhlIG1lbnVidXR0b24gd2lkZ2V0Lg0jIHVwRG93biAtIAkJImRvd24iIG1lYW5zIGJ1dHRvbiAxIGlzIHByZXNzZWQsICJ1cCIgbWVhbnMNIwkJCWl0IGlzbid0Lg0jIHJvb3R4LCByb290eSAtCUNvb3JkaW5hdGVzIG9mIG1vdXNlLCBpbiAodmlydHVhbD8pIHJvb3Qgd2luZG93Lg0NcHJvYyB0a01iTW90aW9uIHt3IHVwRG93biByb290eCByb290eX0gew0gICAgZ2xvYmFsIHRrUHJpdg0NICAgIGlmIHtbc3RyaW5nIGVxdWFsICR0a1ByaXYoaW5NZW51YnV0dG9uKSAkd119IHsNCXJldHVybg0gICAgfQ0gICAgc2V0IG5ldyBbd2luZm8gY29udGFpbmluZyAkcm9vdHggJHJvb3R5XQ0gICAgaWYge1tzdHJpbmcgY29tcGFyZSAkbmV3ICR0a1ByaXYoaW5NZW51YnV0dG9uKV0gXA0JICAgICYmIChbc3RyaW5nIGVxdWFsICRuZXcgIiJdIFwNCSAgICB8fCBbc3RyaW5nIGVxdWFsIFt3aW5mbyB0b3BsZXZlbCAkbmV3XSBbd2luZm8gdG9wbGV2ZWwgJHddXSl9IHsNCWlmIHtbc3RyaW5nIGNvbXBhcmUgJHRrUHJpdihpbk1lbnVidXR0b24pICIiXX0gew0JICAgIHRrTWJMZWF2ZSAkdGtQcml2KGluTWVudWJ1dHRvbikNCX0NCWlmIHtbc3RyaW5nIGNvbXBhcmUgJG5ldyAiIl0gXA0JCSYmIFtzdHJpbmcgZXF1YWwgW3dpbmZvIGNsYXNzICRuZXddICJNZW51YnV0dG9uIl0gXA0JCSYmIChbJG5ldyBjZ2V0IC1pbmRpY2F0b3Jvbl0gPT0gMCkgXA0JCSYmIChbJHcgY2dldCAtaW5kaWNhdG9yb25dID09IDApfSB7DQkgICAgaWYge1tzdHJpbmcgZXF1YWwgJHVwRG93biAiZG93biJdfSB7DQkJdGtNYlBvc3QgJG5ldyAkcm9vdHggJHJvb3R5DQkgICAgfSBlbHNlIHsNCQl0a01iRW50ZXIgJG5ldw0JICAgIH0NCX0NICAgIH0NfQ0NIyB0a01iQnV0dG9uVXAgLS0NIyBUaGlzIHByb2NlZHVyZSBpcyBpbnZva2VkIHRvIGhhbmRsZSBidXR0b24gMSByZWxlYXNlcyBmb3IgbWVudWJ1dHRvbnMuDSMgSWYgdGhlIHJlbGVhc2UgaGFwcGVucyBpbnNpZGUgdGhlIG1lbnVidXR0b24gdGhlbiBsZWF2ZSBpdHMgbWVudQ0jIHBvc3RlZCB3aXRoIGVsZW1lbnQgMCBhY3RpdmF0ZWQuICBPdGhlcndpc2UsIHVucG9zdCB0aGUgbWVudS4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCQlUaGUgbmFtZSBvZiB0aGUgbWVudWJ1dHRvbiB3aWRnZXQuDQ1wcm9jIHRrTWJCdXR0b25VcCB3IHsNICAgIGdsb2JhbCB0a1ByaXYNICAgIGdsb2JhbCB0Y2xfcGxhdGZvcm0NDSAgICBzZXQgbWVudSBbJHcgY2dldCAtbWVudV0NICAgIHNldCB0ZWFyb2ZmIFtleHByIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJ1bml4Il0gfHwgXA0JICAgIChbc3RyaW5nIGNvbXBhcmUgJG1lbnUge31dICYmIFwNCSAgICBbc3RyaW5nIGVxdWFsIFskbWVudSBjZ2V0IC10eXBlXSAidGVhcm9mZiJdKX1dDSAgICBpZiB7KCR0ZWFyb2ZmICE9IDApICYmIFtzdHJpbmcgZXF1YWwgJHRrUHJpdihwb3N0ZWRNYikgJHddIFwNCSAgICAmJiBbc3RyaW5nIGVxdWFsICR0a1ByaXYoaW5NZW51YnV0dG9uKSAkd119IHsNCXRrTWVudUZpcnN0RW50cnkgWyR0a1ByaXYocG9zdGVkTWIpIGNnZXQgLW1lbnVdDSAgICB9IGVsc2Ugew0JdGtNZW51VW5wb3N0IHt9DSAgICB9DX0NDSMgdGtNZW51TW90aW9uIC0tDSMgVGhpcyBwcm9jZWR1cmUgaXMgY2FsbGVkIHRvIGhhbmRsZSBtb3VzZSBtb3Rpb24gZXZlbnRzIGZvciBtZW51cy4NIyBJdCBkb2VzIHR3byB0aGluZ3MuICBGaXJzdCwgaXQgcmVzZXRzIHRoZSBhY3RpdmUgZWxlbWVudCBpbiB0aGUNIyBtZW51LCBpZiB0aGUgbW91c2UgaXMgb3ZlciB0aGUgbWVudS4gIFNlY29uZCwgaWYgYSBtb3VzZSBidXR0b24NIyBpcyBkb3duLCBpdCBwb3N0cyBhbmQgdW5wb3N0cyBjYXNjYWRlIGVudHJpZXMgdG8gbWF0Y2ggdGhlIG1vdXNlDSMgcG9zaXRpb24uDSMNIyBBcmd1bWVudHM6DSMgbWVudSAtCQlUaGUgbWVudSB3aW5kb3cuDSMgeCAtCQkJVGhlIHggcG9zaXRpb24gb2YgdGhlIG1vdXNlLg0jIHkgLQkJCVRoZSB5IHBvc2l0aW9uIG9mIHRoZSBtb3VzZS4NIyBzdGF0ZSAtCQlNb2RpZmllciBzdGF0ZSAodGVsbHMgd2hldGhlciBidXR0b25zIGFyZSBkb3duKS4NDXByb2MgdGtNZW51TW90aW9uIHttZW51IHggeSBzdGF0ZX0gew0gICAgZ2xvYmFsIHRrUHJpdg0gICAgaWYge1tzdHJpbmcgZXF1YWwgJG1lbnUgJHRrUHJpdih3aW5kb3cpXX0gew0JaWYge1tzdHJpbmcgZXF1YWwgWyRtZW51IGNnZXQgLXR5cGVdICJtZW51YmFyIl19IHsNCSAgICBpZiB7W2luZm8gZXhpc3RzIHRrUHJpdihmb2N1cyldICYmIFwNCQkgICAgW3N0cmluZyBjb21wYXJlICRtZW51ICR0a1ByaXYoZm9jdXMpXX0gew0JCSRtZW51IGFjdGl2YXRlIEAkeCwkeQ0JCXRrR2VuZXJhdGVNZW51U2VsZWN0ICRtZW51DQkgICAgfQ0JfSBlbHNlIHsNCSAgICAkbWVudSBhY3RpdmF0ZSBAJHgsJHkNCSAgICB0a0dlbmVyYXRlTWVudVNlbGVjdCAkbWVudQ0JfQ0gICAgfQ0gICAgaWYgeygkc3RhdGUgJiAweDFmMDApICE9IDB9IHsNCSRtZW51IHBvc3RjYXNjYWRlIGFjdGl2ZQ0gICAgfQ19DQ0jIHRrTWVudUJ1dHRvbkRvd24gLS0NIyBIYW5kbGVzIGJ1dHRvbiBwcmVzc2VzIGluIG1lbnVzLiAgVGhlcmUgYXJlIGEgY291cGxlIG9mIHRyaWNreSB0aGluZ3MNIyBoZXJlOg0jIDEuIENoYW5nZSB0aGUgcG9zdGVkIGNhc2NhZGUgZW50cnkgKGlmIGFueSkgdG8gbWF0Y2ggdGhlIG1vdXNlIHBvc2l0aW9uLg0jIDIuIElmIHRoZXJlIGlzIGEgcG9zdGVkIG1lbnVidXR0b24sIG11c3QgZ3JhYiB0byB0aGUgbWVudWJ1dHRvbjsgIHRoaXMNIyAgICBvdmVycnJpZGVzIHRoZSBpbXBsaWNpdCBncmFiIG9uIGJ1dHRvbiBwcmVzcywgc28gdGhhdCB0aGUgbWVudQ0jICAgIGJ1dHRvbiBjYW4gdHJhY2sgbW91c2UgbW90aW9ucyBvdmVyIG90aGVyIG1lbnVidXR0b25zIGFuZCBjaGFuZ2UNIyAgICB0aGUgcG9zdGVkIG1lbnUuDSMgMy4gSWYgdGhlcmUncyBubyBwb3N0ZWQgbWVudWJ1dHRvbiAoZS5nLiBiZWNhdXNlIHdlJ3JlIGEgdG9ybi1vZmYgbWVudQ0jICAgIG9yIG9uZSBvZiBpdHMgZGVzY2VuZGFudHMpIG11c3QgZ3JhYiB0byB0aGUgdG9wLWxldmVsIG1lbnUgc28gdGhhdA0jICAgIHdlIGNhbiB0cmFjayBtb3VzZSBtb3Rpb25zIGFjcm9zcyB0aGUgZW50aXJlIG1lbnUgaGllcmFyY2h5Lg0jDSMgQXJndW1lbnRzOg0jIG1lbnUgLQkJVGhlIG1lbnUgd2luZG93Lg0NcHJvYyB0a01lbnVCdXR0b25Eb3duIG1lbnUgew0gICAgZ2xvYmFsIHRrUHJpdg0gICAgZ2xvYmFsIHRjbF9wbGF0Zm9ybQ0NICAgIGlmIHshW3dpbmZvIHZpZXdhYmxlICRtZW51XX0gew0gICAgICAgIHJldHVybg0gICAgfQ0gICAgJG1lbnUgcG9zdGNhc2NhZGUgYWN0aXZlDSAgICBpZiB7W3N0cmluZyBjb21wYXJlICR0a1ByaXYocG9zdGVkTWIpICIiXSAmJiBcDQkgICAgW3dpbmZvIHZpZXdhYmxlICR0a1ByaXYocG9zdGVkTWIpXX0gew0JZ3JhYiAtZ2xvYmFsICR0a1ByaXYocG9zdGVkTWIpDSAgICB9IGVsc2Ugew0Jd2hpbGUge1tzdHJpbmcgZXF1YWwgWyRtZW51IGNnZXQgLXR5cGVdICJub3JtYWwiXSBcDQkJJiYgW3N0cmluZyBlcXVhbCBbd2luZm8gY2xhc3MgW3dpbmZvIHBhcmVudCAkbWVudV1dICJNZW51Il0gXA0JCSYmIFt3aW5mbyBpc21hcHBlZCBbd2luZm8gcGFyZW50ICRtZW51XV19IHsNCSAgICBzZXQgbWVudSBbd2luZm8gcGFyZW50ICRtZW51XQ0JfQ0NCWlmIHtbc3RyaW5nIGVxdWFsICR0a1ByaXYobWVudUJhcikge31dfSB7DQkgICAgc2V0IHRrUHJpdihtZW51QmFyKSAkbWVudQ0JICAgIHNldCB0a1ByaXYoY3Vyc29yKSBbJG1lbnUgY2dldCAtY3Vyc29yXQ0JICAgICRtZW51IGNvbmZpZ3VyZSAtY3Vyc29yIGFycm93DSAgICAgICAgfQ0NCSMgRG9uJ3QgdXBkYXRlIGdyYWIgaW5mb3JtYXRpb24gaWYgdGhlIGdyYWIgd2luZG93IGlzbid0IGNoYW5naW5nLg0JIyBPdGhlcndpc2UsIHdlJ2xsIGdldCBhbiBlcnJvciB3aGVuIHdlIHVucG9zdCB0aGUgbWVudXMgYW5kDQkjIHJlc3RvcmUgdGhlIGdyYWIsIHNpbmNlIHRoZSBvbGQgZ3JhYiB3aW5kb3cgd2lsbCBub3QgYmUgdmlld2FibGUNCSMgYW55bW9yZS4NDQlpZiB7W3N0cmluZyBjb21wYXJlICRtZW51IFtncmFiIGN1cnJlbnQgJG1lbnVdXX0gew0JICAgIHRrU2F2ZUdyYWJJbmZvICRtZW51DQl9DQ0JIyBNdXN0IHJlLWdyYWIgZXZlbiBpZiB0aGUgZ3JhYiB3aW5kb3cgaGFzbid0IGNoYW5nZWQsIGluIG9yZGVyDQkjIHRvIHJlbGVhc2UgdGhlIGltcGxpY2l0IGdyYWIgZnJvbSB0aGUgYnV0dG9uIHByZXNzLg0NCWlmIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJ1bml4Il19IHsNCSAgICBncmFiIC1nbG9iYWwgJG1lbnUNCX0NICAgIH0NfQ0NIyB0a01lbnVMZWF2ZSAtLQ0jIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgdG8gaGFuZGxlIExlYXZlIGV2ZW50cyBmb3IgYSBtZW51LiAgSXQNIyBkZWFjdGl2YXRlcyBldmVyeXRoaW5nIHVubGVzcyB0aGUgYWN0aXZlIGVsZW1lbnQgaXMgYSBjYXNjYWRlIGVsZW1lbnQNIyBhbmQgdGhlIG1vdXNlIGlzIG5vdyBvdmVyIHRoZSBzdWJtZW51Lg0jDSMgQXJndW1lbnRzOg0jIG1lbnUgLQkJVGhlIG1lbnUgd2luZG93Lg0jIHJvb3R4LCByb290eSAtCVJvb3QgY29vcmRpbmF0ZXMgb2YgbW91c2UuDSMgc3RhdGUgLQkJTW9kaWZpZXIgc3RhdGUuDQ1wcm9jIHRrTWVudUxlYXZlIHttZW51IHJvb3R4IHJvb3R5IHN0YXRlfSB7DSAgICBnbG9iYWwgdGtQcml2DSAgICBzZXQgdGtQcml2KHdpbmRvdykge30NICAgIGlmIHtbc3RyaW5nIGVxdWFsIFskbWVudSBpbmRleCBhY3RpdmVdICJub25lIl19IHsNCXJldHVybg0gICAgfQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgWyRtZW51IHR5cGUgYWN0aXZlXSAiY2FzY2FkZSJdDSAgICAgICAgICAmJiBbc3RyaW5nIGVxdWFsIFt3aW5mbyBjb250YWluaW5nICRyb290eCAkcm9vdHldIFwNICAgICAgICAgICAgICAgICAgWyRtZW51IGVudHJ5Y2dldCBhY3RpdmUgLW1lbnVdXX0gew0JcmV0dXJuDSAgICB9DSAgICAkbWVudSBhY3RpdmF0ZSBub25lDSAgICB0a0dlbmVyYXRlTWVudVNlbGVjdCAkbWVudQ19DQ0jIHRrTWVudUludm9rZSAtLQ0jIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgd2hlbiBidXR0b24gMSBpcyByZWxlYXNlZCBvdmVyIGEgbWVudS4NIyBJdCBpbnZva2VzIHRoZSBhcHByb3ByaWF0ZSBtZW51IGFjdGlvbiBhbmQgdW5wb3N0cyB0aGUgbWVudSBpZg0jIGl0IGNhbWUgZnJvbSBhIG1lbnVidXR0b24uDSMNIyBBcmd1bWVudHM6DSMgdyAtCQkJTmFtZSBvZiB0aGUgbWVudSB3aWRnZXQuDSMgYnV0dG9uUmVsZWFzZSAtCTEgbWVhbnMgdGhpcyBwcm9jZWR1cmUgaXMgY2FsbGVkIGJlY2F1c2Ugb2YNIwkJCWEgYnV0dG9uIHJlbGVhc2U7ICAwIG1lYW5zIGJlY2F1c2Ugb2Yga2V5c3Ryb2tlLg0NcHJvYyB0a01lbnVJbnZva2Uge3cgYnV0dG9uUmVsZWFzZX0gew0gICAgZ2xvYmFsIHRrUHJpdg0NICAgIGlmIHskYnV0dG9uUmVsZWFzZSAmJiBbc3RyaW5nIGVxdWFsICR0a1ByaXYod2luZG93KSB7fV19IHsNCSMgTW91c2Ugd2FzIHByZXNzZWQgb3ZlciBhIG1lbnUgd2l0aG91dCBhIG1lbnUgYnV0dG9uLCB0aGVuDQkjIGRyYWdnZWQgb2ZmIHRoZSBtZW51IChwb3NzaWJseSB3aXRoIGEgY2FzY2FkZSBwb3N0ZWQpIGFuZA0JIyByZWxlYXNlZC4gIFVucG9zdCBldmVyeXRoaW5nIGFuZCBxdWl0Lg0NCSR3IHBvc3RjYXNjYWRlIG5vbmUNCSR3IGFjdGl2YXRlIG5vbmUNCWV2ZW50IGdlbmVyYXRlICR3IDw8TWVudVNlbGVjdD4+DQl0a01lbnVVbnBvc3QgJHcNCXJldHVybg0gICAgfQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgWyR3IHR5cGUgYWN0aXZlXSAiY2FzY2FkZSJdfSB7DQkkdyBwb3N0Y2FzY2FkZSBhY3RpdmUNCXNldCBtZW51IFskdyBlbnRyeWNnZXQgYWN0aXZlIC1tZW51XQ0JdGtNZW51Rmlyc3RFbnRyeSAkbWVudQ0gICAgfSBlbHNlaWYge1tzdHJpbmcgZXF1YWwgWyR3IHR5cGUgYWN0aXZlXSAidGVhcm9mZiJdfSB7DQl0a1RlYXJPZmZNZW51ICR3DQl0a01lbnVVbnBvc3QgJHcNICAgIH0gZWxzZWlmIHtbc3RyaW5nIGVxdWFsIFskdyBjZ2V0IC10eXBlXSAibWVudWJhciJdfSB7DQkkdyBwb3N0Y2FzY2FkZSBub25lDQlzZXQgYWN0aXZlIFskdyBpbmRleCBhY3RpdmVdDQlzZXQgaXNDYXNjYWRlIFtzdHJpbmcgZXF1YWwgWyR3IHR5cGUgJGFjdGl2ZV0gImNhc2NhZGUiXQ0NCSMgT25seSBkZS1hY3RpdmF0ZSB0aGUgYWN0aXZlIGl0ZW0gaWYgaXQncyBhIGNhc2NhZGU7IHRoaXMgcHJldmVudHMNCSMgdGhlIGFubm95aW5nICJhY3RpdmF0aW9uIGZsaWNrZXIiIHlvdSBvdGhlcndpc2UgZ2V0IHdpdGggDQkjIGNoZWNrYnV0dG9ucy9jb21tYW5kcy9ldGMuIG9uIG1lbnViYXJzDQ0JaWYgeyAkaXNDYXNjYWRlIH0gew0JICAgICR3IGFjdGl2YXRlIG5vbmUNCSAgICBldmVudCBnZW5lcmF0ZSAkdyA8PE1lbnVTZWxlY3Q+Pg0JfQ0NCXRrTWVudVVucG9zdCAkdw0NCSMgSWYgdGhlIGFjdGl2ZSBpdGVtIGlzIG5vdCBhIGNhc2NhZGUsIGludm9rZSBpdC4gIFRoaXMgZW5hYmxlcw0JIyB0aGUgdXNlIG9mIGNoZWNrYnV0dG9ucy9jb21tYW5kcy9ldGMuIG9uIG1lbnViYXJzICh3aGljaCBpcyBsZWdhbCwNCSMgYnV0IG5vdCByZWNvbW1lbmRlZCkNDQlpZiB7ICEkaXNDYXNjYWRlIH0gew0JICAgIHVwbGV2ZWwgIzAgW2xpc3QgJHcgaW52b2tlICRhY3RpdmVdDQl9DSAgICB9IGVsc2Ugew0JdGtNZW51VW5wb3N0ICR3DQl1cGxldmVsICMwIFtsaXN0ICR3IGludm9rZSBhY3RpdmVdDSAgICB9DX0NDSMgdGtNZW51RXNjYXBlIC0tDSMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCBmb3IgdGhlIENhbmNlbCAob3IgRXNjYXBlKSBrZXkuICBJdCB1bnBvc3RzDSMgdGhlIGdpdmVuIG1lbnUgYW5kLCBpZiBpdCBpcyB0aGUgdG9wLWxldmVsIG1lbnUgZm9yIGEgbWVudSBidXR0b24sDSMgdW5wb3N0cyB0aGUgbWVudSBidXR0b24gYXMgd2VsbC4NIw0jIEFyZ3VtZW50czoNIyBtZW51IC0JCU5hbWUgb2YgdGhlIG1lbnUgd2luZG93Lg0NcHJvYyB0a01lbnVFc2NhcGUgbWVudSB7DSAgICBzZXQgcGFyZW50IFt3aW5mbyBwYXJlbnQgJG1lbnVdDSAgICBpZiB7W3N0cmluZyBjb21wYXJlIFt3aW5mbyBjbGFzcyAkcGFyZW50XSAiTWVudSJdfSB7DQl0a01lbnVVbnBvc3QgJG1lbnUNICAgIH0gZWxzZWlmIHtbc3RyaW5nIGVxdWFsIFskcGFyZW50IGNnZXQgLXR5cGVdICJtZW51YmFyIl19IHsNCXRrTWVudVVucG9zdCAkbWVudQ0JdGtSZXN0b3JlT2xkR3JhYg0gICAgfSBlbHNlIHsNCXRrTWVudU5leHRNZW51ICRtZW51IGxlZnQNICAgIH0NfQ0NIyBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGhhbmRsZSBhcnJvdyBrZXlzLiBBcnJvdyBrZXlzIGJlaGF2ZQ0jIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBtZW51IGlzIGEgbWVudSBiYXIgb3Igbm90Lg0NcHJvYyB0a01lbnVVcEFycm93IHttZW51fSB7DSAgICBpZiB7W3N0cmluZyBlcXVhbCBbJG1lbnUgY2dldCAtdHlwZV0gIm1lbnViYXIiXX0gew0JdGtNZW51TmV4dE1lbnUgJG1lbnUgbGVmdA0gICAgfSBlbHNlIHsNCXRrTWVudU5leHRFbnRyeSAkbWVudSAtMQ0gICAgfQ19DQ1wcm9jIHRrTWVudURvd25BcnJvdyB7bWVudX0gew0gICAgaWYge1tzdHJpbmcgZXF1YWwgWyRtZW51IGNnZXQgLXR5cGVdICJtZW51YmFyIl19IHsNCXRrTWVudU5leHRNZW51ICRtZW51IHJpZ2h0DSAgICB9IGVsc2Ugew0JdGtNZW51TmV4dEVudHJ5ICRtZW51IDENICAgIH0NfQ0NcHJvYyB0a01lbnVMZWZ0QXJyb3cge21lbnV9IHsNICAgIGlmIHtbc3RyaW5nIGVxdWFsIFskbWVudSBjZ2V0IC10eXBlXSAibWVudWJhciJdfSB7DQl0a01lbnVOZXh0RW50cnkgJG1lbnUgLTENICAgIH0gZWxzZSB7DQl0a01lbnVOZXh0TWVudSAkbWVudSBsZWZ0DSAgICB9DX0NDXByb2MgdGtNZW51UmlnaHRBcnJvdyB7bWVudX0gew0gICAgaWYge1tzdHJpbmcgZXF1YWwgWyRtZW51IGNnZXQgLXR5cGVdICJtZW51YmFyIl19IHsNCXRrTWVudU5leHRFbnRyeSAkbWVudSAxDSAgICB9IGVsc2Ugew0JdGtNZW51TmV4dE1lbnUgJG1lbnUgcmlnaHQNICAgIH0NfQ0NIyB0a01lbnVOZXh0TWVudSAtLQ0jIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgdG8gaGFuZGxlICJsZWZ0IiBhbmQgInJpZ2h0IiB0cmF2ZXJzYWwNIyBtb3Rpb25zIGluIG1lbnVzLiAgSXQgdHJhdmVyc2VzIHRvIHRoZSBuZXh0IG1lbnUgaW4gYSBtZW51IGJhciwNIyBvciBpbnRvIG9yIG91dCBvZiBhIGNhc2NhZGVkIG1lbnUuDSMNIyBBcmd1bWVudHM6DSMgbWVudSAtCQlUaGUgbWVudSB0aGF0IHJlY2VpdmVkIHRoZSBrZXlib2FyZA0jCQkJZXZlbnQuDSMgZGlyZWN0aW9uIC0JCURpcmVjdGlvbiBpbiB3aGljaCB0byBtb3ZlOiAibGVmdCIgb3IgInJpZ2h0Ig0NcHJvYyB0a01lbnVOZXh0TWVudSB7bWVudSBkaXJlY3Rpb259IHsNICAgIGdsb2JhbCB0a1ByaXYNDSAgICAjIEZpcnN0IGhhbmRsZSB0cmF2ZXJzYWxzIGludG8gYW5kIG91dCBvZiBjYXNjYWRlZCBtZW51cy4NDSAgICBpZiB7W3N0cmluZyBlcXVhbCAkZGlyZWN0aW9uICJyaWdodCJdfSB7DQlzZXQgY291bnQgMQ0Jc2V0IHBhcmVudCBbd2luZm8gcGFyZW50ICRtZW51XQ0Jc2V0IGNsYXNzIFt3aW5mbyBjbGFzcyAkcGFyZW50XQ0JaWYge1tzdHJpbmcgZXF1YWwgWyRtZW51IHR5cGUgYWN0aXZlXSAiY2FzY2FkZSJdfSB7DQkgICAgJG1lbnUgcG9zdGNhc2NhZGUgYWN0aXZlDQkgICAgc2V0IG0yIFskbWVudSBlbnRyeWNnZXQgYWN0aXZlIC1tZW51XQ0JICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJG0yICIiXX0gew0JCXRrTWVudUZpcnN0RW50cnkgJG0yDQkgICAgfQ0JICAgIHJldHVybg0JfSBlbHNlIHsNCSAgICBzZXQgcGFyZW50IFt3aW5mbyBwYXJlbnQgJG1lbnVdDQkgICAgd2hpbGUge1tzdHJpbmcgY29tcGFyZSAkcGFyZW50ICIuIl19IHsNCQlpZiB7W3N0cmluZyBlcXVhbCBbd2luZm8gY2xhc3MgJHBhcmVudF0gIk1lbnUiXSBcDQkJCSYmIFtzdHJpbmcgZXF1YWwgWyRwYXJlbnQgY2dldCAtdHlwZV0gIm1lbnViYXIiXX0gew0JCSAgICB0a19tZW51U2V0Rm9jdXMgJHBhcmVudA0JCSAgICB0a01lbnVOZXh0RW50cnkgJHBhcmVudCAxDQkJICAgIHJldHVybg0JCX0NCQlzZXQgcGFyZW50IFt3aW5mbyBwYXJlbnQgJHBhcmVudF0NCSAgICB9DQl9DSAgICB9IGVsc2Ugew0Jc2V0IGNvdW50IC0xDQlzZXQgbTIgW3dpbmZvIHBhcmVudCAkbWVudV0NCWlmIHtbc3RyaW5nIGVxdWFsIFt3aW5mbyBjbGFzcyAkbTJdICJNZW51Il19IHsNCSAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskbTIgY2dldCAtdHlwZV0gIm1lbnViYXIiXX0gew0JCSRtZW51IGFjdGl2YXRlIG5vbmUNCQl0a0dlbmVyYXRlTWVudVNlbGVjdCAkbWVudQ0JCXRrX21lbnVTZXRGb2N1cyAkbTINCQkNCQkjIFRoaXMgY29kZSB1bnBvc3RzIGFueSBwb3N0ZWQgc3VibWVudSBpbiB0aGUgcGFyZW50Lg0JCQ0JCXNldCB0bXAgWyRtMiBpbmRleCBhY3RpdmVdDQkJJG0yIGFjdGl2YXRlIG5vbmUNCQkkbTIgYWN0aXZhdGUgJHRtcA0JCXJldHVybg0JICAgIH0NCX0NICAgIH0NDSAgICAjIENhbid0IHRyYXZlcnNlIGludG8gb3Igb3V0IG9mIGEgY2FzY2FkZWQgbWVudS4gIEdvIHRvIHRoZSBuZXh0DSAgICAjIG9yIHByZXZpb3VzIG1lbnVidXR0b24sIGlmIHRoYXQgbWFrZXMgc2Vuc2UuDQ0gICAgc2V0IG0yIFt3aW5mbyBwYXJlbnQgJG1lbnVdDSAgICBpZiB7W3N0cmluZyBlcXVhbCBbd2luZm8gY2xhc3MgJG0yXSAiTWVudSJdfSB7DQlpZiB7W3N0cmluZyBlcXVhbCBbJG0yIGNnZXQgLXR5cGVdICJtZW51YmFyIl19IHsNCSAgICB0a19tZW51U2V0Rm9jdXMgJG0yDQkgICAgdGtNZW51TmV4dEVudHJ5ICRtMiAtMQ0JICAgIHJldHVybg0JfQ0gICAgfQ0NICAgIHNldCB3ICR0a1ByaXYocG9zdGVkTWIpDSAgICBpZiB7W3N0cmluZyBlcXVhbCAkdyAiIl19IHsNCXJldHVybg0gICAgfQ0gICAgc2V0IGJ1dHRvbnMgW3dpbmZvIGNoaWxkcmVuIFt3aW5mbyBwYXJlbnQgJHddXQ0gICAgc2V0IGxlbmd0aCBbbGxlbmd0aCAkYnV0dG9uc10NICAgIHNldCBpIFtleHByIHtbbHNlYXJjaCAtZXhhY3QgJGJ1dHRvbnMgJHddICsgJGNvdW50fV0NICAgIHdoaWxlIHsxfSB7DQl3aGlsZSB7JGkgPCAwfSB7DQkgICAgaW5jciBpICRsZW5ndGgNCX0NCXdoaWxlIHskaSA+PSAkbGVuZ3RofSB7DQkgICAgaW5jciBpIC0kbGVuZ3RoDQl9DQlzZXQgbWIgW2xpbmRleCAkYnV0dG9ucyAkaV0NCWlmIHtbc3RyaW5nIGVxdWFsIFt3aW5mbyBjbGFzcyAkbWJdICJNZW51YnV0dG9uIl0gXA0JCSYmIFtzdHJpbmcgY29tcGFyZSBbJG1iIGNnZXQgLXN0YXRlXSAiZGlzYWJsZWQiXSBcDQkJJiYgW3N0cmluZyBjb21wYXJlIFskbWIgY2dldCAtbWVudV0gIiJdIFwNCQkmJiBbc3RyaW5nIGNvbXBhcmUgW1skbWIgY2dldCAtbWVudV0gaW5kZXggbGFzdF0gIm5vbmUiXX0gew0JICAgIGJyZWFrDQl9DQlpZiB7W3N0cmluZyBlcXVhbCAkbWIgJHddfSB7DQkgICAgcmV0dXJuDQl9DQlpbmNyIGkgJGNvdW50DSAgICB9DSAgICB0a01iUG9zdCAkbWINICAgIHRrTWVudUZpcnN0RW50cnkgWyRtYiBjZ2V0IC1tZW51XQ19DQ0jIHRrTWVudU5leHRFbnRyeSAtLQ0jIEFjdGl2YXRlIHRoZSBuZXh0IGhpZ2hlciBvciBsb3dlciBlbnRyeSBpbiB0aGUgcG9zdGVkIG1lbnUsDSMgd3JhcHBpbmcgYXJvdW5kIGF0IHRoZSBlbmRzLiAgRGlzYWJsZWQgZW50cmllcyBhcmUgc2tpcHBlZC4NIw0jIEFyZ3VtZW50czoNIyBtZW51IC0JCQlNZW51IHdpbmRvdyB0aGF0IHJlY2VpdmVkIHRoZSBrZXlzdHJva2UuDSMgY291bnQgLQkJCTEgbWVhbnMgZ28gdG8gdGhlIG5leHQgbG93ZXIgZW50cnksDSMJCQkJLTEgbWVhbnMgZ28gdG8gdGhlIG5leHQgaGlnaGVyIGVudHJ5Lg0NcHJvYyB0a01lbnVOZXh0RW50cnkge21lbnUgY291bnR9IHsNICAgIGdsb2JhbCB0a1ByaXYNDSAgICBpZiB7W3N0cmluZyBlcXVhbCBbJG1lbnUgaW5kZXggbGFzdF0gIm5vbmUiXX0gew0JcmV0dXJuDSAgICB9DSAgICBzZXQgbGVuZ3RoIFtleHByIHtbJG1lbnUgaW5kZXggbGFzdF0rMX1dDSAgICBzZXQgcXVpdEFmdGVyICRsZW5ndGgNICAgIHNldCBhY3RpdmUgWyRtZW51IGluZGV4IGFjdGl2ZV0NICAgIGlmIHtbc3RyaW5nIGVxdWFsICRhY3RpdmUgIm5vbmUiXX0gew0Jc2V0IGkgMA0gICAgfSBlbHNlIHsNCXNldCBpIFtleHByIHskYWN0aXZlICsgJGNvdW50fV0NICAgIH0NICAgIHdoaWxlIHsxfSB7DQlpZiB7JHF1aXRBZnRlciA8PSAwfSB7DQkgICAgIyBXZSd2ZSB0cmllZCBldmVyeSBlbnRyeSBpbiB0aGUgbWVudS4gIEVpdGhlciB0aGVyZSBhcmUNCSAgICAjIG5vbmUsIG9yIHRoZXkncmUgYWxsIGRpc2FibGVkLiAgSnVzdCBnaXZlIHVwLg0NCSAgICByZXR1cm4NCX0NCXdoaWxlIHskaSA8IDB9IHsNCSAgICBpbmNyIGkgJGxlbmd0aA0JfQ0Jd2hpbGUgeyRpID49ICRsZW5ndGh9IHsNCSAgICBpbmNyIGkgLSRsZW5ndGgNCX0NCWlmIHtbY2F0Y2ggeyRtZW51IGVudHJ5Y2dldCAkaSAtc3RhdGV9IHN0YXRlXSA9PSAwfSB7DQkgICAgaWYge1tzdHJpbmcgY29tcGFyZSAkc3RhdGUgImRpc2FibGVkIl19IHsNCQlicmVhaw0JICAgIH0NCX0NCWlmIHskaSA9PSAkYWN0aXZlfSB7DQkgICAgcmV0dXJuDQl9DQlpbmNyIGkgJGNvdW50DQlpbmNyIHF1aXRBZnRlciAtMQ0gICAgfQ0gICAgJG1lbnUgYWN0aXZhdGUgJGkNICAgIHRrR2VuZXJhdGVNZW51U2VsZWN0ICRtZW51DSAgICBpZiB7W3N0cmluZyBlcXVhbCBbJG1lbnUgdHlwZSAkaV0gImNhc2NhZGUiXX0gew0Jc2V0IGNhc2NhZGUgWyRtZW51IGVudHJ5Y2dldCAkaSAtbWVudV0NCWlmIHtbc3RyaW5nIGNvbXBhcmUgJGNhc2NhZGUgIiJdfSB7DQkgICAgIyBIZXJlIHdlIGF1dG8tcG9zdCBhIGNhc2NhZGUuICBUaGlzIGlzIG5lY2Vzc2FyeSB3aGVuDQkgICAgIyB3ZSB0cmF2ZXJzZSBsZWZ0L3JpZ2h0IGluIHRoZSBtZW51YmFyLCBidXQgdW5kZXNpcmFibGUgd2hlbg0JICAgICMgd2UgdHJhdmVyc2UgdXAvZG93biBpbiBhIG1lbnUuDQkgICAgJG1lbnUgcG9zdGNhc2NhZGUgJGkNCSAgICB0a01lbnVGaXJzdEVudHJ5ICRjYXNjYWRlDQl9DSAgICB9DX0NDSMgdGtNZW51RmluZCAtLQ0jIFRoaXMgcHJvY2VkdXJlIHNlYXJjaGVzIHRoZSBlbnRpcmUgd2luZG93IGhpZXJhcmNoeSB1bmRlciB3IGZvcg0jIGEgbWVudWJ1dHRvbiB0aGF0IGlzbid0IGRpc2FibGVkIGFuZCB3aG9zZSB1bmRlcmxpbmVkIGNoYXJhY3Rlcg0jIGlzICJjaGFyIiBvciBhbiBlbnRyeSBpbiBhIG1lbnViYXIgdGhhdCBpc24ndCBkaXNhYmxlZCBhbmQgd2hvc2UNIyB1bmRlcmxpbmVkIGNoYXJhY3RlciBpcyAiY2hhciIuDSMgSXQgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGF0IHdpbmRvdywgaWYgZm91bmQsIG9yIGFuDSMgZW1wdHkgc3RyaW5nIGlmIG5vIG1hdGNoaW5nIHdpbmRvdyB3YXMgZm91bmQuICBJZiAiY2hhciIgaXMgYW4NIyBlbXB0eSBzdHJpbmcgdGhlbiB0aGUgcHJvY2VkdXJlIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpcnN0DSMgbWVudWJ1dHRvbiBmb3VuZCB0aGF0IGlzbid0IGRpc2FibGVkLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJCQlOYW1lIG9mIHdpbmRvdyB3aGVyZSBrZXkgd2FzIHR5cGVkLg0jIGNoYXIgLQkJCVVuZGVybGluZWQgY2hhcmFjdGVyIHRvIHNlYXJjaCBmb3I7DSMJCQkJbWF5IGJlIGVpdGhlciB1cHBlciBvciBsb3dlciBjYXNlLCBhbmQNIwkJCQl3aWxsIG1hdGNoIGVpdGhlciB1cHBlciBvciBsb3dlciBjYXNlLg0NcHJvYyB0a01lbnVGaW5kIHt3IGNoYXJ9IHsNICAgIGdsb2JhbCB0a1ByaXYNICAgIHNldCBjaGFyIFtzdHJpbmcgdG9sb3dlciAkY2hhcl0NICAgIHNldCB3aW5kb3dsaXN0IFt3aW5mbyBjaGlsZCAkd10NDSAgICBmb3JlYWNoIGNoaWxkICR3aW5kb3dsaXN0IHsNCSMgRG9uJ3QgZGVzY2VuZCBpbnRvIG90aGVyIHRvcGxldmVscy4NICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlIFt3aW5mbyB0b3BsZXZlbCBbZm9jdXNdXSBcDQkJW3dpbmZvIHRvcGxldmVsICRjaGlsZF1dfSB7DQkgICAgY29udGludWUNCX0NCWlmIHtbc3RyaW5nIGVxdWFsIFt3aW5mbyBjbGFzcyAkY2hpbGRdICJNZW51Il0gJiYgXA0JCVtzdHJpbmcgZXF1YWwgWyRjaGlsZCBjZ2V0IC10eXBlXSAibWVudWJhciJdfSB7DQkgICAgaWYge1tzdHJpbmcgZXF1YWwgJGNoYXIgIiJdfSB7DQkJcmV0dXJuICRjaGlsZA0JICAgIH0NCSAgICBzZXQgbGFzdCBbJGNoaWxkIGluZGV4IGxhc3RdDQkgICAgZm9yIHtzZXQgaSBbJGNoaWxkIGNnZXQgLXRlYXJvZmZdfSB7JGkgPD0gJGxhc3R9IHtpbmNyIGl9IHsNCQlpZiB7W3N0cmluZyBlcXVhbCBbJGNoaWxkIHR5cGUgJGldICJzZXBhcmF0b3IiXX0gew0JCSAgICBjb250aW51ZQ0JCX0NCQlzZXQgY2hhcjIgW3N0cmluZyBpbmRleCBbJGNoaWxkIGVudHJ5Y2dldCAkaSAtbGFiZWxdIFwNCQkJWyRjaGlsZCBlbnRyeWNnZXQgJGkgLXVuZGVybGluZV1dDQkJaWYge1tzdHJpbmcgZXF1YWwgJGNoYXIgW3N0cmluZyB0b2xvd2VyICRjaGFyMl1dIFwNCQkJfHwgW3N0cmluZyBlcXVhbCAkY2hhciAiIl19IHsNCQkgICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJGNoaWxkIGVudHJ5Y2dldCAkaSAtc3RhdGVdICJkaXNhYmxlZCJdfSB7DQkJCXJldHVybiAkY2hpbGQNCQkgICAgfQ0JCX0NCSAgICB9DQl9DSAgICB9DQ0gICAgZm9yZWFjaCBjaGlsZCAkd2luZG93bGlzdCB7DQkjIERvbid0IGRlc2NlbmQgaW50byBvdGhlciB0b3BsZXZlbHMuDSAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSBbd2luZm8gdG9wbGV2ZWwgW2ZvY3VzXV0gXA0JCVt3aW5mbyB0b3BsZXZlbCAkY2hpbGRdXX0gew0JICAgIGNvbnRpbnVlDQl9DQlzd2l0Y2ggW3dpbmZvIGNsYXNzICRjaGlsZF0gew0JICAgIE1lbnVidXR0b24gew0JCXNldCBjaGFyMiBbc3RyaW5nIGluZGV4IFskY2hpbGQgY2dldCAtdGV4dF0gXA0JCQlbJGNoaWxkIGNnZXQgLXVuZGVybGluZV1dDQkJaWYge1tzdHJpbmcgZXF1YWwgJGNoYXIgW3N0cmluZyB0b2xvd2VyICRjaGFyMl1dIFwNCQkJfHwgW3N0cmluZyBlcXVhbCAkY2hhciAiIl19IHsNCQkgICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJGNoaWxkIGNnZXQgLXN0YXRlXSAiZGlzYWJsZWQiXX0gew0JCQlyZXR1cm4gJGNoaWxkDQkJICAgIH0NCQl9DQkgICAgfQ0NCSAgICBkZWZhdWx0IHsNCQlzZXQgbWF0Y2ggW3RrTWVudUZpbmQgJGNoaWxkICRjaGFyXQ0JCWlmIHtbc3RyaW5nIGNvbXBhcmUgJG1hdGNoICIiXX0gew0JCSAgICByZXR1cm4gJG1hdGNoDQkJfQ0JICAgIH0NCX0NICAgIH0NICAgIHJldHVybiB7fQ19DQ0jIHRrVHJhdmVyc2VUb01lbnUgLS0NIyBUaGlzIHByb2NlZHVyZSBpbXBsZW1lbnRzIGtleWJvYXJkIHRyYXZlcnNhbCBvZiBtZW51cy4gIEdpdmVuIGFuDSMgQVNDSUkgY2hhcmFjdGVyICJjaGFyIiwgaXQgbG9va3MgZm9yIGEgbWVudWJ1dHRvbiB3aXRoIHRoYXQgY2hhcmFjdGVyDSMgdW5kZXJsaW5lZC4gIElmIG9uZSBpcyBmb3VuZCwgaXQgcG9zdHMgdGhlIG1lbnVidXR0b24ncyBtZW51DSMNIyBBcmd1bWVudHM6DSMgdyAtCQkJCVdpbmRvdyBpbiB3aGljaCB0aGUga2V5IHdhcyB0eXBlZCAoc2VsZWN0cw0jCQkJCWEgdG9wbGV2ZWwgd2luZG93KS4NIyBjaGFyIC0JCQlDaGFyYWN0ZXIgdGhhdCBzZWxlY3RzIGEgbWVudS4gIFRoZSBjYXNlDSMJCQkJaXMgaWdub3JlZC4gIElmIGFuIGVtcHR5IHN0cmluZywgbm90aGluZw0jCQkJCWhhcHBlbnMuDQ1wcm9jIHRrVHJhdmVyc2VUb01lbnUge3cgY2hhcn0gew0gICAgZ2xvYmFsIHRrUHJpdg0gICAgaWYge1tzdHJpbmcgZXF1YWwgJGNoYXIgIiJdfSB7DQlyZXR1cm4NICAgIH0NICAgIHdoaWxlIHtbc3RyaW5nIGVxdWFsIFt3aW5mbyBjbGFzcyAkd10gIk1lbnUiXX0gew0JaWYge1tzdHJpbmcgY29tcGFyZSBbJHcgY2dldCAtdHlwZV0gIm1lbnViYXIiXSBcDQkJJiYgW3N0cmluZyBlcXVhbCAkdGtQcml2KHBvc3RlZE1iKSAiIl19IHsNCSAgICByZXR1cm4NCX0NCWlmIHtbc3RyaW5nIGVxdWFsIFskdyBjZ2V0IC10eXBlXSAibWVudWJhciJdfSB7DQkgICAgYnJlYWsNCX0NCXNldCB3IFt3aW5mbyBwYXJlbnQgJHddDSAgICB9DSAgICBzZXQgdyBbdGtNZW51RmluZCBbd2luZm8gdG9wbGV2ZWwgJHddICRjaGFyXQ0gICAgaWYge1tzdHJpbmcgY29tcGFyZSAkdyAiIl19IHsNCWlmIHtbc3RyaW5nIGVxdWFsIFt3aW5mbyBjbGFzcyAkd10gIk1lbnUiXX0gew0JICAgIHRrX21lbnVTZXRGb2N1cyAkdw0JICAgIHNldCB0a1ByaXYod2luZG93KSAkdw0JICAgIHRrU2F2ZUdyYWJJbmZvICR3DQkgICAgZ3JhYiAtZ2xvYmFsICR3DQkgICAgdGtUcmF2ZXJzZVdpdGhpbk1lbnUgJHcgJGNoYXINCX0gZWxzZSB7DQkgICAgdGtNYlBvc3QgJHcNCSAgICB0a01lbnVGaXJzdEVudHJ5IFskdyBjZ2V0IC1tZW51XQ0JfQ0gICAgfQ19DQ0jIHRrRmlyc3RNZW51IC0tDSMgVGhpcyBwcm9jZWR1cmUgdHJhdmVyc2VzIHRvIHRoZSBmaXJzdCBtZW51YnV0dG9uIGluIHRoZSB0b3BsZXZlbA0jIGZvciBhIGdpdmVuIHdpbmRvdywgYW5kIHBvc3RzIHRoYXQgbWVudWJ1dHRvbidzIG1lbnUuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQkJCU5hbWUgb2YgYSB3aW5kb3cuICBTZWxlY3RzIHdoaWNoIHRvcGxldmVsDSMJCQkJdG8gc2VhcmNoIGZvciBtZW51YnV0dG9ucy4NDXByb2MgdGtGaXJzdE1lbnUgdyB7DSAgICBzZXQgdyBbdGtNZW51RmluZCBbd2luZm8gdG9wbGV2ZWwgJHddICIiXQ0gICAgaWYge1tzdHJpbmcgY29tcGFyZSAkdyAiIl19IHsNCWlmIHtbc3RyaW5nIGVxdWFsIFt3aW5mbyBjbGFzcyAkd10gIk1lbnUiXX0gew0JICAgIHRrX21lbnVTZXRGb2N1cyAkdw0JICAgIHNldCB0a1ByaXYod2luZG93KSAkdw0JICAgIHRrU2F2ZUdyYWJJbmZvICR3DQkgICAgZ3JhYiAtZ2xvYmFsICR3DQkgICAgdGtNZW51Rmlyc3RFbnRyeSAkdw0JfSBlbHNlIHsNCSAgICB0a01iUG9zdCAkdw0JICAgIHRrTWVudUZpcnN0RW50cnkgWyR3IGNnZXQgLW1lbnVdDQl9DSAgICB9DX0NDSMgdGtUcmF2ZXJzZVdpdGhpbk1lbnUNIyBUaGlzIHByb2NlZHVyZSBpbXBsZW1lbnRzIGtleWJvYXJkIHRyYXZlcnNhbCB3aXRoaW4gYSBtZW51LiAgSXQNIyBzZWFyY2hlcyBmb3IgYW4gZW50cnkgaW4gdGhlIG1lbnUgdGhhdCBoYXMgImNoYXIiIHVuZGVybGluZWQuICBJZg0jIHN1Y2ggYW4gZW50cnkgaXMgZm91bmQsIGl0IGlzIGludm9rZWQgYW5kIHRoZSBtZW51IGlzIHVucG9zdGVkLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJCQlUaGUgbmFtZSBvZiB0aGUgbWVudSB3aWRnZXQuDSMgY2hhciAtCQkJVGhlIGNoYXJhY3RlciB0byBsb29rIGZvcjsgIGNhc2UgaXMNIwkJCQlpZ25vcmVkLiAgSWYgdGhlIHN0cmluZyBpcyBlbXB0eSB0aGVuDSMJCQkJbm90aGluZyBoYXBwZW5zLg0NcHJvYyB0a1RyYXZlcnNlV2l0aGluTWVudSB7dyBjaGFyfSB7DSAgICBpZiB7W3N0cmluZyBlcXVhbCAkY2hhciAiIl19IHsNCXJldHVybg0gICAgfQ0gICAgc2V0IGNoYXIgW3N0cmluZyB0b2xvd2VyICRjaGFyXQ0gICAgc2V0IGxhc3QgWyR3IGluZGV4IGxhc3RdDSAgICBpZiB7W3N0cmluZyBlcXVhbCAkbGFzdCAibm9uZSJdfSB7DQlyZXR1cm4NICAgIH0NICAgIGZvciB7c2V0IGkgMH0geyRpIDw9ICRsYXN0fSB7aW5jciBpfSB7DQlpZiB7W2NhdGNoIHtzZXQgY2hhcjIgW3N0cmluZyBpbmRleCBcDQkJWyR3IGVudHJ5Y2dldCAkaSAtbGFiZWxdIFskdyBlbnRyeWNnZXQgJGkgLXVuZGVybGluZV1dfV19IHsNCSAgICBjb250aW51ZQ0JfQ0JaWYge1tzdHJpbmcgZXF1YWwgJGNoYXIgW3N0cmluZyB0b2xvd2VyICRjaGFyMl1dfSB7DQkgICAgaWYge1tzdHJpbmcgZXF1YWwgWyR3IHR5cGUgJGldICJjYXNjYWRlIl19IHsNCQkkdyBhY3RpdmF0ZSAkaQ0JCSR3IHBvc3RjYXNjYWRlIGFjdGl2ZQ0JCWV2ZW50IGdlbmVyYXRlICR3IDw8TWVudVNlbGVjdD4+DQkJc2V0IG0yIFskdyBlbnRyeWNnZXQgJGkgLW1lbnVdDQkJaWYge1tzdHJpbmcgY29tcGFyZSAkbTIgIiJdfSB7DQkJICAgIHRrTWVudUZpcnN0RW50cnkgJG0yDQkJfQ0JICAgIH0gZWxzZSB7DQkJdGtNZW51VW5wb3N0ICR3DQkJdXBsZXZlbCAjMCBbbGlzdCAkdyBpbnZva2UgJGldDQkgICAgfQ0JICAgIHJldHVybg0JfQ0gICAgfQ19DQ0jIHRrTWVudUZpcnN0RW50cnkgLS0NIyBHaXZlbiBhIG1lbnUsIHRoaXMgcHJvY2VkdXJlIGZpbmRzIHRoZSBmaXJzdCBlbnRyeSB0aGF0IGlzbid0DSMgZGlzYWJsZWQgb3IgYSB0ZWFyLW9mZiBvciBzZXBhcmF0b3IsIGFuZCBhY3RpdmF0ZXMgdGhhdCBlbnRyeS4NIyBIb3dldmVyLCBpZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGFjdGl2ZSBlbnRyeSBpbiB0aGUgbWVudSAoZS5nLiwNIyBiZWNhdXNlIG9mIGEgcHJldmlvdXMgY2FsbCB0byB0a1Bvc3RPdmVyUG9pbnQpIHRoZW4gdGhlIGFjdGl2ZQ0jIGVudHJ5IGlzbid0IGNoYW5nZWQuICBUaGlzIHByb2NlZHVyZSBhbHNvIHNldHMgdGhlIGlucHV0IGZvY3VzDSMgdG8gdGhlIG1lbnUuDSMNIyBBcmd1bWVudHM6DSMgbWVudSAtCQlOYW1lIG9mIHRoZSBtZW51IHdpbmRvdyAocG9zc2libHkgZW1wdHkpLg0NcHJvYyB0a01lbnVGaXJzdEVudHJ5IG1lbnUgew0gICAgaWYge1tzdHJpbmcgZXF1YWwgJG1lbnUgIiJdfSB7DQlyZXR1cm4NICAgIH0NICAgIHRrX21lbnVTZXRGb2N1cyAkbWVudQ0gICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJG1lbnUgaW5kZXggYWN0aXZlXSAibm9uZSJdfSB7DQlyZXR1cm4NICAgIH0NICAgIHNldCBsYXN0IFskbWVudSBpbmRleCBsYXN0XQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgJGxhc3QgIm5vbmUiXX0gew0JcmV0dXJuDSAgICB9DSAgICBmb3Ige3NldCBpIDB9IHskaSA8PSAkbGFzdH0ge2luY3IgaX0gew0JaWYgeyhbY2F0Y2gge3NldCBzdGF0ZSBbJG1lbnUgZW50cnljZ2V0ICRpIC1zdGF0ZV19XSA9PSAwKSBcDQkJJiYgW3N0cmluZyBjb21wYXJlICRzdGF0ZSAiZGlzYWJsZWQiXSBcDQkJJiYgW3N0cmluZyBjb21wYXJlIFskbWVudSB0eXBlICRpXSAidGVhcm9mZiJdfSB7DQkgICAgJG1lbnUgYWN0aXZhdGUgJGkNCSAgICB0a0dlbmVyYXRlTWVudVNlbGVjdCAkbWVudQ0JICAgICMgT25seSBwb3N0IHRoZSBjYXNjYWRlIGlmIHRoZSBjdXJyZW50IG1lbnUgaXMgYSBtZW51YmFyOw0JICAgICMgb3RoZXJ3aXNlLCBpZiB0aGUgZmlyc3QgZW50cnkgb2YgdGhlIGNhc2NhZGUgaXMgYSBjYXNjYWRlLA0JICAgICMgd2UgY2FuIGdldCBhbiBhbm5veWluZyBjYXNjYWRpbmcgZWZmZWN0IHJlc3VsdGluZyBpbiBhIGJ1bmNoIG9mDQkgICAgIyBtZW51cyBnZXR0aW5nIHBvc3RlZCAoYnVnIDY3NikNCSAgICBpZiB7W3N0cmluZyBlcXVhbCBbJG1lbnUgdHlwZSAkaV0gImNhc2NhZGUiXSAmJiBcDQkJW3N0cmluZyBlcXVhbCBbJG1lbnUgY2dldCAtdHlwZV0gIm1lbnViYXIiXX0gew0JCXNldCBjYXNjYWRlIFskbWVudSBlbnRyeWNnZXQgJGkgLW1lbnVdDQkJaWYge1tzdHJpbmcgY29tcGFyZSAkY2FzY2FkZSAiIl19IHsNCQkgICAgJG1lbnUgcG9zdGNhc2NhZGUgJGkNCQkgICAgdGtNZW51Rmlyc3RFbnRyeSAkY2FzY2FkZQ0JCX0NCSAgICB9DQkgICAgcmV0dXJuDQl9DSAgICB9DX0NDSMgdGtNZW51RmluZE5hbWUgLS0NIyBHaXZlbiBhIG1lbnUgYW5kIGEgdGV4dCBzdHJpbmcsIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIG1lbnUgZW50cnkNIyB0aGF0IGRpc3BsYXlzIHRoZSBzdHJpbmcgYXMgaXRzIGxhYmVsLiAgSWYgdGhlcmUgaXMgbm8gc3VjaCBlbnRyeSwNIyByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLiAgVGhpcyBwcm9jZWR1cmUgaXMgdHJpY2t5IGJlY2F1c2Ugc29tZSBuYW1lcw0jIGxpa2UgImFjdGl2ZSIgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZyBpbiBtZW51IGNvbW1hbmRzLCBzbyB3ZSBjYW4ndA0jIGFsd2F5cyB1c2UgdGhlICJpbmRleCIgd2lkZ2V0IGNvbW1hbmQuDSMNIyBBcmd1bWVudHM6DSMgbWVudSAtCQlOYW1lIG9mIHRoZSBtZW51IHdpZGdldC4NIyBzIC0JCQlTdHJpbmcgdG8gbG9vayBmb3IuDQ1wcm9jIHRrTWVudUZpbmROYW1lIHttZW51IHN9IHsNICAgIHNldCBpICIiDSAgICBpZiB7IVtyZWdleHAge15hY3RpdmUkfF5sYXN0JHxebm9uZSR8XlswLTldfF5AfSAkc119IHsNCWNhdGNoIHtzZXQgaSBbJG1lbnUgaW5kZXggJHNdfQ0JcmV0dXJuICRpDSAgICB9DSAgICBzZXQgbGFzdCBbJG1lbnUgaW5kZXggbGFzdF0NICAgIGlmIHtbc3RyaW5nIGVxdWFsICRsYXN0ICJub25lIl19IHsNCXJldHVybg0gICAgfQ0gICAgZm9yIHtzZXQgaSAwfSB7JGkgPD0gJGxhc3R9IHtpbmNyIGl9IHsNCWlmIHshW2NhdGNoIHskbWVudSBlbnRyeWNnZXQgJGkgLWxhYmVsfSBsYWJlbF19IHsNCSAgICBpZiB7W3N0cmluZyBlcXVhbCAkbGFiZWwgJHNdfSB7DQkJcmV0dXJuICRpDQkgICAgfQ0JfQ0gICAgfQ0gICAgcmV0dXJuICIiDX0NDSMgdGtQb3N0T3ZlclBvaW50IC0tDSMgVGhpcyBwcm9jZWR1cmUgcG9zdHMgYSBnaXZlbiBtZW51IHN1Y2ggdGhhdCBhIGdpdmVuIGVudHJ5IGluIHRoZQ0jIG1lbnUgaXMgY2VudGVyZWQgb3ZlciBhIGdpdmVuIHBvaW50IGluIHRoZSByb290IHdpbmRvdy4gIEl0IGFsc28NIyBhY3RpdmF0ZXMgdGhlIGdpdmVuIGVudHJ5Lg0jDSMgQXJndW1lbnRzOg0jIG1lbnUgLQkJTWVudSB0byBwb3N0Lg0jIHgsIHkgLQkJUm9vdCBjb29yZGluYXRlcyBvZiBwb2ludC4NIyBlbnRyeSAtCQlJbmRleCBvZiBlbnRyeSB3aXRoaW4gbWVudSB0byBjZW50ZXIgb3ZlciAoeCx5KS4NIwkJCUlmIG9taXR0ZWQgb3Igc3BlY2lmaWVkIGFzIHt9LCB0aGVuIHRoZSBtZW51J3MNIwkJCXVwcGVyLWxlZnQgY29ybmVyIGdvZXMgYXQgKHgseSkuDQ1wcm9jIHRrUG9zdE92ZXJQb2ludCB7bWVudSB4IHkge2VudHJ5IHt9fX0gIHsNICAgIGdsb2JhbCB0Y2xfcGxhdGZvcm0NICAgIA0gICAgaWYge1tzdHJpbmcgY29tcGFyZSAkZW50cnkge31dfSB7DQlpZiB7JGVudHJ5ID09IFskbWVudSBpbmRleCBsYXN0XX0gew0JICAgIGluY3IgeSBbZXhwciB7LShbJG1lbnUgeXBvc2l0aW9uICRlbnRyeV0gXA0JCSAgICArIFt3aW5mbyByZXFoZWlnaHQgJG1lbnVdKS8yfV0NCX0gZWxzZSB7DQkgICAgaW5jciB5IFtleHByIHstKFskbWVudSB5cG9zaXRpb24gJGVudHJ5XSBcDQkJICAgICsgWyRtZW51IHlwb3NpdGlvbiBbZXhwciB7JGVudHJ5KzF9XV0pLzJ9XQ0JfQ0JaW5jciB4IFtleHByIHstW3dpbmZvIHJlcXdpZHRoICRtZW51XS8yfV0NICAgIH0NICAgICRtZW51IHBvc3QgJHggJHkNICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJGVudHJ5IHt9XSBcDQkgICAgJiYgW3N0cmluZyBjb21wYXJlIFskbWVudSBlbnRyeWNnZXQgJGVudHJ5IC1zdGF0ZV0gImRpc2FibGVkIl19IHsNCSRtZW51IGFjdGl2YXRlICRlbnRyeQ0JdGtHZW5lcmF0ZU1lbnVTZWxlY3QgJG1lbnUNICAgIH0NfQ0NIyB0a1NhdmVHcmFiSW5mbyAtLQ0jIFNldHMgdGhlIHZhcmlhYmxlcyB0a1ByaXYob2xkR3JhYikgYW5kIHRrUHJpdihncmFiU3RhdHVzKSB0byByZWNvcmQNIyB0aGUgc3RhdGUgb2YgYW55IGV4aXN0aW5nIGdyYWIgb24gdGhlIHcncyBkaXNwbGF5Lg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJCU5hbWUgb2YgYSB3aW5kb3c7ICB1c2VkIHRvIHNlbGVjdCB0aGUgZGlzcGxheQ0jCQkJd2hvc2UgZ3JhYiBpbmZvcm1hdGlvbiBpcyB0byBiZSByZWNvcmRlZC4NDXByb2MgdGtTYXZlR3JhYkluZm8gdyB7DSAgICBnbG9iYWwgdGtQcml2DSAgICBzZXQgdGtQcml2KG9sZEdyYWIpIFtncmFiIGN1cnJlbnQgJHddDSAgICBpZiB7W3N0cmluZyBjb21wYXJlICR0a1ByaXYob2xkR3JhYikgIiJdfSB7DQlzZXQgdGtQcml2KGdyYWJTdGF0dXMpIFtncmFiIHN0YXR1cyAkdGtQcml2KG9sZEdyYWIpXQ0gICAgfQ19DQ0jIHRrUmVzdG9yZU9sZEdyYWIgLS0NIyBSZXN0b3JlcyB0aGUgZ3JhYiB0byB3aGF0IGl0IHdhcyBiZWZvcmUgVGtTYXZlR3JhYkluZm8gd2FzIGNhbGxlZC4NIw0NcHJvYyB0a1Jlc3RvcmVPbGRHcmFiIHt9IHsNICAgIGdsb2JhbCB0a1ByaXYNDSAgICBpZiB7W3N0cmluZyBjb21wYXJlICR0a1ByaXYob2xkR3JhYikgIiJdfSB7DQ0gICAgCSMgQmUgY2FyZWZ1bCByZXN0b3JpbmcgdGhlIG9sZCBncmFiLCBzaW5jZSBpdCdzIHdpbmRvdyBtYXkgbm90DQkjIGJlIHZpc2libGUgYW55bW9yZS4NDQljYXRjaCB7DSAgICAgICAgICBpZiB7W3N0cmluZyBlcXVhbCAkdGtQcml2KGdyYWJTdGF0dXMpICJnbG9iYWwiXX0gew0JCWdyYWIgc2V0IC1nbG9iYWwgJHRrUHJpdihvbGRHcmFiKQ0JICAgIH0gZWxzZSB7DQkJZ3JhYiBzZXQgJHRrUHJpdihvbGRHcmFiKQ0JICAgIH0NCX0NCXNldCB0a1ByaXYob2xkR3JhYikgIiINICAgIH0NfQ0NcHJvYyB0a19tZW51U2V0Rm9jdXMge21lbnV9IHsNICAgIGdsb2JhbCB0a1ByaXYNICAgIGlmIHshW2luZm8gZXhpc3RzIHRrUHJpdihmb2N1cyldIHx8IFtzdHJpbmcgZXF1YWwgJHRrUHJpdihmb2N1cykge31dfSB7DQlzZXQgdGtQcml2KGZvY3VzKSBbZm9jdXNdDSAgICB9DSAgICBmb2N1cyAkbWVudQ19DSAgICANcHJvYyB0a0dlbmVyYXRlTWVudVNlbGVjdCB7bWVudX0gew0gICAgZ2xvYmFsIHRrUHJpdg0NICAgIGlmIHtbc3RyaW5nIGVxdWFsICR0a1ByaXYoYWN0aXZlTWVudSkgJG1lbnVdIFwNICAgICAgICAgICYmIFtzdHJpbmcgZXF1YWwgJHRrUHJpdihhY3RpdmVJdGVtKSBbJG1lbnUgaW5kZXggYWN0aXZlXV19IHsNCXJldHVybg0gICAgfQ0NICAgIHNldCB0a1ByaXYoYWN0aXZlTWVudSkgJG1lbnUNICAgIHNldCB0a1ByaXYoYWN0aXZlSXRlbSkgWyRtZW51IGluZGV4IGFjdGl2ZV0NICAgIGV2ZW50IGdlbmVyYXRlICRtZW51IDw8TWVudVNlbGVjdD4+DX0NDSMgdGtfcG9wdXAgLS0NIyBUaGlzIHByb2NlZHVyZSBwb3BzIHVwIGEgbWVudSBhbmQgc2V0cyB0aGluZ3MgdXAgZm9yIHRyYXZlcnNpbmcNIyB0aGUgbWVudSBhbmQgaXRzIHN1Ym1lbnVzLg0jDSMgQXJndW1lbnRzOg0jIG1lbnUgLQkJTmFtZSBvZiB0aGUgbWVudSB0byBiZSBwb3BwZWQgdXAuDSMgeCwgeSAtCQlSb290IGNvb3JkaW5hdGVzIGF0IHdoaWNoIHRvIHBvcCB1cCB0aGUNIwkJCW1lbnUuDSMgZW50cnkgLQkJSW5kZXggb2YgYSBtZW51IGVudHJ5IHRvIGNlbnRlciBvdmVyICh4LHkpLg0jCQkJSWYgb21pdHRlZCBvciBzcGVjaWZpZWQgYXMge30sIHRoZW4gbWVudSdzDSMJCQl1cHBlci1sZWZ0IGNvcm5lciBnb2VzIGF0ICh4LHkpLg0NcHJvYyB0a19wb3B1cCB7bWVudSB4IHkge2VudHJ5IHt9fX0gew0gICAgZ2xvYmFsIHRrUHJpdg0gICAgZ2xvYmFsIHRjbF9wbGF0Zm9ybQ0gICAgaWYge1tzdHJpbmcgY29tcGFyZSAkdGtQcml2KHBvcHVwKSAiIl0gXA0JICAgIHx8IFtzdHJpbmcgY29tcGFyZSAkdGtQcml2KHBvc3RlZE1iKSAiIl19IHsNCXRrTWVudVVucG9zdCB7fQ0gICAgfQ0gICAgdGtQb3N0T3ZlclBvaW50ICRtZW51ICR4ICR5ICRlbnRyeQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgInVuaXgiXSBcDQkgICAgJiYgW3dpbmZvIHZpZXdhYmxlICRtZW51XX0gew0gICAgICAgIHRrU2F2ZUdyYWJJbmZvICRtZW51DQlncmFiIC1nbG9iYWwgJG1lbnUNCXNldCB0a1ByaXYocG9wdXApICRtZW51DQl0a19tZW51U2V0Rm9jdXMgJG1lbnUNICAgIH0NfQ0AAAZ7IyBvcHRNZW51LnRjbCAtLQ0jDSMgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHByb2NlZHVyZSB0a19vcHRpb25NZW51LCB3aGljaCBjcmVhdGVzDSMgYW4gb3B0aW9uIGJ1dHRvbiBhbmQgaXRzIGFzc29jaWF0ZWQgbWVudS4NIw0jIFJDUzogQCgjKSAkSWQ6IG9wdE1lbnUudGNsLHYgMS4zIDE5OTgvMDkvMTQgMTg6MjM6MjQgc3RhbnRvbiBFeHAgJA0jDSMgQ29weXJpZ2h0IChjKSAxOTk0IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuDSMgQ29weXJpZ2h0IChjKSAxOTk0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4NIw0jIFNlZSB0aGUgZmlsZSAibGljZW5zZS50ZXJtcyIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbg0jIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuDSMNDSMgdGtfb3B0aW9uTWVudSAtLQ0jIFRoaXMgcHJvY2VkdXJlIGNyZWF0ZXMgYW4gb3B0aW9uIGJ1dHRvbiBuYW1lZCAkdyBhbmQgYW4gYXNzb2NpYXRlZA0jIG1lbnUuICBUb2dldGhlciB0aGV5IHByb3ZpZGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgTW90aWYgb3B0aW9uIG1lbnVzOg0jIHRoZXkgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IG9uZSBvZiBtYW55IHZhbHVlcywgYW5kIHRoZSBjdXJyZW50IHZhbHVlDSMgYXBwZWFycyBpbiB0aGUgZ2xvYmFsIHZhcmlhYmxlIHZhck5hbWUsIGFzIHdlbGwgYXMgaW4gdGhlIHRleHQgb2YNIyB0aGUgb3B0aW9uIG1lbnVidXR0b24uICBUaGUgbmFtZSBvZiB0aGUgbWVudSBpcyByZXR1cm5lZCBhcyB0aGUNIyBwcm9jZWR1cmUncyByZXN1bHQsIHNvIHRoYXQgdGhlIGNhbGxlciBjYW4gdXNlIGl0IHRvIGNoYW5nZSBjb25maWd1cmF0aW9uDSMgb3B0aW9ucyBvbiB0aGUgbWVudSBvciBvdGhlcndpc2UgbWFuaXB1bGF0ZSBpdC4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCQlUaGUgbmFtZSB0byB1c2UgZm9yIHRoZSBtZW51YnV0dG9uLg0jIHZhck5hbWUgLQkJR2xvYmFsIHZhcmlhYmxlIHRvIGhvbGQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB2YWx1ZS4NIyBmaXJzdFZhbHVlIC0JCUZpcnN0IG9mIGxlZ2FsIHZhbHVlcyBmb3Igb3B0aW9uIChtdXN0IGJlID49IDEpLg0jIGFyZ3MgLQkJQW55IG51bWJlciBvZiBhZGRpdGlvbmFsIHZhbHVlcy4NDXByb2MgdGtfb3B0aW9uTWVudSB7dyB2YXJOYW1lIGZpcnN0VmFsdWUgYXJnc30gew0gICAgdXB2YXIgIzAgJHZhck5hbWUgdmFyDQ0gICAgaWYgeyFbaW5mbyBleGlzdHMgdmFyXX0gew0Jc2V0IHZhciAkZmlyc3RWYWx1ZQ0gICAgfQ0gICAgbWVudWJ1dHRvbiAkdyAtdGV4dHZhcmlhYmxlICR2YXJOYW1lIC1pbmRpY2F0b3JvbiAxIC1tZW51ICR3Lm1lbnUgXA0JICAgIC1yZWxpZWYgcmFpc2VkIC1iZCAyIC1oaWdobGlnaHR0aGlja25lc3MgMiAtYW5jaG9yIGMgXA0JICAgIC1kaXJlY3Rpb24gZmx1c2gNICAgIG1lbnUgJHcubWVudSAtdGVhcm9mZiAwDSAgICAkdy5tZW51IGFkZCByYWRpb2J1dHRvbiAtbGFiZWwgJGZpcnN0VmFsdWUgLXZhcmlhYmxlICR2YXJOYW1lDSAgICBmb3JlYWNoIGkgJGFyZ3Mgew0gICAgCSR3Lm1lbnUgYWRkIHJhZGlvYnV0dG9uIC1sYWJlbCAkaSAtdmFyaWFibGUgJHZhck5hbWUNICAgIH0NICAgIHJldHVybiAkdy5tZW51DX0NAAAc5CMgcGFsZXR0ZS50Y2wgLS0NIw0jIFRoaXMgZmlsZSBjb250YWlucyBwcm9jZWR1cmVzIHRoYXQgY2hhbmdlIHRoZSBjb2xvciBwYWxldHRlIHVzZWQNIyBieSBUay4NIw0jIFJDUzogQCgjKSAkSWQ6IHBhbGV0dGUudGNsLHYgMS41IDE5OTkvMDkvMDIgMTc6MDI6NTMgaG9iYnMgRXhwICQNIw0jIENvcHlyaWdodCAoYykgMTk5NS0xOTk3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4NIw0jIFNlZSB0aGUgZmlsZSAibGljZW5zZS50ZXJtcyIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbg0jIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuDSMNDSMgdGtfc2V0UGFsZXR0ZSAtLQ0jIENoYW5nZXMgdGhlIGRlZmF1bHQgY29sb3Igc2NoZW1lIGZvciBhIFRrIGFwcGxpY2F0aW9uIGJ5IHNldHRpbmcNIyBkZWZhdWx0IGNvbG9ycyBpbiB0aGUgb3B0aW9uIGRhdGFiYXNlIGFuZCBieSBtb2RpZnlpbmcgYWxsIG9mIHRoZQ0jIGNvbG9yIG9wdGlvbnMgZm9yIGV4aXN0aW5nIHdpZGdldHMgdGhhdCBoYXZlIHRoZSBkZWZhdWx0IHZhbHVlLg0jDSMgQXJndW1lbnRzOg0jIFRoZSBhcmd1bWVudHMgY29uc2lzdCBvZiBlaXRoZXIgYSBzaW5nbGUgY29sb3IgbmFtZSwgd2hpY2gNIyB3aWxsIGJlIHVzZWQgYXMgdGhlIG5ldyBiYWNrZ3JvdW5kIGNvbG9yIChhbGwgb3RoZXIgY29sb3JzIHdpbGwNIyBiZSBjb21wdXRlZCBmcm9tIHRoaXMpIG9yIGFuIGV2ZW4gbnVtYmVyIG9mIHZhbHVlcyBjb25zaXN0aW5nIG9mDSMgb3B0aW9uIG5hbWVzIGFuZCB2YWx1ZXMuICBUaGUgbmFtZSBmb3IgYW4gb3B0aW9uIGlzIHRoZSBvbmUgdXNlZA0jIGZvciB0aGUgb3B0aW9uIGRhdGFiYXNlLCBzdWNoIGFzIGFjdGl2ZUZvcmVncm91bmQsIG5vdCAtYWN0aXZlZm9yZWdyb3VuZC4NDXByb2MgdGtfc2V0UGFsZXR0ZSB7YXJnc30gew0gICAgaWYge1t3aW5mbyBkZXB0aCAuXSA9PSAxfSB7DQkjIEp1c3QgcmV0dXJuIG9uIG1vbm9jaHJvbWUgZGlzcGxheXMsIG90aGVyd2lzZSBlcnJvcnMgd2lsbCBvY2N1cg0JcmV0dXJuDSAgICB9DQ0gICAgZ2xvYmFsIHRrUGFsZXR0ZQ0NICAgICMgQ3JlYXRlIGFuIGFycmF5IHRoYXQgaGFzIHRoZSBjb21wbGV0ZSBuZXcgcGFsZXR0ZS4gIElmIHNvbWUgY29sb3JzDSAgICAjIGFyZW4ndCBzcGVjaWZpZWQsIGNvbXB1dGUgdGhlbSBmcm9tIG90aGVyIGNvbG9ycyB0aGF0IGFyZSBzcGVjaWZpZWQuDQ0gICAgaWYge1tsbGVuZ3RoICRhcmdzXSA9PSAxfSB7DQlzZXQgbmV3KGJhY2tncm91bmQpIFtsaW5kZXggJGFyZ3MgMF0NICAgIH0gZWxzZSB7DQlhcnJheSBzZXQgbmV3ICRhcmdzDSAgICB9DSAgICBpZiB7IVtpbmZvIGV4aXN0cyBuZXcoYmFja2dyb3VuZCldfSB7DQllcnJvciAibXVzdCBzcGVjaWZ5IGEgYmFja2dyb3VuZCBjb2xvciINICAgIH0NICAgIGlmIHshW2luZm8gZXhpc3RzIG5ldyhmb3JlZ3JvdW5kKV19IHsNCXNldCBuZXcoZm9yZWdyb3VuZCkgYmxhY2sNICAgIH0NICAgIHNldCBiZyBbd2luZm8gcmdiIC4gJG5ldyhiYWNrZ3JvdW5kKV0NICAgIHNldCBmZyBbd2luZm8gcmdiIC4gJG5ldyhmb3JlZ3JvdW5kKV0NICAgIHNldCBkYXJrZXJCZyBbZm9ybWF0ICMlMDJ4JTAyeCUwMnggW2V4cHIgeyg5KltsaW5kZXggJGJnIDBdKS8yNTYwfV0gXA0JICAgIFtleHByIHsoOSpbbGluZGV4ICRiZyAxXSkvMjU2MH1dIFtleHByIHsoOSpbbGluZGV4ICRiZyAyXSkvMjU2MH1dXQ0gICAgZm9yZWFjaCBpIHthY3RpdmVGb3JlZ3JvdW5kIGluc2VydEJhY2tncm91bmQgc2VsZWN0Rm9yZWdyb3VuZCBcDQkgICAgaGlnaGxpZ2h0Q29sb3J9IHsNCWlmIHshW2luZm8gZXhpc3RzIG5ldygkaSldfSB7DQkgICAgc2V0IG5ldygkaSkgJG5ldyhmb3JlZ3JvdW5kKQ0JfQ0gICAgfQ0gICAgaWYgeyFbaW5mbyBleGlzdHMgbmV3KGRpc2FibGVkRm9yZWdyb3VuZCldfSB7DQlzZXQgbmV3KGRpc2FibGVkRm9yZWdyb3VuZCkgW2Zvcm1hdCAjJTAyeCUwMnglMDJ4IFwNCQlbZXhwciB7KDMqW2xpbmRleCAkYmcgMF0gKyBbbGluZGV4ICRmZyAwXSkvMTAyNH1dIFwNCQlbZXhwciB7KDMqW2xpbmRleCAkYmcgMV0gKyBbbGluZGV4ICRmZyAxXSkvMTAyNH1dIFwNCQlbZXhwciB7KDMqW2xpbmRleCAkYmcgMl0gKyBbbGluZGV4ICRmZyAyXSkvMTAyNH1dXQ0gICAgfQ0gICAgaWYgeyFbaW5mbyBleGlzdHMgbmV3KGhpZ2hsaWdodEJhY2tncm91bmQpXX0gew0Jc2V0IG5ldyhoaWdobGlnaHRCYWNrZ3JvdW5kKSAkbmV3KGJhY2tncm91bmQpDSAgICB9DSAgICBpZiB7IVtpbmZvIGV4aXN0cyBuZXcoYWN0aXZlQmFja2dyb3VuZCldfSB7DQkjIFBpY2sgYSBkZWZhdWx0IGFjdGl2ZSBiYWNrZ3JvdW5kIHRoYXQgaXNsaWdodGVyIHRoYW4gdGhlDQkjIG5vcm1hbCBiYWNrZ3JvdW5kLiAgVG8gZG8gdGhpcywgcm91bmQgZWFjaCBjb2xvciBjb21wb25lbnQNCSMgdXAgYnkgMTUlIG9yIDEvMyBvZiB0aGUgd2F5IHRvIGZ1bGwgd2hpdGUsIHdoaWNoZXZlciBpcw0JIyBncmVhdGVyLg0NCWZvcmVhY2ggaSB7MCAxIDJ9IHsNCSAgICBzZXQgbGlnaHQoJGkpIFtleHByIHtbbGluZGV4ICRiZyAkaV0vMjU2fV0NCSAgICBzZXQgaW5jMSBbZXhwciB7KCRsaWdodCgkaSkqMTUpLzEwMH1dDQkgICAgc2V0IGluYzIgW2V4cHIgeygyNTUtJGxpZ2h0KCRpKSkvM31dDQkgICAgaWYgeyRpbmMxID4gJGluYzJ9IHsNCQlpbmNyIGxpZ2h0KCRpKSAkaW5jMQ0JICAgIH0gZWxzZSB7DQkJaW5jciBsaWdodCgkaSkgJGluYzINCSAgICB9DQkgICAgaWYgeyRsaWdodCgkaSkgPiAyNTV9IHsNCQlzZXQgbGlnaHQoJGkpIDI1NQ0JICAgIH0NCX0NCXNldCBuZXcoYWN0aXZlQmFja2dyb3VuZCkgW2Zvcm1hdCAjJTAyeCUwMnglMDJ4ICRsaWdodCgwKSBcDQkJJGxpZ2h0KDEpICRsaWdodCgyKV0NICAgIH0NICAgIGlmIHshW2luZm8gZXhpc3RzIG5ldyhzZWxlY3RCYWNrZ3JvdW5kKV19IHsNCXNldCBuZXcoc2VsZWN0QmFja2dyb3VuZCkgJGRhcmtlckJnDSAgICB9DSAgICBpZiB7IVtpbmZvIGV4aXN0cyBuZXcodHJvdWdoQ29sb3IpXX0gew0Jc2V0IG5ldyh0cm91Z2hDb2xvcikgJGRhcmtlckJnDSAgICB9DSAgICBpZiB7IVtpbmZvIGV4aXN0cyBuZXcoc2VsZWN0Q29sb3IpXX0gew0Jc2V0IG5ldyhzZWxlY3RDb2xvcikgI2IwMzA2MA0gICAgfQ0NICAgICMgbGV0J3MgbWFrZSBvbmUgb2YgZWFjaCBvZiB0aGUgd2lkZ2V0cyBzbyB3ZSBrbm93IHdoYXQgdGhlIA0gICAgIyBkZWZhdWx0cyBhcmUgY3VycmVudGx5IGZvciB0aGlzIHBsYXRmb3JtLg0gICAgdG9wbGV2ZWwgLl9fX3RrX3NldF9wYWxldHRlDSAgICB3bSB3aXRoZHJhdyAuX19fdGtfc2V0X3BhbGV0dGUNICAgIGZvcmVhY2ggcSB7YnV0dG9uIGNhbnZhcyBjaGVja2J1dHRvbiBlbnRyeSBmcmFtZSBsYWJlbCBsaXN0Ym94IFwNCSAgICBtZW51YnV0dG9uIG1lbnUgbWVzc2FnZSByYWRpb2J1dHRvbiBzY2FsZSBzY3JvbGxiYXIgdGV4dH0gew0JJHEgLl9fX3RrX3NldF9wYWxldHRlLiRxDSAgICB9DQ0gICAgIyBXYWxrIHRoZSB3aWRnZXQgaGllcmFyY2h5LCByZWNvbG9yaW5nIGFsbCBleGlzdGluZyB3aW5kb3dzLg0gICAgIyBUaGUgb3B0aW9uIGRhdGFiYXNlIG11c3QgYmUgc2V0IGFjY29yZGluZyB0byB3aGF0IHdlIGRvIGhlcmUsIA0gICAgIyBidXQgaXQgYnJlYWtzIHRoaW5ncyBpZiB3ZSBzZXQgdGhpbmdzIGluIHRoZSBkYXRhYmFzZSB3aGlsZSANICAgICMgd2UgYXJlIGNoYW5naW5nIGNvbG9ycy4uLnNvLCB0a1JlY29sb3JUcmVlIG5vdyByZXR1cm5zIHRoZQ0gICAgIyBvcHRpb24gZGF0YWJhc2UgY2hhbmdlcyB0aGF0IG5lZWQgdG8gYmUgbWFkZSwgYW5kIHRoZXkNICAgICMgbmVlZCB0byBiZSBldmFsbGVkIGhlcmUgdG8gdGFrZSBlZmZlY3QuDSAgICAjIFdlIGhhdmUgdG8gd2FsayB0aGUgd2hvbGUgd2lkZ2V0IHRyZWUgaW5zdGVhZCBvZiBqdXN0IA0gICAgIyByZWx5aW5nIG9uIHRoZSB3aWRnZXRzIHdlJ3ZlIGNyZWF0ZWQgYWJvdmUgdG8gZG8gdGhlIHdvcmsNICAgICMgYmVjYXVzZSBkaWZmZXJlbnQgZXh0ZW5zaW9ucyBtYXkgcHJvdmlkZSBvdGhlciBraW5kcw0gICAgIyBvZiB3aWRnZXRzIHRoYXQgd2UgZG9uJ3QgY3VycmVudGx5IGtub3cgYWJvdXQsIHNvIHdlJ2xsDSAgICAjIHdhbGsgdGhlIHdob2xlIGhpZXJhcmNoeSBqdXN0IGluIGNhc2UuDQ0gICAgZXZhbCBbdGtSZWNvbG9yVHJlZSAuIG5ld10NDSAgICBjYXRjaCB7ZGVzdHJveSAuX19fdGtfc2V0X3BhbGV0dGV9DQ0gICAgIyBDaGFuZ2UgdGhlIG9wdGlvbiBkYXRhYmFzZSBzbyB0aGF0IGZ1dHVyZSB3aW5kb3dzIHdpbGwgZ2V0IHRoZQ0gICAgIyBzYW1lIGNvbG9ycy4NDSAgICBmb3JlYWNoIG9wdGlvbiBbYXJyYXkgbmFtZXMgbmV3XSB7DQlvcHRpb24gYWRkICokb3B0aW9uICRuZXcoJG9wdGlvbikgd2lkZ2V0RGVmYXVsdA0gICAgfQ0NICAgICMgU2F2ZSB0aGUgb3B0aW9ucyBpbiB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRrUGFsZXR0ZSwgZm9yIHVzZSB0aGUNICAgICMgbmV4dCB0aW1lIHdlIGNoYW5nZSB0aGUgb3B0aW9ucy4NDSAgICBhcnJheSBzZXQgdGtQYWxldHRlIFthcnJheSBnZXQgbmV3XQ19DQ0jIHRrUmVjb2xvclRyZWUgLS0NIyBUaGlzIHByb2NlZHVyZSBjaGFuZ2VzIHRoZSBjb2xvcnMgaW4gYSB3aW5kb3cgYW5kIGFsbCBvZiBpdHMNIyBkZXNjZW5kYW50cywgYWNjb3JkaW5nIHRvIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBjb2xvcnMNIyBhcmd1bWVudC4gVGhpcyBsb29rcyBhdCB0aGUgZGVmYXVsdHMgcHJvdmlkZWQgYnkgdGhlIG9wdGlvbiANIyBkYXRhYmFzZSwgaWYgaXQgZXhpc3RzLCBhbmQgaWYgbm90LCB0aGVuIGl0IGxvb2tzIGF0IHRoZSBkZWZhdWx0DSMgdmFsdWUgb2YgdGhlIHdpZGdldCBpdHNlbGYuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQkJVGhlIG5hbWUgb2YgYSB3aW5kb3cuICBUaGlzIHdpbmRvdyBhbmQgYWxsIGl0cw0jCQkJZGVzY2VuZGFudHMgYXJlIHJlY29sb3JlZC4NIyBjb2xvcnMgLQkJVGhlIG5hbWUgb2YgYW4gYXJyYXkgdmFyaWFibGUgaW4gdGhlIGNhbGxlciwNIwkJCXdoaWNoIGNvbnRhaW5zIGNvbG9yIGluZm9ybWF0aW9uLiAgRWFjaCBlbGVtZW50DSMJCQlpcyBuYW1lZCBhZnRlciBhIHdpZGdldCBjb25maWd1cmF0aW9uIG9wdGlvbiwgYW5kDSMJCQllYWNoIHZhbHVlIGlzIHRoZSB2YWx1ZSBmb3IgdGhhdCBvcHRpb24uDQ1wcm9jIHRrUmVjb2xvclRyZWUge3cgY29sb3JzfSB7DSAgICBnbG9iYWwgdGtQYWxldHRlDSAgICB1cHZhciAkY29sb3JzIGMNICAgIHNldCByZXN1bHQge30NICAgIGZvcmVhY2ggZGJPcHRpb24gW2FycmF5IG5hbWVzIGNdIHsNCXNldCBvcHRpb24gLVtzdHJpbmcgdG9sb3dlciAkZGJPcHRpb25dDQlpZiB7IVtjYXRjaCB7JHcgY29uZmlnICRvcHRpb259IHZhbHVlXX0gew0JICAgICMgaWYgdGhlIG9wdGlvbiBkYXRhYmFzZSBoYXMgYSBwcmVmZXJlbmNlIGZvciB0aGlzDQkgICAgIyBkYk9wdGlvbiwgdGhlbiB1c2UgaXQsIG90aGVyd2lzZSB1c2UgdGhlIGRlZmF1bHRzDQkgICAgIyBmb3IgdGhlIHdpZGdldC4NCSAgICBzZXQgZGVmYXVsdGNvbG9yIFtvcHRpb24gZ2V0ICR3ICRkYk9wdGlvbiB3aWRnZXREZWZhdWx0XQ0JICAgIGlmIHtbc3RyaW5nIG1hdGNoIHt9ICRkZWZhdWx0Y29sb3JdfSB7DQkJc2V0IGRlZmF1bHRjb2xvciBbd2luZm8gcmdiIC4gW2xpbmRleCAkdmFsdWUgM11dDQkgICAgfSBlbHNlIHsNCQlzZXQgZGVmYXVsdGNvbG9yIFt3aW5mbyByZ2IgLiAkZGVmYXVsdGNvbG9yXQ0JICAgIH0NCSAgICBzZXQgY2hvc2VuY29sb3IgW3dpbmZvIHJnYiAuIFtsaW5kZXggJHZhbHVlIDRdXQ0JICAgIGlmIHtbc3RyaW5nIG1hdGNoICRkZWZhdWx0Y29sb3IgJGNob3NlbmNvbG9yXX0gew0JCSMgQ2hhbmdlIHRoZSBvcHRpb24gZGF0YWJhc2Ugc28gdGhhdCBmdXR1cmUgd2luZG93cyB3aWxsIGdldA0JCSMgdGhlIHNhbWUgY29sb3JzLg0JCWFwcGVuZCByZXN1bHQgIjtcbm9wdGlvbiBhZGQgW2xpc3QgXA0JCSAgICAqW3dpbmZvIGNsYXNzICR3XS4kZGJPcHRpb24gJGMoJGRiT3B0aW9uKSA2MF0iDQkJJHcgY29uZmlndXJlICRvcHRpb24gJGMoJGRiT3B0aW9uKQ0JICAgIH0NCX0NICAgIH0NICAgIGZvcmVhY2ggY2hpbGQgW3dpbmZvIGNoaWxkcmVuICR3XSB7DQlhcHBlbmQgcmVzdWx0ICI7XG5bdGtSZWNvbG9yVHJlZSAkY2hpbGQgY10iDSAgICB9DSAgICByZXR1cm4gJHJlc3VsdA19DQ0jIHRrRGFya2VuIC0tDSMgR2l2ZW4gYSBjb2xvciBuYW1lLCBjb21wdXRlcyBhIG5ldyBjb2xvciB2YWx1ZSB0aGF0IGRhcmtlbnMgKG9yDSMgYnJpZ2h0ZW5zKSB0aGUgZ2l2ZW4gY29sb3IgYnkgYSBnaXZlbiBwZXJjZW50Lg0jDSMgQXJndW1lbnRzOg0jIGNvbG9yIC0JTmFtZSBvZiBzdGFydGluZyBjb2xvci4NIyBwZXJlY2VudCAtCUludGVnZXIgdGVsbGluZyBob3cgbXVjaCB0byBicmlnaHRlbiBvciBkYXJrZW4gYXMgYQ0jCQlwZXJjZW50OiA1MCBtZWFucyBkYXJrZW4gYnkgNTAlLCAxMTAgbWVhbnMgYnJpZ2h0ZW4NIwkJYnkgMTAlLg0NcHJvYyB0a0RhcmtlbiB7Y29sb3IgcGVyY2VudH0gew0gICAgZm9yZWFjaCB7cmVkIGdyZWVuIGJsdWV9IFt3aW5mbyByZ2IgLiAkY29sb3JdIHsNCXNldCByZWQgW2V4cHIgeygkcmVkLzI1NikqJHBlcmNlbnQvMTAwfV0NCXNldCBncmVlbiBbZXhwciB7KCRncmVlbi8yNTYpKiRwZXJjZW50LzEwMH1dDQlzZXQgYmx1ZSBbZXhwciB7KCRibHVlLzI1NikqJHBlcmNlbnQvMTAwfV0NCWJyZWFrDSAgICB9DSAgICBpZiB7JHJlZCA+IDI1NX0gew0Jc2V0IHJlZCAyNTUNICAgIH0NICAgIGlmIHskZ3JlZW4gPiAyNTV9IHsNCXNldCBncmVlbiAyNTUNICAgIH0NICAgIGlmIHskYmx1ZSA+IDI1NX0gew0Jc2V0IGJsdWUgMjU1DSAgICB9DSAgICByZXR1cm4gW2Zvcm1hdCAiIyUwMnglMDJ4JTAyeCIgJHJlZCAkZ3JlZW4gJGJsdWVdDX0NDSMgdGtfYmlzcXVlIC0tDSMgUmVzZXQgdGhlIFRrIGNvbG9yIHBhbGV0dGUgdG8gdGhlIG9sZCAiYmlzcXVlIiBjb2xvcnMuDSMNIyBBcmd1bWVudHM6DSMgTm9uZS4NDXByb2MgdGtfYmlzcXVlIHt9IHsNICAgIHRrX3NldFBhbGV0dGUgYWN0aXZlQmFja2dyb3VuZCAjZTZjZWIxIGFjdGl2ZUZvcmVncm91bmQgYmxhY2sgXA0JICAgIGJhY2tncm91bmQgI2ZmZTRjNCBkaXNhYmxlZEZvcmVncm91bmQgI2IwYjBiMCBmb3JlZ3JvdW5kIGJsYWNrIFwNCSAgICBoaWdobGlnaHRCYWNrZ3JvdW5kICNmZmU0YzQgaGlnaGxpZ2h0Q29sb3IgYmxhY2sgXA0JICAgIGluc2VydEJhY2tncm91bmQgYmxhY2sgc2VsZWN0Q29sb3IgI2IwMzA2MCBcDQkgICAgc2VsZWN0QmFja2dyb3VuZCAjZTZjZWIxIHNlbGVjdEZvcmVncm91bmQgYmxhY2sgXA0JICAgIHRyb3VnaENvbG9yICNjZGI3OWUNfQ0AABtrIyBzY2FsZS50Y2wgLS0NIw0jIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBkZWZhdWx0IGJpbmRpbmdzIGZvciBUayBzY2FsZSB3aWRnZXRzIGFuZCBwcm92aWRlcw0jIHByb2NlZHVyZXMgdGhhdCBoZWxwIGluIGltcGxlbWVudGluZyB0aGUgYmluZGluZ3MuDSMNIyBSQ1M6IEAoIykgJElkOiBzY2FsZS50Y2wsdiAxLjcgMjAwMC8wNC8xNCAwODozMzozMSBob2JicyBFeHAgJA0jDSMgQ29weXJpZ2h0IChjKSAxOTk0IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuDSMgQ29weXJpZ2h0IChjKSAxOTk0LTE5OTUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLg0jDSMgU2VlIHRoZSBmaWxlICJsaWNlbnNlLnRlcm1zIiBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIHJlZGlzdHJpYnV0aW9uDSMgb2YgdGhpcyBmaWxlLCBhbmQgZm9yIGEgRElTQ0xBSU1FUiBPRiBBTEwgV0FSUkFOVElFUy4NIw0NIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NIyBUaGUgY29kZSBiZWxvdyBjcmVhdGVzIHRoZSBkZWZhdWx0IGNsYXNzIGJpbmRpbmdzIGZvciBlbnRyaWVzLg0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0NIyBTdGFuZGFyZCBNb3RpZiBiaW5kaW5nczoNDWJpbmQgU2NhbGUgPEVudGVyPiB7DSAgICBpZiB7JHRrX3N0cmljdE1vdGlmfSB7DQlzZXQgdGtQcml2KGFjdGl2ZUJnKSBbJVcgY2dldCAtYWN0aXZlYmFja2dyb3VuZF0NCSVXIGNvbmZpZyAtYWN0aXZlYmFja2dyb3VuZCBbJVcgY2dldCAtYmFja2dyb3VuZF0NICAgIH0NICAgIHRrU2NhbGVBY3RpdmF0ZSAlVyAleCAleQ19DWJpbmQgU2NhbGUgPE1vdGlvbj4gew0gICAgdGtTY2FsZUFjdGl2YXRlICVXICV4ICV5DX0NYmluZCBTY2FsZSA8TGVhdmU+IHsNICAgIGlmIHskdGtfc3RyaWN0TW90aWZ9IHsNCSVXIGNvbmZpZyAtYWN0aXZlYmFja2dyb3VuZCAkdGtQcml2KGFjdGl2ZUJnKQ0gICAgfQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgWyVXIGNnZXQgLXN0YXRlXSAiYWN0aXZlIl19IHsNCSVXIGNvbmZpZ3VyZSAtc3RhdGUgbm9ybWFsDSAgICB9DX0NYmluZCBTY2FsZSA8MT4gew0gICAgdGtTY2FsZUJ1dHRvbkRvd24gJVcgJXggJXkNfQ1iaW5kIFNjYWxlIDxCMS1Nb3Rpb24+IHsNICAgIHRrU2NhbGVEcmFnICVXICV4ICV5DX0NYmluZCBTY2FsZSA8QjEtTGVhdmU+IHsgfQ1iaW5kIFNjYWxlIDxCMS1FbnRlcj4geyB9DWJpbmQgU2NhbGUgPEJ1dHRvblJlbGVhc2UtMT4gew0gICAgdGtDYW5jZWxSZXBlYXQNICAgIHRrU2NhbGVFbmREcmFnICVXDSAgICB0a1NjYWxlQWN0aXZhdGUgJVcgJXggJXkNfQ1iaW5kIFNjYWxlIDwyPiB7DSAgICB0a1NjYWxlQnV0dG9uMkRvd24gJVcgJXggJXkNfQ1iaW5kIFNjYWxlIDxCMi1Nb3Rpb24+IHsNICAgIHRrU2NhbGVEcmFnICVXICV4ICV5DX0NYmluZCBTY2FsZSA8QjItTGVhdmU+IHsgfQ1iaW5kIFNjYWxlIDxCMi1FbnRlcj4geyB9DWJpbmQgU2NhbGUgPEJ1dHRvblJlbGVhc2UtMj4gew0gICAgdGtDYW5jZWxSZXBlYXQNICAgIHRrU2NhbGVFbmREcmFnICVXDSAgICB0a1NjYWxlQWN0aXZhdGUgJVcgJXggJXkNfQ1iaW5kIFNjYWxlIDxDb250cm9sLTE+IHsNICAgIHRrU2NhbGVDb250cm9sUHJlc3MgJVcgJXggJXkNfQ1iaW5kIFNjYWxlIDxVcD4gew0gICAgdGtTY2FsZUluY3JlbWVudCAlVyB1cCBsaXR0bGUgbm9SZXBlYXQNfQ1iaW5kIFNjYWxlIDxEb3duPiB7DSAgICB0a1NjYWxlSW5jcmVtZW50ICVXIGRvd24gbGl0dGxlIG5vUmVwZWF0DX0NYmluZCBTY2FsZSA8TGVmdD4gew0gICAgdGtTY2FsZUluY3JlbWVudCAlVyB1cCBsaXR0bGUgbm9SZXBlYXQNfQ1iaW5kIFNjYWxlIDxSaWdodD4gew0gICAgdGtTY2FsZUluY3JlbWVudCAlVyBkb3duIGxpdHRsZSBub1JlcGVhdA19DWJpbmQgU2NhbGUgPENvbnRyb2wtVXA+IHsNICAgIHRrU2NhbGVJbmNyZW1lbnQgJVcgdXAgYmlnIG5vUmVwZWF0DX0NYmluZCBTY2FsZSA8Q29udHJvbC1Eb3duPiB7DSAgICB0a1NjYWxlSW5jcmVtZW50ICVXIGRvd24gYmlnIG5vUmVwZWF0DX0NYmluZCBTY2FsZSA8Q29udHJvbC1MZWZ0PiB7DSAgICB0a1NjYWxlSW5jcmVtZW50ICVXIHVwIGJpZyBub1JlcGVhdA19DWJpbmQgU2NhbGUgPENvbnRyb2wtUmlnaHQ+IHsNICAgIHRrU2NhbGVJbmNyZW1lbnQgJVcgZG93biBiaWcgbm9SZXBlYXQNfQ1iaW5kIFNjYWxlIDxIb21lPiB7DSAgICAlVyBzZXQgWyVXIGNnZXQgLWZyb21dDX0NYmluZCBTY2FsZSA8RW5kPiB7DSAgICAlVyBzZXQgWyVXIGNnZXQgLXRvXQ19DQ0jIHRrU2NhbGVBY3RpdmF0ZSAtLQ0jIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgdG8gY2hlY2sgYSBnaXZlbiB4LXkgcG9zaXRpb24gaW4gdGhlDSMgc2NhbGUgYW5kIGFjdGl2YXRlIHRoZSBzbGlkZXIgaWYgdGhlIHgteSBwb3NpdGlvbiBmYWxscyB3aXRoaW4NIyB0aGUgc2xpZGVyLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIHNjYWxlIHdpZGdldC4NIyB4LCB5IC0JTW91c2UgY29vcmRpbmF0ZXMuDQ1wcm9jIHRrU2NhbGVBY3RpdmF0ZSB7dyB4IHl9IHsNICAgIGlmIHtbc3RyaW5nIGVxdWFsIFskdyBjZ2V0IC1zdGF0ZV0gImRpc2FibGVkIl19IHsNCXJldHVybg0gICAgfQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgWyR3IGlkZW50aWZ5ICR4ICR5XSAic2xpZGVyIl19IHsNCXNldCBzdGF0ZSBhY3RpdmUNICAgIH0gZWxzZSB7DQlzZXQgc3RhdGUgbm9ybWFsDSAgICB9DSAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskdyBjZ2V0IC1zdGF0ZV0gJHN0YXRlXX0gew0JJHcgY29uZmlndXJlIC1zdGF0ZSAkc3RhdGUNICAgIH0NfQ0NIyB0a1NjYWxlQnV0dG9uRG93biAtLQ0jIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgd2hlbiBhIGJ1dHRvbiBpcyBwcmVzc2VkIGluIGEgc2NhbGUuICBJdA0jIHRha2VzIGRpZmZlcmVudCBhY3Rpb25zIGRlcGVuZGluZyBvbiB3aGVyZSB0aGUgYnV0dG9uIHdhcyBwcmVzc2VkLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIHNjYWxlIHdpZGdldC4NIyB4LCB5IC0JTW91c2UgY29vcmRpbmF0ZXMgb2YgYnV0dG9uIHByZXNzLg0NcHJvYyB0a1NjYWxlQnV0dG9uRG93biB7dyB4IHl9IHsNICAgIGdsb2JhbCB0a1ByaXYNICAgIHNldCB0a1ByaXYoZHJhZ2dpbmcpIDANICAgIHNldCBlbCBbJHcgaWRlbnRpZnkgJHggJHldDSAgICBpZiB7W3N0cmluZyBlcXVhbCAkZWwgInRyb3VnaDEiXX0gew0JdGtTY2FsZUluY3JlbWVudCAkdyB1cCBsaXR0bGUgaW5pdGlhbA0gICAgfSBlbHNlaWYge1tzdHJpbmcgZXF1YWwgJGVsICJ0cm91Z2gyIl19IHsNCXRrU2NhbGVJbmNyZW1lbnQgJHcgZG93biBsaXR0bGUgaW5pdGlhbA0gICAgfSBlbHNlaWYge1tzdHJpbmcgZXF1YWwgJGVsICJzbGlkZXIiXX0gew0Jc2V0IHRrUHJpdihkcmFnZ2luZykgMQ0Jc2V0IHRrUHJpdihpbml0VmFsdWUpIFskdyBnZXRdDQlzZXQgY29vcmRzIFskdyBjb29yZHNdDQlzZXQgdGtQcml2KGRlbHRhWCkgW2V4cHIgeyR4IC0gW2xpbmRleCAkY29vcmRzIDBdfV0NCXNldCB0a1ByaXYoZGVsdGFZKSBbZXhwciB7JHkgLSBbbGluZGV4ICRjb29yZHMgMV19XQ0JJHcgY29uZmlndXJlIC1zbGlkZXJyZWxpZWYgc3Vua2VuDSAgICB9DX0NDSMgdGtTY2FsZURyYWcgLS0NIyBUaGlzIHByb2NlZHVyZSBpcyBjYWxsZWQgd2hlbiB0aGUgbW91c2UgaXMgZHJhZ2dlZCB3aXRoDSMgbW91c2UgYnV0dG9uIDEgZG93bi4gIElmIHRoZSBkcmFnIHN0YXJ0ZWQgaW5zaWRlIHRoZSBzbGlkZXINIyAoaS5lLiB0aGUgc2NhbGUgaXMgYWN0aXZlKSB0aGVuIHRoZSBzY2FsZSdzIHZhbHVlIGlzIGFkanVzdGVkDSMgdG8gcmVmbGVjdCB0aGUgbW91c2UncyBwb3NpdGlvbi4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSBzY2FsZSB3aWRnZXQuDSMgeCwgeSAtCU1vdXNlIGNvb3JkaW5hdGVzLg0NcHJvYyB0a1NjYWxlRHJhZyB7dyB4IHl9IHsNICAgIGdsb2JhbCB0a1ByaXYNICAgIGlmIHshJHRrUHJpdihkcmFnZ2luZyl9IHsNCXJldHVybg0gICAgfQ0gICAgJHcgc2V0IFskdyBnZXQgW2V4cHIgeyR4LSR0a1ByaXYoZGVsdGFYKX1dIFtleHByIHskeS0kdGtQcml2KGRlbHRhWSl9XV0NfQ0NIyB0a1NjYWxlRW5kRHJhZyAtLQ0jIFRoaXMgcHJvY2VkdXJlIGlzIGNhbGxlZCB0byBlbmQgYW4gaW50ZXJhY3RpdmUgZHJhZyBvZiB0aGUNIyBzbGlkZXIuICBJdCBqdXN0IG1hcmtzIHRoZSBkcmFnIGFzIG92ZXIuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgc2NhbGUgd2lkZ2V0Lg0NcHJvYyB0a1NjYWxlRW5kRHJhZyB7d30gew0gICAgZ2xvYmFsIHRrUHJpdg0gICAgc2V0IHRrUHJpdihkcmFnZ2luZykgMA0gICAgJHcgY29uZmlndXJlIC1zbGlkZXJyZWxpZWYgcmFpc2VkDX0NDSMgdGtTY2FsZUluY3JlbWVudCAtLQ0jIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgdG8gaW5jcmVtZW50IHRoZSB2YWx1ZSBvZiBhIHNjYWxlIGFuZA0jIHRvIHNldCB1cCBhdXRvLXJlcGVhdGluZyBvZiB0aGUgYWN0aW9uIGlmIHRoYXQgaXMgZGVzaXJlZC4gIFRoZQ0jIHdheSB0aGUgdmFsdWUgaXMgaW5jcmVtZW50ZWQgZGVwZW5kcyBvbiB0aGUgImRpciIgYW5kICJiaWciDSMgYXJndW1lbnRzLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIHNjYWxlIHdpZGdldC4NIyBkaXIgLQkJInVwIiBtZWFucyBtb3ZlIHZhbHVlIHRvd2FyZHMgLWZyb20sICJkb3duIiBtZWFucw0jCQltb3ZlIHRvd2FyZHMgLXRvLg0jIGJpZyAtCQlTaXplIG9mIGluY3JlbWVudHM6ICJiaWciIG9yICJsaXR0bGUiLg0jIHJlcGVhdCAtCVdoZXRoZXIgYW5kIGhvdyB0byBhdXRvLXJlcGVhdCB0aGUgYWN0aW9uOiAgIm5vUmVwZWF0Ig0jCQltZWFucyBkb24ndCBhdXRvLXJlcGVhdCwgImluaXRpYWwiIG1lYW5zIHRoaXMgaXMgdGhlDSMJCWZpcnN0IGFjdGlvbiBpbiBhbiBhdXRvLXJlcGVhdCBzZXF1ZW5jZSwgYW5kICJhZ2FpbiINIwkJbWVhbnMgdGhpcyBpcyB0aGUgc2Vjb25kIHJlcGV0aXRpb24gb3IgbGF0ZXIuDQ1wcm9jIHRrU2NhbGVJbmNyZW1lbnQge3cgZGlyIGJpZyByZXBlYXR9IHsNICAgIGdsb2JhbCB0a1ByaXYNICAgIGlmIHshW3dpbmZvIGV4aXN0cyAkd119IHJldHVybg0gICAgaWYge1tzdHJpbmcgZXF1YWwgJGJpZyAiYmlnIl19IHsNCXNldCBpbmMgWyR3IGNnZXQgLWJpZ2luY3JlbWVudF0NCWlmIHskaW5jID09IDB9IHsNCSAgICBzZXQgaW5jIFtleHByIHthYnMoWyR3IGNnZXQgLXRvXSAtIFskdyBjZ2V0IC1mcm9tXSkvMTAuMH1dDQl9DQlpZiB7JGluYyA8IFskdyBjZ2V0IC1yZXNvbHV0aW9uXX0gew0JICAgIHNldCBpbmMgWyR3IGNnZXQgLXJlc29sdXRpb25dDQl9DSAgICB9IGVsc2Ugew0Jc2V0IGluYyBbJHcgY2dldCAtcmVzb2x1dGlvbl0NICAgIH0NICAgIGlmIHsoWyR3IGNnZXQgLWZyb21dID4gWyR3IGNnZXQgLXRvXSkgXiBbc3RyaW5nIGVxdWFsICRkaXIgInVwIl19IHsNCXNldCBpbmMgW2V4cHIgey0kaW5jfV0NICAgIH0NICAgICR3IHNldCBbZXhwciB7WyR3IGdldF0gKyAkaW5jfV0NDSAgICBpZiB7W3N0cmluZyBlcXVhbCAkcmVwZWF0ICJhZ2FpbiJdfSB7DQlzZXQgdGtQcml2KGFmdGVySWQpIFthZnRlciBbJHcgY2dldCAtcmVwZWF0aW50ZXJ2YWxdIFwNCQlbbGlzdCB0a1NjYWxlSW5jcmVtZW50ICR3ICRkaXIgJGJpZyBhZ2Fpbl1dDSAgICB9IGVsc2VpZiB7W3N0cmluZyBlcXVhbCAkcmVwZWF0ICJpbml0aWFsIl19IHsNCXNldCBkZWxheSBbJHcgY2dldCAtcmVwZWF0ZGVsYXldDQlpZiB7JGRlbGF5ID4gMH0gew0JICAgIHNldCB0a1ByaXYoYWZ0ZXJJZCkgW2FmdGVyICRkZWxheSBcDQkJICAgIFtsaXN0IHRrU2NhbGVJbmNyZW1lbnQgJHcgJGRpciAkYmlnIGFnYWluXV0NCX0NICAgIH0NfQ0NIyB0a1NjYWxlQ29udHJvbFByZXNzIC0tDSMgVGhpcyBwcm9jZWR1cmUgaGFuZGxlcyBidXR0b24gcHJlc3NlcyB0aGF0IGFyZSBtYWRlIHdpdGggdGhlIENvbnRyb2wNIyBrZXkgZG93bi4gIERlcGVuZGluZyBvbiB0aGUgbW91c2UgcG9zaXRpb24sIGl0IGFkanVzdHMgdGhlIHNjYWxlDSMgdmFsdWUgdG8gb25lIGVuZCBvZiB0aGUgcmFuZ2Ugb3IgdGhlIG90aGVyLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIHNjYWxlIHdpZGdldC4NIyB4LCB5IC0JTW91c2UgY29vcmRpbmF0ZXMgd2hlcmUgdGhlIGJ1dHRvbiB3YXMgcHJlc3NlZC4NDXByb2MgdGtTY2FsZUNvbnRyb2xQcmVzcyB7dyB4IHl9IHsNICAgIHNldCBlbCBbJHcgaWRlbnRpZnkgJHggJHldDSAgICBpZiB7W3N0cmluZyBlcXVhbCAkZWwgInRyb3VnaDEiXX0gew0JJHcgc2V0IFskdyBjZ2V0IC1mcm9tXQ0gICAgfSBlbHNlaWYge1tzdHJpbmcgZXF1YWwgJGVsICJ0cm91Z2gyIl19IHsNCSR3IHNldCBbJHcgY2dldCAtdG9dDSAgICB9DX0NDSMgdGtTY2FsZUJ1dHRvbjJEb3duDSMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCB3aGVuIGJ1dHRvbiAyIGlzIHByZXNzZWQgb3ZlciBhIHNjYWxlLg0jIEl0IHNldHMgdGhlIHZhbHVlIHRvIGNvcnJlc3BvbmQgdG8gdGhlIG1vdXNlIHBvc2l0aW9uIGFuZCBzdGFydHMNIyBhIHNsaWRlciBkcmFnLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIHNjcm9sbGJhciB3aWRnZXQuDSMgeCwgeSAtCU1vdXNlIGNvb3JkaW5hdGVzIHdpdGhpbiB0aGUgd2lkZ2V0Lg0NcHJvYyB0a1NjYWxlQnV0dG9uMkRvd24ge3cgeCB5fSB7DSAgICBnbG9iYWwgdGtQcml2DQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgWyR3IGNnZXQgLXN0YXRlXSAiZGlzYWJsZWQiXX0gew0gICAgICByZXR1cm4NICAgIH0NICAgICR3IGNvbmZpZ3VyZSAtc3RhdGUgYWN0aXZlDSAgICAkdyBzZXQgWyR3IGdldCAkeCAkeV0NICAgIHNldCB0a1ByaXYoZHJhZ2dpbmcpIDENICAgIHNldCB0a1ByaXYoaW5pdFZhbHVlKSBbJHcgZ2V0XQ0gICAgc2V0IGNvb3JkcyAiJHggJHkiDSAgICBzZXQgdGtQcml2KGRlbHRhWCkgMA0gICAgc2V0IHRrUHJpdihkZWx0YVkpIDANfQ0AAC3fIyBzY3JsYmFyLnRjbCAtLQ0jDSMgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGRlZmF1bHQgYmluZGluZ3MgZm9yIFRrIHNjcm9sbGJhciB3aWRnZXRzLg0jIEl0IGFsc28gcHJvdmlkZXMgcHJvY2VkdXJlcyB0aGF0IGhlbHAgaW4gaW1wbGVtZW50aW5nIHRoZSBiaW5kaW5ncy4NIw0jIFJDUzogQCgjKSAkSWQ6IHNjcmxiYXIudGNsLHYgMS44IDIwMDAvMDEvMDYgMDI6MjI6MjQgaG9iYnMgRXhwICQNIw0jIENvcHlyaWdodCAoYykgMTk5NCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLg0jIENvcHlyaWdodCAoYykgMTk5NC0xOTk2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4NIw0jIFNlZSB0aGUgZmlsZSAibGljZW5zZS50ZXJtcyIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbg0jIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuDSMNDSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDSMgVGhlIGNvZGUgYmVsb3cgY3JlYXRlcyB0aGUgZGVmYXVsdCBjbGFzcyBiaW5kaW5ncyBmb3Igc2Nyb2xsYmFycy4NIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NDSMgU3RhbmRhcmQgTW90aWYgYmluZGluZ3M6DWlmIHtbc3RyaW5nIGNvbXBhcmUgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIndpbmRvd3MiXSAmJiBcDQlbc3RyaW5nIGNvbXBhcmUgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIm1hY2ludG9zaCJdfSB7DQ1iaW5kIFNjcm9sbGJhciA8RW50ZXI+IHsNICAgIGlmIHskdGtfc3RyaWN0TW90aWZ9IHsNCXNldCB0a1ByaXYoYWN0aXZlQmcpIFslVyBjZ2V0IC1hY3RpdmViYWNrZ3JvdW5kXQ0JJVcgY29uZmlnIC1hY3RpdmViYWNrZ3JvdW5kIFslVyBjZ2V0IC1iYWNrZ3JvdW5kXQ0gICAgfQ0gICAgJVcgYWN0aXZhdGUgWyVXIGlkZW50aWZ5ICV4ICV5XQ19DWJpbmQgU2Nyb2xsYmFyIDxNb3Rpb24+IHsNICAgICVXIGFjdGl2YXRlIFslVyBpZGVudGlmeSAleCAleV0NfQ0NIyBUaGUgImluZm8gZXhpc3RzIiBjb21tYW5kIGluIHRoZSBmb2xsb3dpbmcgYmluZGluZyBoYW5kbGVzIHRoZQ0jIHNpdHVhdGlvbiB3aGVyZSBhIExlYXZlIGV2ZW50IG9jY3VycyBmb3IgYSBzY3JvbGxiYXIgd2l0aG91dCB0aGUgRW50ZXINIyBldmVudC4gIFRoaXMgc2VlbXMgdG8gaGFwcGVuIG9uIHNvbWUgc3lzdGVtcyAoc3VjaCBhcyBTb2xhcmlzIDIuNCkgZm9yDSMgdW5rbm93biByZWFzb25zLg0NYmluZCBTY3JvbGxiYXIgPExlYXZlPiB7DSAgICBpZiB7JHRrX3N0cmljdE1vdGlmICYmIFtpbmZvIGV4aXN0cyB0a1ByaXYoYWN0aXZlQmcpXX0gew0JJVcgY29uZmlnIC1hY3RpdmViYWNrZ3JvdW5kICR0a1ByaXYoYWN0aXZlQmcpDSAgICB9DSAgICAlVyBhY3RpdmF0ZSB7fQ19DWJpbmQgU2Nyb2xsYmFyIDwxPiB7DSAgICB0a1Njcm9sbEJ1dHRvbkRvd24gJVcgJXggJXkNfQ1iaW5kIFNjcm9sbGJhciA8QjEtTW90aW9uPiB7DSAgICB0a1Njcm9sbERyYWcgJVcgJXggJXkNfQ1iaW5kIFNjcm9sbGJhciA8QjEtQjItTW90aW9uPiB7DSAgICB0a1Njcm9sbERyYWcgJVcgJXggJXkNfQ1iaW5kIFNjcm9sbGJhciA8QnV0dG9uUmVsZWFzZS0xPiB7DSAgICB0a1Njcm9sbEJ1dHRvblVwICVXICV4ICV5DX0NYmluZCBTY3JvbGxiYXIgPEIxLUxlYXZlPiB7DSAgICAjIFByZXZlbnRzIDxMZWF2ZT4gYmluZGluZyBmcm9tIGJlaW5nIGludm9rZWQuDX0NYmluZCBTY3JvbGxiYXIgPEIxLUVudGVyPiB7DSAgICAjIFByZXZlbnRzIDxFbnRlcj4gYmluZGluZyBmcm9tIGJlaW5nIGludm9rZWQuDX0NYmluZCBTY3JvbGxiYXIgPDI+IHsNICAgIHRrU2Nyb2xsQnV0dG9uMkRvd24gJVcgJXggJXkNfQ1iaW5kIFNjcm9sbGJhciA8QjEtMj4gew0gICAgIyBEbyBub3RoaW5nLCBzaW5jZSBidXR0b24gMSBpcyBhbHJlYWR5IGRvd24uDX0NYmluZCBTY3JvbGxiYXIgPEIyLTE+IHsNICAgICMgRG8gbm90aGluZywgc2luY2UgYnV0dG9uIDIgaXMgYWxyZWFkeSBkb3duLg19DWJpbmQgU2Nyb2xsYmFyIDxCMi1Nb3Rpb24+IHsNICAgIHRrU2Nyb2xsRHJhZyAlVyAleCAleQ19DWJpbmQgU2Nyb2xsYmFyIDxCdXR0b25SZWxlYXNlLTI+IHsNICAgIHRrU2Nyb2xsQnV0dG9uVXAgJVcgJXggJXkNfQ1iaW5kIFNjcm9sbGJhciA8QjEtQnV0dG9uUmVsZWFzZS0yPiB7DSAgICAjIERvIG5vdGhpbmc6ICBCMSByZWxlYXNlIHdpbGwgaGFuZGxlIGl0Lg19DWJpbmQgU2Nyb2xsYmFyIDxCMi1CdXR0b25SZWxlYXNlLTE+IHsNICAgICMgRG8gbm90aGluZzogIEIyIHJlbGVhc2Ugd2lsbCBoYW5kbGUgaXQuDX0NYmluZCBTY3JvbGxiYXIgPEIyLUxlYXZlPiB7DSAgICAjIFByZXZlbnRzIDxMZWF2ZT4gYmluZGluZyBmcm9tIGJlaW5nIGludm9rZWQuDX0NYmluZCBTY3JvbGxiYXIgPEIyLUVudGVyPiB7DSAgICAjIFByZXZlbnRzIDxFbnRlcj4gYmluZGluZyBmcm9tIGJlaW5nIGludm9rZWQuDX0NYmluZCBTY3JvbGxiYXIgPENvbnRyb2wtMT4gew0gICAgdGtTY3JvbGxUb3BCb3R0b20gJVcgJXggJXkNfQ1iaW5kIFNjcm9sbGJhciA8Q29udHJvbC0yPiB7DSAgICB0a1Njcm9sbFRvcEJvdHRvbSAlVyAleCAleQ19DQ1iaW5kIFNjcm9sbGJhciA8VXA+IHsNICAgIHRrU2Nyb2xsQnlVbml0cyAlVyB2IC0xDX0NYmluZCBTY3JvbGxiYXIgPERvd24+IHsNICAgIHRrU2Nyb2xsQnlVbml0cyAlVyB2IDENfQ1iaW5kIFNjcm9sbGJhciA8Q29udHJvbC1VcD4gew0gICAgdGtTY3JvbGxCeVBhZ2VzICVXIHYgLTENfQ1iaW5kIFNjcm9sbGJhciA8Q29udHJvbC1Eb3duPiB7DSAgICB0a1Njcm9sbEJ5UGFnZXMgJVcgdiAxDX0NYmluZCBTY3JvbGxiYXIgPExlZnQ+IHsNICAgIHRrU2Nyb2xsQnlVbml0cyAlVyBoIC0xDX0NYmluZCBTY3JvbGxiYXIgPFJpZ2h0PiB7DSAgICB0a1Njcm9sbEJ5VW5pdHMgJVcgaCAxDX0NYmluZCBTY3JvbGxiYXIgPENvbnRyb2wtTGVmdD4gew0gICAgdGtTY3JvbGxCeVBhZ2VzICVXIGggLTENfQ1iaW5kIFNjcm9sbGJhciA8Q29udHJvbC1SaWdodD4gew0gICAgdGtTY3JvbGxCeVBhZ2VzICVXIGggMQ19DWJpbmQgU2Nyb2xsYmFyIDxQcmlvcj4gew0gICAgdGtTY3JvbGxCeVBhZ2VzICVXIGh2IC0xDX0NYmluZCBTY3JvbGxiYXIgPE5leHQ+IHsNICAgIHRrU2Nyb2xsQnlQYWdlcyAlVyBodiAxDX0NYmluZCBTY3JvbGxiYXIgPEhvbWU+IHsNICAgIHRrU2Nyb2xsVG9Qb3MgJVcgMA19DWJpbmQgU2Nyb2xsYmFyIDxFbmQ+IHsNICAgIHRrU2Nyb2xsVG9Qb3MgJVcgMQ19DX0NIyB0a1Njcm9sbEJ1dHRvbkRvd24gLS0NIyBUaGlzIHByb2NlZHVyZSBpcyBpbnZva2VkIHdoZW4gYSBidXR0b24gaXMgcHJlc3NlZCBpbiBhIHNjcm9sbGJhci4NIyBJdCBjaGFuZ2VzIHRoZSB3YXkgdGhlIHNjcm9sbGJhciBpcyBkaXNwbGF5ZWQgYW5kIHRha2VzIGFjdGlvbnMNIyBkZXBlbmRpbmcgb24gd2hlcmUgdGhlIG1vdXNlIGlzLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIHNjcm9sbGJhciB3aWRnZXQuDSMgeCwgeSAtCU1vdXNlIGNvb3JkaW5hdGVzLg0NcHJvYyB0a1Njcm9sbEJ1dHRvbkRvd24ge3cgeCB5fSB7DSAgICBnbG9iYWwgdGtQcml2DSAgICBzZXQgdGtQcml2KHJlbGllZikgWyR3IGNnZXQgLWFjdGl2ZXJlbGllZl0NICAgICR3IGNvbmZpZ3VyZSAtYWN0aXZlcmVsaWVmIHN1bmtlbg0gICAgc2V0IGVsZW1lbnQgWyR3IGlkZW50aWZ5ICR4ICR5XQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgJGVsZW1lbnQgInNsaWRlciJdfSB7DQl0a1Njcm9sbFN0YXJ0RHJhZyAkdyAkeCAkeQ0gICAgfSBlbHNlIHsNCXRrU2Nyb2xsU2VsZWN0ICR3ICRlbGVtZW50IGluaXRpYWwNICAgIH0NfQ0NIyB0a1Njcm9sbEJ1dHRvblVwIC0tDSMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCB3aGVuIGEgYnV0dG9uIGlzIHJlbGVhc2VkIGluIGEgc2Nyb2xsYmFyLg0jIEl0IGNhbmNlbHMgc2NhbnMgYW5kIGF1dG8tcmVwZWF0cyB0aGF0IHdlcmUgaW4gcHJvZ3Jlc3MsIGFuZCByZXN0b3Jlcw0jIHRoZSB3YXkgdGhlIGFjdGl2ZSBlbGVtZW50IGlzIGRpc3BsYXllZC4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSBzY3JvbGxiYXIgd2lkZ2V0Lg0jIHgsIHkgLQlNb3VzZSBjb29yZGluYXRlcy4NDXByb2MgdGtTY3JvbGxCdXR0b25VcCB7dyB4IHl9IHsNICAgIGdsb2JhbCB0a1ByaXYNICAgIHRrQ2FuY2VsUmVwZWF0DSAgICBpZiB7W2luZm8gZXhpc3RzIHRrUHJpdihyZWxpZWYpXX0gew0JIyBBdm9pZCBlcnJvciBkdWUgdG8gc3B1cmlvdXMgcmVsZWFzZSBldmVudHMNCSR3IGNvbmZpZ3VyZSAtYWN0aXZlcmVsaWVmICR0a1ByaXYocmVsaWVmKQ0JdGtTY3JvbGxFbmREcmFnICR3ICR4ICR5DQkkdyBhY3RpdmF0ZSBbJHcgaWRlbnRpZnkgJHggJHldDSAgICB9DX0NDSMgdGtTY3JvbGxTZWxlY3QgLS0NIyBUaGlzIHByb2NlZHVyZSBpcyBpbnZva2VkIHdoZW4gYSBidXR0b24gaXMgcHJlc3NlZCBvdmVyIHRoZSBzY3JvbGxiYXIuDSMgSXQgaW52b2tlcyBvbmUgb2Ygc2V2ZXJhbCBzY3JvbGxpbmcgYWN0aW9ucyBkZXBlbmRpbmcgb24gd2hlcmUgaW4NIyB0aGUgc2Nyb2xsYmFyIHRoZSBidXR0b24gd2FzIHByZXNzZWQuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgc2Nyb2xsYmFyIHdpZGdldC4NIyBlbGVtZW50IC0JVGhlIGVsZW1lbnQgb2YgdGhlIHNjcm9sbGJhciB0aGF0IHdhcyBzZWxlY3RlZCwgc3VjaA0jCQlhcyAiYXJyb3cxIiBvciAidHJvdWdoMiIuICBTaG91bGRuJ3QgYmUgInNsaWRlciIuDSMgcmVwZWF0IC0JV2hldGhlciBhbmQgaG93IHRvIGF1dG8tcmVwZWF0IHRoZSBhY3Rpb246ICAibm9SZXBlYXQiDSMJCW1lYW5zIGRvbid0IGF1dG8tcmVwZWF0LCAiaW5pdGlhbCIgbWVhbnMgdGhpcyBpcyB0aGUNIwkJZmlyc3QgYWN0aW9uIGluIGFuIGF1dG8tcmVwZWF0IHNlcXVlbmNlLCBhbmQgImFnYWluIg0jCQltZWFucyB0aGlzIGlzIHRoZSBzZWNvbmQgcmVwZXRpdGlvbiBvciBsYXRlci4NDXByb2MgdGtTY3JvbGxTZWxlY3Qge3cgZWxlbWVudCByZXBlYXR9IHsNICAgIGdsb2JhbCB0a1ByaXYNICAgIGlmIHshW3dpbmZvIGV4aXN0cyAkd119IHJldHVybg0gICAgc3dpdGNoIC0tICRlbGVtZW50IHsNCSJhcnJvdzEiCXt0a1Njcm9sbEJ5VW5pdHMgJHcgaHYgLTF9DQkidHJvdWdoMSIJe3RrU2Nyb2xsQnlQYWdlcyAkdyBodiAtMX0NCSJ0cm91Z2gyIgl7dGtTY3JvbGxCeVBhZ2VzICR3IGh2IDF9DQkiYXJyb3cyIgl7dGtTY3JvbGxCeVVuaXRzICR3IGh2IDF9DQlkZWZhdWx0CQl7cmV0dXJufQ0gICAgfQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgJHJlcGVhdCAiYWdhaW4iXX0gew0Jc2V0IHRrUHJpdihhZnRlcklkKSBbYWZ0ZXIgWyR3IGNnZXQgLXJlcGVhdGludGVydmFsXSBcDQkJW2xpc3QgdGtTY3JvbGxTZWxlY3QgJHcgJGVsZW1lbnQgYWdhaW5dXQ0gICAgfSBlbHNlaWYge1tzdHJpbmcgZXF1YWwgJHJlcGVhdCAiaW5pdGlhbCJdfSB7DQlzZXQgZGVsYXkgWyR3IGNnZXQgLXJlcGVhdGRlbGF5XQ0JaWYgeyRkZWxheSA+IDB9IHsNCSAgICBzZXQgdGtQcml2KGFmdGVySWQpIFthZnRlciAkZGVsYXkgXA0JCSAgICBbbGlzdCB0a1Njcm9sbFNlbGVjdCAkdyAkZWxlbWVudCBhZ2Fpbl1dDQl9DSAgICB9DX0NDSMgdGtTY3JvbGxTdGFydERyYWcgLS0NIyBUaGlzIHByb2NlZHVyZSBpcyBjYWxsZWQgdG8gaW5pdGlhdGUgYSBkcmFnIG9mIHRoZSBzbGlkZXIuICBJdCBqdXN0DSMgcmVtZW1iZXJzIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgbW91c2UgYW5kIHNsaWRlci4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSBzY3JvbGxiYXIgd2lkZ2V0Lg0jIHgsIHkgLQlUaGUgbW91c2UgcG9zaXRpb24gYXQgdGhlIHN0YXJ0IG9mIHRoZSBkcmFnIG9wZXJhdGlvbi4NDXByb2MgdGtTY3JvbGxTdGFydERyYWcge3cgeCB5fSB7DSAgICBnbG9iYWwgdGtQcml2DQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgWyR3IGNnZXQgLWNvbW1hbmRdICIiXX0gew0JcmV0dXJuDSAgICB9DSAgICBzZXQgdGtQcml2KHByZXNzWCkgJHgNICAgIHNldCB0a1ByaXYocHJlc3NZKSAkeQ0gICAgc2V0IHRrUHJpdihpbml0VmFsdWVzKSBbJHcgZ2V0XQ0gICAgc2V0IGl2MCBbbGluZGV4ICR0a1ByaXYoaW5pdFZhbHVlcykgMF0NICAgIGlmIHtbbGxlbmd0aCAkdGtQcml2KGluaXRWYWx1ZXMpXSA9PSAyfSB7DQlzZXQgdGtQcml2KGluaXRQb3MpICRpdjANICAgIH0gZWxzZWlmIHskaXYwID09IDB9IHsNCXNldCB0a1ByaXYoaW5pdFBvcykgMC4wDSAgICB9IGVsc2Ugew0Jc2V0IHRrUHJpdihpbml0UG9zKSBbZXhwciB7KGRvdWJsZShbbGluZGV4ICR0a1ByaXYoaW5pdFZhbHVlcykgMl0pKSBcDQkJLyBbbGluZGV4ICR0a1ByaXYoaW5pdFZhbHVlcykgMF19XQ0gICAgfQ19DQ0jIHRrU2Nyb2xsRHJhZyAtLQ0jIFRoaXMgcHJvY2VkdXJlIGlzIGNhbGxlZCBmb3IgZWFjaCBtb3VzZSBtb3Rpb24gZXZlbiB3aGVuIHRoZSBzbGlkZXINIyBpcyBiZWluZyBkcmFnZ2VkLiAgSXQgbm90aWZpZXMgdGhlIGFzc29jaWF0ZWQgd2lkZ2V0IGlmIHdlJ3JlIG5vdA0jIGp1bXAgc2Nyb2xsaW5nLCBhbmQgaXQganVzdCB1cGRhdGVzIHRoZSBzY3JvbGxiYXIgaWYgd2UgYXJlIGp1bXANIyBzY3JvbGxpbmcuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgc2Nyb2xsYmFyIHdpZGdldC4NIyB4LCB5IC0JVGhlIGN1cnJlbnQgbW91c2UgcG9zaXRpb24uDQ1wcm9jIHRrU2Nyb2xsRHJhZyB7dyB4IHl9IHsNICAgIGdsb2JhbCB0a1ByaXYNDSAgICBpZiB7W3N0cmluZyBlcXVhbCAkdGtQcml2KGluaXRQb3MpICIiXX0gew0JcmV0dXJuDSAgICB9DSAgICBzZXQgZGVsdGEgWyR3IGRlbHRhIFtleHByIHskeCAtICR0a1ByaXYocHJlc3NYKX1dIFtleHByIHskeSAtICR0a1ByaXYocHJlc3NZKX1dXQ0gICAgaWYge1skdyBjZ2V0IC1qdW1wXX0gew0JaWYge1tsbGVuZ3RoICR0a1ByaXYoaW5pdFZhbHVlcyldID09IDJ9IHsNCSAgICAkdyBzZXQgW2V4cHIge1tsaW5kZXggJHRrUHJpdihpbml0VmFsdWVzKSAwXSArICRkZWx0YX1dIFwNCQkgICAgW2V4cHIge1tsaW5kZXggJHRrUHJpdihpbml0VmFsdWVzKSAxXSArICRkZWx0YX1dDQl9IGVsc2Ugew0JICAgIHNldCBkZWx0YSBbZXhwciB7cm91bmQoJGRlbHRhICogW2xpbmRleCAkdGtQcml2KGluaXRWYWx1ZXMpIDBdKX1dDQkgICAgZXZhbCBbbGlzdCAkd10gc2V0IFtscmVwbGFjZSAkdGtQcml2KGluaXRWYWx1ZXMpIDIgMyBcDQkJICAgIFtleHByIHtbbGluZGV4ICR0a1ByaXYoaW5pdFZhbHVlcykgMl0gKyAkZGVsdGF9XSBcDQkJICAgIFtleHByIHtbbGluZGV4ICR0a1ByaXYoaW5pdFZhbHVlcykgM10gKyAkZGVsdGF9XV0NCX0NICAgIH0gZWxzZSB7DQl0a1Njcm9sbFRvUG9zICR3IFtleHByIHskdGtQcml2KGluaXRQb3MpICsgJGRlbHRhfV0NICAgIH0NfQ0NIyB0a1Njcm9sbEVuZERyYWcgLS0NIyBUaGlzIHByb2NlZHVyZSBpcyBjYWxsZWQgdG8gZW5kIGFuIGludGVyYWN0aXZlIGRyYWcgb2YgdGhlIHNsaWRlci4NIyBJdCBzY3JvbGxzIHRoZSB3aW5kb3cgaWYgd2UncmUgaW4ganVtcCBtb2RlLCBvdGhlcndpc2UgaXQgZG9lcyBub3RoaW5nLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIHNjcm9sbGJhciB3aWRnZXQuDSMgeCwgeSAtCVRoZSBtb3VzZSBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBkcmFnIG9wZXJhdGlvbi4NDXByb2MgdGtTY3JvbGxFbmREcmFnIHt3IHggeX0gew0gICAgZ2xvYmFsIHRrUHJpdg0NICAgIGlmIHtbc3RyaW5nIGVxdWFsICR0a1ByaXYoaW5pdFBvcykgIiJdfSB7DQlyZXR1cm4NICAgIH0NICAgIGlmIHtbJHcgY2dldCAtanVtcF19IHsNCXNldCBkZWx0YSBbJHcgZGVsdGEgW2V4cHIgeyR4IC0gJHRrUHJpdihwcmVzc1gpfV0gXA0JCVtleHByIHskeSAtICR0a1ByaXYocHJlc3NZKX1dXQ0JdGtTY3JvbGxUb1BvcyAkdyBbZXhwciB7JHRrUHJpdihpbml0UG9zKSArICRkZWx0YX1dDSAgICB9DSAgICBzZXQgdGtQcml2KGluaXRQb3MpICIiDX0NDSMgdGtTY3JvbGxCeVVuaXRzIC0tDSMgVGhpcyBwcm9jZWR1cmUgdGVsbHMgdGhlIHNjcm9sbGJhcidzIGFzc29jaWF0ZWQgd2lkZ2V0IHRvIHNjcm9sbCB1cA0jIG9yIGRvd24gYnkgYSBnaXZlbiBudW1iZXIgb2YgdW5pdHMuICBJdCBub3RpZmllcyB0aGUgYXNzb2NpYXRlZCB3aWRnZXQNIyBpbiBkaWZmZXJlbnQgd2F5cyBmb3Igb2xkIGFuZCBuZXcgY29tbWFuZCBzeW50YXhlcy4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSBzY3JvbGxiYXIgd2lkZ2V0Lg0jIG9yaWVudCAtCVdoaWNoIGtpbmRzIG9mIHNjcm9sbGJhcnMgdGhpcyBhcHBsaWVzIHRvOiAgImgiIGZvcg0jCQlob3Jpem9udGFsLCAidiIgZm9yIHZlcnRpY2FsLCAiaHYiIGZvciBib3RoLg0jIGFtb3VudCAtCUhvdyBtYW55IHVuaXRzIHRvIHNjcm9sbDogIHR5cGljYWxseSAxIG9yIC0xLg0NcHJvYyB0a1Njcm9sbEJ5VW5pdHMge3cgb3JpZW50IGFtb3VudH0gew0gICAgc2V0IGNtZCBbJHcgY2dldCAtY29tbWFuZF0NICAgIGlmIHtbc3RyaW5nIGVxdWFsICRjbWQgIiJdIHx8IChbc3RyaW5nIGZpcnN0IFwNCSAgICBbc3RyaW5nIGluZGV4IFskdyBjZ2V0IC1vcmllbnRdIDBdICRvcmllbnRdIDwgMCl9IHsNCXJldHVybg0gICAgfQ0gICAgc2V0IGluZm8gWyR3IGdldF0NICAgIGlmIHtbbGxlbmd0aCAkaW5mb10gPT0gMn0gew0JdXBsZXZlbCAjMCAkY21kIHNjcm9sbCAkYW1vdW50IHVuaXRzDSAgICB9IGVsc2Ugew0JdXBsZXZlbCAjMCAkY21kIFtleHByIHtbbGluZGV4ICRpbmZvIDJdICsgJGFtb3VudH1dDSAgICB9DX0NDSMgdGtTY3JvbGxCeVBhZ2VzIC0tDSMgVGhpcyBwcm9jZWR1cmUgdGVsbHMgdGhlIHNjcm9sbGJhcidzIGFzc29jaWF0ZWQgd2lkZ2V0IHRvIHNjcm9sbCB1cA0jIG9yIGRvd24gYnkgYSBnaXZlbiBudW1iZXIgb2Ygc2NyZWVuZnVscy4gIEl0IG5vdGlmaWVzIHRoZSBhc3NvY2lhdGVkDSMgd2lkZ2V0IGluIGRpZmZlcmVudCB3YXlzIGZvciBvbGQgYW5kIG5ldyBjb21tYW5kIHN5bnRheGVzLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIHNjcm9sbGJhciB3aWRnZXQuDSMgb3JpZW50IC0JV2hpY2gga2luZHMgb2Ygc2Nyb2xsYmFycyB0aGlzIGFwcGxpZXMgdG86ICAiaCIgZm9yDSMJCWhvcml6b250YWwsICJ2IiBmb3IgdmVydGljYWwsICJodiIgZm9yIGJvdGguDSMgYW1vdW50IC0JSG93IG1hbnkgc2NyZWVucyB0byBzY3JvbGw6ICB0eXBpY2FsbHkgMSBvciAtMS4NDXByb2MgdGtTY3JvbGxCeVBhZ2VzIHt3IG9yaWVudCBhbW91bnR9IHsNICAgIHNldCBjbWQgWyR3IGNnZXQgLWNvbW1hbmRdDSAgICBpZiB7W3N0cmluZyBlcXVhbCAkY21kICIiXSB8fCAoW3N0cmluZyBmaXJzdCBcDQkgICAgW3N0cmluZyBpbmRleCBbJHcgY2dldCAtb3JpZW50XSAwXSAkb3JpZW50XSA8IDApfSB7DQlyZXR1cm4NICAgIH0NICAgIHNldCBpbmZvIFskdyBnZXRdDSAgICBpZiB7W2xsZW5ndGggJGluZm9dID09IDJ9IHsNCXVwbGV2ZWwgIzAgJGNtZCBzY3JvbGwgJGFtb3VudCBwYWdlcw0gICAgfSBlbHNlIHsNCXVwbGV2ZWwgIzAgJGNtZCBbZXhwciB7W2xpbmRleCAkaW5mbyAyXSArICRhbW91bnQqKFtsaW5kZXggJGluZm8gMV0gLSAxKX1dDSAgICB9DX0NDSMgdGtTY3JvbGxUb1BvcyAtLQ0jIFRoaXMgcHJvY2VkdXJlIHRlbGxzIHRoZSBzY3JvbGxiYXIncyBhc3NvY2lhdGVkIHdpZGdldCB0byBzY3JvbGwgdG8NIyBhIHBhcnRpY3VsYXIgbG9jYXRpb24sIGdpdmVuIGJ5IGEgZnJhY3Rpb24gYmV0d2VlbiAwIGFuZCAxLiAgSXQgbm90aWZpZXMNIyB0aGUgYXNzb2NpYXRlZCB3aWRnZXQgaW4gZGlmZmVyZW50IHdheXMgZm9yIG9sZCBhbmQgbmV3IGNvbW1hbmQgc3ludGF4ZXMuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgc2Nyb2xsYmFyIHdpZGdldC4NIyBwb3MgLQkJQSBmcmFjdGlvbiBiZXR3ZWVuIDAgYW5kIDEgaW5kaWNhdGluZyBhIGRlc2lyZWQgcG9zaXRpb24NIwkJaW4gdGhlIGRvY3VtZW50Lg0NcHJvYyB0a1Njcm9sbFRvUG9zIHt3IHBvc30gew0gICAgc2V0IGNtZCBbJHcgY2dldCAtY29tbWFuZF0NICAgIGlmIHtbc3RyaW5nIGVxdWFsICRjbWQgIiJdfSB7DQlyZXR1cm4NICAgIH0NICAgIHNldCBpbmZvIFskdyBnZXRdDSAgICBpZiB7W2xsZW5ndGggJGluZm9dID09IDJ9IHsNCXVwbGV2ZWwgIzAgJGNtZCBtb3ZldG8gJHBvcw0gICAgfSBlbHNlIHsNCXVwbGV2ZWwgIzAgJGNtZCBbZXhwciB7cm91bmQoW2xpbmRleCAkaW5mbyAwXSokcG9zKX1dDSAgICB9DX0NDSMgdGtTY3JvbGxUb3BCb3R0b20NIyBTY3JvbGwgdG8gdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIGRvY3VtZW50LCBkZXBlbmRpbmcgb24gdGhlIG1vdXNlDSMgcG9zaXRpb24uDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgc2Nyb2xsYmFyIHdpZGdldC4NIyB4LCB5IC0JTW91c2UgY29vcmRpbmF0ZXMgd2l0aGluIHRoZSB3aWRnZXQuDQ1wcm9jIHRrU2Nyb2xsVG9wQm90dG9tIHt3IHggeX0gew0gICAgZ2xvYmFsIHRrUHJpdg0gICAgc2V0IGVsZW1lbnQgWyR3IGlkZW50aWZ5ICR4ICR5XQ0gICAgaWYge1tzdHJpbmcgbWF0Y2ggKjEgJGVsZW1lbnRdfSB7DQl0a1Njcm9sbFRvUG9zICR3IDANICAgIH0gZWxzZWlmIHtbc3RyaW5nIG1hdGNoICoyICRlbGVtZW50XX0gew0JdGtTY3JvbGxUb1BvcyAkdyAxDSAgICB9DQ0gICAgIyBTZXQgdGtQcml2KHJlbGllZiksIHNpbmNlIGl0J3MgbmVlZGVkIGJ5IHRrU2Nyb2xsQnV0dG9uVXAuDQ0gICAgc2V0IHRrUHJpdihyZWxpZWYpIFskdyBjZ2V0IC1hY3RpdmVyZWxpZWZdDX0NDSMgdGtTY3JvbGxCdXR0b24yRG93bg0jIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgd2hlbiBidXR0b24gMiBpcyBwcmVzc2VkIG92ZXIgYSBzY3JvbGxiYXIuDSMgSWYgdGhlIGJ1dHRvbiBpcyBvdmVyIHRoZSB0cm91Z2ggb3Igc2xpZGVyLCBpdCBzZXRzIHRoZSBzY3JvbGxiYXIgdG8NIyB0aGUgbW91c2UgcG9zaXRpb24gYW5kIHN0YXJ0cyBhIHNsaWRlciBkcmFnLiAgT3RoZXJ3aXNlIGl0IGp1c3QNIyBiZWhhdmVzIHRoZSBzYW1lIGFzIGJ1dHRvbiAxLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIHNjcm9sbGJhciB3aWRnZXQuDSMgeCwgeSAtCU1vdXNlIGNvb3JkaW5hdGVzIHdpdGhpbiB0aGUgd2lkZ2V0Lg0NcHJvYyB0a1Njcm9sbEJ1dHRvbjJEb3duIHt3IHggeX0gew0gICAgZ2xvYmFsIHRrUHJpdg0gICAgc2V0IGVsZW1lbnQgWyR3IGlkZW50aWZ5ICR4ICR5XQ0gICAgaWYge1tzdHJpbmcgbWF0Y2gge2Fycm93WzEyXX0gJGVsZW1lbnRdfSB7DQl0a1Njcm9sbEJ1dHRvbkRvd24gJHcgJHggJHkNCXJldHVybg0gICAgfQ0gICAgdGtTY3JvbGxUb1BvcyAkdyBbJHcgZnJhY3Rpb24gJHggJHldDSAgICBzZXQgdGtQcml2KHJlbGllZikgWyR3IGNnZXQgLWFjdGl2ZXJlbGllZl0NDSAgICAjIE5lZWQgdGhlICJ1cGRhdGUgaWRsZXRhc2tzIiBiZWxvdyBzbyB0aGF0IHRoZSB3aWRnZXQgY2FsbHMgdXMNICAgICMgYmFjayB0byByZXNldCB0aGUgYWN0dWFsIHNjcm9sbGJhciBwb3NpdGlvbiBiZWZvcmUgd2Ugc3RhcnQgdGhlDSAgICAjIHNsaWRlciBkcmFnLg0NICAgIHVwZGF0ZSBpZGxldGFza3MNICAgICR3IGNvbmZpZ3VyZSAtYWN0aXZlcmVsaWVmIHN1bmtlbg0gICAgJHcgYWN0aXZhdGUgc2xpZGVyDSAgICB0a1Njcm9sbFN0YXJ0RHJhZyAkdyAkeCAkeQ19DQAAEjEjIHRlYXJvZmYudGNsIC0tDSMNIyBUaGlzIGZpbGUgY29udGFpbnMgcHJvY2VkdXJlcyB0aGF0IGltcGxlbWVudCB0ZWFyLW9mZiBtZW51cy4NIw0jIFJDUzogQCgjKSAkSWQ6IHRlYXJvZmYudGNsLHYgMS42IDIwMDAvMDEvMDYgMDI6MjI6MjQgaG9iYnMgRXhwICQNIw0jIENvcHlyaWdodCAoYykgMTk5NCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLg0jIENvcHlyaWdodCAoYykgMTk5NC0xOTk3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4NIw0jIFNlZSB0aGUgZmlsZSAibGljZW5zZS50ZXJtcyIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbg0jIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuDSMNDSMgdGtUZWFyb2ZmTWVudSAtLQ0jIEdpdmVuIHRoZSBuYW1lIG9mIGEgbWVudSwgdGhpcyBwcm9jZWR1cmUgY3JlYXRlcyBhIHRvcm4tb2ZmIG1lbnUNIyB0aGF0IGlzIGlkZW50aWNhbCB0byB0aGUgZ2l2ZW4gbWVudSAoaW5jbHVkaW5nIG5lc3RlZCBzdWJtZW51cykuDSMgVGhlIG5ldyB0b3JuLW9mZiBtZW51IGV4aXN0cyBhcyBhIHRvcGxldmVsIHdpbmRvdyBtYW5hZ2VkIGJ5IHRoZQ0jIHdpbmRvdyBtYW5hZ2VyLiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbmFtZSBvZiB0aGUgbmV3IG1lbnUuDSMgVGhlIHdpbmRvdyBpcyBjcmVhdGVkIGF0IHRoZSBwb2ludCBzcGVjaWZpZWQgYnkgeCBhbmQgeQ0jDSMgQXJndW1lbnRzOg0jIHcgLQkJCVRoZSBtZW51IHRvIGJlIHRvcm4tb2ZmIChkdXBsaWNhdGVkKS4NIyB4IC0JCQl4IGNvb3JkaW5hdGUgd2hlcmUgd2luZG93IGlzIGNyZWF0ZWQNIyB5IC0JCQl5IGNvb3JkaW5hdGUgd2hlcmUgd2luZG93IGlzIGNyZWF0ZWQNDXByb2MgdGtUZWFyT2ZmTWVudSB7dyB7eCAwfSB7eSAwfX0gew0gICAgIyBGaW5kIGEgdW5pcXVlIG5hbWUgdG8gdXNlIGZvciB0aGUgdG9ybi1vZmYgbWVudS4gIEZpbmQgdGhlIGZpcnN0DSAgICAjIGFuY2VzdG9yIG9mIHcgdGhhdCBpcyBhIHRvcGxldmVsIGJ1dCBub3QgYSBtZW51LCBhbmQgdXNlIHRoaXMgYXMNICAgICMgdGhlIHBhcmVudCBvZiB0aGUgbmV3IG1lbnUuICBUaGlzIGd1YXJhbnRlZXMgdGhhdCB0aGUgdG9ybiBvZmYNICAgICMgbWVudSB3aWxsIGJlIG9uIHRoZSBzYW1lIHNjcmVlbiBhcyB0aGUgb3JpZ2luYWwgbWVudS4gIEJ5IG1ha2luZw0gICAgIyBpdCBhIGNoaWxkIG9mIHRoZSBhbmNlc3RvciwgcmF0aGVyIHRoYW4gYSBjaGlsZCBvZiB0aGUgbWVudSwgaXQNICAgICMgY2FuIGNvbnRpbnVlIHRvIGxpdmUgZXZlbiBpZiB0aGUgbWVudSBpcyBkZWxldGVkOyAgaXQgd2lsbCBnbw0gICAgIyBhd2F5IHdoZW4gdGhlIHRvcGxldmVsIGdvZXMgYXdheS4NDSAgICBpZiB7JHggPT0gMH0gew0gICAgCXNldCB4IFt3aW5mbyByb290eCAkd10NICAgIH0NICAgIGlmIHskeSA9PSAwfSB7DSAgICAJc2V0IHkgW3dpbmZvIHJvb3R5ICR3XQ0gICAgfQ0NICAgIHNldCBwYXJlbnQgW3dpbmZvIHBhcmVudCAkd10NICAgIHdoaWxlIHtbc3RyaW5nIGNvbXBhcmUgW3dpbmZvIHRvcGxldmVsICRwYXJlbnRdICRwYXJlbnRdIFwNCSAgICB8fCBbc3RyaW5nIGVxdWFsIFt3aW5mbyBjbGFzcyAkcGFyZW50XSAiTWVudSJdfSB7DQlzZXQgcGFyZW50IFt3aW5mbyBwYXJlbnQgJHBhcmVudF0NICAgIH0NICAgIGlmIHtbc3RyaW5nIGVxdWFsICRwYXJlbnQgIi4iXX0gew0Jc2V0IHBhcmVudCAiIg0gICAgfQ0gICAgZm9yIHtzZXQgaSAxfSAxIHtpbmNyIGl9IHsNCXNldCBtZW51ICRwYXJlbnQudGVhcm9mZiRpDQlpZiB7IVt3aW5mbyBleGlzdHMgJG1lbnVdfSB7DQkgICAgYnJlYWsNCX0NICAgIH0NDSAgICAkdyBjbG9uZSAkbWVudSB0ZWFyb2ZmDQ0gICAgIyBQaWNrIGEgdGl0bGUgZm9yIHRoZSBuZXcgbWVudSBieSBsb29raW5nIGF0IHRoZSBwYXJlbnQgb2YgdGhlDSAgICAjIG9yaWdpbmFsOiBpZiB0aGUgcGFyZW50IGlzIGEgbWVudSwgdGhlbiB1c2UgdGhlIHRleHQgb2YgdGhlIGFjdGl2ZQ0gICAgIyBlbnRyeS4gIElmIGl0J3MgYSBtZW51YnV0dG9uIHRoZW4gdXNlIGl0cyB0ZXh0Lg0NICAgIHNldCBwYXJlbnQgW3dpbmZvIHBhcmVudCAkd10NICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgWyRtZW51IGNnZXQgLXRpdGxlXSAiIl19IHsNICAgIAl3bSB0aXRsZSAkbWVudSBbJG1lbnUgY2dldCAtdGl0bGVdDSAgICB9IGVsc2Ugew0gICAgCXN3aXRjaCBbd2luZm8gY2xhc3MgJHBhcmVudF0gew0JICAgIE1lbnVidXR0b24gew0JICAgIAl3bSB0aXRsZSAkbWVudSBbJHBhcmVudCBjZ2V0IC10ZXh0XQ0JICAgIH0NCSAgICBNZW51IHsNCSAgICAJd20gdGl0bGUgJG1lbnUgWyRwYXJlbnQgZW50cnljZ2V0IGFjdGl2ZSAtbGFiZWxdDQkgICAgfQ0JfQ0gICAgfQ0NICAgICRtZW51IHBvc3QgJHggJHkNDSAgICBpZiB7W3dpbmZvIGV4aXN0cyAkbWVudV0gPT0gMH0gew0JcmV0dXJuICIiDSAgICB9DQ0gICAgIyBTZXQgdGtQcml2KGZvY3VzKSBvbiBlbnRyeTogIG90aGVyd2lzZSB0aGUgZm9jdXMgd2lsbCBnZXQgbG9zdA0gICAgIyBhZnRlciBrZXlib2FyZCBpbnZvY2F0aW9uIG9mIGEgc3ViLW1lbnUgKGl0IHdpbGwgc3RheSBvbiB0aGUNICAgICMgc3VibWVudSkuDQ0gICAgYmluZCAkbWVudSA8RW50ZXI+IHsNCXNldCB0a1ByaXYoZm9jdXMpICVXDSAgICB9DQ0gICAgIyBJZiB0aGVyZSBpcyBhIC10ZWFyb2ZmY29tbWFuZCBvcHRpb24gZm9yIHRoZSBtZW51LCBpbnZva2UgaXQNICAgICMgbm93Lg0NICAgIHNldCBjbWQgWyR3IGNnZXQgLXRlYXJvZmZjb21tYW5kXQ0gICAgaWYge1tzdHJpbmcgY29tcGFyZSAkY21kICIiXX0gew0JdXBsZXZlbCAjMCAkY21kIFtsaXN0ICR3ICRtZW51XQ0gICAgfQ0gICAgcmV0dXJuICRtZW51DX0NDSMgdGtNZW51RHVwIC0tDSMgR2l2ZW4gYSBtZW51IChoaWVyYXJjaHkpLCBjcmVhdGUgYSBkdXBsaWNhdGUgbWVudSAoaGllcmFyY2h5KQ0jIGluIGEgZ2l2ZW4gd2luZG93Lg0jDSMgQXJndW1lbnRzOg0jIHNyYyAtCQkJU291cmNlIHdpbmRvdy4gIE11c3QgYmUgYSBtZW51LiAgSXQgYW5kIGl0cw0jCQkJbWVudSBkZXNjZW5kYW50cyB3aWxsIGJlIGR1cGxpY2F0ZWQgYXQgZHN0Lg0jIGRzdCAtCQkJTmFtZSB0byB1c2UgZm9yIHRvcG1vc3QgbWVudSBpbiBkdXBsaWNhdGUNIwkJCWhpZXJhcmNoeS4NDXByb2MgdGtNZW51RHVwIHtzcmMgZHN0IHR5cGV9IHsNICAgIHNldCBjbWQgW2xpc3QgbWVudSAkZHN0IC10eXBlICR0eXBlXQ0gICAgZm9yZWFjaCBvcHRpb24gWyRzcmMgY29uZmlndXJlXSB7DQlpZiB7W2xsZW5ndGggJG9wdGlvbl0gPT0gMn0gew0JICAgIGNvbnRpbnVlDQl9DQlpZiB7W3N0cmluZyBlcXVhbCBbbGluZGV4ICRvcHRpb24gMF0gIi10eXBlIl19IHsNCSAgICBjb250aW51ZQ0JfQ0JbGFwcGVuZCBjbWQgW2xpbmRleCAkb3B0aW9uIDBdIFtsaW5kZXggJG9wdGlvbiA0XQ0gICAgfQ0gICAgZXZhbCAkY21kDSAgICBzZXQgbGFzdCBbJHNyYyBpbmRleCBsYXN0XQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgJGxhc3QgIm5vbmUiXX0gew0JcmV0dXJuDSAgICB9DSAgICBmb3Ige3NldCBpIFskc3JjIGNnZXQgLXRlYXJvZmZdfSB7JGkgPD0gJGxhc3R9IHtpbmNyIGl9IHsNCXNldCBjbWQgW2xpc3QgJGRzdCBhZGQgWyRzcmMgdHlwZSAkaV1dDQlmb3JlYWNoIG9wdGlvbiBbJHNyYyBlbnRyeWNvbmZpZ3VyZSAkaV0gIHsNCSAgICBsYXBwZW5kIGNtZCBbbGluZGV4ICRvcHRpb24gMF0gW2xpbmRleCAkb3B0aW9uIDRdDQl9DQlldmFsICRjbWQNICAgIH0NDSAgICAjIER1cGxpY2F0ZSB0aGUgYmluZGluZyB0YWdzIGFuZCBiaW5kaW5ncyBmcm9tIHRoZSBzb3VyY2UgbWVudS4NDSAgICBzZXQgdGFncyBbYmluZHRhZ3MgJHNyY10NICAgIHNldCBzcmNMZW4gW3N0cmluZyBsZW5ndGggJHNyY10NIA0gICAgIyBDb3B5IHRhZ3MgdG8geCwgcmVwbGFjaW5nIGVhY2ggc3Vic3RyaW5nIG9mIHNyYyB3aXRoIGRzdC4NDSAgICB3aGlsZSB7W3NldCBpbmRleCBbc3RyaW5nIGZpcnN0ICRzcmMgJHRhZ3NdXSAhPSAtMX0gew0JYXBwZW5kIHggW3N0cmluZyByYW5nZSAkdGFncyAwIFtleHByIHskaW5kZXggLSAxfV1dJGRzdA0Jc2V0IHRhZ3MgW3N0cmluZyByYW5nZSAkdGFncyBbZXhwciB7JGluZGV4ICsgJHNyY0xlbn1dIGVuZF0NICAgIH0NICAgIGFwcGVuZCB4ICR0YWdzDQ0gICAgYmluZHRhZ3MgJGRzdCAkeA0NICAgIGZvcmVhY2ggZXZlbnQgW2JpbmQgJHNyY10gew0JdW5zZXQgeA0Jc2V0IHNjcmlwdCBbYmluZCAkc3JjICRldmVudF0NCXNldCBldmVudExlbiBbc3RyaW5nIGxlbmd0aCAkZXZlbnRdDQ0JIyBDb3B5IHNjcmlwdCB0byB4LCByZXBsYWNpbmcgZWFjaCBzdWJzdHJpbmcgb2YgZXZlbnQgd2l0aCBkc3QuDQ0Jd2hpbGUge1tzZXQgaW5kZXggW3N0cmluZyBmaXJzdCAkZXZlbnQgJHNjcmlwdF1dICE9IC0xfSB7DQkgICAgYXBwZW5kIHggW3N0cmluZyByYW5nZSAkc2NyaXB0IDAgW2V4cHIgeyRpbmRleCAtIDF9XV0NCSAgICBhcHBlbmQgeCAkZHN0DQkgICAgc2V0IHNjcmlwdCBbc3RyaW5nIHJhbmdlICRzY3JpcHQgW2V4cHIgeyRpbmRleCArICRldmVudExlbn1dIGVuZF0NCX0NCWFwcGVuZCB4ICRzY3JpcHQNDQliaW5kICRkc3QgJGV2ZW50ICR4DSAgICB9DX0NAABu2CMgdGV4dC50Y2wgLS0NIw0jIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBkZWZhdWx0IGJpbmRpbmdzIGZvciBUayB0ZXh0IHdpZGdldHMgYW5kIHByb3ZpZGVzDSMgcHJvY2VkdXJlcyB0aGF0IGhlbHAgaW4gaW1wbGVtZW50aW5nIHRoZSBiaW5kaW5ncy4NIw0jIFJDUzogQCgjKSAkSWQ6IHRleHQudGNsLHYgMS4xMi4yLjEgMjAwMS8wNC8wNCAwNzo1NzoxNyBob2JicyBFeHAgJA0jDSMgQ29weXJpZ2h0IChjKSAxOTkyLTE5OTQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4NIyBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5NyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuDSMgQ29weXJpZ2h0IChjKSAxOTk4IGJ5IFNjcmlwdGljcyBDb3Jwb3JhdGlvbi4NIw0jIFNlZSB0aGUgZmlsZSAibGljZW5zZS50ZXJtcyIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbg0jIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuDSMNDSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDSMgRWxlbWVudHMgb2YgdGtQcml2IHRoYXQgYXJlIHVzZWQgaW4gdGhpcyBmaWxlOg0jDSMgYWZ0ZXJJZCAtCQlJZiBub24tbnVsbCwgaXQgbWVhbnMgdGhhdCBhdXRvLXNjYW5uaW5nIGlzIHVuZGVyd2F5DSMJCQlhbmQgaXQgZ2l2ZXMgdGhlICJhZnRlciIgaWQgZm9yIHRoZSBuZXh0IGF1dG8tc2Nhbg0jCQkJY29tbWFuZCB0byBiZSBleGVjdXRlZC4NIyBjaGFyIC0JCUNoYXJhY3RlciBwb3NpdGlvbiBvbiB0aGUgbGluZTsgIGtlcHQgaW4gb3JkZXINIwkJCXRvIGFsbG93IG1vdmluZyB1cCBvciBkb3duIHBhc3Qgc2hvcnQgbGluZXMgd2hpbGUNIwkJCXN0aWxsIHJlbWVtYmVyaW5nIHRoZSBkZXNpcmVkIHBvc2l0aW9uLg0jIG1vdXNlTW92ZWQgLQkJTm9uLXplcm8gbWVhbnMgdGhlIG1vdXNlIGhhcyBtb3ZlZCBhIHNpZ25pZmljYW50DSMJCQlhbW91bnQgc2luY2UgdGhlIGJ1dHRvbiB3ZW50IGRvd24gKHNvLCBmb3IgZXhhbXBsZSwNIwkJCXN0YXJ0IGRyYWdnaW5nIG91dCBhIHNlbGVjdGlvbikuDSMgcHJldlBvcyAtCQlVc2VkIHdoZW4gbW92aW5nIHVwIG9yIGRvd24gbGluZXMgdmlhIHRoZSBrZXlib2FyZC4NIwkJCUtlZXBzIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBpbnNlcnQgcG9zaXRpb24sIHNvDSMJCQl3ZSBjYW4gZGlzdGluZ3Vpc2ggYSBzZXJpZXMgb2YgdXBzIGFuZCBkb3ducywgYWxsDSMJCQlpbiBhIHJvdywgZnJvbSBhIG5ldyB1cCBvciBkb3duLg0jIHNlbGVjdE1vZGUgLQkJVGhlIHN0eWxlIG9mIHNlbGVjdGlvbiBjdXJyZW50bHkgdW5kZXJ3YXk6DSMJCQljaGFyLCB3b3JkLCBvciBsaW5lLg0jIHgsIHkgLQkJTGFzdCBrbm93biBtb3VzZSBjb29yZGluYXRlcyBmb3Igc2Nhbm5pbmcNIwkJCWFuZCBhdXRvLXNjYW5uaW5nLg0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0NIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NIyBUaGUgY29kZSBiZWxvdyBjcmVhdGVzIHRoZSBkZWZhdWx0IGNsYXNzIGJpbmRpbmdzIGZvciB0ZXh0IHdpZGdldHMuDSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQ0jIFN0YW5kYXJkIE1vdGlmIGJpbmRpbmdzOg0NYmluZCBUZXh0IDwxPiB7DSAgICB0a1RleHRCdXR0b24xICVXICV4ICV5DSAgICAlVyB0YWcgcmVtb3ZlIHNlbCAwLjAgZW5kDX0NYmluZCBUZXh0IDxCMS1Nb3Rpb24+IHsNICAgIHNldCB0a1ByaXYoeCkgJXgNICAgIHNldCB0a1ByaXYoeSkgJXkNICAgIHRrVGV4dFNlbGVjdFRvICVXICV4ICV5DX0NYmluZCBUZXh0IDxEb3VibGUtMT4gew0gICAgc2V0IHRrUHJpdihzZWxlY3RNb2RlKSB3b3JkDSAgICB0a1RleHRTZWxlY3RUbyAlVyAleCAleQ0gICAgY2F0Y2ggeyVXIG1hcmsgc2V0IGluc2VydCBzZWwubGFzdH0NICAgIGNhdGNoIHslVyBtYXJrIHNldCBhbmNob3Igc2VsLmZpcnN0fQ19DWJpbmQgVGV4dCA8VHJpcGxlLTE+IHsNICAgIHNldCB0a1ByaXYoc2VsZWN0TW9kZSkgbGluZQ0gICAgdGtUZXh0U2VsZWN0VG8gJVcgJXggJXkNICAgIGNhdGNoIHslVyBtYXJrIHNldCBpbnNlcnQgc2VsLmxhc3R9DSAgICBjYXRjaCB7JVcgbWFyayBzZXQgYW5jaG9yIHNlbC5maXJzdH0NfQ1iaW5kIFRleHQgPFNoaWZ0LTE+IHsNICAgIHRrVGV4dFJlc2V0QW5jaG9yICVXIEAleCwleQ0gICAgc2V0IHRrUHJpdihzZWxlY3RNb2RlKSBjaGFyDSAgICB0a1RleHRTZWxlY3RUbyAlVyAleCAleQ19DWJpbmQgVGV4dCA8RG91YmxlLVNoaWZ0LTE+CXsNICAgIHNldCB0a1ByaXYoc2VsZWN0TW9kZSkgd29yZA0gICAgdGtUZXh0U2VsZWN0VG8gJVcgJXggJXkgMQ19DWJpbmQgVGV4dCA8VHJpcGxlLVNoaWZ0LTE+CXsNICAgIHNldCB0a1ByaXYoc2VsZWN0TW9kZSkgbGluZQ0gICAgdGtUZXh0U2VsZWN0VG8gJVcgJXggJXkNfQ1iaW5kIFRleHQgPEIxLUxlYXZlPiB7DSAgICBzZXQgdGtQcml2KHgpICV4DSAgICBzZXQgdGtQcml2KHkpICV5DSAgICB0a1RleHRBdXRvU2NhbiAlVw19DWJpbmQgVGV4dCA8QjEtRW50ZXI+IHsNICAgIHRrQ2FuY2VsUmVwZWF0DX0NYmluZCBUZXh0IDxCdXR0b25SZWxlYXNlLTE+IHsNICAgIHRrQ2FuY2VsUmVwZWF0DX0NYmluZCBUZXh0IDxDb250cm9sLTE+IHsNICAgICVXIG1hcmsgc2V0IGluc2VydCBAJXgsJXkNfQ1iaW5kIFRleHQgPExlZnQ+IHsNICAgIHRrVGV4dFNldEN1cnNvciAlVyBpbnNlcnQtMWMNfQ1iaW5kIFRleHQgPFJpZ2h0PiB7DSAgICB0a1RleHRTZXRDdXJzb3IgJVcgaW5zZXJ0KzFjDX0NYmluZCBUZXh0IDxVcD4gew0gICAgdGtUZXh0U2V0Q3Vyc29yICVXIFt0a1RleHRVcERvd25MaW5lICVXIC0xXQ19DWJpbmQgVGV4dCA8RG93bj4gew0gICAgdGtUZXh0U2V0Q3Vyc29yICVXIFt0a1RleHRVcERvd25MaW5lICVXIDFdDX0NYmluZCBUZXh0IDxTaGlmdC1MZWZ0PiB7DSAgICB0a1RleHRLZXlTZWxlY3QgJVcgWyVXIGluZGV4IHtpbnNlcnQgLSAxY31dDX0NYmluZCBUZXh0IDxTaGlmdC1SaWdodD4gew0gICAgdGtUZXh0S2V5U2VsZWN0ICVXIFslVyBpbmRleCB7aW5zZXJ0ICsgMWN9XQ19DWJpbmQgVGV4dCA8U2hpZnQtVXA+IHsNICAgIHRrVGV4dEtleVNlbGVjdCAlVyBbdGtUZXh0VXBEb3duTGluZSAlVyAtMV0NfQ1iaW5kIFRleHQgPFNoaWZ0LURvd24+IHsNICAgIHRrVGV4dEtleVNlbGVjdCAlVyBbdGtUZXh0VXBEb3duTGluZSAlVyAxXQ19DWJpbmQgVGV4dCA8Q29udHJvbC1MZWZ0PiB7DSAgICB0a1RleHRTZXRDdXJzb3IgJVcgW3RrVGV4dFByZXZQb3MgJVcgaW5zZXJ0IHRjbF9zdGFydE9mUHJldmlvdXNXb3JkXQ19DWJpbmQgVGV4dCA8Q29udHJvbC1SaWdodD4gew0gICAgdGtUZXh0U2V0Q3Vyc29yICVXIFt0a1RleHROZXh0V29yZCAlVyBpbnNlcnRdDX0NYmluZCBUZXh0IDxDb250cm9sLVVwPiB7DSAgICB0a1RleHRTZXRDdXJzb3IgJVcgW3RrVGV4dFByZXZQYXJhICVXIGluc2VydF0NfQ1iaW5kIFRleHQgPENvbnRyb2wtRG93bj4gew0gICAgdGtUZXh0U2V0Q3Vyc29yICVXIFt0a1RleHROZXh0UGFyYSAlVyBpbnNlcnRdDX0NYmluZCBUZXh0IDxTaGlmdC1Db250cm9sLUxlZnQ+IHsNICAgIHRrVGV4dEtleVNlbGVjdCAlVyBbdGtUZXh0UHJldlBvcyAlVyBpbnNlcnQgdGNsX3N0YXJ0T2ZQcmV2aW91c1dvcmRdDX0NYmluZCBUZXh0IDxTaGlmdC1Db250cm9sLVJpZ2h0PiB7DSAgICB0a1RleHRLZXlTZWxlY3QgJVcgW3RrVGV4dE5leHRXb3JkICVXIGluc2VydF0NfQ1iaW5kIFRleHQgPFNoaWZ0LUNvbnRyb2wtVXA+IHsNICAgIHRrVGV4dEtleVNlbGVjdCAlVyBbdGtUZXh0UHJldlBhcmEgJVcgaW5zZXJ0XQ19DWJpbmQgVGV4dCA8U2hpZnQtQ29udHJvbC1Eb3duPiB7DSAgICB0a1RleHRLZXlTZWxlY3QgJVcgW3RrVGV4dE5leHRQYXJhICVXIGluc2VydF0NfQ1iaW5kIFRleHQgPFByaW9yPiB7DSAgICB0a1RleHRTZXRDdXJzb3IgJVcgW3RrVGV4dFNjcm9sbFBhZ2VzICVXIC0xXQ19DWJpbmQgVGV4dCA8U2hpZnQtUHJpb3I+IHsNICAgIHRrVGV4dEtleVNlbGVjdCAlVyBbdGtUZXh0U2Nyb2xsUGFnZXMgJVcgLTFdDX0NYmluZCBUZXh0IDxOZXh0PiB7DSAgICB0a1RleHRTZXRDdXJzb3IgJVcgW3RrVGV4dFNjcm9sbFBhZ2VzICVXIDFdDX0NYmluZCBUZXh0IDxTaGlmdC1OZXh0PiB7DSAgICB0a1RleHRLZXlTZWxlY3QgJVcgW3RrVGV4dFNjcm9sbFBhZ2VzICVXIDFdDX0NYmluZCBUZXh0IDxDb250cm9sLVByaW9yPiB7DSAgICAlVyB4dmlldyBzY3JvbGwgLTEgcGFnZQ19DWJpbmQgVGV4dCA8Q29udHJvbC1OZXh0PiB7DSAgICAlVyB4dmlldyBzY3JvbGwgMSBwYWdlDX0NDWJpbmQgVGV4dCA8SG9tZT4gew0gICAgdGtUZXh0U2V0Q3Vyc29yICVXIHtpbnNlcnQgbGluZXN0YXJ0fQ19DWJpbmQgVGV4dCA8U2hpZnQtSG9tZT4gew0gICAgdGtUZXh0S2V5U2VsZWN0ICVXIHtpbnNlcnQgbGluZXN0YXJ0fQ19DWJpbmQgVGV4dCA8RW5kPiB7DSAgICB0a1RleHRTZXRDdXJzb3IgJVcge2luc2VydCBsaW5lZW5kfQ19DWJpbmQgVGV4dCA8U2hpZnQtRW5kPiB7DSAgICB0a1RleHRLZXlTZWxlY3QgJVcge2luc2VydCBsaW5lZW5kfQ19DWJpbmQgVGV4dCA8Q29udHJvbC1Ib21lPiB7DSAgICB0a1RleHRTZXRDdXJzb3IgJVcgMS4wDX0NYmluZCBUZXh0IDxDb250cm9sLVNoaWZ0LUhvbWU+IHsNICAgIHRrVGV4dEtleVNlbGVjdCAlVyAxLjANfQ1iaW5kIFRleHQgPENvbnRyb2wtRW5kPiB7DSAgICB0a1RleHRTZXRDdXJzb3IgJVcge2VuZCAtIDEgY2hhcn0NfQ1iaW5kIFRleHQgPENvbnRyb2wtU2hpZnQtRW5kPiB7DSAgICB0a1RleHRLZXlTZWxlY3QgJVcge2VuZCAtIDEgY2hhcn0NfQ0NYmluZCBUZXh0IDxUYWI+IHsNICAgIGlmIHsgW3N0cmluZyBlcXVhbCBbJVcgY2dldCAtc3RhdGVdICJub3JtYWwiXSB9IHsNCXRrVGV4dEluc2VydCAlVyBcdA0JZm9jdXMgJVcNCWJyZWFrDSAgICB9DX0NYmluZCBUZXh0IDxTaGlmdC1UYWI+IHsNICAgICMgTmVlZGVkIG9ubHkgdG8ga2VlcCA8VGFiPiBiaW5kaW5nIGZyb20gdHJpZ2dlcmluZzsgIGRvZXNuJ3QNICAgICMgaGF2ZSB0byBhY3R1YWxseSBkbyBhbnl0aGluZy4NICAgIGJyZWFrDX0NYmluZCBUZXh0IDxDb250cm9sLVRhYj4gew0gICAgZm9jdXMgW3RrX2ZvY3VzTmV4dCAlV10NfQ1iaW5kIFRleHQgPENvbnRyb2wtU2hpZnQtVGFiPiB7DSAgICBmb2N1cyBbdGtfZm9jdXNQcmV2ICVXXQ19DWJpbmQgVGV4dCA8Q29udHJvbC1pPiB7DSAgICB0a1RleHRJbnNlcnQgJVcgXHQNfQ1iaW5kIFRleHQgPFJldHVybj4gew0gICAgdGtUZXh0SW5zZXJ0ICVXIFxuDX0NYmluZCBUZXh0IDxEZWxldGU+IHsNICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgWyVXIHRhZyBuZXh0cmFuZ2Ugc2VsIDEuMCBlbmRdICIiXX0gew0JJVcgZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdA0gICAgfSBlbHNlIHsNCSVXIGRlbGV0ZSBpbnNlcnQNCSVXIHNlZSBpbnNlcnQNICAgIH0NfQ1iaW5kIFRleHQgPEJhY2tTcGFjZT4gew0gICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJVcgdGFnIG5leHRyYW5nZSBzZWwgMS4wIGVuZF0gIiJdfSB7DQklVyBkZWxldGUgc2VsLmZpcnN0IHNlbC5sYXN0DSAgICB9IGVsc2VpZiB7WyVXIGNvbXBhcmUgaW5zZXJ0ICE9IDEuMF19IHsNCSVXIGRlbGV0ZSBpbnNlcnQtMWMNCSVXIHNlZSBpbnNlcnQNICAgIH0NfQ0NYmluZCBUZXh0IDxDb250cm9sLXNwYWNlPiB7DSAgICAlVyBtYXJrIHNldCBhbmNob3IgaW5zZXJ0DX0NYmluZCBUZXh0IDxTZWxlY3Q+IHsNICAgICVXIG1hcmsgc2V0IGFuY2hvciBpbnNlcnQNfQ1iaW5kIFRleHQgPENvbnRyb2wtU2hpZnQtc3BhY2U+IHsNICAgIHNldCB0a1ByaXYoc2VsZWN0TW9kZSkgY2hhcg0gICAgdGtUZXh0S2V5RXh0ZW5kICVXIGluc2VydA19DWJpbmQgVGV4dCA8U2hpZnQtU2VsZWN0PiB7DSAgICBzZXQgdGtQcml2KHNlbGVjdE1vZGUpIGNoYXINICAgIHRrVGV4dEtleUV4dGVuZCAlVyBpbnNlcnQNfQ1iaW5kIFRleHQgPENvbnRyb2wtc2xhc2g+IHsNICAgICVXIHRhZyBhZGQgc2VsIDEuMCBlbmQNfQ1iaW5kIFRleHQgPENvbnRyb2wtYmFja3NsYXNoPiB7DSAgICAlVyB0YWcgcmVtb3ZlIHNlbCAxLjAgZW5kDX0NYmluZCBUZXh0IDw8Q3V0Pj4gew0gICAgdGtfdGV4dEN1dCAlVw19DWJpbmQgVGV4dCA8PENvcHk+PiB7DSAgICB0a190ZXh0Q29weSAlVw19DWJpbmQgVGV4dCA8PFBhc3RlPj4gew0gICAgdGtfdGV4dFBhc3RlICVXDX0NYmluZCBUZXh0IDw8Q2xlYXI+PiB7DSAgICBjYXRjaCB7JVcgZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdH0NfQ1iaW5kIFRleHQgPDxQYXN0ZVNlbGVjdGlvbj4+IHsNICAgIGlmIHshJHRrUHJpdihtb3VzZU1vdmVkKSB8fCAkdGtfc3RyaWN0TW90aWZ9IHsNCXRrVGV4dFBhc3RlICVXICV4ICV5DSAgICB9DX0NYmluZCBUZXh0IDxJbnNlcnQ+IHsNICAgIGNhdGNoIHt0a1RleHRJbnNlcnQgJVcgW3NlbGVjdGlvbiBnZXQgLWRpc3BsYXlvZiAlV119DX0NYmluZCBUZXh0IDxLZXlQcmVzcz4gew0gICAgdGtUZXh0SW5zZXJ0ICVXICVBDX0NDSMgSWdub3JlIGFsbCBBbHQsIE1ldGEsIGFuZCBDb250cm9sIGtleXByZXNzZXMgdW5sZXNzIGV4cGxpY2l0bHkgYm91bmQuDSMgT3RoZXJ3aXNlLCBpZiBhIHdpZGdldCBiaW5kaW5nIGZvciBvbmUgb2YgdGhlc2UgaXMgZGVmaW5lZCwgdGhlDSMgPEtleVByZXNzPiBjbGFzcyBiaW5kaW5nIHdpbGwgYWxzbyBmaXJlIGFuZCBpbnNlcnQgdGhlIGNoYXJhY3RlciwNIyB3aGljaCBpcyB3cm9uZy4gIERpdHRvIGZvciA8RXNjYXBlPi4NDWJpbmQgVGV4dCA8QWx0LUtleVByZXNzPiB7IyBub3RoaW5nIH0NYmluZCBUZXh0IDxNZXRhLUtleVByZXNzPiB7IyBub3RoaW5nfQ1iaW5kIFRleHQgPENvbnRyb2wtS2V5UHJlc3M+IHsjIG5vdGhpbmd9DWJpbmQgVGV4dCA8RXNjYXBlPiB7IyBub3RoaW5nfQ1iaW5kIFRleHQgPEtQX0VudGVyPiB7IyBub3RoaW5nfQ1pZiB7W3N0cmluZyBlcXVhbCAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAibWFjaW50b3NoIl19IHsNICAgIGJpbmQgVGV4dCA8Q29tbWFuZC1LZXlQcmVzcz4geyMgbm90aGluZ30NfQ0NIyBBZGRpdGlvbmFsIGVtYWNzLWxpa2UgYmluZGluZ3M6DQ1iaW5kIFRleHQgPENvbnRyb2wtYT4gew0gICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsNCXRrVGV4dFNldEN1cnNvciAlVyB7aW5zZXJ0IGxpbmVzdGFydH0NICAgIH0NfQ1iaW5kIFRleHQgPENvbnRyb2wtYj4gew0gICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsNCXRrVGV4dFNldEN1cnNvciAlVyBpbnNlcnQtMWMNICAgIH0NfQ1iaW5kIFRleHQgPENvbnRyb2wtZD4gew0gICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsNCSVXIGRlbGV0ZSBpbnNlcnQNICAgIH0NfQ1iaW5kIFRleHQgPENvbnRyb2wtZT4gew0gICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsNCXRrVGV4dFNldEN1cnNvciAlVyB7aW5zZXJ0IGxpbmVlbmR9DSAgICB9DX0NYmluZCBUZXh0IDxDb250cm9sLWY+IHsNICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7DQl0a1RleHRTZXRDdXJzb3IgJVcgaW5zZXJ0KzFjDSAgICB9DX0NYmluZCBUZXh0IDxDb250cm9sLWs+IHsNICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7DQlpZiB7WyVXIGNvbXBhcmUgaW5zZXJ0ID09IHtpbnNlcnQgbGluZWVuZH1dfSB7DQkgICAgJVcgZGVsZXRlIGluc2VydA0JfSBlbHNlIHsNCSAgICAlVyBkZWxldGUgaW5zZXJ0IHtpbnNlcnQgbGluZWVuZH0NCX0NICAgIH0NfQ1iaW5kIFRleHQgPENvbnRyb2wtbj4gew0gICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsNCXRrVGV4dFNldEN1cnNvciAlVyBbdGtUZXh0VXBEb3duTGluZSAlVyAxXQ0gICAgfQ19DWJpbmQgVGV4dCA8Q29udHJvbC1vPiB7DSAgICBpZiB7ISR0a19zdHJpY3RNb3RpZn0gew0JJVcgaW5zZXJ0IGluc2VydCBcbg0JJVcgbWFyayBzZXQgaW5zZXJ0IGluc2VydC0xYw0gICAgfQ19DWJpbmQgVGV4dCA8Q29udHJvbC1wPiB7DSAgICBpZiB7ISR0a19zdHJpY3RNb3RpZn0gew0JdGtUZXh0U2V0Q3Vyc29yICVXIFt0a1RleHRVcERvd25MaW5lICVXIC0xXQ0gICAgfQ19DWJpbmQgVGV4dCA8Q29udHJvbC10PiB7DSAgICBpZiB7ISR0a19zdHJpY3RNb3RpZn0gew0JdGtUZXh0VHJhbnNwb3NlICVXDSAgICB9DX0NDWlmIHtbc3RyaW5nIGNvbXBhcmUgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIndpbmRvd3MiXX0gew1iaW5kIFRleHQgPENvbnRyb2wtdj4gew0gICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsNCXRrVGV4dFNjcm9sbFBhZ2VzICVXIDENICAgIH0NfQ19DQ1iaW5kIFRleHQgPE1ldGEtYj4gew0gICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsNCXRrVGV4dFNldEN1cnNvciAlVyBbdGtUZXh0UHJldlBvcyAlVyBpbnNlcnQgdGNsX3N0YXJ0T2ZQcmV2aW91c1dvcmRdDSAgICB9DX0NYmluZCBUZXh0IDxNZXRhLWQ+IHsNICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7DQklVyBkZWxldGUgaW5zZXJ0IFt0a1RleHROZXh0V29yZCAlVyBpbnNlcnRdDSAgICB9DX0NYmluZCBUZXh0IDxNZXRhLWY+IHsNICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7DQl0a1RleHRTZXRDdXJzb3IgJVcgW3RrVGV4dE5leHRXb3JkICVXIGluc2VydF0NICAgIH0NfQ1iaW5kIFRleHQgPE1ldGEtbGVzcz4gew0gICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsNCXRrVGV4dFNldEN1cnNvciAlVyAxLjANICAgIH0NfQ1iaW5kIFRleHQgPE1ldGEtZ3JlYXRlcj4gew0gICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsNCXRrVGV4dFNldEN1cnNvciAlVyBlbmQtMWMNICAgIH0NfQ1iaW5kIFRleHQgPE1ldGEtQmFja1NwYWNlPiB7DSAgICBpZiB7ISR0a19zdHJpY3RNb3RpZn0gew0JJVcgZGVsZXRlIFt0a1RleHRQcmV2UG9zICVXIGluc2VydCB0Y2xfc3RhcnRPZlByZXZpb3VzV29yZF0gaW5zZXJ0DSAgICB9DX0NYmluZCBUZXh0IDxNZXRhLURlbGV0ZT4gew0gICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsNCSVXIGRlbGV0ZSBbdGtUZXh0UHJldlBvcyAlVyBpbnNlcnQgdGNsX3N0YXJ0T2ZQcmV2aW91c1dvcmRdIGluc2VydA0gICAgfQ19DQ0jIE1hY2ludG9zaCBvbmx5IGJpbmRpbmdzOg0NIyBpZiB0ZXh0IGJsYWNrICYgaGlnaGxpZ2h0IGJsYWNrIC0+IHRleHQgd2hpdGUsIG90aGVyIHRleHQgdGhlIHNhbWUNaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIm1hY2ludG9zaCJdfSB7DWJpbmQgVGV4dCA8Rm9jdXNJbj4gew0gICAgJVcgdGFnIGNvbmZpZ3VyZSBzZWwgLWJvcmRlcndpZHRoIDANICAgICVXIGNvbmZpZ3VyZSAtc2VsZWN0YmFja2dyb3VuZCBzeXN0ZW1IaWdobGlnaHQgLXNlbGVjdGZvcmVncm91bmQgc3lzdGVtSGlnaGxpZ2h0VGV4dA19DWJpbmQgVGV4dCA8Rm9jdXNPdXQ+IHsNICAgICVXIHRhZyBjb25maWd1cmUgc2VsIC1ib3JkZXJ3aWR0aCAxDSAgICAlVyBjb25maWd1cmUgLXNlbGVjdGJhY2tncm91bmQgd2hpdGUgLXNlbGVjdGZvcmVncm91bmQgYmxhY2sNfQ1iaW5kIFRleHQgPE9wdGlvbi1MZWZ0PiB7DSAgICB0a1RleHRTZXRDdXJzb3IgJVcgW3RrVGV4dFByZXZQb3MgJVcgaW5zZXJ0IHRjbF9zdGFydE9mUHJldmlvdXNXb3JkXQ19DWJpbmQgVGV4dCA8T3B0aW9uLVJpZ2h0PiB7DSAgICB0a1RleHRTZXRDdXJzb3IgJVcgW3RrVGV4dE5leHRXb3JkICVXIGluc2VydF0NfQ1iaW5kIFRleHQgPE9wdGlvbi1VcD4gew0gICAgdGtUZXh0U2V0Q3Vyc29yICVXIFt0a1RleHRQcmV2UGFyYSAlVyBpbnNlcnRdDX0NYmluZCBUZXh0IDxPcHRpb24tRG93bj4gew0gICAgdGtUZXh0U2V0Q3Vyc29yICVXIFt0a1RleHROZXh0UGFyYSAlVyBpbnNlcnRdDX0NYmluZCBUZXh0IDxTaGlmdC1PcHRpb24tTGVmdD4gew0gICAgdGtUZXh0S2V5U2VsZWN0ICVXIFt0a1RleHRQcmV2UG9zICVXIGluc2VydCB0Y2xfc3RhcnRPZlByZXZpb3VzV29yZF0NfQ1iaW5kIFRleHQgPFNoaWZ0LU9wdGlvbi1SaWdodD4gew0gICAgdGtUZXh0S2V5U2VsZWN0ICVXIFt0a1RleHROZXh0V29yZCAlVyBpbnNlcnRdDX0NYmluZCBUZXh0IDxTaGlmdC1PcHRpb24tVXA+IHsNICAgIHRrVGV4dEtleVNlbGVjdCAlVyBbdGtUZXh0UHJldlBhcmEgJVcgaW5zZXJ0XQ19DWJpbmQgVGV4dCA8U2hpZnQtT3B0aW9uLURvd24+IHsNICAgIHRrVGV4dEtleVNlbGVjdCAlVyBbdGtUZXh0TmV4dFBhcmEgJVcgaW5zZXJ0XQ19DQ0jIEVuZCBvZiBNYWMgb25seSBiaW5kaW5ncw19DQ0jIEEgZmV3IGFkZGl0aW9uYWwgYmluZGluZ3Mgb2YgbXkgb3duLg0NYmluZCBUZXh0IDxDb250cm9sLWg+IHsNICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7DQlpZiB7WyVXIGNvbXBhcmUgaW5zZXJ0ICE9IDEuMF19IHsNCSAgICAlVyBkZWxldGUgaW5zZXJ0LTFjDQkgICAgJVcgc2VlIGluc2VydA0JfQ0gICAgfQ19DWJpbmQgVGV4dCA8Mj4gew0gICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsNCSVXIHNjYW4gbWFyayAleCAleQ0Jc2V0IHRrUHJpdih4KSAleA0Jc2V0IHRrUHJpdih5KSAleQ0Jc2V0IHRrUHJpdihtb3VzZU1vdmVkKSAwDSAgICB9DX0NYmluZCBUZXh0IDxCMi1Nb3Rpb24+IHsNICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7DQlpZiB7KCV4ICE9ICR0a1ByaXYoeCkpIHx8ICgleSAhPSAkdGtQcml2KHkpKX0gew0JICAgIHNldCB0a1ByaXYobW91c2VNb3ZlZCkgMQ0JfQ0JaWYgeyR0a1ByaXYobW91c2VNb3ZlZCl9IHsNCSAgICAlVyBzY2FuIGRyYWd0byAleCAleQ0JfQ0gICAgfQ19DXNldCB0a1ByaXYocHJldlBvcykge30NDSMgVGhlIE1vdXNlV2hlZWwgd2lsbCB0eXBpY2FsbHkgb25seSBmaXJlIG9uIFdpbmRvd3MuICBIb3dldmVyLA0jIHNvbWVvbmUgY291bGQgdXNlIHRoZSAiZXZlbnQgZ2VuZXJhdGUiIGNvbW1hbmQgdG8gcHJvZHVjZSBvbmUNIyBvbiBvdGhlciBwbGF0Zm9ybXMuDQ1iaW5kIFRleHQgPE1vdXNlV2hlZWw+IHsNICAgICVXIHl2aWV3IHNjcm9sbCBbZXhwciB7LSAoJUQgLyAxMjApICogNH1dIHVuaXRzDX0NDWlmIHtbc3RyaW5nIGVxdWFsICJ1bml4IiAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKV19IHsNICAgICMgU3VwcG9ydCBmb3IgbW91c2V3aGVlbHMgb24gTGludXgvVW5peCBjb21tb25seSBjb21lcyB0aHJvdWdoIG1hcHBpbmcNICAgICMgdGhlIHdoZWVsIHRvIHRoZSBleHRlbmRlZCBidXR0b25zLiAgSWYgeW91IGhhdmUgYSBtb3VzZXdoZWVsLCBmaW5kDSAgICAjIExpbnV4IGNvbmZpZ3VyYXRpb24gaW5mbyBhdDoNICAgICMJaHR0cDovL3d3dy5pbnJpYS5mci9rb2FsYS9jb2xhcy9tb3VzZS13aGVlbC1zY3JvbGwvDSAgICBiaW5kIFRleHQgPDQ+IHsNCWlmIHshJHRrX3N0cmljdE1vdGlmfSB7DQkgICAgJVcgeXZpZXcgc2Nyb2xsIC01IHVuaXRzDQl9DSAgICB9DSAgICBiaW5kIFRleHQgPDU+IHsNCWlmIHshJHRrX3N0cmljdE1vdGlmfSB7DQkgICAgJVcgeXZpZXcgc2Nyb2xsIDUgdW5pdHMNCX0NICAgIH0NfQ0NIyB0a1RleHRDbG9zZXN0R2FwIC0tDSMgR2l2ZW4geCBhbmQgeSBjb29yZGluYXRlcywgdGhpcyBwcm9jZWR1cmUgZmluZHMgdGhlIGNsb3Nlc3QgYm91bmRhcnkNIyBiZXR3ZWVuIGNoYXJhY3RlcnMgdG8gdGhlIGdpdmVuIGNvb3JkaW5hdGVzIGFuZCByZXR1cm5zIHRoZSBpbmRleA0jIG9mIHRoZSBjaGFyYWN0ZXIganVzdCBhZnRlciB0aGUgYm91bmRhcnkuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgdGV4dCB3aW5kb3cuDSMgeCAtCQlYLWNvb3JkaW5hdGUgd2l0aGluIHRoZSB3aW5kb3cuDSMgeSAtCQlZLWNvb3JkaW5hdGUgd2l0aGluIHRoZSB3aW5kb3cuDQ1wcm9jIHRrVGV4dENsb3Nlc3RHYXAge3cgeCB5fSB7DSAgICBzZXQgcG9zIFskdyBpbmRleCBAJHgsJHldDSAgICBzZXQgYmJveCBbJHcgYmJveCAkcG9zXQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgJGJib3ggIiJdfSB7DQlyZXR1cm4gJHBvcw0gICAgfQ0gICAgaWYgeygkeCAtIFtsaW5kZXggJGJib3ggMF0pIDwgKFtsaW5kZXggJGJib3ggMl0vMil9IHsNCXJldHVybiAkcG9zDSAgICB9DSAgICAkdyBpbmRleCAiJHBvcyArIDEgY2hhciINfQ0NIyB0a1RleHRCdXR0b24xIC0tDSMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCB0byBoYW5kbGUgYnV0dG9uLTEgcHJlc3NlcyBpbiB0ZXh0DSMgd2lkZ2V0cy4gIEl0IG1vdmVzIHRoZSBpbnNlcnRpb24gY3Vyc29yLCBzZXRzIHRoZSBzZWxlY3Rpb24gYW5jaG9yLA0jIGFuZCBjbGFpbXMgdGhlIGlucHV0IGZvY3VzLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIHRleHQgd2luZG93IGluIHdoaWNoIHRoZSBidXR0b24gd2FzIHByZXNzZWQuDSMgeCAtCQlUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBidXR0b24gcHJlc3MuDSMgeSAtCQlUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBidXR0b24gcHJlc3MuDQ1wcm9jIHRrVGV4dEJ1dHRvbjEge3cgeCB5fSB7DSAgICBnbG9iYWwgdGtQcml2DQ0gICAgc2V0IHRrUHJpdihzZWxlY3RNb2RlKSBjaGFyDSAgICBzZXQgdGtQcml2KG1vdXNlTW92ZWQpIDANICAgIHNldCB0a1ByaXYocHJlc3NYKSAkeA0gICAgJHcgbWFyayBzZXQgaW5zZXJ0IFt0a1RleHRDbG9zZXN0R2FwICR3ICR4ICR5XQ0gICAgJHcgbWFyayBzZXQgYW5jaG9yIGluc2VydA0gICAgaWYge1tzdHJpbmcgZXF1YWwgWyR3IGNnZXQgLXN0YXRlXSAibm9ybWFsIl19IHtmb2N1cyAkd30NfQ0NIyB0a1RleHRTZWxlY3RUbyAtLQ0jIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgdG8gZXh0ZW5kIHRoZSBzZWxlY3Rpb24sIHR5cGljYWxseSB3aGVuDSMgZHJhZ2dpbmcgaXQgd2l0aCB0aGUgbW91c2UuICBEZXBlbmRpbmcgb24gdGhlIHNlbGVjdGlvbiBtb2RlIChjaGFyYWN0ZXIsDSMgd29yZCwgbGluZSkgaXQgc2VsZWN0cyBpbiBkaWZmZXJlbnQtc2l6ZWQgdW5pdHMuICBUaGlzIHByb2NlZHVyZQ0jIGlnbm9yZXMgbW91c2UgbW90aW9ucyBpbml0aWFsbHkgdW50aWwgdGhlIG1vdXNlIGhhcyBtb3ZlZCBmcm9tDSMgb25lIGNoYXJhY3RlciB0byBhbm90aGVyIG9yIHVudGlsIHRoZXJlIGhhdmUgYmVlbiBtdWx0aXBsZSBjbGlja3MuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgdGV4dCB3aW5kb3cgaW4gd2hpY2ggdGhlIGJ1dHRvbiB3YXMgcHJlc3NlZC4NIyB4IC0JCU1vdXNlIHggcG9zaXRpb24uDSMgeSAtIAkJTW91c2UgeSBwb3NpdGlvbi4NDXByb2MgdGtUZXh0U2VsZWN0VG8ge3cgeCB5IHtleHRlbmQgMH19IHsNICAgIGdsb2JhbCB0a1ByaXYgdGNsX3BsYXRmb3JtDQ0gICAgc2V0IGN1ciBbdGtUZXh0Q2xvc2VzdEdhcCAkdyAkeCAkeV0NICAgIGlmIHtbY2F0Y2ggeyR3IGluZGV4IGFuY2hvcn1dfSB7DQkkdyBtYXJrIHNldCBhbmNob3IgJGN1cg0gICAgfQ0gICAgc2V0IGFuY2hvciBbJHcgaW5kZXggYW5jaG9yXQ0gICAgaWYge1skdyBjb21wYXJlICRjdXIgIT0gJGFuY2hvcl0gfHwgKGFicygkdGtQcml2KHByZXNzWCkgLSAkeCkgPj0gMyl9IHsNCXNldCB0a1ByaXYobW91c2VNb3ZlZCkgMQ0gICAgfQ0gICAgc3dpdGNoICR0a1ByaXYoc2VsZWN0TW9kZSkgew0JY2hhciB7DQkgICAgaWYge1skdyBjb21wYXJlICRjdXIgPCBhbmNob3JdfSB7DQkJc2V0IGZpcnN0ICRjdXINCQlzZXQgbGFzdCBhbmNob3INCSAgICB9IGVsc2Ugew0JCXNldCBmaXJzdCBhbmNob3INCQlzZXQgbGFzdCAkY3VyDQkgICAgfQ0JfQ0Jd29yZCB7DQkgICAgaWYge1skdyBjb21wYXJlICRjdXIgPCBhbmNob3JdfSB7DQkJc2V0IGZpcnN0IFt0a1RleHRQcmV2UG9zICR3ICIkY3VyICsgMWMiIHRjbF93b3JkQnJlYWtCZWZvcmVdDQkJaWYgeyAhJGV4dGVuZCB9IHsNCQkgICAgc2V0IGxhc3QgW3RrVGV4dE5leHRQb3MgJHcgImFuY2hvciIgdGNsX3dvcmRCcmVha0FmdGVyXQ0JCX0gZWxzZSB7DQkJICAgIHNldCBsYXN0IGFuY2hvcg0JCX0NCSAgICB9IGVsc2Ugew0JCXNldCBsYXN0IFt0a1RleHROZXh0UG9zICR3ICIkY3VyIC0gMWMiIHRjbF93b3JkQnJlYWtBZnRlcl0NCQlpZiB7ICEkZXh0ZW5kIH0gew0JCSAgICBzZXQgZmlyc3QgW3RrVGV4dFByZXZQb3MgJHcgYW5jaG9yIHRjbF93b3JkQnJlYWtCZWZvcmVdDQkJfSBlbHNlIHsNCQkgICAgc2V0IGZpcnN0IGFuY2hvcg0JCX0NCSAgICB9DQl9DQlsaW5lIHsNCSAgICBpZiB7WyR3IGNvbXBhcmUgJGN1ciA8IGFuY2hvcl19IHsNCQlzZXQgZmlyc3QgWyR3IGluZGV4ICIkY3VyIGxpbmVzdGFydCJdDQkJc2V0IGxhc3QgWyR3IGluZGV4ICJhbmNob3IgLSAxYyBsaW5lZW5kICsgMWMiXQ0JICAgIH0gZWxzZSB7DQkJc2V0IGZpcnN0IFskdyBpbmRleCAiYW5jaG9yIGxpbmVzdGFydCJdDQkJc2V0IGxhc3QgWyR3IGluZGV4ICIkY3VyIGxpbmVlbmQgKyAxYyJdDQkgICAgfQ0JfQ0gICAgfQ0gICAgaWYgeyR0a1ByaXYobW91c2VNb3ZlZCkgfHwgW3N0cmluZyBjb21wYXJlICR0a1ByaXYoc2VsZWN0TW9kZSkgImNoYXIiXX0gew0JJHcgdGFnIHJlbW92ZSBzZWwgMC4wIGVuZA0JJHcgbWFyayBzZXQgaW5zZXJ0ICRjdXINCSR3IHRhZyBhZGQgc2VsICRmaXJzdCAkbGFzdA0JdXBkYXRlIGlkbGV0YXNrcw0gICAgfQ19DQ0jIHRrVGV4dEtleUV4dGVuZCAtLQ0jIFRoaXMgcHJvY2VkdXJlIGhhbmRsZXMgZXh0ZW5kaW5nIHRoZSBzZWxlY3Rpb24gZnJvbSB0aGUga2V5Ym9hcmQsDSMgd2hlcmUgdGhlIHBvaW50IHRvIGV4dGVuZCB0byBpcyByZWFsbHkgdGhlIGJvdW5kYXJ5IGJldHdlZW4gdHdvDSMgY2hhcmFjdGVycyByYXRoZXIgdGhhbiBhIHBhcnRpY3VsYXIgY2hhcmFjdGVyLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIHRleHQgd2luZG93Lg0jIGluZGV4IC0JVGhlIHBvaW50IHRvIHdoaWNoIHRoZSBzZWxlY3Rpb24gaXMgdG8gYmUgZXh0ZW5kZWQuDQ1wcm9jIHRrVGV4dEtleUV4dGVuZCB7dyBpbmRleH0gew0gICAgZ2xvYmFsIHRrUHJpdg0NICAgIHNldCBjdXIgWyR3IGluZGV4ICRpbmRleF0NICAgIGlmIHtbY2F0Y2ggeyR3IGluZGV4IGFuY2hvcn1dfSB7DQkkdyBtYXJrIHNldCBhbmNob3IgJGN1cg0gICAgfQ0gICAgc2V0IGFuY2hvciBbJHcgaW5kZXggYW5jaG9yXQ0gICAgaWYge1skdyBjb21wYXJlICRjdXIgPCBhbmNob3JdfSB7DQlzZXQgZmlyc3QgJGN1cg0Jc2V0IGxhc3QgYW5jaG9yDSAgICB9IGVsc2Ugew0Jc2V0IGZpcnN0IGFuY2hvcg0Jc2V0IGxhc3QgJGN1cg0gICAgfQ0gICAgJHcgdGFnIHJlbW92ZSBzZWwgMC4wICRmaXJzdA0gICAgJHcgdGFnIGFkZCBzZWwgJGZpcnN0ICRsYXN0DSAgICAkdyB0YWcgcmVtb3ZlIHNlbCAkbGFzdCBlbmQNfQ0NIyB0a1RleHRQYXN0ZSAtLQ0jIFRoaXMgcHJvY2VkdXJlIHNldHMgdGhlIGluc2VydGlvbiBjdXJzb3IgdG8gdGhlIG1vdXNlIHBvc2l0aW9uLA0jIGluc2VydHMgdGhlIHNlbGVjdGlvbiwgYW5kIHNldHMgdGhlIGZvY3VzIHRvIHRoZSB3aW5kb3cuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgdGV4dCB3aW5kb3cuDSMgeCwgeSAtIAlQb3NpdGlvbiBvZiB0aGUgbW91c2UuDQ1wcm9jIHRrVGV4dFBhc3RlIHt3IHggeX0gew0gICAgJHcgbWFyayBzZXQgaW5zZXJ0IFt0a1RleHRDbG9zZXN0R2FwICR3ICR4ICR5XQ0gICAgY2F0Y2ggeyR3IGluc2VydCBpbnNlcnQgW3NlbGVjdGlvbiBnZXQgLWRpc3BsYXlvZiAkd119DSAgICBpZiB7W3N0cmluZyBlcXVhbCBbJHcgY2dldCAtc3RhdGVdICJub3JtYWwiXX0ge2ZvY3VzICR3fQ19DQ0jIHRrVGV4dEF1dG9TY2FuIC0tDSMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgYSB0ZXh0IHdpbmRvdw0jIHdpdGggYnV0dG9uIDEgZG93bi4gIEl0IHNjcm9sbHMgdGhlIHdpbmRvdyB1cCwgZG93biwgbGVmdCwgb3IgcmlnaHQsDSMgZGVwZW5kaW5nIG9uIHdoZXJlIHRoZSBtb3VzZSBpcyAodGhpcyBpbmZvcm1hdGlvbiB3YXMgc2F2ZWQgaW4NIyB0a1ByaXYoeCkgYW5kIHRrUHJpdih5KSksIGFuZCByZXNjaGVkdWxlcyBpdHNlbGYgYXMgYW4gImFmdGVyIg0jIGNvbW1hbmQgc28gdGhhdCB0aGUgd2luZG93IGNvbnRpbnVlcyB0byBzY3JvbGwgdW50aWwgdGhlIG1vdXNlDSMgbW92ZXMgYmFjayBpbnRvIHRoZSB3aW5kb3cgb3IgdGhlIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZC4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSB0ZXh0IHdpbmRvdy4NDXByb2MgdGtUZXh0QXV0b1NjYW4ge3d9IHsNICAgIGdsb2JhbCB0a1ByaXYNICAgIGlmIHshW3dpbmZvIGV4aXN0cyAkd119IHJldHVybg0gICAgaWYgeyR0a1ByaXYoeSkgPj0gW3dpbmZvIGhlaWdodCAkd119IHsNCSR3IHl2aWV3IHNjcm9sbCAyIHVuaXRzDSAgICB9IGVsc2VpZiB7JHRrUHJpdih5KSA8IDB9IHsNCSR3IHl2aWV3IHNjcm9sbCAtMiB1bml0cw0gICAgfSBlbHNlaWYgeyR0a1ByaXYoeCkgPj0gW3dpbmZvIHdpZHRoICR3XX0gew0JJHcgeHZpZXcgc2Nyb2xsIDIgdW5pdHMNICAgIH0gZWxzZWlmIHskdGtQcml2KHgpIDwgMH0gew0JJHcgeHZpZXcgc2Nyb2xsIC0yIHVuaXRzDSAgICB9IGVsc2Ugew0JcmV0dXJuDSAgICB9DSAgICB0a1RleHRTZWxlY3RUbyAkdyAkdGtQcml2KHgpICR0a1ByaXYoeSkNICAgIHNldCB0a1ByaXYoYWZ0ZXJJZCkgW2FmdGVyIDUwIFtsaXN0IHRrVGV4dEF1dG9TY2FuICR3XV0NfQ0NIyB0a1RleHRTZXRDdXJzb3INIyBNb3ZlIHRoZSBpbnNlcnRpb24gY3Vyc29yIHRvIGEgZ2l2ZW4gcG9zaXRpb24gaW4gYSB0ZXh0LiAgQWxzbw0jIGNsZWFycyB0aGUgc2VsZWN0aW9uLCBpZiB0aGVyZSBpcyBvbmUgaW4gdGhlIHRleHQsIGFuZCBtYWtlcyBzdXJlDSMgdGhhdCB0aGUgaW5zZXJ0aW9uIGN1cnNvciBpcyB2aXNpYmxlLiAgQWxzbywgZG9uJ3QgbGV0IHRoZSBpbnNlcnRpb24NIyBjdXJzb3IgYXBwZWFyIG9uIHRoZSBkdW1teSBsYXN0IGxpbmUgb2YgdGhlIHRleHQuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgdGV4dCB3aW5kb3cuDSMgcG9zIC0JCVRoZSBkZXNpcmVkIG5ldyBwb3NpdGlvbiBmb3IgdGhlIGN1cnNvciBpbiB0aGUgd2luZG93Lg0NcHJvYyB0a1RleHRTZXRDdXJzb3Ige3cgcG9zfSB7DSAgICBnbG9iYWwgdGtQcml2DQ0gICAgaWYge1skdyBjb21wYXJlICRwb3MgPT0gZW5kXX0gew0Jc2V0IHBvcyB7ZW5kIC0gMSBjaGFyc30NICAgIH0NICAgICR3IG1hcmsgc2V0IGluc2VydCAkcG9zDSAgICAkdyB0YWcgcmVtb3ZlIHNlbCAxLjAgZW5kDSAgICAkdyBzZWUgaW5zZXJ0DX0NDSMgdGtUZXh0S2V5U2VsZWN0DSMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCB3aGVuIHN0cm9raW5nIG91dCBzZWxlY3Rpb25zIHVzaW5nIHRoZQ0jIGtleWJvYXJkLiAgSXQgbW92ZXMgdGhlIGN1cnNvciB0byBhIG5ldyBwb3NpdGlvbiwgdGhlbiBleHRlbmRzDSMgdGhlIHNlbGVjdGlvbiB0byB0aGF0IHBvc2l0aW9uLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIHRleHQgd2luZG93Lg0jIG5ldyAtCQlBIG5ldyBwb3NpdGlvbiBmb3IgdGhlIGluc2VydGlvbiBjdXJzb3IgKHRoZSBjdXJzb3IgaGFzbid0DSMJCWFjdHVhbGx5IGJlZW4gbW92ZWQgdG8gdGhpcyBwb3NpdGlvbiB5ZXQpLg0NcHJvYyB0a1RleHRLZXlTZWxlY3Qge3cgbmV3fSB7DSAgICBnbG9iYWwgdGtQcml2DQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgWyR3IHRhZyBuZXh0cmFuZ2Ugc2VsIDEuMCBlbmRdICIiXX0gew0JaWYge1skdyBjb21wYXJlICRuZXcgPCBpbnNlcnRdfSB7DQkgICAgJHcgdGFnIGFkZCBzZWwgJG5ldyBpbnNlcnQNCX0gZWxzZSB7DQkgICAgJHcgdGFnIGFkZCBzZWwgaW5zZXJ0ICRuZXcNCX0NCSR3IG1hcmsgc2V0IGFuY2hvciBpbnNlcnQNICAgIH0gZWxzZSB7DQlpZiB7WyR3IGNvbXBhcmUgJG5ldyA8IGFuY2hvcl19IHsNCSAgICBzZXQgZmlyc3QgJG5ldw0JICAgIHNldCBsYXN0IGFuY2hvcg0JfSBlbHNlIHsNCSAgICBzZXQgZmlyc3QgYW5jaG9yDQkgICAgc2V0IGxhc3QgJG5ldw0JfQ0JJHcgdGFnIHJlbW92ZSBzZWwgMS4wICRmaXJzdA0JJHcgdGFnIGFkZCBzZWwgJGZpcnN0ICRsYXN0DQkkdyB0YWcgcmVtb3ZlIHNlbCAkbGFzdCBlbmQNICAgIH0NICAgICR3IG1hcmsgc2V0IGluc2VydCAkbmV3DSAgICAkdyBzZWUgaW5zZXJ0DSAgICB1cGRhdGUgaWRsZXRhc2tzDX0NDSMgdGtUZXh0UmVzZXRBbmNob3IgLS0NIyBTZXQgdGhlIHNlbGVjdGlvbiBhbmNob3IgdG8gd2hpY2hldmVyIGVuZCBpcyBmYXJ0aGVzdCBmcm9tIHRoZQ0jIGluZGV4IGFyZ3VtZW50LiAgT25lIHNwZWNpYWwgdHJpY2s6IGlmIHRoZSBzZWxlY3Rpb24gaGFzIHR3byBvcg0jIGZld2VyIGNoYXJhY3RlcnMsIGp1c3QgbGVhdmUgdGhlIGFuY2hvciB3aGVyZSBpdCBpcy4gIEluIHRoaXMNIyBjYXNlIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIHBvaW50IGdldHMgY2hvc2VuIGZvciB0aGUgYW5jaG9yLA0jIGFuZCBmb3IgdGhlIHRoaW5ncyBsaWtlIFNoaWZ0LUxlZnQgYW5kIFNoaWZ0LVJpZ2h0IHRoaXMgcHJvZHVjZXMNIyBiZXR0ZXIgYmVoYXZpb3Igd2hlbiB0aGUgY3Vyc29yIG1vdmVzIGJhY2sgYW5kIGZvcnRoIGFjcm9zcyB0aGUNIyBhbmNob3IuDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgdGV4dCB3aWRnZXQuDSMgaW5kZXggLQlQb3NpdGlvbiBhdCB3aGljaCBtb3VzZSBidXR0b24gd2FzIHByZXNzZWQsIHdoaWNoIGRldGVybWluZXMNIwkJd2hpY2ggZW5kIG9mIHNlbGVjdGlvbiBzaG91bGQgYmUgdXNlZCBhcyBhbmNob3IgcG9pbnQuDQ1wcm9jIHRrVGV4dFJlc2V0QW5jaG9yIHt3IGluZGV4fSB7DSAgICBnbG9iYWwgdGtQcml2DQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgWyR3IHRhZyByYW5nZXMgc2VsXSAiIl19IHsNCSMgRG9uJ3QgbW92ZSB0aGUgYW5jaG9yIGlmIHRoZXJlIGlzIG5vIHNlbGVjdGlvbiBub3c7IHRoaXMgbWFrZXMNCSMgdGhlIHdpZGdldCBiZWhhdmUgImNvcnJlY3RseSIgd2hlbiB0aGUgdXNlciBjbGlja3Mgb25jZSwgdGhlbg0JIyBzaGlmdC1jbGlja3Mgc29tZXdoZXJlIC0tIGllLCB0aGUgYXJlYSBiZXR3ZWVuIHRoZSB0d28gY2xpY2tzIHdpbGwgYmUNCSMgc2VsZWN0ZWQuIFtCdWc6IDU5MjldLg0JcmV0dXJuDSAgICB9DSAgICBzZXQgYSBbJHcgaW5kZXggJGluZGV4XQ0gICAgc2V0IGIgWyR3IGluZGV4IHNlbC5maXJzdF0NICAgIHNldCBjIFskdyBpbmRleCBzZWwubGFzdF0NICAgIGlmIHtbJHcgY29tcGFyZSAkYSA8ICRiXX0gew0JJHcgbWFyayBzZXQgYW5jaG9yIHNlbC5sYXN0DQlyZXR1cm4NICAgIH0NICAgIGlmIHtbJHcgY29tcGFyZSAkYSA+ICRjXX0gew0JJHcgbWFyayBzZXQgYW5jaG9yIHNlbC5maXJzdA0JcmV0dXJuDSAgICB9DSAgICBzY2FuICRhICIlZC4lZCIgbGluZUEgY2hBDSAgICBzY2FuICRiICIlZC4lZCIgbGluZUIgY2hCDSAgICBzY2FuICRjICIlZC4lZCIgbGluZUMgY2hDDSAgICBpZiB7JGxpbmVCIDwgJGxpbmVDKzJ9IHsNCXNldCB0b3RhbCBbc3RyaW5nIGxlbmd0aCBbJHcgZ2V0ICRiICRjXV0NCWlmIHskdG90YWwgPD0gMn0gew0JICAgIHJldHVybg0JfQ0JaWYge1tzdHJpbmcgbGVuZ3RoIFskdyBnZXQgJGIgJGFdXSA8ICgkdG90YWwvMil9IHsNCSAgICAkdyBtYXJrIHNldCBhbmNob3Igc2VsLmxhc3QNCX0gZWxzZSB7DQkgICAgJHcgbWFyayBzZXQgYW5jaG9yIHNlbC5maXJzdA0JfQ0JcmV0dXJuDSAgICB9DSAgICBpZiB7KCRsaW5lQS0kbGluZUIpIDwgKCRsaW5lQy0kbGluZUEpfSB7DQkkdyBtYXJrIHNldCBhbmNob3Igc2VsLmxhc3QNICAgIH0gZWxzZSB7DQkkdyBtYXJrIHNldCBhbmNob3Igc2VsLmZpcnN0DSAgICB9DX0NDSMgdGtUZXh0SW5zZXJ0IC0tDSMgSW5zZXJ0IGEgc3RyaW5nIGludG8gYSB0ZXh0IGF0IHRoZSBwb2ludCBvZiB0aGUgaW5zZXJ0aW9uIGN1cnNvci4NIyBJZiB0aGVyZSBpcyBhIHNlbGVjdGlvbiBpbiB0aGUgdGV4dCwgYW5kIGl0IGNvdmVycyB0aGUgcG9pbnQgb2YgdGhlDSMgaW5zZXJ0aW9uIGN1cnNvciwgdGhlbiBkZWxldGUgdGhlIHNlbGVjdGlvbiBiZWZvcmUgaW5zZXJ0aW5nLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIHRleHQgd2luZG93IGluIHdoaWNoIHRvIGluc2VydCB0aGUgc3RyaW5nDSMgcyAtCQlUaGUgc3RyaW5nIHRvIGluc2VydCAodXN1YWxseSBqdXN0IGEgc2luZ2xlIGNoYXJhY3RlcikNDXByb2MgdGtUZXh0SW5zZXJ0IHt3IHN9IHsNICAgIGlmIHtbc3RyaW5nIGVxdWFsICRzICIiXSB8fCBbc3RyaW5nIGVxdWFsIFskdyBjZ2V0IC1zdGF0ZV0gImRpc2FibGVkIl19IHsNCXJldHVybg0gICAgfQ0gICAgY2F0Y2ggew0JaWYge1skdyBjb21wYXJlIHNlbC5maXJzdCA8PSBpbnNlcnRdIFwNCQkmJiBbJHcgY29tcGFyZSBzZWwubGFzdCA+PSBpbnNlcnRdfSB7DQkgICAgJHcgZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdA0JfQ0gICAgfQ0gICAgJHcgaW5zZXJ0IGluc2VydCAkcw0gICAgJHcgc2VlIGluc2VydA19DQ0jIHRrVGV4dFVwRG93bkxpbmUgLS0NIyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIG9uZSBsaW5lIGFib3ZlIG9yIGJlbG93IHRoZQ0jIGluc2VydGlvbiBjdXJzb3IuICBUaGVyZSBhcmUgdHdvIHRyaWNreSB0aGluZ3MgaGVyZS4gIEZpcnN0LA0jIHdlIHdhbnQgdG8gbWFpbnRhaW4gdGhlIG9yaWdpbmFsIGNvbHVtbiBhY3Jvc3MgcmVwZWF0ZWQgb3BlcmF0aW9ucywNIyBldmVuIHRob3VnaCBzb21lIGxpbmVzIHRoYXQgd2lsbCBnZXQgcGFzc2VkIHRocm91Z2ggZG9uJ3QgaGF2ZQ0jIGVub3VnaCBjaGFyYWN0ZXJzIHRvIGNvdmVyIHRoZSBvcmlnaW5hbCBjb2x1bW4uICBTZWNvbmQsIGRvbid0DSMgdHJ5IHRvIHNjcm9sbCBwYXN0IHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIHRoZSB0ZXh0Lg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIHRleHQgd2luZG93IGluIHdoaWNoIHRoZSBjdXJzb3IgaXMgdG8gbW92ZS4NIyBuIC0JCVRoZSBudW1iZXIgb2YgbGluZXMgdG8gbW92ZTogLTEgZm9yIHVwIG9uZSBsaW5lLA0jCQkrMSBmb3IgZG93biBvbmUgbGluZS4NDXByb2MgdGtUZXh0VXBEb3duTGluZSB7dyBufSB7DSAgICBnbG9iYWwgdGtQcml2DQ0gICAgc2V0IGkgWyR3IGluZGV4IGluc2VydF0NICAgIHNjYW4gJGkgIiVkLiVkIiBsaW5lIGNoYXINICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJHRrUHJpdihwcmV2UG9zKSAkaV19IHsNCXNldCB0a1ByaXYoY2hhcikgJGNoYXINICAgIH0NICAgIHNldCBuZXcgWyR3IGluZGV4IFtleHByIHskbGluZSArICRufV0uJHRrUHJpdihjaGFyKV0NICAgIGlmIHtbJHcgY29tcGFyZSAkbmV3ID09IGVuZF0gfHwgWyR3IGNvbXBhcmUgJG5ldyA9PSAiaW5zZXJ0IGxpbmVzdGFydCJdfSB7DQlzZXQgbmV3ICRpDSAgICB9DSAgICBzZXQgdGtQcml2KHByZXZQb3MpICRuZXcNICAgIHJldHVybiAkbmV3DX0NDSMgdGtUZXh0UHJldlBhcmEgLS0NIyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXJhZ3JhcGgganVzdCBiZWZvcmUgYSBnaXZlbg0jIHBvc2l0aW9uIGluIHRoZSB0ZXh0ICh0aGUgYmVnaW5uaW5nIG9mIGEgcGFyYWdyYXBoIGlzIHRoZSBmaXJzdCBub24tYmxhbmsNIyBjaGFyYWN0ZXIgYWZ0ZXIgYSBibGFuayBsaW5lKS4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSB0ZXh0IHdpbmRvdyBpbiB3aGljaCB0aGUgY3Vyc29yIGlzIHRvIG1vdmUuDSMgcG9zIC0JCVBvc2l0aW9uIGF0IHdoaWNoIHRvIHN0YXJ0IHNlYXJjaC4NDXByb2MgdGtUZXh0UHJldlBhcmEge3cgcG9zfSB7DSAgICBzZXQgcG9zIFskdyBpbmRleCAiJHBvcyBsaW5lc3RhcnQiXQ0gICAgd2hpbGUgezF9IHsNCWlmIHsoW3N0cmluZyBlcXVhbCBbJHcgZ2V0ICIkcG9zIC0gMSBsaW5lIl0gIlxuIl0gXA0JCSYmIFtzdHJpbmcgY29tcGFyZSBbJHcgZ2V0ICRwb3NdICJcbiJdKSBcDQkJfHwgW3N0cmluZyBlcXVhbCAkcG9zICIxLjAiXX0gew0JICAgIGlmIHtbcmVnZXhwIC1pbmRpY2VzIHteWyAJXSsoLil9IFskdyBnZXQgJHBvcyAiJHBvcyBsaW5lZW5kIl0gXA0JCSAgICBkdW1teSBpbmRleF19IHsNCQlzZXQgcG9zIFskdyBpbmRleCAiJHBvcyArIFtsaW5kZXggJGluZGV4IDBdIGNoYXJzIl0NCSAgICB9DQkgICAgaWYge1skdyBjb21wYXJlICRwb3MgIT0gaW5zZXJ0XSB8fCBbc3RyaW5nIGVxdWFsICRwb3MgMS4wXX0gew0JCXJldHVybiAkcG9zDQkgICAgfQ0JfQ0Jc2V0IHBvcyBbJHcgaW5kZXggIiRwb3MgLSAxIGxpbmUiXQ0gICAgfQ19DQ0jIHRrVGV4dE5leHRQYXJhIC0tDSMgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFyYWdyYXBoIGp1c3QgYWZ0ZXIgYSBnaXZlbg0jIHBvc2l0aW9uIGluIHRoZSB0ZXh0ICh0aGUgYmVnaW5uaW5nIG9mIGEgcGFyYWdyYXBoIGlzIHRoZSBmaXJzdCBub24tYmxhbmsNIyBjaGFyYWN0ZXIgYWZ0ZXIgYSBibGFuayBsaW5lKS4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSB0ZXh0IHdpbmRvdyBpbiB3aGljaCB0aGUgY3Vyc29yIGlzIHRvIG1vdmUuDSMgc3RhcnQgLQlQb3NpdGlvbiBhdCB3aGljaCB0byBzdGFydCBzZWFyY2guDQ1wcm9jIHRrVGV4dE5leHRQYXJhIHt3IHN0YXJ0fSB7DSAgICBzZXQgcG9zIFskdyBpbmRleCAiJHN0YXJ0IGxpbmVzdGFydCArIDEgbGluZSJdDSAgICB3aGlsZSB7W3N0cmluZyBjb21wYXJlIFskdyBnZXQgJHBvc10gIlxuIl19IHsNCWlmIHtbJHcgY29tcGFyZSAkcG9zID09IGVuZF19IHsNCSAgICByZXR1cm4gWyR3IGluZGV4ICJlbmQgLSAxYyJdDQl9DQlzZXQgcG9zIFskdyBpbmRleCAiJHBvcyArIDEgbGluZSJdDSAgICB9DSAgICB3aGlsZSB7W3N0cmluZyBlcXVhbCBbJHcgZ2V0ICRwb3NdICJcbiJdfSB7DQlzZXQgcG9zIFskdyBpbmRleCAiJHBvcyArIDEgbGluZSJdDQlpZiB7WyR3IGNvbXBhcmUgJHBvcyA9PSBlbmRdfSB7DQkgICAgcmV0dXJuIFskdyBpbmRleCAiZW5kIC0gMWMiXQ0JfQ0gICAgfQ0gICAgaWYge1tyZWdleHAgLWluZGljZXMge15bIAldKyguKX0gWyR3IGdldCAkcG9zICIkcG9zIGxpbmVlbmQiXSBcDQkgICAgZHVtbXkgaW5kZXhdfSB7DQlyZXR1cm4gWyR3IGluZGV4ICIkcG9zICsgW2xpbmRleCAkaW5kZXggMF0gY2hhcnMiXQ0gICAgfQ0gICAgcmV0dXJuICRwb3MNfQ0NIyB0a1RleHRTY3JvbGxQYWdlcyAtLQ0jIFRoaXMgaXMgYSB1dGlsaXR5IHByb2NlZHVyZSB1c2VkIGluIGJpbmRpbmdzIGZvciBtb3ZpbmcgdXAgYW5kIGRvd24NIyBwYWdlcyBhbmQgcG9zc2libHkgZXh0ZW5kaW5nIHRoZSBzZWxlY3Rpb24gYWxvbmcgdGhlIHdheS4gIEl0IHNjcm9sbHMNIyB0aGUgdmlldyBpbiB0aGUgd2lkZ2V0IGJ5IHRoZSBudW1iZXIgb2YgcGFnZXMsIGFuZCBpdCByZXR1cm5zIHRoZQ0jIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgdGhhdCBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpbiB0aGUgbmV3IHZpZXcNIyBhcyB0aGUgaW5zZXJ0aW9uIGN1cnNvciB1c2VkIHRvIGJlIGluIHRoZSBvbGQgdmlldy4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSB0ZXh0IHdpbmRvdyBpbiB3aGljaCB0aGUgY3Vyc29yIGlzIHRvIG1vdmUuDSMgY291bnQgLQlOdW1iZXIgb2YgcGFnZXMgZm9yd2FyZCB0byBzY3JvbGw7ICBtYXkgYmUgbmVnYXRpdmUNIwkJdG8gc2Nyb2xsIGJhY2t3YXJkcy4NDXByb2MgdGtUZXh0U2Nyb2xsUGFnZXMge3cgY291bnR9IHsNICAgIHNldCBiYm94IFskdyBiYm94IGluc2VydF0NICAgICR3IHl2aWV3IHNjcm9sbCAkY291bnQgcGFnZXMNICAgIGlmIHtbc3RyaW5nIGVxdWFsICRiYm94ICIiXX0gew0JcmV0dXJuIFskdyBpbmRleCBAW2V4cHIge1t3aW5mbyBoZWlnaHQgJHddLzJ9XSwwXQ0gICAgfQ0gICAgcmV0dXJuIFskdyBpbmRleCBAW2xpbmRleCAkYmJveCAwXSxbbGluZGV4ICRiYm94IDFdXQ19DQ0jIHRrVGV4dFRyYW5zcG9zZSAtLQ0jIFRoaXMgcHJvY2VkdXJlIGltcGxlbWVudHMgdGhlICJ0cmFuc3Bvc2UiIGZ1bmN0aW9uIGZvciB0ZXh0IHdpZGdldHMuDSMgSXQgdHJhbnBvc2VzIHRoZSBjaGFyYWN0ZXJzIG9uIGVpdGhlciBzaWRlIG9mIHRoZSBpbnNlcnRpb24gY3Vyc29yLA0jIHVubGVzcyB0aGUgY3Vyc29yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuICBJbiB0aGlzIGNhc2UgaXQNIyB0cmFuc3Bvc2VzIHRoZSB0d28gY2hhcmFjdGVycyB0byB0aGUgbGVmdCBvZiB0aGUgY3Vyc29yLiAgSW4gZWl0aGVyDSMgY2FzZSwgdGhlIGN1cnNvciBlbmRzIHVwIHRvIHRoZSByaWdodCBvZiB0aGUgdHJhbnNwb3NlZCBjaGFyYWN0ZXJzLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGV4dCB3aW5kb3cgaW4gd2hpY2ggdG8gdHJhbnNwb3NlLg0NcHJvYyB0a1RleHRUcmFuc3Bvc2UgdyB7DSAgICBzZXQgcG9zIGluc2VydA0gICAgaWYge1skdyBjb21wYXJlICRwb3MgIT0gIiRwb3MgbGluZWVuZCJdfSB7DQlzZXQgcG9zIFskdyBpbmRleCAiJHBvcyArIDEgY2hhciJdDSAgICB9DSAgICBzZXQgbmV3IFskdyBnZXQgIiRwb3MgLSAxIGNoYXIiXVskdyBnZXQgICIkcG9zIC0gMiBjaGFyIl0NICAgIGlmIHtbJHcgY29tcGFyZSAiJHBvcyAtIDEgY2hhciIgPT0gMS4wXX0gew0JcmV0dXJuDSAgICB9DSAgICAkdyBkZWxldGUgIiRwb3MgLSAyIGNoYXIiICRwb3MNICAgICR3IGluc2VydCBpbnNlcnQgJG5ldw0gICAgJHcgc2VlIGluc2VydA19DQ0jIHRrX3RleHRDb3B5IC0tDSMgVGhpcyBwcm9jZWR1cmUgY29waWVzIHRoZSBzZWxlY3Rpb24gZnJvbSBhIHRleHQgd2lkZ2V0IGludG8gdGhlDSMgY2xpcGJvYXJkLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJTmFtZSBvZiBhIHRleHQgd2lkZ2V0Lg0NcHJvYyB0a190ZXh0Q29weSB3IHsNICAgIGlmIHshW2NhdGNoIHtzZXQgZGF0YSBbJHcgZ2V0IHNlbC5maXJzdCBzZWwubGFzdF19XX0gew0JY2xpcGJvYXJkIGNsZWFyIC1kaXNwbGF5b2YgJHcNCWNsaXBib2FyZCBhcHBlbmQgLWRpc3BsYXlvZiAkdyAkZGF0YQ0gICAgfQ19DQ0jIHRrX3RleHRDdXQgLS0NIyBUaGlzIHByb2NlZHVyZSBjb3BpZXMgdGhlIHNlbGVjdGlvbiBmcm9tIGEgdGV4dCB3aWRnZXQgaW50byB0aGUNIyBjbGlwYm9hcmQsIHRoZW4gZGVsZXRlcyB0aGUgc2VsZWN0aW9uIChpZiBpdCBleGlzdHMgaW4gdGhlIGdpdmVuDSMgd2lkZ2V0KS4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCU5hbWUgb2YgYSB0ZXh0IHdpZGdldC4NDXByb2MgdGtfdGV4dEN1dCB3IHsNICAgIGlmIHshW2NhdGNoIHtzZXQgZGF0YSBbJHcgZ2V0IHNlbC5maXJzdCBzZWwubGFzdF19XX0gew0JY2xpcGJvYXJkIGNsZWFyIC1kaXNwbGF5b2YgJHcNCWNsaXBib2FyZCBhcHBlbmQgLWRpc3BsYXlvZiAkdyAkZGF0YQ0JJHcgZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdA0gICAgfQ19DQ0jIHRrX3RleHRQYXN0ZSAtLQ0jIFRoaXMgcHJvY2VkdXJlIHBhc3RlcyB0aGUgY29udGVudHMgb2YgdGhlIGNsaXBib2FyZCB0byB0aGUgaW5zZXJ0aW9uDSMgcG9pbnQgaW4gYSB0ZXh0IHdpZGdldC4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCU5hbWUgb2YgYSB0ZXh0IHdpZGdldC4NDXByb2MgdGtfdGV4dFBhc3RlIHcgew0gICAgZ2xvYmFsIHRjbF9wbGF0Zm9ybQ0gICAgY2F0Y2ggew0JaWYge1tzdHJpbmcgY29tcGFyZSAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAidW5peCJdfSB7DQkgICAgY2F0Y2ggew0JCSR3IGRlbGV0ZSBzZWwuZmlyc3Qgc2VsLmxhc3QNCSAgICB9DQl9DQkkdyBpbnNlcnQgaW5zZXJ0IFtzZWxlY3Rpb24gZ2V0IC1kaXNwbGF5b2YgJHcgLXNlbGVjdGlvbiBDTElQQk9BUkRdDSAgICB9DX0NDSMgdGtUZXh0TmV4dFdvcmQgLS0NIyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV4dCB3b3JkIHBvc2l0aW9uIGFmdGVyIGEgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlDSMgdGV4dC4gIFRoZSBuZXh0IHdvcmQgaXMgcGxhdGZvcm0gZGVwZW5kZW50IGFuZCBtYXkgYmUgZWl0aGVyIHRoZSBuZXh0DSMgZW5kLW9mLXdvcmQgcG9zaXRpb24gb3IgdGhlIG5leHQgc3RhcnQtb2Ytd29yZCBwb3NpdGlvbiBhZnRlciB0aGUgbmV4dA0jIGVuZC1vZi13b3JkIHBvc2l0aW9uLg0jDSMgQXJndW1lbnRzOg0jIHcgLQkJVGhlIHRleHQgd2luZG93IGluIHdoaWNoIHRoZSBjdXJzb3IgaXMgdG8gbW92ZS4NIyBzdGFydCAtCVBvc2l0aW9uIGF0IHdoaWNoIHRvIHN0YXJ0IHNlYXJjaC4NDWlmIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJ3aW5kb3dzIl19ICB7DSAgICBwcm9jIHRrVGV4dE5leHRXb3JkIHt3IHN0YXJ0fSB7DQl0a1RleHROZXh0UG9zICR3IFt0a1RleHROZXh0UG9zICR3ICRzdGFydCB0Y2xfZW5kT2ZXb3JkXSBcDQkgICAgdGNsX3N0YXJ0T2ZOZXh0V29yZA0gICAgfQ19IGVsc2Ugew0gICAgcHJvYyB0a1RleHROZXh0V29yZCB7dyBzdGFydH0gew0JdGtUZXh0TmV4dFBvcyAkdyAkc3RhcnQgdGNsX2VuZE9mV29yZA0gICAgfQ19DQ0jIHRrVGV4dE5leHRQb3MgLS0NIyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBwb3NpdGlvbiBhZnRlciB0aGUgZ2l2ZW4gc3RhcnRpbmcNIyBwb3NpdGlvbiBpbiB0aGUgdGV4dCBhcyBjb21wdXRlZCBieSBhIHNwZWNpZmllZCBmdW5jdGlvbi4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSB0ZXh0IHdpbmRvdyBpbiB3aGljaCB0aGUgY3Vyc29yIGlzIHRvIG1vdmUuDSMgc3RhcnQgLQlQb3NpdGlvbiBhdCB3aGljaCB0byBzdGFydCBzZWFyY2guDSMgb3AgLQkJRnVuY3Rpb24gdG8gdXNlIHRvIGZpbmQgbmV4dCBwb3NpdGlvbi4NDXByb2MgdGtUZXh0TmV4dFBvcyB7dyBzdGFydCBvcH0gew0gICAgc2V0IHRleHQgIiINICAgIHNldCBjdXIgJHN0YXJ0DSAgICB3aGlsZSB7WyR3IGNvbXBhcmUgJGN1ciA8IGVuZF19IHsNCXNldCB0ZXh0ICR0ZXh0WyR3IGdldCAkY3VyICIkY3VyIGxpbmVlbmQgKyAxYyJdDQlzZXQgcG9zIFskb3AgJHRleHQgMF0NCWlmIHskcG9zID49IDB9IHsNCSAgICAjIyBBZGp1c3QgZm9yIGVtYmVkZGVkIHdpbmRvd3MgYW5kIGltYWdlcw0JICAgICMjIGR1bXAgZ2l2ZXMgdXMgMyBpdGVtcyBwZXIgd2luZG93L2ltYWdlDQkgICAgc2V0IGR1bXAgWyR3IGR1bXAgLWltYWdlIC13aW5kb3cgJHN0YXJ0ICIkc3RhcnQgKyAkcG9zIGMiXQ0JICAgIGlmIHtbbGxlbmd0aCAkZHVtcF19IHsNCQlzZXQgcG9zIFtleHByIHskcG9zICsgKFtsbGVuZ3RoICRkdW1wXS8zKX1dDQkgICAgfQ0JICAgIHJldHVybiBbJHcgaW5kZXggIiRzdGFydCArICRwb3MgYyJdDQl9DQlzZXQgY3VyIFskdyBpbmRleCAiJGN1ciBsaW5lZW5kICsxYyJdDSAgICB9DSAgICByZXR1cm4gZW5kDX0NDSMgdGtUZXh0UHJldlBvcyAtLQ0jIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBwcmV2aW91cyBwb3NpdGlvbiBiZWZvcmUgdGhlIGdpdmVuIHN0YXJ0aW5nDSMgcG9zaXRpb24gaW4gdGhlIHRleHQgYXMgY29tcHV0ZWQgYnkgYSBzcGVjaWZpZWQgZnVuY3Rpb24uDSMNIyBBcmd1bWVudHM6DSMgdyAtCQlUaGUgdGV4dCB3aW5kb3cgaW4gd2hpY2ggdGhlIGN1cnNvciBpcyB0byBtb3ZlLg0jIHN0YXJ0IC0JUG9zaXRpb24gYXQgd2hpY2ggdG8gc3RhcnQgc2VhcmNoLg0jIG9wIC0JCUZ1bmN0aW9uIHRvIHVzZSB0byBmaW5kIG5leHQgcG9zaXRpb24uDQ1wcm9jIHRrVGV4dFByZXZQb3Mge3cgc3RhcnQgb3B9IHsNICAgIHNldCB0ZXh0ICIiDSAgICBzZXQgY3VyICRzdGFydA0gICAgd2hpbGUge1skdyBjb21wYXJlICRjdXIgPiAwLjBdfSB7DQlzZXQgdGV4dCBbJHcgZ2V0ICIkY3VyIGxpbmVzdGFydCAtIDFjIiAkY3VyXSR0ZXh0DQlzZXQgcG9zIFskb3AgJHRleHQgZW5kXQ0JaWYgeyRwb3MgPj0gMH0gew0JICAgICMjIEFkanVzdCBmb3IgZW1iZWRkZWQgd2luZG93cyBhbmQgaW1hZ2VzDQkgICAgIyMgZHVtcCBnaXZlcyB1cyAzIGl0ZW1zIHBlciB3aW5kb3cvaW1hZ2UNCSAgICBzZXQgZHVtcCBbJHcgZHVtcCAtaW1hZ2UgLXdpbmRvdyAiJGN1ciBsaW5lc3RhcnQiICIkc3RhcnQgLSAxYyJdDQkgICAgaWYge1tsbGVuZ3RoICRkdW1wXX0gew0JCSMjIFRoaXMgaXMgYSBob2tleSBleHRyYSBoYWNrIGZvciBjb250cm9sLWFycm93IG1vdmVtZW50DQkJIyMgdGhhdCBzaG91bGQgYmUgaW4gYSB3aGlsZSBsb29wIHRvIGJlIGNvcnJlY3QgKGhvYmJzKQ0JCWlmIHtbJHcgY29tcGFyZSBbbGluZGV4ICRkdW1wIDJdID4gXA0JCQkiJGN1ciBsaW5lc3RhcnQgLSAxYyArICRwb3MgYyJdfSB7DQkJICAgIGluY3IgcG9zIC0xDQkJfQ0JCXNldCBwb3MgW2V4cHIgeyRwb3MgKyAoW2xsZW5ndGggJGR1bXBdLzMpfV0NCSAgICB9DQkgICAgcmV0dXJuIFskdyBpbmRleCAiJGN1ciBsaW5lc3RhcnQgLSAxYyArICRwb3MgYyJdDQl9DQlzZXQgY3VyIFskdyBpbmRleCAiJGN1ciBsaW5lc3RhcnQgLSAxYyJdDSAgICB9DSAgICByZXR1cm4gMC4wDX0NAAAhliMgYmdlcnJvci50Y2wgLS0NIw0jCUltcGxlbWVudGF0aW9uIG9mIHRoZSBiZ2Vycm9yIHByb2NlZHVyZS4gIEl0IHBvc3RzIGEgZGlhbG9nIGJveCB3aXRoDSMJdGhlIGVycm9yIG1lc3NhZ2UgYW5kIGdpdmVzIHRoZSB1c2VyIGEgY2hhbmNlIHRvIHNlZSBhIG1vcmUgZGV0YWlsZWQNIwlzdGFjayB0cmFjZSwgYW5kIHBvc3NpYmxlIGRvIHNvbWV0aGluZyBtb3JlIGludGVyZXN0aW5nIHdpdGggdGhhdA0jCXRyYWNlIChsaWtlIHNhdmUgaXQgdG8gYSBsb2cpLiAgVGhpcyBpcyBhZGFwdGVkIGZyb20gd29yayBkb25lIGJ5DSMJRG9uYWwgSy4gRmVsbG93cy4NIw0jIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIGJ5IEFqdWJhIFNvbHV0aW9ucy4NIyBBbGwgcmlnaHRzIHJlc2VydmVkLg0jIA0jIFJDUzogQCgjKSAkSWQ6IGJnZXJyb3IudGNsLHYgMS44LjIuMiAyMDAxLzEwLzE3IDE5OjI5OjUxIGRhcyBFeHAgJA0NcGFja2FnZSByZXF1aXJlIG1zZ2NhdA0Nb3B0aW9uIGFkZCAqRXJyb3JEaWFsb2cuZnVuY3Rpb24udGV4dCBbOjptc2djYXQ6Om1jICJTYXZlIFRvIExvZyJdIFwNCXdpZGdldERlZmF1bHQNb3B0aW9uIGFkZCAqRXJyb3JEaWFsb2cuZnVuY3Rpb24uY29tbWFuZCAiOjp0azo6ZGlhbG9nOjplcnJvcjo6c2F2ZVRvTG9nIg0NIyBjcmVhdGUgbmFtZXNwYWNlIGhpZXJhcmNoeQ1uYW1lc3BhY2UgZXZhbCA6OnRrOjpkaWFsb2c6OmVycm9yIHt9DQ1wcm9jIDo6dGs6OmRpYWxvZzo6ZXJyb3I6OlJldHVybiB7fSB7DSAgICB2YXJpYWJsZSBidXR0b24NICAgIA0gICAgLmJnZXJyb3JEaWFsb2cub2sgY29uZmlndXJlIC1zdGF0ZSBhY3RpdmUgLXJlbGllZiBzdW5rZW4NICAgIHVwZGF0ZSBpZGxldGFza3MNICAgIGFmdGVyIDEwMA0gICAgc2V0IGJ1dHRvbiAwDX0NDXByb2MgOjp0azo6ZGlhbG9nOjplcnJvcjo6ZGV0YWlscyB7fSB7DSAgICBzZXQgdyAuYmdlcnJvckRpYWxvZw0gICAgc2V0IGNhcHRpb24gW29wdGlvbiBnZXQgJHcuZnVuY3Rpb24gdGV4dCB7fV0NICAgIHNldCBjb21tYW5kIFtvcHRpb24gZ2V0ICR3LmZ1bmN0aW9uIGNvbW1hbmQge31dDSAgICBpZiB7IFtzdHJpbmcgZXF1YWwgJGNhcHRpb24gIiJdIHx8IFtzdHJpbmcgZXF1YWwgJGNvbW1hbmQgIiJdIH0gew0JZ3JpZCBmb3JnZXQgJHcuZnVuY3Rpb24NICAgIH0NICAgICR3LmZ1bmN0aW9uIGNvbmZpZ3VyZSAtdGV4dCAkY2FwdGlvbiBcDQkgICAgLWNvbW1hbmQgW2xpc3QgOjp0azo6ZGlhbG9nOjplcnJvcjo6ZXZhbEZ1bmN0aW9uICRjb21tYW5kXQ0gICAgZ3JpZCAkdy50b3AuaW5mbyAtIC1zdGlja3kgbnNldyAtcGFkeCAzbSAtcGFkeSAzbQ19DQ1wcm9jIDo6dGs6OmRpYWxvZzo6ZXJyb3I6OmV2YWxGdW5jdGlvbiB7Y21kfSB7DSAgICB1cGxldmVsIFwjMCBbbGlzdCAkY21kIFsuYmdlcnJvckRpYWxvZy50b3AuaW5mby50ZXh0IGdldCAxLjAgZW5kXV0NfQ0NcHJvYyA6OnRrOjpkaWFsb2c6OmVycm9yOjpzYXZlVG9Mb2cge3RleHR9IHsNICAgIGlmIHsgW3N0cmluZyBlcXVhbCAkOjp0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJ3aW5kb3dzIl0gfSB7DQlzZXQgYWxsRmlsZXMgIiouKiINICAgIH0gZWxzZSB7DQlzZXQgYWxsRmlsZXMgIioiDSAgICB9DSAgICBzZXQgdHlwZXMgW2xpc3QJXA0JICAgIFtsaXN0IFs6Om1zZ2NhdDo6bWMgIkxvZyBGaWxlcyJdCS5sb2ddCQlcDQkgICAgW2xpc3QgWzo6bXNnY2F0OjptYyAiVGV4dCBGaWxlcyJdCS50eHRdCQlcDQkgICAgW2xpc3QgWzo6bXNnY2F0OjptYyAiQWxsIEZpbGVzIl0JJGFsbEZpbGVzXQlcDQkgICAgXQ0gICAgc2V0IGZpbGVuYW1lIFt0a19nZXRTYXZlRmlsZSAtdGl0bGUgWzo6bXNnY2F0OjptYyAiU2VsZWN0IExvZyBGaWxlIl0gXA0JICAgIC1maWxldHlwZXMgJHR5cGVzIC1kZWZhdWx0ZXh0ZW5zaW9uIC5sb2cgLXBhcmVudCAuYmdlcnJvckRpYWxvZ10NICAgIGlmIHshW3N0cmluZyBsZW5ndGggJGZpbGVuYW1lXX0gew0JcmV0dXJuDSAgICB9DSAgICBzZXQgZiBbb3BlbiAkZmlsZW5hbWUgd10NICAgIHB1dHMgLW5vbmV3bGluZSAkZiAkdGV4dA0gICAgY2xvc2UgJGYNfQ0NcHJvYyA6OnRrOjpkaWFsb2c6OmVycm9yOjpEZXN0cm95IHt3fSB7DSAgICBpZiB7Ii5iZ2Vycm9yRGlhbG9nIiA9PSAiJHcifSB7DQl2YXJpYWJsZSBidXR0b24NCXNldCBidXR0b24gLTENICAgIH0NfQ0NIyA6OmJnZXJyb3IgLS0NIyBUaGlzIGlzIHRoZSBkZWZhdWx0IHZlcnNpb24gb2YgYmdlcnJvci4gDSMgSXQgdHJpZXMgdG8gZXhlY3V0ZSB0a2Vycm9yLCBpZiB0aGF0IGZhaWxzIGl0IHBvc3RzIGEgZGlhbG9nIGJveCBjb250YWluaW5nDSMgdGhlIGVycm9yIG1lc3NhZ2UgYW5kIGdpdmVzIHRoZSB1c2VyIGEgY2hhbmNlIHRvIGFzayB0byBzZWUgYSBzdGFjaw0jIHRyYWNlLg0jIEFyZ3VtZW50czoNIyBlcnIgLQkJCVRoZSBlcnJvciBtZXNzYWdlLg0NcHJvYyA6OmJnZXJyb3IgZXJyIHsNICAgIGdsb2JhbCBlcnJvckluZm8gdGNsX3BsYXRmb3JtDSAgICBzZXQgYnV0dmFyIDo6dGs6OmRpYWxvZzo6ZXJyb3I6OmJ1dHRvbg0NICAgIHNldCBpbmZvICRlcnJvckluZm8NDSAgICBzZXQgcmV0IFtjYXRjaCB7dGtlcnJvciAkZXJyfSBtc2ddOw0gICAgaWYgeyRyZXQgIT0gMX0ge3JldHVybiAtY29kZSAkcmV0ICRtc2d9DQ0gICAgIyBPayB0aGUgYXBwbGljYXRpb24ncyB0a2Vycm9yIGVpdGhlciBmYWlsZWQgb3Igd2FzIG5vdCBmb3VuZA0gICAgIyB3ZSB1c2UgdGhlIGRlZmF1bHQgZGlhbG9nIHRoZW4gOg0gICAgaWYgeyR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pID09ICJtYWNpbnRvc2gifSB7DQlzZXQgb2sJCVs6Om1zZ2NhdDo6bWMgIk9rIl0NCXNldCBtZXNzYWdlRm9udAlzeXN0ZW0NCXNldCB0ZXh0UmVsaWVmCSJmbGF0Ig0Jc2V0IHRleHRIaWxpZ2h0CTANICAgIH0gZWxzZSB7DQlzZXQgb2sJCVs6Om1zZ2NhdDo6bWMgIk9LIl0NCXNldCBtZXNzYWdlRm9udAl7VGltZXMgLTE4fQ0Jc2V0IHRleHRSZWxpZWYJInN1bmtlbiINCXNldCB0ZXh0SGlsaWdodAkxDSAgICB9DQ0NICAgICMgVHJ1bmNhdGUgdGhlIG1lc3NhZ2UgaWYgaXQgaXMgdG9vIHdpZGUgKGxvbmdlciB0aGFuIDMwIGNoYXJhY2FjdGVycykgb3INICAgICMgdG9vIHRhbGwgKG1vcmUgdGhhbiA0IG5ld2xpbmVzKS4gIFRydW5jYXRpb24gb2NjdXJzIGF0IHRoZSBmaXJzdCBwb2ludCBhdA0gICAgIyB3aGljaCBvbmUgb2YgdGhvc2UgY29uZGl0aW9ucyBpcyBtZXQuDSAgICBzZXQgZGlzcGxheWVkRXJyICIiDSAgICBzZXQgbGluZXMgMA0gICAgZm9yZWFjaCBsaW5lIFtzcGxpdCAkZXJyICJcbiJdIHsNCWlmIHsgW3N0cmluZyBsZW5ndGggJGxpbmVdID4gMzAgfSB7DQkgICAgYXBwZW5kIGRpc3BsYXllZEVyciAiW3N0cmluZyByYW5nZSAkbGluZSAwIDI5XS4uLiINCSAgICBicmVhaw0JfQ0JaWYgeyAkbGluZXMgPiA0IH0gew0JICAgIGFwcGVuZCBkaXNwbGF5ZWRFcnIgIi4uLiINCSAgICBicmVhaw0JfSBlbHNlIHsNCSAgICBhcHBlbmQgZGlzcGxheWVkRXJyICIke2xpbmV9XG4iDQl9DQlpbmNyIGxpbmVzDSAgICB9DQ0gICAgc2V0IHcgLmJnZXJyb3JEaWFsb2cNICAgIHNldCB0aXRsZSBbOjptc2djYXQ6Om1jICJBcHBsaWNhdGlvbiBFcnJvciJdDSAgICBzZXQgdGV4dCBbOjptc2djYXQ6Om1jICJFcnJvcjogJTFcJHMiICRlcnJdDSAgICBzZXQgYnV0dG9ucyBbbGlzdCBvayAkb2sgZGlzbWlzcyBbOjptc2djYXQ6Om1jICJTa2lwIE1lc3NhZ2VzIl0gXA0JICAgIGZ1bmN0aW9uIFs6Om1zZ2NhdDo6bWMgIkRldGFpbHMgPj4iXV0NDSAgICAjIDEuIENyZWF0ZSB0aGUgdG9wLWxldmVsIHdpbmRvdyBhbmQgZGl2aWRlIGl0IGludG8gdG9wDSAgICAjIGFuZCBib3R0b20gcGFydHMuDQ0gICAgY2F0Y2gge2Rlc3Ryb3kgLmJnZXJyb3JEaWFsb2d9DSAgICB0b3BsZXZlbCAuYmdlcnJvckRpYWxvZyAtY2xhc3MgRXJyb3JEaWFsb2cNICAgIHdtIHRpdGxlIC5iZ2Vycm9yRGlhbG9nICR0aXRsZQ0gICAgd20gaWNvbm5hbWUgLmJnZXJyb3JEaWFsb2cgRXJyb3JEaWFsb2cNICAgIHdtIHByb3RvY29sIC5iZ2Vycm9yRGlhbG9nIFdNX0RFTEVURV9XSU5ET1cgeyB9DQ0gICAgIyBUaGUgZm9sbG93aW5nLCB0aG91Z2ggc3VycHJpc2luZywgd29ya3MuDSAgICB3bSB0cmFuc2llbnQgLmJnZXJyb3JEaWFsb2cgLmJnZXJyb3JEaWFsb2cNDSAgICBpZiB7JHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgPT0gIm1hY2ludG9zaCJ9IHsNCXVuc3VwcG9ydGVkMSBzdHlsZSAuYmdlcnJvckRpYWxvZyBkQm94UHJvYw0gICAgfQ0NICAgIGZyYW1lIC5iZ2Vycm9yRGlhbG9nLmJvdA0gICAgZnJhbWUgLmJnZXJyb3JEaWFsb2cudG9wDSAgICBpZiB7JHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgPT0gInVuaXgifSB7DQkuYmdlcnJvckRpYWxvZy5ib3QgY29uZmlndXJlIC1yZWxpZWYgcmFpc2VkIC1iZCAxDQkuYmdlcnJvckRpYWxvZy50b3AgY29uZmlndXJlIC1yZWxpZWYgcmFpc2VkIC1iZCAxDSAgICB9DSAgICBwYWNrIC5iZ2Vycm9yRGlhbG9nLmJvdCAtc2lkZSBib3R0b20gLWZpbGwgYm90aA0gICAgcGFjayAuYmdlcnJvckRpYWxvZy50b3AgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxDQ0gICAgc2V0IFcgW2ZyYW1lICR3LnRvcC5pbmZvXQ0gICAgdGV4dCAkVy50ZXh0CQkJCVwNCSAgICAtYmQgMgkJCQlcDQkgICAgLXlzY3JvbGxjb21tYW5kICIkVy5zY3JvbGwgc2V0IglcDQkgICAgLXNldGdyaWQgdHJ1ZQkJCVwNCSAgICAtd2lkdGggNDAJCQkJXA0JICAgIC1oZWlnaHQgMTAJCQkJXA0JICAgIC1zdGF0ZSBub3JtYWwJCQlcDQkgICAgLXJlbGllZiAkdGV4dFJlbGllZgkJCVwNCSAgICAtaGlnaGxpZ2h0dGhpY2tuZXNzICR0ZXh0SGlsaWdodAlcDQkgICAgLXdyYXAgY2hhcg0NICAgIHNjcm9sbGJhciAkVy5zY3JvbGwgLXJlbGllZiBzdW5rZW4gLWNvbW1hbmQgIiRXLnRleHQgeXZpZXciDSAgICBwYWNrICRXLnNjcm9sbCAtc2lkZSByaWdodCAtZmlsbCB5DSAgICBwYWNrICRXLnRleHQgLXNpZGUgbGVmdCAtZXhwYW5kIHllcyAtZmlsbCBib3RoDSAgICAkVy50ZXh0IGluc2VydCAwLjAgIiRlcnJcbiRpbmZvIg0gICAgJFcudGV4dCBtYXJrIHNldCBpbnNlcnQgMC4wDSAgICBiaW5kICRXLnRleHQgPEJ1dHRvblByZXNzLTE+IHsgZm9jdXMgJVcgfQ0gICAgJFcudGV4dCBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkDQ0gICAgIyAyLiBGaWxsIHRoZSB0b3AgcGFydCB3aXRoIGJpdG1hcCBhbmQgbWVzc2FnZQ0NICAgIGxhYmVsIC5iZ2Vycm9yRGlhbG9nLm1zZyAtanVzdGlmeSBsZWZ0IC10ZXh0ICR0ZXh0IC1mb250ICRtZXNzYWdlRm9udA0gICAgaWYgeyBbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJtYWNpbnRvc2giXSB9IHsNCSMgT24gdGhlIE1hY2ludG9zaCwgdXNlIHRoZSBzdG9wIGJpdG1hcA0JbGFiZWwgLmJnZXJyb3JEaWFsb2cuYml0bWFwIC1iaXRtYXAgc3RvcA0gICAgfSBlbHNlIHsNCSMgT24gb3RoZXIgcGxhdGZvcm1zLCBtYWtlIHRoZSBlcnJvciBpY29uDQljYW52YXMgLmJnZXJyb3JEaWFsb2cuYml0bWFwIC13aWR0aCAzMiAtaGVpZ2h0IDMyIC1oaWdobGlnaHR0aGlja25lc3MgMA0JLmJnZXJyb3JEaWFsb2cuYml0bWFwIGNyZWF0ZSBvdmFsIDAgMCAzMSAzMSAtZmlsbCByZWQgLW91dGxpbmUgYmxhY2sNCS5iZ2Vycm9yRGlhbG9nLmJpdG1hcCBjcmVhdGUgbGluZSA5IDkgMjMgMjMgLWZpbGwgd2hpdGUgLXdpZHRoIDQNCS5iZ2Vycm9yRGlhbG9nLmJpdG1hcCBjcmVhdGUgbGluZSA5IDIzIDIzIDkgLWZpbGwgd2hpdGUgLXdpZHRoIDQNICAgIH0NICAgIGdyaWQgLmJnZXJyb3JEaWFsb2cuYml0bWFwIC5iZ2Vycm9yRGlhbG9nLm1zZyBcDQkgICAgLWluIC5iZ2Vycm9yRGlhbG9nLnRvcAlcDQkgICAgLXJvdyAwCQkJXA0JICAgIC1wYWR4IDNtCQkJXA0JICAgIC1wYWR5IDNtDSAgICBncmlkIGNvbmZpZ3VyZQkJLmJnZXJyb3JEaWFsb2cubXNnIC1zdGlja3kgbnN3DSAgICBncmlkIHJvd2NvbmZpZ3VyZQkJLmJnZXJyb3JEaWFsb2cudG9wIDEgLXdlaWdodCAxDSAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZQkuYmdlcnJvckRpYWxvZy50b3AgMSAtd2VpZ2h0IDENDSAgICAjIDMuIENyZWF0ZSBhIHJvdyBvZiBidXR0b25zIGF0IHRoZSBib3R0b20gb2YgdGhlIGRpYWxvZy4NDSAgICBzZXQgaSAwDSAgICBmb3JlYWNoIHtuYW1lIGNhcHRpb259ICRidXR0b25zIHsNCWJ1dHRvbiAuYmdlcnJvckRpYWxvZy4kbmFtZQlcDQkJLXRleHQgJGNhcHRpb24JCVwNCQktZGVmYXVsdCBub3JtYWwJCVwNCQktY29tbWFuZCBbbGlzdCBzZXQgJGJ1dHZhciAkaV0NCWdyaWQgLmJnZXJyb3JEaWFsb2cuJG5hbWUJXA0JCS1pbiAuYmdlcnJvckRpYWxvZy5ib3QJXA0JCS1jb2x1bW4gJGkJCVwNCQktcm93IDAJCQlcDQkJLXN0aWNreSBldwkJXA0JCS1wYWR4IDEwDQlncmlkIGNvbHVtbmNvbmZpZ3VyZSAuYmdlcnJvckRpYWxvZy5ib3QgJGkgLXdlaWdodCAxDQkjIFdlIGJvb3N0IHRoZSBzaXplIG9mIHNvbWUgTWFjIGJ1dHRvbnMgZm9yIGwmZg0JaWYgeyR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pID09ICJtYWNpbnRvc2gifSB7DQkgICAgaWYgeygkbmFtZSA9PSAib2siKSB8fCAoJG5hbWUgPT0gImRpc21pc3MiKX0gew0JCWdyaWQgY29sdW1uY29uZmlndXJlIC5iZ2Vycm9yRGlhbG9nLmJvdCAkaSAtbWluc2l6ZSA3OQ0JICAgIH0NCX0NCWluY3IgaQ0gICAgfQ0gICAgIyBUaGUgIk9LIiBidXR0b24gaXMgdGhlIGRlZmF1bHQgZm9yIHRoaXMgZGlhbG9nLg0gICAgLmJnZXJyb3JEaWFsb2cub2sgY29uZmlndXJlIC1kZWZhdWx0IGFjdGl2ZQ0NICAgIHNldCA6OnRrOjpkaWFsb2c6OmVycm9yOjpjdXJoIDANICAgIGJpbmQgLmJnZXJyb3JEaWFsb2cgPFJldHVybj4Jezo6dGs6OmRpYWxvZzo6ZXJyb3I6OlJldHVybn0NICAgIGJpbmQgLmJnZXJyb3JEaWFsb2cgPERlc3Ryb3k+CXs6OnRrOjpkaWFsb2c6OmVycm9yOjpEZXN0cm95ICVXfQ0gICAgLmJnZXJyb3JEaWFsb2cuZnVuY3Rpb24gY29uZmlndXJlCVwNCSAgICAtY29tbWFuZCB7Ojp0azo6ZGlhbG9nOjplcnJvcjo6ZGV0YWlscyAgIH0NDSAgICAjIDYuIFdpdGhkcmF3IHRoZSB3aW5kb3csIHRoZW4gdXBkYXRlIGFsbCB0aGUgZ2VvbWV0cnkgaW5mb3JtYXRpb24NICAgICMgc28gd2Uga25vdyBob3cgYmlnIGl0IHdhbnRzIHRvIGJlLCB0aGVuIGNlbnRlciB0aGUgd2luZG93IGluIHRoZQ0gICAgIyBkaXNwbGF5IGFuZCBkZS1pY29uaWZ5IGl0Lg0NICAgIHdtIHdpdGhkcmF3IC5iZ2Vycm9yRGlhbG9nDSAgICB1cGRhdGUgaWRsZXRhc2tzDSAgICBzZXQgcGFyZW50IFt3aW5mbyBwYXJlbnQJLmJnZXJyb3JEaWFsb2ddDSAgICBzZXQgd2lkdGggIFt3aW5mbyByZXF3aWR0aAkuYmdlcnJvckRpYWxvZ10NICAgIHNldCBoZWlnaHQgW3dpbmZvIHJlcWhlaWdodAkuYmdlcnJvckRpYWxvZ10NICAgIHNldCB4IFtleHByIHsoW3dpbmZvIHNjcmVlbndpZHRoIC5iZ2Vycm9yRGlhbG9nXSAgLSAkd2lkdGggKS8yIC0gXA0JICAgIFt3aW5mbyB2cm9vdHggJHBhcmVudF19XQ0gICAgc2V0IHkgW2V4cHIgeyhbd2luZm8gc2NyZWVuaGVpZ2h0IC5iZ2Vycm9yRGlhbG9nXSAtICRoZWlnaHQpLzIgLSBcDQkgICAgW3dpbmZvIHZyb290eSAkcGFyZW50XX1dDSAgICAuYmdlcnJvckRpYWxvZyBjb25maWd1cmUgLXdpZHRoICR3aWR0aA0gICAgd20gZ2VvbWV0cnkgLmJnZXJyb3JEaWFsb2cgKyR4KyR5DSAgICB3bSBkZWljb25pZnkgLmJnZXJyb3JEaWFsb2cNDSAgICAjIDcuIFNldCBhIGdyYWIgYW5kIGNsYWltIHRoZSBmb2N1cyB0b28uDQ0gICAgc2V0IG9sZEZvY3VzIFtmb2N1c10NICAgIHNldCBvbGRHcmFiIFtncmFiIGN1cnJlbnQgLmJnZXJyb3JEaWFsb2ddDSAgICBpZiB7JG9sZEdyYWIgIT0gIiJ9IHsNCXNldCBncmFiU3RhdHVzIFtncmFiIHN0YXR1cyAkb2xkR3JhYl0NICAgIH0NICAgIGdyYWIgLmJnZXJyb3JEaWFsb2cNICAgIGZvY3VzIC5iZ2Vycm9yRGlhbG9nLm9rDQ0gICAgIyA4LiBXYWl0IGZvciB0aGUgdXNlciB0byByZXNwb25kLCB0aGVuIHJlc3RvcmUgdGhlIGZvY3VzIGFuZA0gICAgIyByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBidXR0b24uICBSZXN0b3JlIHRoZSBmb2N1cw0gICAgIyBiZWZvcmUgZGVsZXRpbmcgdGhlIHdpbmRvdywgc2luY2Ugb3RoZXJ3aXNlIHRoZSB3aW5kb3cgbWFuYWdlcg0gICAgIyBtYXkgdGFrZSB0aGUgZm9jdXMgYXdheSBzbyB3ZSBjYW4ndCByZWRpcmVjdCBpdC4gIEZpbmFsbHksDSAgICAjIHJlc3RvcmUgYW55IGdyYWIgdGhhdCB3YXMgaW4gZWZmZWN0Lg0NICAgIHZ3YWl0ICRidXR2YXINICAgIHNldCBidXR0b24gJDo6dGs6OmRpYWxvZzo6ZXJyb3I6OmJ1dHRvbjsgIyBTYXZlIGEgY29weS4uLg0gICAgY2F0Y2gge2ZvY3VzICRvbGRGb2N1c30NICAgIGNhdGNoIHtkZXN0cm95IC5iZ2Vycm9yRGlhbG9nfQ0gICAgaWYgeyRvbGRHcmFiICE9ICIifSB7DQlpZiB7JGdyYWJTdGF0dXMgPT0gImdsb2JhbCJ9IHsNCSAgICBncmFiIC1nbG9iYWwgJG9sZEdyYWINCX0gZWxzZSB7DQkgICAgZ3JhYiAkb2xkR3JhYg0JfQ0gICAgfQ0NICAgIGlmIHskYnV0dG9uID09IDF9IHsNCXJldHVybiAtY29kZSBicmVhaw0gICAgfQ19DQAAZpojIGNvbnNvbGUudGNsIC0tDSMNIyBUaGlzIGNvZGUgY29uc3RydWN0cyB0aGUgY29uc29sZSB3aW5kb3cgZm9yIGFuIGFwcGxpY2F0aW9uLiAgSXQNIyBjYW4gYmUgdXNlZCBieSBub24tdW5peCBzeXN0ZW1zIHRoYXQgZG8gbm90IGhhdmUgYnVpbHQtaW4gc3VwcG9ydA0jIGZvciBzaGVsbHMuDSMNIyBSQ1M6IEAoIykgJElkOiBjb25zb2xlLnRjbCx2IDEuOC4yLjQgMjAwMS8xMC8xOSAxOTo0MDoxNyBkYXMgRXhwICQNIw0jIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFNjcmlwdGljcyBDb3JwLg0jIENvcHlyaWdodCAoYykgMTk5NS0xOTk3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4NIw0jIFNlZSB0aGUgZmlsZSAibGljZW5zZS50ZXJtcyIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbg0jIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuDSMNDSMgVE9ETzogaGlzdG9yeSAtIHJlbWVtYmVyIHBhcnRpYWxseSB3cml0dGVuIGNvbW1hbmQNcGFja2FnZSByZXF1aXJlIG1zZ2NhdA0NbmFtZXNwYWNlIGV2YWwgOjp0azo6Y29uc29sZSB7DSAgICB2YXJpYWJsZSBibGlua1RpbWUgICA1MDAgOyAjIG1zZWNzIHRvIGJsaW5rIGJyYWNlZCByYW5nZSBmb3INICAgIHZhcmlhYmxlIGJsaW5rUmFuZ2UgIDEgICA7ICMgZW5hYmxlIGJsaW5raW5nIG9mIHRoZSBlbnRpcmUgYnJhY2VkIHJhbmdlDSAgICB2YXJpYWJsZSBtYWdpY0tleXMgICAxICAgOyAjIGVuYWJsZSBicmFjZSBtYXRjaGluZyBhbmQgcHJvYy92YXIgcmVjb2duaXRpb24NICAgIHZhcmlhYmxlIG1heExpbmVzICAgIDYwMCA7ICMgbWF4aW11bSAjIG9mIGxpbmVzIGJ1ZmZlcmVkIGluIGNvbnNvbGUNICAgIHZhcmlhYmxlIHNob3dNYXRjaGVzIDEgICA7ICMgc2hvdyBtdWx0aXBsZSBleHBhbmQgbWF0Y2hlcw0NICAgIHZhcmlhYmxlIGluUGx1Z2luIFtpbmZvIGV4aXN0cyBlbWJlZF9hcmdzXQ0gICAgdmFyaWFibGUgZGVmYXVsdFByb21wdCAgOyAjIGRlZmF1bHQgcHJvbXB0IGlmIHRjbF9wcm9tcHQxIGlzbid0IHVzZWQNDSAgICBpZiB7JGluUGx1Z2lufSB7DQlzZXQgZGVmYXVsdFByb21wdCB7c3Vic3QgIltoaXN0b3J5IG5leHRpZF0gJSAifQ0gICAgfSBlbHNlIHsNCXNldCBkZWZhdWx0UHJvbXB0IHtzdWJzdCAiKFtmaWxlIHRhaWwgW3B3ZF1dKSBbaGlzdG9yeSBuZXh0aWRdICUgIn0NICAgIH0NfQ0NIyBzaW1wbGUgY29tcGF0IGZ1bmN0aW9uIGZvciB0a2NvbiBjb2RlIGFkZGVkIGZvciB0aGlzIGNvbnNvbGUNaW50ZXJwIGFsaWFzIHt9IEV2YWxBdHRhY2hlZCB7fSBjb25zb2xlaW50ZXJwIGV2YWwNDSMgdGtDb25zb2xlSW5pdCAtLQ0jIFRoaXMgcHJvY2VkdXJlIGNvbnN0cnVjdHMgYW5kIGNvbmZpZ3VyZXMgdGhlIGNvbnNvbGUgd2luZG93cy4NIw0jIEFyZ3VtZW50czoNIyAJTm9uZS4NDXByb2MgdGtDb25zb2xlSW5pdCB7fSB7DSAgICBnbG9iYWwgdGNsX3BsYXRmb3JtDQ0gICAgaWYgeyFbY29uc29sZWludGVycCBldmFsIHtzZXQgdGNsX2ludGVyYWN0aXZlfV19IHsNCXdtIHdpdGhkcmF3IC4NICAgIH0NDSAgICBpZiB7W3N0cmluZyBjb21wYXJlICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJtYWNpbnRvc2giXX0gew0Jc2V0IG1vZCAiQ3RybCINICAgIH0gZWxzZSB7DQlzZXQgbW9kICJDbWQiDSAgICB9DQ0gICAgbWVudSAubWVudWJhcg0gICAgLm1lbnViYXIgYWRkIGNhc2NhZGUgLWxhYmVsIEZpbGUgLW1lbnUgLm1lbnViYXIuZmlsZSAtdW5kZXJsaW5lIDANICAgIC5tZW51YmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBFZGl0IC1tZW51IC5tZW51YmFyLmVkaXQgLXVuZGVybGluZSAwDQ0gICAgbWVudSAubWVudWJhci5maWxlIC10ZWFyb2ZmIDANICAgIC5tZW51YmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJTb3VyY2UuLi4iIC11bmRlcmxpbmUgMCBcDQkgICAgLWNvbW1hbmQgdGtDb25zb2xlU291cmNlDSAgICAubWVudWJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiSGlkZSBDb25zb2xlIiAtdW5kZXJsaW5lIDAgXA0JICAgIC1jb21tYW5kIHt3bSB3aXRoZHJhdyAufQ0gICAgLm1lbnViYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgWzo6bXNnY2F0OjptYyAiQ2xlYXIgQ29uc29sZSJdIFwNCSAgICAtdW5kZXJsaW5lIDAgLWNvbW1hbmQgey5jb25zb2xlIGRlbGV0ZSAxLjAgInByb21wdEVuZCBsaW5lc3RhcnQifQ0gICAgaWYge1tzdHJpbmcgY29tcGFyZSAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAibWFjaW50b3NoIl19IHsNCS5tZW51YmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJFeGl0IiAtdW5kZXJsaW5lIDEgLWNvbW1hbmQgZXhpdA0gICAgfSBlbHNlIHsNCS5tZW51YmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJRdWl0IiAtY29tbWFuZCBleGl0IC1hY2NlbCBDbWQtUQ0gICAgfQ0NICAgIG1lbnUgLm1lbnViYXIuZWRpdCAtdGVhcm9mZiAwDSAgICAubWVudWJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCAiQ3V0IiAtdW5kZXJsaW5lIDIgXA0JICAgIC1jb21tYW5kIHsgZXZlbnQgZ2VuZXJhdGUgLmNvbnNvbGUgPDxDdXQ+PiB9IC1hY2NlbCAiJG1vZCtYIg0gICAgLm1lbnViYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgIkNvcHkiIC11bmRlcmxpbmUgMCBcDQkgICAgLWNvbW1hbmQgeyBldmVudCBnZW5lcmF0ZSAuY29uc29sZSA8PENvcHk+PiB9IC1hY2NlbCAiJG1vZCtDIg0gICAgLm1lbnViYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgIlBhc3RlIiAtdW5kZXJsaW5lIDEgXA0JICAgIC1jb21tYW5kIHsgZXZlbnQgZ2VuZXJhdGUgLmNvbnNvbGUgPDxQYXN0ZT4+IH0gLWFjY2VsICIkbW9kK1YiDQ0gICAgaWYge1tzdHJpbmcgY29tcGFyZSAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAid2luZG93cyJdfSB7DQkubWVudWJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCAiQ2xlYXIiIC11bmRlcmxpbmUgMiBcDQkJLWNvbW1hbmQgeyBldmVudCBnZW5lcmF0ZSAuY29uc29sZSA8PENsZWFyPj4gfQ0gICAgfSBlbHNlIHsNCS5tZW51YmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsICJEZWxldGUiIC11bmRlcmxpbmUgMCBcDQkJLWNvbW1hbmQgeyBldmVudCBnZW5lcmF0ZSAuY29uc29sZSA8PENsZWFyPj4gfSAtYWNjZWwgIkRlbCINDQkubWVudWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgSGVscCAtbWVudSAubWVudWJhci5oZWxwIC11bmRlcmxpbmUgMA0JbWVudSAubWVudWJhci5oZWxwIC10ZWFyb2ZmIDANCS5tZW51YmFyLmhlbHAgYWRkIGNvbW1hbmQgLWxhYmVsICJBYm91dC4uLiIgLXVuZGVybGluZSAwIFwNCQktY29tbWFuZCB0a0NvbnNvbGVBYm91dA0gICAgfQ0NICAgIC4gY29uZmlndXJlIC1tZW51IC5tZW51YmFyDQ0gICAgc2V0IGNvbiBbdGV4dCAuY29uc29sZSAgLXlzY3JvbGxjb21tYW5kIFtsaXN0IC5zYiBzZXRdIC1zZXRncmlkIHRydWVdDSAgICBzY3JvbGxiYXIgLnNiIC1jb21tYW5kIFtsaXN0ICRjb24geXZpZXddDSAgICBwYWNrIC5zYiAtc2lkZSByaWdodCAtZmlsbCBib3RoDSAgICBwYWNrICRjb24gLWZpbGwgYm90aCAtZXhwYW5kIDEgLXNpZGUgbGVmdA0gICAgc3dpdGNoIC1leGFjdCAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSB7DQkibWFjaW50b3NoIiB7DQkgICAgJGNvbiBjb25maWd1cmUgLWZvbnQge01vbmFjbyA5IG5vcm1hbH0gLWhpZ2hsaWdodHRoaWNrbmVzcyAwDQl9DQkid2luZG93cyIgew0JICAgICRjb24gY29uZmlndXJlIC1mb250IHN5c3RlbWZpeGVkDQl9DSAgICB9DQ0gICAgdGtDb25zb2xlQmluZCAkY29uDQ0gICAgJGNvbiB0YWcgY29uZmlndXJlIHN0ZGVycgktZm9yZWdyb3VuZCByZWQNICAgICRjb24gdGFnIGNvbmZpZ3VyZSBzdGRpbgktZm9yZWdyb3VuZCBibHVlDSAgICAkY29uIHRhZyBjb25maWd1cmUgcHJvbXB0CS1mb3JlZ3JvdW5kIFwjOEY0NDMzDSAgICAkY29uIHRhZyBjb25maWd1cmUgcHJvYwktZm9yZWdyb3VuZCBcIzAwODgwMA0gICAgJGNvbiB0YWcgY29uZmlndXJlIHZhcgktYmFja2dyb3VuZCBcI0ZGQzBEMA0gICAgJGNvbiB0YWcgcmFpc2Ugc2VsDSAgICAkY29uIHRhZyBjb25maWd1cmUgYmxpbmsJLWJhY2tncm91bmQgXCNGRkZGMDANICAgICRjb24gdGFnIGNvbmZpZ3VyZSBmaW5kCS1iYWNrZ3JvdW5kIFwjRkZGRjAwDQ0gICAgZm9jdXMgJGNvbg0gICAgDSAgICB3bSBwcm90b2NvbCAuIFdNX0RFTEVURV9XSU5ET1cgeyB3bSB3aXRoZHJhdyAuIH0NICAgIHdtIHRpdGxlIC4gIkNvbnNvbGUiDSAgICBmbHVzaCBzdGRvdXQNICAgICRjb24gbWFyayBzZXQgb3V0cHV0IFskY29uIGluZGV4ICJlbmQgLSAxIGNoYXIiXQ0gICAgdGtUZXh0U2V0Q3Vyc29yICRjb24gZW5kDSAgICAkY29uIG1hcmsgc2V0IHByb21wdEVuZCBpbnNlcnQNICAgICRjb24gbWFyayBncmF2aXR5IHByb21wdEVuZCBsZWZ0DX0NDSMgdGtDb25zb2xlU291cmNlIC0tDSMNIyBQcm9tcHRzIHRoZSB1c2VyIGZvciBhIGZpbGUgdG8gc291cmNlIGluIHRoZSBtYWluIGludGVycHJldGVyLg0jDSMgQXJndW1lbnRzOg0jIE5vbmUuDQ1wcm9jIHRrQ29uc29sZVNvdXJjZSB7fSB7DSAgICBzZXQgZmlsZW5hbWUgW3RrX2dldE9wZW5GaWxlIC1kZWZhdWx0ZXh0ZW5zaW9uIC50Y2wgLXBhcmVudCAuIFwNCSAgICAtdGl0bGUgIlNlbGVjdCBhIGZpbGUgdG8gc291cmNlIiBcDQkgICAgLWZpbGV0eXBlcyB7eyJUY2wgU2NyaXB0cyIgLnRjbH0geyJBbGwgRmlsZXMiICp9fV0NICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJGZpbGVuYW1lICIiXX0gew0gICAgCXNldCBjbWQgW2xpc3Qgc291cmNlICRmaWxlbmFtZV0NCWlmIHtbY2F0Y2gge2NvbnNvbGVpbnRlcnAgZXZhbCAkY21kfSByZXN1bHRdfSB7DQkgICAgdGtDb25zb2xlT3V0cHV0IHN0ZGVyciAiJHJlc3VsdFxuIg0JfQ0gICAgfQ19DQ0jIHRrQ29uc29sZUludm9rZSAtLQ0jIFByb2Nlc3NlcyB0aGUgY29tbWFuZCBsaW5lIGlucHV0LiAgSWYgdGhlIGNvbW1hbmQgaXMgY29tcGxldGUgaXQNIyBpcyBldmFsZWQgaW4gdGhlIG1haW4gaW50ZXJwcmV0ZXIuICBPdGhlcndpc2UsIHRoZSBjb250aW51YXRpb24NIyBwcm9tcHQgaXMgYWRkZWQgYW5kIG1vcmUgaW5wdXQgbWF5IGJlIGFkZGVkLg0jDSMgQXJndW1lbnRzOg0jIE5vbmUuDQ1wcm9jIHRrQ29uc29sZUludm9rZSB7YXJnc30gew0gICAgc2V0IHJhbmdlcyBbLmNvbnNvbGUgdGFnIHJhbmdlcyBpbnB1dF0NICAgIHNldCBjbWQgIiINICAgIGlmIHtbbGxlbmd0aCAkcmFuZ2VzXX0gew0Jc2V0IHBvcyAwDQl3aGlsZSB7W3N0cmluZyBjb21wYXJlIFtsaW5kZXggJHJhbmdlcyAkcG9zXSAiIl19IHsNCSAgICBzZXQgc3RhcnQgW2xpbmRleCAkcmFuZ2VzICRwb3NdDQkgICAgc2V0IGVuZCBbbGluZGV4ICRyYW5nZXMgW2luY3IgcG9zXV0NCSAgICBhcHBlbmQgY21kIFsuY29uc29sZSBnZXQgJHN0YXJ0ICRlbmRdDQkgICAgaW5jciBwb3MNCX0NICAgIH0NICAgIGlmIHtbc3RyaW5nIGVxdWFsICRjbWQgIiJdfSB7DQl0a0NvbnNvbGVQcm9tcHQNICAgIH0gZWxzZWlmIHtbaW5mbyBjb21wbGV0ZSAkY21kXX0gew0JLmNvbnNvbGUgbWFyayBzZXQgb3V0cHV0IGVuZA0JLmNvbnNvbGUgdGFnIGRlbGV0ZSBpbnB1dA0Jc2V0IHJlc3VsdCBbY29uc29sZWludGVycCByZWNvcmQgJGNtZF0NCWlmIHtbc3RyaW5nIGNvbXBhcmUgJHJlc3VsdCAiIl19IHsNCSAgICBwdXRzICRyZXN1bHQNCX0NCXRrQ29uc29sZUhpc3RvcnkgcmVzZXQNCXRrQ29uc29sZVByb21wdA0gICAgfSBlbHNlIHsNCXRrQ29uc29sZVByb21wdCBwYXJ0aWFsDSAgICB9DSAgICAuY29uc29sZSB5dmlldyAtcGlja3BsYWNlIGluc2VydA19DQ0jIHRrQ29uc29sZUhpc3RvcnkgLS0NIyBUaGlzIHByb2NlZHVyZSBpbXBsZW1lbnRzIGNvbW1hbmQgbGluZSBoaXN0b3J5IGZvciB0aGUNIyBjb25zb2xlLiAgSW4gZ2VuZXJhbCBpcyBldmFscyB0aGUgaGlzdG9yeSBjb21tYW5kIGluIHRoZQ0jIG1haW4gaW50ZXJwcmV0ZXIgdG8gb2J0YWluIHRoZSBoaXN0b3J5LiAgVGhlIGdsb2JhbCB2YXJpYWJsZQ0jIGhpc3ROdW0gaXMgdXNlZCB0byBzdG9yZSB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgaGlzdG9yeS4NIw0jIEFyZ3VtZW50czoNIyBjbWQgLQlXaGljaCBhY3Rpb24gdG8gdGFrZTogcHJldiwgbmV4dCwgcmVzZXQuDQ1zZXQgaGlzdE51bSAxDXByb2MgdGtDb25zb2xlSGlzdG9yeSB7Y21kfSB7DSAgICBnbG9iYWwgaGlzdE51bQ0gICAgDSAgICBzd2l0Y2ggJGNtZCB7DSAgICAJcHJldiB7DQkgICAgaW5jciBoaXN0TnVtIC0xDQkgICAgaWYgeyRoaXN0TnVtID09IDB9IHsNCQlzZXQgY21kIHtoaXN0b3J5IGV2ZW50IFtleHByIHtbaGlzdG9yeSBuZXh0aWRdIC0xfV19DQkgICAgfSBlbHNlIHsNCQlzZXQgY21kICJoaXN0b3J5IGV2ZW50ICRoaXN0TnVtIg0JICAgIH0NICAgIAkgICAgaWYge1tjYXRjaCB7Y29uc29sZWludGVycCBldmFsICRjbWR9IGNtZF19IHsNICAgIAkgICAgCWluY3IgaGlzdE51bQ0gICAgCSAgICAJcmV0dXJuDSAgICAJICAgIH0NCSAgICAuY29uc29sZSBkZWxldGUgcHJvbXB0RW5kIGVuZA0gICAgCSAgICAuY29uc29sZSBpbnNlcnQgcHJvbXB0RW5kICRjbWQge2lucHV0IHN0ZGlufQ0gICAgCX0NICAgIAluZXh0IHsNCSAgICBpbmNyIGhpc3ROdW0NCSAgICBpZiB7JGhpc3ROdW0gPT0gMH0gew0JCXNldCBjbWQge2hpc3RvcnkgZXZlbnQgW2V4cHIge1toaXN0b3J5IG5leHRpZF0gLTF9XX0NCSAgICB9IGVsc2VpZiB7JGhpc3ROdW0gPiAwfSB7DQkJc2V0IGNtZCAiIg0JCXNldCBoaXN0TnVtIDENCSAgICB9IGVsc2Ugew0JCXNldCBjbWQgImhpc3RvcnkgZXZlbnQgJGhpc3ROdW0iDQkgICAgfQ0JICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJGNtZCAiIl19IHsNCQljYXRjaCB7Y29uc29sZWludGVycCBldmFsICRjbWR9IGNtZA0JICAgIH0NCSAgICAuY29uc29sZSBkZWxldGUgcHJvbXB0RW5kIGVuZA0JICAgIC5jb25zb2xlIGluc2VydCBwcm9tcHRFbmQgJGNtZCB7aW5wdXQgc3RkaW59DSAgICAJfQ0gICAgCXJlc2V0IHsNICAgIAkgICAgc2V0IGhpc3ROdW0gMQ0gICAgCX0NICAgIH0NfQ0NIyB0a0NvbnNvbGVQcm9tcHQgLS0NIyBUaGlzIHByb2NlZHVyZSBkcmF3cyB0aGUgcHJvbXB0LiAgSWYgdGNsX3Byb21wdDEgb3IgdGNsX3Byb21wdDINIyBleGlzdHMgaW4gdGhlIG1haW4gaW50ZXJwcmV0ZXIgaXQgd2lsbCBiZSBjYWxsZWQgdG8gZ2VuZXJhdGUgdGhlIA0jIHByb21wdC4gIE90aGVyd2lzZSwgYSBoYXJkIGNvZGVkIGRlZmF1bHQgcHJvbXB0IGlzIHByaW50ZWQuDSMNIyBBcmd1bWVudHM6DSMgcGFydGlhbCAtCUZsYWcgdG8gc3BlY2lmeSB3aGljaCBwcm9tcHQgdG8gcHJpbnQuDQ1wcm9jIHRrQ29uc29sZVByb21wdCB7e3BhcnRpYWwgbm9ybWFsfX0gew0gICAgc2V0IHcgLmNvbnNvbGUNICAgIGlmIHtbc3RyaW5nIGVxdWFsICRwYXJ0aWFsICJub3JtYWwiXX0gew0Jc2V0IHRlbXAgWyR3IGluZGV4ICJlbmQgLSAxIGNoYXIiXQ0JJHcgbWFyayBzZXQgb3V0cHV0IGVuZA0gICAgCWlmIHtbY29uc29sZWludGVycCBldmFsICJpbmZvIGV4aXN0cyB0Y2xfcHJvbXB0MSJdfSB7DSAgICAJICAgIGNvbnNvbGVpbnRlcnAgZXZhbCAiZXZhbCBcW3NldCB0Y2xfcHJvbXB0MVxdIg0gICAgCX0gZWxzZSB7DSAgICAJICAgIHB1dHMgLW5vbmV3bGluZSBbRXZhbEF0dGFjaGVkICQ6OnRrOjpjb25zb2xlOjpkZWZhdWx0UHJvbXB0XQ0gICAgCX0NICAgIH0gZWxzZSB7DQlzZXQgdGVtcCBbJHcgaW5kZXggb3V0cHV0XQ0JJHcgbWFyayBzZXQgb3V0cHV0IGVuZA0gICAgCWlmIHtbY29uc29sZWludGVycCBldmFsICJpbmZvIGV4aXN0cyB0Y2xfcHJvbXB0MiJdfSB7DSAgICAJICAgIGNvbnNvbGVpbnRlcnAgZXZhbCAiZXZhbCBcW3NldCB0Y2xfcHJvbXB0MlxdIg0gICAgCX0gZWxzZSB7DQkgICAgcHV0cyAtbm9uZXdsaW5lICI+ICINICAgIAl9DSAgICB9DSAgICBmbHVzaCBzdGRvdXQNICAgICR3IG1hcmsgc2V0IG91dHB1dCAkdGVtcA0gICAgdGtUZXh0U2V0Q3Vyc29yICR3IGVuZA0gICAgJHcgbWFyayBzZXQgcHJvbXB0RW5kIGluc2VydA0gICAgJHcgbWFyayBncmF2aXR5IHByb21wdEVuZCBsZWZ0DSAgICA6OnRrOjpjb25zb2xlOjpDb25zdHJhaW5CdWZmZXIgJHcgJDo6dGs6OmNvbnNvbGU6Om1heExpbmVzDSAgICAkdyBzZWUgZW5kDX0NDSMgdGtDb25zb2xlQmluZCAtLQ0jIFRoaXMgcHJvY2VkdXJlIGZpcnN0IGVuc3VyZXMgdGhhdCB0aGUgZGVmYXVsdCBiaW5kaW5ncyBmb3IgdGhlIFRleHQNIyBjbGFzcyBoYXZlIGJlZW4gZGVmaW5lZC4gIFRoZW4gY2VydGFpbiBiaW5kaW5ncyBhcmUgb3ZlcnJpZGRlbiBmb3INIyB0aGUgY2xhc3MuDSMNIyBBcmd1bWVudHM6DSMgTm9uZS4NDXByb2MgdGtDb25zb2xlQmluZCB7d30gew0gICAgYmluZHRhZ3MgJHcgW2xpc3QgJHcgQ29uc29sZSBQb3N0Q29uc29sZSBbd2luZm8gdG9wbGV2ZWwgJHddIGFsbF0NDSAgICAjIyBHZXQgYWxsIFRleHQgYmluZGluZ3MgaW50byBDb25zb2xlDSAgICBmb3JlYWNoIGV2IFtiaW5kIFRleHRdIHsgYmluZCBDb25zb2xlICRldiBbYmluZCBUZXh0ICRldl0gfQkNICAgICMjIFdlIHJlYWxseSBkaWRuJ3Qgd2FudCB0aGUgbmV3bGluZSBpbnNlcnRpb24NICAgIGJpbmQgQ29uc29sZSA8Q29udHJvbC1LZXktbz4ge30NDSAgICAjIEZvciB0aGUgbW9tZW50LCB0cmFuc3Bvc2UgaXNuJ3QgZW5hYmxlZCB1bnRpbCB0aGUgY29uc29sZQ0gICAgIyBnZXRzIGFuZCBvdmVyaGF1bCBvZiBob3cgaXQgaGFuZGxlcyBpbnB1dCAtLSBob2Jicw0gICAgYmluZCBDb25zb2xlIDxDb250cm9sLUtleS10PiB7fQ0NICAgICMgSWdub3JlIGFsbCBBbHQsIE1ldGEsIGFuZCBDb250cm9sIGtleXByZXNzZXMgdW5sZXNzIGV4cGxpY2l0bHkgYm91bmQuDSAgICAjIE90aGVyd2lzZSwgaWYgYSB3aWRnZXQgYmluZGluZyBmb3Igb25lIG9mIHRoZXNlIGlzIGRlZmluZWQsIHRoZQ0NICAgIGJpbmQgQ29uc29sZSA8QWx0LUtleVByZXNzPiB7IyBub3RoaW5nIH0NICAgIGJpbmQgQ29uc29sZSA8TWV0YS1LZXlQcmVzcz4geyMgbm90aGluZ30NICAgIGJpbmQgQ29uc29sZSA8Q29udHJvbC1LZXlQcmVzcz4geyMgbm90aGluZ30NDSAgICBmb3JlYWNoIHtldiBrZXl9IHsNCTw8Q29uc29sZV9QcmV2Pj4JCTxLZXktVXA+DQk8PENvbnNvbGVfTmV4dD4+CQk8S2V5LURvd24+DQk8PENvbnNvbGVfTmV4dEltbWVkaWF0ZT4+CTxDb250cm9sLUtleS1uPg0JPDxDb25zb2xlX1ByZXZJbW1lZGlhdGU+Pgk8Q29udHJvbC1LZXktcD4NCTw8Q29uc29sZV9QcmV2U2VhcmNoPj4JCTxDb250cm9sLUtleS1yPg0JPDxDb25zb2xlX05leHRTZWFyY2g+PgkJPENvbnRyb2wtS2V5LXM+DQ0JPDxDb25zb2xlX0V4cGFuZD4+CQk8S2V5LUVzY2FwZT4NCTw8Q29uc29sZV9FeHBhbmRGaWxlPj4JCTxDb250cm9sLVNoaWZ0LUtleS1GPg0JPDxDb25zb2xlX0V4cGFuZFByb2M+PgkJPENvbnRyb2wtU2hpZnQtS2V5LVA+DQk8PENvbnNvbGVfRXhwYW5kVmFyPj4JCTxDb250cm9sLVNoaWZ0LUtleS1WPg0JPDxDb25zb2xlX1RhYj4+CQkJPENvbnRyb2wtS2V5LWk+DQk8PENvbnNvbGVfVGFiPj4JCQk8TWV0YS1LZXktaT4NCTw8Q29uc29sZV9FdmFsPj4JCTxLZXktUmV0dXJuPg0JPDxDb25zb2xlX0V2YWw+PgkJPEtleS1LUF9FbnRlcj4NDQk8PENvbnNvbGVfQ2xlYXI+PgkJPENvbnRyb2wtS2V5LWw+DQk8PENvbnNvbGVfS2lsbExpbmU+PgkJPENvbnRyb2wtS2V5LWs+DQk8PENvbnNvbGVfVHJhbnNwb3NlPj4JCTxDb250cm9sLUtleS10Pg0JPDxDb25zb2xlX0NsZWFyTGluZT4+CQk8Q29udHJvbC1LZXktdT4NCTw8Q29uc29sZV9TYXZlQ29tbWFuZD4+CQk8Q29udHJvbC1LZXktej4NICAgIH0gew0JZXZlbnQgYWRkICRldiAka2V5DQliaW5kIENvbnNvbGUgJGtleSB7fQ0gICAgfQ0NICAgIGJpbmQgQ29uc29sZSA8VGFiPiB7DQl0a0NvbnNvbGVJbnNlcnQgJVcgXHQNCWZvY3VzICVXDQlicmVhaw0gICAgfQ0gICAgYmluZCBDb25zb2xlIDw8Q29uc29sZV9FeHBhbmQ+PiB7DQlpZiB7WyVXIGNvbXBhcmUgaW5zZXJ0ID4gcHJvbXB0RW5kXX0gezo6dGs6OmNvbnNvbGU6OkV4cGFuZCAlV30NICAgIH0NICAgIGJpbmQgQ29uc29sZSA8PENvbnNvbGVfRXhwYW5kRmlsZT4+IHsNCWlmIHtbJVcgY29tcGFyZSBpbnNlcnQgPiBwcm9tcHRFbmRdfSB7Ojp0azo6Y29uc29sZTo6RXhwYW5kICVXIHBhdGh9DSAgICB9DSAgICBiaW5kIENvbnNvbGUgPDxDb25zb2xlX0V4cGFuZFByb2M+PiB7DQlpZiB7WyVXIGNvbXBhcmUgaW5zZXJ0ID4gcHJvbXB0RW5kXX0gezo6dGs6OmNvbnNvbGU6OkV4cGFuZCAlVyBwcm9jfQ0gICAgfQ0gICAgYmluZCBDb25zb2xlIDw8Q29uc29sZV9FeHBhbmRWYXI+PiB7DQlpZiB7WyVXIGNvbXBhcmUgaW5zZXJ0ID4gcHJvbXB0RW5kXX0gezo6dGs6OmNvbnNvbGU6OkV4cGFuZCAlVyB2YXJ9DSAgICB9DSAgICBiaW5kIENvbnNvbGUgPDxDb25zb2xlX0V2YWw+PiB7DQklVyBtYXJrIHNldCBpbnNlcnQge2VuZCAtIDFjfQ0JdGtDb25zb2xlSW5zZXJ0ICVXICJcbiINCXRrQ29uc29sZUludm9rZQ0JYnJlYWsNICAgIH0NICAgIGJpbmQgQ29uc29sZSA8RGVsZXRlPiB7DQlpZiB7W3N0cmluZyBjb21wYXJlIHt9IFslVyB0YWcgbmV4dHJhbmdlIHNlbCAxLjAgZW5kXV0gXA0JCSYmIFslVyBjb21wYXJlIHNlbC5maXJzdCA+PSBwcm9tcHRFbmRdfSB7DQkgICAgJVcgZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdA0JfSBlbHNlaWYge1slVyBjb21wYXJlIGluc2VydCA+PSBwcm9tcHRFbmRdfSB7DQkgICAgJVcgZGVsZXRlIGluc2VydA0JICAgICVXIHNlZSBpbnNlcnQNCX0NICAgIH0NICAgIGJpbmQgQ29uc29sZSA8QmFja1NwYWNlPiB7DQlpZiB7W3N0cmluZyBjb21wYXJlIHt9IFslVyB0YWcgbmV4dHJhbmdlIHNlbCAxLjAgZW5kXV0gXA0JCSYmIFslVyBjb21wYXJlIHNlbC5maXJzdCA+PSBwcm9tcHRFbmRdfSB7DQkgICAgJVcgZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdA0JfSBlbHNlaWYge1slVyBjb21wYXJlIGluc2VydCAhPSAxLjBdICYmIFwNCQlbJVcgY29tcGFyZSBpbnNlcnQgPiBwcm9tcHRFbmRdfSB7DQkgICAgJVcgZGVsZXRlIGluc2VydC0xYw0JICAgICVXIHNlZSBpbnNlcnQNCX0NICAgIH0NICAgIGJpbmQgQ29uc29sZSA8Q29udHJvbC1oPiBbYmluZCBDb25zb2xlIDxCYWNrU3BhY2U+XQ0NICAgIGJpbmQgQ29uc29sZSA8SG9tZT4gew0JaWYge1slVyBjb21wYXJlIGluc2VydCA8IHByb21wdEVuZF19IHsNCSAgICB0a1RleHRTZXRDdXJzb3IgJVcge2luc2VydCBsaW5lc3RhcnR9DQl9IGVsc2Ugew0JICAgIHRrVGV4dFNldEN1cnNvciAlVyBwcm9tcHRFbmQNCX0NICAgIH0NICAgIGJpbmQgQ29uc29sZSA8Q29udHJvbC1hPiBbYmluZCBDb25zb2xlIDxIb21lPl0NICAgIGJpbmQgQ29uc29sZSA8RW5kPiB7DQl0a1RleHRTZXRDdXJzb3IgJVcge2luc2VydCBsaW5lZW5kfQ0gICAgfQ0gICAgYmluZCBDb25zb2xlIDxDb250cm9sLWU+IFtiaW5kIENvbnNvbGUgPEVuZD5dDSAgICBiaW5kIENvbnNvbGUgPENvbnRyb2wtZD4gew0JaWYge1slVyBjb21wYXJlIGluc2VydCA8IHByb21wdEVuZF19IGJyZWFrDQklVyBkZWxldGUgaW5zZXJ0DSAgICB9DSAgICBiaW5kIENvbnNvbGUgPDxDb25zb2xlX0tpbGxMaW5lPj4gew0JaWYge1slVyBjb21wYXJlIGluc2VydCA8IHByb21wdEVuZF19IGJyZWFrDQlpZiB7WyVXIGNvbXBhcmUgaW5zZXJ0ID09IHtpbnNlcnQgbGluZWVuZH1dfSB7DQkgICAgJVcgZGVsZXRlIGluc2VydA0JfSBlbHNlIHsNCSAgICAlVyBkZWxldGUgaW5zZXJ0IHtpbnNlcnQgbGluZWVuZH0NCX0NICAgIH0NICAgIGJpbmQgQ29uc29sZSA8PENvbnNvbGVfQ2xlYXI+PiB7DQkjIyBDbGVhciBjb25zb2xlIGRpc3BsYXkNCSVXIGRlbGV0ZSAxLjAgInByb21wdEVuZCBsaW5lc3RhcnQiDSAgICB9DSAgICBiaW5kIENvbnNvbGUgPDxDb25zb2xlX0NsZWFyTGluZT4+IHsNCSMjIENsZWFyIGNvbW1hbmQgbGluZSAoVW5peCBzaGVsbCBzdGFwbGUpDQklVyBkZWxldGUgcHJvbXB0RW5kIGVuZA0gICAgfQ0gICAgYmluZCBDb25zb2xlIDxNZXRhLWQ+IHsNCWlmIHtbJVcgY29tcGFyZSBpbnNlcnQgPj0gcHJvbXB0RW5kXX0gew0JICAgICVXIGRlbGV0ZSBpbnNlcnQge2luc2VydCB3b3JkZW5kfQ0JfQ0gICAgfQ0gICAgYmluZCBDb25zb2xlIDxNZXRhLUJhY2tTcGFjZT4gew0JaWYge1slVyBjb21wYXJlIHtpbnNlcnQgLTFjIHdvcmRzdGFydH0gPj0gcHJvbXB0RW5kXX0gew0JICAgICVXIGRlbGV0ZSB7aW5zZXJ0IC0xYyB3b3Jkc3RhcnR9IGluc2VydA0JfQ0gICAgfQ0gICAgYmluZCBDb25zb2xlIDxNZXRhLWQ+IHsNCWlmIHtbJVcgY29tcGFyZSBpbnNlcnQgPj0gcHJvbXB0RW5kXX0gew0JICAgICVXIGRlbGV0ZSBpbnNlcnQge2luc2VydCB3b3JkZW5kfQ0JfQ0gICAgfQ0gICAgYmluZCBDb25zb2xlIDxNZXRhLUJhY2tTcGFjZT4gew0JaWYge1slVyBjb21wYXJlIHtpbnNlcnQgLTFjIHdvcmRzdGFydH0gPj0gcHJvbXB0RW5kXX0gew0JICAgICVXIGRlbGV0ZSB7aW5zZXJ0IC0xYyB3b3Jkc3RhcnR9IGluc2VydA0JfQ0gICAgfQ0gICAgYmluZCBDb25zb2xlIDxNZXRhLURlbGV0ZT4gew0JaWYge1slVyBjb21wYXJlIGluc2VydCA+PSBwcm9tcHRFbmRdfSB7DQkgICAgJVcgZGVsZXRlIGluc2VydCB7aW5zZXJ0IHdvcmRlbmR9DQl9DSAgICB9DSAgICBiaW5kIENvbnNvbGUgPDxDb25zb2xlX1ByZXY+PiB7DQl0a0NvbnNvbGVIaXN0b3J5IHByZXYNICAgIH0NICAgIGJpbmQgQ29uc29sZSA8PENvbnNvbGVfTmV4dD4+IHsNCXRrQ29uc29sZUhpc3RvcnkgbmV4dA0gICAgfQ0gICAgYmluZCBDb25zb2xlIDxJbnNlcnQ+IHsNCWNhdGNoIHt0a0NvbnNvbGVJbnNlcnQgJVcgWzo6dGs6OkdldFNlbGVjdGlvbiAlVyBQUklNQVJZXX0NICAgIH0NICAgIGJpbmQgQ29uc29sZSA8S2V5UHJlc3M+IHsNCXRrQ29uc29sZUluc2VydCAlVyAlQQ0gICAgfQ0gICAgYmluZCBDb25zb2xlIDxGOT4gew0JZXZhbCBkZXN0cm95IFt3aW5mbyBjaGlsZCAuXQ0JaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIm1hY2ludG9zaCJdfSB7DQkgICAgaWYge1tjYXRjaCB7c291cmNlICR0a19saWJyYXJ5OmNvbnNvbGUudGNsfV19IHtzb3VyY2UgLXJzcmMgY29uc29sZX0NCX0gZWxzZSB7DQkgICAgc291cmNlIFtmaWxlIGpvaW4gJHRrX2xpYnJhcnkgY29uc29sZS50Y2xdDQl9DSAgICB9DSAgICBiaW5kIENvbnNvbGUgPDxDdXQ+PiB7DSAgICAgICAgIyBTYW1lIGFzIHRoZSBjb3B5IGV2ZW50DSAJaWYgeyFbY2F0Y2gge3NldCBkYXRhIFslVyBnZXQgc2VsLmZpcnN0IHNlbC5sYXN0XX1dfSB7DQkgICAgY2xpcGJvYXJkIGNsZWFyIC1kaXNwbGF5b2YgJVcNCSAgICBjbGlwYm9hcmQgYXBwZW5kIC1kaXNwbGF5b2YgJVcgJGRhdGENCX0NICAgIH0NICAgIGJpbmQgQ29uc29sZSA8PENvcHk+PiB7DSAJaWYgeyFbY2F0Y2gge3NldCBkYXRhIFslVyBnZXQgc2VsLmZpcnN0IHNlbC5sYXN0XX1dfSB7DQkgICAgY2xpcGJvYXJkIGNsZWFyIC1kaXNwbGF5b2YgJVcNCSAgICBjbGlwYm9hcmQgYXBwZW5kIC1kaXNwbGF5b2YgJVcgJGRhdGENCX0NICAgIH0NICAgIGJpbmQgQ29uc29sZSA8PFBhc3RlPj4gew0JY2F0Y2ggew0JICAgIHNldCBjbGlwIFs6OnRrOjpHZXRTZWxlY3Rpb24gJVcgQ0xJUEJPQVJEXQ0JICAgIHNldCBsaXN0IFtzcGxpdCAkY2xpcCBcblxyXQ0JICAgIHRrQ29uc29sZUluc2VydCAlVyBbbGluZGV4ICRsaXN0IDBdDQkgICAgZm9yZWFjaCB4IFtscmFuZ2UgJGxpc3QgMSBlbmRdIHsNCQklVyBtYXJrIHNldCBpbnNlcnQge2VuZCAtIDFjfQ0JCXRrQ29uc29sZUluc2VydCAlVyAiXG4iDQkJdGtDb25zb2xlSW52b2tlDQkJdGtDb25zb2xlSW5zZXJ0ICVXICR4DQkgICAgfQ0JfQ0gICAgfQ0NICAgICMjDSAgICAjIyBCaW5kaW5ncyBmb3IgZG9pbmcgc3BlY2lhbCB0aGluZ3MgYmFzZWQgb24gY2VydGFpbiBrZXlzDSAgICAjIw0gICAgYmluZCBQb3N0Q29uc29sZSA8S2V5LXBhcmVucmlnaHQ+IHsNCWlmIHtbc3RyaW5nIGNvbXBhcmUgXFwgWyVXIGdldCBpbnNlcnQtMmNdXX0gew0JICAgIDo6dGs6OmNvbnNvbGU6Ok1hdGNoUGFpciAlVyBcKCBcKSBwcm9tcHRFbmQNCX0NICAgIH0NICAgIGJpbmQgUG9zdENvbnNvbGUgPEtleS1icmFja2V0cmlnaHQ+IHsNCWlmIHtbc3RyaW5nIGNvbXBhcmUgXFwgWyVXIGdldCBpbnNlcnQtMmNdXX0gew0JICAgIDo6dGs6OmNvbnNvbGU6Ok1hdGNoUGFpciAlVyBcWyBcXSBwcm9tcHRFbmQNCX0NICAgIH0NICAgIGJpbmQgUG9zdENvbnNvbGUgPEtleS1icmFjZXJpZ2h0PiB7DQlpZiB7W3N0cmluZyBjb21wYXJlIFxcIFslVyBnZXQgaW5zZXJ0LTJjXV19IHsNCSAgICA6OnRrOjpjb25zb2xlOjpNYXRjaFBhaXIgJVcgXHsgXH0gcHJvbXB0RW5kDQl9DSAgICB9DSAgICBiaW5kIFBvc3RDb25zb2xlIDxLZXktcXVvdGVkYmw+IHsNCWlmIHtbc3RyaW5nIGNvbXBhcmUgXFwgWyVXIGdldCBpbnNlcnQtMmNdXX0gew0JICAgIDo6dGs6OmNvbnNvbGU6Ok1hdGNoUXVvdGUgJVcgcHJvbXB0RW5kDQl9DSAgICB9DQ0gICAgYmluZCBQb3N0Q29uc29sZSA8S2V5UHJlc3M+IHsNCWlmIHsiJUEiICE9ICIifSB7DQkgICAgOjp0azo6Y29uc29sZTo6VGFnUHJvYyAlVw0JfQ0JYnJlYWsNICAgIH0NfQ0NIyB0a0NvbnNvbGVJbnNlcnQgLS0NIyBJbnNlcnQgYSBzdHJpbmcgaW50byBhIHRleHQgYXQgdGhlIHBvaW50IG9mIHRoZSBpbnNlcnRpb24gY3Vyc29yLg0jIElmIHRoZXJlIGlzIGEgc2VsZWN0aW9uIGluIHRoZSB0ZXh0LCBhbmQgaXQgY292ZXJzIHRoZSBwb2ludCBvZiB0aGUNIyBpbnNlcnRpb24gY3Vyc29yLCB0aGVuIGRlbGV0ZSB0aGUgc2VsZWN0aW9uIGJlZm9yZSBpbnNlcnRpbmcuICBJbnNlcnRpb24NIyBpcyByZXN0cmljdGVkIHRvIHRoZSBwcm9tcHQgYXJlYS4NIw0jIEFyZ3VtZW50czoNIyB3IC0JCVRoZSB0ZXh0IHdpbmRvdyBpbiB3aGljaCB0byBpbnNlcnQgdGhlIHN0cmluZw0jIHMgLQkJVGhlIHN0cmluZyB0byBpbnNlcnQgKHVzdWFsbHkganVzdCBhIHNpbmdsZSBjaGFyYWN0ZXIpDQ1wcm9jIHRrQ29uc29sZUluc2VydCB7dyBzfSB7DSAgICBpZiB7W3N0cmluZyBlcXVhbCAkcyAiIl19IHsNCXJldHVybg0gICAgfQ0gICAgY2F0Y2ggew0JaWYge1skdyBjb21wYXJlIHNlbC5maXJzdCA8PSBpbnNlcnRdDQkJJiYgWyR3IGNvbXBhcmUgc2VsLmxhc3QgPj0gaW5zZXJ0XX0gew0JICAgICR3IHRhZyByZW1vdmUgc2VsIHNlbC5maXJzdCBwcm9tcHRFbmQNCSAgICAkdyBkZWxldGUgc2VsLmZpcnN0IHNlbC5sYXN0DQl9DSAgICB9DSAgICBpZiB7WyR3IGNvbXBhcmUgaW5zZXJ0IDwgcHJvbXB0RW5kXX0gew0JJHcgbWFyayBzZXQgaW5zZXJ0IGVuZAkNICAgIH0NICAgICR3IGluc2VydCBpbnNlcnQgJHMge2lucHV0IHN0ZGlufQ0gICAgJHcgc2VlIGluc2VydA19DQ0jIHRrQ29uc29sZU91dHB1dCAtLQ0jDSMgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBkaXJlY3RseSBieSBDb25zb2xlUHV0c0NtZCB0byBjYXVzZSBhIHN0cmluZw0jIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgY29uc29sZS4NIw0jIEFyZ3VtZW50czoNIyBkZXN0IC0JVGhlIG91dHB1dCB0YWcgdG8gYmUgdXNlZDogZWl0aGVyICJzdGRlcnIiIG9yICJzdGRvdXQiLg0jIHN0cmluZyAtCVRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkLg0NcHJvYyB0a0NvbnNvbGVPdXRwdXQge2Rlc3Qgc3RyaW5nfSB7DSAgICBzZXQgdyAuY29uc29sZQ0gICAgJHcgaW5zZXJ0IG91dHB1dCAkc3RyaW5nICRkZXN0DSAgICA6OnRrOjpjb25zb2xlOjpDb25zdHJhaW5CdWZmZXIgJHcgJDo6dGs6OmNvbnNvbGU6Om1heExpbmVzDSAgICAkdyBzZWUgaW5zZXJ0DX0NDSMgdGtDb25zb2xlRXhpdCAtLQ0jDSMgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBDb25zb2xlRXZlbnRQcm9jIHdoZW4gdGhlIG1haW4gd2luZG93IG9mDSMgdGhlIGFwcGxpY2F0aW9uIGlzIGRlc3Ryb3llZC4gIERvbid0IGNhbGwgZXhpdCAtIHRoYXQgcHJvYmFibHkgYWxyZWFkeQ0jIGhhcHBlbmVkLiAgSnVzdCBkZWxldGUgb3VyIHdpbmRvdy4NIw0jIEFyZ3VtZW50czoNIyBOb25lLg0NcHJvYyB0a0NvbnNvbGVFeGl0IHt9IHsNICAgIGRlc3Ryb3kgLg19DQ0jIHRrQ29uc29sZUFib3V0IC0tDSMNIyBUaGlzIHJvdXRpbmUgZGlzcGxheXMgYW4gQWJvdXQgYm94IHRvIHNob3cgVGNsL1RrIHZlcnNpb24gaW5mby4NIw0jIEFyZ3VtZW50czoNIyBOb25lLg0NcHJvYyB0a0NvbnNvbGVBYm91dCB7fSB7DSAgICBnbG9iYWwgdGtfcGF0Y2hMZXZlbA0gICAgdGtfbWVzc2FnZUJveCAtdHlwZSBvayAtbWVzc2FnZSAiVGNsIGZvciBXaW5kb3dzDQ1UY2wgW2luZm8gcGF0Y2hsZXZlbF0NVGsgJHRrX3BhdGNoTGV2ZWwiDX0NDSMgOjp0azo6Y29uc29sZTo6VGFnUHJvYyAtLQ0jDSMgVGFncyBhIHByb2NlZHVyZSBpbiB0aGUgY29uc29sZSBpZiBpdCdzIHJlY29nbml6ZWQNIyBUaGlzIHByb2NlZHVyZSBpcyBub3QgcGVyZmVjdC4gIEhvd2V2ZXIsIG1ha2luZyBpdCBwZXJmZWN0IHdhc3Rlcw0jIHRvbyBtdWNoIENQVSB0aW1lLi4uDSMNIyBBcmd1bWVudHM6DSMJdwktIGNvbnNvbGUgdGV4dCB3aWRnZXQNDXByb2MgOjp0azo6Y29uc29sZTo6VGFnUHJvYyB3IHsNICAgIGlmIHshJDo6dGs6OmNvbnNvbGU6Om1hZ2ljS2V5c30geyByZXR1cm4gfQ0gICAgc2V0IGV4cCAiXFteXFxcXFxdXFtcWyBcdFxuXHJcO3t9XCJcJFxdIg0gICAgc2V0IGkgWyR3IHNlYXJjaCAtYmFja3dhcmRzIC1yZWdleHAgJGV4cCBpbnNlcnQtMWMgcHJvbXB0RW5kLTFjXQ0gICAgaWYgeyRpID09ICIifSB7c2V0IGkgcHJvbXB0RW5kfSBlbHNlIHthcHBlbmQgaSArMmN9DSAgICByZWdzdWIgLWFsbCAiXFtcW1xcXFxcXD9cXCpcXSIgWyR3IGdldCAkaSAiaW5zZXJ0LTFjIHdvcmRlbmQiXSB7XFxcMH0gYw0gICAgaWYge1tsbGVuZ3RoIFtFdmFsQXR0YWNoZWQgW2xpc3QgaW5mbyBjb21tYW5kcyAkY11dXX0gew0JJHcgdGFnIGFkZCBwcm9jICRpICJpbnNlcnQtMWMgd29yZGVuZCINICAgIH0gZWxzZSB7DQkkdyB0YWcgcmVtb3ZlIHByb2MgJGkgImluc2VydC0xYyB3b3JkZW5kIg0gICAgfQ0gICAgaWYge1tsbGVuZ3RoIFtFdmFsQXR0YWNoZWQgW2xpc3QgaW5mbyB2YXJzICRjXV1dfSB7DQkkdyB0YWcgYWRkIHZhciAkaSAiaW5zZXJ0LTFjIHdvcmRlbmQiDSAgICB9IGVsc2Ugew0JJHcgdGFnIHJlbW92ZSB2YXIgJGkgImluc2VydC0xYyB3b3JkZW5kIg0gICAgfQ19DQ0jIDo6dGs6OmNvbnNvbGU6Ok1hdGNoUGFpciAtLQ0jDSMgQmxpbmtzIGEgbWF0Y2hpbmcgcGFpciBvZiBjaGFyYWN0ZXJzDSMgYzIgaXMgYXNzdW1lZCB0byBiZSBhdCB0aGUgdGV4dCBpbmRleCAnaW5zZXJ0Jy4NIyBUaGlzIHByb2MgaXMgcmVhbGx5IGxvb3B5IGFuZCB0b29rIG1lIGFuIGhvdXIgdG8gZmlndXJlIG91dCBnaXZlbg0jIGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgd2l0aCBlc2NhcGluZyBleGNlcHQgZm9yIGVzY2FwZWQgXCdzLg0jIEl0IGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgcG9zc2libGUgY29tbWVudGluZy4uLiBPaCB3ZWxsLiAgSWYNIyBhbnlvbmUgaGFzIHNvbWV0aGluZyBiZXR0ZXIsIEknZCBsaWtlIHRvIHNlZS91c2UgaXQuICBUaGlzIGlzIHJlYWxseQ0jIG9ubHkgZWZmaWNpZW50IGZvciBzbWFsbCBjb250ZXh0cy4NIw0jIEFyZ3VtZW50czoNIwl3CS0gY29uc29sZSB0ZXh0IHdpZGdldA0jIAljMQktIGZpcnN0IGNoYXIgb2YgcGFpcg0jIAljMgktIHNlY29uZCBjaGFyIG9mIHBhaXINIw0jIENhbGxzOgk6OnRrOjpjb25zb2xlOjpCbGluaw0gDXByb2MgOjp0azo6Y29uc29sZTo6TWF0Y2hQYWlyIHt3IGMxIGMyIHtsaW0gMS4wfX0gew0gICAgaWYgeyEkOjp0azo6Y29uc29sZTo6bWFnaWNLZXlzfSB7IHJldHVybiB9DSAgICBpZiB7W3N0cmluZyBjb21wYXJlIHt9IFtzZXQgaXggWyR3IHNlYXJjaCAtYmFjayAkYzEgaW5zZXJ0ICRsaW1dXV19IHsNCXdoaWxlIHsNCSAgICBbc3RyaW5nIG1hdGNoIHtcXH0gWyR3IGdldCAkaXgtMWNdXSAmJg0JICAgIFtzdHJpbmcgY29tcGFyZSB7fSBbc2V0IGl4IFskdyBzZWFyY2ggLWJhY2sgJGMxICRpeC0xYyAkbGltXV1dDQl9IHt9DQlzZXQgaTEgaW5zZXJ0LTFjDQl3aGlsZSB7W3N0cmluZyBjb21wYXJlIHt9ICRpeF19IHsNCSAgICBzZXQgaTAgJGl4DQkgICAgc2V0IGogMA0JICAgIHdoaWxlIHtbc3RyaW5nIGNvbXBhcmUge30gW3NldCBpMCBbJHcgc2VhcmNoICRjMiAkaTAgJGkxXV1dfSB7DQkJYXBwZW5kIGkwICsxYw0JCWlmIHtbc3RyaW5nIG1hdGNoIHtcXH0gWyR3IGdldCAkaTAtMmNdXX0gY29udGludWUNCQlpbmNyIGoNCSAgICB9DQkgICAgaWYgeyEkan0gYnJlYWsNCSAgICBzZXQgaTEgJGl4DQkgICAgd2hpbGUgeyRqICYmIFtzdHJpbmcgY29tcGFyZSB7fSBcDQkJICAgIFtzZXQgaXggWyR3IHNlYXJjaCAtYmFjayAkYzEgJGl4ICRsaW1dXV19IHsNCQlpZiB7W3N0cmluZyBtYXRjaCB7XFx9IFskdyBnZXQgJGl4LTFjXV19IGNvbnRpbnVlDQkJaW5jciBqIC0xDQkgICAgfQ0JfQ0JaWYge1tzdHJpbmcgbWF0Y2gge30gJGl4XX0geyBzZXQgaXggWyR3IGluZGV4ICRsaW1dIH0NICAgIH0gZWxzZSB7IHNldCBpeCBbJHcgaW5kZXggJGxpbV0gfQ0gICAgaWYgeyQ6OnRrOjpjb25zb2xlOjpibGlua1JhbmdlfSB7DQlCbGluayAkdyAkaXggWyR3IGluZGV4IGluc2VydF0NICAgIH0gZWxzZSB7DQlCbGluayAkdyAkaXggJGl4KzFjIFskdyBpbmRleCBpbnNlcnQtMWNdIFskdyBpbmRleCBpbnNlcnRdDSAgICB9DX0NDSMgOjp0azo6Y29uc29sZTo6TWF0Y2hRdW90ZSAtLQ0jDSMgQmxpbmtzIGJldHdlZW4gbWF0Y2hpbmcgcXVvdGVzLg0jIEJsaW5rcyBqdXN0IHRoZSBxdW90ZSBpZiBpdCdzIHVubWF0Y2hlZCwgb3RoZXJ3aXNlIGJsaW5rcyBxdW90ZWQgc3RyaW5nDSMgVGhlIHF1b3RlIHRvIG1hdGNoIGlzIGFzc3VtZWQgdG8gYmUgYXQgdGhlIHRleHQgaW5kZXggJ2luc2VydCcuDSMNIyBBcmd1bWVudHM6DSMJdwktIGNvbnNvbGUgdGV4dCB3aWRnZXQNIw0jIENhbGxzOgk6OnRrOjpjb25zb2xlOjpCbGluaw0gDXByb2MgOjp0azo6Y29uc29sZTo6TWF0Y2hRdW90ZSB7dyB7bGltIDEuMH19IHsNICAgIGlmIHshJDo6dGs6OmNvbnNvbGU6Om1hZ2ljS2V5c30geyByZXR1cm4gfQ0gICAgc2V0IGkgaW5zZXJ0LTFjDSAgICBzZXQgaiAwDSAgICB3aGlsZSB7W3N0cmluZyBjb21wYXJlIFtzZXQgaSBbJHcgc2VhcmNoIC1iYWNrIFwiICRpICRsaW1dXSB7fV19IHsNCWlmIHtbc3RyaW5nIG1hdGNoIHtcXH0gWyR3IGdldCAkaS0xY11dfSBjb250aW51ZQ0JaWYgeyEkan0ge3NldCBpMCAkaX0NCWluY3Igag0gICAgfQ0gICAgaWYgeyRqJjF9IHsNCWlmIHskOjp0azo6Y29uc29sZTo6YmxpbmtSYW5nZX0gew0JICAgIEJsaW5rICR3ICRpMCBbJHcgaW5kZXggaW5zZXJ0XQ0JfSBlbHNlIHsNCSAgICBCbGluayAkdyAkaTAgJGkwKzFjIFskdyBpbmRleCBpbnNlcnQtMWNdIFskdyBpbmRleCBpbnNlcnRdDQl9DSAgICB9IGVsc2Ugew0JQmxpbmsgJHcgWyR3IGluZGV4IGluc2VydC0xY10gWyR3IGluZGV4IGluc2VydF0NICAgIH0NfQ0NIyA6OnRrOjpjb25zb2xlOjpCbGluayAtLQ0jDSMgQmxpbmtzIGJldHdlZW4gbiBpbmRleCBwYWlycyBmb3IgYSBzcGVjaWZpZWQgZHVyYXRpb24uDSMNIyBBcmd1bWVudHM6DSMJdwktIGNvbnNvbGUgdGV4dCB3aWRnZXQNIyAJaTEJLSBzdGFydCBpbmRleCB0byBibGluayByZWdpb24NIyAJaTIJLSBlbmQgaW5kZXggb2YgYmxpbmsgcmVnaW9uDSMgCWR1cgktIGR1cmF0aW9uIGluIHVzZWNzIHRvIGJsaW5rIGZvcg0jDSMgT3V0cHV0czoNIwlibGlua3Mgc2VsZWN0ZWQgY2hhcmFjdGVycyBpbiAkdw0NcHJvYyA6OnRrOjpjb25zb2xlOjpCbGluayB7dyBhcmdzfSB7DSAgICBldmFsIFtsaXN0ICR3IHRhZyBhZGQgYmxpbmtdICRhcmdzDSAgICBhZnRlciAkOjp0azo6Y29uc29sZTo6YmxpbmtUaW1lIFtsaXN0ICR3XSB0YWcgcmVtb3ZlIGJsaW5rICRhcmdzDX0NDSMgOjp0azo6Y29uc29sZTo6Q29uc3RyYWluQnVmZmVyIC0tDSMNIyBUaGlzIGxpbWl0cyB0aGUgYW1vdW50IG9mIGRhdGEgaW4gdGhlIHRleHQgd2lkZ2V0DSMgQ2FsbGVkIGJ5IFByb21wdCBhbmQgQ29uc29sZU91dHB1dA0jDSMgQXJndW1lbnRzOg0jCXcJLSBjb25zb2xlIHRleHQgd2lkZ2V0DSMJc2l6ZQktICMgb2YgbGluZXMgdG8gY29uc3RyYWluIHRvDSMNIyBPdXRwdXRzOg0jCW1heSBkZWxldGUgZGF0YSBpbiBjb25zb2xlIHdpZGdldA0NcHJvYyA6OnRrOjpjb25zb2xlOjpDb25zdHJhaW5CdWZmZXIge3cgc2l6ZX0gew0gICAgaWYge1skdyBpbmRleCBlbmRdID4gJHNpemV9IHsNCSR3IGRlbGV0ZSAxLjAgW2V4cHIge2ludChbJHcgaW5kZXggZW5kXSktJHNpemV9XS4wDSAgICB9DX0NDSMgOjp0azo6Y29uc29sZTo6RXhwYW5kIC0tDSMNIyBBcmd1bWVudHM6DSMgQVJHUzoJdwktIHRleHQgd2lkZ2V0IGluIHdoaWNoIHRvIGV4cGFuZCBzdHINIyAJdHlwZQktIHR5cGUgb2YgZXhwYW5zaW9uIChwYXRoIC8gcHJvYyAvIHZhcmlhYmxlKQ0jDSMgQ2FsbHM6CTo6dGs6OmNvbnNvbGU6OkV4cGFuZChQYXRobmFtZXxQcm9jbmFtZXxWYXJpYWJsZSkNIw0jIE91dHB1dHM6CVRoZSBzdHJpbmcgdG8gbWF0Y2ggaXMgZXhwYW5kZWQgdG8gdGhlIGxvbmdlc3QgcG9zc2libGUgbWF0Y2guDSMJCUlmIDo6dGs6OmNvbnNvbGU6OnNob3dNYXRjaGVzIGlzIG5vbi16ZXJvIGFuZCB0aGUgbG9uZ2VzdCBtYXRjaA0jCQllcXVhbGVkIHRoZSBzdHJpbmcgdG8gZXhwYW5kLCB0aGVuIGFsbCBwb3NzaWJsZSBtYXRjaGVzIGFyZQ0jCQlvdXRwdXQgdG8gc3Rkb3V0LiAgVHJpZ2dlcnMgYmVsbCBpZiBubyBtYXRjaGVzIGFyZSBmb3VuZC4NIw0jIFJldHVybnM6CW51bWJlciBvZiBtYXRjaGVzIGZvdW5kDQ1wcm9jIDo6dGs6OmNvbnNvbGU6OkV4cGFuZCB7dyB7dHlwZSAiIn19IHsNICAgIHNldCBleHAgIlxbXlxcXFxcXVxbXFsgXHRcblxyXFxce1wiXFxcXFwkXF0iDSAgICBzZXQgdG1wIFskdyBzZWFyY2ggLWJhY2t3YXJkcyAtcmVnZXhwICRleHAgaW5zZXJ0LTFjIHByb21wdEVuZC0xY10NICAgIGlmIHskdG1wID09ICIifSB7c2V0IHRtcCBwcm9tcHRFbmR9IGVsc2Uge2FwcGVuZCB0bXAgKzJjfQ0gICAgaWYge1skdyBjb21wYXJlICR0bXAgPj0gaW5zZXJ0XX0geyByZXR1cm4gfQ0gICAgc2V0IHN0ciBbJHcgZ2V0ICR0bXAgaW5zZXJ0XQ0gICAgc3dpdGNoIC1nbG9iICR0eXBlIHsNCXBhdGgqIHsgc2V0IHJlcyBbRXhwYW5kUGF0aG5hbWUgJHN0cl0gfQ0JcHJvYyogeyBzZXQgcmVzIFtFeHBhbmRQcm9jbmFtZSAkc3RyXSB9DQl2YXIqICB7IHNldCByZXMgW0V4cGFuZFZhcmlhYmxlICRzdHJdIH0NCWRlZmF1bHQgew0JICAgIHNldCByZXMge30NCSAgICBmb3JlYWNoIHQge1BhdGhuYW1lIFByb2NuYW1lIFZhcmlhYmxlfSB7DQkJaWYgeyFbY2F0Y2gge0V4cGFuZCR0ICRzdHJ9IHJlc10gJiYgKCRyZXMgIT0gIiIpfSB7IGJyZWFrIH0NCSAgICB9DQl9DSAgICB9DSAgICBzZXQgbGVuIFtsbGVuZ3RoICRyZXNdDSAgICBpZiB7JGxlbn0gew0Jc2V0IHJlcGwgW2xpbmRleCAkcmVzIDBdDQkkdyBkZWxldGUgJHRtcCBpbnNlcnQNCSR3IGluc2VydCAkdG1wICRyZXBsIHtpbnB1dCBzdGRpbn0NCWlmIHsoJGxlbiA+IDEpICYmICQ6OnRrOjpjb25zb2xlOjpzaG93TWF0Y2hlcyBcDQkJJiYgW3N0cmluZyBlcXVhbCAkcmVwbCAkc3RyXX0gew0JICAgIHB1dHMgc3Rkb3V0IFtsc29ydCBbbHJlcGxhY2UgJHJlcyAwIDBdXQ0JfQ0gICAgfSBlbHNlIHsgYmVsbCB9DSAgICByZXR1cm4gW2luY3IgbGVuIC0xXQ19DQ0jIyA6OnRrOjpjb25zb2xlOjpFeHBhbmRQYXRobmFtZSAtLQ0jDSMgRXhwYW5kIGEgZmlsZSBwYXRobmFtZSBiYXNlZCBvbiAkc3RyDSMgVGhpcyBpcyBiYXNlZCBvbiBVTklYIGZpbGUgbmFtZSBjb252ZW50aW9ucw0jDSMgQXJndW1lbnRzOg0jCXN0cgktIHBhcnRpYWwgZmlsZSBwYXRobmFtZSB0byBleHBhbmQNIw0jIENhbGxzOgk6OnRrOjpjb25zb2xlOjpFeHBhbmRCZXN0TWF0Y2gNIw0jIFJldHVybnM6CWxpc3QgY29udGFpbmluZyBsb25nZXN0IHVuaXF1ZSBtYXRjaCBmb2xsb3dlZCBieSBhbGwgdGhlDSMJCXBvc3NpYmxlIGZ1cnRoZXIgbWF0Y2hlcw0gDXByb2MgOjp0azo6Y29uc29sZTo6RXhwYW5kUGF0aG5hbWUgc3RyIHsNICAgIHNldCBwd2QgW0V2YWxBdHRhY2hlZCBwd2RdDSAgICBpZiB7W2NhdGNoIHtFdmFsQXR0YWNoZWQgW2xpc3QgY2QgW2ZpbGUgZGlybmFtZSAkc3RyXV19IGVycl19IHsNCXJldHVybiAtY29kZSBlcnJvciAkZXJyDSAgICB9DSAgICBzZXQgZGlyIFtmaWxlIHRhaWwgJHN0cl0NICAgICMjIENoZWNrIHRvIHNlZSBpZiBpdCB3YXMga25vd24gdG8gYmUgYSBkaXJlY3RvcnkgYW5kIGtlZXAgdGhlIHRyYWlsaW5nDSAgICAjIyBzbGFzaCBpZiBzbyAoZmlsZSB0YWlsIGN1dHMgaXQgb2ZmKQ0gICAgaWYge1tzdHJpbmcgbWF0Y2ggKi8gJHN0cl19IHsgYXBwZW5kIGRpciAvIH0NICAgIGlmIHtbY2F0Y2gge2xzb3J0IFtFdmFsQXR0YWNoZWQgW2xpc3QgZ2xvYiAkZGlyKl1dfSBtXX0gew0Jc2V0IG1hdGNoIHt9DSAgICB9IGVsc2Ugew0JaWYge1tsbGVuZ3RoICRtXSA+IDF9IHsNCSAgICBnbG9iYWwgdGNsX3BsYXRmb3JtDQkgICAgaWYge1tzdHJpbmcgbWF0Y2ggd2luZG93cyAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKV19IHsNCQkjIyBXaW5kb3dzIGlzIHNjcmV3eSBiZWNhdXNlIGl0J3MgY2FzZSBpbnNlbnNpdGl2ZQ0JCXNldCB0bXAgW0V4cGFuZEJlc3RNYXRjaCBbc3RyaW5nIHRvbG93ZXIgJG1dIFwNCQkJW3N0cmluZyB0b2xvd2VyICRkaXJdXQ0JCSMjIERvbid0IGNoYW5nZSBjYXNlIGlmIHdlIGhhdmVuJ3QgY2hhbmdlZCB0aGUgd29yZA0JCWlmIHtbc3RyaW5nIGxlbmd0aCAkZGlyXT09W3N0cmluZyBsZW5ndGggJHRtcF19IHsNCQkgICAgc2V0IHRtcCAkZGlyDQkJfQ0JICAgIH0gZWxzZSB7DQkJc2V0IHRtcCBbRXhwYW5kQmVzdE1hdGNoICRtICRkaXJdDQkgICAgfQ0JICAgIGlmIHtbc3RyaW5nIG1hdGNoID8qLyogJHN0cl19IHsNCQlzZXQgdG1wIFtmaWxlIGRpcm5hbWUgJHN0cl0vJHRtcA0JICAgIH0gZWxzZWlmIHtbc3RyaW5nIG1hdGNoIC8qICRzdHJdfSB7DQkJc2V0IHRtcCAvJHRtcA0JICAgIH0NCSAgICByZWdzdWIgLWFsbCB7IH0gJHRtcCB7XFwgfSB0bXANCSAgICBzZXQgbWF0Y2ggW2xpbnNlcnQgJG0gMCAkdG1wXQ0JfSBlbHNlIHsNCSAgICAjIyBUaGlzIG1heSBsb29rIGdvb2Z5LCBidXQgaXQgaGFuZGxlcyBzcGFjZXMgaW4gcGF0aCBuYW1lcw0JICAgIGV2YWwgYXBwZW5kIG1hdGNoICRtDQkgICAgaWYge1tmaWxlIGlzZGlyICRtYXRjaF19IHthcHBlbmQgbWF0Y2ggL30NCSAgICBpZiB7W3N0cmluZyBtYXRjaCA/Ki8qICRzdHJdfSB7DQkJc2V0IG1hdGNoIFtmaWxlIGRpcm5hbWUgJHN0cl0vJG1hdGNoDQkgICAgfSBlbHNlaWYge1tzdHJpbmcgbWF0Y2ggLyogJHN0cl19IHsNCQlzZXQgbWF0Y2ggLyRtYXRjaA0JICAgIH0NCSAgICByZWdzdWIgLWFsbCB7IH0gJG1hdGNoIHtcXCB9IG1hdGNoDQkgICAgIyMgV2h5IGlzIHRoaXMgb25lIG5lZWRlZCBhbmQgdGhlIG9uZXMgYmVsb3cgYXJlbid0ISENCSAgICBzZXQgbWF0Y2ggW2xpc3QgJG1hdGNoXQ0JfQ0gICAgfQ0gICAgRXZhbEF0dGFjaGVkIFtsaXN0IGNkICRwd2RdDSAgICByZXR1cm4gJG1hdGNoDX0NDSMgOjp0azo6Y29uc29sZTo6RXhwYW5kUHJvY25hbWUgLS0NIw0jIEV4cGFuZCBhIHRjbCBwcm9jIG5hbWUgYmFzZWQgb24gJHN0cg0jDSMgQXJndW1lbnRzOg0jCXN0cgktIHBhcnRpYWwgcHJvYyBuYW1lIHRvIGV4cGFuZA0jDSMgQ2FsbHM6CTo6dGs6OmNvbnNvbGU6OkV4cGFuZEJlc3RNYXRjaA0jDSMgUmV0dXJuczoJbGlzdCBjb250YWluaW5nIGxvbmdlc3QgdW5pcXVlIG1hdGNoIGZvbGxvd2VkIGJ5IGFsbCB0aGUNIwkJcG9zc2libGUgZnVydGhlciBtYXRjaGVzDQ1wcm9jIDo6dGs6OmNvbnNvbGU6OkV4cGFuZFByb2NuYW1lIHN0ciB7DSAgICBzZXQgbWF0Y2ggW0V2YWxBdHRhY2hlZCBbbGlzdCBpbmZvIGNvbW1hbmRzICRzdHIqXV0NICAgIGlmIHtbbGxlbmd0aCAkbWF0Y2hdID09IDB9IHsNCXNldCBucyBbRXZhbEF0dGFjaGVkIFwNCQkibmFtZXNwYWNlIGNoaWxkcmVuIFxbbmFtZXNwYWNlIGN1cnJlbnRcXSBbbGlzdCAkc3RyKl0iXQ0JaWYge1tsbGVuZ3RoICRuc109PTF9IHsNCSAgICBzZXQgbWF0Y2ggW0V2YWxBdHRhY2hlZCBbbGlzdCBpbmZvIGNvbW1hbmRzICR7bnN9OjoqXV0NCX0gZWxzZSB7DQkgICAgc2V0IG1hdGNoICRucw0JfQ0gICAgfQ0gICAgaWYge1tsbGVuZ3RoICRtYXRjaF0gPiAxfSB7DQlyZWdzdWIgLWFsbCB7IH0gW0V4cGFuZEJlc3RNYXRjaCAkbWF0Y2ggJHN0cl0ge1xcIH0gc3RyDQlzZXQgbWF0Y2ggW2xpbnNlcnQgJG1hdGNoIDAgJHN0cl0NICAgIH0gZWxzZSB7DQlyZWdzdWIgLWFsbCB7IH0gJG1hdGNoIHtcXCB9IG1hdGNoDSAgICB9DSAgICByZXR1cm4gJG1hdGNoDX0NDSMgOjp0azo6Y29uc29sZTo6RXhwYW5kVmFyaWFibGUgLS0NIw0jIEV4cGFuZCBhIHRjbCB2YXJpYWJsZSBuYW1lIGJhc2VkIG9uICRzdHINIw0jIEFyZ3VtZW50czoNIwlzdHIJLSBwYXJ0aWFsIHRjbCB2YXIgbmFtZSB0byBleHBhbmQNIw0jIENhbGxzOgk6OnRrOjpjb25zb2xlOjpFeHBhbmRCZXN0TWF0Y2gNIw0jIFJldHVybnM6CWxpc3QgY29udGFpbmluZyBsb25nZXN0IHVuaXF1ZSBtYXRjaCBmb2xsb3dlZCBieSBhbGwgdGhlDSMJCXBvc3NpYmxlIGZ1cnRoZXIgbWF0Y2hlcw0NcHJvYyA6OnRrOjpjb25zb2xlOjpFeHBhbmRWYXJpYWJsZSBzdHIgew0gICAgaWYge1tyZWdleHAgeyhbXlwoXSopXCgoLiopfSAkc3RyIGp1bmsgYXJ5IHN0cl19IHsNCSMjIExvb2tzIGxpa2UgdGhleSdyZSB0cnlpbmcgdG8gZXhwYW5kIGFuIGFycmF5Lg0Jc2V0IG1hdGNoIFtFdmFsQXR0YWNoZWQgW2xpc3QgYXJyYXkgbmFtZXMgJGFyeSAkc3RyKl1dDQlpZiB7W2xsZW5ndGggJG1hdGNoXSA+IDF9IHsNCSAgICBzZXQgdmFycyAkYXJ5XChbRXhwYW5kQmVzdE1hdGNoICRtYXRjaCAkc3RyXQ0JICAgIGZvcmVhY2ggdmFyICRtYXRjaCB7bGFwcGVuZCB2YXJzICRhcnlcKCR2YXJcKX0NCSAgICByZXR1cm4gJHZhcnMNCX0gZWxzZSB7c2V0IG1hdGNoICRhcnlcKCRtYXRjaFwpfQ0JIyMgU3BhY2UgdHJhbnNmb3JtYXRpb24gYXZvaWRlZCBmb3IgYXJyYXkgbmFtZXMuDSAgICB9IGVsc2Ugew0Jc2V0IG1hdGNoIFtFdmFsQXR0YWNoZWQgW2xpc3QgaW5mbyB2YXJzICRzdHIqXV0NCWlmIHtbbGxlbmd0aCAkbWF0Y2hdID4gMX0gew0JICAgIHJlZ3N1YiAtYWxsIHsgfSBbRXhwYW5kQmVzdE1hdGNoICRtYXRjaCAkc3RyXSB7XFwgfSBzdHINCSAgICBzZXQgbWF0Y2ggW2xpbnNlcnQgJG1hdGNoIDAgJHN0cl0NCX0gZWxzZSB7DQkgICAgcmVnc3ViIC1hbGwgeyB9ICRtYXRjaCB7XFwgfSBtYXRjaA0JfQ0gICAgfQ0gICAgcmV0dXJuICRtYXRjaA19DQ0jIDo6dGs6OmNvbnNvbGU6OkV4cGFuZEJlc3RNYXRjaCAtLQ0jDSMgRmluZHMgdGhlIGJlc3QgdW5pcXVlIG1hdGNoIGluIGEgbGlzdCBvZiBuYW1lcy4NIyBUaGUgZXh0cmEgJGUgaW4gdGhpcyBhcmd1bWVudCBhbGxvd3MgdXMgdG8gbGltaXQgdGhlIGlubmVybW9zdCBsb29wIGEgbGl0dGxlDSMgZnVydGhlci4gIFRoaXMgaW1wcm92ZXMgc3BlZWQgYXMgJGwgYmVjb21lcyBsYXJnZSBvciAkZSBiZWNvbWVzIGxvbmcuDSMNIyBBcmd1bWVudHM6DSMJbAktIGxpc3QgdG8gZmluZCBiZXN0IHVuaXF1ZSBtYXRjaCBpbg0jIAllCS0gY3VycmVudGx5IGJlc3Qga25vd24gdW5pcXVlIG1hdGNoDSMNIyBSZXR1cm5zOglsb25nZXN0IHVuaXF1ZSBtYXRjaCBpbiB0aGUgbGlzdA0NcHJvYyA6OnRrOjpjb25zb2xlOjpFeHBhbmRCZXN0TWF0Y2gge2wge2Uge319fSB7DSAgICBzZXQgZWMgW2xpbmRleCAkbCAwXQ0gICAgaWYge1tsbGVuZ3RoICRsXT4xfSB7DQlzZXQgZSAgW3N0cmluZyBsZW5ndGggJGVdOyBpbmNyIGUgLTENCXNldCBlaSBbc3RyaW5nIGxlbmd0aCAkZWNdOyBpbmNyIGVpIC0xDQlmb3JlYWNoIGwgJGwgew0JICAgIHdoaWxlIHskZWk+PSRlICYmIFtzdHJpbmcgZmlyc3QgJGVjICRsXX0gew0JCXNldCBlYyBbc3RyaW5nIHJhbmdlICRlYyAwIFtpbmNyIGVpIC0xXV0NCSAgICB9DQl9DSAgICB9DSAgICByZXR1cm4gJGVjDX0NDSMgbm93IGluaXRpYWxpemUgdGhlIGNvbnNvbGUNDXRrQ29uc29sZUluaXQNAAA7xSMgbXNnYm94LnRjbCAtLQ0jDSMJSW1wbGVtZW50cyBtZXNzYWdlYm94ZXMgZm9yIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBoYXZlIG5hdGl2ZQ0jCW1lc3NhZ2Vib3ggc3VwcG9ydC4NIw0jIFJDUzogQCgjKSAkSWQ6IG1zZ2JveC50Y2wsdiAxLjEwIDIwMDAvMDQvMTkgMDk6MjU6NTMgaG9iYnMgRXhwICQNIw0jIENvcHlyaWdodCAoYykgMTk5NC0xOTk3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4NIw0jIFNlZSB0aGUgZmlsZSAibGljZW5zZS50ZXJtcyIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbg0jIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuDSMNDSMgRW5zdXJlIGV4aXN0ZW5jZSBvZiA6OnRrOjpkaWFsb2cgbmFtZXNwYWNlDSMNbmFtZXNwYWNlIGV2YWwgOjp0azo6ZGlhbG9nIHt9DQ1pbWFnZSBjcmVhdGUgYml0bWFwIDo6dGs6OmRpYWxvZzo6YjEgLWZvcmVncm91bmQgYmxhY2sgXA0tZGF0YSAiI2RlZmluZSBiMV93aWR0aCAzMlxuI2RlZmluZSBiMV9oZWlnaHQgMzINc3RhdGljIHVuc2lnbmVkIGNoYXIgcTFfYml0c1tdID0gew0gICAweDAwLCAweGY4LCAweDFmLCAweDAwLCAweDAwLCAweDA3LCAweGUwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAweDAzLA0gICAweDIwLCAweDAwLCAweDAwLCAweDA0LCAweDEwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDEwLA0gICAweDA0LCAweDAwLCAweDAwLCAweDIwLCAweDAyLCAweDAwLCAweDAwLCAweDQwLCAweDAyLCAweDAwLCAweDAwLCAweDQwLA0gICAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDAxLCAweDAwLCAweDAwLCAweDgwLA0gICAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDAxLCAweDAwLCAweDAwLCAweDgwLA0gICAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDAyLCAweDAwLCAweDAwLCAweDQwLCAweDAyLCAweDAwLCAweDAwLCAweDQwLA0gICAweDA0LCAweDAwLCAweDAwLCAweDIwLCAweDA4LCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDA4LA0gICAweDYwLCAweDAwLCAweDAwLCAweDA0LCAweDgwLCAweDAzLCAweDgwLCAweDAzLCAweDAwLCAweDBjLCAweDc4LCAweDAwLA0gICAweDAwLCAweDMwLCAweDA0LCAweDAwLCAweDAwLCAweDQwLCAweDA0LCAweDAwLCAweDAwLCAweDQwLCAweDA0LCAweDAwLA0gICAweDAwLCAweDgwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLA0gICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsiDWltYWdlIGNyZWF0ZSBiaXRtYXAgOjp0azo6ZGlhbG9nOjpiMiAtZm9yZWdyb3VuZCB3aGl0ZSBcDS1kYXRhICIjZGVmaW5lIGIyX3dpZHRoIDMyXG4jZGVmaW5lIGIyX2hlaWdodCAzMg1zdGF0aWMgdW5zaWduZWQgY2hhciBiMl9iaXRzW10gPSB7DSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjgsIDB4MWYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsDSAgIDB4YzAsIDB4ZmYsIDB4ZmYsIDB4MDMsIDB4ZTAsIDB4ZmYsIDB4ZmYsIDB4MDcsIDB4ZjAsIDB4ZmYsIDB4ZmYsIDB4MGYsDSAgIDB4ZjgsIDB4ZmYsIDB4ZmYsIDB4MWYsIDB4ZmMsIDB4ZmYsIDB4ZmYsIDB4M2YsIDB4ZmMsIDB4ZmYsIDB4ZmYsIDB4M2YsDSAgIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4N2YsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4N2YsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4N2YsDSAgIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4N2YsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4N2YsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4N2YsDSAgIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4N2YsIDB4ZmMsIDB4ZmYsIDB4ZmYsIDB4M2YsIDB4ZmMsIDB4ZmYsIDB4ZmYsIDB4M2YsDSAgIDB4ZjgsIDB4ZmYsIDB4ZmYsIDB4MWYsIDB4ZjAsIDB4ZmYsIDB4ZmYsIDB4MGYsIDB4ZTAsIDB4ZmYsIDB4ZmYsIDB4MDcsDSAgIDB4ODAsIDB4ZmYsIDB4ZmYsIDB4MDMsIDB4MDAsIDB4ZmMsIDB4N2YsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDcsIDB4MDAsDSAgIDB4MDAsIDB4YzAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDMsIDB4MDAsDSAgIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OyINaW1hZ2UgY3JlYXRlIGJpdG1hcCA6OnRrOjpkaWFsb2c6OnEgLWZvcmVncm91bmQgYmx1ZSBcDS1kYXRhICIjZGVmaW5lIHFfd2lkdGggMzJcbiNkZWZpbmUgcV9oZWlnaHQgMzINc3RhdGljIHVuc2lnbmVkIGNoYXIgcV9iaXRzW10gPSB7DSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4MDcsIDB4MDAsDSAgIDB4MDAsIDB4MTAsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MWUsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MWUsIDB4MDAsDSAgIDB4MDAsIDB4MzgsIDB4MWUsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MGYsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDcsIDB4MDAsDSAgIDB4MDAsIDB4YzAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MDAsDSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4MDEsIDB4MDAsDSAgIDB4MDAsIDB4ZTAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OyINaW1hZ2UgY3JlYXRlIGJpdG1hcCA6OnRrOjpkaWFsb2c6OmkgLWZvcmVncm91bmQgYmx1ZSBcDS1kYXRhICIjZGVmaW5lIGlfd2lkdGggMzJcbiNkZWZpbmUgaV9oZWlnaHQgMzINc3RhdGljIHVuc2lnbmVkIGNoYXIgaV9iaXRzW10gPSB7DSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDSAgIDB4MDAsIDB4ZTAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDMsIDB4MDAsDSAgIDB4MDAsIDB4ZTAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDSAgIDB4MDAsIDB4ZjgsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4MDMsIDB4MDAsDSAgIDB4MDAsIDB4ZTAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4MDMsIDB4MDAsDSAgIDB4MDAsIDB4ZTAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDcsIDB4MDAsDSAgIDB4MDAsIDB4ZjgsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OyINaW1hZ2UgY3JlYXRlIGJpdG1hcCA6OnRrOjpkaWFsb2c6OncxIC1mb3JlZ3JvdW5kIGJsYWNrIFwNLWRhdGEgIiNkZWZpbmUgdzFfd2lkdGggMzJcbiNkZWZpbmUgdzFfaGVpZ2h0IDMyDXN0YXRpYyB1bnNpZ25lZCBjaGFyIHcxX2JpdHNbXSA9IHsNICAgMHgwMCwgMHg4MCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwNCwgMHgwMCwNICAgMHgwMCwgMHgxMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwNICAgMHgwMCwgMHgwOCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgyMCwgMHgwMCwNICAgMHgwMCwgMHgwMiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0MCwgMHgwMCwNICAgMHgwMCwgMHgwMSwgMHg4MCwgMHgwMCwgMHg4MCwgMHgwMCwgMHg4MCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMSwNICAgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMiwNICAgMHgyMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwOCwNICAgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgxMCwNICAgMHgwNCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg0MCwNICAgMHgwMSwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgyMCwNICAgMHhmYywgMHhmZiwgMHhmZiwgMHgxZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ig1pbWFnZSBjcmVhdGUgYml0bWFwIDo6dGs6OmRpYWxvZzo6dzIgLWZvcmVncm91bmQgeWVsbG93IFwNLWRhdGEgIiNkZWZpbmUgdzJfd2lkdGggMzJcbiNkZWZpbmUgdzJfaGVpZ2h0IDMyDXN0YXRpYyB1bnNpZ25lZCBjaGFyIHcyX2JpdHNbXSA9IHsNICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMSwgMHgwMCwgMHgwMCwgMHhjMCwgMHgwMywgMHgwMCwNICAgMHgwMCwgMHhlMCwgMHgwMywgMHgwMCwgMHgwMCwgMHhlMCwgMHgwNywgMHgwMCwgMHgwMCwgMHhmMCwgMHgwNywgMHgwMCwNICAgMHgwMCwgMHhmMCwgMHgwZiwgMHgwMCwgMHgwMCwgMHhmOCwgMHgwZiwgMHgwMCwgMHgwMCwgMHhmOCwgMHgxZiwgMHgwMCwNICAgMHgwMCwgMHhmYywgMHgxZiwgMHgwMCwgMHgwMCwgMHhmYywgMHgzZiwgMHgwMCwgMHgwMCwgMHhmZSwgMHgzZiwgMHgwMCwNICAgMHgwMCwgMHhmZSwgMHg3ZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHg3ZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwNICAgMHg4MCwgMHhmZiwgMHhmZiwgMHgwMCwgMHg4MCwgMHhmZiwgMHhmZiwgMHgwMSwgMHhjMCwgMHhmZiwgMHhmZiwgMHgwMSwNICAgMHhjMCwgMHhmZiwgMHhmZiwgMHgwMywgMHhlMCwgMHhmZiwgMHhmZiwgMHgwMywgMHhlMCwgMHhmZiwgMHhmZiwgMHgwNywNICAgMHhmMCwgMHhmZiwgMHhmZiwgMHgwNywgMHhmMCwgMHhmZiwgMHhmZiwgMHgwZiwgMHhmOCwgMHhmZiwgMHhmZiwgMHgwZiwNICAgMHhmOCwgMHhmZiwgMHhmZiwgMHgxZiwgMHhmYywgMHhmZiwgMHhmZiwgMHgxZiwgMHhmZSwgMHhmZiwgMHhmZiwgMHgzZiwNICAgMHhmZSwgMHhmZiwgMHhmZiwgMHgzZiwgMHhmZSwgMHhmZiwgMHhmZiwgMHgzZiwgMHhmYywgMHhmZiwgMHhmZiwgMHgxZiwNICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ig1pbWFnZSBjcmVhdGUgYml0bWFwIDo6dGs6OmRpYWxvZzo6dzMgLWZvcmVncm91bmQgYmxhY2sgXA0tZGF0YSAiI2RlZmluZSB3M193aWR0aCAzMlxuI2RlZmluZSB3M19oZWlnaHQgMzINc3RhdGljIHVuc2lnbmVkIGNoYXIgdzNfYml0c1tdID0gew0gICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0gICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0gICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0gICAweDAwLCAweGMwLCAweDAzLCAweDAwLCAweDAwLCAweGUwLCAweDA3LCAweDAwLCAweDAwLCAweGUwLCAweDA3LCAweDAwLA0gICAweDAwLCAweGUwLCAweDA3LCAweDAwLCAweDAwLCAweGUwLCAweDA3LCAweDAwLCAweDAwLCAweGUwLCAweDA3LCAweDAwLA0gICAweDAwLCAweGMwLCAweDAzLCAweDAwLCAweDAwLCAweGMwLCAweDAzLCAweDAwLCAweDAwLCAweGMwLCAweDAzLCAweDAwLA0gICAweDAwLCAweDgwLCAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDAxLCAweDAwLA0gICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAxLCAweDAwLCAweDAwLCAweGMwLCAweDAzLCAweDAwLA0gICAweDAwLCAweGMwLCAweDAzLCAweDAwLCAweDAwLCAweDgwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0gICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0gICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsiDQ0jIHRrTWVzc2FnZUJveCAtLQ0jDSMJUG9wcyB1cCBhIG1lc3NhZ2Vib3ggd2l0aCBhbiBhcHBsaWNhdGlvbi1zdXBwbGllZCBtZXNzYWdlIHdpdGgNIwlhbiBpY29uIGFuZCBhIGxpc3Qgb2YgYnV0dG9ucy4gVGhpcyBwcm9jZWR1cmUgd2lsbCBiZSBjYWxsZWQNIwlieSB0a19tZXNzYWdlQm94IGlmIHRoZSBwbGF0Zm9ybSBkb2VzIG5vdCBoYXZlIG5hdGl2ZQ0jCW1lc3NhZ2Vib3ggc3VwcG9ydCwgb3IgaWYgdGhlIHBhcnRpY3VsYXIgdHlwZSBvZiBtZXNzYWdlYm94IGlzDSMJbm90IHN1cHBvcnRlZCBuYXRpdmVseS4NIw0jCUNvbG9yIGljb25zIGFyZSB1c2VkIG9uIFVuaXggZGlzcGxheXMgdGhhdCBoYXZlIGEgY29sb3INIwlkZXB0aCBvZiA0IG9yIG1vcmUgYW5kICR0a19zdHJpY3RNb3RpZiBpcyBub3Qgb24uDSMNIwlUaGlzIHByb2NlZHVyZSBpcyBhIHByaXZhdGUgcHJvY2VkdXJlIHNob3VsZG4ndCBiZSBjYWxsZWQNIwlkaXJlY3RseS4gQ2FsbCB0a19tZXNzYWdlQm94IGluc3RlYWQuDSMNIwlTZWUgdGhlIHVzZXIgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbiB3aGF0IHRrX21lc3NhZ2VCb3ggZG9lcy4NIw1wcm9jIHRrTWVzc2FnZUJveCB7YXJnc30gew0gICAgZ2xvYmFsIHRrUHJpdiB0Y2xfcGxhdGZvcm0gdGtfc3RyaWN0TW90aWYNDSAgICBzZXQgdyB0a1ByaXZNc2dCb3gNICAgIHVwdmFyICMwICR3IGRhdGENDSAgICAjDSAgICAjIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSB0aXRsZSBpcyBzcGFjZSAoIiAiKSBub3QgdGhlIGVtcHR5IHN0cmluZw0gICAgIyBiZWNhdXNlIGZvciBzb21lIHdpbmRvdyBtYW5hZ2VycywgYSANICAgICMJCXdtIHRpdGxlIC5mb28gIiINICAgICMgY2F1c2VzIHRoZSB3aW5kb3cgdGl0bGUgdG8gYmUgImZvbyIgaW5zdGVhZCBvZiB0aGUgZW1wdHkgc3RyaW5nLg0gICAgIw0gICAgc2V0IHNwZWNzIHsNCXstZGVmYXVsdCAiIiAiIiAiIn0NICAgICAgICB7LWljb24gIiIgIiIgImluZm8ifQ0gICAgICAgIHstbWVzc2FnZSAiIiAiIiAiIn0NICAgICAgICB7LXBhcmVudCAiIiAiIiAufQ0gICAgICAgIHstdGl0bGUgIiIgIiIgIiAifQ0gICAgICAgIHstdHlwZSAiIiAiIiAib2sifQ0gICAgfQ0NICAgIHRjbFBhcnNlQ29uZmlnU3BlYyAkdyAkc3BlY3MgIiIgJGFyZ3MNDSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0IHtpbmZvIHdhcm5pbmcgZXJyb3IgcXVlc3Rpb259ICRkYXRhKC1pY29uKV0gPT0gLTF9IHsNCWVycm9yICJiYWQgLWljb24gdmFsdWUgXCIkZGF0YSgtaWNvbilcIjogbXVzdCBiZSBlcnJvciwgaW5mbywgcXVlc3Rpb24sIG9yIHdhcm5pbmciDSAgICB9DSAgICBpZiB7W3N0cmluZyBlcXVhbCAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAibWFjaW50b3NoIl19IHsNCXN3aXRjaCAtLSAkZGF0YSgtaWNvbikgew0JICAgICJlcnJvciIgICAgIHtzZXQgZGF0YSgtaWNvbikgInN0b3AifQ0JICAgICJ3YXJuaW5nIiAgIHtzZXQgZGF0YSgtaWNvbikgImNhdXRpb24ifQ0JICAgICJpbmZvIiAgICAgIHtzZXQgZGF0YSgtaWNvbikgIm5vdGUifQ0JfQ0gICAgfQ0NICAgIGlmIHshW3dpbmZvIGV4aXN0cyAkZGF0YSgtcGFyZW50KV19IHsNCWVycm9yICJiYWQgd2luZG93IHBhdGggbmFtZSBcIiRkYXRhKC1wYXJlbnQpXCIiDSAgICB9DQ0gICAgc3dpdGNoIC0tICRkYXRhKC10eXBlKSB7DQlhYm9ydHJldHJ5aWdub3JlIHsNCSAgICBzZXQgYnV0dG9ucyB7DQkJe2Fib3J0ICAtd2lkdGggNiAtdGV4dCBBYm9ydCAtdW5kZXIgMH0NCQl7cmV0cnkgIC13aWR0aCA2IC10ZXh0IFJldHJ5IC11bmRlciAwfQ0JCXtpZ25vcmUgLXdpZHRoIDYgLXRleHQgSWdub3JlIC11bmRlciAwfQ0JICAgIH0NCX0NCW9rIHsNCSAgICBzZXQgYnV0dG9ucyB7DQkJe29rIC13aWR0aCA2IC10ZXh0IE9LIC11bmRlciAwfQ0JICAgIH0NCSAgICBpZiB7W3N0cmluZyBlcXVhbCAkZGF0YSgtZGVmYXVsdCkgIiJdfSB7DQkJc2V0IGRhdGEoLWRlZmF1bHQpICJvayINCSAgICB9DQl9DQlva2NhbmNlbCB7DQkgICAgc2V0IGJ1dHRvbnMgew0JCXtvayAgICAgLXdpZHRoIDYgLXRleHQgT0sgICAgIC11bmRlciAwfQ0JCXtjYW5jZWwgLXdpZHRoIDYgLXRleHQgQ2FuY2VsIC11bmRlciAwfQ0JICAgIH0NCX0NCXJldHJ5Y2FuY2VsIHsNCSAgICBzZXQgYnV0dG9ucyB7DQkJe3JldHJ5ICAtd2lkdGggNiAtdGV4dCBSZXRyeSAgLXVuZGVyIDB9DQkJe2NhbmNlbCAtd2lkdGggNiAtdGV4dCBDYW5jZWwgLXVuZGVyIDB9DQkgICAgfQ0JfQ0JeWVzbm8gew0JICAgIHNldCBidXR0b25zIHsNCQl7eWVzICAgIC13aWR0aCA2IC10ZXh0IFllcyAtdW5kZXIgMH0NCQl7bm8gICAgIC13aWR0aCA2IC10ZXh0IE5vICAtdW5kZXIgMH0NCSAgICB9DQl9DQl5ZXNub2NhbmNlbCB7DQkgICAgc2V0IGJ1dHRvbnMgew0JCXt5ZXMgICAgLXdpZHRoIDYgLXRleHQgWWVzIC11bmRlciAwfQ0JCXtubyAgICAgLXdpZHRoIDYgLXRleHQgTm8gIC11bmRlciAwfQ0JCXtjYW5jZWwgLXdpZHRoIDYgLXRleHQgQ2FuY2VsIC11bmRlciAwfQ0JICAgIH0NCX0NCWRlZmF1bHQgew0JICAgIGVycm9yICJiYWQgLXR5cGUgdmFsdWUgXCIkZGF0YSgtdHlwZSlcIjogbXVzdCBiZSBhYm9ydHJldHJ5aWdub3JlLCBvaywgb2tjYW5jZWwsIHJldHJ5Y2FuY2VsLCB5ZXNubywgb3IgeWVzbm9jYW5jZWwiDQl9DSAgICB9DQ0gICAgaWYge1tzdHJpbmcgY29tcGFyZSAkZGF0YSgtZGVmYXVsdCkgIiJdfSB7DQlzZXQgdmFsaWQgMA0JZm9yZWFjaCBidG4gJGJ1dHRvbnMgew0JICAgIGlmIHtbc3RyaW5nIGVxdWFsIFtsaW5kZXggJGJ0biAwXSAkZGF0YSgtZGVmYXVsdCldfSB7DQkJc2V0IHZhbGlkIDENCQlicmVhaw0JICAgIH0NCX0NCWlmIHshJHZhbGlkfSB7DQkgICAgZXJyb3IgImludmFsaWQgZGVmYXVsdCBidXR0b24gXCIkZGF0YSgtZGVmYXVsdClcIiINCX0NICAgIH0NDSAgICAjIDIuIFNldCB0aGUgZGlhbG9nIHRvIGJlIGEgY2hpbGQgd2luZG93IG9mICRwYXJlbnQNICAgICMNICAgICMNICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJGRhdGEoLXBhcmVudCkgLl19IHsNCXNldCB3ICRkYXRhKC1wYXJlbnQpLl9fdGtfX21lc3NhZ2Vib3gNICAgIH0gZWxzZSB7DQlzZXQgdyAuX190a19fbWVzc2FnZWJveA0gICAgfQ0NICAgICMgMy4gQ3JlYXRlIHRoZSB0b3AtbGV2ZWwgd2luZG93IGFuZCBkaXZpZGUgaXQgaW50byB0b3ANICAgICMgYW5kIGJvdHRvbSBwYXJ0cy4NDSAgICBjYXRjaCB7ZGVzdHJveSAkd30NICAgIHRvcGxldmVsICR3IC1jbGFzcyBEaWFsb2cNICAgIHdtIHRpdGxlICR3ICRkYXRhKC10aXRsZSkNICAgIHdtIGljb25uYW1lICR3IERpYWxvZw0gICAgd20gcHJvdG9jb2wgJHcgV01fREVMRVRFX1dJTkRPVyB7IH0NDSAgICAjIE1lc3NhZ2UgYm94ZXMgc2hvdWxkIGJlIHRyYW5zaWVudCB3aXRoIHJlc3BlY3QgdG8gdGhlaXIgcGFyZW50IHNvIHRoYXQNICAgICMgdGhleSBhbHdheXMgc3RheSBvbiB0b3Agb2YgdGhlIHBhcmVudCB3aW5kb3cuICBCdXQgc29tZSB3aW5kb3cgbWFuYWdlcnMNICAgICMgd2lsbCBzaW1wbHkgY3JlYXRlIHRoZSBjaGlsZCB3aW5kb3cgYXMgd2l0aGRyYXduIGlmIHRoZSBwYXJlbnQgaXMgbm90DSAgICAjIHZpZXdhYmxlIChiZWNhdXNlIGl0IGlzIHdpdGhkcmF3biBvciBpY29uaWZpZWQpLiAgVGhpcyBpcyBub3QgZ29vZCBmb3INICAgICMgImdyYWIiYmVkIHdpbmRvd3MuICBTbyBvbmx5IG1ha2UgdGhlIG1lc3NhZ2UgYm94IHRyYW5zaWVudCBpZiB0aGUgcGFyZW50DSAgICAjIGlzIHZpZXdhYmxlLg0gICAgIw0gICAgaWYgeyBbd2luZm8gdmlld2FibGUgW3dpbmZvIHRvcGxldmVsICRkYXRhKC1wYXJlbnQpXV0gfSB7DQl3bSB0cmFuc2llbnQgJHcgJGRhdGEoLXBhcmVudCkNICAgIH0gICAgDQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIm1hY2ludG9zaCJdfSB7DQl1bnN1cHBvcnRlZDEgc3R5bGUgJHcgZEJveFByb2MNICAgIH0NDSAgICBmcmFtZSAkdy5ib3QNICAgIHBhY2sgJHcuYm90IC1zaWRlIGJvdHRvbSAtZmlsbCBib3RoDSAgICBmcmFtZSAkdy50b3ANICAgIHBhY2sgJHcudG9wIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQ0gICAgaWYge1tzdHJpbmcgY29tcGFyZSAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAibWFjaW50b3NoIl19IHsNCSR3LmJvdCBjb25maWd1cmUgLXJlbGllZiByYWlzZWQgLWJkIDENCSR3LnRvcCBjb25maWd1cmUgLXJlbGllZiByYWlzZWQgLWJkIDENICAgIH0NDSAgICAjIDQuIEZpbGwgdGhlIHRvcCBwYXJ0IHdpdGggYml0bWFwIGFuZCBtZXNzYWdlICh1c2UgdGhlIG9wdGlvbg0gICAgIyBkYXRhYmFzZSBmb3IgLXdyYXBsZW5ndGggYW5kIC1mb250IHNvIHRoYXQgdGhleSBjYW4gYmUNICAgICMgb3ZlcnJpZGRlbiBieSB0aGUgY2FsbGVyKS4NDSAgICBvcHRpb24gYWRkICpEaWFsb2cubXNnLndyYXBMZW5ndGggM2kgd2lkZ2V0RGVmYXVsdA0gICAgaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIm1hY2ludG9zaCJdfSB7DQlvcHRpb24gYWRkICpEaWFsb2cubXNnLmZvbnQgc3lzdGVtIHdpZGdldERlZmF1bHQNICAgIH0gZWxzZSB7DQlvcHRpb24gYWRkICpEaWFsb2cubXNnLmZvbnQge1RpbWVzIDE4fSB3aWRnZXREZWZhdWx0DSAgICB9DQ0gICAgbGFiZWwgJHcubXNnIC1hbmNob3IgbncgLWp1c3RpZnkgbGVmdCAtdGV4dCAkZGF0YSgtbWVzc2FnZSkNICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJGRhdGEoLWljb24pICIiXX0gew0JaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIm1hY2ludG9zaCJdIFwNCQl8fCAoW3dpbmZvIGRlcHRoICR3XSA8IDQpIHx8ICR0a19zdHJpY3RNb3RpZn0gew0JICAgIGxhYmVsICR3LmJpdG1hcCAtYml0bWFwICRkYXRhKC1pY29uKQ0JfSBlbHNlIHsNCSAgICBjYW52YXMgJHcuYml0bWFwIC13aWR0aCAzMiAtaGVpZ2h0IDMyIC1oaWdobGlnaHR0aGlja25lc3MgMA0JICAgIHN3aXRjaCAkZGF0YSgtaWNvbikgew0JCWVycm9yIHsNCQkgICAgJHcuYml0bWFwIGNyZWF0ZSBvdmFsIDAgMCAzMSAzMSAtZmlsbCByZWQgLW91dGxpbmUgYmxhY2sNCQkgICAgJHcuYml0bWFwIGNyZWF0ZSBsaW5lIDkgOSAyMyAyMyAtZmlsbCB3aGl0ZSAtd2lkdGggNA0JCSAgICAkdy5iaXRtYXAgY3JlYXRlIGxpbmUgOSAyMyAyMyA5IC1maWxsIHdoaXRlIC13aWR0aCA0DQkJfQ0JCWluZm8gew0JCSAgICAkdy5iaXRtYXAgY3JlYXRlIGltYWdlIDAgMCAtYW5jaG9yIG53IFwNCQkJICAgIC1pbWFnZSA6OnRrOjpkaWFsb2c6OmIxDQkJICAgICR3LmJpdG1hcCBjcmVhdGUgaW1hZ2UgMCAwIC1hbmNob3IgbncgXA0JCQkgICAgLWltYWdlIDo6dGs6OmRpYWxvZzo6YjINCQkgICAgJHcuYml0bWFwIGNyZWF0ZSBpbWFnZSAwIDAgLWFuY2hvciBudyBcDQkJCSAgICAtaW1hZ2UgOjp0azo6ZGlhbG9nOjppDQkJfQ0JCXF1ZXN0aW9uIHsNCQkgICAgJHcuYml0bWFwIGNyZWF0ZSBpbWFnZSAwIDAgLWFuY2hvciBudyBcDQkJCSAgICAtaW1hZ2UgOjp0azo6ZGlhbG9nOjpiMQ0JCSAgICAkdy5iaXRtYXAgY3JlYXRlIGltYWdlIDAgMCAtYW5jaG9yIG53IFwNCQkJICAgIC1pbWFnZSA6OnRrOjpkaWFsb2c6OmIyDQkJICAgICR3LmJpdG1hcCBjcmVhdGUgaW1hZ2UgMCAwIC1hbmNob3IgbncgXA0JCQkgICAgLWltYWdlIDo6dGs6OmRpYWxvZzo6cQ0JCX0NCQlkZWZhdWx0IHsNCQkgICAgJHcuYml0bWFwIGNyZWF0ZSBpbWFnZSAwIDAgLWFuY2hvciBudyBcDQkJCSAgICAtaW1hZ2UgOjp0azo6ZGlhbG9nOjp3MQ0JCSAgICAkdy5iaXRtYXAgY3JlYXRlIGltYWdlIDAgMCAtYW5jaG9yIG53IFwNCQkJICAgIC1pbWFnZSA6OnRrOjpkaWFsb2c6OncyDQkJICAgICR3LmJpdG1hcCBjcmVhdGUgaW1hZ2UgMCAwIC1hbmNob3IgbncgXA0JCQkgICAgLWltYWdlIDo6dGs6OmRpYWxvZzo6dzMNCQl9DQkgICAgfQ0JfQ0gICAgfQ0gICAgZ3JpZCAkdy5iaXRtYXAgJHcubXNnIC1pbiAkdy50b3AgLXN0aWNreSBuZXdzIC1wYWR4IDJtIC1wYWR5IDJtDSAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdy50b3AgMSAtd2VpZ2h0IDENICAgIGdyaWQgcm93Y29uZmlndXJlICR3LnRvcCAwIC13ZWlnaHQgMQ0NICAgICMgNS4gQ3JlYXRlIGEgcm93IG9mIGJ1dHRvbnMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZGlhbG9nLg0NICAgIHNldCBpIDANICAgIGZvcmVhY2ggYnV0ICRidXR0b25zIHsNCXNldCBuYW1lIFtsaW5kZXggJGJ1dCAwXQ0Jc2V0IG9wdHMgW2xyYW5nZSAkYnV0IDEgZW5kXQ0JaWYgeyFbbGxlbmd0aCAkb3B0c119IHsNCSAgICAjIENhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlciBvZiAkbmFtZQ0JICAgIHNldCBjYXBOYW1lIFtzdHJpbmcgdG91cHBlciAkbmFtZSAwXQ0JICAgIHNldCBvcHRzIFtsaXN0IC10ZXh0ICRjYXBOYW1lXQ0JfQ0NCWV2YWwgYnV0dG9uIFtsaXN0ICR3LiRuYW1lXSAkb3B0cyBbbGlzdCAtY29tbWFuZCBbbGlzdCBzZXQgdGtQcml2KGJ1dHRvbikgJG5hbWVdXQ0NCWlmIHtbc3RyaW5nIGVxdWFsICRuYW1lICRkYXRhKC1kZWZhdWx0KV19IHsNCSAgICAkdy4kbmFtZSBjb25maWd1cmUgLWRlZmF1bHQgYWN0aXZlDQl9DQlwYWNrICR3LiRuYW1lIC1pbiAkdy5ib3QgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLXBhZHggM20gLXBhZHkgMm0NDQkjIGNyZWF0ZSB0aGUgYmluZGluZyBmb3IgdGhlIGtleSBhY2NlbGVyYXRvciwgYmFzZWQgb24gdGhlIHVuZGVybGluZQ0JIw0Jc2V0IHVuZGVySWR4IFskdy4kbmFtZSBjZ2V0IC11bmRlcl0NCWlmIHskdW5kZXJJZHggPj0gMH0gew0JICAgIHNldCBrZXkgW3N0cmluZyBpbmRleCBbJHcuJG5hbWUgY2dldCAtdGV4dF0gJHVuZGVySWR4XQ0JICAgIGJpbmQgJHcgPEFsdC1bc3RyaW5nIHRvbG93ZXIgJGtleV0+ICBbbGlzdCAkdy4kbmFtZSBpbnZva2VdDQkgICAgYmluZCAkdyA8QWx0LVtzdHJpbmcgdG91cHBlciAka2V5XT4gIFtsaXN0ICR3LiRuYW1lIGludm9rZV0NCX0NCWluY3IgaQ0gICAgfQ0NICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUge30gJGRhdGEoLWRlZmF1bHQpXX0gew0JYmluZCAkdyA8Rm9jdXNJbj4gew0JICAgIGlmIHtbc3RyaW5nIGVxdWFsIEJ1dHRvbiBbd2luZm8gY2xhc3MgJVddXX0gew0JCSVXIGNvbmZpZ3VyZSAtZGVmYXVsdCBhY3RpdmUNCSAgICB9DQl9DQliaW5kICR3IDxGb2N1c091dD4gew0JICAgIGlmIHtbc3RyaW5nIGVxdWFsIEJ1dHRvbiBbd2luZm8gY2xhc3MgJVddXX0gew0JCSVXIGNvbmZpZ3VyZSAtZGVmYXVsdCBub3JtYWwNCSAgICB9DQl9DSAgICB9DQ0gICAgIyA2LiBDcmVhdGUgYSBiaW5kaW5nIGZvciA8UmV0dXJuPiBvbiB0aGUgZGlhbG9nDQ0gICAgYmluZCAkdyA8UmV0dXJuPiB7DQlpZiB7W3N0cmluZyBlcXVhbCBCdXR0b24gW3dpbmZvIGNsYXNzICVXXV19IHsNCSAgICB0a0J1dHRvbkludm9rZSAlVw0JfQ0gICAgfQ0NICAgICMgNy4gV2l0aGRyYXcgdGhlIHdpbmRvdywgdGhlbiB1cGRhdGUgYWxsIHRoZSBnZW9tZXRyeSBpbmZvcm1hdGlvbg0gICAgIyBzbyB3ZSBrbm93IGhvdyBiaWcgaXQgd2FudHMgdG8gYmUsIHRoZW4gY2VudGVyIHRoZSB3aW5kb3cgaW4gdGhlDSAgICAjIGRpc3BsYXkgYW5kIGRlLWljb25pZnkgaXQuDQ0gICAgOjp0azo6UGxhY2VXaW5kb3cgJHcgd2lkZ2V0ICRkYXRhKC1wYXJlbnQpDQ0gICAgIyA4LiBTZXQgYSBncmFiIGFuZCBjbGFpbSB0aGUgZm9jdXMgdG9vLg0NICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJGRhdGEoLWRlZmF1bHQpICIiXX0gew0Jc2V0IGZvY3VzICR3LiRkYXRhKC1kZWZhdWx0KQ0gICAgfSBlbHNlIHsNCXNldCBmb2N1cyAkdw0gICAgfQ0gICAgOjp0azo6U2V0Rm9jdXNHcmFiICR3ICRmb2N1cw0NICAgICMgOS4gV2FpdCBmb3IgdGhlIHVzZXIgdG8gcmVzcG9uZCwgdGhlbiByZXN0b3JlIHRoZSBmb2N1cyBhbmQNICAgICMgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgYnV0dG9uLiAgUmVzdG9yZSB0aGUgZm9jdXMNICAgICMgYmVmb3JlIGRlbGV0aW5nIHRoZSB3aW5kb3csIHNpbmNlIG90aGVyd2lzZSB0aGUgd2luZG93IG1hbmFnZXINICAgICMgbWF5IHRha2UgdGhlIGZvY3VzIGF3YXkgc28gd2UgY2FuJ3QgcmVkaXJlY3QgaXQuICBGaW5hbGx5LA0gICAgIyByZXN0b3JlIGFueSBncmFiIHRoYXQgd2FzIGluIGVmZmVjdC4NDSAgICB0a3dhaXQgdmFyaWFibGUgdGtQcml2KGJ1dHRvbikNDSAgICA6OnRrOjpSZXN0b3JlRm9jdXNHcmFiICR3ICRmb2N1cw0NICAgIHJldHVybiAkdGtQcml2KGJ1dHRvbikNfQ0AAB0CIyBjb21kbGcudGNsIC0tDSMNIwlTb21lIGZ1bmN0aW9ucyBuZWVkZWQgZm9yIHRoZSBjb21tb24gZGlhbG9nIGJveGVzLiBQcm9iYWJseSBuZWVkIHRvIGdvDSMJaW4gYSBkaWZmZXJlbnQgZmlsZS4NIw0jIFJDUzogQCgjKSAkSWQ6IGNvbWRsZy50Y2wsdiAxLjcgMjAwMC8wNC8wOCAwNjo1OToyOCBob2JicyBFeHAgJA0jDSMgQ29weXJpZ2h0IChjKSAxOTk2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4NIw0jIFNlZSB0aGUgZmlsZSAibGljZW5zZS50ZXJtcyIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbg0jIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuDSMNDSMgdGNsUGFyc2VDb25maWdTcGVjIC0tDSMNIwlQYXJzZXMgYSBsaXN0IG9mICItb3B0aW9uIHZhbHVlIiBwYWlycy4gSWYgYWxsIG9wdGlvbnMgYW5kDSMJdmFsdWVzIGFyZSBsZWdhbCwgdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGluDSMJJGRhdGEoJG9wdGlvbikuIE90aGVyd2lzZSBhbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLiBXaGVuDSMJYW4gZXJyb3IgaGFwcGVucywgdGhlIGRhdGEoKSBhcnJheSBtYXkgaGF2ZSBiZWVuIHBhcnRpYWxseQ0jCW1vZGlmaWVkLCBidXQgYWxsIHRoZSBtb2RpZmllZCBtZW1iZXJzIG9mIHRoZSBkYXRhKDAgYXJyYXkgYXJlDSMJZ3VhcmFudGVlZCB0byBoYXZlIHZhbGlkIHZhbHVlcy4gVGhpcyBpcyBkaWZmZXJlbnQgdGhhbg0jCVRrX0NvbmZpZ3VyZVdpZGdldCgpIHdoaWNoIGRvZXMgbm90IG1vZGlmeSB0aGUgdmFsdWUgb2YgYQ0jCXdpZGdldCByZWNvcmQgaWYgYW55IGVycm9yIG9jY3Vycy4NIw0jIEFyZ3VtZW50czoNIw0jIHcgPSB3aWRnZXQgcmVjb3JkIHRvIG1vZGlmeS4gTXVzdCBiZSB0aGUgcGF0aG5hbWUgb2YgYSB3aWRnZXQuDSMNIyBzcGVjcyA9IHsNIyAgICB7LWNvbW1hbmRsaW5lc3dpdGNoIHJlc291cmNlTmFtZSBSZXNvdXJjZUNsYXNzIGRlZmF1bHRWYWx1ZSB2ZXJpZmllcn0NIyAgICB7Li4uLn0NIyB9DSMNIyBmbGFncyA9IGN1cnJlbnRseSB1bnVzZWQuDSMNIyBhcmdMaXN0ID0gVGhlIGxpc3Qgb2YgICItb3B0aW9uIHZhbHVlIiBwYWlycy4NIw1wcm9jIHRjbFBhcnNlQ29uZmlnU3BlYyB7dyBzcGVjcyBmbGFncyBhcmdMaXN0fSB7DSAgICB1cHZhciAjMCAkdyBkYXRhDQ0gICAgIyAxOiBQdXQgdGhlIHNwZWNzIGluIGFzc29jaWF0aXZlIGFycmF5cyBmb3IgZmFzdGVyIGFjY2Vzcw0gICAgIw0gICAgZm9yZWFjaCBzcGVjICRzcGVjcyB7DQlpZiB7W2xsZW5ndGggJHNwZWNdIDwgNH0gew0JICAgIGVycm9yICJcInNwZWNcIiBzaG91bGQgY29udGFpbiA1IG9yIDQgZWxlbWVudHMiDQl9DQlzZXQgY21kc3cgW2xpbmRleCAkc3BlYyAwXQ0Jc2V0IGNtZCgkY21kc3cpICIiDQlzZXQgcm5hbWUoJGNtZHN3KSAgIFtsaW5kZXggJHNwZWMgMV0NCXNldCByY2xhc3MoJGNtZHN3KSAgW2xpbmRleCAkc3BlYyAyXQ0Jc2V0IGRlZigkY21kc3cpICAgICBbbGluZGV4ICRzcGVjIDNdDQlzZXQgdmVycHJvYygkY21kc3cpIFtsaW5kZXggJHNwZWMgNF0NICAgIH0NDSAgICBpZiB7W2xsZW5ndGggJGFyZ0xpc3RdICYgMX0gew0Jc2V0IGNtZHN3IFtsaW5kZXggJGFyZ0xpc3QgZW5kXQ0JaWYgeyFbaW5mbyBleGlzdHMgY21kKCRjbWRzdyldfSB7DQkgICAgZXJyb3IgImJhZCBvcHRpb24gXCIkY21kc3dcIjogbXVzdCBiZSBbdGNsTGlzdFZhbGlkRmxhZ3MgY21kXSINCX0NCWVycm9yICJ2YWx1ZSBmb3IgXCIkY21kc3dcIiBtaXNzaW5nIg0gICAgfQ0NICAgICMgMjogc2V0IHRoZSBkZWZhdWx0IHZhbHVlcw0gICAgIw0gICAgZm9yZWFjaCBjbWRzdyBbYXJyYXkgbmFtZXMgY21kXSB7DQlzZXQgZGF0YSgkY21kc3cpICRkZWYoJGNtZHN3KQ0gICAgfQ0NICAgICMgMzogcGFyc2UgdGhlIGFyZ3VtZW50IGxpc3QNICAgICMNICAgIGZvcmVhY2gge2NtZHN3IHZhbHVlfSAkYXJnTGlzdCB7DQlpZiB7IVtpbmZvIGV4aXN0cyBjbWQoJGNtZHN3KV19IHsNCSAgICBlcnJvciAiYmFkIG9wdGlvbiBcIiRjbWRzd1wiOiBtdXN0IGJlIFt0Y2xMaXN0VmFsaWRGbGFncyBjbWRdIg0JfQ0Jc2V0IGRhdGEoJGNtZHN3KSAkdmFsdWUNICAgIH0NDSAgICAjIERvbmUhDX0NDXByb2MgdGNsTGlzdFZhbGlkRmxhZ3Mge3Z9IHsNICAgIHVwdmFyICR2IGNtZA0NICAgIHNldCBsZW4gW2xsZW5ndGggW2FycmF5IG5hbWVzIGNtZF1dDSAgICBzZXQgaSAxDSAgICBzZXQgc2VwYXJhdG9yICIiDSAgICBzZXQgZXJyb3Jtc2cgIiINICAgIGZvcmVhY2ggY21kc3cgW2xzb3J0IFthcnJheSBuYW1lcyBjbWRdXSB7DQlhcHBlbmQgZXJyb3Jtc2cgIiRzZXBhcmF0b3IkY21kc3ciDQlpbmNyIGkNCWlmIHskaSA9PSAkbGVufSB7DQkgICAgc2V0IHNlcGFyYXRvciAiLCBvciAiDQl9IGVsc2Ugew0JICAgIHNldCBzZXBhcmF0b3IgIiwgIg0JfQ0gICAgfQ0gICAgcmV0dXJuICRlcnJvcm1zZw19DQ0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0jDSMJCQlGb2N1cyBHcm91cA0jDSMgRm9jdXMgZ3JvdXBzIGFyZSB1c2VkIHRvIGhhbmRsZSB0aGUgdXNlcidzIGZvY3VzaW5nIGFjdGlvbnMgaW5zaWRlIGENIyB0b3BsZXZlbC4NIw0jIE9uZSBleGFtcGxlIG9mIHVzaW5nIGZvY3VzIGdyb3VwcyBpczogd2hlbiB0aGUgdXNlciBmb2N1c2VzIG9uIGFuDSMgZW50cnksIHRoZSB0ZXh0IGluIHRoZSBlbnRyeSBpcyBoaWdobGlnaHRlZCBhbmQgdGhlIGN1cnNvciBpcyBwdXQgdG8NIyB0aGUgZW5kIG9mIHRoZSB0ZXh0LiBXaGVuIHRoZSB1c2VyIGNoYW5nZXMgZm9jdXMgdG8gYW5vdGhlciB3aWRnZXQsDSMgdGhlIHRleHQgaW4gdGhlIHByZXZpb3VzbHkgZm9jdXNlZCBlbnRyeSBpcyB2YWxpZGF0ZWQuDSMNIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NDQ0jIHRrRm9jdXNHcm91cF9DcmVhdGUgLS0NIw0jCUNyZWF0ZSBhIGZvY3VzIGdyb3VwLiBBbGwgdGhlIHdpZGdldHMgaW4gYSBmb2N1cyBncm91cCBtdXN0IGJlDSMJd2l0aGluIHRoZSBzYW1lIGZvY3VzIHRvcGxldmVsLiBFYWNoIHRvcGxldmVsIGNhbiBoYXZlIG9ubHkNIwlvbmUgZm9jdXMgZ3JvdXAsIHdoaWNoIGlzIGlkZW50aWZpZWQgYnkgdGhlIG5hbWUgb2YgdGhlDSMJdG9wbGV2ZWwgd2lkZ2V0Lg0jDXByb2MgdGtGb2N1c0dyb3VwX0NyZWF0ZSB7dH0gew0gICAgZ2xvYmFsIHRrUHJpdg0gICAgaWYge1tzdHJpbmcgY29tcGFyZSBbd2luZm8gdG9wbGV2ZWwgJHRdICR0XX0gew0JZXJyb3IgIiR0IGlzIG5vdCBhIHRvcGxldmVsIHdpbmRvdyINICAgIH0NICAgIGlmIHshW2luZm8gZXhpc3RzIHRrUHJpdihmZywkdCldfSB7DQlzZXQgdGtQcml2KGZnLCR0KSAxDQlzZXQgdGtQcml2KGZvY3VzLCR0KSAiIg0JYmluZCAkdCA8Rm9jdXNJbj4gIFtsaXN0IHRrRm9jdXNHcm91cF9JbiAgJHQgJVcgJWRdDQliaW5kICR0IDxGb2N1c091dD4gW2xpc3QgdGtGb2N1c0dyb3VwX091dCAkdCAlVyAlZF0NCWJpbmQgJHQgPERlc3Ryb3k+ICBbbGlzdCB0a0ZvY3VzR3JvdXBfRGVzdHJveSAkdCAlV10NICAgIH0NfQ0NIyB0a0ZvY3VzR3JvdXBfQmluZEluIC0tDSMNIyBBZGQgYSB3aWRnZXQgaW50byB0aGUgIkZvY3VzSW4iIGxpc3Qgb2YgdGhlIGZvY3VzIGdyb3VwLiBUaGUgJGNtZCB3aWxsIGJlDSMgY2FsbGVkIHdoZW4gdGhlIHdpZGdldCBpcyBmb2N1c2VkIG9uIGJ5IHRoZSB1c2VyLg0jDXByb2MgdGtGb2N1c0dyb3VwX0JpbmRJbiB7dCB3IGNtZH0gew0gICAgZ2xvYmFsIHRrRm9jdXNJbiB0a1ByaXYNICAgIGlmIHshW2luZm8gZXhpc3RzIHRrUHJpdihmZywkdCldfSB7DQllcnJvciAiZm9jdXMgZ3JvdXAgXCIkdFwiIGRvZXNuJ3QgZXhpc3QiDSAgICB9DSAgICBzZXQgdGtGb2N1c0luKCR0LCR3KSAkY21kDX0NDQ0jIHRrRm9jdXNHcm91cF9CaW5kT3V0IC0tDSMNIwlBZGQgYSB3aWRnZXQgaW50byB0aGUgIkZvY3VzT3V0IiBsaXN0IG9mIHRoZSBmb2N1cyBncm91cC4gVGhlDSMJJGNtZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB3aWRnZXQgbG9zZXMgdGhlIGZvY3VzIChVc2VyDSMJdHlwZXMgVGFiIG9yIGNsaWNrIG9uIGFub3RoZXIgd2lkZ2V0KS4NIw1wcm9jIHRrRm9jdXNHcm91cF9CaW5kT3V0IHt0IHcgY21kfSB7DSAgICBnbG9iYWwgdGtGb2N1c091dCB0a1ByaXYNICAgIGlmIHshW2luZm8gZXhpc3RzIHRrUHJpdihmZywkdCldfSB7DQllcnJvciAiZm9jdXMgZ3JvdXAgXCIkdFwiIGRvZXNuJ3QgZXhpc3QiDSAgICB9DSAgICBzZXQgdGtGb2N1c091dCgkdCwkdykgJGNtZA19DQ0jIHRrRm9jdXNHcm91cF9EZXN0cm95IC0tDSMNIwlDbGVhbnMgdXAgd2hlbiBtZW1iZXJzIG9mIHRoZSBmb2N1cyBncm91cCBpcyBkZWxldGVkLCBvciB3aGVuIHRoZQ0jCXRvcGxldmVsIGl0c2VsZiBnZXRzIGRlbGV0ZWQuDSMNcHJvYyB0a0ZvY3VzR3JvdXBfRGVzdHJveSB7dCB3fSB7DSAgICBnbG9iYWwgdGtQcml2IHRrRm9jdXNJbiB0a0ZvY3VzT3V0DQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgJHQgJHddfSB7DQl1bnNldCB0a1ByaXYoZmcsJHQpDQl1bnNldCB0a1ByaXYoZm9jdXMsJHQpIA0NCWZvcmVhY2ggbmFtZSBbYXJyYXkgbmFtZXMgdGtGb2N1c0luICR0LCpdIHsNCSAgICB1bnNldCB0a0ZvY3VzSW4oJG5hbWUpDQl9DQlmb3JlYWNoIG5hbWUgW2FycmF5IG5hbWVzIHRrRm9jdXNPdXQgJHQsKl0gew0JICAgIHVuc2V0IHRrRm9jdXNPdXQoJG5hbWUpDQl9DSAgICB9IGVsc2Ugew0JaWYge1tpbmZvIGV4aXN0cyB0a1ByaXYoZm9jdXMsJHQpXSAmJiBcDQkJW3N0cmluZyBlcXVhbCAkdGtQcml2KGZvY3VzLCR0KSAkd119IHsNCSAgICBzZXQgdGtQcml2KGZvY3VzLCR0KSAiIg0JfQ0JY2F0Y2ggew0JICAgIHVuc2V0IHRrRm9jdXNJbigkdCwkdykNCX0NCWNhdGNoIHsNCSAgICB1bnNldCB0a0ZvY3VzT3V0KCR0LCR3KQ0JfQ0gICAgfQ19DQ0jIHRrRm9jdXNHcm91cF9JbiAtLQ0jDSMJSGFuZGxlcyB0aGUgPEZvY3VzSW4+IGV2ZW50LiBDYWxscyB0aGUgRm9jdXNJbiBjb21tYW5kIGZvciB0aGUgbmV3bHkNIwlmb2N1c2VkIHdpZGdldCBpbiB0aGUgZm9jdXMgZ3JvdXAuDSMNcHJvYyB0a0ZvY3VzR3JvdXBfSW4ge3QgdyBkZXRhaWx9IHsNICAgIGdsb2JhbCB0a1ByaXYgdGtGb2N1c0luDQ0gICAgaWYge1tzdHJpbmcgY29tcGFyZSAkZGV0YWlsIE5vdGlmeU5vbmxpbmVhcl0gJiYgXA0JICAgIFtzdHJpbmcgY29tcGFyZSAkZGV0YWlsIE5vdGlmeU5vbmxpbmVhclZpcnR1YWxdfSB7DQkjIFRoaXMgaXMgY2F1c2VkIGJ5IG1vdXNlIG1vdmluZyBvdXQmaW4gb2YgdGhlIHdpbmRvdyAqb3IqDQkjIG9yZGluYXJ5IGtleXByZXNzZXMgc29tZSB3aW5kb3cgbWFuYWdlcnMgKGllOiBDREUgW0J1ZzogMjk2MF0pLg0JcmV0dXJuDSAgICB9DSAgICBpZiB7IVtpbmZvIGV4aXN0cyB0a0ZvY3VzSW4oJHQsJHcpXX0gew0Jc2V0IHRrRm9jdXNJbigkdCwkdykgIiINCXJldHVybg0gICAgfQ0gICAgaWYgeyFbaW5mbyBleGlzdHMgdGtQcml2KGZvY3VzLCR0KV19IHsNCXJldHVybg0gICAgfQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgJHRrUHJpdihmb2N1cywkdCkgJHddfSB7DQkjIFRoaXMgaXMgYWxyZWFkeSBpbiBmb2N1cw0JIw0JcmV0dXJuDSAgICB9IGVsc2Ugew0Jc2V0IHRrUHJpdihmb2N1cywkdCkgJHcNCWV2YWwgJHRrRm9jdXNJbigkdCwkdykNICAgIH0NfQ0NIyB0a0ZvY3VzR3JvdXBfT3V0IC0tDSMNIwlIYW5kbGVzIHRoZSA8Rm9jdXNPdXQ+IGV2ZW50LiBDaGVja3MgaWYgdGhpcyBpcyByZWFsbHkgYSBsb3NlDSMJZm9jdXMgZXZlbnQsIG5vdCBvbmUgZ2VuZXJhdGVkIGJ5IHRoZSBtb3VzZSBtb3Zpbmcgb3V0IG9mIHRoZQ0jCXRvcGxldmVsIHdpbmRvdy4gIENhbGxzIHRoZSBGb2N1c091dCBjb21tYW5kIGZvciB0aGUgd2lkZ2V0DSMJd2hvIGxvc2VzIGl0cyBmb2N1cy4NIw1wcm9jIHRrRm9jdXNHcm91cF9PdXQge3QgdyBkZXRhaWx9IHsNICAgIGdsb2JhbCB0a1ByaXYgdGtGb2N1c091dA0NICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJGRldGFpbCBOb3RpZnlOb25saW5lYXJdICYmIFwNCSAgICBbc3RyaW5nIGNvbXBhcmUgJGRldGFpbCBOb3RpZnlOb25saW5lYXJWaXJ0dWFsXX0gew0JIyBUaGlzIGlzIGNhdXNlZCBieSBtb3VzZSBtb3Zpbmcgb3V0IG9mIHRoZSB3aW5kb3cNCXJldHVybg0gICAgfQ0gICAgaWYgeyFbaW5mbyBleGlzdHMgdGtQcml2KGZvY3VzLCR0KV19IHsNCXJldHVybg0gICAgfQ0gICAgaWYgeyFbaW5mbyBleGlzdHMgdGtGb2N1c091dCgkdCwkdyldfSB7DQlyZXR1cm4NICAgIH0gZWxzZSB7DQlldmFsICR0a0ZvY3VzT3V0KCR0LCR3KQ0Jc2V0IHRrUHJpdihmb2N1cywkdCkgIiINICAgIH0NfQ0NIyB0a0ZER2V0RmlsZVR5cGVzIC0tDSMNIwlQcm9jZXNzIHRoZSBzdHJpbmcgZ2l2ZW4gYnkgdGhlIC1maWxldHlwZXMgb3B0aW9uIG9mIHRoZSBmaWxlDSMJZGlhbG9ncy4gU2ltaWxhciB0byB0aGUgQyBmdW5jdGlvbiBUa0dldEZpbGVGaWx0ZXJzKCkgb24gdGhlIE1hYw0jCWFuZCBXaW5kb3dzIHBsYXRmb3JtLg0jDXByb2MgdGtGREdldEZpbGVUeXBlcyB7c3RyaW5nfSB7DSAgICBmb3JlYWNoIHQgJHN0cmluZyB7DQlpZiB7W2xsZW5ndGggJHRdIDwgMiB8fCBbbGxlbmd0aCAkdF0gPiAzfSB7DQkgICAgZXJyb3IgImJhZCBmaWxlIHR5cGUgXCIkdFwiLCBzaG91bGQgYmUgXCJ0eXBlTmFtZSB7ZXh0ZW5zaW9uID9leHRlbnNpb25zIC4uLj99ID97bWFjVHlwZSA/bWFjVHlwZXMgLi4uP30/XCIiDQl9DQlldmFsIGxhcHBlbmQgW2xpc3QgZmlsZVR5cGVzKFtsaW5kZXggJHQgMF0pXSBbbGluZGV4ICR0IDFdDSAgICB9DQ0gICAgc2V0IHR5cGVzIHt9DSAgICBmb3JlYWNoIHQgJHN0cmluZyB7DQlzZXQgbGFiZWwgW2xpbmRleCAkdCAwXQ0Jc2V0IGV4dHMge30NDQlpZiB7W2luZm8gZXhpc3RzIGhhc0RvbmVUeXBlKCRsYWJlbCldfSB7DQkgICAgY29udGludWUNCX0NDQlzZXQgbmFtZSAiJGxhYmVsICgiDQlzZXQgc2VwICIiDQlmb3JlYWNoIGV4dCAkZmlsZVR5cGVzKCRsYWJlbCkgew0JICAgIGlmIHtbc3RyaW5nIGVxdWFsICRleHQgIiJdfSB7DQkJY29udGludWUNCSAgICB9DQkgICAgcmVnc3ViIHteWy5dfSAkZXh0ICIqLiIgZXh0DQkgICAgaWYgeyFbaW5mbyBleGlzdHMgaGFzR290RXh0KCRsYWJlbCwkZXh0KV19IHsNCQlhcHBlbmQgbmFtZSAkc2VwJGV4dA0JCWxhcHBlbmQgZXh0cyAkZXh0DQkJc2V0IGhhc0dvdEV4dCgkbGFiZWwsJGV4dCkgMQ0JICAgIH0NCSAgICBzZXQgc2VwICwNCX0NCWFwcGVuZCBuYW1lICIpIg0JbGFwcGVuZCB0eXBlcyBbbGlzdCAkbmFtZSAkZXh0c10NDQlzZXQgaGFzRG9uZVR5cGUoJGxhYmVsKSAxDSAgICB9DQ0gICAgcmV0dXJuICR0eXBlcw19DQAAAKYAAgAAAAAAjwCTAKcAyQQCT2sAAAAAAA4AbACJATqIdVdpc2ggLSBXaW5kb3dpbmcgU2hlbGwNYmFzZWQgb24gVGNsIDguMy40ICYgVGsgOC4zLjQNDUppbSBJbmdoYW0gJiBSYXkgSm9obnNvbg2pIDIwMDEgVGNsIENvcmUgVGVhbQ1qaW5naGFtQGFwcGxlLmNvbQAAAAAAABMAGAB3AFxAAgCAAABK4iMgYXV0by50Y2wgLS0NIw0jIHV0aWxpdHkgcHJvY3MgZm9ybWVybHkgaW4gaW5pdC50Y2wgZGVhbGluZyB3aXRoIGF1dG8gZXhlY3V0aW9uDSMgb2YgY29tbWFuZHMgYW5kIGNhbiBiZSBhdXRvIGxvYWRlZCB0aGVtc2VsdmVzLg0jDSMgUkNTOiBAKCMpICRJZDogYXV0by50Y2wsdiAxLjcgMjAwMC8wMi8wOCAxMDowNjoxMiBob2JicyBFeHAgJA0jDSMgQ29weXJpZ2h0IChjKSAxOTkxLTE5OTMgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4NIyBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5OCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuDSMNIyBTZWUgdGhlIGZpbGUgImxpY2Vuc2UudGVybXMiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24NIyBvZiB0aGlzIGZpbGUsIGFuZCBmb3IgYSBESVNDTEFJTUVSIE9GIEFMTCBXQVJSQU5USUVTLg0jDQ0jIGF1dG9fcmVzZXQgLS0NIw0jIERlc3Ryb3kgYWxsIGNhY2hlZCBpbmZvcm1hdGlvbiBmb3IgYXV0by1sb2FkaW5nIGFuZCBhdXRvLWV4ZWN1dGlvbiwNIyBzbyB0aGF0IHRoZSBpbmZvcm1hdGlvbiBnZXRzIHJlY29tcHV0ZWQgdGhlIG5leHQgdGltZSBpdCdzIG5lZWRlZC4NIyBBbHNvIGRlbGV0ZSBhbnkgcHJvY2VkdXJlcyB0aGF0IGFyZSBsaXN0ZWQgaW4gdGhlIGF1dG8tbG9hZCBpbmRleA0jIGV4Y2VwdCB0aG9zZSBkZWZpbmVkIGluIHRoaXMgZmlsZS4NIw0jIEFyZ3VtZW50czogDSMgTm9uZS4NDXByb2MgYXV0b19yZXNldCB7fSB7DSAgICBnbG9iYWwgYXV0b19leGVjcyBhdXRvX2luZGV4IGF1dG9fb2xkcGF0aA0gICAgZm9yZWFjaCBwIFtpbmZvIHByb2NzXSB7DQlpZiB7W2luZm8gZXhpc3RzIGF1dG9faW5kZXgoJHApXSAmJiAhW3N0cmluZyBtYXRjaCBhdXRvXyogJHBdDQkJJiYgKFtsc2VhcmNoIC1leGFjdCB7dW5rbm93biBwa2dfbWtJbmRleCB0Y2xQa2dTZXR1cA0JCQl0Y2xfZmluZExpYnJhcnkgcGtnX2NvbXBhcmVFeHRlbnNpb24NCQkJdGNsTWFjUGtnU2VhcmNoIHRjbFBrZ1Vua25vd259ICRwXSA8IDApfSB7DQkgICAgcmVuYW1lICRwIHt9DQl9DSAgICB9DSAgICBjYXRjaCB7dW5zZXQgYXV0b19leGVjc30NICAgIGNhdGNoIHt1bnNldCBhdXRvX2luZGV4fQ0gICAgY2F0Y2gge3Vuc2V0IGF1dG9fb2xkcGF0aH0NfQ0NIyB0Y2xfZmluZExpYnJhcnkgLS0NIw0jCVRoaXMgaXMgYSB1dGlsaXR5IGZvciBleHRlbnNpb25zIHRoYXQgc2VhcmNoZXMgZm9yIGEgbGlicmFyeSBkaXJlY3RvcnkNIwl1c2luZyBhIGNhbm9uaWNhbCBzZWFyY2hpbmcgYWxnb3JpdGhtLiBBIHNpZGUgZWZmZWN0IGlzIHRvIHNvdXJjZQ0jCXRoZSBpbml0aWFsaXphdGlvbiBzY3JpcHQgYW5kIHNldCBhIGdsb2JhbCBsaWJyYXJ5IHZhcmlhYmxlLg0jDSMgQXJndW1lbnRzOg0jIAliYXNlbmFtZQlQcmVmaXggb2YgdGhlIGRpcmVjdG9yeSBuYW1lLCAoZS5nLiwgInRrIikNIwl2ZXJzaW9uCQlWZXJzaW9uIG51bWJlciBvZiB0aGUgcGFja2FnZSwgKGUuZy4sICI4LjAiKQ0jCXBhdGNoCQlQYXRjaGxldmVsIG9mIHRoZSBwYWNrYWdlLCAoZS5nLiwgIjguMC4zIikNIwlpbml0U2NyaXB0CUluaXRpYWxpemF0aW9uIHNjcmlwdCB0byBzb3VyY2UgKGUuZy4sIHRrLnRjbCkNIwllblZhck5hbWUJZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gaG9ub3IgKGUuZy4sIFRLX0xJQlJBUlkpDSMJdmFyTmFtZQkJR2xvYmFsIHZhcmlhYmxlIHRvIHNldCB3aGVuIGRvbmUgKGUuZy4sIHRrX2xpYnJhcnkpDQ1wcm9jIHRjbF9maW5kTGlicmFyeSB7YmFzZW5hbWUgdmVyc2lvbiBwYXRjaCBpbml0U2NyaXB0IGVuVmFyTmFtZSB2YXJOYW1lfSB7DSAgICB1cHZhciAjMCAkdmFyTmFtZSB0aGVfbGlicmFyeQ0gICAgZ2xvYmFsIGVudiBlcnJvckluZm8NDSAgICBzZXQgZGlycyB7fQ0gICAgc2V0IGVycm9ycyB7fQ0NICAgICMgVGhlIEMgYXBwbGljYXRpb24gbWF5IGhhdmUgaGFyZHdpcmVkIGEgcGF0aCwgd2hpY2ggd2UgaG9ub3INICAgIA0gICAgaWYge1tpbmZvIGV4aXN0IHRoZV9saWJyYXJ5XSAmJiBbc3RyaW5nIGNvbXBhcmUgJHRoZV9saWJyYXJ5IHt9XX0gew0JbGFwcGVuZCBkaXJzICR0aGVfbGlicmFyeQ0gICAgfSBlbHNlIHsNDQkjIERvIHRoZSBjYW5vbmljYWwgc2VhcmNoDQ0JIyAxLiBGcm9tIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLCBpZiBpdCBleGlzdHMNDSAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBlbnYoJGVuVmFyTmFtZSldfSB7DSAgICAgICAgICAgIGxhcHBlbmQgZGlycyAkZW52KCRlblZhck5hbWUpDSAgICAgICAgfQ0NCSMgMi4gUmVsYXRpdmUgdG8gdGhlIFRjbCBsaWJyYXJ5DQ0gICAgICAgIGxhcHBlbmQgZGlycyBbZmlsZSBqb2luIFtmaWxlIGRpcm5hbWUgW2luZm8gbGlicmFyeV1dIFwNCQkkYmFzZW5hbWUkdmVyc2lvbl0NDQkjIDMuIFZhcmlvdXMgbG9jYXRpb25zIHJlbGF0aXZlIHRvIHRoZSBleGVjdXRhYmxlDQkjIC4uL2xpYi9mb28xLjAJCShGcm9tIGJpbiBkaXJlY3RvcnkgaW4gaW5zdGFsbCBoaWVyYXJjaHkpDQkjIC4uLy4uL2xpYi9mb28xLjAJKEZyb20gYmluL2FyY2ggZGlyZWN0b3J5IGluIGluc3RhbGwgaGllcmFyY2h5KQ0JIyAuLi9saWJyYXJ5CQkoRnJvbSB1bml4IGRpcmVjdG9yeSBpbiBidWlsZCBoaWVyYXJjaHkpDQkjIC4uLy4uL2xpYnJhcnkJCShGcm9tIHVuaXgvYXJjaCBkaXJlY3RvcnkgaW4gYnVpbGQgaGllcmFyY2h5KQ0JIyAuLi8uLi9mb28xLjBiMS9saWJyYXJ5IChGcm9tIHVuaXggZGlyZWN0b3J5IGluIHBhcmFsbGVsIGJ1aWxkIGhpZXJhcmNoeSkNCSMgLi4vLi4vLi4vZm9vMS4wYjEvbGlicmFyeSAoRnJvbSB1bml4L2FyY2ggZGlyZWN0b3J5IGluIHBhcmFsbGVsIGJ1aWxkIGhpZXJhcmNoeSkNDSAgICAgICAgc2V0IHBhcmVudERpciBbZmlsZSBkaXJuYW1lIFtmaWxlIGRpcm5hbWUgW2luZm8gbmFtZW9mZXhlY3V0YWJsZV1dXQ0gICAgICAgIHNldCBncmFuZFBhcmVudERpciBbZmlsZSBkaXJuYW1lICRwYXJlbnREaXJdDSAgICAgICAgbGFwcGVuZCBkaXJzIFtmaWxlIGpvaW4gJHBhcmVudERpciBsaWIgJGJhc2VuYW1lJHZlcnNpb25dDSAgICAgICAgbGFwcGVuZCBkaXJzIFtmaWxlIGpvaW4gJGdyYW5kUGFyZW50RGlyIGxpYiAkYmFzZW5hbWUkdmVyc2lvbl0NICAgICAgICBsYXBwZW5kIGRpcnMgW2ZpbGUgam9pbiAkcGFyZW50RGlyIGxpYnJhcnldDSAgICAgICAgbGFwcGVuZCBkaXJzIFtmaWxlIGpvaW4gJGdyYW5kUGFyZW50RGlyIGxpYnJhcnldDSAgICAgICAgaWYgeyFbcmVnZXhwIHsuKlthYl1bMC05XSp9ICRwYXRjaCB2ZXJdfSB7DSAgICAgICAgICAgIHNldCB2ZXIgJHZlcnNpb24NICAgICAgICB9DSAgICAgICAgbGFwcGVuZCBkaXJzIFtmaWxlIGpvaW4gJGdyYW5kUGFyZW50RGlyICRiYXNlbmFtZSR2ZXIgbGlicmFyeV0NICAgICAgICBsYXBwZW5kIGRpcnMgW2ZpbGUgam9pbiBbZmlsZSBkaXJuYW1lICRncmFuZFBhcmVudERpcl0gJGJhc2VuYW1lJHZlciBsaWJyYXJ5XQ0gICAgfQ0gICAgZm9yZWFjaCBpICRkaXJzIHsNICAgICAgICBzZXQgdGhlX2xpYnJhcnkgJGkNICAgICAgICBzZXQgZmlsZSBbZmlsZSBqb2luICRpICRpbml0U2NyaXB0XQ0NCSMgc291cmNlIGV2ZXJ5dGhpbmcgd2hlbiBpbiBhIHNhZmUgaW50ZXJwcmV0ZXIgYmVjYXVzZQ0JIyB3ZSBoYXZlIGEgc291cmNlIGNvbW1hbmQsIGJ1dCBubyBmaWxlIGV4aXN0cyBjb21tYW5kDQ0gICAgICAgIGlmIHtbaW50ZXJwIGlzc2FmZV0gfHwgW2ZpbGUgZXhpc3RzICRmaWxlXX0gew0gICAgICAgICAgICBpZiB7IVtjYXRjaCB7dXBsZXZlbCAjMCBbbGlzdCBzb3VyY2UgJGZpbGVdfSBtc2ddfSB7DSAgICAgICAgICAgICAgICByZXR1cm4NICAgICAgICAgICAgfSBlbHNlIHsNICAgICAgICAgICAgICAgIGFwcGVuZCBlcnJvcnMgIiRmaWxlOiAkbXNnXG4kZXJyb3JJbmZvXG4iDSAgICAgICAgICAgIH0NICAgICAgICB9DSAgICB9DSAgICBzZXQgbXNnICJDYW4ndCBmaW5kIGEgdXNhYmxlICRpbml0U2NyaXB0IGluIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3JpZXM6IFxuIg0gICAgYXBwZW5kIG1zZyAiICAgICRkaXJzXG5cbiINICAgIGFwcGVuZCBtc2cgIiRlcnJvcnNcblxuIg0gICAgYXBwZW5kIG1zZyAiVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0ICRiYXNlbmFtZSB3YXNuJ3QgaW5zdGFsbGVkIHByb3Blcmx5LlxuIg0gICAgZXJyb3IgJG1zZw19DQ0NIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDSMgYXV0b19ta2luZGV4DSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0jIFRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlcyBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdGNsSW5kZXggZmlsZQ0jIGZyb20gVGNsIHNvdXJjZSBmaWxlcy4gIFRoZXkgdXNlIGEgc3BlY2lhbCBzYWZlIGludGVycHJldGVyIHRvDSMgcGFyc2UgVGNsIHNvdXJjZSBmaWxlcywgd3JpdGluZyBvdXQgaW5kZXggZW50cmllcyBhcyAicHJvYyINIyBjb21tYW5kcyBhcmUgZW5jb3VudGVyZWQuICBUaGlzIGltcGxlbWVudGF0aW9uIHdvbid0IHdvcmsgaW4gYQ0jIHNhZmUgaW50ZXJwcmV0ZXIsIHNpbmNlIGEgc2FmZSBpbnRlcnByZXRlciBjYW4ndCBjcmVhdGUgdGhlDSMgc3BlY2lhbCBwYXJzZXIgYW5kIG1lc3Mgd2l0aCBpdHMgY29tbWFuZHMuICANDWlmIHtbaW50ZXJwIGlzc2FmZV19IHsNICAgIHJldHVybgk7IyBTdG9wIHNvdXJjaW5nIHRoZSBmaWxlIGhlcmUNfQ0NIyBhdXRvX21raW5kZXggLS0NIyBSZWdlbmVyYXRlIGEgdGNsSW5kZXggZmlsZSBmcm9tIFRjbCBzb3VyY2UgZmlsZXMuICBUYWtlcyBhcyBhcmd1bWVudA0jIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIHRjbEluZGV4IGZpbGUgaXMgdG8gYmUgcGxhY2VkLA0jIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2YgZ2xvYiBwYXR0ZXJucyB0byB1c2UgaW4gdGhhdCBkaXJlY3RvcnkgdG8NIyBsb2NhdGUgYWxsIG9mIHRoZSByZWxldmFudCBmaWxlcy4NIw0jIEFyZ3VtZW50czogDSMgZGlyIC0JCU5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBjcmVhdGUgYW4gaW5kZXguDSMgYXJncyAtCUFueSBudW1iZXIgb2YgYWRkaXRpb25hbCBhcmd1bWVudHMgZ2l2aW5nIHRoZQ0jCQluYW1lcyBvZiBmaWxlcyB3aXRoaW4gZGlyLiAgSWYgbm8gYWRkaXRpb25hbA0jCQlhcmUgZ2l2ZW4gYXV0b19ta2luZGV4IHdpbGwgbG9vayBmb3IgKi50Y2wuDQ1wcm9jIGF1dG9fbWtpbmRleCB7ZGlyIGFyZ3N9IHsNICAgIGdsb2JhbCBlcnJvckNvZGUgZXJyb3JJbmZvDQ0gICAgaWYge1tpbnRlcnAgaXNzYWZlXX0gew0gICAgICAgIGVycm9yICJjYW4ndCBnZW5lcmF0ZSBpbmRleCB3aXRoaW4gc2FmZSBpbnRlcnByZXRlciINICAgIH0NDSAgICBzZXQgb2xkRGlyIFtwd2RdDSAgICBjZCAkZGlyDSAgICBzZXQgZGlyIFtwd2RdDQ0gICAgYXBwZW5kIGluZGV4ICIjIFRjbCBhdXRvbG9hZCBpbmRleCBmaWxlLCB2ZXJzaW9uIDIuMFxuIg0gICAgYXBwZW5kIGluZGV4ICIjIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgdGhlIFwiYXV0b19ta2luZGV4XCIgY29tbWFuZFxuIg0gICAgYXBwZW5kIGluZGV4ICIjIGFuZCBzb3VyY2VkIHRvIHNldCB1cCBpbmRleGluZyBpbmZvcm1hdGlvbiBmb3Igb25lIG9yXG4iDSAgICBhcHBlbmQgaW5kZXggIiMgbW9yZSBjb21tYW5kcy4gIFR5cGljYWxseSBlYWNoIGxpbmUgaXMgYSBjb21tYW5kIHRoYXRcbiINICAgIGFwcGVuZCBpbmRleCAiIyBzZXRzIGFuIGVsZW1lbnQgaW4gdGhlIGF1dG9faW5kZXggYXJyYXksIHdoZXJlIHRoZVxuIg0gICAgYXBwZW5kIGluZGV4ICIjIGVsZW1lbnQgbmFtZSBpcyB0aGUgbmFtZSBvZiBhIGNvbW1hbmQgYW5kIHRoZSB2YWx1ZSBpc1xuIg0gICAgYXBwZW5kIGluZGV4ICIjIGEgc2NyaXB0IHRoYXQgbG9hZHMgdGhlIGNvbW1hbmQuXG5cbiINICAgIGlmIHskYXJncyA9PSAiIn0gew0Jc2V0IGFyZ3MgKi50Y2wNICAgIH0NDSAgICBhdXRvX21raW5kZXhfcGFyc2VyOjppbml0DSAgICBmb3JlYWNoIGZpbGUgW2V2YWwgZ2xvYiAkYXJnc10gew0gICAgICAgIGlmIHtbY2F0Y2gge2F1dG9fbWtpbmRleF9wYXJzZXI6Om1raW5kZXggJGZpbGV9IG1zZ10gPT0gMH0gew0gICAgICAgICAgICBhcHBlbmQgaW5kZXggJG1zZw0gICAgICAgIH0gZWxzZSB7DSAgICAgICAgICAgIHNldCBjb2RlICRlcnJvckNvZGUNICAgICAgICAgICAgc2V0IGluZm8gJGVycm9ySW5mbw0gICAgICAgICAgICBjZCAkb2xkRGlyDSAgICAgICAgICAgIGVycm9yICRtc2cgJGluZm8gJGNvZGUNICAgICAgICB9DSAgICB9DSAgICBhdXRvX21raW5kZXhfcGFyc2VyOjpjbGVhbnVwDQ0gICAgc2V0IGZpZCBbb3BlbiAidGNsSW5kZXgiIHddDSAgICBwdXRzIC1ub25ld2xpbmUgJGZpZCAkaW5kZXgNICAgIGNsb3NlICRmaWQNICAgIGNkICRvbGREaXINfQ0NIyBPcmlnaW5hbCB2ZXJzaW9uIG9mIGF1dG9fbWtpbmRleCB0aGF0IGp1c3Qgc2VhcmNoZXMgdGhlIHNvdXJjZQ0jIGNvZGUgZm9yICJwcm9jIiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLg0NcHJvYyBhdXRvX21raW5kZXhfb2xkIHtkaXIgYXJnc30gew0gICAgZ2xvYmFsIGVycm9yQ29kZSBlcnJvckluZm8NICAgIHNldCBvbGREaXIgW3B3ZF0NICAgIGNkICRkaXINICAgIHNldCBkaXIgW3B3ZF0NICAgIGFwcGVuZCBpbmRleCAiIyBUY2wgYXV0b2xvYWQgaW5kZXggZmlsZSwgdmVyc2lvbiAyLjBcbiINICAgIGFwcGVuZCBpbmRleCAiIyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBcImF1dG9fbWtpbmRleFwiIGNvbW1hbmRcbiINICAgIGFwcGVuZCBpbmRleCAiIyBhbmQgc291cmNlZCB0byBzZXQgdXAgaW5kZXhpbmcgaW5mb3JtYXRpb24gZm9yIG9uZSBvclxuIg0gICAgYXBwZW5kIGluZGV4ICIjIG1vcmUgY29tbWFuZHMuICBUeXBpY2FsbHkgZWFjaCBsaW5lIGlzIGEgY29tbWFuZCB0aGF0XG4iDSAgICBhcHBlbmQgaW5kZXggIiMgc2V0cyBhbiBlbGVtZW50IGluIHRoZSBhdXRvX2luZGV4IGFycmF5LCB3aGVyZSB0aGVcbiINICAgIGFwcGVuZCBpbmRleCAiIyBlbGVtZW50IG5hbWUgaXMgdGhlIG5hbWUgb2YgYSBjb21tYW5kIGFuZCB0aGUgdmFsdWUgaXNcbiINICAgIGFwcGVuZCBpbmRleCAiIyBhIHNjcmlwdCB0aGF0IGxvYWRzIHRoZSBjb21tYW5kLlxuXG4iDSAgICBpZiB7W3N0cmluZyBlcXVhbCAkYXJncyAiIl19IHsNCXNldCBhcmdzICoudGNsDSAgICB9DSAgICBmb3JlYWNoIGZpbGUgW2V2YWwgZ2xvYiAkYXJnc10gew0Jc2V0IGYgIiINCXNldCBlcnJvciBbY2F0Y2ggew0JICAgIHNldCBmIFtvcGVuICRmaWxlXQ0JICAgIHdoaWxlIHtbZ2V0cyAkZiBsaW5lXSA+PSAwfSB7DQkJaWYge1tyZWdleHAge15wcm9jWyAJXSsoW14gCV0qKX0gJGxpbmUgbWF0Y2ggcHJvY05hbWVdfSB7DQkJICAgIHNldCBwcm9jTmFtZSBbbGluZGV4IFthdXRvX3F1YWxpZnkgJHByb2NOYW1lICI6OiJdIDBdDQkJICAgIGFwcGVuZCBpbmRleCAic2V0IFtsaXN0IGF1dG9faW5kZXgoJHByb2NOYW1lKV0iDQkJICAgIGFwcGVuZCBpbmRleCAiIFxbbGlzdCBzb3VyY2UgXFtmaWxlIGpvaW4gXCRkaXIgW2xpc3QgJGZpbGVdXF1cXVxuIg0JCX0NCSAgICB9DQkgICAgY2xvc2UgJGYNCX0gbXNnXQ0JaWYgeyRlcnJvcn0gew0JICAgIHNldCBjb2RlICRlcnJvckNvZGUNCSAgICBzZXQgaW5mbyAkZXJyb3JJbmZvDQkgICAgY2F0Y2gge2Nsb3NlICRmfQ0JICAgIGNkICRvbGREaXINCSAgICBlcnJvciAkbXNnICRpbmZvICRjb2RlDQl9DSAgICB9DSAgICBzZXQgZiAiIg0gICAgc2V0IGVycm9yIFtjYXRjaCB7DQlzZXQgZiBbb3BlbiB0Y2xJbmRleCB3XQ0JcHV0cyAtbm9uZXdsaW5lICRmICRpbmRleA0JY2xvc2UgJGYNCWNkICRvbGREaXINICAgIH0gbXNnXQ0gICAgaWYgeyRlcnJvcn0gew0Jc2V0IGNvZGUgJGVycm9yQ29kZQ0Jc2V0IGluZm8gJGVycm9ySW5mbw0JY2F0Y2gge2Nsb3NlICRmfQ0JY2QgJG9sZERpcg0JZXJyb3IgJG1zZyAkaW5mbyAkY29kZQ0gICAgfQ19DQ0jIENyZWF0ZSBhIHNhZmUgaW50ZXJwcmV0ZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBwYXJzZSBUY2wgc291cmNlIGZpbGVzDSMgZ2VuZXJhdGUgYSB0Y2xJbmRleCBmaWxlIGZvciBhdXRvbG9hZGluZy4gIFRoaXMgaW50ZXJwIGNvbnRhaW5zDSMgY29tbWFuZHMgZm9yIHRoaW5ncyB0aGF0IG5lZWQgaW5kZXggZW50cmllcy4gIEVhY2ggdGltZSBhIGNvbW1hbmQNIyBpcyBleGVjdXRlZCwgaXQgd3JpdGVzIGFuIGVudHJ5IG91dCB0byB0aGUgaW5kZXggZmlsZS4NDW5hbWVzcGFjZSBldmFsIGF1dG9fbWtpbmRleF9wYXJzZXIgew0gICAgdmFyaWFibGUgcGFyc2VyICIiICAgICAgICAgIDsjIHBhcnNlciB1c2VkIHRvIGJ1aWxkIGluZGV4DSAgICB2YXJpYWJsZSBpbmRleCAiIiAgICAgICAgICAgOyMgbWFpbnRhaW5zIGluZGV4IGFzIGl0IGlzIGJ1aWx0DSAgICB2YXJpYWJsZSBzY3JpcHRGaWxlICIiICAgICAgOyMgbmFtZSBvZiBmaWxlIGJlaW5nIHByb2Nlc3NlZA0gICAgdmFyaWFibGUgY29udGV4dFN0YWNrICIiICAgIDsjIHN0YWNrIG9mIG5hbWVzcGFjZSBzY29wZXMNICAgIHZhcmlhYmxlIGltcG9ydHMgIiIgICAgICAgICA7IyBrZWVwcyB0cmFjayBvZiBhbGwgaW1wb3J0ZWQgY21kcw0gICAgdmFyaWFibGUgaW5pdENvbW1hbmRzICIiICAgIDsjIGxpc3Qgb2YgY29tbWFuZHMgdGhhdCBjcmVhdGUgYWxpYXNlcw0NICAgIHByb2MgaW5pdCB7fSB7DQl2YXJpYWJsZSBwYXJzZXINCXZhcmlhYmxlIGluaXRDb21tYW5kcw0NCWlmIHshW2ludGVycCBpc3NhZmVdfSB7DQkgICAgc2V0IHBhcnNlciBbaW50ZXJwIGNyZWF0ZSAtc2FmZV0NCSAgICAkcGFyc2VyIGhpZGUgaW5mbw0JICAgICRwYXJzZXIgaGlkZSByZW5hbWUNCSAgICAkcGFyc2VyIGhpZGUgcHJvYw0JICAgICRwYXJzZXIgaGlkZSBuYW1lc3BhY2UNCSAgICAkcGFyc2VyIGhpZGUgZXZhbA0JICAgICRwYXJzZXIgaGlkZSBwdXRzDQkgICAgJHBhcnNlciBpbnZva2VoaWRkZW4gbmFtZXNwYWNlIGRlbGV0ZSA6Og0JICAgICRwYXJzZXIgaW52b2tlaGlkZGVuIHByb2MgdW5rbm93biB7YXJnc30ge30NDQkgICAgIyBXZSdsbCBuZWVkIGFjY2VzcyB0byB0aGUgIm5hbWVzcGFjZSIgY29tbWFuZCB3aXRoaW4gdGhlDQkgICAgIyBpbnRlcnAuICBQdXQgaXQgYmFjaywgYnV0IG1vdmUgaXQgb3V0IG9mIHRoZSB3YXkuDQ0JICAgICRwYXJzZXIgZXhwb3NlIG5hbWVzcGFjZQ0JICAgICRwYXJzZXIgaW52b2tlaGlkZGVuIHJlbmFtZSBuYW1lc3BhY2UgXyVAbmFtZXNwYWNlDQkgICAgJHBhcnNlciBleHBvc2UgZXZhbA0JICAgICRwYXJzZXIgaW52b2tlaGlkZGVuIHJlbmFtZSBldmFsIF8lQGV2YWwNDQkgICAgIyBJbnN0YWxsIGFsbCB0aGUgcmVnaXN0ZXJlZCBwc3VlZG8tY29tbWFuZCBpbXBsZW1lbnRhdGlvbnMNDQkgICAgZm9yZWFjaCBjbWQgJGluaXRDb21tYW5kcyB7DQkJZXZhbCAkY21kDQkgICAgfQ0JfQ0gICAgfQ0gICAgcHJvYyBjbGVhbnVwIHt9IHsNCXZhcmlhYmxlIHBhcnNlcg0JaW50ZXJwIGRlbGV0ZSAkcGFyc2VyDQl1bnNldCBwYXJzZXINICAgIH0NfQ0NIyBhdXRvX21raW5kZXhfcGFyc2VyOjpta2luZGV4IC0tDSMNIyBVc2VkIGJ5IHRoZSAiYXV0b19ta2luZGV4IiBjb21tYW5kIHRvIGNyZWF0ZSBhICJ0Y2xJbmRleCIgZmlsZSBmb3INIyB0aGUgZ2l2ZW4gVGNsIHNvdXJjZSBmaWxlLiAgRXhlY3V0ZXMgdGhlIGNvbW1hbmRzIGluIHRoZSBmaWxlLCBhbmQNIyBoYW5kbGVzIHRoaW5ncyBsaWtlIHRoZSAicHJvYyIgY29tbWFuZCBieSBhZGRpbmcgYW4gZW50cnkgZm9yIHRoZQ0jIGluZGV4IGZpbGUuICBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgaW5kZXggZmlsZS4NIw0jIEFyZ3VtZW50czogDSMJZmlsZQlOYW1lIG9mIFRjbCBzb3VyY2UgZmlsZSB0byBiZSBpbmRleGVkLg0NcHJvYyBhdXRvX21raW5kZXhfcGFyc2VyOjpta2luZGV4IHtmaWxlfSB7DSAgICB2YXJpYWJsZSBwYXJzZXINICAgIHZhcmlhYmxlIGluZGV4DSAgICB2YXJpYWJsZSBzY3JpcHRGaWxlDSAgICB2YXJpYWJsZSBjb250ZXh0U3RhY2sNICAgIHZhcmlhYmxlIGltcG9ydHMNDSAgICBzZXQgc2NyaXB0RmlsZSAkZmlsZQ0NICAgIHNldCBmaWQgW29wZW4gJGZpbGVdDSAgICBzZXQgY29udGVudHMgW3JlYWQgJGZpZF0NICAgIGNsb3NlICRmaWQNDSAgICAjIFRoZXJlIGlzIG9uZSBwcm9ibGVtIHdpdGggc291cmNpbmcgZmlsZXMgaW50byB0aGUgc2FmZQ0gICAgIyBpbnRlcnByZXRlcjogIHJlZmVyZW5jZXMgbGlrZSAiJHgiIHdpbGwgZmFpbCBzaW5jZSBjb2RlIGlzIG5vdA0gICAgIyByZWFsbHkgYmVpbmcgZXhlY3V0ZWQgYW5kIHZhcmlhYmxlcyBkbyBub3QgcmVhbGx5IGV4aXN0Lg0gICAgIyBUbyBhdm9pZCB0aGlzLCB3ZSByZXBsYWNlIGFsbCAkIHdpdGggXDAgKGxpdGVyYWxseSwgdGhlIG51bGwgY2hhcikNICAgICMgbGF0ZXIsIHdoZW4gZ2V0dGluZyBwcm9jIG5hbWVzIHdlIHdpbGwgaGF2ZSB0byByZXZlcnNlIHRoaXMgcmVwbGFjZW1lbnQsDSAgICAjIGluIGNhc2UgdGhlcmUgd2VyZSBhbnkgJCBpbiB0aGUgcHJvYyBuYW1lLiAgVGhpcyB3aWxsIGNhdXNlIGEgcHJvYmxlbQ0gICAgIyBpZiBzb21lYm9keSBhY3R1YWxseSB0cmllcyB0byBoYXZlIGEgXDAgaW4gdGhlaXIgcHJvYyBuYW1lLiAgVG9vIGJhZA0gICAgIyBmb3IgdGhlbS4NICAgIHJlZ3N1YiAtYWxsIHtcJH0gJGNvbnRlbnRzICJcMCIgY29udGVudHMNICAgIA0gICAgc2V0IGluZGV4ICIiDSAgICBzZXQgY29udGV4dFN0YWNrICIiDSAgICBzZXQgaW1wb3J0cyAiIg0NICAgICRwYXJzZXIgZXZhbCAkY29udGVudHMNDSAgICBmb3JlYWNoIG5hbWUgJGltcG9ydHMgew0gICAgICAgIGNhdGNoIHskcGFyc2VyIGV2YWwgW2xpc3QgXyVAbmFtZXNwYWNlIGZvcmdldCAkbmFtZV19DSAgICB9DSAgICByZXR1cm4gJGluZGV4DX0NDSMgYXV0b19ta2luZGV4X3BhcnNlcjo6aG9vayBjb21tYW5kDSMNIyBSZWdpc3RlcnMgYSBUY2wgY29tbWFuZCB0byBldmFsdWF0ZSB3aGVuIGluaXRpYWxpemluZyB0aGUNIyBzbGF2ZSBpbnRlcnByZXRlciB1c2VkIGJ5IHRoZSBta2luZGV4IHBhcnNlci4NIyBUaGUgY29tbWFuZCBpcyBldmFsdWF0ZWQgaW4gdGhlIG1hc3RlciBpbnRlcnByZXRlciwgYW5kIGNhbg0jIHVzZSB0aGUgdmFyaWFibGUgYXV0b19ta2luZGV4X3BhcnNlcjo6cGFyc2VyIHRvIGdldCB0byB0aGUgc2xhdmUNDXByb2MgYXV0b19ta2luZGV4X3BhcnNlcjo6aG9vayB7Y21kfSB7DSAgICB2YXJpYWJsZSBpbml0Q29tbWFuZHMNDSAgICBsYXBwZW5kIGluaXRDb21tYW5kcyAkY21kDX0NDSMgYXV0b19ta2luZGV4X3BhcnNlcjo6c2xhdmVob29rIGNvbW1hbmQNIw0jIFJlZ2lzdGVycyBhIFRjbCBjb21tYW5kIHRvIGV2YWx1YXRlIHdoZW4gaW5pdGlhbGl6aW5nIHRoZQ0jIHNsYXZlIGludGVycHJldGVyIHVzZWQgYnkgdGhlIG1raW5kZXggcGFyc2VyLg0jIFRoZSBjb21tYW5kIGlzIGV2YWx1YXRlZCBpbiB0aGUgc2xhdmUgaW50ZXJwcmV0ZXIuDQ1wcm9jIGF1dG9fbWtpbmRleF9wYXJzZXI6OnNsYXZlaG9vayB7Y21kfSB7DSAgICB2YXJpYWJsZSBpbml0Q29tbWFuZHMNDSAgICAjIFRoZSAkcGFyc2VyIHZhcmlhYmxlIGlzIGRlZmluZWQgdG8gYmUgdGhlIG5hbWUgb2YgdGhlDSAgICAjIHNsYXZlIGludGVycHJldGVyIHdoZW4gdGhpcyBjb21tYW5kIGlzIHVzZWQgbGF0ZXIuDQ0gICAgbGFwcGVuZCBpbml0Q29tbWFuZHMgIlwkcGFyc2VyIGV2YWwgW2xpc3QgJGNtZF0iDX0NDSMgYXV0b19ta2luZGV4X3BhcnNlcjo6Y29tbWFuZCAtLQ0jDSMgUmVnaXN0ZXJzIGEgbmV3IGNvbW1hbmQgd2l0aCB0aGUgImF1dG9fbWtpbmRleF9wYXJzZXIiIGludGVycHJldGVyDSMgdGhhdCBwYXJzZXMgVGNsIGZpbGVzLiAgVGhlc2UgY29tbWFuZHMgYXJlIGZha2UgdmVyc2lvbnMgb2YgdGhpbmdzDSMgbGlrZSB0aGUgInByb2MiIGNvbW1hbmQuICBXaGVuIHlvdSBleGVjdXRlIHRoZW0sIHRoZXkgc2ltcGx5IHdyaXRlDSMgb3V0IGFuIGVudHJ5IHRvIGEgInRjbEluZGV4IiBmaWxlIGZvciBhdXRvLWxvYWRpbmcuDSMNIyBUaGlzIHByb2NlZHVyZSBhbGxvd3MgZXh0ZW5zaW9ucyB0byByZWdpc3RlciB0aGVpciBvd24gY29tbWFuZHMNIyB3aXRoIHRoZSBhdXRvX21raW5kZXggZmFjaWxpdHkuICBGb3IgZXhhbXBsZSwgYSBwYWNrYWdlIGxpa2UNIyBbaW5jciBUY2xdIG1pZ2h0IHJlZ2lzdGVyIGEgImNsYXNzIiBjb21tYW5kIHNvIHRoYXQgY2xhc3MgZGVmaW5pdGlvbnMNIyBjb3VsZCBiZSBhZGRlZCB0byBhICJ0Y2xJbmRleCIgZmlsZSBmb3IgYXV0by1sb2FkaW5nLg0jDSMgQXJndW1lbnRzOg0jCW5hbWUgCU5hbWUgb2YgY29tbWFuZCByZWNvZ25pemVkIGluIFRjbCBmaWxlcy4NIwlhcmdsaXN0CUFyZ3VtZW50IGxpc3QgZm9yIGNvbW1hbmQuDSMJYm9keSAJSW1wbGVtZW50YXRpb24gb2YgY29tbWFuZCB0byBoYW5kbGUgaW5kZXhpbmcuDQ1wcm9jIGF1dG9fbWtpbmRleF9wYXJzZXI6OmNvbW1hbmQge25hbWUgYXJnbGlzdCBib2R5fSB7DSAgICBob29rIFtsaXN0IGF1dG9fbWtpbmRleF9wYXJzZXI6OmNvbW1hbmRJbml0ICRuYW1lICRhcmdsaXN0ICRib2R5XQ19DQ0jIGF1dG9fbWtpbmRleF9wYXJzZXI6OmNvbW1hbmRJbml0IC0tDSMNIyBUaGlzIGRvZXMgdGhlIGFjdHVhbCB3b3JrIHNldCB1cCBieSBhdXRvX21raW5kZXhfcGFyc2VyOjpjb21tYW5kDSMgVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgdXNlZCBieSB0aGUgcGFyc2VyIGlzIGNyZWF0ZWQuDSMNIyBBcmd1bWVudHM6DSMJbmFtZSAJTmFtZSBvZiBjb21tYW5kIHJlY29nbml6ZWQgaW4gVGNsIGZpbGVzLg0jCWFyZ2xpc3QJQXJndW1lbnQgbGlzdCBmb3IgY29tbWFuZC4NIwlib2R5IAlJbXBsZW1lbnRhdGlvbiBvZiBjb21tYW5kIHRvIGhhbmRsZSBpbmRleGluZy4NDXByb2MgYXV0b19ta2luZGV4X3BhcnNlcjo6Y29tbWFuZEluaXQge25hbWUgYXJnbGlzdCBib2R5fSB7DSAgICB2YXJpYWJsZSBwYXJzZXINDSAgICBzZXQgbnMgW25hbWVzcGFjZSBxdWFsaWZpZXJzICRuYW1lXQ0gICAgc2V0IHRhaWwgW25hbWVzcGFjZSB0YWlsICRuYW1lXQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgJG5zICIiXX0gew0gICAgICAgIHNldCBmYWtlTmFtZSAiW25hbWVzcGFjZSBjdXJyZW50XTo6XyVAZmFrZV8kdGFpbCINICAgIH0gZWxzZSB7DSAgICAgICAgc2V0IGZha2VOYW1lICJfJUBmYWtlXyRuYW1lIg0gICAgICAgIHJlZ3N1YiAtYWxsIHs6On0gJGZha2VOYW1lICJfIiBmYWtlTmFtZQ0gICAgICAgIHNldCBmYWtlTmFtZSAiW25hbWVzcGFjZSBjdXJyZW50XTo6JGZha2VOYW1lIg0gICAgfQ0gICAgcHJvYyAkZmFrZU5hbWUgJGFyZ2xpc3QgJGJvZHkNDSAgICAjIFlVSyEgIFRjbCB3b24ndCBsZXQgdXMgYWxpYXMgZnVsbHkgcXVhbGlmaWVkIGNvbW1hbmQgbmFtZXMsDSAgICAjIHNvIHdlIGNhbid0IGhhbmRsZSBuYW1lcyBsaWtlICI6Oml0Y2w6OmNsYXNzIi4gIEluc3RlYWQsDSAgICAjIHdlIGhhdmUgdG8gYnVpbGQgcHJvY3Mgd2l0aCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWVzLCBhbmQNICAgICMgaGF2ZSB0aGUgcHJvY3MgcG9pbnQgdG8gdGhlIGFsaWFzZXMuDQ0gICAgaWYge1tyZWdleHAgezo6fSAkbmFtZV19IHsNICAgICAgICBzZXQgZXhwb3J0Q21kIFtsaXN0IF8lQG5hbWVzcGFjZSBleHBvcnQgW25hbWVzcGFjZSB0YWlsICRuYW1lXV0NICAgICAgICAkcGFyc2VyIGV2YWwgW2xpc3QgXyVAbmFtZXNwYWNlIGV2YWwgJG5zICRleHBvcnRDbWRdDSANCSMgVGhlIGZvbGxvd2luZyBwcm9jIGRlZmluaXRpb24gZG9lcyBub3Qgd29yayBpZiB5b3UNCSMgd2FudCB0byB0b2xlcmF0ZSBzcGFjZSBvciBzb21ldGhpbmcgZWxzZSBkaWFib2xpY2FsDQkjIGluIHRoZSBwcm9jZWR1cmUgbmFtZSwgKGkuZS4sIHNwYWNlIGluICRhbGlhcykNCSMgVGhlIGZvbGxvd2luZyBkb2VzIG5vdCB3b3JrOg0JIyAgICJfJUBldmFsIHskYWxpYXN9IFwkYXJncyINCSMgYmVjYXVzZSAkYWxpYXMgZ2V0cyBjb25jYXQnZWQgdG8gJGFyZ3MuDQkjIFRoZSBmb2xsb3dpbmcgZG9lcyBub3Qgd29yayBiZWNhdXNlICRjbWQgaXMgc29tZWhvdyB1bmRlZmluZWQNCSMgICAic2V0IGNtZCB7JGFsaWFzfSBcOyBfJUBldmFsIHtcJGNtZH0gXCRhcmdzIg0JIyBBIGdvbGQgc3RhciB0byBzb21lb25lIHRoYXQgY2FuIG1ha2UgdGVzdA0JIyBhdXRvTWtpbmRleC0zLjMgd29yayBwcm9wZXJseQ0NICAgICAgICBzZXQgYWxpYXMgW25hbWVzcGFjZSB0YWlsICRmYWtlTmFtZV0NICAgICAgICAkcGFyc2VyIGludm9rZWhpZGRlbiBwcm9jICRuYW1lIHthcmdzfSAiXyVAZXZhbCB7JGFsaWFzfSBcJGFyZ3MiDSAgICAgICAgJHBhcnNlciBhbGlhcyAkYWxpYXMgJGZha2VOYW1lDSAgICB9IGVsc2Ugew0gICAgICAgICRwYXJzZXIgYWxpYXMgJG5hbWUgJGZha2VOYW1lDSAgICB9DSAgICByZXR1cm4NfQ0NIyBhdXRvX21raW5kZXhfcGFyc2VyOjpmdWxsbmFtZSAtLQ0jIFVzZWQgYnkgY29tbWFuZHMgbGlrZSAicHJvYyIgd2l0aGluIHRoZSBhdXRvX21raW5kZXggcGFyc2VyLg0jIFJldHVybnMgdGhlIHF1YWxpZmllZCBuYW1lc3BhY2UgbmFtZSBmb3IgdGhlICJuYW1lIiBhcmd1bWVudC4NIyBJZiB0aGUgIm5hbWUiIGRvZXMgbm90IHN0YXJ0IHdpdGggIjo6IiwgZWxlbWVudHMgYXJlIGFkZGVkIGZyb20NIyB0aGUgY3VycmVudCBuYW1lc3BhY2Ugc3RhY2sgdG8gcHJvZHVjZSBhIHF1YWxpZmllZCBuYW1lLiAgVGhlbiwNIyB0aGUgbmFtZSBpcyBleGFtaW5lZCB0byBzZWUgd2hldGhlciBvciBub3QgaXQgc2hvdWxkIHJlYWxseSBiZQ0jIHF1YWxpZmllZC4gIElmIHRoZSBuYW1lIGhhcyBtb3JlIHRoYW4gdGhlIGxlYWRpbmcgIjo6IiwgaXQgaXMNIyByZXR1cm5lZCBhcyBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiAgT3RoZXJ3aXNlLCBpdCBpcyByZXR1cm5lZA0jIGFzIGEgc2ltcGxlIG5hbWUuICBUaGF0IHdheSwgdGhlIFRjbCBhdXRvbG9hZGVyIHdpbGwgcmVjb2duaXplDSMgaXQgcHJvcGVybHkuDSMNIyBBcmd1bWVudHM6DSMgbmFtZSAtCQlOYW1lIHRoYXQgaXMgYmVpbmcgYWRkZWQgdG8gaW5kZXguDQ1wcm9jIGF1dG9fbWtpbmRleF9wYXJzZXI6OmZ1bGxuYW1lIHtuYW1lfSB7DSAgICB2YXJpYWJsZSBjb250ZXh0U3RhY2sNDSAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggOjoqICRuYW1lXX0gew0gICAgICAgIGZvcmVhY2ggbnMgJGNvbnRleHRTdGFjayB7DSAgICAgICAgICAgIHNldCBuYW1lICIke25zfTo6JG5hbWUiDSAgICAgICAgICAgIGlmIHtbc3RyaW5nIG1hdGNoIDo6KiAkbmFtZV19IHsNICAgICAgICAgICAgICAgIGJyZWFrDSAgICAgICAgICAgIH0NICAgICAgICB9DSAgICB9DQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgW25hbWVzcGFjZSBxdWFsaWZpZXJzICRuYW1lXSAiIl19IHsNICAgICAgICBzZXQgbmFtZSBbbmFtZXNwYWNlIHRhaWwgJG5hbWVdDSAgICB9IGVsc2VpZiB7IVtzdHJpbmcgbWF0Y2ggOjoqICRuYW1lXX0gew0gICAgICAgIHNldCBuYW1lICI6OiRuYW1lIg0gICAgfQ0gICAgDSAgICAjIEVhcmxpZXIsIG1raW5kZXggcmVwbGFjZWQgYWxsICQncyB3aXRoIFwwLiAgTm93LCB3ZSBoYXZlIHRvIHJldmVyc2UNICAgICMgdGhhdCByZXBsYWNlbWVudC4NICAgIHJlZ3N1YiAtYWxsICJcMCIgJG5hbWUgIlwkIiBuYW1lDSAgICByZXR1cm4gJG5hbWUNfQ0NIyBSZWdpc3RlciBhbGwgb2YgdGhlIHByb2NlZHVyZXMgZm9yIHRoZSBhdXRvX21raW5kZXggcGFyc2VyIHRoYXQNIyB3aWxsIGJ1aWxkIHRoZSAidGNsSW5kZXgiIGZpbGUuDQ0jIEFVVE8gTUtJTkRFWDogIHByb2MgbmFtZSBhcmdsaXN0IGJvZHkNIyBBZGRzIGFuIGVudHJ5IHRvIHRoZSBhdXRvIGluZGV4IGxpc3QgZm9yIHRoZSBnaXZlbiBwcm9jZWR1cmUgbmFtZS4NDWF1dG9fbWtpbmRleF9wYXJzZXI6OmNvbW1hbmQgcHJvYyB7bmFtZSBhcmdzfSB7DSAgICB2YXJpYWJsZSBpbmRleA0gICAgdmFyaWFibGUgc2NyaXB0RmlsZQ0gICAgIyBEbyBzb21lIGZhbmN5IHJlZm9ybWF0dGluZyBvbiB0aGUgInNvdXJjZSIgY2FsbCB0byBoYW5kbGUgcGxhdGZvcm0NICAgICMgZGlmZmVyZW5jZXMgd2l0aCByZXNwZWN0IHRvIHBhdGhuYW1lcy4gIFVzZSBmb3JtYXQganVzdCBzbyB0aGF0IHRoZQ0gICAgIyBjb21tYW5kIGlzIGEgbGl0dGxlIGVhc2llciB0byByZWFkIChvdGhlcndpc2UgaXQnZCBiZSBmdWxsIG9mIA0gICAgIyBiYWNrc2xhc2hlZCBkb2xsYXIgc2lnbnMsIGV0Yy4NICAgIGFwcGVuZCBpbmRleCBbbGlzdCBzZXQgYXV0b19pbmRleChbZnVsbG5hbWUgJG5hbWVdKV0gXA0JICAgIFtmb3JtYXQgeyBbbGlzdCBzb3VyY2UgW2ZpbGUgam9pbiAkZGlyICVzXV19IFwNCSAgICBbZmlsZSBzcGxpdCAkc2NyaXB0RmlsZV1dICJcbiINfQ0NIyBDb25kaXRpb25hbGx5IGFkZCBzdXBwb3J0IGZvciBUY2wgYnl0ZSBjb2RlIGZpbGVzLiAgVGhlcmUgYXJlIHNvbWUNIyB0cmlja3kgZGV0YWlscyBoZXJlLiAgRmlyc3QsIHdlIG5lZWQgdG8gZ2V0IHRoZSB0YmNsb2FkIGxpYnJhcnkNIyBpbml0aWFsaXplZCBpbiB0aGUgY3VycmVudCBpbnRlcnByZXRlci4gIFdlIGNhbm5vdCBsb2FkIHRiY2xvYWQgaW50byB0aGUNIyBzbGF2ZSB1bnRpbCB3ZSBoYXZlIGRvbmUgc28gYmVjYXVzZSBpdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHRjbF9wYXRjaExldmVsDSMgdmFyaWFibGUuICBTZWNvbmQsIGJlY2F1c2UgdGhlIHBhY2thZ2UgaW5kZXggZmlsZSBtYXkgZGVmZXIgbG9hZGluZyB0aGUNIyBsaWJyYXJ5IHVudGlsIHdlIGludm9rZSBhIGNvbW1hbmQsIHdlIG5lZWQgdG8gZXhwbGljaXRseSBpbnZva2UgYXV0b19sb2FkDSMgdG8gZm9yY2UgaXQgdG8gYmUgbG9hZGVkLiAgVGhpcyBzaG91bGQgYmUgYSBub29wIGlmIHRoZSBwYWNrYWdlIGhhcw0jIGFscmVhZHkgYmVlbiBsb2FkZWQNDWF1dG9fbWtpbmRleF9wYXJzZXI6Omhvb2sgew0gICAgaWYgeyFbY2F0Y2gge3BhY2thZ2UgcmVxdWlyZSB0YmNsb2FkfV19IHsNCWlmIHtbbGxlbmd0aCBbaW5mbyBjb21tYW5kcyB0YmNsb2FkOjpiY3Byb2NdXSA9PSAwfSB7DQkgICAgYXV0b19sb2FkIHRiY2xvYWQ6OmJjcHJvYw0JfQ0JbG9hZCB7fSB0YmNsb2FkICRhdXRvX21raW5kZXhfcGFyc2VyOjpwYXJzZXINDQkjIEFVVE8gTUtJTkRFWDogIHRiY2xvYWQ6OmJjcHJvYyBuYW1lIGFyZ2xpc3QgYm9keQ0JIyBBZGRzIGFuIGVudHJ5IHRvIHRoZSBhdXRvIGluZGV4IGxpc3QgZm9yIHRoZSBnaXZlbiBwcmUtY29tcGlsZWQNCSMgcHJvY2VkdXJlIG5hbWUuICANDQlhdXRvX21raW5kZXhfcGFyc2VyOjpjb21tYW5kSW5pdCB0YmNsb2FkOjpiY3Byb2Mge25hbWUgYXJnc30gew0JICAgIHZhcmlhYmxlIGluZGV4DQkgICAgdmFyaWFibGUgc2NyaXB0RmlsZQ0JICAgICMgRG8gc29tZSBuaWNlIHJlZm9ybWF0dGluZyBvZiB0aGUgInNvdXJjZSIgY2FsbCwgdG8gZ2V0IGFyb3VuZA0JICAgICMgcGF0aCBkaWZmZXJlbmNlcyBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zLiAgV2UgdXNlIHRoZSBmb3JtYXQNCSAgICAjIGNvbW1hbmQganVzdCBzbyB0aGF0IHRoZSBjb2RlIGlzIGEgbGl0dGxlIGVhc2llciB0byByZWFkLg0JICAgIGFwcGVuZCBpbmRleCBbbGlzdCBzZXQgYXV0b19pbmRleChbZnVsbG5hbWUgJG5hbWVdKV0gXA0JCSAgICBbZm9ybWF0IHsgW2xpc3Qgc291cmNlIFtmaWxlIGpvaW4gJGRpciAlc11dfSBcDQkJICAgIFtmaWxlIHNwbGl0ICRzY3JpcHRGaWxlXV0gIlxuIg0JfQ0gICAgfQ19DQ0jIEFVVE8gTUtJTkRFWDogIG5hbWVzcGFjZSBldmFsIG5hbWUgY29tbWFuZCA/YXJnIGFyZy4uLj8NIyBBZGRzIHRoZSBuYW1lc3BhY2UgbmFtZSBvbnRvIHRoZSBjb250ZXh0IHN0YWNrIGFuZCBldmFsdWF0ZXMgdGhlDSMgYXNzb2NpYXRlZCBib2R5IG9mIGNvbW1hbmRzLg0jDSMgQVVUTyBNS0lOREVYOiAgbmFtZXNwYWNlIGltcG9ydCA/LWZvcmNlPyBwYXR0ZXJuID9wYXR0ZXJuLi4uPw0jIFBlcmZvcm1zIHRoZSAiaW1wb3J0IiBhY3Rpb24gaW4gdGhlIHBhcnNlciBpbnRlcnByZXRlci4gIFRoaXMgaXMNIyBpbXBvcnRhbnQgZm9yIGFueSBjb21tYW5kcyBjb250YWluZWQgaW4gYSBuYW1lc3BhY2UgdGhhdCBhZmZlY3QNIyB0aGUgaW5kZXguICBGb3IgZXhhbXBsZSwgYSBzY3JpcHQgbWF5IHNheSAiaXRjbDo6Y2xhc3MgLi4uIiwNIyBvciBpdCBtYXkgaW1wb3J0ICJpdGNsOjoqIiBhbmQgdGhlbiBzYXkgImNsYXNzIC4uLiIuICBUaGlzDSMgcHJvY2VkdXJlIGRvZXMgdGhlIGltcG9ydCBvcGVyYXRpb24sIGJ1dCBrZWVwcyB0cmFjayBvZiBpbXBvcnRlZA0jIHBhdHRlcm5zIHNvIHdlIGNhbiByZW1vdmUgdGhlIGltcG9ydHMgbGF0ZXIuDQ1hdXRvX21raW5kZXhfcGFyc2VyOjpjb21tYW5kIG5hbWVzcGFjZSB7b3AgYXJnc30gew0gICAgc3dpdGNoIC0tICRvcCB7DSAgICAgICAgZXZhbCB7DSAgICAgICAgICAgIHZhcmlhYmxlIHBhcnNlcg0gICAgICAgICAgICB2YXJpYWJsZSBjb250ZXh0U3RhY2sNDSAgICAgICAgICAgIHNldCBuYW1lIFtsaW5kZXggJGFyZ3MgMF0NICAgICAgICAgICAgc2V0IGFyZ3MgW2xyYW5nZSAkYXJncyAxIGVuZF0NDSAgICAgICAgICAgIHNldCBjb250ZXh0U3RhY2sgW2xpbnNlcnQgJGNvbnRleHRTdGFjayAwICRuYW1lXQ0JICAgICRwYXJzZXIgZXZhbCBbbGlzdCBfJUBuYW1lc3BhY2UgZXZhbCAkbmFtZV0gJGFyZ3MNICAgICAgICAgICAgc2V0IGNvbnRleHRTdGFjayBbbHJhbmdlICRjb250ZXh0U3RhY2sgMSBlbmRdDSAgICAgICAgfQ0gICAgICAgIGltcG9ydCB7DSAgICAgICAgICAgIHZhcmlhYmxlIHBhcnNlcg0gICAgICAgICAgICB2YXJpYWJsZSBpbXBvcnRzDSAgICAgICAgICAgIGZvcmVhY2ggcGF0dGVybiAkYXJncyB7DSAgICAgICAgICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlICRwYXR0ZXJuICItZm9yY2UiXX0gew0gICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgaW1wb3J0cyAkcGF0dGVybg0gICAgICAgICAgICAgICAgfQ0gICAgICAgICAgICB9DSAgICAgICAgICAgIGNhdGNoIHskcGFyc2VyIGV2YWwgIl8lQG5hbWVzcGFjZSBpbXBvcnQgJGFyZ3MifQ0gICAgICAgIH0NICAgIH0NfQ0NcmV0dXJuDQAAIy8jIGhpc3RvcnkudGNsIC0tDSMNIyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgaGlzdG9yeSBjb21tYW5kLg0jDSMgUkNTOiBAKCMpICRJZDogaGlzdG9yeS50Y2wsdiAxLjMuMTguMSAyMDAwLzA4LzA3IDIxOjMxOjQ3IGhvYmJzIEV4cCAkDSMNIyBDb3B5cmlnaHQgKGMpIDE5OTcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLg0jDSMgU2VlIHRoZSBmaWxlICJsaWNlbnNlLnRlcm1zIiBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIHJlZGlzdHJpYnV0aW9uDSMgb2YgdGhpcyBmaWxlLCBhbmQgZm9yIGEgRElTQ0xBSU1FUiBPRiBBTEwgV0FSUkFOVElFUy4NIw0NIyBUaGUgdGNsOjpoaXN0b3J5IGFycmF5IGhvbGRzIHRoZSBoaXN0b3J5IGxpc3QgYW5kDSMgc29tZSBhZGRpdGlvbmFsIGJvb2trZWVwaW5nIHZhcmlhYmxlcy4NIw0jIG5leHRpZAl0aGUgaW5kZXggdXNlZCBmb3IgdGhlIG5leHQgaGlzdG9yeSBsaXN0IGl0ZW0uDSMga2VlcAkJdGhlIG1heCBzaXplIG9mIHRoZSBoaXN0b3J5IGxpc3QNIyBvbGRlc3QJdGhlIGluZGV4IG9mIHRoZSBvbGRlc3QgaXRlbSBpbiB0aGUgaGlzdG9yeS4NDW5hbWVzcGFjZSBldmFsIHRjbCB7DSAgICB2YXJpYWJsZSBoaXN0b3J5DSAgICBpZiB7IVtpbmZvIGV4aXN0cyBoaXN0b3J5XX0gew0JYXJyYXkgc2V0IGhpc3Rvcnkgew0JICAgIG5leHRpZAkwDQkgICAga2VlcAkyMA0JICAgIG9sZGVzdAktMjANCX0NICAgIH0NfQ0NIyBoaXN0b3J5IC0tDSMNIwlUaGlzIGlzIHRoZSBtYWluIGhpc3RvcnkgY29tbWFuZC4gIFNlZSB0aGUgbWFuIHBhZ2UgZm9yIGl0cyBpbnRlcmZhY2UuDSMJVGhpcyBkb2VzIGFyZ3VtZW50IGNoZWNraW5nIGFuZCBjYWxscyBoZWxwZXIgcHJvY2VkdXJlcyBpbiB0aGUNIwloaXN0b3J5IG5hbWVzcGFjZS4NDXByb2MgaGlzdG9yeSB7YXJnc30gew0gICAgc2V0IGxlbiBbbGxlbmd0aCAkYXJnc10NICAgIGlmIHskbGVuID09IDB9IHsNCXJldHVybiBbdGNsOjpIaXN0SW5mb10NICAgIH0NICAgIHNldCBrZXkgW2xpbmRleCAkYXJncyAwXQ0gICAgc2V0IG9wdGlvbnMgImFkZCwgY2hhbmdlLCBjbGVhciwgZXZlbnQsIGluZm8sIGtlZXAsIG5leHRpZCwgb3IgcmVkbyINICAgIHN3aXRjaCAtZ2xvYiAtLSAka2V5IHsNCWEqIHsgIyBoaXN0b3J5IGFkZA0NCSAgICBpZiB7JGxlbiA+IDN9IHsNCQlyZXR1cm4gLWNvZGUgZXJyb3IgIndyb25nICMgYXJnczogc2hvdWxkIGJlIFwiaGlzdG9yeSBhZGQgZXZlbnQgP2V4ZWM/XCIiDQkgICAgfQ0JICAgIGlmIHshW3N0cmluZyBtYXRjaCAka2V5KiBhZGRdfSB7DQkJcmV0dXJuIC1jb2RlIGVycm9yICJiYWQgb3B0aW9uIFwiJGtleVwiOiBtdXN0IGJlICRvcHRpb25zIg0JICAgIH0NCSAgICBpZiB7JGxlbiA9PSAzfSB7DQkJc2V0IGFyZyBbbGluZGV4ICRhcmdzIDJdDQkJaWYgeyEgKFtzdHJpbmcgbWF0Y2ggZSogJGFyZ10gJiYgW3N0cmluZyBtYXRjaCAkYXJnKiBleGVjXSl9IHsNCQkgICAgcmV0dXJuIC1jb2RlIGVycm9yICJiYWQgYXJndW1lbnQgXCIkYXJnXCI6IHNob3VsZCBiZSBcImV4ZWNcIiINCQl9DQkgICAgfQ0JICAgIHJldHVybiBbdGNsOjpIaXN0QWRkIFtsaW5kZXggJGFyZ3MgMV0gW2xpbmRleCAkYXJncyAyXV0NCX0NCWNoKiB7ICMgaGlzdG9yeSBjaGFuZ2UNDQkgICAgaWYgeygkbGVuID4gMykgfHwgKCRsZW4gPCAyKX0gew0JCXJldHVybiAtY29kZSBlcnJvciAid3JvbmcgIyBhcmdzOiBzaG91bGQgYmUgXCJoaXN0b3J5IGNoYW5nZSBuZXdWYWx1ZSA/ZXZlbnQ/XCIiDQkgICAgfQ0JICAgIGlmIHshW3N0cmluZyBtYXRjaCAka2V5KiBjaGFuZ2VdfSB7DQkJcmV0dXJuIC1jb2RlIGVycm9yICJiYWQgb3B0aW9uIFwiJGtleVwiOiBtdXN0IGJlICRvcHRpb25zIg0JICAgIH0NCSAgICBpZiB7JGxlbiA9PSAyfSB7DQkJc2V0IGV2ZW50IDANCSAgICB9IGVsc2Ugew0JCXNldCBldmVudCBbbGluZGV4ICRhcmdzIDJdDQkgICAgfQ0NCSAgICByZXR1cm4gW3RjbDo6SGlzdENoYW5nZSBbbGluZGV4ICRhcmdzIDFdICRldmVudF0NCX0NCWNsKiB7ICMgaGlzdG9yeSBjbGVhcg0NCSAgICBpZiB7KCRsZW4gPiAxKX0gew0JCXJldHVybiAtY29kZSBlcnJvciAid3JvbmcgIyBhcmdzOiBzaG91bGQgYmUgXCJoaXN0b3J5IGNsZWFyXCIiDQkgICAgfQ0JICAgIGlmIHshW3N0cmluZyBtYXRjaCAka2V5KiBjbGVhcl19IHsNCQlyZXR1cm4gLWNvZGUgZXJyb3IgImJhZCBvcHRpb24gXCIka2V5XCI6IG11c3QgYmUgJG9wdGlvbnMiDQkgICAgfQ0JICAgIHJldHVybiBbdGNsOjpIaXN0Q2xlYXJdDQl9DQllKiB7ICMgaGlzdG9yeSBldmVudA0NCSAgICBpZiB7JGxlbiA+IDJ9IHsNCQlyZXR1cm4gLWNvZGUgZXJyb3IgIndyb25nICMgYXJnczogc2hvdWxkIGJlIFwiaGlzdG9yeSBldmVudCA/ZXZlbnQ/XCIiDQkgICAgfQ0JICAgIGlmIHshW3N0cmluZyBtYXRjaCAka2V5KiBldmVudF19IHsNCQlyZXR1cm4gLWNvZGUgZXJyb3IgImJhZCBvcHRpb24gXCIka2V5XCI6IG11c3QgYmUgJG9wdGlvbnMiDQkgICAgfQ0JICAgIGlmIHskbGVuID09IDF9IHsNCQlzZXQgZXZlbnQgLTENCSAgICB9IGVsc2Ugew0JCXNldCBldmVudCBbbGluZGV4ICRhcmdzIDFdDQkgICAgfQ0JICAgIHJldHVybiBbdGNsOjpIaXN0RXZlbnQgJGV2ZW50XQ0JfQ0JaSogeyAjIGhpc3RvcnkgaW5mbw0NCSAgICBpZiB7JGxlbiA+IDJ9IHsNCQlyZXR1cm4gLWNvZGUgZXJyb3IgIndyb25nICMgYXJnczogc2hvdWxkIGJlIFwiaGlzdG9yeSBpbmZvID9jb3VudD9cIiINCSAgICB9DQkgICAgaWYgeyFbc3RyaW5nIG1hdGNoICRrZXkqIGluZm9dfSB7DQkJcmV0dXJuIC1jb2RlIGVycm9yICJiYWQgb3B0aW9uIFwiJGtleVwiOiBtdXN0IGJlICRvcHRpb25zIg0JICAgIH0NCSAgICByZXR1cm4gW3RjbDo6SGlzdEluZm8gW2xpbmRleCAkYXJncyAxXV0NCX0NCWsqIHsgIyBoaXN0b3J5IGtlZXANDQkgICAgaWYgeyRsZW4gPiAyfSB7DQkJcmV0dXJuIC1jb2RlIGVycm9yICJ3cm9uZyAjIGFyZ3M6IHNob3VsZCBiZSBcImhpc3Rvcnkga2VlcCA/Y291bnQ/XCIiDQkgICAgfQ0JICAgIGlmIHskbGVuID09IDF9IHsNCQlyZXR1cm4gW3RjbDo6SGlzdEtlZXBdDQkgICAgfSBlbHNlIHsNCQlzZXQgbGltaXQgW2xpbmRleCAkYXJncyAxXQ0JCWlmIHtbY2F0Y2gge2V4cHIge34kbGltaXR9fV0gfHwgKCRsaW1pdCA8IDApfSB7DQkJICAgIHJldHVybiAtY29kZSBlcnJvciAiaWxsZWdhbCBrZWVwIGNvdW50IFwiJGxpbWl0XCIiDQkJfQ0JCXJldHVybiBbdGNsOjpIaXN0S2VlcCAkbGltaXRdDQkgICAgfQ0JfQ0JbiogeyAjIGhpc3RvcnkgbmV4dGlkDQ0JICAgIGlmIHskbGVuID4gMX0gew0JCXJldHVybiAtY29kZSBlcnJvciAid3JvbmcgIyBhcmdzOiBzaG91bGQgYmUgXCJoaXN0b3J5IG5leHRpZFwiIg0JICAgIH0NCSAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggJGtleSogbmV4dGlkXX0gew0JCXJldHVybiAtY29kZSBlcnJvciAiYmFkIG9wdGlvbiBcIiRrZXlcIjogbXVzdCBiZSAkb3B0aW9ucyINCSAgICB9DQkgICAgcmV0dXJuIFtleHByIHskdGNsOjpoaXN0b3J5KG5leHRpZCkgKyAxfV0NCX0NCXIqIHsgIyBoaXN0b3J5IHJlZG8NDQkgICAgaWYgeyRsZW4gPiAyfSB7DQkJcmV0dXJuIC1jb2RlIGVycm9yICJ3cm9uZyAjIGFyZ3M6IHNob3VsZCBiZSBcImhpc3RvcnkgcmVkbyA/ZXZlbnQ/XCIiDQkgICAgfQ0JICAgIGlmIHshW3N0cmluZyBtYXRjaCAka2V5KiByZWRvXX0gew0JCXJldHVybiAtY29kZSBlcnJvciAiYmFkIG9wdGlvbiBcIiRrZXlcIjogbXVzdCBiZSAkb3B0aW9ucyINCSAgICB9DQkgICAgcmV0dXJuIFt0Y2w6Okhpc3RSZWRvIFtsaW5kZXggJGFyZ3MgMV1dDQl9DQlkZWZhdWx0IHsNCSAgICByZXR1cm4gLWNvZGUgZXJyb3IgImJhZCBvcHRpb24gXCIka2V5XCI6IG11c3QgYmUgJG9wdGlvbnMiDQl9DSAgICB9DX0NDSMgdGNsOjpIaXN0QWRkIC0tDSMNIwlBZGQgYW4gaXRlbSB0byB0aGUgaGlzdG9yeSwgYW5kIG9wdGlvbmFsbHkgZXZhbCBpdCBhdCB0aGUgZ2xvYmFsIHNjb3BlDSMNIyBQYXJhbWV0ZXJzOg0jCWNvbW1hbmQJCXRoZSBjb21tYW5kIHRvIGFkZA0jCWV4ZWMJCShvcHRpb25hbCkgYSBzdWJzdHJpbmcgb2YgImV4ZWMiIGNhdXNlcyB0aGUNIwkJCWNvbW1hbmQgdG8gYmUgZXZhbGVkLg0jIFJlc3VsdHM6DSMgCUlmIGV4ZWN1dGluZywgdGhlbiB0aGUgcmVzdWx0cyBvZiB0aGUgY29tbWFuZCBhcmUgcmV0dXJuZWQNIw0jIFNpZGUgRWZmZWN0czoNIwlBZGRzIHRvIHRoZSBoaXN0b3J5IGxpc3QNDSBwcm9jIHRjbDo6SGlzdEFkZCB7Y29tbWFuZCB7ZXhlYyB7fX19IHsNICAgIHZhcmlhYmxlIGhpc3RvcnkNICAgIHNldCBpIFtpbmNyIGhpc3RvcnkobmV4dGlkKV0NICAgIHNldCBoaXN0b3J5KCRpKSAkY29tbWFuZA0gICAgc2V0IGogW2luY3IgaGlzdG9yeShvbGRlc3QpXQ0gICAgaWYge1tpbmZvIGV4aXN0cyBoaXN0b3J5KCRqKV19IHt1bnNldCBoaXN0b3J5KCRqKX0NICAgIGlmIHtbc3RyaW5nIG1hdGNoIGUqICRleGVjXX0gew0JcmV0dXJuIFt1cGxldmVsICMwICRjb21tYW5kXQ0gICAgfSBlbHNlIHsNCXJldHVybiB7fQ0gICAgfQ19DQ0jIHRjbDo6SGlzdEtlZXAgLS0NIw0jCVNldCBvciBxdWVyeSB0aGUgbGltaXQgb24gdGhlIGxlbmd0aCBvZiB0aGUgaGlzdG9yeSBsaXN0DSMNIyBQYXJhbWV0ZXJzOg0jCWxpbWl0CShvcHRpb25hbCkgdGhlIGxlbmd0aCBvZiB0aGUgaGlzdG9yeSBsaXN0DSMNIyBSZXN1bHRzOg0jCUlmIG5vIGxpbWl0IGlzIHNwZWNpZmllZCwgdGhlIGN1cnJlbnQgbGltaXQgaXMgcmV0dXJuZWQNIw0jIFNpZGUgRWZmZWN0czoNIwlVcGRhdGVzIGhpc3Rvcnkoa2VlcCkgaWYgYSBsaW1pdCBpcyBzcGVjaWZpZWQNDSBwcm9jIHRjbDo6SGlzdEtlZXAge3tsaW1pdCB7fX19IHsNICAgIHZhcmlhYmxlIGhpc3RvcnkNICAgIGlmIHtbc3RyaW5nIGxlbmd0aCAkbGltaXRdID09IDB9IHsNCXJldHVybiAkaGlzdG9yeShrZWVwKQ0gICAgfSBlbHNlIHsNCXNldCBvbGRvbGQgJGhpc3Rvcnkob2xkZXN0KQ0Jc2V0IGhpc3Rvcnkob2xkZXN0KSBbZXhwciB7JGhpc3RvcnkobmV4dGlkKSAtICRsaW1pdH1dDQlmb3Ige30geyRvbGRvbGQgPD0gJGhpc3Rvcnkob2xkZXN0KX0ge2luY3Igb2xkb2xkfSB7DQkgICAgaWYge1tpbmZvIGV4aXN0cyBoaXN0b3J5KCRvbGRvbGQpXX0ge3Vuc2V0IGhpc3RvcnkoJG9sZG9sZCl9DQl9DQlzZXQgaGlzdG9yeShrZWVwKSAkbGltaXQNICAgIH0NfQ0NIyB0Y2w6Okhpc3RDbGVhciAtLQ0jDSMJRXJhc2UgdGhlIGhpc3RvcnkgbGlzdA0jDSMgUGFyYW1ldGVyczoNIwlub25lDSMNIyBSZXN1bHRzOg0jCW5vbmUNIw0jIFNpZGUgRWZmZWN0czoNIwlSZXNldHMgdGhlIGhpc3RvcnkgYXJyYXksIGV4Y2VwdCBmb3IgdGhlIGtlZXAgbGltaXQNDSBwcm9jIHRjbDo6SGlzdENsZWFyIHt9IHsNICAgIHZhcmlhYmxlIGhpc3RvcnkNICAgIHNldCBrZWVwICRoaXN0b3J5KGtlZXApDSAgICB1bnNldCBoaXN0b3J5DSAgICBhcnJheSBzZXQgaGlzdG9yeSBbbGlzdCBcDQluZXh0aWQJMAlcDQlrZWVwCSRrZWVwCVwNCW9sZGVzdAktJGtlZXAJXA0gICAgXQ19DQ0jIHRjbDo6SGlzdEluZm8gLS0NIw0jCVJldHVybiBhIHByZXR0eS1wcmludGVkIHZlcnNpb24gb2YgdGhlIGhpc3RvcnkgbGlzdA0jDSMgUGFyYW1ldGVyczoNIwludW0JKG9wdGlvbmFsKSB0aGUgbGVuZ3RoIG9mIHRoZSBoaXN0b3J5IGxpc3QgdG8gcmV0dXJuDSMNIyBSZXN1bHRzOg0jCUEgZm9ybWF0dGVkIGhpc3RvcnkgbGlzdA0NIHByb2MgdGNsOjpIaXN0SW5mbyB7e251bSB7fX19IHsNICAgIHZhcmlhYmxlIGhpc3RvcnkNICAgIGlmIHskbnVtID09IHt9fSB7DQlzZXQgbnVtIFtleHByIHskaGlzdG9yeShrZWVwKSArIDF9XQ0gICAgfQ0gICAgc2V0IHJlc3VsdCB7fQ0gICAgc2V0IG5ld2xpbmUgIiINICAgIGZvciB7c2V0IGkgW2V4cHIgeyRoaXN0b3J5KG5leHRpZCkgLSAkbnVtICsgMX1dfSBcDQkgICAgeyRpIDw9ICRoaXN0b3J5KG5leHRpZCl9IHtpbmNyIGl9IHsNCWlmIHshW2luZm8gZXhpc3RzIGhpc3RvcnkoJGkpXX0gew0JICAgIGNvbnRpbnVlDQl9DQlzZXQgY21kIFtzdHJpbmcgdHJpbXJpZ2h0ICRoaXN0b3J5KCRpKSBcIFxuXQ0JcmVnc3ViIC1hbGwgXG4gJGNtZCAiXG5cdCIgY21kDQlhcHBlbmQgcmVzdWx0ICRuZXdsaW5lW2Zvcm1hdCAiJTZkICAlcyIgJGkgJGNtZF0NCXNldCBuZXdsaW5lIFxuDSAgICB9DSAgICByZXR1cm4gJHJlc3VsdA19DQ0jIHRjbDo6SGlzdFJlZG8gLS0NIw0jCUZldGNoIHRoZSBwcmV2aW91cyBvciBzcGVjaWZpZWQgZXZlbnQsIGV4ZWN1dGUgaXQsIGFuZCB0aGVuDSMJcmVwbGFjZSB0aGUgY3VycmVudCBoaXN0b3J5IGl0ZW0gd2l0aCB0aGF0IGV2ZW50Lg0jDSMgUGFyYW1ldGVyczoNIwlldmVudAkob3B0aW9uYWwpIGluZGV4IG9mIGhpc3RvcnkgaXRlbSB0byByZWRvLiAgRGVmYXVsdHMgdG8gLTEsDSMJCXdoaWNoIG1lYW5zIHRoZSBwcmV2aW91cyBldmVudC4NIw0jIFJlc3VsdHM6DSMJVGhvc2Ugb2YgdGhlIGNvbW1hbmQgYmVpbmcgcmVkb25lLg0jDSMgU2lkZSBFZmZlY3RzOg0jCVJlcGxhY2VzIHRoZSBjdXJyZW50IGhpc3RvcnkgbGlzdCBpdGVtIHdpdGggdGhlIG9uZSBiZWluZyByZWRvbmUuDQ0gcHJvYyB0Y2w6Okhpc3RSZWRvIHt7ZXZlbnQgLTF9fSB7DSAgICB2YXJpYWJsZSBoaXN0b3J5DSAgICBpZiB7W3N0cmluZyBsZW5ndGggJGV2ZW50XSA9PSAwfSB7DQlzZXQgZXZlbnQgLTENICAgIH0NICAgIHNldCBpIFtIaXN0SW5kZXggJGV2ZW50XQ0gICAgaWYgeyRpID09ICRoaXN0b3J5KG5leHRpZCl9IHsNCXJldHVybiAtY29kZSBlcnJvciAiY2Fubm90IHJlZG8gdGhlIGN1cnJlbnQgZXZlbnQiDSAgICB9DSAgICBzZXQgY21kICRoaXN0b3J5KCRpKQ0gICAgSGlzdENoYW5nZSAkY21kIDANICAgIHVwbGV2ZWwgIzAgJGNtZA19DQ0jIHRjbDo6SGlzdEluZGV4IC0tDSMNIwlNYXAgZnJvbSBhbiBldmVudCBzcGVjaWZpZXIgdG8gYW4gaW5kZXggaW4gdGhlIGhpc3RvcnkgbGlzdC4NIw0jIFBhcmFtZXRlcnM6DSMJZXZlbnQJaW5kZXggb2YgaGlzdG9yeSBpdGVtIHRvIHJlZG8uDSMJCUlmIHRoaXMgaXMgYSBwb3NpdGl2ZSBudW1iZXIsIGl0IGlzIHVzZWQgZGlyZWN0bHkuDSMJCUlmIGl0IGlzIGEgbmVnYXRpdmUgbnVtYmVyLCB0aGVuIGl0IGNvdW50cyBiYWNrIHRvIGEgcHJldmlvdXMNIwkJZXZlbnQsIHdoZXJlIC0xIGlzIHRoZSBtb3N0IHJlY2VudCBldmVudC4NIwkJQSBzdHJpbmcgY2FuIGJlIG1hdGNoZWQsIGVpdGhlciBieSBiZWluZyB0aGUgcHJlZml4IG9mDSMJCWEgY29tbWFuZCBvciBieSBtYXRjaGluZyBhIGNvbW1hbmQgd2l0aCBzdHJpbmcgbWF0Y2guDSMNIyBSZXN1bHRzOg0jCVRoZSBpbmRleCBpbnRvIGhpc3RvcnksIG9yIGFuIGVycm9yIGlmIHRoZSBpbmRleCBkaWRuJ3QgbWF0Y2guDQ0gcHJvYyB0Y2w6Okhpc3RJbmRleCB7ZXZlbnR9IHsNICAgIHZhcmlhYmxlIGhpc3RvcnkNICAgIGlmIHtbY2F0Y2gge2V4cHIge34kZXZlbnR9fV19IHsNCWZvciB7c2V0IGkgW2V4cHIgeyRoaXN0b3J5KG5leHRpZCktMX1dfSB7W2luZm8gZXhpc3RzIGhpc3RvcnkoJGkpXX0gXA0JCXtpbmNyIGkgLTF9IHsNCSAgICBpZiB7W3N0cmluZyBtYXRjaCAkZXZlbnQqICRoaXN0b3J5KCRpKV19IHsNCQlyZXR1cm4gJGk7DQkgICAgfQ0JICAgIGlmIHtbc3RyaW5nIG1hdGNoICRldmVudCAkaGlzdG9yeSgkaSldfSB7DQkJcmV0dXJuICRpOw0JICAgIH0NCX0NCXJldHVybiAtY29kZSBlcnJvciAibm8gZXZlbnQgbWF0Y2hlcyBcIiRldmVudFwiIg0gICAgfSBlbHNlaWYgeyRldmVudCA8PSAwfSB7DQlzZXQgaSBbZXhwciB7JGhpc3RvcnkobmV4dGlkKSArICRldmVudH1dDSAgICB9IGVsc2Ugew0Jc2V0IGkgJGV2ZW50DSAgICB9DSAgICBpZiB7JGkgPD0gJGhpc3Rvcnkob2xkZXN0KX0gew0JcmV0dXJuIC1jb2RlIGVycm9yICJldmVudCBcIiRldmVudFwiIGlzIHRvbyBmYXIgaW4gdGhlIHBhc3QiDSAgICB9DSAgICBpZiB7JGkgPiAkaGlzdG9yeShuZXh0aWQpfSB7DQlyZXR1cm4gLWNvZGUgZXJyb3IgImV2ZW50IFwiJGV2ZW50XCIgaGFzbid0IG9jY3VyZWQgeWV0Ig0gICAgfQ0gICAgcmV0dXJuICRpDX0NDSMgdGNsOjpIaXN0RXZlbnQgLS0NIw0jCU1hcCBmcm9tIGFuIGV2ZW50IHNwZWNpZmllciB0byB0aGUgdmFsdWUgaW4gdGhlIGhpc3RvcnkgbGlzdC4NIw0jIFBhcmFtZXRlcnM6DSMJZXZlbnQJaW5kZXggb2YgaGlzdG9yeSBpdGVtIHRvIHJlZG8uICBTZWUgaW5kZXggZm9yIGENIwkJZGVzY3JpcHRpb24gb2YgcG9zc2libGUgZXZlbnQgcGF0dGVybnMuDSMNIyBSZXN1bHRzOg0jCVRoZSB2YWx1ZSBmcm9tIHRoZSBoaXN0b3J5IGxpc3QuDQ0gcHJvYyB0Y2w6Okhpc3RFdmVudCB7ZXZlbnR9IHsNICAgIHZhcmlhYmxlIGhpc3RvcnkNICAgIHNldCBpIFtIaXN0SW5kZXggJGV2ZW50XQ0gICAgaWYge1tpbmZvIGV4aXN0cyBoaXN0b3J5KCRpKV19IHsNCXJldHVybiBbc3RyaW5nIHRyaW1yaWdodCAkaGlzdG9yeSgkaSkgXCBcbl0NICAgIH0gZWxzZSB7DQlyZXR1cm4gIiI7DSAgICB9DX0NDSMgdGNsOjpIaXN0Q2hhbmdlIC0tDSMNIwlSZXBsYWNlIGEgdmFsdWUgaW4gdGhlIGhpc3RvcnkgbGlzdC4NIw0jIFBhcmFtZXRlcnM6DSMJY21kCVRoZSBuZXcgdmFsdWUgdG8gcHV0IGludG8gdGhlIGhpc3RvcnkgbGlzdC4NIwlldmVudAkob3B0aW9uYWwpIGluZGV4IG9mIGhpc3RvcnkgaXRlbSB0byByZWRvLiAgU2VlIGluZGV4IGZvciBhDSMJCWRlc2NyaXB0aW9uIG9mIHBvc3NpYmxlIGV2ZW50IHBhdHRlcm5zLiAgVGhpcyBkZWZhdWx0cw0jCQl0byAwLCB3aGljaCBzcGVjaWZpZXMgdGhlIGN1cnJlbnQgZXZlbnQuDSMNIyBTaWRlIEVmZmVjdHM6DSMJQ2hhbmdlcyB0aGUgaGlzdG9yeSBsaXN0Lg0NIHByb2MgdGNsOjpIaXN0Q2hhbmdlIHtjbWQge2V2ZW50IDB9fSB7DSAgICB2YXJpYWJsZSBoaXN0b3J5DSAgICBzZXQgaSBbSGlzdEluZGV4ICRldmVudF0NICAgIHNldCBoaXN0b3J5KCRpKSAkY21kDX0NAABEoCMgaW5pdC50Y2wgLS0NIw0jIERlZmF1bHQgc3lzdGVtIHN0YXJ0dXAgZmlsZSBmb3IgVGNsLWJhc2VkIGFwcGxpY2F0aW9ucy4gIERlZmluZXMNIyAidW5rbm93biIgcHJvY2VkdXJlIGFuZCBhdXRvLWxvYWQgZmFjaWxpdGllcy4NIw0jIFJDUzogQCgjKSAkSWQ6IGluaXQudGNsLHYgMS4zOS4yLjMgMjAwMS8wOC8yNCAxNjoxOTowOSBkZ3AgRXhwICQNIw0jIENvcHlyaWdodCAoYykgMTk5MS0xOTkzIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuDSMgQ29weXJpZ2h0IChjKSAxOTk0LTE5OTYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLg0jIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFNjcmlwdGljcyBDb3Jwb3JhdGlvbi4NIw0jIFNlZSB0aGUgZmlsZSAibGljZW5zZS50ZXJtcyIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbg0jIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuDSMNDWlmIHtbaW5mbyBjb21tYW5kcyBwYWNrYWdlXSA9PSAiIn0gew0gICAgZXJyb3IgInZlcnNpb24gbWlzbWF0Y2g6IGxpYnJhcnlcbnNjcmlwdHMgZXhwZWN0IFRjbCB2ZXJzaW9uIDcuNWIxIG9yIGxhdGVyIGJ1dCB0aGUgbG9hZGVkIHZlcnNpb24gaXNcbm9ubHkgW2luZm8gcGF0Y2hsZXZlbF0iDX0NcGFja2FnZSByZXF1aXJlIC1leGFjdCBUY2wgOC4zDQ0jIENvbXB1dGUgdGhlIGF1dG8gcGF0aCB0byB1c2UgaW4gdGhpcyBpbnRlcnByZXRlci4NIyBUaGUgdmFsdWVzIG9uIHRoZSBwYXRoIGNvbWUgZnJvbSBzZXZlcmFsIGxvY2F0aW9uczoNIw0jIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBUQ0xMSUJQQVRIDSMNIyB0Y2xfbGlicmFyeSwgd2hpY2ggaXMgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgaW5pdC50Y2wgc2NyaXB0Lg0jIHRjbEluaXRTY3JpcHQuaCBzZWFyY2hlcyBhcm91bmQgZm9yIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzDSMgaW5pdC50Y2wgYW5kIGRlZmluZXMgdGNsX2xpYnJhcnkgdG8gdGhhdCBsb2NhdGlvbiBiZWZvcmUgc291cmNpbmcgaXQuDSMNIyBUaGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0Y2xfbGlicmFyeS4gQWRkaW5nIHRoZSBwYXJlbnQNIyBtZWFucyB0aGF0IHBhY2thZ2VzIGluIHBlZXIgZGlyZWN0b3JpZXMgd2lsbCBiZSBmb3VuZCBhdXRvbWF0aWNhbGx5Lg0jDSMgQWxzbyBhZGQgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZXhlY3V0YWJsZSBpcyBsb2NhdGVkLCBwbHVzIC4uL2xpYg0jIHJlbGF0aXZlIHRvIHRoYXQgcGF0aC4NIw0jIHRjbF9wa2dQYXRoLCB3aGljaCBpcyBzZXQgYnkgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzDSMJT24gVU5JWCBpdCBpcyBjb21waWxlZCBpbg0jICAgICAgIE9uIFdpbmRvd3MsIGl0IGlzIG5vdCB1c2VkDSMJT24gTWFjaW50b3NoIGl0IGlzICJUb29sIENvbW1hbmQgTGFuZ3VhZ2UiIGluIHRoZSBFeHRlbnNpb25zIGZvbGRlcg0NaWYgeyFbaW5mbyBleGlzdHMgYXV0b19wYXRoXX0gew0gICAgaWYge1tpbmZvIGV4aXN0IGVudihUQ0xMSUJQQVRIKV19IHsNCXNldCBhdXRvX3BhdGggJGVudihUQ0xMSUJQQVRIKQ0gICAgfSBlbHNlIHsNCXNldCBhdXRvX3BhdGggIiINICAgIH0NfQ1pZiB7W3N0cmluZyBjb21wYXJlIFtpbmZvIGxpYnJhcnldIHt9XX0gew0gICAgZm9yZWFjaCBfX2RpciBbbGlzdCBbaW5mbyBsaWJyYXJ5XSBbZmlsZSBkaXJuYW1lIFtpbmZvIGxpYnJhcnldXV0gew0JaWYge1tsc2VhcmNoIC1leGFjdCAkYXV0b19wYXRoICRfX2Rpcl0gPCAwfSB7DQkgICAgbGFwcGVuZCBhdXRvX3BhdGggJF9fZGlyDQl9DSAgICB9DX0Nc2V0IF9fZGlyIFtmaWxlIGpvaW4gW2ZpbGUgZGlybmFtZSBbZmlsZSBkaXJuYW1lIFwNCVtpbmZvIG5hbWVvZmV4ZWN1dGFibGVdXV0gbGliXQ1pZiB7W2xzZWFyY2ggLWV4YWN0ICRhdXRvX3BhdGggJF9fZGlyXSA8IDB9IHsNICAgIGxhcHBlbmQgYXV0b19wYXRoICRfX2Rpcg19DWlmIHtbaW5mbyBleGlzdCB0Y2xfcGtnUGF0aF19IHsNICAgIGZvcmVhY2ggX19kaXIgJHRjbF9wa2dQYXRoIHsNCWlmIHtbbHNlYXJjaCAtZXhhY3QgJGF1dG9fcGF0aCAkX19kaXJdIDwgMH0gew0JICAgIGxhcHBlbmQgYXV0b19wYXRoICRfX2Rpcg0JfQ0gICAgfQ19DWlmIHtbaW5mbyBleGlzdHMgX19kaXJdfSB7DSAgICB1bnNldCBfX2Rpcg19DSAgDSMgV2luZG93cyBzcGVjaWZpYyBlbmQgb2YgaW5pdGlhbGl6YXRpb24NDWlmIHsoIVtpbnRlcnAgaXNzYWZlXSkgJiYgW3N0cmluZyBlcXVhbCAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAid2luZG93cyJdfSB7DSAgICBuYW1lc3BhY2UgZXZhbCB0Y2wgew0JcHJvYyBlbnZUcmFjZVByb2Mge2xvIG4xIG4yIG9wfSB7DQkgICAgc2V0IHggJDo6ZW52KCRuMikNCSAgICBzZXQgOjplbnYoJGxvKSAkeA0JICAgIHNldCA6OmVudihbc3RyaW5nIHRvdXBwZXIgJGxvXSkgJHgNCX0NICAgIH0NICAgIGZvcmVhY2ggcCBbYXJyYXkgbmFtZXMgZW52XSB7DQlzZXQgdSBbc3RyaW5nIHRvdXBwZXIgJHBdDQlpZiB7W3N0cmluZyBjb21wYXJlICR1ICRwXX0gew0JICAgIHN3aXRjaCAtLSAkdSB7DQkJQ09NU1BFQyAtDQkJUEFUSCB7DQkJICAgIGlmIHshW2luZm8gZXhpc3RzIGVudigkdSldfSB7DQkJCXNldCBlbnYoJHUpICRlbnYoJHApDQkJICAgIH0NCQkgICAgdHJhY2UgdmFyaWFibGUgZW52KCRwKSB3IFtsaXN0IHRjbDo6ZW52VHJhY2VQcm9jICRwXQ0JCSAgICB0cmFjZSB2YXJpYWJsZSBlbnYoJHUpIHcgW2xpc3QgdGNsOjplbnZUcmFjZVByb2MgJHBdDQkJfQ0JICAgIH0NCX0NICAgIH0NICAgIGlmIHtbaW5mbyBleGlzdHMgcF19IHsNCXVuc2V0IHANICAgIH0NICAgIGlmIHtbaW5mbyBleGlzdHMgdV19IHsNCXVuc2V0IHUNICAgIH0NICAgIGlmIHshW2luZm8gZXhpc3RzIGVudihDT01TUEVDKV19IHsNCWlmIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ob3MpICJXaW5kb3dzIE5UIl19IHsNCSAgICBzZXQgZW52KENPTVNQRUMpIGNtZC5leGUNCX0gZWxzZSB7DQkgICAgc2V0IGVudihDT01TUEVDKSBjb21tYW5kLmNvbQ0JfQ0gICAgfQ19DQ0jIFNldHVwIHRoZSB1bmtub3duIHBhY2thZ2UgaGFuZGxlcg0NcGFja2FnZSB1bmtub3duIHRjbFBrZ1Vua25vd24NDSMgQ29uZGl0aW9uYWxpemUgZm9yIHByZXNlbmNlIG9mIGV4ZWMuDQ1pZiB7W2xsZW5ndGggW2luZm8gY29tbWFuZHMgZXhlY11dID09IDB9IHsNDSAgICAjIFNvbWUgbWFjaGluZXMsIHN1Y2ggYXMgdGhlIE1hY2ludG9zaCwgZG8gbm90IGhhdmUgZXhlYy4gQWxzbywgb24gYWxsDSAgICAjIHBsYXRmb3Jtcywgc2FmZSBpbnRlcnByZXRlcnMgZG8gbm90IGhhdmUgZXhlYy4NDSAgICBzZXQgYXV0b19ub2V4ZWMgMQ19DXNldCBlcnJvckNvZGUgIiINc2V0IGVycm9ySW5mbyAiIg0NIyBEZWZpbmUgYSBsb2cgY29tbWFuZCAod2hpY2ggY2FuIGJlIG92ZXJ3aXR0ZW4gdG8gbG9nIGVycm9ycw0jIGRpZmZlcmVudGx5LCBzcGVjaWFsbHkgd2hlbiBzdGRlcnIgaXMgbm90IGF2YWlsYWJsZSkNDWlmIHtbbGxlbmd0aCBbaW5mbyBjb21tYW5kcyB0Y2xMb2ddXSA9PSAwfSB7DSAgICBwcm9jIHRjbExvZyB7c3RyaW5nfSB7DQljYXRjaCB7cHV0cyBzdGRlcnIgJHN0cmluZ30NICAgIH0NfQ0NIyB1bmtub3duIC0tDSMgVGhpcyBwcm9jZWR1cmUgaXMgY2FsbGVkIHdoZW4gYSBUY2wgY29tbWFuZCBpcyBpbnZva2VkIHRoYXQgZG9lc24ndA0jIGV4aXN0IGluIHRoZSBpbnRlcnByZXRlci4gIEl0IHRha2VzIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gbWFrZSB0aGUNIyBjb21tYW5kIGF2YWlsYWJsZToNIw0jCTEuIFNlZSBpZiB0aGUgY29tbWFuZCBoYXMgdGhlIGZvcm0gIm5hbWVzcGFjZSBpbnNjb3BlIG5zIGNtZCIgYW5kDSMJICAgaWYgc28sIGNvbmNhdGVuYXRlIGl0cyBhcmd1bWVudHMgb250byB0aGUgZW5kIGFuZCBldmFsdWF0ZSBpdC4NIwkyLiBTZWUgaWYgdGhlIGF1dG9sb2FkIGZhY2lsaXR5IGNhbiBsb2NhdGUgdGhlIGNvbW1hbmQgaW4gYQ0jCSAgIFRjbCBzY3JpcHQgZmlsZS4gIElmIHNvLCBsb2FkIGl0IGFuZCBleGVjdXRlIGl0Lg0jCTMuIElmIHRoZSBjb21tYW5kIHdhcyBpbnZva2VkIGludGVyYWN0aXZlbHkgYXQgdG9wLWxldmVsOg0jCSAgICAoYSkgc2VlIGlmIHRoZSBjb21tYW5kIGV4aXN0cyBhcyBhbiBleGVjdXRhYmxlIFVOSVggcHJvZ3JhbS4NIwkJSWYgc28sICJleGVjIiB0aGUgY29tbWFuZC4NIwkgICAgKGIpIHNlZSBpZiB0aGUgY29tbWFuZCByZXF1ZXN0cyBjc2gtbGlrZSBoaXN0b3J5IHN1YnN0aXR1dGlvbg0jCQlpbiBvbmUgb2YgdGhlIGNvbW1vbiBmb3JtcyAhISwgITxudW1iZXI+LCBvciBeb2xkXm5ldy4gIElmDSMJCXNvLCBlbXVsYXRlIGNzaCdzIGhpc3Rvcnkgc3Vic3RpdHV0aW9uLg0jCSAgICAoYykgc2VlIGlmIHRoZSBjb21tYW5kIGlzIGEgdW5pcXVlIGFiYnJldmlhdGlvbiBmb3IgYW5vdGhlcg0jCQljb21tYW5kLiAgSWYgc28sIGludm9rZSB0aGUgY29tbWFuZC4NIw0jIEFyZ3VtZW50czoNIyBhcmdzIC0JQSBsaXN0IHdob3NlIGVsZW1lbnRzIGFyZSB0aGUgd29yZHMgb2YgdGhlIG9yaWdpbmFsDSMJCWNvbW1hbmQsIGluY2x1ZGluZyB0aGUgY29tbWFuZCBuYW1lLg0NcHJvYyB1bmtub3duIGFyZ3Mgew0gICAgZ2xvYmFsIGF1dG9fbm9leGVjIGF1dG9fbm9sb2FkIGVudiB1bmtub3duX3BlbmRpbmcgdGNsX2ludGVyYWN0aXZlDSAgICBnbG9iYWwgZXJyb3JDb2RlIGVycm9ySW5mbw0NICAgICMgSWYgdGhlIGNvbW1hbmQgd29yZCBoYXMgdGhlIGZvcm0gIm5hbWVzcGFjZSBpbnNjb3BlIG5zIGNtZCINICAgICMgdGhlbiBjb25jYXRlbmF0ZSBpdHMgYXJndW1lbnRzIG9udG8gdGhlIGVuZCBhbmQgZXZhbHVhdGUgaXQuDQ0gICAgc2V0IGNtZCBbbGluZGV4ICRhcmdzIDBdDSAgICBpZiB7W3JlZ2V4cCAiXm5hbWVzcGFjZVxbIFx0XG5cXStpbnNjb3BlIiAkY21kXSAmJiBbbGxlbmd0aCAkY21kXSA9PSA0fSB7DSAgICAgICAgc2V0IGFyZ2xpc3QgW2xyYW5nZSAkYXJncyAxIGVuZF0NCXNldCByZXQgW2NhdGNoIHt1cGxldmVsIDEgOjokY21kICRhcmdsaXN0fSByZXN1bHRdDSAgICAgICAgaWYgeyRyZXQgPT0gMH0gew0gICAgICAgICAgICByZXR1cm4gJHJlc3VsdA0gICAgICAgIH0gZWxzZSB7DQkgICAgcmV0dXJuIC1jb2RlICRyZXQgLWVycm9yY29kZSAkZXJyb3JDb2RlICRyZXN1bHQNICAgICAgICB9DSAgICB9DQ0gICAgIyBTYXZlIHRoZSB2YWx1ZXMgb2YgZXJyb3JDb2RlIGFuZCBlcnJvckluZm8gdmFyaWFibGVzLCBzaW5jZSB0aGV5DSAgICAjIG1heSBnZXQgbW9kaWZpZWQgaWYgY2F1Z2h0IGVycm9ycyBvY2N1ciBiZWxvdy4gIFRoZSB2YXJpYWJsZXMgd2lsbA0gICAgIyBiZSByZXN0b3JlZCBqdXN0IGJlZm9yZSByZS1leGVjdXRpbmcgdGhlIG1pc3NpbmcgY29tbWFuZC4NDSAgICBzZXQgc2F2ZWRFcnJvckNvZGUgJGVycm9yQ29kZQ0gICAgc2V0IHNhdmVkRXJyb3JJbmZvICRlcnJvckluZm8NICAgIHNldCBuYW1lIFtsaW5kZXggJGFyZ3MgMF0NICAgIGlmIHshW2luZm8gZXhpc3RzIGF1dG9fbm9sb2FkXX0gew0JIw0JIyBNYWtlIHN1cmUgd2UncmUgbm90IHRyeWluZyB0byBsb2FkIHRoZSBzYW1lIHByb2MgdHdpY2UuDQkjDQlpZiB7W2luZm8gZXhpc3RzIHVua25vd25fcGVuZGluZygkbmFtZSldfSB7DQkgICAgcmV0dXJuIC1jb2RlIGVycm9yICJzZWxmLXJlZmVyZW50aWFsIHJlY3Vyc2lvbiBpbiBcInVua25vd25cIiBmb3IgY29tbWFuZCBcIiRuYW1lXCIiOw0JfQ0Jc2V0IHVua25vd25fcGVuZGluZygkbmFtZSkgcGVuZGluZzsNCXNldCByZXQgW2NhdGNoIHthdXRvX2xvYWQgJG5hbWUgW3VwbGV2ZWwgMSB7OjpuYW1lc3BhY2UgY3VycmVudH1dfSBtc2ddDQl1bnNldCB1bmtub3duX3BlbmRpbmcoJG5hbWUpOw0JaWYgeyRyZXQgIT0gMH0gew0JICAgIGFwcGVuZCBlcnJvckluZm8gIlxuICAgIChhdXRvbG9hZGluZyBcIiRuYW1lXCIpIg0JICAgIHJldHVybiAtY29kZSAkcmV0IC1lcnJvcmNvZGUgJGVycm9yQ29kZSAtZXJyb3JpbmZvICRlcnJvckluZm8gJG1zZw0JfQ0JaWYgeyFbYXJyYXkgc2l6ZSB1bmtub3duX3BlbmRpbmddfSB7DQkgICAgdW5zZXQgdW5rbm93bl9wZW5kaW5nDQl9DQlpZiB7JG1zZ30gew0JICAgIHNldCBlcnJvckNvZGUgJHNhdmVkRXJyb3JDb2RlDQkgICAgc2V0IGVycm9ySW5mbyAkc2F2ZWRFcnJvckluZm8NCSAgICBzZXQgY29kZSBbY2F0Y2gge3VwbGV2ZWwgMSAkYXJnc30gbXNnXQ0JICAgIGlmIHskY29kZSA9PSAgMX0gew0JCSMNCQkjIFN0cmlwIHRoZSBsYXN0IGZpdmUgbGluZXMgb2ZmIHRoZSBlcnJvciBzdGFjayAodGhleSdyZQ0JCSMgZnJvbSB0aGUgInVwbGV2ZWwiIGNvbW1hbmQpLg0JCSMNDQkJc2V0IG5ldyBbc3BsaXQgJGVycm9ySW5mbyBcbl0NCQlzZXQgbmV3IFtqb2luIFtscmFuZ2UgJG5ldyAwIFtleHByIHtbbGxlbmd0aCAkbmV3XSAtIDZ9XV0gXG5dDQkJcmV0dXJuIC1jb2RlIGVycm9yIC1lcnJvcmNvZGUgJGVycm9yQ29kZSBcDQkJCS1lcnJvcmluZm8gJG5ldyAkbXNnDQkgICAgfSBlbHNlIHsNCQlyZXR1cm4gLWNvZGUgJGNvZGUgJG1zZw0JICAgIH0NCX0NICAgIH0NDSAgICBpZiB7KFtpbmZvIGxldmVsXSA9PSAxKSAmJiBbc3RyaW5nIGVxdWFsIFtpbmZvIHNjcmlwdF0gIiJdIFwNCSAgICAmJiBbaW5mbyBleGlzdHMgdGNsX2ludGVyYWN0aXZlXSAmJiAkdGNsX2ludGVyYWN0aXZlfSB7DQlpZiB7IVtpbmZvIGV4aXN0cyBhdXRvX25vZXhlY119IHsNCSAgICBzZXQgbmV3IFthdXRvX2V4ZWNvayAkbmFtZV0NCSAgICBpZiB7W3N0cmluZyBjb21wYXJlIHt9ICRuZXddfSB7DQkJc2V0IGVycm9yQ29kZSAkc2F2ZWRFcnJvckNvZGUNCQlzZXQgZXJyb3JJbmZvICRzYXZlZEVycm9ySW5mbw0JCXNldCByZWRpciAiIg0JCWlmIHtbc3RyaW5nIGVxdWFsIFtpbmZvIGNvbW1hbmRzIGNvbnNvbGVdICIiXX0gew0JCSAgICBzZXQgcmVkaXIgIj4mQHN0ZG91dCA8QHN0ZGluIg0JCX0NCQlyZXR1cm4gW3VwbGV2ZWwgMSBleGVjICRyZWRpciAkbmV3IFtscmFuZ2UgJGFyZ3MgMSBlbmRdXQ0JICAgIH0NCX0NCXNldCBlcnJvckNvZGUgJHNhdmVkRXJyb3JDb2RlDQlzZXQgZXJyb3JJbmZvICRzYXZlZEVycm9ySW5mbw0JaWYge1tzdHJpbmcgZXF1YWwgJG5hbWUgIiEhIl19IHsNCSAgICBzZXQgbmV3Y21kIFtoaXN0b3J5IGV2ZW50XQ0JfSBlbHNlaWYge1tyZWdleHAge14hKC4rKSR9ICRuYW1lIGR1bW15IGV2ZW50XX0gew0JICAgIHNldCBuZXdjbWQgW2hpc3RvcnkgZXZlbnQgJGV2ZW50XQ0JfSBlbHNlaWYge1tyZWdleHAge15cXihbXl5dKilcXihbXl5dKilcXj8kfSAkbmFtZSBkdW1teSBvbGQgbmV3XX0gew0JICAgIHNldCBuZXdjbWQgW2hpc3RvcnkgZXZlbnQgLTFdDQkgICAgY2F0Y2gge3JlZ3N1YiAtYWxsIC0tICRvbGQgJG5ld2NtZCAkbmV3IG5ld2NtZH0NCX0NCWlmIHtbaW5mbyBleGlzdHMgbmV3Y21kXX0gew0JICAgIHRjbExvZyAkbmV3Y21kDQkgICAgaGlzdG9yeSBjaGFuZ2UgJG5ld2NtZCAwDQkgICAgcmV0dXJuIFt1cGxldmVsIDEgJG5ld2NtZF0NCX0NDQlzZXQgcmV0IFtjYXRjaCB7c2V0IGNtZHMgW2luZm8gY29tbWFuZHMgJG5hbWUqXX0gbXNnXQ0JaWYge1tzdHJpbmcgZXF1YWwgJG5hbWUgIjo6Il19IHsNCSAgICBzZXQgbmFtZSAiIg0JfQ0JaWYgeyRyZXQgIT0gMH0gew0JICAgIHJldHVybiAtY29kZSAkcmV0IC1lcnJvcmNvZGUgJGVycm9yQ29kZSBcDQkJImVycm9yIGluIHVua25vd24gd2hpbGUgY2hlY2tpbmcgaWYgXCIkbmFtZVwiIGlzIGEgdW5pcXVlIGNvbW1hbmQgYWJicmV2aWF0aW9uOiAkbXNnIg0JfQ0JaWYge1tsbGVuZ3RoICRjbWRzXSA9PSAxfSB7DQkgICAgcmV0dXJuIFt1cGxldmVsIDEgW2xyZXBsYWNlICRhcmdzIDAgMCAkY21kc11dDQl9DQlpZiB7W2xsZW5ndGggJGNtZHNdfSB7DQkgICAgaWYge1tzdHJpbmcgZXF1YWwgJG5hbWUgIiJdfSB7DQkJcmV0dXJuIC1jb2RlIGVycm9yICJlbXB0eSBjb21tYW5kIG5hbWUgXCJcIiINCSAgICB9IGVsc2Ugew0JCXJldHVybiAtY29kZSBlcnJvciBcDQkJCSJhbWJpZ3VvdXMgY29tbWFuZCBuYW1lIFwiJG5hbWVcIjogW2xzb3J0ICRjbWRzXSINCSAgICB9DQl9DSAgICB9DSAgICByZXR1cm4gLWNvZGUgZXJyb3IgImludmFsaWQgY29tbWFuZCBuYW1lIFwiJG5hbWVcIiINfQ0NIyBhdXRvX2xvYWQgLS0NIyBDaGVja3MgYSBjb2xsZWN0aW9uIG9mIGxpYnJhcnkgZGlyZWN0b3JpZXMgdG8gc2VlIGlmIGEgcHJvY2VkdXJlDSMgaXMgZGVmaW5lZCBpbiBvbmUgb2YgdGhlbS4gIElmIHNvLCBpdCBzb3VyY2VzIHRoZSBhcHByb3ByaWF0ZQ0jIGxpYnJhcnkgZmlsZSB0byBjcmVhdGUgdGhlIHByb2NlZHVyZS4gIFJldHVybnMgMSBpZiBpdCBzdWNjZXNzZnVsbHkNIyBsb2FkZWQgdGhlIHByb2NlZHVyZSwgMCBvdGhlcndpc2UuDSMNIyBBcmd1bWVudHM6IA0jIGNtZCAtCQkJTmFtZSBvZiB0aGUgY29tbWFuZCB0byBmaW5kIGFuZCBsb2FkLg0jIG5hbWVzcGFjZSAob3B0aW9uYWwpICBUaGUgbmFtZXNwYWNlIHdoZXJlIHRoZSBjb21tYW5kIGlzIGJlaW5nIHVzZWQgLSBtdXN0IGJlDSMgICAgICAgICAgICAgICAgICAgICAgIGEgY2Fub25pY2FsIG5hbWVzcGFjZSBhcyByZXR1cm5lZCBbbmFtZXNwYWNlIGN1cnJlbnRdDSMgICAgICAgICAgICAgICAgICAgICAgIGZvciBpbnN0YW5jZS4gSWYgbm90IGdpdmVuLCBuYW1lc3BhY2UgY3VycmVudCBpcyB1c2VkLg0NcHJvYyBhdXRvX2xvYWQge2NtZCB7bmFtZXNwYWNlIHt9fX0gew0gICAgZ2xvYmFsIGF1dG9faW5kZXggYXV0b19vbGRwYXRoIGF1dG9fcGF0aA0NICAgIGlmIHtbc3RyaW5nIGxlbmd0aCAkbmFtZXNwYWNlXSA9PSAwfSB7DQlzZXQgbmFtZXNwYWNlIFt1cGxldmVsIDEgW2xpc3QgOjpuYW1lc3BhY2UgY3VycmVudF1dDSAgICB9DSAgICBzZXQgbmFtZUxpc3QgW2F1dG9fcXVhbGlmeSAkY21kICRuYW1lc3BhY2VdDSAgICAjIHdvcmthcm91bmQgbm9uIGNhbm9uaWNhbCBhdXRvX2luZGV4IGVudHJpZXMgdGhhdCBtaWdodCBiZSBhcm91bmQNICAgICMgZnJvbSBvbGRlciBhdXRvX21raW5kZXggdmVyc2lvbnMNICAgIGxhcHBlbmQgbmFtZUxpc3QgJGNtZA0gICAgZm9yZWFjaCBuYW1lICRuYW1lTGlzdCB7DQlpZiB7W2luZm8gZXhpc3RzIGF1dG9faW5kZXgoJG5hbWUpXX0gew0JICAgIHVwbGV2ZWwgIzAgJGF1dG9faW5kZXgoJG5hbWUpDQkgICAgcmV0dXJuIFtleHByIHtbaW5mbyBjb21tYW5kcyAkbmFtZV0gIT0gIiJ9XQ0JfQ0gICAgfQ0gICAgaWYgeyFbaW5mbyBleGlzdHMgYXV0b19wYXRoXX0gew0JcmV0dXJuIDANICAgIH0NDSAgICBpZiB7IVthdXRvX2xvYWRfaW5kZXhdfSB7DQlyZXR1cm4gMA0gICAgfQ0gICAgZm9yZWFjaCBuYW1lICRuYW1lTGlzdCB7DQlpZiB7W2luZm8gZXhpc3RzIGF1dG9faW5kZXgoJG5hbWUpXX0gew0JICAgIHVwbGV2ZWwgIzAgJGF1dG9faW5kZXgoJG5hbWUpDQkgICAgIyBUaGVyZSdzIGEgY291cGxlIG9mIHdheXMgdG8gbG9vayBmb3IgYSBjb21tYW5kIG9mIGEgZ2l2ZW4NCSAgICAjIG5hbWUuICBPbmUgaXMgdG8gdXNlDQkgICAgIyAgICBpbmZvIGNvbW1hbmRzICRuYW1lDQkgICAgIyBVbmZvcnR1bmF0ZWx5LCBpZiB0aGUgbmFtZSBoYXMgZ2xvYi1tYWdpYyBjaGFycyBpbiBpdCBsaWtlICoNCSAgICAjIG9yIFtdLCBpdCBtYXkgbm90IG1hdGNoLiAgRm9yIG91ciBwdXJwb3NlcyBoZXJlLCBhIGJldHRlcg0JICAgICMgcm91dGUgaXMgdG8gdXNlIA0JICAgICMgICAgbmFtZXNwYWNlIHdoaWNoIC1jb21tYW5kICRuYW1lDQkgICAgaWYgeyAhW3N0cmluZyBlcXVhbCBbbmFtZXNwYWNlIHdoaWNoIC1jb21tYW5kICRuYW1lXSAiIl0gfSB7DQkJcmV0dXJuIDENCSAgICB9DQl9DSAgICB9DSAgICByZXR1cm4gMA19DQ0jIGF1dG9fbG9hZF9pbmRleCAtLQ0jIExvYWRzIHRoZSBjb250ZW50cyBvZiB0Y2xJbmRleCBmaWxlcyBvbiB0aGUgYXV0b19wYXRoIGRpcmVjdG9yeQ0jIGxpc3QuICBUaGlzIGlzIHVzdWFsbHkgaW52b2tlZCB3aXRoaW4gYXV0b19sb2FkIHRvIGxvYWQgdGhlIGluZGV4DSMgb2YgYXZhaWxhYmxlIGNvbW1hbmRzLiAgUmV0dXJucyAxIGlmIHRoZSBpbmRleCBpcyBsb2FkZWQsIGFuZCAwIGlmDSMgdGhlIGluZGV4IGlzIGFscmVhZHkgbG9hZGVkIGFuZCB1cCB0byBkYXRlLg0jDSMgQXJndW1lbnRzOiANIyBOb25lLg0NcHJvYyBhdXRvX2xvYWRfaW5kZXgge30gew0gICAgZ2xvYmFsIGF1dG9faW5kZXggYXV0b19vbGRwYXRoIGF1dG9fcGF0aCBlcnJvckluZm8gZXJyb3JDb2RlDQ0gICAgaWYge1tpbmZvIGV4aXN0cyBhdXRvX29sZHBhdGhdICYmIFwNCSAgICBbc3RyaW5nIGVxdWFsICRhdXRvX29sZHBhdGggJGF1dG9fcGF0aF19IHsNCXJldHVybiAwDSAgICB9DSAgICBzZXQgYXV0b19vbGRwYXRoICRhdXRvX3BhdGgNDSAgICAjIENoZWNrIGlmIHdlIGFyZSBhIHNhZmUgaW50ZXJwcmV0ZXIuIEluIHRoYXQgY2FzZSwgd2Ugc3VwcG9ydCBvbmx5DSAgICAjIG5ld2VyIGZvcm1hdCB0Y2xJbmRleCBmaWxlcy4NDSAgICBzZXQgaXNzYWZlIFtpbnRlcnAgaXNzYWZlXQ0gICAgZm9yIHtzZXQgaSBbZXhwciB7W2xsZW5ndGggJGF1dG9fcGF0aF0gLSAxfV19IHskaSA+PSAwfSB7aW5jciBpIC0xfSB7DQlzZXQgZGlyIFtsaW5kZXggJGF1dG9fcGF0aCAkaV0NCXNldCBmICIiDQlpZiB7JGlzc2FmZX0gew0JICAgIGNhdGNoIHtzb3VyY2UgW2ZpbGUgam9pbiAkZGlyIHRjbEluZGV4XX0NCX0gZWxzZWlmIHtbY2F0Y2gge3NldCBmIFtvcGVuIFtmaWxlIGpvaW4gJGRpciB0Y2xJbmRleF1dfV19IHsNCSAgICBjb250aW51ZQ0JfSBlbHNlIHsNCSAgICBzZXQgZXJyb3IgW2NhdGNoIHsNCQlzZXQgaWQgW2dldHMgJGZdDQkJaWYge1tzdHJpbmcgZXF1YWwgJGlkIFwNCQkJIiMgVGNsIGF1dG9sb2FkIGluZGV4IGZpbGUsIHZlcnNpb24gMi4wIl19IHsNCQkgICAgZXZhbCBbcmVhZCAkZl0NCQl9IGVsc2VpZiB7W3N0cmluZyBlcXVhbCAkaWQgIiMgVGNsIGF1dG9sb2FkIGluZGV4IGZpbGU6IGVhY2ggbGluZSBpZGVudGlmaWVzIGEgVGNsIl19IHsNCQkgICAgd2hpbGUge1tnZXRzICRmIGxpbmVdID49IDB9IHsNCQkJaWYge1tzdHJpbmcgZXF1YWwgW3N0cmluZyBpbmRleCAkbGluZSAwXSAiIyJdIFwNCQkJCXx8IChbbGxlbmd0aCAkbGluZV0gIT0gMil9IHsNCQkJICAgIGNvbnRpbnVlDQkJCX0NCQkJc2V0IG5hbWUgW2xpbmRleCAkbGluZSAwXQ0JCQlzZXQgYXV0b19pbmRleCgkbmFtZSkgXA0JCQkJInNvdXJjZSBbZmlsZSBqb2luICRkaXIgW2xpbmRleCAkbGluZSAxXV0iDQkJICAgIH0NCQl9IGVsc2Ugew0JCSAgICBlcnJvciAiW2ZpbGUgam9pbiAkZGlyIHRjbEluZGV4XSBpc24ndCBhIHByb3BlciBUY2wgaW5kZXggZmlsZSINCQl9DQkgICAgfSBtc2ddDQkgICAgaWYge1tzdHJpbmcgY29tcGFyZSAkZiAiIl19IHsNCQljbG9zZSAkZg0JICAgIH0NCSAgICBpZiB7JGVycm9yfSB7DQkJZXJyb3IgJG1zZyAkZXJyb3JJbmZvICRlcnJvckNvZGUNCSAgICB9DQl9DSAgICB9DSAgICByZXR1cm4gMQ19DQ0jIGF1dG9fcXVhbGlmeSAtLQ0jDSMgQ29tcHV0ZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lcyBsaXN0IGZvciB1c2UgaW4gdGhlIGF1dG9faW5kZXggYXJyYXkuDSMgRm9yIGhpc3RvcmljYWwgcmVhc29ucywgY29tbWFuZHMgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UgZG8gbm90IGhhdmUgbGVhZGluZw0jIDo6IGluIHRoZSBpbmRleCBrZXkuIFRoZSBsaXN0IGhhcyB0d28gZWxlbWVudHMgd2hlbiB0aGUgY29tbWFuZCBuYW1lIGlzDSMgcmVsYXRpdmUgKG5vIGxlYWRpbmcgOjopIGFuZCB0aGUgbmFtZXNwYWNlIGlzIG5vdCB0aGUgZ2xvYmFsIG9uZS4gT3RoZXJ3aXNlDSMgb25seSBvbmUgbmFtZSBpcyByZXR1cm5lZCAoYW5kIHNlYXJjaGVkIGluIHRoZSBhdXRvX2luZGV4KS4NIw0jIEFyZ3VtZW50cyAtDSMgY21kCQlUaGUgY29tbWFuZCBuYW1lLiBDYW4gYmUgYW55IG5hbWUgYWNjZXB0ZWQgZm9yIGNvbW1hbmQNIyAgICAgICAgICAgICAgIGludm9jYXRpb25zIChMaWtlICJmb286Ojo6YmFyIikuDSMgbmFtZXNwYWNlCVRoZSBuYW1lc3BhY2Ugd2hlcmUgdGhlIGNvbW1hbmQgaXMgYmVpbmcgdXNlZCAtIG11c3QgYmUNIyAgICAgICAgICAgICAgIGEgY2Fub25pY2FsIG5hbWVzcGFjZSBhcyByZXR1cm5lZCBieSBbbmFtZXNwYWNlIGN1cnJlbnRdDSMgICAgICAgICAgICAgICBmb3IgaW5zdGFuY2UuDQ1wcm9jIGF1dG9fcXVhbGlmeSB7Y21kIG5hbWVzcGFjZX0gew0NICAgICMgY291bnQgc2VwYXJhdG9ycyBhbmQgY2xlYW4gdGhlbSB1cA0gICAgIyAobWFraW5nIHN1cmUgdGhhdCBmb286Ojo6OmJhciB3aWxsIGJlIHRyZWF0ZWQgYXMgZm9vOjpiYXIpDSAgICBzZXQgbiBbcmVnc3ViIC1hbGwgezo6K30gJGNtZCA6OiBjbWRdDQ0gICAgIyBJZ25vcmUgbmFtZXNwYWNlIGlmIHRoZSBuYW1lIHN0YXJ0cyB3aXRoIDo6DSAgICAjIEhhbmRsZSBzcGVjaWFsIGNhc2Ugb2Ygb25seSBsZWFkaW5nIDo6DQ0gICAgIyBCZWZvcmUgZWFjaCByZXR1cm4gY2FzZSB3ZSBnaXZlIGFuIGV4YW1wbGUgb2Ygd2hpY2ggY2F0ZWdvcnkgaXQgaXMNICAgICMgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm0gOg0gICAgIyAoIGlucHV0Q21kLCBpbnB1dE5hbWVTcGFjZSkgLT4gb3V0cHV0DQ0gICAgaWYge1tyZWdleHAge146OiguKikkfSAkY21kIHggdGFpbF19IHsNCWlmIHskbiA+IDF9IHsNCSAgICAjICggOjpmb286OmJhciAsICogKSAtPiA6OmZvbzo6YmFyDQkgICAgcmV0dXJuIFtsaXN0ICRjbWRdDQl9IGVsc2Ugew0JICAgICMgKCA6Omdsb2JhbCAsICogKSAtPiBnbG9iYWwNCSAgICByZXR1cm4gW2xpc3QgJHRhaWxdDQl9DSAgICB9DSAgICANICAgICMgUG90ZW50aWFsbHkgcmV0dXJuaW5nIDIgZWxlbWVudHMgdG8gdHJ5ICA6DSAgICAjIChpZiB0aGUgY3VycmVudCBuYW1lc3BhY2UgaXMgbm90IHRoZSBnbG9iYWwgb25lKQ0NICAgIGlmIHskbiA9PSAwfSB7DQlpZiB7W3N0cmluZyBlcXVhbCAkbmFtZXNwYWNlIDo6XX0gew0JICAgICMgKCBub2NvbG9ucyAsIDo6ICkgLT4gbm9jb2xvbnMNCSAgICByZXR1cm4gW2xpc3QgJGNtZF0NCX0gZWxzZSB7DQkgICAgIyAoIG5vY29sb25zICwgOjpzdWIgKSAtPiA6OnN1Yjo6bm9jb2xvbnMgbm9jb2xvbnMNCSAgICByZXR1cm4gW2xpc3QgJHtuYW1lc3BhY2V9OjokY21kICRjbWRdDQl9DSAgICB9IGVsc2VpZiB7W3N0cmluZyBlcXVhbCAkbmFtZXNwYWNlIDo6XX0gew0JIyAgKCBmb286OmJhciAsIDo6ICkgLT4gOjpmb286OmJhcg0JcmV0dXJuIFtsaXN0IDo6JGNtZF0NICAgIH0gZWxzZSB7DQkjICggZm9vOjpiYXIgLCA6OnN1YiApIC0+IDo6c3ViOjpmb286OmJhciA6OmZvbzo6YmFyDQlyZXR1cm4gW2xpc3QgJHtuYW1lc3BhY2V9OjokY21kIDo6JGNtZF0NICAgIH0NfQ0NIyBhdXRvX2ltcG9ydCAtLQ0jDSMgSW52b2tlZCBkdXJpbmcgIm5hbWVzcGFjZSBpbXBvcnQiIHRvIG1ha2Ugc2VlIGlmIHRoZSBpbXBvcnRlZCBjb21tYW5kcw0jIHJlc2lkZSBpbiBhbiBhdXRvbG9hZGVkIGxpYnJhcnkuICBJZiBzbywgdGhlIGNvbW1hbmRzIGFyZSBsb2FkZWQgc28NIyB0aGF0IHRoZXkgd2lsbCBiZSBhdmFpbGFibGUgZm9yIHRoZSBpbXBvcnQgbGlua3MuICBJZiBub3QsIHRoZW4gdGhpcw0jIHByb2NlZHVyZSBkb2VzIG5vdGhpbmcuDSMNIyBBcmd1bWVudHMgLQ0jIHBhdHRlcm4JVGhlIHBhdHRlcm4gb2YgY29tbWFuZHMgYmVpbmcgaW1wb3J0ZWQgKGxpa2UgImZvbzo6KiIpDSMgICAgICAgICAgICAgICBhIGNhbm9uaWNhbCBuYW1lc3BhY2UgYXMgcmV0dXJuZWQgYnkgW25hbWVzcGFjZSBjdXJyZW50XQ0NcHJvYyBhdXRvX2ltcG9ydCB7cGF0dGVybn0gew0gICAgZ2xvYmFsIGF1dG9faW5kZXgNDSAgICAjIElmIG5vIG5hbWVzcGFjZSBpcyBzcGVjaWZpZWQsIHRoaXMgd2lsbCBiZSBhbiBlcnJvciBjYXNlDQ0gICAgaWYgeyFbc3RyaW5nIG1hdGNoICo6OiogJHBhdHRlcm5dfSB7DQlyZXR1cm4NICAgIH0NDSAgICBzZXQgbnMgW3VwbGV2ZWwgMSBbbGlzdCA6Om5hbWVzcGFjZSBjdXJyZW50XV0NICAgIHNldCBwYXR0ZXJuTGlzdCBbYXV0b19xdWFsaWZ5ICRwYXR0ZXJuICRuc10NDSAgICBhdXRvX2xvYWRfaW5kZXgNDSAgICBmb3JlYWNoIHBhdHRlcm4gJHBhdHRlcm5MaXN0IHsNICAgICAgICBmb3JlYWNoIG5hbWUgW2FycmF5IG5hbWVzIGF1dG9faW5kZXggJHBhdHRlcm5dIHsNICAgICAgICAgICAgaWYge1tzdHJpbmcgZXF1YWwgIiIgW2luZm8gY29tbWFuZHMgJG5hbWVdXQ0JCSAgICAmJiBbc3RyaW5nIGVxdWFsIFtuYW1lc3BhY2UgcXVhbGlmaWVycyAkcGF0dGVybl0gXA0JCQkJICAgICBbbmFtZXNwYWNlIHF1YWxpZmllcnMgJG5hbWVdXX0gew0gICAgICAgICAgICAgICAgdXBsZXZlbCAjMCAkYXV0b19pbmRleCgkbmFtZSkNICAgICAgICAgICAgfQ0gICAgICAgIH0NICAgIH0NfQ0NIyBhdXRvX2V4ZWNvayAtLQ0jDSMgUmV0dXJucyBzdHJpbmcgdGhhdCBpbmRpY2F0ZXMgbmFtZSBvZiBwcm9ncmFtIHRvIGV4ZWN1dGUgaWYgDSMgbmFtZSBjb3JyZXNwb25kcyB0byBhIHNoZWxsIGJ1aWx0aW4gb3IgYW4gZXhlY3V0YWJsZSBpbiB0aGUNIyBXaW5kb3dzIHNlYXJjaCBwYXRoLCBvciAiIiBvdGhlcndpc2UuICBCdWlsZHMgYW4gYXNzb2NpYXRpdmUgDSMgYXJyYXkgYXV0b19leGVjcyB0aGF0IGNhY2hlcyBpbmZvcm1hdGlvbiBhYm91dCBwcmV2aW91cyBjaGVja3MsIA0jIGZvciBzcGVlZC4NIw0jIEFyZ3VtZW50czogDSMgbmFtZSAtCQkJTmFtZSBvZiBhIGNvbW1hbmQuDQ1pZiB7W3N0cmluZyBlcXVhbCB3aW5kb3dzICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pXX0gew0jIFdpbmRvd3MgdmVyc2lvbi4NIw0jIE5vdGUgdGhhdCBpbmZvIGV4ZWN1dGFibGUgZG9lc24ndCB3b3JrIHVuZGVyIFdpbmRvd3MsIHNvIHdlIGhhdmUgdG8NIyBsb29rIGZvciBmaWxlcyB3aXRoIC5leGUsIC5jb20sIG9yIC5iYXQgZXh0ZW5zaW9ucy4gIEFsc28sIHRoZSBwYXRoDSMgbWF5IGJlIGluIHRoZSBQYXRoIG9yIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGVzLCBhbmQgcGF0aA0jIGNvbXBvbmVudHMgYXJlIHNlcGFyYXRlZCB3aXRoIHNlbWljb2xvbnMsIG5vdCBjb2xvbnMgYXMgdW5kZXIgVW5peC4NIw1wcm9jIGF1dG9fZXhlY29rIG5hbWUgew0gICAgZ2xvYmFsIGF1dG9fZXhlY3MgZW52IHRjbF9wbGF0Zm9ybQ0NICAgIGlmIHtbaW5mbyBleGlzdHMgYXV0b19leGVjcygkbmFtZSldfSB7DQlyZXR1cm4gJGF1dG9fZXhlY3MoJG5hbWUpDSAgICB9DSAgICBzZXQgYXV0b19leGVjcygkbmFtZSkgIiINDSAgICBzZXQgc2hlbGxCdWlsdGlucyBbbGlzdCBjbHMgY29weSBkYXRlIGRlbCBlcmFzZSBkaXIgZWNobyBta2RpciBcDQkgICAgbWQgcmVuYW1lIHJlbiBybWRpciByZCB0aW1lIHR5cGUgdmVyIHZvbF0NICAgIGlmIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ob3MpICJXaW5kb3dzIE5UIl19IHsNCSMgTlQgaW5jbHVkZXMgdGhlICdzdGFydCcgYnVpbHQtaW4NCWxhcHBlbmQgc2hlbGxCdWlsdGlucyAic3RhcnQiDSAgICB9DSAgICBpZiB7W2luZm8gZXhpc3RzIGVudihQQVRIRVhUKV19IHsNCSMgQWRkIGFuIGluaXRpYWwgOyB0byBoYXZlIHRoZSB7fSBleHRlbnNpb24gY2hlY2sgZmlyc3QuDQlzZXQgZXhlY0V4dGVuc2lvbnMgW3NwbGl0ICI7JGVudihQQVRIRVhUKSIgIjsiXQ0gICAgfSBlbHNlIHsNCXNldCBleGVjRXh0ZW5zaW9ucyBbbGlzdCB7fSAuY29tIC5leGUgLmJhdF0NICAgIH0NDSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRzaGVsbEJ1aWx0aW5zICRuYW1lXSAhPSAtMX0gew0JcmV0dXJuIFtzZXQgYXV0b19leGVjcygkbmFtZSkgW2xpc3QgJGVudihDT01TUEVDKSAvYyAkbmFtZV1dDSAgICB9DQ0gICAgaWYge1tsbGVuZ3RoIFtmaWxlIHNwbGl0ICRuYW1lXV0gIT0gMX0gew0JZm9yZWFjaCBleHQgJGV4ZWNFeHRlbnNpb25zIHsNCSAgICBzZXQgZmlsZSAke25hbWV9JHtleHR9DQkgICAgaWYge1tmaWxlIGV4aXN0cyAkZmlsZV0gJiYgIVtmaWxlIGlzZGlyZWN0b3J5ICRmaWxlXX0gew0JCXJldHVybiBbc2V0IGF1dG9fZXhlY3MoJG5hbWUpIFtsaXN0ICRmaWxlXV0NCSAgICB9DQl9DQlyZXR1cm4gIiINICAgIH0NDSAgICBzZXQgcGF0aCAiW2ZpbGUgZGlybmFtZSBbaW5mbyBuYW1lb2ZdXTsuOyINICAgIGlmIHtbaW5mbyBleGlzdHMgZW52KFdJTkRJUildfSB7DQlzZXQgd2luZGlyICRlbnYoV0lORElSKSANICAgIH0NICAgIGlmIHtbaW5mbyBleGlzdHMgd2luZGlyXX0gew0JaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShvcykgIldpbmRvd3MgTlQiXX0gew0JICAgIGFwcGVuZCBwYXRoICIkd2luZGlyL3N5c3RlbTMyOyINCX0NCWFwcGVuZCBwYXRoICIkd2luZGlyL3N5c3RlbTskd2luZGlyOyINICAgIH0NDSAgICBmb3JlYWNoIHZhciB7UEFUSCBQYXRoIHBhdGh9IHsNCWlmIHtbaW5mbyBleGlzdHMgZW52KCR2YXIpXX0gew0JICAgIGFwcGVuZCBwYXRoICI7JGVudigkdmFyKSINCX0NICAgIH0NDSAgICBmb3JlYWNoIGRpciBbc3BsaXQgJHBhdGggezt9XSB7DQkjIFNraXAgYWxyZWFkeSBjaGVja2VkIGRpcmVjdG9yaWVzDQlpZiB7W2luZm8gZXhpc3RzIGNoZWNrZWQoJGRpcildIHx8IFtzdHJpbmcgZXF1YWwge30gJGRpcl19IHsgY29udGludWUgfQ0Jc2V0IGNoZWNrZWQoJGRpcikge30NCWZvcmVhY2ggZXh0ICRleGVjRXh0ZW5zaW9ucyB7DQkgICAgc2V0IGZpbGUgW2ZpbGUgam9pbiAkZGlyICR7bmFtZX0ke2V4dH1dDQkgICAgaWYge1tmaWxlIGV4aXN0cyAkZmlsZV0gJiYgIVtmaWxlIGlzZGlyZWN0b3J5ICRmaWxlXX0gew0JCXJldHVybiBbc2V0IGF1dG9fZXhlY3MoJG5hbWUpIFtsaXN0ICRmaWxlXV0NCSAgICB9DQl9DSAgICB9DSAgICByZXR1cm4gIiINfQ0NfSBlbHNlIHsNIyBVbml4IHZlcnNpb24uDSMNcHJvYyBhdXRvX2V4ZWNvayBuYW1lIHsNICAgIGdsb2JhbCBhdXRvX2V4ZWNzIGVudg0NICAgIGlmIHtbaW5mbyBleGlzdHMgYXV0b19leGVjcygkbmFtZSldfSB7DQlyZXR1cm4gJGF1dG9fZXhlY3MoJG5hbWUpDSAgICB9DSAgICBzZXQgYXV0b19leGVjcygkbmFtZSkgIiINICAgIGlmIHtbbGxlbmd0aCBbZmlsZSBzcGxpdCAkbmFtZV1dICE9IDF9IHsNCWlmIHtbZmlsZSBleGVjdXRhYmxlICRuYW1lXSAmJiAhW2ZpbGUgaXNkaXJlY3RvcnkgJG5hbWVdfSB7DQkgICAgc2V0IGF1dG9fZXhlY3MoJG5hbWUpIFtsaXN0ICRuYW1lXQ0JfQ0JcmV0dXJuICRhdXRvX2V4ZWNzKCRuYW1lKQ0gICAgfQ0gICAgZm9yZWFjaCBkaXIgW3NwbGl0ICRlbnYoUEFUSCkgOl0gew0JaWYge1tzdHJpbmcgZXF1YWwgJGRpciAiIl19IHsNCSAgICBzZXQgZGlyIC4NCX0NCXNldCBmaWxlIFtmaWxlIGpvaW4gJGRpciAkbmFtZV0NCWlmIHtbZmlsZSBleGVjdXRhYmxlICRmaWxlXSAmJiAhW2ZpbGUgaXNkaXJlY3RvcnkgJGZpbGVdfSB7DQkgICAgc2V0IGF1dG9fZXhlY3MoJG5hbWUpIFtsaXN0ICRmaWxlXQ0JICAgIHJldHVybiAkYXV0b19leGVjcygkbmFtZSkNCX0NICAgIH0NICAgIHJldHVybiAiIg19DQ19DQAAUGAjIHBhY2thZ2UudGNsIC0tDSMNIyB1dGlsaXR5IHByb2NzIGZvcm1lcmx5IGluIGluaXQudGNsIHdoaWNoIGNhbiBiZSBsb2FkZWQgb24gZGVtYW5kDSMgZm9yIHBhY2thZ2UgbWFuYWdlbWVudC4NIw0jIFJDUzogQCgjKSAkSWQ6IHBhY2thZ2UudGNsLHYgMS4xNC4yLjIgMjAwMS8wOC8yNCAxNjoxOToxMCBkZ3AgRXhwICQNIw0jIENvcHlyaWdodCAoYykgMTk5MS0xOTkzIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuDSMgQ29weXJpZ2h0IChjKSAxOTk0LTE5OTggU3VuIE1pY3Jvc3lzdGVtcywgSW5jLg0jDSMgU2VlIHRoZSBmaWxlICJsaWNlbnNlLnRlcm1zIiBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIHJlZGlzdHJpYnV0aW9uDSMgb2YgdGhpcyBmaWxlLCBhbmQgZm9yIGEgRElTQ0xBSU1FUiBPRiBBTEwgV0FSUkFOVElFUy4NIw0NIyBDcmVhdGUgdGhlIHBhY2thZ2UgbmFtZXNwYWNlDW5hbWVzcGFjZSBldmFsIDo6cGtnIHsNfQ0NIyBwa2dfY29tcGFyZUV4dGVuc2lvbiAtLQ0jDSMgIFVzZWQgaW50ZXJuYWxseSBieSBwa2dfbWtJbmRleCB0byBjb21wYXJlIHRoZSBleHRlbnNpb24gb2YgYSBmaWxlIHRvDSMgIGEgZ2l2ZW4gZXh0ZW5zaW9uLiBPbiBXaW5kb3dzLCBpdCB1c2VzIGEgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uDSMgIGJlY2F1c2UgdGhlIGZpbGUgc3lzdGVtIGNhbiBiZSBmaWxlIGluc2Vuc2l0aXZlLg0jDSMgQXJndW1lbnRzOg0jICBmaWxlTmFtZQluYW1lIG9mIGEgZmlsZSB3aG9zZSBleHRlbnNpb24gaXMgY29tcGFyZWQNIyAgZXh0CQkob3B0aW9uYWwpIFRoZSBleHRlbnNpb24gdG8gY29tcGFyZSBhZ2FpbnN0OyB5b3UgbXVzdA0jCQlwcm92aWRlIHRoZSBzdGFydGluZyBkb3QuDSMJCURlZmF1bHRzIHRvIFtpbmZvIHNoYXJlZGxpYmV4dGVuc2lvbl0NIw0jIFJlc3VsdHM6DSMgIFJldHVybnMgMSBpZiB0aGUgZXh0ZW5zaW9uIG1hdGNoZXMsIDAgb3RoZXJ3aXNlDQ1wcm9jIHBrZ19jb21wYXJlRXh0ZW5zaW9uIHsgZmlsZU5hbWUge2V4dCB7fX0gfSB7DSAgICBnbG9iYWwgdGNsX3BsYXRmb3JtDSAgICBpZiB7IVtzdHJpbmcgbGVuZ3RoICRleHRdfSB7c2V0IGV4dCBbaW5mbyBzaGFyZWRsaWJleHRlbnNpb25dfQ0gICAgaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIndpbmRvd3MiXX0gew0gICAgICAgIHJldHVybiBbc3RyaW5nIGVxdWFsIC1ub2Nhc2UgW2ZpbGUgZXh0ZW5zaW9uICRmaWxlTmFtZV0gJGV4dF0NICAgIH0gZWxzZSB7DSAgICAgICAgIyBTb21lIHVuaWNlcyBhZGQgdHJhaWxpbmcgbnVtYmVycyBhZnRlciB0aGUgLnNvLCBzbw0gICAgICAgICMgd2UgY291bGQgaGF2ZSBzb21ldGhpbmcgbGlrZSAnLnNvLjEuMicuDSAgICAgICAgc2V0IHJvb3QgJGZpbGVOYW1lDSAgICAgICAgd2hpbGUgezF9IHsNICAgICAgICAgICAgc2V0IGN1cnJFeHQgW2ZpbGUgZXh0ZW5zaW9uICRyb290XQ0gICAgICAgICAgICBpZiB7W3N0cmluZyBlcXVhbCAkY3VyckV4dCAkZXh0XX0gew0gICAgICAgICAgICAgICAgcmV0dXJuIDENICAgICAgICAgICAgfSANDQkgICAgIyBUaGUgY3VycmVudCBleHRlbnNpb24gZG9lcyBub3QgbWF0Y2g7IGlmIGl0IGlzIG5vdCBhIG51bWVyaWMNCSAgICAjIHZhbHVlLCBxdWl0LCBhcyB3ZSBhcmUgb25seSBsb29raW5nIHRvIGlnbm9yZSB2ZXJzaW9uIG51bWJlcg0JICAgICMgZXh0ZW5zaW9ucy4gIE90aGVyd2lzZSB3ZSBtaWdodCByZXR1cm4gMSBpbiB0aGlzIGNhc2U6DQkgICAgIwkJcGtnX2NvbXBhcmVFeHRlbnNpb24gZm9vLnNvLmJhciAuc28NCSAgICAjIHdoaWNoIHNob3VsZCBub3QgbWF0Y2guDQ0JICAgIGlmIHsgIVtzdHJpbmcgaXMgaW50ZWdlciAtc3RyaWN0IFtzdHJpbmcgcmFuZ2UgJGN1cnJFeHQgMSBlbmRdXSB9IHsNCQlyZXR1cm4gMA0JICAgIH0NICAgICAgICAgICAgc2V0IHJvb3QgW2ZpbGUgcm9vdG5hbWUgJHJvb3RdDQl9DSAgICB9DX0NDSMgcGtnX21rSW5kZXggLS0NIyBUaGlzIHByb2NlZHVyZSBjcmVhdGVzIGEgcGFja2FnZSBpbmRleCBpbiBhIGdpdmVuIGRpcmVjdG9yeS4gIFRoZQ0jIHBhY2thZ2UgaW5kZXggY29uc2lzdHMgb2YgYSAicGtnSW5kZXgudGNsIiBmaWxlIHdob3NlIGNvbnRlbnRzIGFyZQ0jIGEgVGNsIHNjcmlwdCB0aGF0IHNldHMgdXAgcGFja2FnZSBpbmZvcm1hdGlvbiB3aXRoICJwYWNrYWdlIHJlcXVpcmUiDSMgY29tbWFuZHMuICBUaGUgY29tbWFuZHMgZGVzY3JpYmUgYWxsIG9mIHRoZSBwYWNrYWdlcyBkZWZpbmVkIGJ5IHRoZQ0jIGZpbGVzIGdpdmVuIGFzIGFyZ3VtZW50cy4NIw0jIEFyZ3VtZW50czoNIyAtZGlyZWN0CQkob3B0aW9uYWwpIElmIHRoaXMgZmxhZyBpcyBwcmVzZW50LCB0aGUgZ2VuZXJhdGVkDSMJCQljb2RlIGluIHBrZ01rSW5kZXgudGNsIHdpbGwgY2F1c2UgdGhlIHBhY2thZ2UgdG8gYmUNIwkJCWxvYWRlZCB3aGVuICJwYWNrYWdlIHJlcXVpcmUiIGlzIGV4ZWN1dGVkLCByYXRoZXINIwkJCXRoYW4gbGF6aWx5IHdoZW4gdGhlIGZpcnN0IHJlZmVyZW5jZSB0byBhbiBleHBvcnRlZA0jCQkJcHJvY2VkdXJlIGluIHRoZSBwYWNrYWdlIGlzIG1hZGUuDSMgLXZlcmJvc2UJCShvcHRpb25hbCkgVmVyYm9zZSBvdXRwdXQ7IHRoZSBuYW1lIG9mIGVhY2ggZmlsZSB0aGF0DSMJCQl3YXMgc3VjY2Vzc2Z1bGx5IHJvY2Vzc2VkIGlzIHByaW50ZWQgb3V0LiBBZGRpdGlvbmFsbHksDSMJCQlpZiBwcm9jZXNzaW5nIG9mIGEgZmlsZSBmYWlsZWQgYSBtZXNzYWdlIGlzIHByaW50ZWQuDSMgLWxvYWQgcGF0CQkob3B0aW9uYWwpIFByZWxvYWQgYW55IHBhY2thZ2VzIHdob3NlIG5hbWVzIG1hdGNoDSMJCQl0aGUgcGF0dGVybi4gIFVzZWQgdG8gaGFuZGxlIERMTHMgdGhhdCBkZXBlbmQgb24NIwkJCW90aGVyIHBhY2thZ2VzIGR1cmluZyB0aGVpciBJbml0IHByb2NlZHVyZS4NIyBkaXIgLQkJCU5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBjcmVhdGUgdGhlIGluZGV4Lg0jIGFyZ3MgLQkJQW55IG51bWJlciBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cywgZWFjaCBnaXZpbmcNIwkJCWEgZ2xvYiBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyB0aGUgbmFtZXMgb2Ygb25lIG9yDSMJCQltb3JlIHNoYXJlZCBsaWJyYXJpZXMgb3IgVGNsIHNjcmlwdCBmaWxlcyBpbg0jCQkJZGlyLg0NcHJvYyBwa2dfbWtJbmRleCB7YXJnc30gew0gICAgZ2xvYmFsIGVycm9yQ29kZSBlcnJvckluZm8NICAgIHNldCB1c2FnZSB7InBrZ19ta0luZGV4ID8tZGlyZWN0PyA/LWxhenk/ID8tbG9hZCBwYXR0ZXJuPyA/LXZlcmJvc2U/ID8tLT8gZGlyID9wYXR0ZXJuIC4uLj8ifTsNDSAgICBzZXQgYXJnQ291bnQgW2xsZW5ndGggJGFyZ3NdDSAgICBpZiB7JGFyZ0NvdW50IDwgMX0gew0JcmV0dXJuIC1jb2RlIGVycm9yICJ3cm9uZyAjIGFyZ3M6IHNob3VsZCBiZVxuJHVzYWdlIg0gICAgfQ0NICAgIHNldCBtb3JlICIiDSAgICBzZXQgZGlyZWN0IDENICAgIHNldCBkb1ZlcmJvc2UgMA0gICAgc2V0IGxvYWRQYXQgIiINICAgIGZvciB7c2V0IGlkeCAwfSB7JGlkeCA8ICRhcmdDb3VudH0ge2luY3IgaWR4fSB7DQlzZXQgZmxhZyBbbGluZGV4ICRhcmdzICRpZHhdDQlzd2l0Y2ggLWdsb2IgLS0gJGZsYWcgew0JICAgIC0tIHsNCQkjIGRvbmUgd2l0aCB0aGUgZmxhZ3MNCQlpbmNyIGlkeA0JCWJyZWFrDQkgICAgfQ0JICAgIC12ZXJib3NlIHsNCQlzZXQgZG9WZXJib3NlIDENCSAgICB9DQkgICAgLWxhenkgew0JCXNldCBkaXJlY3QgMA0JCWFwcGVuZCBtb3JlICIgLWxhenkiDQkgICAgfQ0JICAgIC1kaXJlY3Qgew0JCWFwcGVuZCBtb3JlICIgLWRpcmVjdCINCSAgICB9DQkgICAgLWxvYWQgew0JCWluY3IgaWR4DQkJc2V0IGxvYWRQYXQgW2xpbmRleCAkYXJncyAkaWR4XQ0JCWFwcGVuZCBtb3JlICIgLWxvYWQgJGxvYWRQYXQiDQkgICAgfQ0JICAgIC0qIHsNCQlyZXR1cm4gLWNvZGUgZXJyb3IgInVua25vd24gZmxhZyAkZmxhZzogc2hvdWxkIGJlXG4kdXNhZ2UiDQkgICAgfQ0JICAgIGRlZmF1bHQgew0JCSMgZG9uZSB3aXRoIHRoZSBmbGFncw0JCWJyZWFrDQkgICAgfQ0JfQ0gICAgfQ0NICAgIHNldCBkaXIgW2xpbmRleCAkYXJncyAkaWR4XQ0gICAgc2V0IHBhdHRlcm5MaXN0IFtscmFuZ2UgJGFyZ3MgW2V4cHIgeyRpZHggKyAxfV0gZW5kXQ0gICAgaWYge1tsbGVuZ3RoICRwYXR0ZXJuTGlzdF0gPT0gMH0gew0Jc2V0IHBhdHRlcm5MaXN0IFtsaXN0ICIqLnRjbCIgIipbaW5mbyBzaGFyZWRsaWJleHRlbnNpb25dIl0NICAgIH0NDSAgICBzZXQgb2xkRGlyIFtwd2RdDSAgICBjZCAkZGlyDQ0gICAgaWYge1tjYXRjaCB7ZXZhbCBnbG9iICRwYXR0ZXJuTGlzdH0gZmlsZUxpc3RdfSB7DQlnbG9iYWwgZXJyb3JDb2RlIGVycm9ySW5mbw0JY2QgJG9sZERpcg0JcmV0dXJuIC1jb2RlIGVycm9yIC1lcnJvcmNvZGUgJGVycm9yQ29kZSAtZXJyb3JpbmZvICRlcnJvckluZm8gJGZpbGVMaXN0DSAgICB9DSAgICBmb3JlYWNoIGZpbGUgJGZpbGVMaXN0IHsNCSMgRm9yIGVhY2ggZmlsZSwgZmlndXJlIG91dCB3aGF0IGNvbW1hbmRzIGFuZCBwYWNrYWdlcyBpdCBwcm92aWRlcy4NCSMgVG8gZG8gdGhpcywgY3JlYXRlIGEgY2hpbGQgaW50ZXJwcmV0ZXIsIGxvYWQgdGhlIGZpbGUgaW50byB0aGUNCSMgaW50ZXJwcmV0ZXIsIGFuZCBnZXQgYSBsaXN0IG9mIHRoZSBuZXcgY29tbWFuZHMgYW5kIHBhY2thZ2VzDQkjIHRoYXQgYXJlIGRlZmluZWQuDQ0JaWYge1tzdHJpbmcgZXF1YWwgJGZpbGUgInBrZ0luZGV4LnRjbCJdfSB7DQkgICAgY29udGludWUNCX0NDQkjIENoYW5nZWQgYmFjayB0byB0aGUgb3JpZ2luYWwgZGlyZWN0b3J5IGJlZm9yZSBpbml0aWFsaXppbmcgdGhlDQkjIHNsYXZlIGluIGNhc2UgVENMX0xJQlJBUlkgaXMgYSByZWxhdGl2ZSBwYXRoIChlLmcuIGluIHRoZSB0ZXN0DQkjIHN1aXRlKS4gDQ0JY2QgJG9sZERpcg0Jc2V0IGMgW2ludGVycCBjcmVhdGVdDQ0JIyBMb2FkIGludG8gdGhlIGNoaWxkIGFueSBwYWNrYWdlcyBjdXJyZW50bHkgbG9hZGVkIGluIHRoZSBwYXJlbnQNCSMgaW50ZXJwcmV0ZXIgdGhhdCBtYXRjaCB0aGUgLWxvYWQgcGF0dGVybi4NDQlpZiB7W3N0cmluZyBsZW5ndGggJGxvYWRQYXRdfSB7DQkgICAgaWYgeyRkb1ZlcmJvc2V9IHsNCQl0Y2xMb2cgImN1cnJlbnRseSBsb2FkZWQgcGFja2FnZXM6ICdbaW5mbyBsb2FkZWRdJyINCQl0Y2xMb2cgInRyeWluZyB0byBsb2FkIGFsbCBwYWNrYWdlcyBtYXRjaGluZyAkbG9hZFBhdCINCSAgICB9DQkgICAgaWYgeyFbbGxlbmd0aCBbaW5mbyBsb2FkZWRdXX0gew0JCXRjbExvZyAid2FybmluZzogbm8gcGFja2FnZXMgYXJlIGN1cnJlbnRseSBsb2FkZWQsIG5vdGhpbmciDQkJdGNsTG9nICJjYW4gcG9zc2libHkgbWF0Y2ggJyRsb2FkUGF0JyINCSAgICB9DQl9DQlmb3JlYWNoIHBrZyBbaW5mbyBsb2FkZWRdIHsNCSAgICBpZiB7ISBbc3RyaW5nIG1hdGNoICRsb2FkUGF0IFtsaW5kZXggJHBrZyAxXV19IHsNCQljb250aW51ZQ0JICAgIH0NCSAgICBpZiB7JGRvVmVyYm9zZX0gew0JCXRjbExvZyAicGFja2FnZSBbbGluZGV4ICRwa2cgMV0gbWF0Y2hlcyAnJGxvYWRQYXQnIg0JICAgIH0NCSAgICBpZiB7W2NhdGNoIHsNCQlsb2FkIFtsaW5kZXggJHBrZyAwXSBbbGluZGV4ICRwa2cgMV0gJGMNCSAgICB9IGVycl19IHsNCQlpZiB7JGRvVmVyYm9zZX0gew0JCSAgICB0Y2xMb2cgIndhcm5pbmc6IGxvYWQgW2xpbmRleCAkcGtnIDBdIFtsaW5kZXggJHBrZyAxXVxuZmFpbGVkIHdpdGg6ICRlcnIiDQkJfQ0JICAgIH0gZWxzZWlmIHskZG9WZXJib3NlfSB7DQkJdGNsTG9nICJsb2FkZWQgW2xpbmRleCAkcGtnIDBdIFtsaW5kZXggJHBrZyAxXSINCSAgICB9DQkgICAgaWYge1tzdHJpbmcgZXF1YWwgW2xpbmRleCAkcGtnIDFdICJUayJdfSB7DQkJIyBXaXRoZHJhdyAuIGlmIFRrIHdhcyBsb2FkZWQsIHRvIGF2b2lkIHNob3dpbmcgYSB3aW5kb3cuDQkJJGMgZXZhbCBbbGlzdCB3bSB3aXRoZHJhdyAuXQ0JICAgIH0NCX0NCWNkICRkaXINDQkkYyBldmFsIHsNCSAgICAjIFN0dWIgb3V0IHRoZSBwYWNrYWdlIGNvbW1hbmQgc28gcGFja2FnZXMgY2FuDQkgICAgIyByZXF1aXJlIG90aGVyIHBhY2thZ2VzLg0NCSAgICByZW5hbWUgcGFja2FnZSBfX3BhY2thZ2Vfb3JpZw0JICAgIHByb2MgcGFja2FnZSB7d2hhdCBhcmdzfSB7DQkJc3dpdGNoIC0tICR3aGF0IHsNCQkgICAgcmVxdWlyZSB7IHJldHVybiA7ICMgaWdub3JlIHRyYW5zaXRpdmUgcmVxdWlyZXMgfQ0JCSAgICBkZWZhdWx0IHsgZXZhbCBfX3BhY2thZ2Vfb3JpZyB7JHdoYXR9ICRhcmdzIH0NCQl9DQkgICAgfQ0JICAgIHByb2MgdGNsUGtnVW5rbm93biBhcmdzIHt9DQkgICAgcGFja2FnZSB1bmtub3duIHRjbFBrZ1Vua25vd24NDQkgICAgIyBTdHViIG91dCB0aGUgdW5rbm93biBjb21tYW5kIHNvIHBhY2thZ2UgY2FuIGNhbGwNCSAgICAjIGludG8gZWFjaCBvdGhlciBkdXJpbmcgdGhlaXIgaW5pdGlhbGlsemF0aW9uLg0NCSAgICBwcm9jIHVua25vd24ge2FyZ3N9IHt9DQ0JICAgICMgU3R1YiBvdXQgdGhlIGF1dG9faW1wb3J0IG1lY2hhbmlzbQ0NCSAgICBwcm9jIGF1dG9faW1wb3J0IHthcmdzfSB7fQ0NCSAgICAjIHJlc2VydmUgdGhlIDo6dGNsIG5hbWVzcGFjZSBmb3Igc3VwcG9ydCBwcm9jcw0JICAgICMgYW5kIHRlbXBvcmFyeSB2YXJpYWJsZXMuICBUaGlzIG1pZ2h0IG1ha2UgaXQgYXdrd2FyZA0JICAgICMgdG8gZ2VuZXJhdGUgYSBwa2dJbmRleC50Y2wgZmlsZSBmb3IgdGhlIDo6dGNsIG5hbWVzcGFjZS4NDQkgICAgbmFtZXNwYWNlIGV2YWwgOjp0Y2wgew0JCXZhcmlhYmxlIGZpbGUJCTsjIEN1cnJlbnQgZmlsZSBiZWluZyBwcm9jZXNzZWQNCQl2YXJpYWJsZSBkaXJlY3QJCTsjIC1kaXJlY3QgZmxhZyB2YWx1ZQ0JCXZhcmlhYmxlIHgJCTsjIExvb3AgdmFyaWFibGUNCQl2YXJpYWJsZSBkZWJ1ZwkJOyMgRm9yIGRlYnVnZ2luZw0JCXZhcmlhYmxlIHR5cGUJCTsjICJsb2FkIiBvciAic291cmNlIiwgZm9yIC1kaXJlY3QNCQl2YXJpYWJsZSBuYW1lc3BhY2VzCTsjIEV4aXN0aW5nIG5hbWVzcGFjZXMgKGUuZy4sIDo6dGNsKQ0JCXZhcmlhYmxlIHBhY2thZ2VzCTsjIEV4aXN0aW5nIHBhY2thZ2VzIChlLmcuLCBUY2wpDQkJdmFyaWFibGUgb3JpZ0NtZHMJOyMgRXhpc3RpbmcgY29tbWFuZHMNCQl2YXJpYWJsZSBuZXdDbWRzCTsjIE5ld2x5IGNyZWF0ZWQgY29tbWFuZHMNCQl2YXJpYWJsZSBuZXdQa2dzIHt9CTsjIE5ld2x5IGNyZWF0ZWQgcGFja2FnZXMNCSAgICB9DQl9DQ0JJGMgZXZhbCBbbGlzdCBzZXQgOjp0Y2w6OmZpbGUgJGZpbGVdDQkkYyBldmFsIFtsaXN0IHNldCA6OnRjbDo6ZGlyZWN0ICRkaXJlY3RdDQ0JIyBEb3dubG9hZCBuZWVkZWQgcHJvY2VkdXJlcyBpbnRvIHRoZSBzbGF2ZSBiZWNhdXNlIHdlJ3ZlDQkjIGp1c3QgZGVsZXRlZCB0aGUgdW5rbm93biBwcm9jZWR1cmUuICBUaGlzIGRvZXNuJ3QgaGFuZGxlDQkjIHByb2NlZHVyZXMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cy4NDQlmb3JlYWNoIHAge3BrZ19jb21wYXJlRXh0ZW5zaW9ufSB7DQkgICAgJGMgZXZhbCBbbGlzdCBwcm9jICRwIFtpbmZvIGFyZ3MgJHBdIFtpbmZvIGJvZHkgJHBdXQ0JfQ0NCWlmIHtbY2F0Y2ggew0JICAgICRjIGV2YWwgew0JCXNldCA6OnRjbDo6ZGVidWcgImxvYWRpbmcgb3Igc291cmNpbmciDQ0JCSMgd2UgbmVlZCB0byB0cmFjayBjb21tYW5kIGRlZmluZWQgYnkgZWFjaCBwYWNrYWdlIGV2ZW4gaW4NCQkjIHRoZSAtZGlyZWN0IGNhc2UsIGJlY2F1c2UgdGhleSBhcmUgbmVlZGVkIGludGVybmFsbHkgYnkNCQkjIHRoZSAicGFydGlhbCBwa2dJbmRleC50Y2wiIHN0ZXAgYWJvdmUuDQ0JCXByb2MgOjp0Y2w6OkdldEFsbE5hbWVzcGFjZXMge3tyb290IDo6fX0gew0JCSAgICBzZXQgbGlzdCAkcm9vdA0JCSAgICBmb3JlYWNoIG5zIFtuYW1lc3BhY2UgY2hpbGRyZW4gJHJvb3RdIHsNCQkJZXZhbCBsYXBwZW5kIGxpc3QgWzo6dGNsOjpHZXRBbGxOYW1lc3BhY2VzICRuc10NCQkgICAgfQ0JCSAgICByZXR1cm4gJGxpc3QNCQl9DQ0JCSMgaW5pdCB0aGUgbGlzdCBvZiBleGlzdGluZyBuYW1lc3BhY2VzLCBwYWNrYWdlcywgY29tbWFuZHMNDQkJZm9yZWFjaCA6OnRjbDo6eCBbOjp0Y2w6OkdldEFsbE5hbWVzcGFjZXNdIHsNCQkgICAgc2V0IDo6dGNsOjpuYW1lc3BhY2VzKCQ6OnRjbDo6eCkgMQ0JCX0NCQlmb3JlYWNoIDo6dGNsOjp4IFtwYWNrYWdlIG5hbWVzXSB7DQkJICAgIHNldCA6OnRjbDo6cGFja2FnZXMoJDo6dGNsOjp4KSAxDQkJfQ0JCXNldCA6OnRjbDo6b3JpZ0NtZHMgW2luZm8gY29tbWFuZHNdDQ0JCSMgVHJ5IHRvIGxvYWQgdGhlIGZpbGUgaWYgaXQgaGFzIHRoZSBzaGFyZWQgbGlicmFyeQ0JCSMgZXh0ZW5zaW9uLCBvdGhlcndpc2Ugc291cmNlIGl0LiAgSXQncyBpbXBvcnRhbnQgbm90IHRvDQkJIyB0cnkgdG8gbG9hZCBmaWxlcyB0aGF0IGFyZW4ndCBzaGFyZWQgbGlicmFyaWVzLCBiZWNhdXNlDQkJIyBvbiBzb21lIHN5c3RlbXMgKGxpa2UgU3VuT1MpIHRoZSBsb2FkZXIgd2lsbCBhYm9ydCB0aGUNCQkjIHdob2xlIGFwcGxpY2F0aW9uIHdoZW4gaXQgZ2V0cyBhbiBlcnJvci4NDQkJaWYge1twa2dfY29tcGFyZUV4dGVuc2lvbiAkOjp0Y2w6OmZpbGUgW2luZm8gc2hhcmVkbGliZXh0ZW5zaW9uXV19IHsNCQkgICAgIyBUaGUgImZpbGUgam9pbiAuIiBjb21tYW5kIGJlbG93IGlzIG5lY2Vzc2FyeS4NCQkgICAgIyBXaXRob3V0IGl0LCBpZiB0aGUgZmlsZSBuYW1lIGhhcyBubyBcJ3MgYW5kIHdlJ3JlDQkJICAgICMgb24gVU5JWCwgdGhlIGxvYWQgY29tbWFuZCB3aWxsIGludm9rZSB0aGUNCQkgICAgIyBMRF9MSUJSQVJZX1BBVEggc2VhcmNoIG1lY2hhbmlzbSwgd2hpY2ggY291bGQgY2F1c2UNCQkgICAgIyB0aGUgd3JvbmcgZmlsZSB0byBiZSB1c2VkLg0NCQkgICAgc2V0IDo6dGNsOjpkZWJ1ZyBsb2FkaW5nDQkJICAgIGxvYWQgW2ZpbGUgam9pbiAuICQ6OnRjbDo6ZmlsZV0NCQkgICAgc2V0IDo6dGNsOjp0eXBlIGxvYWQNCQl9IGVsc2Ugew0JCSAgICBzZXQgOjp0Y2w6OmRlYnVnIHNvdXJjaW5nDQkJICAgIHNvdXJjZSAkOjp0Y2w6OmZpbGUNCQkgICAgc2V0IDo6dGNsOjp0eXBlIHNvdXJjZQ0JCX0NDQkJIyBBcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiwgaWYgd2UgYXJlIGNyZWF0aW5nIA0JCSMgZGlyZWN0IGxvYWQgcGFja2FnZXMsIGRvbid0IGJvdGhlciBmaWd1cmluZyBvdXQgdGhlIA0JCSMgc2V0IG9mIGNvbW1hbmRzIGNyZWF0ZWQgYnkgdGhlIG5ldyBwYWNrYWdlcy4gIFdlIA0JCSMgb25seSBuZWVkIHRoYXQgbGlzdCBmb3Igc2V0dGluZyB1cCB0aGUgYXV0b2xvYWRpbmcgDQkJIyB1c2VkIGluIHRoZSBub24tZGlyZWN0IGNhc2UuDQkJaWYgeyAhJDo6dGNsOjpkaXJlY3QgfSB7DQkJICAgICMgU2VlIHdoYXQgbmV3IG5hbWVzcGFjZXMgYXBwZWFyZWQsIGFuZCBpbXBvcnQgY29tbWFuZHMNCQkgICAgIyBmcm9tIHRoZW0uICBPbmx5IGV4cG9ydGVkIGNvbW1hbmRzIGdvIGludG8gdGhlIGluZGV4Lg0JCSAgICANCQkgICAgZm9yZWFjaCA6OnRjbDo6eCBbOjp0Y2w6OkdldEFsbE5hbWVzcGFjZXNdIHsNCQkJaWYgeyEgW2luZm8gZXhpc3RzIDo6dGNsOjpuYW1lc3BhY2VzKCQ6OnRjbDo6eCldfSB7DQkJCSAgICBuYW1lc3BhY2UgaW1wb3J0IC1mb3JjZSAkezo6dGNsOjp4fTo6Kg0JCQl9DQ0JCQkjIEZpZ3VyZSBvdXQgd2hhdCBjb21tYW5kcyBhcHBlYXJlZA0JCQkNCQkJZm9yZWFjaCA6OnRjbDo6eCBbaW5mbyBjb21tYW5kc10gew0JCQkgICAgc2V0IDo6dGNsOjpuZXdDbWRzKCQ6OnRjbDo6eCkgMQ0JCQl9DQkJCWZvcmVhY2ggOjp0Y2w6OnggJDo6dGNsOjpvcmlnQ21kcyB7DQkJCSAgICBjYXRjaCB7dW5zZXQgOjp0Y2w6Om5ld0NtZHMoJDo6dGNsOjp4KX0NCQkJfQ0JCQlmb3JlYWNoIDo6dGNsOjp4IFthcnJheSBuYW1lcyA6OnRjbDo6bmV3Q21kc10gew0JCQkgICAgIyBkZXRlcm1pbmUgd2hpY2ggbmFtZXNwYWNlIGEgY29tbWFuZCBjb21lcyBmcm9tDQkJCSAgICANCQkJICAgIHNldCA6OnRjbDo6YWJzIFtuYW1lc3BhY2Ugb3JpZ2luICQ6OnRjbDo6eF0NCQkJICAgIA0JCQkgICAgIyBzcGVjaWFsIGNhc2Ugc28gdGhhdCBnbG9iYWwgbmFtZXMgaGF2ZSBubyBsZWFkaW5nDQkJCSAgICAjIDo6LCB0aGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSB1bmtub3duIGNvbW1hbmQNCQkJICAgIA0JCQkgICAgc2V0IDo6dGNsOjphYnMgXA0JCQkJICAgIFtsaW5kZXggW2F1dG9fcXVhbGlmeSAkOjp0Y2w6OmFicyA6Ol0gMF0NCQkJICAgIA0JCQkgICAgaWYge1tzdHJpbmcgY29tcGFyZSAkOjp0Y2w6OnggJDo6dGNsOjphYnNdfSB7DQkJCQkjIE5hbWUgY2hhbmdlZCBkdXJpbmcgcXVhbGlmaWNhdGlvbg0JCQkJDQkJCQlzZXQgOjp0Y2w6Om5ld0NtZHMoJDo6dGNsOjphYnMpIDENCQkJCXVuc2V0IDo6dGNsOjpuZXdDbWRzKCQ6OnRjbDo6eCkNCQkJICAgIH0NCQkJfQ0JCSAgICB9DQkJfQ0NCQkjIExvb2sgdGhyb3VnaCB0aGUgcGFja2FnZXMgdGhhdCBhcHBlYXJlZCwgYW5kIGlmIHRoZXJlIGlzDQkJIyBhIHZlcnNpb24gcHJvdmlkZWQsIHRoZW4gcmVjb3JkIGl0DQ0JCWZvcmVhY2ggOjp0Y2w6OnggW3BhY2thZ2UgbmFtZXNdIHsNCQkgICAgaWYge1tzdHJpbmcgY29tcGFyZSBbcGFja2FnZSBwcm92aWRlICQ6OnRjbDo6eF0gIiJdIFwNCQkJICAgICYmICFbaW5mbyBleGlzdHMgOjp0Y2w6OnBhY2thZ2VzKCQ6OnRjbDo6eCldfSB7DQkJCWxhcHBlbmQgOjp0Y2w6Om5ld1BrZ3MgXA0JCQkgICAgW2xpc3QgJDo6dGNsOjp4IFtwYWNrYWdlIHByb3ZpZGUgJDo6dGNsOjp4XV0NCQkgICAgfQ0JCX0NCSAgICB9DQl9IG1zZ10gPT0gMX0gew0JICAgIHNldCB3aGF0IFskYyBldmFsIHNldCA6OnRjbDo6ZGVidWddDQkgICAgaWYgeyRkb1ZlcmJvc2V9IHsNCQl0Y2xMb2cgIndhcm5pbmc6IGVycm9yIHdoaWxlICR3aGF0ICRmaWxlOiAkbXNnIg0JICAgIH0NCX0gZWxzZSB7DQkgICAgc2V0IHdoYXQgWyRjIGV2YWwgc2V0IDo6dGNsOjpkZWJ1Z10NCSAgICBpZiB7JGRvVmVyYm9zZX0gew0JCXRjbExvZyAic3VjY2Vzc2Z1bCAkd2hhdCBvZiAkZmlsZSINCSAgICB9DQkgICAgc2V0IHR5cGUgWyRjIGV2YWwgc2V0IDo6dGNsOjp0eXBlXQ0JICAgIHNldCBjbWRzIFtsc29ydCBbJGMgZXZhbCBhcnJheSBuYW1lcyA6OnRjbDo6bmV3Q21kc11dDQkgICAgc2V0IHBrZ3MgWyRjIGV2YWwgc2V0IDo6dGNsOjpuZXdQa2dzXQ0JICAgIGlmIHskZG9WZXJib3NlfSB7DQkJdGNsTG9nICJjb21tYW5kcyBwcm92aWRlZCB3ZXJlICRjbWRzIg0JCXRjbExvZyAicGFja2FnZXMgcHJvdmlkZWQgd2VyZSAkcGtncyINCSAgICB9DQkgICAgaWYge1tsbGVuZ3RoICRwa2dzXSA+IDF9IHsNCQl0Y2xMb2cgIndhcm5pbmc6IFwiJGZpbGVcIiBwcm92aWRlcyBtb3JlIHRoYW4gb25lIHBhY2thZ2UgKCRwa2dzKSINCSAgICB9DQkgICAgZm9yZWFjaCBwa2cgJHBrZ3Mgew0JCSMgY21kcyBpcyBlbXB0eS9ub3QgdXNlZCBpbiB0aGUgZGlyZWN0IGNhc2UNCQlsYXBwZW5kIGZpbGVzKCRwa2cpIFtsaXN0ICRmaWxlICR0eXBlICRjbWRzXQ0JICAgIH0NDQkgICAgaWYgeyRkb1ZlcmJvc2V9IHsNCQl0Y2xMb2cgInByb2Nlc3NlZCAkZmlsZSINCSAgICB9DQkgICAgaW50ZXJwIGRlbGV0ZSAkYw0JfQ0gICAgfQ0NICAgIGFwcGVuZCBpbmRleCAiIyBUY2wgcGFja2FnZSBpbmRleCBmaWxlLCB2ZXJzaW9uIDEuMVxuIg0gICAgYXBwZW5kIGluZGV4ICIjIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgdGhlIFwicGtnX21rSW5kZXgkbW9yZVwiIGNvbW1hbmRcbiINICAgIGFwcGVuZCBpbmRleCAiIyBhbmQgc291cmNlZCBlaXRoZXIgd2hlbiBhbiBhcHBsaWNhdGlvbiBzdGFydHMgdXAgb3JcbiINICAgIGFwcGVuZCBpbmRleCAiIyBieSBhIFwicGFja2FnZSB1bmtub3duXCIgc2NyaXB0LiAgSXQgaW52b2tlcyB0aGVcbiINICAgIGFwcGVuZCBpbmRleCAiIyBcInBhY2thZ2UgaWZuZWVkZWRcIiBjb21tYW5kIHRvIHNldCB1cCBwYWNrYWdlLXJlbGF0ZWRcbiINICAgIGFwcGVuZCBpbmRleCAiIyBpbmZvcm1hdGlvbiBzbyB0aGF0IHBhY2thZ2VzIHdpbGwgYmUgbG9hZGVkIGF1dG9tYXRpY2FsbHlcbiINICAgIGFwcGVuZCBpbmRleCAiIyBpbiByZXNwb25zZSB0byBcInBhY2thZ2UgcmVxdWlyZVwiIGNvbW1hbmRzLiAgV2hlbiB0aGlzXG4iDSAgICBhcHBlbmQgaW5kZXggIiMgc2NyaXB0IGlzIHNvdXJjZWQsIHRoZSB2YXJpYWJsZSBcJGRpciBtdXN0IGNvbnRhaW4gdGhlXG4iDSAgICBhcHBlbmQgaW5kZXggIiMgZnVsbCBwYXRoIG5hbWUgb2YgdGhpcyBmaWxlJ3MgZGlyZWN0b3J5LlxuIg0NICAgIGZvcmVhY2ggcGtnIFtsc29ydCBbYXJyYXkgbmFtZXMgZmlsZXNdXSB7DQlzZXQgY21kIHt9DQlmb3JlYWNoIHtuYW1lIHZlcnNpb259ICRwa2cgew0JICAgIGJyZWFrDQl9DQlsYXBwZW5kIGNtZCA6OnBrZzo6Y3JlYXRlIC1uYW1lICRuYW1lIC12ZXJzaW9uICR2ZXJzaW9uDQlmb3JlYWNoIHNwZWMgJGZpbGVzKCRwa2cpIHsNCSAgICBmb3JlYWNoIHtmaWxlIHR5cGUgcHJvY3N9ICRzcGVjIHsNCQlpZiB7ICRkaXJlY3QgfSB7DQkJICAgIHNldCBwcm9jcyB7fQ0JCX0NCQlsYXBwZW5kIGNtZCAiLSR0eXBlIiBbbGlzdCAkZmlsZSAkcHJvY3NdDQkgICAgfQ0JfQ0JYXBwZW5kIGluZGV4ICJcbltldmFsICRjbWRdIg0gICAgfQ0NICAgIHNldCBmIFtvcGVuIHBrZ0luZGV4LnRjbCB3XQ0gICAgcHV0cyAkZiAkaW5kZXgNICAgIGNsb3NlICRmDSAgICBjZCAkb2xkRGlyDX0NDSMgdGNsUGtnU2V0dXAgLS0NIyBUaGlzIGlzIGEgdXRpbGl0eSBwcm9jZWR1cmUgdXNlIGJ5IHBrZ0luZGV4LnRjbCBmaWxlcy4gIEl0IGlzIGludm9rZWQNIyBhcyBwYXJ0IG9mIGEgInBhY2thZ2UgaWZuZWVkZWQiIHNjcmlwdC4gIEl0IGNhbGxzICJwYWNrYWdlIHByb3ZpZGUiDSMgdG8gaW5kaWNhdGUgdGhhdCBhIHBhY2thZ2UgaXMgYXZhaWxhYmxlLCB0aGVuIHNldHMgZW50cmllcyBpbiB0aGUNIyBhdXRvX2luZGV4IGFycmF5IHNvIHRoYXQgdGhlIHBhY2thZ2UncyBmaWxlcyB3aWxsIGJlIGF1dG8tbG9hZGVkIHdoZW4NIyB0aGUgY29tbWFuZHMgYXJlIHVzZWQuDSMNIyBBcmd1bWVudHM6DSMgZGlyIC0JCQlEaXJlY3RvcnkgY29udGFpbmluZyBhbGwgdGhlIGZpbGVzIGZvciB0aGlzIHBhY2thZ2UuDSMgcGtnIC0JCQlOYW1lIG9mIHRoZSBwYWNrYWdlIChubyB2ZXJzaW9uIG51bWJlcikuDSMgdmVyc2lvbiAtCQlWZXJzaW9uIG51bWJlciBmb3IgdGhlIHBhY2thZ2UsIHN1Y2ggYXMgMi4xLjMuDSMgZmlsZXMgLQkJTGlzdCBvZiBmaWxlcyB0aGF0IGNvbnN0aXR1dGUgdGhlIHBhY2thZ2UuICBFYWNoDSMJCQllbGVtZW50IGlzIGEgc3ViLWxpc3Qgd2l0aCB0aHJlZSBlbGVtZW50cy4gIFRoZSBmaXJzdA0jCQkJaXMgdGhlIG5hbWUgb2YgYSBmaWxlIHJlbGF0aXZlIHRvICRkaXIsIHRoZSBzZWNvbmQgaXMNIwkJCSJsb2FkIiBvciAic291cmNlIiwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIGlzIGENIwkJCWxvYWRhYmxlIGJpbmFyeSBvciBhIHNjcmlwdCB0byBzb3VyY2UsIGFuZCB0aGUgdGhpcmQNIwkJCWlzIGEgbGlzdCBvZiBjb21tYW5kcyBkZWZpbmVkIGJ5IHRoaXMgZmlsZS4NDXByb2MgdGNsUGtnU2V0dXAge2RpciBwa2cgdmVyc2lvbiBmaWxlc30gew0gICAgZ2xvYmFsIGF1dG9faW5kZXgNDSAgICBwYWNrYWdlIHByb3ZpZGUgJHBrZyAkdmVyc2lvbg0gICAgZm9yZWFjaCBmaWxlSW5mbyAkZmlsZXMgew0Jc2V0IGYgW2xpbmRleCAkZmlsZUluZm8gMF0NCXNldCB0eXBlIFtsaW5kZXggJGZpbGVJbmZvIDFdDQlmb3JlYWNoIGNtZCBbbGluZGV4ICRmaWxlSW5mbyAyXSB7DQkgICAgaWYge1tzdHJpbmcgZXF1YWwgJHR5cGUgImxvYWQiXX0gew0JCXNldCBhdXRvX2luZGV4KCRjbWQpIFtsaXN0IGxvYWQgW2ZpbGUgam9pbiAkZGlyICRmXSAkcGtnXQ0JICAgIH0gZWxzZSB7DQkJc2V0IGF1dG9faW5kZXgoJGNtZCkgW2xpc3Qgc291cmNlIFtmaWxlIGpvaW4gJGRpciAkZl1dDQkgICAgfSANCX0NICAgIH0NfQ0NIyB0Y2xNYWNQa2dTZWFyY2ggLS0NIyBUaGUgcHJvY2VkdXJlIGlzIHVzZWQgb24gdGhlIE1hY2ludG9zaCB0byBzZWFyY2ggYSBnaXZlbiBkaXJlY3RvcnkgZm9yIGZpbGVzDSMgd2l0aCBhIFRFWFQgcmVzb3VyY2UgbmFtZWQgInBrZ0luZGV4Ii4gIElmIGl0IGV4aXN0cyBpdCBpcyBzb3VyY2VkIGluIHRvIHRoZQ0jIGludGVycHJldGVyIHRvIHNldHVwIHRoZSBwYWNrYWdlIGRhdGFiYXNlLg0NcHJvYyB0Y2xNYWNQa2dTZWFyY2gge2Rpcn0gew0gICAgZm9yZWFjaCB4IFtnbG9iIC1kaXJlY3RvcnkgJGRpciAtbm9jb21wbGFpbiAqLnNobGJdIHsNCWlmIHtbZmlsZSBpc2ZpbGUgJHhdfSB7DQkgICAgc2V0IHJlcyBbcmVzb3VyY2Ugb3BlbiAkeF0NCSAgICBmb3JlYWNoIHkgW3Jlc291cmNlIGxpc3QgVEVYVCAkcmVzXSB7DQkJaWYge1tzdHJpbmcgZXF1YWwgJHkgInBrZ0luZGV4Il19IHtzb3VyY2UgLXJzcmMgcGtnSW5kZXh9DQkgICAgfQ0JICAgIGNhdGNoIHtyZXNvdXJjZSBjbG9zZSAkcmVzfQ0JfQ0gICAgfQ19DQ0jIHRjbFBrZ1Vua25vd24gLS0NIyBUaGlzIHByb2NlZHVyZSBwcm92aWRlcyB0aGUgZGVmYXVsdCBmb3IgdGhlICJwYWNrYWdlIHVua25vd24iIGZ1bmN0aW9uLg0jIEl0IGlzIGludm9rZWQgd2hlbiBhIHBhY2thZ2UgdGhhdCdzIG5lZWRlZCBjYW4ndCBiZSBmb3VuZC4gIEl0IHNjYW5zDSMgdGhlIGF1dG9fcGF0aCBkaXJlY3RvcmllcyBhbmQgdGhlaXIgaW1tZWRpYXRlIGNoaWxkcmVuIGxvb2tpbmcgZm9yDSMgcGtnSW5kZXgudGNsIGZpbGVzIGFuZCBzb3VyY2VzIGFueSBzdWNoIGZpbGVzIHRoYXQgYXJlIGZvdW5kIHRvIHNldHVwDSMgdGhlIHBhY2thZ2UgZGF0YWJhc2UuICAoT24gdGhlIE1hY2ludG9zaCB3ZSBhbHNvIHNlYXJjaCBmb3IgcGtnSW5kZXgNIyBURVhUIHJlc291cmNlcyBpbiBhbGwgZmlsZXMuKSAgQXMgaXQgc2VhcmNoZXMsIGl0IHdpbGwgcmVjb2duaXplIGNoYW5nZXMNIyB0byB0aGUgYXV0b19wYXRoIGFuZCBzY2FuIGFueSBuZXcgZGlyZWN0b3JpZXMuDSMNIyBBcmd1bWVudHM6DSMgbmFtZSAtCQlOYW1lIG9mIGRlc2lyZWQgcGFja2FnZS4gIE5vdCB1c2VkLg0jIHZlcnNpb24gLQkJVmVyc2lvbiBvZiBkZXNpcmVkIHBhY2thZ2UuICBOb3QgdXNlZC4NIyBleGFjdCAtCQlFaXRoZXIgIi1leGFjdCIgb3Igb21pdHRlZC4gIE5vdCB1c2VkLg0NcHJvYyB0Y2xQa2dVbmtub3duIHtuYW1lIHZlcnNpb24ge2V4YWN0IHt9fX0gew0gICAgZ2xvYmFsIGF1dG9fcGF0aCB0Y2xfcGxhdGZvcm0gZW52DQ0gICAgaWYgeyFbaW5mbyBleGlzdHMgYXV0b19wYXRoXX0gew0JcmV0dXJuDSAgICB9DSAgICAjIENhY2hlIHRoZSBhdXRvX3BhdGgsIGJlY2F1c2UgaXQgbWF5IGNoYW5nZSB3aGlsZSB3ZSBydW4gdGhyb3VnaA0gICAgIyB0aGUgZmlyc3Qgc2V0IG9mIHBrZ0luZGV4LnRjbCBmaWxlcw0gICAgc2V0IG9sZF9wYXRoIFtzZXQgdXNlX3BhdGggJGF1dG9fcGF0aF0NICAgIHdoaWxlIHtbbGxlbmd0aCAkdXNlX3BhdGhdfSB7DQlzZXQgZGlyIFtsaW5kZXggJHVzZV9wYXRoIGVuZF0NCSMgd2UgY2FuJ3QgdXNlIGdsb2IgaW4gc2FmZSBpbnRlcnBzLCBzbyBlbmNsb3NlIHRoZSBmb2xsb3dpbmcNCSMgaW4gYSBjYXRjaCBzdGF0ZW1lbnQsIHdoZXJlIHdlIGdldCB0aGUgcGtnSW5kZXggZmlsZXMgb3V0DQkjIG9mIHRoZSBzdWJkaXJlY3Rvcmllcw0JY2F0Y2ggew0JICAgIGZvcmVhY2ggZmlsZSBbZ2xvYiAtZGlyZWN0b3J5ICRkaXIgLWpvaW4gLW5vY29tcGxhaW4gXA0JCSAgICAqIHBrZ0luZGV4LnRjbF0gew0JCXNldCBkaXIgW2ZpbGUgZGlybmFtZSAkZmlsZV0NCQlpZiB7W2ZpbGUgcmVhZGFibGUgJGZpbGVdICYmICFbaW5mbyBleGlzdHMgcHJvY2REaXJzKCRkaXIpXX0gew0JCSAgICBpZiB7W2NhdGNoIHtzb3VyY2UgJGZpbGV9IG1zZ119IHsNCQkJdGNsTG9nICJlcnJvciByZWFkaW5nIHBhY2thZ2UgaW5kZXggZmlsZSAkZmlsZTogJG1zZyINCQkgICAgfSBlbHNlIHsNCQkJc2V0IHByb2NkRGlycygkZGlyKSAxDQkJICAgIH0NCQl9DQkgICAgfQ0JfQ0Jc2V0IGRpciBbbGluZGV4ICR1c2VfcGF0aCBlbmRdDQlzZXQgZmlsZSBbZmlsZSBqb2luICRkaXIgcGtnSW5kZXgudGNsXQ0JIyBzYWZlIGludGVycHMgdXN1YWxseSBkb24ndCBoYXZlICJmaWxlIHJlYWRhYmxlIiwgbm9yIHN0ZGVyciBjaGFubmVsDQlpZiB7KFtpbnRlcnAgaXNzYWZlXSB8fCBbZmlsZSByZWFkYWJsZSAkZmlsZV0pICYmIFwNCQkhW2luZm8gZXhpc3RzIHByb2NkRGlycygkZGlyKV19IHsNCSAgICBpZiB7W2NhdGNoIHtzb3VyY2UgJGZpbGV9IG1zZ10gJiYgIVtpbnRlcnAgaXNzYWZlXX0gIHsNCQl0Y2xMb2cgImVycm9yIHJlYWRpbmcgcGFja2FnZSBpbmRleCBmaWxlICRmaWxlOiAkbXNnIg0JICAgIH0gZWxzZSB7DQkJc2V0IHByb2NkRGlycygkZGlyKSAxDQkgICAgfQ0JfQ0JIyBPbiB0aGUgTWFjaW50b3NoIHdlIGFsc28gbG9vayBpbiB0aGUgcmVzb3VyY2UgZm9yayANCSMgb2Ygc2hhcmVkIGxpYnJhcmllcw0JIyBXZSBjYW4ndCB1c2UgdGNsTWFjUGtnU2VhcmNoIGluIHNhZmUgaW50ZXJwcyBiZWNhdXNlIGl0IHVzZXMgZ2xvYg0JaWYgeyghW2ludGVycCBpc3NhZmVdKSAmJiBcDQkJW3N0cmluZyBlcXVhbCAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAibWFjaW50b3NoIl19IHsNCSAgICBzZXQgZGlyIFtsaW5kZXggJHVzZV9wYXRoIGVuZF0NCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBwcm9jZERpcnMoJGRpcildfSB7DQkJdGNsTWFjUGtnU2VhcmNoICRkaXINCQlzZXQgcHJvY2REaXJzKCRkaXIpIDENCSAgICB9DQkgICAgZm9yZWFjaCB4IFtnbG9iIC1kaXJlY3RvcnkgJGRpciAtbm9jb21wbGFpbiAqXSB7DQkJaWYge1tmaWxlIGlzZGlyZWN0b3J5ICR4XSAmJiAhW2luZm8gZXhpc3RzIHByb2NkRGlycygkeCldfSB7DQkJICAgIHNldCBkaXIgJHgNCQkgICAgdGNsTWFjUGtnU2VhcmNoICRkaXINCQkgICAgc2V0IHByb2NkRGlycygkZGlyKSAxDQkJfQ0JICAgIH0NCX0NCXNldCB1c2VfcGF0aCBbbHJhbmdlICR1c2VfcGF0aCAwIGVuZC0xXQ0JaWYge1tzdHJpbmcgY29tcGFyZSAkb2xkX3BhdGggJGF1dG9fcGF0aF19IHsNCSAgICBmb3JlYWNoIGRpciAkYXV0b19wYXRoIHsNCQlsYXBwZW5kIHVzZV9wYXRoICRkaXINCSAgICB9DQkgICAgc2V0IG9sZF9wYXRoICRhdXRvX3BhdGgNCX0NICAgIH0NfQ0NIyA6OnBrZzo6Y3JlYXRlIC0tDSMNIwlHaXZlbiBhIHBhY2thZ2Ugc3BlY2lmaWNhdGlvbiBnZW5lcmF0ZSBhICJwYWNrYWdlIGlmbmVlZGVkIiBzdGF0ZW1lbnQNIwlmb3IgdGhlIHBhY2thZ2UsIHN1aXRhYmxlIGZvciBpbmNsdXNpb24gaW4gYSBwa2dJbmRleC50Y2wgZmlsZS4NIw0jIEFyZ3VtZW50czoNIwlhcmdzCQlhcmd1bWVudHMgdXNlZCBieSB0aGUgY3JlYXRlIGZ1bmN0aW9uOg0jCQkJLW5hbWUJCXBhY2thZ2VOYW1lDSMJCQktdmVyc2lvbglwYWNrYWdlVmVyc2lvbg0jCQkJLWxvYWQJCXtmaWxlbmFtZSA/e3Byb2NzfT99DSMJCQkuLi4NIwkJCS1zb3VyY2UJCXtmaWxlbmFtZSA/e3Byb2NzfT99DSMJCQkuLi4NIw0jCQkJQW55IG51bWJlciBvZiAtbG9hZCBhbmQgLXNvdXJjZSBwYXJhbWV0ZXJzIG1heSBiZQ0jCQkJc3BlY2lmaWVkLCBzbyBsb25nIGFzIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSAtbG9hZCBvcg0jCQkJLXNvdXJjZSBwYXJhbWV0ZXIuICBJZiB0aGUgcHJvY3MgY29tcG9uZW50IG9mIGEgDSMJCQltb2R1bGUgc3BlY2lmaWVyIGlzIGxlZnQgb2ZmLCB0aGF0IG1vZHVsZSB3aWxsIGJlDSMJCQlzZXQgdXAgZm9yIGRpcmVjdCBsb2FkaW5nOyBvdGhlcndpc2UsIGl0IHdpbGwgYmUNIwkJCXNldCB1cCBmb3IgbGF6eSBsb2FkaW5nLiAgSWYgYm90aCAtc291cmNlIGFuZCAtbG9hZA0jCQkJYXJlIHNwZWNpZmllZCwgdGhlIC1sb2FkJ2VkIGZpbGVzIHdpbGwgYmUgbG9hZGVkIA0jCQkJZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSAtc291cmNlJ2QgZmlsZXMuDSMNIyBSZXN1bHRzOg0jCUFuIGFwcHJvcHJpYXRlICJwYWNrYWdlIGlmbmVlZGVkIiBzdGF0ZW1lbnQgZm9yIHRoZSBwYWNrYWdlLg0NcHJvYyA6OnBrZzo6Y3JlYXRlIHthcmdzfSB7DSAgICBhcHBlbmQgZXJyKHVzYWdlKSAiW2xpbmRleCBbaW5mbyBsZXZlbCAwXSAwXSAiDSAgICBhcHBlbmQgZXJyKHVzYWdlKSAiLW5hbWUgcGFja2FnZU5hbWUgLXZlcnNpb24gcGFja2FnZVZlcnNpb24iDSAgICBhcHBlbmQgZXJyKHVzYWdlKSAiPy1sb2FkIHtmaWxlbmFtZSA/e3Byb2NzfT99PyAuLi4gIg0gICAgYXBwZW5kIGVycih1c2FnZSkgIj8tc291cmNlIHtmaWxlbmFtZSA/e3Byb2NzfT99PyAuLi4iDQ0gICAgc2V0IGVycih3cm9uZ051bUFyZ3MpICJ3cm9uZyAjIGFyZ3M6IHNob3VsZCBiZSBcIiRlcnIodXNhZ2UpXCIiDSAgICBzZXQgZXJyKHZhbHVlTWlzc2luZykgInZhbHVlIGZvciBcIiVzXCIgbWlzc2luZzogc2hvdWxkIGJlIFwiJGVycih1c2FnZSlcIiINICAgIHNldCBlcnIodW5rbm93bk9wdCkgICAidW5rbm93biBvcHRpb24gXCIlc1wiOiBzaG91bGQgYmUgXCIkZXJyKHVzYWdlKVwiIg0gICAgc2V0IGVycihub0xvYWRPclNvdXJjZSkgImF0IGxlYXN0IG9uZSBvZiAtbG9hZCBhbmQgLXNvdXJjZSBtdXN0IGJlIGdpdmVuIg0NICAgICMgcHJvY2VzcyBhcmd1bWVudHMNICAgIHNldCBsZW4gW2xsZW5ndGggJGFyZ3NdDSAgICBpZiB7ICRsZW4gPCA2IH0gew0JZXJyb3IgJGVycih3cm9uZ051bUFyZ3MpDSAgICB9DSAgICANICAgICMgSW5pdGlhbGl6ZSBwYXJhbWV0ZXJzDSAgICBzZXQgb3B0cygtbmFtZSkJCXt9DSAgICBzZXQgb3B0cygtdmVyc2lvbikJCXt9DSAgICBzZXQgb3B0cygtc291cmNlKQkJe30NICAgIHNldCBvcHRzKC1sb2FkKQkJe30NDSAgICAjIHByb2Nlc3MgcGFyYW1ldGVycw0gICAgZm9yIHtzZXQgaSAwfSB7JGkgPCAkbGVufSB7aW5jciBpfSB7DQlzZXQgZmxhZyBbbGluZGV4ICRhcmdzICRpXQ0JaW5jciBpDQlzd2l0Y2ggLWdsb2IgLS0gJGZsYWcgew0JICAgICItbmFtZSIJCS0NCSAgICAiLXZlcnNpb24iCQl7DQkJaWYgeyAkaSA+PSAkbGVuIH0gew0JCSAgICBlcnJvciBbZm9ybWF0ICRlcnIodmFsdWVNaXNzaW5nKSAkZmxhZ10NCQl9DQkJc2V0IG9wdHMoJGZsYWcpIFtsaW5kZXggJGFyZ3MgJGldDQkgICAgfQ0JICAgICItc291cmNlIgkJLQ0JICAgICItbG9hZCIJCXsNCQlpZiB7ICRpID49ICRsZW4gfSB7DQkJICAgIGVycm9yIFtmb3JtYXQgJGVycih2YWx1ZU1pc3NpbmcpICRmbGFnXQ0JCX0NCQlsYXBwZW5kIG9wdHMoJGZsYWcpIFtsaW5kZXggJGFyZ3MgJGldDQkgICAgfQ0JICAgIGRlZmF1bHQgew0JCWVycm9yIFtmb3JtYXQgJGVycih1bmtub3duT3B0KSBbbGluZGV4ICRhcmdzICRpXV0NCSAgICB9DQl9DSAgICB9DQ0gICAgIyBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVycw0gICAgaWYgeyBbbGxlbmd0aCAkb3B0cygtbmFtZSldID09IDAgfSB7DQllcnJvciBbZm9ybWF0ICRlcnIodmFsdWVNaXNzaW5nKSAiLW5hbWUiXQ0gICAgfQ0gICAgaWYgeyBbbGxlbmd0aCAkb3B0cygtdmVyc2lvbildID09IDAgfSB7DQllcnJvciBbZm9ybWF0ICRlcnIodmFsdWVNaXNzaW5nKSAiLXZlcnNpb24iXQ0gICAgfQ0gICAgDSAgICBpZiB7IFtsbGVuZ3RoICRvcHRzKC1zb3VyY2UpXSA9PSAwICYmIFtsbGVuZ3RoICRvcHRzKC1sb2FkKV0gPT0gMCB9IHsNCWVycm9yICRlcnIobm9Mb2FkT3JTb3VyY2UpDSAgICB9DQ0gICAgIyBPSywgbm93IGV2ZXJ5dGhpbmcgaXMgZ29vZC4gIEdlbmVyYXRlIHRoZSBwYWNrYWdlIGlmbmVlZGVkIHN0YXRtZW50Lg0gICAgc2V0IGNtZGxpbmUgInBhY2thZ2UgaWZuZWVkZWQgJG9wdHMoLW5hbWUpICRvcHRzKC12ZXJzaW9uKSAiDSAgICANICAgIHNldCBjbWRMaXN0IHt9DSAgICBzZXQgbGF6eUZpbGVMaXN0IHt9DQ0gICAgIyBIYW5kbGUgLWxvYWQgYW5kIC1zb3VyY2Ugc3BlY3MNICAgIGZvcmVhY2gga2V5IHtsb2FkIHNvdXJjZX0gew0JZm9yZWFjaCBmaWxlc3BlYyAkb3B0cygtJGtleSkgew0JICAgIGZvcmVhY2gge2ZpbGVuYW1lIHByb2NsaXN0fSB7e30ge319IHsNCQlicmVhaw0JICAgIH0NCSAgICBmb3JlYWNoIHtmaWxlbmFtZSBwcm9jbGlzdH0gJGZpbGVzcGVjIHsNCQlicmVhaw0JICAgIH0NCSAgICANCSAgICBpZiB7IFtsbGVuZ3RoICRwcm9jbGlzdF0gPT0gMCB9IHsNCQlzZXQgY21kICJcW2xpc3QgJGtleSBcW2ZpbGUgam9pbiBcJGRpciBbbGlzdCAkZmlsZW5hbWVdXF1cXSINCQlsYXBwZW5kIGNtZExpc3QgJGNtZA0JICAgIH0gZWxzZSB7DQkJbGFwcGVuZCBsYXp5RmlsZUxpc3QgW2xpc3QgJGZpbGVuYW1lICRrZXkgJHByb2NsaXN0XQ0JICAgIH0NCX0NICAgIH0NDSAgICBpZiB7IFtsbGVuZ3RoICRsYXp5RmlsZUxpc3RdID4gMCB9IHsNCWxhcHBlbmQgY21kTGlzdCAiXFtsaXN0IHRjbFBrZ1NldHVwIFwkZGlyICRvcHRzKC1uYW1lKVwNCQkkb3B0cygtdmVyc2lvbikgW2xpc3QgJGxhenlGaWxlTGlzdF1cXSINICAgIH0NICAgIGFwcGVuZCBjbWRsaW5lIFtqb2luICRjbWRMaXN0ICJcXG4iXQ0gICAgcmV0dXJuICRjbWRsaW5lDX0NDQAAA3IjIHBhcnJheToNIyBQcmludCB0aGUgY29udGVudHMgb2YgYSBnbG9iYWwgYXJyYXkgb24gc3Rkb3V0Lg0jDSMgUkNTOiBAKCMpICRJZDogcGFycmF5LnRjbCx2IDEuMyAxOTk4LzA5LzE0IDE4OjQwOjAzIHN0YW50b24gRXhwICQNIw0jIENvcHlyaWdodCAoYykgMTk5MS0xOTkzIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuDSMgQ29weXJpZ2h0IChjKSAxOTk0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4NIw0jIFNlZSB0aGUgZmlsZSAibGljZW5zZS50ZXJtcyIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbg0jIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuDSMNDXByb2MgcGFycmF5IHthIHtwYXR0ZXJuICp9fSB7DSAgICB1cHZhciAxICRhIGFycmF5DSAgICBpZiB7IVthcnJheSBleGlzdHMgYXJyYXldfSB7DQllcnJvciAiXCIkYVwiIGlzbid0IGFuIGFycmF5Ig0gICAgfQ0gICAgc2V0IG1heGwgMA0gICAgZm9yZWFjaCBuYW1lIFtsc29ydCBbYXJyYXkgbmFtZXMgYXJyYXkgJHBhdHRlcm5dXSB7DQlpZiB7W3N0cmluZyBsZW5ndGggJG5hbWVdID4gJG1heGx9IHsNCSAgICBzZXQgbWF4bCBbc3RyaW5nIGxlbmd0aCAkbmFtZV0NCX0NICAgIH0NICAgIHNldCBtYXhsIFtleHByIHskbWF4bCArIFtzdHJpbmcgbGVuZ3RoICRhXSArIDJ9XQ0gICAgZm9yZWFjaCBuYW1lIFtsc29ydCBbYXJyYXkgbmFtZXMgYXJyYXkgJHBhdHRlcm5dXSB7DQlzZXQgbmFtZVN0cmluZyBbZm9ybWF0ICVzKCVzKSAkYSAkbmFtZV0NCXB1dHMgc3Rkb3V0IFtmb3JtYXQgIiUtKnMgPSAlcyIgJG1heGwgJG5hbWVTdHJpbmcgJGFycmF5KCRuYW1lKV0NICAgIH0NfQ0AABELIyB3b3JkLnRjbCAtLQ0jDSMgVGhpcyBmaWxlIGRlZmluZXMgdmFyaW91cyBwcm9jZWR1cmVzIGZvciBjb21wdXRpbmcgd29yZCBib3VuZGFyaWVzDSMgaW4gc3RyaW5ncy4gIFRoaXMgZmlsZSBpcyBwcmltYXJpbHkgbmVlZGVkIHNvIFRrIHRleHQgYW5kIGVudHJ5DSMgd2lkZ2V0cyBiZWhhdmUgcHJvcGVybHkgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybXMuDSMNIyBDb3B5cmlnaHQgKGMpIDE5OTYgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLg0jIENvcHlyaWdodCAoYykgMTk5OCBieSBTY3JpdHBpY3MgQ29ycG9yYXRpb24uDSMNIyBTZWUgdGhlIGZpbGUgImxpY2Vuc2UudGVybXMiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24NIyBvZiB0aGlzIGZpbGUsIGFuZCBmb3IgYSBESVNDTEFJTUVSIE9GIEFMTCBXQVJSQU5USUVTLg0jIA0jIFJDUzogQCgjKSAkSWQ6IHdvcmQudGNsLHYgMS42IDIwMDAvMDEvMjEgMDI6MjU6MzggaG9iYnMgRXhwICQNDSMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIGNoYXJhY3RlcnMgYXJlDSMgaW50ZXJwcmV0ZWQgYXMgd2hpdGUgc3BhY2UuICANDWlmIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJ3aW5kb3dzIl19IHsNICAgICMgV2luZG93cyBzdHlsZSAtIGFueSBidXQgYSB1bmljb2RlIHNwYWNlIGNoYXINICAgIHNldCB0Y2xfd29yZGNoYXJzICJcXFMiDSAgICBzZXQgdGNsX25vbndvcmRjaGFycyAiXFxzIg19IGVsc2Ugew0gICAgIyBNb3RpZiBzdHlsZSAtIGFueSB1bmljb2RlIHdvcmQgY2hhciAobnVtYmVyLCBsZXR0ZXIsIG9yIHVuZGVyc2NvcmUpDSAgICBzZXQgdGNsX3dvcmRjaGFycyAiXFx3Ig0gICAgc2V0IHRjbF9ub253b3JkY2hhcnMgIlxcVyINfQ0NIyB0Y2xfd29yZEJyZWFrQWZ0ZXIgLS0NIw0jIFRoaXMgcHJvY2VkdXJlIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCB3b3JkIGJvdW5kYXJ5DSMgYWZ0ZXIgdGhlIHN0YXJ0aW5nIHBvaW50IGluIHRoZSBnaXZlbiBzdHJpbmcsIG9yIC0xIGlmIHRoZXJlDSMgYXJlIG5vIG1vcmUgYm91bmRhcmllcyBpbiB0aGUgZ2l2ZW4gc3RyaW5nLiAgVGhlIGluZGV4IHJldHVybmVkIHJlZmVycw0jIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHBhaXIgdGhhdCBjb21wcmlzZXMgYSBib3VuZGFyeS4NIw0jIEFyZ3VtZW50czoNIyBzdHIgLQkJU3RyaW5nIHRvIHNlYXJjaC4NIyBzdGFydCAtCUluZGV4IGludG8gc3RyaW5nIHNwZWNpZnlpbmcgc3RhcnRpbmcgcG9pbnQuDQ1wcm9jIHRjbF93b3JkQnJlYWtBZnRlciB7c3RyIHN0YXJ0fSB7DSAgICBnbG9iYWwgdGNsX25vbndvcmRjaGFycyB0Y2xfd29yZGNoYXJzDSAgICBzZXQgc3RyIFtzdHJpbmcgcmFuZ2UgJHN0ciAkc3RhcnQgZW5kXQ0gICAgaWYge1tyZWdleHAgLWluZGljZXMgIiR0Y2xfd29yZGNoYXJzJHRjbF9ub253b3JkY2hhcnN8JHRjbF9ub253b3JkY2hhcnMkdGNsX3dvcmRjaGFycyIgJHN0ciByZXN1bHRdfSB7DQlyZXR1cm4gW2V4cHIge1tsaW5kZXggJHJlc3VsdCAxXSArICRzdGFydH1dDSAgICB9DSAgICByZXR1cm4gLTENfQ0NIyB0Y2xfd29yZEJyZWFrQmVmb3JlIC0tDSMNIyBUaGlzIHByb2NlZHVyZSByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgd29yZCBib3VuZGFyeQ0jIGJlZm9yZSB0aGUgc3RhcnRpbmcgcG9pbnQgaW4gdGhlIGdpdmVuIHN0cmluZywgb3IgLTEgaWYgdGhlcmUNIyBhcmUgbm8gbW9yZSBib3VuZGFyaWVzIGluIHRoZSBnaXZlbiBzdHJpbmcuICBUaGUgaW5kZXggcmV0dXJuZWQNIyByZWZlcnMgdG8gdGhlIHNlY29uZCBjaGFyYWN0ZXIgb2YgdGhlIHBhaXIgdGhhdCBjb21wcmlzZXMgYSBib3VuZGFyeS4NIw0jIEFyZ3VtZW50czoNIyBzdHIgLQkJU3RyaW5nIHRvIHNlYXJjaC4NIyBzdGFydCAtCUluZGV4IGludG8gc3RyaW5nIHNwZWNpZnlpbmcgc3RhcnRpbmcgcG9pbnQuDQ1wcm9jIHRjbF93b3JkQnJlYWtCZWZvcmUge3N0ciBzdGFydH0gew0gICAgZ2xvYmFsIHRjbF9ub253b3JkY2hhcnMgdGNsX3dvcmRjaGFycw0gICAgaWYge1tzdHJpbmcgZXF1YWwgJHN0YXJ0IGVuZF19IHsNCXNldCBzdGFydCBbc3RyaW5nIGxlbmd0aCAkc3RyXQ0gICAgfQ0gICAgaWYge1tyZWdleHAgLWluZGljZXMgIl4uKigkdGNsX3dvcmRjaGFycyR0Y2xfbm9ud29yZGNoYXJzfCR0Y2xfbm9ud29yZGNoYXJzJHRjbF93b3JkY2hhcnMpIiBbc3RyaW5nIHJhbmdlICRzdHIgMCAkc3RhcnRdIHJlc3VsdF19IHsNCXJldHVybiBbbGluZGV4ICRyZXN1bHQgMV0NICAgIH0NICAgIHJldHVybiAtMQ19DQ0jIHRjbF9lbmRPZldvcmQgLS0NIw0jIFRoaXMgcHJvY2VkdXJlIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbmQtb2Ytd29yZCBsb2NhdGlvbg0jIGFmdGVyIGEgc3RhcnRpbmcgaW5kZXggaW4gdGhlIGdpdmVuIHN0cmluZy4gIEFuIGVuZC1vZi13b3JkIGxvY2F0aW9uDSMgaXMgZGVmaW5lZCB0byBiZSB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSBmaXJzdA0jIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBhZnRlciB0aGUgc3RhcnRpbmcgcG9pbnQuICBSZXR1cm5zIC0xIGlmDSMgdGhlcmUgYXJlIG5vIG1vcmUgd29yZHMgYWZ0ZXIgdGhlIHN0YXJ0aW5nIHBvaW50Lg0jDSMgQXJndW1lbnRzOg0jIHN0ciAtCQlTdHJpbmcgdG8gc2VhcmNoLg0jIHN0YXJ0IC0JSW5kZXggaW50byBzdHJpbmcgc3BlY2lmeWluZyBzdGFydGluZyBwb2ludC4NDXByb2MgdGNsX2VuZE9mV29yZCB7c3RyIHN0YXJ0fSB7DSAgICBnbG9iYWwgdGNsX25vbndvcmRjaGFycyB0Y2xfd29yZGNoYXJzDSAgICBpZiB7W3JlZ2V4cCAtaW5kaWNlcyAiJHRjbF9ub253b3JkY2hhcnMqJHRjbF93b3JkY2hhcnMrJHRjbF9ub253b3JkY2hhcnMiIFwNCSAgICBbc3RyaW5nIHJhbmdlICRzdHIgJHN0YXJ0IGVuZF0gcmVzdWx0XX0gew0JcmV0dXJuIFtleHByIHtbbGluZGV4ICRyZXN1bHQgMV0gKyAkc3RhcnR9XQ0gICAgfQ0gICAgcmV0dXJuIC0xDX0NDSMgdGNsX3N0YXJ0T2ZOZXh0V29yZCAtLQ0jDSMgVGhpcyBwcm9jZWR1cmUgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHN0YXJ0LW9mLXdvcmQgbG9jYXRpb24NIyBhZnRlciBhIHN0YXJ0aW5nIGluZGV4IGluIHRoZSBnaXZlbiBzdHJpbmcuICBBIHN0YXJ0LW9mLXdvcmQNIyBsb2NhdGlvbiBpcyBkZWZpbmVkIHRvIGJlIGEgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGZvbGxvd2luZyBhDSMgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuICBSZXR1cm5zIC0xIGlmIHRoZXJlIGFyZSBubyBtb3JlIHN0YXJ0LW9mLXdvcmQNIyBsb2NhdGlvbnMgYWZ0ZXIgdGhlIHN0YXJ0aW5nIHBvaW50Lg0jDSMgQXJndW1lbnRzOg0jIHN0ciAtCQlTdHJpbmcgdG8gc2VhcmNoLg0jIHN0YXJ0IC0JSW5kZXggaW50byBzdHJpbmcgc3BlY2lmeWluZyBzdGFydGluZyBwb2ludC4NDXByb2MgdGNsX3N0YXJ0T2ZOZXh0V29yZCB7c3RyIHN0YXJ0fSB7DSAgICBnbG9iYWwgdGNsX25vbndvcmRjaGFycyB0Y2xfd29yZGNoYXJzDSAgICBpZiB7W3JlZ2V4cCAtaW5kaWNlcyAiJHRjbF93b3JkY2hhcnMqJHRjbF9ub253b3JkY2hhcnMrJHRjbF93b3JkY2hhcnMiIFwNCSAgICBbc3RyaW5nIHJhbmdlICRzdHIgJHN0YXJ0IGVuZF0gcmVzdWx0XX0gew0JcmV0dXJuIFtleHByIHtbbGluZGV4ICRyZXN1bHQgMV0gKyAkc3RhcnR9XQ0gICAgfQ0gICAgcmV0dXJuIC0xDX0NDSMgdGNsX3N0YXJ0T2ZQcmV2aW91c1dvcmQgLS0NIw0jIFRoaXMgcHJvY2VkdXJlIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzdGFydC1vZi13b3JkIGxvY2F0aW9uDSMgYmVmb3JlIGEgc3RhcnRpbmcgaW5kZXggaW4gdGhlIGdpdmVuIHN0cmluZy4NIw0jIEFyZ3VtZW50czoNIyBzdHIgLQkJU3RyaW5nIHRvIHNlYXJjaC4NIyBzdGFydCAtCUluZGV4IGludG8gc3RyaW5nIHNwZWNpZnlpbmcgc3RhcnRpbmcgcG9pbnQuDQ1wcm9jIHRjbF9zdGFydE9mUHJldmlvdXNXb3JkIHtzdHIgc3RhcnR9IHsNICAgIGdsb2JhbCB0Y2xfbm9ud29yZGNoYXJzIHRjbF93b3JkY2hhcnMNICAgIGlmIHtbc3RyaW5nIGVxdWFsICRzdGFydCBlbmRdfSB7DQlzZXQgc3RhcnQgW3N0cmluZyBsZW5ndGggJHN0cl0NICAgIH0NICAgIGlmIHtbcmVnZXhwIC1pbmRpY2VzIFwNCSAgICAiJHRjbF9ub253b3JkY2hhcnMqKCR0Y2xfd29yZGNoYXJzKykkdGNsX25vbndvcmRjaGFycypcJCIgXA0JICAgIFtzdHJpbmcgcmFuZ2UgJHN0ciAwIFtleHByIHskc3RhcnQgLSAxfV1dIHJlc3VsdCB3b3JkXX0gew0JcmV0dXJuIFtsaW5kZXggJHdvcmQgMF0NICAgIH0NICAgIHJldHVybiAtMQ19DQAAARnZqXPtP+UyMAAEAAAAAQAAAAC4YS03uGErkgAAAAAAAAAAAAAAAAAAAAAKamFja2phbnNlbgAAAA10a3B5dGhvbi5yc3JjAAAAAM1BZGRlZCB0aGUgbW9kdWxlcyBJIG1pc3NlZCBmaXJzdCB0aW1lIGFyb3VuZC4gU3RpbGwgbm90IGdvb2QgZW5vdWdoLCB0aG91Z2g6IGJnZXJyb3IgZG9lcyBhICJwYWNrYWdlIHJlcXVpcmUgbXNnY2F0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AAv/AGcAABBjAAAAAAwDAGwgABG5AAAAAA9GaWxlIFR5cGVzIG1lbnUEaGFuZARmaXN0BGJvYXQFY2xvY2sKY29mZmVlX211Zwdnb2JibGVyBWd1bWJ5BWhlYXJ0BW1vdXNlBnBlbmNpbAdzaHV0dGxlCHNwcmF5Y2FuBHN0YXIEdHJlawV3YXRjaARoYW5kBmJ1Y2tldAZjYW5jZWwGUmVzaXplB2V5ZWRyb3AMZXllZHJvcC1mdWxsB3pvb20taW4Iem9vbS1vdXQIWF9jdXJzb3IFYXJyb3cQYmFzZWRfYXJyb3dfZG93bg5iYXNlZF9hcnJvd191cARib2F0CGJvZ29zaXR5EmJvdHRvbV9sZWZ0X2Nvcm5lchNib3R0b21fcmlnaHRfY29ybmVyC2JvdHRvbV9zaWRlCmJvdHRvbV90ZWUKYm94X3NwaXJhbApjZW50ZXJfcHRyBmNpcmNsZQVjbG9jawpjb2ZmZWVfbXVnBWNyb3NzDWNyb3NzX3JldmVyc2UJY3Jvc3NoYWlyDWRpYW1vbmRfY3Jvc3MDZG90BmRvdGJveAxkb3VibGVfYXJyb3cLZHJhZnRfbGFyZ2ULZHJhZnRfc21hbGwKZHJhcGVkX2JveAhleGNoYW5nZQVmbGV1cgdnb2JibGVyBWd1bWJ5BWhhbmQxBWhhbmQyBWhlYXJ0BGljb24KaXJvbl9jcm9zcwhsZWZ0X3B0cglsZWZ0X3NpZGUIbGVmdF90ZWUKbGVmdGJ1dHRvbghsbF9hbmdsZQhscl9hbmdsZQNtYW4MbWlkZGxlYnV0dG9uBW1vdXNlBnBlbmNpbAZwaXJhdGUEcGx1cw5xdWVzdGlvbl9hcnJvdwlyaWdodF9wdHIKcmlnaHRfc2lkZQlyaWdodF90ZWULcmlnaHRidXR0b24IcnRsX2xvZ28Ic2FpbGJvYXQNc2JfZG93bl9hcnJvdxFzYl9oX2RvdWJsZV9hcnJvdw1zYl9sZWZ0X2Fycm93DnNiX3JpZ2h0X2Fycm93C3NiX3VwX2Fycm93EXNiX3ZfZG91YmxlX2Fycm93B3NodXR0bGUGc2l6aW5nBnNwaWRlcghzcHJheWNhbgRzdGFyBnRhcmdldAZ0Y3Jvc3MOdG9wX2xlZnRfYXJyb3cPdG9wX2xlZnRfY29ybmVyEHRvcF9yaWdodF9jb3JuZXIIdG9wX3NpZGUHdG9wX3RlZQR0cmVrCHVsX2FuZ2xlCHVtYnJlbGxhCHVyX2FuZ2xlBXdhdGNoBXh0ZXJtCUFib3V0IEJveA1GaWxlIE9wZW4gQm94EURlZmF1bHQgQWJvdXQgQm94AnRrBmJ1dHRvbgZkaWFsb2cFZW50cnkFZm9jdXMHbGlzdGJveARtZW51B29wdE1lbnUHcGFsZXR0ZQVzY2FsZQdzY3JsYmFyB3RlYXJvZmYEdGV4dAdiZ2Vycm9yB2NvbnNvbGUGbXNnYm94BmNvbWRsZwRBdXRvB0hpc3RvcnkESW5pdAdQYWNrYWdlBlBhcnJheQRXb3JkDlByb2plY3RvciBEYXRhcnNyY1JTRUQBAAB1ALkAAAAAAAAAAAAAAAAAAAAAAAA=