IyEgL3Vzci9iaW4vcGVybCAtdwoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgdnJ0MnRlaS5wbAojIGV1cmVjbwojIGxlaWJuaXotaW5zdGl0dXQgZnVlciBkZXV0c2NoZSBzcHJhY2hlIC8gY3NjIGZpbmxhbmQgZXNibwojIGF1Z3VzdCAyMDI0CiMgCiMgCiMgdXNpbmcgWE1MOjpUd2lnICwgc2VlIGh0dHA6Ly93d3cueG1sdHdpZy5vcmcvLCBodHRwczovL21ldGFjcGFuLm9yZy9wb2QvWE1MOjpUd2lnYQojIAojIHVzYWdlOiBzZWUgYmVsb3cgdGhlIHVzYWdlIGZ1Z25jdGlvbgojIFVzYWdlOiAgLi92cnQydGVpLnBsIDx2cnR4bWxmaWxlLnhtbD4gPG91dGZpbGU+CiMgICAgICAgICA8dnJ0eG1sZmlsZT46IHhtbC1pc2VkIHZydCBmaWxlCiMKIwojIFRPRE86IAojIDEgIGluc2VydCBkdGQgc3BlYywgb3IgcmVmIHRvIFRFSQoKIyAzYSByZW1vdmUgdGhlIHZydCBwb3NpdGlvbmFsIGF0dHJpYnV0ZSBjb21tZW50IGxpbmUgLyBhbGwgY29tbWVudCBsaW5lcwojIDNiIGFkZCBAaGVhZCBhbmQgQGRlcHJlbCB0byBJNSBzb3dpZSBhdWNoIEBtc2QKIyAzYyBiZWFyYmVpdHVuZyB2b24gQGhlYWQgdW5kIEBkZXByZWwgaW4gdGVpMmtvcmFweG1sIGR1cmNoIE5pbHM/CiMgM2QgYnVpbGQgMzAgYmlsbGlvbiBjb3JwdXMKCiMgNGEgdGFrZSBjYXJlIG9mIElEcwojIDRiIHNlZSB0byB0aGUgdmFsdWVzIG9mIEB4bWw6bGFuZwojIDUgYWJmYW5nZW4gdm9uIHVuZXJ3YXJ0ZXRlbiBlbGVtZW50ZW4gZGggYW5kZXJlIGFscyA8c2VudGVuY2U+IHVuZCA8cGFyYWdyYXBoPgojIDVhIHdvcnQgcmVpaGVuZm9sZ2Ugbm9jaG1hbCBjaGVja2VuCiMgNiBjaGVja3MgYW5kIGJhbGFuY2VzCiMgNyAgSG93IHRvIGVuY29kZSBLaWVsaXBhbmtraSBhbmQgTmF0aW9uYWwgTGlicmFyeSBvZiBGaW5sYW5kPyBpbiB0ZWlDb3JwdXMgSGVhZGVyCiMgOCAgY29uc3RydWN0IDxpZHNEb2M+cyBmb3IgdGhlIG1vbnRocyAob3IgZ28gZm9yIFRFSSkKIyA5ICBwYXJhbGxlbGlzYXRpb24gaW4gYmFzaCBhbmQgYXBwbGljYXRpb24gb24gc3ViIGNvcnBvcmEgb2YgS0xLCiMgMTAgIHJlLWltcGxlbWVudGF0aW9uIG9mIHRoZSBnYXdrIGNvZGUgaW4gdGhlIHBlcmwgc2NyaXB0CiMgMTIgIHJlLWltcGxlbWVudCBjcmVhdGlvbiBvZiB0ZXh0IGhlYWRlciBmcm9tIHhtbCBmaWxlIGluIGFub3RoZXIgdHdpZyAvIHBhcmFtZXRyaXplIFRFSSB2cyBJNQoKCgojcmVtZW1iZXIKI2Zvcm1hdHRlZC54bWw6MTA1NjEzOiBlbGVtZW50IHc6IHZhbGlkaXR5IGVycm9yIDogTm8gZGVjbGFyYXRpb24gZm9yIGF0dHJpYnV0ZSBkZXByZWwgb2YgZWxlbWVudCB3CiNmb3JtYXR0ZWQueG1sOjEwNTYxMzogZWxlbWVudCB3OiB2YWxpZGl0eSBlcnJvciA6IE5vIGRlY2xhcmF0aW9uIGZvciBhdHRyaWJ1dGUgaGVhZCBvZiBlbGVtZW50IHcKCgojCiMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIFhNTDo6VHdpZzsgCnVzZSBYTUw6OkdlbmVyYXRvciAnOnByZXR0eSc7ICAjIGFwcGFyZW50bHkgbm8gZWZmZWN0IHdoZW4gdXNpbmcgZmx1c2goKTsKCiAKdXNlIGxvY2FsZTsgICAgICAgICAgICAgICAgICMgZGllc2UgZHJlaSBaZWlsZW4sIGRhbWl0IFxiIGltIHJlZ2V4IG5pY2h0IFVtbGF1dGUgdW5kIN8gbWF0Y2h0Lgp1c2UgUE9TSVggcXcobG9jYWxlX2gpOyAgICAgIyB0byBiZSBhYmxlIHRvIHVzZSBzZXRsb2NhbGUoKQojc2V0bG9jYWxlKExDX0FMTCwnZGVfREUnKTsgIApzZXRsb2NhbGUoTENfQUxMLCAiZmlfRkkiKTsgIAp1c2UgdXRmODsKdXNlIG9wZW4gcXcoIDpzdGQgOmVuY29kaW5nKFVURi04KSApOwoKdXNlIFRpbWU6OlBpZWNlOwp1c2UgVGllOjpJeEhhc2g7CgoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgY2hlY2sgZmlsZSBhcmd1bWVudHM6CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIGFyZzAgaW5maWxlOiAgIHZydC14bWwKCnVubGVzcygkQVJHVlswXSkgeyZ1c2FnZV9tZXNzYWdlKCl9IDsgIyBtaW4gYXJnMCwgdGhlIGlucHV0IGZpbGUKaWYgICAgKCRBUkdWWzFdKSB7JnVzYWdlX21lc3NhZ2UoKX07ICAjIG1heCBhcmcwLCB0aGUgaW5wdXQgZmlsZQoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgR0xPQkFMIFZBUklBQkxFUyAKIyMjIyMjIyMjIyMjIyMjIyMjIyMKCm15ICRlbmNvZGluZyA9ICJVVEYtOCI7ICAgICAgICAgICAgICAgCiNteSAkZW5jb2RpbmcgPSAiaXNvLTg4NTktMSI7ICAgICAgICAgICAgICMgZGllc2VzICRlbmNvZGluZyBpc3QgTlVSIGZ1ZXIgZGFzIG91dHB1dCBzLnUuIHR3aWcgZnVua3Rpb24KbXkgJHRleHRjb3VudGVyID0gMDsKCm15ICVkb2Njb3VudGVyID0gKCAgICAgICAgICAgICAgICAgICAgICAgICMgYnkgdGhlIG1vbnRoIGFzIGluIGRlcmVrb3gKICAgICIwMSIgPT4gMSwKICAgICIwMiIgPT4gMSwKICAgICIwMyIgPT4gMSwKICAgICIwNCIgPT4gMSwKICAgICIwNSIgPT4gMSwKICAgICIwNiIgPT4gMSwKICAgICIwNyIgPT4gMSwKICAgICIwOCIgPT4gMSwKICAgICIwOSIgPT4gMSwKICAgICIxMCIgPT4gMSwKICAgICIxMSIgPT4gMSwKICAgICIxMiIgPT4gMSwKICAgICk7CgoKbXkgJHNvdXJjZXNjc3ZmaWxlID0gInNvdXJjZXNfa2xrX2ZpX3YyXzIwMjFfNGV1cmVjby5jc3YiOwpteSAkY29ycGhlYWRlcmZpbGUgPSAidGVpQ29ycHVzSGVhZGVyU2tlbGV0b24udGVpLnhtbCI7Cm15ICR0ZXh0aGVhZGVyZmlsZSA9ICJ0ZWlUZXh0SGVhZGVyU2tlbGV0b24udGVpLnhtbCI7CgoKbXkgJHR3aWc9IiI7ICAgCm15ICR0ZWlDb3JwdXNIZWFkZXJEb2M9IiI7CgojIGdsb2JhbCB2YXJpYWJsZXMgcGVydGFpbmluZyB0byB0aGUgb3JpZ2luYWwgY29ycHVzIDoKbXkgJGtpZWxpcGFua2tpQ29ycHVzID0gImtsay1maS12Mi12cnQiOwoKbXkgJW1vbnRocyA9ICgKICAgICAiMDEiID0+ICJKQU4iLAogICAgICIwMiIgPT4gIkZFQiIsCiAgICAgIjAzIiA9PiAiTUFSIiwKICAgICAiMDQiID0+ICJBUFIiLAogICAgICIwNSIgPT4gIk1BWSIsCiAgICAgIjA2IiA9PiAiSlVOIiwKICAgICAiMDciID0+ICJKVUwiLAogICAgICIwOCIgPT4gIkFVRyIsCiAgICAgIjA5IiA9PiAiU0VQIiwKICAgICAiMTAiID0+ICJPQ1QiLAogICAgICIxMSIgPT4gIk5PViIsCiAgICAgIjEyIiA9PiAiREVDIiwKICAgICApOwoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHJlYWQgY29ycHVzSGVhZGVyU2tlbGV0b24gZG9jdW1lbnQgYW5kIGdldCBoZWFkZXIgb3V0IG9mIGl0CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCm15ICR0ZWlDb3JwdXNIZWFkZXJEb2NUd2lnID0gbmV3IFhNTDo6VHdpZygKICAgIGtlZXBfc3BhY2VzID0+IDEsCiAgICBrZWVwX2F0dHNfb3JkZXIgPT4gMSwKICAgIGNvbW1lbnRzID0+ICdkcm9wJywKICAgICk7CgoKJHRlaUNvcnB1c0hlYWRlckRvY1R3aWctPnBhcnNlZmlsZSgkY29ycGhlYWRlcmZpbGUpOwpteSAkY29ycHVzSGVhZGVyID0gJHRlaUNvcnB1c0hlYWRlckRvY1R3aWctPnJvb3Q7ICAgICAgICAgICAgICAgICAgIyBnZXR0aW5nIHRoZSB0ZWlIZWFkZXIgZm9yIGNvcnB1cyBvdXQgb2YgdGhlIHRlaUNvcnB1c0hlYWRlclNrZWxldG9uIGRvY3VtZW50CgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHJlYWQgdGV4dEhlYWRlclNrZWxldG9uIGRvY3VtZW50IGFkbiBnZXQgaGVhZGVyIG91dCBvZiBpdAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpteSAkdGVpVGV4dEhlYWRlckRvY1R3aWcgPSBuZXcgWE1MOjpUd2lnKAogICAga2VlcF9zcGFjZXMgPT4gMSwKICAgIGtlZXBfYXR0c19vcmRlciA9PiAxLAogICAgY29tbWVudHMgPT4gJ2Ryb3AnLAogICAgKTsKCiR0ZWlUZXh0SGVhZGVyRG9jVHdpZy0+cGFyc2VmaWxlKCR0ZXh0aGVhZGVyZmlsZSk7Cm15ICR0ZXh0SGVhZGVyID0gJHRlaVRleHRIZWFkZXJEb2NUd2lnLT5yb290OyAgICAgICAgICAgICAgICAgICAgICAjIGdldHRpbmcgdGhlIHRlaUhlYWRlciBmb3IgY29ycHVzIG91dCBvZiB0aGUgdGVpVGV4dEhlYWRlclNrZWxldG9uIGRvY3VtZW50CgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyByZWFkIGlucHV0IFZSVC1YTUwgZG9jdW1lbnQKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCm9wZW4obXkgJElOLCAgIjwgJEFSR1ZbMF0iKSB8fCBkaWUoIiQwOiBjYW5ub3Qgb3BlbiBmaWxlIGZvciByZWFkaW5nOiAkQVJHVlswXSIpOyAgICAgIyBvcGVuIGlucHV0ICBmaWxlIGFuZCBpbml0aWFsaXNlIGZpbGVoYW5kZWwsIGFjdHVhbGx5IGRvZXMgbm90IHNlZW0gdG8gYmUgbmVlZGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcyBwYXJzZWZpbGUoKSAocy5iLikgaXMgYXBwbGllZCB0byB0aGUgZmlsZW5hbWUKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgcmVhZCBzb3VyY2UgbWV0YWRhdGEgZmlsZSAocHJlcGFyZWQgbWFudWFsbHkgPT4gdWx0aW1hdGVseSByZWFkIHRoZSBpbmZvIGZyb20gQ01ESSBGaWxlPykKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCm15ICRsaW5lY291bnQ9MDsKb3BlbihteSAkU09VUkNFUywgJHNvdXJjZXNjc3ZmaWxlKSB8fCBkaWUoIiQwOiBjYW5ub3Qgb3BlbiBmaWxlIGZvciByZWFkaW5nOiAkc291cmNlc2NzdmZpbGUiKTsKd2hpbGUobXkgJGxpbmUgPSAkU09VUkNFUyl7CiAgICAkbGluZWNvdW50Kys7CiAgICBjaG9tcCgkbGluZSk7CiAgICBpZiAoICRsaW5lPX4vXlwjLyAgfHwgICRsaW5lPX4vXlxzKiQvIHx8ICRsaW5lY291bnQgPT0gMSl7ICAjIHNraXAgbGluZSBpZiBlbW1wdHkgbGluZSBvciBjb21tZW50IGxpbmUgb3IgZmlyc3QgbGluZQoJbmV4dDsKICAgIH07CiAgICAjIHNwbGl0IGVhY2ggbGluZSBpbnRvIGFycmF5OgogICAgbXkgQGxpbmUgPSBzcGxpdCgvXHQrLywgJGxpbmUpOwogICAgCiAgICAjICRzb3VyY2VzeyJTdW9tZW4gS3V2YWxlaHRpIn1bMF0KCn0KCiMgd2hpbGUgKG15ICRsaW5lID0gPCRzZXFfZmg+KSB7CiMgICAgY2hvbXAgJGxpbmU7CiMgICAgIyMgc2tpcCBjb21tZW50cyBhbmQgYmxhbmsgbGluZXMgYW5kIG9wdGlvbmFsIHJlcGVhdCBvZiB0aXRsZSBsaW5lCiMgICAgbmV4dCBpZiAkbGluZSA9fiAvXlwjLyB8fCAkbGluZSA9fiAvXlxzKiQvIHx8ICRsaW5lID1+IC9eXCsvOwojICAgICNzcGxpdCBlYWNoIGxpbmUgaW50byBhcnJheQojICAgIG15IEBsaW5lID0gc3BsaXQoL1xzKy8sICRsaW5lKTsKIyAgICAkcmVzdWx0eyRsaW5lWzBdfXt5ZWFydG90YWx9ICs9ICRsaW5lWzFdOwojICAgICRyZXN1bHR7JGxpbmVbMF19e2Vhcm5pbmd9ICs9ICRsaW5lWzNdIC0gJGxpbmVbMl07CiMgfQoKICAgIAoKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAgICAgTSBBIEkgTiAgCiMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBzdGFydCB0d2lnIGZvciBpbnB1dCBhbmQgY2FsbCBzdGFydCB0YWcgaGFuZGxlciBmb3Igcm9vdCBhbmQgdHdpZyBoYW5kbGVyIGZvciBlYWNoIDx0ZXh0PiBpbiB0aGUgVlJUCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKJHR3aWcgPSBuZXcgWE1MOjpUd2lnKAogICAga2VlcF9zcGFjZXMgPT4gMSwgICAgICAgICAgICMgZGFkdXJjaCBhdWNoIHdoaXRlc3BhY2VzIGFuIGVoZW1lbGlnZW4gZWxlbWVudGdyZW56ZW4gaW0gb3V0cHV0CiAgICBrZWVwX2F0dHNfb3JkZXIgPT4gMSwgICAgICAgIyByZXF1aXJlcyBUaWU6Okl4SGFzaAogICAgY29tbWVudHMgPT4gJ2Ryb3AnLAogICAgc3RhcnRfdGFnX2hhbmRsZXJzID0+IHsKCXRleHRzID0+IHN1Yntyb290KEBfLCAkY29ycHVzSGVhZGVyKX0KICAgIH0sCiAgICB0d2lnX2hhbmRsZXJzID0+ICB7CiMJdGV4dCA9PiBcJnRleHQKCXRleHQgPT4gIHN1Ynt0ZXh0KEBfLCAkdGV4dEhlYWRlci0+Y29weSl9ICAgICMgICBjb3B5IG11c3QgYmUgYmVjYXVzZSB0ZXh0SGVhZGVyIHdpbGwgYmUgZmx1c2hlZCB3aXRoICR0d2lnIGluIHRoZSA8dGV4dD4gaGFuZGxlcjsKICAgIH0sCiAgICAjIGR0ZF9oYW5kbGVycyA9PiAgIHsgICAgICAgIyBUb0RvIGZvciBJNQogICAgIwlcJnNldF9kdGQ7CiAgICAjIH0KICAgIAogICAgb3V0cHV0X2VuY29kaW5nID0+ICRlbmNvZGluZywKICAgICk7CgokdHdpZy0+cGFyc2VmaWxlKCRBUkdWWzBdKTsKCgoKCgojIyMjIyMjIyMjIwojIEVORCBNQUlOCiMjIyMjIyMjIyMjCgoKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAgIFMgVSBCIFIgTyBVIFQgSSBOIEUgUwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgc3ViIHNldF9kdGQgWwojICAgIG15ICR0d2lnLCAkZHRkID0gQF87CiMgICAgbXkgJGludGVybmFsID0gcXF8XG5QVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIlxuIkRURC94aHRtbDEtc3RyaWN0LmR0ZCJ8OwojCiMgICAgJHR3aWctPnR3aWdfZG9jdHlwZSgnaHRtbCcsIHVuZGVmLCB1bmRlZiwgJGludGVybmFsKTsKIyAgICB9CgoKCnN1YiByb290IHsKICAgIG15ICgkdHdpZywgJHJvb3QsICRjb3JwdXNIZWFkZXIpID1AXzsKCiAgICAkcm9vdC0+c2V0X2dpKCd0ZWlDb3JwdXMnKTsKICAgICRyb290LT5zZXRfYXR0KCJ4bWxucyIsICdodHRwOi8vd3d3LnRlaS1jLm9yZy9ucy8xLjAnKTsKCiAgICAmaW5zZXJ0Q29ycHVzSGVhZGVyKCRyb290LCAkY29ycHVzSGVhZGVyKTsKfQoKCgpzdWIgaW5zZXJ0Q29ycHVzSGVhZGVyewogICAgbXkgKCRyb290LCAkY29ycHVzSGVhZGVyKSA9QF87CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBnZXQgc29tZSBtZXRhZGF0YSBmb3IgdGhlIGN1cnJlbnQgb3V0cHV0IGNvcnB1cyBiYXNlZCBvbiBzb3VyY2UgYW5kIHllYXIKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgbXkgQGFycmF5ID0gc3BsaXQoL1wvLywgJEFSR1ZbMF0pOwogICAgbXkgJGwgPSBzY2FsYXIoQGFycmF5KTsKICAgIG15ICRzb3VyY2UgPSAkYXJyYXlbJGwtMV07CiAgICAkc291cmNlID1+IHMvKFswLTldWzAtOV1bMC05XVswLTldKVwueG1sJC8vOwoKICAgIG15ICRsYW5ndWFnZT0iRmlubmlzaCI7CiAgICBteSAkbGFuZ190bGE9ImZpIjsKICAgIAogICAgbXkgJHllYXIgPSAkMTsgICAjICQxIG5vdyBjb250YWludHMgc3Vic3RyaW5nIGluIGZpcnN0IGJyYWNrZXQgaW4gcmVnZXggYWJvdmUKCiAgICBteSAkY3RpdGxlID0gJHNvdXJjZSAuICIgIiAuICR5ZWFyIC4gIiwgZnJvbSAiLiAka2llbGlwYW5ra2lDb3JwdXMgLiAiIGZvciBFdVJlQ28iOyAgICAjIHRvIGRvOiBhbHNvIGdldCBuYW1lIG9mIGNvcnB1cyAoa2xrLWZpLXYyLXZydCkKCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIHNldCBjb3JwdXMgaGVhZGVyCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgJnNldF90aXRsZSggICAgICRjb3JwdXNIZWFkZXIsICRzb3VyY2UsICR5ZWFyLCAka2llbGlwYW5ra2lDb3JwdXMpOwogICAgJnNldF9zb3VyY2VEZXNjKCRjb3JwdXNIZWFkZXIsICRzb3VyY2UsICR5ZWFyLCAka2llbGlwYW5ra2lDb3JwdXMpOwoKICAgIG15ICR0ZWlDb3JwdXNIZWFkZXIgICAgICAgID0gJGNvcnB1c0hlYWRlci0+cGFzdGUoImZpcnN0X2NoaWxkIiwgJHJvb3QpOwoKfQogICAgCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGhhbmRsZXIgJnRleHQgZm9yIDx0ZXh0PgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3ViIHRleHQgewogICAgbXkgKCR0d2lnLCAkdGV4dCwgJHRleHRIZWFkZXIpID0gQF87CgogICAgJHRleHRjb3VudGVyKys7ICAgICAgICAgICAgICAgCgogICAgCiAgICAjIFRvRG86IGNhdGNoIGFsbCBvdGhlciwgdW5leHBlY3RlZCBjaGlsZHJlbiBvZiByb290CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIEdldCB0ZXh0IG1ldGFkYXRhIChhdHRyaWJ1dGVzIG9mIDx0ZXh0PikgYW5kIGNyZWF0ZSB0ZWlIZWFkZXIgZm9yIDx0ZXh0PgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15ICR0ZXh0YXR0c3JlZiA9ICR0ZXh0LT5hdHRzKCk7ICAgICAgICAgICAgICAgIyAkdGV4dGF0dHNyZWYgaXMgbm93IGEgcmVmZXJlbmNlIHRvIGEgaGFzaCBhbmQgc2hvdWxkIGJlIHVzZWQgd2l0aCAnLT4nCgogICAgIyAmY3JlYXRlVGV4dEhlYWRlciByZXR1cm5zIHRoZSAkdGV4dElEOgogICAgbXkgJHRleHRJRCA9ICZjcmVhdGVUZXh0SGVhZGVyKCR0ZXh0LCAkdGV4dGF0dHNyZWYsICR0ZXh0SGVhZGVyKTsKICAgIAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGNyZWF0ZSA8VEVJPiBmcm9tIDx0ZXh0PgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgICMgc2V0IHZydCA8dGV4dD4gdG8gPFRFST4gYW5kIGRlbGV0ZSBhbGwgYXR0cmlidXRlcyBhZnRlciB0aGV5IHdlcmUgd2VyZSBzYXZlZCBhYm92ZQogICAgJHRleHQtPmRlbF9hdHRzOwogICAgJHRleHQtPnNldF9naSgiVEVJIik7CiAgICAkdGV4dC0+c2V0X2F0dCgneG1sOmlkJywgJHRleHRJRCk7CiAgICAKCiAgICAgIAoKICAgIAogICAgCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGNyZWF0ZSB0aGUgPHRlaTp0ZXh0PiwgPGJvZHk+LCA8ZGl2PiBlbGVtZW50cyBpbnNpZGUgPFRFST4KICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgbXkgJHR0ZXh0X2VsZW1lbnQgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCd0ZXh0Jyk7CiAgICBteSAkYm9keV9lbGVtZW50ICA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ2JvZHknKTsKICAgIG15ICRkaXZfZWxlbWVudCAgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygnZGl2Jyk7CgogICAgIyBzZXQgYXR0cwogICAgJGRpdl9lbGVtZW50ICAtPnNldF9hdHQoInR5cGUiLCAicGFnZSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUb0RvOiB0aGlzIGlzIHNwZWNpZmljIHRvIEtMSwogICAgJHR0ZXh0X2VsZW1lbnQtPnNldF9hdHQoInhtbDpsYW5nIiwgJ2ZpJyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXMgaW4gSUNDLU5PUgoKICAgICMgcGFzdGUKICAgICR0dGV4dF9lbGVtZW50LT5wYXN0ZSgnbGFzdF9jaGlsZCcsICAkdGV4dCk7CiAgICAkYm9keV9lbGVtZW50IC0+cGFzdGUoJ2xhc3RfY2hpbGQnLCAgJHR0ZXh0X2VsZW1lbnQpOwogICAgJGRpdl9lbGVtZW50ICAtPnBhc3RlKCdsYXN0X2NoaWxkJywgICRib2R5X2VsZW1lbnQpOwoKICAgIAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgY3JlYXRlIDxwPiBmcm9tIDxwYXJhZ3JhcGg+CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICBteSBAcGFyYWdyYXBocyA9ICR0ZXh0LT5jaGlsZHJlbiggJ3BhcmFncmFwaCcpOwoKICAgIGZvcmVhY2ggbXkgJHBhcmFncmFwaCAoQHBhcmFncmFwaHMpIHsKCQoJJnNldFAoJHBhcmFncmFwaCk7CgoJJHBhcmFncmFwaC0+bW92ZSgnbGFzdF9jaGlsZCcsICRkaXZfZWxlbWVudCk7CgkKCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSMgY3JlYXRlIDxzPiBmcm9tIDxzZW50ZW5jZT4KCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQoJbXkgQHNlbnRlbmNlcyA9ICRwYXJhZ3JhcGgtPmNoaWxkcmVuKCdzZW50ZW5jZScpOwoJZm9yZWFjaCBteSAkc2VudGVuY2UgKEBzZW50ZW5jZXMpIHsKCgkgICAgJnNldFMoJHNlbnRlbmNlKTsKCgoJICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgICMgY3JlYXRlIDx3PiAod29yZCkgZnJvbSBlYWNoICRsaW5lCgkgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICAgCgkgICAgbXkgQGxpbmVzID0gc3BsaXQoL1xuKy8sICRzZW50ZW5jZS0+eG1sX3RleHQpOwoJICAgICRzZW50ZW5jZS0+c2V0X3RleHQoIlxuIik7CgoJICAgIGZvciBteSAkbGluZSAoQGxpbmVzKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRvZG86IFJlaWhlbmZvbGdlIGNoZWNrZW4KCQlpZigkbGluZSBuZSAiIiApewoJCSAgICBteSAkd19lbGVtZW50ID0gWE1MOjpUd2lnOjpFbHQtPm5ldygndycpOwoJCSAgICAmY3JlYXRlVygkd19lbGVtZW50LCAkbGluZSk7CgkJICAgICR3X2VsZW1lbnQtPnBhc3RlKCdsYXN0X2NoaWxkJywgJHNlbnRlbmNlKTsKCQl9CgkgICAgfSAjIGVuZCB3b3JkcwoJfSAjIGVuZCBzZW50ZW5jZXMKICAgIH0gIyBlbmQgcGFyYWdyYXBocwoKICAgICMgJHR3aWctPnNldF9wcmV0dHlfcHJpbnQoICdyZWNvcmQnKTsKICAgICMgJHR3aWctPmZsdXNoKCRPVVQpOwogICAgJHR3aWctPmZsdXNoKCIvZGV2L3N0ZG91dCIpOwp9CgpzdWIgY3JlYXRlVGV4dEhlYWRlcnsKICAgIG15ICgkdGV4dCwgJHRleHRhdHRzcmVmLCAkdGV4dEhlYWRlcikgPSBAXzsKICAgIAogICAgIyBVU0UgMDEgYmluZGluZ19pZD0iMjI0NjAyNSIKICAgICMgVVNFIDAyIGRhdGU9IjIwMjEtMDEtMTUiCiAgICAjICAgICAwMyBkYXRlZnJvbT0iMjAyMTAxMTUiCiAgICAjICAgICAwNCBkYXRldG89IjIwMjEwMTE1IgogICAgIyAgICAgMDUgZWxlY19kYXRlPSJfIgogICAgIyAgICAgMDYgZmlsZT0iIgogICAgIyBVU0UgMDcgZmlsZW5hbWVfbWV0YWRhdGE9ImZpbmNsYXJpbl9zaWlydG9fazIwMjEvMDAzOS01NTUyLzIwMjEvYWx0by8yMjQ2MDI1XzAwMzktNTU1Ml8yMDIxLTAxLTE1X1NLMDIyMV9tZXRzLnhtbCIKICAgICMgVVNFIDA4IGZpbGVuYW1lX29yaWcgICAgPSJmaW5jbGFyaW5fc2lpcnRvX2syMDIxLzAwMzktNTU1Mi8yMDIxL2FsdG8vMjI0NjAyNV8wMDM5LTU1NTJfMjAyMS0wMS0xNV9TSzAyMjFfcGFnZS0yMDIxMDExNTAyMjEwMDMwMzAxLnhtbAogICAgIyBVU0UgMDkgaWQ9InQtYmNkMGYzZmEtYmJkM2RhYzQiCiAgICAjICAgICAxMCBpbWdfdXJsPSIiCiAgICAjIFVTRSAxMSBpc3N1ZV9kYXRlPSIxNS4wMS4yMDIxIgogICAgIyBVU0UgMTIgaXNzdWVfbm89IlNLMDIyMSIKICAgICMgVVNFIDEzIGlzc3VlX3RpdGxlPSJTdW9tZW4gS3V2YWxlaHRpIgogICAgIyBVU0UgMTQgbGFiZWw9IlN1b21lbiBLdXZhbGVodGkgbm8uIFNLMDIyMSAxNS4wMS4yMDIxIgogICAgIyBVU0UgMTYgbGFuZ3VhZ2U9ImZpIgogICAgIyBVU0UgMTcgcGFnZV9pZD0icDEiCiAgICAjIFVTRSAxOCBwYWdlX25vPSJOb25lIgogICAgIyAgICAgMTkgcGFydF9uYW1lPSJfIgogICAgIyAgICAgMjAgcHVibF9pZD0iMDAzOS01NTUyIgogICAgIyAgICAgMjEgcHVibF9wYXJ0PSIiCiAgICAjIFVTRSAyMiBwdWJsX3RpdGxlPSJTdW9tZW4gS3V2YWxlaHRpIiAKICAgICMgVVNFIDIzIHB1YmxfdHlwZT0iYWlrYWthdXNpIgogICAgIyBVU0UgMjQgc2VudGNvdW50PSI3MCIKICAgICMgVVNFIDI1IHN1bV9sYW5nPSJ8eHh4OjQ0fGZpbjoyM3xlbmc6M3wiCiAgICAjICAgICAyNiB0aW1lZnJvbT0iMDAwMDAwIgogICAgIyAgICAgMjcgdGltZXRvPSIyMzU5NTkiCiAgICAjIFVTRSAyOCB0b2tlbmNvdW50PSIzMDQiCiAgICAjICAgICAyOSB2ZXJzaW9uX2FkZGVkPSJLTEstZmktMjAyMSI+CgoKICAgIG15ICRCSUQgICAgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnYmluZGluZ19pZCd9OwogICAgbXkgJERBVEUgICAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydkYXRlJ307CiAgICBteSAkTUVUQUZJTEVOQU1FID0gJHRleHRhdHRzcmVmLT57J2ZpbGVuYW1lX21ldGFkYXRhJ307ICAgIAogICAgbXkgJE9SSUdGSUxFTkFNRSA9ICR0ZXh0YXR0c3JlZi0+eydmaWxlbmFtZV9vcmlnJ307CiAgICBteSAkSUQgICAgICAgICAgID0gJHRleHRhdHRzcmVmLT57J2lkJ307CiAgICBteSAkSVNTVUVEQVRFICAgID0gJHRleHRhdHRzcmVmLT57J2lzc3VlX2RhdGUnfTsKICAgIG15ICRJU1NVRU5PICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnaXNzdWVfbm8nfTsKICAgIG15ICRJU1NVRVRJVExFICAgPSAkdGV4dGF0dHNyZWYtPnsnaXNzdWVfdGl0bGUnfTsKICAgIG15ICRMQUJFTCAgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnbGFiZWwnfTsKICAgIG15ICRMQU5HVUFHRSAgICAgPSAkdGV4dGF0dHNyZWYtPnsnbGFuZ3VhZ2UnfTsKICAgIG15ICRQQUdFSUQgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsncGFnZV9pZCd9OwogICAgbXkgJFBBR0VOTyAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydwYWdlX25vJ307CiAgICBteSAkUFVCTFRJVExFICAgID0gJHRleHRhdHRzcmVmLT57J3B1YmxfdGl0bGUnfTsKICAgIG15ICRQVUJMVFlQRSAgICAgPSAkdGV4dGF0dHNyZWYtPnsncHVibF90eXBlJ307CiAgICBteSAkU0VOVENPVU5UICAgID0gJHRleHRhdHRzcmVmLT57J3NlbnRjb3VudCd9OwogICAgbXkgJFNVTUxBTkcgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydzdW1fbGFuZyd9OwogICAgbXkgJFRPS0VOQ09VTlQgICA9ICR0ZXh0YXR0c3JlZi0+eyd0b2tlbmNvdW50J307CgogICAgCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgRGVyaXZlZCBNZXRhZGF0YSB2YXJpYWJsZXMKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIG15IEBkYXRlYXJyYXkgPSBzcGxpdCgiLSIsICREQVRFKTsKICAgIG15IEBsYW5nYXJyYXkgPSBzcGxpdCgifCIsICRTVU1MQU5HKTsKICAgIG15IEBuYW1lYXJyYXkgPSBzcGxpdCgvW1wuXC9dLywgJE9SSUdGSUxFTkFNRSk7ICAjIHVzZSAkbmFtZWFycmF5WzRdIGFzIElEIGZvciB0aGUgcGFnZQogICAgCgoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGNyZWF0ZSB0ZXh0U2lnbGUgdG8gYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGZ1bmN0aW9uCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICMgU1VLMjEuSkFOLjAwMDAxCiAgICAKICAgIG15ICRjb3JwdXNJRCA9ICJTVUsiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRvRG8gcmVhZCBUYWJsZSB3aXRoIFNvdXJjZSBtZXRhZGF0YQogICAgbXkgJHl5ICAgICAgID0gc3Vic3RyKCRkYXRlYXJyYXlbMF0sIDIsIDIpOyAgICAgICMgc3Vic3RyIEVYUFIsT0ZGU0VULExFTkdUSAogICAgbXkgJG1tICAgICAgID0gJGRhdGVhcnJheVsxXTsgICAgICAgICAgICAgICAgICAgICMgc3Vic3RyIEVYUFIsT0ZGU0VULExFTkdUSAogICAgbXkgJE1NTSAgICAgID0gJG1vbnRoc3skbW19OwoKICAgIG15ICR0ZXh0SUQgPSAkY29ycHVzSUQgLiAkeXkgLiAiXyIgLiAkTU1NIC4gIi4iIC4gc3ByaW50ZigiJTA1ZCIsICRkb2Njb3VudGVyeyRtbX0rKyk7CgogICAgCiAgICAKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBDUkVBVEUgdGV4dC10ZWlIZWFkZXIgQUNDT1JESU5HIFRPIFRIRSBTS0VMRVRPTiBpbiAkdGV4dEhlYWRlcgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKICAgICR0ZXh0SGVhZGVyLT5wYXN0ZSgnZmlyc3RfY2hpbGQnLCAkdGV4dCk7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIDx0ZWlIZWFkZXI+CiAgICAjICAgPGZpbGVEZXNjIG49IkV1UmVDby1LTEstRklOX1skSURdIj4KICAgICMgICAgIDx0aXRsZVN0bXQ+CiAgICAjICAgICAgIDx0aXRsZT5bJExBQkVMLCBwYWdlICRQQUdFTk9dPC90aXRsZT4JCgogICAgJHRleHRIZWFkZXItPmZpcnN0X2NoaWxkKCJmaWxlRGVzYyIpICAgLT4gIHNldF9hdHQoJ24nLCAiRXVSZUNvLSIuICRraWVsaXBhbmtraUNvcnB1cyAuICRJRCk7CiAgICAKICAgICR0ZXh0SGVhZGVyLT5maXJzdF9jaGlsZCgiZmlsZURlc2MiKSAgICAtPiBmaXJzdF9jaGlsZCgidGl0bGVTdG10IiktPmZpcnN0X2NoaWxkKCJ0aXRsZSIpCgktPnNldF90ZXh0KCRMQUJFTCAuICIsIFRleHQgIyIgLiAkdGV4dGNvdW50ZXIpOyAgICAjIENhc2UgS0xLOyAgUEFHRU5PIHNjaGVpbnQgbWVpc3QgIk5vbmUiIHp1IHNlaW4KCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgPGZpbGVEZXNjPgogICAgIyAgPHNvdXJjZURlc2M+CiAgICAjICAgPGJpYmxTdHJ1Y3Q+CiAgICAjICAgICAgPGFuYWx5dGljPgogICAgIyAgICAgICAgIDx0aXRsZSB0eXBlPSJtYWluIj5bJExBQkVMLCBwYWdlICRQQUdFTk9dPC90aXRsZT4KICAgICMgICAgICAgICA8ZGF0ZT5bJERBVEVdPC9kYXRlPgogICAgIyAgICAgICAgIDxkYXRlIHR5cGU9InllYXIiPlRPRE88L2RhdGU+CiAgICAjICAgICAgICAgPGRhdGUgdHlwZT0ibW9udGgiPlRPRE88L2RhdGU+CiAgICAjICAgICAgICAgPGRhdGUgdHlwZT0iZGF5Ij5UT0RPPC9kYXRlPgogICAgIyAgICAgICAgIDxpZG5vIHR5cGU9IlBBR0VJRCI+JFBBR0VJRDwvaWRubz4KICAgICMgICAgICAgICA8aWRubyB0eXBlPSJCSU5ESU5HSUQiPiRCSUQ8L2lkbm8+CiAgICAjICAgICAgICAgPGlkbm8gdHlwZT0iSUQiPiRJRDwvaWRubz4KICAgICMgICAgICAgICA8aWRubyB0eXBlPSJLSUVMSVBBTktLSV9NRVRBRklMRU5BTUUiPiRNRVRBRklMRU5BTUU8L2lkbm8+CiAgICAjICAgICAgICAgPGlkbm8gdHlwZT0iS0lFTElQQU5LS0lfT1JJR0ZJTEVOQU1FIj4kT1JJR0ZJTEVOQU1FPC9pZG5vPgogICAgIyAgICAgICAgIDx0ZXh0TGFuZz4kTEFOR1VBR0U8L3RleHRMYW5nPgoKICAgIG15ICRhbmFseXRpYyAgPSAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCIuL2ZpbGVEZXNjL3NvdXJjZURlc2MvYmlibFN0cnVjdC9hbmFseXRpYyIsIDApOwoKICAgICRhbmFseXRpYy0+Zmlyc3RfY2hpbGQoInRpdGxlIikgICAgICAgICAgICAgICAgICAgIC0+c2V0X3RleHQoJExBQkVMIC4gIiwgVGV4dCAjIiAuICR0ZXh0Y291bnRlcik7ICAgIyBDYXNlIEtMSzsgUEFHRU5PIHNjaGVpbnQgbWVpc3QgIk5vbmUiIHp1IHNlaW4KICAgICRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2RhdGVbQHR5cGU9ImRhdGUiXScsICAgMCkgIC0+c2V0X3RleHQoJERBVEUpOwogICAgJGFuYWx5dGljLT5nZXRfeHBhdGgoJy4vZGF0ZVtAdHlwZT0ieWVhciJdJywgICAwKSAgLT5zZXRfdGV4dCgkZGF0ZWFycmF5WzBdKTsKICAgICRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2RhdGVbQHR5cGU9Im1vbnRoIl0nLCAgMCkgIC0+c2V0X3RleHQoJGRhdGVhcnJheVsxXSk7CiAgICAkYW5hbHl0aWMtPmdldF94cGF0aCgnLi9kYXRlW0B0eXBlPSJkYXkiXScsICAgIDApICAtPnNldF90ZXh0KCRkYXRlYXJyYXlbMl0pOyAgICAKICAgICRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2lkbm9bQHR5cGU9IlBBR0VJRCJdJywgICAgICAgMCkgICAgIC0+c2V0X3RleHQoJFBBR0VJRCk7CiAgICAkYW5hbHl0aWMtPmdldF94cGF0aCgnLi9pZG5vW0B0eXBlPSJCSU5ESU5HSUQiXScsICAgIDApICAgICAtPnNldF90ZXh0KCRCSUQpOwogICAgJGFuYWx5dGljLT5nZXRfeHBhdGgoJy4vaWRub1tAdHlwZT0iSUQiXScsICAgICAgICAgICAwKSAgICAgLT5zZXRfdGV4dCgkSUQpOwogICAgJGFuYWx5dGljLT5nZXRfeHBhdGgoJy4vaWRub1tAdHlwZT0iS0lFTElQQU5LS0lfTUVUQUZJTEVOQU1FIl0nLCAwKSAgICAgLT5zZXRfdGV4dCgkTUVUQUZJTEVOQU1FKTsKICAgICRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2lkbm9bQHR5cGU9IktJRUxJUEFOS0tJX09SSUdGSUxFTkFNRSJdJywgMCkgICAgIC0+c2V0X3RleHQoJE9SSUdGSUxFTkFNRSk7CiAgICAkYW5hbHl0aWMtPmZpcnN0X2NoaWxkKCd0ZXh0TGFuZycpICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRfdGV4dCgkTEFOR1VBR0UpOwogICAgCiAgICAjICA8bW9ub2dyPgogICAgIyAgICA8dGl0bGU+JFBVQkxUSVRMRTwvdGl0bGU+CiAgICAjICAgIDxpbXByaW50PgogICAgIyAgICAgIDxwdWJQbGFjZT5UT0RPPC9wdWJQbGFjZT4KICAgICMgICAgICA8cHVibGlzaGVyPlRPRE88L3B1Ymxpc2hlcj4KICAgICMgICAgPC9pbXByaW50PgogICAgIyAgICA8YmlibFNjb3BlIHVuaXQ9IklTU1VFVElUTEUiLz4KICAgICMgICAgPGJpYmxTY29wZSB1bml0PSJJU1NVRU5PIi8+CiAgICAjICAgIDxiaWJsU2NvcGUgdW5pdD0iSVNTVUVEQVRFIi8+CiAgICAjICAgIDxiaWJsU2NvcGUgdW5pdD0icHAiPiRQQUdFTk88L2JpYmxTY29wZT4KCiAgICBteSAkbW9ub2dyICA9ICR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoIi4vZmlsZURlc2Mvc291cmNlRGVzYy9iaWJsU3RydWN0L21vbm9nciIsIDApOwoKICAgICRtb25vZ3ItPmZpcnN0X2NoaWxkKCJ0aXRsZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnNldF90ZXh0KCRQVUJMVElUTEUpOwogICAgJG1vbm9nci0+Zmlyc3RfY2hpbGQoImltcHJpbnQiKS0+Zmlyc3RfY2hpbGQoInB1YlBsYWNlIikgICAgICAgIC0+c2V0X3RleHQoIlRvRG8iKTsgICAgICAgICAjIGltcHJpbnQgaXMgbmVlZGVkIGZvciB0ZWkgdmFsaWRpdHkKICAgICRtb25vZ3ItPmZpcnN0X2NoaWxkKCJpbXByaW50IiktPmZpcnN0X2NoaWxkKCJwdWJsaXNoZXIiKSAgICAgICAtPnNldF90ZXh0KCJUb0RvIik7ICAgICAgICAgIyBpbXByaW50IGlzIG5lZWRlZCBmb3IgdGVpIHZhbGlkaXR5CiAgICAkbW9ub2dyLT5nZXRfeHBhdGgoJy4vYmlibFNjb3BlW0B1bml0PSJJU1NVRVRJVExFIl0nLCAwKSAgICAgICAgLT5zZXRfdGV4dCgkSVNTVUVUSVRMRSk7CiAgICAkbW9ub2dyLT5nZXRfeHBhdGgoJy4vYmlibFNjb3BlW0B1bml0PSJJU1NVRU5PIl0nLCAwKSAgICAgICAgICAgLT5zZXRfdGV4dCgkSVNTVUVOTyk7CiAgICAkbW9ub2dyLT5nZXRfeHBhdGgoJy4vYmlibFNjb3BlW0B1bml0PSJJU1NVRURBVEUiXScsIDApICAgICAgICAgLT5zZXRfdGV4dCgkSVNTVUVEQVRFKTsKICAgICRtb25vZ3ItPmdldF94cGF0aCgnLi9iaWJsU2NvcGVbQHVuaXQ9InBwIl0nLCAwKSAgICAgICAgICAgICAgICAtPnNldF90ZXh0KCRQQUdFTk8pOyAgICAgICAgIyBBY2h0dW5nIC0gUEFHRU5PIHNjaGVpbnQgbWVpc3QgIk5vbmUiIHp1IHNlaW4KCiAgICAjICA8ZW5jb2RpbmdEZXNjPgogICAgIyAgICA8dGFnc0RlY2w+CiAgICAjICAgICAgPG5hbWVzcGFjZSBuYW1lPSJodHRwOi8vd3d3LnRlaS1jLm9yZy9ucy8xLjAiPgogICAgIyAgICAgICAgPHRhZ1VzYWdlIGdpPSJzIiBvY2N1cnM9IlNFTlRDT1VOVCIvPgogICAgIyAgICAgICAgPHRhZ1VzYWdlIGdpPSJ3IiBvY2N1cnM9IlRPS0VOQ09VTlQiLz4KCiAgICAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCcuL2VuY29kaW5nRGVzYy90YWdzRGVjbC9uYW1lc3BhY2UvdGFnVXNhZ2VbQGdpPSJzIl0nLCAwKSAgICAgIC0+IHNldF9hdHQoJ29jY3VycycsICRTRU5UQ09VTlQpOwogICAgJHRleHRIZWFkZXItPmdldF94cGF0aCgnLi9lbmNvZGluZ0Rlc2MvdGFnc0RlY2wvbmFtZXNwYWNlL3RhZ1VzYWdlW0BnaT0idyJdJywgMCkgICAgICAtPiBzZXRfYXR0KCdvY2N1cnMnLCAkVE9LRU5DT1VOVCk7CgkKICAgICMgIDxwcm9maWxlRGVzYz4KICAgICMgICAgPGxhbmdVc2FnZT4KICAgICMgICAgIDxsYW5ndWFnZSBpZGVudD0iZmkiIHVzYWdlPSJ8eHh4OjQ0fGZpbjoyM3xlbmc6M3wiLz4KICAgICMgICA8L2xhbmdVc2FnZT4KICAgICMgICAgPHRleHRDbGFzcz4KICAgICMgICAgICA8Y2xhc3NDb2RlIHNjaGVtZT0ia2llbGlwYW5ra2lfa2xrIj4kUFVCTFRZUEU8L2NsYXNzQ29kZT4KICAgICMgICAgICA8Y2xhc3NDb2RlIHNjaGVtZT0ia2llbGlwYW5ra2lfa2xrX21hcHBlZCI+VE9ETzwvY2xhc3NDb2RlPgoKICAgICR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoJy4vcHJvZmlsZURlc2MvbGFuZ1VzYWdlL2xhbmd1YWdlJywgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0X2F0dCgnaWRlbnQnLCAkTEFOR1VBR0UpOwogICAgJHRleHRIZWFkZXItPmdldF94cGF0aCgnLi9wcm9maWxlRGVzYy9sYW5nVXNhZ2UvbGFuZ3VhZ2UnLCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRfYXR0KCd1c2FnZScsICRTVU1MQU5HKTsKICAgICMgaW4gQHVzYWdlIG11c3MgZWlndC4gZWluIGludGVnZXI7IGFtIGJlc3RlbiBpbmhhbHQgdm9uIFNVTUxBTkcgYXVmZHJvZXNlbG4gdW5kIG1laHJlcmUgPGxhbmd1YWdlPiBtYWNoZW4KCiAgICAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCcuL3Byb2ZpbGVEZXNjL3RleHRDbGFzcy9jbGFzc0NvZGVbQHNjaGVtZT0ia2llbGlwYW5ra2lfa2xrIl0nLCAwKSAgICAgICAtPnNldF90ZXh0KCRQVUJMVFlQRSk7CiAgICAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCcuL3Byb2ZpbGVEZXNjL3RleHRDbGFzcy9jbGFzc0NvZGVbQHNjaGVtZT0ia2llbGlwYW5ra2lfa2xrX21hcHBlZCJdJywgMCktPnNldF90ZXh0KCJUb0RvIik7CgogICAgIyAgPHJldmlzaW9uRGVzYz4KICAgICMgICAgPGNoYW5nZSB3aGVuPSJUT0RPIiB3aG89IkhMIj5URUkgdmVyc2lvbiBmb3IgRXVSZUNvPC9jaGFuZ2U+CgogICAgJHRleHRIZWFkZXItPmdldF94cGF0aCgnLi9yZXZpc2lvbkRlc2MvY2hhbmdlJywgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnNldF9hdHQoJ3doZW4nLCBsb2NhbHRpbWUtPnltZCgnLScpKTsKICAgIAogICAgcmV0dXJuICR0ZXh0SUQ7CgogICAgCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgRU5EIE9GIENSRUFUSU5HIFRFSUhFQURFUgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKfQoKc3ViIHNldFAgewogICAgbXkgKCRwYXJhZ3JhcGgpID0gQF87CiAgICAKICAgICRwYXJhZ3JhcGgtPnNldF9naSgncCcpOwogICAgCiAgICAjIDxwYXJhZ3JhcGggaWQ9InAtYmNkMGYzZmEtYmJkM2RhYzQtODE1ZWFkN2EiIHN1bV9sYW5nPSJ8ZmluOjF8Ij4KICAgICMgYXR0cyBvZiA8cGFyYWdyYXBoPjoKICAgICMgICAgQGlkICAgICAgICBVU0UKICAgICMgICAgQHN1bV9sYW5nICBVU0U6IHB1dCBpbiB4bWw6bGFuZyBhbmQgcHJlZml4IHRoZSB2YWx1ZSB3aXRoICJ4LSIgZm9yIHByaXZhdGUgdmFsdWUKICAgIAogICAgJHBhcmFncmFwaC0+c2V0X2F0dCgieG1sOmxhbmciLCAieC0iIC4gJHBhcmFncmFwaC0+YXR0KCJzdW1fbGFuZyIpKTsKICAgICRwYXJhZ3JhcGgtPmRlbF9hdHQoInN1bV9sYW5nIik7CiAgICAjICRwYXJhZ3JhcGgtPmNoYW5nZV9hdHRfbmFtZSgnaWQnLCAneG1sOmlkJyk7CiAgICAkcGFyYWdyYXBoLT5kZWxfYXR0KCJpZCIpOyAgICAgICAgICAgICAgIyBkaWVzZSBpZCBpc3QgYXVjaCBuaWNodCBlaW5kZXV0aWchIQp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCnN1YiBzZXRTIHsKICAgIG15ICgkc2VudGVuY2UpID0gQF87CiAgICAKICAgICRzZW50ZW5jZS0+c2V0X2dpKCdzJyk7CgkgICAgCiAgICAjIHRoZSBhdHRzIG9mIDxzZW50ZW5jZT46CiAgICAjICAgIFVTRSAgIDEgQGlkPSJzLWJjZDBmM2ZhLWJiZDNkYWM0LWY3NDI5MDkwIgogICAgIyAgICBVU0UgICAyIEBsYW5nPSJmaW4iIC0+IHhtbDpsYW5nIAogICAgIyAgICA/ICAgICAzIEBsYW5nX2NvbmY9IjAuNjczNDg1MyI+IC0+IFRvRG8gQGNlcnQgPwkgICAgCiAgICAKICAgICMgc2V0IGF0dHJzIG9mIDxzPgogICAgJHNlbnRlbmNlLT5zZXRfYXR0KCJ4bWw6bGFuZyIsICRzZW50ZW5jZS0+YXR0KCJsYW5nIikpOyAgIyBUb0RvOiBjb252ZXJ0IHRoZSB2YWx1ZSAvIGludHJvZHVjZSBhIGhhc2ggZm9yIGxvb2t1cCAoaW5wdXQgdmFsdWVzOiAiZmluIiwgInh4eCIsIC4uLi4pCiAgICAjICRzZW50ZW5jZS0+Y2hhbmdlX2F0dF9uYW1lKCdpZCcsICd4bWw6aWQnKTsgICAgICAgICAgICAjIG5pY2h0IGVpbmRldXRpZwogICAgJHNlbnRlbmNlLT5kZWxfYXR0KCdpZCcpOwogICAgJHNlbnRlbmNlLT5kZWxfYXR0KCJsYW5nIik7ICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwbGFjZWQgYnkgeG1sOmxhbmcKICAgICRzZW50ZW5jZS0+ZGVsX2F0dCgibGFuZ19jb25mIik7ICAgICAgICAgICAgICAgICAgICAjIGZvciB0aGUgdGltZSBiZWluZwogICAgCn0KCnN1YiBjcmVhdGVXIHsKICAgIG15ICgkd19lbGVtZW50LCAkbGluZSkgPSBAXzsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIEdldCB0aGUgdGFncyAoPWNvbHVtbnMpCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15IEB0YWdzID0gc3BsaXQoL1x0LywgJGxpbmUpOwogICAgCiAgICAjIHNldCBjb250ZW50IG9mIDx3PiBpLmUuIHRoZSB0b2tlbgogICAgJHdfZWxlbWVudC0+c2V0X3RleHQoJHRhZ3NbMF0pOwogICAgCiAgICAjIHZydCBwb3NpdGlvbmFsLWF0dHJpYnV0ZXMgaW4gY29ycHVzIEtMSzoKICAgICMgIFVTRSBbMF0gd29yZAogICAgIyAgVVNFIFsxXSByZWYgIChpZCBmb3IgcmVmZXJlbmNlIG9mIGRlcGhlYWQpCiAgICAjICBVU0UgWzJdIGxlbW1hCiAgICAjICA/ICAgWzNdIGxlbW1hY29tcCAgIChsZW1tYSB3aXRoIGNvbXBvdW5kIGluZm8gLSBjb3VsZCBnbyBpbiBAbm9ybSwgYXMgdGFnIGFidXNlPykKICAgICMgIFVTRSBbNF0gcG9zIAogICAgIyAgVVNFIFs1XSBtc2QgCiAgICAjICBVU0UgWzZdIGRlcGhlYWQKICAgICMgIFVTRSBbN10gZGVwcmVsIAogICAgIyAgICAgIFs4XSBjb250ZW50ICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgIFs5XSB2cG9zICAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzEwXSBvY3IgICAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzExXSBjYyAgICAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzEyXSBoeXBoICAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzEzXSBzdHlsZSAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzE0XSBsZXggICAgICAgKGtvcnAgc2VtYW50aWMgZGlzYW1iaWd1YXRpb24gZnJvbSBHIm90ZWJvcmcpCiAgICAKICAgICMgc2V0IHRoZSBhdHRyaWJ1dGVzIG9mIDx3PjoKICAgICR3X2VsZW1lbnQtPnNldF9hdHQoIm4iLCAgICAgICR0YWdzWzFdKTsKICAgICMgJHdfZWxlbWVudC0+c2V0X2F0dCgiaWQiLCAgICAgIndfIiAuICRuYW1lYXJyYXlbNF0gLiAkc2VudGVuY2UtPmF0dCgieG1sOmlkIikgLiAiXyIgLiAkdGFnc1sxXSk7CiAgICAjIHNvIHp1c2FtbWVuZ2ViYXV0ZSBJRCBpc3QgYXVjaCBuaWNodCBlaW5kZXV0aWcuLi4KICAgICR3X2VsZW1lbnQtPmRlbF9hdHQoImlkIik7CiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJsZW1tYSIsICAkdGFnc1syXSk7CiAgICAjICR3X2VsZW1lbnQtPnNldF9hdHQoIm5vcm0iLCAgICR0YWdzWzNdKTsgICMgdGFnIGFidXNlIG9mIEBub3JtCiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJwb3MiLCAgICAkdGFnc1s0XSk7CiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJtc2QiLCAgICAkdGFnc1s1XSk7CiNUTVAgICAgJHdfZWxlbWVudC0+c2V0X2F0dCgiaGVhZCIsICAgJHRhZ3NbNl0pOwojVE1QICAgICR3X2VsZW1lbnQtPnNldF9hdHQoImRlcHJlbCIsICR0YWdzWzddKTsKICAgIAp9CiAgICAKCnN1YiBzZXRfdGl0bGV7CiAgICBteSAoJGNvcnB1c0hlYWRlciwgJHNvdXJjZSwgJHllYXIsICRraWVsaXBhbmtraUNvcnB1cykgPSBAXzsKCiAgICBteSAkY1RpdGxlU3RyaW5nID0gJHNvdXJjZSAuICIgIiAuICR5ZWFyIC4gIiwgZnJvbSAiLiAka2llbGlwYW5ra2lDb3JwdXMgLiAiIGZvciBFdVJlQ28iOyAgICAKCiAgICAjPHRlaUhlYWRlcj4KICAgICMgIDxmaWxlRGVzYz4KICAgICMgICAgPHRpdGxlU3RtdD4KICAgICMgICAgICA8dGl0bGU+W0FhbXVsZWh0aTIwMjFdIGZyb20gW2tsay1maS12Mi12cnQgZm9yXSBFdVJlQ288L3RpdGxlPgogICAgIyAgICA8L3RpdGxlU3RtdD4KICAgICMgICAgPCEtLSAuLi4gLS0+CiAgICAjICA8L2ZpbGVEZXNjPgogICAgIzwvdGVpSGVhZGVyPgoKICAgIG15ICRjVGl0bGVOb2RlID0gJGNvcnB1c0hlYWRlci0+Zmlyc3RfY2hpbGQoImZpbGVEZXNjIiktPmZpcnN0X2NoaWxkKCJ0aXRsZVN0bXQiKS0+Zmlyc3RfY2hpbGQoInRpdGxlIik7CgogICAgJGNUaXRsZU5vZGUtPnNldF90ZXh0KCRjVGl0bGVTdHJpbmcpOwogICAgCn0KCnN1YiBzZXRfc291cmNlRGVzY3sKICAgIG15ICgkY29ycHVzSGVhZGVyLCAkc291cmNlLCAkeWVhciwgJGtpZWxpcGFua2tpQ29ycHVzKSA9IEBfOwoKICAgIG15ICRjQmlibFN0cmluZyA9ICRzb3VyY2UgLiAiICIgLiAkeWVhciAuICIsIGZyb20gIi4gJGtpZWxpcGFua2tpQ29ycHVzIC4gIiBmb3IgRXVSZUNvIjsgICAgCgogICAgIzx0ZWlIZWFkZXI+CiAgICAjICA8ZmlsZURlc2M+CiAgICAjICAgIDwhLS0gLi4uIC0tPgogICAgIyAgICA8c291cmNlRGVzYz4KICAgICMgICAgICA8YmlibD5bQWFtdWxlaHRpMjAyMV0gZnJvbSBba2xrLWZpLXYyLXZydF08L2JpYmw+CiAgICAjICAgIDwvc291cmNlRGVzYz4KICAgICMgICAgPCEtLSAuLi4gLS0+CiAgICAjICA8L2ZpbGVEZXNjPgogICAgIzwvdGVpSGVhZGVyPgoKICAgIG15ICRjQmlibE5vZGUgPSAkY29ycHVzSGVhZGVyLT5maXJzdF9jaGlsZCgiZmlsZURlc2MiKS0+Zmlyc3RfY2hpbGQoInNvdXJjZURlc2MiKS0+Zmlyc3RfY2hpbGQoImJpYmwiKTsKCiAgICAkY0JpYmxOb2RlLT5zZXRfdGV4dCgkY0JpYmxTdHJpbmcpOyAgICAKfQoKCgoKCgoKIyMjIyMjIyMjIyMjIyMjIyMKIyMgdXNhZ2VfbWVzc2FnZQojIyMjIyMjIyMjIyMjIyMjIwoKCnN1YiB1c2FnZV9tZXNzYWdlIHsKICAgIHByaW50ICIgICBVc2FnZTogIC4vdnJ0MnRlaS5wbCA8ZmlsZS52cnQueG1sPiA8b3V0ZmlsZT5cbiI7CiAgICBwcmludCAiICAgPGZpbGUudnJ0LnhtbD4gaXMgYSBWUlQgZmlsZSBjb252ZXJ0ZWQgdG8gcHJvcGVyIFhNTFxuIjsKICAgIGV4aXQ7Cn0KCgo=