IyEgL3Vzci9iaW4vcGVybCAtdwoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgdnJ0MnRlaS5wbAojIGV1cmVjbwojIGxlaWJuaXotaW5zdGl0dXQgZnVlciBkZXV0c2NoZSBzcHJhY2hlIC8gY3NjIGZpbmxhbmQgZXNibwojIGF1Z3VzdCAyMDI0CiMgCiMgCiMgdXNpbmcgWE1MOjpUd2lnICwgc2VlIGh0dHA6Ly93d3cueG1sdHdpZy5vcmcvLCBodHRwczovL21ldGFjcGFuLm9yZy9wb2QvWE1MOjpUd2lnYQojIAojIHVzYWdlOiBzZWUgYmVsb3cgdGhlIHVzYWdlIGZ1Z25jdGlvbgojIFVzYWdlOiAgLi92cnQydGVpLnBsIDx2cnR4bWxmaWxlLnhtbD4gPG91dGZpbGU+CiMgICAgICAgICA8dnJ0eG1sZmlsZT46IHhtbC1pc2VkIHZydCBmaWxlCiMKIwojIFRPRE86IAojIDEgIGluc2VydCBkdGQgc3BlYywgb3IgcmVmIHRvIFRFSQoKIyAzYSByZW1vdmUgdGhlIHZydCBwb3NpdGlvbmFsIGF0dHJpYnV0ZSBjb21tZW50IGxpbmUgLyBhbGwgY29tbWVudCBsaW5lcwojIDNiIGFkZCBAaGVhZCBhbmQgQGRlcHJlbCB0byBJNSBzb3dpZSBhdWNoIEBtc2QKIyAzYyBiZWFyYmVpdHVuZyB2b24gQGhlYWQgdW5kIEBkZXByZWwgaW4gdGVpMmtvcmFweG1sIGR1cmNoIE5pbHM/CiMgM2QgYnVpbGQgMzAgYmlsbGlvbiBjb3JwdXMKCiMgNGEgdGFrZSBjYXJlIG9mIElEcwojIDRiIHNlZSB0byB0aGUgdmFsdWVzIG9mIEB4bWw6bGFuZwojIDUgYWJmYW5nZW4gdm9uIHVuZXJ3YXJ0ZXRlbiBlbGVtZW50ZW4gZGggYW5kZXJlIGFscyA8c2VudGVuY2U+IHVuZCA8cGFyYWdyYXBoPgojIDVhIHdvcnQgcmVpaGVuZm9sZ2Ugbm9jaG1hbCBjaGVja2VuCiMgNiBjaGVja3MgYW5kIGJhbGFuY2VzCiMgNyAgSG93IHRvIGVuY29kZSBLaWVsaXBhbmtraSBhbmQgTmF0aW9uYWwgTGlicmFyeSBvZiBGaW5sYW5kPyBpbiB0ZWlDb3JwdXMgSGVhZGVyCiMgOCAgY29uc3RydWN0IDxpZHNEb2M+cyBmb3IgdGhlIG1vbnRocyAob3IgZ28gZm9yIFRFSSkKIyA5ICBwYXJhbGxlbGlzYXRpb24gaW4gYmFzaCBhbmQgYXBwbGljYXRpb24gb24gc3ViIGNvcnBvcmEgb2YgS0xLCiMgMTAgIHJlLWltcGxlbWVudGF0aW9uIG9mIHRoZSBnYXdrIGNvZGUgaW4gdGhlIHBlcmwgc2NyaXB0CiMgMTIgIHJlLWltcGxlbWVudCBjcmVhdGlvbiBvZiB0ZXh0IGhlYWRlciBmcm9tIHhtbCBmaWxlIGluIGFub3RoZXIgdHdpZyAvIHBhcmFtZXRyaXplIFRFSSB2cyBJNQoKCgojcmVtZW1iZXIKI2Zvcm1hdHRlZC54bWw6MTA1NjEzOiBlbGVtZW50IHc6IHZhbGlkaXR5IGVycm9yIDogTm8gZGVjbGFyYXRpb24gZm9yIGF0dHJpYnV0ZSBkZXByZWwgb2YgZWxlbWVudCB3CiNmb3JtYXR0ZWQueG1sOjEwNTYxMzogZWxlbWVudCB3OiB2YWxpZGl0eSBlcnJvciA6IE5vIGRlY2xhcmF0aW9uIGZvciBhdHRyaWJ1dGUgaGVhZCBvZiBlbGVtZW50IHcKCgojCiMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwojdXNlIGRpYWdub3N0aWNzOwoKdXNlIEdldG9wdDo6U3RkOwp1c2UgWE1MOjpUd2lnOyAKdXNlIFhNTDo6R2VuZXJhdG9yICc6cHJldHR5JzsgICMgYXBwYXJlbnRseSBubyBlZmZlY3Qgd2hlbiB1c2luZyBmbHVzaCgpOwoKIAp1c2UgbG9jYWxlOyAgICAgICAgICAgICAgICAgIyBkaWVzZSBkcmVpIFplaWxlbiwgZGFtaXQgXGIgaW0gcmVnZXggbmljaHQgVW1sYXV0ZSB1bmQg3yBtYXRjaHQuCnVzZSBQT1NJWCBxdyhsb2NhbGVfaCk7ICAgICAjIHRvIGJlIGFibGUgdG8gdXNlIHNldGxvY2FsZSgpCiNzZXRsb2NhbGUoTENfQUxMLCdkZV9ERScpOyAgCnNldGxvY2FsZShMQ19BTEwsICJmaV9GSSIpOyAgCnVzZSB1dGY4Owp1c2Ugb3BlbiBxdyggOnN0ZCA6ZW5jb2RpbmcoVVRGLTgpICk7Cgp1c2UgVGltZTo6UGllY2U7CnVzZSBUaWU6Okl4SGFzaDsKdXNlIERhdGE6OlJhbmRvbTo6U3RyaW5nOwoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgY2hlY2sgZmlsZSBhcmd1bWVudHM6CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIGFyZzAgaW5maWxlOiAgIHZydC14bWwKCnVubGVzcygkQVJHVlswXSkgeyZ1c2FnZV9tZXNzYWdlKCl9IDsgIyBtaW4gYXJnMCwgdGhlIGlucHV0IGZpbGUKaWYgICAgKCRBUkdWWzFdKSB7JnVzYWdlX21lc3NhZ2UoKX07ICAjIG1heCBhcmcwLCB0aGUgaW5wdXQgZmlsZQoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGdldCBvcHRpb25zIC8gYXV4aWxpYXJ5IGZpbGVzCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgR0xPQkFMIFZBUklBQkxFUyAKIyMjIyMjIyMjIyMjIyMjIyMjIyMKCm15ICRlbmNvZGluZyA9ICJVVEYtOCI7ICAgICAgICAgICAgICAgICMgZGllc2VzICRlbmNvZGluZyBpc3QgTlVSIGZ1ZXIgZGFzIG91dHB1dCBzLnUuIHR3aWcgZnVua3Rpb24KCiNteSAkVEVJRk9STUFUID0gIlRFSSI7Cm15ICRURUlGT1JNQVQgPSAiSTUiOwoKCgpteSAkdGV4dGNvdW50ZXIgPSAwOwpteSAkTEFTVE1PTlRIID0gMDsKCm91ciAlY29ycHVzc2lnbGVzICAgID0gKCk7Cm91ciAlc3JjZnVsbG5hbWVzICAgID0gKCk7Cm91ciAlc3JjcHVicGxhY2VzICAgID0gKCk7Cm91ciAlc3JjcHVibGlzaGVycyAgID0gKCk7Cm91ciAlc3JjdGV4dHR5cGVzICAgID0gKCk7Cm91ciAlc3JjdGV4dGxhbmdzICAgID0gKCk7CgpvdXIgJWV4cGFuZExhbmcgICAgICA9ICgpOwoKCm15ICVkb2Njb3VudGVyID0gKCAgICAgICAgICAgICAgICAgICAgICAgICMgYnkgdGhlIG1vbnRoIGFzIGluIGRlcmVrbwogICAgIjAxIiA9PiAxLAogICAgIjAyIiA9PiAxLAogICAgIjAzIiA9PiAxLAogICAgIjA0IiA9PiAxLAogICAgIjA1IiA9PiAxLAogICAgIjA2IiA9PiAxLAogICAgIjA3IiA9PiAxLAogICAgIjA4IiA9PiAxLAogICAgIjA5IiA9PiAxLAogICAgIjEwIiA9PiAxLAogICAgIjExIiA9PiAxLAogICAgIjEyIiA9PiAxLAogICAgKTsKCgoKbXkgJHNvdXJjZXNjc3ZmaWxlID0gInNvdXJjZXNfa2xrX2ZpX3YyXzIwMjFfNGV1cmVjby5jc3YiOwoKbXkgJGNvcnBoZWFkZXJmaWxlID0gInRlaUNvcnB1c0hlYWRlclNrZWxldG9uLnRlaS54bWwiOwpteSAkdGV4dGhlYWRlcmZpbGUgPSAidGVpVGV4dEhlYWRlclNrZWxldG9uLnRlaS54bWwiOwppZigkVEVJRk9STUFUIGVxICJJNSIpewogICAgJGNvcnBoZWFkZXJmaWxlID0gImk1Q29ycHVzSGVhZGVyU2tlbGV0b24uaTUueG1sIjsKICAgICR0ZXh0aGVhZGVyZmlsZSA9ICJpNVRleHRIZWFkZXJTa2VsZXRvbi5pNS54bWwiOwp9CgoKbXkgJHR3aWc9IiI7ICAgCgojIGdsb2JhbCB2YXJpYWJsZXMgcGVydGFpbmluZyB0byB0aGUgb3JpZ2luYWwgY29ycHVzIDoKbXkgJGtpZWxpcGFua2tpQ29ycHVzICA9ICJrbGstZmktdjItdnJ0IjsKbXkgJGtpZWxpcGFua2tpTGljZW5zZSA9ICJDTEFSSU4tUkVTIjsKCgojIHZhcmlhYmxlcyAkZm5zb3VyY2UgYW5kICRmbnllYXIgdGFrZW4gZnJvbSB0aGUgZmlsZW5hbWUKbXkgQGFycmF5ID0gc3BsaXQoL1wvLywgJEFSR1ZbMF0pOwpteSAkbCA9IHNjYWxhcihAYXJyYXkpOwpteSAkZm5zb3VyY2UgPSAkYXJyYXlbJGwtMV07CiRmbnNvdXJjZSA9fiBzLyhbMC05XVswLTldWzAtOV1bMC05XSlcLnhtbCQvLzsKCm15ICRmbnllYXIgPSAkMTsgICAjICQxIGNvbnRhaW5zIHN1YnN0cmluZyBpbiBmaXJzdCBicmFja2V0IGluIHJlZ2V4IGFib3ZlCgoKIyBtb250aHMKbXkgJW1vbnRocyA9ICgKICAgICAiMDEiID0+ICJKQU4iLAogICAgICIwMiIgPT4gIkZFQiIsCiAgICAgIjAzIiA9PiAiTUFSIiwKICAgICAiMDQiID0+ICJBUFIiLAogICAgICIwNSIgPT4gIk1BWSIsCiAgICAgIjA2IiA9PiAiSlVOIiwKICAgICAiMDciID0+ICJKVUwiLAogICAgICIwOCIgPT4gIkFVRyIsCiAgICAgIjA5IiA9PiAiU0VQIiwKICAgICAiMTAiID0+ICJPQ1QiLAogICAgICIxMSIgPT4gIk5PViIsCiAgICAgIjEyIiA9PiAiREVDIiwKICAgICApOwoKbXkgJW1vbnRobmFtZXMgPSAoCiAgICAgIjAxIiA9PiAiSmFudWFyeSIsCiAgICAgIjAyIiA9PiAiRmVicnVhcnkiLAogICAgICIwMyIgPT4gIk1hcmNoIiwKICAgICAiMDQiID0+ICJBcHJpbCIsCiAgICAgIjA1IiA9PiAiTWF5IiwKICAgICAiMDYiID0+ICJKdW5lIiwKICAgICAiMDciID0+ICJKdWx5IiwKICAgICAiMDgiID0+ICJBdWd1c3QiLAogICAgICIwOSIgPT4gIlNlcHRlbWJlciIsCiAgICAgIjEwIiA9PiAiT2N0b2JlciIsCiAgICAgIjExIiA9PiAiTm92ZW1iZXIiLAogICAgICIxMiIgPT4gIkRlY2VtYmVyIiwKICAgICApOwoKbXkgJW1hcHBpbmcgPSAoKTsKJG1hcHBpbmd7ImFpa2FrYXVzaSJ9ICAgPSAiWmVpdHNjaHJpZnQiOwokbWFwcGluZ3sic2Fub21hbGVodGkifSA9ICJaZWl0dW5nIjsKCgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyByZWFkIHNvdXJjZSBtZXRhZGF0YSBmaWxlIChwcmVwYXJlZCBtYW51YWxseSA9PiB1bHRpbWF0ZWx5IHJlYWQgdGhlIGluZm8gZnJvbSBDTURJIEZpbGU/KQojIGFuZCBzZXQgdmFyaWFibGVzCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpvcGVuKG15ICRTT1VSQ0VTLCAiPCAkc291cmNlc2NzdmZpbGUiKSB8fCBkaWUoIiQwOiBjYW5ub3Qgb3BlbiBmaWxlIGZvciByZWFkaW5nOiAkc291cmNlc2NzdmZpbGUiKTsKd2hpbGUobXkgJGZsaW5lID0gPCRTT1VSQ0VTPil7CiAgICBjaG9tcCgkZmxpbmUpOwoKICAgIGlmICgkZmxpbmU9fi9eXCMvIHx8ICRmbGluZT1+L15ccyokLyB8fCAkZmxpbmUgPX4gIlRFSUNPUlBVU0lEIil7bmV4dDt9ICAgICMgc2tpcCBsaW5lIGlmIGVtcHR5IGxpbmUgb3IgY29tbWVudCBsaW5lIG9yIGZpcnN0IGxpbmUKICAgIG15IEBmbGFycmF5ID0gc3BsaXQoL1xzKlx0K1xzKi8sICRmbGluZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3BsaXQgZWFjaCBsaW5lIGludG8gYXJyYXkKCiAgICAjIHNldCBmdWxsIHRpdGxlcyAoJGZsYXJyYXlbMV0pIGFzIGtleXM6CiAgICAkY29ycHVzc2lnbGVzeyRmbGFycmF5WzFdfSAgPSAkZmxhcnJheVswXTsKICAgICRzcmNmdWxsbmFtZXN7JGZsYXJyYXlbMV19ICA9ICRmbGFycmF5WzFdOwogICAgJHNyY3B1YnBsYWNlc3skZmxhcnJheVsxXX0gID0gJGZsYXJyYXlbNl07CiAgICAkc3JjcHVibGlzaGVyc3skZmxhcnJheVsxXX0gPSAkZmxhcnJheVs3XTsKICAgICRzcmN0ZXh0dHlwZXN7JGZsYXJyYXlbMV19ICA9ICRmbGFycmF5WzRdOwogICAgJHNyY3RleHRsYW5nc3skZmxhcnJheVsxXX0gID0gJGZsYXJyYXlbNV07CgogICAgIyBhbHNvIHNldCBzaW1wbGUgdGl0bGVzICgkZmxhcnJheVsyXSkgYXMga2V5czogCiAgICAkY29ycHVzc2lnbGVzeyRmbGFycmF5WzJdfSAgPSAkZmxhcnJheVswXTsKICAgICRzcmNmdWxsbmFtZXN7JGZsYXJyYXlbMl19ICA9ICRmbGFycmF5WzFdOwogICAgJHNyY3B1YnBsYWNlc3skZmxhcnJheVsyXX0gID0gJGZsYXJyYXlbNl07CiAgICAkc3JjcHVibGlzaGVyc3skZmxhcnJheVsyXX0gPSAkZmxhcnJheVs3XTsKICAgICRzcmN0ZXh0dHlwZXN7JGZsYXJyYXlbMl19ICA9ICRmbGFycmF5WzRdOwogICAgJHNyY3RleHRsYW5nc3skZmxhcnJheVsyXX0gID0gJGZsYXJyYXlbNV07Cn0KY2xvc2UoJFNPVVJDRVMpOwoKJGV4cGFuZExhbmd7ImZpIn0gPSAiRmlubmlzaCI7CiRleHBhbmRMYW5neyJzdiJ9ID0gIlN3ZWRpc2giOwoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHJlYWQgY29ycHVzSGVhZGVyU2tlbGV0b24gZG9jdW1lbnQgYW5kIGdldCBoZWFkZXIgb3V0IG9mIGl0CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCm15ICR0ZWlDb3JwdXNIZWFkZXJEb2NUd2lnID0gbmV3IFhNTDo6VHdpZygKICAgIGtlZXBfc3BhY2VzID0+IDEsCiAgICBrZWVwX2F0dHNfb3JkZXIgPT4gMSwKICAgIGNvbW1lbnRzID0+ICdkcm9wJywKICAgICk7CgoKJHRlaUNvcnB1c0hlYWRlckRvY1R3aWctPnBhcnNlZmlsZSgkY29ycGhlYWRlcmZpbGUpOwpteSAkY29ycHVzSGVhZGVyID0gJHRlaUNvcnB1c0hlYWRlckRvY1R3aWctPnJvb3Q7ICAgICAgICAgICAgICAgICAgIyBnZXR0aW5nIHRoZSB0ZWlIZWFkZXIgZm9yIGNvcnB1cyBvdXQgb2YgdGhlIHRlaUNvcnB1c0hlYWRlclNrZWxldG9uIGRvY3VtZW50CgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHJlYWQgdGV4dEhlYWRlclNrZWxldG9uIGRvY3VtZW50IGFkbiBnZXQgaGVhZGVyIG91dCBvZiBpdAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpteSAkdGVpVGV4dEhlYWRlckRvY1R3aWcgPSBuZXcgWE1MOjpUd2lnKAogICAga2VlcF9zcGFjZXMgPT4gMSwKICAgIGtlZXBfYXR0c19vcmRlciA9PiAxLAogICAgY29tbWVudHMgPT4gJ2Ryb3AnLAogICAgKTsKCiR0ZWlUZXh0SGVhZGVyRG9jVHdpZy0+cGFyc2VmaWxlKCR0ZXh0aGVhZGVyZmlsZSk7Cm15ICR0ZXh0SGVhZGVyID0gJHRlaVRleHRIZWFkZXJEb2NUd2lnLT5yb290OyAgICAgICAgICAgICAgICAgICAgICAjIGdldHRpbmcgdGhlIHRlaUhlYWRlciBmb3IgY29ycHVzIG91dCBvZiB0aGUgdGVpVGV4dEhlYWRlclNrZWxldG9uIGRvY3VtZW50CgoKbXkgJGlkc0RvYyAgICAgICA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ2lkc0RvYycpOyAgICAKbXkgJGlkc0RvY0hlYWRlciA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ2lkc0hlYWRlcicpOwoKaWYoJFRFSUZPUk1BVCBlcSAiSTUiKXsKICAgIG15ICRkb2NGaWxlRGVzYyAgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCdmaWxlRGVzYycpOwogICAgbXkgJGRvY1RpdGxlU3RtdCA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ3RpdGxlU3RtdCcpOwogICAgbXkgJGR0aXRsZSAgICAgICA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ2QudGl0bGUnKTsKICAgIG15ICRkb2NTaWdsZSAgICAgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCdkb2t1bWVudFNpZ2xlJyk7CgogICAgbXkgJGRvY1B1YmxpY2F0aW9uU3RtdCA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ3B1YmxpY2F0aW9uU3RtdCcpOwogICAgbXkgJGRvY0Rpc3RyaWJ1dG9yICAgICA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ2Rpc3RyaWJ1dG9yJyk7CiAgICBteSAkZG9jUHViQWRkcmVzcyAgICAgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygncHViQWRyZXNzJyk7CiAgICBteSAkZG9jQXZhaWxhYmlsaXR5ICAgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygnYXZhaWxhYmlsaXR5Jyk7CiAgICBteSAkZG9jUHViRGF0ZSAgICAgICAgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygncHViRGF0ZScpOwogICAgCiAgICBteSAkZG9jU291cmNlRGVzYyAgICAgICA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ3NvdXJjZURlc2MnKTsKICAgIG15ICRkb2NCaWJsU3RydWN0ICAgICAgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCdiaWJsU3RydWN0Jyk7CiAgICBteSAkZG9jTW9ub2dyICAgICAgICAgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygnbW9ub2dyJyk7CiAgICBteSAkZG9jSFRpdGxlICAgICAgICAgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygnaC50aXRsZScpOwogICAgbXkgJGRvY0ltcHJpbnQgICAgICAgICA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ2ltcHJpbnQnKTsKICAgIAogICAgJGRvY1NpZ2xlICAgICAgICAgICAgICAgICAgLT4gcGFzdGUoImZpcnN0X2NoaWxkIiwgJGRvY1RpdGxlU3RtdCk7CiAgICAkZHRpdGxlICAgICAgICAgICAgICAgICAgICAtPiBwYXN0ZSgibGFzdF9jaGlsZCIsICAkZG9jVGl0bGVTdG10KTsKICAgICRkb2NUaXRsZVN0bXQgICAgICAgICAgICAgIC0+IHBhc3RlKCJsYXN0X2NoaWxkIiwgICRkb2NGaWxlRGVzYyk7CiAgICAkZG9jRmlsZURlc2MgICAgICAgICAgICAgICAtPiBwYXN0ZSgibGFzdF9jaGlsZCIsICAkaWRzRG9jSGVhZGVyKTsKICAgICRkb2NQdWJsaWNhdGlvblN0bXQgICAgICAgIC0+IHBhc3RlKCJsYXN0X2NoaWxkIiwgICRkb2NGaWxlRGVzYyk7CiAgICAkZG9jRGlzdHJpYnV0b3IgICAgICAgICAgICAtPiBwYXN0ZSgibGFzdF9jaGlsZCIsICAkZG9jUHVibGljYXRpb25TdG10KTsKICAgICRkb2NQdWJBZGRyZXNzICAgICAgICAgICAgIC0+IHBhc3RlKCJsYXN0X2NoaWxkIiwgICRkb2NQdWJsaWNhdGlvblN0bXQpOwoKICAgICRkb2NBdmFpbGFiaWxpdHkgICAgICAgICAgIC0+IHBhc3RlKCJsYXN0X2NoaWxkIiwgICRkb2NQdWJsaWNhdGlvblN0bXQpOwogICAgJGRvY1B1YkRhdGUgICAgICAgICAgICAgICAgLT4gcGFzdGUoImxhc3RfY2hpbGQiLCAgJGRvY1B1YmxpY2F0aW9uU3RtdCk7CgogICAgJGRvY1NvdXJjZURlc2MgICAgICAgICAgICAgLT4gcGFzdGUoImxhc3RfY2hpbGQiLCAgJGRvY0ZpbGVEZXNjKTsKICAgICRkb2NCaWJsU3RydWN0ICAgICAgICAgICAgIC0+IHBhc3RlKCJsYXN0X2NoaWxkIiwgICRkb2NTb3VyY2VEZXNjKTsKICAgICRkb2NNb25vZ3IgICAgICAgICAgICAgICAgIC0+IHBhc3RlKCJsYXN0X2NoaWxkIiwgICRkb2NCaWJsU3RydWN0KTsKICAgICRkb2NIVGl0bGUgICAgICAgICAgICAgICAgIC0+IHBhc3RlKCJsYXN0X2NoaWxkIiwgICRkb2NNb25vZ3IpOwogICAgJGRvY0ltcHJpbnQgICAgICAgICAgICAgICAgLT4gcGFzdGUoImxhc3RfY2hpbGQiLCAgJGRvY01vbm9ncik7CiAgICAKICAgICRpZHNEb2NIZWFkZXIgICAgICAgICAgIC0+IHBhc3RlKCJsYXN0X2NoaWxkIiwgICRpZHNEb2MpOwoKICAgICMgVG9EbyBzZXQgZHVtbXkgZHRpdGxlIGFuZCBkb2NTaWdsZQoKICAgICRkb2NTaWdsZS0+c2V0X3RleHQoJGNvcnB1c3NpZ2xlc3skZm5zb3VyY2V9IC4gIi9KQU4iKTsKICAgICRkdGl0bGUgIC0+c2V0X3RleHQoJHNyY2Z1bGxuYW1lc3skZm5zb3VyY2V9IC4gIiwgSmFudWFyeSAiIC4gJGZueWVhcik7Cn0KCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHJlYWQgaW5wdXQgVlJULVhNTCBkb2N1bWVudAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKb3BlbihteSAkSU4sICAiPCAkQVJHVlswXSIpIHx8IGRpZSgiJDA6IGNhbm5vdCBvcGVuIGZpbGUgZm9yIHJlYWRpbmc6ICRBUkdWWzBdIik7ICAgICAjIG9wZW4gaW5wdXQgIGZpbGUgYW5kIGluaXRpYWxpc2UgZmlsZWhhbmRlbCwgYWN0dWFsbHkgZG9lcyBub3Qgc2VlbSB0byBiZSBuZWVkZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFzIHBhcnNlZmlsZSgpIChzLmIuKSBpcyBhcHBsaWVkIHRvIHRoZSBmaWxlbmFtZQoKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAgICAgTSBBIEkgTiAgCiMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBzdGFydCB0d2lnIGZvciBpbnB1dCBhbmQgY2FsbCBzdGFydCB0YWcgaGFuZGxlciBmb3Igcm9vdCBhbmQgdHdpZyBoYW5kbGVyIGZvciBlYWNoIDx0ZXh0PiBpbiB0aGUgVlJUCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCiR0d2lnID0gbmV3IFhNTDo6VHdpZygKICAgIGtlZXBfc3BhY2VzID0+IDEsICAgICAgICAgICAjIGRhZHVyY2ggYXVjaCB3aGl0ZXNwYWNlcyBhbiBlaGVtZWxpZ2VuIGVsZW1lbnRncmVuemVuIGltIG91dHB1dAogICAga2VlcF9hdHRzX29yZGVyID0+IDEsICAgICAgICMgcmVxdWlyZXMgVGllOjpJeEhhc2gKICAgIGNvbW1lbnRzID0+ICdkcm9wJywKICAgIHN0YXJ0X3RhZ19oYW5kbGVycyA9PiB7CiAgICAJdGV4dHMgPT4gc3Vie3Jvb3QoQF8sICRjb3JwdXNIZWFkZXIpfQogICAgfSwKCiAgICB0d2lnX2hhbmRsZXJzID0+ICB7CiMJdGV4dCA9PiBcJnRleHQKCXRleHQgPT4gIHN1Ynt0ZXh0KEBfLCAkdGV4dEhlYWRlci0+Y29weSl9ICAgICMgICBjb3B5IG11c3QgYmUgYmVjYXVzZSB0ZXh0SGVhZGVyIHdpbGwgYmUgZmx1c2hlZCB3aXRoICR0d2lnIGluIHRoZSA8dGV4dD4gaGFuZGxlcjsKICAgIH0sCiAgICAjIGR0ZF9oYW5kbGVycyA9PiAgIHsgICAgICAgIyBUb0RvIGZvciBJNQogICAgIwlcJnNldF9kdGQ7CiAgICAjIH0KICAgIAogICAgb3V0cHV0X2VuY29kaW5nID0+ICRlbmNvZGluZywKICAgICk7CgokdHdpZy0+cGFyc2VmaWxlKCRBUkdWWzBdKTsKCgoKIyMjIyMjIyMjIyMKIyBFTkQgTUFJTgojIyMjIyMjIyMjIwoKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgICBTIFUgQiBSIE8gVSBUIEkgTiBFIFMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIHN1YiBzZXRfZHRkIFsKIyAgICBteSAkdHdpZywgJGR0ZCA9IEBfOwojICAgIG15ICRpbnRlcm5hbCA9IHFxfFxuUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiJcbiJEVEQveGh0bWwxLXN0cmljdC5kdGQifDsKIwojICAgICR0d2lnLT50d2lnX2RvY3R5cGUoJ2h0bWwnLCB1bmRlZiwgdW5kZWYsICRpbnRlcm5hbCk7CiMgICAgfQoKCgpzdWIgcm9vdCB7CiAgICBteSAoJHR3aWcsICRyb290LCAkY29ycHVzSGVhZGVyKSA9QF87CgogICAgaWYoJFRFSUZPUk1BVCBlcSAiVEVJIil7Cgkkcm9vdC0+c2V0X2dpKCd0ZWlDb3JwdXMnKTsKICAgIH0KICAgIGVsc2UgewoJJHJvb3QtPnNldF9naSgnaWRzQ29ycHVzJyk7CiAgICB9CiAgICAKICAgICRyb290LT5zZXRfYXR0KCJ4bWxucyIsICdodHRwOi8vd3d3LnRlaS1jLm9yZy9ucy8xLjAnKTsKCiAgICAmaW5zZXJ0Q29ycHVzSGVhZGVyKCRyb290LCAkY29ycHVzSGVhZGVyKTsKfQoKCgpzdWIgaW5zZXJ0Q29ycHVzSGVhZGVyewogICAgbXkgKCRyb290LCAkY29ycHVzSGVhZGVyKSA9QF87CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIHNldCBjb3JwdXMgaGVhZGVyCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgJnNldF90aXRsZSgkY29ycHVzSGVhZGVyLCAkc3JjZnVsbG5hbWVzeyRmbnNvdXJjZX0sICRmbnllYXIsICRraWVsaXBhbmtraUNvcnB1cyk7CgogICAgaWYoJFRFSUZPUk1BVCBlcSAiVEVJIil7Cgkmc2V0X3NvdXJjZURlc2MoJGNvcnB1c0hlYWRlciwgJHNyY2Z1bGxuYW1lc3skZm5zb3VyY2V9LCAkZm55ZWFyLCAka2llbGlwYW5ra2lDb3JwdXMpOwogICAgfQogICAgZWxzaWYgKCRURUlGT1JNQVQgZXEgIkk1Iil7CgkkY29ycHVzSGVhZGVyLT5nZXRfeHBhdGgoImZpbGVEZXNjL3RpdGxlU3RtdC9rb3JwdXNTaWdsZSIsMCkgIC0+c2V0X3RleHQoJGNvcnB1c3NpZ2xlc3skZm5zb3VyY2V9KTsKCSRjb3JwdXNIZWFkZXItPmdldF94cGF0aCgiZmlsZURlc2MvcHVibGljYXRpb25TdG10L3B1YkRhdGUiLDApLT5zZXRfdGV4dChsb2NhbHRpbWVbNV0gKyAxOTAwKTsKCSRjb3JwdXNIZWFkZXItPmdldF94cGF0aCgicHJvZmlsZURlc2MvbGFuZ1VzYWdlL2xhbmd1YWdlIiwwKSAgLT5zZXRfdGV4dCgkZXhwYW5kTGFuZ3skc3JjdGV4dGxhbmdzeyRmbnNvdXJjZX19KTsKCSRjb3JwdXNIZWFkZXItPmdldF94cGF0aCgicHJvZmlsZURlc2MvbGFuZ1VzYWdlL2xhbmd1YWdlIiwwKSAgLT5zZXRfYXR0KCdpZCcsICRzcmN0ZXh0bGFuZ3N7JGZuc291cmNlfSk7CgkkY29ycHVzSGVhZGVyLT5nZXRfeHBhdGgoJ2VuY29kaW5nRGVzYy9lZGl0b3JpYWxEZWNsL3RyYW5zZHVjdGlvbltAbj0iMiJdJywwKSAgLT5zZXRfdGV4dCgiSTUgdmVyc2lvbiBieSBFdVJlQ28gdXNpbmcgdnJ0MnRlaS5wbCAiIC4gbG9jYWx0aW1lLT55bWQoJy0nKSk7Cgkmc2V0X3NvdXJjZURlc2NJNSgkY29ycHVzSGVhZGVyKTsKICAgIH0KICAgIGVsc2V7CglwcmludCBTVERFUlIgIlRFSUZPUk1BVCBpcyAkVEVJRk9STUFUOyBtdXN0IGJlIFRFSSBvciBJNSI7CiAgICB9CgogICAgJGNvcnB1c0hlYWRlci0+cGFzdGUoImZpcnN0X2NoaWxkIiwgJHJvb3QpOwoKICAgIGlmKCRURUlGT1JNQVQgZXEgIkk1Iil7CgkkaWRzRG9jLT5wYXN0ZSgiYWZ0ZXIiLCAgICAgICAkY29ycHVzSGVhZGVyKTsKICAgIH0KfQogICAgCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGhhbmRsZXIgJnRleHQgZm9yIDx0ZXh0PgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3ViIHRleHQgewogICAgbXkgKCR0d2lnLCAkdGV4dCwgJHRleHRIZWFkZXIpID0gQF87CgogICAgJHRleHRjb3VudGVyKys7ICAgICAgICAgICAgICAgCgogICAgCiAgICAjIFRvRG86IGNhdGNoIGFsbCBvdGhlciwgdW5leHBlY3RlZCBjaGlsZHJlbiBvZiByb290CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIEdldCB0ZXh0IG1ldGFkYXRhIChhdHRyaWJ1dGVzIG9mIDx0ZXh0PikgYW5kIGNyZWF0ZSB0ZWlIZWFkZXIgZm9yIDx0ZXh0PgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15ICR0ZXh0YXR0c3JlZiA9ICR0ZXh0LT5hdHRzKCk7ICAgICAgICAgICAgICAgIyAkdGV4dGF0dHNyZWYgaXMgbm93IGEgcmVmZXJlbmNlIHRvIGEgaGFzaCBhbmQgc2hvdWxkIGJlIHVzZWQgd2l0aCAnLT4nCgogICAgJmNyZWF0ZUlkc0RvYygkdGV4dGF0dHNyZWYpOwoKCgogICAgIyAmY3JlYXRlVGV4dEhlYWRlciByZXR1cm5zIHRoZSAkdGV4dElEOgogICAgbXkgJHRleHRJRCA9ICZjcmVhdGVUZXh0SGVhZGVyKCR0ZXh0LCAkdGV4dGF0dHNyZWYsICR0ZXh0SGVhZGVyKTsKICAgIAogICAgCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBjcmVhdGUgPFRFST4gb3IgPGlkc1RleHQ+IGZyb20gPHRleHQ+CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAjIHNldCB2cnQgPHRleHQ+IHRvIDxURUk+IGFuZCBkZWxldGUgYWxsIGF0dHJpYnV0ZXMgYWZ0ZXIgdGhleSB3ZXJlIHdlcmUgc2F2ZWQgYWJvdmUKICAgICR0ZXh0LT5kZWxfYXR0czsKICAgIAogICAgaWYoJFRFSUZPUk1BVCBlcSAiVEVJIil7CgkkdGV4dC0+c2V0X2dpKCJURUkiKTsKCSR0ZXh0LT5zZXRfYXR0KCd4bWw6aWQnLCAkdGV4dElEKTsKICAgIH0KICAgIGVsc2UgewoJJHRleHQgICAgLT5zZXRfZ2koImlkc1RleHQiKTsKCSR0ZXh0ICAgIC0+c2V0X2F0dCgndmVyc2lvbicsICIxLjAiKTsKIwkkdGV4dCAgICAtPm1vdmUoImxhc3RfY2hpbGQiLCAkaWRzRG9jKTsgICAgICAgICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgd29yayBiZWNhdXNlIGFwcGFyZW50bHkgJGlkc0RvYyBpcyBub3QgdW5kZXIgJHJvb3QgYXQgdGhpcyBwb2ludAoKICAgIH0KCiAgICAKICAgIAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBjcmVhdGUgdGhlIDx0ZWk6dGV4dD4sIDxib2R5PiwgPGRpdj4gZWxlbWVudHMgaW5zaWRlIDxURUk+CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15ICR0dGV4dF9lbGVtZW50ID0gWE1MOjpUd2lnOjpFbHQtPm5ldygndGV4dCcpOwogICAgbXkgJGJvZHlfZWxlbWVudCAgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCdib2R5Jyk7CiAgICBteSAkZGl2X2VsZW1lbnQgICA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ2RpdicpOwoKICAgICMgc2V0IGF0dHMKICAgICRkaXZfZWxlbWVudCAgLT5zZXRfYXR0KCJ0eXBlIiwgInBhZ2UiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICMgVG9EbzogdGhpcyBpcyBzcGVjaWZpYyB0byBLTEsKICAgICR0dGV4dF9lbGVtZW50LT5zZXRfYXR0KCJ4bWw6bGFuZyIsICdmaScpOyAgICAgICAgICAgICAgICAgICAgICAgICMgYXMgaW4gSUNDLU5PUgoKICAgICMgcGFzdGUKICAgICR0dGV4dF9lbGVtZW50LT5wYXN0ZSgnbGFzdF9jaGlsZCcsICAkdGV4dCk7CiAgICAkYm9keV9lbGVtZW50IC0+cGFzdGUoJ2xhc3RfY2hpbGQnLCAgJHR0ZXh0X2VsZW1lbnQpOwogICAgJGRpdl9lbGVtZW50ICAtPnBhc3RlKCdsYXN0X2NoaWxkJywgICRib2R5X2VsZW1lbnQpOwoKICAgIAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgY3JlYXRlIDxwPiBmcm9tIDxwYXJhZ3JhcGg+CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICBteSBAcGFyYWdyYXBocyA9ICR0ZXh0LT5jaGlsZHJlbiggJ3BhcmFncmFwaCcpOwoKICAgIGZvcmVhY2ggbXkgJHBhcmFncmFwaCAoQHBhcmFncmFwaHMpIHsKCQoJJnNldFAoJHBhcmFncmFwaCk7CgoJJHBhcmFncmFwaC0+bW92ZSgnbGFzdF9jaGlsZCcsICRkaXZfZWxlbWVudCk7CgkKCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSMgY3JlYXRlIDxzPiBmcm9tIDxzZW50ZW5jZT4KCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQoJbXkgQHNlbnRlbmNlcyA9ICRwYXJhZ3JhcGgtPmNoaWxkcmVuKCdzZW50ZW5jZScpOwoJZm9yZWFjaCBteSAkc2VudGVuY2UgKEBzZW50ZW5jZXMpIHsKCgkgICAgJnNldFMoJHNlbnRlbmNlKTsKCgoJICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgICMgY3JlYXRlIDx3PiAod29yZCkgZnJvbSBlYWNoICRsaW5lCgkgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICAgCgkgICAgbXkgQGxpbmVzID0gc3BsaXQoL1xuKy8sICRzZW50ZW5jZS0+eG1sX3RleHQpOwoJICAgICRzZW50ZW5jZS0+c2V0X3RleHQoIlxuIik7CgoJICAgIGZvciBteSAkbGluZSAoQGxpbmVzKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRvZG86IFJlaWhlbmZvbGdlIGNoZWNrZW4KCQlpZigkbGluZSBuZSAiIiApewoJCSAgICBteSAkd19lbGVtZW50ID0gWE1MOjpUd2lnOjpFbHQtPm5ldygndycpOwoJCSAgICAmY3JlYXRlVygkd19lbGVtZW50LCAkbGluZSk7CgkJICAgICR3X2VsZW1lbnQtPnBhc3RlKCdsYXN0X2NoaWxkJywgJHNlbnRlbmNlKTsKCQl9CgkgICAgfSAjIGVuZCB3b3JkcwoJfSAjIGVuZCBzZW50ZW5jZXMKICAgIH0gIyBlbmQgcGFyYWdyYXBocwoKICAgICMgJHR3aWctPnNldF9wcmV0dHlfcHJpbnQoICdyZWNvcmQnKTsKICAgICMgJHR3aWctPmZsdXNoKCRPVVQpOwogICAgJHR3aWctPmZsdXNoKCIvZGV2L3N0ZG91dCIpOwp9CgpzdWIgY3JlYXRlVGV4dEhlYWRlcnsKICAgIG15ICgkdGV4dCwgJHRleHRhdHRzcmVmLCAkdGV4dEhlYWRlcikgPSBAXzsKICAgIAogICAgIyBVU0UgMDEgYmluZGluZ19pZD0iMjI0NjAyNSIKICAgICMgVVNFIDAyIGRhdGU9IjIwMjEtMDEtMTUiCiAgICAjICAgICAwMyBkYXRlZnJvbT0iMjAyMTAxMTUiCiAgICAjICAgICAwNCBkYXRldG89IjIwMjEwMTE1IgogICAgIyAgICAgMDUgZWxlY19kYXRlPSJfIgogICAgIyAgICAgMDYgZmlsZT0iIgogICAgIyBVU0UgMDcgZmlsZW5hbWVfbWV0YWRhdGE9ImZpbmNsYXJpbl9zaWlydG9fazIwMjEvMDAzOS01NTUyLzIwMjEvYWx0by8yMjQ2MDI1XzAwMzktNTU1Ml8yMDIxLTAxLTE1X1NLMDIyMV9tZXRzLnhtbCIKICAgICMgVVNFIDA4IGZpbGVuYW1lX29yaWcgICAgPSJmaW5jbGFyaW5fc2lpcnRvX2syMDIxLzAwMzktNTU1Mi8yMDIxL2FsdG8vMjI0NjAyNV8wMDM5LTU1NTJfMjAyMS0wMS0xNV9TSzAyMjFfcGFnZS0yMDIxMDExNTAyMjEwMDMwMzAxLnhtbAogICAgIyBVU0UgMDkgaWQ9InQtYmNkMGYzZmEtYmJkM2RhYzQiCiAgICAjICAgICAxMCBpbWdfdXJsPSIiCiAgICAjIFVTRSAxMSBpc3N1ZV9kYXRlPSIxNS4wMS4yMDIxIgogICAgIyBVU0UgMTIgaXNzdWVfbm89IlNLMDIyMSIKICAgICMgVVNFIDEzIGlzc3VlX3RpdGxlPSJTdW9tZW4gS3V2YWxlaHRpIgogICAgIyBVU0UgMTQgbGFiZWw9IlN1b21lbiBLdXZhbGVodGkgbm8uIFNLMDIyMSAxNS4wMS4yMDIxIgogICAgIyBVU0UgMTYgbGFuZ3VhZ2U9ImZpIgogICAgIyBVU0UgMTcgcGFnZV9pZD0icDEiCiAgICAjIFVTRSAxOCBwYWdlX25vPSJOb25lIgogICAgIyAgICAgMTkgcGFydF9uYW1lPSJfIgogICAgIyAgICAgMjAgcHVibF9pZD0iMDAzOS01NTUyIgogICAgIyAgICAgMjEgcHVibF9wYXJ0PSIiCiAgICAjIFVTRSAyMiBwdWJsX3RpdGxlPSJTdW9tZW4gS3V2YWxlaHRpIiAKICAgICMgVVNFIDIzIHB1YmxfdHlwZT0iYWlrYWthdXNpIgogICAgIyBVU0UgMjQgc2VudGNvdW50PSI3MCIKICAgICMgVVNFIDI1IHN1bV9sYW5nPSJ8eHh4OjQ0fGZpbjoyM3xlbmc6M3wiCiAgICAjICAgICAyNiB0aW1lZnJvbT0iMDAwMDAwIgogICAgIyAgICAgMjcgdGltZXRvPSIyMzU5NTkiCiAgICAjIFVTRSAyOCB0b2tlbmNvdW50PSIzMDQiCiAgICAjICAgICAyOSB2ZXJzaW9uX2FkZGVkPSJLTEstZmktMjAyMSI+CgoKICAgIG15ICRCSUQgICAgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnYmluZGluZ19pZCd9OwogICAgbXkgJERBVEUgICAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydkYXRlJ307CiAgICBteSAkTUVUQUZJTEVOQU1FID0gJHRleHRhdHRzcmVmLT57J2ZpbGVuYW1lX21ldGFkYXRhJ307ICAgIAogICAgbXkgJE9SSUdGSUxFTkFNRSA9ICR0ZXh0YXR0c3JlZi0+eydmaWxlbmFtZV9vcmlnJ307CiAgICBteSAkSUQgICAgICAgICAgID0gJHRleHRhdHRzcmVmLT57J2lkJ307CiAgICBteSAkSVNTVUVEQVRFICAgID0gJHRleHRhdHRzcmVmLT57J2lzc3VlX2RhdGUnfTsKICAgIG15ICRJU1NVRU5PICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnaXNzdWVfbm8nfTsKICAgIG15ICRJU1NVRVRJVExFICAgPSAkdGV4dGF0dHNyZWYtPnsnaXNzdWVfdGl0bGUnfTsKICAgIG15ICRMQUJFTCAgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnbGFiZWwnfTsKICAgIG15ICRMQU5HVUFHRSAgICAgPSAkdGV4dGF0dHNyZWYtPnsnbGFuZ3VhZ2UnfTsKICAgIG15ICRQQUdFSUQgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsncGFnZV9pZCd9OwogICAgbXkgJFBBR0VOTyAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydwYWdlX25vJ307CiAgICBteSAkUFVCTFRJVExFICAgID0gJHRleHRhdHRzcmVmLT57J3B1YmxfdGl0bGUnfTsKICAgIG15ICRQVUJMVFlQRSAgICAgPSAkdGV4dGF0dHNyZWYtPnsncHVibF90eXBlJ307CiAgICBteSAkU0VOVENPVU5UICAgID0gJHRleHRhdHRzcmVmLT57J3NlbnRjb3VudCd9OwogICAgbXkgJFNVTUxBTkcgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydzdW1fbGFuZyd9OwogICAgbXkgJFRPS0VOQ09VTlQgICA9ICR0ZXh0YXR0c3JlZi0+eyd0b2tlbmNvdW50J307CgoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBEZXJpdmVkIE1ldGFkYXRhIHZhcmlhYmxlcwogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgbXkgQGRhdGVhcnJheSA9IHNwbGl0KCItIiwgJERBVEUpOwogICAgbXkgQGxhbmdhcnJheSA9IHNwbGl0KCJ8IiwgJFNVTUxBTkcpOwogICAgbXkgQG5hbWVhcnJheSA9IHNwbGl0KC9bXC5cL10vLCAkT1JJR0ZJTEVOQU1FKTsgICMgdXNlICRuYW1lYXJyYXlbNF0gYXMgSUQgZm9yIHRoZSBwYWdlCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgY3JlYXRlIHRleHRTaWdsZSB0byBiZSByZXR1cm5lZCBmcm9tIHRoaXMgZnVuY3Rpb24KICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgIyBTVUsyMS5KQU4uMDAwMDEKICAgIAogICAgbXkgJGNvcnB1c0lEID0gIlNVSyI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVG9EbyByZWFkIFRhYmxlIHdpdGggU291cmNlIG1ldGFkYXRhCiAgICBteSAkeXkgICAgICAgPSBzdWJzdHIoJGRhdGVhcnJheVswXSwgMiwgMik7ICAgICAgIyBzdWJzdHIgRVhQUixPRkZTRVQsTEVOR1RICiAgICBteSAkbW0gICAgICAgPSAkZGF0ZWFycmF5WzFdOyAgICAgICAgICAgICAgICAgICAgIyBzdWJzdHIgRVhQUixPRkZTRVQsTEVOR1RICiAgICBteSAkTU1NICAgICAgPSAkbW9udGhzeyRtbX07CgogICAgbXkgJHRleHRJRCA9ICRjb3JwdXNJRCAuICR5eSAuICJfIiAuICRNTU0gLiAiLiIgLiBzcHJpbnRmKCIlMDVkIiwgJGRvY2NvdW50ZXJ7JG1tfSsrKTsKICAgIG15ICR0ZXh0U2lnbGUgPSAkdGV4dElEOwogICAgCiAgICAKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBDUkVBVEUgdGV4dC10ZWlIZWFkZXIgQUNDT1JESU5HIFRPIFRIRSBTS0VMRVRPTiBpbiAkdGV4dEhlYWRlcgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKICAgICR0ZXh0SGVhZGVyLT5wYXN0ZSgnZmlyc3RfY2hpbGQnLCAkdGV4dCk7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIDx0ZWlIZWFkZXI+CiAgICAjICAgPGZpbGVEZXNjIG49IkV1UmVDby1LTEstRklOX1skSURdIj4KICAgICMgICAgIDx0aXRsZVN0bXQ+CiAgICAjICAgICAgIDx0aXRsZT5bJExBQkVMLCBwYWdlICRQQUdFTk9dPC90aXRsZT4JCgogICAgJHRleHRIZWFkZXItPmZpcnN0X2NoaWxkKCJmaWxlRGVzYyIpICAgLT4gIHNldF9hdHQoJ24nLCAiRXVSZUNvLSIuICRraWVsaXBhbmtraUNvcnB1cyAuICRJRCk7CgoKICAgICMtLS0tLS0tLS0tLS0tLS0tLQogICAgIyB0aXRsZVN0bXQKICAgICMtLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15ICR0aXRsZT0idGl0bGUiOwogICAgbXkgJHRpdGxlU3RtdCA9ICR0ZXh0SGVhZGVyLT5maXJzdF9jaGlsZCgiZmlsZURlc2MiKS0+Zmlyc3RfY2hpbGQoInRpdGxlU3RtdCIpOwogICAgCiAgICBpZigkVEVJRk9STUFUIGVxICJJNSIpewoJJHRpdGxlID0gInQudGl0bGUiOwkKCSR0ZXh0U2lnbGUgPX4gcy9fL1wvL2c7CgkkdGl0bGVTdG10LT5maXJzdF9jaGlsZCgidGV4dFNpZ2xlIiktPnNldF90ZXh0KCR0ZXh0U2lnbGUpOwogICAgfTsKICAgIAogICAgJHRpdGxlU3RtdC0+Zmlyc3RfY2hpbGQoJHRpdGxlKS0+c2V0X3RleHQoJExBQkVMIC4gIiwgVGV4dCAjIiAuICR0ZXh0Y291bnRlcik7CgogICAgIyBDYXNlIEtMSzsgIFBBR0VOTyBzY2hlaW50IG1laXN0ICJOb25lIiB6dSBzZWluCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIDxmaWxlRGVzYz4KICAgICMgIDxzb3VyY2VEZXNjPgogICAgIyAgIDxiaWJsU3RydWN0PgogICAgIyAgICAgIDxhbmFseXRpYz4KICAgICMgICAgICAgICA8dGl0bGUgdHlwZT0ibWFpbiI+WyRMQUJFTCwgcGFnZSAkUEFHRU5PXTwvdGl0bGU+CiAgICAjICAgICAgICAgPGRhdGU+WyREQVRFXTwvZGF0ZT4KICAgICMgICAgICAgICA8ZGF0ZSB0eXBlPSJ5ZWFyIj5UT0RPPC9kYXRlPgogICAgIyAgICAgICAgIDxkYXRlIHR5cGU9Im1vbnRoIj5UT0RPPC9kYXRlPgogICAgIyAgICAgICAgIDxkYXRlIHR5cGU9ImRheSI+VE9ETzwvZGF0ZT4KICAgICMgICAgICAgICA8aWRubyB0eXBlPSJQQUdFSUQiPiRQQUdFSUQ8L2lkbm8+CiAgICAjICAgICAgICAgPGlkbm8gdHlwZT0iQklORElOR0lEIj4kQklEPC9pZG5vPgogICAgIyAgICAgICAgIDxpZG5vIHR5cGU9IklEIj4kSUQ8L2lkbm8+CiAgICAjICAgICAgICAgPGlkbm8gdHlwZT0iS0lFTElQQU5LS0lfTUVUQUZJTEVOQU1FIj4kTUVUQUZJTEVOQU1FPC9pZG5vPgogICAgIyAgICAgICAgIDxpZG5vIHR5cGU9IktJRUxJUEFOS0tJX09SSUdGSUxFTkFNRSI+JE9SSUdGSUxFTkFNRTwvaWRubz4KICAgICMgICAgICAgICA8dGV4dExhbmc+JExBTkdVQUdFPC90ZXh0TGFuZz4KCiAgICBteSAkYW5hbHl0aWMgID0gJHRleHRIZWFkZXItPmdldF94cGF0aCgiLi9maWxlRGVzYy9zb3VyY2VEZXNjL2JpYmxTdHJ1Y3QvYW5hbHl0aWMiLCAwKTsKICAgIGlmKCRURUlGT1JNQVQgZXEgIkk1Iil7JHRpdGxlPSJoLnRpdGxlIn07CiAgICAKICAgIAogICAgJGFuYWx5dGljLT5maXJzdF9jaGlsZCgkdGl0bGUpICAgICAgICAgICAgICAgICAgICAtPnNldF90ZXh0KCRMQUJFTCAuICIsIFRleHQgIyIgLiAkdGV4dGNvdW50ZXIpOyAgICMgQ2FzZSBLTEs7IFBBR0VOTyBzY2hlaW50IG1laXN0ICJOb25lIiB6dSBzZWluCiAgICAjJGFuYWx5dGljLT5nZXRfeHBhdGgoJy4vaWRub1tAdHlwZT0iUEFHRUlEIl0nLCAgICAgICAwKSAgICAgLT5zZXRfdGV4dCgkUEFHRUlEKTsKICAgICMkYW5hbHl0aWMtPmdldF94cGF0aCgnLi9pZG5vW0B0eXBlPSJCSU5ESU5HSUQiXScsICAgIDApICAgICAtPnNldF90ZXh0KCRCSUQpOwogICAgIyRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2lkbm9bQHR5cGU9IklEIl0nLCAgICAgICAgICAgMCkgICAgIC0+c2V0X3RleHQoJElEKTsKICAgICMkYW5hbHl0aWMtPmdldF94cGF0aCgnLi9pZG5vW0B0eXBlPSJLSUVMSVBBTktLSV9NRVRBRklMRU5BTUUiXScsIDApICAgICAtPnNldF90ZXh0KCRNRVRBRklMRU5BTUUpOwogICAgIyRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2lkbm9bQHR5cGU9IktJRUxJUEFOS0tJX09SSUdGSUxFTkFNRSJdJywgMCkgICAgIC0+c2V0X3RleHQoJE9SSUdGSUxFTkFNRSk7CiAgICBpZigkVEVJRk9STUFUIGVxICJURUkiKXsKCSRhbmFseXRpYy0+Zmlyc3RfY2hpbGQoJ3RleHRMYW5nJykgICAgICAgICAgICAgICAgICAgICAgICAtPnNldF90ZXh0KCRMQU5HVUFHRSk7CiAgICB9CiAgICAKICAgICMgIDxtb25vZ3I+CiAgICAjICAgIDx0aXRsZT4kUFVCTFRJVExFPC90aXRsZT4KICAgICMgICAgPGltcHJpbnQ+CiAgICAjICAgICAgPHB1YlBsYWNlPlRPRE88L3B1YlBsYWNlPgogICAgIyAgICAgIDxwdWJsaXNoZXI+VE9ETzwvcHVibGlzaGVyPgogICAgIyAgICA8L2ltcHJpbnQ+CiAgICAjICAgIDxiaWJsU2NvcGUgdW5pdD0iSVNTVUVUSVRMRSIvPgogICAgIyAgICA8YmlibFNjb3BlIHVuaXQ9IklTU1VFTk8iLz4KICAgICMgICAgPGJpYmxTY29wZSB1bml0PSJJU1NVRURBVEUiLz4KICAgICMgICAgPGJpYmxTY29wZSB1bml0PSJwcCI+JFBBR0VOTzwvYmlibFNjb3BlPgoKICAgIG15ICRtb25vZ3IgID0gJHRleHRIZWFkZXItPmdldF94cGF0aCgiLi9maWxlRGVzYy9zb3VyY2VEZXNjL2JpYmxTdHJ1Y3QvbW9ub2dyIiwgMCk7CgogICAgJG1vbm9nci0+Zmlyc3RfY2hpbGQoJHRpdGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0X3RleHQoJFBVQkxUSVRMRSk7CiAgICBpZigkVEVJRk9STUFUIGVxICJURUkiKXsKCSRtb25vZ3ItPmdldF94cGF0aCgnLi9pbXByaW50L2RhdGVbQHR5cGU9ImRhdGUiXScsICAgMCkgICAgICAgICAtPnNldF90ZXh0KCREQVRFKTsKICAgIH0KICAgIG15ICRkYXRlID0gImRhdGUiOwogICAgaWYoJFRFSUZPUk1BVCBlcSAiSTUiKXskZGF0ZT0icHViRGF0ZSJ9OwogICAgJG1vbm9nci0+Z2V0X3hwYXRoKCcuL2ltcHJpbnQvJyAuICRkYXRlIC4gJ1tAdHlwZT0ieWVhciJdJywgICAwKSAgICAgICAgIC0+c2V0X3RleHQoJGRhdGVhcnJheVswXSk7CiAgICAkbW9ub2dyLT5nZXRfeHBhdGgoJy4vaW1wcmludC8nIC4gJGRhdGUgLiAnW0B0eXBlPSJtb250aCJdJywgIDApICAgICAgICAgLT5zZXRfdGV4dCgkZGF0ZWFycmF5WzFdKTsKICAgICRtb25vZ3ItPmdldF94cGF0aCgnLi9pbXByaW50LycgLiAkZGF0ZSAuICdbQHR5cGU9ImRheSJdJywgICAgMCkgICAgICAgICAtPnNldF90ZXh0KCRkYXRlYXJyYXlbMl0pOyAgICAKICAgICRtb25vZ3ItPmZpcnN0X2NoaWxkKCJpbXByaW50IiktPmZpcnN0X2NoaWxkKCJwdWJQbGFjZSIpICAgICAgICAtPnNldF90ZXh0KCRzcmNwdWJwbGFjZXN7JFBVQkxUSVRMRX0pOyAgIyBpbXByaW50IGlzIG5lZWRlZCBmb3IgdGVpIHZhbGlkaXR5CiAgICAkbW9ub2dyLT5maXJzdF9jaGlsZCgiaW1wcmludCIpLT5maXJzdF9jaGlsZCgicHVibGlzaGVyIikgICAgICAgLT5zZXRfdGV4dCgkc3JjcHVibGlzaGVyc3skUFVCTFRJVExFfSk7ICMgaW1wcmludCBpcyBuZWVkZWQgZm9yIHRlaSB2YWxpZGl0eQogICAgIyRtb25vZ3ItPmdldF94cGF0aCgnLi9iaWJsU2NvcGVbQHVuaXQ9IklTU1VFVElUTEUiXScsIDApICAgICAgICAtPnNldF90ZXh0KCRJU1NVRVRJVExFKTsKICAgICMkbW9ub2dyLT5nZXRfeHBhdGgoJy4vYmlibFNjb3BlW0B1bml0PSJJU1NVRU5PIl0nLCAwKSAgICAgICAgICAgLT5zZXRfdGV4dCgkSVNTVUVOTyk7CiAgICAjJG1vbm9nci0+Z2V0X3hwYXRoKCcuL2JpYmxTY29wZVtAdW5pdD0iSVNTVUVEQVRFIl0nLCAwKSAgICAgICAgIC0+c2V0X3RleHQoJElTU1VFREFURSk7CiAgICAjJG1vbm9nci0+Z2V0X3hwYXRoKCcuL2JpYmxTY29wZVtAdW5pdD0icHAiXScsIDApICAgICAgICAgICAgICAgIC0+c2V0X3RleHQoJFBBR0VOTyk7ICAgICAgICAjIEFjaHR1bmcgLSBQQUdFTk8gc2NoZWludCBtZWlzdCAiTm9uZSIgenUgc2VpbgoKICAgIG15ICRkYXRlTmljZSAgICAgID0gJGRhdGVhcnJheVsyXSAuICIuIiAuICRkYXRlYXJyYXlbMV0gLiAiLiIgLiAkZGF0ZWFycmF5WzBdOyAKICAgIG15ICRkYXRlQmFja3dhcmRzID0gJGRhdGVhcnJheVswXSAuICIuIiAuICRkYXRlYXJyYXlbMV0gLiAiLiIgLiAkZGF0ZWFycmF5WzJdOyAKICAgIAogICAgaWYoJFRFSUZPUk1BVCBlcSAiSTUiKXsKCW15ICRyZWZDb21wbGV0ZVRleHQgPSAkdGV4dFNpZ2xlIC4gIiAiIC4gJFBVQkxUSVRMRSAuICIgbm8uICIgLiAkSVNTVUVOTyAuICIsIFsiIC4gJFBVQkxUWVBFIC4gIl0sICIgLiAkZGF0ZU5pY2U7CglteSAkcmVmU2hvcnRUZXh0ICAgID0gJHRleHRTaWdsZSAuICIgIiAuICRQVUJMVElUTEUgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgIiAuICRkYXRlTmljZTsKCSR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoJy4vZmlsZURlc2Mvc291cmNlRGVzYy9yZWZlcmVuY2VbQHR5cGU9ImNvbXBsZXRlIl0nLCAwKSAtPiBzZXRfdGV4dCgkcmVmQ29tcGxldGVUZXh0KTsKCSR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoJy4vZmlsZURlc2Mvc291cmNlRGVzYy9yZWZlcmVuY2VbQHR5cGU9InNob3J0Il0nICAgLCAwKSAtPiBzZXRfdGV4dCgkcmVmU2hvcnRUZXh0KTsKICAgIH0KCiAgICAKICAgICMgIDxlbmNvZGluZ0Rlc2M+CiAgICAjICAgIDx0YWdzRGVjbD4KICAgICMgICAgICA8bmFtZXNwYWNlIG5hbWU9Imh0dHA6Ly93d3cudGVpLWMub3JnL25zLzEuMCI+CiAgICAjICAgICAgICA8dGFnVXNhZ2UgZ2k9InMiIG9jY3Vycz0iU0VOVENPVU5UIi8+CiAgICAjICAgICAgICA8dGFnVXNhZ2UgZ2k9InciIG9jY3Vycz0iVE9LRU5DT1VOVCIvPgoKICAgIG15ICRuYW1lc3BhY2VQYXRoPSIuL2VuY29kaW5nRGVzYy90YWdzRGVjbC9uYW1lc3BhY2UvIjsKICAgIGlmKCRURUlGT1JNQVQgZXEgIkk1Iil7JG5hbWVzcGFjZVBhdGg9Ii4vZW5jb2RpbmdEZXNjL3RhZ3NEZWNsLyJ9OwogICAgCiAgICAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCRuYW1lc3BhY2VQYXRoIC4gJ3RhZ1VzYWdlW0BnaT0icyJdJywgMCkgICAgICAtPiBzZXRfYXR0KCdvY2N1cnMnLCAkU0VOVENPVU5UKTsKICAgICR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoJG5hbWVzcGFjZVBhdGggLiAndGFnVXNhZ2VbQGdpPSJ3Il0nLCAwKSAgICAgIC0+IHNldF9hdHQoJ29jY3VycycsICRUT0tFTkNPVU5UKTsKIAogICAgIyAgPHByb2ZpbGVEZXNjPgogICAgIyAgICA8bGFuZ1VzYWdlPgogICAgIyAgICAgPGxhbmd1YWdlIGlkZW50PSJmaSIgdXNhZ2U9Inx4eHg6NDR8ZmluOjIzfGVuZzozfCIvPgogICAgIyAgIDwvbGFuZ1VzYWdlPgogICAgIyAgICA8dGV4dENsYXNzPgogICAgIyAgICAgIDxjbGFzc0NvZGUgc2NoZW1lPSJraWVsaXBhbmtraV9rbGsiPiRQVUJMVFlQRTwvY2xhc3NDb2RlPgogICAgIyAgICAgIDxjbGFzc0NvZGUgc2NoZW1lPSJraWVsaXBhbmtraV9rbGtfbWFwcGVkIj4kbWFwcGluZ3skUFVCTFRZUEV9PC9jbGFzc0NvZGU+CgogICAgaWYoJFRFSUZPUk1BVCBlcSAiSTUiKXsKCSR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoJy4vcHJvZmlsZURlc2MvY3JlYXRpb24vY3JlYXREYXRlJywgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0X3RleHQoJGRhdGVCYWNrd2FyZHMpOwogICAgfQogICAgCiAgICAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCcuL3Byb2ZpbGVEZXNjL2xhbmdVc2FnZS9sYW5ndWFnZScsIDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnNldF9hdHQoJ2lkZW50JywgJExBTkdVQUdFKTsKICAgICR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoJy4vcHJvZmlsZURlc2MvbGFuZ1VzYWdlL2xhbmd1YWdlJywgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0X2F0dCgndXNhZ2UnLCAkU1VNTEFORyk7CiAgICAjIGluIEB1c2FnZSBtdXNzIGVpZ3QuIGVpbiBpbnRlZ2VyOyBhbSBiZXN0ZW4gaW5oYWx0IHZvbiBTVU1MQU5HIGF1ZmRyb2VzZWxuIHVuZCBtZWhyZXJlIDxsYW5ndWFnZT4gbWFjaGVuCgogICAgJHRleHRIZWFkZXItPmdldF94cGF0aCgnLi9wcm9maWxlRGVzYy90ZXh0Q2xhc3MvY2xhc3NDb2RlW0BzY2hlbWU9ImtpZWxpcGFua2tpX2tsayJdJywgMCkgICAgICAgLT5zZXRfdGV4dCgkUFVCTFRZUEUpOwogICAgJHRleHRIZWFkZXItPmdldF94cGF0aCgnLi9wcm9maWxlRGVzYy90ZXh0Q2xhc3MvY2xhc3NDb2RlW0BzY2hlbWU9ImtpZWxpcGFua2tpX2tsa19tYXBwZWQiXScsIDApLT5zZXRfdGV4dCgkbWFwcGluZ3skUFVCTFRZUEV9KTsKCiAgICAjICA8cmV2aXNpb25EZXNjPgogICAgIyAgICA8Y2hhbmdlIHdoZW49IlRPRE8iIHdobz0iSEwiPlRFSSB2ZXJzaW9uIGZvciBFdVJlQ288L2NoYW5nZT4KCiAgICAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCcuL3JldmlzaW9uRGVzYy9jaGFuZ2UnLCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0X2F0dCgnd2hlbicsIGxvY2FsdGltZS0+eW1kKCctJykpOwogICAgCiAgICByZXR1cm4gJHRleHRJRDsKCiAgICAKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBFTkQgT0YgQ1JFQVRJTkcgVEVJSEVBREVSCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAp9CgpzdWIgc2V0UCB7CiAgICBteSAoJHBhcmFncmFwaCkgPSBAXzsKICAgIAogICAgJHBhcmFncmFwaC0+c2V0X2dpKCdwJyk7CiAgICAKICAgICMgPHBhcmFncmFwaCBpZD0icC1iY2QwZjNmYS1iYmQzZGFjNC04MTVlYWQ3YSIgc3VtX2xhbmc9InxmaW46MXwiPgogICAgIyBhdHRzIG9mIDxwYXJhZ3JhcGg+OgogICAgIyAgICBAaWQgICAgICAgIFVTRQogICAgIyAgICBAc3VtX2xhbmcgIFVTRTogcHV0IGluIHhtbDpsYW5nIGFuZCBwcmVmaXggdGhlIHZhbHVlIHdpdGggIngtIiBmb3IgcHJpdmF0ZSB2YWx1ZQogICAgCiAgICAkcGFyYWdyYXBoLT5zZXRfYXR0KCJ4bWw6bGFuZyIsICJ4LSIgLiAkcGFyYWdyYXBoLT5hdHQoInN1bV9sYW5nIikpOwogICAgJHBhcmFncmFwaC0+ZGVsX2F0dCgic3VtX2xhbmciKTsKICAgICMgJHBhcmFncmFwaC0+Y2hhbmdlX2F0dF9uYW1lKCdpZCcsICd4bWw6aWQnKTsKICAgICRwYXJhZ3JhcGgtPmRlbF9hdHQoImlkIik7ICAgICAgICAgICAgICAjIGRpZXNlIGlkIGlzdCBhdWNoIG5pY2h0IGVpbmRldXRpZyEhCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKc3ViIHNldFMgewogICAgbXkgKCRzZW50ZW5jZSkgPSBAXzsKICAgIAogICAgJHNlbnRlbmNlLT5zZXRfZ2koJ3MnKTsKCSAgICAKICAgICMgdGhlIGF0dHMgb2YgPHNlbnRlbmNlPjoKICAgICMgICAgVVNFICAgMSBAaWQ9InMtYmNkMGYzZmEtYmJkM2RhYzQtZjc0MjkwOTAiCiAgICAjICAgIFVTRSAgIDIgQGxhbmc9ImZpbiIgLT4geG1sOmxhbmcgCiAgICAjICAgID8gICAgIDMgQGxhbmdfY29uZj0iMC42NzM0ODUzIj4gLT4gVG9EbyBAY2VydCA/CSAgICAKICAgIAogICAgIyBzZXQgYXR0cnMgb2YgPHM+CiAgICAkc2VudGVuY2UtPnNldF9hdHQoInhtbDpsYW5nIiwgJHNlbnRlbmNlLT5hdHQoImxhbmciKSk7ICAjIFRvRG86IGNvbnZlcnQgdGhlIHZhbHVlIC8gaW50cm9kdWNlIGEgaGFzaCBmb3IgbG9va3VwIChpbnB1dCB2YWx1ZXM6ICJmaW4iLCAieHh4IiwgLi4uLikKICAgICMgJHNlbnRlbmNlLT5jaGFuZ2VfYXR0X25hbWUoJ2lkJywgJ3htbDppZCcpOyAgICAgICAgICAgICMgbmljaHQgZWluZGV1dGlnCiAgICAkc2VudGVuY2UtPmRlbF9hdHQoJ2lkJyk7CiAgICAkc2VudGVuY2UtPmRlbF9hdHQoImxhbmciKTsgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBsYWNlZCBieSB4bWw6bGFuZwogICAgJHNlbnRlbmNlLT5kZWxfYXR0KCJsYW5nX2NvbmYiKTsgICAgICAgICAgICAgICAgICAgICMgZm9yIHRoZSB0aW1lIGJlaW5nCiAgICAKfQoKc3ViIGNyZWF0ZVcgewogICAgbXkgKCR3X2VsZW1lbnQsICRsaW5lKSA9IEBfOwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgR2V0IHRoZSB0YWdzICg9Y29sdW1ucykKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgbXkgQHRhZ3MgPSBzcGxpdCgvXHQvLCAkbGluZSk7CiAgICAKICAgICMgc2V0IGNvbnRlbnQgb2YgPHc+IGkuZS4gdGhlIHRva2VuCiAgICAjICR3X2VsZW1lbnQtPnNldF90ZXh0KCR0YWdzWzBdKTsKICAgIG15ICRyYW5kb21fdyA9IERhdGE6OlJhbmRvbTo6U3RyaW5nLT5jcmVhdGVfcmFuZG9tX3N0cmluZyhsZW5ndGg9Pmxlbmd0aCgkdGFnc1swXSksIGNvbnRhaW5zPT4nYWxwaGEnKTsKICAgICR3X2VsZW1lbnQtPnNldF90ZXh0KCRyYW5kb21fdyk7CiAgICAKICAgICMgdnJ0IHBvc2l0aW9uYWwtYXR0cmlidXRlcyBpbiBjb3JwdXMgS0xLOgogICAgIyAgVVNFIFswXSB3b3JkCiAgICAjICBVU0UgWzFdIHJlZiAgKGlkIGZvciByZWZlcmVuY2Ugb2YgZGVwaGVhZCkKICAgICMgIFVTRSBbMl0gbGVtbWEKICAgICMgID8gICBbM10gbGVtbWFjb21wICAgKGxlbW1hIHdpdGggY29tcG91bmQgaW5mbyAtIGNvdWxkIGdvIGluIEBub3JtLCBhcyB0YWcgYWJ1c2U/KQogICAgIyAgVVNFIFs0XSBwb3MgCiAgICAjICBVU0UgWzVdIG1zZCAKICAgICMgIFVTRSBbNl0gZGVwaGVhZAogICAgIyAgVVNFIFs3XSBkZXByZWwgCiAgICAjICAgICAgWzhdIGNvbnRlbnQgICAob2NyLXByb2Nlc3MpCiAgICAjICAgICAgWzldIHZwb3MgICAgICAob2NyLXByb2Nlc3MpCiAgICAjICAgICBbMTBdIG9jciAgICAgICAob2NyLXByb2Nlc3MpCiAgICAjICAgICBbMTFdIGNjICAgICAgICAob2NyLXByb2Nlc3MpCiAgICAjICAgICBbMTJdIGh5cGggICAgICAob2NyLXByb2Nlc3MpCiAgICAjICAgICBbMTNdIHN0eWxlICAgICAob2NyLXByb2Nlc3MpCiAgICAjICAgICBbMTRdIGxleCAgICAgICAoa29ycCBzZW1hbnRpYyBkaXNhbWJpZ3VhdGlvbiBmcm9tIEcib3RlYm9yZykKICAgIAogICAgIyBzZXQgdGhlIGF0dHJpYnV0ZXMgb2YgPHc+OgogICAgJHdfZWxlbWVudC0+c2V0X2F0dCgibiIsICAgICAgJHRhZ3NbMV0pOwogICAgIyAkd19lbGVtZW50LT5zZXRfYXR0KCJpZCIsICAgICAid18iIC4gJG5hbWVhcnJheVs0XSAuICRzZW50ZW5jZS0+YXR0KCJ4bWw6aWQiKSAuICJfIiAuICR0YWdzWzFdKTsKICAgICMgc28genVzYW1tZW5nZWJhdXRlIElEIGlzdCBhdWNoIG5pY2h0IGVpbmRldXRpZy4uLgogICAgJHdfZWxlbWVudC0+ZGVsX2F0dCgiaWQiKTsKICAgICMgJHdfZWxlbWVudC0+c2V0X2F0dCgibGVtbWEiLCAgJHRhZ3NbMl0pOwogICAgJHdfZWxlbWVudC0+c2V0X2F0dCgibGVtbWEiLCAgJHJhbmRvbV93KTsKCiAgICAjICR3X2VsZW1lbnQtPnNldF9hdHQoIm5vcm0iLCAgICR0YWdzWzNdKTsgICMgdGFnIGFidXNlIG9mIEBub3JtCiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJwb3MiLCAgICAkdGFnc1s0XSk7CiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJtc2QiLCAgICAkdGFnc1s1XSk7CiAgICAKICAgIGlmKCRURUlGT1JNQVQgZXEgIkk1Iil7ICAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgY29uZGl0aW9uIHdoZW4gcGFydCBvZiB0aGUgb2ZmaWNpYWwgVEVJCgkkd19lbGVtZW50LT5zZXRfYXR0KCJoZWFkIiwgICAkdGFnc1s2XSk7Cgkkd19lbGVtZW50LT5zZXRfYXR0KCJkZXByZWwiLCAkdGFnc1s3XSk7CiAgICB9Cn0KICAgIAoKc3ViIHNldF90aXRsZXsKICAgIG15ICgkY29ycHVzSGVhZGVyLCAkc291cmNlLCAkeWVhciwgJGtpZWxpcGFua2tpQ29ycHVzKSA9IEBfOwoKICAgIG15ICR0aXRsZUVsZW1lbnQgPSAidGl0bGUiOwogICAgCiAgICBpZigkVEVJRk9STUFUIGVxICJJNSIpewoJJHRpdGxlRWxlbWVudCA9ICJjLnRpdGxlIjsKICAgIH0KICAgIAogICAgbXkgJGNUaXRsZVN0cmluZyA9ICRzb3VyY2UgLiAiICIgLiAkeWVhciAuICIsIGZyb20gIi4gJGtpZWxpcGFua2tpQ29ycHVzIC4gIiBmb3IgRXVSZUNvIjsgICAgCgogICAgIzx0ZWlIZWFkZXI+CiAgICAjICA8ZmlsZURlc2M+CiAgICAjICAgIDx0aXRsZVN0bXQ+CiAgICAjICAgICAgPHRpdGxlPltBYW11bGVodGkyMDIxXSBmcm9tIFtrbGstZmktdjItdnJ0IGZvcl0gRXVSZUNvPC90aXRsZT4KICAgICMgICAgPC90aXRsZVN0bXQ+CiAgICAjICAgIDwhLS0gLi4uIC0tPgogICAgIyAgPC9maWxlRGVzYz4KICAgICM8L3RlaUhlYWRlcj4KCiAgICBteSAkY1RpdGxlTm9kZSA9ICRjb3JwdXNIZWFkZXItPmZpcnN0X2NoaWxkKCJmaWxlRGVzYyIpLT5maXJzdF9jaGlsZCgidGl0bGVTdG10IiktPmZpcnN0X2NoaWxkKCR0aXRsZUVsZW1lbnQpOwoKICAgICRjVGl0bGVOb2RlLT5zZXRfdGV4dCgkY1RpdGxlU3RyaW5nKTsKICAgIAp9CgpzdWIgc2V0X3NvdXJjZURlc2N7CiAgICBteSAoJGNvcnB1c0hlYWRlciwgJHNvdXJjZSwgJHllYXIsICRraWVsaXBhbmtraUNvcnB1cykgPSBAXzsKCiAgICBteSAkY0JpYmxTdHJpbmcgPSAkc291cmNlIC4gIiAiIC4gJHllYXIgLiAiLCBmcm9tICIuICRraWVsaXBhbmtraUNvcnB1cyAuICIgZm9yIEV1UmVDbyI7ICAgIAoKICAgICM8dGVpSGVhZGVyPgogICAgIyAgPGZpbGVEZXNjPgogICAgIyAgICA8IS0tIC4uLiAtLT4KICAgICMgICAgPHNvdXJjZURlc2M+CiAgICAjICAgICAgPGJpYmw+W0FhbXVsZWh0aTIwMjFdIGZyb20gW2tsay1maS12Mi12cnRdPC9iaWJsPgogICAgIyAgICA8L3NvdXJjZURlc2M+CiAgICAjICAgIDwhLS0gLi4uIC0tPgogICAgIyAgPC9maWxlRGVzYz4KICAgICM8L3RlaUhlYWRlcj4KCiAgICBteSAkY0JpYmxOb2RlID0gJGNvcnB1c0hlYWRlci0+Zmlyc3RfY2hpbGQoImZpbGVEZXNjIiktPmZpcnN0X2NoaWxkKCJzb3VyY2VEZXNjIiktPmZpcnN0X2NoaWxkKCJiaWJsIik7CgogICAgJGNCaWJsTm9kZS0+c2V0X3RleHQoJGNCaWJsU3RyaW5nKTsgICAgCn0KCnN1YiBzZXRfc291cmNlRGVzY0k1ewogICAgbXkgKCRjb3JwdXNIZWFkZXIpID0gQF87CgogICAgbXkgJFBVQkxUSVRMRSA9ICRzcmNmdWxsbmFtZXN7JGZuc291cmNlfTsKICAgIG15ICRQVUJMUExBQ0UgPSAkc3JjcHVicGxhY2VzeyRQVUJMVElUTEV9OwogICAgbXkgJFBVQkxJU0hFUiA9ICRzcmNwdWJsaXNoZXJzeyRQVUJMVElUTEV9OwogICAgbXkgJENTSUdMRSAgICA9ICRjb3JwdXNzaWdsZXN7JFBVQkxUSVRMRX07CgogICAgbXkgJFlFQVIgID0gJGZueWVhcjsKICAgIAoKICAgICM8aWRzSGVhZGVyPgogICAgIyAgPGZpbGVEZXNjPgogICAgIyAgICA8IS0tIC4uLiAtLT4KICAgICMgICAgPHNvdXJjZURlc2M+CiAgICAjICAgICAgPGJpYmxTdHJ1Y3Q+CiAgICAjICAgICAgICA8bW9ub2dyPgogICAgIyAgICAgICAgICA8aC50aXRsZSB0eXBlPSJtYWluIj5bJFBVQkxUSVRMRV0sIFskWUVBUl08L2gudGl0bGU+CiAgICAjICAgICAgICAgIDxpbXByaW50PgogICAgIyAgICAgICAgICAgIDxwdWJsaXNoZXI+WyRQVUJMSVNIRVJdPC9wdWJsaXNoZXI+CiAgICAjICAgICAgICAgICAgPHB1YlBsYWNlIGtleT0iREUiPlskUFVCUExBQ0VdPC9wdWJQbGFjZT4KICAgICMgICAgICAgICAgPC9pbXByaW50PgogICAgIyAgICAgICAgPC9tb25vZ3I+CiAgICAjICAgICAgPC9iaWJsU3RydWN0PgogICAgIyAgICAgIDxyZWZlcmVuY2UgdHlwZT0ic3VwZXIiIGFzc2VtYmxhZ2U9InJlZ3VsYXIiPlskS0tLXSBbJFBVQkxUSVRMRV07IFskUFVCUExBQ0VdOiBbJFBVQkxJU0hFUl0sIFskWUVBUl08L3JlZmVyZW5jZT4KICAgICMgICAgPC9zb3VyY2VEZXNjPiAgICAjICAgIDxzb3VyY2VEZXNjPgogICAgIyAgICA8IS0tIC4uLiAtLT4KICAgICMgIDwvZmlsZURlc2M+CiAgICAjPC90ZWlIZWFkZXI+CgogICAgbXkgJGNNb25vZ3IgPSAkY29ycHVzSGVhZGVyLT5maXJzdF9jaGlsZCgiZmlsZURlc2MiKS0+Zmlyc3RfY2hpbGQoInNvdXJjZURlc2MiKS0+Zmlyc3RfY2hpbGQoImJpYmxTdHJ1Y3QiKS0+Zmlyc3RfY2hpbGQoIm1vbm9nciIpOwogICAgJGNNb25vZ3ItPmZpcnN0X2NoaWxkKCJoLnRpdGxlIiktPnNldF90ZXh0KCRQVUJMVElUTEUpOwogICAgJGNNb25vZ3ItPmZpcnN0X2NoaWxkKCJpbXByaW50IiktPmZpcnN0X2NoaWxkKCJwdWJsaXNoZXIiKS0+c2V0X3RleHQoJFBVQkxJU0hFUik7CiAgICAkY01vbm9nci0+Zmlyc3RfY2hpbGQoImltcHJpbnQiKS0+Zmlyc3RfY2hpbGQoInB1YlBsYWNlIikgLT5zZXRfdGV4dCgkUFVCTFBMQUNFKTsKCiAgICAkY29ycHVzSGVhZGVyLT5maXJzdF9jaGlsZCgiZmlsZURlc2MiKS0+Zmlyc3RfY2hpbGQoInNvdXJjZURlc2MiKS0+Zmlyc3RfY2hpbGQoInJlZmVyZW5jZSIpLT5zZXRfdGV4dCgkQ1NJR0xFIC4gIiAiIC4gJFBVQkxUSVRMRSAuICI7ICIgLiAkUFVCTFBMQUNFIC4gIjogIiAuICRQVUJMSVNIRVIgLiAiLCAiIC4gJFlFQVIpOwoKfQoKCgpzdWIgY3JlYXRlSWRzRG9jewogICAgbXkgKCR0ZXh0YXR0c3JlZikgPSBAXzsKICAgIG15ICREQVRFICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnZGF0ZSd9OwogICAgbXkgJFBVQkxUSVRMRSA9ICR0ZXh0YXR0c3JlZi0+eydwdWJsX3RpdGxlJ307CiAgICBteSAkQ1NJR0xFICAgID0gJGNvcnB1c3NpZ2xlc3skUFVCTFRJVExFfTsKICAgIAogICAgI3ByaW50IFNUREVSUiAiTEFTVE1PTlRIOiAiIC4gJExBU1RNT05USCAuICJcbiI7CiAgICAjcHJpbnQgU1RERVJSICJEQVRFOiAiICAgICAuICAkREFURSAuICJcbiI7CgogICAgbXkgQGRhdGVhcnJheSA9IHNwbGl0KCItIiwgJERBVEUpOwogICAgbXkgJE1PTlRIID0gJGRhdGVhcnJheVsxXTsKICAgIG15ICRZRUFSICA9ICRkYXRlYXJyYXlbMF07CiAgICAKICAgIG15ICRET0NJRCA9ICAgICAkbW9udGhzeyRNT05USH07CiAgICBteSAkTU9OVEhOQU1FID0gJG1vbnRobmFtZXN7JE1PTlRIfTsKCgogICAgI3ByaW50IFNUREVSUiAiTU9OVEg6ICIgICAgIC4gICRNT05USCAuICJcblxuIjsKICAgIAogICAgbXkgJGlkc0RvY1N0cmluZz0iIjsKICAgIGlmKCRURUlGT1JNQVQgZXEgIkk1Iil7CgkkaWRzRG9jU3RyaW5nID0gIgo8aWRzRG9jPgo8aWRzSGVhZGVyIHR5cGU9XCJkb2N1bWVudFwiIHBhdHRlcm49XCJ0ZXh0XCIgdmVyc2lvbj1cIjEuMVwiIFRFSWZvcm09XCJ0ZWlIZWFkZXJcIj4KICA8ZmlsZURlc2M+CiAgICA8dGl0bGVTdG10PgogICAgICA8ZG9rdW1lbnRTaWdsZT4kQ1NJR0xFLyRET0NJRDwvZG9rdW1lbnRTaWdsZT4KICAgICAgPGQudGl0bGU+JFBVQkxUSVRMRSwgJE1PTlRITkFNRSAkWUVBUjwvZC50aXRsZT4KICAgIDwvdGl0bGVTdG10PgogICAgPHB1YmxpY2F0aW9uU3RtdD4KICAgICAgPGRpc3RyaWJ1dG9yLz4KICAgICAgPHB1YkFkZHJlc3MvPgogICAgICA8YXZhaWxhYmlsaXR5IHJlZ2lvbj1cIndvcmxkXCI+JGtpZWxpcGFua2tpTGljZW5zZTwvYXZhaWxhYmlsaXR5PgogICAgICA8cHViRGF0ZS8+CiAgICA8L3B1YmxpY2F0aW9uU3RtdD4KICAgIDxzb3VyY2VEZXNjPgogICAgICA8YmlibFN0cnVjdD4KICAgICAgICA8bW9ub2dyPgogICAgICAgICAgPGgudGl0bGUvPgogICAgICAgICAgPGltcHJpbnQvPgogICAgICAgIDwvbW9ub2dyPgogICAgICA8L2JpYmxTdHJ1Y3Q+CiAgICA8L3NvdXJjZURlc2M+ICAgIAogIDwvZmlsZURlc2M+ICAKPC9pZHNIZWFkZXI+CjwvaWRzRG9jPlxuIjsKfSAgICAKICAgIGlmKCRNT05USCArIDAgPT0gJExBU1RNT05USCArIDEpewoJaWYoJE1PTlRIKzAgPiAxKXsKCSAgICBwcmludGYoIiVzXG4iLCAkaWRzRG9jU3RyaW5nKTsKCQl9CgkkTEFTVE1PTlRIKys7CiAgICB9CiAgICAjIHByaW50ZihTVERFUlIgIlxuXG5ORVcgTU9OVEggICAlc1xuXG4iLCAkbW9udGhzeyRNT05USH0pOwp9CgoKCiMjIyMjIyMjIyMjIyMjIyMjCiMjIHVzYWdlX21lc3NhZ2UKIyMjIyMjIyMjIyMjIyMjIyMKCgpzdWIgdXNhZ2VfbWVzc2FnZSB7CiAgICBwcmludCAiICAgVXNhZ2U6ICAuL3ZydDJ0ZWkucGwgPGZpbGUudnJ0LnhtbD4gPG91dGZpbGU+XG4iOwogICAgcHJpbnQgIiAgIDxmaWxlLnZydC54bWw+IGlzIGEgVlJUIGZpbGUgY29udmVydGVkIHRvIHByb3BlciBYTUxcbiI7CiAgICBleGl0Owp9CgoK