IyEgL3Vzci9iaW4vcGVybCAtdwoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgdnJ0MnRlaS5wbAojIGV1cmVjbwojIGxlaWJuaXotaW5zdGl0dXQgZnVlciBkZXV0c2NoZSBzcHJhY2hlIC8gY3NjIGZpbmxhbmQgZXNibwojIGF1Z3VzdCAyMDI0CiMgCiMgCiMgdXNpbmcgWE1MOjpUd2lnICwgc2VlIGh0dHA6Ly93d3cueG1sdHdpZy5vcmcvLCBodHRwczovL21ldGFjcGFuLm9yZy9wb2QvWE1MOjpUd2lnYQojIAojIHVzYWdlOiBzZWUgYmVsb3cgdGhlIHVzYWdlIGZ1Z25jdGlvbgojIFVzYWdlOiAgLi92cnQydGVpLnBsIDx2cnR4bWxmaWxlLnhtbD4gPG91dGZpbGU+CiMgICAgICAgICA8dnJ0eG1sZmlsZT46IHhtbC1pc2VkIHZydCBmaWxlCiMKIwojIFRPRE86IAojIDEgIGluc2VydCBkdGQgc3BlYywgb3IgcmVmIHRvIFRFSQoKIyAzYSBVUExPQUQgaW4gR0lUSFVCCiMgM2IgYWRkIEBoZWFkIGFuZCBAZGVwcmVsIHRvIEk1IHNvd2llIGF1Y2ggQG1zZAojIDNjIGJlYXJiZWl0dW5nIHZvbiBAaGVhZCB1bmQgQGRlcHJlbCBpbiB0ZWkya29yYXB4bWwgZHVyY2ggTmlscz8KIyAzZCBidWlsZCAzMCBiaWxsaW9uIGNvcnB1cwoKIyA0YSB0YWtlIGNhcmUgb2YgSURzCiMgNGIgc2VlIHRvIHRoZSB2YWx1ZXMgb2YgQHhtbDpsYW5nCiMgNSBhYmZhbmdlbiB2b24gdW5lcndhcnRldGVuIGVsZW1lbnRlbiBkaCBhbmRlcmUgYWxzIDxzZW50ZW5jZT4gdW5kIDxwYXJhZ3JhcGg+CiMgNWEgd29ydCByZWloZW5mb2xnZSBub2NobWFsIGNoZWNrZW4KIyA2IGNoZWNrcyBhbmQgYmFsYW5jZXMKIyA2YSBvdXRwdXQgbmFjaCBzdGRvdXQgbWFjaGVuCiMgNyAgSG93IHRvIGVuY29kZSBLaWVsaXBhbmtraSBhbmQgTmF0aW9uYWwgTGlicmFyeSBvZiBGaW5sYW5kPyBpbiB0ZWlDb3JwdXMgSGVhZGVyCiMgOCAgY29uc3RydWN0IDxpZHNEb2M+cyBmb3IgdGhlIG1vbnRocyAob3IgZ28gZm9yIFRFSSkKIyA5ICBwYXJhbGxlbGlzYXRpb24gaW4gYmFzaCBhbmQgYXBwbGljYXRpb24gb24gc3ViIGNvcnBvcmEgb2YgS0xLCiMgMTAgIHJlLWltcGxlbWVudGF0aW9uIG9mIHRoZSBnYXdrIGNvZGUgaW4gdGhlIHBlcmwgc2NyaXB0CiMgMTIgIHJlLWltcGxlbWVudCBjcmVhdGlvbiBvZiB0ZXh0IGhlYWRlciBmcm9tIHhtbCBmaWxlIGluIGFub3RoZXIgdHdpZyAvIHBhcmFtZXRyaXplIFRFSSB2cyBJNQoKCgojcmVtZW1iZXIKI2Zvcm1hdHRlZC54bWw6MTA1NjEzOiBlbGVtZW50IHc6IHZhbGlkaXR5IGVycm9yIDogTm8gZGVjbGFyYXRpb24gZm9yIGF0dHJpYnV0ZSBkZXByZWwgb2YgZWxlbWVudCB3CiNmb3JtYXR0ZWQueG1sOjEwNTYxMzogZWxlbWVudCB3OiB2YWxpZGl0eSBlcnJvciA6IE5vIGRlY2xhcmF0aW9uIGZvciBhdHRyaWJ1dGUgaGVhZCBvZiBlbGVtZW50IHcKCgojCiMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIFhNTDo6VHdpZzsgCnVzZSBYTUw6OkdlbmVyYXRvciAnOnByZXR0eSc7ICAjIGFwcGFyZW50bHkgbm8gZWZmZWN0IHdoZW4gdXNpbmcgZmx1c2goKTsKCiAKdXNlIGxvY2FsZTsgICAgICAgICAgICAgICAgICMgZGllc2UgZHJlaSBaZWlsZW4sIGRhbWl0IFxiIGltIHJlZ2V4IG5pY2h0IFVtbGF1dGUgdW5kIN8gbWF0Y2h0Lgp1c2UgUE9TSVggcXcobG9jYWxlX2gpOyAgICAgIyB0byBiZSBhYmxlIHRvIHVzZSBzZXRsb2NhbGUoKQojc2V0bG9jYWxlKExDX0FMTCwnZGVfREUnKTsgIApzZXRsb2NhbGUoTENfQUxMLCAiZmlfRkkiKTsgIAp1c2UgdXRmODsKdXNlIG9wZW4gcXcoIDpzdGQgOmVuY29kaW5nKFVURi04KSApOwoKdXNlIFRpbWU6OlBpZWNlOwp1c2UgVGllOjpJeEhhc2g7CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGNoZWNrIGZpbGUgYXJndW1lbnRzOgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBhcmcwIGluZmlsZTogICB2cnQteG1sCgp1bmxlc3MoJEFSR1ZbMF0pIHsmdXNhZ2VfbWVzc2FnZSgpfSA7ICMgbWluIGFyZzAsIHRoZSBpbnB1dCBmaWxlCmlmICAgICgkQVJHVlsxXSkgeyZ1c2FnZV9tZXNzYWdlKCl9OyAgIyBtYXggYXJnMCwgdGhlIGlucHV0IGZpbGUKCgojIyMjIyMjIyMjIyMjIyMjIyMjIwojIEdMT0JBTCBWQVJJQUJMRVMgCiMjIyMjIyMjIyMjIyMjIyMjIyMjCgpteSAkZW5jb2RpbmcgPSAiVVRGLTgiOyAgICAgICAgICAgICAgIAojbXkgJGVuY29kaW5nID0gImlzby04ODU5LTEiOyAgICAgICAgICAgICAjIGRpZXNlcyAkZW5jb2RpbmcgaXN0IE5VUiBmdWVyIGRhcyBvdXRwdXQgcy51LiB0d2lnIGZ1bmt0aW9uCm15ICR0ZXh0Y291bnRlciA9IDA7CgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgICAgIE0gQSBJIE4gIAojIyMjIyMjIyMjIyMjIyMjIyMjIyMKCm9wZW4obXkgJElOLCAgIjwgJEFSR1ZbMF0iKSB8fCBkaWUoIiQwOiBjYW5ub3Qgb3BlbiBmaWxlIGZvciByZWFkaW5nOiAkQVJHVlswXSIpOyAgICAgIyBvcGVuIGlucHV0ICBmaWxlIGFuZCBpbml0aWFsaXNlIGZpbGVoYW5kZWwsIGFjdHVhbGx5IGRvZXMgbm90IHNlZW0gdG8gYmUgbmVlZGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcyBwYXJzZWZpbGUoKSAocy5iLikgaXMgYXBwbGllZCB0byB0aGUgZmlsZW5hbWUKIyMgb3BlbihteSAkT1VULCAiPiAkQVJHVlsxXSIpIHx8IGRpZSgiJDA6IGNhbm5vdCBvcGVuIGZpbGU6ICRBUkdWWzFdIik7ICAgICAgICAgICAgICAjIG9wZW4gcmVzdWx0IGZpbGUgYW5kIGluaXRpYWxpc2UgZmlsZWhhbmRsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY3VycmVudGx5IG5vdCB1c2VkIGJ1dCBmbHVzaGVkIHRvICIvZGV2L3N0ZG91dCIKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHN0YXJ0IHR3aWcgYW5kIGNhbGwgc3RhcnQgdGFnIGhhbmRsZXIgZm9yIHJvb3QgYW5kIHR3aWcgaGFuZGxlciBmb3IgZWFjaCA8dGV4dD4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpteSAkdHdpZz0iIjsgICAKCiR0d2lnID0gbmV3IFhNTDo6VHdpZygKICAgIGtlZXBfc3BhY2VzID0+IDEsICAgICAgICAgICAjIGRhZHVyY2ggYXVjaCB3aGl0ZXNwYWNlcyBhbiBlaGVtZWxpZ2VuIGVsZW1lbnRncmVuemVuIGltIG91dHB1dAogICAga2VlcF9hdHRzX29yZGVyID0+IDEsICAgICAgICMgcmVxdWlyZXMgVGllOjpJeEhhc2gKICAgIHByZXR0eV9wcmludCA9PiAnaW5kZW50ZWQnLAogICAgc3RhcnRfdGFnX2hhbmRsZXJzID0+IHsKICAgIAl0ZXh0cyA9PiBcJnJvb3QKICAgIH0sCiAgICB0d2lnX2hhbmRsZXJzID0+ICB7Cgl0ZXh0ID0+IFwmdGV4dAogICAgfSwKICAgICMgZHRkX2hhbmRsZXJzID0+ICAgeyAgICAgICAjIFRvRG8gZm9yIEk1CiAgICAjCVwmc2V0X2R0ZDsKICAgICMgfQogICAgCiAgICBvdXRwdXRfZW5jb2RpbmcgPT4gJGVuY29kaW5nLAogICAgKTsKCiR0d2lnLT5wYXJzZWZpbGUoJEFSR1ZbMF0pOwoKIyNUTVAgY2xvc2UoJE9VVCk7CgoKIyMjIyMjIyMjIyMKIyBFTkQgTUFJTgojIyMjIyMjIyMjIwoKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgICBTIFUgQiBSIE8gVSBUIEkgTiBFIFMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIHN1YiBzZXRfZHRkIFsKIyAgICBteSAkdHdpZywgJGR0ZCA9IEBfOwojICAgIG15ICRpbnRlcm5hbCA9IHFxfFxuUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiJcbiJEVEQveGh0bWwxLXN0cmljdC5kdGQifDsKIwojICAgICR0d2lnLT50d2lnX2RvY3R5cGUoJ2h0bWwnLCB1bmRlZiwgdW5kZWYsICRpbnRlcm5hbCk7CiMgICAgfQoKCgpzdWIgcm9vdCB7CiAgICBteSAoJHR3aWcsICRyb290KSA9QF87CgogICAgJHJvb3QtPnNldF9naSgndGVpQ29ycHVzJyk7CiAgICAkcm9vdC0+c2V0X2F0dCgieG1sbnMiLCAnaHR0cDovL3d3dy50ZWktYy5vcmcvbnMvMS4wJyk7CgogICAgJmluc2VydENvcnB1c0hlYWRlcigkcm9vdCk7Cn0KCgpzdWIgaW5zZXJ0Q29ycHVzSGVhZGVyewogICAgbXkgKCRyb290KSA9QF87CgogICAgbXkgQGFycmF5ID0gc3BsaXQoL1wvLywgJEFSR1ZbMF0pOwogICAgbXkgJGwgPSBzY2FsYXIoQGFycmF5KTsKICAgIG15ICRzb3VyY2UgPSAkYXJyYXlbJGwtMV07CiAgICAkc291cmNlID1+IHMvXC54bWwvLzsKICAgICRzb3VyY2UgPSAkc291cmNlIC4gIiBmcm9tIGtsay1maS12Mi12cnQiOyAgICAgICAjIGZvciB0aGUgdGltZSBiZWluZzsgVE9ETwogICAgCiAgICBteSAkdGVpSGVhZGVyICAgICAgICA9ICRyb290ICAgICAgICAgICAtPmluc2VydF9uZXdfZWx0KCJmaXJzdF9jaGlsZCIsICd0ZWlIZWFkZXInKTsgICAgCiAgICBteSAkZmlsZURlc2MgICAgICAgICA9ICR0ZWlIZWFkZXIgICAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2ZpbGVEZXNjJyk7CiAgICBteSAkcHJvZmlsZURlc2MgICAgICA9ICR0ZWlIZWFkZXIgICAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3Byb2ZpbGVEZXNjJyk7CiAgICAKICAgIG15ICR0aXRsZVN0bXQgICAgICAgID0gJGZpbGVEZXNjICAgICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGl0bGVTdG10Jyk7CiAgICBteSAkdGl0bGUgICAgICAgICAgICA9ICR0aXRsZVN0bXQgICAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3RpdGxlJyk7CiAgICAkdGl0bGUgICAgICAgICAgICAgICAtPnNldF90ZXh0KCRzb3VyY2UgLiAiIGZyb20gS0xLLWZpLTIwMjEgZm9yIEV1UmVDbyIpOwogICAgCiAgICBteSAkcHVibGljYXRpb25TdG10ICA9ICRmaWxlRGVzYyAgICAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3B1YmxpY2F0aW9uU3RtdCcpOwogICAgbXkgJGRpc3RyaWJ1dG9yICAgICAgPSAkcHVibGljYXRpb25TdG10LT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdkaXN0cmlidXRvcicpOwogICAgJGRpc3RyaWJ1dG9yICAgICAgICAgLT5zZXRfdGV4dCgiTk9UIEZPUiBESVNUUklCVVRJT04gLSB0byBiZSB1c2VkIGxvY2FsbHkgaW4gRXVSZUNvIik7CgogICAgbXkgJHNvdXJjZURlc2MgICAgICAgPSAkZmlsZURlc2MgICAgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdzb3VyY2VEZXNjJyk7CiAgICBteSAkYmlibCAgICAgICAgICAgICA9ICRzb3VyY2VEZXNjICAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2JpYmwnKTsKICAgICRiaWJsICAgICAgICAgICAgICAgIC0+c2V0X3RleHQoJHNvdXJjZSk7CgogICAgbXkgJGxhbmdVc2FnZSAgICAgICAgPSAkcHJvZmlsZURlc2MgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdsYW5nVXNhZ2UnKTsKICAgIG15ICRsYW5ndWFnZSAgICAgICAgID0gJGxhbmdVc2FnZSAgICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnbGFuZ3VhZ2UnKTsKICAgICRsYW5ndWFnZSAgICAgICAgICAgIC0+c2V0X2F0dCgiaWRlbnQiLCdmaScpOwogICAgJGxhbmd1YWdlICAgICAgICAgICAgLT5zZXRfdGV4dCgiRmlubmlzaCIpOwp9CiAgICAKICAgIAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGhhbmRsZXIgJnRleHQgZm9yIDx0ZXh0PgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3ViIHRleHQgewogICAgbXkgKCR0d2lnLCAkdGV4dCkgPSBAXzsKCiAgICAkdGV4dGNvdW50ZXIrKzsgICAgICAgICAgICAgICAjIGdsb2JhbCB2YXJpYWJsZQoKICAgICMgVG9EbzogY2F0Y2ggYWxsIG90aGVyLCB1bmV4cGVjdGVkIGNoaWxkcmVuIG9mIHJvb3QKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgR2V0IHRleHQgbWV0YWRhdGEgKGF0dHJpYnV0ZXMgb2YgPHRleHQ+KSBhbmQgY3JlYXRlIHRlaUhlYWRlciBmb3IgPHRleHQ+CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgbXkgJHRleHRhdHRzcmVmID0gJHRleHQtPmF0dHMoKTsgICAgICAgICAgICAgICAjICR0ZXh0YXR0c3JlZiBpcyBub3cgYSByZWZlcmVuY2UgdG8gYSBoYXNoIGFuZCBzaG91bGQgYmUgdXNlZCB3aXRoICctPicKCiAgICAmY3JlYXRlVGV4dEhlYWRlcigkdGV4dCwgJHRleHRhdHRzcmVmKTsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgY3JlYXRlIDxURUk+IGZyb20gPHRleHQ+CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgIyBzZXQgdnJ0IDx0ZXh0PiB0byA8VEVJPiBhbmQgZGVsZXRlIGFsbCBhdHRyaWJ1dGVzIGFmdGVyIHRoZXkgd2VyZSB3ZXJlIHNhdmVkIGFib3ZlCiAgICAkdGV4dC0+ZGVsX2F0dHM7CiAgICAkdGV4dC0+c2V0X2dpKCJURUkiKTsKICAgIAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBjcmVhdGUgdGhlIDx0ZWk6dGV4dD4sIDxib2R5PiwgPGRpdj4gZWxlbWVudHMgaW5zaWRlIDxURUk+CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15ICR0dGV4dF9lbGVtZW50ID0gWE1MOjpUd2lnOjpFbHQtPm5ldygndGV4dCcpOwogICAgbXkgJGJvZHlfZWxlbWVudCAgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCdib2R5Jyk7CiAgICBteSAkZGl2X2VsZW1lbnQgICA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ2RpdicpOwoKICAgICMgc2V0IGF0dHMKICAgICRkaXZfZWxlbWVudCAgLT5zZXRfYXR0KCJ0eXBlIiwgInBhZ2UiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICMgVG9EbzogdGhpcyBpcyBzcGVjaWZpYyB0byBLTEsKICAgICR0dGV4dF9lbGVtZW50LT5zZXRfYXR0KCJ4bWw6bGFuZyIsICdmaScpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFzIGluIElDQy1OT1IKCiAgICAjIHBhc3RlCiAgICAkdHRleHRfZWxlbWVudC0+cGFzdGUoJ2xhc3RfY2hpbGQnLCAgJHRleHQpOwogICAgJGJvZHlfZWxlbWVudCAtPnBhc3RlKCdsYXN0X2NoaWxkJywgICR0dGV4dF9lbGVtZW50KTsKICAgICRkaXZfZWxlbWVudCAgLT5wYXN0ZSgnbGFzdF9jaGlsZCcsICAkYm9keV9lbGVtZW50KTsKCiAgICAKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGNyZWF0ZSA8cD4gZnJvbSA8cGFyYWdyYXBoPgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgbXkgQHBhcmFncmFwaHMgPSAkdGV4dC0+Y2hpbGRyZW4oICdwYXJhZ3JhcGgnKTsKCiAgICBmb3JlYWNoIG15ICRwYXJhZ3JhcGggKEBwYXJhZ3JhcGhzKSB7CgkKCSZzZXRQKCRwYXJhZ3JhcGgpOwoKCSRwYXJhZ3JhcGgtPm1vdmUoJ2xhc3RfY2hpbGQnLCAkZGl2X2VsZW1lbnQpOwoJCgkjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkjIGNyZWF0ZSA8cz4gZnJvbSA8c2VudGVuY2U+CgkjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkKCW15IEBzZW50ZW5jZXMgPSAkcGFyYWdyYXBoLT5jaGlsZHJlbignc2VudGVuY2UnKTsKCWZvcmVhY2ggbXkgJHNlbnRlbmNlIChAc2VudGVuY2VzKSB7CgoJICAgICZzZXRTKCRzZW50ZW5jZSk7CgoKCSAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgICAjIGNyZWF0ZSA8dz4gKHdvcmQpIGZyb20gZWFjaCAkbGluZQoJICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgIAoJICAgIG15IEBsaW5lcyA9IHNwbGl0KC9cbisvLCAkc2VudGVuY2UtPnhtbF90ZXh0KTsKCSAgICAkc2VudGVuY2UtPnNldF90ZXh0KCJcbiIpOwoKCSAgICBmb3IgbXkgJGxpbmUgKEBsaW5lcyl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUb2RvOiBSZWloZW5mb2xnZSBjaGVja2VuCgkJaWYoJGxpbmUgbmUgIiIgKXsKCQkgICAgbXkgJHdfZWxlbWVudCA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ3cnKTsKCQkgICAgJmNyZWF0ZVcoJHdfZWxlbWVudCwgJGxpbmUpOwoJCSAgICAkd19lbGVtZW50LT5wYXN0ZSgnbGFzdF9jaGlsZCcsICRzZW50ZW5jZSk7CgkJfQoJICAgIH0gIyBlbmQgd29yZHMKCX0gIyBlbmQgc2VudGVuY2VzCiAgICB9ICMgZW5kIHBhcmFncmFwaHMKCiAgICAkdHdpZy0+c2V0X3ByZXR0eV9wcmludCggJ3JlY29yZCcpOwogICAgIyAkdHdpZy0+Zmx1c2goJE9VVCk7CiAgICAkdHdpZy0+Zmx1c2goIi9kZXYvc3Rkb3V0Iik7Cn0KCnN1YiBjcmVhdGVUZXh0SGVhZGVyewogICAgbXkgKCR0ZXh0LCAkdGV4dGF0dHNyZWYpID0gQF87CiAgICAKICAgICMgVVNFIDAxIGJpbmRpbmdfaWQ9IjIyNDYwMjUiCiAgICAjIFVTRSAwMiBkYXRlPSIyMDIxLTAxLTE1IgogICAgIyAgICAgMDMgZGF0ZWZyb209IjIwMjEwMTE1IgogICAgIyAgICAgMDQgZGF0ZXRvPSIyMDIxMDExNSIKICAgICMgICAgIDA1IGVsZWNfZGF0ZT0iXyIKICAgICMgICAgIDA2IGZpbGU9IiIKICAgICMgVVNFIDA3IGZpbGVuYW1lX21ldGFkYXRhPSJmaW5jbGFyaW5fc2lpcnRvX2syMDIxLzAwMzktNTU1Mi8yMDIxL2FsdG8vMjI0NjAyNV8wMDM5LTU1NTJfMjAyMS0wMS0xNV9TSzAyMjFfbWV0cy54bWwiCiAgICAjIFVTRSAwOCBmaWxlbmFtZV9vcmlnICAgID0iZmluY2xhcmluX3NpaXJ0b19rMjAyMS8wMDM5LTU1NTIvMjAyMS9hbHRvLzIyNDYwMjVfMDAzOS01NTUyXzIwMjEtMDEtMTVfU0swMjIxX3BhZ2UtMjAyMTAxMTUwMjIxMDAzMDMwMS54bWwKICAgICMgVVNFIDA5IGlkPSJ0LWJjZDBmM2ZhLWJiZDNkYWM0IgogICAgIyAgICAgMTAgaW1nX3VybD0iIgogICAgIyBVU0UgMTEgaXNzdWVfZGF0ZT0iMTUuMDEuMjAyMSIKICAgICMgVVNFIDEyIGlzc3VlX25vPSJTSzAyMjEiCiAgICAjIFVTRSAxMyBpc3N1ZV90aXRsZT0iU3VvbWVuIEt1dmFsZWh0aSIKICAgICMgVVNFIDE0IGxhYmVsPSJTdW9tZW4gS3V2YWxlaHRpIG5vLiBTSzAyMjEgMTUuMDEuMjAyMSIKICAgICMgVVNFIDE2IGxhbmd1YWdlPSJmaSIKICAgICMgVVNFIDE3IHBhZ2VfaWQ9InAxIgogICAgIyBVU0UgMTggcGFnZV9ubz0iTm9uZSIKICAgICMgICAgIDE5IHBhcnRfbmFtZT0iXyIKICAgICMgICAgIDIwIHB1YmxfaWQ9IjAwMzktNTU1MiIKICAgICMgICAgIDIxIHB1YmxfcGFydD0iIgogICAgIyBVU0UgMjIgcHVibF90aXRsZT0iU3VvbWVuIEt1dmFsZWh0aSIgCiAgICAjIFVTRSAyMyBwdWJsX3R5cGU9ImFpa2FrYXVzaSIKICAgICMgVVNFIDI0IHNlbnRjb3VudD0iNzAiCiAgICAjIFVTRSAyNSBzdW1fbGFuZz0ifHh4eDo0NHxmaW46MjN8ZW5nOjN8IgogICAgIyAgICAgMjYgdGltZWZyb209IjAwMDAwMCIKICAgICMgICAgIDI3IHRpbWV0bz0iMjM1OTU5IgogICAgIyBVU0UgMjggdG9rZW5jb3VudD0iMzA0IgogICAgIyAgICAgMjkgdmVyc2lvbl9hZGRlZD0iS0xLLWZpLTIwMjEiPgoKCiAgICBteSAkQklEICAgICAgICAgID0gJHRleHRhdHRzcmVmLT57J2JpbmRpbmdfaWQnfTsKICAgIG15ICREQVRFICAgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnZGF0ZSd9OwogICAgbXkgJE1FVEFGSUxFTkFNRSA9ICR0ZXh0YXR0c3JlZi0+eydmaWxlbmFtZV9tZXRhZGF0YSd9OyAgICAKICAgIG15ICRPUklHRklMRU5BTUUgPSAkdGV4dGF0dHNyZWYtPnsnZmlsZW5hbWVfb3JpZyd9OwogICAgbXkgJElEICAgICAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydpZCd9OwogICAgbXkgJElTU1VFREFURSAgICA9ICR0ZXh0YXR0c3JlZi0+eydpc3N1ZV9kYXRlJ307CiAgICBteSAkSVNTVUVOTyAgICAgID0gJHRleHRhdHRzcmVmLT57J2lzc3VlX25vJ307CiAgICBteSAkSVNTVUVUSVRMRSAgID0gJHRleHRhdHRzcmVmLT57J2lzc3VlX3RpdGxlJ307CiAgICBteSAkTEFCRUwgICAgICAgID0gJHRleHRhdHRzcmVmLT57J2xhYmVsJ307CiAgICBteSAkTEFOR1VBR0UgICAgID0gJHRleHRhdHRzcmVmLT57J2xhbmd1YWdlJ307CiAgICBteSAkUEFHRUlEICAgICAgID0gJHRleHRhdHRzcmVmLT57J3BhZ2VfaWQnfTsKICAgIG15ICRQQUdFTk8gICAgICAgPSAkdGV4dGF0dHNyZWYtPnsncGFnZV9ubyd9OwogICAgbXkgJFBVQkxUSVRMRSAgICA9ICR0ZXh0YXR0c3JlZi0+eydwdWJsX3RpdGxlJ307CiAgICBteSAkUFVCTFRZUEUgICAgID0gJHRleHRhdHRzcmVmLT57J3B1YmxfdHlwZSd9OwogICAgbXkgJFNFTlRDT1VOVCAgICA9ICR0ZXh0YXR0c3JlZi0+eydzZW50Y291bnQnfTsKICAgIG15ICRTVU1MQU5HICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnc3VtX2xhbmcnfTsKICAgIG15ICRUT0tFTkNPVU5UICAgPSAkdGV4dGF0dHNyZWYtPnsndG9rZW5jb3VudCd9OwoKICAgIAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIERlcml2ZWQgTWV0YWRhdGEgdmFyaWFibGVzCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBteSBAZGF0ZWFycmF5ID0gc3BsaXQoIi0iLCAkREFURSk7CiAgICBteSBAbGFuZ2FycmF5ID0gc3BsaXQoInwiLCAkU1VNTEFORyk7CiAgICBteSBAbmFtZWFycmF5ID0gc3BsaXQoL1tcLlwvXS8sICRPUklHRklMRU5BTUUpOyAgIyB1c2UgJG5hbWVhcnJheVs0XSBhcyBJRCBmb3IgdGhlIHBhZ2UKICAgIAoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBDUkVBVEUgdGV4dC10ZWlIZWFkZXIgQUNDT1JESU5HIFRPIFRIRSBTS0VMRVRPTiBpbiBrbGstaGVhZGVyLnRlaS54bWwKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICMgY3JlYXRlIDx0ZWlIZWFkZXI+IGluc2lkZSA8VEVJPgogICAgbXkgJHRlaUhlYWRlciA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ3RlaUhlYWRlcicpOwogICAgJHRlaUhlYWRlci0+cGFzdGUoJ2ZpcnN0X2NoaWxkJywgJHRleHQpOwoKICAgICMjIGluc2VydF9uZXdfZWx0IGlzIGEgY29tYm8gb2YgbmV3IGFuZCBwYXN0ZSwgY2YuIHhtbDo6dHdpZyBkb2N1OgogICAgIyMgaW5zZXJ0X25ld19lbHQgKCRvcHRfcG9zaXRpb24sICRnaSwgJG9wdF9hdHRzX2hhc2hyZWYsIEBvcHRfY29udGVudCkKICAgIAogICAgbXkgJGZpbGVEZXNjICAgICA9ICR0ZWlIZWFkZXItPmluc2VydF9uZXdfZWx0KCdmaWxlRGVzYycgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiB7biA9PiAiRXVSZUNvX0tMSy1maV8iIC4gJG5hbWVhcnJheVs0XX0pOwogICAgbXkgJGVuY29kaW5nRGVzYyA9ICR0ZWlIZWFkZXItPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2VuY29kaW5nRGVzYycpOwogICAgbXkgJHByb2ZpbGVEZXNjICA9ICR0ZWlIZWFkZXItPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3Byb2ZpbGVEZXNjJyk7CiAgICBteSAkcmV2aXNpb25EZXNjID0gJHRlaUhlYWRlci0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAncmV2aXNpb25EZXNjJyk7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBmaWxlRGVzYy90aXRsZVN0bXQKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIG15ICR0aXRsZVN0bXQgPSAkZmlsZURlc2MgLT5pbnNlcnRfbmV3X2VsdCgndGl0bGVTdG10Jyk7CiAgICBteSAkdGl0bGUgICAgID0gJHRpdGxlU3RtdC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGl0bGUnKTsKICAgIG15ICRyZXNwU3RtdCAgPSAkdGl0bGVTdG10LT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdyZXNwU3RtdCcpOwogICAgbXkgJHJlc3AgICAgICA9ICRyZXNwU3RtdCAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3Jlc3AnKTsKICAgIG15ICRuYW1lICAgICAgPSAkcmVzcFN0bXQgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICduYW1lJyk7CgogICAgIyBzZXQgdGV4dHMgZm9yIHRpdGxlU3RtdAogICAgIyAkdGl0bGUtPnNldF90ZXh0KCRMQUJFTCAuICIsIHBhZ2UgIiAuICRQQUdFTk8pOyAgICAgICAgICAgIyBBY2h0dW5nIC0gUEFHRU5PIHNjaGVpbnQgbWVpc3QgIk5vbmUiIHp1IHNlaW4KICAgICR0aXRsZS0+c2V0X3RleHQoJExBQkVMIC4gIiwgVGV4dCAjIiAuICR0ZXh0Y291bnRlcik7ICAgICMgYXQgbGVhc3QgZm9yIFN1b21lbiBLdXZhbGVodGkKICAgICRyZXNwIC0+c2V0X3RleHQoImNvbXBpbGVkIGJ5IEV1UmVDbyIpOwogICAgJG5hbWUgLT5zZXRfdGV4dCgiRXVSZUNvOiBITCIpOwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBmaWxlRGVzYy9wdWJsaWNhdGlvblN0bXQKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgbXkgJHB1YmxpY2F0aW9uU3RtdCA9ICRmaWxlRGVzYyAgICAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3B1YmxpY2F0aW9uU3RtdCcpOwogICAgbXkgJGRpc3RyaWJ1dG9yICAgICA9ICRwdWJsaWNhdGlvblN0bXQtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2Rpc3RyaWJ1dG9yJyk7CiAgICBteSAkbm90ZSAgICAgICAgICAgID0gJGRpc3RyaWJ1dG9yICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnbm90ZScpOwogICAgbXkgJGF2YWlsYWJpbGl0eSAgICA9ICRwdWJsaWNhdGlvblN0bXQtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2F2YWlsYWJpbGl0eScpOyAKICAgIG15ICRsaWNlbmNlICAgICAgICAgPSAkYXZhaWxhYmlsaXR5ICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdsaWNlbmNlJyk7CgogICAgIyBzZXQgdGV4dHMgZm9yIHB1YmxpY2F0aW9uU3RtdAogICAgJG5vdGUgICAtPnNldF90ZXh0KCJOT1QgRk9SIERJU1RSSUJVVElPTiAtIHRvIGJlIHVzZWQgbG9jYWxseSBpbiBFdVJlQ28iKTsKICAgICRsaWNlbmNlLT5zZXRfdGV4dCgiQ0xBUklOLVJFUyIpOyAgIyBUT0RPOiBBdXNmdWhlcmxpY2hlcmUgTGljZW5jZSBpbmZvIGluIEtMSyBNZXRhZGF0YSBSZWNvcmQKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGZpbGVEZXNjL3NvdXJjZURlc2MvYmlibFN0cnVjdAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgbXkgJHNvdXJjZURlc2MgPSAkZmlsZURlc2MgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnc291cmNlRGVzYycpOwogICAgbXkgJGJpYmxTdHJ1Y3QgICA9ICRzb3VyY2VEZXNjLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdiaWJsU3RydWN0Jyk7CgogICAgIyBmaWxlRGVzYy9zb3VyY2VEZXNjL2JpYmxTdHJ1Y3QvYW5hbHl0aWMKICAgIG15ICRhbmFseXRpYyAgICAgICAgICAgICAgICA9ICRiaWJsU3RydWN0LT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdhbmFseXRpYycpOwogICAgbXkgJGFuYWx5dGljX3RpdGxlICAgICAgICAgID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICd0aXRsZScgICAgICAgID0+IHt0eXBlID0+ICJtYWluIn0gKTsKIyAgICBteSAkYW5hbHl0aWNfZGF0ZSAgICAgICAgICAgPSAkYW5hbHl0aWMtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2RhdGUnKTsKICAgIG15ICRhbmFseXRpY19kYXRlX3llYXIgICAgICA9ICRhbmFseXRpYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnZGF0ZScgICAgICAgICA9PiB7dHlwZSA9PiAieWVhciJ9KTsKICAgIG15ICRhbmFseXRpY19kYXRlX21vbnRoICAgICA9ICRhbmFseXRpYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnZGF0ZScgICAgICAgICA9PiB7dHlwZSA9PiAibW9udGgifSk7CiAgICBteSAkYW5hbHl0aWNfZGF0ZV9kYXkgICAgICAgPSAkYW5hbHl0aWMtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2RhdGUnICAgICAgICAgPT4ge3R5cGUgPT4gImRheSJ9KTsKICAgIG15ICRhbmFseXRpY19pZG5vX3BhZ2VpZCAgICA9ICRhbmFseXRpYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnaWRubycgICAgICAgICA9PiB7dHlwZSA9PiAiUEFHRUlEIn0pOwogICAgbXkgJGFuYWx5dGljX2lkbm9fYmluZGluZ2lkID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdpZG5vJyAgICAgICAgID0+IHt0eXBlID0+ICJCSU5ESU5HSUQifSk7CiAgICBteSAkYW5hbHl0aWNfaWRub19pZCAgICAgICAgPSAkYW5hbHl0aWMtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2lkbm8nICAgICAgICAgPT4ge3R5cGUgPT4gIklEIn0pOwogICAgbXkgJGFuYWx5dGljX2lkbm9fbWV0YWZpbGUgID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdpZG5vJyAgICAgICAgID0+IHt0eXBlID0+ICJLSUVMSVBBTktLSV9NRVRBRklMRU5BTUUifSk7CiAgICBteSAkYW5hbHl0aWNfaWRub19vcmlnZmlsZSAgPSAkYW5hbHl0aWMtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2lkbm8nICAgICAgICAgPT4ge3R5cGUgPT4gIktJRUxJUEFOS0tJX09SSUdGSUxFTkFNRSJ9KTsKICAgIG15ICRhbmFseXRpY190ZXh0bGFuZyAgICAgICA9ICRhbmFseXRpYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGV4dExhbmcnKTsKCiAgICAjIHNldCB0ZXh0cyBmb3IgYW5hbHl0aWMKIyAgICAkYW5hbHl0aWNfdGl0bGUgICAgICAgICAtPnNldF90ZXh0KCRMQUJFTCAuICIsIHBhZ2UgIiAuICRQQUdFTk8pOyAgIyBBY2h0dW5nICRQQUdFTk8gc2NoZWludCBtZWlzdCAiTm9uZSB6dSBzZWluIgogICAgJGFuYWx5dGljX3RpdGxlICAgICAgICAgLT5zZXRfdGV4dCgkTEFCRUwgLiAiLCBUZXh0ICMiIC4gJHRleHRjb3VudGVyKTsgICMgQWNodHVuZyAkUEFHRU5PIHNjaGVpbnQgbWVpc3QgIk5vbmUgenUgc2VpbiIKIyAgICAkYW5hbHl0aWNfZGF0ZSAgICAgICAgIC0+c2V0X3RleHQoJERBVEUpOwogICAgJGFuYWx5dGljX2RhdGVfeWVhciAgICAgLT5zZXRfdGV4dCgkZGF0ZWFycmF5WzBdKTsKICAgICRhbmFseXRpY19kYXRlX21vbnRoICAgIC0+c2V0X3RleHQoJGRhdGVhcnJheVsxXSk7CiAgICAkYW5hbHl0aWNfZGF0ZV9kYXkgICAgICAtPnNldF90ZXh0KCRkYXRlYXJyYXlbMl0pOwogICAgJGFuYWx5dGljX2lkbm9fcGFnZWlkICAgLT5zZXRfdGV4dCgkUEFHRUlEKTsKICAgICRhbmFseXRpY19pZG5vX2JpbmRpbmdpZC0+c2V0X3RleHQoJEJJRCk7CiAgICAkYW5hbHl0aWNfaWRub19pZCAgICAgICAtPnNldF90ZXh0KCRJRCk7CiAgICAkYW5hbHl0aWNfaWRub19tZXRhZmlsZSAtPnNldF90ZXh0KCRNRVRBRklMRU5BTUUpOwogICAgJGFuYWx5dGljX2lkbm9fb3JpZ2ZpbGUgLT5zZXRfdGV4dCgkT1JJR0ZJTEVOQU1FKTsKICAgICRhbmFseXRpY190ZXh0bGFuZyAgICAgIC0+c2V0X3RleHQoJExBTkdVQUdFKTsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKICAgICMgZmlsZURlc2Mvc291cmNlRGVzYy9iaWJsU3RydWN0L21vbm9ncgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIG15ICRtb25vZ3IgICAgICAgICAgICAgICA9ICRiaWJsU3RydWN0LT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdtb25vZ3InKTsKICAgIG15ICRtb25vZ3JfdGl0bGUgICAgICAgICA9ICRtb25vZ3IgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICd0aXRsZScpOwogICAgbXkgJGltcHJpbnQgICAgICAgICAgICAgID0gJG1vbm9nciAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2ltcHJpbnQnKTsgICAjIGltcHJpbnQgaXMgbmVlZGVkIGZvciB2YWxpZGlkdHkKICAgIG15ICRwdWJQbGFjZSAgICAgICAgICAgICA9ICRpbXByaW50ICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdwdWJQbGFjZScpOyAgIyBpbXByaW50IGlzIG5lZWRlZCBmb3IgdmFsaWRpdHkKICAgIG15ICRwdWJsaXNoZXIgICAgICAgICAgICA9ICRpbXByaW50ICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdwdWJsaXNoZXInKTsgIyBpbXByaW50IGlzIG5lZWRlZCBmb3IgdmFsaWRpdHkKICAgIG15ICRiaWJsU2NvcGVfaXNzdWV0aXRsZSA9ICRtb25vZ3IgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdiaWJsU2NvcGUnICAgPT4ge3VuaXQgPT4gJ0lTU1VFVElUTEUnfSApOwogICAgbXkgJGJpYmxTY29wZV9pc3N1ZW5vICAgID0gJG1vbm9nciAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2JpYmxTY29wZScgICA9PiB7dW5pdCA9PiAnSVNTVUVOTyd9ICk7CiAgICBteSAkYmlibFNjb3BlX2lzc3VlZGF0ZSAgPSAkbW9ub2dyICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnYmlibFNjb3BlJyAgID0+IHt1bml0ID0+ICdJU1NVRURBVEUnfSApOwogICAgbXkgJGJpYmxTY29wZV9wcCAgICAgICAgID0gJG1vbm9nciAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2JpYmxTY29wZScgICA9PiB7dW5pdCA9PiAnUEFHRU5PJ30gKTsgICAgICAjIEFjaHR1bmcgUEFHRU5PIGlzdCBtZWlzdCAiTm9uZSIgPwoKICAgICMgc2V0IHRleHRzIGZvciBtb25vZ3IKICAgICRtb25vZ3JfdGl0bGUgICAgICAgIC0+c2V0X3RleHQoJFBVQkxUSVRMRSk7CiAgICAkcHViUGxhY2UgICAgICAgICAgICAtPnNldF90ZXh0KCJUT0RPIik7CiAgICAkcHViUGxhY2UgICAgICAgICAgICAtPnNldF9hdHQoImtleSIsJ0ZJJyk7CiAgICAkcHVibGlzaGVyICAgICAgICAgICAtPnNldF90ZXh0KCJUT0RPIik7CiAgICAkYmlibFNjb3BlX2lzc3VldGl0bGUtPnNldF90ZXh0KCRJU1NVRVRJVExFKTsKICAgICRiaWJsU2NvcGVfaXNzdWVubyAgIC0+c2V0X3RleHQoJElTU1VFTk8pOwogICAgJGJpYmxTY29wZV9pc3N1ZWRhdGUgLT5zZXRfdGV4dCgkSVNTVUVEQVRFKTsKICAgICRiaWJsU2NvcGVfcHAgICAgICAgIC0+c2V0X3RleHQoJFBBR0VOTyk7CiAKICAgICMtLS0tLS0tLS0tLS0tLS0KICAgICMgZW5jb2RpbmdEZXNjCiAgICAjLS0tLS0tLS0tLS0tLS0tCiAgICBteSAkdGFnc0RlY2wgICAgID0gJGVuY29kaW5nRGVzYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGFnc0RlY2wnKTsKICAgIG15ICRuYW1lc3BhY2UgICAgPSAkdGFnc0RlY2wgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICduYW1lc3BhY2UnICAgID0+IHtuYW1lID0+ICdodHRwOi8vd3d3LnRlaS1jLm9yZy9ucy8xLjAnfSk7CiAgICBteSAkdGFnVXNhZ2VfcyAgID0gJG5hbWVzcGFjZSAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGFnVXNhZ2UnICAgICA9PiB7Z2kgICA9PiAncycsIG9jY3VycyA9PiAkU0VOVENPVU5UfSk7CiAgICBteSAkdGFnVXNhZ2VfdyAgID0gJG5hbWVzcGFjZSAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGFnVXNhZ2UnICAgICA9PiB7Z2kgICA9PiAndycsIG9jY3VycyA9PiAkVE9LRU5DT1VOVH0pOwogICAgCiAgICAjLS0tLS0tLS0tLS0tLQogICAgIyBwcm9maWxlRGVzYwogICAgIy0tLS0tLS0tLS0tLS0KICAgIG15ICRsYW5nVXNhZ2UgICA9ICRwcm9maWxlRGVzYyAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2xhbmdVc2FnZScpOwogICAgbXkgJGxhbmd1YWdlICAgID0gJGxhbmdVc2FnZSAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnbGFuZ3VhZ2UnICAgICAgPT4ge2lkZW50ID0+ICRMQU5HVUFHRSwgdXNhZ2UgPT4gJFNVTUxBTkd9KTsKICAgICMgQWNodHVuZyBpbiBAdXNhZ2UgbXVzcyBlaWd0LiBlaW4gaW50ZWdlcjsgYW0gYmVzdGVuIGluaGFsdCB2b24gU1VNTEFORyBhdWZkcm9lc2VsbiB1bmQgbWVocmVyZSA8bGFuZ3VhZ2U+IG1hY2hlbgogICAgbXkgJHRleHRDbGFzcyAgID0gJHByb2ZpbGVEZXNjIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGV4dENsYXNzJyk7CiAgICBteSAkY2xhc3NDb2RlX2ZpICAgPSAkdGV4dENsYXNzICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdjbGFzc0NvZGUnID0+IHtzY2hlbWUgICAgICAgPT4gIktMS19QVUJMVFlQRSJ9KTsKIyAgICBteSAkY2xhc3NDb2RlX2VuICAgPSAkdGV4dENsYXNzICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdjbGFzc0NvZGUnID0+IHtzY2hlbWUgICAgICA9PiAiS0xLX1BVQkxUWVBFX01BUFBFRCJ9KTsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIHNldCB0ZXh0cyBmb3IgcHJvZmlsZURlc2MKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICRjbGFzc0NvZGVfZmkgLT5zZXRfdGV4dCgkUFVCTFRZUEUpOwojICAgICRjbGFzc0NvZGVfZW4tPnNldF90ZXh0KCRQVUJMVFlQRVRSQU5TTCk7CgogICAgIy0tLS0tLS0tLS0tLS0tLQogICAgIyByZXZpc2lvbkRlc2MKICAgICMtLS0tLS0tLS0tLS0tLS0KICAgIG15ICRjaGFuZ2UgICAgICA9ICRyZXZpc2lvbkRlc2MgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdjaGFuZ2UnICAgICAgID0+IHt3aGVuID0+IGxvY2FsdGltZS0+eW1kKCctJyksIHdobyA9PiAnSEwnICB9KTsKCiAgICAjIHNldCB0ZXh0cyBmb3IgcmV2aXNpb25EZXNjCiAgICAkY2hhbmdlLT5zZXRfdGV4dCgiVEVJIHZlcnNpb24gZm9yIEV1UmVDbyIpOwoKCiAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgIyBFTkQgT0YgQ1JFQVRJTkcgVEVJSEVBREVSCiAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgCn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCnN1YiBzZXRQIHsKICAgIG15ICgkcGFyYWdyYXBoKSA9IEBfOwogICAgCiAgICAkcGFyYWdyYXBoLT5zZXRfZ2koJ3AnKTsKICAgIAogICAgIyA8cGFyYWdyYXBoIGlkPSJwLWJjZDBmM2ZhLWJiZDNkYWM0LTgxNWVhZDdhIiBzdW1fbGFuZz0ifGZpbjoxfCI+CiAgICAjIGF0dHMgb2YgPHBhcmFncmFwaD46CiAgICAjICAgIEBpZCAgICAgICAgVVNFCiAgICAjICAgIEBzdW1fbGFuZyAgVVNFOiBwdXQgaW4geG1sOmxhbmcgYW5kIHByZWZpeCB0aGUgdmFsdWUgd2l0aCAieC0iIGZvciBwcml2YXRlIHZhbHVlCiAgICAKICAgICRwYXJhZ3JhcGgtPnNldF9hdHQoInhtbDpsYW5nIiwgIngtIiAuICRwYXJhZ3JhcGgtPmF0dCgic3VtX2xhbmciKSk7CiAgICAkcGFyYWdyYXBoLT5kZWxfYXR0KCJzdW1fbGFuZyIpOwogICAgIyAkcGFyYWdyYXBoLT5jaGFuZ2VfYXR0X25hbWUoJ2lkJywgJ3htbDppZCcpOwogICAgJHBhcmFncmFwaC0+ZGVsX2F0dCgiaWQiKTsgICAgICAgICAgICAgICMgZGllc2UgaWQgaXN0IGF1Y2ggbmljaHQgZWluZGV1dGlnISEKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApzdWIgc2V0UyB7CiAgICBteSAoJHNlbnRlbmNlKSA9IEBfOwogICAgCiAgICAkc2VudGVuY2UtPnNldF9naSgncycpOwoJICAgIAogICAgIyB0aGUgYXR0cyBvZiA8c2VudGVuY2U+OgogICAgIyAgICBVU0UgICAxIEBpZD0icy1iY2QwZjNmYS1iYmQzZGFjNC1mNzQyOTA5MCIKICAgICMgICAgVVNFICAgMiBAbGFuZz0iZmluIiAtPiB4bWw6bGFuZyAKICAgICMgICAgPyAgICAgMyBAbGFuZ19jb25mPSIwLjY3MzQ4NTMiPiAtPiBUb0RvIEBjZXJ0ID8JICAgIAogICAgCiAgICAjIHNldCBhdHRycyBvZiA8cz4KICAgICRzZW50ZW5jZS0+c2V0X2F0dCgieG1sOmxhbmciLCAkc2VudGVuY2UtPmF0dCgibGFuZyIpKTsgICMgVG9EbzogY29udmVydCB0aGUgdmFsdWUgLyBpbnRyb2R1Y2UgYSBoYXNoIGZvciBsb29rdXAgKGlucHV0IHZhbHVlczogImZpbiIsICJ4eHgiLCAuLi4uKQogICAgIyAkc2VudGVuY2UtPmNoYW5nZV9hdHRfbmFtZSgnaWQnLCAneG1sOmlkJyk7ICAgICAgICAgICAgIyBuaWNodCBlaW5kZXV0aWcKICAgICRzZW50ZW5jZS0+ZGVsX2F0dCgnaWQnKTsKICAgICRzZW50ZW5jZS0+ZGVsX2F0dCgibGFuZyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcGxhY2VkIGJ5IHhtbDpsYW5nCiAgICAkc2VudGVuY2UtPmRlbF9hdHQoImxhbmdfY29uZiIpOyAgICAgICAgICAgICAgICAgICAgIyBmb3IgdGhlIHRpbWUgYmVpbmcKICAgIAp9CgpzdWIgY3JlYXRlVyB7CiAgICBteSAoJHdfZWxlbWVudCwgJGxpbmUpID0gQF87CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBHZXQgdGhlIHRhZ3MgKD1jb2x1bW5zKQogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICBteSBAdGFncyA9IHNwbGl0KC9cdC8sICRsaW5lKTsKICAgIAogICAgIyBzZXQgY29udGVudCBvZiA8dz4gaS5lLiB0aGUgdG9rZW4KICAgICR3X2VsZW1lbnQtPnNldF90ZXh0KCR0YWdzWzBdKTsKICAgIAogICAgIyB2cnQgcG9zaXRpb25hbC1hdHRyaWJ1dGVzIGluIGNvcnB1cyBLTEs6CiAgICAjICBVU0UgWzBdIHdvcmQKICAgICMgIFVTRSBbMV0gcmVmICAoaWQgZm9yIHJlZmVyZW5jZSBvZiBkZXBoZWFkKQogICAgIyAgVVNFIFsyXSBsZW1tYQogICAgIyAgPyAgIFszXSBsZW1tYWNvbXAgICAobGVtbWEgd2l0aCBjb21wb3VuZCBpbmZvIC0gY291bGQgZ28gaW4gQG5vcm0sIGFzIHRhZyBhYnVzZT8pCiAgICAjICBVU0UgWzRdIHBvcyAKICAgICMgIFVTRSBbNV0gbXNkIAogICAgIyAgVVNFIFs2XSBkZXBoZWFkCiAgICAjICBVU0UgWzddIGRlcHJlbCAKICAgICMgICAgICBbOF0gY29udGVudCAgIChvY3ItcHJvY2VzcykKICAgICMgICAgICBbOV0gdnBvcyAgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxMF0gb2NyICAgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxMV0gY2MgICAgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxMl0gaHlwaCAgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxM10gc3R5bGUgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxNF0gbGV4ICAgICAgIChrb3JwIHNlbWFudGljIGRpc2FtYmlndWF0aW9uIGZyb20gRyJvdGVib3JnKQogICAgCiAgICAjIHNldCB0aGUgYXR0cmlidXRlcyBvZiA8dz46CiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJuIiwgICAgICAkdGFnc1sxXSk7CiAgICAjICR3X2VsZW1lbnQtPnNldF9hdHQoImlkIiwgICAgICJ3XyIgLiAkbmFtZWFycmF5WzRdIC4gJHNlbnRlbmNlLT5hdHQoInhtbDppZCIpIC4gIl8iIC4gJHRhZ3NbMV0pOwogICAgIyBzbyB6dXNhbW1lbmdlYmF1dGUgSUQgaXN0IGF1Y2ggbmljaHQgZWluZGV1dGlnLi4uCiAgICAkd19lbGVtZW50LT5kZWxfYXR0KCJpZCIpOwogICAgJHdfZWxlbWVudC0+c2V0X2F0dCgibGVtbWEiLCAgJHRhZ3NbMl0pOwogICAgIyAkd19lbGVtZW50LT5zZXRfYXR0KCJub3JtIiwgICAkdGFnc1szXSk7ICAjIHRhZyBhYnVzZSBvZiBAbm9ybQogICAgJHdfZWxlbWVudC0+c2V0X2F0dCgicG9zIiwgICAgJHRhZ3NbNF0pOwogICAgJHdfZWxlbWVudC0+c2V0X2F0dCgibXNkIiwgICAgJHRhZ3NbNV0pOwojVE1QICAgICR3X2VsZW1lbnQtPnNldF9hdHQoImhlYWQiLCAgICR0YWdzWzZdKTsKI1RNUCAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJkZXByZWwiLCAkdGFnc1s3XSk7CiAgICAKfQogICAgCiMjIyMjIyMjIyMjIyMjIyMjCiMjIHVzYWdlX21lc3NhZ2UKIyMjIyMjIyMjIyMjIyMjIyMKCgpzdWIgdXNhZ2VfbWVzc2FnZSB7CiAgICBwcmludCAiICAgVXNhZ2U6ICAuL3ZydDJ0ZWkucGwgPGZpbGUudnJ0LnhtbD4gPG91dGZpbGU+XG4iOwogICAgcHJpbnQgIiAgIDxmaWxlLnZydC54bWw+IGlzIGEgVlJUIGZpbGUgY29udmVydGVkIHRvIHByb3BlciBYTUxcbiI7CiAgICBleGl0Owp9CgoK