IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKIyBDYW4gZG8gYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSBjb21waWxpbmcgdG8gY29uZmlndXJpbmcuLi4KIwojIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiMKCiMtLS0gZGVmYXVsdHMgKGNoYW5nZSB0aGVzZSBpZiB5b3UgYXJlIGEgcGFja2FnZXIpCkNPTkZBUkdTPSIiICAgICAgICAgICAgICAgICAgICMgY29uZmlndXJlIGFyZ3MsIGUuZy4gLS1wcmVmaXg9L3VzciAtLXN5c2NvbmZkaXI9L2V0YwpwcmVmaXg9L3Vzci9sb2NhbCAgICAgICAgICAgICAjIGluc3RhbGxhdGlvbiBwcmVmaXgKc3lzY29uZmRpcj0kcHJlZml4L2V0YyAgICAgICAgIyB3aGVyZSB3aW5lLmNvbmYgYW5kIHRoZSBnbG9iYWwgcmVnaXN0cnkgYXJlIHN1cHBvc2VkIHRvIGJlCmJpbmRpcj0kcHJlZml4L2JpbiAgICAgICAgICAgICMgd2hlcmUgd2luZWxpYiBhcHBzIHdpbGwgYmUgKG9yIGFyZSkgaW5zdGFsbGVkCmxpYmRpcj0kcHJlZml4L2xpYiAgICAgICAgICAgICMgd2hlcmUgbGlid2luZS5zbyB3aWxsIGJlIChvciBpcykgaW5zdGFsbGVkCmV4ZGlyPWRvY3VtZW50YXRpb24vc2FtcGxlcyAgICMgd2hlcmUgdGhlIHNhbXBsZSBzeXN0ZW0uaW5pIHJlc2lkZXMKR0NPTkY9JHN5c2NvbmZkaXIvd2luZS5jb25mICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIHdpbmUuY29uZiBnbG9iYWwgY29uZmlnIGZpbGUKTENPTkY9fi8ud2luZS9jb25maWcgICAgICAgICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIGxvY2FsIGNvbmZpZyBmaWxlCkJJTkRJU1Q9bm8gICAgICAgICAgICAgICAgICAgICMgd2hldGhlciBjYWxsZWQgZnJvbSBhIGJpbmFyeSBwYWNrYWdlIGNvbmZpZyBzY3JpcHQKRE9HTE9CQUxDT05GPWF1dG8gICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9nZW5lcmF0ZSB3aW5lLmNvbmYKRE9MT0NBTENPTkY9YXV0byAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9nZW5lcmF0ZSBsb2NhbGNvbmYKRE9XQ0hLPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgZXhpc3Rpbmctd2luZG93cyBpbnN0YWxsYXRpb24KRE9XSU5FPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgbm8td2luZG93cyBpbnN0YWxsYXRpb24KRE9SRUc9YXV0byAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeQpET0FQUD1hdXRvICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gaW5zdGFsbCBhcHBsaWNhdGlvbnMsIGRpc3RyaWJ1dGVkIHdpdGggV2luZQpTWVNSRUc9eWVzICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKCiMgIm1ha2UgaW5zdGFsbCIgc3RpbGwgaW5zdGFsbHMgdGhlIGRsbHMgaW50byAkbGliZGlyLCBidXQgdGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUKIyAoRExMUEFUSCBzaG91bGQgcG9pbnQgdG8gdGhlbSBpZi93aGVuIHRoZXkgYXJlIG5vdCBpbiBzdGFuZGFyZCBsZC5zbyBwYXRocykKRExMUEFUSD0kbGliZGlyL3dpbmUgICAgICAgICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIGRsbCAuc28gZmlsZXMgKGV4Y2VwdCBsaWJ3aW5lLnNvKQoKIyB0aGlzIGlzIG9ubHkgZm9yIGV4aXN0aW5nLXdpbmRvd3MgaW5zdGFsbHMKV0lORUNPTkY9dG9vbHMvd2luZWNvbmYgICAgICAgIyBwYXRoIHRvIHRoZSB3aW5lY29uZiBwZXJsIHNjcmlwdAoKIyB0aGlzIGlzIG9ubHkgZm9yIG5vLXdpbmRvd3MgaW5zdGFsbHMKV0lORUlOST0kZXhkaXIvY29uZmlnICAgICAgICAgIyBwYXRoIHRvIHRoZSBkZWZhdWx0IHdpbmUgY29uZmlnIGZpbGUgKGFsc28gdXNlZCBieSB3aW5lY29uZikKV0lOSU5JPS9kZXYvbnVsbCAgICAgICAgICAgICAgIyBwYXRoIHRvIHRoZSBkZWZhdWx0IHdpbi5pbmkKU1lTVEVNSU5JPSRleGRpci9zeXN0ZW0uaW5pICAgIyBwYXRoIHRvIHRoZSBkZWZhdWx0IHN5c3RlbS5pbmkKUkVHRURJVD1wcm9ncmFtcy9yZWdlZGl0L3JlZ2VkaXQgICAgICAgIyBwYXRoIHRvIHRoZSByZWdlZGl0IHdpbmVsaWIgYXBwbGljYXRpb24KREVGUkVHPXdpbmVkZWZhdWx0LnJlZyAgICAgICAgIyBwYXRoIG9mIHRoZSByZWdpc3RyeSBmaWxlIHRvIGJlIGZlZCB0byByZWdlZGl0CiMgQ1JPT1Q9L3Zhci93aW5lICAgICAgICAgICAgICMgcGF0aCBvZiB0aGUgZmFrZSBEcml2ZSBDIChhc2tzIHVzZXIgaWYgbm90IHNldCkKREVGQ0FUPWNhdCAgICAgICAgICAgICAgICAgICAgIyBwcm9ncmFtIHRvIGNhdCAkREVGUkVHIHdpdGggKHNvbWUgcGFja2FnZXMgbmVlZCB6Y2F0KQojLS0tIGVuZCBvZiBkZWZhdWx0cwoKIyB0ZW1wb3JhcnkgZmlsZXMgdXNlZCBieSB0aGUgaW5zdGFsbGVyClRNUENPTkY9L3RtcC93aW5laW5zdGFsbC5jb25mCgojIGZ1bmN0aW9ucwoKZnVuY3Rpb24gc3RkX3NsZWVwIHsKICBzbGVlcCAxCn0KCmZ1bmN0aW9uIGNvbmZfcXVlc3Rpb24gewogICMgcGFyYW1ldGVyczogJDEgPSBpbXBvcnRhbmNlLCAkMiA9IHF1ZXN0aW9uLWlkLCAkMysgPSBtZXNzYWdlIGxpbmVzCiAgIyB0aGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgYnkgZS5nLiBkZWJjb25mIGluIGRlYmlhbiBwYWNrYWdlcwogICMgYnV0IGhlcmUgd2UganVzdCBwcmludCB0aGUgbWVzc2FnZQogIHNoaWZ0IDIKICBlY2hvCiAgbG9jYWwgTElORT0iJDEiCiAgd2hpbGUgc2hpZnQKICBkbyB7CiAgICBlY2hvICIkTElORSIKICAgIExJTkU9IiQxIgogIH0KICBkb25lCn0KCmZ1bmN0aW9uIGNvbmZfcmVzZXRfcXVlc3Rpb24gewogICMgcGFyYW1ldGVyczogJDEgPSBxdWVzdGlvbi1pZAogICMgdGhpcyBpcyB1c2VkIHRvIGZsdXNoIGFueSBjYWNoZWQgYW5zd2VycyBhbmQgImFscmVhZHktZGlzcGxheWVkIiBmbGFncwogIHNoaWZ0ICMgZHVtbXkgY29tbWFuZAp9CgpmdW5jdGlvbiBjb25mX3llc25vX2Fuc3dlciB7CiAgdW5zZXQgQU5TV0VSCiAgd2hpbGUgWyAiJEFOU1dFUiIgIT0gJ3llcycgXSAmJiBbICIkQU5TV0VSIiAhPSAnbm8nIF0KICBkbyB7CiAgICBlY2hvIC1uICIkMSIKICAgIHJlYWQgQU5TV0VSCiAgfQogIGRvbmUKfQoKZnVuY3Rpb24gY29uZl9zdHJpbmdfYW5zd2VyIHsKICBlY2hvIC1uICIkMSIKICByZWFkIEFOU1dFUgp9CgpmdW5jdGlvbiBjcmVhdGVfd2luZG93c19kaXJlY3RvcmllcyB7CiAgZm9yIHRkaXIgaW4gIiRDUk9PVC93aW5kb3dzIiAiJENST09UL3dpbmRvd3Mvc3lzdGVtIiBcCiAgICAgICAgICAgICAgIiRDUk9PVC93aW5kb3dzL2NvbW1hbmQiIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudSIgIiRDUk9PVC93aW5kb3dzL1N0YXJ0IE1lbnUvUHJvZ3JhbXMiIFwKICAgICAgICAgICAgICAiJENST09UL1Byb2dyYW0gRmlsZXMiICIkQ1JPT1QvUHJvZ3JhbSBGaWxlcy9Db21tb24gRmlsZXMiIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvUHJvZmlsZXMiICIkQ1JPT1Qvd2luZG93cy9Qcm9maWxlcy9BZG1pbmlzdHJhdG9yIiBcCiAgICAgICAgICAgICAgIiRDUk9PVC93aW5kb3dzL0ZvbnRzIiAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudS9Qcm9ncmFtcy9TdGFydHVwIgogIGRvIFsgLWQgIiR0ZGlyIiBdIHx8IG1rZGlyICIkdGRpciIKICBkb25lCiAgWyAtZiAiJENST09UL3dpbmRvd3Mvd2luLmluaSIgXSAgICB8fCBjcCAiJFdJTklOSSIgICAgIiRDUk9PVC93aW5kb3dzL3dpbi5pbmkiCiAgWyAtZiAiJENST09UL3dpbmRvd3Mvc3lzdGVtLmluaSIgXSB8fCBjcCAiJFNZU1RFTUlOSSIgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5pbmkiCn0KCiNjcmVhdGVzIHN5bWJvbGljIGxpbmsgaW4gd2luZG93cyBkaXJlY3RvcnkgdG8gaW5zdGFsbGVkIHdpbmVsaWIgYXBwbGljYXRpb24KI3BhcmFtZXRlcnM6CiMgLSBuYW1lIG9mIHRoZSBpbnN0YWxsZWQgd2luZWxpYiBhcHBsaWNhdGlvbgojIC0gZnVsbCBwYXRoIHRvIGFwcGxpY2F0aW9uIGluIHRoZSB3aW5lbGliIGRpcmVjdG9yeQpmdW5jdGlvbiBsaW5rX2FwcCB7CiAgaWYgWyAiJFdJTkVJTlNUQUxMRUQiID0gJ25vJyBdCiAgdGhlbiB7CiAgICBsbiAtc2YgJFBXRC9wcm9ncmFtcy8kMS8kMS5leGUuc28gJDIKICB9CiAgZWxzZSB7CiAgICBsbiAtc2YgJGxpYmRpci93aW5lLyQxLmV4ZS5zbyAkMgogIH0KICBmaQp9CgojcHV0cyB3aW5kb3dzIGFwcGxpY2F0aW9ucyByZXBsYWNlbWVudHMgdG8gd2luZG93cyBkaXJlY3RvcmllcywKI2NvbmZpZ3VyZXMgdGhlbQpmdW5jdGlvbiBjb25maWd1cmVfd2luZV9hcHBsaWNhdGlvbnMgewogIGxpbmtfYXBwIHN0YXJ0ICAgICAgICAiJENST09UL3dpbmRvd3MvY29tbWFuZC9zdGFydC5leGUiCiAgbGlua19hcHAgbm90ZXBhZCAgICAgICIkQ1JPT1Qvd2luZG93cy9ub3RlcGFkLmV4ZSIKICBsaW5rX2FwcCByZWdlZGl0ICAgICAgIiRDUk9PVC93aW5kb3dzL3JlZ2VkaXQuZXhlIgogIGxpbmtfYXBwIHJ1bmRsbDMyICAgICAiJENST09UL3dpbmRvd3MvcnVuZGxsMzIuZXhlIgogIGxpbmtfYXBwIHdjbWQgICAgICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL3djbWQuZXhlIgogIGxpbmtfYXBwIGNvbnRyb2wgICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL2NvbnRyb2wuZXhlIgogIGxpbmtfYXBwIHdpbmhlbHAgICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL2hlbHAuZXhlIgogIGxpbmtfYXBwIG5vdGVwYWQgICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL25vdGVwYWQuZXhlIgogIGxpbmtfYXBwIHByb2dtYW4gICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL3Byb2dtYW4uZXhlIgogIGxpbmtfYXBwIHJlZ3N2cjMyICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL3JlZ3N2cjMyLmV4ZSIKICBsaW5rX2FwcCB3aW5lbWluZSAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS93aW5taW5lLmV4ZSIKICBsaW5rX2FwcCB3aW52ZXIgICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS93aW52ZXIuZXhlIgogIGxpbmtfYXBwIHVuaW5zdGFsbGVyICAiJENST09UL3dpbmRvd3MvdW5pbnN0YWxsLmV4ZSIKICBsaW5rX2FwcCB3aW5oZWxwICAgICAgIiRDUk9PVC93aW5kb3dzL3dpbmhlbHAuZXhlIgogIGxpbmtfYXBwIHdpbmhlbHAgICAgICAiJENST09UL3dpbmRvd3Mvd2luaGxwMzIuZXhlIgp9CgojIHN0YXJ0dXAuLi4KCmVjaG8gIldJTkUgSW5zdGFsbGVyIHYwLjc0IgplY2hvCgojIGNoZWNrIGZvciByZWRoYXQgOSB3aXRoIHRscyBsaWJzIHNvIHdlIGNhbiBlbmFibGUgLS13aXRoLW5wdGwgdW50aWwgcnVudGltZSBkZXRlY3Rpb24gaXMgY29tcGxldGUKaWYgWyAtZSAvZXRjL3JlZGhhdC1yZWxlYXNlIF0gJiYgZ3JlcCAiU2hyaWtlIiAvZXRjL3JlZGhhdC1yZWxlYXNlICY+L2Rldi9udWxsICYmIFsgLWUgL2xpYi90bHMgXTsgdGhlbgogICAgQ09ORkFSR1M9IiRDT05GQVJHUyAtLXdpdGgtbnB0bCIKZmkKCmlmIFsgIiRCSU5ESVNUIiA9ICdubycgXQp0aGVuIHsKCiAgaWYgISBbIC1mIGNvbmZpZ3VyZSBdCiAgdGhlbiB7CiAgICBpZiBbIC1mIC4uL2NvbmZpZ3VyZSBdCiAgICB0aGVuIHsKICAgICAgcHVzaGQgLi4KICAgIH0KICAgIGVsc2UgewogICAgICBlY2hvICJZb3UncmUgcnVubmluZyB0aGlzIGZyb20gdGhlIHdyb25nIGRpcmVjdG9yeS4iCiAgICAgIGVjaG8gIkNoYW5nZSB0byB0aGUgV2luZSBzb3VyY2UncyBtYWluIGRpcmVjdG9yeSBhbmQgdHJ5IGFnYWluLiIKICAgICAgZXhpdCAxCiAgICB9CiAgICBmaQogIH0KICBmaQoKICBpZiBbIGB3aG9hbWlgID09ICdyb290JyBdCiAgdGhlbiB7CiAgICBlY2hvICJZb3UgYXJlIHJ1bm5pbmcgd2luZWluc3RhbGwgYXMgcm9vdCwgdGhpcyBpcyBub3QgYWR2aXNhYmxlLiBQbGVhc2UgcmVydW4gYXMgYSB1c2VyLiIKICAgIGVjaG8gIkFib3J0aW5nLiIKICAgIGV4aXQgMQogIH0KICBmaQoKICAjIGNoZWNrIHdoZXRoZXIgUlBNIGluc3RhbGxlZCwgYW5kIGlmIGl0IGlzLCByZW1vdmUgYW55IG9sZCB3aW5lIHJwbS4KICBoYXNoIHJwbSAmPi9kZXYvbnVsbAogIFJFVD0kPwogIGlmIFsgJFJFVCAtZXEgMCBdOyB0aGVuCiAgICBpZiBbIC1uICJgcnBtIC1xaSB3aW5lIDI+L2Rldi9udWxsfGdyZXAgIl5OYW1lImAiIF07IHRoZW4KICAgICAgZWNobyAiV2FybmluZzogT2xkIFdpbmUgUlBNIGluc3RhbGwgZGV0ZWN0ZWQuIERvIHlvdSB3YW50IHRvIHJlbW92ZSBpdCBmaXJzdD8iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gJ3llcycgXTsgdGhlbgogICAgICAgIGVjaG8gIldlIG5lZWQgdG8gcmVtb3ZlIHRoZSBycG0gYXMgcm9vdCwgcGxlYXNlIGVudGVyIHlvdXIgcm9vdCBwYXNzd29yZCIKICAgICAgICBlY2hvCiAgICAgICAgZWNobyBTdGFydGluZyB3aW5lIHJwbSByZW1vdmFsLi4uCiAgICAgICAgc3UgLWMgInJwbSAtZSB3aW5lOyBSRVQ9JD8iCiAgICAgICAgaWYgWyAkUkVUIC1lcSAwIF07IHRoZW4KICAgICAgICAgIGVjaG8gRG9uZS4KICAgICAgICBlbHNlCiAgICAgICAgICBlY2hvICJGQUlMRUQuIFByb2JhYmx5IHlvdSBhcmVuJ3QgaW5zdGFsbGluZyBhcyByb290LiIKICAgICAgICAgIGVjaG8gIkV4cGVjdCBwcm9ibGVtcyAobGlicmFyeSBjb25mbGljdHMgd2l0aCBleGlzdGluZyBpbnN0YWxsIGV0Yy4pLiIKICAgICAgICBmaQogICAgICBlbHNlCiAgICAgICAgZWNobyAiU29ycnksIEkgd29uJ3QgaW5zdGFsbCBXaW5lIHdoZW4gYW4gcnBtIHZlcnNpb24gaXMgc3RpbGwgaW5zdGFsbGVkLiIKICAgICAgICBlY2hvICIoV2luZSBzdXBwb3J0IHN1ZmZlcmVkIGZyb20gd2F5IHRvbyBtYW55IGNvbmZsaWN0cyBiZXR3ZWVuIFJQTSIKICAgICAgICBlY2hvICJhbmQgc291cmNlIGluc3RhbGxzKSIKICAgICAgICBlY2hvICJIYXZlIGEgbmljZSBkYXkgISIKICAgICAgICBleGl0IDEKICAgICAgZmkKICAgIGZpCiAgZmkKCiAgIyBjaGVjayB3aGV0aGVyIHdpbmUgYmluYXJ5IHN0aWxsIGF2YWlsYWJsZQogIGlmIFsgLW4gImB3aGljaCB3aW5lIDI+L2Rldi9udWxsfGdyZXAgJy93aW5lJ2AiIF07IHRoZW4KICAgIGVjaG8gIldhcm5pbmcgISEgd2luZSBiaW5hcnkgKHN0aWxsKSBmb3VuZCwgd2hpY2ggbWF5IGluZGljYXRlIgogICAgZWNobyAiYSAoY29uZmxpY3RpbmcpIHByZXZpb3VzIGluc3RhbGxhdGlvbi4iCiAgICBlY2hvICJZb3UgbWlnaHQgd2FudCB0byBhYm9ydCBhbmQgdW5pbnN0YWxsIFdpbmUgZmlyc3QuIgogICAgc3RkX3NsZWVwCiAgZmkKCiAgIyBydW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGlmIG5lY2Vzc2FyeQoKICBpZiBbIC1mIGNvbmZpZy5jYWNoZSBdICYmIFsgLWYgTWFrZWZpbGUgXSAmJiBbIE1ha2VmaWxlIC1udCBjb25maWd1cmUgXQogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiSSBzZWUgdGhhdCBXSU5FIGhhcyBhbHJlYWR5IGJlZW4gY29uZmlndXJlZCwgc28gSSdsbCBza2lwIHRoYXQuIgogICAgc3RkX3NsZWVwCiAgICAjIGxvYWQgY29uZmlndXJlIHJlc3VsdHMKICAgIC4gLi9jb25maWcuY2FjaGUKICB9CiAgZWxzZSB7CiAgICBlY2hvICJSdW5uaW5nIGNvbmZpZ3VyZS4uLiIKICAgIGVjaG8KICAgIGlmICEgLi9jb25maWd1cmUgLUMgJENPTkZBUkdTIC0tcHJlZml4PSRwcmVmaXgKICAgIHRoZW4gewogICAgICBlY2hvCiAgICAgIGVjaG8gIkNvbmZpZ3VyZSBmYWlsZWQsIGFib3J0aW5nIGluc3RhbGwuIgogICAgICBybSAtZiBjb25maWcuY2FjaGUKICAgICAgZXhpdCAxCiAgICB9CiAgICBmaQogICAgIyBsb2FkIGNvbmZpZ3VyZSByZXN1bHRzCiAgICAuIC4vY29uZmlnLmNhY2hlCiAgICAjIG1ha2Ugc3VyZSBYIHdhcyBmb3VuZAogICAgZXZhbCAiJGFjX2N2X2hhdmVfeCIKICAgIGlmIFsgIiRoYXZlX3giICE9ICJ5ZXMiIF0KICAgIHRoZW4gewogICAgICBlY2hvICJJbnN0YWxsIHRoZSBYIGRldmVsb3BtZW50IGhlYWRlcnMgYW5kIHRyeSBhZ2Fpbi4iCiAgICAgIHJtIC1mIGNvbmZpZy5jYWNoZQogICAgICBleGl0IDEKICAgIH0KICAgIGZpCiAgfQogIGZpCgogICMgbm93IGRvIHRoZSBjb21waWxhdGlvbiBhbmQgaW5zdGFsbCwgd2UgbmVlZCB0byBhbHdheXMgZG8gdGhpcyBiZWNhdXNlIHdlCiAgIyBkb24ndCB3YW50IHRoZSAnbWFrZSBpbnN0YWxsJyBjb21tYW5kIHdlIG1pZ2h0IHJ1biB0byBydW4gJ21ha2UnIGFzIHJvb3QKICBpZiBbIGB3aG9hbWlgICE9ICdyb290JyBdCiAgdGhlbiB7CiAgICAjIGFzayB0aGUgdXNlciBpZiB0aGV5IHdhbnQgdG8gYnVpbGQgYW5kIGluc3RhbGwgd2luZQogICAgZWNobwogICAgZWNobyAiV2UgbmVlZCB0byBpbnN0YWxsIHdpbmUgYXMgcm9vdCB1c2VyLCBkbyB5b3Ugd2FudCB1cyB0byBidWlsZCB3aW5lLCIKICAgIGVjaG8gIidzdSByb290JyBhbmQgaW5zdGFsbCBXaW5lPyAgRW50ZXIgJ25vJyB0byBjb250aW51ZSB3aXRob3V0IGluc3RhbGxpbmciCiAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgUk9PVElOU1RBTEw9IiRBTlNXRVIiCgogICAgaWYgWyAiJFJPT1RJTlNUQUxMIiA9ICJ5ZXMiIF0KICAgIHRoZW4gewogICAgICAjIHN0YXJ0IG91dCB3aXRoIHRoZSBiYXNpYyBjb21tYW5kCiAgICAgIHN1Y29tbWFuZD0ibWFrZSBpbnN0YWxsIgoKICAgICAgIyBpZiB0aGUgdXNlciBkb2Vzbid0IGhhdmUgJGxpYmRpciBpbiB0aGVpciBsZC5zby5jb25mIGFkZCB0aGlzCiAgICAgICMgdG8gb3VyIHN1Y29tbWFuZCBzdHJpbmcKICAgICAgaWYgWyAtZiAvZXRjL2xkLnNvLmNvbmYgXQogICAgICB0aGVuCiAgICAgICAgaWYgISBncmVwIC1zICIkbGliZGlyIiAvZXRjL2xkLnNvLmNvbmYgPi9kZXYvbnVsbCAyPiYxCiAgICAgICAgdGhlbiB7CiAgICAgICAgICBlY2hvCiAgICAgICAgICBlY2hvICIkbGliZGlyIGRvZXNuJ3QgZXhpc3QgaW4geW91ciAvZXRjL2xkLnNvLmNvbmYsIGl0IHdpbGwgYmUgYWRkZWQiCiAgICAgICAgICBlY2hvICJ3aGVuIHdlIHBlcmZvcm0gdGhlIGluc3RhbGwuLi4iCiAgICAgICAgICBzdWNvbW1hbmQ9IiRzdWNvbW1hbmQ7ZWNobyAkbGliZGlyPj4vZXRjL2xkLnNvLmNvbmYiCiAgICAgICAgfQogICAgICAgIGZpCiAgICAgICAgIyBydW4gbGRjb25maWcgYWx3YXlzIGp1c3QgaW4gY2FzZSBzb21lIHVwZGF0ZWQgZmlsZXMgZG9udCBnZXQgbGlua2VkCiAgICAgICAgc3Vjb21tYW5kPSIkc3Vjb21tYW5kOyRhY19jdl9wYXRoX0xEQ09ORklHIgogICAgICBmaQogICAgfQogICAgZmkgIyBbICIkUk9PVElOU1RBTEwiID0gInllcyIgXQoKICAgIGVjaG8KCiAgICBlY2hvICJDb21waWxpbmcgV0lORS4gR3JhYiBhIGx1bmNoIG9yIHR3bywgcmVudCBhIHZpZGVvLCBvciB3aGF0ZXZlciwiCiAgICBlY2hvICJpbiB0aGUgbWVhbnRpbWUuLi4iCiAgICBlY2hvCiAgICBzdGRfc2xlZXAKCiAgICAjIHRyeSB0byBqdXN0IG1ha2Ugd2luZSwgaWYgdGhpcyBmYWlscyAnbWFrZSBkZXBlbmQnIGFuZCB0cnkgdG8gcmVtYWtlCiAgICBpZiAhIHsgbWFrZTsgfQogICAgdGhlbiB7CiAgICAgIGlmICEgeyBtYWtlIGRlcGVuZCAmJiBtYWtlOyB9CiAgICAgIHRoZW4gewogICAgICAgIGVjaG8KICAgICAgICBlY2hvICJDb21waWxhdGlvbiBmYWlsZWQsIGFib3J0aW5nIGluc3RhbGwuIgogICAgICAgIGV4aXQgMQogICAgICB9CiAgICAgIGZpCiAgICB9CiAgICBmaQoKICAgIGlmIFsgIiRST09USU5TVEFMTCIgPSAieWVzIiBdCiAgICB0aGVuIHsKICAgICAgZWNobwoKICAgICAgZWNobyAiUGVyZm9ybWluZyAnbWFrZSBpbnN0YWxsJyBhcyByb290IHRvIGluc3RhbGwgYmluYXJpZXMsIGVudGVyIHJvb3QgcGFzc3dvcmQiCgogICAgICBzdGRfc2xlZXAKCiAgICAgIGlmICEgc3Ugcm9vdCAtYyAiJHN1Y29tbWFuZCIKICAgICAgdGhlbiB7CiAgICAgIAlpZiAhIHN1IHJvb3QgLWMgIiRzdWNvbW1hbmQiCiAgICAgICAgdGhlbiB7CiAgICAgIAkgICAgIGVjaG8KICAgICAgICAgICAgIGVjaG8gIkVpdGhlciB5b3UgZW50ZXJlZCBhbiBpbmNvcnJlY3QgcGFzc3dvcmQgb3Igd2UgZmFpbGVkIHRvIgogICAgICAgICAgICAgZWNobyAicnVuICckc3Vjb21tYW5kJyBjb3JyZWN0bHkuIgogICAgICAgICAgICAgZWNobyAiSWYgeW91IGRpZG4ndCBlbnRlciBhbiBpbmNvcnJlY3QgcGFzc3dvcmQgdGhlbiBwbGVhc2UiCiAgICAgICAgICAgICBlY2hvICJyZXBvcnQgdGhpcyBlcnJvciBhbmQgYW55IHN0ZXBzIHRvIHBvc3NpYmx5IHJlcHJvZHVjZSBpdCB0byIKICAgICAgICAgICAgIGVjaG8gImh0dHA6Ly9idWdzLndpbmVocS5jb20vIgogICAgICAgICAgICAgZWNobwogICAgICAgICAgICAgZWNobyAiSW5zdGFsbGF0aW9uIGZhaWxlZCwgYWJvcnRpbmcuIgogICAgICAgICAgICAgZXhpdCAxCiAgICAgICAgIH0KICAgICAgICAgZmkKICAgICAgIH0KICAgICAgZmkKCiAgICAgIGVjaG8KCiAgICAgICMgc2VlIGlmIHdpbmUgaXMgaW5zdGFsbGVkIG9uIHRoZSB1c2VycyBzeXN0ZW0sIGlmIG5vdCBwcm9tcHQgdGhlbQogICAgICAjIGFuZCB0aGVuIGV4aXQKICAgICAgaWYgWyAhIGB3aGljaCB3aW5lYCBdCiAgICAgIHRoZW4KICAgICAgICBlY2hvICJDb3VsZCBub3QgZmluZCB3aW5lIG9uIHlvdXIgc3lzdGVtLiAgUnVuIHdpbmVpbnN0YWxsIGFzIHJvb3QgdG8gaW5zdGFsbCB3aW5lIgogICAgICAgIGVjaG8gImJlZm9yZSByZS1ydW5uaW5nIHdpbmVpbnN0YWxsIGFzIGEgdXNlci4iCiAgICAgICAgZWNobwogICAgICAgIGVjaG8gIkV4aXRpbmcgd2luZWluc3RhbGwiCiAgICAgICAgZXhpdCAxOwogICAgICBmaQoKICAgICAgV0lORUlOU1RBTExFRD15ZXMKICAgIH0KICAgIGVsc2UgewogICAgICAjIHVzZXIgZGlkbid0IHdhbnQgdG8gaW5zdGFsbCB3aW5lIHNvIHRlbGwgdGhlbSBhYm91dCBydW5uaW5nIGZyb20gdGhlCiAgICAgICMgY3VycmVudCBkaXJlY3RvcnkgYW5kIHNldCBzb21lIHN0dWZmIHVwIGZvciB0aGVtCgogICAgICAjIHNldHVwIHRvIHJ1biBmcm9tIGN1cnJlbnQgZGlyZWN0b3J5CiAgICAgIERMTFBBVEg9IiRQV0QvZGxscyIKICAgICAgaWYgWyAteiAiJExEX0xJQlJBUllfUEFUSCIgXQogICAgICB0aGVuIExEX0xJQlJBUllfUEFUSD0iJFBXRDokRExMUEFUSCIKICAgICAgZWxzZSBMRF9MSUJSQVJZX1BBVEg9IiRMRF9MSUJSQVJZX1BBVEg6JFBXRDokRExMUEFUSCIKICAgICAgZmkKICAgICAgZXhwb3J0IExEX0xJQlJBUllfUEFUSAogICAgICBlY2hvCiAgICAgIGVjaG8gIk5PVEUhIFRvIHJ1biBXaW5lIHdpdGhvdXQgaW5zdGFsbGluZywgeW91IG11c3Qgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSIKICAgICAgZWNobyAiTERfTElCUkFSWV9QQVRIIHRvICRQV0Q6JERMTFBBVEgiCiAgICAgIGVjaG8gImluIHlvdXIgbG9nb24gc2NyaXB0cy4iCiAgICAgIGVjaG8KCiAgICAgIFdJTkVJTlNUQUxMRUQ9bm8KICAgIH0KICAgIGZpICMgWyAiJFJPT1RJTlNUQUxMIiA9ICJ5ZXMiIF0KICB9CiAgZmkgIyBbIGB3aG9hbWlgICE9ICdyb290JyBdCgp9CmZpICMgQklORElTVAoKIyBub3cgY2hlY2sgd2hldGhlciB3ZSBzaG91bGQgZ2VuZXJhdGUgd2luZS5jb25mCmlmIFsgLXogIiRET0dMT0JBTENPTkYiIF0KdGhlbgogIERPR0xPQkFMQ09ORj1hdXRvCmZpCgppZiBbICIkRE9HTE9CQUxDT05GIiA9ICdhdXRvJyBdCnRoZW4gewogICMgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHN5c3RlbSB3aW5lLmNvbmYKICBpZiBbICEgLWYgJEdDT05GIF0gJiYgWyBgd2hvYW1pYCA9ICdyb290JyBdCiAgdGhlbgogICAgRE9HTE9CQUxDT05GPW5vCiAgICBlY2hvICJDcmVhdGlvbiBvZiBhIGdsb2JhbCBjb25maWcgZmlsZSBpcyBub3Qgc3VwcG9ydGVkIGluIHdpbmVpbnN0YWxsIGF0IHRoaXMiCiAgICBlY2hvICJ0aW1lLiAgV2hlbiB0aGUgY29uZmlndXJhdGlvbiBhcmNoaXRlY3R1cmUgaXMgY2xlYW5lZCB1cCB0aGlzIGZ1bmN0aW9uYWxpdHkiCiAgICBlY2hvICJ3aWxsIGJlIHJlc3RvcmVkIHRvIHdpbmVpbnN0YWxsLiIKICAgIGVjaG8KICBmaQp9CmZpCgppZiBbICIkRE9MT0NBTENPTkYiID0gJ2F1dG8nIF0KdGhlbiB7CiAgIyBzZWUgaWYgdGhlIHVzZXIgaXMgcm9vdCwgaWYgc28sIGV4cGxpY2l0bHkgYXNrIHRoZW0gaWYgdGhleSB3YW50IGEKICAjIGxvY2FsIGNvbmZpZyBmaWxlCiAgaWYgWyBgd2hvYW1pYCA9ICdyb290JyBdCiAgdGhlbgogICAgZWNobyAiWW91IGFyZSBydW5uaW5nIGFzIHJvb3QuICBEbyB5b3Ugd2FudCBhIGxvY2FsIGNvbmZpZyBmaWxlLCIKICAgIGVjaG8gImZpbGUsIH4vLndpbmUvY29uZmlnLCBjcmVhdGVkPyIKICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICBET0xPQ0FMQ09ORj0iJEFOU1dFUiIKICBlbHNlCiAgICAjIGlmIHRoZSB1c2VyIGhhcyBhbiBleGlzdGluZyBjb25maWcgZmlsZSBhc2sgdGhlbSBpZiB0aGV5IHdhbnQgdXMgdG8KICAgICMgb3ZlcndyaXRlIGl0LCBvdGhlcndpc2UganVzdCBhc2sgdGhlbSBpZiB0aGV5IHdhbnQgdG8gY3JlYXRlIG9uZQogICAgaWYgWyAtZiAiJExDT05GIiBdCiAgICB0aGVuCiAgICAgIGVjaG8gIkZvdW5kIGV4aXN0aW5nICRMQ09ORiwgZG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIHRoaXMiCiAgICAgIGVjaG8gImV4aXN0aW5nIFdpbmUgY29uZmlndXJhdGlvbiBmaWxlPyIKICAgICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgICAgRE9MT0NBTENPTkY9IiRBTlNXRVIiCiAgICAgIGVjaG8KICAgICAgaWYgWyAiJEFOU1dFUiIgPSAieWVzIiBdCiAgICAgIHRoZW4KICAgICAgewogICAgICAgIGVjaG8gIldvdWxkIHlvdSBsaWtlIHRvIG1ha2UgYSBiYWNrdXAgb2YgdGhpcyBvbGQgY29uZmlnIGZpbGU/IgogICAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgICAgZWNobwogICAgICAgIGlmIFsgIiRBTlNXRVIiID0gInllcyIgXQogICAgICAgIHRoZW4KICAgICAgICB7CiAgICAgICAgICBlY2hvICJSZW5hbWluZyAkTENPTkYgdG8gJExDT05GLm9sZCIKICAgICAgICAgIG12IC1mICIkTENPTkYiICIkTENPTkYub2xkIgogICAgICAgICAgZWNobwogICAgICAgIH0KICAgICAgICBmaQogICAgICB9CiAgICAgIGZpCiAgICBlbHNlCiAgICB7CiAgICAgIGVjaG8gIkNyZWF0ZSBsb2NhbCBjb25maWcgZmlsZSB+Ly53aW5lL2NvbmZpZz8iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgIERPTE9DQUxDT05GPSIkQU5TV0VSIgogICAgICBlY2hvCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gJ25vJyBdCiAgICAgIHRoZW4KICAgICAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggbmVlZF9yb290IFwKICAgICAgICAgICJBYm9ydGluZyBpbnN0YWxsLiBUcnkgYWdhaW4gYXMgcm9vdCB0byBnZW5lcmF0ZSBhIHN5c3RlbSB3aW5lLmNvbmYuIgogICAgICAgIGV4aXQgMQogICAgICBmaQogICAgfQogICAgZmkKICBmaQp9CmZpCgojIGdlbmVyYXRlICRUTVBDT05GIGZyb20gZXhpc3Rpbmcgd2luZG93cyBpbnN0YWxsLCBpZiBhbnkKaWYgWyAiJERPTE9DQUxDT05GIiA9ICd5ZXMnIF0KdGhlbiB7CiAgaWYgWyAiJERPV0NISyIgPSAneWVzJyBdIHx8IFsgIiRET1dDSEsiID0gJ2F1dG8nIF0KICB0aGVuIHsKICAgIGVjaG8gLW4gIlNlYXJjaGluZyBmb3IgYW4gZXhpc3RpbmcgV2luZG93cyBpbnN0YWxsYXRpb24uLi4iCiAgICBpZiAhICRXSU5FQ09ORiAtaW5pZmlsZSAiJFdJTkVJTkkiID4gJFRNUENPTkYgMj4vZGV2L251bGwKICAgIHRoZW4gewogICAgICBybSAtZiAkVE1QQ09ORiA+IC9kZXYvbnVsbAoKICAgICAgZWNobyAiIG5vdCBmb3VuZC4gKG5vIG1hdGNoaW5nIC9ldGMvZnN0YWIgbW91bnQgZW50cnkgZm91bmQpIgogICAgICBjb25mX3F1ZXN0aW9uIGxvdyBkb193aXRob3V0X3dpbmRvd3MgXAogICAgICAgIldpbmRvd3Mgd2FzIG5vdCBmb3VuZCBvbiB5b3VyIHN5c3RlbSwgc28gSSBhc3N1bWUgeW91IHdhbnQiIFwKICAgICAgICJhIFdpbmUtb25seSBpbnN0YWxsYXRpb24uIEFtIEkgY29ycmVjdD8iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gJ25vJyBdCiAgICAgIHRoZW4gewogICAgICAgIGNvbmZfcXVlc3Rpb24gaGlnaCB3aW5kb3dzX25vdF9mb3VuZCBcCiAgICAgICAgICJBYm9ydGluZyBpbnN0YWxsLiBNYWtlIHN1cmUgeW91ciBXaW5kb3dzIHBhcnRpdGlvbiBpcyBtb3VudGVkIGFuZCB0cnkgYWdhaW4sIiBcCiAgICAgICAgICJvciBjcmVhdGUgJExDT05GIG1hbnVhbGx5IGJ5IGNvcHlpbmcgZnJvbSAkV0lORUlOSSBhbmQgYWRhcHRpbmcgdGhlIGRyaXZlIHBhdGhzLiIKICAgICAgICBleGl0IDEKICAgICAgfQogICAgICBmaQogICAgICBET1dJTkU9eWVzCiAgICB9CiAgICBlbHNlIHsKICAgICAgZWNobyAiIGZvdW5kLiIKCiAgICAgIGNvbmZfcXVlc3Rpb24gbG93IGRvX3dpdGhvdXRfd2luZG93cyBcCiAgICAgICAiV2luZG93cyB3YXMgZm91bmQgb24geW91ciBzeXN0ZW0sIGFuZCBzbyB3ZSBjYW4gdXNlIHRoZSBXaW5kb3dzIiBcCiAgICAgICAiRHJpdmUgYXMgb3VyIFdpbmUgZHJpdmUuIFlvdSBtYXksIGhvd2V2ZXIsIHdpc2ggdG8gY3JlYXRlIGEgY2xlYW4iIFwKICAgICAgICJXaW5lIGluc3RhbGwgYW55d2F5cy4iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICJTaG91bGQgSSB1c2UgdGhlIFdpbmRvd3MgZHJpdmUgZm9yIHRoZSBXaW5lIGluc3RhbGw/ICh5ZXMvbm8pICIKICAgICAgaWYgWyAiJEFOU1dFUiIgPSAneWVzJyBdCiAgICAgIHRoZW4gewogICAgICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gd2luZG93c19mb3VuZAogICAgICAgIGNvbmZfcXVlc3Rpb24gbG93IHdpbmRvd3NfZm91bmQgXAogICAgICAgICAiQ3JlYXRlZCAkTENPTkYgdXNpbmcgeW91ciBleGlzdGluZyBXaW5kb3dzIGluc3RhbGxhdGlvbi4iIFwKICAgICAgICAgIllvdSBwcm9iYWJseSB3YW50IHRvIHJldmlldyB0aGUgZmlsZSwgdGhvdWdoLiIKICAgICAgICBET1dJTkU9bm8KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBET1dJTkU9eWVzCiAgICAgIH0KICAgICAgZmkKICAgIH0KICAgIGZpCiAgfQogIGVsaWYgWyAiJERPV0lORSIgPSAnYXV0bycgXQogIHRoZW4gRE9XSU5FPXllcwogIGZpCn0KZWxpZiBbICIkRE9XSU5FIiA9ICdhdXRvJyBdCnRoZW4KICBET1dJTkU9bm8KZmkKCiMgc2V0dXAgYSBuby13aW5kb3dzIGluc3RhbGxhdGlvbiwgaWYgbmVjZXNzYXJ5CmlmIFsgIiRET1dJTkUiID0gJ3llcycgXQp0aGVuIHsKICAjIHNldCBhbiBhcHByb3ByaWF0ZSBEQ1JPT1QKICBpZiBbIGB3aG9hbWlgICE9ICdyb290JyBdCiAgdGhlbiBEQ1JPT1Q9fi9jCiAgZWxzZSBEQ1JPT1Q9L2MKICBmaQoKICBjb25mX3F1ZXN0aW9uIGxvdyBkcml2ZWNfcGF0aCBcCiAgICAgIkNvbmZpZ3VyaW5nIFdpbmUgd2l0aG91dCBXaW5kb3dzLiIgXAogICAgICJTb21lIGZha2UgV2luZG93cyBkaXJlY3RvcmllcyBtdXN0IGJlIGNyZWF0ZWQsIHRvIGhvbGQgYW55IC5pbmkgZmlsZXMsIERMTHMsIiBcCiAgICAgInN0YXJ0IG1lbnUgZW50cmllcywgYW5kIG90aGVyIHRoaW5ncyB5b3VyIGFwcGxpY2F0aW9ucyBtYXkgbmVlZCB0byBpbnN0YWxsLiIgXAogICAgICJXaGVyZSB3b3VsZCB5b3UgbGlrZSB5b3VyIGZha2UgQyBkcml2ZSB0byBiZSBwbGFjZWQ/IgogIHdoaWxlIFsgLXogIiRDUk9PVCIgXQogIGRvIHsKICAgIGNvbmZfc3RyaW5nX2Fuc3dlciAiKGRlZmF1bHQgaXMgJERDUk9PVCkgIgogICAgWyAteiAiJEFOU1dFUiIgXSAmJiBBTlNXRVI9IiREQ1JPT1QiCiAgICBpZiAhIFsgLWQgIiRBTlNXRVIiIF0KICAgIHRoZW4gewogICAgICBpZiBta2RpciAtcCAiJEFOU1dFUiIKICAgICAgdGhlbiBDUk9PVD0iJEFOU1dFUiIKICAgICAgZWxzZQogICAgICAgICAgZWNobyAiRGlyZWN0b3J5ICRBTlNXRVIgY2FuJ3QgYmUgY3JlYXRlZCAhIgogICAgICAgICAgY29uZl9yZXNldF9xdWVzdGlvbiBkcml2ZWNfcGF0aAogICAgICBmaQogICAgfQogICAgZWxzZSBDUk9PVD0iJEFOU1dFUiIKICAgIGZpCiAgfQogIGRvbmUKICBlY2hvICJDb25maWd1cmluZyBXaW5lIGZvciBhIG5vLXdpbmRvd3MgaW5zdGFsbCBpbiAkQ1JPT1QuLi4iCgogICAgY3JlYXRlX3dpbmRvd3NfZGlyZWN0b3JpZXMKICAgIGNvbmZpZ3VyZV93aW5lX2FwcGxpY2F0aW9ucwoKICAjIGNyZWF0ZSAkTENPTkYgdXNpbmcgdGhlIGRlZmF1bHQgY29uZmlnIGZpbGUgJFdJTkVJTkkKICBpZiBbICIkRE9MT0NBTENPTkYiID0gJ3llcycgXQogIHRoZW4gewogICAgc2VkICJzfFwiUGF0aFwiID0gXCIvY1wiXCR8XCJQYXRoXCIgPSBcIiR7Q1JPT1R9XCJ8IiAkV0lORUlOSSA+ICRUTVBDT05GCiAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIGRlZmF1bHRfY29uZmlnCiAgICBjb25mX3F1ZXN0aW9uIGxvdyBkZWZhdWx0X2NvbmZpZyBcCiAgICAgIkNyZWF0ZWQgJExDT05GIHVzaW5nIGRlZmF1bHQgV2luZSBjb25maWd1cmF0aW9uLiIgXAogICAgICJZb3UgcHJvYmFibHkgd2FudCB0byByZXZpZXcgdGhlIGZpbGUsIHRob3VnaC4iCiAgfQogIGZpCgogICMgbm93IHdlIHJlYWxseSBzaG91bGQgaW5zdGFsbCB0aGUgcmVnaXN0cnkKICBpZiBbICIkRE9SRUciID0gJ2F1dG8nIF0KICB0aGVuIERPUkVHPXllcwogIGZpCn0KZmkKZWNobwoKI2luc3RhbGwgdGhlIGxvY2FsIGNvbmZpZyBmaWxlICRMQ09ORgppZiBbICIkRE9MT0NBTENPTkYiID0gJ3llcycgXQp0aGVuCiAgaWYgWyAhIC13IH4vLndpbmUgXQogIHRoZW4KICAgIG1rZGlyIH4vLndpbmUKICBmaQogIGNwICRUTVBDT05GICRMQ09ORiA+IC9kZXYvbnVsbAplbHNlCiAgRE9SRUc9bm8KZmkKCiNpbnN0YWxsIHRoZSBnbG9iYWwgY29uZmlnIGZpbGUgJEdDT05GCmlmIFsgIiRET0dMT0JBTENPTkYiID0gJ3llcycgXQp0aGVuCiAgaWYgWyAhIC1mICRzeXNjb25mZGlyIF0KICB0aGVuCiAgICBta2RpciAtcCAkc3lzY29uZmRpcgogIGZpCgogIGNwICRUTVBDT05GICRHQ09ORiA+IC9kZXYvbnVsbApmaQoKIyBjaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gaW5zdGFsbCBkZWZhdWx0IHJlZ2lzdHJ5CiMgKG5vdCB0byBiZSBkb25lIGlmIHdpbmRvd3MgcmVnaXN0cnkgZXhpc3RzKQppZiBbICIkRE9SRUciID0gJ2F1dG8nIF0KdGhlbiB7CiAgQ1JPT1Q9YHNlZCAtbiAnL15cW0RyaXZlIENcXSQvLC9eXFsuKlxdJC8gcy9eXCJQYXRoXCIgPSBcIlwoLipcKVwiL1wxL3AnICRMQ09ORmAKICBlY2hvICJDaGVja2luZyBmb3IgcmVhbCBXaW5kb3dzIHJlZ2lzdHJ5Li4uIgogIGlmIFsgLWYgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5kYXQiIF0KICB0aGVuIERPUkVHPW5vCiAgZWxpZiBbIC1mICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi9jb25maWcvc3lzdGVtIiBdCiAgdGhlbiBET1JFRz1ubwogIGVsaWYgWyAtZiAiJENST09UL1dJTk5UL3N5c3RlbTMyL2NvbmZpZy9zeXN0ZW0iIF0KICB0aGVuIERPUkVHPW5vCiAgZWxzZSBET1JFRz15ZXMKICBmaQogIGlmIFsgIiRET1JFRyIgPSAneWVzJyBdCiAgdGhlbiBlY2hvICJOb3QgZm91bmQsIGRlZmF1bHQgV2luZSByZWdpc3RyeSB3aWxsIGJlIGluc3RhbGxlZC4iCiAgZWxzZSBlY2hvICJXaW5kb3dzIHJlZ2lzdHJ5IGZvdW5kLCB3aWxsIG5vdCBpbnN0YWxsIGRlZmF1bHQgV2luZSByZWdpc3RyeS4iCiAgZmkKICBlY2hvCn0KZmkKCiMgaW5zdGFsbCBkZWZhdWx0IHJlZ2lzdHJ5IGVudHJpZXMKaWYgWyAiJERPUkVHIiA9ICd5ZXMnIF0KdGhlbiB7CiAgaWYgWyAiJEJJTkRJU1QiID0gJ25vJyBdCiAgdGhlbiB7CiAgICBlY2hvICJDb21waWxpbmcgcmVnZWRpdC4uLiIKICAgIChjZCBwcm9ncmFtcy9yZWdlZGl0OyBtYWtlKQogICAgZWNobwogIH0KICBmaQogIGVjaG8gIlByZXBhcmluZyB0byBpbnN0YWxsIGRlZmF1bHQgV2luZSByZWdpc3RyeSBlbnRyaWVzLi4uIgoKICAjIE1ha2Ugc3VyZSB3ZSBhcmUgb24gYSBXaW5kb3dzIGRyaXZlCiAgbXYgJExDT05GICRMQ09ORi5vcmlnCiAgc2VkICJzL1wiUGF0aFwiID0gXCJcJHtIT01FfVwiJC9cIlBhdGhcIiA9IFwiXCR7UFdEfVwiLyIgJExDT05GLm9yaWc+ICRMQ09ORgoKICBlY2hvICJJbnN0YWxsaW5nIGRlZmF1bHQgV2luZSByZWdpc3RyeSBlbnRyaWVzLi4uIgogIGVjaG8KICBpZiAhICRSRUdFRElUICRERUZSRUcgPiAvZGV2L251bGwKICB0aGVuIHsKICAgIGVjaG8gIlJlZ2lzdHJ5IGluc3RhbGwgZmFpbGVkLiIKICAgIG12ICRMQ09ORi5vcmlnICRMQ09ORgogICAgY29uZl9yZXNldF9xdWVzdGlvbiByZWdlZGl0X2Vycm9yCiAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggcmVnZWRpdF9lcnJvcgogICAgZXhpdCAxCiAgfQogIGVsc2UgewogICAgZWNobwogICAgZWNobyAiUmVnaXN0cnkgZW50cmllcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkLiIKICAgIG12ICRMQ09ORi5vcmlnICRMQ09ORgogIH0KICBmaQogIGlmIFsgIiRTWVNSRUciID0gJ2F1dG8nIF0KICB0aGVuIFNZU1JFRz15ZXMKICBmaQp9CmZpCgojIG1ha2Ugcm9vdCdzIHJlZ2lzdHJ5IGdsb2JhbCwgaWYgZGVzaXJlZAppZiBbIGB3aG9hbWlgID0gJ3Jvb3QnIF0gJiYgWyAiJERPUkVHIiA9ICd5ZXMnIF0gJiYgWyAiJFNZU1JFRyIgPSAneWVzJyBdCnRoZW4gewogIFsgLWQgfi8ud2luZSBdIHx8IG1rZGlyIH4vLndpbmUKICBpZiAhIFsgLWYgJHN5c2NvbmZkaXIvd2luZS51c2VycmVnIF0KICB0aGVuIHsKICAgIGVjaG8gIkxpbmtpbmcgcm9vdCdzIHVzZXIgcmVnaXN0cnkgaGl2ZSB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5Li4uIgogICAgWyAtZiB+Ly53aW5lL3dpbmUudXNlcnJlZyBdICYmIGNwIH4vLndpbmUvd2luZS51c2VycmVnICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZwogICAgbG4gLXNmICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZyB+Ly53aW5lL3dpbmUudXNlcnJlZwogIH0KICBmaQogIGlmICEgWyAtZiAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZyBdCiAgdGhlbiB7CiAgICBlY2hvICJMaW5raW5nIHJvb3QncyBzeXN0ZW0gcmVnaXN0cnkgaGl2ZSB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5Li4uIgogICAgWyAtZiB+Ly53aW5lL3N5c3RlbS5yZWcgXSAmJiBjcCB+Ly53aW5lL3N5c3RlbS5yZWcgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcKICAgIGxuIC1zZiAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZyB+Ly53aW5lL3N5c3RlbS5yZWcKICB9CiAgZmkKfQpmaQoKIyBjbGVhbnVwIGFueSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBtYXkgcmVtYWluCmlmIFsgLWYgJFRNUENPTkYgXQp0aGVuIHJtIC1mICRUTVBDT05GCmZpCgoKIyBpdCdzIGEgd3JhcAplY2hvCmVjaG8gIkluc3RhbGxhdGlvbiBjb21wbGV0ZSBmb3Igbm93LiBHb29kIGx1Y2sgKHRoaXMgaXMgc3RpbGwgYWxwaGEgc29mdHdhcmUpLiIKZWNobyAiSWYgeW91IGhhdmUgcHJvYmxlbXMgd2l0aCBXSU5FLCBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmaXJzdCwiCmVjaG8gImFzIG1hbnkga2luZHMgb2YgcG90ZW50aWFsIHByb2JsZW1zIGFyZSBleHBsYWluZWQgdGhlcmUuIgoKZXhpdCAwCg==