IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKCiMgTWFyIDMxIDE5OTkgLSBPdmUgS+V2ZW4KIyAgRmlyc3QgdmVyc2lvbgojIERlYyA5IDE5OTkgLSBPdmUgS+V2ZW4KIyAgcmVxdWlyZSBYcG0KIyBGZWIgMjUgMjAwMCAtIE92ZSBL5XZlbgojICBhdXRvLWFkZCAvdXNyL2xvY2FsL2xpYiB0byAvZXRjL2xkLnNvLmNvbmYKIyBNYXIgMiAyMDAwIC0gT3ZlIEvldmVuCiMgIHNvdXJjZSByYXRoZXIgdGhhbiBncmVwIGNvbmZpZy5jYWNoZQojICB1c2Ugc291cmNlZCBjb25maWcuY2FjaGUgdG8gc3RhcnQgbGRjb25maWcKIyAgcmVjb25maWd1cmUgaWYgY29uZmlnLmNhY2hlIGRvZXNuJ3QgZXhpc3QKIyBNYXIgMzAgMjAwMCAtIE92ZSBL5XZlbgojICBhdXRvY29uZmlndXJlIG5vLXdpbmRvd3MgaW5zdGFsbHMKIyAgZG8gbm90IGluc3RhbGwgcmVnaXN0cnkgb24gcmVhbC13aW5kb3dzIGluc3RhbGxzCiMgIHNvbWUgc3VwcG9ydCBmb3IgYmluYXJ5IHBhY2thZ2UgaW5zdGFsbHMKIyAgc2V0IGFuZCB0ZWxsIHVzZXIgYWJvdXQgTERfTElCUkFSWV9QQVRIIGlmIG5lY2Vzc2FyeQojICBzZXQgRVhUUkFfTERfTElCUkFSWV9QQVRIIGluIHdpbmUuY29uZgojIEFwciA5IDIwMDAgLSBPdmUgS+V2ZW4KIyAgbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKIyBNYXkgOSAyMDAwIC0gT3ZlIEvldmVuCiMgIHVzZSB0dHlkcnYgd2hlbiBydW5uaW5nIHJlZ2FwaSwgc28gd2UgZG9uJ3QgaGF2ZSB0byBydW4gZnJvbSBYCiMgIGNoYW5nZSBkZWJ1Z2dlciBwYXRoIGluIHJlZ2lzdHJ5CgojLS0tIGRlZmF1bHRzIChjaGFuZ2UgdGhlc2UgaWYgeW91IGFyZSBhIHBhY2thZ2VyKQpDT05GQVJHUz0gICAgICAgICAgICAgICAgICAgICAjIGNvbmZpZ3VyZSBhcmdzLCBlLmcuIC0tcHJlZml4PS91c3IgLS1zeXNjb25mZGlyPS9ldGMKcHJlZml4PS91c3IvbG9jYWwgICAgICAgICAgICAgIyBpbnN0YWxsYXRpb24gcHJlZml4CnN5c2NvbmZkaXI9JHByZWZpeC9ldGMgICAgICAgICMgd2hlcmUgd2luZS5jb25mIGFuZCBnbG9iYWwgcmVnaXN0cnkgaXMgc3VwcG9zZWQgdG8gYmUKYmluZGlyPSRwcmVmaXgvYmluICAgICAgICAgICAgIyB3aGVyZSB3aW5lbGliIGFwcHMgd2lsbCBiZSAob3IgaXMpIGluc3RhbGxlZApsaWJkaXI9JHByZWZpeC9saWIgICAgICAgICAgICAjIHdoZXJlIGxpYndpbmUuc28gd2lsbCBiZSAob3IgaXMpIGluc3RhbGxlZApleGRpcj1kb2N1bWVudGF0aW9uL3NhbXBsZXMgICAjIHdoZXJlIHRoZSBleGFtcGxlIHN5c3RlbS5pbmkgcmVzaWRlcwpDT05GPSRzeXNjb25mZGlyL3dpbmUuY29uZiAgICAjIGRlZmF1bHQgcGF0aCBvZiB0aGUgd2luZS5jb25mCkJJTkRJU1Q9bm8gICAgICAgICAgICAgICAgICAgICMgd2hldGhlciBjYWxsZWQgZnJvbSBhIGJpbmFyeSBwYWNrYWdlIGNvbmZpZyBzY3JpcHQKRE9DT05GPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9nZW5lcmF0ZSB3aW5lLmNvbmYKRE9XQ0hLPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgZXhpc3Rpbmctd2luZG93cyBpbnN0YWxsYXRpb24KRE9XSU5FPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgbm8td2luZG93cyBpbnN0YWxsYXRpb24KRE9SRUc9YXV0byAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeQpTWVNSRUc9eWVzICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKCiMgIm1ha2UgaW5zdGFsbCIgc3RpbGwgaW5zdGFsbHMgdGhlIGRsbHMgaW50byAkbGliZGlyLCBidXQgdGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUKIyAoRExMUEFUSCBzaG91bGQgcG9pbnQgdG8gdGhlbSBpZi93aGVuIHRoZXkgYXJlIG5vdCBpbiBzdGFuZGFyZCBsZC5zbyBwYXRocykKRExMUEFUSD0kbGliZGlyL3dpbmUgICAgICAgICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIGRsbCAuc28gZmlsZXMgKGV4Y2VwdCBsaWJ3aW5lLnNvKQoKIyBoYXZpbmcgdGhlIFdpbmUgZGVidWdnZXIgbGF1bmNoZWQgYXV0b21hdGljYWxseSB3aWxsIGJlIGEgcGx1cyBmb3IgdXMKREVCVUdHRVI9JGJpbmRpci93aW5lZGJnICAgICAgIyB0aGUgKGluc3RhbGxlZCkgcGF0aCBvZiB3aW5lZGJnCkhERUJVR0dFUj1kZWJ1Z2dlci93aW5lZGJnICAgICMgdGhlIChub24taW5zdGFsbGVkKSBwYXRoIG9mIHdpbmVkYmcKCiMgdGhpcyBpcyBvbmx5IGZvciBleGlzdGluZy13aW5kb3dzIGluc3RhbGxzCldJTkVDT05GPXRvb2xzL3dpbmVjb25mICAgICAgICMgdGhlIHBhdGggb2Ygd2luZWNvbmYgcGVybCBzY3JpcHQKCiMgdGhpcyBpcyBvbmx5IGZvciBuby13aW5kb3dzIGluc3RhbGxzCldJTkVJTkk9d2luZS5pbmkgICAgICAgICAgICAgICMgdGhlIHBhdGggb2YgZGVmYXVsdCB3aW5lLmluaSAoYWxzbyB1c2VkIGJ5IHdpbmVjb25mKQpXSU5JTkk9L2Rldi9udWxsICAgICAgICAgICAgICAjIHRoZSBwYXRoIG9mIGRlZmF1bHQgd2luLmluaQpTWVNURU1JTkk9JGV4ZGlyL3N5c3RlbS5pbmkgICAjIHRoZSBwYXRoIG9mIGRlZmF1bHQgc3lzdGVtLmluaQpSRUdBUEk9cHJvZ3JhbXMvcmVnYXBpL3JlZ2FwaSAjIHRoZSBwYXRoIG9mIHJlZ2FwaSB3aW5lbGliIGFwcGxpY2F0aW9uCkRFRlJFRz13aW5lZGVmYXVsdC5yZWcgICAgICAgICMgdGhlIHBhdGggb2YgdGhlIHJlZ2lzdHJ5IGZpbGUgdG8gYmUgZmVkIHRvIHJlZ2FwaQojIENST09UPS92YXIvd2luZSAgICAgICAgICAgICAjIHRoZSBwYXRoIG9mIHRoZSBmYWtlIERyaXZlIEMgKGFza3MgdXNlciBpZiBub3Qgc2V0KQojLS0tIGVuZCBvZiBkZWZhdWx0cwoKIyB0ZW1wb3JhcnkgZmlsZXMgdXNlZCBieSB0aGUgaW5zdGFsbGVyClRNUENPTkY9L3RtcC93aW5laW5zdGFsbC5jb25mClRNUFJFRz0vdG1wL3dpbmVpbnN0YWxsLnJlZwoKIyBzdGFydHVwLi4uCgplY2hvICJXSU5FIEluc3RhbGxlciB2MC40IgplY2hvCgppZiBbICIkQklORElTVCIgPSAnbm8nIF0KdGhlbiB7CgppZiAhIFsgLWYgY29uZmlndXJlIF0KdGhlbiB7CiAgZWNobyAiWW91J3JlIHJ1bm5pbmcgdGhpcyBmcm9tIHRoZSB3cm9uZyBkaXJlY3RvcnkuIgogIGVjaG8gIkNoYW5nZSB0byB0aGUgV2luZSBkaXJlY3RvcnkgYW5kIHRyeSBhZ2Fpbi4iCiAgZXhpdCAxCn0KZmkKCiMgcnVuIHRoZSBjb25maWd1cmUgc2NyaXB0LCBpZiBuZWNlc3NhcnkKCmlmIFsgLWYgY29uZmlnLmNhY2hlIF0gJiYgWyAtZiBNYWtlZmlsZSBdICYmIFsgTWFrZWZpbGUgLW50IGNvbmZpZ3VyZSBdCnRoZW4gewogIGVjaG8gIkkgc2VlIHRoYXQgV0lORSBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQsIHNvIEknbGwgc2tpcCB0aGF0LiIKICAjIGxvYWQgY29uZmlndXJlIHJlc3VsdHMKICAuIC4vY29uZmlnLmNhY2hlCn0KZWxzZSB7CiAgZWNobyAiUnVubmluZyBjb25maWd1cmUuLi4iCiAgZWNobwogIGlmICEgLi9jb25maWd1cmUgJENPTkZBUkdTCiAgdGhlbiB7CiAgICBlY2hvCiAgICBlY2hvICJDb25maWd1cmUgZmFpbGVkLCBhYm9ydGluZyBpbnN0YWxsLiIKICAgIHJtIC1mIGNvbmZpZy5jYWNoZQogICAgZXhpdCAxCiAgfQogIGZpCiAgIyBsb2FkIGNvbmZpZ3VyZSByZXN1bHRzCiAgLiAuL2NvbmZpZy5jYWNoZQogICMgbWFrZSBzdXJlIFggd2FzIGZvdW5kCiAgZXZhbCAiJGFjX2N2X2hhdmVfeCIKICBpZiBbICIkaGF2ZV94IiAhPSAieWVzIiBdCiAgdGhlbiB7CiAgICBlY2hvICJJbnN0YWxsIHRoZSBYIGRldmVsb3BtZW50IGhlYWRlcnMgYW5kIHRyeSBhZ2Fpbi4iCiAgICBybSAtZiBjb25maWcuY2FjaGUKICAgIGV4aXQgMQogIH0KICBlbGlmIFsgIiRhY19jdl9oZWFkZXJfWDExX3hwbV9oIiAhPSAieWVzIiBdCiAgdGhlbiB7CiAgICBlY2hvICJJbnN0YWxsIHRoZSBYcG0gZGV2ZWxvcG1lbnQgaGVhZGVycyBhbmQgdHJ5IGFnYWluLiIKICAgIHJtIC1mIGNvbmZpZy5jYWNoZQogICAgZXhpdCAxCiAgfQogIGZpCn0KZmkKCiMgbm93IGRvIHRoZSBjb21waWxhdGlvbgoKaWYgWyAtZiB3aW5lIF0gJiYgWyB3aW5lIC1udCBNYWtlZmlsZSBdCnRoZW4gewogIGVjaG8gIkhtbSwgbG9va3MgbGlrZSBXSU5FIGlzIGFscmVhZHkgY29tcGlsZWQuIEknbGwgc2tpcCB0aGF0IHRvbywgSSBndWVzcy4iCn0KZWxzZSB7CiAgZWNobyAiQ29tcGlsaW5nIFdJTkUuIEdyYWIgYSBsdW5jaCBvciB0d28sIHJlbnQgYSB2aWRlbywgb3Igd2hhdGV2ZXIsIGluIHRoZSBtZWFudGltZS4uLiIKICBlY2hvCiAgaWYgISB7IG1ha2UgZGVwZW5kICYmIG1ha2U7IH0KICB0aGVuIHsKICAgIGVjaG8KICAgIGVjaG8gIkNvbXBpbGF0aW9uIGZhaWxlZCwgYWJvcnRpbmcgaW5zdGFsbC4iCiAgICBleGl0IDEKICB9CiAgZmkKICBlY2hvCn0KZmkKCiMgYW5kIGluc3RhbGxhdGlvbiwgaWYgcm9vdAoKaWYgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQp0aGVuIHsKICBlY2hvICJZb3UgYXJlbid0IHJvb3QsIHNvIEknbGwgc2tpcCB0aGUgbWFrZSBpbnN0YWxsLiIKICAjIHNldHVwIHRvIHJ1biBmcm9tIGN1cnJlbnQgZGlyZWN0b3J5CiAgRExMUEFUSD0iJFBXRC9kbGxzIgogIGlmIFsgLXogIiRMRF9MSUJSQVJZX1BBVEgiIF0KICB0aGVuIExEX0xJQlJBUllfUEFUSD0iJFBXRDokRExMUEFUSCIKICBlbHNlIExEX0xJQlJBUllfUEFUSD0iJExEX0xJQlJBUllfUEFUSDokUFdEOiRETExQQVRIIgogIGZpCiAgZXhwb3J0IExEX0xJQlJBUllfUEFUSAogIERFQlVHR0VSPSRQV0QvJEhERUJVR0dFUgogIGVjaG8KICBlY2hvICJOT1RFISBUbyBydW4gV2luZSB3aXRob3V0IGluc3RhbGxpbmcsIHlvdSBtdXN0IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUiCiAgZWNobyAiTERfTElCUkFSWV9QQVRIIHRvICRQV0Q6JERMTFBBVEgiCiAgZWNobyAiaW4geW91ciBsb2dvbiBzY3JpcHRzLiIKfQplbHNlIHsKICBlY2hvICJOb3cgaW5zdGFsbGluZyBiaW5hcmllcyBvbnRvIHRoZSBzeXN0ZW0uLi4iCiAgZWNobwogIGlmICEgbWFrZSBpbnN0YWxsCiAgdGhlbiB7CiAgICBlY2hvCiAgICBlY2hvICJJbnN0YWxsYXRpb24gZmFpbGVkLCBhYm9ydGluZy4iCiAgICBleGl0IDEKICB9CiAgZmkKICBpZiBbIC1mIC9ldGMvbGQuc28uY29uZiBdICYmICEgZ3JlcCAtcXMgIiRsaWJkaXIiIC9ldGMvbGQuc28uY29uZgogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiJGxpYmRpciBkaWRuJ3QgZXhpc3QgaW4geW91ciAvZXRjL2xkLnNvLmNvbmYsIGFkZGluZyBpdCBub3cuLi4iCiAgICBlY2hvICIkbGliZGlyIiA+Pi9ldGMvbGQuc28uY29uZgogICAgZWNobyAiUmUtcnVubmluZyBsZGNvbmZpZy4uLiIKICAgIGV2YWwgIiRhY19jdl9wYXRoX0xEQ09ORklHIgogIH0KICBmaQp9CmZpCmVjaG8KCn0KZmkgIyBCSU5ESVNUCgojIG5vdyBjaGVjayB3aGV0aGVyIHdlIHNob3VsZCBnZW5lcmF0ZSB3aW5lLmNvbmYKaWYgWyAteiAiJERPQ09ORiIgXQp0aGVuIERPQ09ORj1hdXRvCmZpCgppZiBbICIkRE9DT05GIiA9ICdhdXRvJyBdCnRoZW4gewogICMgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHN5c3RlbSB3aW5lLmNvbmYKICBpZiBbIC1mICRDT05GIF0KICB0aGVuIERPQ09ORj1ubwogIGZpCn0KZmkKCmlmIFsgIiRET0NPTkYiICE9ICdubycgXQp0aGVuIHsKICBpZiBbIGB3aG9hbWlgICE9ICdyb290JyBdCiAgdGhlbiB7CiAgICBDT05GPX4vLndpbmVyYwogICAgaWYgISBbIC1mICRDT05GIF0KICAgIHRoZW4gewogICAgICBpZiBbICIkRE9DT05GIiAhPSAneWVzJyBdCiAgICAgIHRoZW4gewogICAgICAgIGVjaG8gIlNpbmNlIHlvdSBhcmVuJ3Qgcm9vdCwgYW5kIHRoZXJlJ3Mgbm8gc3lzdGVtIHdpbmUuY29uZiwgSSBhc3N1bWUiCiAgICAgICAgZWNobyAieW91IHdhbnQgYSB1c2VyLXNwZWNpZmljIC53aW5lcmMuIEFtIEkgY29ycmVjdD8gKHllcy9ubykiCiAgICAgICAgd2hpbGUgWyAiJERPQ09ORiIgIT0gJ3llcycgXSAmJiBbICIkRE9DT05GIiAhPSAnbm8nIF0KICAgICAgICBkbyByZWFkIERPQ09ORgogICAgICAgIGRvbmUKICAgICAgfQogICAgICBmaQogICAgICBpZiBbICIkRE9DT05GIiA9ICdubycgXQogICAgICB0aGVuIHsKICAgICAgICBlY2hvICJBYm9ydGluZyBpbnN0YWxsLiBUcnkgYWdhaW4gYXMgcm9vdCB0byBnZW5lcmF0ZSBhIHN5c3RlbSB3aW5lLmNvbmYuIgogICAgICAgIGV4aXQgMQogICAgICB9CiAgICAgIGZpCiAgICAgIGVjaG8KICAgIH0KICAgIGZpCiAgfQogIGVsc2UgewogICAgbWtkaXIgLXAgJHN5c2NvbmZkaXIKICAgIERPQ09ORj15ZXMKICB9CiAgZmkKfQpmaQoKIyBnZW5lcmF0ZSB3aW5lLmNvbmYgZnJvbSBleGlzdGluZyB3aW5kb3dzIGluc3RhbGwsIGlmIGFueQppZiBbICIkRE9DT05GIiA9ICd5ZXMnIF0KdGhlbiB7CiAgaWYgWyAiJERPV0NISyIgPSAneWVzJyBdIHx8IFsgIiRET1dDSEsiID0gJ2F1dG8nIF0KICB0aGVuIHsKICAgIGVjaG8gIlNlYXJjaGluZyBmb3IgYW4gZXhpc3RpbmcgV2luZG93cyBpbnN0YWxsYXRpb24uLi4iCiAgICBpZiAhICRXSU5FQ09ORiA+ICRDT05GIDI+L2Rldi9udWxsCiAgICB0aGVuIHsKICAgICAgcm0gLWYgJENPTkYKICAgICAgZWNobwogICAgICBlY2hvICJXaW5kb3dzIHdhcyBub3QgZm91bmQgb24geW91ciBzeXN0ZW0sIHNvIEkgYXNzdW1lIHlvdSB3YW50IGEgV2luZS1vbmx5IGluc3RhbGxhdGlvbi4iCiAgICAgIGVjaG8gIkFtIEkgY29ycmVjdD8gKHllcy9ubykiCiAgICAgIHdoaWxlIFsgIiRET1dJTkUiICE9ICd5ZXMnIF0gJiYgWyAiJERPV0lORSIgIT0gJ25vJyBdCiAgICAgIGRvIHJlYWQgRE9XSU5FCiAgICAgIGRvbmUKICAgICAgaWYgWyAiJERPV0lORSIgPSAnbm8nIF0KICAgICAgdGhlbiB7CiAgICAgICAgZWNobyAiQWJvcnRpbmcgaW5zdGFsbC4gTWFrZSBzdXJlIHlvdXIgV2luZG93cyBwYXJ0aXRpb24gaXMgbW91bnRlZCBhbmQgdHJ5IGFnYWluLCIKICAgICAgICBlY2hvICJvciBjcmVhdGUgJENPTkYgbWFudWFsbHkgYnkgY29weWluZyBmcm9tICRXSU5FSU5JIGFuZCBhZGFwdGluZyB0aGUgZHJpdmUgcGF0aHMuIgogICAgICAgIGV4aXQgMQogICAgICB9CiAgICAgIGZpCiAgICB9CiAgICBlbHNlIHsKICAgICAgZWNobwogICAgICBlY2hvICJDcmVhdGVkICRDT05GIHVzaW5nIHlvdXIgZXhpc3RpbmcgV2luZG93cyBpbnN0YWxsYXRpb24uIgogICAgICBlY2hvICJZb3UgcHJvYmFibHkgd2FudCB0byByZXZpZXcgdGhlIGZpbGUsIHRob3VnaC4iCiAgICAgIERPV0lORT1ubwogICAgfQogICAgZmkKICAgIGVjaG8KICB9CiAgZWxpZiBbICIkRE9XSU5FIiA9ICdhdXRvJyBdCiAgdGhlbiBET1dJTkU9eWVzCiAgZmkKfQplbGlmIFsgIiRET1dJTkUiID0gJ2F1dG8nIF0KdGhlbiBET1dJTkU9bm8KZmkKCiMgc2V0dXAgYSBuby13aW5kb3dzIGluc3RhbGxhdGlvbiwgaWYgbmVjZXNzYXJ5CmlmIFsgIiRET1dJTkUiID0gJ3llcycgXQp0aGVuIHsKICBpZiBbIGB3aG9hbWlgICE9ICdyb290JyBdCiAgdGhlbiBEQ1JPT1Q9fi9jCiAgZWxzZSBEQ1JPT1Q9L2MKICBmaQogIGVjaG8gIkNvbmZpZ3VyaW5nIFdpbmUgd2l0aG91dCBXaW5kb3dzLiBTb21lIGZha2UgV2luZG93cyBkaXJlY3RvcmllcyBtdXN0IGJlIGNyZWF0ZWQsIHRvIgogIGVjaG8gImhvbGQgYW55IC5pbmkgZmlsZXMsIERMTHMsIGFuZCBzdGFydCBtZW51IGVudHJpZXMgeW91ciBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8gaW5zdGFsbC4iCiAgd2hpbGUgWyAteiAiJENST09UIiBdCiAgZG8gewogICAgZWNobyAiV2hlcmUgd291bGQgeW91IGxpa2UgeW91ciBmYWtlIEMgZHJpdmUgdG8gYmUgcGxhY2VkPyAoZGVmYXVsdCBpcyAkRENST09UKSIKICAgIHJlYWQgQ1JPT1QKICAgIGlmIFsgLXogIiRDUk9PVCIgXQogICAgdGhlbiBDUk9PVD0iJERDUk9PVCIKICAgIGZpCiAgICBpZiAhIFsgLWQgIiRDUk9PVCIgXQogICAgdGhlbiB7CiAgICAgIGlmICEgbWtkaXIgLXAgIiRDUk9PVCIKICAgICAgdGhlbiB1bnNldCBDUk9PVAogICAgICBmaQogICAgfQogICAgZmkKICB9CiAgZG9uZQogIGVjaG8gIkNvbmZpZ3VyaW5nIFdpbmUgZm9yIGEgbm8td2luZG93cyBpbnN0YWxsIGluICRDUk9PVC4uLiIKICBmb3IgdGRpciBpbiAiJENST09UL3dpbmRvd3MiICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0iICIkQ1JPT1Qvd2luZG93cy9TdGFydCBNZW51IiAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudS9Qcm9ncmFtcyIKICBkbyBbIC1kICIkdGRpciIgXSB8fCBta2RpciAiJHRkaXIiCiAgZG9uZQogIFsgLWYgIiRDUk9PVC93aW5kb3dzL3dpbi5pbmkiIF0gICAgfHwgY3AgIiRXSU5JTkkiICAgICIkQ1JPT1Qvd2luZG93cy93aW4uaW5pIgogIFsgLWYgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5pbmkiIF0gfHwgY3AgIiRTWVNURU1JTkkiICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0uaW5pIgogIGlmIFsgIiRET0NPTkYiID0gJ3llcycgXQogIHRoZW4gewogICAgc2VkICJzL1BhdGg9XC9jJC9QYXRoPSR7Q1JPT1QvL1wvL1xcL30vIiAkV0lORUlOSSA+ICRDT05GCiAgICBlY2hvICJDcmVhdGVkICRDT05GIHVzaW5nIGRlZmF1bHQgV2luZSBjb25maWd1cmF0aW9uLiIKICAgIGVjaG8gIllvdSBwcm9iYWJseSB3YW50IHRvIHJldmlldyB0aGUgZmlsZSwgdGhvdWdoLiIKICB9CiAgZmkKICAjIG5vdyB3ZSByZWFsbHkgbmVlZCB0byBpbnN0YWxsIHRoZSByZWdpc3RyeQogIERPUkVHPXllcwp9CmVsaWYgWyAteiAiJENST09UIiBdCnRoZW4gewogIGVjaG8gIlJlYWRpbmcgY3VycmVudCBXaW5lIGNvbmZpZ3VyYXRpb24gZnJvbSAkQ09ORi4uLiIKICBDUk9PVD1gc2VkIC1uICcvXlxbRHJpdmUgQ1xdJC8sL15cWy4qXF0kLyBzL15QYXRoPVwoLipcKS9cMS9wJyAkQ09ORmAKICBlY2hvICJEcml2ZSBDIGlzIGNvbmZpZ3VyZWQgYXQgJENST09ULiIKfQpmaQplY2hvCgojIGZpeHVwIEVYVFJBX0xEX0xJQlJBUllfUEFUSAppZiBbICIkRE9DT05GIiA9ICd5ZXMnIF0KdGhlbiB7CiAgZWNobyAiU2V0dGluZyBFWFRSQV9MRF9MSUJSQVJZX1BBVEggaW4gLndpbmVyYyB0byAkRExMUEFUSC4uLiIKICBzZWQgInMvRVhUUkFfTERfTElCUkFSWV9QQVRIPS4qL0VYVFJBX0xEX0xJQlJBUllfUEFUSD0ke0RMTFBBVEgvL1wvL1xcL30vIiAkQ09ORiA+ICRDT05GLm5ldwogIG12IC1mICRDT05GLm5ldyAkQ09ORgogIGVjaG8KfQpmaQoKIyBjaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gaW5zdGFsbCBkZWZhdWx0IHJlZ2lzdHJ5CiMgKG5vdCB0byBiZSBkb25lIGlmIHdpbmRvd3MgcmVnaXN0cnkgZXhpc3RzKQppZiBbICIkRE9SRUciID0gJ2F1dG8nIF0KdGhlbiB7CiAgZWNobyAiQ2hlY2tpbmcgZm9yIHJlYWwgV2luZG93cyByZWdpc3RyeS4uLiIKICBpZiBbIC1mICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0uZGF0IiBdCiAgdGhlbiBET1JFRz1ubwogIGVsaWYgWyAtZiAiJENST09UL3dpbmRvd3Mvc3lzdGVtMzIvY29uZmlnL3N5c3RlbSIgXQogIHRoZW4gRE9SRUc9bm8KICBlbHNlIERPUkVHPXllcwogIGZpCiAgaWYgWyAiJERPUkVHIiA9ICd5ZXMnIF0KICB0aGVuIGVjaG8gIk5vdCBmb3VuZCwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IHdpbGwgYmUgaW5zdGFsbGVkLiIKICBlbHNlIGVjaG8gIldpbmRvd3MgcmVnaXN0cnkgZm91bmQsIHdpbGwgbm90IGluc3RhbGwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5LiIKICBmaQogIGVjaG8KfQpmaQoKIyBpbnN0YWxsIGRlZmF1bHQgcmVnaXN0cnkgZW50cmllcwppZiBbICIkRE9SRUciID0gJ3llcycgXQp0aGVuIHsKICBpZiBbICIkQklORElTVCIgPSAnbm8nIF0KICB0aGVuIHsKICAgIGVjaG8gIkNvbXBpbGluZyByZWdhcGkuLi4iCiAgICBlY2hvCiAgICAoY2QgcHJvZ3JhbXMvcmVnYXBpOyBtYWtlKQogICAgZWNobwogIH0KICBmaQogIGVjaG8gIlByZXBhcmluZyB0byBpbnN0YWxsIGRlZmF1bHQgV2luZSByZWdpc3RyeSBlbnRyaWVzLi4uIgoKICAjIGNyZWF0ZSBhIHRlbXBvcmFyeSB3aW5laW5zdGFsbC5jb25mIGZpbGUgdXNpbmcgdHR5ZHJ2LAogICMgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHJ1biByZWdhcGkgdW5kZXIgWAogIHNlZCAicy9HcmFwaGljc0RyaXZlcj0uKi9HcmFwaGljc0RyaXZlcj10dHlkcnYvIiAkQ09ORiA+ICRUTVBDT05GCgogICMgY3JlYXRlIGEgdGVtcG9yYXJ5IHdpbmVpbnN0YWxsLnJlZyB3aXRoIGZpeGVkIGRlYnVnZ2VyIHBhdGgKICBzZWQgInMvZGVidWdnZXJcL3dpbmVkYmcvJHtERUJVR0dFUi8vXC8vXFwvfS8iICRERUZSRUcgPiAkVE1QUkVHCgogIGVjaG8gIkluc3RhbGxpbmcgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IGVudHJpZXMuLi4iCiAgZWNobwogIGlmICEgJFJFR0FQSSAtLWNvbmZpZyAkVE1QQ09ORiBzZXRWYWx1ZSA8ICRUTVBSRUcgPiAvZGV2L251bGwKICB0aGVuIHsKICAgIHJtIC1mICRUTVBDT05GICRUTVBSRUcKICAgIGVjaG8KICAgIGVjaG8gIlJlZ2lzdHJ5IGluc3RhbGwgZmFpbGVkLiIKICAgIGV4aXQgMQogIH0KICBlbHNlIGVjaG8gIlJlZ2lzdHJ5IGVudHJpZXMgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZC4iCiAgZmkKICBybSAtZiAkVE1QQ09ORiAkVE1QUkVHCiAgaWYgWyAiJFNZU1JFRyIgPSAnYXV0bycgXQogIHRoZW4gU1lTUkVHPXllcwogIGZpCn0KZmkKCiMgbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsLCBpZiBkZXNpcmVkCmlmIFsgYHdob2FtaWAgPSAncm9vdCcgXSAmJiBbICIkU1lTUkVHIiA9ICd5ZXMnIF0KdGhlbiB7CiAgaWYgISBbIC1mICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZyBdCiAgdGhlbiB7CiAgICBlY2hvICJMaW5raW5nIHJvb3QncyB1c2VyIHJlZ2lzdHJ5IGhpdmUgdG8gdGhlIGdsb2JhbCByZWdpc3RyeS4uLiIKICAgIGNwIH4vLndpbmUvd2luZS51c2VycmVnICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZwogICAgbG4gLXNmICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZyB+Ly53aW5lL3dpbmUudXNlcnJlZwogIH0KICBmaQogIGlmICEgWyAtZiAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZyBdCiAgdGhlbiB7CiAgICBlY2hvICJMaW5raW5nIHJvb3QncyBzeXN0ZW0gcmVnaXN0cnkgaGl2ZSB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5Li4uIgogICAgY3Agfi8ud2luZS9zeXN0ZW0ucmVnICRzeXNjb25mZGlyL3dpbmUuc3lzdGVtcmVnCiAgICBsbiAtc2YgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcgfi8ud2luZS9zeXN0ZW0ucmVnCiAgfQogIGZpCn0KZmkKCiMgaXQncyBhIHdyYXAKZWNobwplY2hvICJJbnN0YWxsYXRpb24gY29tcGxldGUgZm9yIG5vdy4gR29vZCBsdWNrICh0aGlzIGlzIHN0aWxsIGFscGhhIHNvZnR3YXJlKS4iCmVjaG8gIklmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggV0lORSwgcGxlYXNlIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gZmlyc3QsIgplY2hvICJhcyBtYW55IGtpbmRzIG9mIHBvdGVudGlhbCBwcm9ibGVtcyBhcmUgZXhwbGFpbmVkIHRoZXJlLiIK