IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKIyBDYW4gZG8gYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSBjb21waWxpbmcgdG8gY29uZmlndXJpbmcuLi4KCiMgTWFyIDMxIDE5OTkgLSBPdmUgS+V2ZW4KIyAgRmlyc3QgdmVyc2lvbgojIERlYyA5IDE5OTkgLSBPdmUgS+V2ZW4KIyAgcmVxdWlyZSBYcG0KIyBGZWIgMjUgMjAwMCAtIE92ZSBL5XZlbgojICBhdXRvLWFkZCAvdXNyL2xvY2FsL2xpYiB0byAvZXRjL2xkLnNvLmNvbmYKIyBNYXIgMiAyMDAwIC0gT3ZlIEvldmVuCiMgIHNvdXJjZSByYXRoZXIgdGhhbiBncmVwIGNvbmZpZy5jYWNoZQojICB1c2Ugc291cmNlZCBjb25maWcuY2FjaGUgdG8gc3RhcnQgbGRjb25maWcKIyAgcmVjb25maWd1cmUgaWYgY29uZmlnLmNhY2hlIGRvZXNuJ3QgZXhpc3QKIyBNYXIgMzAgMjAwMCAtIE92ZSBL5XZlbgojICBhdXRvY29uZmlndXJlIG5vLXdpbmRvd3MgaW5zdGFsbHMKIyAgZG8gbm90IGluc3RhbGwgcmVnaXN0cnkgb24gcmVhbC13aW5kb3dzIGluc3RhbGxzCiMgIHNvbWUgc3VwcG9ydCBmb3IgYmluYXJ5IHBhY2thZ2UgaW5zdGFsbHMKIyAgc2V0IGFuZCB0ZWxsIHVzZXIgYWJvdXQgTERfTElCUkFSWV9QQVRIIGlmIG5lY2Vzc2FyeQojICBzZXQgRVhUUkFfTERfTElCUkFSWV9QQVRIIGluIHdpbmUuY29uZgojIEFwciA5IDIwMDAgLSBPdmUgS+V2ZW4KIyAgbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKIyBNYXkgOSAyMDAwIC0gT3ZlIEvldmVuCiMgIHVzZSB0dHlkcnYgd2hlbiBydW5uaW5nIHJlZ2FwaSwgc28gd2UgZG9uJ3QgaGF2ZSB0byBydW4gZnJvbSBYCiMgIGNoYW5nZSBkZWJ1Z2dlciBwYXRoIGluIHJlZ2lzdHJ5CiMgT2N0IDI5IDIwMDAgLSBPdmUgS+V2ZW4KIyAgYWRkZWQgLS1lbmFibGUtb3BlbmdsIHRvIGRlZmF1bHQgY29uZmFyZ3MKIyAgYWRkZWQgY29uZl9xdWVzdGlvbiwgY29uZl95ZXNub19hbnN3ZXIsIGFuZCBjb25mX3N0cmluZ19hbnN3ZXIgZnVuY3Rpb25zCiMgIGFkZGVkIERFRkNBVCB2YXJpYWJsZQojIChsYXRlciB0aGF0IGRheS4uLikKIyAgYWRkZWQgY29uZl9yZXNldF9xdWVzdGlvbiBmdW5jdGlvbgojICBhZGRlZCBmaWxlIGV4aXN0ZW5jZSBjaGVja3MgdG8gdGhlIHJlZ2lzdHJ5IGNvcHlpbmcKIyAgZml4ZWQgcHJvYmxlbSB3aXRoIG5vLXdpbmRvd3MgZGlyZWN0b3J5IGNyZWF0aW9uCiMgIHNvbWUgdGV4dCByZWZvcm1hdHRpbmcgZnJvbSBFcmljIE1hcnluaWFrCiMgSmFuIDUgMjAwMCAtIENocmlzIE1vcmdhbgojICB1c2UgZGVmYXVsdCBjb25maWcgZmlsZSBpbiAvZG9jdW1lbnRhdGlvbi9zYW1wbGVzL2NvbmZpZwojICByZXBsYWNlIC53aW5lcmMgd2l0aCB+Ly53aW5lL2NvbmZpZyBpbiBwcmludGVkIHRleHQKIyAgYWRkZWQgdXNlciBxdWVzdGlvbiB0byBjb252ZXJ0IC53aW5lcmMgZmlsZShpZiBleGlzdHMpIG9yIHVzZSB0aGUgZGVmYXVsdAojICAgIGNvbmZpZyBmaWxlCiMgIGFkZCBjb25mX3F1ZXN0aW9uIHRvIGFsbG93IHJvb3QgdG8gaW5zdGFsbCBhIGxvY2FsIGNvbmZpZyBmaWxlIGFuZAojICAgIHJlZ2lzdHJ5CiMgSmFuIDEyIDIwMDAgLSBDaHJpcyBNb3JnYW4KIyAgZGlzdGluZ3Vpc2ggYmV0d2VlbiBjcmVhdGluZyBsb2NhbCBhbmQgZ2xvYmFsIGNvbmZpZyBmaWxlcwojICBkaXNwbGF5IGEgbWVzc2FnZSBhYm91dCB0aGUgc3RhdHVzIG9mIGdsb2JhbCBjb25maWcgZmlsZXMKIyAgbWlzYyBjbGVhbnVwcyBhbmQgcmVvcmRlcmluZyBvZiBxdWVzdGlvbnMKIyAgYWRkZWQgY2hlY2sgdG8gc2VlIGlmIHdpbmUgaXMgaW5zdGFsbGVkIHdoZW4gd2UgYXJlIHJ1bm5pbmcgYXMgYSBub3JtYWwKIyAgICB1c2VyIGFuZCBwcmludCBhIG1lc3NhZ2UgaWYgd2luZSBjYW5ub3QgYmUgZm91bmQKCiMtLS0gZGVmYXVsdHMgKGNoYW5nZSB0aGVzZSBpZiB5b3UgYXJlIGEgcGFja2FnZXIpCkNPTkZBUkdTPSItLWVuYWJsZS1vcGVuZ2wiICAgICMgY29uZmlndXJlIGFyZ3MsIGUuZy4gLS1wcmVmaXg9L3VzciAtLXN5c2NvbmZkaXI9L2V0YwpwcmVmaXg9L3Vzci9sb2NhbCAgICAgICAgICAgICAjIGluc3RhbGxhdGlvbiBwcmVmaXgKc3lzY29uZmRpcj0kcHJlZml4L2V0YyAgICAgICAgIyB3aGVyZSB3aW5lLmNvbmYgYW5kIGdsb2JhbCByZWdpc3RyeSBpcyBzdXBwb3NlZCB0byBiZQpiaW5kaXI9JHByZWZpeC9iaW4gICAgICAgICAgICAjIHdoZXJlIHdpbmVsaWIgYXBwcyB3aWxsIGJlIChvciBpcykgaW5zdGFsbGVkCmxpYmRpcj0kcHJlZml4L2xpYiAgICAgICAgICAgICMgd2hlcmUgbGlid2luZS5zbyB3aWxsIGJlIChvciBpcykgaW5zdGFsbGVkCmV4ZGlyPWRvY3VtZW50YXRpb24vc2FtcGxlcyAgICMgd2hlcmUgdGhlIGV4YW1wbGUgc3lzdGVtLmluaSByZXNpZGVzCkdDT05GPSRzeXNjb25mZGlyL3dpbmUuY29uZiAgICMgZGVmYXVsdCBwYXRoIG9mIHRoZSB3aW5lLmNvbmYgZ2xvYmFsIGNvbmZpZyBmaWxlCkxDT05GPX4vLndpbmUvY29uZmlnICAgICAgICAgICMgZGVmYXVsdCBwYXRoIG9mIHRoZSBsb2NhbCBjb25maWcgZmlsZQpCSU5ESVNUPW5vICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgY2FsbGVkIGZyb20gYSBiaW5hcnkgcGFja2FnZSBjb25maWcgc2NyaXB0CkRPR0xPQkFMQ09ORj1hdXRvICAgICAgICAgICAgICMgd2hldGhlciB0byBhdXRvZ2VuZXJhdGUgd2luZS5jb25mCkRPTE9DQUxDT05GPWF1dG8gICAgICAgICAgICAgICMgd2hldGhlciB0byBhdXRvZ2VuZXJhdGUgbG9jYWxjb25mCkRPV0NISz1hdXRvICAgICAgICAgICAgICAgICAgICMgd2hldGhlciB0byBhdXRvY29uZmlndXJlIGV4aXN0aW5nLXdpbmRvd3MgaW5zdGFsbGF0aW9uCkRPV0lORT1hdXRvICAgICAgICAgICAgICAgICAgICMgd2hldGhlciB0byBhdXRvY29uZmlndXJlIG5vLXdpbmRvd3MgaW5zdGFsbGF0aW9uCkRPUkVHPWF1dG8gICAgICAgICAgICAgICAgICAgICMgd2hldGhlciB0byBpbnN0YWxsIGRlZmF1bHQgcmVnaXN0cnkKU1lTUkVHPXllcyAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIG1ha2Ugcm9vdCdzIHJlZ2lzdHJ5IGdsb2JhbCAoc3lzdGVtLWRlZmF1bHQpCkNPTlZDT05GPW5vCQkgICAgICAjIHdoZXRoZXIgd2UgYXJlIGNvbnZlcnRpbmcgYW4gZXhpc3RpbmcgLndpbmVyYyBvciBub3QKCiMgIm1ha2UgaW5zdGFsbCIgc3RpbGwgaW5zdGFsbHMgdGhlIGRsbHMgaW50byAkbGliZGlyLCBidXQgdGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUKIyAoRExMUEFUSCBzaG91bGQgcG9pbnQgdG8gdGhlbSBpZi93aGVuIHRoZXkgYXJlIG5vdCBpbiBzdGFuZGFyZCBsZC5zbyBwYXRocykKRExMUEFUSD0kbGliZGlyL3dpbmUgICAgICAgICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIGRsbCAuc28gZmlsZXMgKGV4Y2VwdCBsaWJ3aW5lLnNvKQoKIyBoYXZpbmcgdGhlIFdpbmUgZGVidWdnZXIgbGF1bmNoZWQgYXV0b21hdGljYWxseSB3aWxsIGJlIGEgcGx1cyBmb3IgdXMKREVCVUdHRVI9JGJpbmRpci93aW5lZGJnICAgICAgIyB0aGUgKGluc3RhbGxlZCkgcGF0aCBvZiB3aW5lZGJnCkhERUJVR0dFUj1kZWJ1Z2dlci93aW5lZGJnICAgICMgdGhlIChub24taW5zdGFsbGVkKSBwYXRoIG9mIHdpbmVkYmcKCiMgdGhpcyBpcyBvbmx5IGZvciBleGlzdGluZy13aW5kb3dzIGluc3RhbGxzCldJTkVDT05GPXRvb2xzL3dpbmVjb25mICAgICAgICMgdGhlIHBhdGggb2Ygd2luZWNvbmYgcGVybCBzY3JpcHQKCiMgdGhpcyBpcyBvbmx5IGZvciBuby13aW5kb3dzIGluc3RhbGxzCldJTkVJTkk9JGV4ZGlyL2NvbmZpZyAgICAgICAgICMgdGhlIHBhdGggb2YgZGVmYXVsdCB3aW5lIGNvbmZpZyBmaWxlIChhbHNvIHVzZWQgYnkgd2luZWNvbmYpCldJTklOST0vZGV2L251bGwgICAgICAgICAgICAgICMgdGhlIHBhdGggb2YgZGVmYXVsdCB3aW4uaW5pClNZU1RFTUlOST0kZXhkaXIvc3lzdGVtLmluaSAgICMgdGhlIHBhdGggb2YgZGVmYXVsdCBzeXN0ZW0uaW5pClJFR0FQST1wcm9ncmFtcy9yZWdhcGkvcmVnYXBpICMgdGhlIHBhdGggb2YgcmVnYXBpIHdpbmVsaWIgYXBwbGljYXRpb24KREVGUkVHPXdpbmVkZWZhdWx0LnJlZyAgICAgICAgIyB0aGUgcGF0aCBvZiB0aGUgcmVnaXN0cnkgZmlsZSB0byBiZSBmZWQgdG8gcmVnYXBpCiMgQ1JPT1Q9L3Zhci93aW5lICAgICAgICAgICAgICMgdGhlIHBhdGggb2YgdGhlIGZha2UgRHJpdmUgQyAoYXNrcyB1c2VyIGlmIG5vdCBzZXQpCkRFRkNBVD1jYXQgICAgICAgICAgICAgICAgICAgICMgcHJvZ3JhbSB0byBjYXQgJERFRlJFRyB3aXRoIChzb21lIHBhY2thZ2VzIG5lZWQgemNhdCkKIy0tLSBlbmQgb2YgZGVmYXVsdHMKCiMgdGVtcG9yYXJ5IGZpbGVzIHVzZWQgYnkgdGhlIGluc3RhbGxlcgpUTVBDT05GPS90bXAvd2luZWluc3RhbGwuY29uZgpUTVBSRUc9L3RtcC93aW5laW5zdGFsbC5yZWcKCiMgZnVuY3Rpb25zCgpmdW5jdGlvbiBzdGRfc2xlZXAgewogIHNsZWVwIDEKfQoKZnVuY3Rpb24gY29uZl9xdWVzdGlvbiB7CiAgIyBwYXJhbWV0ZXJzOiAkMSA9IGltcG9ydGFuY2UsICQyID0gcXVlc3Rpb24taWQsICQzKyA9IG1lc3NhZ2UgbGluZXMKICAjIHRoZSBmaXJzdCB0d28gcGFyYW1ldGVycyBjYW4gYmUgdXNlZCBieSBlLmcuIGRlYmNvbmYgaW4gZGViaWFuIHBhY2thZ2VzCiAgIyBidXQgaGVyZSB3ZSBqdXN0IHByaW50IHRoZSBtZXNzYWdlCiAgc2hpZnQgMgogIGVjaG8KICBsb2NhbCBMSU5FPSIkMSIKICB3aGlsZSBzaGlmdAogIGRvIHsKICAgIGVjaG8gIiRMSU5FIgogICAgTElORT0iJDEiCiAgfQogIGRvbmUKfQoKZnVuY3Rpb24gY29uZl9yZXNldF9xdWVzdGlvbiB7CiAgIyBwYXJhbWV0ZXJzOiAkMSA9IHF1ZXN0aW9uLWlkCiAgIyB0aGlzIGlzIHVzZWQgdG8gZmx1c2ggYW55IGNhY2hlZCBhbnN3ZXJzIGFuZCAiYWxyZWFkeS1kaXNwbGF5ZWQiIGZsYWdzCiAgc2hpZnQgIyBkdW1teSBjb21tYW5kCn0KCmZ1bmN0aW9uIGNvbmZfeWVzbm9fYW5zd2VyIHsKICB1bnNldCBBTlNXRVIKICB3aGlsZSBbICIkQU5TV0VSIiAhPSAneWVzJyBdICYmIFsgIiRBTlNXRVIiICE9ICdubycgXQogIGRvIHsKICAgIGVjaG8gLW4gIiQxIgogICAgcmVhZCBBTlNXRVIKICB9CiAgZG9uZQp9CgpmdW5jdGlvbiBjb25mX3N0cmluZ19hbnN3ZXIgewogIGVjaG8gLW4gIiQxIgogIHJlYWQgQU5TV0VSCn0KCmZ1bmN0aW9uIGNyZWF0ZV93aW5kb3dzX2RpcmVjdG9yaWVzIHsKICBmb3IgdGRpciBpbiAiJENST09UL3dpbmRvd3MiICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0iIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudSIgIiRDUk9PVC93aW5kb3dzL1N0YXJ0IE1lbnUvUHJvZ3JhbXMiIFwKICAgICAgICAgICAgICAiJENST09UL0NvbW1vbiBGaWxlcyIgIiRDUk9PVC9Qcm9ncmFtIEZpbGVzIiBcCiAgICAgICAgICAgICAgIiRDUk9PVC93aW5kb3dzL1Byb2ZpbGVzIiAiJENST09UL3dpbmRvd3MvUHJvZmlsZXMvQWRtaW5pc3RyYXRvciIKICBkbyBbIC1kICIkdGRpciIgXSB8fCBta2RpciAiJHRkaXIiCiAgZG9uZQogIFsgLWYgIiRDUk9PVC93aW5kb3dzL3dpbi5pbmkiIF0gICAgfHwgY3AgIiRXSU5JTkkiICAgICIkQ1JPT1Qvd2luZG93cy93aW4uaW5pIgogIFsgLWYgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5pbmkiIF0gfHwgY3AgIiRTWVNURU1JTkkiICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0uaW5pIgp9CgojIHN0YXJ0dXAuLi4KCmVjaG8gIldJTkUgSW5zdGFsbGVyIHYwLjciCmVjaG8KCmlmIFsgIiRCSU5ESVNUIiA9ICdubycgXQp0aGVuIHsKCmlmICEgWyAtZiBjb25maWd1cmUgXQp0aGVuIHsKICBlY2hvICJZb3UncmUgcnVubmluZyB0aGlzIGZyb20gdGhlIHdyb25nIGRpcmVjdG9yeS4iCiAgZWNobyAiQ2hhbmdlIHRvIHRoZSBXaW5lIHNvdXJjZSdzIG1haW4gZGlyZWN0b3J5IGFuZCB0cnkgYWdhaW4uIgogIGV4aXQgMQp9CmZpCgojIGNoZWNrIHdoZXRoZXIgUlBNIGluc3RhbGxlZCwgYW5kIGlmIGl0IGlzLCByZW1vdmUgYW55IG9sZCB3aW5lIHJwbS4KaGFzaCBycG0gJj4vZGV2L251bGwKUkVUPSQ/CmlmIFsgJFJFVCAtZXEgMCBdOyB0aGVuCiAgaWYgWyAtbiAiYHJwbSAtcWkgd2luZSAyPi9kZXYvbnVsbHxncmVwICJeTmFtZSJgIiBdOyB0aGVuCiAgICBlY2hvICJXYXJuaW5nOiBPbGQgV2luZSBSUE0gaW5zdGFsbCBkZXRlY3RlZC4gRG8geW91IHdhbnQgdG8gcmVtb3ZlIGl0IGZpcnN0PyIKICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICBpZiBbICIkQU5TV0VSIiA9ICd5ZXMnIF07IHRoZW4KICAgICAgZWNobyBTdGFydGluZyB3aW5lIHJwbSByZW1vdmFsLi4uCiAgICAgIHJwbSAtZSB3aW5lOyBSRVQ9JD8KICAgICAgaWYgWyAkUkVUIC1lcSAwIF07IHRoZW4KICAgICAgICBlY2hvIERvbmUuCiAgICAgIGVsc2UKICAgICAgICBlY2hvICJGQUlMRUQuIFByb2JhYmx5IHlvdSBhcmVuJ3QgaW5zdGFsbGluZyBhcyByb290LiIKCWVjaG8gIkV4cGVjdCBwcm9ibGVtcyAobGlicmFyeSBjb25mbGljdHMgd2l0aCBleGlzdGluZyBpbnN0YWxsIGV0Yy4pLiIKICAgICAgZmkKICAgIGVsc2UKICAgICAgZWNobyAiU29ycnksIEkgd29uJ3QgaW5zdGFsbCBXaW5lIHdoZW4gYW4gcnBtIHZlcnNpb24gaXMgc3RpbGwgaW5zdGFsbGVkLiIKICAgICAgZWNobyAiKFdpbmUgc3VwcG9ydCBzdWZmZXJlZCBmcm9tIHdheSB0b28gbWFueSBjb25mbGljdHMpIgogICAgICBlY2hvICJIYXZlIGEgbmljZSBkYXkgISIKICAgICAgZXhpdCAxCiAgICBmaSAKICBmaQpmaQoKIyBjaGVjayB3aGV0aGVyIHdpbmUgYmluYXJ5IHN0aWxsIGF2YWlsYWJsZQppZiBbIC1uICJgd2hpY2ggd2luZWAiIF07IHRoZW4KICBlY2hvICJXYXJuaW5nICEhIHdpbmUgYmluYXJ5IChzdGlsbCkgZm91bmQsIHdoaWNoIG1heSBpbmRpY2F0ZSIKICBlY2hvICJhIChjb25mbGljdGluZykgcHJldmlvdXMgaW5zdGFsbGF0aW9uLiIKICBlY2hvICJZb3UgbWlnaHQgd2FudCB0byBhYm9ydCBhbmQgdW5pbnN0YWxsIFdpbmUgZmlyc3QuIgogIHN0ZF9zbGVlcApmaQoKIyBydW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGlmIG5lY2Vzc2FyeQoKaWYgWyAtZiBjb25maWcuY2FjaGUgXSAmJiBbIC1mIE1ha2VmaWxlIF0gJiYgWyBNYWtlZmlsZSAtbnQgY29uZmlndXJlIF0KdGhlbiB7CiAgZWNobyAiSSBzZWUgdGhhdCBXSU5FIGhhcyBhbHJlYWR5IGJlZW4gY29uZmlndXJlZCwgc28gSSdsbCBza2lwIHRoYXQuIgogIHN0ZF9zbGVlcAogICMgbG9hZCBjb25maWd1cmUgcmVzdWx0cwogIC4gLi9jb25maWcuY2FjaGUKfQplbHNlIHsKICBlY2hvICJSdW5uaW5nIGNvbmZpZ3VyZS4uLiIKICBlY2hvCiAgaWYgISAuL2NvbmZpZ3VyZSAkQ09ORkFSR1MKICB0aGVuIHsKICAgIGVjaG8KICAgIGVjaG8gIkNvbmZpZ3VyZSBmYWlsZWQsIGFib3J0aW5nIGluc3RhbGwuIgogICAgcm0gLWYgY29uZmlnLmNhY2hlCiAgICBleGl0IDEKICB9CiAgZmkKICAjIGxvYWQgY29uZmlndXJlIHJlc3VsdHMKICAuIC4vY29uZmlnLmNhY2hlCiAgIyBtYWtlIHN1cmUgWCB3YXMgZm91bmQKICBldmFsICIkYWNfY3ZfaGF2ZV94IgogIGlmIFsgIiRoYXZlX3giICE9ICJ5ZXMiIF0KICB0aGVuIHsKICAgIGVjaG8gIkluc3RhbGwgdGhlIFggZGV2ZWxvcG1lbnQgaGVhZGVycyBhbmQgdHJ5IGFnYWluLiIKICAgIHJtIC1mIGNvbmZpZy5jYWNoZQogICAgZXhpdCAxCiAgfQogIGVsaWYgWyAiJGFjX2N2X2hlYWRlcl9YMTFfeHBtX2giICE9ICJ5ZXMiIF0KICB0aGVuIHsKICAgIGVjaG8gIkluc3RhbGwgdGhlIFhwbSBkZXZlbG9wbWVudCBoZWFkZXJzIGFuZCB0cnkgYWdhaW4uIgogICAgcm0gLWYgY29uZmlnLmNhY2hlCiAgICBleGl0IDEKICB9CiAgZmkKfQpmaQoKIyBub3cgZG8gdGhlIGNvbXBpbGF0aW9uCgppZiBbIC1mIHdpbmUgXSAmJiBbIHdpbmUgLW50IE1ha2VmaWxlIF0KdGhlbiB7CiAgZWNobyAiSG1tLCBsb29rcyBsaWtlIFdJTkUgaXMgYWxyZWFkeSBjb21waWxlZC4gSSdsbCBza2lwIHRoYXQgdG9vLCBJIGd1ZXNzLiIKICBzdGRfc2xlZXAKfQplbHNlIHsKICBlY2hvICJDb21waWxpbmcgV0lORS4gR3JhYiBhIGx1bmNoIG9yIHR3bywgcmVudCBhIHZpZGVvLCBvciB3aGF0ZXZlciwiCiAgZWNobyAiaW4gdGhlIG1lYW50aW1lLi4uIgogIGVjaG8KICBzdGRfc2xlZXAKICBpZiAhIHsgbWFrZSBkZXBlbmQgJiYgbWFrZTsgfQogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiQ29tcGlsYXRpb24gZmFpbGVkLCBhYm9ydGluZyBpbnN0YWxsLiIKICAgIGV4aXQgMQogIH0KICBmaQogIGVjaG8KfQpmaQoKIyBhbmQgaW5zdGFsbGF0aW9uLCBpZiByb290CgppZiBbIGB3aG9hbWlgICE9ICdyb290JyBdCnRoZW4gewogIGVjaG8gIllvdSBhcmVuJ3Qgcm9vdCwgc28gSSdsbCBza2lwIHRoZSBtYWtlIGluc3RhbGwuIgoKICAjIHNldHVwIHRvIHJ1biBmcm9tIGN1cnJlbnQgZGlyZWN0b3J5CiAgRExMUEFUSD0iJFBXRC9kbGxzIgogIGlmIFsgLXogIiRMRF9MSUJSQVJZX1BBVEgiIF0KICB0aGVuIExEX0xJQlJBUllfUEFUSD0iJFBXRDokRExMUEFUSCIKICBlbHNlIExEX0xJQlJBUllfUEFUSD0iJExEX0xJQlJBUllfUEFUSDokUFdEOiRETExQQVRIIgogIGZpCiAgZXhwb3J0IExEX0xJQlJBUllfUEFUSAogIERFQlVHR0VSPSIkUFdELyRIREVCVUdHRVIiCiAgZWNobwogIGVjaG8gIk5PVEUhIFRvIHJ1biBXaW5lIHdpdGhvdXQgaW5zdGFsbGluZywgeW91IG11c3Qgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSIKICBlY2hvICJMRF9MSUJSQVJZX1BBVEggdG8gJFBXRDokRExMUEFUSCIKICBlY2hvICJpbiB5b3VyIGxvZ29uIHNjcmlwdHMuIgogIGVjaG8KCiAgIyBzZWUgaWYgd2luZSBpcyBpbnN0YWxsZWQgb24gdGhlIHVzZXJzIHN5c3RlbSwgaWYgbm90IHByb21wdCB0aGVtCiAgIyBhbmQgdGhlbiBleGl0CiAgaWYgWyAhIGB3aGljaCB3aW5lYCBdCiAgdGhlbgogICAgZWNobyAiQ291bGQgbm90IGZpbmQgd2luZSBvbiB5b3VyIHN5c3RlbS4gIFJ1biB3aW5laW5zdGFsbCBhcyByb290IHRvIGluc3RhbGwgd2luZSIKICAgIGVjaG8gImJlZm9yZSByZS1ydW5uaW5nIHdpbmVpbnN0YWxsIGFzIGEgdXNlci4iCiAgICBlY2hvCiAgICBlY2hvICJFeGl0aW5nIHdpbmVpbnN0YWxsIgogICAgZXhpdCAxOwogIGZpCn0KZWxzZSB7CiAgZWNobyAiTm93IGluc3RhbGxpbmcgYmluYXJpZXMgb250byB0aGUgc3lzdGVtLi4uIgogIGVjaG8KICBzdGRfc2xlZXAKICBpZiAhIG1ha2UgaW5zdGFsbAogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiSW5zdGFsbGF0aW9uIGZhaWxlZCwgYWJvcnRpbmcuIgogICAgZXhpdCAxCiAgfQogIGZpCiAgaWYgWyAtZiAvZXRjL2xkLnNvLmNvbmYgXSAmJiAhIGdyZXAgLXFzICIkbGliZGlyIiAvZXRjL2xkLnNvLmNvbmYKICB0aGVuIHsKICAgIGVjaG8KICAgIGVjaG8gIiRsaWJkaXIgZGlkbid0IGV4aXN0IGluIHlvdXIgL2V0Yy9sZC5zby5jb25mLCBhZGRpbmcgaXQgbm93Li4uIgogICAgZWNobyAiJGxpYmRpciIgPj4vZXRjL2xkLnNvLmNvbmYKICAgIGVjaG8gIlJlLXJ1bm5pbmcgbGRjb25maWcuLi4iCiAgICBldmFsICIkYWNfY3ZfcGF0aF9MRENPTkZJRyIKICB9CiAgZmkKfQpmaQoKfQpmaSAjIEJJTkRJU1QKCiMgbm93IGNoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIGdlbmVyYXRlIHdpbmUuY29uZgppZiBbIC16ICIkRE9HTE9CQUxDT05GIiBdCnRoZW4gRE9HTE9CQUxDT05GPWF1dG8KZmkKCmlmIFsgIiRET0dMT0JBTENPTkYiID0gJ2F1dG8nIF0KdGhlbiB7CiAgIyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgc3lzdGVtIHdpbmUuY29uZgogIGlmIFsgISAtZiAkR0NPTkYgXSAmJiBbIGB3aG9hbWlgID0gJ3Jvb3QnIF0KICB0aGVuCiAgICBET0dMT0JBTENPTkY9bm8KICAgIGVjaG8gIkNyZWF0aW9uIG9mIGEgZ2xvYmFsIGNvbmZpZyBmaWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gd2luZWluc3RhbGwgYXQgdGhpcyIKICAgIGVjaG8gInRpbWUuICBXaGVuIHRoZSBjb25maWd1cmF0aW9uIGFyY2hpdGVjdHVyZSBpcyBjbGVhbmVkIHVwIHRoaXMgZnVuY3Rpb25hbGl0eSIKICAgIGVjaG8gIndpbGwgYmUgcmVzdG9yZWQgdG8gd2luZWluc3RhbGwuIgogICAgZWNobwogIGZpCn0KZmkKCmlmIFsgIiRET0xPQ0FMQ09ORiIgPSAnYXV0bycgXQp0aGVuIHsKICAjIHNlZSBpZiB0aGUgdXNlciBpcyByb290LCBpZiBzbywgZXhwbGljaXRseSBhc2sgdGhlbSBpZiB0aGV5IHdhbnQgYQogICMgbG9jYWwgY29uZmlnIGZpbGUKICBpZiBbIGB3aG9hbWlgID0gJ3Jvb3QnIF0KICB0aGVuCiAgICBlY2hvICJZb3UgYXJlIHJ1bm5pbmcgYXMgcm9vdC4gIERvIHlvdSB3YW50IGEgbG9jYWwgY29uZmlnIGZpbGUsIgogICAgZWNobyAiZmlsZSwgfi8ud2luZS9jb25maWcsIGNyZWF0ZWQ/IgogICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgIERPTE9DQUxDT05GPSIkQU5TV0VSIgogIGVsc2UKICAgIGVjaG8gIkNyZWF0ZSBsb2NhbCBjb25maWcgZmlsZSB+Ly53aW5lL2NvbmZpZz8iCiAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgZWNobwogICAgRE9MT0NBTENPTkY9IiRBTlNXRVIiCiAgICBpZiBbICIkQU5TV0VSIiA9ICdubycgXQogICAgdGhlbgogICAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggbmVlZF9yb290IFwKICAgICAgICAiQWJvcnRpbmcgaW5zdGFsbC4gVHJ5IGFnYWluIGFzIHJvb3QgdG8gZ2VuZXJhdGUgYSBzeXN0ZW0gd2luZS5jb25mLiIKICAgICAgZXhpdCAxCiAgICBmaQogIGZpCgogIGlmIFsgLWYgIiRMQ09ORiIgXQogIHRoZW4KICAgIGVjaG8gIkZvdW5kIGV4aXN0aW5nICRMQ09ORiwgaWYgeW91IGNvbnRpbnVlIHRoaXMgZmlsZSB3aWxsIGJlIgogICAgZWNobyAib3ZlcndyaXR0ZW4uICBDb250aW51ZSBydW5uaW5nIHdpbmVpbnN0YWxsPyIKICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICBlY2hvCiAgICBpZiBbICIkQU5TV0VSIiA9ICdubycgXQogICAgdGhlbgogICAgICBlY2hvICJFeGl0aW5nIHdpbmVpbnN0YWxsIgogICAgICBleGl0IDEKICAgIGZpCiAgZmkKfQpmaQoKIyBnZW5lcmF0ZSAkVE1QQ09ORiBmcm9tIGV4aXN0aW5nIHdpbmRvd3MgaW5zdGFsbCwgaWYgYW55CmlmIFsgIiRET0xPQ0FMQ09ORiIgPSAneWVzJyBdCnRoZW4gewogIGlmIFsgIiRET1dDSEsiID0gJ3llcycgXSB8fCBbICIkRE9XQ0hLIiA9ICdhdXRvJyBdCiAgdGhlbiB7CiAgICBlY2hvIC1uICJTZWFyY2hpbmcgZm9yIGFuIGV4aXN0aW5nIFdpbmRvd3MgaW5zdGFsbGF0aW9uLi4uIgogICAgaWYgISAkV0lORUNPTkYgLWluaWZpbGUgIiRXSU5FSU5JIiA+ICRUTVBDT05GIDI+L2Rldi9udWxsCiAgICB0aGVuIHsKICAgICAgcm0gLWYgJFRNUENPTkYgJFRNUFJFRyA+IC9kZXYvbnVsbAoKICAgICAgZWNobyAiIG5vdCBmb3VuZC4gKG5vIG1hdGNoaW5nIC9ldGMvZnN0YWIgbW91bnQgZW50cnkgZm91bmQpIgogICAgICBjb25mX3F1ZXN0aW9uIGxvdyBkb193aXRob3V0X3dpbmRvd3MgXAogICAgICAgIldpbmRvd3Mgd2FzIG5vdCBmb3VuZCBvbiB5b3VyIHN5c3RlbSwgc28gSSBhc3N1bWUgeW91IHdhbnQiIFwKICAgICAgICJhIFdpbmUtb25seSBpbnN0YWxsYXRpb24uIEFtIEkgY29ycmVjdD8iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gJ25vJyBdCiAgICAgIHRoZW4gewogICAgICAgIGNvbmZfcXVlc3Rpb24gaGlnaCB3aW5kb3dzX25vdF9mb3VuZCBcCiAgICAgICAgICJBYm9ydGluZyBpbnN0YWxsLiBNYWtlIHN1cmUgeW91ciBXaW5kb3dzIHBhcnRpdGlvbiBpcyBtb3VudGVkIGFuZCB0cnkgYWdhaW4sIiBcCiAgICAgICAgICJvciBjcmVhdGUgJExDT05GIG1hbnVhbGx5IGJ5IGNvcHlpbmcgZnJvbSAkV0lORUlOSSBhbmQgYWRhcHRpbmcgdGhlIGRyaXZlIHBhdGhzLiIKICAgICAgICBleGl0IDEKICAgICAgfQogICAgICBmaQogICAgICBET1dJTkU9eWVzCiAgICB9CiAgICBlbHNlIHsKICAgICAgZWNobyAiIGZvdW5kLiIKCiAgICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gd2luZG93c19mb3VuZAogICAgICBjb25mX3F1ZXN0aW9uIGxvdyB3aW5kb3dzX2ZvdW5kIFwKICAgICAgICJDcmVhdGVkICRMQ09ORiB1c2luZyB5b3VyIGV4aXN0aW5nIFdpbmRvd3MgaW5zdGFsbGF0aW9uLiIgXAogICAgICAgIllvdSBwcm9iYWJseSB3YW50IHRvIHJldmlldyB0aGUgZmlsZSwgdGhvdWdoLiIKICAgICAgRE9XSU5FPW5vCiAgICB9CiAgICBmaQogIH0KICBlbGlmIFsgIiRET1dJTkUiID0gJ2F1dG8nIF0KICB0aGVuIERPV0lORT15ZXMKICBmaQp9CmVsaWYgWyAiJERPV0lORSIgPSAnYXV0bycgXQp0aGVuIAogIERPV0lORT1ubwpmaQoKIyBzZXR1cCBhIG5vLXdpbmRvd3MgaW5zdGFsbGF0aW9uLCBpZiBuZWNlc3NhcnkKaWYgWyAiJERPV0lORSIgPSAneWVzJyBdCnRoZW4gewogICMgc2V0IGFuIGFwcHJvcHJpYXRlIERDUk9PVAogIGlmIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KICB0aGVuIERDUk9PVD1+L2MKICBlbHNlIERDUk9PVD0vYwogIGZpCgogIGlmIFsgLWYgfi8ud2luZXJjIF0KICB0aGVuIHsKICAgIGNvbmZfcXVlc3Rpb24gbWVkaXVtIGNvbnZlcnRfY29uZmlnIFwKICAgICAiSSBmb3VuZCB0aGUgb2xkIHZlcnNpb24gV2luZSBjb25maWcgZmlsZSwgLndpbmVyYywgaW4geW91ciAiIFwKICAgICAiaG9tZSBkaXJlY3RvcnkuICBJIGNhbiBjb252ZXJ0IHRoaXMgdG8gdGhlIG5ldyBmb3JtYXQgb3IgdXNlIHRoZSIgXAogICAgICJuZXcgZGVmYXVsdCBXaW5lIGNvbmZpZyBmaWxlLiBDb252ZXJ0PyIKICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICBpZiBbICIkQU5TV0VSIiA9ICd5ZXMnIF0KICAgIHRoZW4gewogICAgICBXSU5FSU5JPX4vLndpbmVyYwogICAgICBDT05WQ09ORj15ZXMKICAgIH0KICAgIGZpCiAgfQogIGVsc2UgewoKICAgIGNvbmZfcXVlc3Rpb24gbG93IGRyaXZlY19wYXRoIFwKICAgICAiQ29uZmlndXJpbmcgV2luZSB3aXRob3V0IFdpbmRvd3MuIiBcCiAgICAgIlNvbWUgZmFrZSBXaW5kb3dzIGRpcmVjdG9yaWVzIG11c3QgYmUgY3JlYXRlZCwgdG8gaG9sZCBhbnkgLmluaSBmaWxlcywgRExMcywiIFwKICAgICAic3RhcnQgbWVudSBlbnRyaWVzLCBhbmQgb3RoZXIgdGhpbmdzIHlvdXIgYXBwbGljYXRpb25zIG1heSBuZWVkIHRvIGluc3RhbGwuIiBcCiAgICAgIldoZXJlIHdvdWxkIHlvdSBsaWtlIHlvdXIgZmFrZSBDIGRyaXZlIHRvIGJlIHBsYWNlZD8iCiAgICB3aGlsZSBbIC16ICIkQ1JPT1QiIF0KICAgIGRvIHsKICAgICAgY29uZl9zdHJpbmdfYW5zd2VyICIoZGVmYXVsdCBpcyAkRENST09UKSAiCiAgICAgIFsgLXogIiRBTlNXRVIiIF0gJiYgQU5TV0VSPSIkRENST09UIgogICAgICBpZiAhIFsgLWQgIiRBTlNXRVIiIF0KICAgICAgdGhlbiB7CiAgICAgICAgaWYgbWtkaXIgLXAgIiRBTlNXRVIiCiAgICAgICAgdGhlbiBDUk9PVD0iJEFOU1dFUiIKICAgICAgICBlbHNlCiAgICAgICAgICBlY2hvICJEaXJlY3RvcnkgJEFOU1dFUiBjYW4ndCBiZSBjcmVhdGVkICEiCiAgICAgICAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIGRyaXZlY19wYXRoCiAgICAgICAgZmkKICAgICAgfQogICAgICBlbHNlIENST09UPSIkQU5TV0VSIgogICAgICBmaQogICAgfQogICAgZG9uZQogICAgZWNobyAiQ29uZmlndXJpbmcgV2luZSBmb3IgYSBuby13aW5kb3dzIGluc3RhbGwgaW4gJENST09ULi4uIgogIAogICAgY3JlYXRlX3dpbmRvd3NfZGlyZWN0b3JpZXMKICB9CiAgZmkKCiAgIyBjcmVhdGUgJExDT05GIHVzaW5nIHRoZSBkZWZhdWx0IGNvbmZpZyBmaWxlICRXSU5FSU5JICAKICBpZiBbICIkRE9MT0NBTENPTkYiID0gJ3llcycgXSAmJiBbICIkQ09OVkNPTkYiID0gJ25vJyBdCiAgdGhlbiB7CiAgICBzZWQgInN8XCJQYXRoXCIgPSBcIi9jXCJcJHxcIlBhdGhcIiA9IFwiJHtDUk9PVH1cInwiICRXSU5FSU5JID4gJFRNUENPTkYKICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gZGVmYXVsdF9jb25maWcKICAgIGNvbmZfcXVlc3Rpb24gbG93IGRlZmF1bHRfY29uZmlnIFwKICAgICAiQ3JlYXRlZCAkTENPTkYgdXNpbmcgZGVmYXVsdCBXaW5lIGNvbmZpZ3VyYXRpb24uIiBcCiAgICAgIllvdSBwcm9iYWJseSB3YW50IHRvIHJldmlldyB0aGUgZmlsZSwgdGhvdWdoLiIKICB9CiAgZmkKCiAgIyBub3cgd2UgcmVhbGx5IHNob3VsZCBpbnN0YWxsIHRoZSByZWdpc3RyeQogIGlmIFsgIiRET1JFRyIgPSAnYXV0bycgXQogIHRoZW4gRE9SRUc9eWVzCiAgZmkKfQpmaQplY2hvCgojaW5zdGFsbCB0aGUgbG9jYWwgY29uZmlnIGZpbGUgJExDT05GCmlmIFsgIiRET0xPQ0FMQ09ORiIgPSAneWVzJyBdCnRoZW4KICBpZiBbICEgLXcgfi8ud2luZSBdCiAgdGhlbgogICAgbWtkaXIgfi8ud2luZQogIGZpCgogIGlmIFsgIiRDT05WQ09ORiIgPSAnbm8nIF0KICB0aGVuCiAgICBjcCAkVE1QQ09ORiAkTENPTkYgPiAvZGV2L251bGwKICBmaQplbHNlCiAgRE9SRUc9bm8KZmkgICAgICAKCiNpbnN0YWxsIHRoZSBnbG9iYWwgY29uZmlnIGZpbGUgJEdDT05GCmlmIFsgIiRET0dMT0JBTENPTkYiID0gJ3llcycgXQp0aGVuCiAgaWYgWyAhIC1mICRzeXNjb25mZGlyIF0KICB0aGVuCiAgICBta2RpciAtcCAkc3lzY29uZmRpcgogIGZpCgogIGNwICRUTVBDT05GICRHQ09ORiA+IC9kZXYvbnVsbApmaQoKIyBjaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gaW5zdGFsbCBkZWZhdWx0IHJlZ2lzdHJ5CiMgKG5vdCB0byBiZSBkb25lIGlmIHdpbmRvd3MgcmVnaXN0cnkgZXhpc3RzKQppZiBbICIkRE9SRUciID0gJ2F1dG8nIF0KdGhlbiB7CiAgZWNobyAiQ2hlY2tpbmcgZm9yIHJlYWwgV2luZG93cyByZWdpc3RyeS4uLiIKICBpZiBbIC1mICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0uZGF0IiBdCiAgdGhlbiBET1JFRz1ubwogIGVsaWYgWyAtZiAiJENST09UL3dpbmRvd3Mvc3lzdGVtMzIvY29uZmlnL3N5c3RlbSIgXQogIHRoZW4gRE9SRUc9bm8KICBlbHNlIERPUkVHPXllcwogIGZpCiAgaWYgWyAiJERPUkVHIiA9ICd5ZXMnIF0KICB0aGVuIGVjaG8gIk5vdCBmb3VuZCwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IHdpbGwgYmUgaW5zdGFsbGVkLiIKICBlbHNlIGVjaG8gIldpbmRvd3MgcmVnaXN0cnkgZm91bmQsIHdpbGwgbm90IGluc3RhbGwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5LiIKICBmaQogIGVjaG8KfQpmaQoKIyBpbnN0YWxsIGRlZmF1bHQgcmVnaXN0cnkgZW50cmllcwppZiBbICIkRE9SRUciID0gJ3llcycgXQp0aGVuIHsKICBpZiBbICIkQklORElTVCIgPSAnbm8nIF0KICB0aGVuIHsKICAgIGVjaG8gIkNvbXBpbGluZyByZWdhcGkuLi4iCiAgICAoY2QgcHJvZ3JhbXMvcmVnYXBpOyBtYWtlKQogICAgZWNobwogIH0KICBmaQogIGVjaG8gIlByZXBhcmluZyB0byBpbnN0YWxsIGRlZmF1bHQgV2luZSByZWdpc3RyeSBlbnRyaWVzLi4uIgoKICAjIGVkaXQgY29uZmlnIGZpbGVzIHNvIHdlIGRvbid0IGhhdmUgdG8gcnVuIHJlZ2FwaSB1bmRlciBYCiAgaWYgWyAiJENPTlZDT05GIiA9ICd5ZXMnIF0KICB0aGVuCiAgICBtdiAkV0lORUlOSSAkV0lORUlOSS5uZXcKICAgIHNlZCAicy9HcmFwaGljc0RyaXZlcj0uKi9HcmFwaGljc0RyaXZlcj10dHlkcnYvIiAkV0lORUlOSS5uZXcgPiAkV0lORUlOSQogIGVsc2UKICAgIG12ICRMQ09ORiAkTENPTkYubmV3CiAgICBzZWQgInMvXCJHcmFwaGljc0RyaXZlclwiID0gLiovXCJHcmFwaGljc0RyaXZlclwiID0gXCJ0dHlkcnZcIi8iICRMQ09ORi5uZXcgPiAkTENPTkYKICBmaQoKICAjIGNyZWF0ZSBhIHRlbXBvcmFyeSB3aW5laW5zdGFsbC5yZWcgd2l0aCBmaXhlZCBkZWJ1Z2dlciBwYXRoCiAgJERFRkNBVCAkREVGUkVHIHwgc2VkICJzfGRlYnVnZ2VyL3dpbmVkYmd8JHtERUJVR0dFUn18IiA+ICRUTVBSRUcKCiAgZWNobyAiSW5zdGFsbGluZyBkZWZhdWx0IFdpbmUgcmVnaXN0cnkgZW50cmllcy4uLiIKICBlY2hvCiAgaWYgISAkUkVHQVBJIHNldFZhbHVlIDwgJFRNUFJFRyA+IC9kZXYvbnVsbAogIHRoZW4gewogICAgcm0gLWYgJFRNUFJFRwogICAgZWNobyAiUmVnaXN0cnkgaW5zdGFsbCBmYWlsZWQuIgogICAgY29uZl9yZXNldF9xdWVzdGlvbiByZWdhcGlfZXJyb3IKICAgIGNvbmZfcXVlc3Rpb24gaGlnaCByZWdhcGlfZXJyb3IKICAgIGV4aXQgMQogIH0KICBlbHNlIHsKICAgICMgaWYgd2UgYXJlIGNvbnZlcnRpbmcgZnJvbSBhIC53aW5lcmMgZmlsZSwgcnVubmluZyByZWdhcGkgb25jZQogICAgIyB3aWxsIE9OTFkgY29udmVydCAud2luZXJjIC0+IH4vLndpbmUvY29uZmlnLCBpdCB3aWxsIG5vdCBpbXBvcnQgdGhlCiAgICAjIHJlZ2lzdHJ5IGRhdGEuICBzbyBpZiB3ZSBhcmUgY29udmVydGluZyB3ZSBuZWVkIHRvIHJ1biByZWdhcGkgdHdpY2UKICAgIGlmIFsgIiRDT05WQ09ORiIgPSAneWVzJyBdCiAgICB0aGVuCiAgICAgIGlmICEgJFJFR0FQSSBzZXRWYWx1ZSA8ICRUTVBSRUcgPiAvZGV2L251bGwKICAgICAgdGhlbgogICAgICAgIHJtIC1mICRUTVBSRUcKICAgICAgICBlY2hvICJSZWdpc3RyeSBpbnN0YWxsIGZhaWxlZC4iCiAgICAgICAgY29uZl9yZXNldF9xdWVzdGlvbiByZWdhcGlfZXJyb3IKICAgICAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggcmVnYXBpX2Vycm9yCiAgICAgICAgZXhpdCAxCiAgICAgIGVsc2UKICAgICAgICBlY2hvCiAgICAgICAgZWNobyAiUmVnaXN0cnkgZW50cmllcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkLiIKICAgICAgZmkKICAgIGVsc2UKICAgICAgZWNobwogICAgICBlY2hvICJSZWdpc3RyeSBlbnRyaWVzIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQuIgogICAgZmkKICB9CiAgZmkKICBybSAtZiAkVE1QUkVHCiAgaWYgWyAiJFNZU1JFRyIgPSAnYXV0bycgXQogIHRoZW4gU1lTUkVHPXllcwogIGZpCgogICMgaWYgd2UgY29udmVydGVkIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBncmFwaGljcyBkcml2ZXIgYmFjayBhbmQKICAjIHJlc3RvcmUgdGhlIG9yaWdpbmFsIC53aW5lcmMgZmlsZQogIGlmIFsgIiRDT05WQ09ORiIgPSAneWVzJyBdCiAgdGhlbgogICAgIG12ICRXSU5FSU5JLm5ldyAkV0lORUlOSQogIGZpCgogIHNlZCAicy9cIkdyYXBoaWNzRHJpdmVyXCIgPSAuKi9cIkdyYXBoaWNzRHJpdmVyXCIgPSBcIngxMWRydlwiLyIgJExDT05GID4gJExDT05GLm5ldwogIG12ICRMQ09ORi5uZXcgJExDT05GCn0KZmkKCiMgbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsLCBpZiBkZXNpcmVkCmlmIFsgYHdob2FtaWAgPSAncm9vdCcgXSAmJiBbICIkRE9SRUciID0gJ3llcycgXSAmJiBbICIkU1lTUkVHIiA9ICd5ZXMnIF0KdGhlbiB7CiAgWyAtZCB+Ly53aW5lIF0gfHwgbWtkaXIgfi8ud2luZQogIGlmICEgWyAtZiAkc3lzY29uZmRpci93aW5lLnVzZXJyZWcgXQogIHRoZW4gewogICAgZWNobyAiTGlua2luZyByb290J3MgdXNlciByZWdpc3RyeSBoaXZlIHRvIHRoZSBnbG9iYWwgcmVnaXN0cnkuLi4iCiAgICBbIC1mIH4vLndpbmUvd2luZS51c2VycmVnIF0gJiYgY3Agfi8ud2luZS93aW5lLnVzZXJyZWcgJHN5c2NvbmZkaXIvd2luZS51c2VycmVnCiAgICBsbiAtc2YgJHN5c2NvbmZkaXIvd2luZS51c2VycmVnIH4vLndpbmUvd2luZS51c2VycmVnCiAgfQogIGZpCiAgaWYgISBbIC1mICRzeXNjb25mZGlyL3dpbmUuc3lzdGVtcmVnIF0KICB0aGVuIHsKICAgIGVjaG8gIkxpbmtpbmcgcm9vdCdzIHN5c3RlbSByZWdpc3RyeSBoaXZlIHRvIHRoZSBnbG9iYWwgcmVnaXN0cnkuLi4iCiAgICBbIC1mIH4vLndpbmUvc3lzdGVtLnJlZyBdICYmIGNwIH4vLndpbmUvc3lzdGVtLnJlZyAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZwogICAgbG4gLXNmICRzeXNjb25mZGlyL3dpbmUuc3lzdGVtcmVnIH4vLndpbmUvc3lzdGVtLnJlZwogIH0KICBmaQp9CmZpCgojIGNsZWFudXAgYW55IHRlbXBvcmFyeSBmaWxlcyB0aGF0IG1heSByZW1haW4KaWYgWyAtZiAkVE1QQ09ORiBdCnRoZW4gcm0gLWYgJFRNUENPTkYKZmkKaWYgWyAtZiAkVE1QUkVHIF0KdGhlbiBybSAtZiAkVE1QUkVHCmZpCgoKIyBpdCdzIGEgd3JhcAplY2hvCmVjaG8gIkluc3RhbGxhdGlvbiBjb21wbGV0ZSBmb3Igbm93LiBHb29kIGx1Y2sgKHRoaXMgaXMgc3RpbGwgYWxwaGEgc29mdHdhcmUpLiIKZWNobyAiSWYgeW91IGhhdmUgcHJvYmxlbXMgd2l0aCBXSU5FLCBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmaXJzdCwiCmVjaG8gImFzIG1hbnkga2luZHMgb2YgcG90ZW50aWFsIHByb2JsZW1zIGFyZSBleHBsYWluZWQgdGhlcmUuIgoKZXhpdCAwCg==