Fred
0.2.1
OTRS GmbH
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Improved the package settings.
First modular version.
Remove modperl reload informations from the fred log.
Added Database::SlowLog feature.
Improved the config description.
No longer crashes if HTML::Lint is not installed but HTML-checker is active.
Improved output.
First version especially for testing and as proof of concept.
A tool to support the developer by his development.
Ein Entwicklertool welches dem Entwickler zur Laufzeit bei der Entwicklung unterstützen soll.
2.2.x
2.3.x
2007-09-21 10:36:06
opms.otrs.com
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9PdXRwdXRGaWx0ZXJGcmVkLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE91dHB1dEZpbHRlckZyZWQucG0sdiAxLjYgMjAwNy8wOS8yMSAwNzo0ODo0OCB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS42ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQKCj1oZWFkMSBTWU5PUFNJUwoKYSBvdXRwdXQgZmlsdGVyIG1vZHVsZSBzcGVjaWFsbHkgZm9yIGRldmVsb3BlcgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhNYWluT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgKSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICRTZWxmLT57RnJlZE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RnJlZC0+bmV3KCAleyRTZWxmfSApOwoKICAgIGlmICggJFBhcmFte0xheW91dE9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9ID0gJFBhcmFte0xheW91dE9iamVjdH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBpbnNlcnQgTGF5b3V0T2JqZWN0IGVudHJ5IGluIEZpbHRlckNvbnRlbnQgZnVuY3Rpb24gb2YgdGhlIExheW91dC5wbQogICAgICAgICMgdGhpcyBoYXBwZW5zIG9ubHkgaW4gT1RSUyAyLjIKICAgICAgICAkU2VsZi0+e0ZyZWRPYmplY3R9LT5JbnNlcnRMYXlvdXRPYmplY3QoKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRPdXRwdXRDb25zb2xlOwoKICAgICMgaXMgYSBjaGVjayBiZWNhdXNlIE9UUlMyLjIgZG9uJ3QgZGVsaXZlciBoZXJlIGEgTGF5b3V0T2JqZWN0CiAgICBpZiAoICEkU2VsZi0+e0xheW91dE9iamVjdH0gKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBkbyBub3RoaW5nIGlmIGl0IGlzIGEgcmVkaXJlY3QKICAgIGlmICggICAkeyAkUGFyYW17RGF0YX0gfSA9fiAvXlN0YXR1czogMzAyIE1vdmVkL21pCiAgICAgICAgJiYgJHsgJFBhcmFte0RhdGF9IH0gPX4gL15sb2NhdGlvbjovbWkKICAgICAgICAmJiBsZW5ndGgoICR7ICRQYXJhbXtEYXRhfSB9ICkgPCA4MDAgKQogICAgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZ2V0IGFsbCBhY3RpdmF0ZWQgbW9kdWxlcwogICAgbXkgJE1vZHVsZUZvclJlZiAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZyZWQ6Ok1vZHVsZScpOwogICAgbXkgJE1vZHVsZXNEYXRhUmVmID0ge307CiAgICBmb3IgbXkgJE1vZHVsZSAoIGtleXMgJXskTW9kdWxlRm9yUmVmfSApIHsKICAgICAgICBpZiAoICRNb2R1bGVGb3JSZWYtPnskTW9kdWxlfS0+e0FjdGl2ZX0gKSB7CiAgICAgICAgICAgICRNb2R1bGVzRGF0YVJlZi0+eyRNb2R1bGV9ID0ge307CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIHRoZSBjb25zb2xlIHRhYmxlCiAgICBteSAkQ29uc29sZSA9ICdBY3RpdmF0ZWQgbW9kdWxlczogJzsKICAgIGZvciBteSAkTW9kdWxlICgga2V5cyAleyRNb2R1bGVzRGF0YVJlZn0gKSB7CiAgICAgICAgJENvbnNvbGUgLj0gJE1vZHVsZSAuICIgLSAiOwogICAgfQogICAgJENvbnNvbGUgPX4gcy8gLSAkLy87CiAgICBpZiAoICR7ICRQYXJhbXtEYXRhfSB9ICF+IC9GcmVkLVNldHRpbmcvICkgewogICAgICAgIGlmICggJHsgJFBhcmFte0RhdGF9IH0gIX4gL25hbWU9IkFjdGlvbiIgdmFsdWU9IkxvZ2luIi8gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTZXR0aW5nJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRPdXRwdXRDb25zb2xlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkQ29uc29sZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBUZXh0ICAgID0+ICRDb25zb2xlLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBsb2FkIHRoZSBhY3RpdmF0ZWQgbW9kdWxlcwogICAgJFNlbGYtPntGcmVkT2JqZWN0fS0+RGF0YUdldCgKICAgICAgICBGcmVkTW9kdWxlc1JlZiA9PiAkTW9kdWxlc0RhdGFSZWYsCiAgICAgICAgSFRNTERhdGFSZWYgICAgPT4gJFBhcmFte0RhdGF9LAogICAgKTsKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3JlYXRlRnJlZE91dHB1dCggRnJlZE1vZHVsZXNSZWYgPT4gJE1vZHVsZXNEYXRhUmVmICk7CgogICAgIyBidWlsZCB0aGUgY29udGVudCBzdHJpbmcKICAgIG15ICRPdXRwdXQgPSAnJzsKICAgIGZvciBteSAkTW9kdWxlICggJXskTW9kdWxlc0RhdGFSZWZ9ICkgewogICAgICAgIGlmICggJE1vZHVsZXNEYXRhUmVmLT57JE1vZHVsZX0tPntPdXRwdXR9ICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRNb2R1bGVzRGF0YVJlZi0+eyRNb2R1bGV9LT57T3V0cHV0fTsKICAgICAgICB9CiAgICB9CgogICAgIyBpbmNsdWRlIHRoZSBmcmVkIG91dHB1dCBpbiB0aGUgb3JpZ2luYWwgb3V0cHV0CiAgICBpZiAoICR7ICRQYXJhbXtEYXRhfSB9ID1+IHMvKFw8Ym9keSh8Lis/KVw+KS8kMVxuJE91dHB1dENvbnNvbGUkT3V0cHV0XG5cblxuXG4vbXggKSB7CgogICAgICAgICMgPwogICAgfQogICAgZWxzaWYgKCAkeyAkUGFyYW17RGF0YX0gfSA9fiBzL14oLikvXG4kT3V0cHV0XG5cblxuXG4kMS9teCApIHsKCiAgICAgICAgIyA/CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS42ICQgJERhdGU6IDIwMDcvMDkvMjEgMDc6NDg6NDggJAoKPWN1dA==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkSFRNTENoZWNrLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWRIVE1MQ2hlY2sucG0sdiAxLjEgMjAwNy8wOS8yMSAwNzo0NjowOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRIVE1MQ2hlY2s7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZEhUTUxDaGVjayAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBIVE1MIGNoZWNrIG9iamVjdAoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTVERFUlJMb2ctPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDcmVhdGVGcmVkT3V0cHV0KCkKCmNyZWF0ZSB0aGUgb3V0cHV0IG9mIHRoZSBTVERFUlIgbG9nCgogICAgJExheW91dE9iamVjdC0+Q3JlYXRlRnJlZE91dHB1dCgKICAgICAgICBNb2R1bGVzUmVmID0+ICRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDcmVhdGVGcmVkT3V0cHV0IHsKICAgIG15ICRTZWxmICAgICAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSAgICAgPSBAXzsKICAgIG15ICRIVE1MTGluZXMgPSAnJzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZVJlZn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIE1vZHVsZVJlZiEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICgkeyRQYXJhbXtNb2R1bGVSZWZ9IH17RGF0YX0pIHsKICAgICAgICBmb3IgbXkgJExpbmUgKCByZXZlcnNlIEB7ICR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17RGF0YX0gfSApIHsKICAgICAgICAgICAgJExpbmUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoVGV4dCA9PiAkTGluZSk7CiAgICAgICAgICAgICRIVE1MTGluZXMgLj0gIiAgICAgICAgPHRyPjx0ZD4kTGluZTwvdGQ+PC90cj5cbiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoJEhUTUxMaW5lcykgewogICAgICAgICAgICAkeyAkUGFyYW17TW9kdWxlUmVmfSB9e091dHB1dH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkSFRNTENoZWNrJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7IEhUTUxMaW5lcyA9PiAkSFRNTExpbmVzLCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA3LzA5LzIxIDA3OjQ2OjA5ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkU1RERVJSTG9nLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWRTVERFUlJMb2cucG0sdiAxLjEgMjAwNy8wOS8yMSAwODowOTowOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTVERFUlJMb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFNUREVSUkxvZyAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBTVERFUlIgbG9nIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkU1RERVJSTG9nLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ3JlYXRlRnJlZE91dHB1dCgpCgpjcmVhdGUgdGhlIG91dHB1dCBvZiB0aGUgU1RERVJSIGxvZwoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgTW9kdWxlc1JlZiA9PiAkTW9kdWxlc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ3JlYXRlRnJlZE91dHB1dCB7CiAgICBteSAkU2VsZiAgICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICAgID0gQF87CiAgICBteSAkSFRNTExpbmVzID0gJyc7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtNb2R1bGVSZWZ9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBNb2R1bGVSZWYhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgbXkgJExpbmUgKCByZXZlcnNlIEB7ICR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17RGF0YX0gfSApIHsKICAgICAgICAkSFRNTExpbmVzIC49ICIgICAgICAgIDx0cj48dGQ+JExpbmU8L3RkPjwvdHI+IjsKICAgIH0KCiAgICBpZiAoJEhUTUxMaW5lcykgewogICAgICAgICR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17T3V0cHV0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZFNUREVSUkxvZycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7IEhUTUxMaW5lcyA9PiAkSFRNTExpbmVzLCB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDcvMDkvMjEgMDg6MDk6MDkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRGcmVkLnBtIC0gcHJvdmlkZXMgZ2VuZXJpYyBIVE1MIG91dHB1dCBmb3IgZnJlZAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBMYXlvdXRGcmVkLnBtLHYgMS4xIDIwMDcvMDkvMjEgMDc6NDg6MjkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXRGcmVkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aXRlbSBDcmVhdGVGcmVkT3V0cHV0KCkKCmNyZWF0ZSB0aGUgb3V0cHV0IG9mIHRoZSBzZXZlcmFsIGZyZWQgbW9kdWxlcwoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgRnJlZE1vZHVsZXNSZWYgPT4gJEZyZWRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDcmVhdGVGcmVkT3V0cHV0IHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtGcmVkTW9kdWxlc1JlZn0gfHwgcmVmKCAkUGFyYW17RnJlZE1vZHVsZXNSZWZ9ICkgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBGcmVkTW9kdWxlc1JlZiEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciBteSAkTW9kdWxlTmFtZSAoIGtleXMgJXsgJFBhcmFte0ZyZWRNb2R1bGVzUmVmfSB9ICkgewoKICAgICAgICAjIGxvYWQgYmFja2VuZAogICAgICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkTGF5b3V0QmFja2VuZCggTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSApOwoKICAgICAgICAjIGdldCBtb2R1bGUgZGF0YQogICAgICAgIGlmICgkQmFja2VuZE9iamVjdCkgewogICAgICAgICAgICAkQmFja2VuZE9iamVjdC0+Q3JlYXRlRnJlZE91dHB1dCggTW9kdWxlUmVmID0+ICRQYXJhbXtGcmVkTW9kdWxlc1JlZn0tPnskTW9kdWxlTmFtZX0gKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Mb2FkTGF5b3V0QmFja2VuZCgpCgpsb2FkIGEgc3BlY2lhbCBmcmVkIGxheW91dCBiYWNrZW5kcwoKICAgICRCYWNrZW5kT2JqZWN0ID0gJExheW91dE9iamVjdC0+X0xvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIF9Mb2FkTGF5b3V0QmFja2VuZCB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJEJhY2tlbmRPYmplY3Q7CgogICAgIyBtb2R1bGUgcmVmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlTmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgTW9kdWxlTmFtZSEiICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgdXNlIHRoZSBjYWNoaW5nIG1lY2hhbmlzbSBsYXRlciBpZiByZXF1aXJlZAoKICAgICMgY2hlY2sgaWYgb2JqZWN0IGlzIGNhY2hlZAogICAgI2lmICggJFNlbGYtPnsgJ0NhY2hlOjpfTG9hZFhNTFR5cGVCYWNrZW5kOjonIC4gJFBhcmFte1R5cGV9IH0gKSB7CiAgICAjICAgIHJldHVybiAkU2VsZi0+eyAnQ2FjaGU6Ol9Mb2FkWE1MVHlwZUJhY2tlbmQ6OicgLiAkUGFyYW17VHlwZX0gfTsKICAgICN9CgogICAgIyBjcmVhdGUgbmV3IGluc3RhbmNlCiAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZCRQYXJhbXtNb2R1bGVOYW1lfSI7CiAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fSA9ICRTZWxmOwogICAgICAgICRCYWNrZW5kT2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldyggJXskU2VsZn0sICVQYXJhbSwgKTsKICAgIH0KCiAgICAjIGNhY2hlIG9iamVjdAogICAgI2lmICgkQmFja2VuZE9iamVjdCkgewogICAgIyAgICAkU2VsZi0+eyAnX0xvYWRYTUxUeXBlQmFja2VuZDo6JyAuICRQYXJhbXtUeXBlfSB9ID0gJEJhY2tlbmRPYmplY3Q7CiAgICAjfQoKICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA3LzA5LzIxIDA3OjQ4OjI5ICQKCj1jdXQK
IyAtLQojIERldmVsRnJlZENvbnNvbGUuZHRsIC0gYSBodG1sIGNvbnNvbGUgZm9yIGEgYmV0dGVyIGZyZWQgaGFuZGxpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkQ29uc29sZS5kdGwsdiAxLjEgMjAwNy8wOS8yMSAwNzo0OToyNiB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KPHRhYmxlIGJnY29sb3I9IiMwMDAwMDAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgICAgICAgIDxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5GcmVkLUNvbnNvbGU8L2ZvbnQ+PC9iPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgJERhdGF7IlRleHQifQogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgo8IS0tIGR0bDpibG9jazpTZXR0aW5nIC0tPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPURldmVsRnJlZCZTdWJhY3Rpb249U2V0dGluZyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9J1NldHRpbmcnOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBvbkNsaWNrPSJ3aW5kb3cub3BlbignJywgJ3NldHRpbmcnLCAndG9vbGJhcj1ubyxsb2NhdGlvbj1ubyxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9NTAwLGhlaWdodD00NDAsbGVmdD01MDAsdG9wPTQ1MCcpOyIgdGFyZ2V0PSJzZXR0aW5nIj5zZXR0aW5nPC9hPgo8IS0tIGR0bDpibG9jazpTZXR0aW5nIC0tPgogICAgICAgICAgICAmbmJzcDsKICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KIyBqdXN0IGEgc21hbGwgc3BhY2UKPHRhYmxlIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj48dGQ+PC90ZD48L3RyPgo8L3RhYmxlPg==
IyAtLQojIERldmVsRnJlZEhUTUxDaGVjay5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIEhUTUwtQ2hlY2sgcmVzdWx0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBEZXZlbEZyZWRIVE1MQ2hlY2suZHRsLHYgMS4xIDIwMDcvMDkvMjEgMDc6NTE6MDYgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCjx0YWJsZSBiZ2NvbG9yPSIjMDAwMDAwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICA8dHI+CiAgICA8dGQgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgPHRhYmxlIGJnY29sb3I9IiNmZmZmZmYiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICAgICAgICA8Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+RnJlZC1IVE1MQ2hlY2s8L2ZvbnQ+PC9iPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgokRGF0YXsiSFRNTExpbmVzIn0KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K
IyAtLQojIERldmVsRnJlZFNldHRpbmcuZHRsIC0gYSBmcm9udGVuZCBmb3IgYSBmYXN0IGZyZWQgc2V0dGluZyBoYW5kbGluZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBEZXZlbEZyZWRTZXR0aW5nLmR0bCx2IDEuMSAyMDA3LzA5LzIxIDA3OjQ5OjI2IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iRGV2ZWxGcmVkU2V0dGluZyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iRGV2ZWxGcmVkIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTZXR0aW5nQWN0aW9uIj4KICAgICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICAgICAgICAgIDxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5GcmVkLVNldHRpbmc8L2ZvbnQ+PC9iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RnJlZE1vZHVsZSAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iRnJlZE1vZHVsZSIgdmFsdWU9IiRRRGF0YXsiRnJlZE1vZHVsZSJ9IiAkRGF0YXsiQ2hlY2tlZCJ9PgogICAgICAgICAgICAgICRRRGF0YXsiRnJlZE1vZHVsZSJ9CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpGcmVkTW9kdWxlIC0tPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlNhdmUifSIgY2xhc3M9ImJ1dHRvbiIgb25DbGljaz0id2luZG93LmNsb3NlKCkiPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L3RkPgogICAgPC9mb3JtPgogIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIERldmVsRnJlZFNUREVSUkxvZy5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIFNUREVSUiBsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkU1RERVJSTG9nLmR0bCx2IDEuMSAyMDA3LzA5LzIxIDA3OjQ5OjI2IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgIDx0YWJsZSBiZ2NvbG9yPSIjZmZmZmZmIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgICAgICAgPGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkZyZWQtU1RERVJSTG9nPC9mb250PjwvYj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KJERhdGF7IkhUTUxMaW5lcyJ9CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IEZyZWQueG1sLHYgMS43IDIwMDcvMDkvMjEgMDg6MzQ6NDggdHIgRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpPdXRwdXQ6OkZpbHRlckNvbnRlbnQjIyNGcmVkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U3Vic2NyaWJlIHRoZSBvdXRwdXQgZmlsdGVyIGF0IHRoZSBzeXN0ZW0uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1lbGRldCBkZW4gT3V0cHV0RmlsdGVyRnJlZCBhbSBTeXN0ZW0gYW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6T3V0cHV0RmlsdGVyRnJlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVidWciPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpNb2R1bGUjIyNIVE1MQ2hlY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UdXJuIG9uIGlmIHlvdSB3YW50IGFuIHJlYWx0aW1lIEhUTUwtY2hlY2tlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBha3RpdmllcmVuIHdlbm4genVyIExhdWZ6ZWl0IGVpbiBIVE1MLUNoZWNrZXIgYXVzZ2Vm/GhydCB3ZXJkZW4gc29sbC4gV0lDSFRJRzogRGFzIENwYW4tTW9kdWwgSFRNTDo6bGludCBpc3QgaGllcmb8ciBub3R3ZW5kaWcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6T3V0cHV0RmlsdGVyRnJlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aXZlIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6TW9kdWxlIyMjU1RERVJSTG9nIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VHVybiBvbiBpZiB5b3Ugd2FudCB0byBzZWUgdGhlIFNUREVSUkxvZy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBha3RpdmllcmVuIHdlbm4gbWFuIHp1ciBMYXVmemVpdCBkYXMgU1RERVJSTG9nIHNlaGVuIHdpbGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6T3V0cHV0RmlsdGVyRnJlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aXZlIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0RldmVsRnJlZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBkZXZlbCBmcmVkIG9iamVjdCBpbiB0aGUgYWRtaW4gYXJlYS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEVudHdpY2tsZXItT2JqZWt0cyBGcmVkIGltIEFkbWluLUJlcmVpY2guPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPCEtLSA8R3JvdXA+YWRtaW48L0dyb3VwPiAtLT4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZG1pbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+RnJlZC1EZXZlbG9wZXJ0b29sczwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5BZG1pbjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJNb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE1vZHVsZT5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6TmF2QmFyTW9kdWxlQWRtaW48L01vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5GcmVkPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5CbG9jazQ8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjk5OTwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyTW9kdWxlPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCjwhLS0gICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6Q1ZTRmlsdGVyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VHVybiBvbiBpZiB5b3Ugd2FudCB0byBhbGxvdyB0aGUgQ1ZTRmlsdGVyIHJlYWx0aW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGFrdGl2aWVyZW4gdW0genVyIExhdWZ6ZWl0IGJlcmVpdHMgZGllIENWUy1GaWx0ZXIgenUgdGVzdGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6UGF0aFRvQ1ZTRmlsdGVyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+UGF0aCB0byB0aGUgY3ZzIGZpbHRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+UGZhZCB6dW0gQ1ZTLUZpbHRlci4gQmVpbSBDVlMtRmlsdGVyIGhhbmRlbHQgZXMgc2ljaCB1bSBkaWUgZmlsdGVyLWV4dGVuZGVkLnBsIGRlcyBDVlNST09ULVJlcG9zaXRpb3J5IGRlcyBpbnRlcm5lbiBDVlMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPi9ob21lL3RyL3NyYy9DVlNST09ULWludDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkRhdGFiYXNlOjpTbG93TG9nIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VG8gZW5hYmxlIHNsb3cgc3FsIGxvZyAodG8gbG9nIGFsbCBzcWwgcXVlcmllcyB3aGljaCB0YWtlIGxvbmdlciB0aGUgNCBzZWMuKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+VW0gU2xvdyBTUUwgenUgYWt0aXZpZXJlbiAobWl0c2NobmVpZGVyIGFsbGVyIFNRTC1BYmZyYWdlbiB3ZWxjaGUgbGFlbmdlciA0IFNlay4gYnJhdWNoZW4pLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPiAtLT4KPC9vdHJzX2NvbmZpZz4K
IyAtLQojIEFBQUZyZWQucG0gLSB0aGUgY29uZmlnIHRvIGJpbmQgU1RERVJSIHRvIGFuIGxvZyBmaWxlIHVzYWJsZSBmb3IgZnJlZAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBQUFGcmVkLnBtLHYgMS4zIDIwMDcvMDkvMjEgMDc6NDQ6MTUgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgppZiAoJEVOVntIVFRQX1VTRVJfQUdFTlR9KSB7CiAgICAjIGNoZWNrIGxvZyBmaWxlIHNpemUKICAgIG15ICRTaXplID0gLXMgJFNlbGYtPntIb21lfS4iL3Zhci9mcmVkLmxvZyI7CiAgICBpZiAoJFNpemUgPiAyMCoxMDI0KjEwMjQpIHsKICAgICAgICB1bmxpbmsgJFNlbGYtPntIb21lfS4iL3Zhci9mcmVkLmxvZyI7CiAgICB9CgogICAgIyBtb3ZlIFNURE9VVCB0byB0bXAgZmlsZQogICAgaWYgKCFvcGVuKFNUREVSUiwgJz4+JywgIiRTZWxmLT57SG9tZX0vdmFyL2ZyZWQubG9nIikpIHsKICAgICAgICBwcmludCBTVERFUlIgIkVSUk9SOiBDYW4ndCB3cml0ZSAkU2VsZi0+e0hvbWV9L3Zhci9mcmVkLmxvZzogJCEiOwogICAgfQp9CjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC5wbSAtIGFsbCBmcmVkIGNvcmUgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWQucG0sdiAxLjEgMjAwNy8wOS8yMSAwNzo1MTowNiB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RnJlZCAtIGZyZWQgY29yZSBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZyZWQgc3RhbmRhcmQgY29yZSBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiMgICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiMgICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAojICAgICAgICBMb2dPYmplY3QgPT4gJExvZ09iamVjdCwKIyAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIERhdGFHZXQoKQoKRXZhbHVhdGUgdGhlIHNldmVyYWwgZGF0YSBvZiBhbGwgZnJlZCBtb2R1bGVzIGFuZCBhZGQgdGhlbQpvbiB0aGUgRnJlZE1vZHVsZXMgcmVmZXJlbmNlLgoKICAgICRCYWNrZW5kT2JqZWN0ID0gJEZyZWRPYmplY3QtPkRhdGFHZXQoCiAgICAgICAgRnJlZE1vZHVsZXNSZWYgPT4gJEZyZWRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtGcmVkTW9kdWxlc1JlZn0gfHwgcmVmKCAkUGFyYW17RnJlZE1vZHVsZXNSZWZ9ICkgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBGcmVkTW9kdWxlc1JlZiEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCAhJFBhcmFte0hUTUxEYXRhUmVmfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgSFRNTERhdGFSZWYhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgbXkgJE1vZHVsZU5hbWUgKCBrZXlzICV7ICRQYXJhbXtGcmVkTW9kdWxlc1JlZn0gfSApIHsKICAgICAgICAjIGxvYWQgYmFja2VuZAogICAgICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkQmFja2VuZCggTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSApOwoKICAgICAgICAjIGdldCBtb2R1bGUgZGF0YQogICAgICAgIGlmICgkQmFja2VuZE9iamVjdCkgewogICAgICAgICAgICAkQmFja2VuZE9iamVjdC0+RGF0YUdldCgKICAgICAgICAgICAgICAgIE1vZHVsZVJlZiAgID0+ICRQYXJhbXtGcmVkTW9kdWxlc1JlZn0tPnskTW9kdWxlTmFtZX0sCiAgICAgICAgICAgICAgICBIVE1MRGF0YVJlZiA9PiAkUGFyYW17SFRNTERhdGFSZWZ9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0xvYWRCYWNrZW5kKCkKCmxvYWQgYSB4bWwgaXRlbSBtb2R1bGUKCiAgICAkQmFja2VuZE9iamVjdCA9ICRGcmVkT2JqZWN0LT5fTG9hZEJhY2tlbmQoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgX0xvYWRCYWNrZW5kIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkQmFja2VuZE9iamVjdDsKCiAgICAjIG1vZHVsZSByZWYKICAgIGlmICggISRQYXJhbXtNb2R1bGVOYW1lfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCBNb2R1bGVOYW1lISIgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB1c2UgdGhlIGNhY2hpbmcgbWVjaGFuaXNtIGxhdGVyIGlmIHJlcXVpcmVkCgogICAgIyBjaGVjayBpZiBvYmplY3QgaXMgY2FjaGVkCiAgICAjaWYgKCAkU2VsZi0+eyAnQ2FjaGU6Ol9Mb2FkWE1MVHlwZUJhY2tlbmQ6OicgLiAkUGFyYW17VHlwZX0gfSApIHsKICAgICMgICAgcmV0dXJuICRTZWxmLT57ICdDYWNoZTo6X0xvYWRYTUxUeXBlQmFja2VuZDo6JyAuICRQYXJhbXtUeXBlfSB9OwogICAgI30KCiAgICAjIGNyZWF0ZSBuZXcgaW5zdGFuY2UKICAgIG15ICRHZW5lcmljTW9kdWxlID0gIktlcm5lbDo6U3lzdGVtOjpGcmVkOjokUGFyYW17TW9kdWxlTmFtZX0iOwogICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSApIHsKICAgICAgICAkQmFja2VuZE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9LCAlUGFyYW0sICk7CiAgICB9CgogICAgIyBjYWNoZSBvYmplY3QKICAgICNpZiAoJEJhY2tlbmRPYmplY3QpIHsKICAgICMgICAgJFNlbGYtPnsgJ19Mb2FkWE1MVHlwZUJhY2tlbmQ6OicgLiAkUGFyYW17VHlwZX0gfSA9ICRCYWNrZW5kT2JqZWN0OwogICAgI30KCiAgICAjIHJldHVybiBvYmplY3QKICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKfQoKPWl0ZW0gSW5zZXJ0TGF5b3V0T2JqZWN0KCkKCkZSQU1FV09SSy0yLjIgc3BlY2lmaWMgYmVjYXVzZSB0aGVyZSBpcyBubyBMYXlvdXRPYmplY3QgaW50ZWdyYXRpb24gZm9yCkZSRUQgaW4gT1RSUzIuMiBMYXlvdXQucG0KCiAgICAkRnJlZE9iamVjdC0+SW5zZXJ0TGF5b3V0T2JqZWN0KCk7Cgo9Y3V0CgojIEZSQU1FV09SSy0yLjIgc3BlY2lmaWMgYmVjYXVzZSB0aGVyZSBpcyBubyBMYXlvdXRPYmplY3QgaW50ZWdyYXRpb24gZm9yCiMgRlJFRCBpbiBPVFJTMi4yIExheW91dC5wbQoKc3ViIEluc2VydExheW91dE9iamVjdCB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15IEBMaW5lcyA9ICgpOwogICAgbXkgJEZpbGUgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICIvS2VybmVsL091dHB1dC9IVE1ML0xheW91dC5wbSI7CgogICAgaWYgKCAtbCAiJEZpbGUiICkgewogICAgICAgIGRpZSAnQ2FuXCd0IG1hbmlwdWxhdGUgTGF5b3V0LnBtIGJlY2F1c2UgaXQgaXMgYSBzeW1saW5rISc7CiAgICB9CgogICAgbXkgJEluU3ViOwogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSAgfHwgZGllICJGSUxURVI6IENhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIHB1c2ggQExpbmVzLCAkTGluZTsKICAgICAgICBpZiAoICRMaW5lID1+IC9zdWIgUHJpbnQgey8gKSB7CiAgICAgICAgICAgICRJblN1YiA9IDE7CiAgICAgICAgfQogICAgICAgIGlmICggJEluU3ViICYmICRMaW5lID1+IC9EZWJ1ZyA9PiBcJFNlbGYtPntEZWJ1Z30sLyApIHsKICAgICAgICAgICAgcHVzaCBATGluZXMsICIjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIjsKICAgICAgICAgICAgcHVzaCBATGluZXMsICIgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiBcJFNlbGYsXG4iOwogICAgICAgICAgICBwdXNoIEBMaW5lcywgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgICAgICAkSW5TdWIgPSAwOwogICAgICAgIH0KICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkZJTFRFUjogQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKICAgIGZvciBteSAkTGluZSAoQExpbmVzKSB7CiAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlSUk7CiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICdGUkVEIG1hbmlwdWxhdGVkIHRoZSBMYXlvdXQucG0hJywKICAgICk7CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwNy8wOS8yMSAwNzo1MTowNiAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9IVE1MQ2hlY2sucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSFRNTENoZWNrLnBtLHYgMS4xIDIwMDcvMDkvMjEgMDc6NTE6MDYgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpIVE1MQ2hlY2s7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkhUTUxDaGVjawoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIEhUTUw6OiBsaW50IGNoZWNrCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGEgb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRGF0YUdldCgpCgpHZXQgdGhlIGRhdGEgZm9yIHRoaXMgZnJlZCBtb2R1bGUuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS4KQW5kIGFkZCB0aGUgZGF0YSB0byB0aGUgbW9kdWxlIHJlZi4KCiAgICAkQmFja2VuZE9iamVjdC0+RGF0YUdldCgKICAgICAgICBNb2R1bGVSZWYgPT4gJE1vZHVsZVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRGF0YUdldCB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJFBhcmFtUmVmIChxdyggTW9kdWxlUmVmIEhUTUxEYXRhUmVmICkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JFBhcmFtUmVmfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJFBhcmFtUmVmISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBDaGVjayB0aGUgSFRNTC1PdXRwdXQgd2l0aCBIVE1MOjpMaW50CiAgICBteSBASFRNTExpbnRNZXNzYWdlczsKICAgIGlmICgkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCdIVE1MOjpMaW50JykpIHsKICAgICAgICBIVE1MOjpMaW50LT5pbXBvcnQoKTsKICAgICAgICBteSAkSFRNTExpbnRPYmplY3QgPSBIVE1MOjpMaW50LT5uZXcoIG9ubHlfdHlwZXMgPT4gSFRNTDo6TGludDo6RXJyb3ItPlNUUlVDVFVSRSApOwogICAgICAgICRIVE1MTGludE9iamVjdC0+cGFyc2UgKCR7ICRQYXJhbXtIVE1MRGF0YVJlZn0gfSk7CgogICAgICAgIG15ICRFcnJvckNvdW50ZXIgPSAkSFRNTExpbnRPYmplY3QtPmVycm9yczsKICAgICAgICBmb3IgbXkgJEVycm9yICgkSFRNTExpbnRPYmplY3QtPmVycm9ycykgewogICAgICAgICAgICBteSAkU3RyaW5nIC49ICRFcnJvci0+YXNfc3RyaW5nOwogICAgICAgICAgICBpZiAoJFN0cmluZyAhfiAvSW52YWxpZCBjaGFyYWN0ZXIgLisgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgLykgewogICAgICAgICAgICAgICAgcHVzaCBASFRNTExpbnRNZXNzYWdlcywgJFN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgbXkgJFRleHQgPSAnVGhlIEhUTUwtY2hlY2tlciBvZiBGcmVkIHJlcXVpcmVzIEhUTUw6OkxpbnQgdG8gYmUgaW5zdGFsbGVkIScKICAgICAgICAgICAgLiAnUGxlYXNlIGluc3RhbGwgSFRNTDo6TGludCB2aWEgQ1BBTiBvciBkZWFjdGl2YXRlIHRoZSBIVE1MLWNoZWNrZXIgdmlhIFN5c0NvbmZpZy4nOwogICAgICAgIHB1c2ggQEhUTUxMaW50TWVzc2FnZXMsICRUZXh0OwogICAgfQoKICAgIGlmIChASFRNTExpbnRNZXNzYWdlcykgewogICAgICAgICR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17RGF0YX0gPSBcQEhUTUxMaW50TWVzc2FnZXM7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDcvMDkvMjEgMDc6NTE6MDYgJAoKPWN1dA==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9TVERFUlJMb2cucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogU1RERVJSTG9nLnBtLHYgMS4xIDIwMDcvMDkvMjEgMDg6MDk6MDkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTVERFUlJMb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNUREVSUkxvZwoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIFNUREVSUiBsb2cgZGF0YQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtNb2R1bGVSZWZ9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBNb2R1bGVSZWYhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIG9wZW4gdGhlIGZyZWQubG9nIGZpbGUgdG8gZ2V0IHRoZSBTVERFUlIgbWVzc2FnZXMKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICIvdmFyL2ZyZWQubG9nIjsKICAgIGlmICggb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSApIHsKICAgICAgICBteSBAUm93ICAgICAgICA9IDwkRmlsZWhhbmRsZT47CiAgICAgICAgbXkgQFJldmVyc2VSb3cgPSByZXZlcnNlKEBSb3cpOwogICAgICAgIG15IEBMb2dNZXNzYWdlczsKICAgICAgICBmb3IgbXkgJExpbmUgKEBSZXZlcnNlUm93KSB7CiAgICAgICAgICAgIGlmICggJExpbmUgPX4gL0ZSRUQvICkgewogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRMaW5lICF+IC9TdWJyb3V0aW5lIC4rPyByZWRlZmluZWQgYXQvICkgewogICAgICAgICAgICAgICAgcHVzaCBATG9nTWVzc2FnZXMsICRMaW5lOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwcmludCBTVERFUlIgIkZSRURcbiI7CiAgICAgICAgY2xvc2UgJEZpbGVoYW5kbGU7CiAgICAgICAgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtEYXRhfSA9IFxATG9nTWVzc2FnZXM7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwNy8wOS8yMSAwODowOTowOSAkCgo9Y3V0
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0RldmVsRnJlZC5wbSAtIGEgc3BlY2lhbCBkZXZlbG9wZXIgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERldmVsRnJlZC5wbSx2IDEuMSAyMDA3LzA5LzIxIDA3OjQ0OjU4IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkRldmVsRnJlZDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCiN1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDb25maWc7CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBPYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoCiAgICAgICAgUGFyYW1PYmplY3QgREJPYmplY3QgICAgIExvZ09iamVjdCBDb25maWdPYmplY3QKICAgICAgICBNYWluT2JqZWN0ICBMYXlvdXRPYmplY3QgVGltZU9iamVjdAogICAgKSkgewogICAgICAgIGlmICgkUGFyYW17JE9iamVjdH0pIHsKICAgICAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiKTsKICAgICAgICB9CiAgICB9CiMgICAgJFNlbGYtPntYTUxPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KCV7JFNlbGZ9KTsKICAgICRTZWxmLT57Q29uZmlnVG9vbE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q29uZmlnLT5uZXcoJXskU2VsZn0pOwogICAgJFNlbGYtPntTdWJhY3Rpb259ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdTdWJhY3Rpb24nKTsKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2hvdyB0aGUgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoISRTZWxmLT57U3ViYWN0aW9ufSkgewogICAgfQojICAgICAgICBteSAkT3V0cHV0ICAgPSAnJzsKIwojICAgICAgICBteSBAVHJhbnNsYXRpb25XaGl0ZUxpc3QgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hHZXQoCiMgICAgICAgICAgICBUeXBlID0+ICdGcmVkLVRyYW5zbGF0aW9uJywKIyAgICAgICAgICAgIEtleSAgPT4gMSwKIyAgICAgICAgICAgIENhY2hlID0+IDAsCiMgICAgICAgICk7CiMKIyAgICAgICAgbXkgJVdoaXRlTGlzdDsKIyAgICAgICAgZm9yIG15ICRDb250ZW50IChAeyRUcmFuc2xhdGlvbldoaXRlTGlzdFsxXXtUcmFuc2xhdGlvbn19KSB7CiMgICAgICAgICAgICBpZiAoJENvbnRlbnQtPntDb250ZW50fSkgewojICAgICAgICAgICAgICAgICMgYWRkIGFkZCBibG9jawojICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiMgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmUnLAojICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKIyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQgPT4gJENvbnRlbnQtPntDb250ZW50fSwKIyAgICAgICAgICAgICAgICAgICAgfSwKIyAgICAgICAgICAgICAgICApOwojICAgICAgICAgICAgfQojICAgICAgICB9CiMKIyAgICAgICAgIyBidWlsZCBvdXRwdXQKIyAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAiRnJlZC1PdmVydmlldyIpOwojICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwojICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAojICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKIyAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkJywKIyAgICAgICAgKTsKIyAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwojICAgICAgICByZXR1cm4gJE91dHB1dDsKIyAgICB9CiMgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyAgICAjIGhhbmRsZSB0aGUgdHJhbnNsYXRpb24gbG9nCiMgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdUcmFuc2xhdGlvbicpIHsKIyAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdWYWx1ZScpOwojCiMgICAgICAgIG15IEBEYXRhID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoR2V0KAojICAgICAgICAgICAgVHlwZSA9PiAnRnJlZC1UcmFuc2xhdGlvbicsCiMgICAgICAgICAgICBLZXkgID0+IDEsCiMgICAgICAgICAgICBDYWNoZSA9PiAwLAojICAgICAgICApOwojCiMgICAgICAgIGlmICghQERhdGEpIHsKIyAgICAgICAgICAgIG15IEBIYXNoOwojCiMgICAgICAgICAgICAkSGFzaFsxXXtUcmFuc2xhdGlvbn1bMV17Q29udGVudH0gPSAkVmFsdWU7CiMgICAgICAgICAgICAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hBZGQoCiMgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnRnJlZC1UcmFuc2xhdGlvbicsCiMgICAgICAgICAgICAgICAgS2V5ICAgICA9PiAxLAojICAgICAgICAgICAgICAgIFhNTEhhc2ggPT4gXEBIYXNoLAojICAgICAgICAgICAgKTsKIyAgICAgICAgfQojICAgICAgICBlbHNlIHsKIyAgICAgICAgICAgIHB1c2ggQHskRGF0YVsxXXtUcmFuc2xhdGlvbn19LCB7Q29udGVudCA9PiAkVmFsdWV9OwojICAgICAgICAgICAgJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoVXBkYXRlKAojICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0ZyZWQtVHJhbnNsYXRpb24nLAojICAgICAgICAgICAgICAgIEtleSA9PiAnMScsCiMgICAgICAgICAgICAgICAgWE1MSGFzaCA9PiBcQERhdGEsCiMgICAgICAgICAgICApOwojCiMgICAgICAgIH0KIwojICAgICAgICBteSAkUmVmZXJlciA9ICRFTlZ7SFRUUF9SRUZFUkVSfTsKIyAgICAgICAgaWYgKCRSZWZlcmVyID1+IC9cPyguKykkLykgewojICAgICAgICAgICAgJFJlZmVyZXIgPSAkMTsKIyAgICAgICAgfQojCiMgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICRSZWZlcmVyKTsKIyAgICB9CiMgICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVHJhbnNsYXRpb25EZWxldGUnKSB7CiMgICAgICAgIG15IEBEYXRhID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoRGVsZXRlKAojICAgICAgICAgICAgVHlwZSA9PiAnRnJlZC1UcmFuc2xhdGlvbicsCiMgICAgICAgICAgICBLZXkgID0+IDEsCiMgICAgICAgICk7CiMKIyAgICAgICAgbXkgJFJlZmVyZXIgPSAkRU5We0hUVFBfUkVGRVJFUn07CiMgICAgICAgIGlmICgkUmVmZXJlciA9fiAvXD8oLispJC8pIHsKIyAgICAgICAgICAgICRSZWZlcmVyID0gJDE7CiMgICAgICAgIH0KIwojICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAkUmVmZXJlcik7CiMgICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZmFzdCBoYW5kbGUgZm9yIGZyZWQgc2V0dGluZ3MKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZXR0aW5nJykgewogICAgICAgIG15ICRNb2R1bGVGb3JSZWYgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJlZDo6TW9kdWxlJyk7CiAgICAgICAgZm9yIG15ICRNb2R1bGUgKGtleXMgJXskTW9kdWxlRm9yUmVmfSkgewogICAgICAgICAgICBteSAkQ2hlY2tlZCA9ICcnOwogICAgICAgICAgICBpZiAoJE1vZHVsZUZvclJlZi0+eyRNb2R1bGV9LT57QWN0aXZlfSkgewogICAgICAgICAgICAgICAgJENoZWNrZWQgPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGcmVkTW9kdWxlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEZyZWRNb2R1bGUgPT4gJE1vZHVsZSwKICAgICAgICAgICAgICAgICAgICBDaGVja2VkICAgID0+ICRDaGVja2VkLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gIkZyZWQtU2V0dGluZyIpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkU2V0dGluZycsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGZhc3QgaGFuZGxlIGZvciBmcmVkIHNldHRpbmdzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2V0dGluZ0FjdGlvbicpIHsKICAgICAgICBteSAkTW9kdWxlRm9yUmVmID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZyZWQ6Ok1vZHVsZScpOwogICAgICAgIG15IEBTZWxlY3RlZEZyZWRNb2R1bGVzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KFBhcmFtID0+ICdGcmVkTW9kdWxlJyk7CiAgICAgICAgbXkgJVNlbGVjdGVkTW9kdWxlcyA9IG1hcCB7ICRfID0+IDE7IH0gQFNlbGVjdGVkRnJlZE1vZHVsZXM7CiAgICAgICAgbXkgJFVwZGF0ZUZsYWc7CiAgICAgICAgZm9yIG15ICRNb2R1bGUgKGtleXMgJXskTW9kdWxlRm9yUmVmfSkgewogICAgICAgICAgICBpZiAoJE1vZHVsZUZvclJlZi0+eyRNb2R1bGV9LT57QWN0aXZlfSAmJiAhJFNlbGVjdGVkTW9kdWxlc3skTW9kdWxlfSB8fAogICAgICAgICAgICAgICAgISRNb2R1bGVGb3JSZWYtPnskTW9kdWxlfS0+e0FjdGl2ZX0gJiYgJFNlbGVjdGVkTW9kdWxlc3skTW9kdWxlfQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnVG9vbE9iamVjdH0tPkNvbmZpZ0l0ZW1VcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gIkZyZWQ6Ok1vZHVsZSMjIyRNb2R1bGUiLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ0FjdGl2ZScgPT4gJFNlbGVjdGVkTW9kdWxlc3skTW9kdWxlfSB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICAnTW9kdWxlJyA9PiAkTW9kdWxlRm9yUmVmLT57JE1vZHVsZX0tPntNb2R1bGV9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVXBkYXRlRmxhZyA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRVcGRhdGVGbGFnKSB7CiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnVG9vbE9iamVjdH0tPkNvbmZpZ0l0ZW1VcGRhdGVGaW5pc2goKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5vdyB0aGUgYnJvd3NlciBzaG91bGQgYmUgY2xvc2VkIik7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKMTsK