CmRubApkbmwgR0xJQkNYWF9DT05ESVRJT05BTCAoTkFNRSwgU0hFTEwtVEVTVCkKZG5sCmRubCBFeGFjdGx5IGxpa2UgQU1fQ09ORElUSU9OQUwsIGJ1dCBkZWxheXMgZXZhbHVhdGlvbiBvZiB0aGUgdGVzdCB1bnRpbCB0aGUKZG5sIGVuZCBvZiBjb25maWd1cmUuICBUaGlzIGxldHMgdGVzdGVkIHZhcmlhYmxlcyBiZSByZWFzc2lnbmVkLCBhbmQgdGhlCmRubCBjb25kaXRpb25hbCB3aWxsIGRlcGVuZCBvbiB0aGUgZmluYWwgc3RhdGUgb2YgdGhlIHZhcmlhYmxlLiAgRm9yIGEgc2ltcGxlCmRubCBleGFtcGxlIG9mIHdoeSB0aGlzIGlzIG5lZWRlZCwgc2VlIEdMSUJDWFhfRU5BQkxFX0hPU1RFRC4KZG5sCm00X2RlZmluZShbX200X2RpdmVydChnbGliY3h4X2RpdmVyc2lvbildLCA4MDAwKWRubApBQ19ERUZVTihbR0xJQkNYWF9DT05ESVRJT05BTF0sIFtkbmwKICBtNF9kaXZlcnRfdGV4dChbZ2xpYmN4eF9kaXZlcnNpb25dLGRubAogICBBTV9DT05ESVRJT05BTChbJDFdLFskMl0pCiAgKWRubApdKWRubApBQ19ERUZVTihbR0xJQkNYWF9FVkFMVUFURV9DT05ESVRJT05BTFNdLCBbbTRfdW5kaXZlcnQoW2dsaWJjeHhfZGl2ZXJzaW9uXSldKWRubAoKCmRubApkbmwgQ2hlY2sgdG8gc2VlIHdoYXQgYXJjaGl0ZWN0dXJlIGFuZCBvcGVyYXRpbmcgc3lzdGVtIHdlIGFyZSBjb21waWxpbmcKZG5sIGZvci4gIEFsc28sIGlmIGFyY2hpdGVjdHVyZS0gb3IgT1Mtc3BlY2lmaWMgZmxhZ3MgYXJlIHJlcXVpcmVkIGZvcgpkbmwgY29tcGlsYXRpb24sIHBpY2sgdGhlbSB1cCBoZXJlLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfSE9TVF0sIFsKICAuICRnbGliY3h4X3NyY2Rpci9jb25maWd1cmUuaG9zdAogIEFDX01TR19OT1RJQ0UoW0NQVSBjb25maWcgZGlyZWN0b3J5IGlzICRjcHVfaW5jbHVkZV9kaXJdKQogIEFDX01TR19OT1RJQ0UoW09TIGNvbmZpZyBkaXJlY3RvcnkgaXMgJG9zX2luY2x1ZGVfZGlyXSkKXSkKCmRubApkbmwgSW5pdGlhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgbGlicmFyeSBjb25maWd1cnkuICBBdCB0aGlzIHBvaW50IHdlIGhhdmUKZG5sIHZhcmlhYmxlcyBsaWtlICRob3N0LgpkbmwKZG5sIFNldHM6CmRubCAgU1VCRElSUwpkbmwgU3Vic3RzOgpkbmwgIGdsaWJjeHhfYnVpbGRkaXIgICAgIChhYnNvbHV0ZSBwYXRoKQpkbmwgIGdsaWJjeHhfc3JjZGlyICAgICAgIChhYnNvbHV0ZSBwYXRoKQpkbmwgIHRvcGxldmVsX3NyY2RpciAgICAgIChhYnNvbHV0ZSBwYXRoKQpkbmwgIHdpdGhfY3Jvc3NfaG9zdApkbmwgIHdpdGhfbmV3bGliCmRubCAgd2l0aF90YXJnZXRfc3ViZGlyCmRubCBwbHVzCmRubCAgLSB0aGUgdmFyaWFibGVzIGluIEdMSUJDWFhfQ0hFQ0tfSE9TVCAvIGNvbmZpZ3VyZS5ob3N0CmRubCAgLSBkZWZhdWx0IHNldHRpbmdzIGZvciBhbGwgQU1fQ09ORklUSU9OQUwgdGVzdCB2YXJpYWJsZXMKZG5sICAtIGxvdHMgb2YgdG9vbHMsIGxpa2UgQ0MgYW5kIENYWApkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ09ORklHVVJFXSwgWwogICMgS2VlcCB0aGVzZSBzeW5jJ2Qgd2l0aCB0aGUgbGlzdCBpbiBNYWtlZmlsZS5hbS4gIFRoZSBmaXJzdCBwcm92aWRlcyBhbgogICMgZXhwYW5kYWJsZSBsaXN0IGF0IGF1dG9jb25mIHRpbWU7IHRoZSBzZWNvbmQgcHJvdmlkZXMgYW4gZXhwYW5kYWJsZSBsaXN0CiAgIyAoaS5lLiwgc2hlbGwgdmFyaWFibGUpIGF0IGNvbmZpZ3VyZSB0aW1lLgogIG00X2RlZmluZShbZ2xpYmN4eF9TVUJESVJTXSxbaW5jbHVkZSBsaWJtYXRoIGxpYnN1cGMrKyBzcmMgZG9jIHBvIHRlc3RzdWl0ZV0pCiAgU1VCRElSUz0nZ2xpYmN4eF9TVUJESVJTJwoKICAjIFRoZXNlIG5lZWQgdG8gYmUgYWJzb2x1dGUgcGF0aHMsIHlldCBhdCB0aGUgc2FtZSB0aW1lIG5lZWQgdG8KICAjIGNhbm9uaWNhbGl6ZSBvbmx5IHJlbGF0aXZlIHBhdGhzLCBiZWNhdXNlIHRoZW4gYW1kIHdpbGwgbm90IHVubW91bnQKICAjIGRyaXZlcy4gVGh1cyB0aGUgdXNlIG9mIFBXRENNRDogc2V0IGl0IHRvICdwYXdkJyBvciAnYW1xIC13JyBpZiB1c2luZyBhbWQuCiAgZ2xpYmN4eF9idWlsZGRpcj1gJHtQV0RDTUQtcHdkfWAKICBjYXNlICRzcmNkaXIgaW4KICAgIFtcXC8kXSogfCA/OltcXC9dKikgZ2xpYmN4eF9zcmNkaXI9JHtzcmNkaXJ9IDs7CiAgICAqKSBnbGliY3h4X3NyY2Rpcj1gY2QgIiRzcmNkaXIiICYmICR7UFdEQ01ELXB3ZH0gfHwgZWNobyAiJHNyY2RpciJgIDs7CiAgZXNhYwogIHRvcGxldmVsX3NyY2Rpcj0ke2dsaWJjeHhfc3JjZGlyfS8uLgogIEFDX1NVQlNUKGdsaWJjeHhfYnVpbGRkaXIpCiAgQUNfU1VCU1QoZ2xpYmN4eF9zcmNkaXIpCiAgQUNfU1VCU1QodG9wbGV2ZWxfc3JjZGlyKQoKICAjIFdlIHVzZSB0aGVzZSBvcHRpb25zIHRvIGRlY2lkZSB3aGljaCBmdW5jdGlvbnMgdG8gaW5jbHVkZS4gIFRoZXkgYXJlCiAgIyBzZXQgZnJvbSB0aGUgdG9wIGxldmVsLgogIEFDX0FSR19XSVRIKFt0YXJnZXQtc3ViZGlyXSwKICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtdGFyZ2V0LXN1YmRpcj1TVUJESVJdLAogICAgICAgICAgICAgICAgICAgW2NvbmZpZ3VyaW5nIGluIGEgc3ViZGlyZWN0b3J5XSkpCgogIEFDX0FSR19XSVRIKFtjcm9zcy1ob3N0XSwKICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtY3Jvc3MtaG9zdD1IT1NUXSwKICAgICAgICAgICAgICAgICAgIFtjb25maWd1cmluZyB3aXRoIGEgY3Jvc3MgY29tcGlsZXJdKSkKCiAgQUNfQVJHX1dJVEgoW25ld2xpYl0sCiAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLW5ld2xpYl0sCiAgICAgICAgICAgICAgICAgICBbYXNzdW1lIG5ld2xpYiBhcyBhIHN5c3RlbSBDIGxpYnJhcnldKSkKCiAgIyBXZSdyZSBhbG1vc3QgY2VydGFpbmx5IGJlaW5nIGNvbmZpZ3VyZWQgYmVmb3JlIGFueXRoaW5nIGVsc2Ugd2hpY2ggdXNlcwogICMgQysrLCBzbyBhbGwgb2Ygb3VyIEFDX1BST0dfKiBkaXNjb3ZlcmllcyB3aWxsIGJlIGNhY2hlZC4gIEl0J3Mgdml0YWwgdGhhdAogICMgd2Ugbm90IGNhY2hlIHRoZSB2YWx1ZSBvZiBDWFggdGhhdCB3ZSAiZGlzY292ZXIiIGhlcmUsIGJlY2F1c2UgaXQncyBzZXQKICAjIHRvIHNvbWV0aGluZyB1bmlxdWUgZm9yIHVzIGFuZCBsaWJqYXZhLiAgT3RoZXIgdGFyZ2V0IGxpYnJhcmllcyBuZWVkIHRvCiAgIyBmaW5kIENYWCBmb3IgdGhlbXNlbHZlcy4gIFdlIHlhbmsgdGhlIHJ1ZyBvdXQgZnJvbSB1bmRlciB0aGUgbm9ybWFsIEFDXyoKICAjIHByb2Nlc3MgYnkgc25lYWtpbHkgcmVuYW1pbmcgdGhlIGNhY2hlIHZhcmlhYmxlLiAgVGhpcyBhbHNvIGxldHMgdXMgZGVidWcKICAjIHRoZSB2YWx1ZSBvZiAib3VyIiBDWFggaW4gcG9zdG1vcnRlbXMuCiAgIwogICMgV2UgbXVzdCBhbHNvIGZvcmNlIENYWCB0byAvbm90LyBiZSBhIHByZWNpb3VzIHZhcmlhYmxlLCBvdGhlcndpc2UgdGhlCiAgIyB3cm9uZyAobm9uLW11bHRpbGliLWFkanVzdGVkKSB2YWx1ZSB3aWxsIGJlIHVzZWQgaW4gbXVsdGlsaWJzLiAgVGhpcwogICMgbGl0dGxlIHRyaWNrIGFsc28gYWZmZWN0cyBDUFBGTEFHUywgQ1hYRkxBR1MsIGFuZCBMREZMQUdTLiAgQW5kIGFzIGEgc2lkZQogICMgZWZmZWN0LCBDWFhGTEFHUyBpcyBubyBsb25nZXIgYXV0b21hZ2ljYWxseSBzdWJzdCdkLCBzbyB3ZSBoYXZlIHRvIGRvCiAgIyB0aGF0IG91cnNlbHZlcy4gIFVuLXByZWNpb3VzaW5nIEFDX1BST0dfQ0MgYWxzbyBhZmZlY3RzIENDIGFuZCBDRkxBR1MuCiAgIwogICMgLWZuby1idWlsdGluIG11c3QgYmUgcHJlc2VudCBoZXJlIHNvIHRoYXQgYSBub24tY29uZmxpY3RpbmcgZm9ybSBvZgogICMgc3RkOjpleGl0IGNhbiBiZSBndWVzc2VkIGJ5IEFDX1BST0dfQ1hYLCBhbmQgdXNlZCBpbiBsYXRlciB0ZXN0cy4KCiAgbTRfZGVmaW5lKFthY19jdl9wcm9nX0NYWF0sW2dsaWJjeHhfY3ZfcHJvZ19DWFhdKQogIG00X3JlbmFtZShbX0FDX0FSR19WQVJfUFJFQ0lPVVNdLFtnbGliY3h4X1BSRUNJT1VTXSkKICBtNF9kZWZpbmUoW19BQ19BUkdfVkFSX1BSRUNJT1VTXSxbXSkKICBzYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCiAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAtZm5vLWJ1aWx0aW4iCiAgQUNfUFJPR19DQwogIEFDX1BST0dfQ1hYCiAgQ1hYRkxBR1M9IiRzYXZlX0NYWEZMQUdTIgogIG00X3JlbmFtZShbZ2xpYmN4eF9QUkVDSU9VU10sW19BQ19BUkdfVkFSX1BSRUNJT1VTXSkKICBBQ19TVUJTVChDRkxBR1MpCiAgQUNfU1VCU1QoQ1hYRkxBR1MpCgogICMgV2lsbCBzZXQgTE5fUyB0byBlaXRoZXIgJ2xuIC1zJywgJ2xuJywgb3IgJ2NwIC1wJyAoaWYgbGlua2luZyBpc24ndAogICMgYXZhaWxhYmxlKS4gIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGZvcmNlIGEgcGFydGljdWxhciBtZXRob2QuCiAgQUNfUFJPR19MTl9TCiAgI0xOX1M9J2NwIC1wJwoKICBBQ19DSEVDS19UT09MKEFTLCBhcykKICBBQ19DSEVDS19UT09MKEFSLCBhcikKICBBQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCByYW5saWItbm90LWZvdW5kLWluLXBhdGgtZXJyb3IpCgogIEFNX01BSU5UQUlORVJfTU9ERQoKICAjIFNldCB1cCBzYWZlIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgc3Vic2VxdWVudCBBTV9DT05ESVRJT05BTCB0ZXN0cwogICMgd2hpY2ggYXJlIHRoZW1zZWx2ZXMgY29uZGl0aW9uYWxseSBleHBhbmRlZC4KICAjIyAoUmlnaHQgbm93LCB0aGlzIG9ubHkgbWF0dGVycyBmb3IgZW5hYmxlX3djaGFyX3QsIGJ1dCBub3RoaW5nIHByZXZlbnRzCiAgIyMgb3RoZXIgbWFjcm9zIGZyb20gZG9pbmcgdGhlIHNhbWUuICBUaGlzIHNob3VsZCBiZSBhdXRvbWF0ZWQuKSAgLXBtZQogIG5lZWRfbGlibWF0aD1ubwoKICAjIENoZWNrIGZvciB1Q2xpYmMgc2luY2UgTGludXggcGxhdGZvcm1zIHVzZSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbgogICMgZGlyZWN0b3JpZXMgZGVwZW5kaW5nIG9uIHRoZSBDIGxpYnJhcnkgaW4gdXNlLgogIEFDX0VHUkVQX0NQUChbX3VzaW5nX3VjbGliY10sIFsKICAjaW5jbHVkZSA8c3RkaW8uaD4KICAjaWYgX19VQ0xJQkNfXwogICAgX3VzaW5nX3VjbGliYwogICNlbmRpZgogIF0sIHVjbGliYz15ZXMsIHVjbGliYz1ubykKCiAgIyBGaW5kIHBsYXRmb3JtLXNwZWNpZmljIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBpbmZvLgogICMgQWxzbyBwb3NzaWJseSBtb2RpZnkgZmxhZ3MgdXNlZCBlbHNld2hlcmUsIGFzIG5lZWRlZCBieSB0aGUgcGxhdGZvcm0uCiAgR0xJQkNYWF9DSEVDS19IT1NUCl0pCgoKZG5sCmRubCBUZXN0cyBmb3IgbmV3ZXIgY29tcGlsZXIgZmVhdHVyZXMsIG9yIGZlYXR1cmVzIHRoYXQgYXJlIHByZXNlbnQgaW4gbmV3ZXIKZG5sIGNvbXBpbGVyIHZlcnNpb25zIGJ1dCBub3Qgb2xkZXIgY29tcGlsZXIgdmVyc2lvbnMgc3RpbGwgaW4gdXNlLCBzaG91bGQKZG5sIGJlIHBsYWNlZCBoZXJlLgpkbmwKZG5sIERlZmluZXM6CmRubCAgV0VSUk9SPSctV2Vycm9yJyBpZiByZXF1ZXN0ZWQgYW5kIHBvc3NpYmxlOyBnKysncyB0aGF0IGxhY2sgdGhlCmRubCAgIG5ldyBpbmxpbmluZyBjb2RlIG9yIHRoZSBuZXcgc3lzdGVtX2hlYWRlciBwcmFnbWEgd2lsbCBkaWUgb24gLVdlcnJvci4KZG5sICAgTGVhdmUgaXQgb3V0IGJ5IGRlZmF1bHQgYW5kIHVzZSBtYWludC1tb2RlIHRvIHVzZSBpdC4KZG5sICBTRUNUSU9OX0ZMQUdTPSctZmZ1bmN0aW9uLXNlY3Rpb25zIC1mZGF0YS1zZWN0aW9ucycgaWYKZG5sICAgY29tcGlsZXIgc3VwcG9ydHMgaXQgYW5kIHRoZSB1c2VyIGhhcyBub3QgcmVxdWVzdGVkIGRlYnVnIG1vZGUuCmRubApBQ19ERUZVTihbR0xJQkNYWF9DSEVDS19DT01QSUxFUl9GRUFUVVJFU10sIFsKICAjIEFsbCB0aGVzZSB0ZXN0cyBhcmUgZm9yIEMrKzsgc2F2ZSB0aGUgbGFuZ3VhZ2UgYW5kIHRoZSBjb21waWxlciBmbGFncy4KICAjIFRoZSBDWFhGTEFHUyB0aGluZyBpcyBzdXNwaWNpb3VzLCBidXQgYmFzZWQgb24gc2ltaWxhciBiaXRzIHByZXZpb3VzbHkKICAjIGZvdW5kIGluIEdMSUJDWFhfQ09ORklHVVJFLgogIEFDX0xBTkdfU0FWRQogIEFDX0xBTkdfQ1BMVVNQTFVTCiAgYWNfdGVzdF9DWFhGTEFHUz0iJHtDWFhGTEFHUytzZXR9IgogIGFjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKCiAgIyBDaGVjayBmb3IgbWFpbnRhaW5lci1tb2RlIGJpdHMuCiAgaWYgdGVzdCB4IiRVU0VfTUFJTlRBSU5FUl9NT0RFIiA9IHhubzsgdGhlbgogICAgV0VSUk9SPScnCiAgZWxzZQogICAgV0VSUk9SPSctV2Vycm9yJwogIGZpCgogICMgQ2hlY2sgZm9yIC1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgZysrIHRoYXQgc3VwcG9ydHMgLWZmdW5jdGlvbi1zZWN0aW9ucyAtZmRhdGEtc2VjdGlvbnNdKQogIENYWEZMQUdTPSctZyAtV2Vycm9yIC1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zJwogIEFDX1RSWV9DT01QSUxFKFtpbnQgZm9vOyB2b2lkIGJhcigpIHsgfTtdLCwgW2FjX2Zkc2VjdGlvbnM9eWVzXSwgW2FjX2Zkc2VjdGlvbnM9bm9dKQogIGlmIHRlc3QgIiRhY190ZXN0X0NYWEZMQUdTIiA9IHNldDsgdGhlbgogICAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIgogIGVsc2UKICAgICMgdGhpcyBpcyB0aGUgc3VzcGljaW91cyBwYXJ0CiAgICBDWFhGTEFHUz0nJwogIGZpCiAgaWYgdGVzdCB4IiRhY19mZHNlY3Rpb25zIiA9IHgieWVzIjsgdGhlbgogICAgU0VDVElPTl9GTEFHUz0nLWZmdW5jdGlvbi1zZWN0aW9ucyAtZmRhdGEtc2VjdGlvbnMnCiAgZmkKICBBQ19NU0dfUkVTVUxUKCRhY19mZHNlY3Rpb25zKQoKICBBQ19MQU5HX1JFU1RPUkUKICBBQ19TVUJTVChXRVJST1IpCiAgQUNfU1VCU1QoU0VDVElPTl9GTEFHUykKXSkKCgpkbmwKZG5sIElmIEdOVSBsZCBpcyBpbiB1c2UsIGNoZWNrIHRvIHNlZSBpZiB0cmlja3kgbGlua2VyIG9wdHMgY2FuIGJlIHVzZWQuICBJZgpkbmwgdGhlIG5hdGl2ZSBsaW5rZXIgaXMgaW4gdXNlLCBhbGwgdmFyaWFibGVzIHdpbGwgYmUgZGVmaW5lZCB0byBzb21ldGhpbmcKZG5sIHNhZmUgKGxpa2UgYW4gZW1wdHkgc3RyaW5nKS4KZG5sCmRubCBEZWZpbmVzOgpkbmwgIFNFQ1RJT05fTERGTEFHUz0nLVdsLC0tZ2Mtc2VjdGlvbnMnIGlmIHBvc3NpYmxlCmRubCAgT1BUX0xERkxBR1M9Jy1XbCwtTzEnIGFuZCAnLXoscmVscm8nIGlmIHBvc3NpYmxlCmRubCAgTEQgKGFzIGEgc2lkZSBlZmZlY3Qgb2YgdGVzdGluZykKZG5sIFNldHM6CmRubCAgd2l0aF9nbnVfbGQKZG5sICBnbGliY3h4X2dudV9sZF92ZXJzaW9uIChwb3NzaWJseSkKZG5sCmRubCBUaGUgbGFzdCB3aWxsIGJlIGEgc2luZ2xlIGludGVnZXIsIGUuZy4sIHZlcnNpb24gMS4yMy40NS4wLjY3Ljg5IHdpbGwKZG5sIHNldCBnbGliY3h4X2dudV9sZF92ZXJzaW9uIHRvIDEyMzQ1LiAgWmVyb3MgY2F1c2UgcHJvYmxlbXMuCmRubApBQ19ERUZVTihbR0xJQkNYWF9DSEVDS19MSU5LRVJfRkVBVFVSRVNdLCBbCiAgIyBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gZXZlbiB0cnlpbmcgdGhlc2UKICAjIHRlc3RzLiAgQ2hlY2sgZm9yIHRoYXQgZmlyc3QuICBXZSBzaG91bGQgaGF2ZSBhbHJlYWR5IHRlc3RlZCBmb3IgZ2xkCiAgIyBieSBub3cgKGluIGxpYnRvb2wpLCBidXQgcmVxdWlyZSBpdCBub3cganVzdCB0byBiZSBzYWZlLi4uCiAgdGVzdCAteiAiJFNFQ1RJT05fTERGTEFHUyIgJiYgU0VDVElPTl9MREZMQUdTPScnCiAgdGVzdCAteiAiJE9QVF9MREZMQUdTIiAmJiBPUFRfTERGTEFHUz0nJwogIEFDX1JFUVVJUkUoW0FDX1BST0dfTERdKQogIEFDX1JFUVVJUkUoW0FDX1BST0dfQVdLXSkKCiAgIyBUaGUgbmFtZSBzZXQgYnkgbGlidG9vbCBkZXBlbmRzIG9uIHRoZSB2ZXJzaW9uIG9mIGxpYnRvb2wuICBTaGFtZSBvbiB1cwogICMgZm9yIGRlcGVuZGluZyBvbiBhbiBpbXBsIGRldGFpbCwgYnV0IGMnZXN0IGxhIHZpZS4gIE9sZGVyIHZlcnNpb25zIHVzZWQKICAjIGFjX2N2X3Byb2dfZ251X2xkLCBidXQgbm93IGl0J3MgbHRfY3ZfcHJvZ19nbnVfbGQsIGFuZCBpcyBjb3BpZWQgYmFjayBvbgogICMgdG9wIG9mIHdpdGhfZ251X2xkICh3aGljaCBpcyBhbHNvIHNldCBieSAtLXdpdGgtZ251LWxkLCBzbyB0aGF0IGFjdHVhbGx5CiAgIyBtYWtlcyBzZW5zZSkuICBXZSdsbCB0ZXN0IHdpdGhfZ251X2xkIGV2ZXJ5d2hlcmUgZWxzZSwgc28gaWYgdGhhdCBpc24ndAogICMgc2V0IChoZW5jZSB3ZSdyZSB1c2luZyBhbiBvbGRlciBsaWJ0b29sKSwgdGhlbiBzZXQgaXQuCiAgaWYgdGVzdCB4JHt3aXRoX2dudV9sZCtzZXR9ICE9IHhzZXQ7IHRoZW4KICAgIGlmIHRlc3QgeCR7YWNfY3ZfcHJvZ19nbnVfbGQrc2V0fSAhPSB4c2V0OyB0aGVuCiAgICAgICMgV2UgZ290IHRocm91Z2ggImFjX3JlcXVpcmUoYWNfcHJvZ19sZCkiIGFuZCBzdGlsbCBub3Qgc2V0PyAgSHVoPwogICAgICB3aXRoX2dudV9sZD1ubwogICAgZWxzZQogICAgICB3aXRoX2dudV9sZD0kYWNfY3ZfcHJvZ19nbnVfbGQKICAgIGZpCiAgZmkKCiAgIyBTdGFydCBieSBnZXR0aW5nIHRoZSB2ZXJzaW9uIG51bWJlci4gIEkgdGhpbmsgdGhlIGxpYnRvb2wgdGVzdCBhbHJlYWR5CiAgIyBkb2VzIHNvbWUgb2YgdGhpcywgYnV0IHRocm93cyBhd2F5IHRoZSByZXN1bHQuCiAgaWYgdGVzdCB4IiR3aXRoX2dudV9sZCIgPSB4InllcyI7IHRoZW4KICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHZlcnNpb25dKQogICAgY2hhbmdlcXVvdGUoLCkKICAgIGxkdmVyPWAkTEQgLS12ZXJzaW9uIDI+L2Rldi9udWxsIHwgaGVhZCAtMSB8IFwKICAgICAgICAgICBzZWQgLWUgJ3MvR05VIGxkIFwodmVyc2lvbiBcKVx7MCwxXH1cKChbXildKikgXClcezAsMVx9XChbMC05Ll1bMC05Ll0qXCkuKi9cMy8nYAogICAgY2hhbmdlcXVvdGUoWyxdKQogICAgZ2xpYmN4eF9nbnVfbGRfdmVyc2lvbj1gZWNobyAkbGR2ZXIgfCBcCiAgICAgICAgICAgJEFXSyAtRi4gJ3sgaWYgKE5GPDMpIFskXTM9MDsgcHJpbnQgKFskXTEqMTAwK1skXTIpKjEwMCtbJF0zIH0nYAogICAgQUNfTVNHX1JFU1VMVCgkZ2xpYmN4eF9nbnVfbGRfdmVyc2lvbikKICBmaQoKICAjIFNldCAtLWdjLXNlY3Rpb25zLgogIGdsaWJjeHhfZ2NzZWN0aW9uc19taW5fbGQ9MjE2MDIKICBpZiB0ZXN0IHgiJHdpdGhfZ251X2xkIiA9IHgieWVzIiAmJiAKCXRlc3QgJGdsaWJjeHhfZ251X2xkX3ZlcnNpb24gLWd0ICRnbGliY3h4X2djc2VjdGlvbnNfbWluX2xkIDsgdGhlbgoKICAgICMgU3VmZmljaWVudGx5IHlvdW5nIEdOVSBsZCBpdCBpcyEgIEpveSBhbmQgYnVubnkgcmFiYml0cyEKICAgICMgTkI6IFRoaXMgZmxhZyBvbmx5IHdvcmtzIHJlbGlhYmx5IGFmdGVyIDIuMTYuMS4gQ29uZmlndXJlIHRlc3RzCiAgICAjIGZvciB0aGlzIGFyZSBkaWZmaWN1bHQsIHNvIGhhcmQgd2lyZSBhIHZhbHVlIHRoYXQgc2hvdWxkIHdvcmsuCgogICAgYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCiAgICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKICAgIENGTEFHUz0nLVdsLC0tZ2Mtc2VjdGlvbnMnCgogICAgIyBDaGVjayBmb3IgLVdsLC0tZ2Mtc2VjdGlvbnMKICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHRoYXQgc3VwcG9ydHMgLVdsLC0tZ2Mtc2VjdGlvbnNdKQogICAgQUNfVFJZX0xJTksoWyBpbnQgb25lKHZvaWQpIHsgcmV0dXJuIDE7IH0KICAgICBpbnQgdHdvKHZvaWQpIHsgcmV0dXJuIDI7IH0KCV0sIFsgdHdvKCk7IF0gLCBbYWNfZ2NzZWN0aW9ucz15ZXNdLCBbYWNfZ2NzZWN0aW9ucz1ub10pCiAgICBpZiB0ZXN0ICIkYWNfZ2NzZWN0aW9ucyIgPSAieWVzIjsgdGhlbgogICAgICBybSAtZiBjb25mdGVzdC5jCiAgICAgIHRvdWNoIGNvbmZ0ZXN0LmMKICAgICAgaWYgJENDIC1jIGNvbmZ0ZXN0LmM7IHRoZW4KCWlmICRMRCAtLWdjLXNlY3Rpb25zIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lm8gMj4mMSB8IFwKCSAgIGdyZXAgIldhcm5pbmc6IGdjLXNlY3Rpb25zIG9wdGlvbiBpZ25vcmVkIiA+IC9kZXYvbnVsbDsgdGhlbgoJICBhY19nY3NlY3Rpb25zPW5vCglmaQogICAgICBmaQogICAgICBybSAtZiBjb25mdGVzdC5jIGNvbmZ0ZXN0Lm8gY29uZnRlc3QKICAgIGZpCiAgICBpZiB0ZXN0ICIkYWNfZ2NzZWN0aW9ucyIgPSAieWVzIjsgdGhlbgogICAgICBTRUNUSU9OX0xERkxBR1M9Ii1XbCwtLWdjLXNlY3Rpb25zICRTRUNUSU9OX0xERkxBR1MiCiAgICBmaQogICAgQUNfTVNHX1JFU1VMVCgkYWNfZ2NzZWN0aW9ucykKCiAgICBpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCiAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgogICAgZWxzZQogICAgICAjIHRoaXMgaXMgdGhlIHN1c3BpY2lvdXMgcGFydAogICAgICBDRkxBR1M9JycKICAgIGZpCiAgZmkKCiAgIyBTZXQgLXoscmVscm8uCiAgIyBOb3RlIHRoaXMgaXMgb25seSBmb3Igc2hhcmVkIG9iamVjdHMuCiAgYWNfbGRfcmVscm89bm8KICBpZiB0ZXN0IHgiJHdpdGhfZ251X2xkIiA9IHgieWVzIjsgdGhlbgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdGhhdCBzdXBwb3J0cyAtV2wsLXoscmVscm9dKQogICAgY3h4X3pfcmVsbz1gJExEIC12IC0taGVscCAyPi9kZXYvbnVsbCB8IGdyZXAgInogcmVscm8iYAogICAgaWYgdGVzdCAtbiAiJGN4eF96X3JlbG8iOyB0aGVuCiAgICAgIE9QVF9MREZMQUdTPSItV2wsLXoscmVscm8iCiAgICAgIGFjX2xkX3JlbHJvPXllcwogICAgZmkKICAgIEFDX01TR19SRVNVTFQoJGFjX2xkX3JlbHJvKQogIGZpCgogICMgU2V0IGxpbmtlciBvcHRpbWl6YXRpb24gZmxhZ3MuCiAgaWYgdGVzdCB4IiR3aXRoX2dudV9sZCIgPSB4InllcyI7IHRoZW4KICAgIE9QVF9MREZMQUdTPSItV2wsLU8xICRPUFRfTERGTEFHUyIKICBmaQoKICBBQ19TVUJTVChTRUNUSU9OX0xERkxBR1MpCiAgQUNfU1VCU1QoT1BUX0xERkxBR1MpCl0pCgoKZG5sCmRubCBDaGVjayBmb3IgaGVhZGVycyBmb3IsIGFuZCBhcmd1bWVudHMgdG8sIHRoZSBzZXRybGltaXQoKSBmdW5jdGlvbi4KZG5sIFVzZWQgb25seSBpbiB0ZXN0c3VpdGVfaG9va3MuaC4gIENhbGxlZCBmcm9tIEdMSUJDWFhfQ09ORklHVVJFX1RFU1RTVUlURS4KZG5sCmRubCBEZWZpbmVzOgpkbmwgIF9HTElCQ1hYX1JFU19MSU1JVFMgaWYgd2UgY2FuIHNldCBhcnRpZmljaWFsIHJlc291cmNlIGxpbWl0cyAKZG5sICB2YXJpb3VzIEhBVkVfTElNSVRfKiBmb3IgaW5kaXZpZHVhbCBsaW1pdCBuYW1lcwpkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfU0VUUkxJTUlUX2FuY2lsbGlhcnldLCBbCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgUkxJTUlUXyQxXSkKICBBQ19UUllfQ09NUElMRSgKICAgIFsjaW5jbHVkZSA8dW5pc3RkLmg+CiAgICAgI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAgICAgI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogICAgXSwKICAgIFsgaW50IGYgPSBSTElNSVRfJDEgOyBdLAogICAgW2dsaWJjeHhfbXJlc3VsdD0xXSwgW2dsaWJjeHhfbXJlc3VsdD0wXSkKICBBQ19ERUZJTkVfVU5RVU9URUQoSEFWRV9MSU1JVF8kMSwgJGdsaWJjeHhfbXJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgW09ubHkgdXNlZCBpbiBidWlsZCBkaXJlY3RvcnkgdGVzdHN1aXRlX2hvb2tzLmguXSkKICBpZiB0ZXN0ICRnbGliY3h4X21yZXN1bHQgPSAxIDsgdGhlbiByZXM9eWVzIDsgZWxzZSByZXM9bm8gOyBmaQogIEFDX01TR19SRVNVTFQoJHJlcykKXSkKCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX1NFVFJMSU1JVF0sIFsKICBzZXRybGltaXRfaGF2ZV9oZWFkZXJzPXllcwogIEFDX0NIRUNLX0hFQURFUlModW5pc3RkLmggc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaCwKICAgICAgICAgICAgICAgICAgIFtdLAogICAgICAgICAgICAgICAgICAgW3NldHJsaW1pdF9oYXZlX2hlYWRlcnM9bm9dKQogICMgSWYgZG9uJ3QgaGF2ZSB0aGUgaGVhZGVycywgdGhlbiB3ZSBjYW4ndCBydW4gdGhlIHRlc3RzIG5vdywgYW5kIHdlCiAgIyB3b24ndCBiZSBzZWVpbmcgYW55IG9mIHRoZXNlIGR1cmluZyB0ZXN0c3VpdGUgY29tcGlsYXRpb24uCiAgaWYgdGVzdCAkc2V0cmxpbWl0X2hhdmVfaGVhZGVycyA9IHllczsgdGhlbgogICAgIyBDYW4ndCBkbyB0aGVzZSBpbiBhIGxvb3AsIGVsc2UgdGhlIHJlc3VsdGluZyBzeW50YXggaXMgd3JvbmcuCiAgICBHTElCQ1hYX0NIRUNLX1NFVFJMSU1JVF9hbmNpbGxpYXJ5KERBVEEpCiAgICBHTElCQ1hYX0NIRUNLX1NFVFJMSU1JVF9hbmNpbGxpYXJ5KFJTUykKICAgIEdMSUJDWFhfQ0hFQ0tfU0VUUkxJTUlUX2FuY2lsbGlhcnkoVk1FTSkKICAgIEdMSUJDWFhfQ0hFQ0tfU0VUUkxJTUlUX2FuY2lsbGlhcnkoQVMpCiAgICBHTElCQ1hYX0NIRUNLX1NFVFJMSU1JVF9hbmNpbGxpYXJ5KEZTSVpFKQoKICAgICMgQ2hlY2sgZm9yIHJsaW1pdCwgc2V0cmxpbWl0LgogICAgQUNfQ0FDSEVfVkFMKGFjX3NldHJsaW1pdCwgWwogICAgICBBQ19UUllfQ09NUElMRSgKICAgICAgICBbI2luY2x1ZGUgPHVuaXN0ZC5oPgogICAgICAgICAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICAgICAgICAgI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogICAgICAgIF0sCiAgICAgICAgW3N0cnVjdCBybGltaXQgcjsKICAgICAgICAgc2V0cmxpbWl0KDAsICZyKTtdLAogICAgICAgIFthY19zZXRybGltaXQ9eWVzXSwgW2FjX3NldHJsaW1pdD1ub10pCiAgICBdKQogIGZpCgogIEFDX01TR19DSEVDS0lORyhbZm9yIHRlc3RzdWl0ZSByZXNvdXJjZSBsaW1pdHMgc3VwcG9ydF0pCiAgaWYgdGVzdCAkc2V0cmxpbWl0X2hhdmVfaGVhZGVycyA9IHllcyAmJiB0ZXN0ICRhY19zZXRybGltaXQgPSB5ZXM7IHRoZW4KICAgIGFjX3Jlc19saW1pdHM9eWVzCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfUkVTX0xJTUlUUywgMSwKICAgICAgICAgICAgICBbRGVmaW5lIGlmIHVzaW5nIHNldHJsaW1pdCB0byBzZXQgcmVzb3VyY2UgbGltaXRzIGR1cmluZwogICAgICAgICAgICAgICJtYWtlIGNoZWNrIl0pCiAgZWxzZQogICAgYWNfcmVzX2xpbWl0cz1ubwogIGZpCiAgQUNfTVNHX1JFU1VMVCgkYWNfcmVzX2xpbWl0cykKXSkKCgpkbmwKZG5sIENoZWNrIHdoZXRoZXIgU19JU1JFRyAoUG9zaXgpIG9yIFNfSUZSRUcgaXMgYXZhaWxhYmxlIGluIDxzeXMvc3RhdC5oPi4KZG5sIERlZmluZSBIQVZFX1NfSVNSRUcgLyBIQVZFX1NfSUZSRUcgYXBwcm9wcmlhdGVseS4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX1NfSVNSRUdfT1JfU19JRlJFR10sIFsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBTX0lTUkVHIG9yIFNfSUZSRUddKQogIEFDX0NBQ0hFX1ZBTChnbGliY3h4X2N2X1NfSVNSRUcsIFsKICAgIEFDX1RSWV9MSU5LKAogICAgICBbI2luY2x1ZGUgPHN5cy9zdGF0Lmg+XSwKICAgICAgW3N0cnVjdCBzdGF0IGJ1ZmZlcjsKICAgICAgIGZzdGF0KDAsICZidWZmZXIpOwogICAgICAgU19JU1JFRyhidWZmZXIuc3RfbW9kZSk7XSwKICAgICAgW2dsaWJjeHhfY3ZfU19JU1JFRz15ZXNdLAogICAgICBbZ2xpYmN4eF9jdl9TX0lTUkVHPW5vXSkKICBdKQogIEFDX0NBQ0hFX1ZBTChnbGliY3h4X2N2X1NfSUZSRUcsIFsKICAgIEFDX1RSWV9MSU5LKAogICAgICBbI2luY2x1ZGUgPHN5cy9zdGF0Lmg+XSwKICAgICAgW3N0cnVjdCBzdGF0IGJ1ZmZlcjsKICAgICAgIGZzdGF0KDAsICZidWZmZXIpOwogICAgICAgU19JRlJFRyAmIGJ1ZmZlci5zdF9tb2RlO10sCiAgICAgIFtnbGliY3h4X2N2X1NfSUZSRUc9eWVzXSwKICAgICAgW2dsaWJjeHhfY3ZfU19JRlJFRz1ub10pCiAgXSkKICByZXM9bm8KICBpZiB0ZXN0ICRnbGliY3h4X2N2X1NfSVNSRUcgPSB5ZXM7IHRoZW4KICAgIEFDX0RFRklORShIQVZFX1NfSVNSRUcsIDEsIAogICAgICAgICAgICAgIFtEZWZpbmUgaWYgU19JRlJFRyBpcyBhdmFpbGFibGUgaW4gPHN5cy9zdGF0Lmg+Ll0pCiAgICByZXM9U19JU1JFRwogIGVsaWYgdGVzdCAkZ2xpYmN4eF9jdl9TX0lGUkVHID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoSEFWRV9TX0lGUkVHLCAxLAogICAgICAgICAgICAgIFtEZWZpbmUgaWYgU19JRlJFRyBpcyBhdmFpbGFibGUgaW4gPHN5cy9zdGF0Lmg+Ll0pCiAgICByZXM9U19JRlJFRwogIGZpCiAgQUNfTVNHX1JFU1VMVCgkcmVzKQpdKQoKCmRubApkbmwgQ2hlY2sgd2hldGhlciBwb2xsIGlzIGF2YWlsYWJsZSBpbiA8cG9sbC5oPiwgYW5kIGRlZmluZSBIQVZFX1BPTEwuCmRubApBQ19ERUZVTihbR0xJQkNYWF9DSEVDS19QT0xMXSwgWwogIEFDX01TR19DSEVDS0lORyhbZm9yIHBvbGxdKQogIEFDX0NBQ0hFX1ZBTChnbGliY3h4X2N2X1BPTEwsIFsKICAgIEFDX1RSWV9MSU5LKAogICAgICBbI2luY2x1ZGUgPHBvbGwuaD5dLAogICAgICBbc3RydWN0IHBvbGxmZCBwZmRbMV07CiAgICAgICBwZmRbMF0uZXZlbnRzID0gUE9MTElOOwogICAgICAgcG9sbChwZmQsIDEsIDApO10sCiAgICAgIFtnbGliY3h4X2N2X1BPTEw9eWVzXSwKICAgICAgW2dsaWJjeHhfY3ZfUE9MTD1ub10pCiAgXSkKICBpZiB0ZXN0ICRnbGliY3h4X2N2X1BPTEwgPSB5ZXM7IHRoZW4KICAgIEFDX0RFRklORShIQVZFX1BPTEwsIDEsIFtEZWZpbmUgaWYgcG9sbCBpcyBhdmFpbGFibGUgaW4gPHBvbGwuaD4uXSkKICBmaQogIEFDX01TR19SRVNVTFQoJGdsaWJjeHhfY3ZfUE9MTCkKXSkKCgpkbmwKZG5sIENoZWNrIHdoZXRoZXIgd3JpdGV2IGlzIGF2YWlsYWJsZSBpbiA8c3lzL3Vpby5oPiwgYW5kIGRlZmluZSBIQVZFX1dSSVRFVi4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX1dSSVRFVl0sIFsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB3cml0ZXZdKQogIEFDX0NBQ0hFX1ZBTChnbGliY3h4X2N2X1dSSVRFViwgWwogICAgQUNfVFJZX0xJTksoCiAgICAgIFsjaW5jbHVkZSA8c3lzL3Vpby5oPl0sCiAgICAgIFtzdHJ1Y3QgaW92ZWMgaW92WzJdOwogICAgICAgd3JpdGV2KDAsIGlvdiwgMCk7XSwKICAgICAgW2dsaWJjeHhfY3ZfV1JJVEVWPXllc10sCiAgICAgIFtnbGliY3h4X2N2X1dSSVRFVj1ub10pCiAgXSkKICBpZiB0ZXN0ICRnbGliY3h4X2N2X1dSSVRFViA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKEhBVkVfV1JJVEVWLCAxLCBbRGVmaW5lIGlmIHdyaXRldiBpcyBhdmFpbGFibGUgaW4gPHN5cy91aW8uaD4uXSkKICBmaQogIEFDX01TR19SRVNVTFQoJGdsaWJjeHhfY3ZfV1JJVEVWKQpdKQoKCmRubApkbmwgQ2hlY2sgd2hldGhlciBpbnQ2NF90IGlzIGF2YWlsYWJsZSBpbiA8c3RkaW50Lmg+LCBhbmQgZGVmaW5lIEhBVkVfSU5UNjRfVC4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX0lOVDY0X1RdLCBbCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgaW50NjRfdF0pCiAgQUNfQ0FDSEVfVkFMKGdsaWJjeHhfY3ZfSU5UNjRfVCwgWwogICAgQUNfVFJZX0NPTVBJTEUoCiAgICAgIFsjaW5jbHVkZSA8c3RkaW50Lmg+XSwKICAgICAgW2ludDY0X3QgdmFyO10sCiAgICAgIFtnbGliY3h4X2N2X0lOVDY0X1Q9eWVzXSwKICAgICAgW2dsaWJjeHhfY3ZfSU5UNjRfVD1ub10pCiAgXSkKICBpZiB0ZXN0ICRnbGliY3h4X2N2X0lOVDY0X1QgPSB5ZXM7IHRoZW4KICAgIEFDX0RFRklORShIQVZFX0lOVDY0X1QsIDEsIFtEZWZpbmUgaWYgaW50NjRfdCBpcyBhdmFpbGFibGUgaW4gPHN0ZGludC5oPi5dKQogIGZpCiAgQUNfTVNHX1JFU1VMVCgkZ2xpYmN4eF9jdl9JTlQ2NF9UKQpdKQoKCmRubApkbmwgQ2hlY2sgd2hldGhlciBMRlMgc3VwcG9ydCBpcyBhdmFpbGFibGUuCmRubApBQ19ERUZVTihbR0xJQkNYWF9DSEVDS19MRlNdLCBbCiAgQUNfTEFOR19TQVZFCiAgQUNfTEFOR19DUExVU1BMVVMKICBhY19zYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCiAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAtZm5vLWV4Y2VwdGlvbnMiCQogIEFDX01TR19DSEVDS0lORyhbZm9yIExGUyBzdXBwb3J0XSkKICBBQ19DQUNIRV9WQUwoZ2xpYmN4eF9jdl9MRlMsIFsKICAgIEFDX1RSWV9MSU5LKAogICAgICBbI2luY2x1ZGUgPHVuaXN0ZC5oPgogICAgICAgI2luY2x1ZGUgPHN0ZGlvLmg+CiAgICAgICAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICAgICAgXSwKICAgICAgW0ZJTEUqIGZwOwogICAgICAgZm9wZW42NCgidCIsICJ3Iik7CiAgICAgICBmc2Vla282NChmcCwgMCwgU0VFS19DVVIpOwogICAgICAgZnRlbGxvNjQoZnApOwogICAgICAgbHNlZWs2NCgxLCAwLCBTRUVLX0NVUik7CiAgICAgICBzdHJ1Y3Qgc3RhdDY0IGJ1ZjsKICAgICAgIGZzdGF0NjQoMSwgJmJ1Zik7XSwKICAgICAgW2dsaWJjeHhfY3ZfTEZTPXllc10sCiAgICAgIFtnbGliY3h4X2N2X0xGUz1ub10pCiAgXSkKICBpZiB0ZXN0ICRnbGliY3h4X2N2X0xGUyA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9MRlMsIDEsIFtEZWZpbmUgaWYgTEZTIHN1cHBvcnQgaXMgYXZhaWxhYmxlLl0pCiAgZmkKICBBQ19NU0dfUkVTVUxUKCRnbGliY3h4X2N2X0xGUykKICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiCiAgQUNfTEFOR19SRVNUT1JFCl0pCgoKZG5sCmRubCBDaGVjayBmb3Igd2hldGhlciBhIGZ1bGx5IGR5bmFtaWMgYmFzaWNfc3RyaW5nIGltcGxlbWVudGF0aW9uIHNob3VsZApkbmwgYmUgdHVybmVkIG9uLCB0aGF0IGRvZXMgbm90IHB1dCBlbXB0eSBvYmplY3RzIGluIHBlci1wcm9jZXNzIHN0YXRpYwpkbmwgbWVtb3J5IChtb3N0bHkgdXNlZnVsIHRvZ2V0aGVyIHdpdGggc2hhcmVkIG1lbW9yeSBhbGxvY2F0b3JzLCBzZWUgUFIKZG5sIGxpYnN0ZGMrKy8xNjYxMiBmb3IgZGV0YWlscykuCmRubApkbmwgLS1lbmFibGUtZnVsbHktZHluYW1pYy1zdHJpbmcgZGVmaW5lcyBfR0xJQkNYWF9GVUxMWV9EWU5BTUlDX1NUUklORwpkbmwgLS1kaXNhYmxlLWZ1bGx5LWR5bmFtaWMtc3RyaW5nIGxlYXZlcyBfR0xJQkNYWF9GVUxMWV9EWU5BTUlDX1NUUklORyB1bmRlZmluZWQKZG5sICArICBVc2FnZTogIEdMSUJDWFhfRU5BQkxFX0ZVTExZX0RZTkFNSUNfU1RSSU5HWyhERUZBVUxUKV0KZG5sICAgICAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfRlVMTFlfRFlOQU1JQ19TVFJJTkddLCBbCiAgR0xJQkNYWF9FTkFCTEUoZnVsbHktZHluYW1pYy1zdHJpbmcsJDEsLFtkbyBub3QgcHV0IGVtcHR5IHN0cmluZ3MgaW4gcGVyLXByb2Nlc3Mgc3RhdGljIG1lbW9yeV0pCiAgaWYgdGVzdCAkZW5hYmxlX2Z1bGx5X2R5bmFtaWNfc3RyaW5nID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfRlVMTFlfRFlOQU1JQ19TVFJJTkcsIDEsCiAgICAgICAgICAgICAgW0RlZmluZSBpZiBhIGZ1bGx5IGR5bmFtaWMgYmFzaWNfc3RyaW5nIGlzIHdhbnRlZC5dKQogIGZpCl0pCgoKZG5sCmRubCBEb2VzIGFueSBuZWNlc3NhcnkgY29uZmlndXJhdGlvbiBvZiB0aGUgdGVzdHN1aXRlIGRpcmVjdG9yeS4gIEdlbmVyYXRlcwpkbmwgdGhlIHRlc3RzdWl0ZV9ob29rcy5oIGhlYWRlci4KZG5sCmRubCBHTElCQ1hYX0VOQUJMRV9TWU1WRVJTIGFuZCBHTElCQ1hYX0lTX05BVElWRSBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoaXMuCmRubApkbmwgU2V0czoKZG5sICBlbmFibGVfYWJpX2NoZWNrIApkbmwgIEdMSUJDWFhfVEVTVF9XQ0hBUl9UCmRubCAgR0xJQkNYWF9URVNUX1RIUkVBRApkbmwgU3Vic3RzOgpkbmwgIGJhc2VsaW5lX2RpcgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ09ORklHVVJFX1RFU1RTVUlURV0sIFsKICBpZiAkR0xJQkNYWF9JU19OQVRJVkUgOyB0aGVuCiAgICAjIERvIGNoZWNrcyBmb3IgcmVzb3VyY2UgbGltaXQgZnVuY3Rpb25zLgogICAgR0xJQkNYWF9DSEVDS19TRVRSTElNSVQKCiAgICAjIExvb2sgZm9yIHNldGVudiwgc28gdGhhdCBleHRlbmRlZCBsb2NhbGUgdGVzdHMgY2FuIGJlIHBlcmZvcm1lZC4KICAgIEdMSUJDWFhfQ0hFQ0tfU1RETElCX0RFQ0xfQU5EX0xJTktBR0VfMyhzZXRlbnYpCiAgZmkKCiAgaWYgJEdMSUJDWFhfSVNfTkFUSVZFICYmIHRlc3QgJGlzX2hvc3RlZCA9IHllcyAmJgogICAgIHRlc3QgJGVuYWJsZV9zeW12ZXJzICE9IG5vOyB0aGVuCiAgICBjYXNlICIkaG9zdCIgaW4KICAgICAgKi0qLWN5Z3dpbiopCiAgICAgICAgZW5hYmxlX2FiaV9jaGVjaz1ubyA7OwogICAgICAqKQogICAgICAgIGVuYWJsZV9hYmlfY2hlY2s9eWVzIDs7CiAgICBlc2FjCiAgZWxzZQogICAgIyBPbmx5IGJ1aWxkIHRoaXMgYXMgbmF0aXZlLCBzaW5jZSBhdXRvbWFrZSBkb2VzIG5vdCB1bmRlcnN0YW5kCiAgICAjIENYWF9GT1JfQlVJTEQuCiAgICBlbmFibGVfYWJpX2NoZWNrPW5vCiAgZmkKICAKICAjIEV4cG9ydCBmaWxlIG5hbWVzIGZvciBBQkkgY2hlY2tpbmcuCiAgYmFzZWxpbmVfZGlyPSIkZ2xpYmN4eF9zcmNkaXIvY29uZmlnL2FiaS9wb3N0LyR7YWJpX2Jhc2VsaW5lX3BhaXJ9XCQoTVVMVElTVUJESVIpIgogIEFDX1NVQlNUKGJhc2VsaW5lX2RpcikKXSkKCgpkbmwKZG5sIFNldCB1cCAqX0lOQ0xVREVTIHZhcmlhYmxlcyBmb3IgYWxsIHN1bmRyeSBNYWtlZmlsZS5hbSdzLgpkbmwKZG5sIFN1YnN0czoKZG5sICBHTElCQ1hYX0lOQ0xVREVTCmRubCAgVE9QTEVWRUxfSU5DTFVERVMKZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VYUE9SVF9JTkNMVURFU10sIFsKICAjIFVzZWQgZm9yIGV2ZXJ5IEMrKyBjb21waWxlIHdlIHBlcmZvcm0uCiAgR0xJQkNYWF9JTkNMVURFUz0iXAotSSRnbGliY3h4X2J1aWxkZGlyL2luY2x1ZGUvJGhvc3RfYWxpYXMgXAotSSRnbGliY3h4X2J1aWxkZGlyL2luY2x1ZGUgXAotSSRnbGliY3h4X3NyY2Rpci9saWJzdXBjKysiCgogICMgRm9yIENhbmFkaWFuIGNyb3NzZXMsIHBpY2sgdGhpcyB1cCB0b28uCiAgaWYgdGVzdCAkQ0FOQURJQU4gPSB5ZXM7IHRoZW4KICAgIEdMSUJDWFhfSU5DTFVERVM9IiRHTElCQ1hYX0lOQ0xVREVTIC1JXCR7aW5jbHVkZWRpcn0iCiAgZmkKCiAgIyBTdHVmZiBpbiB0aGUgYWN0dWFsIHRvcCBsZXZlbC4gIEN1cnJlbnRseSBvbmx5IHVzZWQgYnkgbGlic3VwYysrIHRvCiAgIyBnZXQgdW53aW5kKiBoZWFkZXJzIGZyb20gdGhlIGdjYyBkaXIuCiAgI1RPUExFVkVMX0lOQ0xVREVTPSctSSQodG9wbGV2ZWxfc3JjZGlyKS9nY2MgLUkkKHRvcGxldmVsX3NyY2RpcikvaW5jbHVkZScKICBUT1BMRVZFTF9JTkNMVURFUz0nLUkkKHRvcGxldmVsX3NyY2RpcikvZ2NjJwoKICAjIE5vdywgZXhwb3J0IHRoaXMgdG8gYWxsIHRoZSBsaXR0bGUgTWFrZWZpbGVzLi4uLgogIEFDX1NVQlNUKEdMSUJDWFhfSU5DTFVERVMpCiAgQUNfU1VCU1QoVE9QTEVWRUxfSU5DTFVERVMpCl0pCgoKZG5sCmRubCBTZXQgdXAgKl9GTEFHUyBhbmQgKkZMQUdTIHZhcmlhYmxlcyBmb3IgYWxsIHN1bmRyeSBNYWtlZmlsZS5hbSdzLgpkbmwgKFNFQ1RJT05fRkxBR1MgaXMgZG9uZSB1bmRlciBDSEVDS19DT01QSUxFUl9GRUFUVVJFUy4pCmRubApkbmwgU3Vic3RzOgpkbmwgIE9QVElNSVpFX0NYWEZMQUdTCmRubCAgV0FSTl9GTEFHUwpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRVhQT1JUX0ZMQUdTXSwgWwogICMgT3B0aW1pemF0aW9uIGZsYWdzIHRoYXQgYXJlIHByb2JhYmx5IGEgZ29vZCBpZGVhIGZvciB0aHJpbGwtc2Vla2Vycy4gSnVzdAogICMgdW5jb21tZW50IHRoZSBsaW5lcyBiZWxvdyBhbmQgbWFrZSwgZXZlcnl0aGluZyBlbHNlIGlzIHJlYWR5IHRvIGdvLi4uCiAgIyBBbHRlcm5hdGl2ZWx5IE9QVElNSVpFX0NYWEZMQUdTIGNhbiBiZSBzZXQgaW4gY29uZmlndXJlLmhvc3QuCiAgIyBPUFRJTUlaRV9DWFhGTEFHUyA9IC1PMyAtZnN0cmljdC1hbGlhc2luZyAtZnZ0YWJsZS1nYwogIEFDX1NVQlNUKE9QVElNSVpFX0NYWEZMQUdTKQoKICBXQVJOX0ZMQUdTPSctV2FsbCAtV2V4dHJhIC1Xd3JpdGUtc3RyaW5ncyAtV2Nhc3QtcXVhbCcKICBBQ19TVUJTVChXQVJOX0ZMQUdTKQpdKQoKCmRubApkbmwgQWxsIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgaW5mb3JtYXRpb24gaXMgZGV0ZXJtaW5lZCBoZXJlLgpkbmwKZG5sIFN1YnN0czoKZG5sICBneHhfaW5zdGFsbF9kaXIKZG5sICBnbGliY3h4X3ByZWZpeGRpcgpkbmwgIGdsaWJjeHhfdG9vbGV4ZWNkaXIKZG5sICBnbGliY3h4X3Rvb2xleGVjbGliZGlyCmRubApkbmwgQXNzdW1lcyBjcm9zc19jb21waWxpbmcgYml0cyBhbHJlYWR5IGRvbmUsIGFuZCB3aXRoX2Nyb3NzX2hvc3QgaW4KZG5sIHBhcnRpY3VsYXIuCmRubApkbmwgVGhpcyBsb2dpYyBtdXN0IG1hdGNoIGdjYy9jb25maWd1cmUuYWMncyBzZXR0aW5nIG9mIGdjY19neHhfaW5jbHVkZV9kaXIuCmRubCBjb25maWcvZ3h4LWluY2x1ZGUtZGlyLm00IG11c3QgYmUga2VwdCBjb25zaXN0YW50IHdpdGggdGhpcyBhcyB3ZWxsLgpBQ19ERUZVTihbR0xJQkNYWF9FWFBPUlRfSU5TVEFMTF9JTkZPXSwgWwogIGdsaWJjeHhfdG9vbGV4ZWNkaXI9bm8KICBnbGliY3h4X3Rvb2xleGVjbGliZGlyPW5vCiAgZ2xpYmN4eF9wcmVmaXhkaXI9JHByZWZpeAoKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBneHgtaW5jbHVkZS1kaXJdKQogIEFDX0FSR19XSVRIKFtneHgtaW5jbHVkZS1kaXJdLAogICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1neHgtaW5jbHVkZS1kaXI9RElSXSwKICAgICAgICAgICAgICAgICAgIFtpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBpbmNsdWRlIGZpbGVzXSksCiAgICBbY2FzZSAiJHdpdGh2YWwiIGluCiAgICAgIHllcykgQUNfTVNHX0VSUk9SKFtNaXNzaW5nIGRpcmVjdG9yeSBmb3IgLS13aXRoLWd4eC1pbmNsdWRlLWRpcl0pIDs7CiAgICAgIG5vKSAgZ3h4X2luY2x1ZGVfZGlyPW5vIDs7CiAgICAgICopICAgZ3h4X2luY2x1ZGVfZGlyPSR3aXRodmFsIDs7CiAgICAgZXNhY10sCiAgICBbZ3h4X2luY2x1ZGVfZGlyPW5vXSkKICBBQ19NU0dfUkVTVUxUKCRneHhfaW5jbHVkZV9kaXIpCgogIEFDX01TR19DSEVDS0lORyhbZm9yIC0tZW5hYmxlLXZlcnNpb24tc3BlY2lmaWMtcnVudGltZS1saWJzXSkKICBBQ19BUkdfRU5BQkxFKFt2ZXJzaW9uLXNwZWNpZmljLXJ1bnRpbWUtbGlic10sCiAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtdmVyc2lvbi1zcGVjaWZpYy1ydW50aW1lLWxpYnNdLAogICAgICAgICAgICAgICAgICAgW1NwZWNpZnkgdGhhdCBydW50aW1lIGxpYnJhcmllcyBzaG91bGQgYmUgaW5zdGFsbGVkIGluIGEgY29tcGlsZXItc3BlY2lmaWMgZGlyZWN0b3J5XSksCiAgICBbY2FzZSAiJGVuYWJsZXZhbCIgaW4KICAgICAgeWVzKSB2ZXJzaW9uX3NwZWNpZmljX2xpYnM9eWVzIDs7CiAgICAgIG5vKSAgdmVyc2lvbl9zcGVjaWZpY19saWJzPW5vIDs7CiAgICAgICopICAgQUNfTVNHX0VSUk9SKFtVbmtub3duIGFyZ3VtZW50IHRvIGVuYWJsZS9kaXNhYmxlIHZlcnNpb24tc3BlY2lmaWMgbGlic10pOzsKICAgICBlc2FjXSwKICAgIFt2ZXJzaW9uX3NwZWNpZmljX2xpYnM9bm9dKQogIEFDX01TR19SRVNVTFQoJHZlcnNpb25fc3BlY2lmaWNfbGlicykKCiAgIyBEZWZhdWx0IGNhc2UgZm9yIGluc3RhbGwgZGlyZWN0b3J5IGZvciBpbmNsdWRlIGZpbGVzLgogIGlmIHRlc3QgJHZlcnNpb25fc3BlY2lmaWNfbGlicyA9IG5vICYmIHRlc3QgJGd4eF9pbmNsdWRlX2RpciA9IG5vOyB0aGVuCiAgICBneHhfaW5jbHVkZV9kaXI9J2luY2x1ZGUvYysrLyR7Z2NjX3ZlcnNpb259JwogICAgaWYgdGVzdCAtbiAiJHdpdGhfY3Jvc3NfaG9zdCIgJiYgCiAgICAgICB0ZXN0IHgiJHdpdGhfY3Jvc3NfaG9zdCIgIT0geCJubyI7IHRoZW4JCiAgICAgIGd4eF9pbmNsdWRlX2Rpcj0nJHtwcmVmaXh9LyR7dGFyZ2V0X2FsaWFzfS8nIiRneHhfaW5jbHVkZV9kaXIiCiAgICBlbHNlCiAgICAgIGd4eF9pbmNsdWRlX2Rpcj0nJHtwcmVmaXh9LyciJGd4eF9pbmNsdWRlX2RpciIKICAgIGZpCiAgZmkKCiAgIyBWZXJzaW9uLXNwZWNpZmljIHJ1bnRpbWUgbGlicyBwcm9jZXNzaW5nLgogIGlmIHRlc3QgJHZlcnNpb25fc3BlY2lmaWNfbGlicyA9IHllczsgdGhlbgogICAgIyBOZWVkIHRoZSBnY2MgY29tcGlsZXIgdmVyc2lvbiB0byBrbm93IHdoZXJlIHRvIGluc3RhbGwgbGlicmFyaWVzCiAgICAjIGFuZCBoZWFkZXIgZmlsZXMgaWYgLS1lbmFibGUtdmVyc2lvbi1zcGVjaWZpYy1ydW50aW1lLWxpYnMgb3B0aW9uCiAgICAjIGlzIHNlbGVjdGVkLiAgRklYTUU6IHRoZXNlIHZhcmlhYmxlcyBhcmUgbWlzbmFtZWQsIHRoZXJlIGFyZQogICAgIyBubyBleGVjdXRhYmxlcyBpbnN0YWxsZWQgaW4gX3Rvb2xleGVjZGlyIG9yIF90b29sZXhlY2xpYmRpci4KICAgIGlmIHRlc3QgeCIkZ3h4X2luY2x1ZGVfZGlyIiA9IHgibm8iOyB0aGVuCiAgICAgIGd4eF9pbmNsdWRlX2Rpcj0nJHtsaWJkaXJ9L2djYy8ke2hvc3RfYWxpYXN9LyR7Z2NjX3ZlcnNpb259L2luY2x1ZGUvYysrJwogICAgZmkKICAgIGdsaWJjeHhfdG9vbGV4ZWNkaXI9JyR7bGliZGlyfS9nY2MvJHtob3N0X2FsaWFzfScKICAgIGdsaWJjeHhfdG9vbGV4ZWNsaWJkaXI9JyR7dG9vbGV4ZWNkaXJ9LyR7Z2NjX3ZlcnNpb259JChNVUxUSVNVQkRJUiknCiAgZmkKCiAgIyBDYWxjdWxhdGUgZ2xpYmN4eF90b29sZXhlY2RpciwgZ2xpYmN4eF90b29sZXhlY2xpYmRpcgogICMgSW5zdGFsbCBhIGxpYnJhcnkgYnVpbHQgd2l0aCBhIGNyb3NzIGNvbXBpbGVyIGluIHRvb2xkaXIsIG5vdCBsaWJkaXIuCiAgaWYgdGVzdCB4IiRnbGliY3h4X3Rvb2xleGVjZGlyIiA9IHgibm8iOyB0aGVuCiAgICBpZiB0ZXN0IC1uICIkd2l0aF9jcm9zc19ob3N0IiAmJgogICAgICAgdGVzdCB4IiR3aXRoX2Nyb3NzX2hvc3QiICE9IHgibm8iOyB0aGVuCiAgICAgIGdsaWJjeHhfdG9vbGV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9LyR7aG9zdF9hbGlhc30nCiAgICAgIGdsaWJjeHhfdG9vbGV4ZWNsaWJkaXI9JyR7dG9vbGV4ZWNkaXJ9L2xpYicKICAgIGVsc2UKICAgICAgZ2xpYmN4eF90b29sZXhlY2Rpcj0nJHtsaWJkaXJ9L2djYy8ke2hvc3RfYWxpYXN9JwogICAgICBnbGliY3h4X3Rvb2xleGVjbGliZGlyPScke2xpYmRpcn0nCiAgICBmaQogICAgbXVsdGlfb3NfZGlyZWN0b3J5PWAkQ1hYIC1wcmludC1tdWx0aS1vcy1kaXJlY3RvcnlgCiAgICBjYXNlICRtdWx0aV9vc19kaXJlY3RvcnkgaW4KICAgICAgLikgOzsgIyBBdm9pZCB0cmFpbGluZyAvLgogICAgICAqKSBnbGliY3h4X3Rvb2xleGVjbGliZGlyPSRnbGliY3h4X3Rvb2xleGVjbGliZGlyLyRtdWx0aV9vc19kaXJlY3RvcnkgOzsKICAgIGVzYWMKICBmaQoKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBpbnN0YWxsIGxvY2F0aW9uXSkKICBBQ19NU0dfUkVTVUxUKCRneHhfaW5jbHVkZV9kaXIpCgogIEFDX1NVQlNUKGdsaWJjeHhfcHJlZml4ZGlyKQogIEFDX1NVQlNUKGd4eF9pbmNsdWRlX2RpcikKICBBQ19TVUJTVChnbGliY3h4X3Rvb2xleGVjZGlyKQogIEFDX1NVQlNUKGdsaWJjeHhfdG9vbGV4ZWNsaWJkaXIpCl0pCgoKZG5sCmRubCBHTElCQ1hYX0VOQUJMRQpkbmwgICAgKEZFQVRVUkUsIERFRkFVTFQsIEhFTFAtQVJHLCBIRUxQLVNUUklORykKZG5sICAgIChGRUFUVVJFLCBERUZBVUxULCBIRUxQLUFSRywgSEVMUC1TVFJJTkcsIHBlcm1pdCBhfGJ8YykKZG5sICAgIChGRUFUVVJFLCBERUZBVUxULCBIRUxQLUFSRywgSEVMUC1TVFJJTkcsIFNIRUxMLUNPREUtSEFORExFUikKZG5sCmRubCBTZWUgZG9jcy9odG1sLzE3X2ludHJvL2NvbmZpZ3VyeS5odG1sI2VuYWJsZSBmb3IgZG9jdW1lbnRhdGlvbi4KZG5sCm00X2RlZmluZShbR0xJQkNYWF9FTkFCTEVdLFtkbmwKbTRfZGVmaW5lKFtfZ19zd2l0Y2hdLFstLWVuYWJsZS0kMV0pZG5sCm00X2RlZmluZShbX2dfaGVscF0sW0FDX0hFTFBfU1RSSU5HKF9nX3N3aXRjaCQzLFskNCBAPDpAZGVmYXVsdD0kMkA6PkBdKV0pZG5sCiBBQ19BUkdfRU5BQkxFKCQxLF9nX2hlbHAsCiAgbTRfYm1hdGNoKFskNV0sCiAgIFtecGVybWl0IF0sCiAgICAgW1sKICAgICAgY2FzZSAiJGVuYWJsZXZhbCIgaW4KICAgICAgIG00X2JwYXRzdWJzdChbJDVdLFtwZXJtaXQgXSkpIDs7CiAgICAgICAqKSBBQ19NU0dfRVJST1IoVW5rbm93biBhcmd1bWVudCB0byBlbmFibGUvZGlzYWJsZSAkMSkgOzsKICAgICAgICAgIGRubCBJZGVhIGZvciBmdXR1cmU6ICBnZW5lcmF0ZSBhIFVSTCBwb2ludGluZyB0bwogICAgICAgICAgZG5sICJvbmxpbmVkb2NzL2NvbmZpZ29wdHMuaHRtbCN3aGF0ZXZlciIKICAgICAgZXNhYwogICAgIF1dLAogICBbXiRdLAogICAgIFtbCiAgICAgIGNhc2UgIiRlbmFibGV2YWwiIGluCiAgICAgICB5ZXN8bm8pIDs7CiAgICAgICAqKSBBQ19NU0dfRVJST1IoQXJndW1lbnQgdG8gZW5hYmxlL2Rpc2FibGUgJDEgbXVzdCBiZSB5ZXMgb3Igbm8pIDs7CiAgICAgIGVzYWMKICAgICBdXSwKICAgW1skNV1dKSwKICBbZW5hYmxlX11tNF9icGF0c3Vic3QoWyQxXSwtLF8pWz1dWyQyXSkKbTRfdW5kZWZpbmUoW19nX3N3aXRjaF0pZG5sCm00X3VuZGVmaW5lKFtfZ19oZWxwXSlkbmwKXSkKCgpkbmwKZG5sIENoZWNrIGZvciBJU08vSUVDIDk4OTk6MTk5OSAiQzk5IiBzdXBwb3J0LgpkbmwKZG5sIC0tZW5hYmxlLWM5OSBkZWZpbmVzIF9HTElCQ1hYX1VTRV9DOTkKZG5sIC0tZGlzYWJsZS1jOTkgbGVhdmVzIF9HTElCQ1hYX1VTRV9DOTkgdW5kZWZpbmVkCmRubCAgKyAgVXNhZ2U6ICBHTElCQ1hYX0VOQUJMRV9DOTlbKERFRkFVTFQpXQpkbmwgICAgICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4KZG5sICArICBJZiAnQzk5JyBzdHVmZiBpcyBub3QgYXZhaWxhYmxlLCBpZ25vcmVzIERFRkFVTFQgYW5kIHNldHMgYG5vJy4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9DOTldLCBbCiAgR0xJQkNYWF9FTkFCTEUoYzk5LCQxLCxbdHVybnMgb24gSVNPL0lFQyA5ODk5OjE5OTkgc3VwcG9ydF0pCgogIGlmIHRlc3QgeCIkZW5hYmxlX2M5OSIgPSB4InllcyI7IHRoZW4KCiAgQUNfTEFOR19TQVZFCiAgQUNfTEFOR19DUExVU1BMVVMKCiAgIyBVc2UgLXN0ZD1jKys5OCBiZWNhdXNlIHRoZSBkZWZhdWx0ICgtc3RkPWdudSsrOTgpIGxlYXZlcyBfX1NUUklDVF9BTlNJX18KICAjIHVuZGVmaW5lZCBhbmQgZmFrZSBDOTkgZmFjaWxpdGllcyAtIGxpa2UgcHJlLXN0YW5kYXJkIHNucHJpbnRmIC0gbWF5IGJlCiAgIyBzcHVyaW91c2x5IGVuYWJsZWQuCiAgIyBMb25nIHRlcm0sIC1zdGQ9YysrMHggY291bGQgYmUgZXZlbiBiZXR0ZXIsIGNvdWxkIG1hbmFnZSB0byBleHBsaWNpdGVseQogICMgcmVxdWVzdCBDOTkgZmFjaWxpdGllcyB0byB0aGUgdW5kZXJseWluZyBDIGhlYWRlcnMuCiAgYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgogIENYWEZMQUdTPSIkQ1hYRkxBR1MgLXN0ZD1jKys5OCIKICBhY19zYXZlX0xJQlM9IiRMSUJTIgogIGFjX3NhdmVfZ2NjX25vX2xpbms9IiRnY2Nfbm9fbGluayIKCiAgaWYgdGVzdCB4JGdjY19ub19saW5rICE9IHh5ZXM7IHRoZW4KICAgICMgVXNlIC1mbm8tZXhjZXB0aW9ucyB0byB0aGF0IHRoZSBDIGRyaXZlciBjYW4gbGluayB0aGVzZSB0ZXN0cyB3aXRob3V0CiAgICAjIGhpdHRpbmcgdW5kZWZpbmVkIHJlZmVyZW5jZXMgdG8gcGVyc29uYWxpdHkgcm91dGluZXMuCiAgICBDWFhGTEFHUz0iJENYWEZMQUdTIC1mbm8tZXhjZXB0aW9ucyIKICAgIEFDX0NIRUNLX0xJQihtLCBzaW4sIFsKICAgICAgTElCUz0iJExJQlMgLWxtIgogICAgXSwgWwogICAgICAjIFVzZSB0aGUgZGVmYXVsdCBjb21waWxlLW9ubHkgdGVzdHMgaW4gR0NDX1RSWV9DT01QSUxFX09SX0xJTksKICAgICAgZ2NjX25vX2xpbms9eWVzCiAgICBdKQogIGZpCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgPG1hdGguaD4gZnVuY3Rpb25zIHVzZWQgaWYgQzk5IGlzIGVuYWJsZWQuCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSVNPIEM5OSBzdXBwb3J0IGluIDxtYXRoLmg+XSkKICBBQ19DQUNIRV9WQUwoYWNfYzk5X21hdGgsIFsKICBHQ0NfVFJZX0NPTVBJTEVfT1JfTElOSygKICAgICBbI2luY2x1ZGUgPG1hdGguaD4KICAgICAgdm9sYXRpbGUgZG91YmxlIGQxLCBkMjsKICAgICAgdm9sYXRpbGUgaW50IGk7XSwKICAgICBbaSA9IGZwY2xhc3NpZnkoZDEpOwogICAgICBpID0gaXNmaW5pdGUoZDEpOwogICAgICBpID0gaXNpbmYoZDEpOwogICAgICBpID0gaXNuYW4oZDEpOwogICAgICBpID0gaXNub3JtYWwoZDEpOwogICAgICBpID0gc2lnbmJpdChkMSk7CiAgICAgIGkgPSBpc2dyZWF0ZXIoZDEsIGQyKTsKICAgICAgaSA9IGlzZ3JlYXRlcmVxdWFsKGQxLCBkMik7CiAgICAgIGkgPSBpc2xlc3MoZDEsIGQyKTsKICAgICAgaSA9IGlzbGVzc2VxdWFsKGQxLCBkMik7CiAgICAgIGkgPSBpc2xlc3NncmVhdGVyKGQxLCBkMik7CiAgICAgIGkgPSBpc2xlc3NncmVhdGVyKGQxLCBkMik7CiAgICAgIGkgPSBpc3Vub3JkZXJlZChkMSwgZDIpOwogICAgIF0sW2FjX2M5OV9tYXRoPXllc10sIFthY19jOTlfbWF0aD1ub10pCiAgXSkKICBBQ19NU0dfUkVTVUxUKCRhY19jOTlfbWF0aCkKICBpZiB0ZXN0IHgiJGFjX2M5OV9tYXRoIiA9IHgieWVzIjsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9DOTlfTUFUSCwgMSwKICAgICAgICAgICAgICBbRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgb3IgbWFjcm9zIGluIDxtYXRoLmg+IHNob3VsZCBiZSBpbXBvcnRlZAogICAgICAgICAgICAgIGluIDxjbWF0aD4gaW4gbmFtZXNwYWNlIHN0ZC5dKQogIGZpCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgPGNvbXBsZXguaD4gY29tcGxleCBtYXRoIGZ1bmN0aW9ucy4KICAjIFRoaXMgaXMgbmVjZXNzYXJ5IGV2ZW4gdGhvdWdoIGxpYnN0ZGMrKyB1c2VzIHRoZSBidWlsdGluIHZlcnNpb25zCiAgIyBvZiB0aGVzZSBmdW5jdGlvbnMsIGJlY2F1c2UgaWYgdGhlIGJ1aWx0aW4gY2Fubm90IGJlIHVzZWQsIGEgcmVmZXJlbmNlCiAgIyB0byB0aGUgbGlicmFyeSBmdW5jdGlvbiBpcyBlbWl0dGVkLgogIEFDX0NIRUNLX0hFQURFUlModGdtYXRoLmgsIGFjX2hhc190Z21hdGhfaD15ZXMsIGFjX2hhc190Z21hdGhfaD1ubykKICBBQ19DSEVDS19IRUFERVJTKGNvbXBsZXguaCwgYWNfaGFzX2NvbXBsZXhfaD15ZXMsIGFjX2hhc19jb21wbGV4X2g9bm8pCiAgYWNfYzk5X2NvbXBsZXg9bm87CiAgaWYgdGVzdCB4IiRhY19oYXNfY29tcGxleF9oIiA9IHgieWVzIjsgdGhlbgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSVNPIEM5OSBzdXBwb3J0IGluIDxjb21wbGV4Lmg+XSkKICAgIEdDQ19UUllfQ09NUElMRV9PUl9MSU5LKAogICAgICAgWyNpbmNsdWRlIDxjb21wbGV4Lmg+Cgl0eXBlZGVmIF9fY29tcGxleF9fIGZsb2F0IGZsb2F0X3R5cGU7Cgl0eXBlZGVmIF9fY29tcGxleF9fIGRvdWJsZSBkb3VibGVfdHlwZTsKCXR5cGVkZWYgX19jb21wbGV4X18gbG9uZyBkb3VibGUgbGRfdHlwZTsKCXZvbGF0aWxlIGZsb2F0X3R5cGUgdG1wZjsKCXZvbGF0aWxlIGRvdWJsZV90eXBlIHRtcGQ7Cgl2b2xhdGlsZSBsZF90eXBlIHRtcGxkOwoJdm9sYXRpbGUgZmxvYXQgZjsKCXZvbGF0aWxlIGRvdWJsZSBkOwoJdm9sYXRpbGUgbG9uZyBkb3VibGUgbGQ7XSwKICAgICAgIFtmID0gY2Fic2YodG1wZik7CglmID0gY2FyZ2YodG1wZik7Cgl0bXBmID0gY2Nvc2YodG1wZik7Cgl0bXBmID0gY2Nvc2hmKHRtcGYpOwoJdG1wZiA9IGNleHBmKHRtcGYpOwoJdG1wZiA9IGNsb2dmKHRtcGYpOwoJdG1wZiA9IGNzaW5mKHRtcGYpOwoJdG1wZiA9IGNzaW5oZih0bXBmKTsKCXRtcGYgPSBjc3FydGYodG1wZik7Cgl0bXBmID0gY3RhbmYodG1wZik7Cgl0bXBmID0gY3RhbmhmKHRtcGYpOwoJdG1wZiA9IGNwb3dmKHRtcGYsIHRtcGYpOwoJZCA9IGNhYnModG1wZCk7CglkID0gY2FyZyh0bXBkKTsKCXRtcGQgPSBjY29zKHRtcGQpOwoJdG1wZCA9IGNjb3NoKHRtcGQpOwoJdG1wZCA9IGNleHAodG1wZCk7Cgl0bXBkID0gY2xvZyh0bXBkKTsKCXRtcGQgPSBjc2luKHRtcGQpOwoJdG1wZCA9IGNzaW5oKHRtcGQpOwoJdG1wZCA9IGNzcXJ0KHRtcGQpOwoJdG1wZCA9IGN0YW4odG1wZCk7Cgl0bXBkID0gY3RhbmgodG1wZCk7Cgl0bXBkID0gY3Bvdyh0bXBkLCB0bXBkKTsKCWxkID0gY2Fic2wodG1wbGQpOwoJbGQgPSBjYXJnbCh0bXBsZCk7Cgl0bXBsZCA9IGNjb3NsKHRtcGxkKTsKCXRtcGxkID0gY2Nvc2hsKHRtcGxkKTsKCXRtcGxkID0gY2V4cGwodG1wbGQpOwoJdG1wbGQgPSBjbG9nbCh0bXBsZCk7Cgl0bXBsZCA9IGNzaW5sKHRtcGxkKTsKCXRtcGxkID0gY3NpbmhsKHRtcGxkKTsKCXRtcGxkID0gY3NxcnRsKHRtcGxkKTsKCXRtcGxkID0gY3RhbmwodG1wbGQpOwoJdG1wbGQgPSBjdGFuaGwodG1wbGQpOwoJdG1wbGQgPSBjcG93bCh0bXBsZCwgdG1wbGQpOwogICAgICAgXSxbYWNfYzk5X2NvbXBsZXg9eWVzXSwgW2FjX2M5OV9jb21wbGV4PW5vXSkKICBmaQogIEFDX01TR19SRVNVTFQoJGFjX2M5OV9jb21wbGV4KQogIGlmIHRlc3QgeCIkYWNfYzk5X2NvbXBsZXgiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYLCAxLAogICAgICAgICAgICAgIFtEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBpbiA8Y29tcGxleC5oPiBzaG91bGQgYmUgdXNlZCBpbgogICAgICAgICAgICAgIDxjb21wbGV4Pi4gVXNpbmcgY29tcGlsZXIgYnVpbHRpbnMgZm9yIHRoZXNlIGZ1bmN0aW9ucyByZXF1aXJlcwogICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgQzk5IGxpYnJhcnkgZnVuY3Rpb25zIHRvIGJlIHByZXNlbnQuXSkKICBmaQoKICAjIENoZWNrIGZvciB0aGUgZXhpc3RlbmNlIGluIDxzdGRpby5oPiBvZiB2c2NhbmYsIGV0LiBhbC4KICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBJU08gQzk5IHN1cHBvcnQgaW4gPHN0ZGlvLmg+XSkKICBBQ19DQUNIRV9WQUwoYWNfYzk5X3N0ZGlvLCBbCiAgR0NDX1RSWV9DT01QSUxFX09SX0xJTksoCiAgICAgWyNpbmNsdWRlIDxzdGRpby5oPgogICAgICAjaW5jbHVkZSA8c3RkYXJnLmg+CiAgICAgIHZvaWQgZm9vKGNoYXIqIGZtdCwgLi4uKQogICAgICB7Cgl2YV9saXN0IGFyZ3M7IHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Cgl2ZnNjYW5mKHN0ZGVyciwgIiVpIiwgYXJncyk7IAoJdnNjYW5mKCIlaSIsIGFyZ3MpOwoJdnNucHJpbnRmKGZtdCwgMCwgIiVpIiwgYXJncyk7Cgl2c3NjYW5mKGZtdCwgIiVpIiwgYXJncyk7CiAgICAgIH1dLAogICAgIFtzbnByaW50ZigiMTIiLCAwLCAiJWkiKTtdLAogICAgIFthY19jOTlfc3RkaW89eWVzXSwgW2FjX2M5OV9zdGRpbz1ub10pCiAgXSkKICBBQ19NU0dfUkVTVUxUKCRhY19jOTlfc3RkaW8pCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2UgaW4gPHN0ZGxpYi5oPiBvZiBsbGRpdl90LCBldC4gYWwuCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSVNPIEM5OSBzdXBwb3J0IGluIDxzdGRsaWIuaD5dKQogIEFDX0NBQ0hFX1ZBTChhY19jOTlfc3RkbGliLCBbCiAgR0NDX1RSWV9DT01QSUxFX09SX0xJTksoCiAgICAgWyNpbmNsdWRlIDxzdGRsaWIuaD4KICAgICAgdm9sYXRpbGUgZmxvYXQgZjsKICAgICAgdm9sYXRpbGUgbG9uZyBkb3VibGUgbGQ7CiAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbG9uZyBsbDsKICAgICAgbGxkaXZfdCBteWRpdnQ7XSwKICAgICBbY2hhciogdG1wOwogICAgICBmID0gc3RydG9mKCJnbnUiLCAmdG1wKTsKICAgICAgbGQgPSBzdHJ0b2xkKCJnbnUiLCAmdG1wKTsKICAgICAgbGwgPSBzdHJ0b2xsKCJnbnUiLCAmdG1wLCAxMCk7CiAgICAgIGxsID0gc3RydG91bGwoImdudSIsICZ0bXAsIDEwKTsKICAgICAgbGwgPSBsbGFicygxMCk7CiAgICAgIG15ZGl2dCA9IGxsZGl2KDEwLDEpOwogICAgICBsbCA9IG15ZGl2dC5xdW90OwogICAgICBsbCA9IG15ZGl2dC5yZW07CiAgICAgIGxsID0gYXRvbGwoIjEwIik7CiAgICAgIF9FeGl0KDApOwogICAgICBdLFthY19jOTlfc3RkbGliPXllc10sIFthY19jOTlfc3RkbGliPW5vXSkKICBdKQogIEFDX01TR19SRVNVTFQoJGFjX2M5OV9zdGRsaWIpCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2UgaW4gPHdjaGFyLmg+IG9mIHdjc3RvbGQsIGV0Yy4KICBhY19jOTlfd2NoYXI9bm87CiAgaWYgdGVzdCB4IiRhY19oYXNfd2NoYXJfaCIgPSB4eWVzICYmCiAgICAgdGVzdCB4IiRhY19oYXNfd2N0eXBlX2giID0geHllczsgdGhlbgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSVNPIEM5OSBzdXBwb3J0IGluIDx3Y2hhci5oPl0pCQogICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx3Y2hhci5oPgogICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSB0ZXN0CiAgICAgICAgICAgICAgICAgICAgewoJCSAgICAgIHVzaW5nIDo6d2NzdG9sZDsKCQkgICAgICB1c2luZyA6Ondjc3RvbGw7CgkJICAgICAgdXNpbmcgOjp3Y3N0b3VsbDsKCQkgICAgfQoJCSAgIF0sW10sW2FjX2M5OV93Y2hhcj15ZXNdLCBbYWNfYzk5X3djaGFyPW5vXSkKCiAgICAjIENoZWNrcyBmb3Igd2lkZSBjaGFyYWN0ZXIgZnVuY3Rpb25zIHRoYXQgbWF5IG5vdCBiZSBwcmVzZW50LgogICAgIyBJbmplY3Rpb24gb2YgdGhlc2UgaXMgd3JhcHBlZCB3aXRoIGd1YXJkIG1hY3Jvcy4KICAgICMgTkI6IG9ubHkgcHV0IGZ1bmN0aW9ucyBoZXJlLCBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5IGFib3ZlLCBpZgogICAgIyBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4KICAgIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8d2NoYXIuaD4KICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgdGVzdCB7IHVzaW5nIDo6dmZ3c2NhbmY7IH0gXSwgW10sCiAJICAgIAkgICBbQUNfREVGSU5FKEhBVkVfVkZXU0NBTkYsMSwKCQkJW0RlZmluZWQgaWYgdmZ3c2NhbmYgZXhpc3RzLl0pXSxbXSkKCiAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHdjaGFyLmg+CiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIHRlc3QgeyB1c2luZyA6OnZzd3NjYW5mOyB9IF0sIFtdLAogCSAgICAJICAgW0FDX0RFRklORShIQVZFX1ZTV1NDQU5GLDEsCgkJCVtEZWZpbmVkIGlmIHZzd3NjYW5mIGV4aXN0cy5dKV0sW10pCgogICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx3Y2hhci5oPgogICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSB0ZXN0IHsgdXNpbmcgOjp2d3NjYW5mOyB9IF0sIFtdLAogCSAgICAJICAgW0FDX0RFRklORShIQVZFX1ZXU0NBTkYsMSxbRGVmaW5lZCBpZiB2d3NjYW5mIGV4aXN0cy5dKV0sW10pCgogICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx3Y2hhci5oPgogICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSB0ZXN0IHsgdXNpbmcgOjp3Y3N0b2Y7IH0gXSwgW10sCiAJICAgIAkgICBbQUNfREVGSU5FKEhBVkVfV0NTVE9GLDEsW0RlZmluZWQgaWYgd2NzdG9mIGV4aXN0cy5dKV0sW10pCgogICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx3Y3R5cGUuaD5dLAogICAgICAgICAgICAgICAgICAgWyB3aW50X3QgdDsgaW50IGkgPSBpc3dibGFuayh0KTtdLCAKIAkgICAgCSAgIFtBQ19ERUZJTkUoSEFWRV9JU1dCTEFOSywxLAoJCQlbRGVmaW5lZCBpZiBpc3dibGFuayBleGlzdHMuXSldLFtdKQoKICAgIEFDX01TR19SRVNVTFQoJGFjX2M5OV93Y2hhcikKICBmaQoKICAjIE9wdGlvbiBwYXJzZWQsIG5vdyBzZXQgdGhpbmdzIGFwcHJvcHJpYXRlbHkuCiAgaWYgdGVzdCB4IiRhY19jOTlfbWF0aCIgPSB4Im5vIiB8fAogICAgIHRlc3QgeCIkYWNfYzk5X2NvbXBsZXgiID0geCJubyIgfHwKICAgICB0ZXN0IHgiJGFjX2M5OV9zdGRpbyIgPSB4Im5vIiB8fAogICAgIHRlc3QgeCIkYWNfYzk5X3N0ZGxpYiIgPSB4Im5vIiB8fAogICAgIHRlc3QgeCIkYWNfYzk5X3djaGFyIiA9IHgibm8iOyB0aGVuCiAgICBlbmFibGVfYzk5PW5vOwogIGVsc2UKICAgIEFDX0RFRklORShfR0xJQkNYWF9VU0VfQzk5LCAxLAogICAgW0RlZmluZSBpZiBDOTkgZnVuY3Rpb25zIG9yIG1hY3JvcyBmcm9tIDx3Y2hhci5oPiwgPG1hdGguaD4sCiAgICA8Y29tcGxleC5oPiwgPHN0ZGlvLmg+LCBhbmQgPHN0ZGxpYi5oPiBjYW4gYmUgdXNlZCBvciBleHBvc2VkLl0pCiAgZmkKCiAgZ2NjX25vX2xpbms9IiRhY19zYXZlX2djY19ub19saW5rIgogIExJQlM9IiRhY19zYXZlX0xJQlMiCiAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIgogIEFDX0xBTkdfUkVTVE9SRQogIGZpCQoKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBmdWxseSBlbmFibGVkIElTTyBDOTkgc3VwcG9ydF0pCiAgQUNfTVNHX1JFU1VMVCgkZW5hYmxlX2M5OSkKXSkKCgpkbmwKZG5sIENoZWNrIGZvciBJU08vSUVDIDk4OTk6MTk5OSAiQzk5IiBzdXBwb3J0IHRvIElTTy9JRUMgRFRSIDE5NzY4ICJUUjEiCmRubCBmYWNpbGl0aWVzIGluIENoYXB0ZXIgOCwgIkMgY29tcGF0aWJpbGl0eSIuCmRubApBQ19ERUZVTihbR0xJQkNYWF9DSEVDS19DOTlfVFIxXSwgWwoKICBBQ19MQU5HX1NBVkUKICBBQ19MQU5HX0NQTFVTUExVUwoKICAjIFVzZSAtc3RkPWMrKzk4IGJlY2F1c2UgdGhlIGRlZmF1bHQgKC1zdGQ9Z251Kys5OCkgbGVhdmVzIF9fU1RSSUNUX0FOU0lfXwogICMgdW5kZWZpbmVkIGFuZCBmYWtlIEM5OSBmYWNpbGl0aWVzIG1heSBiZSBzcHVyaW91c2x5IGVuYWJsZWQuCiAgYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgogIENYWEZMQUdTPSIkQ1hYRkxBR1MgLXN0ZD1jKys5OCIKCiAgIyBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiA8Y29tcGxleC5oPiBjb21wbGV4IG1hdGggZnVuY3Rpb25zIHVzZWQKICAjIGJ5IHRyMS9jb21wbGV4LgogIEFDX0NIRUNLX0hFQURFUlMoY29tcGxleC5oLCBhY19oYXNfY29tcGxleF9oPXllcywgYWNfaGFzX2NvbXBsZXhfaD1ubykKICBhY19jOTlfY29tcGxleF90cjE9bm87CiAgaWYgdGVzdCB4IiRhY19oYXNfY29tcGxleF9oIiA9IHgieWVzIjsgdGhlbgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSVNPIEM5OSBzdXBwb3J0IHRvIFRSMSBpbiA8Y29tcGxleC5oPl0pCiAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPGNvbXBsZXguaD5dLAoJICAgICAgICAgICBbdHlwZWRlZiBfX2NvbXBsZXhfXyBmbG9hdCBmbG9hdF90eXBlOyBmbG9hdF90eXBlIHRtcGY7CgkgICAgICAgICAgICBjYWNvc2YodG1wZik7CgkgICAgICAgICAgICBjYXNpbmYodG1wZik7CgkgICAgICAgICAgICBjYXRhbmYodG1wZik7CgkgICAgICAgICAgICBjYWNvc2hmKHRtcGYpOwoJICAgICAgICAgICAgY2FzaW5oZih0bXBmKTsKCSAgICAgICAgICAgIGNhdGFuaGYodG1wZik7CgkJICAgIHR5cGVkZWYgX19jb21wbGV4X18gZG91YmxlIGRvdWJsZV90eXBlOyBkb3VibGVfdHlwZSB0bXBkOwoJICAgICAgICAgICAgY2Fjb3ModG1wZCk7CgkgICAgICAgICAgICBjYXNpbih0bXBkKTsKCSAgICAgICAgICAgIGNhdGFuKHRtcGQpOwoJICAgICAgICAgICAgY2Fjb3NoKHRtcGQpOwoJICAgICAgICAgICAgY2FzaW5oKHRtcGQpOwoJICAgICAgICAgICAgY2F0YW5oKHRtcGQpOwoJCSAgICB0eXBlZGVmIF9fY29tcGxleF9fIGxvbmcgZG91YmxlIGxkX3R5cGU7IGxkX3R5cGUgdG1wbGQ7CgkgICAgICAgICAgICBjYWNvc2wodG1wbGQpOwoJICAgICAgICAgICAgY2FzaW5sKHRtcGxkKTsKCSAgICAgICAgICAgIGNhdGFubCh0bXBsZCk7CgkgICAgICAgICAgICBjYWNvc2hsKHRtcGxkKTsKCSAgICAgICAgICAgIGNhc2luaGwodG1wbGQpOwoJICAgICAgICAgICAgY2F0YW5obCh0bXBsZCk7CgkJICAgXSxbYWNfYzk5X2NvbXBsZXhfdHIxPXllc10sIFthY19jOTlfY29tcGxleF90cjE9bm9dKQogIGZpCiAgQUNfTVNHX1JFU1VMVCgkYWNfYzk5X2NvbXBsZXhfdHIxKQogIGlmIHRlc3QgeCIkYWNfYzk5X2NvbXBsZXhfdHIxIiA9IHgieWVzIjsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWF9UUjEsIDEsCiAgICAgICAgICAgICAgW0RlZmluZSBpZiBDOTkgZnVuY3Rpb25zIGluIDxjb21wbGV4Lmg+IHNob3VsZCBiZSB1c2VkIGluCiAgICAgICAgICAgICAgPHRyMS9jb21wbGV4Pi4gVXNpbmcgY29tcGlsZXIgYnVpbHRpbnMgZm9yIHRoZXNlIGZ1bmN0aW9ucwoJICAgICAgcmVxdWlyZXMgY29ycmVzcG9uZGluZyBDOTkgbGlicmFyeSBmdW5jdGlvbnMgdG8gYmUgcHJlc2VudC5dKQogIGZpCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgPGN0eXBlLmg+IGZ1bmN0aW9ucy4KICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBJU08gQzk5IHN1cHBvcnQgdG8gVFIxIGluIDxjdHlwZS5oPl0pCiAgQUNfQ0FDSEVfVkFMKGFjX2M5OV9jdHlwZV90cjEsIFsKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPGN0eXBlLmg+XSwKCSAgICAgICAgIFtpbnQgY2g7CgkgICAgICAgICAgaW50IHJldDsKCSAgICAgICAgICByZXQgPSBpc2JsYW5rKGNoKTsKCQkgXSxbYWNfYzk5X2N0eXBlX3RyMT15ZXNdLCBbYWNfYzk5X2N0eXBlX3RyMT1ub10pCiAgXSkKICBBQ19NU0dfUkVTVUxUKCRhY19jOTlfY3R5cGVfdHIxKQogIGlmIHRlc3QgeCIkYWNfYzk5X2N0eXBlX3RyMSIgPSB4InllcyI7IHRoZW4KICAgIEFDX0RFRklORShfR0xJQkNYWF9VU0VfQzk5X0NUWVBFX1RSMSwgMSwKICAgICAgICAgICAgICBbRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgaW4gPGN0eXBlLmg+IHNob3VsZCBiZSBpbXBvcnRlZCBpbgoJICAgICAgPHRyMS9jY3R5cGU+IGluIG5hbWVzcGFjZSBzdGQ6OnRyMS5dKQogIGZpCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgPGZlbnYuaD4gZnVuY3Rpb25zLgogIEFDX0NIRUNLX0hFQURFUlMoZmVudi5oLCBhY19oYXNfZmVudl9oPXllcywgYWNfaGFzX2ZlbnZfaD1ubykKICBhY19jOTlfZmVudl90cjE9bm87CiAgaWYgdGVzdCB4IiRhY19oYXNfZmVudl9oIiA9IHgieWVzIjsgdGhlbgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSVNPIEM5OSBzdXBwb3J0IHRvIFRSMSBpbiA8ZmVudi5oPl0pCiAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPGZlbnYuaD5dLAoJICAgICAgICAgICBbaW50IGV4Y2VwdCwgbW9kZTsKCSAgICAgICAgICAgIGZleGNlcHRfdCogcGZsYWc7CiAgICAgICAgICAgICAgICAgICAgZmVudl90KiBwZW52OwoJICAgICAgICAgICAgaW50IHJldDsKCSAgICAgICAgICAgIHJldCA9IGZlY2xlYXJleGNlcHQoZXhjZXB0KTsKCSAgICAgICAgICAgIHJldCA9IGZlZ2V0ZXhjZXB0ZmxhZyhwZmxhZywgZXhjZXB0KTsKCSAgICAgICAgICAgIHJldCA9IGZlcmFpc2VleGNlcHQoZXhjZXB0KTsKCSAgICAgICAgICAgIHJldCA9IGZlc2V0ZXhjZXB0ZmxhZyhwZmxhZywgZXhjZXB0KTsKCSAgICAgICAgICAgIHJldCA9IGZldGVzdGV4Y2VwdChleGNlcHQpOwoJICAgICAgICAgICAgcmV0ID0gZmVnZXRyb3VuZCgpOwoJICAgICAgICAgICAgcmV0ID0gZmVzZXRyb3VuZChtb2RlKTsKCSAgICAgICAgICAgIHJldCA9IGZlZ2V0ZW52KHBlbnYpOwoJICAgICAgICAgICAgcmV0ID0gZmVob2xkZXhjZXB0KHBlbnYpOwoJICAgICAgICAgICAgcmV0ID0gZmVzZXRlbnYocGVudik7CgkgICAgICAgICAgICByZXQgPSBmZXVwZGF0ZWVudihwZW52KTsKCQkgICBdLFthY19jOTlfZmVudl90cjE9eWVzXSwgW2FjX2M5OV9mZW52X3RyMT1ub10pCiAgZmkKICBBQ19NU0dfUkVTVUxUKCRhY19jOTlfZmVudl90cjEpCiAgaWYgdGVzdCB4IiRhY19jOTlfZmVudl90cjEiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfVVNFX0M5OV9GRU5WX1RSMSwgMSwKICAgICAgICAgICAgICBbRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgaW4gPGZlbnYuaD4gc2hvdWxkIGJlIGltcG9ydGVkIGluCgkgICAgICA8dHIxL2NmZW52PiBpbiBuYW1lc3BhY2Ugc3RkOjp0cjEuXSkKICBmaQoKICAjIENoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIDxzdGRpbnQuaD4gdHlwZXMuCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSVNPIEM5OSBzdXBwb3J0IHRvIFRSMSBpbiA8c3RkaW50Lmg+XSkKICBBQ19DQUNIRV9WQUwoYWNfYzk5X3N0ZGludF90cjEsIFsKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGludC5oPl0sCgkgICAgICAgICBbdHlwZWRlZiBpbnQ4X3QgICAgICAgICAgbXlfaW50OF90OwoJICAgICAgICAgIHR5cGVkZWYgaW50MTZfdCAgICAgICAgIG15X2ludDE2X3Q7CgkgICAgICAgICAgdHlwZWRlZiBpbnQzMl90ICAgICAgICAgbXlfaW50MzJfdDsKCSAgICAgICAgICB0eXBlZGVmIGludDY0X3QgICAgICAgICBteV9pbnQ2NF90OwoJICAgICAgICAgIHR5cGVkZWYgaW50X2Zhc3Q4X3QgICAgIG15X2ludF9mYXN0OF90OwoJICAgICAgICAgIHR5cGVkZWYgaW50X2Zhc3QxNl90ICAgIG15X2ludF9mYXN0MTZfdDsKCSAgICAgICAgICB0eXBlZGVmIGludF9mYXN0MzJfdCAgICBteV9pbnRfZmFzdDMyX3Q7CgkgICAgICAgICAgdHlwZWRlZiBpbnRfZmFzdDY0X3QgICAgbXlfaW50X2Zhc3Q2NF90OwkKCSAgICAgICAgICB0eXBlZGVmIGludF9sZWFzdDhfdCAgICBteV9pbnRfbGVhc3Q4X3Q7CgkgICAgICAgICAgdHlwZWRlZiBpbnRfbGVhc3QxNl90ICAgbXlfaW50X2xlYXN0MTZfdDsKCSAgICAgICAgICB0eXBlZGVmIGludF9sZWFzdDMyX3QgICBteV9pbnRfbGVhc3QzMl90OwoJICAgICAgICAgIHR5cGVkZWYgaW50X2xlYXN0NjRfdCAgIG15X2ludF9sZWFzdDY0X3Q7CgkJICB0eXBlZGVmIGludG1heF90ICAgICAgICBteV9pbnRtYXhfdDsKCQkgIHR5cGVkZWYgaW50cHRyX3QgICAgICAgIG15X2ludHB0cl90OwoJICAgICAgICAgIHR5cGVkZWYgdWludDhfdCAgICAgICAgIG15X3VpbnQ4X3Q7CgkgICAgICAgICAgdHlwZWRlZiB1aW50MTZfdCAgICAgICAgbXlfdWludDE2X3Q7CgkgICAgICAgICAgdHlwZWRlZiB1aW50MzJfdCAgICAgICAgbXlfdWludDMyX3Q7CgkgICAgICAgICAgdHlwZWRlZiB1aW50NjRfdCAgICAgICAgbXlfdWludDY0X3Q7CgkgICAgICAgICAgdHlwZWRlZiB1aW50X2Zhc3Q4X3QgICAgbXlfdWludF9mYXN0OF90OwoJICAgICAgICAgIHR5cGVkZWYgdWludF9mYXN0MTZfdCAgIG15X3VpbnRfZmFzdDE2X3Q7CgkgICAgICAgICAgdHlwZWRlZiB1aW50X2Zhc3QzMl90ICAgbXlfdWludF9mYXN0MzJfdDsKCSAgICAgICAgICB0eXBlZGVmIHVpbnRfZmFzdDY0X3QgICBteV91aW50X2Zhc3Q2NF90OwkKCSAgICAgICAgICB0eXBlZGVmIHVpbnRfbGVhc3Q4X3QgICBteV91aW50X2xlYXN0OF90OwoJICAgICAgICAgIHR5cGVkZWYgdWludF9sZWFzdDE2X3QgIG15X3VpbnRfbGVhc3QxNl90OwoJICAgICAgICAgIHR5cGVkZWYgdWludF9sZWFzdDMyX3QgIG15X3VpbnRfbGVhc3QzMl90OwoJICAgICAgICAgIHR5cGVkZWYgdWludF9sZWFzdDY0X3QgIG15X3VpbnRfbGVhc3Q2NF90OwoJCSAgdHlwZWRlZiB1aW50bWF4X3QgICAgICAgbXlfdWludG1heF90OwoJCSAgdHlwZWRlZiB1aW50cHRyX3QgICAgICAgbXlfdWludHB0cl90OwoJCSBdLFthY19jOTlfc3RkaW50X3RyMT15ZXNdLCBbYWNfYzk5X3N0ZGludF90cjE9bm9dKQogIF0pCiAgQUNfTVNHX1JFU1VMVCgkYWNfYzk5X3N0ZGludF90cjEpCiAgaWYgdGVzdCB4IiRhY19jOTlfc3RkaW50X3RyMSIgPSB4InllcyI7IHRoZW4KICAgIEFDX0RFRklORShfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEsIDEsCiAgICAgICAgICAgICAgW0RlZmluZSBpZiBDOTkgdHlwZXMgaW4gPHN0ZGludC5oPiBzaG91bGQgYmUgaW1wb3J0ZWQgaW4KCSAgICAgIDx0cjEvY3N0ZGludD4gaW4gbmFtZXNwYWNlIHN0ZDo6dHIxLl0pCiAgZmkKCiAgIyBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiA8bWF0aC5oPiBmdW5jdGlvbnMuCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSVNPIEM5OSBzdXBwb3J0IHRvIFRSMSBpbiA8bWF0aC5oPl0pCiAgQUNfQ0FDSEVfVkFMKGFjX2M5OV9tYXRoX3RyMSwgWwogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8bWF0aC5oPl0sCgkgICAgICAgICBbdHlwZWRlZiBkb3VibGVfdCAgbXlfZG91YmxlX3Q7CgkgICAgICAgICAgdHlwZWRlZiBmbG9hdF90ICAgbXlfZmxvYXRfdDsKCSAgICAgICAgICBhY29zaCgwLjApOwoJICAgICAgICAgIGFjb3NoZigwLjBmKTsKCSAgICAgICAgICBhY29zaGwoMC4wbCk7CgkgICAgICAgICAgYXNpbmgoMC4wKTsKCSAgICAgICAgICBhc2luaGYoMC4wZik7CgkgICAgICAgICAgYXNpbmhsKDAuMGwpOwoJICAgICAgICAgIGF0YW5oKDAuMCk7CgkgICAgICAgICAgYXRhbmhmKDAuMGYpOwoJICAgICAgICAgIGF0YW5obCgwLjBsKTsKCSAgICAgICAgICBjYnJ0KDAuMCk7CgkgICAgICAgICAgY2JydGYoMC4wZik7CgkgICAgICAgICAgY2JydGwoMC4wbCk7CgkgICAgICAgICAgY29weXNpZ24oMC4wLCAwLjApOwoJICAgICAgICAgIGNvcHlzaWduZigwLjBmLCAwLjBmKTsKCSAgICAgICAgICBjb3B5c2lnbmwoMC4wbCwgMC4wbCk7CgkgICAgICAgICAgZXJmKDAuMCk7CgkgICAgICAgICAgZXJmZigwLjBmKTsKCSAgICAgICAgICBlcmZsKDAuMGwpOwoJICAgICAgICAgIGVyZmMoMC4wKTsKCSAgICAgICAgICBlcmZjZigwLjBmKTsKCSAgICAgICAgICBlcmZjbCgwLjBsKTsKCSAgICAgICAgICBleHAyKDAuMCk7CgkgICAgICAgICAgZXhwMmYoMC4wZik7CgkgICAgICAgICAgZXhwMmwoMC4wbCk7CgkgICAgICAgICAgZXhwbTEoMC4wKTsKCSAgICAgICAgICBleHBtMWYoMC4wZik7CgkgICAgICAgICAgZXhwbTFsKDAuMGwpOwoJICAgICAgICAgIGZkaW0oMC4wLCAwLjApOwoJICAgICAgICAgIGZkaW1mKDAuMGYsIDAuMGYpOwoJICAgICAgICAgIGZkaW1sKDAuMGwsIDAuMGwpOwoJICAgICAgICAgIGZtYSgwLjAsIDAuMCwgMC4wKTsKCSAgICAgICAgICBmbWFmKDAuMGYsIDAuMGYsIDAuMGYpOwoJICAgICAgICAgIGZtYWwoMC4wbCwgMC4wbCwgMC4wbCk7CgkgICAgICAgICAgZm1heCgwLjAsIDAuMCk7CgkgICAgICAgICAgZm1heGYoMC4wZiwgMC4wZik7CgkgICAgICAgICAgZm1heGwoMC4wbCwgMC4wbCk7CgkgICAgICAgICAgZm1pbigwLjAsIDAuMCk7CgkgICAgICAgICAgZm1pbmYoMC4wZiwgMC4wZik7CgkgICAgICAgICAgZm1pbmwoMC4wbCwgMC4wbCk7CgkgICAgICAgICAgaHlwb3QoMC4wLCAwLjApOwoJICAgICAgICAgIGh5cG90ZigwLjBmLCAwLjBmKTsKCSAgICAgICAgICBoeXBvdGwoMC4wbCwgMC4wbCk7CgkgICAgICAgICAgaWxvZ2IoMC4wKTsKCSAgICAgICAgICBpbG9nYmYoMC4wZik7CgkgICAgICAgICAgaWxvZ2JsKDAuMGwpOwoJICAgICAgICAgIGxnYW1tYSgwLjApOwoJICAgICAgICAgIGxnYW1tYWYoMC4wZik7CgkgICAgICAgICAgbGdhbW1hbCgwLjBsKTsKCSAgICAgICAgICBsbHJpbnQoMC4wKTsKCSAgICAgICAgICBsbHJpbnRmKDAuMGYpOwoJICAgICAgICAgIGxscmludGwoMC4wbCk7CgkgICAgICAgICAgbGxyb3VuZCgwLjApOwoJICAgICAgICAgIGxscm91bmRmKDAuMGYpOwoJICAgICAgICAgIGxscm91bmRsKDAuMGwpOwoJICAgICAgICAgIGxvZzFwKDAuMCk7CgkgICAgICAgICAgbG9nMXBmKDAuMGYpOwoJICAgICAgICAgIGxvZzFwbCgwLjBsKTsKCSAgICAgICAgICBsb2cyKDAuMCk7CgkgICAgICAgICAgbG9nMmYoMC4wZik7CgkgICAgICAgICAgbG9nMmwoMC4wbCk7CgkgICAgICAgICAgbG9nYigwLjApOwoJICAgICAgICAgIGxvZ2JmKDAuMGYpOwoJICAgICAgICAgIGxvZ2JsKDAuMGwpOwoJICAgICAgICAgIGxyaW50KDAuMCk7CgkgICAgICAgICAgbHJpbnRmKDAuMGYpOwoJICAgICAgICAgIGxyaW50bCgwLjBsKTsKCSAgICAgICAgICBscm91bmQoMC4wKTsKCSAgICAgICAgICBscm91bmRmKDAuMGYpOwoJICAgICAgICAgIGxyb3VuZGwoMC4wbCk7CgkgICAgICAgICAgbmFuKDApOwoJICAgICAgICAgIG5hbmYoMCk7CgkgICAgICAgICAgbmFubCgwKTsKCSAgICAgICAgICBuZWFyYnlpbnQoMC4wKTsKCSAgICAgICAgICBuZWFyYnlpbnRmKDAuMGYpOwoJICAgICAgICAgIG5lYXJieWludGwoMC4wbCk7CgkgICAgICAgICAgbmV4dGFmdGVyKDAuMCwgMC4wKTsKCSAgICAgICAgICBuZXh0YWZ0ZXJmKDAuMGYsIDAuMGYpOwoJICAgICAgICAgIG5leHRhZnRlcmwoMC4wbCwgMC4wbCk7CgkgICAgICAgICAgbmV4dHRvd2FyZCgwLjAsIDAuMCk7CgkgICAgICAgICAgbmV4dHRvd2FyZGYoMC4wZiwgMC4wZik7CgkgICAgICAgICAgbmV4dHRvd2FyZGwoMC4wbCwgMC4wbCk7CgkgICAgICAgICAgcmVtYWluZGVyKDAuMCwgMC4wKTsKCSAgICAgICAgICByZW1haW5kZXJmKDAuMGYsIDAuMGYpOwoJICAgICAgICAgIHJlbWFpbmRlcmwoMC4wbCwgMC4wbCk7CgkgICAgICAgICAgcmVtcXVvKDAuMCwgMC4wLCAwKTsKCSAgICAgICAgICByZW1xdW8oMC4wZiwgMC4wZiwgMCk7CgkgICAgICAgICAgcmVtcXVvKDAuMGwsIDAuMGwsIDApOwoJICAgICAgICAgIHJpbnQoMC4wKTsKCSAgICAgICAgICByaW50ZigwLjBmKTsKCSAgICAgICAgICByaW50bCgwLjBsKTsKCSAgICAgICAgICByb3VuZCgwLjApOwoJICAgICAgICAgIHJvdW5kZigwLjBmKTsKCSAgICAgICAgICByb3VuZGwoMC4wbCk7CgkgICAgICAgICAgc2NhbGJsbigwLjAsIDBsKTsKCSAgICAgICAgICBzY2FsYmxuZigwLjBmLCAwbCk7CgkgICAgICAgICAgc2NhbGJsbmwoMC4wbCwgMGwpOwoJICAgICAgICAgIHNjYWxibigwLjAsIDApOwoJICAgICAgICAgIHNjYWxibmYoMC4wZiwgMCk7CgkgICAgICAgICAgc2NhbGJubCgwLjBsLCAwKTsKCSAgICAgICAgICB0Z2FtbWEoMC4wKTsKCSAgICAgICAgICB0Z2FtbWFmKDAuMGYpOwoJICAgICAgICAgIHRnYW1tYWwoMC4wbCk7CgkgICAgICAgICAgdHJ1bmMoMC4wKTsKCSAgICAgICAgICB0cnVuY2YoMC4wZik7CgkgICAgICAgICAgdHJ1bmNsKDAuMGwpOwoJCSBdLFthY19jOTlfbWF0aF90cjE9eWVzXSwgW2FjX2M5OV9tYXRoX3RyMT1ub10pCiAgXSkKICBBQ19NU0dfUkVTVUxUKCRhY19jOTlfbWF0aF90cjEpCiAgaWYgdGVzdCB4IiRhY19jOTlfbWF0aF90cjEiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMSwgMSwKICAgICAgICAgICAgICBbRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgb3IgbWFjcm9zIGluIDxtYXRoLmg+IHNob3VsZCBiZSBpbXBvcnRlZAogICAgICAgICAgICAgIGluIDx0cjEvY21hdGg+IGluIG5hbWVzcGFjZSBzdGQ6OnRyMS5dKQogIGZpCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgPGludHR5cGVzLmg+IGZ1bmN0aW9ucyAoTkI6IGRvZXNuJ3QgbWFrZQogICMgc2Vuc2UgaWYgdGhlIHByZXZpb3VzIGNoZWNrIGZhaWxzLCBwZXIgQzk5LCA3LjgvMSkuCiAgYWNfYzk5X2ludHR5cGVzX3RyMT1ubzsKICBpZiB0ZXN0IHgiJGFjX2M5OV9zdGRpbnRfdHIxIiA9IHgieWVzIjsgdGhlbgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSVNPIEM5OSBzdXBwb3J0IHRvIFRSMSBpbiA8aW50dHlwZXMuaD5dKQogICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxpbnR0eXBlcy5oPl0sCgkgICAgICAgICAgIFtpbnRtYXhfdCBpLCBudW1lciwgZGVub20sIGJhc2U7CgkgICAgICAgICAgICBjb25zdCBjaGFyKiBzOwoJICAgICAgICAgICAgY2hhcioqIGVuZHB0cjsKCSAgICAgICAgICAgIGludG1heF90IHJldCA9IGltYXhhYnMoaSk7CgkgICAgICAgICAgICBpbWF4ZGl2X3QgZHJldCA9IGltYXhkaXYobnVtZXIsIGRlbm9tKTsKCSAgICAgICAgICAgIHJldCA9IHN0cnRvaW1heChzLCBlbmRwdHIsIGJhc2UpOwoJICAgICAgICAgICAgdWludG1heF90IHVyZXQgPSBzdHJ0b3VtYXgocywgZW5kcHRyLCBiYXNlKTsKICAgICAgICAJICAgXSxbYWNfYzk5X2ludHR5cGVzX3RyMT15ZXNdLCBbYWNfYzk5X2ludHR5cGVzX3RyMT1ub10pCiAgZmkKICBBQ19NU0dfUkVTVUxUKCRhY19jOTlfaW50dHlwZXNfdHIxKQogIGlmIHRlc3QgeCIkYWNfYzk5X2ludHR5cGVzX3RyMSIgPSB4InllcyI7IHRoZW4KICAgIEFDX0RFRklORShfR0xJQkNYWF9VU0VfQzk5X0lOVFRZUEVTX1RSMSwgMSwKICAgICAgICAgICAgICBbRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgaW4gPGludHR5cGVzLmg+IHNob3VsZCBiZSBpbXBvcnRlZCBpbgogICAgICAgICAgICAgIDx0cjEvY2ludHR5cGVzPiBpbiBuYW1lc3BhY2Ugc3RkOjp0cjEuXSkKICBmaQoKICAjIENoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZSA8c3RkYm9vbC5oPiBoZWFkZXIuCQogIEFDX0NIRUNLX0hFQURFUlMoc3RkYm9vbC5oKQoKICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiCiAgQUNfTEFOR19SRVNUT1JFCl0pCgpkbmwKZG5sIENoZWNrIHdoZXRoZXIgImRldi9yYW5kb20iIGFuZCAiZGV2L3VyYW5kb20iIGFyZSBhdmFpbGFibGUgZm9yIHRoZQpkbmwgcmFuZG9tX2RldmljZSBvZiAiVFIxIiAoQ2hhcHRlciA1LjEsICJSYW5kb20gbnVtYmVyIGdlbmVyYXRpb24iKS4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX1JBTkRPTV9UUjFdLCBbCgogIEFDX01TR19DSEVDS0lORyhbZm9yICJkZXYvcmFuZG9tIiBhbmQgImRldi91cmFuZG9tIiBmb3IgVFIxIHJhbmRvbV9kZXZpY2VdKQogIEFDX0NBQ0hFX1ZBTChhY19yYW5kb21fdHIxLCBbCiAgQUNfVFJZX1JVTihbI2luY2x1ZGUgPHN0ZGlvLmg+CgkgICAgICBpbnQgbWFpbigpCgkgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gIShmb3BlbigiL2Rldi9yYW5kb20iLCAiciIpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3BlbigiL2Rldi91cmFuZG9tIiwgInIiKSk7CgkgICAgICB9CSAgICAgIAoJICAgICBdLAogICAgICAgICAgICAgW2FjX3JhbmRvbV90cjE9eWVzXSwgW2FjX3JhbmRvbV90cjE9bm9dLAoJICAgICBbYWNfcmFuZG9tX3RyMT1ub10pCiAgXSkKICBBQ19NU0dfUkVTVUxUKCRhY19yYW5kb21fdHIxKQogIGlmIHRlc3QgeCIkYWNfcmFuZG9tX3RyMSIgPSB4InllcyI7IHRoZW4KICAgIEFDX0RFRklORShfR0xJQkNYWF9VU0VfUkFORE9NX1RSMSwgMSwKICAgICAgICAgICAgICBbRGVmaW5lIGlmIGRldi9yYW5kb20gYW5kIGRldi91cmFuZG9tIGFyZSBhdmFpbGFibGUgZm9yCgkgICAgICAgdGhlIHJhbmRvbV9kZXZpY2Ugb2YgVFIxIChDaGFwdGVyIDUuMSkuXSkKICBmaQoKXSkKCgpkbmwKZG5sIENoZWNrIGZvciB3aGF0IHR5cGUgb2YgQyBoZWFkZXJzIHRvIHVzZS4KZG5sCmRubCAtLWVuYWJsZS1jaGVhZGVycz0gW2RvZXMgc3R1ZmZdLgpkbmwgLS1kaXNhYmxlLWNoZWFkZXJzIFtkb2VzIG5vdCBkbyBhbnl0aGluZywgcmVhbGx5XS4KZG5sICArICBVc2FnZTogIEdMSUJDWFhfRU5BQkxFX0NIRUFERVJTWyhERUZBVUxUKV0KZG5sICAgICAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyICdjJyBvciAnY19zdGQnIG9yICdjX2dsb2JhbCcuCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfQ0hFQURFUlNdLCBbCiAgR0xJQkNYWF9FTkFCTEUoY2hlYWRlcnMsJDEsWz1LSU5EXSwKICAgIFtjb25zdHJ1Y3QgIkMiIGhlYWRlcnMgZm9yIGcrK10sIFtwZXJtaXQgY3xjX3N0ZHxjX2dsb2JhbF0pCiAgQUNfTVNHX05PVElDRSgiQyIgaGVhZGVyIHN0cmF0ZWd5IHNldCB0byAkZW5hYmxlX2NoZWFkZXJzKQoKICBDX0lOQ0xVREVfRElSPScke2dsaWJjeHhfc3JjZGlyfS9pbmNsdWRlLyckZW5hYmxlX2NoZWFkZXJzCgogICMgQWxsb3cgb3ZlcnJpZGVzIHRvIGNvbmZpZ3VyZS5ob3N0IGhlcmUuCiAgaWYgdGVzdCAkZW5hYmxlX2NoZWFkZXJzID0gY19nbG9iYWw7IHRoZW4KICAgICBjX2NvbXBhdGliaWxpdHk9eWVzCiAgZmkKCiAgaWYgdGVzdCAkZW5hYmxlX2NoZWFkZXJzID0gY19nbG9iYWwgfHwgdGVzdCAkZW5hYmxlX2NoZWFkZXJzID0gY19zdGQ7IHRoZW4KICAgICBjX2V4dHJhPXllcwogIGZpCgogIEFDX1NVQlNUKENfSU5DTFVERV9ESVIpCiAgR0xJQkNYWF9DT05ESVRJT05BTChHTElCQ1hYX0NfSEVBREVSU19DLCB0ZXN0ICRlbmFibGVfY2hlYWRlcnMgPSBjKQogIEdMSUJDWFhfQ09ORElUSU9OQUwoR0xJQkNYWF9DX0hFQURFUlNfQ19TVEQsIHRlc3QgJGVuYWJsZV9jaGVhZGVycyA9IGNfc3RkKQogIEdMSUJDWFhfQ09ORElUSU9OQUwoR0xJQkNYWF9DX0hFQURFUlNfQ19HTE9CQUwsIHRlc3QgJGVuYWJsZV9jaGVhZGVycyA9IGNfZ2xvYmFsKQogIEdMSUJDWFhfQ09ORElUSU9OQUwoR0xJQkNYWF9DX0hFQURFUlNfQ09NUEFUSUJJTElUWSwgdGVzdCAkY19jb21wYXRpYmlsaXR5ID0geWVzKQogIEdMSUJDWFhfQ09ORElUSU9OQUwoR0xJQkNYWF9DX0hFQURFUlNfRVhUUkEsIHRlc3QgJGNfZXh0cmEgPSB5ZXMpCl0pCgoKZG5sCmRubCBDaGVjayBmb3Igd2hpY2ggbG9jYWxlIGxpYnJhcnkgdG8gdXNlLiAgVGhlIGNob2ljZSBpcyBtYXBwZWQgdG8KZG5sIGEgc3ViZGlyZWN0b3J5IG9mIGNvbmZpZy9sb2NhbGUuCmRubApkbmwgRGVmYXVsdCBpcyBnZW5lcmljLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX0NMT0NBTEVdLCBbCiAgR0xJQkNYWF9FTkFCTEUoY2xvY2FsZSxhdXRvLFtAPDpAPU1PREVMQDo+QF0sCiAgICBbdXNlIE1PREVMIGZvciB0YXJnZXQgbG9jYWxlIHBhY2thZ2VdLAogICAgW3Blcm1pdCBnZW5lcmljfGdudXxpZWVlXzEwMDMuMS0yMDAxfHllc3xub3xhdXRvXSkKCiAgIyBEZWFsIHdpdGggZ2V0dGV4dCBpc3N1ZXMuICBEZWZhdWx0IHRvIG5vdCB1c2luZyBpdCAoPW5vKSB1bnRpbCB3ZSBkZXRlY3QKICAjIHN1cHBvcnQgZm9yIGl0IGxhdGVyLiAgTGV0IHRoZSB1c2VyIHR1cm4gaXQgb2ZmIHZpYSAtLWUvZCwgYnV0IGxldCB0aGF0CiAgIyBkZWZhdWx0IHRvIG9uIGZvciBlYXNpZXIgaGFuZGxpbmcuCiAgVVNFX05MUz1ubwogIEFDX0FSR19FTkFCTEUobmxzLAogICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLW5sc10sW3VzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCAoZGVmYXVsdCldKSwKICAgIFtdLAogICAgW2VuYWJsZV9ubHM9eWVzXSkKICAKICAjIEVpdGhlciBhIGtub3duIHBhY2thYWdlLCBvciAiYXV0byIKICBpZiB0ZXN0ICRlbmFibGVfY2xvY2FsZSA9IG5vIHx8IHRlc3QgJGVuYWJsZV9jbG9jYWxlID0geWVzOyB0aGVuCiAgICAgZW5hYmxlX2Nsb2NhbGU9YXV0bwogIGZpCiAgZW5hYmxlX2Nsb2NhbGVfZmxhZz0kZW5hYmxlX2Nsb2NhbGUKCiAgIyBQcm9iZSBmb3IgbG9jYWxlIG1vZGVsIHRvIHVzZSBpZiBub25lIHNwZWNpZmllZC4KICAjIERlZmF1bHQgdG8gImdlbmVyaWMiLgogIGlmIHRlc3QgJGVuYWJsZV9jbG9jYWxlX2ZsYWcgPSBhdXRvOyB0aGVuCiAgICBjYXNlICR7dGFyZ2V0X29zfSBpbgogICAgICBsaW51eCogfCBnbnUqIHwga2ZyZWVic2QqLWdudSB8IGtuZXRic2QqLWdudSkKICAgICAgICBlbmFibGVfY2xvY2FsZV9mbGFnPWdudQkKICAgICAgICA7OwogICAgICBkYXJ3aW4qIHwgZnJlZWJzZCopCiAgICAgICAgZW5hYmxlX2Nsb2NhbGVfZmxhZz1kYXJ3aW4KCTs7CiAgICAgICopCiAgICAgICAgZW5hYmxlX2Nsb2NhbGVfZmxhZz1nZW5lcmljCiAgICAgICAgOzsKICAgIGVzYWMKICBmaQoKICAjIFNhbml0eSBjaGVjayBtb2RlbCwgYW5kIHRlc3QgZm9yIHNwZWNpYWwgZnVuY3Rpb25hbGl0eS4KICBpZiB0ZXN0ICRlbmFibGVfY2xvY2FsZV9mbGFnID0gZ251OyB0aGVuCiAgICBBQ19FR1JFUF9DUFAoW19HTElCQ1hYX29rXSwgWwogICAgI2luY2x1ZGUgPGZlYXR1cmVzLmg+CiAgICAjaWYgX19HTElCQ19fID4gMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDIpCiAgICAgIF9HTElCQ1hYX29rCiAgICAjZW5kaWYKICAgIF0sIGVuYWJsZV9jbG9jYWxlX2ZsYWc9Z251LCBlbmFibGVfY2xvY2FsZV9mbGFnPWdlbmVyaWMpCgogICAgaWYgdGVzdCAkZW5hYmxlX2Nsb2NhbGUgPSBhdXRvOyB0aGVuCiAgICAgICMgVGVzdCBmb3IgYnVncyBlYXJseSBpbiBnbGliYy0yLjIueCBzZXJpZXMKICAgICAgQUNfVFJZX1JVTihbCiAgICAgICNkZWZpbmUgX0dOVV9TT1VSQ0UgMQogICAgICAjaW5jbHVkZSA8bG9jYWxlLmg+CiAgICAgICNpbmNsdWRlIDxzdHJpbmcuaD4KICAgICAgI2lmIF9fR0xJQkNfXyA+IDIgfHwgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+IDIpCiAgICAgIGV4dGVybiBfX3R5cGVvZihuZXdsb2NhbGUpIF9fbmV3bG9jYWxlOwogICAgICBleHRlcm4gX190eXBlb2YoZHVwbG9jYWxlKSBfX2R1cGxvY2FsZTsKICAgICAgZXh0ZXJuIF9fdHlwZW9mKHN0cmNvbGxfbCkgX19zdHJjb2xsX2w7CiAgICAgICNlbmRpZgogICAgICBpbnQgbWFpbigpCiAgICAgIHsKCWNvbnN0IGNoYXIgX19vbmVbXSA9ICLEdWdsZWluIEF1Z21lbiI7CiAgICAgICAgY29uc3QgY2hhciBfX3R3b1tdID0gIsR1Z2xlaW4iOwogICAgICAgCWludCBpOwogICAgICAgIGludCBqOwogICAgICAgIF9fbG9jYWxlX3QgICAgICAgIGxvYzsKICAgICAgICBfX2xvY2FsZV90ICAgICAgICBsb2NfZHVwOwogICAgICAgIGxvYyA9IF9fbmV3bG9jYWxlKDEgPDwgTENfQUxMLCAiZGVfREUiLCAwKTsKICAgICAgICBsb2NfZHVwID0gX19kdXBsb2NhbGUobG9jKTsKICAgICAgICBpID0gX19zdHJjb2xsX2woX19vbmUsIF9fdHdvLCBsb2MpOwogICAgICAgIGogPSBfX3N0cmNvbGxfbChfX29uZSwgX190d28sIGxvY19kdXApOwogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIF0sCiAgICAgIFtlbmFibGVfY2xvY2FsZV9mbGFnPWdudV0sW2VuYWJsZV9jbG9jYWxlX2ZsYWc9Z2VuZXJpY10sCiAgICAgIFtlbmFibGVfY2xvY2FsZV9mbGFnPWdlbmVyaWNdKQogICAgZmkKCiAgICAjIFNldCBpdCB0byBzY3JlYW0gd2hlbiBpdCBodXJ0cy4KICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgkKICAgIENGTEFHUz0iLVdpbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvbiAtV2Vycm9yIgoKICAgICMgVXNlIHN0cnhmcm1fbCBpZiBhdmFpbGFibGUuCiAgICBBQ19UUllfQ09NUElMRShbI2RlZmluZSBfR05VX1NPVVJDRSAxCiAgICAgCQkgICAgI2luY2x1ZGUgPHN0cmluZy5oPgoJCSAgICAjaW5jbHVkZSA8bG9jYWxlLmg+XSwKCSAgICAgICAgICAgIFtjaGFyIHNbMTI4XTsgX19sb2NhbGVfdCBsb2M7IHN0cnhmcm1fbChzLCAiQyIsIDUsIGxvYyk7XSwgCiAgICAgICAgICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfU1RSWEZSTV9MLCAxLCAKICAgICAgICAgICAgICAgICAgICBbRGVmaW5lIGlmIHN0cnhmcm1fbCBpcyBhdmFpbGFibGUgaW4gPHN0cmluZy5oPi5dKSwpCiAgICAKICAgICMgVXNlIHN0cmVycm9yX2wgaWYgYXZhaWxhYmxlLgogICAgQUNfVFJZX0NPTVBJTEUoWyNkZWZpbmUgX0dOVV9TT1VSQ0UgMQoJCSAgICAjaW5jbHVkZSA8c3RyaW5nLmg+CgkJICAgICNpbmNsdWRlIDxsb2NhbGUuaD5dLAoJICAgICAgICAgICAgW19fbG9jYWxlX3QgbG9jOyBzdHJlcnJvcl9sKDUsIGxvYyk7XSwgCiAgICAgICAgICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfU1RSRVJST1JfTCwgMSwgCiAgICAgICAgICAgICAgICAgICAgW0RlZmluZSBpZiBzdHJlcnJvcl9sIGlzIGF2YWlsYWJsZSBpbiA8c3RyaW5nLmg+Ll0pLCkKCiAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKICBmaQoKICAjIFBlcmhhcHMgdXNlIHN0cmVycm9yX3IgaWYgYXZhaWxhYmxlLCBhbmQgc3RyZXJyb3JfbCBpc24ndC4KICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIJCiAgQ0ZMQUdTPSItV2ltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uIC1XZXJyb3IiCiAgQUNfVFJZX0NPTVBJTEUoWyNkZWZpbmUgX0dOVV9TT1VSQ0UgMQoJICAgICAJICAjaW5jbHVkZSA8c3RyaW5nLmg+CgkJICAjaW5jbHVkZSA8bG9jYWxlLmg+XSwKCSAgICAgICAgICBbY2hhciBzWzEyOF07IHN0cmVycm9yX3IoNSwgcywgMTI4KTtdLCAKICAgICAgICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfU1RSRVJST1JfUiwgMSwgCiAgICAgICAgICAgICAgICAgIFtEZWZpbmUgaWYgc3RyZXJyb3JfciBpcyBhdmFpbGFibGUgaW4gPHN0cmluZy5oPi5dKSwpCiAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCgogICMgU2V0IGNvbmZpZ3VyZSBiaXRzIGZvciBzcGVjaWZpZWQgbG9jYWxlIHBhY2thZ2UKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBDIGxvY2FsZSB0byB1c2VdKQogIGNhc2UgJHtlbmFibGVfY2xvY2FsZV9mbGFnfSBpbgogICAgZ2VuZXJpYykKICAgICAgQUNfTVNHX1JFU1VMVChnZW5lcmljKQoKICAgICAgQ0xPQ0FMRV9IPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jX2xvY2FsZS5oCiAgICAgIENMT0NBTEVfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2NfbG9jYWxlLmNjCiAgICAgIENDT0RFQ1ZUX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jb2RlY3Z0X21lbWJlcnMuY2MKICAgICAgQ0NPTExBVEVfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2NvbGxhdGVfbWVtYmVycy5jYwogICAgICBDQ1RZUEVfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2N0eXBlX21lbWJlcnMuY2MKICAgICAgQ01FU1NBR0VTX0g9Y29uZmlnL2xvY2FsZS9nZW5lcmljL21lc3NhZ2VzX21lbWJlcnMuaAogICAgICBDTUVTU0FHRVNfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL21lc3NhZ2VzX21lbWJlcnMuY2MKICAgICAgQ01PTkVZX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9tb25ldGFyeV9tZW1iZXJzLmNjCiAgICAgIENOVU1FUklDX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9udW1lcmljX21lbWJlcnMuY2MKICAgICAgQ1RJTUVfSD1jb25maWcvbG9jYWxlL2dlbmVyaWMvdGltZV9tZW1iZXJzLmgKICAgICAgQ1RJTUVfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL3RpbWVfbWVtYmVycy5jYwogICAgICBDTE9DQUxFX0lOVEVSTkFMX0g9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2MrK2xvY2FsZV9pbnRlcm5hbC5oCiAgICAgIDs7CiAgICBkYXJ3aW4pCiAgICAgIEFDX01TR19SRVNVTFQoZGFyd2luIG9yIGZyZWVic2QpCgogICAgICBDTE9DQUxFX0g9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2NfbG9jYWxlLmgKICAgICAgQ0xPQ0FMRV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvY19sb2NhbGUuY2MKICAgICAgQ0NPREVDVlRfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2NvZGVjdnRfbWVtYmVycy5jYwogICAgICBDQ09MTEFURV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvY29sbGF0ZV9tZW1iZXJzLmNjCiAgICAgIENDVFlQRV9DQz1jb25maWcvbG9jYWxlL2Rhcndpbi9jdHlwZV9tZW1iZXJzLmNjCiAgICAgIENNRVNTQUdFU19IPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9tZXNzYWdlc19tZW1iZXJzLmgKICAgICAgQ01FU1NBR0VTX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9tZXNzYWdlc19tZW1iZXJzLmNjCiAgICAgIENNT05FWV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvbW9uZXRhcnlfbWVtYmVycy5jYwogICAgICBDTlVNRVJJQ19DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvbnVtZXJpY19tZW1iZXJzLmNjCiAgICAgIENUSU1FX0g9Y29uZmlnL2xvY2FsZS9nZW5lcmljL3RpbWVfbWVtYmVycy5oCiAgICAgIENUSU1FX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy90aW1lX21lbWJlcnMuY2MKICAgICAgQ0xPQ0FMRV9JTlRFUk5BTF9IPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jKytsb2NhbGVfaW50ZXJuYWwuaAogICAgICA7OwoJCiAgICBnbnUpCiAgICAgIEFDX01TR19SRVNVTFQoZ251KQoKICAgICAgIyBEZWNsYXJlIGludGVudGlvbiB0byB1c2UgZ2V0dGV4dCwgYW5kIGFkZCBzdXBwb3J0IGZvciBzcGVjaWZpYwogICAgICAjIGxhbmd1YWdlcy4KICAgICAgIyBGb3Igc29tZSByZWFzb24sIEFMTF9MSU5HVUFTIGhhcyB0byBiZSBiZWZvcmUgQU0tR05VLUdFVFRFWFQKICAgICAgQUxMX0xJTkdVQVM9ImRlIGZyIgoKICAgICAgIyBEb24ndCBjYWxsIEFNLUdOVS1HRVRURVhUIGhlcmUuIEluc3RlYWQsIGFzc3VtZSBnbGliYy4KICAgICAgQUNfQ0hFQ0tfUFJPRyhjaGVja19tc2dmbXQsIG1zZ2ZtdCwgeWVzLCBubykKICAgICAgaWYgdGVzdCB4IiRjaGVja19tc2dmbXQiID0geCJ5ZXMiICYmIHRlc3QgeCIkZW5hYmxlX25scyIgPSB4InllcyI7IHRoZW4KICAgICAgICBVU0VfTkxTPXllcwogICAgICBmaQogICAgICAjIEV4cG9ydCB0aGUgYnVpbGQgb2JqZWN0cy4KICAgICAgZm9yIGxpbmcgaW4gJEFMTF9MSU5HVUFTOyBkbyBcCiAgICAgICAgZ2xpYmN4eF9NT0ZJTEVTPSIkZ2xpYmN4eF9NT0ZJTEVTICRsaW5nLm1vIjsgXAogICAgICAgIGdsaWJjeHhfUE9GSUxFUz0iJGdsaWJjeHhfUE9GSUxFUyAkbGluZy5wbyI7IFwKICAgICAgZG9uZQogICAgICBBQ19TVUJTVChnbGliY3h4X01PRklMRVMpCiAgICAgIEFDX1NVQlNUKGdsaWJjeHhfUE9GSUxFUykKCiAgICAgIENMT0NBTEVfSD1jb25maWcvbG9jYWxlL2dudS9jX2xvY2FsZS5oCiAgICAgIENMT0NBTEVfQ0M9Y29uZmlnL2xvY2FsZS9nbnUvY19sb2NhbGUuY2MKICAgICAgQ0NPREVDVlRfQ0M9Y29uZmlnL2xvY2FsZS9nbnUvY29kZWN2dF9tZW1iZXJzLmNjCiAgICAgIENDT0xMQVRFX0NDPWNvbmZpZy9sb2NhbGUvZ251L2NvbGxhdGVfbWVtYmVycy5jYwogICAgICBDQ1RZUEVfQ0M9Y29uZmlnL2xvY2FsZS9nbnUvY3R5cGVfbWVtYmVycy5jYwogICAgICBDTUVTU0FHRVNfSD1jb25maWcvbG9jYWxlL2dudS9tZXNzYWdlc19tZW1iZXJzLmgKICAgICAgQ01FU1NBR0VTX0NDPWNvbmZpZy9sb2NhbGUvZ251L21lc3NhZ2VzX21lbWJlcnMuY2MKICAgICAgQ01PTkVZX0NDPWNvbmZpZy9sb2NhbGUvZ251L21vbmV0YXJ5X21lbWJlcnMuY2MKICAgICAgQ05VTUVSSUNfQ0M9Y29uZmlnL2xvY2FsZS9nbnUvbnVtZXJpY19tZW1iZXJzLmNjCiAgICAgIENUSU1FX0g9Y29uZmlnL2xvY2FsZS9nbnUvdGltZV9tZW1iZXJzLmgKICAgICAgQ1RJTUVfQ0M9Y29uZmlnL2xvY2FsZS9nbnUvdGltZV9tZW1iZXJzLmNjCiAgICAgIENMT0NBTEVfSU5URVJOQUxfSD1jb25maWcvbG9jYWxlL2dudS9jKytsb2NhbGVfaW50ZXJuYWwuaAogICAgICA7OwogICAgaWVlZV8xMDAzLjEtMjAwMSkKICAgICAgQUNfTVNHX1JFU1VMVChJRUVFIDEwMDMuMSkKCiAgICAgIENMT0NBTEVfSD1jb25maWcvbG9jYWxlL2llZWVfMTAwMy4xLTIwMDEvY19sb2NhbGUuaAogICAgICBDTE9DQUxFX0NDPWNvbmZpZy9sb2NhbGUvaWVlZV8xMDAzLjEtMjAwMS9jX2xvY2FsZS5jYwogICAgICBDQ09ERUNWVF9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvY29kZWN2dF9tZW1iZXJzLmNjCiAgICAgIENDT0xMQVRFX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jb2xsYXRlX21lbWJlcnMuY2MKICAgICAgQ0NUWVBFX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jdHlwZV9tZW1iZXJzLmNjCiAgICAgIENNRVNTQUdFU19IPWNvbmZpZy9sb2NhbGUvaWVlZV8xMDAzLjEtMjAwMS9tZXNzYWdlc19tZW1iZXJzLmgKICAgICAgQ01FU1NBR0VTX0NDPWNvbmZpZy9sb2NhbGUvaWVlZV8xMDAzLjEtMjAwMS9tZXNzYWdlc19tZW1iZXJzLmNjCiAgICAgIENNT05FWV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvbW9uZXRhcnlfbWVtYmVycy5jYwogICAgICBDTlVNRVJJQ19DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvbnVtZXJpY19tZW1iZXJzLmNjCiAgICAgIENUSU1FX0g9Y29uZmlnL2xvY2FsZS9nZW5lcmljL3RpbWVfbWVtYmVycy5oCiAgICAgIENUSU1FX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy90aW1lX21lbWJlcnMuY2MKICAgICAgQ0xPQ0FMRV9JTlRFUk5BTF9IPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jKytsb2NhbGVfaW50ZXJuYWwuaAogICAgICA7OwogIGVzYWMKCiAgIyBUaGlzIGlzIHdoZXJlIHRoZSB0ZXN0c3VpdGUgbG9va3MgZm9yIGxvY2FsZSBjYXRhbG9ncywgdXNpbmcgdGhlCiAgIyAtRExPQ0FMRURJUiBkZWZpbmUgZHVyaW5nIHRlc3RzdWl0ZSBjb21waWxhdGlvbi4KICBnbGliY3h4X2xvY2FsZWRpcj0ke2dsaWJjeHhfYnVpbGRkaXJ9L3BvL3NoYXJlL2xvY2FsZQogIEFDX1NVQlNUKGdsaWJjeHhfbG9jYWxlZGlyKQoKICAjIEEgc3RhbmRhbG9uZSBsaWJpbnRsIChlLmcuLCBHTlUgbGliaW50bCkgbWF5IGJlIGluIHVzZS4KICBpZiB0ZXN0ICRVU0VfTkxTID0geWVzOyB0aGVuCiAgICBBQ19DSEVDS19IRUFERVJTKFtsaWJpbnRsLmhdLCBbXSwgVVNFX05MUz1ubykKICAgIEFDX1NFQVJDSF9MSUJTKGdldHRleHQsIGludGwsIFtdLCBVU0VfTkxTPW5vKQogIGZpCiAgaWYgdGVzdCAkVVNFX05MUyA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9OTFMsIDEsIAogICAgICAgICAgICAgIFtEZWZpbmUgaWYgTkxTIHRyYW5zbGF0aW9ucyBhcmUgdG8gYmUgdXNlZC5dKQogIGZpCgogIEFDX1NVQlNUKFVTRV9OTFMpCiAgQUNfU1VCU1QoQ0xPQ0FMRV9IKQogIEFDX1NVQlNUKENNRVNTQUdFU19IKQogIEFDX1NVQlNUKENDT0RFQ1ZUX0NDKQogIEFDX1NVQlNUKENDT0xMQVRFX0NDKQogIEFDX1NVQlNUKENDVFlQRV9DQykKICBBQ19TVUJTVChDTUVTU0FHRVNfQ0MpCiAgQUNfU1VCU1QoQ01PTkVZX0NDKQogIEFDX1NVQlNUKENOVU1FUklDX0NDKQogIEFDX1NVQlNUKENUSU1FX0gpCiAgQUNfU1VCU1QoQ1RJTUVfQ0MpCiAgQUNfU1VCU1QoQ0xPQ0FMRV9DQykKICBBQ19TVUJTVChDTE9DQUxFX0lOVEVSTkFMX0gpCl0pCgoKZG5sCmRubCBDaGVjayBmb3Igd2hpY2ggc3RkOjphbGxvY2F0b3IgYmFzZSBjbGFzcyB0byB1c2UuICBUaGUgY2hvaWNlIGlzCmRubCBtYXBwZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSBvZiBpbmNsdWRlL2V4dC4KZG5sCmRubCBEZWZhdWx0IGlzIG5ldy4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9BTExPQ0FUT1JdLCBbCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3RkOjphbGxvY2F0b3IgYmFzZSBjbGFzc10pCiAgR0xJQkNYWF9FTkFCTEUobGlic3RkY3h4LWFsbG9jYXRvcixhdXRvLFs9S0lORF0sCiAgICBbdXNlIEtJTkQgZm9yIHRhcmdldCBzdGQ6OmFsbG9jYXRvciBiYXNlXSwKICAgIFtwZXJtaXQgbmV3fG1hbGxvY3xtdHxiaXRtYXB8cG9vbHx5ZXN8bm98YXV0b10pCgogICMgSWYgdGhleSBkaWRuJ3QgdXNlIHRoaXMgb3B0aW9uIHN3aXRjaCwgb3IgaWYgdGhleSBzcGVjaWZpZWQgLS1lbmFibGUKICAjIHdpdGggbm8gc3BlY2lmaWMgbW9kZWwsIHdlJ2xsIGhhdmUgdG8gbG9vayBmb3Igb25lLiAgSWYgdGhleQogICMgc3BlY2lmaWVkIC0tZGlzYWJsZSAoPz8/KSwgZG8gbGlrZXdpc2UuCiAgaWYgdGVzdCAkZW5hYmxlX2xpYnN0ZGN4eF9hbGxvY2F0b3IgPSBubyB8fAogICAgIHRlc3QgJGVuYWJsZV9saWJzdGRjeHhfYWxsb2NhdG9yID0geWVzOwogIHRoZW4KICAgICBlbmFibGVfbGlic3RkY3h4X2FsbG9jYXRvcj1hdXRvCiAgZmkKCiAgIyBFaXRoZXIgYSBrbm93biBwYWNrYWdlLCBvciAiYXV0byIuIEF1dG8gaW1wbGllcyB0aGUgZGVmYXVsdCBjaG9pY2UKICAjIGZvciBhIHBhcnRpY3VsYXIgcGxhdGZvcm0uCiAgZW5hYmxlX2xpYnN0ZGN4eF9hbGxvY2F0b3JfZmxhZz0kZW5hYmxlX2xpYnN0ZGN4eF9hbGxvY2F0b3IKCiAgIyBQcm9iZSBmb3IgaG9zdC1zcGVjaWZpYyBzdXBwb3J0IGlmIG5vIHNwZWNpZmljIG1vZGVsIGlzIHNwZWNpZmllZC4KICAjIERlZmF1bHQgdG8gIm5ldyIuCiAgaWYgdGVzdCAkZW5hYmxlX2xpYnN0ZGN4eF9hbGxvY2F0b3JfZmxhZyA9IGF1dG87IHRoZW4KICAgIGNhc2UgJHt0YXJnZXRfb3N9IGluCiAgICAgIGxpbnV4KiB8IGdudSogfCBrZnJlZWJzZCotZ251IHwga25ldGJzZCotZ251KQogICAgICAgIGVuYWJsZV9saWJzdGRjeHhfYWxsb2NhdG9yX2ZsYWc9bmV3CiAgICAgICAgOzsKICAgICAgKikKICAgICAgICBlbmFibGVfbGlic3RkY3h4X2FsbG9jYXRvcl9mbGFnPW5ldwogICAgICAgIDs7CiAgICBlc2FjCiAgZmkKICBBQ19NU0dfUkVTVUxUKCRlbmFibGVfbGlic3RkY3h4X2FsbG9jYXRvcl9mbGFnKQogIAoKICAjIFNldCBjb25maWd1cmUgYml0cyBmb3Igc3BlY2lmaWVkIGxvY2FsZSBwYWNrYWdlCiAgY2FzZSAke2VuYWJsZV9saWJzdGRjeHhfYWxsb2NhdG9yX2ZsYWd9IGluCiAgICBiaXRtYXApCiAgICAgIEFMTE9DQVRPUl9IPWNvbmZpZy9hbGxvY2F0b3IvYml0bWFwX2FsbG9jYXRvcl9iYXNlLmgKICAgICAgQUxMT0NBVE9SX05BTUU9X19nbnVfY3h4OjpiaXRtYXBfYWxsb2NhdG9yCiAgICAgIDs7CiAgICBtYWxsb2MpCiAgICAgIEFMTE9DQVRPUl9IPWNvbmZpZy9hbGxvY2F0b3IvbWFsbG9jX2FsbG9jYXRvcl9iYXNlLmgKICAgICAgQUxMT0NBVE9SX05BTUU9X19nbnVfY3h4OjptYWxsb2NfYWxsb2NhdG9yCiAgICAgIDs7CiAgICBtdCkKICAgICAgQUxMT0NBVE9SX0g9Y29uZmlnL2FsbG9jYXRvci9tdF9hbGxvY2F0b3JfYmFzZS5oCiAgICAgIEFMTE9DQVRPUl9OQU1FPV9fZ251X2N4eDo6X19tdF9hbGxvYwogICAgICA7OwogICAgbmV3KQogICAgICBBTExPQ0FUT1JfSD1jb25maWcvYWxsb2NhdG9yL25ld19hbGxvY2F0b3JfYmFzZS5oCiAgICAgIEFMTE9DQVRPUl9OQU1FPV9fZ251X2N4eDo6bmV3X2FsbG9jYXRvcgogICAgICA7OwogICAgcG9vbCkKICAgICAgQUxMT0NBVE9SX0g9Y29uZmlnL2FsbG9jYXRvci9wb29sX2FsbG9jYXRvcl9iYXNlLmgKICAgICAgQUxMT0NBVE9SX05BTUU9X19nbnVfY3h4OjpfX3Bvb2xfYWxsb2MKICAgICAgOzsJCiAgZXNhYwoKICBBQ19TVUJTVChBTExPQ0FUT1JfSCkKICBBQ19TVUJTVChBTExPQ0FUT1JfTkFNRSkKXSkKCgpkbmwKZG5sIENoZWNrIGZvciB3aGV0aGVyIHRoZSBCb29zdC1kZXJpdmVkIGNoZWNrcyBzaG91bGQgYmUgdHVybmVkIG9uLgpkbmwKZG5sIC0tZW5hYmxlLWNvbmNlcHQtY2hlY2tzIHR1cm5zIHRoZW0gb24uCmRubCAtLWRpc2FibGUtY29uY2VwdC1jaGVja3MgbGVhdmVzIHRoZW0gb2ZmLgpkbmwgICsgIFVzYWdlOiAgR0xJQkNYWF9FTkFCTEVfQ09OQ0VQVF9DSEVDS1NbKERFRkFVTFQpXQpkbmwgICAgICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9DT05DRVBUX0NIRUNLU10sIFsKICBHTElCQ1hYX0VOQUJMRShjb25jZXB0LWNoZWNrcywkMSwsW3VzZSBCb29zdC1kZXJpdmVkIHRlbXBsYXRlIGNoZWNrc10pCiAgaWYgdGVzdCAkZW5hYmxlX2NvbmNlcHRfY2hlY2tzID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfQ09OQ0VQVF9DSEVDS1MsIDEsCiAgICAgICAgICAgICAgW0RlZmluZSB0byB1c2UgY29uY2VwdCBjaGVja2luZyBjb2RlIGZyb20gdGhlIGJvb3N0IGxpYnJhcmllcy5dKQogIGZpCl0pCgpkbmwKZG5sIENoZWNrIGZvciBwYXJhbGxlbCBtb2RlIHByZS1yZXF1aXNpdGVzLCBpbmNsdWRpbmcgT3Blbk1QIHN1cHBvcnQuCmRubApkbmwgICsgIFVzYWdlOiAgR0xJQkNYWF9FTkFCTEVfUEFSQUxMRUwKZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9QQVJBTExFTF0sIFsKCiAgIyBOQjogbGlic3RkYysrIG1heSBiZSBjb25maWd1cmVkIGJlZm9yZSBsaWJnb21wOiBjYW4ndCBjaGVjayBmb3IgdGhlIGFjdHVhbAogICMgZGVwZW5kZW5jaWVzIChvbXAuaCBhbmQgbGliZ29tcCkuIAogIGVuYWJsZV9wYXJhbGxlbD1ubzsKICBpZiB0ZXN0IC1mICRnbGliY3h4X2J1aWxkZGlyLy4uL2xpYmdvbXAvb21wLmg7IHRoZW4KICAgIGVuYWJsZV9wYXJhbGxlbD15ZXM7CiAgZWxzZQogICAgQUNfTVNHX05PVElDRShbJGdsaWJjeHhfYnVpbGRkaXIvLi4vbGliZ29tcC9vbXAuaCBub3QgZm91bmRdKQogIGZpCgogICMgQ2hlY2sgdG8gc2VlIGlmIGl0J3MgZXhwbGljaXRseSBkaXNhYmxlZC4KIyAgR0xJQkNYWF9FTkFCTEUobGliZ29tcCwkMSwsW2VuYWJsZSBjb2RlIGRlcGVuZGluZyBvbiBsaWJnb21wXSwKIwlbcGVybWl0IHllc3xub10pCgojICBpZiB0ZXN0IHgkZW5hYmxlX2xpYmdvbXAgPSB4bm87IHRoZW4KIyAgICBlbmFibGVfcGFyYWxsZWw9bm8KIyAgZmkKCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgcGFyYWxsZWwgbW9kZSBzdXBwb3J0XSkKICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3BhcmFsbGVsXSkKICBHTElCQ1hYX0NPTkRJVElPTkFMKEVOQUJMRV9QQVJBTExFTCwgdGVzdCAkZW5hYmxlX3BhcmFsbGVsID0geWVzKQpdKQoKCmRubApkbmwgQ2hlY2sgZm9yIHdoaWNoIEkvTyBsaWJyYXJ5IHRvIHVzZTogIHN0ZGlvLCBvciBzb21ldGhpbmcgc3BlY2lmaWMuCmRubApkbmwgRGVmYXVsdCBpcyBzdGRpby4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9DU1RESU9dLCBbCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgdW5kZXJseWluZyBJL08gdG8gdXNlXSkKICBHTElCQ1hYX0VOQUJMRShjc3RkaW8sc3RkaW8sWz1QQUNLQUdFXSwKICAgIFt1c2UgdGFyZ2V0LXNwZWNpZmljIEkvTyBwYWNrYWdlXSwgW3Blcm1pdCBzdGRpb10pCgogICMgTm93IHRoYXQgbGliaW8gaGFzIGJlZW4gcmVtb3ZlZCwgeW91IGNhbiBoYXZlIGFueSBjb2xvciB5b3Ugd2FudCBhcyBsb25nCiAgIyBhcyBpdCdzIGJsYWNrLiAgVGhpcyBpcyBvbmUgYmlnIG5vLW9wIHVudGlsIG90aGVyIHBhY2thZ2VzIGFyZSBhZGRlZCwgYnV0CiAgIyBzaG93aW5nIHRoZSBmcmFtZXdvcmsgbmV2ZXIgaHVydHMuCiAgY2FzZSAke2VuYWJsZV9jc3RkaW99IGluCiAgICBzdGRpbykKICAgICAgQ1NURElPX0g9Y29uZmlnL2lvL2NfaW9fc3RkaW8uaAogICAgICBCQVNJQ19GSUxFX0g9Y29uZmlnL2lvL2Jhc2ljX2ZpbGVfc3RkaW8uaAogICAgICBCQVNJQ19GSUxFX0NDPWNvbmZpZy9pby9iYXNpY19maWxlX3N0ZGlvLmNjCiAgICAgIEFDX01TR19SRVNVTFQoc3RkaW8pCiAgICAgIDs7CiAgZXNhYwoKICBBQ19TVUJTVChDU1RESU9fSCkKICBBQ19TVUJTVChCQVNJQ19GSUxFX0gpCiAgQUNfU1VCU1QoQkFTSUNfRklMRV9DQykKXSkKCgpkbmwKZG5sIENoZWNrIGZvciAidW51c3VhbCIgZmxhZ3MgdG8gcGFzcyB0byB0aGUgY29tcGlsZXIgd2hpbGUgYnVpbGRpbmcuCmRubApkbmwgLS1lbmFibGUtY3h4LWZsYWdzPSctZm9vIC1iYXIgLWJheicgaXMgYSBnZW5lcmFsIG1ldGhvZCBmb3IgcGFzc2luZwpkbmwgICAgIGV4cGVyaW1lbnRhbCBmbGFncyBzdWNoIGFzIC1mcGNoLCAtZklNSSwgLURmbG9hdD1jaGFyLCBldGMuCmRubCAtLWRpc2FibGUtY3h4LWZsYWdzIHBhc3NlcyBub3RoaW5nLgpkbmwgICsgIFNlZSBodHRwOi8vZ2NjLmdudS5vcmcvbWwvbGlic3RkYysrLzIwMDAtcTIvbXNnMDAxMzEuaHRtbApkbmwgICAgICAgICBodHRwOi8vZ2NjLmdudS5vcmcvbWwvbGlic3RkYysrLzIwMDAtcTIvbXNnMDAyODQuaHRtbApkbmwgICAgICAgICBodHRwOi8vZ2NjLmdudS5vcmcvbWwvbGlic3RkYysrLzIwMDAtcTEvbXNnMDAwMzUuaHRtbApkbmwgICsgIFVzYWdlOiAgR0xJQkNYWF9FTkFCTEVfQ1hYX0ZMQUdTKGRlZmF1bHQgZmxhZ3MpCmRubCAgICAgICBJZiAiZGVmYXVsdCBmbGFncyIgaXMgYW4gZW1wdHkgc3RyaW5nLCB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lCmRubCAgICAgICBhcyAtLWRpc2FibGUgb3IgLS1lbmFibGU9bm8uCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfQ1hYX0ZMQUdTXSwgW2RubAogIEFDX01TR19DSEVDS0lORyhbZm9yIGV4dHJhIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZ10pCiAgR0xJQkNYWF9FTkFCTEUoY3h4LWZsYWdzLCQxLFs9RkxBR1NdLAogICAgW3Bhc3MgY29tcGlsZXIgRkxBR1Mgd2hlbiBidWlsZGluZyBsaWJyYXJ5XSwKICAgIFtjYXNlICJ4JGVuYWJsZV9jeHhfZmxhZ3MiIGluCiAgICAgIHhubyB8IHgpICAgZW5hYmxlX2N4eF9mbGFncz0gOzsKICAgICAgeC0qKSAgICAgICA7OwogICAgICAqKSAgICAgICAgIEFDX01TR19FUlJPUihfZ19zd2l0Y2ggbmVlZHMgY29tcGlsZXIgZmxhZ3MgYXMgYXJndW1lbnRzKSA7OwogICAgIGVzYWNdKQoKICAjIFJ1biB0aHJvdWdoIGZsYWdzIChlaXRoZXIgZGVmYXVsdCBvciBjb21tYW5kLWxpbmUpIGFuZCBzZXQgYW55dGhpbmcKICAjIGV4dHJhIChlLmcuLCAjZGVmaW5lcykgdGhhdCBtdXN0IGFjY29tcGFueSBwYXJ0aWN1bGFyIGcrKyBvcHRpb25zLgogIGlmIHRlc3QgLW4gIiRlbmFibGVfY3h4X2ZsYWdzIjsgdGhlbgogICAgZm9yIGYgaW4gJGVuYWJsZV9jeHhfZmxhZ3M7IGRvCiAgICAgIGNhc2UgIiRmIiBpbgogICAgICAgIC1maG9ub3Itc3RkKSAgOzsKICAgICAgICAtKikgIDs7CiAgICAgICAgKikgICAjIGFuZCB3ZSdyZSB0cnlpbmcgdG8gcGFzcyAvd2hhdC8gZXhhY3RseT8KICAgICAgICAgICAgIEFDX01TR19FUlJPUihbY29tcGlsZXIgZmxhZ3Mgc3RhcnQgd2l0aCBhIC1dKSA7OwogICAgICBlc2FjCiAgICBkb25lCiAgZmkKCiAgRVhUUkFfQ1hYX0ZMQUdTPSIkZW5hYmxlX2N4eF9mbGFncyIKICBBQ19NU0dfUkVTVUxUKCRFWFRSQV9DWFhfRkxBR1MpCiAgQUNfU1VCU1QoRVhUUkFfQ1hYX0ZMQUdTKQpdKQoKCmRubApkbmwgQ2hlY2sgdG8gc2VlIGlmIGRlYnVnZ2luZyBsaWJyYXJpZXMgYXJlIHRvIGJlIGJ1aWx0LgpkbmwKZG5sIC0tZW5hYmxlLWxpYnN0ZGN4eC1kZWJ1ZwpkbmwgYnVpbGRzIGEgc2VwYXJhdGUgc2V0IG9mIGRlYnVnZ2luZyBsaWJyYXJpZXMgaW4gYWRkaXRpb24gdG8gdGhlCmRubCBub3JtYWwgKHNoYXJlZCwgc3RhdGljKSBsaWJzdGRjKysgYmluYXJpZXMuCmRubApkbmwgLS1kaXNhYmxlLWxpYnN0ZGN4eC1kZWJ1ZwpkbmwgYnVpbGRzIG9ubHkgb25lIChub24tZGVidWcpIHZlcnNpb24gb2YgbGlic3RkYysrLgpkbmwKZG5sIC0tZW5hYmxlLWxpYnN0ZGN4eC1kZWJ1Zy1mbGFncz1GTEFHUwpkbmwgaWZmIC0tZW5hYmxlLWRlYnVnID09IHllcywgdGhlbiB1c2UgRkxBR1MgdG8gYnVpbGQgdGhlIGRlYnVnIGxpYnJhcnkuCmRubApkbmwgICsgIFVzYWdlOiAgR0xJQkNYWF9FTkFCTEVfREVCVUdbKERFRkFVTFQpXQpkbmwgICAgICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9ERUJVR10sIFsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBhZGRpdGlvbmFsIGRlYnVnIGJ1aWxkXSkKICBHTElCQ1hYX0VOQUJMRShsaWJzdGRjeHgtZGVidWcsJDEsLFtidWlsZCBleHRyYSBkZWJ1ZyBsaWJyYXJ5XSkKICBBQ19NU0dfUkVTVUxUKCRlbmFibGVfbGlic3RkY3h4X2RlYnVnKQogIEdMSUJDWFhfQ09ORElUSU9OQUwoR0xJQkNYWF9CVUlMRF9ERUJVRywgdGVzdCAkZW5hYmxlX2xpYnN0ZGN4eF9kZWJ1ZyA9IHllcykKXSkKCgpkbmwKZG5sIENoZWNrIGZvciBleHBsaWNpdCBkZWJ1ZyBmbGFncy4KZG5sCmRubCAtLWVuYWJsZS1saWJzdGRjeHgtZGVidWctZmxhZ3M9Jy1PMScKZG5sIGlzIGEgZ2VuZXJhbCBtZXRob2QgZm9yIHBhc3NpbmcgZmxhZ3MgdG8gYmUgdXNlZCB3aGVuCmRubCBidWlsZGluZyBkZWJ1ZyBsaWJyYXJpZXMgd2l0aCAtLWVuYWJsZS1kZWJ1Zy4KZG5sCmRubCAtLWRpc2FibGUtbGlic3RkY3h4LWRlYnVnLWZsYWdzIGRvZXMgbm90aGluZy4KZG5sICArICBVc2FnZTogIEdMSUJDWFhfRU5BQkxFX0RFQlVHX0ZMQUdTKGRlZmF1bHQgZmxhZ3MpCmRubCAgICAgICBJZiAiZGVmYXVsdCBmbGFncyIgaXMgYW4gZW1wdHkgc3RyaW5nLCB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lCmRubCAgICAgICBhcyAtLWRpc2FibGUgb3IgLS1lbmFibGU9bm8uCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfREVCVUdfRkxBR1NdLCBbCiAgR0xJQkNYWF9FTkFCTEUobGlic3RkY3h4LWRlYnVnLWZsYWdzLFskMV0sWz1GTEFHU10sCiAgICBbcGFzcyBjb21waWxlciBGTEFHUyB3aGVuIGJ1aWxkaW5nIGRlYnVnIGxpYnJhcnldLAogICAgW2Nhc2UgIngkZW5hYmxlX2xpYnN0ZGN4eF9kZWJ1Z19mbGFncyIgaW4KICAgICAgeG5vIHwgeCkgICAgZW5hYmxlX2xpYnN0ZGN4eF9kZWJ1Z19mbGFncz0gOzsKICAgICAgeC0qKSAgICAgICAgOzsKICAgICAgKikgICAgICAgICAgQUNfTVNHX0VSUk9SKF9nX3N3aXRjaCBuZWVkcyBjb21waWxlciBmbGFncyBhcyBhcmd1bWVudHMpIDs7CiAgICAgZXNhY10pCgogICMgT3B0aW9uIHBhcnNlZCwgbm93IHNldCB0aGluZ3MgYXBwcm9wcmlhdGVseQogIERFQlVHX0ZMQUdTPSIkZW5hYmxlX2xpYnN0ZGN4eF9kZWJ1Z19mbGFncyIKICBBQ19TVUJTVChERUJVR19GTEFHUykKCiAgQUNfTVNHX05PVElDRShbRGVidWcgYnVpbGQgZmxhZ3Mgc2V0IHRvICRERUJVR19GTEFHU10pCl0pCgoKZG5sCmRubCBDaGVjayBpZiB0aGUgdXNlciBvbmx5IHdhbnRzIGEgZnJlZXN0YW5kaW5nIGxpYnJhcnkgaW1wbGVtZW50YXRpb24uCmRubApkbmwgLS1kaXNhYmxlLWhvc3RlZC1saWJzdGRjeHggd2lsbCB0dXJuIG9mZiBtb3N0IG9mIHRoZSBsaWJyYXJ5IGJ1aWxkLApkbmwgaW5zdGFsbGluZyBvbmx5IHRoZSBoZWFkZXJzIHJlcXVpcmVkIGJ5IFsxNy40LjEuM10gYW5kIHRoZSBsYW5ndWFnZQpkbmwgc3VwcG9ydCBsaWJyYXJ5LiAgTW9yZSB0aGFuIHRoYXQgd2lsbCBiZSBidWlsdCAodG8ga2VlcCB0aGUgTWFrZWZpbGVzCmRubCBjb252ZW5pZW50bHkgY2xlYW4pLCBidXQgbm90IGluc3RhbGxlZC4KZG5sCmRubCBTZXRzOgpkbmwgIGlzX2hvc3RlZCAgKHllcy9ubykKZG5sCmRubCBEZWZpbmVzOgpkbmwgIF9HTElCQ1hYX0hPU1RFRCAgIChhbHdheXMgZGVmaW5lZCwgZWl0aGVyIHRvIDEgb3IgMCkKZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9IT1NURURdLCBbCiAgQUNfQVJHX0VOQUJMRShbaG9zdGVkLWxpYnN0ZGN4eF0sCiAgICBBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWhvc3RlZC1saWJzdGRjeHhdLAogICAgICAgICAgICAgICAgICAgW29ubHkgYnVpbGQgZnJlZXN0YW5kaW5nIEMrKyBydW50aW1lIHN1cHBvcnRdKSwsCiAgICBbY2FzZSAiJGhvc3QiIGluCglhcm0qLSotc3ltYmlhbmVsZiopIAoJICAgIGVuYWJsZV9ob3N0ZWRfbGlic3RkY3h4PW5vCgkgICAgOzsKICAgICAgICAqKSAKCSAgICBlbmFibGVfaG9zdGVkX2xpYnN0ZGN4eD15ZXMKCSAgICA7OwogICAgIGVzYWNdKQogIGlmIHRlc3QgIiRlbmFibGVfaG9zdGVkX2xpYnN0ZGN4eCIgPSBubzsgdGhlbgogICAgQUNfTVNHX05PVElDRShbT25seSBmcmVlc3RhbmRpbmcgbGlicmFyaWVzIHdpbGwgYmUgYnVpbHRdKQogICAgaXNfaG9zdGVkPW5vCiAgICBob3N0ZWRfZGVmaW5lPTAKICAgIGVuYWJsZV9hYmlfY2hlY2s9bm8KICAgIGVuYWJsZV9saWJzdGRjeHhfcGNoPW5vCiAgZWxzZQogICAgaXNfaG9zdGVkPXllcwogICAgaG9zdGVkX2RlZmluZT0xCiAgZmkKICBHTElCQ1hYX0NPTkRJVElPTkFMKEdMSUJDWFhfSE9TVEVELCB0ZXN0ICRpc19ob3N0ZWQgPSB5ZXMpCiAgQUNfREVGSU5FX1VOUVVPVEVEKF9HTElCQ1hYX0hPU1RFRCwgJGhvc3RlZF9kZWZpbmUsCiAgICBbRGVmaW5lIHRvIDEgaWYgYSBmdWxsIGhvc3RlZCBsaWJyYXJ5IGlzIGJ1aWx0LCBvciAwIGlmIGZyZWVzdGFuZGluZy5dKQpdKQoKCmRubApkbmwgQ2hlY2sgZm9yIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyBmb3IgdGhlICdsb25nIGxvbmcnIHR5cGUuCmRubCBUaGUgcmVzdWx0IGRldGVybWluZXMgb25seSB3aGV0aGVyICdsb25nIGxvbmcnIEkvTyBpcyBlbmFibGVkOyB0aGluZ3MKZG5sIGxpa2UgbnVtZXJpY19saW1pdHM8PiBzcGVjaWFsaXphdGlvbnMgYXJlIGFsd2F5cyBhdmFpbGFibGUuCmRubApkbmwgLS1lbmFibGUtbG9uZy1sb25nIGRlZmluZXMgX0dMSUJDWFhfVVNFX0xPTkdfTE9ORwpkbmwgLS1kaXNhYmxlLWxvbmctbG9uZyBsZWF2ZXMgX0dMSUJDWFhfVVNFX0xPTkdfTE9ORyB1bmRlZmluZWQKZG5sICArICBVc2FnZTogIEdMSUJDWFhfRU5BQkxFX0xPTkdfTE9OR1soREVGQVVMVCldCmRubCAgICAgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX0xPTkdfTE9OR10sIFsKICBHTElCQ1hYX0VOQUJMRShsb25nLWxvbmcsJDEsLFtlbmFibGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIGZvciAnbG9uZyBsb25nJ10pCiAgaWYgdGVzdCAkZW5hYmxlX2xvbmdfbG9uZyA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9MT05HX0xPTkcsIDEsIAogICAgICAgICAgICAgIFtEZWZpbmUgaWYgY29kZSBzcGVjaWFsaXplZCBmb3IgbG9uZyBsb25nIHNob3VsZCBiZSB1c2VkLl0pCiAgZmkKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBlbmFibGVkIGxvbmcgbG9uZyBzcGVjaWFsaXphdGlvbnNdKQogIEFDX01TR19SRVNVTFQoWyRlbmFibGVfbG9uZ19sb25nXSkKXSkKCgpkbmwKZG5sIENoZWNrIGZvciB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgZm9yIHRoZSAnd2NoYXJfdCcgdHlwZS4KZG5sCmRubCAtLWVuYWJsZS13Y2hhcl90IGRlZmluZXMgX0dMSUJDWFhfVVNFX1dDSEFSX1QKZG5sIC0tZGlzYWJsZS13Y2hhcl90IGxlYXZlcyBfR0xJQkNYWF9VU0VfV0NIQVJfVCB1bmRlZmluZWQKZG5sICArICBVc2FnZTogIEdMSUJDWFhfRU5BQkxFX1dDSEFSX1RbKERFRkFVTFQpXQpkbmwgICAgICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4KZG5sCmRubCBOZWNlc3Nhcnkgc3VwcG9ydCBtdXN0IGFsc28gYmUgcHJlc2VudC4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9XQ0hBUl9UXSwgWwogIEdMSUJDWFhfRU5BQkxFKHdjaGFyX3QsJDEsLFtlbmFibGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIGZvciAnd2NoYXJfdCddKQoKICAjIFRlc3Qgd2NoYXIuaCBmb3IgbWJzdGF0ZV90LCB3aGljaCBpcyBuZWVkZWQgZm9yIGNoYXJfdHJhaXRzIGFuZCBmcG9zLgogIEFDX0NIRUNLX0hFQURFUlMod2NoYXIuaCwgYWNfaGFzX3djaGFyX2g9eWVzLCBhY19oYXNfd2NoYXJfaD1ubykKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBtYnN0YXRlX3RdKQogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8d2NoYXIuaD5dLAogIFttYnN0YXRlX3QgdGVzdHN0YXRlO10sCiAgaGF2ZV9tYnN0YXRlX3Q9eWVzLCBoYXZlX21ic3RhdGVfdD1ubykKICBBQ19NU0dfUkVTVUxUKCRoYXZlX21ic3RhdGVfdCkKICBpZiB0ZXN0IHgiJGhhdmVfbWJzdGF0ZV90IiA9IHh5ZXM7IHRoZW4KICAgIEFDX0RFRklORShIQVZFX01CU1RBVEVfVCwxLFtEZWZpbmUgaWYgbWJzdGF0ZV90IGV4aXN0cyBpbiB3Y2hhci5oLl0pCiAgZmkKCiAgIyBUZXN0IGl0IGFsd2F5cywgZm9yIHVzZSBpbiBHTElCQ1hYX0VOQUJMRV9DOTksIHRvZ2V0aGVyIHdpdGgKICAjIGFjX2hhc193Y2hhcl9oLgogIEFDX0NIRUNLX0hFQURFUlMod2N0eXBlLmgsIGFjX2hhc193Y3R5cGVfaD15ZXMsIGFjX2hhc193Y3R5cGVfaD1ubykKICAKICBpZiB0ZXN0IHgiJGVuYWJsZV93Y2hhcl90IiA9IHgieWVzIjsgdGhlbgoKICAgIEFDX0xBTkdfU0FWRQogICAgQUNfTEFOR19DUExVU1BMVVMKICAgIAogICAgaWYgdGVzdCB4IiRhY19oYXNfd2NoYXJfaCIgPSB4eWVzICYmCiAgICAgICB0ZXN0IHgiJGFjX2hhc193Y3R5cGVfaCIgPSB4eWVzOyB0aGVuCiAgICAgIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8d2NoYXIuaD4KICAgICAgICAgICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRkZWYuaD4KICAgICAgICAgICAgICAgICAgICAgIHdpbnRfdCBpOwoJCSAgICAgIGxvbmcgbCA9IFdFT0Y7CgkJICAgICAgbG9uZyBqID0gV0NIQVJfTUlOOwoJCSAgICAgIGxvbmcgayA9IFdDSEFSX01BWDsKICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSB0ZXN0CiAgICAgICAgICAgICAgICAgICAgICB7CgkJCXVzaW5nIDo6YnRvd2M7CgkJCXVzaW5nIDo6ZmdldHdjOwoJCQl1c2luZyA6OmZnZXR3czsKCQkJdXNpbmcgOjpmcHV0d2M7CgkJCXVzaW5nIDo6ZnB1dHdzOwoJCQl1c2luZyA6OmZ3aWRlOwoJCQl1c2luZyA6OmZ3cHJpbnRmOyAKCQkJdXNpbmcgOjpmd3NjYW5mOwoJCQl1c2luZyA6OmdldHdjOwoJCQl1c2luZyA6OmdldHdjaGFyOwogCQkJdXNpbmcgOjptYnJsZW47IAoJCQl1c2luZyA6Om1icnRvd2M7IAoJCQl1c2luZyA6Om1ic2luaXQ7IAoJCQl1c2luZyA6Om1ic3J0b3djczsgCgkJCXVzaW5nIDo6cHV0d2M7CgkJCXVzaW5nIDo6cHV0d2NoYXI7CgkJCXVzaW5nIDo6c3dwcmludGY7IAoJCQl1c2luZyA6OnN3c2NhbmY7IAoJCQl1c2luZyA6OnVuZ2V0d2M7CgkJCXVzaW5nIDo6dmZ3cHJpbnRmOyAKCQkJdXNpbmcgOjp2c3dwcmludGY7IAoJCQl1c2luZyA6OnZ3cHJpbnRmOyAKCQkJdXNpbmcgOjp3Y3J0b21iOyAKCQkJdXNpbmcgOjp3Y3NjYXQ7IAoJCQl1c2luZyA6Ondjc2NocjsgCgkJCXVzaW5nIDo6d2NzY21wOyAKCQkJdXNpbmcgOjp3Y3Njb2xsOyAKCQkJdXNpbmcgOjp3Y3NjcHk7IAoJCQl1c2luZyA6Ondjc2NzcG47IAoJCQl1c2luZyA6Ondjc2Z0aW1lOyAKCQkJdXNpbmcgOjp3Y3NsZW47CgkJCXVzaW5nIDo6d2NzbmNhdDsgCgkJCXVzaW5nIDo6d2NzbmNtcDsgCgkJCXVzaW5nIDo6d2NzbmNweTsgCgkJCXVzaW5nIDo6d2NzcGJyazsKCQkJdXNpbmcgOjp3Y3NyY2hyOyAKCQkJdXNpbmcgOjp3Y3NydG9tYnM7IAoJCQl1c2luZyA6Ondjc3NwbjsgCgkJCXVzaW5nIDo6d2Nzc3RyOwoJCQl1c2luZyA6Ondjc3RvZDsgCgkJCXVzaW5nIDo6d2NzdG9rOyAKCQkJdXNpbmcgOjp3Y3N0b2w7CgkJCXVzaW5nIDo6d2NzdG91bDsgCgkJCXVzaW5nIDo6d2NzeGZybTsgCgkJCXVzaW5nIDo6d2N0b2I7IAoJCQl1c2luZyA6OndtZW1jaHI7CgkJCXVzaW5nIDo6d21lbWNtcDsKCQkJdXNpbmcgOjp3bWVtY3B5OwoJCQl1c2luZyA6OndtZW1tb3ZlOwoJCQl1c2luZyA6OndtZW1zZXQ7CgkJCXVzaW5nIDo6d3ByaW50ZjsgCgkJCXVzaW5nIDo6d3NjYW5mOyAKCQkgICAgICB9CgkJICAgICBdLFtdLFtdLCBbZW5hYmxlX3djaGFyX3Q9bm9dKQogICAgZWxzZQogICAgICBlbmFibGVfd2NoYXJfdD1ubwogICAgZmkKCiAgICBBQ19MQU5HX1JFU1RPUkUKICBmaQoKICBpZiB0ZXN0IHgiJGVuYWJsZV93Y2hhcl90IiA9IHgieWVzIjsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9XQ0hBUl9ULCAxLAogICAgICAgICAgICAgIFtEZWZpbmUgaWYgY29kZSBzcGVjaWFsaXplZCBmb3Igd2NoYXJfdCBzaG91bGQgYmUgdXNlZC5dKQogIGZpCgogIEFDX01TR19DSEVDS0lORyhbZm9yIGVuYWJsZWQgd2NoYXJfdCBzcGVjaWFsaXphdGlvbnNdKQogIEFDX01TR19SRVNVTFQoWyRlbmFibGVfd2NoYXJfdF0pCl0pCgoKZG5sCmRubCBDaGVjayB0byBzZWUgaWYgYnVpbGRpbmcgYW5kIHVzaW5nIGEgQysrIHByZWNvbXBpbGVkIGhlYWRlciBjYW4gYmUgZG9uZS4KZG5sCmRubCAtLWVuYWJsZS1saWJzdGRjeHgtcGNoPXllcwpkbmwgZGVmYXVsdCwgdGhpcyBzaG93cyBpbnRlbnQgdG8gdXNlIHN0ZGMrKy5oLmdjaCBJZiBpdCBsb29rcyBsaWtlIGl0CmRubCBtYXkgd29yaywgYWZ0ZXIgc29tZSBsaWdodC1oZWFydGVkIGF0dGVtcHRzIHRvIHB1enpsZSBvdXQgY29tcGlsZXIKZG5sIHN1cHBvcnQsIGZsaXAgYml0cyBvbiBpbiBpbmNsdWRlL01ha2VmaWxlLmFtCmRubApkbmwgLS1kaXNhYmxlLWxpYnN0ZGN4eC1wY2gKZG5sIHR1cm5zIG9mZiBhdHRlbXB0cyB0byB1c2Ugb3IgYnVpbGQgc3RkYysrLmguZ2NoLgpkbmwKZG5sIFN1YnN0czoKZG5sICBnbGliY3h4X1BDSEZMQUdTCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfUENIXSwgWwogIEdMSUJDWFhfRU5BQkxFKGxpYnN0ZGN4eC1wY2gsJDEsLFtidWlsZCBwcmUtY29tcGlsZWQgbGlic3RkYysrIGhlYWRlcnNdKQogIGlmIHRlc3QgJGVuYWJsZV9saWJzdGRjeHhfcGNoID0geWVzOyB0aGVuCiAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIGNvbXBpbGVyIHdpdGggUENIIHN1cHBvcnRdLAogICAgICBbZ2xpYmN4eF9jdl9wcm9nX0NYWF9wY2hdLAogICAgICBbYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgogICAgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAtV2Vycm9yIC1XaW52YWxpZC1wY2ggLVduby1kZXByZWNhdGVkIgogICAgICAgQUNfTEFOR19TQVZFCiAgICAgICBBQ19MQU5HX0NQTFVTUExVUwogICAgICAgZWNobyAnI2luY2x1ZGUgPG1hdGguaD4nID4gY29uZnRlc3QuaAogICAgICAgaWYgJENYWCAkQ1hYRkxBR1MgJENQUEZMQUdTIC14IGMrKy1oZWFkZXIgY29uZnRlc3QuaCBcCgkJICAgICAgICAgIC1vIGNvbmZ0ZXN0LmguZ2NoIDE+JjUgMj4mMSAmJgoJICAgICAgICBlY2hvICcjZXJyb3IgInBjaCBmYWlsZWQiJyA+IGNvbmZ0ZXN0LmggJiYKICAgICAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdGVzdC5oIicgPiBjb25mdGVzdC5jYyAmJgoJICAgICAgICRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC5jYyAxPiY1IDI+JjEgOwogICAgICAgdGhlbgogICAgICAgICBnbGliY3h4X2N2X3Byb2dfQ1hYX3BjaD15ZXMKICAgICAgIGVsc2UKICAgICAgICAgZ2xpYmN4eF9jdl9wcm9nX0NYWF9wY2g9bm8KICAgICAgIGZpCiAgICAgICBybSAtZiBjb25mdGVzdCoKICAgICAgIENYWEZMQUdTPSRhY19zYXZlX0NYWEZMQUdTCiAgICAgICBBQ19MQU5HX1JFU1RPUkUKICAgICAgXSkKICAgIGVuYWJsZV9saWJzdGRjeHhfcGNoPSRnbGliY3h4X2N2X3Byb2dfQ1hYX3BjaAogIGZpCgogIEFDX01TR19DSEVDS0lORyhbZm9yIGVuYWJsZWQgUENIXSkKICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX2xpYnN0ZGN4eF9wY2hdKQoKICBHTElCQ1hYX0NPTkRJVElPTkFMKEdMSUJDWFhfQlVJTERfUENILCB0ZXN0ICRlbmFibGVfbGlic3RkY3h4X3BjaCA9IHllcykKICBpZiB0ZXN0ICRlbmFibGVfbGlic3RkY3h4X3BjaCA9IHllczsgdGhlbgogICAgZ2xpYmN4eF9QQ0hGTEFHUz0iLWluY2x1ZGUgYml0cy9zdGRjKysuaCIKICBlbHNlCiAgICBnbGliY3h4X1BDSEZMQUdTPSIiCiAgZmkKICBBQ19TVUJTVChnbGliY3h4X1BDSEZMQUdTKQpdKQoKCmRubApkbmwgQ2hlY2sgZm9yIGF0b21pYyBidWlsdGlucy4KZG5sIFNlZToKZG5sIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2djYy9BdG9taWMtQnVpbHRpbnMuaHRtbCNBdG9taWMtQnVpbHRpbnMKZG5sCmRubCBUaGlzIGNoZWNrcyB0byBzZWUgaWYgdGhlIGhvc3Qgc3VwcG9ydHMgdGhlIGNvbXBpbGVyLWdlbmVyYXRlZApkbmwgYnVpbHRpbnMgZm9yIGF0b21pYyBvcGVyYXRpb25zLiBOb3RlLCB0aGlzIGlzIGludGVuZGVkIHRvIGJlIGFuCmRubCBhbGwtb3Itbm90aGluZyBzd2l0Y2gsIHNvIGFsbCB0aGUgYXRvbWljIG9wZXJhdGlvbnMgdGhhdCBhcmUgdXNlZApkbmwgc2hvdWxkIGJlIGNoZWNrZWQuCmRubApkbmwgTm90ZToKZG5sIGxpYmdvbXAgYW5kIGxpYmdmb3J0cmFuIGRvIHRoaXMgd2l0aCBhIGxpbmsgdGVzdCwgaW5zdGVhZCBvZiBhbiBhc20gdGVzdC4KZG5sIHNlZTogQ0hFQ0tfU1lOQ19GRVRDSF9BTkRfQURECmRubApkbmwgRGVmaW5lczoKZG5sICBfR0xJQkNYWF9BVE9NSUNfQlVJTFRJTlMgaWYgdGhlIGNvbXBpbGVyIG9uIHRoaXMgdGFyZ2V0IHN1cHBvcnRzIGF0b21pY3MuCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfQVRPTUlDX0JVSUxUSU5TXSwgWwogIEFDX01TR19DSEVDS0lORyhbZm9yIGF0b21pYyBidWlsdGluc10pCiAgQUNfTEFOR19TQVZFCiAgQUNfTEFOR19DUExVU1BMVVMKCiAgIyBGYWtlIHdoYXQgQUNfVFJZX0NPTVBJTEUgZG9lcy4gIFhYWCBMb29rIGF0IHJlZG9pbmcgdGhpcyBuZXctc3R5bGUuCiAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgpbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIgppbnQgbWFpbigpCnsKICAvLyBOQjogX0F0b21pY193b3JkIG5vdCBuZWNlc3NhcmlseSBpbnQuIAogIHR5cGVkZWYgaW50IGF0b21pY190eXBlOwogIGF0b21pY190eXBlIGMxOwogIGF0b21pY190eXBlIGMyOwogIGNvbnN0IGF0b21pY190eXBlIGMzKDApOwogIGlmIChfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmYzEsIGMyKSA9PSBjMykKICAgIHsKICAgICAgLy8gRG8gc29tZXRoaW5nLgogICAgfQogICByZXR1cm4gMDsKfQpFT0YKICAgIG9sZF9DWFhGTEFHUz0iJENYWEZMQUdTIgogICAgQ1hYRkxBR1M9Jy1PMCAtUycKICAgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCiAgICAgIGlmIGdyZXAgX19zeW5jX2ZldGNoX2FuZF9hZGQgY29uZnRlc3QucyA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCiAgICAgICAgZW5hYmxlX2F0b21pY19idWlsdGlucz1ubwogICAgICBlbHNlCiAgICAgIEFDX0RFRklORShfR0xJQkNYWF9BVE9NSUNfQlVJTFRJTlMsIDEsCiAgICAgICAgW0RlZmluZSBpZiBidWlsdGluIGF0b21pYyBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQgb24gdGhpcyBob3N0Ll0pCiAgICAgICAgZW5hYmxlX2F0b21pY19idWlsdGlucz15ZXMKCWF0b21pY2l0eV9kaXI9Y3B1L2dlbmVyaWMvYXRvbWljaXR5X2J1aWx0aW5zCiAgICAgIGZpCiAgICBmaQogICAgQUNfTVNHX1JFU1VMVCgkZW5hYmxlX2F0b21pY19idWlsdGlucykKICAgIENYWEZMQUdTPSIkb2xkX0NYWEZMQUdTIgogICAgcm0gLWYgY29uZnRlc3QqCgogICAjIE5vdywgaWYgc3RpbGwgZ2VuZXJpYywgc2V0IHRvIG11dGV4LgogIGlmIHRlc3QgJGF0b21pY2l0eV9kaXIgPSAiY3B1L2dlbmVyaWMiIDsgdGhlbgoJYXRvbWljaXR5X2Rpcj1jcHUvZ2VuZXJpYy9hdG9taWNpdHlfbXV0ZXgKICBmaQogQUNfTEFOR19SRVNUT1JFCl0pCgoKZG5sCmRubCBDaGVjayBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nIHN1cHBvcnQuICBJZiBhbiBleHBsaWNpdCBlbmFibGUvZGlzYWJsZQpkbmwgc2psaiBleGNlcHRpb25zIGlzIGdpdmVuLCB3ZSBkb24ndCBoYXZlIHRvIGRldGVjdC4gIE90aGVyd2lzZSB0aGUKZG5sIHRhcmdldCBtYXkgb3IgbWF5IG5vdCBzdXBwb3J0IGNhbGwgZnJhbWUgZXhjZXB0aW9ucy4KZG5sCmRubCAtLWVuYWJsZS1zamxqLWV4Y2VwdGlvbnMgZm9yY2VzIHRoZSB1c2Ugb2YgYnVpbHRpbiBzZXRqbXAuCmRubCAtLWRpc2FibGUtc2psai1leGNlcHRpb25zIGZvcmNlcyB0aGUgdXNlIG9mIGNhbGwgZnJhbWUgdW53aW5kaW5nLgpkbmwgTmVpdGhlciBvbmUgZm9yY2VzIGFuIGF0dGVtcHQgYXQgZGV0ZWN0aW9uLgpkbmwKZG5sIERlZmluZXM6CmRubCAgX0dMSUJDWFhfU0pMSl9FWENFUFRJT05TIGlmIHRoZSBjb21waWxlciBpcyBjb25maWd1cmVkIGZvciBpdApkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX1NKTEpfRVhDRVBUSU9OU10sIFsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBleGNlcHRpb24gbW9kZWwgdG8gdXNlXSkKICBBQ19MQU5HX1NBVkUKICBBQ19MQU5HX0NQTFVTUExVUwogIEdMSUJDWFhfRU5BQkxFKHNqbGotZXhjZXB0aW9ucyxhdXRvLCwKICAgIFtmb3JjZSB1c2Ugb2YgYnVpbHRpbl9zZXRqbXAgZm9yIGV4Y2VwdGlvbnNdLAogICAgW3Blcm1pdCB5ZXN8bm98YXV0b10pCgogIGlmIHRlc3QgJGVuYWJsZV9zamxqX2V4Y2VwdGlvbnMgPSBhdXRvOyB0aGVuCiAgICAjIEJvdGhlcmF0aW9uLiAgTm93IHdlJ3ZlIGdvdCB0byBkZXRlY3QgdGhlIGV4Y2VwdGlvbiBtb2RlbC4gIExpbmsgdGVzdHMKICAgICMgYWdhaW5zdCBsaWJnY2MuYSBhcmUgcHJvYmxlbWF0aWMgc2luY2Ugd2UndmUgbm90IGJlZW4gZ2l2ZW4gcHJvcGVyIC1MCiAgICAjIGJpdHMgZm9yIHNpbmdsZS10cmVlIG5ld2xpYiBhbmQgbGliZ2xvc3MuCiAgICAjCiAgICAjIEZha2Ugd2hhdCBBQ19UUllfQ09NUElMRSBkb2VzLiAgWFhYIExvb2sgYXQgcmVkb2luZyB0aGlzIG5ldy1zdHlsZS4KICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GClsjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiCnN0cnVjdCBTIHsgflMoKTsgfTsKdm9pZCBiYXIoKTsKdm9pZCBmb28oKQp7CiAgUyBzOwogIGJhcigpOwp9CkVPRgogICAgb2xkX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCiAgICBDWFhGTEFHUz0tUwogICAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KICAgICAgaWYgZ3JlcCBfVW53aW5kX1NqTGpfUmVzdW1lIGNvbmZ0ZXN0LnMgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgogICAgICAgIGVuYWJsZV9zamxqX2V4Y2VwdGlvbnM9eWVzCiAgICAgIGVsaWYgZ3JlcCBfVW53aW5kX1Jlc3VtZSBjb25mdGVzdC5zID4vZGV2L251bGwgMj4mMSA7IHRoZW4KICAgICAgICBlbmFibGVfc2psal9leGNlcHRpb25zPW5vCiAgICAgIGVsaWYgZ3JlcCBfX2N4YV9lbmRfY2xlYW51cCBjb25mdGVzdC5zID4vZGV2L251bGwgMj4mMSA7IHRoZW4KICAgICAgICBlbmFibGVfc2psal9leGNlcHRpb25zPW5vCiAgICAgIGZpCiAgICBmaQogICAgQ1hYRkxBR1M9IiRvbGRfQ1hYRkxBR1MiCiAgICBybSAtZiBjb25mdGVzdCoKICBmaQoKICAjIFRoaXMgaXMgYSB0YWQgd2VpcmQsIGZvciBoeXN0ZXJpY2FsIHJhaXNpbnMuICBXZSBoYXZlIHRvIG1hcAogICMgZW5hYmxlL2Rpc2FibGUgdG8gdHdvIGRpZmZlcmVudCBtb2RlbHMuCiAgY2FzZSAkZW5hYmxlX3NqbGpfZXhjZXB0aW9ucyBpbgogICAgeWVzKQogICAgICBBQ19ERUZJTkUoX0dMSUJDWFhfU0pMSl9FWENFUFRJT05TLCAxLAogICAgICAgIFtEZWZpbmUgaWYgdGhlIGNvbXBpbGVyIGlzIGNvbmZpZ3VyZWQgZm9yIHNldGptcC9sb25nam1wIGV4Y2VwdGlvbnMuXSkKICAgICAgYWNfZXhjZXB0aW9uX21vZGVsX25hbWU9c2psagogICAgICA7OwogICAgbm8pCiAgICAgIGFjX2V4Y2VwdGlvbl9tb2RlbF9uYW1lPSJjYWxsIGZyYW1lIgogICAgICA7OwogICAgKikKICAgICAgQUNfTVNHX0VSUk9SKFt1bmFibGUgdG8gZGV0ZWN0IGV4Y2VwdGlvbiBtb2RlbF0pCiAgICAgIDs7CiAgZXNhYwogQUNfTEFOR19SRVNUT1JFCiBBQ19NU0dfUkVTVUxUKCRhY19leGNlcHRpb25fbW9kZWxfbmFtZSkKXSkKCgpkbmwKZG5sIEFsbG93IHZpc2liaWxpdHkgYXR0cmlidXRlcyB0byBiZSB1c2VkIG9uIG5hbWVzcGFjZXMsIG9iamVjdHMsIGV0Yy4KZG5sCmRubCAtLWVuYWJsZS12aXNpYmlsaXR5IGVuYWJsZXMgYXR0ZW1wdCB0byB1c2UgdmlzaWJpbGl0eSBhdHRyaWJ1dGVzLgpkbmwgLS1kaXNhYmxlLXZpc2liaWxpdHkgdHVybnMgb2ZmIGFsbCB1c2Ugb2YgdmlzaWJpbGl0eSBhdHRyaWJ1dGVzLgpkbmwgICsgIFVzYWdlOiAgR0xJQkNYWF9FTkFCTEVfVklTSUJJTElUWVsoREVGQVVMVCldCmRubCAgICAgICBXaGVyZSBERUZBVUxUIGlzICd5ZXMnLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX1ZJU0lCSUxJVFldLCBbCkdMSUJDWFhfRU5BQkxFKHZpc2liaWxpdHksJDEsLFtlbmFibGVzIHZpc2liaWxpdHkgc2FmZSB1c2FnZV0pCgppZiB0ZXN0IHgkZW5hYmxlX3Zpc2liaWxpdHkgPSB4eWVzIDsgdGhlbgogIGRubCBhbGwgaGFpbCBsaWJnZm9ydHJhbgogIGRubCBDaGVjayB3aGV0aGVyIHRoZSB0YXJnZXQgc3VwcG9ydHMgaGlkZGVuIHZpc2liaWxpdHkuCiAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIHRhcmdldCBzdXBwb3J0cyBoaWRkZW4gdmlzaWJpbGl0eV0sCgkJIGhhdmVfYXR0cmlidXRlX3Zpc2liaWxpdHksIFsKICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKICBDRkxBR1M9IiRDRkxBR1MgLVdlcnJvciIKICBBQ19UUllfQ09NUElMRShbdm9pZCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpIGZvbyh2b2lkKSB7IH1dLAoJCSBbXSwgaGF2ZV9hdHRyaWJ1dGVfdmlzaWJpbGl0eT15ZXMsCgkJIGhhdmVfYXR0cmlidXRlX3Zpc2liaWxpdHk9bm8pCiAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiXSkKICBpZiB0ZXN0ICRoYXZlX2F0dHJpYnV0ZV92aXNpYmlsaXR5ID0gbm87IHRoZW4KICAgIGVuYWJsZV92aXNpYmlsaXR5PW5vCiAgZmkKZmkKCkdMSUJDWFhfQ09ORElUSU9OQUwoRU5BQkxFX1ZJU0lCSUxJVFksIHRlc3QgJGVuYWJsZV92aXNpYmlsaXR5ID0geWVzKQpBQ19NU0dfTk9USUNFKFt2aXNpYmlsaXR5IHN1cHBvcnRlZDogJGVuYWJsZV92aXNpYmlsaXR5XSkKXSkKCgpkbmwKZG5sIEFkZCB2ZXJzaW9uIHRhZ3MgdG8gc3ltYm9scyBpbiBzaGFyZWQgbGlicmFyeSAob3Igbm90KSwgYWRkaXRpb25hbGx5CmRubCBtYXJraW5nIG90aGVyIHN5bWJvbHMgYXMgcHJpdmF0ZS9sb2NhbCAob3Igbm90KS4KZG5sCmRubCAtLWVuYWJsZS1zeW12ZXJzPXN0eWxlIGFkZHMgYSB2ZXJzaW9uIHNjcmlwdCB0byB0aGUgbGlua2VyIGNhbGwgd2hlbgpkbmwgICAgICAgY3JlYXRpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgVGhlIGNob2ljZSBvZiB2ZXJzaW9uIHNjcmlwdCBpcwpkbmwgICAgICAgY29udHJvbGxlZCBieSAnc3R5bGUnLgpkbmwgLS1kaXNhYmxlLXN5bXZlcnMgZG9lcyBub3QuCmRubCAgKyAgVXNhZ2U6ICBHTElCQ1hYX0VOQUJMRV9TWU1WRVJTWyhERUZBVUxUKV0KZG5sICAgICAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyICd5ZXMnIG9yICdubycuICBQYXNzaW5nIGB5ZXMnIHRyaWVzIHRvCmRubCAgICAgICBjaG9vc2UgYSBkZWZhdWx0IHN0eWxlIGJhc2VkIG9uIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuICBQYXNzaW5nCmRubCAgICAgICAnbm8nIGRpc2FibGVzIHZlcnNpb25pbmcuCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfU1lNVkVSU10sIFsKCkdMSUJDWFhfRU5BQkxFKHN5bXZlcnMsJDEsWz1TVFlMRV0sCiAgW2VuYWJsZXMgc3ltYm9sIHZlcnNpb25pbmcgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5XSwKICBbcGVybWl0IHllc3xub3xnbnV8Z251LXZlcnNpb25lZC1uYW1lc3BhY2V8ZGFyd2lufGRhcndpbi1leHBvcnRdKQoKIyBJZiB3ZSBuZXZlciB3ZW50IHRocm91Z2ggdGhlIEdMSUJDWFhfQ0hFQ0tfTElOS0VSX0ZFQVRVUkVTIG1hY3JvLCB0aGVuIHdlCiMgZG9uJ3Qga25vdyBlbm91Z2ggYWJvdXQgJExEIHRvIGRvIHRyaWNrcy4uLgpBQ19SRVFVSVJFKFtHTElCQ1hYX0NIRUNLX0xJTktFUl9GRUFUVVJFU10pCgojIFR1cm4gYSAneWVzJyBpbnRvIGEgc3VpdGFibGUgZGVmYXVsdC4KaWYgdGVzdCB4JGVuYWJsZV9zeW12ZXJzID0geHllcyA7IHRoZW4KICBpZiB0ZXN0ICRlbmFibGVfc2hhcmVkID0gbm8gfHwgdGVzdCAieCRMRCIgPSB4IHx8IHRlc3QgeCRnY2Nfbm9fbGluayA9IHh5ZXM7IHRoZW4KICAgIGVuYWJsZV9zeW12ZXJzPW5vCiAgZWxzZQogICAgaWYgdGVzdCAkd2l0aF9nbnVfbGQgPSB5ZXMgOyB0aGVuCiAgICAgIGVuYWJsZV9zeW12ZXJzPWdudQogICAgZWxzZQogICAgICBjYXNlICR7dGFyZ2V0X29zfSBpbgogICAgICAgIGRhcndpbiopCgkgIGVuYWJsZV9zeW12ZXJzPWRhcndpbiA7OwogICAgICAgICopCiAgICAgICAgICBlbmFibGVfc3ltdmVycz1ubyA7OwogICAgICBlc2FjCiAgICBmaQogIGZpCmZpCgojIENoZWNrIHRvIHNlZSBpZiAnZGFyd2luJyBvciAnZGFyd2luLWV4cG9ydCcgY2FuIHdpbi4KaWYgdGVzdCB4JGVuYWJsZV9zeW12ZXJzID0geGRhcndpbi1leHBvcnQgOyB0aGVuCiAgICBlbmFibGVfc3ltdmVycz1kYXJ3aW4KZmkKCiMgQ2hlY2sgdG8gc2VlIGlmICdnbnUnIGNhbiB3aW4uCmlmIHRlc3QgJGVuYWJsZV9zeW12ZXJzID0gZ251IHx8IHRlc3QgJGVuYWJsZV9zeW12ZXJzID0gZ251LXZlcnNpb25lZC1uYW1lc3BhY2U7IHRoZW4KICAjIENoZWNrIHRvIHNlZSBpZiBsaWJnY2NfcyBleGlzdHMsIGluZGljYXRpbmcgdGhhdCBzaGFyZWQgbGliZ2NjIGlzIHBvc3NpYmxlLgogIEFDX01TR19DSEVDS0lORyhbZm9yIHNoYXJlZCBsaWJnY2NdKQogIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgogIENGTEFHUz0nIC1sZ2NjX3MnCiAgQUNfVFJZX0xJTksoLCBbcmV0dXJuIDA7XSwgZ2xpYmN4eF9zaGFyZWRfbGliZ2NjPXllcywgZ2xpYmN4eF9zaGFyZWRfbGliZ2NjPW5vKQogIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgogIGlmIHRlc3QgJGdsaWJjeHhfc2hhcmVkX2xpYmdjYyA9IG5vOyB0aGVuCiAgICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCmludCBtYWluICh2b2lkKSB7IHJldHVybiAwOyB9CkVPRgpjaGFuZ2VxdW90ZSgsKWRubAogICAgZ2xpYmN4eF9saWJnY2Nfc19zdWZmaXg9YCR7Q0MtY2N9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIFwKCQkJICAgICAtc2hhcmVkIC1zaGFyZWQtbGliZ2NjIC1vIGNvbmZ0ZXN0LnNvIFwKCQkJICAgICBjb25mdGVzdC5jIC12IDI+JjEgPi9kZXYvbnVsbCBcCgkJCSAgICAgfCBzZWQgLW4gJ3MvXi4qIC1sZ2NjX3NcKFteIF0qXCkgLiokL1wxL3AnYApjaGFuZ2VxdW90ZShbLF0pZG5sCiAgICBybSAtZiBjb25mdGVzdC5jIGNvbmZ0ZXN0LnNvCiAgICBpZiB0ZXN0IHgke2dsaWJjeHhfbGliZ2NjX3Nfc3VmZml4K3NldH0gPSB4c2V0OyB0aGVuCiAgICAgIENGTEFHUz0iIC1sZ2NjX3MkZ2xpYmN4eF9saWJnY2Nfc19zdWZmaXgiCiAgICAgIEFDX1RSWV9MSU5LKCwgW3JldHVybiAwO10sIGdsaWJjeHhfc2hhcmVkX2xpYmdjYz15ZXMpCiAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgogICAgZmkKICBmaQogIEFDX01TR19SRVNVTFQoJGdsaWJjeHhfc2hhcmVkX2xpYmdjYykKCiAgIyBGb3IgR05VIGxkLCB3ZSBuZWVkIGF0IGxlYXN0IHRoaXMgdmVyc2lvbi4gIFRoZSBmb3JtYXQgaXMgZGVzY3JpYmVkIGluCiAgIyBHTElCQ1hYX0NIRUNLX0xJTktFUl9GRUFUVVJFUyBhYm92ZS4KICBnbGliY3h4X21pbl9nbnVfbGRfdmVyc2lvbj0yMTQwMAoKICAjIElmIG5vIHNoYXJlZCBsaWJnY2MsIGNhbid0IHdpbi4KICBpZiB0ZXN0ICRnbGliY3h4X3NoYXJlZF9saWJnY2MgIT0geWVzOyB0aGVuCiAgICAgIEFDX01TR19XQVJOKFs9PT0gWW91IGhhdmUgcmVxdWVzdGVkIEdOVSBzeW1ib2wgdmVyc2lvbmluZywgYnV0XSkKICAgICAgQUNfTVNHX1dBUk4oWz09PSB5b3UgYXJlIG5vdCBidWlsZGluZyBhIHNoYXJlZCBsaWJnY2Nfcy5dKQogICAgICBBQ19NU0dfV0FSTihbPT09IFN5bWJvbCB2ZXJzaW9uaW5nIHdpbGwgYmUgZGlzYWJsZWQuXSkKICAgICAgZW5hYmxlX3N5bXZlcnM9bm8KICBlbGlmIHRlc3QgJHdpdGhfZ251X2xkICE9IHllcyA7IHRoZW4KICAgICMganVzdCBmYWlsIGZvciBub3cKICAgIEFDX01TR19XQVJOKFs9PT0gWW91IGhhdmUgcmVxdWVzdGVkIEdOVSBzeW1ib2wgdmVyc2lvbmluZywgYnV0XSkKICAgIEFDX01TR19XQVJOKFs9PT0geW91IGFyZSBub3QgdXNpbmcgdGhlIEdOVSBsaW5rZXIuXSkKICAgIEFDX01TR19XQVJOKFs9PT0gU3ltYm9sIHZlcnNpb25pbmcgd2lsbCBiZSBkaXNhYmxlZC5dKQogICAgZW5hYmxlX3N5bXZlcnM9bm8KICBlbGlmIHRlc3QgJGdsaWJjeHhfZ251X2xkX3ZlcnNpb24gLWx0ICRnbGliY3h4X21pbl9nbnVfbGRfdmVyc2lvbiA7IHRoZW4KICAgICMgVGhlIHJpZ2h0IHRvb2xzLCB0aGUgcmlnaHQgc2V0dXAsIGJ1dCB0b28gb2xkLiAgRmFsbGJhY2tzPwogICAgQUNfTVNHX1dBUk4oPT09IExpbmtlciB2ZXJzaW9uICRnbGliY3h4X2dudV9sZF92ZXJzaW9uIGlzIHRvbyBvbGQgZm9yKQogICAgQUNfTVNHX1dBUk4oPT09IGZ1bGwgc3ltYm9sIHZlcnNpb25pbmcgc3VwcG9ydCBpbiB0aGlzIHJlbGVhc2Ugb2YgR0NDLikKICAgIEFDX01TR19XQVJOKD09PSBZb3Ugd291bGQgbmVlZCB0byB1cGdyYWRlIHlvdXIgYmludXRpbHMgdG8gdmVyc2lvbikKICAgIEFDX01TR19XQVJOKD09PSAkZ2xpYmN4eF9taW5fZ251X2xkX3ZlcnNpb24gb3IgbGF0ZXIgYW5kIHJlYnVpbGQgR0NDLikKICAgIEFDX01TR19XQVJOKFs9PT0gU3ltYm9sIHZlcnNpb25pbmcgd2lsbCBiZSBkaXNhYmxlZC5dKQogICAgZW5hYmxlX3N5bXZlcnM9bm8KICBmaQpmaQoKIyBFdmVyeXRoaW5nIHBhcnNlZDsgZmlndXJlIG91dCB3aGF0IGZpbGUgdG8gdXNlLgpjYXNlICRlbmFibGVfc3ltdmVycyBpbgogIG5vKQogICAgU1lNVkVSX0ZJTEU9Y29uZmlnL2FiaS9wcmUvbm9uZS52ZXIKICAgIDs7CiAgZ251KQogICAgU1lNVkVSX0ZJTEU9Y29uZmlnL2FiaS9wcmUvZ251LnZlcgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1NZTVZFUl9HTlUsIDEsIAogICAgICAgICAgICAgIFtEZWZpbmUgdG8gdXNlIEdOVSB2ZXJzaW9uaW5nIGluIHRoZSBzaGFyZWQgbGlicmFyeS5dKQogICAgOzsKICBnbnUtdmVyc2lvbmVkLW5hbWVzcGFjZSkKICAgIFNZTVZFUl9GSUxFPWNvbmZpZy9hYmkvcHJlL2dudS12ZXJzaW9uZWQtbmFtZXNwYWNlLnZlcgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1NZTVZFUl9HTlVfTkFNRVNQQUNFLCAxLCAKICAgICAgICAgICAgICBbRGVmaW5lIHRvIHVzZSBHTlUgbmFtZXNwYWNlIHZlcnNpb25pbmcgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5Ll0pCiAgICA7OwogIGRhcndpbikKICAgIFNZTVZFUl9GSUxFPWNvbmZpZy9hYmkvcHJlL2dudS52ZXIKICAgIEFDX0RFRklORShfR0xJQkNYWF9TWU1WRVJfREFSV0lOLCAxLCAKICAgICAgICAgICAgICBbRGVmaW5lIHRvIHVzZSBkYXJ3aW4gdmVyc2lvbmluZyBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuXSkKICAgIDs7CmVzYWMKCmlmIHRlc3QgeCRlbmFibGVfc3ltdmVycyAhPSB4bm8gOyB0aGVuCiAgQUNfREVGSU5FKF9HTElCQ1hYX1NZTVZFUiwgMSwKCSBbRGVmaW5lIHRvIHVzZSBzeW1ib2wgdmVyc2lvbmluZyBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuXSkKZmkKCkFDX1NVQlNUKFNZTVZFUl9GSUxFKQpBQ19TVUJTVChwb3J0X3NwZWNpZmljX3N5bWJvbF9maWxlcykKR0xJQkNYWF9DT05ESVRJT05BTChFTkFCTEVfU1lNVkVSUywgdGVzdCAkZW5hYmxlX3N5bXZlcnMgIT0gbm8pCkdMSUJDWFhfQ09ORElUSU9OQUwoRU5BQkxFX1NZTVZFUlNfR05VLCB0ZXN0ICRlbmFibGVfc3ltdmVycyA9IGdudSkKR0xJQkNYWF9DT05ESVRJT05BTChFTkFCTEVfU1lNVkVSU19HTlVfTkFNRVNQQUNFLCB0ZXN0ICRlbmFibGVfc3ltdmVycyA9IGdudS12ZXJzaW9uZWQtbmFtZXNwYWNlKQpHTElCQ1hYX0NPTkRJVElPTkFMKEVOQUJMRV9TWU1WRVJTX0RBUldJTiwgdGVzdCAkZW5hYmxlX3N5bXZlcnMgPSBkYXJ3aW4pCkFDX01TR19OT1RJQ0UodmVyc2lvbmluZyBvbiBzaGFyZWQgbGlicmFyeSBzeW1ib2xzIGlzICRlbmFibGVfc3ltdmVycykKCiMgTm93LCBzZXQgdXAgY29tcGF0aWJpbGl0eSBzdXBwb3J0LCBpZiBhbnkuCiMgSW4gYWRkaXRpb24sIG5lZWQgdGhpcyB0byBkZWFsIHdpdGggc3RkOjpzaXplX3QgbWFuZ2xpbmcgaW4KIyBzcmMvY29tcGF0aWJpbGl0eS5jYy4gIEluIGEgcGVyZmVjdCB3b3JsZCwgY291bGQgdXNlCiMgdHlwZWlkKHN0ZDo6c2l6ZV90KS5uYW1lKClbMF0gdG8gZG8gZGlyZWN0IHN1YnN0aXR1dGlvbi4KQUNfTVNHX0NIRUNLSU5HKFtmb3Igc2l6ZV90IGFzIHVuc2lnbmVkIGludF0pCmFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgpDRkxBR1M9Ii1XZXJyb3IiCkFDX1RSWV9DT01QSUxFKCwgW19fU0laRV9UWVBFX18qIHN0cDsgdW5zaWduZWQgaW50KiB1aXA7IHN0cCA9IHVpcDtdLCAKCSAgICAgICAgIFtnbGliY3h4X3NpemVfdF9pc19pPXllc10sIFtnbGliY3h4X3NpemVfdF9pc19pPW5vXSkKQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUwppZiB0ZXN0ICIkZ2xpYmN4eF9zaXplX3RfaXNfaSIgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoX0dMSUJDWFhfU0laRV9UX0lTX1VJTlQsIDEsIFtEZWZpbmUgaWYgc2l6ZV90IGlzIHVuc2lnbmVkIGludC5dKQpmaQpBQ19NU0dfUkVTVUxUKFskZ2xpYmN4eF9zaXplX3RfaXNfaV0pCgpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBwdHJkaWZmX3QgYXMgaW50XSkKYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCkNGTEFHUz0iLVdlcnJvciIKQUNfVFJZX0NPTVBJTEUoLCBbX19QVFJESUZGX1RZUEVfXyogcHRwOyBpbnQqIGlwOyBwdHAgPSBpcDtdLCAKCSAgICAgICAgIFtnbGliY3h4X3B0cmRpZmZfdF9pc19pPXllc10sIFtnbGliY3h4X3B0cmRpZmZfdF9pc19pPW5vXSkKQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUwppZiB0ZXN0ICIkZ2xpYmN4eF9wdHJkaWZmX3RfaXNfaSIgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoX0dMSUJDWFhfUFRSRElGRl9UX0lTX0lOVCwgMSwgW0RlZmluZSBpZiBwdHJkaWZmX3QgaXMgaW50Ll0pCmZpCkFDX01TR19SRVNVTFQoWyRnbGliY3h4X3B0cmRpZmZfdF9pc19pXSkKXSkKCgpkbmwKZG5sIFNldHVwIHRvIHVzZSB0aGUgZ2NjIGd0aHIuaCB0aHJlYWQtc3BlY2lmaWMgbWVtb3J5IGFuZCBtdXRleCBtb2RlbC4KZG5sIFdlIG11c3Qgc3RhZ2UgdGhlIHJlcXVpcmVkIGhlYWRlcnMgc28gdGhhdCB0aGV5IHdpbGwgYmUgaW5zdGFsbGVkCmRubCB3aXRoIHRoZSBsaWJyYXJ5ICh1bmxpa2UgbGliZ2NjLCB0aGUgU1RMIGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkCmRubCBzb2xlbHkgd2l0aGluIGhlYWRlcnMpLiAgU2luY2Ugd2UgbXVzdCBub3QgaW5qZWN0IHJhbmRvbSB1c2VyLXNwYWNlCmRubCBtYWNybyBuYW1lcyBpbnRvIHVzZXItcHJvdmlkZWQgQysrIGNvZGUsIHdlIGZpcnN0IHN0YWdlIGludG8gPGZpbGU+LWluCmRubCBhbmQgcHJvY2VzcyB0byA8ZmlsZT4gd2l0aCBhbiBvdXRwdXQgY29tbWFuZC4gIFRoZSByZWFzb24gZm9yIGEgdHdvLQpkbmwgc3RhZ2UgcHJvY2VzcyBoZXJlIGlzIHRvIGNvcnJlY3RseSBoYW5kbGUgJHNyY2RpciE9JG9iamRpciB3aXRob3V0CmRubCBoYXZpbmcgdG8gd3JpdGUgY29tcGxleCBjb2RlICh0aGUgc2VkIGNvbW1hbmRzIHRvIGNsZWFuIHRoZSBtYWNybwpkbmwgbmFtZXNwYWNlIGFyZSBjb21wbGV4IGFuZCBmcmFnaWxlIGVub3VnaCBhcyBpdCBpcykuICBXZSBtdXN0IGFsc28KZG5sIGFkZCBhIHJlbGF0aXZlIHBhdGggc28gdGhhdCAtSS0gaXMgc3VwcG9ydGVkIHByb3Blcmx5LgpkbmwKZG5sIFN1YnN0czoKZG5sICBnbGliY3h4X3RocmVhZF9oCmRubApkbmwgRGVmaW5lczoKZG5sICBIQVZFX0dUSFJfREVGQVVMVApkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX1RIUkVBRFNdLCBbCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgdGhyZWFkIG1vZGVsIHVzZWQgYnkgR0NDXSkKICB0YXJnZXRfdGhyZWFkX2ZpbGU9YCRDWFggLXYgMj4mMSB8IHNlZCAtbiAncy9eVGhyZWFkIG1vZGVsOiAvL3AnYAogIEFDX01TR19SRVNVTFQoWyR0YXJnZXRfdGhyZWFkX2ZpbGVdKQoKICBpZiB0ZXN0ICR0YXJnZXRfdGhyZWFkX2ZpbGUgIT0gc2luZ2xlOyB0aGVuCiAgICBBQ19ERUZJTkUoSEFWRV9HVEhSX0RFRkFVTFQsIDEsCiAgICAgICAgICAgICAgW0RlZmluZSBpZiBndGhyLWRlZmF1bHQuaCBleGlzdHMgCiAgICAgICAgICAgICAgKG1lYW5pbmcgdGhhdCB0aHJlYWRpbmcgc3VwcG9ydCBpcyBlbmFibGVkKS5dKQogIGZpCgogIGdsaWJjeHhfdGhyZWFkX2g9Z3Roci0kdGFyZ2V0X3RocmVhZF9maWxlLmgKCiAgZG5sIENoZWNrIGZvciBfX0dUSFJFQURTIGRlZmluZS4KICBndGhyZWFkX2ZpbGU9JHt0b3BsZXZlbF9zcmNkaXJ9L2djYy8ke2dsaWJjeHhfdGhyZWFkX2h9CiAgaWYgZ3JlcCBfX0dUSFJFQURTICRndGhyZWFkX2ZpbGUgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgogICAgZW5hYmxlX3RocmVhZD15ZXMKICBlbHNlCiAgIGVuYWJsZV90aHJlYWQ9bm8KICBmaQoKICBBQ19TVUJTVChnbGliY3h4X3RocmVhZF9oKQpdKQoKCiMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KIwojIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgojIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCkFDX0RFRlVOKFtBQ19MQ19NRVNTQUdFU10sIFsKICBBQ19DSEVDS19IRUFERVIobG9jYWxlLmgsIFsKICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhY19jdl92YWxfTENfTUVTU0FHRVMsCiAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAogICAgICAgYWNfY3ZfdmFsX0xDX01FU1NBR0VTPXllcywgYWNfY3ZfdmFsX0xDX01FU1NBR0VTPW5vKV0pCiAgICBpZiB0ZXN0ICRhY19jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsIAogICAgICAgICAgICAgICAgW0RlZmluZSBpZiBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi5dKQogICAgZmkKICBdKQpdKQoKIyBNYWNyb3MgZnJvbSB0aGUgdG9wLWxldmVsIGdjYyBkaXJlY3RvcnkuCm00X2luY2x1ZGUoWy4uL2NvbmZpZy90bHMubTRdKQoK