LyoKICogd2xhbi5oIC0gQ0MzMXh4L0NDMzJ4eCBIb3N0IERyaXZlciBJbXBsZW1lbnRhdGlvbgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20vIAogKiAKICogCiAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCiAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgCiAqICBhcmUgbWV0OgogKgogKiAgICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAgICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIAogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgICAKICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAgICBOZWl0aGVyIHRoZSBuYW1lIG9mIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCBub3IgdGhlIG5hbWVzIG9mCiAqICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAKICogICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIAogKiAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCiAqICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCAKICogIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCAKICogIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCiAqICBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSAKICogIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqCiovCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogSW5jbHVkZSBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpbmNsdWRlIDx0aS9kcml2ZXJzL25ldC93aWZpL3NpbXBsZWxpbmsuaD4KCiNpZm5kZWYgX19XTEFOX0hfXwojZGVmaW5lIF9fV0xBTl9IX18KCgojaWZkZWYgICAgX19jcGx1c3BsdXMKZXh0ZXJuICJDIiB7CiNlbmRpZgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogTWFjcm8gZGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQoJXGRlZmdyb3VwIFdsYW4gCglcc2hvcnQgQ29udHJvbHMgdGhlIHVzZSBvZiB0aGUgV2lGaSBXTEFOIG1vZHVsZQoKKi8KLyohCgogICAgXGFkZHRvZ3JvdXAgV2xhbgogICAgLSBDb25uZWN0aW9uIGZlYXR1cmVzLCBzdWNoIGFzOiBwcm9maWxlcywgcG9saWNpZXMsIFNtYXJ0Q29uZmlnKHRtKQogICAgLSBBZHZhbmNlZCBXTEFOIGZlYXR1cmVzLCBzdWNoIGFzOiBzY2FucywgcnggZmlsdGVycyBhbmQgcnggc3RhdGlzdGljcyBjb2xsZWN0aW9uCgogICAgQHsKCiovCgojZGVmaW5lIFNMX1dMQU5fQlNTSURfTEVOR1RIICAgICAgICAgICAgICAgICAgICAoNikKI2RlZmluZSBTTF9XTEFOX1NTSURfTUFYX0xFTkdUSCAgICAgICAgICAgICAgICAgKDMyKQoKI2RlZmluZSBTTF9XTEFOX05VTV9PRl9SQVRFX0lOREVYRVMgICAgICAgICAgICAgKDIwKQojZGVmaW5lIFNMX1dMQU5fU0laRV9PRl9SU1NJX0hJU1RPR1JBTSAgICAgICAgICAoNikKI2RlZmluZSBTTF9XTEFOX1NNQVJUX0NPTkZJR19LRVlfTEVOR1RIICAgICAgICAgKDE2KQojZGVmaW5lIFNMX1dMQU5fU01BUlRfQ09ORklHX0RFRkFVTFRfQ0lQSEVSICAgICAoMSkKI2RlZmluZSBTTF9XTEFOX1NNQVJUX0NPTkZJR19ERUZBVUxUX0dST1VQICAgICAgKDApCgojZGVmaW5lIFNMX1dMQU5fTUFYX1BST0ZJTEVTCQkJCQkoNykKI2RlZmluZSBTTF9XTEFOX0RFTF9BTExfUFJPRklMRVMJICAgICAgICAgICAgKDI1NSkKCnR5cGVkZWYgZW51bQp7CiAgICBTTF9XTEFOX1AyUF9XUFNfTUVUSE9EX0RFRkFVTFQsCiAgICBTTF9XTEFOX1AyUF9XUFNfTUVUSE9EX1BJTl9VU0VSLAogICAgU0xfV0xBTl9QMlBfV1BTX01FVEhPRF9QSU5fTUFDSElORSwKICAgIFNMX1dMQU5fUDJQX1dQU19NRVRIT0RfUkVLRVksCiAgICBTTF9XTEFOX1AyUF9XUFNfTUVUSE9EX1BCQywKICAgIFNMX1dMQU5fUDJQX1dQU19NRVRIT0RfUkVHSVNUUkFSCn0gU2xXbGFuUDJQV3BzTWV0aG9kX2U7CgovKiBXTEFOIHVzZXIgZXZlbnRzICovCnR5cGVkZWYgZW51bQp7CiAgICBTTF9XTEFOX0VWRU5UX0NPTk5FQ1QgPSAxLAogICAgU0xfV0xBTl9FVkVOVF9ESVNDT05ORUNULAogICAgU0xfV0xBTl9FVkVOVF9TVEFfQURERUQsCiAgICBTTF9XTEFOX0VWRU5UX1NUQV9SRU1PVkVELAoKICAgIFNMX1dMQU5fRVZFTlRfUDJQX0NPTk5FQ1QsCiAgICBTTF9XTEFOX0VWRU5UX1AyUF9ESVNDT05ORUNULAogICAgU0xfV0xBTl9FVkVOVF9QMlBfQ0xJRU5UX0FEREVELAogICAgU0xfV0xBTl9FVkVOVF9QMlBfQ0xJRU5UX1JFTU9WRUQsCiAgICBTTF9XTEFOX0VWRU5UX1AyUF9ERVZGT1VORCwKICAgIFNMX1dMQU5fRVZFTlRfUDJQX1JFUVVFU1QsCiAgICBTTF9XTEFOX0VWRU5UX1AyUF9DT05ORUNURkFJTCwKCiAgICBTTF9XTEFOX0VWRU5UX1JYRklMVEVSLAogICAgU0xfV0xBTl9FVkVOVF9QUk9WSVNJT05JTkdfU1RBVFVTLAogICAgU0xfV0xBTl9FVkVOVF9QUk9WSVNJT05JTkdfUFJPRklMRV9BRERFRCwKICAgIFNMX1dMQU5fRVZFTlRfTUFYCgp9IFNsV2xhbkV2ZW50SWRfZTsKCgovKiBXTEFOIERpc2Nvbm5lY3QgUmVhc29uIENvZGVzICovCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9VTlNQRUNJRklFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEpCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9BVVRIX05PX0xPTkdFUl9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIpCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9ERUFVVEhfU0VORElOR19TVEFfTEVBVklORyAgICAgICAgICAgICAgICAgICAgICAgICAgKDMpCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9JTkFDVElWSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDQpCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9UT09fTUFOWV9TVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUpCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9GUkFNRV9GUk9NX05PTkFVVEhfU1RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDYpCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9GUkFNRV9GUk9NX05PTkFTU09DX1NUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDcpCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9ESVNTX1NFTkRJTkdfU1RBX0xFQVZJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDgpCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9TVEFfTk9UX0FVVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDkpCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9QT1dFUl9DQVBBQklMSVRZX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwKQojZGVmaW5lICBTTF9XTEFOX0RJU0NPTk5FQ1RfU1VQUE9SVEVEX0NIQU5ORUxTX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICgxMSkKI2RlZmluZSAgU0xfV0xBTl9ESVNDT05ORUNUX0lOVkFMSURfSUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTMpCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9NSUNfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE0KQojZGVmaW5lICBTTF9XTEFOX0RJU0NPTk5FQ1RfRk9VUldBWV9IQU5EU0hBS0VfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICgxNSkKI2RlZmluZSAgU0xfV0xBTl9ESVNDT05ORUNUX0dST1VQS0VZX0hBTkRTSEFLRV9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAoMTYpCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9SRUFTU09DX0lOVkFMSURfSUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE3KQojZGVmaW5lICBTTF9XTEFOX0RJU0NPTk5FQ1RfSU5WQUxJRF9HUk9VUF9DSVBIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOCkKI2RlZmluZSAgU0xfV0xBTl9ESVNDT05ORUNUX0lOVkFMSURfUEFJUldJU0VfQ0lQSEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkpCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9JTlZBTElEX0FLTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIwKQojZGVmaW5lICBTTF9XTEFOX0RJU0NPTk5FQ1RfVU5TVVBQT1JURURfUlNOX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyMSkKI2RlZmluZSAgU0xfV0xBTl9ESVNDT05ORUNUX0lOVkFMSURfUlNOX0NBUEFCSUxJVElFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMjIpCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9JRUVFXzgwMl8xWF9BVVRIRU5USUNBVElPTl9GQUlMRUQgICAgICAgICAgICAgICAgICAgKDIzKQojZGVmaW5lICBTTF9XTEFOX0RJU0NPTk5FQ1RfQ0lQSEVSX1NVSVRFX1JFSkVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyNCkKI2RlZmluZSAgU0xfV0xBTl9ESVNDT05ORUNUX0RJU0FTU09DX1FPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzIpCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9ESVNBU1NPQ19RT1NfQkFORFdJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMzKQojZGVmaW5lICBTTF9XTEFOX0RJU0NPTk5FQ1RfRElTQVNTT0NfRVhDRVNTSVZFX0FDS19QRU5ESU5HICAgICAgICAgICAgICAgICAgICAgICgzNCkKI2RlZmluZSAgU0xfV0xBTl9ESVNDT05ORUNUX0RJU0FTU09DX1RYT1BfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzUpCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9TVEFfTEVBVklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDM2KQojZGVmaW5lICBTTF9XTEFOX0RJU0NPTk5FQ1RfU1RBX0RFQ0xJTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzNykKI2RlZmluZSAgU0xfV0xBTl9ESVNDT05ORUNUX1NUQV9VTktOT1dOX0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzgpCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9TVEFfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDM5KQojZGVmaW5lICBTTF9XTEFOX0RJU0NPTk5FQ1RfU1RBX1VOU1VQUE9SVEVEX0NJUEhFUl9TVUlURSAgICAgICAgICAgICAgICAgICAgICAgICg0MCkKI2RlZmluZSAgU0xfV0xBTl9ESVNDT05ORUNUX1VTRVJfSU5JVElBVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMjAwKQojZGVmaW5lICBTTF9XTEFOX0RJU0NPTk5FQ1RfQVVUSF9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyMDIpCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9BU1NPQ19USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIwMykKI2RlZmluZSAgU0xfV0xBTl9ESVNDT05ORUNUX1NFQ1VSSVRZX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMjA0KQojZGVmaW5lICBTTF9XTEFOX0RJU0NPTk5FQ1RfV0hJTEVfQ09OTk5FQ1RJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyMDgpCiNkZWZpbmUgIFNMX1dMQU5fRElTQ09OTkVDVF9NSVNTSU5HX0NFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIwOSkKI2RlZmluZSAgU0xfV0xBTl9ESVNDT05ORUNUX0NFUlRJRklDQVRFX0VYUElSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMjEwKQoKCgojZGVmaW5lICBTTF9XTEFOX1NUQVRVU19ESVNDT05ORUNURUQgICAgKDApCiNkZWZpbmUgIFNMX1dMQU5fU1RBVFVTX1NDQU5JTkcgICAgICAgICAoMSkKI2RlZmluZSAgU0xfV0xBTl9TVEFUVVNfQ09OTkVDVElORyAgICAgICgyKQojZGVmaW5lICBTTF9XTEFOX1NUQVRVU19DT05ORUNURUQgICAgICAgKDMpCgojZGVmaW5lIFNMX1dMQU5fUFJPVklTSU9OSU5HX0dFTkVSQUxfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCiNkZWZpbmUgU0xfV0xBTl9QUk9WSVNJT05JTkdfQ09ORklSTUFUSU9OX1NUQVRVU19GQUlMX05FVFdPUktfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSkKI2RlZmluZSBTTF9XTEFOX1BST1ZJU0lPTklOR19DT05GSVJNQVRJT05fU1RBVFVTX0ZBSUxfQ09OTkVDVElPTl9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyKQojZGVmaW5lIFNMX1dMQU5fUFJPVklTSU9OSU5HX0NPTkZJUk1BVElPTl9TVEFUVVNfQ09OTkVDVElPTl9TVUNDRVNTX0lQX05PVF9BQ1FVSVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgKDMpCiNkZWZpbmUgU0xfV0xBTl9QUk9WSVNJT05JTkdfQ09ORklSTUFUSU9OX1NUQVRVU19TVUNDRVNTX0ZFRURCQUNLX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCkKI2RlZmluZSBTTF9XTEFOX1BST1ZJU0lPTklOR19DT05GSVJNQVRJT05fU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1KQojZGVmaW5lIFNMX1dMQU5fUFJPVklTSU9OSU5HX0VSUk9SX0FCT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDYpCiNkZWZpbmUgU0xfV0xBTl9QUk9WSVNJT05JTkdfRVJST1JfQUJPUlRfSU5WQUxJRF9QQVJBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNykKI2RlZmluZSBTTF9XTEFOX1BST1ZJU0lPTklOR19FUlJPUl9BQk9SVF9IVFRQX1NFUlZFUl9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg4KQojZGVmaW5lIFNMX1dMQU5fUFJPVklTSU9OSU5HX0VSUk9SX0FCT1JUX1BST0ZJTEVfTElTVF9GVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDkpCiNkZWZpbmUgU0xfV0xBTl9QUk9WSVNJT05JTkdfRVJST1JfQUJPUlRfUFJPVklTSU9OSU5HX0FMUkVBRFlfU1RBUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTApCiNkZWZpbmUgU0xfV0xBTl9QUk9WSVNJT05JTkdfQVVUT19TVEFSVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTEpCiNkZWZpbmUgU0xfV0xBTl9QUk9WSVNJT05JTkdfU1RPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTIpCiNkZWZpbmUgU0xfV0xBTl9QUk9WSVNJT05JTkdfU01BUlRfQ09ORklHX1NZTkNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTMpCiNkZWZpbmUgU0xfV0xBTl9QUk9WSVNJT05JTkdfU01BUlRfQ09ORklHX1NZTkNfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTQpCiNkZWZpbmUgU0xfV0xBTl9QUk9WSVNJT05JTkdfQ09ORklSTUFUSU9OX1dMQU5fQ09OTkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTUpCiNkZWZpbmUgU0xfV0xBTl9QUk9WSVNJT05JTkdfQ09ORklSTUFUSU9OX0lQX0FDUVVJUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTYpCiNkZWZpbmUgU0xfV0xBTl9QUk9WSVNJT05JTkdfRVhURVJOQUxfQ09ORklHVVJBVElPTl9SRUFEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTcpCgoKCiNkZWZpbmUgU0xfV0xBTl9TRUNfVFlQRV9PUEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKI2RlZmluZSBTTF9XTEFOX1NFQ19UWVBFX1dFUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxKQojZGVmaW5lIFNMX1dMQU5fU0VDX1RZUEVfV1BBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIpIC8qIGRlcHJlY2F0ZWQgKi8KI2RlZmluZSBTTF9XTEFOX1NFQ19UWVBFX1dQQV9XUEEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyKQojZGVmaW5lIFNMX1dMQU5fU0VDX1RZUEVfV1BTX1BCQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMpCiNkZWZpbmUgU0xfV0xBTl9TRUNfVFlQRV9XUFNfUElOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCkKI2RlZmluZSBTTF9XTEFOX1NFQ19UWVBFX1dQQV9FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1KQojZGVmaW5lIFNMX1dMQU5fU0VDX1RZUEVfUDJQX1BCQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDYpCiNkZWZpbmUgU0xfV0xBTl9TRUNfVFlQRV9QMlBfUElOX0tFWVBBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNykKI2RlZmluZSBTTF9XTEFOX1NFQ19UWVBFX1AyUF9QSU5fRElTUExBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg4KQojZGVmaW5lIFNMX1dMQU5fU0VDX1RZUEVfUDJQX1BJTl9BVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDkpIC8qIE5PVCBTdXBwb3J0ZWQgeWV0ICovCiNkZWZpbmUgU0xfV0xBTl9TRUNfVFlQRV9XRVBfU0hBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTApCgoKCiNkZWZpbmUgU0xfVExTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxKQojZGVmaW5lIFNMX01TQ0hBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MCkKI2RlZmluZSBTTF9QU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDIpCiNkZWZpbmUgU0xfVFRMUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxMCkKI2RlZmluZSBTTF9QRUFQMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDIwKQojZGVmaW5lIFNMX1BFQVAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDApCiNkZWZpbmUgU0xfRkFTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg4MCkKCgojZGVmaW5lIFNMX1dMQU5fRkFTVF9BVVRIX1BST1ZJU0lPTklORyAgICAgICAgICAgICAgICAgICAoMHgwMikKI2RlZmluZSBTTF9XTEFOX0ZBU1RfVU5BVVRIX1BST1ZJU0lPTklORyAgICAgICAgICAgICAgICAgKDB4MDEpCiNkZWZpbmUgU0xfV0xBTl9GQVNUX05PX1BST1ZJU0lPTklORyAgICAgICAgICAgICAgICAgICAgICgweDAwKQoJCSAKI2RlZmluZSBTTF9XTEFOX1BST1ZJU0lPTklOR19DTURfU1RBUlRfTU9ERV9BUAkJCQkJCQkJKDApCiNkZWZpbmUgU0xfV0xBTl9QUk9WSVNJT05JTkdfQ01EX1NUQVJUX01PREVfU0MJCQkJCQkJCSgxKQojZGVmaW5lIFNMX1dMQU5fUFJPVklTSU9OSU5HX0NNRF9TVEFSVF9NT0RFX0FQU0MJCQkJCQkJKDIpCiNkZWZpbmUgU0xfV0xBTl9QUk9WSVNJT05JTkdfQ01EX1NUQVJUX01PREVfQVBTQ19FWFRFUk5BTF9DT05GSUdVUkFUSU9OCQkoMykKI2RlZmluZSBTTF9XTEFOX1BST1ZJU0lPTklOR19DTURfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0KQojZGVmaW5lIFNMX1dMQU5fUFJPVklTSU9OSU5HX0NNRF9BQk9SVF9FWFRFUk5BTF9DT05GSVJNQVRJT04gICAgICAgICAgICAgICAgKDUpCgovKiBQcm92aXNpbmluZyBBUEkgRmxhZ3MgKi8KI2RlZmluZSBTTF9XTEFOX1BST1ZJU0lPTklOR19DTURfRkxBR19FWFRFUk5BTF9DT05GSVJNQVRJT04gICgweDAwMDAwMDAxKQoKLyogdG8gYmUgdXNlZCBvbmx5IGluIHByb3Zpc2lvbmluZyBzdG9wIGNvbW1hbmQgKi8KI2RlZmluZSBTTF9XTEFOX1BST1ZJU0lPTklOR19SRU1BSU5fSU5fQ1VSUkVOVF9ST0xFICAgICAgKDB4RkYpCgoKI2RlZmluZSBTTF9XTEFOX0VBUE1FVEhPRF9QSEFTRTJfU0hJRlQgICAgICAgICAgICAgICAgICAgKDgpCiNkZWZpbmUgU0xfV0xBTl9FQVBNRVRIT0RfUEFJUldJU0VfQ0lQSEVSX1NISUZUICAgICAgICAgICgxOSkKI2RlZmluZSBTTF9XTEFOX0VBUE1FVEhPRF9HUk9VUF9DSVBIRVJfU0hJRlQgICAgICAgICAgICAgKDI3KQoJCQojZGVmaW5lIFNMX1dMQU5fV1BBX0NJUEhFUl9DQ01QICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxKQojZGVmaW5lIFNMX1dMQU5fV1BBX0NJUEhFUl9US0lQICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyKQojZGVmaW5lIFNMX1dMQU5fQ0MzMVhYX0RFRkFVTFRfQ0lQSEVSICAgICAgICAgICAgICAgICAgICAoU0xfV0xBTl9XUEFfQ0lQSEVSX0NDTVAgfCBTTF9XTEFOX1dQQV9DSVBIRVJfVEtJUCkKCiNkZWZpbmUgU0xfV0xBTl9FQVBNRVRIT0QocGhhc2UxLHBoYXNlMixwYWlyd2lzZV9jaXBoZXIsZ3JvdXBfY2lwaGVyKSAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGhhc2UxKSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGhhc2UyKSA8PCBTTF9XTEFOX0VBUE1FVEhPRF9QSEFTRTJfU0hJRlQgKSB8XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfdTMyKShwYWlyd2lzZV9jaXBoZXIpIDw8IFNMX1dMQU5fRUFQTUVUSE9EX1BBSVJXSVNFX0NJUEhFUl9TSElGVCApIHxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF91MzIpKGdyb3VwX2NpcGhlcikgPDwgU0xfV0xBTl9FQVBNRVRIT0RfR1JPVVBfQ0lQSEVSX1NISUZUICkpCgovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZTEgICAgcGhhc2UyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaXJ3aXNlX2NpcGhlciAgICAgICAgICAgICAgIGdyb3VwX2NpcGhlciAgICAgICAgICovCiNkZWZpbmUgU0xfV0xBTl9FTlRfRUFQX01FVEhPRF9UTFMgICAgICAgICAgICAgICAgICAgICAgIFNMX1dMQU5fRUFQTUVUSE9EKFNMX1RMUywgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1dMQU5fQ0MzMVhYX0RFRkFVTFRfQ0lQSEVSICwgU0xfV0xBTl9DQzMxWFhfREVGQVVMVF9DSVBIRVIpCiNkZWZpbmUgU0xfV0xBTl9FTlRfRUFQX01FVEhPRF9UVExTX1RMUyAgICAgICAgICAgICAgICAgIFNMX1dMQU5fRUFQTUVUSE9EKFNMX1RUTFMsICBTTF9UTFMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1dMQU5fQ0MzMVhYX0RFRkFVTFRfQ0lQSEVSICwgU0xfV0xBTl9DQzMxWFhfREVGQVVMVF9DSVBIRVIpCiNkZWZpbmUgU0xfV0xBTl9FTlRfRUFQX01FVEhPRF9UVExTX01TQ0hBUHYyICAgICAgICAgICAgIFNMX1dMQU5fRUFQTUVUSE9EKFNMX1RUTFMsICBTTF9NU0NIQVAsICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1dMQU5fQ0MzMVhYX0RFRkFVTFRfQ0lQSEVSICwgU0xfV0xBTl9DQzMxWFhfREVGQVVMVF9DSVBIRVIpCiNkZWZpbmUgU0xfV0xBTl9FTlRfRUFQX01FVEhPRF9UVExTX1BTSyAgICAgICAgICAgICAgICAgIFNMX1dMQU5fRUFQTUVUSE9EKFNMX1RUTFMsICBTTF9QU0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1dMQU5fQ0MzMVhYX0RFRkFVTFRfQ0lQSEVSICwgU0xfV0xBTl9DQzMxWFhfREVGQVVMVF9DSVBIRVIpCiNkZWZpbmUgU0xfV0xBTl9FTlRfRUFQX01FVEhPRF9QRUFQMF9UTFMgICAgICAgICAgICAgICAgIFNMX1dMQU5fRUFQTUVUSE9EKFNMX1BFQVAwLCBTTF9UTFMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1dMQU5fQ0MzMVhYX0RFRkFVTFRfQ0lQSEVSICwgU0xfV0xBTl9DQzMxWFhfREVGQVVMVF9DSVBIRVIpCiNkZWZpbmUgU0xfV0xBTl9FTlRfRUFQX01FVEhPRF9QRUFQMF9NU0NIQVB2MiAgICAgICAgICAgIFNMX1dMQU5fRUFQTUVUSE9EKFNMX1BFQVAwLCBTTF9NU0NIQVAsICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1dMQU5fQ0MzMVhYX0RFRkFVTFRfQ0lQSEVSICwgU0xfV0xBTl9DQzMxWFhfREVGQVVMVF9DSVBIRVIpCiNkZWZpbmUgU0xfV0xBTl9FTlRfRUFQX01FVEhPRF9QRUFQMF9QU0sgICAgICAgICAgICAgICAgIFNMX1dMQU5fRUFQTUVUSE9EKFNMX1BFQVAwLCBTTF9QU0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1dMQU5fQ0MzMVhYX0RFRkFVTFRfQ0lQSEVSICwgU0xfV0xBTl9DQzMxWFhfREVGQVVMVF9DSVBIRVIpCiNkZWZpbmUgU0xfV0xBTl9FTlRfRUFQX01FVEhPRF9QRUFQMV9UTFMgICAgICAgICAgICAgICAgIFNMX1dMQU5fRUFQTUVUSE9EKFNMX1BFQVAxLCBTTF9UTFMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1dMQU5fQ0MzMVhYX0RFRkFVTFRfQ0lQSEVSICwgU0xfV0xBTl9DQzMxWFhfREVGQVVMVF9DSVBIRVIpCiNkZWZpbmUgU0xfV0xBTl9FTlRfRUFQX01FVEhPRF9QRUFQMV9QU0sgICAgICAgICAgICAgICAgIFNMX1dMQU5fRUFQTUVUSE9EKFNMX1BFQVAxLCBTTF9QU0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1dMQU5fQ0MzMVhYX0RFRkFVTFRfQ0lQSEVSICwgU0xfV0xBTl9DQzMxWFhfREVGQVVMVF9DSVBIRVIpCiNkZWZpbmUgU0xfV0xBTl9FTlRfRUFQX01FVEhPRF9GQVNUX0FVVEhfUFJPVklTSU9OSU5HICAgIFNMX1dMQU5fRUFQTUVUSE9EKFNMX0ZBU1QsICBTTF9XTEFOX0ZBU1RfQVVUSF9QUk9WSVNJT05JTkcsICAgIFNMX1dMQU5fQ0MzMVhYX0RFRkFVTFRfQ0lQSEVSICwgU0xfV0xBTl9DQzMxWFhfREVGQVVMVF9DSVBIRVIpCiNkZWZpbmUgU0xfV0xBTl9FTlRfRUFQX01FVEhPRF9GQVNUX1VOQVVUSF9QUk9WSVNJT05JTkcgIFNMX1dMQU5fRUFQTUVUSE9EKFNMX0ZBU1QsICBTTF9XTEFOX0ZBU1RfVU5BVVRIX1BST1ZJU0lPTklORywgIFNMX1dMQU5fQ0MzMVhYX0RFRkFVTFRfQ0lQSEVSICwgU0xfV0xBTl9DQzMxWFhfREVGQVVMVF9DSVBIRVIpCiNkZWZpbmUgU0xfV0xBTl9FTlRfRUFQX01FVEhPRF9GQVNUX05PX1BST1ZJU0lPTklORyAgICAgIFNMX1dMQU5fRUFQTUVUSE9EKFNMX0ZBU1QsICBTTF9XTEFOX0ZBU1RfTk9fUFJPVklTSU9OSU5HLCAgICAgIFNMX1dMQU5fQ0MzMVhYX0RFRkFVTFRfQ0lQSEVSICwgU0xfV0xBTl9DQzMxWFhfREVGQVVMVF9DSVBIRVIpCgojZGVmaW5lIFNMX1dMQU5fTE9OR19QUkVBTUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKI2RlZmluZSBTTF9XTEFOX1NIT1JUX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEpCgkJICAKI2RlZmluZSBTTF9XTEFOX1JBV19SRl9UWF9QQVJBTVNfQ0hBTk5FTF9TSElGVCAgICAgICAgICAgKDApCiNkZWZpbmUgU0xfV0xBTl9SQVdfUkZfVFhfUEFSQU1TX1JBVEVfU0hJRlQgICAgICAgICAgICAgICg2KQojZGVmaW5lIFNMX1dMQU5fUkFXX1JGX1RYX1BBUkFNU19QT1dFUl9TSElGVCAgICAgICAgICAgICAoMTEpCiNkZWZpbmUgU0xfV0xBTl9SQVdfUkZfVFhfUEFSQU1TX1BSRUFNQkxFX1NISUZUICAgICAgICAgICgxNSkKCQkKI2RlZmluZSBTTF9XTEFOX1JBV19SRl9UWF9QQVJBTVMoY2hhbixyYXRlLHBvd2VyLHByZWFtYmxlKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoYW4gPDwgU0xfV0xBTl9SQVdfUkZfVFhfUEFSQU1TX0NIQU5ORUxfU0hJRlQpIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJhdGUgPDwgU0xfV0xBTl9SQVdfUkZfVFhfUEFSQU1TX1JBVEVfU0hJRlQpIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvd2VyIDw8IFNMX1dMQU5fUkFXX1JGX1RYX1BBUkFNU19QT1dFUl9TSElGVCkgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJlYW1ibGUgPDwgU0xfV0xBTl9SQVdfUkZfVFhfUEFSQU1TX1BSRUFNQkxFX1NISUZUKSkKCgovKiB3bGFuIGNvbmZpZyBhcHBsaWNhdGlvbiBJRHMgKi8KI2RlZmluZSBTTF9XTEFOX0NGR19BUF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICgwKQojZGVmaW5lIFNMX1dMQU5fQ0ZHX0dFTkVSQUxfUEFSQU1fSUQgICAgICAgICAgICAgICAgKDEpCiNkZWZpbmUgU0xfV0xBTl9DRkdfUDJQX1BBUkFNX0lEICAgICAgICAgICAgICAgICAgICAoMikKI2RlZmluZSBTTF9XTEFOX0NGR19BUF9BQ0NFU1NfTElTVF9JRCAgICAgICAgICAgICAgICgzKQojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSU19JRCAgICAgICAgICAgICAgICAgICAgICAgKDQpCiNkZWZpbmUgU0xfV0xBTl9DT05ORUNUSU9OX0lORk8gICAgICAgICAgICAgICAgICAgICAoNSkKCi8qIHdsYW4gQVAgQ29uZmlnIHNldC9nZXQgb3B0aW9ucyAqLwojZGVmaW5lIFNMX1dMQU5fQVBfT1BUX1NTSUQgICAgICAgICAgICAgICAgICAgICAgICAgKDApCiNkZWZpbmUgU0xfV0xBTl9BUF9PUFRfQ0hBTk5FTCAgICAgICAgICAgICAgICAgICAgICAoMykKI2RlZmluZSBTTF9XTEFOX0FQX09QVF9ISURERU5fU1NJRCAgICAgICAgICAgICAgICAgICg0KQojZGVmaW5lIFNMX1dMQU5fQVBfT1BUX1NFQ1VSSVRZX1RZUEUgICAgICAgICAgICAgICAgKDYpCiNkZWZpbmUgU0xfV0xBTl9BUF9PUFRfUEFTU1dPUkQgICAgICAgICAgICAgICAgICAgICAoNykKI2RlZmluZSBTTF9XTEFOX0dFTkVSQUxfUEFSQU1fT1BUX0NPVU5UUllfQ09ERSAgICAgICg5KQojZGVmaW5lIFNMX1dMQU5fR0VORVJBTF9QQVJBTV9PUFRfU1RBX1RYX1BPV0VSICAgICAgKDEwKQojZGVmaW5lIFNMX1dMQU5fR0VORVJBTF9QQVJBTV9PUFRfQVBfVFhfUE9XRVIgICAgICAgKDExKQojZGVmaW5lIFNMX1dMQU5fR0VORVJBTF9QQVJBTV9ESVNBQkxFX0VOVF9TRVJWRVJfQVVUSCAoMzIpIAojZGVmaW5lIFNMX1dMQU5fR0VORVJBTF9QQVJBTV9PUFRfU1VTUEVORF9QUk9GSUxFUyAgKDMzKQoKI2RlZmluZSBTTF9XTEFOX1AyUF9PUFRfREVWX05BTUUgICAgICAgICAgICAgICAgICAgICgxMikKI2RlZmluZSBTTF9XTEFOX1AyUF9PUFRfREVWX1RZUEUgICAgICAgICAgICAgICAgICAgICgxMykKI2RlZmluZSBTTF9XTEFOX1AyUF9PUFRfQ0hBTk5FTF9OX1JFR1MgICAgICAgICAgICAgICgxNCkKI2RlZmluZSBTTF9XTEFOX0dFTkVSQUxfUEFSQU1fT1BUX0lORk9fRUxFTUVOVCAgICAgICgxNikKI2RlZmluZSBTTF9XTEFOX0dFTkVSQUxfUEFSQU1fT1BUX1NDQU5fUEFSQU1TICAgICAgICgxOCkgICAgICAvKiBjaGFuZ2UgdGhlIHNjYW4gY2hhbm5lbHMgYW5kIFJTU0kgdGhyZXNob2xkIHVzaW5nIHRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gKi8KI2RlZmluZSBTTF9XTEFOX0FQX09QVF9NQVhfU1RBVElPTlMgICAgICAgICAgICAgICAgICgxOSkKI2RlZmluZSBTTF9XTEFOX0FQX0FDQ0VTU19MSVNUX0FERF9NQUMgICAgICAgICAgICAgICgyMCkKI2RlZmluZSBTTF9XTEFOX0FQX0FDQ0VTU19MSVNUX0RFTF9NQUMgICAgICAgICAgICAgICgyMSkKI2RlZmluZSBTTF9XTEFOX0FQX0FDQ0VTU19MSVNUX0RFTF9JRFggICAgICAgICAgICAgICgyMikKI2RlZmluZSBTTF9XTEFOX0FQX0FDQ0VTU19MSVNUX05VTV9FTlRSSUVTICAgICAgICAgICgyNCkKI2RlZmluZSBTTF9XTEFOX0FQX0FDQ0VTU19MSVNUX01PREUgICAgICAgICAgICAgICAgICgyNSkKI2RlZmluZSBTTF9XTEFOX0FQX09QVF9NQVhfU1RBX0FHSU5HICAgICAgICAgICAgICAgICgyNikKCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfU1RBVEUgICAgICAgICAgICAgICAgICAgICAoMjcpCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfUkVNT1ZFICAgICAgICAgICAgICAgICAgICAoMjgpCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfU1RPUkUgICAgICAgICAgICAgICAgICAgICAoMjkpCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfVVBEQVRFX0FSR1MgICAgICAgICAgICAgICAoMzApCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfU1lTX1NUQVRFICAgICAgICAgICAgICAgICAoMzEpCgovKiBTbWFydENvbmZpZyBDSVBIRVIgb3B0aW9ucyAqLwojZGVmaW5lIFNMX1dMQU5fU01BUlRfQ09ORklHX0NJUEhFUl9TRkxBU0ggICAgICAgICAgICAgICAoMCkgICAgICAvKiBwYXNzd29yZCBpcyBub3QgZGVsaXZlcmVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gVGhlIFNpbXBsZSBNYW5hZ2VyIHNob3VsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2sgaWYgdGhlIGtleXMgYXJlIHN0b3JlZCBpbiB0aGUgRmxhc2guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBTTF9XTEFOX1NNQVJUX0NPTkZJR19DSVBIRVJfQUVTICAgICAgICAgICAgICAgICAgKDEpICAgICAgLyogQUVTIChvdGhlciB0eXBlcyBhcmUgbm90IHN1cHBvcnRlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBTTF9XTEFOX1NNQVJUX0NPTkZJR19DSVBIRVJfTk9ORSAgICAgICAgICAgICAgICAgKDB4RkYpICAgLyogZG8gbm90IGNoZWNrIGluIHRoZSBmbGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCgojZGVmaW5lIFNMX1dMQU5fUE9MSUNZX0NPTk5FQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAoMHgxMCkKI2RlZmluZSBTTF9XTEFOX1BPTElDWV9TQ0FOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjApCiNkZWZpbmUgU0xfV0xBTl9QT0xJQ1lfUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDMwKQojZGVmaW5lIFNMX1dMQU5fUE9MSUNZX1AyUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0MCkKCiNkZWZpbmUgU0xfV0xBTl9WQUxfMl9NQVNLKHBvc2l0aW9uLHZhbHVlKSAgICAgICAgICAgICAgICgoMSAmICh2YWx1ZSkpPDwocG9zaXRpb24pKQojZGVmaW5lIFNMX1dMQU5fTUFTS18yX1ZBTChwb3NpdGlvbixtYXNrKSAgICAgICAgICAgICAgICAoKCgxIDw8IHBvc2l0aW9uKSAmIChtYXNrKSkgPj4gKHBvc2l0aW9uKSkKCiNkZWZpbmUgU0xfV0xBTl9DT05ORUNUSU9OX1BPTElDWShBdXRvLEZhc3QsYW55UDJQLGF1dG9Qcm92aXNpb25pbmcpICAgICAgICAgKFNMX1dMQU5fVkFMXzJfTUFTSygwLEF1dG8pIHwgU0xfV0xBTl9WQUxfMl9NQVNLKDEsRmFzdCkgfCBTTF9XTEFOX1ZBTF8yX01BU0soMiwwKSB8IFNMX1dMQU5fVkFMXzJfTUFTSygzLGFueVAyUCkgfCBTTF9XTEFOX1ZBTF8yX01BU0soNCwwKSB8IFNMX1dMQU5fVkFMXzJfTUFTSyg1LGF1dG9Qcm92aXNpb25pbmcpKQojZGVmaW5lIFNMX1dMQU5fU0NBTl9QT0xJQ1lfRU4ocG9saWN5KSAgICAgICAgICAgICAgICAgICAoU0xfV0xBTl9NQVNLXzJfVkFMKDAscG9saWN5KSkKI2RlZmluZSBTTF9XTEFOX1NDQU5fUE9MSUNZKEVuYWJsZSxFbmFibGVfSGlkZGVuKSAgICAgICAgKFNMX1dMQU5fVkFMXzJfTUFTSygwLEVuYWJsZSkgfCBTTF9XTEFOX1ZBTF8yX01BU0soMSxFbmFibGVfSGlkZGVuKSkKCgojZGVmaW5lIFNMX1dMQU5fRU5BQkxFX1NDQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSkKI2RlZmluZSBTTF9XTEFOX0RJU0FCTEVfU0NBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCiNkZWZpbmUgU0xfV0xBTl9BTExPV19ISURERU5fU1NJRF9SRVNVTFRTICAgICAgICAgICAgICAgICgxKQojZGVmaW5lIFNMX1dMQU5fQkxPQ0tfSElEREVOX1NTSURfUkVTVUxUUyAgICAgICAgICAgICAgICAoMCkKCQkgIAojZGVmaW5lIFNMX1dMQU5fTk9STUFMX1BPTElDWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKI2RlZmluZSBTTF9XTEFOX0xPV19MQVRFTkNZX1BPTElDWSAgICAgICAgICAgICAgICAgICAgICAgKDEpCiNkZWZpbmUgU0xfV0xBTl9MT1dfUE9XRVJfUE9MSUNZICAgICAgICAgICAgICAgICAgICAgICAgICgyKQojZGVmaW5lIFNMX1dMQU5fQUxXQVlTX09OX1BPTElDWSAgICAgICAgICAgICAgICAgICAgICAgICAoMykKI2RlZmluZSBTTF9XTEFOX0xPTkdfU0xFRVBfSU5URVJWQUxfUE9MSUNZICAgICAgICAgICAgICAgKDQpCgkJICAKI2RlZmluZSBTTF9XTEFOX1AyUF9ST0xFX05FR09USUFURSAgICAgICAgICAgICAgICAgICAgICAgKDMpCiNkZWZpbmUgU0xfV0xBTl9QMlBfUk9MRV9HUk9VUF9PV05FUiAgICAgICAgICAgICAgICAgICAgICgxNSkKI2RlZmluZSBTTF9XTEFOX1AyUF9ST0xFX0NMSUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCgkJIAojZGVmaW5lIFNMX1dMQU5fUDJQX05FR19JTklUSUFUT1JfQUNUSVZFICAgICAgICAgICAgICAgICAoMCkKI2RlZmluZSBTTF9XTEFOX1AyUF9ORUdfSU5JVElBVE9SX1BBU1NJVkUgICAgICAgICAgICAgICAgKDEpCiNkZWZpbmUgU0xfV0xBTl9QMlBfTkVHX0lOSVRJQVRPUl9SQU5EX0JBQ0tPRkYgICAgICAgICAgICgyKQoJCQojZGVmaW5lIFNMX1dMQU5fUE9MSUNZX1ZBTF8yX09QVElPTlMocG9zaXRpb24sbWFzayxwb2xpY3kpICAgICgobWFzayAmIHBvbGljeSkgPDwgcG9zaXRpb24gKQoKI2RlZmluZSBTTF9XTEFOX1AyUF9QT0xJQ1kocDJwTmVnVHlwZSxwMnBOZWdJbml0aWF0b3IpICAgKFNMX1dMQU5fUE9MSUNZX1ZBTF8yX09QVElPTlMoMCwweEYsKHAycE5lZ1R5cGUgPiBTTF9XTEFOX1AyUF9ST0xFX0dST1VQX09XTkVSID8gU0xfV0xBTl9QMlBfUk9MRV9HUk9VUF9PV05FUiA6IHAycE5lZ1R5cGUpKSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTF9XTEFOX1BPTElDWV9WQUxfMl9PUFRJT05TKDQsMHgxLChwMnBOZWdUeXBlID4gU0xfV0xBTl9QMlBfUk9MRV9HUk9VUF9PV05FUiA/IDE6MCkpIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1dMQU5fUE9MSUNZX1ZBTF8yX09QVElPTlMoNSwweDMsIHAycE5lZ0luaXRpYXRvcikpCgoKLyogSW5mbyBlbGVtZW50cyAqLwojZGVmaW5lIFNMX1dMQU5fSU5GT19FTEVNRU5UX0RFRkFVTFRfSUQgICAgICAgICAgICAgICgwKSAvKiAyMjEgd2lsbCBiZSB1c2VkICovCgovKiBpbmZvIGVsZW1lbnQgc2l6ZSBpcyB1cCB0byAyNTIgYnl0ZXMgKCsgMyBieXRlcyBvZiBPVUkpLiAqLwojZGVmaW5lIFNMX1dMQU5fSU5GT19FTEVNRU5UX01BWF9TSVpFICAgICAgICAgICAgICAgICgyNTIpCgovKiBGb3IgQVAgLSB0aGUgdG90YWwgbGVuZ3RoIG9mIGFsbCBpbmZvIGVsZW1lbnRzIGlzIDMwMCBieXRlcyAoZm9yIGV4YW1wbGUgLSA0IGluZm8gZWxlbWVudHMgb2YgNzUgYnl0ZXMgZWFjaCkgKi8KI2RlZmluZSBTTF9XTEFOX0lORk9fRUxFTUVOVF9NQVhfVE9UQUxfTEVOR1RIX0FQICAgICAoMzAwKQoKLyogRm9yIFAyUCAtIHRoZSB0b3RhbCBsZW5ndGggb2YgYWxsIGluZm8gZWxlbWVudHMgaXMgMTYwIGJ5dGVzIChmb3IgZXhhbXBsZSAtIDQgaW5mbyBlbGVtZW50cyBvZiA0MCBieXRlcyBlYWNoKSAqLwojZGVmaW5lIFNMX1dMQU5fSU5GT19FTEVNRU5UX01BWF9UT1RBTF9MRU5HVEhfUDJQX0dPICgxNjApCgojZGVmaW5lIFNMX1dMQU5fSU5GT19FTEVNRU5UX0FQX1JPTEUgICAgICAgICAgICAgICAgICgwKQojZGVmaW5lIFNMX1dMQU5fSU5GT19FTEVNRU5UX1AyUF9HT19ST0xFICAgICAgICAgICAgICgxKQoKLyogd2Ugc3VwcG9ydCB1cCB0byA0IGluZm8gZWxlbWVudHMgcGVyIFJvbGUuICovCiNkZWZpbmUgU0xfV0xBTl9NQVhfUFJJVkFURV9JTkZPX0VMRU1FTlRTX1NVUFBST1RFRCAgKDQpCgojZGVmaW5lIFNMX1dMQU5fSU5GT19FTEVNRU5UX0RFRkFVTFRfT1VJXzAgICAgICAgICAgICgweDA4KQojZGVmaW5lIFNMX1dMQU5fSU5GT19FTEVNRU5UX0RFRkFVTFRfT1VJXzEgICAgICAgICAgICgweDAwKQojZGVmaW5lIFNMX1dMQU5fSU5GT19FTEVNRU5UX0RFRkFVTFRfT1VJXzIgICAgICAgICAgICgweDI4KQoKI2RlZmluZSBTTF9XTEFOX0lORk9fRUxFTUVOVF9ERUZBVUxUX09VSSAgICAgICAgICAgICAoMHgwMDAwMDApICAvKiAwOCwgMDAsIDI4IHdpbGwgYmUgdXNlZCAqLwoKI2RlZmluZSBTTF9XTEFOX0FQX0FDQ0VTU19MSVNUX01PREVfRElTQUJMRUQgICAgICAgICAwCiNkZWZpbmUgU0xfV0xBTl9BUF9BQ0NFU1NfTElTVF9NT0RFX0RFTllfTElTVCAgICAgICAgMQojZGVmaW5lIFNMX1dMQU5fTUFYX0FDQ0VTU19MSVNUX1NUQVRJT05TICAgICAgICAgICAgIDgKCgovKiBTY2FuIHJlc3VsdHMgc2VjdXJpdHkgaW5mb3JtYXRpb24gKi8KI2RlZmluZSBTTF9XTEFOX1NDQU5fUkVTVUxUX0dST1VQX0NJUEhFUihTZWN1cml0eUluZm8pICAgICAgICAgICAgICAgICAgICAgIChTZWN1cml0eUluZm8gJiAweEYpICAgLyogUG9zc2libGUgdmFsdWVzOiBOT05FLFNMX1dMQU5fQ0lQSEVSX0JJVE1BUF9US0lQLFNMX1dMQU5fQ0lQSEVSX0JJVE1BUF9DQ01QICovCiNkZWZpbmUgU0xfV0xBTl9TQ0FOX1JFU1VMVF9VTklDQVNUX0NJUEhFUl9CSVRNQVAoU2VjdXJpdHlJbmZvKSAgICAgICAgICAgICAoKFNlY3VyaXR5SW5mbyAmIDB4RjApID4+IDQgKSAvKiBQb3NzaWJsZSB2YWx1ZXM6IE5PTkUsU0xfV0xBTl9DSVBIRVJfQklUTUFQX1dFUDQwLFNMX1dMQU5fQ0lQSEVSX0JJVE1BUF9XRVAxMDQsU0xfV0xBTl9DSVBIRVJfQklUTUFQX1RLSVAsU0xfV0xBTl9DSVBIRVJfQklUTUFQX0NDTVAqLwojZGVmaW5lIFNMX1dMQU5fU0NBTl9SRVNVTFRfSElEREVOX1NTSUQoU2VjdXJpdHlJbmZvKSAgICAgICAgICAgICAgICAgICAgICAgKFNlY3VyaXR5SW5mbyAmIDB4MjAwMCApID4+IDEzIC8qIFBvc3NpYmxlIHZhbHVlczogVFJVRS9GQUxTRSAqLyAgICAKI2RlZmluZSBTTF9XTEFOX1NDQU5fUkVTVUxUX0tFWV9NR01UX1NVSVRFU19CSVRNQVAoU2VjdXJpdHlJbmZvKSAgICAgICAgICAgIChTZWN1cml0eUluZm8gJiAweDE4MDAgKSA+PiAxMSAgLyogUG9zc2libGUgdmFsdWVzOiBTTF9XTEFOX0tFWV9NR01UX1NVSVRFXzgwMl8xX1gsIFNMX1dMQU5fS0VZX01HTVRfU1VJVEVfUFNLICovCiNkZWZpbmUgU0xfV0xBTl9TQ0FOX1JFU1VMVF9TRUNfVFlQRV9CSVRNQVAoU2VjdXJpdHlJbmZvKSAgICAgICAgICAgICAgICAgICAoU2VjdXJpdHlJbmZvICYgMHg3MDAgICApID4+IDggIC8qIFBvc3NpYmxlIHZhbHVlczogU0xfV0xBTl9TRUNVUklUWV9UWVBFX0JJVE1BUF9PUEVOLCBTTF9XTEFOX1NFQ1VSSVRZX1RZUEVfQklUTUFQX1dFUCwgU0xfV0xBTl9TRUNVUklUWV9UWVBFX0JJVE1BUF9XUEEsIFNMX1dMQU5fU0VDVVJJVFlfVFlQRV9CSVRNQVBfV1BBMiwgMHg2IChtaXggbW9kZSkgU0xfV0xBTl9TRUNVUklUWV9UWVBFX0JJVE1BUF9XUEEgfCBTTF9XTEFOX1NFQ1VSSVRZX1RZUEVfQklUTUFQX1dQQTIgKi8KCiNkZWZpbmUgU0xfV0xBTl9TRUNVUklUWV9UWVBFX0JJVE1BUF9PUEVOICAgICAgICAgICAgMHgwCiNkZWZpbmUgU0xfV0xBTl9TRUNVUklUWV9UWVBFX0JJVE1BUF9XRVAgICAgICAgICAgICAgMHgxCiNkZWZpbmUgU0xfV0xBTl9TRUNVUklUWV9UWVBFX0JJVE1BUF9XUEEgICAgICAgICAgICAgMHgyCiNkZWZpbmUgU0xfV0xBTl9TRUNVUklUWV9UWVBFX0JJVE1BUF9XUEEyICAgICAgICAgICAgMHg0CgojZGVmaW5lIFNMX1dMQU5fQ0lQSEVSX0JJVE1BUF9XRVA0MCAgICAgICAgICAgICAgICAgIDB4MQojZGVmaW5lIFNMX1dMQU5fQ0lQSEVSX0JJVE1BUF9XRVAxMDQgICAgICAgICAgICAgICAgIDB4MgojZGVmaW5lIFNMX1dMQU5fQ0lQSEVSX0JJVE1BUF9US0lQICAgICAgICAgICAgICAgICAgIDB4NAojZGVmaW5lIFNMX1dMQU5fQ0lQSEVSX0JJVE1BUF9DQ01QICAgICAgICAgICAgICAgICAgIDB4OAoKI2RlZmluZSBTTF9XTEFOX0tFWV9NR01UX1NVSVRFXzgwMl8xX1ggICAgICAgICAgICAgICAxCiNkZWZpbmUgU0xfV0xBTl9LRVlfTUdNVF9TVUlURV9QU0sgICAgICAgICAgICAgICAgICAgMgoKCgojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX01BWF9GSUxURVJTICAgICAgICAgICAgICAgICAgICAgICAoNjQpICAgIC8qIE1heCBudW1iZXIgb2YgZmlsdGVycyBpcyA2NCBmaWx0ZXJzICovCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfTUFYX1NZU19GSUxURVJTX1NFVFMgICAgICAgICAgICAgICgzMikgICAgLyogVGhlIE1heCBudW1iZXIgb2Ygc3lzdGVtIGZpbHRlcnMgKi8KI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9OVU1fT0ZfRklMVEVSX0hFQURFUl9BUkdTICAgICAgICAgKDIpCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfTlVNX09GX0ZJTFRFUl9QQVlMT0FEX0FSR1MgICAgICAgICgyKQojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX1JBTkdFX0FSR1MgICAgICAgICAgICAgICAgICAgICAgICAoMikKI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9OVU1fVVNFUl9FVkVOVF9JRCAgICAgICAgICAgICAgICAgKDY0KQojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX01BWF9VU0VSX0VWRU5UX0lEICAgICAgICAgICAgICAgICAoICggU0xfV0xBTl9SWF9GSUxURVJfTlVNX1VTRVJfRVZFTlRfSUQgKSAtIDEgKQoKLyogIEJpdCBtYW5pcHVsYXRpb24gZm9yIDggYml0ICovCiNkZWZpbmUgU0xfV0xBTl9JU0JJVFNFVDgoeCxpKSAgICAgICgoeFtpPj4zXSAmICgweDgwPj4oaSY3KSkpIT0wKSAgLyogSXMgYml0IHNldCwgOCBiaXQgdW5zaWduZWQgbnVtYmVycyA9IHggLCBsb2NhdGlvbiA9IGkgKi8KI2RlZmluZSBTTF9XTEFOX1NFVEJJVDgoeCxpKSAgICAgICAgeFtpPj4zXXw9KDB4ODA+PihpJjcpKTsgICAgICAgICAvKiBTZXQgYml0LDggYml0IHVuc2lnbmVkIG51bWJlcnMgPSB4ICwgbG9jYXRpb24gPSBpICovCiNkZWZpbmUgU0xfV0xBTl9DTEVBUkJJVDgoeCxpKSAgICAgIHhbaT4+M10mPSgweDgwPj4oaSY3KSleMHhGRjsgICAgLyogQ2xlYXIgYml0LDggYml0IHVuc2lnbmVkIG51bWJlcnMgPSB4ICwgbG9jYXRpb24gPSBpICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBTdHJ1Y3R1cmUvRW51bSBkZWNsYXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnR5cGVkZWYgZW51bQp7CiAgICBTTF9XTEFOX1JBVEVfMU0gICAgICAgICA9IDEsCiAgICBTTF9XTEFOX1JBVEVfMk0gICAgICAgICA9IDIsCiAgICBTTF9XTEFOX1JBVEVfNV81TSAgICAgICA9IDMsCiAgICBTTF9XTEFOX1JBVEVfMTFNICAgICAgICA9IDQsCiAgICBTTF9XTEFOX1JBVEVfNk0gICAgICAgICA9IDYsCiAgICBTTF9XTEFOX1JBVEVfOU0gICAgICAgICA9IDcsCiAgICBTTF9XTEFOX1JBVEVfMTJNICAgICAgICA9IDgsCiAgICBTTF9XTEFOX1JBVEVfMThNICAgICAgICA9IDksCiAgICBTTF9XTEFOX1JBVEVfMjRNICAgICAgICA9IDEwLAogICAgU0xfV0xBTl9SQVRFXzM2TSAgICAgICAgPSAxMSwKICAgIFNMX1dMQU5fUkFURV80OE0gICAgICAgID0gMTIsCiAgICBTTF9XTEFOX1JBVEVfNTRNICAgICAgICA9IDEzLAogICAgU0xfV0xBTl9SQVRFX01DU18wICAgICAgPSAxNCwKICAgIFNMX1dMQU5fUkFURV9NQ1NfMSAgICAgID0gMTUsCiAgICBTTF9XTEFOX1JBVEVfTUNTXzIgICAgICA9IDE2LAogICAgU0xfV0xBTl9SQVRFX01DU18zICAgICAgPSAxNywKICAgIFNMX1dMQU5fUkFURV9NQ1NfNCAgICAgID0gMTgsCiAgICBTTF9XTEFOX1JBVEVfTUNTXzUgICAgICA9IDE5LAogICAgU0xfV0xBTl9SQVRFX01DU182ICAgICAgPSAyMCwKICAgIFNMX1dMQU5fUkFURV9NQ1NfNyAgICAgID0gMjEsCiAgICBTTF9XTEFOX01BWF9OVU1fUkFURVMgICA9IDB4RkYKfVNsV2xhblJhdGVJbmRleF9lOwoKdHlwZWRlZiBlbnVtCnsKICAgIFNMX1dMQU5fREVWX1BXX0RFRkFVTFQgICAgICA9IDAsCiAgICBTTF9XTEFOX0RFVl9QV19QSU5fS0VZUEFEICAgPSAxLAogICAgU0xfV0xBTl9ERVZfUFdfUFVTSF9CVVRUT04gID0gNCwKICAgIFNMX1dMQU5fREVWX1BXX1BJTl9ESVNQTEFZICA9IDUKfSBTbFdsYW5QMnBEZXZQd2RNZXRob2RfZTsKCgp0eXBlZGVmIHN0cnVjdAp7CiAgICBfdTMyICAgIFN0YXR1czsKICAgIF91MzIgICAgU3NpZExlbjsKICAgIF91OCAgICAgU3NpZFszMl07CiAgICBfdTMyICAgIFByaXZhdGVUb2tlbkxlbjsKICAgIF91OCAgICAgUHJpdmF0ZVRva2VuWzMyXTsKfVNsV2xhblNtYXJ0Q29uZmlnU3RhcnRBc3luY1Jlc3BvbnNlX3Q7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBfdTE2ICAgIFN0YXR1czsKICAgIF91MTYgICAgUGFkZGluZzsKfVNsV2xhblNtYXJ0Q29uZmlnU3RvcEFzeW5jUmVzcG9uc2VfdDsKCnR5cGVkZWYgc3RydWN0CnsKICAgIF91MTYgICAgU3RhdHVzOwogICAgX3UxNiAgICBQYWRkaW5nOwp9U2xXbGFuQ29ubkZhaWx1cmVBc3luY1Jlc3BvbnNlX3Q7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBfdTE2ICAgIFN0YXR1czsKICAgIF91MTYgICAgUGFkZGluZzsKfVNsV2xhblByb3Zpc2lvbmluZ1N0YXR1c0FzeW5jUmVzcG9uc2VfdDsKCi8qIHJ4IGZpbHRlciBldmVudCBzdHJ1Y3QKICB0aGlzIGV2ZW50IHdpbGwgYmUgc2VudCBmcm9tIHRoZSBTTCBkZXZpY2UKICBhcyBhIHJlc3VsdCBvZiBhIHBhc3NlZCByeCBmaWx0ZXIKICBleGFtcGxlOgogIHN1cHBvc2Ugd2UgaGF2ZSBhIGZpbHRlciB3aXRoIGFuIGFjdGlvbiBhbmQgd2Ugc2V0IHRoZSBmb2xsb3dpbmc6CiAgU2xXbGFuUnhGaWx0ZXJBY3Rpb25fdCBBY3Rpb247CiAgQWN0aW9uLlVzZXJJZCA9IDI7CiAgV2hlbiB0aGUgZmlsdGVyIHJlc3VsdCBpcyBwYXNzLCBhbiBTbFdsYW5FdmVudFJ4RmlsdGVySW5mb190IGV2ZW50IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB1c2VyIGFzIGZvbGxvd3M6CiAgVHlwZSB3aWxsIGJlIHNldCB0byAwCiAgYml0IDIgaW4gVXNlckFjdGlvbklkQml0bWFwIHdpbGwgYmUgc2V0IGluIHRoaXMgZXZlbnQsIGJlY2F1c2UgMiBpcyB0aGUgdXNlciBpbnB1dCBmb3IgdGhlIGFjdGlvbiBhcmcgYWJvdmUuCiAgYW4gU2xXbGFuRXZlbnRSeEZpbHRlckluZm9fdCBldmVudCBtYXkgaGF2ZSBzZXZlcmFsIGJpdHMgc2V0IGFzIGEgcmVzdWx0IG9mIHNldmVyYWwgcnggZmlsdGVycyBjYXVzaW5nIGRpZmZlcmVudAogIGV2ZW50cyB0byBwYXNzICovCgp0eXBlZGVmIHN0cnVjdAp7CiAgICBfdTggICAgIFR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnRseSBvbmx5IGV2ZW50IHR5cGUgMCBpcyBzdXBwb3J0ZWQuICovCiAgICBfdTggICAgIFVzZXJBY3Rpb25JZEJpdG1hcFtTTF9XTEFOX1JYX0ZJTFRFUl9OVU1fVVNFUl9FVkVOVF9JRCAvIDhdOyAgIC8qIEJpdCBYIGlzIHNldCBpbmRpY2F0ZXMgdGhhdCB0aGUgZmlsdGVyIHdpdGggZXZlbnQgYWN0aW9uIGFyZyBYIHBhc3NlZC4gKi8KfVNsV2xhbkV2ZW50UnhGaWx0ZXJJbmZvX3Q7CgoKCnR5cGVkZWYgZW51bQp7CiAgICBST0xFX1NUQSAgICAgID0gMCwKICAgIFJPTEVfUkVTRVJWRUQgPSAxLAogICAgUk9MRV9BUCAgICAgICA9IDIsCiAgICBST0xFX1AyUCAgICAgID0gMwp9U2xXbGFuTW9kZV9lOwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgX3U4ICAgICBTc2lkTGVuOwogICAgX3U4ICAgICBTc2lkTmFtZVszMl07CiAgICBfdTggICAgIEJzc2lkWzZdOwogICAgX3U4ICAgICBQYWRkaW5nOwp9IFNsV2xhbkV2ZW50Q29ubmVjdF90OwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgX3U4ICAgICBTc2lkTGVuOwogICAgX3U4ICAgICBTc2lkTmFtZVszMl07CiAgICBfdTggICAgIEJzc2lkWzZdOwogICAgX3U4ICAgICBSZWFzb25Db2RlOwp9IFNsV2xhbkV2ZW50RGlzY29ubmVjdF90OwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgX3U4ICAgTWFjWzZdOwogICAgX3U4ICAgUGFkZGluZ1syXTsKfVNsV2xhbkV2ZW50U1RBQWRkZWRfdCwgU2xXbGFuRXZlbnRTVEFSZW1vdmVkX3Q7CgoKdHlwZWRlZiBzdHJ1Y3QKewogICAgX3U4ICAgICBTc2lkTGVuOwogICAgX3U4ICAgICBTc2lkTmFtZVszMl07CiAgICBfdTggICAgIEJzc2lkWzZdOwogICAgX3U4ICAgICBSZXNlcnZlZDsKICAgIF91OCAgICAgR29EZXZpY2VOYW1lTGVuOwogICAgX3U4ICAgICBHb0RldmljZU5hbWVbMzJdOwogICAgX3U4ICAgICBQYWRkaW5nWzNdOwp9IFNsV2xhbkV2ZW50UDJQQ29ubmVjdF90OwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgX3U4ICAgICBTc2lkTGVuOwogICAgX3U4ICAgICBTc2lkTmFtZVszMl07CiAgICBfdTggICAgIEJzc2lkWzZdOwogICAgX3U4ICAgICBSZWFzb25Db2RlOwogICAgX3U4ICAgICBHb0RldmljZU5hbWVMZW47CiAgICBfdTggICAgIEdvRGV2aWNlTmFtZVszMl07CiAgICBfdTggICAgIFBhZGRpbmdbM107Cn0gU2xXbGFuRXZlbnRQMlBEaXNjb25uZWN0X3Q7CgoKCgp0eXBlZGVmIHN0cnVjdAp7CiAgICBfdTggICAgIE1hY1s2XTsKICAgIF91OCAgICAgQ2xEZXZpY2VOYW1lTGVuOwogICAgX3U4ICAgICBDbERldmljZU5hbWVbMzJdOwogICAgX3U4ICAgICBPd25Tc2lkTGVuOwogICAgX3U4ICAgICBPd25Tc2lkWzMyXTsKfVNsV2xhbkV2ZW50UDJQQ2xpZW50QWRkZWRfdCwgU2xXbGFuRXZlbnRQMlBDbGllbnRSZW1vdmVkX3Q7CgoKdHlwZWRlZiBzdHJ1Y3QKewogICAgX3U4ICAgICBHb0RldmljZU5hbWVMZW47CiAgICBfdTggICAgIEdvRGV2aWNlTmFtZVszMl07CiAgICBfdTggICAgIE1hY1s2XTsKICAgIF91OCAgICAgV3BzTWV0aG9kOwp9U2xXbGFuRXZlbnRQMlBEZXZGb3VuZF90LCBTbFdsYW5FdmVudFAyUFJlcXVlc3RfdDsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnR5cGVkZWYgc3RydWN0CnsKICAgIF91MTYgICAgU3RhdHVzOwogICAgX3UxNiAgICBQYWRkaW5nOwp9U2xXbGFuRXZlbnRQMlBDb25uZWN0RmFpbF90OwoKCnR5cGVkZWYgc3RydWN0CnsKCV91OCAgUHJvdmlzaW9uaW5nU3RhdHVzOwoJX3U4ICBSb2xlOwoJX3U4ICBXbGFuU3RhdHVzOwoJX3U4ICBTc2lkbGVuOwoJX3U4ICBTc2lkWzMyXTsKCV91MzIgUmVzZXJ2ZWQ7Cn1TbFdsYW5FdmVudFByb3Zpc2lvbmluZ1N0YXR1c190OwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgX3UzMiAgICBTdGF0dXM7CiAgICBfdTMyICAgIFNzaWRMZW47CiAgICBfdTggICAgIFNzaWRbMzJdOwogICAgX3UzMiAgICBSZXNlcnZlZExlbjsKICAgIF91OCAgICAgUmVzZXJ2ZWRbMzJdOwp9IFNsV2xhbkV2ZW50UHJvdmlzaW9uaW5nUHJvZmlsZUFkZGVkX3Q7CgoKdHlwZWRlZiB1bmlvbgp7CiAgICBTbFdsYW5FdmVudENvbm5lY3RfdCAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0OyAgICAgICAgICAgICAgICAgICAgLyogU0xfV0xBTl9FVkVOVF9DT05ORUNUICovCiAgICBTbFdsYW5FdmVudERpc2Nvbm5lY3RfdCAgICAgICAgICAgICAgICAgICAgICBEaXNjb25uZWN0OyAgICAgICAgICAgICAgICAgLyogU0xfV0xBTl9FVkVOVF9ESVNDT05ORUNUICovCiAgICBTbFdsYW5FdmVudFNUQUFkZGVkX3QgICAgICAgICAgICAgICAgICAgICAgICBTVEFBZGRlZDsgICAgICAgICAgICAgICAgICAgLyogU0xfV0xBTl9FVkVOVF9TVEFfQURERUQgKi8KICAgIFNsV2xhbkV2ZW50U1RBUmVtb3ZlZF90ICAgICAgICAgICAgICAgICAgICAgIFNUQVJlbW92ZWQ7ICAgICAgICAgICAgICAgICAvKiBTTF9XTEFOX0VWRU5UX1NUQV9SRU1PVkVEICovCiAgICBTbFdsYW5FdmVudFAyUENvbm5lY3RfdCAgICAgICAgICAgICAgICAgICAgICBQMlBDb25uZWN0OyAgICAgICAgICAgICAgICAgLyogU0xfV0xBTl9FVkVOVF9QMlBfQ09OTkVDVCAqLwogICAgU2xXbGFuRXZlbnRQMlBEaXNjb25uZWN0X3QgICAgICAgICAgICAgICAgICAgUDJQRGlzY29ubmVjdDsgICAgICAgICAgICAgIC8qIFNMX1dMQU5fRVZFTlRfUDJQX0RJU0NPTk5FQ1QgKi8KICAgIFNsV2xhbkV2ZW50UDJQQ2xpZW50QWRkZWRfdCAgICAgICAgICAgICAgICAgIFAyUENsaWVudEFkZGVkOyAgICAgICAgICAgICAvKiBTTF9XTEFOX0VWRU5UX1AyUF9DTElFTlRfQURERUQgKi8KICAgIFNsV2xhbkV2ZW50UDJQQ2xpZW50UmVtb3ZlZF90ICAgICAgICAgICAgICAgIFAyUENsaWVudFJlbW92ZWQ7ICAgICAgICAgICAvKiBTTF9XTEFOX0VWRU5UX1AyUF9DTElFTlRfUkVNT1ZFRCAqLwogICAgU2xXbGFuRXZlbnRQMlBEZXZGb3VuZF90ICAgICAgICAgICAgICAgICAgICAgUDJQRGV2Rm91bmQ7ICAgICAgICAgICAgICAgIC8qIFNMX1dMQU5fRVZFTlRfUDJQX0RFVkZPVU5EICovCiAgICBTbFdsYW5FdmVudFAyUFJlcXVlc3RfdCAgICAgICAgICAgICAgICAgICAgICBQMlBSZXF1ZXN0OyAgICAgICAgICAgICAgICAgLyogU0xfV0xBTl9FVkVOVF9QMlBfUkVRVUVTVCAqLwogICAgU2xXbGFuRXZlbnRQMlBDb25uZWN0RmFpbF90ICAgICAgICAgICAgICAgICAgUDJQQ29ubmVjdEZhaWw7ICAgICAgICAgICAgIC8qIFNMX1dMQU5fRVZFTlRfUDJQX0NPTk5FQ1RGQUlMICovCiAgICBTbFdsYW5FdmVudFJ4RmlsdGVySW5mb190ICAgICAgICAgICAgICAgICAgICBSeEZpbHRlckluZm87ICAgICAgICAgICAgICAgLyogU0xfV0xBTl9FVkVOVF9SWEZJTFRFUiAqLwogICAgU2xXbGFuRXZlbnRQcm92aXNpb25pbmdTdGF0dXNfdCAgICAgICAgICAgICAgUHJvdmlzaW9uaW5nU3RhdHVzOyAgICAgICAgIC8qIFNMX1dMQU5fRVZFTlRfUFJPVklTSU9OSU5HX1NUQVRVUyAqLwogICAgU2xXbGFuRXZlbnRQcm92aXNpb25pbmdQcm9maWxlQWRkZWRfdCAgICAgICAgUHJvdmlzaW9uaW5nUHJvZmlsZUFkZGVkOyAgIC8qIFNMX1dMQU5fRVZFTlRfUFJPVklTSU9OSU5HX1BST0ZJTEVfQURERUQgKi8KCn0gU2xXbGFuRXZlbnREYXRhX3U7CgoKdHlwZWRlZiBzdHJ1Y3QKewogICBfdTMyICAgICAgICAgICAgICAgICBJZDsKICAgU2xXbGFuRXZlbnREYXRhX3UgICAgRGF0YTsKfSBTbFdsYW5FdmVudF90OwoKCnR5cGVkZWYgc3RydWN0CnsKICAgIF91MzIgIFJlY2VpdmVkVmFsaWRQYWNrZXRzTnVtYmVyOwkJCQkJCQkvKiBzdW0gb2YgdGhlIHBhY2tldHMgdGhhdCBiZWVuIHJlY2VpdmVkIE9LIChpbmNsdWRlIGZpbHRlcmVkKSAqLwogICAgX3UzMiAgUmVjZWl2ZWRGY3NFcnJvclBhY2tldHNOdW1iZXI7CQkJCQkJLyogc3VtIG9mIHRoZSBwYWNrZXRzIHRoYXQgYmVlbiBkcm9wcGVkIGR1ZSB0byBGQ1MgZXJyb3IgKi8KICAgIF91MzIgIFJlY2VpdmVkQWRkcmVzc01pc21hdGNoUGFja2V0c051bWJlcjsJCQkJCS8qIHN1bSBvZiB0aGUgcGFja2V0cyB0aGF0IGJlZW4gcmVjZWl2ZWQgYnV0IGZpbHRlcmVkIG91dCBieSBvbmUgb2YgdGhlIEhXIGZpbHRlcnMgKi8KICAgIF9pMTYgIEF2YXJhZ2VEYXRhQ3RybFJzc2k7CQkJCQkJCQkJLyogYXZlcmFnZSBSU1NJIGZvciBhbGwgdmFsaWQgZGF0YSBwYWNrZXRzIHJlY2VpdmVkICovCiAgICBfaTE2ICBBdmFyYWdlTWdNbnRSc3NpOwkJCQkJCQkJCQkvKiBhdmVyYWdlIFJTU0kgZm9yIGFsbCB2YWxpZCBtYW5hZ2VtZW50IHBhY2tldHMgcmVjZWl2ZWQgKi8KICAgIF91MTYgIFJhdGVIaXN0b2dyYW1bU0xfV0xBTl9OVU1fT0ZfUkFURV9JTkRFWEVTXTsgICAgICAgICAgIC8qIHJhdGUgaGlzdG9ncmFtIGZvciBhbGwgdmFsaWQgcGFja2V0cyByZWNlaXZlZCAqLwogICAgX3UxNiAgUnNzaUhpc3RvZ3JhbVtTTF9XTEFOX1NJWkVfT0ZfUlNTSV9ISVNUT0dSQU1dOyAgICAgICAgLyogUlNTSSBoaXN0b2dyYW0gZnJvbSAtNDAgdW50aWwgLTg3IChhbGwgYmVsb3cgYW5kIGFib3ZlXG4gUlNTSSB3aWxsIGFwcGVhciBpbiB0aGUgZmlyc3QgYW5kIGxhc3QgY2VsbHMgKi8KICAgIF91MzIgIFN0YXJ0VGltZVN0YW1wOwkJCQkJCQkJCQkvKiB0aGUgdGltZSBzdGFtcCBzdGFydGVkIGNvbGxlY3RpbmcgdGhlIHN0YXRpc3RpY3MgaW4gdVNlYyAqLwogICAgX3UzMiAgR2V0VGltZVN0YW1wOwkJCQkJCQkJCQkJLyogdGhlIHRpbWUgc3RhbXAgY2FsbGVkIHRoZSBnZXQgc3RhdGlzdGljcyBjb21tYW5kICovCn1TbFdsYW5HZXRSeFN0YXRSZXNwb25zZV90OwoKCgoKdHlwZWRlZiBzdHJ1Y3QKewogICAgX3U4IFNzaWRbU0xfV0xBTl9TU0lEX01BWF9MRU5HVEhdOwogICAgX3U4IEJzc2lkW1NMX1dMQU5fQlNTSURfTEVOR1RIXTsKICAgIF91OCBTc2lkTGVuOwogICAgX2k4IFJzc2k7CiAgICBfaTE2IFNlY3VyaXR5SW5mbzsKICAgIF9pOCBDaGFubmVsOwogICAgX2k4IFJlc2VydmVkWzFdOwp9U2xXbGFuTmV0d29ya0VudHJ5X3Q7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBfdTggICBUeXBlOwogICAgX2k4KiAgS2V5OwogICAgX3U4ICAgS2V5TGVuOwp9U2xXbGFuU2VjUGFyYW1zX3Q7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBfaTgqICBVc2VyOwogICAgX3U4ICAgVXNlckxlbjsKICAgIF9pOCogIEFub25Vc2VyOwogICAgX3U4ICAgQW5vblVzZXJMZW47CiAgICBfdTggICBDZXJ0SW5kZXg7ICAvKiBub3Qgc3VwcG9ydGVkICovCiAgICBfdTMyICBFYXBNZXRob2Q7Cn1TbFdsYW5TZWNQYXJhbXNFeHRfdDsKCnR5cGVkZWYgc3RydWN0CnsKICAgIF9pOCAgIFVzZXJbNjRdOwogICAgX3U4ICAgVXNlckxlbjsKICAgIF9pOCAgIEFub25Vc2VyWzY0XTsKICAgIF91OCAgIEFub25Vc2VyTGVuOwogICAgX3U4ICAgQ2VydEluZGV4OyAgLyogbm90IHN1cHBvcnRlZCAqLwogICAgX3UzMiAgRWFwTWV0aG9kOwp9U2xXbGFuR2V0U2VjUGFyYW1zRXh0X3Q7CgoKI2RlZmluZSBTTF9XTEFOX0NPTk5FQ1RJT05fUFJPVE9DT0xfU1RBICAgICAxCiNkZWZpbmUgU0xfV0xBTl9DT05ORUNUSU9OX1BST1RPQ09MX1AyUENMICAgMgoKdHlwZWRlZiB1bmlvbgp7CiAgICBTbFdsYW5FdmVudENvbm5lY3RfdCAgICAgICBTdGFDb25uZWN0OwogICAgU2xXbGFuRXZlbnRQMlBDb25uZWN0X3QgICAgUDJQQ29ubmVjdDsKfSBTbFdsYW5Db25uZWN0aW9uSW5mb191OwoKdHlwZWRlZiBlbnVtCnsKCVNMX1dMQU5fRElTQ09OTkVDVEVEID0gMCwKICAgIFNMX1dMQU5fQ09OTkVDVEVEX1NUQSwKICAgIFNMX1dMQU5fQ09OTkVDVEVEX1AyUENMLAogICAgU0xfV0xBTl9DT05ORUNURURfUDJQR08sCiAgICBTTF9XTEFOX0FQX0NPTk5FQ1RFRF9TVEFUSU9OUwp9U2xXbGFuQ29ublN0YXR1c0ZsYWdzX2U7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBfdTggTW9kZTsgICAgICAgLyogUk9MRV9TVEEsIFJPTEVfQVAsIFJPTEVfUDJQICovCiAgICBfdTggQ29ublN0YXR1czsgLyogU2xXbGFuQ29ublN0YXR1c0ZsYWdzX2UgKi8KICAgIF91OCBTZWNUeXBlOyAgICAvKiBDdXJyZW50IGNvbm5lY3Rpb24gc2VjdXJpdHkgdHlwZSAtICgwIGluIGNhc2Ugb2YgZGlzY29ubmVjdCBvciBBUCBtb2RlKSBTTF9XTEFOX1NFQ19UWVBFX09QRU4sIFNMX1dMQU5fU0VDX1RZUEVfV0VQLCBTTF9XTEFOX1NFQ19UWVBFX1dQQV9XUEEyLCBTTF9XTEFOX1NFQ19UWVBFX1dQQV9FTlQsIFNMX1dMQU5fU0VDX1RZUEVfV1BTX1BCQywgU0xfV0xBTl9TRUNfVFlQRV9XUFNfUElOICovCiAgICBfdTggUmVzZXJ2ZWQ7CglTbFdsYW5Db25uZWN0aW9uSW5mb191IENvbm5lY3Rpb25JbmZvOwp9U2xXbGFuQ29ublN0YXR1c1BhcmFtX3Q7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBfdTMyICAgQ2hhbm5lbHNNYXNrOwogICAgX2kzMiAgIFJzc2lUaGVyc2hvbGQ7Cn1TbFdsYW5TY2FuUGFyYW1Db21tYW5kX3Q7CgoKdHlwZWRlZiBzdHJ1Y3QKewogICAgX3U4ICAgSWQ7CiAgICBfdTggICBPdWlbM107CiAgICBfdTE2ICBMZW5ndGg7CiAgICBfdTggICBEYXRhWzI1Ml07Cn0gU2xXbGFuSW5mb0VsZW1lbnRfdDsKCnR5cGVkZWYgc3RydWN0CnsKICAgIF91OCAgICAgICAgICBJbmRleDsgIC8qIDAgLSBTTF9XTEFOX01BWF9QUklWQVRFX0lORk9fRUxFTUVOVFNfU1VQUFJPVEVEICovCiAgICBfdTggICAgICAgICAgUm9sZTsgICAvKiBiaXQwOiBBUCA9IDAsIEdPID0gMSAgICAgICAgICAgICAgICAgICAgKi8KICAgIFNsV2xhbkluZm9FbGVtZW50X3QgICBJRTsKfSBTbFdsYW5TZXRJbmZvRWxlbWVudF90OwoKCnR5cGVkZWYgc3RydWN0CnsKICAgIF91MTYgICAgICAgIFJlc2VydmVkOwogICAgX3UxNiAgICAgICAgUmVzZXJ2ZWQyOwogICAgX3UxNiAgICAgICAgTWF4U2xlZXBUaW1lTXM7ICAgLyogbWF4IHNsZWVwIHRpbWUgaW4gbVNlYyBGb3Igc2V0dGluZyBMb25nIFNsZWVwIEludGVydmFsIHBvbGljeSB1c2UgKi8KICAgIF91MTYgICAgICAgIFJlc2VydmVkMzsKfSBTbFdsYW5QbVBvbGljeVBhcmFtc190OwoKCgp0eXBlZGVmICBfaTggICAgU2xXbGFuUnhGaWx0ZXJJRF90OyAvKiBVbmlxdWUgZmlsdGVyIElEIHdoaWNoIGlzIGFsbG9jYXRlZCBieSB0aGUgc3lzdGVtICwgbmVnYXRpdmUgbnVtYmVyIG1lYW5zIGVycm9yICovCgovKiAgUmVwcmVzZW50YXRpb24gb2YgZmlsdGVycyBJZCBhcyBhIGJpdCBmaWVsZAogICAgVGhlIGJpdCBmaWVsZCBpcyB1c2VkIHRvIGRlY2xhcmUgd2hpY2ggZmlsdGVycyBhcmUgaW52b2x2ZWQKICAgIGluIG9wZXJhdGlvbi4gTnVtYmVyIG9mIGZpbHRlciBjYW4gYmUgdXAgdG8gMTI4IGZpbHRlcnMuCiAgICBpLmUuIDEyOCBiaXRzIGFyZSBuZWVkZWQuIE9uIHRoZSBjdXJyZW50IHJlbGVhc2UsIHVwIHRvIDY0IGZpbHRlcnMgY2FuIGJlIGRlZmluZWQuICovCnR5cGVkZWYgX3U4ICAgU2xXbGFuUnhGaWx0ZXJJZE1hc2tfdFsxMjgvOF07CgoKdHlwZWRlZiBfdTggIFNsV2xhblJ4RmlsdGVyU3lzRmlsdGVyc190OyAvKiBEZXNjcmliZXMgdGhlIHN1cHBvcnRlZCBzeXN0ZW0gZmlsdGVyIHNldHMqLwovKiBwb3NzaWJsZSB2YWx1ZXMgZm9yIFNsV2xhblJ4RmlsdGVyU3lzRmlsdGVyc190ICovCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfQVJQX0FVVE9fUkVQTFlfU1lTX0ZJTFRFUlMgICAgICAgKDApCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfTVVMVElDQVNUU0lQVjRfU1lTX0ZJTFRFUlMgICAgICAgKDEpCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfTVVMVElDQVNUU0lQVjZfU1lTX0ZJTFRFUlMgICAgICAgKDIpCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfTVVMVElDQVNUU1dJRklfU1lTX0ZJTFRFUlMgICAgICAgKDMpCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfU0VMRl9NQUNfQUREUl9EUk9QX1NZU19GSUxURVJTICAgKDQpCgoKLyogIERlc2NyaWJlcyB0aGUgc3VwcG9ydGVkIHN5c3RlbSBmaWx0ZXIgc2V0cywgZWFjaCBiaXQgcmVwcmVzZW50cyBkaWZmZXJlbnQgc3lzdGVtIGZpbHRlciBzZXQKICAgIFRoZSBmaWx0ZXIgc2V0cyBhcmUgZGVmaW5lZCBhdCBTbFdsYW5SeEZpbHRlclN5c0ZpbHRlcnNfdCAgKi8KdHlwZWRlZiBfdTggICBTbFdsYW5SeEZpbHRlclN5c0ZpbHRlcnNNYXNrX3RbU0xfV0xBTl9SWF9GSUxURVJfTUFYX1NZU19GSUxURVJTX1NFVFMvOF07Cgp0eXBlZGVmIHN0cnVjdCAKewogICAgX3UxNiAgICBPZmZzZXQ7ICAgICAvKiAgT2Zmc2V0IGluIHBheWxvYWQgLSBXaGVyZSBpbiB0aGUgcGF5bG9hZCB0byBzZWFyY2ggZm9yIHRoZSBwYXR0ZXJuICovCiAgICBfdTggICAgIExlbmd0aDsgICAgIC8qIFBhdHRlcm4gTGVuZ3RoICovCiAgICBfdTggICAgIFJlc2VydmVkOwogICAgX3U4ICAgICBWYWx1ZVsxNl07LyogVXAgdG8gMTYgYnl0ZXMgbG9uZyAoYmFzZWQgb24gcGF0dGVybiBsZW5ndGggYWJvdmUpICovCn1TbFdsYW5SeEZpbHRlclBhdHRlcm5BcmdfdDsKCgp0eXBlZGVmIF91OCBTbFdsYW5SeEZpbHRlclJ1bGVUeXBlX3Q7IC8qIERpZmZlcmVudCBmaWx0ZXIgdHlwZXMgKi8KLyogcG9zc2libGUgdmFsdWVzIGZvciBTbFdsYW5SeEZpbHRlclJ1bGVUeXBlX3QgKi8KI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9IRUFERVIgICAgICAgICAgICAgICAgICAgICgwKQojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX0NPTUJJTkFUSU9OICAgICAgICAgICAgICAgKDEpCgp0eXBlZGVmIF91OCBTbFdsYW5SeEZpbHRlckZsYWdzX3U7Ci8qIFBvc3NpYmxlIHZhbHVlcyBmb3IgU2xXbGFuUnhGaWx0ZXJGbGFnc191ICovCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfQklOQVJZICAgICAgICAgICAgICAgICAgICAoMHgxKQojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX1BFUlNJU1RFTlQgICAgICAgICAgICAgICAgKDB4OCkKI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICgweDEwKQoKLyogVXNlZCBhcyBjb21wYXJpc29uIGZ1bmN0aW9uIGZvciB0aGUgaGVhZGVyIHR5cGUgYXJndW1lbnRzICovCnR5cGVkZWYgX3U4IFNsV2xhblJ4RmlsdGVyUnVsZUhlYWRlckNvbXBhcmVGdW5jdGlvbl90OwovKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIFNsV2xhblJ4RmlsdGVyUnVsZUhlYWRlckNvbXBhcmVGdW5jdGlvbl90ICovCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfQ01QX0ZVTkNfSU5fQkVUV0VFTiAgICAgICAoMCkKI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9DTVBfRlVOQ19FUVVBTCAgICAgICAgICAgICgxKQojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX0NNUF9GVU5DX05PVF9FUVVBTF9UTyAgICAgKDIpCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfQ01QX0ZVTkNfTk9UX0lOX0JFVFdFRU4gICAoMykKCgp0eXBlZGVmIF91OCBTbFdsYW5SeEZpbHRlclRyaWdnZXJDb21wYXJlRnVuY3Rpb25fdDsKLyogUG9zc2libGUgdmFsdWVzIGZvciBTbFdsYW5SeEZpbHRlclRyaWdnZXJDb21wYXJlRnVuY3Rpb25fdCAqLwojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX1RSSUdHRVJfQ01QX0ZVTkNfRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAoMCkKI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9UUklHR0VSX0NNUF9GVU5DX05PVF9FUVVBTF9UTyAgICAgICAgICAgICAgICAgKDEpIC8qICAgYXJnMSA9PSBwcm90b2NvbFZhbCAsbm90IHN1cHBvcnRlZCBpbiBjdXJyZW50IHJlbGVhc2UgKi8KI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9UUklHR0VSX0NNUF9GVU5DX1NNQUxMRVJfVEhBTiAgICAgICAgICAgICAgICAgKDIpIC8qICAgYXJnMSA9PSBwcm90b2NvbFZhbCAqLwojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX1RSSUdHRVJfQ01QX0ZVTkNfQklHR0VSX1RIQU4gICAgICAgICAgICAgICAgICAoMykgLyogICBhcmcxID09IHByb3RvY29sVmFsICovCgoKdHlwZWRlZiBfdTggU2xXbGFuUnhGaWx0ZXJSdWxlSGVhZGVyRmllbGRfdDsgLyogUHJvdmlkZXMgbGlzdCBvZiBwb3NzaWJsZSBoZWFkZXIgdHlwZXMgd2hpY2ggbWF5IGJlIGRlZmluZWQgYXMgcGFydCBvZiB0aGUgcnVsZSAqLwovKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIFNsV2xhblJ4RmlsdGVyUnVsZUhlYWRlckZpZWxkX3QgKi8KI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9IRklFTERfTlVMTCAgICAgICAgICAgICAgICAgICAgICgwKQojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX0hGSUVMRF9GUkFNRV9UWVBFICAgICAgICAgICAgICAgKDEpIC8qIDgwMi4xMSBjb250cm9sXGRhdGFcbWFuYWdlbWVudCAqLwojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX0hGSUVMRF9GUkFNRV9TVUJUWVBFICAgICAgICAgICAgKDIpIC8qICA4MDIuMTEgYmVhY29uXHByb2JlXC4uICovCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfSEZJRUxEX0JTU0lEICAgICAgICAgICAgICAgICAgICAoMykgIC8qICA4MDIuMTEgYnNzaWQgdHlwZSAqLwojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX0hGSUVMRF9NQUNfU1JDX0FERFIgICAgICAgICAgICAgKDQpCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfSEZJRUxEX01BQ19EU1RfQUREUiAgICAgICAgICAgICAoNSkKI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9IRklFTERfRlJBTUVfTEVOR1RIICAgICAgICAgICAgICg2KQojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX0hGSUVMRF9FVEhFUl9UWVBFICAgICAgICAgICAgICAgKDcpCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfSEZJRUxEX0lQX1ZFUlNJT04gICAgICAgICAgICAgICAoOCkKI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9IRklFTERfSVBfUFJPVE9DT0wgICAgICAgICAgICAgICg5KSAgLyogVENQIC8gVURQIC8gSUNNUCAvIElDTVB2NiAvIElHTVAgKi8KI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9IRklFTERfSVBWNF9TUkNfQUREUiAgICAgICAgICAgICgxMCkKI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9IRklFTERfSVBWNF9EU1RfQUREUiAgICAgICAgICAgICgxMSkKI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9IRklFTERfSVBWNl9TUkNfQURSUiAgICAgICAgICAgICgxMikKI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9IRklFTERfSVBWNl9EU1RfQUREUiAgICAgICAgICAgICgxMykKI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9IRklFTERfUE9SVF9TUkMgICAgICAgICAgICAgICAgICgxNCkKI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9IRklFTERfUE9SVF9EU1QgICAgICAgICAgICAgICAgICgxNSkKI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9IRklFTERfTDRfUEFZTE9BRF9QQVRURVJOICAgICAgICgxOSkgLyogdXNlIHRvIGxvb2sgZm9yIHBhdHRlcm5zIG9uIHRoZSBUQ1AgYW5kIFVEUCBwYXlsb2FkcyAoYWZ0ZXIgVENQL1VEUCBoZWFkZXIpICovCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfSEZJRUxEX0wxX1BBWUxPQURfUEFUVEVSTiAgICAgICAoMjApIC8qIHVzZSB0byBsb29rIGZvciBwYXR0ZXJucyBvbiB0aGUgUEhZIHBheWxvYWQgKGkuZS4gYmVnaW5uaW5nIG9mIFdMQU4gTUFDIGhlYWRlcikgKi8KI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9IRklFTERfTUFYX0ZJRUxEICAgICAgICAgICAgICAgICgyMSkgLyogRGVmaW5pdGlvbiAqLwoKCi8qIEhvbGRzIHRoZSBoZWFkZXIgQVJHUyB3aGljaCBhcmUgdXNlZCBpbiBjYXNlIG9mIEhEUiBydWxlICovCnR5cGVkZWYgdW5pb24gCnsKICAgIC8qIGJ1ZmZlciBmb3IgcGF0dGVybiBtYXRjaGluZyBpbiBwYXlsb2FkIHVwIHRvIDE2IGJ5dGVzIChCaW5hcnkgVmFsdWVzKSAqLwogICAgU2xXbGFuUnhGaWx0ZXJQYXR0ZXJuQXJnX3QgIFBhdHRlcm47CgogICAgLyogQnVmZmVyIGZvciBpcHY0IGFkZHJlc3MgZmlsdGVyLiBiaW5hcnkgYXJndW1lbnRzLCBudW1iZXIgb2YgYXJndW1lbnQgbWF5IGJlIHVwIHRvIFNMX1dMQU5fUlhfRklMVEVSX05VTV9PRl9GSUxURVJfSEVBREVSX0FSR1MqLwogICAgX3U4IElwdjRbU0xfV0xBTl9SWF9GSUxURVJfTlVNX09GX0ZJTFRFUl9IRUFERVJfQVJHU11bNF07IC8qICBCaW5hcnkgVmFsdWVzIGZvciBjb21wYXJpc29uICovCgogICAgLyogQnVmZmVyIGZvciBpcHY0IGFkZHJlc3MgZmlsdGVyLiBBc2NpaSBhcmd1bWVudHMgLSBJUHY0IGFkZHJlc3M6IDQgYnl0ZXM6IGRkZC5kZGQuZGRkLmRkZCAtIDE1IGNoYXJzLiBOdW1iZXIgb2YgYXJndW1lbnQgbWF5IGJlIHVwIHRvIFNMX1dMQU5fUlhfRklMVEVSX05VTV9PRl9GSUxURVJfSEVBREVSX0FSR1MqLwogICAgX3U4IElwdjRBc2NpaVtTTF9XTEFOX1JYX0ZJTFRFUl9OVU1fT0ZfRklMVEVSX0hFQURFUl9BUkdTXVsxNl07IC8qICBBc2NpaSBWYWx1ZXMgZm9yIGNvbXBhcmlzb24gKi8KCiAgICAvKiBCdWZmZXIgZm9yIGlwdjYgYWRkcmVzcyBmaWx0ZXIuIGJpbmFyeSBhcmd1bWVudHMsIEFzY2lpIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiBudW1iZXIgb2YgYXJndW1lbnQgbWF5IGJlIHVwIHRvIFNMX1dMQU5fUlhfRklMVEVSX05VTV9PRl9GSUxURVJfSEVBREVSX0FSR1MqLwogICAgX3U4IElwdjZbU0xfV0xBTl9SWF9GSUxURVJfTlVNX09GX0ZJTFRFUl9IRUFERVJfQVJHU11bMTZdOyAvKiAgQmluYXJ5IFZhbHVlcyBmb3IgY29tcGFyaXNvbiAqLwoKICAgIC8qIEJ1ZmZlciBmb3IgbWFjIGFkZHJlc3MgZmlsdGVyLiBiaW5hcnkgYXJndW1lbnRzLiAgbnVtYmVyIG9mIGFyZ3VtZW50IG1heSBiZSB1cCB0byBTTF9XTEFOX1JYX0ZJTFRFUl9OVU1fT0ZfRklMVEVSX0hFQURFUl9BUkdTKi8KICAgIF91OCBNYWNbU0xfV0xBTl9SWF9GSUxURVJfTlVNX09GX0ZJTFRFUl9IRUFERVJfQVJHU11bNl07IC8qICBCaW5hcnkgVmFsdWVzIGZvciBjb21wYXJpc29uICovCgogICAgLyogQnVmZmVyIGZvciBtYWMgYWRkcmVzcyBmaWx0ZXIuIEFzY2lpIGFyZ3VtZW50cyAtIE1BQyBhZGRyZXNzOiAgNiBieXRlczogeHg6eHg6eHg6eHg6eHg6eHggLSAxNyBjaGFycy4gIG51bWJlciBvZiBhcmd1bWVudCBtYXkgYmUgdXAgdG8gU0xfV0xBTl9SWF9GSUxURVJfTlVNX09GX0ZJTFRFUl9IRUFERVJfQVJHUyAqLwogICAgX3U4IE1hY0FzY2lpW1NMX1dMQU5fUlhfRklMVEVSX05VTV9PRl9GSUxURVJfSEVBREVSX0FSR1NdWzE4XTsgLyogIEFzY2lpIFZhbHVlcyBmb3IgY29tcGFyaXNvbiAqLwoKICAgIC8qIEJ1ZmZlciBmb3IgQlNTSUQgYWRkcmVzcyBmaWx0ZXIuIGJpbmFyeSBhcmd1bWVudHMuICBudW1iZXIgb2YgYXJndW1lbnQgbWF5IGJlIHVwIHRvIFNMX1dMQU5fUlhfRklMVEVSX05VTV9PRl9GSUxURVJfSEVBREVSX0FSR1MqLwogICAgX3U4IEJzc2lkW1NMX1dMQU5fUlhfRklMVEVSX05VTV9PRl9GSUxURVJfSEVBREVSX0FSR1NdWzZdOyAvKiAgQmluYXJ5IFZhbHVlcyBmb3IgY29tcGFyaXNvbiAqLwoKICAgIC8qIEJ1ZmZlciBmb3IgZnJhbWUgbGVuZ3RoIGZpbHRlci4gbnVtYmVyIG9mIGFyZ3VtZW50IG1heSBiZSB1cCB0byBTTF9XTEFOX1JYX0ZJTFRFUl9OVU1fT0ZfRklMVEVSX0hFQURFUl9BUkdTICovCiAgICBfdTMyIEZyYW1lTGVuZ3RoW1NMX1dMQU5fUlhfRklMVEVSX05VTV9PRl9GSUxURVJfSEVBREVSX0FSR1NdOyAvKiAgQmluYXJ5IFZhbHVlcyBmb3IgY29tcGFyaXNvbiAqLwoKICAgIC8qIEJ1ZmZlciBmb3IgcG9ydCBmaWx0ZXIuIG51bWJlciBvZiBhcmd1bWVudCBtYXkgYmUgdXAgdG8gU0xfV0xBTl9SWF9GSUxURVJfTlVNX09GX0ZJTFRFUl9IRUFERVJfQVJHUyAqLwogICAgX3UxNiBQb3J0W1NMX1dMQU5fUlhfRklMVEVSX05VTV9PRl9GSUxURVJfSEVBREVSX0FSR1NdOyAvKiAgQmluYXJ5IFZhbHVlcyBmb3IgY29tcGFyaXNvbiAqLwoKICAgIC8qIEJ1ZmZlciBmb3IgRXRoZXIgZmlsdGVyLiBudW1iZXIgb2YgYXJndW1lbnQgbWF5IGJlIHVwIHRvIFNMX1dMQU5fUlhfRklMVEVSX05VTV9PRl9GSUxURVJfSEVBREVSX0FSR1MgKGFjY29yZGluZyB0byBob3N0IGVuZGlhbml0eSkgKi8KICAgIF91MzIgRXRoZXJUeXBlW1NMX1dMQU5fUlhfRklMVEVSX05VTV9PRl9GSUxURVJfSEVBREVSX0FSR1NdOyAvKiAgQmluYXJ5IFZhbHVlcyBmb3IgY29tcGFyaXNvbiAqLwoKICAgIC8qIEJ1ZmZlciBmb3IgaXAgdmVyc2lvbiBmaWx0ZXIuIEJ1ZmZlciBmb3IgYmluYXJ5IGFyZ3VtZW50cy4gSVAgVmVyc2lvbiAtIDQgZm9yIElQVjQgYW5kIDYgZm9yIElQVjYgICovCiAgICBfdTggSXBWZXJzaW9uOwoKICAgIC8qIEJ1ZmZlciBmb3IgZnJhbWUgdHlwZSBmaWx0ZXIuIEJ1ZmZlciBmb3IgYmluYXJ5IGFyZ3VtZW50cy4gRnJhbWUgVHlwZSAoMCAtIG1hbmFnZW1lbnQsIDEgLSBDb250cm9sLCAyIC0gRGF0YSkgICovCiAgICBfdTggRnJhbWV0eXBlW1NMX1dMQU5fUlhfRklMVEVSX05VTV9PRl9GSUxURVJfSEVBREVSX0FSR1NdOwoKICAgIC8qIEJ1ZmZlciBmb3IgZnJhbWUgc3VidHlwZSBmaWx0ZXIuIEJ1ZmZlciBmb3IgYmluYXJ5IGFyZ3VtZW50cy4gRnJhbWUgU3ViIFR5cGUgKGNoZWNrb3V0IHRoZSBmdWxsIGxpc3QgaW4gdGhlIDgwMi4xMSBzcGVjKS4gZS5nLiBCZWFjb249MHg4MCwgRGF0YT0weDA4LCBRb3MtRGF0YT0weDA0LCBBQ0s9MHhENCwgZXRjLiAqLwogICAgX3U4IEZyYW1lU3VidHlwZVtTTF9XTEFOX1JYX0ZJTFRFUl9OVU1fT0ZfRklMVEVSX0hFQURFUl9BUkdTXTsKCiAgICAvKiBCdWZmZXIgZm9yIHByb3RvY29sIHR5cGUgZmlsdGVyLiBCdWZmZXIgZm9yIGJpbmFyeSBhcmd1bWVudHMuIGUuZy4gMSCWIElDTVAgKElQVjQgb25seSksIDIgLSBJR01QIChJUFY0IG9ubHkpLCA2IJYgVENQLiAxNyCWIFVEUCwgNTggliBJQ01QVjYgKi8KICAgIF91OCBJcFByb3RvY29sW1NMX1dMQU5fUlhfRklMVEVSX05VTV9PRl9GSUxURVJfSEVBREVSX0FSR1NdOwoKICAgIC8qIEJ1ZmZlciBmb3IgaXAgdmVyc2lvbiBmaWx0ZXIuIEJ1ZmZlciBmb3IgQVNDSUkgYXJndW1lbnRzLiBVc2UgZm9yIElQIHZlcnNpb24gZmllbGQgY29tcGFyaXNvbiBzZXR0aW5nczogIklQVjQiLCAiSVBWNiIgICovCiAgICBfdTggSXBWZXJzaW9uQXNjaWlbNF07CgogICAgLyogQnVmZmVyIGZvciBmcmFtZSB0eXBlIGZpbHRlci4gQnVmZmVyIGZvciBBU0NJSSBhcmd1bWVudHMuIFVzZSBmb3IgRnJhbWUgdHlwZSBmaWVsZCBjb21wYXJpc29uIHNldHRpbmdzOiAiTUdNVCIsICJDVFJMIiwgIkRBVEEiICAqLwogICAgX3U4IEZyYW1ldHlwZUFzY2lpW1NMX1dMQU5fUlhfRklMVEVSX05VTV9PRl9GSUxURVJfSEVBREVSX0FSR1NdWzRdOwoKICAgIC8qIEJ1ZmZlciBmb3IgcHJvdG9jb2wgdHlwZSBmaWx0ZXIuIEJ1ZmZlciBmb3IgQVNDSUkgYXJndW1lbnRzLiBVc2UgZm9yIHByb3RvY29sIGZpZWxkIGNvbXBhcmlzb24gc2V0dGluZ3M6ICJJQ01QIiwgIklHTVAiLCAiVENQLCAiVURQIiwgIklDTVA2IiAgKi8KICAgIC8qIE5vdGU6IFVzZSBtZW1jcHkgd2l0aCB0aGVzZSBzdHJpbmdzIGluc3RlYWQgb2Ygc3RyY3B5IChubyBcMCBzaG91bGQgYmUgYXQgdGhlIGVuZCwgYXMgdGhlIGFycmF5IGlzIDUgYnl0ZXMgbG9uZyBhbmQgSUNNUDYgaXMgYWxyZWFkeSA1IGJ5dGVzIGxvbmcgd2l0aG91dCB0aGUgXDApICovCiAgICBfdTggSXBQcm90b2NvbEFzY2lpW1NMX1dMQU5fUlhfRklMVEVSX05VTV9PRl9GSUxURVJfSEVBREVSX0FSR1NdWzVdOwoKfVNsV2xhblJ4RmlsdGVySGVhZGVyQXJnX3U7CgoKLyogRGVmaW5lcyB0aGUgSGVhZGVyIEFyZ3MgYW5kIG1hc2sgKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgU2xXbGFuUnhGaWx0ZXJIZWFkZXJBcmdfdSAgICAgICAgICAgICAgICAgICBWYWx1ZTsgLyogQXJndW1lbnQgZm9yIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uICovCiAgICBfdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hc2tbMTZdOyAgLyogdGhlIG1hc2sgaXMgdXNlZCBpbiBvcmRlciB0byBlbmFibGUgcGFydGlhbCBjb21wYXJpc29uIChiaXQgbGV2ZWwpLCBVc2UgdGhlIDB4RkZGRkZGRkYgaW4gY2FzZSB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgbWFzayAqLwoKfVNsV2xhblJ4RmlsdGVyUnVsZUhlYWRlckFyZ3NfdDsKCi8qIGRlZmluZXMgdGhlIEhlYWRlciBydWxlLiBUaGUgaGVhZGVyIHJ1bGUgZGVmaW5lcyB0aGUgY29tcGFyZSBmdW5jdGlvbiBvbiB0aGUgcHJvdG9jb2wgaGVhZGVyCiAgIEZvciBleGFtcGxlIGRlc3RNYWNBZGRyZSBpcyBiZXR3ZWVuICggMTI6Njo6Nzg6NzcsICAxMjo2Ojo3ODo5MCApICovCnR5cGVkZWYgc3RydWN0IAp7CiAgICBTbFdsYW5SeEZpbHRlclJ1bGVIZWFkZXJBcmdzX3QgICAgICAgICAgICAgIEFyZ3M7IC8qIEZpbHRlciBhcmd1ZW1udHMgKi8KICAgIFNsV2xhblJ4RmlsdGVyUnVsZUhlYWRlckZpZWxkX3QgICAgICAgICAgICAgRmllbGQ7IC8qIFBhY2tldCBIRFIgZmllbGQgd2hpY2ggd2lsbCBiZSBjb21wYXJlZCB0byB0aGUgYXJndW1lbnQgKi8KICAgIFNsV2xhblJ4RmlsdGVyUnVsZUhlYWRlckNvbXBhcmVGdW5jdGlvbl90ICAgQ29tcGFyZUZ1bmM7IC8qICB0eXBlIG9mIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uICovCiAgICBfdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhZGRpbmdbMl07Cn1TbFdsYW5SeEZpbHRlclJ1bGVIZWFkZXJfdDsKCgovKiBPcHRpb25hbCBvcGVyYXRvcnMgZm9yIHRoZSBjb21iaW5hdGlvbiB0eXBlIGZpbHRlcklEMSBpcyBsb2NhdGVkIGluIHRoZSBmaXJzdCBhcmcgLCBmaWx0ZXJJZDIgaXMgdGhlIHNlY29uZCBhcmcgKi8KdHlwZWRlZiBfdTggU2xXbGFuUnhGaWx0ZXJSdWxlQ29tYmluYXRpb25PcGVyYXRvcl90OwovKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIFNsV2xhblJ4RmlsdGVyUnVsZUNvbWJpbmF0aW9uT3BlcmF0b3JfdCAqLwojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX0NPTUJJTkVEX0ZVTkNfTk9UICAgICAoMCkgLyogZmlsdGVySUQxICovCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfQ09NQklORURfRlVOQ19BTkQgICAgICgxKSAvKiBmaWx0ZXJJRDEgJiYgZmlsdGVySUQyICovCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfQ09NQklORURfRlVOQ19PUiAgICAgICgyKSAvKiBmaWx0ZXJJRDEgJiYgZmlsdGVySUQyICovCgoKLyogRGVmaW5lcyB0aGUgc3RydWN0dXJlIHdoaWNoIGRlZmluZSB0aGUgY29tYmluYXRpb24gdHlwZSBmaWx0ZXIKICAgVGhlIGNvbWJpbmVkIGZpbHRlciBlbmFibGUgdG8gbWFrZSBvcGVyYXRpb24gb24gb25lIG9yIHR3byBmaWx0ZXIsCiAgIGZvciBleGFtcGxlIGZpbHRlcklkMSBvciBhbmQoZmlsdGVySWQyLGZpbHRlcklkMykuICovCnR5cGVkZWYgc3RydWN0IAp7CiAgICBTbFdsYW5SeEZpbHRlclJ1bGVDb21iaW5hdGlvbk9wZXJhdG9yX3QgICAgIE9wZXJhdG9yOyAvKiBjb21iaW5hdGlvbiBvcGVyYXRvciAqLwogICAgU2xXbGFuUnhGaWx0ZXJJRF90ICAgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5hdGlvbkZpbHRlcklkW1NMX1dMQU5fUlhfRklMVEVSX1JBTkdFX0FSR1NdOyAvKiBmaWx0ZXJJRCwgbWF5IGJlIG9uZSBvciB0d28gZGVwZW5kcyBvbiB0aGUgY29tYmluYXRpb24gb3BlcmF0b3IgdHlwZSAqLwogICAgX3U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWRkaW5nOwp9U2xXbGFuUnhGaWx0ZXJSdWxlQ29tYmluYXRpb25fdDsKCgovKiBSdWxlIHN0cnVjdHVyZSBjb21wb3NlZCBvZiBiZWhhdmlvcmFsIGZsYWdzIGFuZCB0aGUgZmlsdGVyIHJ1bGUgZGVmaW5pdGlvbnMgKi8KdHlwZWRlZiB1bmlvbiAKewogICAgU2xXbGFuUnhGaWx0ZXJSdWxlSGVhZGVyX3QgICAgICAgICAgICAgICAgICBIZWFkZXI7IC8qIEZpbHRlciBpcyBmcm9tIHR5cGUgSGVhZGVyICovCiAgICBTbFdsYW5SeEZpbHRlclJ1bGVDb21iaW5hdGlvbl90ICAgICAgICAgICAgIENvbWJpbmF0aW9uOyAvKiAgRmlsdGVyIGlzIGZyb20gdHlwZSBDb21iaW5hdGlvbiAqLwp9U2xXbGFuUnhGaWx0ZXJSdWxlX3U7CgoKLyogQml0IGZpZWxkIHdoaWNoIHJlcHJlc2VudHMgdGhlIHJvbGVJZCBwb3NzaWJsZSB2YWx1ZXMKICAgSW4gdGhlIGN1cnJlbnQgcmVsZWFzZSBvbmx5IFN0YXRpb24gKHdpdGggb3Igd2l0aG91dCBwcm9taXNjdW91cyBtb2RlcykgYW5kIEFQIHJvbGVzIGFyZSBzdXBwb3J0ZWQuCiAgIEFjdGl2YXRpbmcgZmlsdGVycyBiZWZvcmUgUDJQIG5lZ290aWF0aW9ucyAoaS5lLiBkZWNpc2lvbiB3aGV0aGVyIHJvbGUgaXMgQ0wgb3IgR08pIG1heSByZXN1bHQgd2l0aAogICB1bmV4cGVjdGVkIGJlaGF2aW91ci4gQWZ0ZXIgdGhpcyBzdGFnZSwgZmlsdGVycyBjYW4gYmUgYWN0aXZhdGVkIHdoZXJlYXMgU1RBIHJvbGUgaXMgdGhlIGVxdWl2YWxlbnQgb2YgUDJQIENMIHJvbGUKICAgQVAgcm9sZSBpcyB0aGUgZXF1aXZhbGVudCBvZiBQMlAgR08gcm9sZS4KICovCnR5cGVkZWYgX3U4IFNsV2xhblJ4RmlsdGVyVHJpZ2dlclJvbGVzX3Q7Ci8qIFBvc3NpYmxlIHZhbHVlcyBmb3IgU2xXbGFuUnhGaWx0ZXJUcmlnZ2VyUm9sZXNfdCAqLwojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX1JPTEVfQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEpCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfUk9MRV9TVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAoMikKI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9ST0xFX1RSQU5DSUVWRVIgICAgICAgICAgICAgICAgICAgICg0KQojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX1JPTEVfTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCgoKdHlwZWRlZiBfdTggU2xXbGFuUnhGaWx0ZXJUcmlnZ2VyQ29ubmVjdGlvblN0YXRlc190OwovKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIFNsV2xhblJ4RmlsdGVyVHJpZ2dlckNvbm5lY3Rpb25TdGF0ZXNfdCAqLwojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX1NUQVRFX1NUQV9DT05ORUNURUQgICAgICgweDEpCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfU1RBVEVfU1RBX05PVF9DT05ORUNURUQgKDB4MikKI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9TVEFURV9TVEFfSEFTX0lQICAgICAgICAoMHg0KQojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX1NUQVRFX1NUQV9IQVNfTk9fSVAgICAgICgweDgpCgoKLyogVGhlcmUgYXJlIDggcG9zc2libGUgY291bnRlci4gaWYgbm8gY291bnRlciBpcyBuZWVkZWQgc2V0IHRvIE5PX1RSSUdHRVJfQ09VTlRFUiAqLwp0eXBlZGVmIF91OCBTbFdsYW5SeEZpbHRlckNvdW50ZXJJZF90OwovKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIFNsV2xhblJ4RmlsdGVyQ291bnRlcklkX3QgKi8KI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9OT19UUklHR0VSX0NPVU5URVIgICAgICAgICAgICAgICAgKDApCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfQ09VTlRFUjEgICAgICAgICAgICAgICAgICAgICAgICAgICgxKQojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX0NPVU5URVIyICAgICAgICAgICAgICAgICAgICAgICAgICAoMikKI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9DT1VOVEVSMyAgICAgICAgICAgICAgICAgICAgICAgICAgKDMpCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfQ09VTlRFUjQgICAgICAgICAgICAgICAgICAgICAgICAgICg0KQojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX0NPVU5URVI1ICAgICAgICAgICAgICAgICAgICAgICAgICAoNSkKI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9DT1VOVEVSNiAgICAgICAgICAgICAgICAgICAgICAgICAgKDYpCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfQ09VTlRFUjcgICAgICAgICAgICAgICAgICAgICAgICAgICg3KQojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX0NPVU5URVI4ICAgICAgICAgICAgICAgICAgICAgICAgICAoOCkKI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9NQVhfQ09VTlRFUiAgICAgICAgICAgICAgICAgICAgICAgKDkpCgoKLyogVGhlIGZpbHRlciB0cmlnZ2VyLCBkZXRlcm1pbmUgd2hlbiB0aGUgZmlsdGVyIGlzIHRyaWdnZXJlZCwKICAgVGhlIGZpbHRlciBpcyB0cmlnZ2VyZWQgaW4gdGhlIGZvbGxvd2luZyBjb25kaXRpb24gOlxuCiAgIDEuIFRoZSBmaWx0ZXIgcGFyZW50IGlzIHRyaWdnZXJlZFxuCiAgIDIuIFRoZSByZXF1ZXN0ZWQgY29ubmVjdGlvbiB0eXBlIGV4aXN0cywgaS5lLiB3bGFuX2Nvbm5lY3RcbgogICAzLiBUaGUgZmlsdGVyIHJvbGUgaXMgdGhlIHNhbWUgYXMgdGhlIHN5c3RlbSByb2xlXG4gKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgU2xXbGFuUnhGaWx0ZXJJRF90ICAgICAgICAgICAgICAgICAgICAgIFBhcmVudEZpbHRlcklEOyAvKiBUaGUgcGFyZW50IGZpbHRlciBJRCwgdGhpcyBpcyB0aGUgd2F5IHRvIGJ1aWxkIGZpbHRlciB0cmVlLiAgTlVMTCB2YWx1ZSBtZWFucyB0cmVlIHJvb3QgKi8KICAgIFNsV2xhblJ4RmlsdGVyQ291bnRlcklkX3QgICAgICAgICAgICAgICBDb3VudGVyOyAvKiBUcmlnZ2VyIG9ubHkgd2hlbiByZWFjaCBjb3VudGVyIHRocmVzaG9sZCAqLwogICAgU2xXbGFuUnhGaWx0ZXJUcmlnZ2VyQ29ubmVjdGlvblN0YXRlc190IENvbm5lY3Rpb25TdGF0ZTsgLyogVHJpZ2dlciBvbmx5IHdpdGggc3BlY2lmaWMgY29ubmVjdGlvbiBzdGF0ZSAqLwogICAgU2xXbGFuUnhGaWx0ZXJUcmlnZ2VyUm9sZXNfdCAgICAgICAgICAgIFJvbGU7IC8qIFRyaWdnZXIgb25seSB3aXRoIHNwZWNpZmljIHJvbGUgKi8KICAgIF91MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudGVyVmFsOyAgLyogVmFsdWUgZm9yIHRoZSBjb3VudGVyIGlmIHNldCAqLwogICAgU2xXbGFuUnhGaWx0ZXJUcmlnZ2VyQ29tcGFyZUZ1bmN0aW9uX3QgIENvbXBhcmVGdW5jdGlvbjsgLyogVGhlIGNvbXBhcmUgZnVuY3Rpb24gcmVmZmVycyB0byB0aGUgY291bnRlciBpZiBzZXQgKi8KICAgIF91OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWRkaW5nWzNdOwp9IFNsV2xhblJ4RmlsdGVyVHJpZ2dlcl90OwoKCi8qIFRoZSBhY3Rpb25zIGFyZSBleGVjdXRlZCBvbmx5IGlmIHRoZSBmaWx0ZXIgaXMgbWF0Y2hlZCxcbgogKiAgSW4gY2FzZSBvZiBmYWxzZSBtYXRjaCB0aGUgcGFja2V0IGlzIHRyYW5zZmVyZWQgdG8gdGhlIEhPU1QuIFxuCiAqICBUaGUgYWN0aW9uIGlzIGNvbXBvc2VkIG9mIGJpdCBmaWVsZCBzdHJ1Y3R1cmUsIHVwIHRvIDIgYWN0aW9ucyBjYW4gYmUgZGVmaW5lZCBwZXIgZmlsdGVyLlxuICAqLwp0eXBlZGVmIF91OCBTbFdsYW5SeEZpbHRlckFjdGlvblR5cGVfdDsKLyogUG9zc2libGUgdmFsdWVzIGZvciBTbFdsYW5SeEZpbHRlckFjdGlvblR5cGVfdCAqLwojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX0FDVElPTl9OVUxMICAgICAgICAgICAgICAgKDB4MCkgLyogTm8gYWN0aW9uIHRvIGV4ZWN1dGUqLwojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX0FDVElPTl9EUk9QICAgICAgICAgICAgICAgKDB4MSkgLyogSWYgbm90IGRyb3BwZWQgLFRoZSBwYWNrZXQgaXMgcGFzc2VkIHRvIHRoZSBuZXh0IGZpbHRlciBvciBpbiBjYXNlIGl0IGlzIHRoZSBsYXN0IGZpbHRlciB0byB0aGUgaG9zdCAqLwojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX0FDVElPTl9PTl9SRUdfSU5DUkVBU0UgICAgKDB4NCkgLyogYWN0aW9uIGluY3JlYXNlIGNvdW50ZXIgcmVnaXN0ZXJzICovCiNkZWZpbmUgU0xfV0xBTl9SWF9GSUxURVJfQUNUSU9OX09OX1JFR19ERUNSRUFTRSAgICAoMHg4KSAvKiBhY3Rpb24gZGVjcmVhc2UgY291bnRlciByZWdpc3RlcnMgKi8KI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9BQ1RJT05fT05fUkVHX1JFU0VUICAgICAgICgweDEwKS8qIGFjdGlvbiByZXNldCBjb3VudGVyIHJlZ2lzdGVycyAqLwojZGVmaW5lIFNMX1dMQU5fUlhfRklMVEVSX0FDVElPTl9TRU5EX1RFTVBMQVRFICAgICAgKDB4MjApLyogdW5zdXBwb3J0ZWQgKi8KI2RlZmluZSBTTF9XTEFOX1JYX0ZJTFRFUl9BQ1RJT05fRVZFTlRfVE9fSE9TVCAgICAgICgweDQwKS8qIGFjdGlvbiBjYW4gc2VuZCBldmVudHMgdG8gaG9zdCAqLwoKCgovKiBTZXZlcmFsIGFjdGlvbnMgY2FuIGJlIGRlZmluZWQgVGhlIGFjdGlvbiBpcyBleGVjdXRlZCBpbiBjYXNlIHRoZSBmaWx0ZXIgcnVsZSBpcyBtYXRjaGVkLiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBTbFdsYW5SeEZpbHRlckFjdGlvblR5cGVfdCBUeXBlOyAvKiBEZXRlcm1pbmUgd2hpY2ggYWN0aW9ucyBhcmUgc3VwcG9ydGVkICovCiAgICBfdTggICAgQ291bnRlcjsgICAgLyogVGhlIGNvdW50ZXIgaW4gdXNlLiBJbiBjYXNlIHRoZSBhY3Rpb24gaXMgb2YgdHlwZSBpbmNyZWFzZVxkZWNyZWFzZVxyZXNldCB0aGlzIGFyZyB3aWxsIGNvbnRhaW4gdGhlIGNvdW50ZXIgbnVtYmVyLCBUaGUgY291bnRlciBudW1iZXIgdmFsdWVzIGFyZSBhcyBpbiAgOjpTbFdsYW5SeEZpbHRlckNvdW50ZXJJZF90LlxuKi8KICAgIF91MTYgICBSZXNlcnZlZDsgICAvKiBNdXN0IGJlIHNldCB0byB6ZXJvICovCiAgICBfdTggICAgVXNlcklkOyAgICAgLyogSW4gY2FzZSBhY3Rpb24gc2V0IHRvIGhvc3QgZXZlbnQsIHVzZXIgY2FuIHNldCBpZCB3aGljaCB3aWxsIHJldHVybiBpbiB0aGUgZXZlbnQgYXJndW1lbnRzICovCiAgICBfdTggICAgUGFkZGluZ1szXTsKCn0gU2xXbGFuUnhGaWx0ZXJBY3Rpb25fdDsKCi8qIFRoZSBzdXBwb3J0ZWQgb3BlcmF0aW9uOiBTTF9XTEFOX1JYX0ZJTFRFUl9TVEFURSwgU0xfV0xBTl9SWF9GSUxURVJfUkVNT1ZFICovCnR5cGVkZWYgc3RydWN0CnsKICAgIFNsV2xhblJ4RmlsdGVySWRNYXNrX3QgRmlsdGVyQml0bWFwOwogICAgX3U4IFBhZGRpbmdbNF07Cgp9IFNsV2xhblJ4RmlsdGVyT3BlcmF0aW9uQ29tbWFuZEJ1ZmZfdDsKCi8qIFRoZSBzdXBwb3J0ZWQgb3BlcmF0aW9uOiBTTF9XTEFOX1JYX0ZJTFRFUl9VUERBVEVfQVJHUyAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBfdTggIEZpbHRlcklkOwogICAgX3U4ICBCaW5hcnlPckFzY2lpOyAvKiBTZXQgMSBmb3IgQmluYXJ5IGFyZ3VtZW50IHJlcHJlc2VudGF0aW9uLCAwIC0gZm9yIEFzY2lpIHJlcHJlc2VudGF0aW9uICovCglfdTggUGFkZGluZ1syXTsKICAgIFNsV2xhblJ4RmlsdGVyUnVsZUhlYWRlckFyZ3NfdCBBcmdzOwogICAgCgp9IFNsV2xhblJ4RmlsdGVyVXBkYXRlQXJnc0NvbW1hbmRCdWZmX3Q7CgoKLyogRmlsdGVycyBiaXRtYXAgZW5hYmxlXGRpc2FibGUgc3RhdHVzIHJldHVybiB2YWx1ZSAqLwp0eXBlZGVmIHN0cnVjdCAKewogICAgU2xXbGFuUnhGaWx0ZXJJZE1hc2tfdCBGaWx0ZXJJZE1hc2s7IC8qIFRoZSBmaWx0ZXIgc2V0IGJpdCBtYXAgKi8KCn1TbFdsYW5SeEZpbHRlclJldHJpZXZlU3RhdGVCdWZmX3Q7CgovKiBEaXNiYWxlL0VuYWJsZSBzeXN0ZW0gZmlsdGVycyAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBTbFdsYW5SeEZpbHRlclN5c0ZpbHRlcnNNYXNrX3QgIEZpbHRlckJpdG1hcDsgLyogVGhlIGZpbHRlciBzZXQgYml0IG1hcCAqLwoKfSBTbFdsYW5SeEZpbHRlclN5c0ZpbHRlcnNTZXRTdGF0ZUJ1ZmZfdDsKCi8qIFN5c3RlbSBmaWx0ZXJzIHN0YXR1cyByZXR1cm4gdmFsdWUgKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgU2xXbGFuUnhGaWx0ZXJTeXNGaWx0ZXJzTWFza190ICBGaWx0ZXJCaXRtYXA7IC8qIFRoZSBmaWx0ZXIgZ2V0IGJpdCBtYXAgKi8KCn0gU2xXbGFuUnhGaWx0ZXJTeXNGaWx0ZXJzUmV0cmlldmVTdGF0ZUJ1ZmZfdDsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgovKiEKICAgIFxicmllZiBDb25uZWN0IHRvIHdsYW4gbmV0d29yayBhcyBhIHN0YXRpb24KCgogICAgXHBhcmFtW2luXSAgICAgIHBOYW1lICAgICAgIFVwIHRvIDMyIGJ5dGVzIGluIGNhc2Ugb2YgU1RBIHRoZSBuYW1lIGlzIHRoZSBTU0lEIG9mIHRoZSBBY2Nlc3MgUG9pbnQKICAgIFxwYXJhbVtpbl0gICAgICBOYW1lTGVuICAgICBOYW1lIGxlbmd0aAogICAgXHBhcmFtW2luXSAgICAgIHBNYWNBZGRyICAgIDYgYnl0ZXMgZm9yIE1BQyBhZGRyZXNzCiAgICBccGFyYW1baW5dICAgICAgcFNlY1BhcmFtcyAgU2VjdXJpdHkgcGFyYW1ldGVycyAodXNlIE5VTEwga2V5IGZvciBTTF9XTEFOX1NFQ19UWVBFX09QRU4pXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eSB0eXBlcyBvcHRpb25zOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNMX1dMQU5fU0VDX1RZUEVfT1BFTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfV0xBTl9TRUNfVFlQRV9XRVAKCQkJCQkJCQktIFNMX1dMQU5fU0VDX1RZUEVfV0VQX1NIQVJFRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfV0xBTl9TRUNfVFlQRV9XUEFfV1BBMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfV0xBTl9TRUNfVFlQRV9XUEFfRU5UCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTF9XTEFOX1NFQ19UWVBFX1dQU19QQkMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNMX1dMQU5fU0VDX1RZUEVfV1BTX1BJTgoKICAgIFxwYXJhbVtpbl0gICAgICBwU2VjRXh0UGFyYW1zICBFbnRlcnByaXNlIHBhcmFtZXRlcnMgKHNldCBOVUxMIGluIGNhc2UgRW50ZXJwcmlzZSBwYXJhbWV0ZXJzIGlzIG5vdCBpbiB1c2UpCgogICAgXHJldHVybiAgICAgICAgIFplcm8gb24gc3VjY2Vzcywgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCgoKICAgIFxzYSAgICAgICAgICAgICBzbF9XbGFuRGlzY29ubmVjdAogICAgXG5vdGUgICAgICAgICAgIEJlbG9uZ3MgdG8gXHJlZiBleHRfYXBpCiAgICBcd2FybmluZyAgICAgICAgSW4gdGhpcyB2ZXJzaW9uIG9ubHkgc2luZ2xlIGVudGVycHJpc2UgbW9kZSBjb3VsZCBiZSB1c2VkXG4KICAgICAgICAgICAgICAgICAgICBTTF9XTEFOX1NFQ19UWVBFX1dQQSBpcyBhIGRlcHJlY2F0ZWQgZGVmaW5pdGlvbiwgdGhlIG5ldyBkZWZpbml0aW9uIGlzIFNMX1dMQU5fU0VDX1RZUEVfV1BBX1dQQTIKCVxwYXIgRXhhbXBsZQoJCgktIENvbm5lY3Qgd2l0aG91dCBzZWN1cml0eToKICAgIFxjb2RlCgkJCVNsV2xhblNlY1BhcmFtc190IHNlY1BhcmFtczsKCQkJc2VjUGFyYW1zLktleSA9ICIiOwoJCQlzZWNQYXJhbXMuS2V5TGVuID0gMDsKCQkJc2VjUGFyYW1zLlR5cGUgPSBTTF9XTEFOX1NFQ19UWVBFX09QRU47CgkJCXNsX1dsYW5Db25uZWN0KCJzc2lkX25hbWUiLCBzdHJsZW4oInNzaWRfbmFtZSIpLDAsJnNlY1BhcmFtcywwKTsKCVxlbmRjb2RlCiovCiNpZiBfU0xfSU5DTFVERV9GVU5DKHNsX1dsYW5Db25uZWN0KQpfaTE2IHNsX1dsYW5Db25uZWN0KGNvbnN0IF9pOCogIHBOYW1lLGNvbnN0ICBfaTE2IE5hbWVMZW4sY29uc3QgX3U4ICpwTWFjQWRkcixjb25zdCBTbFdsYW5TZWNQYXJhbXNfdCogcFNlY1BhcmFtcyAsY29uc3QgU2xXbGFuU2VjUGFyYW1zRXh0X3QqIHBTZWNFeHRQYXJhbXMpOwojZW5kaWYKCi8qIQogICAgXGJyaWVmIFdsYW4gZGlzY29ubmVjdAoKICAgIERpc2Nvbm5lY3QgY29ubmVjdGlvbgoKICAgIFxyZXR1cm4gICAgICAgICBaZXJvIGRpc2Nvbm5lY3RlZCBkb25lIHN1Y2Nlc3NmdWxseSwgb3RoZXIgYWxyZWFkeSBkaXNjb25uZWN0ZWQKCiAgICBcc2EgICAgICAgICAgICAgc2xfV2xhbkNvbm5lY3QKICAgIFxub3RlICAgICAgICAgICBiZWxvbmdzIHRvIFxyZWYgZXh0X2FwaQogICAgXHdhcm5pbmcKKi8KI2lmIF9TTF9JTkNMVURFX0ZVTkMoc2xfV2xhbkRpc2Nvbm5lY3QpCl9pMTYgc2xfV2xhbkRpc2Nvbm5lY3Qodm9pZCk7CiNlbmRpZgoKLyohCiAgICBcYnJpZWYgQWRkIHByb2ZpbGUKCiAgICBXaGVuIGF1dG8gc3RhcnQgaXMgZW5hYmxlZCwgdGhlIGRldmljZSBjb25uZWN0cyB0byBhCiAgICBzdGF0aW9uIGZyb20gdGhlIHByb2ZpbGVzIHRhYmxlLiBVcCB0byA3IHByb2ZpbGVzIChTTF9XTEFOX01BWF9QUk9GSUxFUykgYXJlCiAgICBzdXBwb3J0ZWQuXG4gSWYgc2V2ZXJhbCBwcm9maWxlcyBjb25maWd1cmVkIHRoZSBkZXZpY2UgY2hvc2UKICAgIHRoZSBoaWdoZXN0IHByaW9yaXR5IHByb2ZpbGUsIHdpdGhpbiBlYWNoIHByaW9yaXR5IGdyb3VwLAogICAgZGV2aWNlIHdpbGwgY2hvc2UgcHJvZmlsZSBiYXNlZCBvbiBzZWN1cml0eSBwb2xpY3ksIHNpZ25hbAogICAgc3RyZW5ndGgsIGV0YyBwYXJhbWV0ZXJzLgoKCiAgICBccGFyYW1baW5dICAgICAgcE5hbWUgICAgICAgICAgVXAgdG8gMzIgYnl0ZXMgaW4gY2FzZSBvZiBTVEEgdGhlIG5hbWUgaXMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NJRCBvZiB0aGUgQWNjZXNzIFBvaW50LlxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gY2FzZSBvZiBQMlAgdGhlIG5hbWUgaXMgdGhlIHJlbW90ZSBkZXZpY2UgbmFtZS4KICAgIFxwYXJhbVtpbl0gICAgICBOYW1lTGVuICAgICBOYW1lIGxlbmd0aAogICAgXHBhcmFtW2luXSAgICAgIHBNYWNBZGRyICAgIDYgYnl0ZXMgZm9yIE1BQyBhZGRyZXNzCiAgICBccGFyYW1baW5dICAgICAgcFNlY1BhcmFtcyAgU2VjdXJpdHkgcGFyYW1ldGVycyAodXNlIE5VTEwga2V5IGZvciBTTF9XTEFOX1NFQ19UWVBFX09QRU4pXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN1cml0eSB0eXBlcyBvcHRpb25zOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfV0xBTl9TRUNfVFlQRV9PUEVOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTF9XTEFOX1NFQ19UWVBFX1dFUAoJCQkJCQkJCS0gU0xfV0xBTl9TRUNfVFlQRV9XRVBfU0hBUkVECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTF9XTEFOX1NFQ19UWVBFX1dQQV9XUEEyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTF9XTEFOX1NFQ19UWVBFX1dQQV9FTlQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNMX1dMQU5fU0VDX1RZUEVfV1BTX1BCQwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfV0xBTl9TRUNfVFlQRV9XUFNfUElOCgogICAgXHBhcmFtW2luXSAgICAgIHBTZWNFeHRQYXJhbXMgIEVudGVycHJpc2UgcGFyYW1ldGVycyAtIGlkZW50aXR5LCBpZGVudGl0eSBsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5vbnltb3VzLCBBbm9ueW1vdXMgbGVuZ3RoLCBDZXJ0SW5kZXggKG5vdCBzdXBwb3J0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGVzIG5lZWQgdG8gYmUgcGxhY2VkIGluIGEgc3BlY2lmaWMgZmlsZSBJRCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWFwTWV0aG9kLlxuIFVzZSBOVUxMIGluIGNhc2UgRW50ZXJwcmlzZSBwYXJhbWV0ZXJzIGlzIG5vdCBpbiB1c2UKCiAgICBccGFyYW1baW5dICAgICAgUHJpb3JpdHkgICAgUHJvZmlsZSBwcmlvcml0eS4gTG93ZXN0IHByaW9yaXR5OiAwLCBIaWdoZXN0IHByaW9yaXR5OiAxNS4KICAgIFxwYXJhbVtpbl0gICAgICBPcHRpb25zICAgICBOb3Qgc3VwcG9ydGVkCgogICAgXHJldHVybiAgICAgICAgIFByb2ZpbGUgc3RvcmVkIGluZGV4IG9uIHN1Y2Nlc3MsIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICAgIFxwYXIgUGVyc2lzdGVudAoJCQkJCVByb2ZpbGVzIGFyZSA8Yj5QZXJzaXN0ZW50PC9iPgogICAgXHNhICAgICAgICAgICAgIHNsX1dsYW5Qcm9maWxlR2V0ICwgc2xfV2xhblByb2ZpbGVEZWwKICAgIFxub3RlICAgICAgICAgICBiZWxvbmdzIHRvIFxyZWYgZXh0X2FwaQogICAgXHdhcm5pbmcgICAgICAgIE9ubHkgb25lIEVudGVycHJpc2UgcHJvZmlsZSBpcyBzdXBwb3J0ZWQuXG4KICAgICAgICAgICAgICAgICAgICBQbGVhc2UgTm90ZSB0aGF0IGluIGNhc2Ugb2YgYWRkaW5nIGFuIGV4aXN0aW5nIHByb2ZpbGUgKGNvbXBhcmVkIGJ5IHBOYW1lLHBNQUNBZGRyIGFuZCBzZWN1cml0eSB0eXBlKQogICAgICAgICAgICAgICAgICAgIHRoZSBvbGQgcHJvZmlsZSB3aWxsIGJlIGRlbGV0ZWQgYW5kIHRoZSBzYW1lIGluZGV4IHdpbGwgYmUgcmV0dXJuZWQuXG4KICAgICAgICAgICAgICAgICAgICBTTF9XTEFOX1NFQ19UWVBFX1dQQSBpcyBhIGRlcHJlY2F0ZWQgZGVmaW5pdGlvbiwgdGhlIG5ldyBkZWZpbml0aW9uIGlzIFNMX1dMQU5fU0VDX1RZUEVfV1BBX1dQQTIKCiovCiNpZiBfU0xfSU5DTFVERV9GVU5DKHNsX1dsYW5Qcm9maWxlQWRkKQpfaTE2IHNsX1dsYW5Qcm9maWxlQWRkKGNvbnN0IF9pOCogIHBOYW1lLGNvbnN0ICBfaTE2IE5hbWVMZW4sY29uc3QgX3U4ICpwTWFjQWRkcixjb25zdCBTbFdsYW5TZWNQYXJhbXNfdCogcFNlY1BhcmFtcyAsY29uc3QgU2xXbGFuU2VjUGFyYW1zRXh0X3QqIHBTZWNFeHRQYXJhbXMsY29uc3QgX3UzMiBQcmlvcml0eSxjb25zdCBfdTMyICBPcHRpb25zKTsKI2VuZGlmCgovKiEKICAgIFxicmllZiBHZXQgcHJvZmlsZQoKICAgIFJlYWQgcHJvZmlsZSBmcm9tIHRoZSBkZXZpY2UKCiAgICBccGFyYW1baW5dICAgICAgSW5kZXggICAgICAgICAgUHJvZmlsZSBzdG9yZWQgaW5kZXgsIGlmIGluZGV4IGRvZXMgbm90IGV4aXN0cyBlcnJvciBpcyByZXR1cm4KICAgIFxwYXJhbVtvdXRdICAgICBwTmFtZSAgICAgICAgICBVcCB0byAzMiBieXRlcywgaW4gY2FzZSBvZiBzdGEgbW9kZSB0aGUgbmFtZSBvZiB0aGUgQWNjZXNzIFBvaW50XG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiBjYXNlIG9mIHAycCBtb2RlIHRoZSBuYW1lIG9mIHRoZSBSZW1vdGUgRGV2aWNlCiAgICBccGFyYW1bb3V0XSAgICAgcE5hbWVMZW4gICAgICAgTmFtZSBsZW5ndGgKICAgIFxwYXJhbVtvdXRdICAgICBwTWFjQWRkciAgICAgICA2IGJ5dGVzIGZvciBNQUMgYWRkcmVzcwogICAgXHBhcmFtW291dF0gICAgIHBTZWNQYXJhbXMgICAgIFNlY3VyaXR5IHBhcmFtZXRlcnMuIFNlY3VyaXR5IHR5cGVzIG9wdGlvbnM6IAoJCQkJCQkJCQktIFNMX1dMQU5fU0VDX1RZUEVfT1BFTgoJCQkJCQkJCQktIFNMX1dMQU5fU0VDX1RZUEVfV0VQCgkJCQkJCQkJCS0gU0xfV0xBTl9TRUNfVFlQRV9XRVBfU0hBUkVECgkJCQkJCQkJCS0gU0xfV0xBTl9TRUNfVFlQRV9XUEFfV1BBMgoJCQkJCQkJCQktIFNMX1dMQU5fU0VDX1RZUEVfV1BBX0VOVAoJCQkJCQkJCQktIFNMX1dMQU5fU0VDX1RZUEVfV1BTX1BCQwoJCQkJCQkJCQktIFNMX1dMQU5fU0VDX1RZUEVfV1BTX1BJTgoJCQkJCQkJCSAgIEtleSBhbmQga2V5IGxlbmd0aCBhcmUgbm90IHJldHVybi4gSW4gY2FzZSBvZiBwMnAgc2VjdXJpdHkgdHlwZSBwaW4gdGhlIGtleSByZWZlcnMgdG8gcGluIGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHVlIHRvIHNlY3VyaXR5IHJlYXNvbnMuCiAgICBccGFyYW1bb3V0XSAgICAgcFNlY0V4dFBhcmFtcyAgRW50ZXJwcmlzZSBwYXJhbWV0ZXJzIC0gaWRlbnRpdHksIGlkZW50aXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCBBbm9ueW1vdXMsIEFub255bW91cyBsZW5ndGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZXJ0SW5kZXggKG5vdCBzdXBwb3J0ZWQpLCBFYXBNZXRob2QuCiAgICBccGFyYW1bb3V0XSAgICAgcFByaW9yaXR5ICAgICAgUHJvZmlsZSBwcmlvcml0eQoKICAgIFxyZXR1cm4gICAgICAgICBQcm9maWxlIHNlY3VyaXR5IHR5cGUgaXMgcmV0dXJuZWQgKDAgb3IgcG9zaXRpdmUgbnVtYmVyKSBvbiBzdWNjZXNzLCBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKCiAgICBcc2EgICAgICAgICAgICAgc2xfV2xhblByb2ZpbGVBZGQgLCBzbF9XbGFuUHJvZmlsZURlbAogICAgXG5vdGUgICAgICAgICAgIGJlbG9uZ3MgdG8gXHJlZiBleHRfYXBpCiAgICBcd2FybmluZwoqLwojaWYgX1NMX0lOQ0xVREVfRlVOQyhzbF9XbGFuUHJvZmlsZUdldCkKX2kxNiBzbF9XbGFuUHJvZmlsZUdldChjb25zdCBfaTE2IEluZGV4LF9pOCogIHBOYW1lLCBfaTE2ICpwTmFtZUxlbiwgX3U4ICpwTWFjQWRkciwgU2xXbGFuU2VjUGFyYW1zX3QqIHBTZWNQYXJhbXMsIFNsV2xhbkdldFNlY1BhcmFtc0V4dF90KiBwU2VjRXh0UGFyYW1zLCBfdTMyICpwUHJpb3JpdHkpOwojZW5kaWYKCi8qIQogICAgXGJyaWVmIERlbGV0ZSBXTEFOIHByb2ZpbGUKCiAgICBEZWxldGUgV0xBTiBwcm9maWxlCgogICAgXHBhcmFtW2luXSAgIEluZGV4ICBudW1iZXIgb2YgcHJvZmlsZSB0byBkZWxldGUuIFBvc3NpYmxlIHZhbHVlcyBhcmUgMCB0byA2LlxuCiAgICAgICAgICAgICAgICAgSW5kZXggdmFsdWUgU0xfV0xBTl9ERUxfQUxMX1BST0ZJTEVTIHdpbGwgZGVsZXRlIGFsbCBzYXZlZCBwcm9maWxlcwoKICAgIFxyZXR1cm4gIFplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZQogICAgXHBhciBQZXJzaXN0ZW50ICAgIAoJCQlQcm9maWxlIGRlbGV0aW9uIGlzICA8Yj5QZXJzaXN0ZW50PC9iPgogICAgXHNhICAgc2xfV2xhblByb2ZpbGVBZGQgLCBzbF9XbGFuUHJvZmlsZUdldAogICAgXG5vdGUgICAgICAgICAgIGJlbG9uZ3MgdG8gXHJlZiBleHRfYXBpCiAgICBcd2FybmluZwoqLwojaWYgX1NMX0lOQ0xVREVfRlVOQyhzbF9XbGFuUHJvZmlsZURlbCkKX2kxNiBzbF9XbGFuUHJvZmlsZURlbChjb25zdCBfaTE2IEluZGV4KTsKI2VuZGlmCgovKiEKICAgIFxicmllZiBTZXQgcG9saWN5IHZhbHVlcwoKICAgIFxwYXJhbVtpbl0gICAgICBUeXBlICAgICAgVHlwZSBvZiBwb2xpY3kgdG8gYmUgbW9kaWZpZWQuIFRoZSBPcHRpb25zIGFyZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTF9XTEFOX1BPTElDWV9DT05ORUNUSU9OCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfV0xBTl9QT0xJQ1lfU0NBTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNMX1dMQU5fUE9MSUNZX1BNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfV0xBTl9QT0xJQ1lfUDJQCiAgICBccGFyYW1baW5dICAgICAgUG9saWN5ICAgIFRoZSBvcHRpb24gdmFsdWUgd2hpY2ggZGVwZW5kcyBvbiBhY3Rpb24gdHlwZQogICAgXHBhcmFtW2luXSAgICAgIHBWYWwgICAgICBBbiBvcHRpb25hbCB2YWx1ZSBwb2ludGVyCiAgICBccGFyYW1baW5dICAgICAgVmFsTGVuICAgIEFuIG9wdGlvbmFsIHZhbHVlIGxlbmd0aCwgaW4gYnl0ZXMKICAgIFxyZXR1cm4gICAgICAgICBaZXJvIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogICAgXHBhciBQZXJzaXN0ZW50IAoJCQlBbGwgcGFyYW1ldGVycyBhcmUgPGI+U3lzdGVtIFBlcnNpc3RlbnQ8L2I+XG4KCQkJTm90ZSB0aGF0IGZvciBTTF9XTEFOX1BPTElDWV9TQ0FOIC0gb25seSB0aGUgaW50ZXJ2YWwgd2lsbCBiZSBzYXZlZC4KCQkKICAgIFxzYSAgICAgICAgICAgICBzbF9XbGFuUG9saWN5R2V0CiAgICBcbm90ZSAgICAgICAgICAgYmVsb25ncyB0byBccmVmIGV4dF9hcGkKICAgIFx3YXJuaW5nCiAgICBccGFyCUV4YW1wbGUKICAgIAoJICA8Yj5TTF9XTEFOX1BPTElDWV9DT05ORUNUSU9OOiA8L2I+PGJyPiBkZWZpbmVzIG9wdGlvbnMgYXZhaWxhYmxlIHRvIGNvbm5lY3QgdGhlIENDMzF4eCBkZXZpY2UgdG8gdGhlIEFQOiAKCSAgVGhlIG9wdGlvbnMgYmVsb3cgY291bGQgYmUgY29tYmluZWQgdG8gYSBzaW5nbGUgYWN0aW9uLCBpZiBtb3JlIHRoYW4gb25lIGFjdGlvbiBpcyByZXF1aXJlZC4gCgoJLSBBdXRvIENvbm5lY3Q6IElmIGlzIHNldCwgdGhlIENDMzF4eCBkZXZpY2UgdHJpZXMgdG8gYXV0b21hdGljYWxseSByZWNvbm5lY3QgdG8gb25lIG9mIGl0cyBzdG9yZWQgcHJvZmlsZXMsCgkgIGVhY2ggdGltZSB0aGUgY29ubmVjdGlvbiBmYWlscyBvciB0aGUgZGV2aWNlIGlzIHJlYm9vdGVkLiBUbyBzZXQgdGhpcyBvcHRpb24sIHVzZTogCglcY29kZQkKCQlzbF9XbGFuUG9saWN5U2V0KFNMX1dMQU5fUE9MSUNZX0NPTk5FQ1RJT04sU0xfV0xBTl9DT05ORUNUSU9OX1BPTElDWSgxLDAsMCwwKSxOVUxMLDApIAogICAgXGVuZGNvZGUKCTxicj4KCgoJLSBGYXN0IENvbm5lY3Q6IElmICBpcyBzZXQsIHRoZSBDQzMxeHggZGV2aWNlIHRyaWVzIHRvIGVzdGFibGlzaCBhIGZhc3QgY29ubmVjdGlvbiB0byBBUC4gCgkgIFRvIHNldCB0aGlzIG9wdGlvbiwgdXNlOiAKCVxjb2RlCgkJc2xfV2xhblBvbGljeVNldChTTF9XTEFOX1BPTElDWV9DT05ORUNUSU9OLFNMX1dMQU5fQ09OTkVDVElPTl9QT0xJQ1koMCwxLDAsMCksTlVMTCwwKQogICAgXGVuZGNvZGUKCTxicj4KCgktIFAyUDogSWYgaXMgc2V0IChyZWxldmFudCBmb3IgUDJQIG1vZGUgb25seSksICBDQzMxeHgvQ0MzMnh4IGRldmljZSB0cmllcyB0byBhdXRvbWF0aWNhbGx5IAoJICBjb25uZWN0IHRvIHRoZSBmaXJzdCBQMlAgZGV2aWNlIGF2YWlsYWJsZSwgc3VwcG9ydGluZyBwdXNoIGJ1dHRvbiBvbmx5LiBUbyBzZXQgdGhpcyBvcHRpb24sIHVzZTogCglcY29kZQoJCXNsX1dsYW5Qb2xpY3lTZXQoU0xfV0xBTl9QT0xJQ1lfQ09OTkVDVElPTixTTF9XTEFOX0NPTk5FQ1RJT05fUE9MSUNZKDAsMCwxLDApLE5VTEwsMCkKICAgIFxlbmRjb2RlCgk8YnI+CgoJLSBBdXRvIFByb3Zpc2lvbmluZyAtIElmIGlzIHNldCwgdGhlIENDMzF4eCBkZXZpY2Ugd2lsbCBhdXRvbWF0aWNhbGx5IHN0YXJ0IHRoZSBwcm92aXNpb25pbmcgcHJvY2VzcyAKCSAgYWZ0ZXIgYSBsb25nIHBlcmlvZCBvZiBkaXNjb25uZWN0aW9uIHdoZW4gcHJvZmlsZXMgZXhpc3QgdG8gc2V0IHRoaXMgb3B0aW9uLCB1c2U6IAoJXGNvZGUKCQlzbF9XbGFuUG9saWN5U2V0KFNMX1dMQU5fUE9MSUNZX0NPTk5FQ1RJT04sU0xfV0xBTl9DT05ORUNUSU9OX1BPTElDWSgwLDAsMCwxKSxOVUxMLDApCQkJCglcZW5kY29kZSBcbgoJCgoJPGI+U0xfV0xBTl9QT0xJQ1lfU0NBTjo8L2I+PGJyPiBkZWZpbmVzIHN5c3RlbSBzY2FuIHRpbWUgaW50ZXJ2YWwuIFxuRGVmYXVsdCBpbnRlcnZhbCBpcyAxMCBtaW51dGVzLgoJQWZ0ZXIgc2V0dGluZ3Mgc2NhbiBpbnRlcnZhbCwgYW4gaW1tZWRpYXRlIHNjYW4gaXMgYWN0aXZhdGVkLlxuIFRoZSBuZXh0IHNjYW4gd2lsbCBiZSBiYXNlZCBvbiB0aGUgaW50ZXJ2YWwgc2V0dGluZ3MuIAoJRm9yIEFQIHNjYW4sIG1pbmltdW4gaW50ZXJ2YWwgaXMgMTAgc2Vjb25kcy4KCgktICBXaXRoIGhpZGRlbiBTU0lEOiBGb3IgZXhhbXBsZSwgc2V0dGluZyBzY2FuIGludGVydmFsIHRvIDEgbWludXRlIGludGVydmFsIHVzZSBpbmNsdWRpbmcgaGlkZGVuIHNzaWQ6IAoJXGNvZGUKCQlfdTMyIGludGVydmFsSW5TZWNvbmRzID0gNjA7ICAgIAoJCXNsX1dsYW5Qb2xpY3lTZXQoU0xfV0xBTl9QT0xJQ1lfU0NBTixTTF9XTEFOX1NDQU5fUE9MSUNZKDEsMSksIChfdTggKikmaW50ZXJ2YWxJblNlY29uZHMsc2l6ZW9mKGludGVydmFsSW5TZWNvbmRzKSk7IAogICAgXGVuZGNvZGUKCTxicj4KCgktICBObyBoaWRkZW4gU1NJRDogc2V0dGluZyBzY2FuIGludGVydmFsIHRvIDEgbWludXRlIGludGVydmFsIHVzZSwgbm90IGluY2x1ZGluZyBoaWRkZW4gc3NpZDogCiAgICBcY29kZQoJCV91MzIgaW50ZXJ2YWxJblNlY29uZHMgPSA2MDsgICAgCgkJc2xfV2xhblBvbGljeVNldChTTF9XTEFOX1BPTElDWV9TQ0FOLFNMX1dMQU5fU0NBTl9QT0xJQ1koMSwwKSwgKF91OCAqKSZpbnRlcnZhbEluU2Vjb25kcyxzaXplb2YoaW50ZXJ2YWxJblNlY29uZHMpKTsKICAgIFxlbmRjb2RlCgk8YnI+CgoJLSAgRGlzYWJsZSBzY2FuOiAgICAKCVxjb2RlCgkJI2RlZmluZSBTTF9XTEFOX0RJU0FCTEVfU0NBTiAwCgkJX3UzMiBpbnRlcnZhbEluU2Vjb25kcyA9IDA7CgkJc2xfV2xhblBvbGljeVNldChTTF9XTEFOX1BPTElDWV9TQ0FOLFNMX1dMQU5fRElTQUJMRV9TQ0FOLChfdTggKikmaW50ZXJ2YWxJblNlY29uZHMsc2l6ZW9mKGludGVydmFsSW5TZWNvbmRzKSk7CglcZW5kY29kZSAKCTxicj4KCgk8Yj5TTF9XTEFOX1BPTElDWV9QTTogPC9iPjxicj4gZGVmaW5lcyBhIHBvd2VyIG1hbmFnZW1lbnQgcG9saWN5IGZvciBTdGF0aW9uIG1vZGUgb25seToKCS0gIE5vcm1hbCBwb3dlciBtYW5hZ2VtZW50IChkZWZhdWx0KSBwb2xpY3kgdXNlOiAKCVxjb2RlCgkJc2xfV2xhblBvbGljeVNldChTTF9XTEFOX1BPTElDWV9QTSAsIFNMX1dMQU5fTk9STUFMX1BPTElDWSwgTlVMTCwwKQoJXGVuZGNvZGUKCTxicj4KCgktIExvdyBsYXRlbmN5IHBvd2VyIG1hbmFnZW1lbnQgcG9saWN5IHVzZTogCglcY29kZQoJCXNsX1dsYW5Qb2xpY3lTZXQoU0xfV0xBTl9QT0xJQ1lfUE0gLCBTTF9XTEFOX0xPV19MQVRFTkNZX1BPTElDWSwgTlVMTCwwKQoJXGVuZGNvZGUKCTxicj4KCgktIExvdyBwb3dlciBtYW5hZ2VtZW50IHBvbGljeSB1c2U6IAoJXGNvZGUKCQlzbF9XbGFuUG9saWN5U2V0KFNMX1dMQU5fUE9MSUNZX1BNICwgU0xfV0xBTl9MT1dfUE9XRVJfUE9MSUNZLCBOVUxMLDApIAoJXGVuZGNvZGUKCTxicj4KCgktIEFsd2F5cyBvbiBwb3dlciBtYW5hZ2VtZW50IHBvbGljeSB1c2U6IAoJXGNvZGUKCQlzbF9XbGFuUG9saWN5U2V0KFNMX1dMQU5fUE9MSUNZX1BNICwgU0xfV0xBTl9BTFdBWVNfT05fUE9MSUNZLCBOVUxMLDApCglcZW5kY29kZQoJPGJyPgoKCS0gTG9uZyBTbGVlcCBJbnRlcnZhbCBwb2xpY3kgdXNlOiAKCVxjb2RlCQkKCVNsV2xhblBtUG9saWN5UGFyYW1zX3QgUG1Qb2xpY3lQYXJhbXM7CgltZW1zZXQoJlBtUG9saWN5UGFyYW1zLDAsc2l6ZW9mKFNsV2xhblBtUG9saWN5UGFyYW1zX3QpKTsKCVBtUG9saWN5UGFyYW1zLk1heFNsZWVwVGltZU1zID0gODAwOyAgLy9tYXggc2xlZXAgdGltZSBpbiBtU2VjCglzbF9XbGFuUG9saWN5U2V0KFNMX1dMQU5fUE9MSUNZX1BNICwgU0xfV0xBTl9MT05HX1NMRUVQX0lOVEVSVkFMX1BPTElDWSwgKF91OCopJlBtUG9saWN5UGFyYW1zLHNpemVvZihQbVBvbGljeVBhcmFtcykpOyAKCVxlbmRjb2RlCgk8YnI+CgoJPGI+U0xfV0xBTl9QT0xJQ1lfUDJQOiA8L2I+PGJyPiBkZWZpbmVzIHAycCBuZWdvdGlhdGlvbiBwb2xpY3kgcGFyYW1ldGVycyBmb3IgUDJQIHJvbGU6CgktIFRvIHNldCBpbnRlbnQgbmVnb3RpYXRpb24gdmFsdWUsIHNldCBvbiBvZiB0aGUgZm9sbG93aW5nOlxuCgkJU0xfV0xBTl9QMlBfUk9MRV9ORUdPVElBVEUgICAtIGludGVudCAzIFxuCgkJU0xfV0xBTl9QMlBfUk9MRV9HUk9VUF9PV05FUiAtIGludGVudCAxNSBcbgoJCVNMX1dMQU5fUDJQX1JPTEVfQ0xJRU5UICAgICAgLSBpbnRlbnQgMCBcbgogICAgPGJyPgoJLSBUbyBzZXQgbmVnb3RpYXRpb24gaW5pdGlhdG9yIHZhbHVlIChpbml0aWF0b3IgcG9saWN5IG9mIGZpcnN0IG5lZ290aWF0aW9uIGFjdGlvbiBmcmFtZSksIHNldCBvbiBvZiB0aGUgZm9sbG93aW5nOiBcbgoJCVNMX1dMQU5fUDJQX05FR19JTklUSUFUT1JfQUNUSVZFIFxuCgkJU0xfV0xBTl9QMlBfTkVHX0lOSVRJQVRPUl9QQVNTSVZFIFxuCgkJU0xfV0xBTl9QMlBfTkVHX0lOSVRJQVRPUl9SQU5EX0JBQ0tPRkYgXG4KCVxjb2RlCgkJc2xfV2xhblBvbGljeVNldChTTF9XTEFOX1BPTElDWV9QMlAsIFNMX1dMQU5fUDJQX1BPTElDWShTTF9XTEFOX1AyUF9ST0xFX05FR09USUFURSxTTF9XTEFOX1AyUF9ORUdfSU5JVElBVE9SX1JBTkRfQkFDS09GRiksTlVMTCwwKTsKCVxlbmRjb2RlCiovCiNpZiBfU0xfSU5DTFVERV9GVU5DKHNsX1dsYW5Qb2xpY3lTZXQpCl9pMTYgc2xfV2xhblBvbGljeVNldChjb25zdCBfdTggVHlwZSAsIGNvbnN0IF91OCBQb2xpY3ksIF91OCAqcFZhbCxjb25zdCBfdTggVmFsTGVuKTsKI2VuZGlmCi8qIQogICAgXGJyaWVmIEdldCBwb2xpY3kgdmFsdWVzCgogICAgXHBhcmFtW2luXSAgICAgIFR5cGUgICAgIAoJCQkJCQktIFNMX1dMQU5fUE9MSUNZX0NPTk5FQ1RJT04gCgkJCQkJCS0gU0xfV0xBTl9QT0xJQ1lfU0NBTiAKCQkJCQkJLSBTTF9XTEFOX1BPTElDWV9QTSwgU0xfV0xBTl9QT0xJQ1lfUDJQCiAgICBccGFyYW1bb3V0XSAgICAgcFBvbGljeSAgIAlhcmd1bWVudCBtYXkgYmUgc2V0IHRvIGFueSB2YWx1ZSAKICAgIFxwYXJhbVtvdXRdICAgICBwVmFsIAkJVGhlIHJldHVybmVkIHZhbHVlcywgZGVwZW5kcyBvbiBlYWNoIHBvbGljeSB0eXBlLCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBwb2ludGVkIGJ5IHBWYWwKICAgICAgICAgICAgICAgICAgICB3aXRoIGEgbWF4aW11bSBidWZmZXIgbGVuZ3RoIHNldCBieSB0aGUgY2FsbGluZyBmdW5jdGlvbiBhbmQgcG9pbnRlZCB0byBieSBhcmd1bWVudCAqcFZhbExlbgogICAgXHBhcmFtW291dF0gICAgIHBWYWxMZW4JCWFjdHVhbCB2YWx1ZSBsZW5naHQKICAgIFxyZXR1cm4gICAgICAgICBaZXJvIG9uIHN1Y2Nlc3MsIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZQoKICAgIFxzYSAgICAgICAgICAgICBzbF9XbGFuUG9saWN5U2V0CgogICAgXG5vdGUgICAgICAgICAgIGJlbG9uZ3MgdG8gXHJlZiBleHRfYXBpCgogICAgXHdhcm5pbmcgICAgICAgIFRoZSB2YWx1ZSBwb2ludGVkIGJ5IHRoZSBhcmd1bWVudCAqcFZhbExlbiBzaG91bGQgYmUgc2V0IHRvIGEgdmFsdWUgZGlmZmVyZW50IGZyb20gMCBhbmQKICAgICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gdGhlIGJ1ZmZlciBsZW5ndGggcmV0dXJuZWQgZnJvbSB0aGUgU0wgZGV2aWNlLiBPdGhlcndpc2UsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCgoJXHBhciBFeGFtcGxlCiAgICAKCS0gU0xfV0xBTl9QT0xJQ1lfQ09OTkVDVElPTiAtIEdldCBjb25uZWN0aW9uIHBvbGljeToKCVxjb2RlCiAgICBfdTggUG9saWN5ID0gMDsKICAgIGludCBsZW5ndGggPSBzaXplb2YoUG9saWN5T3B0aW9uKTsKICAgIGludCByZXQ7CiAgICByZXQgPSBzbF9XbGFuUG9saWN5R2V0KFNMX1dMQU5fUE9MSUNZX0NPTk5FQ1RJT04gLCZQb2xpY3ksMCwoX3U4KikmbGVuZ3RoKTsKICAgICAgICAgICAgICAgCiAgICBpZiAoUG9saWN5ICYgU0xfV0xBTl9DT05ORUNUSU9OX1BPTElDWSggIDEgICwgIDEgICwgIDAgICAsICAgMCApICAgKQogICAgewogICAgICAgIHByaW50ZigiQ29ubmVjdGlvbiBQb2xpY3kgaXMgc2V0IHRvIEF1dG8gKyBGYXN0Iik7CiAgICB9CglcZW5kY29kZQoJPGJyPgoKCS0gU0xfV0xBTl9QT0xJQ1lfU0NBTiAtIEdldCBzY2FuIHBvbGljeToKCVxjb2RlICAgICAgICAgICAgICAgIAogICAgaW50IFNjYW5JbnRlcnZhbCA9IDA7ICAvL2RlZmF1bHQgdmFsdWUgaXMgNjAwIHNlY29uZHMKICAgIF91OCBQb2xpY3kgPSAwOyAgICAgICAvL2RlZmF1bHQgdmFsdWUgaXMgMCAoZGlzYWJsZWQpCiAgICBpbnQgcmV0OwogICAgbGVuZ3RoID0gc2l6ZW9mKFNjYW5JbnRlcnZhbCk7CiAgICByZXQgPSBzbF9XbGFuUG9saWN5R2V0KFNMX1dMQU5fUE9MSUNZX1NDQU4gLCZQb2xpY3ksKF91OCopJlNjYW5JbnRlcnZhbCwoX3U4KikmbGVuZ3RoKTsKICAgICAgCiAgICBpZiAoUG9saWN5ICYgU0xfV0xBTl9TQ0FOX1BPTElDWSggICAwICAsICAxICAgKSAgICkKICAgIHsKICAgICAgICBwcmludGYoIlNjYW4gUG9saWN5IGlzIHNldCB0byBTY2FuIHZpc2libGUgc3NpZCAiKTsKICAgIH0KICAgIGlmIChQb2xpY3kgJiBTTF9XTEFOX1NDQU5fUE9MSUNZKCAgIDEgICwgIDAgICApICAgKQogICAgewogICAgICAgIHByaW50ZigiU2NhbiBQb2xpY3kgaXMgc2V0IHRvIFNjYW4gaGlkZGVuIHNzaWQgIik7CiAgICB9CglcZW5kY29kZQoJPGJyPgoKCS0gU0xfV0xBTl9QT0xJQ1lfUE0gLSBHZXQgcG93ZXIgbWFuYWdlbWVudCBwb2xpY3k6CglcY29kZQogICAgX3U4IFBvbGljeSA9IDA7CiAgICBpbnQgcmV0OwogICAgU2xXbGFuUG1Qb2xpY3lQYXJhbXNfdCBQbVBvbGljeVBhcmFtczsKICAgIGxlbmd0aCA9IHNpemVvZihQbVBvbGljeVBhcmFtcyk7CiAgICByZXQgPSBzbF9XbGFuUG9saWN5R2V0KFNMX1BPTElDWV9QTSAsJlBvbGljeSwmUG1Qb2xpY3lQYXJhbXMsKF91OCopJmxlbmd0aCk7CiAgICBpZiAoUG9saWN5ID09ICBTTF9XTEFOX0xPTkdfU0xFRVBfSU5URVJWQUxfUE9MSUNZICkKICAgIHsKICAgICAgICBwcmludGYoIkNvbm5lY3Rpb24gUG9saWN5IGlzIHNldCB0byBMT05HIFNMRUVQIElOVEVSVkFMIFBPTElDWSB3aXRoIGludGV2YWwgPSAlZCAiLFBtUG9saWN5UGFyYW1zLk1heFNsZWVwVGltZU1zKTsKICAgIH0KCVxlbmRjb2RlCgk8YnI+CgoJLSAgU0xfV0xBTl9QT0xJQ1lfUDJQIC0gR2V0IFAyUCBwb2xpY3k6CglcY29kZSAgICAgICAKICAgIF91OCBQb2xpY3kgPSAwOwogICAgaW50IHJldDsKICAgIGxlbmd0aCA9IHNpemVvZihQb2xpY3kpOwogICAgcmV0ID0gc2xfV2xhblBvbGljeUdldChTTF9XTEFOX1BPTElDWV9QMlAgLCZQb2xpY3ksMCwoX3U4KikmbGVuZ3RoKTsKICAgICAgICAgICAgICAgIC8vU0xfV0xBTl9QMlBfUE9MSUNZKHAycE5lZ1R5cGUgICAgICAgICAgICwgcDJwTmVnSW5pdGlhdG9yKQogICAgaWYgKFBvbGljeSAmICBTTF9XTEFOX1AyUF9QT0xJQ1koMCxTTF9XTEFOX1AyUF9ORUdfSU5JVElBVE9SX1JBTkRfQkFDS09GRikgICApCiAgICB7CiAgICAgICAgcHJpbnRmKCJQMlAgUG9saWN5IGlzIHNldCB0byBSYW5kIGJhY2tvZmYiKTsKICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBvbGljeSAmICBTTF9XTEFOX1AyUF9QT0xJQ1koU0xfV0xBTl9QMlBfUk9MRV9ORUdPVElBVEUsMCkgICApCiAgICB7CiAgICAgICAgcHJpbnRmKCJQMlAgUG9saWN5IGlzIHNldCB0byBSb2xlIE5lZ290aWF0ZSIpOwogICAgfQoJXGVuZGNvZGUKCTxicj4KCiovCiNpZiBfU0xfSU5DTFVERV9GVU5DKHNsX1dsYW5Qb2xpY3lHZXQpCl9pMTYgc2xfV2xhblBvbGljeUdldChjb25zdCBfdTggVHlwZSAsX3U4ICpwUG9saWN5LF91OCAqcFZhbCxfdTggKnBWYWxMZW4pOwojZW5kaWYKLyohCiAgICBcYnJpZWYgR2V0cyB0aGUgV0xBTiBzY2FuIG9wZXJhdGlvbiByZXN1bHRzCgogICAgR2V0cyBzY2FuIHJlc3VsdHMgLCBnZXRzIGVudHJ5IGZyb20gc2NhbiByZXN1bHQgdGFibGUKCiAgICBccGFyYW1baW5dICAgSW5kZXggIAlTdGFydGluZyBpbmRleCBpZGVudGlmaWVyIChyYW5nZSAwLTI5KSBmb3IgZ2V0dGluZyBzY2FuIHJlc3VsdHMKICAgIFxwYXJhbVtpbl0gICBDb3VudCAgCUhvdyBtYW55IGVudHJpZXMgdG8gZmV0Y2guIE1heCBpcyAoMzAtIkluZGV4IikuCiAgICBccGFyYW1bb3V0XSAgcEVudHJpZXMgIAlQb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBTbFdsYW5OZXR3b3JrRW50cnlfdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgYXJyYXkgaXRlbXMgc2hvdWxkIG1hdGNoICJDb3VudCIgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY190eXBlOiAKCQkJCQkJCQktIFNMX1dMQU5fU0NBTl9TRUNfVFlQRV9PUEVOIAoJCQkJCQkJCS0gU0xfV0xBTl9TQ0FOX1NFQ19UWVBFX1dFUCAKCQkJCQkJCQktIFNMX1dMQU5fU0NBTl9TRUNfVFlQRV9XUEEgCgkJCQkJCQkJLSBTTF9XTEFOX1NDQU5fU0VDX1RZUEVfV1BBMgoKCVxyZXR1cm4gIE51bWJlciBvZiB2YWxpZCBuZXR3b3JrcyBsaXN0IGl0ZW1zCiAgICBcc2EKICAgIFxub3RlICAgICAgIGJlbG9uZ3MgdG8gXHJlZiBleHRfYXBpCiAgICBcd2FybmluZyAgICBUaGlzIGNvbW1hbmQgZG8gbm90IGluaXRpYXRlIGFueSBhY3RpdmUgc2Nhbm5pbmcgYWN0aW9uCiAgICBccGFyICAgICAgICBFeGFtcGxlCgoJLSBGZXRjaGluZyBtYXggMTAgcmVzdWx0czoKICAgIFxjb2RlICAgICAgIAogICAgU2xXbGFuTmV0d29ya0VudHJ5X3QgbmV0RW50cmllc1sxMF07CiAgICBfdTggaTsKICAgIF9pMTYgcmVzdWx0c0NvdW50ID0gc2xfV2xhbkdldE5ldHdvcmtMaXN0KDAsMTAsJm5ldEVudHJpZXNbMF0pOwogICAgZm9yKGk9MDsgaTwgcmVzdWx0c0NvdW50OyBpKyspCiAgICB7CiAgICAgICAgcHJpbnRmKCIlZC4gIixpKzEpOwogICAgICAgIHByaW50ZigiU1NJRDogJS4zMnMgICAgICAgICIsbmV0RW50cmllc1tpXS5Tc2lkKTsKICAgICAgICBwcmludGYoIkJTU0lEOiAleDoleDoleDoleDoleDoleCAgICAiLG5ldEVudHJpZXNbaV0uQnNzaWRbMF0sbmV0RW50cmllc1tpXS5Cc3NpZFsxXSxuZXRFbnRyaWVzW2ldLkJzc2lkWzJdLG5ldEVudHJpZXNbaV0uQnNzaWRbM10sbmV0RW50cmllc1tpXS5Cc3NpZFs0XSxuZXRFbnRyaWVzW2ldLkJzc2lkWzVdKTsKICAgICAgICBwcmludGYoIkNoYW5uZWw6ICVkICAgICIsbmV0RW50cmllc1tpXS5DaGFubmVsKTsKICAgICAgICBwcmludGYoIlJTU0k6ICVkICAgICIsbmV0RW50cmllc1tpXS5Sc3NpKTsKICAgICAgICBwcmludGYoIlNlY3VyaXR5IHR5cGU6ICVkICAgICIsU0xfV0xBTl9TQ0FOX1JFU1VMVF9TRUNfVFlQRV9CSVRNQVAobmV0RW50cmllc1tpXS5TZWN1cml0eUluZm8pKTsKICAgICAgICBwcmludGYoIkdyb3VwIENpcGhlcjogJWQgICAgIixTTF9XTEFOX1NDQU5fUkVTVUxUX0dST1VQX0NJUEhFUihuZXRFbnRyaWVzW2ldLlNlY3VyaXR5SW5mbykpOwogICAgICAgIHByaW50ZigiVW5pY2FzdCBDaXBoZXIgYml0bWFwOiAlZCAgICAiLFNMX1dMQU5fU0NBTl9SRVNVTFRfVU5JQ0FTVF9DSVBIRVJfQklUTUFQKG5ldEVudHJpZXNbaV0uU2VjdXJpdHlJbmZvKSk7CiAgICAgICAgcHJpbnRmKCJLZXkgTWdtdCBzdWl0ZXMgYml0bWFwOiAlZCAgICAiLFNMX1dMQU5fU0NBTl9SRVNVTFRfS0VZX01HTVRfU1VJVEVTX0JJVE1BUChuZXRFbnRyaWVzW2ldLlNlY3VyaXR5SW5mbykpOwogICAgICAgIHByaW50ZigiSGlkZGVuIFNTSUQ6ICVkXHJcbiIsU0xfV0xBTl9TQ0FOX1JFU1VMVF9ISURERU5fU1NJRChuZXRFbnRyaWVzW2ldLlNlY3VyaXR5SW5mbykpOwogICAgfQogICAgXGVuZGNvZGUKKi8KI2lmIF9TTF9JTkNMVURFX0ZVTkMoc2xfV2xhbkdldE5ldHdvcmtMaXN0KQpfaTE2IHNsX1dsYW5HZXROZXR3b3JrTGlzdChjb25zdCBfdTggSW5kZXgsY29uc3QgIF91OCBDb3VudCwgU2xXbGFuTmV0d29ya0VudHJ5X3QgKnBFbnRyaWVzKTsKI2VuZGlmCgovKiEKICAgIFxicmllZiAgIFN0YXJ0IGNvbGxlY3Rpbmcgd2xhbiBSWCBzdGF0aXN0aWNzLCBmb3IgdW5saW1pdGVkIHRpbWUuCgoJXHBhciBQYXJhbWV0ZXJzIAoJCU5vbmUKICAgIFxyZXR1cm4gIFplcm8gb24gc3VjY2Vzcywgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCgogICAgXHNhICAgICBzbF9XbGFuUnhTdGF0U3RvcCAgICAgIHNsX1dsYW5SeFN0YXRHZXQKICAgIFxub3RlICAgQmVsb25ncyB0byBccmVmIGV4dF9hcGkKICAgIFx3YXJuaW5nICBUaGlzIEFQSSBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBmb3IgbmV4dCByZWxlYXNlCiAgICBccGFyICAgICAgICBFeGFtcGxlCgogICAgLSBHZXR0aW5nIHdsYW4gUlggc3RhdGlzdGljczoKCVxjb2RlCgl2b2lkIFJ4U3RhdENvbGxlY3RUd2ljZSgpCgl7CgkJU2xXbGFuR2V0UnhTdGF0UmVzcG9uc2VfdCByeFN0YXQ7CgkJX2kxNiByYXdTb2NrZXQ7CgkJX2k4IERhdGFGcmFtZVsyMDBdOwoJCXN0cnVjdCBTbFRpbWV2YWxfdCB0aW1ldmFsOwoJCXRpbWV2YWwudHZfc2VjID0gIDA7ICAgICAgICAgICAgIC8vIFNlY29uZHMKCQl0aW1ldmFsLnR2X3VzZWMgPSAyMDAwMDsgICAgICAgICAvLyBNaWNyb3NlY29uZHMuIDEwMDAwIG1pY3Jvc2Vjb25kcyByZXNvbHV0aW9uCgoJCXNsX1dsYW5SeFN0YXRTdGFydCgpOyAgLy8gc2V0IHN0YXRpc3RpY3MgbW9kZQoKCQlyYXdTb2NrZXQgPSBzbF9Tb2NrZXQoU0xfQUZfUkYsIFNMX1NPQ0tfUkFXLCBlQ2hhbm5lbCk7CgkJLy8gc2V0IHRpbWVvdXQgLSBpbiBjYXNlIHdlIGhhdmUgbm8gYWN0aXZpdHkgZm9yIHRoZSBzcGVjaWZpZWQgY2hhbm5lbAoJCXNsX1NldFNvY2tPcHQocmF3U29ja2V0LFNMX1NPTF9TT0NLRVQsU0xfU09fUkNWVElNRU8sICZ0aW1ldmFsLCBzaXplb2YodGltZXZhbCkpOyAgICAvLyBFbmFibGUgcmVjZWl2ZSB0aW1lb3V0CgkJc3RhdHVzID0gc2xfUmVjdihyYXdTb2NrZXQsIERhdGFGcmFtZSwgc2l6ZW9mKERhdGFGcmFtZSksIDApOwoKCQlTbGVlcCgxMDAwKTsgLy8gc2xlZXAgZm9yIDEgc2VjCgkJc2xfV2xhblJ4U3RhdEdldCgmcnhTdGF0LDApOyAvLyBzdGF0aXN0aWNzIGhhcyBiZWVuIGNsZWFyZWQgdXBvbiByZWFkCgkJU2xlZXAoMTAwMCk7IC8vIHNsZWVwIGZvciAxIHNlYwoJCXNsX1dsYW5SeFN0YXRHZXQoJnJ4U3RhdCwwKTsKCgl9CiAgICBcZW5kY29kZQoqLwojaWYgX1NMX0lOQ0xVREVfRlVOQyhzbF9XbGFuUnhTdGF0U3RhcnQpCl9pMTYgc2xfV2xhblJ4U3RhdFN0YXJ0KHZvaWQpOwojZW5kaWYKCi8qIQogICAgXGJyaWVmICAgIFN0b3AgY29sbGVjdGluZyB3bGFuIFJYIHN0YXRpc3RpYywgKGlmIHByZXZpb3VzIGNhbGxlZCBzbF9XbGFuUnhTdGF0U3RhcnQpCgoJXHBhciAJUGFyYW1ldGVycwoJCQlOb25lCiAgICBccmV0dXJuICAgWmVybyBvbiBzdWNjZXNzLCBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKCiAgICBcc2EgICAgIHNsX1dsYW5SeFN0YXRTdGFydCAgICAgIHNsX1dsYW5SeFN0YXRHZXQKICAgIFxub3RlICAgICAgICAgICBCZWxvbmdzIHRvIFxyZWYgZXh0X2FwaQogICAgXHdhcm5pbmcgIFRoaXMgQVBJIGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBiZSByZW1vdmVkIGZvciBuZXh0IHJlbGVhc2UKKi8KI2lmIF9TTF9JTkNMVURFX0ZVTkMoc2xfV2xhblJ4U3RhdFN0b3ApCl9pMTYgc2xfV2xhblJ4U3RhdFN0b3Aodm9pZCk7CiNlbmRpZgoKCi8qIQogICAgXGJyaWVmIEdldCB3bGFuIFJYIHN0YXRpc3RpY3MuIFVwb24gY2FsbGluZyB0aGlzIGNvbW1hbmQsIHRoZSBzdGF0aXN0aWNzIGNvdW50ZXJzIHdpbGwgYmUgY2xlYXJlZC4KCiAgICBccGFyYW1baW5dICBwUnhTdGF0IAlQb2ludGVyIHRvIFNsV2xhbkdldFJ4U3RhdFJlc3BvbnNlX3QgZmlsbGVkIHdpdGggUnggc3RhdGlzdGljcyByZXN1bHRzCiAgICBccGFyYW1baW5dICBGbGFncyAJCVNob3VsZCBiZSAwICAoIG5vdCBhcHBsaWNhYmxlIHJpZ2h0IG5vdywgd2lsbCBiZSBhZGRlZCB0aGUgZnV0dXJlICkKICAgIFxyZXR1cm4gICAgIFplcm8gb24gc3VjY2Vzcywgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCgogICAgXHNhICAgc2xfV2xhblJ4U3RhdFN0YXJ0ICBzbF9XbGFuUnhTdGF0U3RvcAogICAgXG5vdGUgICAgICAgICAgIEJlbG9uZ3MgdG8gXHJlZiBleHRfYXBpCiAgICBcd2FybmluZwoqLwojaWYgX1NMX0lOQ0xVREVfRlVOQyhzbF9XbGFuUnhTdGF0R2V0KQpfaTE2IHNsX1dsYW5SeFN0YXRHZXQoU2xXbGFuR2V0UnhTdGF0UmVzcG9uc2VfdCAqcFJ4U3RhdCxjb25zdCBfdTMyIEZsYWdzKTsKI2VuZGlmCgoKLyohCiAgICBcYnJpZWYgIFRoZSBzaW1wbGVMaW5rIHdpbGwgc3dpdGNoIHRvIHRoZSBhcHByb3ByaWF0ZSByb2xlIGFjY29yZGluZyB0byB0aGUgcHJvdmlzaW9uaW5nIG1vZGUgcmVxdWVzdGVkCiAgICAgICAgICAgIGFuZCB3aWxsIHN0YXJ0IHRoZSBwcm92aXNpb25pbmcgcHJvY2Vzcy4KCiAgICBccGFyYW1baW5dICBQcm92aXNpb25pbmdDbWQgICAgICAgICAgICAKCQkJCQkJCQkJCQktIFNMX1dMQU5fUFJPVklTSU9OSU5HX0NNRF9TVEFSVF9NT0RFX0FQCQkJCQkJCTA6IFN0YXJ0IEFQIHByb3Zpc2lvbmluZyAoQVAgcm9sZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNMX1dMQU5fUFJPVklTSU9OSU5HX0NNRF9TVEFSVF9NT0RFX1NDCQkJCQkJCTE6IFN0YXJ0IFNtYXJ0IENvbmZpZyBwcm92aXNpb25pbmcgKFNUQSByb2xlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfV0xBTl9QUk9WSVNJT05JTkdfQ01EX1NUQVJUX01PREVfQVBTQwkJCQkJCTI6IFN0YXJ0IEFQK1NtYXJ0IENvbmZpZyBwcm92aXNpb25pbmcgKEFQIHJvbGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTF9XTEFOX1BST1ZJU0lPTklOR19DTURfU1RBUlRfTU9ERV9BUFNDX0VYVEVSTkFMX0NPTkZJR1VSQVRJT04gMzogU3RhcnQgQVAgKyBTbWFydCBDb25maWcgKyBXQUMgcHJvdmlzaW9uaW5nIChBUCByb2xlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfV0xBTl9QUk9WSVNJT05JTkdfQ01EX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6IFN0b3AgcHJvdmlzaW9uaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTF9XTEFOX1BST1ZJU0lPTklOR19DTURfQUJPUlRfRVhURVJOQUxfQ09ORklHVVJBVElPTkMgNToKICAgIFxwYXJhbVtpbl0gIFJlcXVlc3RlZFJvbGVBZnRlclN1Y2Nlc3MgICBUaGUgcm9sZSB0aGF0IHRoZSBTaW1wbGVMaW5rIHdpbGwgc3dpdGNoIHRvIGluIGNhc2Ugb2YgYSBzdWNjZXNzZnVsIHByb3Zpc2lvbmluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBTVEEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiBBUAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkY6IHN0YXkgaW4gY3VycmVudCByb2xlIChyZWxldmFudCBvbmx5IGluIHByb3Zpc2lvbmluZ19zdG9wKQogICAgXHBhcmFtW2luXSAgSW5hY3Rpdml0eVRpbWVvdXRTZWMgLSAgICAgIFRoZSBwZXJpb2Qgb2YgdGltZSAoaW4gc2Vjb25kcykgdGhlIHN5c3RlbSB3YWl0cyBiZWZvcmUgaXQgYXV0b21hdGljYWxseQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BzIHRoZSBwcm92aXNpb25pbmcgcHJvY2VzcyB3aGVuIG5vIGFjdGl2aXR5IGlzIGRldGVjdGVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byAwIGluIG9yZGVyIHRvIHN0b3AgcHJvdmlzaW9uaW5nLiBNaW5pbXVtIEluYWN0aXZpdHlUaW1lb3V0U2VjIGlzIDMwIHNlY29uZHMuCiAgICBccGFyYW1baW5dICBwU21hcnRDb25maWdLZXkgICAgICAgICAgICAgU21hcnQgQ29uZmlnIGtleTogcHVibGljIGtleSBmb3Igc21hcnQgY29uZmlnIHByb2Nlc3MgKHJlbGV2ZW50IGZvciBzbWFydCBjb25maWcgb25seSkKICAgIFxwYXJhbVtpbl0gIEZsYWdzICAgICAgICAgICAgICAgICAgICAgICBDYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkgICAgICAgLSBTTF9XTEFOX1BST1ZJU0lPTklOR19DTURfRkxBR19FWFRFUk5BTF9DT05GSVJNQVRJT04gLSBDb25maXJtYXRpb24gcGhhc2Ugd2lsbCBiZSBjb21wbGV0ZWQgZXh0ZXJuYWx5IGJ5IGhvc3QgKGUuZy4gdmlhIGNsb3VkIGFzc2lzdCkKCgogICAgXHJldHVybiAgICAgWmVybyBvbiBzdWNjZXNzLCBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKCiAgICBcc2EKICAgIFx3YXJuaW5nCiAgICBccGFyICAgICAgIEV4YW1wbGUKCgktIFN0YXJ0IFByb3Zpc2lvbmluZyAtIHN0YXJ0IGFzIFNUQSBhZnRlciBzdWNjZXNzIHdpdGggaW5hY3Rpdml0eSB0aW1lb3V0IG9mIDEwIG1pbnV0ZXM6CglcY29kZQogICAgc2xfV2xhblByb3Zpc2lvbmluZyhTTF9XTEFOX1BST1ZJU0lPTklOR19DTURfU1RBUlRfTU9ERV9BUFNDLCBST0xFX1NUQSwgNjAwLCAiS2V5MEtleTBLZXkwS2V5MCIsIDB4MCk7CglcZW5kY29kZQoJPGJyPgoKICAgIC0gU3RvcCBQcm92aXNpb25pbmc6CiAgICBcY29kZQoJc2xfV2xhblByb3Zpc2lvbmluZyhTTF9XTEFOX1BST1ZJU0lPTklOR19DTURfU1RPUCwweEZGLDAsTlVMTCwgMHgwKTsKCVxlbmRjb2RlCgk8YnI+CgogICAgLSBTdGFydCBBUCBQcm92aXNpb25pbmcgd2l0aCBpbmFjdGl2aXR5IHRpbWVvdXQgb2YgMTAgbWludXRlcwogICAgXGNvZGUKCXNsX1dsYW5Qcm92aXNpb25pbmcoU0xfV0xBTl9QUk9WSVNJT05JTkdfQ01EX1NUQVJUX01PREVfQVBTQyxST0xFX0FQLDYwMCxOVUxMLCAweDApOwoJXGVuZGNvZGUKCTxicj4KCiAgICAtIFN0YXJ0IEFQIFByb3Zpc2lvbmluZyB3aXRoIGluYWN0aXZpdHkgdGltZW91dCBvZiAxMCBtaW51dGVzIGFuZCBjb21wbGV0ZSBjb25maXJtYXRpb24gdmlhIHVzZXIgY2xvdWQgYXNzaXN0CglcY29kZQogICAgc2xfV2xhblByb3Zpc2lvbmluZyhTTF9XTEFOX1BST1ZJU0lPTklOR19DTURfU1RBUlRfTU9ERV9BUFNDLCBST0xFX0FQLCA2MDAsIE5VTEwsIFNMX1dMQU5fUFJPVklTSU9OSU5HX0NNRF9GTEFHX0VYVEVSTkFMX0NPTkZJUk1BVElPTik7CiAgICBcZW5kY29kZQoJPGJyPgoKKi8KCiNpZiBfU0xfSU5DTFVERV9GVU5DKHNsX1dsYW5Qcm92aXNpb25pbmcpCl9pMTYgc2xfV2xhblByb3Zpc2lvbmluZyhfdTggUHJvdmlzaW9uaW5nQ21kLCBfdTggUmVxdWVzdGVkUm9sZUFmdGVyU3VjY2VzcywgX3UxNiBJbmFjdGl2aXR5VGltZW91dFNlYywgIGNoYXIgKnBTbWFydENvbmZpZ0tleSwgX3UzMiBGbGFncyk7CiNlbmRpZgoKCgovKiEKICAgIFxicmllZiBXbGFuIHNldCBtb2RlCgogICAgU2V0dGluZyBXTEFOIG1vZGUKCiAgICBccGFyYW1baW5dIE1vZGUgIFdMQU4gbW9kZSB0byBzdGFydCB0aGUgQ0MzMXh4IGRldmljZS4gUG9zc2libGUgb3B0aW9ucyBhcmUKICAgICAgICAgICAgICAgICAgICAtIFJPTEVfU1RBIC0gZm9yIFdMQU4gc3RhdGlvbiBtb2RlCiAgICAgICAgICAgICAgICAgICAgLSBST0xFX0FQICAtIGZvciBXTEFOIEFQIG1vZGUKICAgICAgICAgICAgICAgICAgICAtIFJPTEVfUDJQICAtZm9yIFdMQU4gUDJQIG1vZGUKICAgIFxyZXR1cm4gICBaZXJvIG9uIHN1Y2Nlc3MsIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZQogICAgXHBhciBQZXJzaXN0ZW50IAoJCU1vZGUgaXMgPGI+UGVyc2lzdGVudDwvYj4KICAgIFxzYSAgICAgICAgc2xfU3RhcnQgc2xfU3RvcAogICAgXG5vdGUgICAgICAgICAgIEJlbG9uZ3MgdG8gXHJlZiBleHRfYXBpCiAgICBcd2FybmluZyAgIEFmdGVyIHNldHRpbmcgdGhlIG1vZGUgdGhlIHN5c3RlbSBtdXN0IGJlIHJlc3RhcnRlZCBmb3IgYWN0aXZhdGluZyB0aGUgbmV3IG1vZGUKICAgIFxwYXIgICAgICAgRXhhbXBsZQoKCS0gU3dpdGNoIGZyb20gYW55IHJvbGUgdG8gU1RBOgogICAgXGNvZGUKCQlzbF9XbGFuU2V0TW9kZShST0xFX1NUQSk7CgkJc2xfU3RvcCgwKTsKCQlzbF9TdGFydChOVUxMLE5VTEwsTlVMTCk7CiAgICBcZW5kY29kZQoKKi8KI2lmIF9TTF9JTkNMVURFX0ZVTkMoc2xfV2xhblNldE1vZGUpCl9pMTYgc2xfV2xhblNldE1vZGUoY29uc3QgX3U4ICBNb2RlKTsKI2VuZGlmCgoKLyohCiAgICBcYnJpZWYgICAgIFNldHRpbmcgV0xBTiBjb25maWd1cmF0aW9ucwoKICAgIFxwYXJhbVtpbl0gQ29uZmlnSWQgLSAgY29uZmlndXJhdGlvbiBpZAogICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9DRkdfQVBfSUQ8L2I+CiAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX0NGR19HRU5FUkFMX1BBUkFNX0lEPC9iPgogICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9DRkdfUDJQX1BBUkFNX0lEPC9iPgogICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9SWF9GSUxURVJTX0lEPC9iPgoKICAgIFxwYXJhbVtpbl0gQ29uZmlnT3B0IC0gY29uZmlndXJhdGlvbnMgb3B0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX0NGR19BUF9JRDwvYj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX0FQX09QVF9TU0lEPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCBTU0lEIGZvciBBUCBtb2RlLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9ucyB0YWtlcyA8Yj5fdTg8L2I+IGJ1ZmZlciBhcyBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX0FQX09QVF9DSEFOTkVMPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCBjaGFubmVsIGZvciBBUCBtb2RlLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBjaGFubmVsIGlzIGRlcGVuZGFudCBvbiB0aGUgY291bnRyeSBjb2RlIHdoaWNoIGlzIHNldC4gaS5lLiBmb3IgIlVTIiB0aGUgY2hhbm5lbCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIG9mIFsxLTExXSBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIHRha2VzIDxiPl91ODwvYj4gYXMgYSBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX0FQX09QVF9ISURERU5fU1NJRDwvYj4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgSGlkZGVuIFNTSUQgTW9kZSBmb3IgQVAgbW9kZS5IaWRkZW4gb3B0aW9uczogXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBkaXNhYmxlZCBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFNlbmQgZW1wdHkgKGxlbmd0aD0wKSBTU0lEIGluIGJlYWNvbiBhbmQgaWdub3JlIHByb2JlIHJlcXVlc3QgZm9yIGJyb2FkY2FzdCBTU0lEIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogQ2xlYXIgU1NJRCAoQVNDSUkgMCksIGJ1dCBrZWVwIHRoZSBvcmlnaW5hbCBsZW5ndGggKHRoaXMgbWF5IGJlIHJlcXVpcmVkIHdpdGggc29tZSBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBlbXB0eSBTU0lEKSBhbmQgaWdub3JlIHByb2JlIHJlcXVlc3RzIGZvciBicm9hZGNhc3QgU1NJRCBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIHRha2VzIDxiPl91ODwvYj4gYXMgYSBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX0FQX09QVF9TRUNVUklUWV9UWVBFPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCBTZWN1cml0eSB0eXBlIGZvciBBUCBtb2RlLiBTZWN1cml0eSBvcHRpb25zIGFyZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIE9wZW4gc2VjdXJpdHk6IFNMX1dMQU5fU0VDX1RZUEVfT1BFTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gV0VQIHNlY3VyaXR5OiAgU0xfV0xBTl9TRUNfVFlQRV9XRVAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFdQQSBzZWN1cml0eTogIFNMX1dMQU5fU0VDX1RZUEVfV1BBX1dQQTIgIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gdGFrZXMgPGI+X3U4PC9iPiBwb2ludGVyIGFzIGEgcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9BUF9PUFRfUEFTU1dPUkQ8L2I+IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IFBhc3N3b3JkIGZvciBmb3IgQVAgbW9kZSAoZm9yIFdFUCBvciBmb3IgV1BBKTogXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzd29yZCAtIGZvciBXUEE6IDggLSA2MyBjaGFyYWN0ZXJzIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIFdFUDogNSAvIDEzIGNoYXJhY3RlcnMgKGFzY2lpKSBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9ucyB0YWtlcyA8Yj5fdTg8L2I+IGJ1ZmZlciBhcyBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX0FQX09QVF9NQVhfU1RBVElPTlM8L2I+IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IE1heCBBUCBzdGF0aW9ucyAtIDEuLjQgLSBOb3RlOiBjYW4gYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgY3VycmVudGx5IGNvbm5lY3RlZCBzdGF0aW9ucyBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9zdGF0aW9ucyAtIDEgY2hhcmFjdGVycyBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9ucyB0YWtlcyA8Yj5fdTg8L2I+IGJ1ZmZlciBhcyBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX0FQX09QVF9NQVhfU1RBX0FHSU5HPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCBNYXggc3RhdGlvbiBhZ2luZyB0aW1lIC0gZGVmYXVsdCBpcyA2MCBzZWNvbmRzIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3N0YXRpb25zIC0gMiBjaGFyYWN0ZXJzIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb25zIHRha2VzIDxiPl91MTY8L2I+IGJ1ZmZlciBhcyBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX0FQX0FDQ0VTU19MSVNUX01PREU8L2I+IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IEFQIGFjY2VzcyBsaXN0IG1vZGUgLSBESVNBQkxFLCBERU5ZX0xJU1QgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIC0gMSBjaGFyYWN0ZXJzIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb25zIHRha2VzIDxiPl91ODwvYj4gYnVmZmVyIGFzIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1dMQU5fQVBfQUNDRVNTX0xJU1RfQUREX01BQzwvYj4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgTUFDIGFkZHJlc3MgdG8gdGhlIEFQIGFjY2VzcyBsaXN0OiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY19hZGRyIC0gNiBjaGFyYWN0ZXJzIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb25zIHRha2VzIDxiPl91ODwvYj4gYnVmZmVyIGFzIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1dMQU5fQVBfQUNDRVNTX0xJU1RfREVMX01BQzwvYj4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWwgTUFDIGFkZHJlc3MgZnJvbSB0aGUgQVAgYWNjZXNzIGxpc3Q6IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjX2FkZHIgLSA2IGNoYXJhY3RlcnMgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbnMgdGFrZXMgPGI+X3U4PC9iPiBidWZmZXIgYXMgcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9BUF9BQ0NFU1NfTElTVF9ERUxfSURYPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZSBNQUMgYWRkcmVzcyBmcm9tIGluZGV4IGluIHRoZSBBUCBhY2Nlc3MgbGlzdDogXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCAtIDEgY2hhcmFjdGVyIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb25zIHRha2VzIDxiPl91ODwvYj4gYnVmZmVyIGFzIHBhcmFtZXRlcgoKICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1dMQU5fQ0ZHX0dFTkVSQUxfUEFSQU1fSUQ8L2I+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9HRU5FUkFMX1BBUkFNX09QVF9DT1VOVFJZX0NPREU8L2I+IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IENvdW50cnkgQ29kZSBmb3IgQVAgbW9kZSBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9ucyB0YWtlcyA8Yj5fdTg8L2I+IDIgYnl0ZXMgYnVmZmVyIGFzIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1dMQU5fR0VORVJBTF9QQVJBTV9PUFRfU1RBX1RYX1BPV0VSPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCBTVEEgbW9kZSBUeCBwb3dlciBsZXZlbCBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBiZXR3ZWVuIDAtMTUsIGFzIGRCIG9mZnNldCBmcm9tIG1heCBwb3dlciAoMCB3aWxsIHNldCBNQVggcG93ZXIpIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb25zIHRha2VzIDxiPl91ODwvYj4gYXMgcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9HRU5FUkFMX1BBUkFNX09QVF9BUF9UWF9QT1dFUjwvYj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgQVAgbW9kZSBUeCBwb3dlciBsZXZlbCBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBiZXR3ZWVuIDAtMTUsIGFzIGRCIG9mZnNldCBmcm9tIG1heCBwb3dlciAoMCB3aWxsIHNldCBNQVggcG93ZXIpIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb25zIHRha2VzIDxiPl91ODwvYj4gYXMgcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9HRU5FUkFMX1BBUkFNX09QVF9JTkZPX0VMRU1FTlQ8L2I+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IEluZm8gRWxlbWVudCBmb3IgQVAgbW9kZS4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgQXBwbGljYXRpb24gY2FuIHNldCB1cCB0byBTTF9XTEFOX01BWF9QUklWQVRFX0lORk9fRUxFTUVOVFNfU1VQUFJPVEVEIGluZm8gZWxlbWVudHMgcGVyIFJvbGUgKEFQIC8gUDJQIEdPKS4gIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG8gZGVsZXRlIGFuIGluZm8gZWxlbWVudCB1c2UgdGhlIHJlbGV2YW50IGluZGV4IGFuZCBsZW5ndGggPSAwLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBBUCAtIG5vIG1vcmUgdGhhbiBTTF9XTEFOX0lORk9fRUxFTUVOVF9NQVhfVE9UQUxfTEVOR1RIX0FQIGJ5dGVzIGNhbiBiZSBzdG9yZWQgZm9yIGFsbCBpbmZvIGVsZW1lbnRzLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBQMlAgR08gLSBubyBtb3JlIHRoYW4gU0xfV0xBTl9JTkZPX0VMRU1FTlRfTUFYX1RPVEFMX0xFTkdUSF9QMlBfR08gYnl0ZXMgY2FuIGJlIHN0b3JlZCBmb3IgYWxsIGluZm8gZWxlbWVudHMuICBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIHRha2VzIFNsV2xhblNldEluZm9FbGVtZW50X3QgYXMgcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9HRU5FUkFMX1BBUkFNX09QVF9TQ0FOX1BBUkFNUzwvYj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgc2NhbiBwYXJhbWV0ZXJzOiBSU1NJIHRocmVzaG9sZCBhbmQgY2hhbm5lbCBtYXNrLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1dMQU5fR0VORVJBTF9QQVJBTV9PUFRfU1VTUEVORF9QUk9GSUxFUzwvYj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgc3VzcGVuZGVkIHByb2ZpbGVzIG1hc2sgKHNldCBiaXRzIDIgYW5kIDQgdG8gc3VzcGVuZCBwcm9maWxlcyAyIGFuZCA0KS4KCQkJCQkJCSAgIC0gPGI+U0xfV0xBTl9HRU5FUkFMX1BBUkFNX0RJU0FCTEVfRU5UX1NFUlZFUl9BVVRIPC9iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdG8gc2tpcCBzZXJ2ZXIgYXV0aGVudGljYXRpb24gYW5kIGlzIHZhbGlkIGZvciBvbmUKCQkJCQkJCQkJICB1c2UsIHdoZW4gbWFudWFsbHkgY29ubmVjdGlvbiB0byBhbiBlbnRlcnByaXNlIG5ldHdvcmsKCQkJCQkJCQkJICAKCiAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX0NGR19QMlBfUEFSQU1fSUQ8L2I+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9QMlBfT1BUX0RFVl9UWVBFPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCBQMlAgRGV2aWNlIHR5cGUuTWF4aW11bSBsZW5ndGggb2YgMTcgY2hhcmFjdGVycy4gRGV2aWNlIHR5cGUgaXMgcHVibGlzaGVkIHVuZGVyIFAyUCBJLkUsIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dzIHRvIG1ha2UgZGV2aWNlcyBlYXNpZXIgdG8gcmVjb2duaXplLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIGNhc2Ugbm8gZGV2aWNlIHR5cGUgaXMgc2V0LCB0aGUgZGVmYXVsdCB0eXBlIGlzICIxLTAwNTBGMjA0LTEiICBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9ucyB0YWtlcyA8Yj5fdTg8L2I+IGJ1ZmZlciBhcyBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX1AyUF9PUFRfQ0hBTk5FTF9OX1JFR1M8L2I+IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgUDJQIENoYW5uZWxzLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuIGNoYW5uZWwgKGVpdGhlciAxLzYvMTEgZm9yIDIuNEdIeikgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbiByZWd1bGF0b3J5IGNsYXNzICg4MSBmb3IgMi40R0h6KSAgIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyIGNoYW5uZWwgKGVpdGhlciAxLzYvMTEgZm9yIDIuNEdIeikgICBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlciByZWd1bGF0b3J5IGNsYXNzICg4MSBmb3IgMi40R0h6KSAgICAgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbiBjaGFubmVsIGFuZCByZWd1bGF0b3J5IGNsYXNzIHdpbGwgZGV0ZXJtaW5lIHRoZSBkZXZpY2UgbGlzdGVuIGNoYW5uZWwgZHVyaW5nIHAycCBmaW5kIGxpc3RlbiBwaGFzZSBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlciBjaGFubmVsIGFuZCByZWd1bGF0b3J5IGNsYXNzIHdpbGwgZGV0ZXJtaW5lIHRoZSBvcGVyYXRpbmcgY2hhbm5lbCBwcmVmZXJyZWQgYnkgdGhpcyBkZXZpY2UgKGluIGNhc2UgaXQgaXMgZ3JvdXAgb3duZXIgdGhpcyB3aWxsIGJlIHRoZSBvcGVyYXRpbmcgY2hhbm5lbCkgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzIHNob3VsZCBiZSBvbmUgb2YgdGhlIHNvY2lhbCBjaGFubmVscyAoMS82LzExKS4gSW4gY2FzZSBubyBsaXN0ZW4vb3BlciBjaGFubmVsIHNlbGVjdGVkLCBhIHJhbmRvbSAxLzYvMTEgd2lsbCBiZSBzZWxlY3RlZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIHRha2VzIHBvaW50ZXIgdG8gPGI+X3U4WzRdPC9iPiBhcyBwYXJhbWV0ZXIKCiAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX1JYX0ZJTFRFUlNfSUQ8L2I+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9SWF9GSUxURVJfU1RBVEU8L2I+IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlIG9yIGRpc2FibGUgZmlsdGVycy4gVGhlIGJ1ZmZlciBpbnB1dCBpcyBTbFdsYW5SeEZpbHRlck9wZXJhdGlvbkNvbW1hbmRCdWZmX3RcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1dMQU5fUlhfRklMVEVSX1NZU19TVEFURTwvYj4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmFibGUgb3IgZGlzYWJsZSBzeXN0ZW0gZmlsdGVycy4gVGhlIGJ1ZmZlciBpbnB1dCBpcyBTbFdsYW5SeEZpbHRlclN5c0ZpbHRlcnNTZXRTdGF0ZUJ1ZmZfdFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9SWF9GSUxURVJfUkVNT1ZFPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZSBmaWx0ZXJzLiBUaGUgYnVmZmVyIGlucHV0IGlzIFNsV2xhblJ4RmlsdGVyT3BlcmF0aW9uQ29tbWFuZEJ1ZmZfdFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9SWF9GSUxURVJfU1RPUkU8L2I+IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSB0aGUgZmlsdGVycyBhcyBwZXJzaXN0ZW50LiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1dMQU5fUlhfRklMVEVSX1VQREFURV9BUkdTPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZSBmaWx0ZXIgYXJndW1lbnRzLiBUaGUgYnVmZmVyIGlucHV0IGlzIFNsV2xhblJ4RmlsdGVyVXBkYXRlQXJnc0NvbW1hbmRCdWZmX3RcbgoKICAgIFxwYXJhbVtpbl0gQ29uZmlnTGVuIC0gY29uZmlndXJhdGlvbnMgbGVuCgogICAgXHBhcmFtW2luXSBwVmFsdWVzIC0gICBjb25maWd1cmF0aW9ucyB2YWx1ZXMKCQogICAgXHJldHVybiAgICBaZXJvIG9uIHN1Y2Nlc3MsIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZQoKICAgIFxwYXIgUGVyc2lzdGVudAogICAgICAgICAgICAgICAgICAgICAgICA8Yj5TeXN0ZW0gUGVyc2lzdGVudDwvYj46CQkKCQkJCQkJCQktIFNMX1dMQU5fQ0ZHX0dFTkVSQUxfUEFSQU1fSUQKCQkJCQkJCQktIFNMX1dMQU5fQ0ZHX1AyUF9QQVJBTV9JRAoJCQkJCQkJCQoJCQkJCSAgICA8Yj5SZXNldDwvYj46CgkJCQkJCQkJLSBTTF9XTEFOX0NGR19BUF9JRAoJCQkJCQkJCQoJCQkJCQk8Yj5Ob24tIFBlcnNpc3RlbnQ8L2I+OgoJCQkJCQkgIAkJLSBTTF9XTEFOX0dFTkVSQUxfUEFSQU1fRElTQUJMRV9FTlRfU0VSVkVSX0FVVEgKICAgIFxzYQogICAgXG5vdGUKICAgIFx3YXJuaW5nCiAgICBccGFyICAgRXhhbXBsZXMKCgktIFNMX1dMQU5fQVBfT1BUX1NTSUQ6CiAgICBcY29kZQoJCV91OCAgc3RyWzMzXTsKCQltZW1zZXQoc3RyLCAwLCAzMyk7CgkJbWVtY3B5KHN0ciwgc3NpZCwgbGVuKTsgIC8vIHNzaWQgc3RyaW5nIG9mIDMyIGNoYXJhY3RlcnMKCQlzbF9XbGFuU2V0KFNMX1dMQU5fQ0ZHX0FQX0lELCBTTF9XTEFOX0FQX09QVF9TU0lELCBzdHJsZW4oc3NpZCksIHN0cik7CiAgICBcZW5kY29kZQoJPGJyPgoKCS0gU0xfV0xBTl9BUF9PUFRfQ0hBTk5FTDoKICAgIFxjb2RlIAoJCV91OCAgdmFsID0gY2hhbm5lbDsKCQlzbF9XbGFuU2V0KFNMX1dMQU5fQ0ZHX0FQX0lELCBTTF9XTEFOX0FQX09QVF9DSEFOTkVMLCAxLCAoX3U4ICopJnZhbCk7CiAgICBcZW5kY29kZQoJPGJyPgoKCS0gU0xfV0xBTl9BUF9PUFRfSElEREVOX1NTSUQ6CiAgICBcY29kZQogICAgICAgIF91OCAgdmFsID0gaGlkZGVuOwogICAgICAgIHNsX1dsYW5TZXQoU0xfV0xBTl9DRkdfQVBfSUQsIFNMX1dMQU5fQVBfT1BUX0hJRERFTl9TU0lELCAxLCAoX3U4ICopJnZhbCk7CiAgICBcZW5kY29kZQoJPGJyPgoKCS0gU0xfV0xBTl9BUF9PUFRfU0VDVVJJVFlfVFlQRToKICAgIFxjb2RlCiAgICAgICAgX3U4ICB2YWwgPSBTTF9XTEFOX1NFQ19UWVBFX1dQQV9XUEEyOwogICAgICAgIHNsX1dsYW5TZXQoU0xfV0xBTl9DRkdfQVBfSUQsIFNMX1dMQU5fQVBfT1BUX1NFQ1VSSVRZX1RZUEUsIDEsIChfdTggKikmdmFsKTsKICAgIFxlbmRjb2RlCiAgICA8YnI+CgoJLSBTTF9XTEFOX0FQX09QVF9QQVNTV09SRDogCglcY29kZQogICAgICAgIF91OCAgc3RyWzY1XTsKICAgICAgICBfdTE2ICBsZW4gPSBzdHJsZW4ocGFzc3dvcmQpOwogICAgICAgIG1lbXNldChzdHIsIDAsIDY1KTsKICAgICAgICBtZW1jcHkoc3RyLCBwYXNzd29yZCwgbGVuKTsKICAgICAgICBzbF9XbGFuU2V0KFNMX1dMQU5fQ0ZHX0FQX0lELCBTTF9XTEFOX0FQX09QVF9QQVNTV09SRCwgbGVuLCAoX3U4ICopc3RyKTsKICAgIFxlbmRjb2RlCgk8YnI+CgoJLSBTTF9XTEFOX0FQX09QVF9NQVhfU1RBVElPTlM6CiAgICBcY29kZQogICAgICAgIF91OCBtYXhfYXBfc3RhdGlvbnMgPSAzOwogICAgICAgIHNsX1dsYW5TZXQoU0xfV0xBTl9DRkdfQVBfSUQsIFNMX1dMQU5fQVBfT1BUX01BWF9TVEFUSU9OUywgc2l6ZW9mKG1heF9hcF9zdGF0aW9ucyksIChfdTggKikmbWF4X2FwX3N0YXRpb25zKTsKICAgIFxlbmRjb2RlCgk8YnI+CiAgICAKCS0gU0xfV0xBTl9BUF9PUFRfTUFYX1NUQV9BR0lORzoKCVxjb2RlCiAgICAgICAgX3UxNiBtYXhfYXBfc3RhX2FnaW5nID0gNjA7CiAgICAgICAgc2xfV2xhblNldChTTF9XTEFOX0NGR19BUF9JRCwgU0xfV0xBTl9BUF9PUFRfTUFYX1NUQV9BR0lORywgc2l6ZW9mKG1heF9hcF9zdGFfYWdpbmcpLCAoX3U4ICopJm1heF9hcF9zdGFfYWdpbmcpOwogICAgXGVuZGNvZGUKCTxicj4KCgktIFNMX1dMQU5fQVBfQUNDRVNTX0xJU1RfTU9ERToKICAgIFxjb2RlCgkJX3U4ICBhY2Nlc3MgbGlzdF9tb2RlID0gU0xfV0xBTl9BUF9BQ0NFU1NfTElTVF9NT0RFX0RFTllfTElTVDsKCQlzbF9XbGFuU2V0KFNMX1dMQU5fQ0ZHX0FQX0lELCBTTF9XTEFOX0FQX0FDQ0VTU19MSVNUX01PREUsIHNpemVvZihhY2Nlc3MgbGlzdF9tb2RlKSwgKF91OCAqKSZhY2Nlc3MgbGlzdF9tb2RlKTsKICAgIFxlbmRjb2RlCgk8YnI+CgoJLSBTTF9XTEFOX0FQX0FDQ0VTU19MSVNUX0FERF9NQUM6CiAgICBcY29kZQoJCV91OCAgc3RhX21hY1s2XSA9IHsgMHgwMCwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSwgMHg2NiB9OwoJCXNsX1dsYW5TZXQoU0xfV0xBTl9DRkdfQVBfSUQsIFNMX1dMQU5fQVBfQUNDRVNTX0xJU1RfQUREX01BQywgc2l6ZW9mKHN0YV9tYWMpLCAoX3U4ICopJnN0YV9tYWMpOwogICAgXGVuZGNvZGUKCTxicj4KCgktIFNMX1dMQU5fQVBfQUNDRVNTX0xJU1RfREVMX01BQzoKCVxjb2RlCgkJX3U4ICBzdGFfbWFjWzZdID0geyAweDAwLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2IH07CgkJc2xfV2xhblNldChTTF9XTEFOX0NGR19BUF9JRCwgU0xfV0xBTl9BUF9BQ0NFU1NfTElTVF9ERUxfTUFDLCBzaXplb2Yoc3RhX21hYyksIChfdTggKikmc3RhX21hYyk7CiAgICBcZW5kY29kZQogICAgPGJyPgoKCS0gU0xfV0xBTl9BUF9BQ0NFU1NfTElTVF9ERUxfSURYOgoJXGNvZGUKCQlfdTggIHN0YV9pbmRleCA9IDA7CgkJc2xfV2xhblNldChTTF9XTEFOX0NGR19BUF9JRCwgU0xfV0xBTl9BUF9BQ0NFU1NfTElTVF9ERUxfSURYLCBzaXplb2Yoc3RhX2luZGV4KSwgKF91OCAqKSZzdGFfaW5kZXgpOwogICAgXGVuZGNvZGUKCTxicj4KCgktIFNMX1dMQU5fR0VORVJBTF9QQVJBTV9PUFRfU1RBX1RYX1BPV0VSOgogICAgXGNvZGUKCQlfdTggIHN0YXBvd2VyPShfdTgpcG93ZXI7CgkJc2xfV2xhblNldChTTF9XTEFOX0NGR19HRU5FUkFMX1BBUkFNX0lELCBTTF9XTEFOX0dFTkVSQUxfUEFSQU1fT1BUX1NUQV9UWF9QT1dFUiwxLChfdTggKikmc3RhcG93ZXIpOwogICAgXGVuZGNvZGUKCTxicj4KCgktIFNMX1dMQU5fR0VORVJBTF9QQVJBTV9PUFRfQ09VTlRSWV9DT0RFOgogICAgXGNvZGUKCQlfdTgqICBzdHIgPSAoX3U4ICopIGNvdW50cnk7ICAvLyBzdHJpbmcgb2YgMiBjaGFyYWN0ZXJzLiBpLmUuIC0gIlVTIgoJCXNsX1dsYW5TZXQoU0xfV0xBTl9DRkdfR0VORVJBTF9QQVJBTV9JRCwgU0xfV0xBTl9HRU5FUkFMX1BBUkFNX09QVF9DT1VOVFJZX0NPREUsIDIsIHN0cik7CiAgICBcZW5kY29kZQoJPGJyPgoKCS0gU0xfV0xBTl9HRU5FUkFMX1BBUkFNX09QVF9BUF9UWF9QT1dFUjoKICAgIFxjb2RlCgkJX3U4ICBhcHBvd2VyPShfdTgpcG93ZXI7CgkJc2xfV2xhblNldChTTF9XTEFOX0NGR19HRU5FUkFMX1BBUkFNX0lELCBTTF9XTEFOX0dFTkVSQUxfUEFSQU1fT1BUX0FQX1RYX1BPV0VSLDEsKF91OCAqKSZhcHBvd2VyKTsKICAgIFxlbmRjb2RlCgk8YnI+CgoJLSBTTF9XTEFOX0dFTkVSQUxfUEFSQU1fT1BUX1NVU1BFTkRfUFJPRklMRVMKICAgIFxjb2RlCgkJX3UzMiAgc3VzcGVuZGVkUHJvZmlsZXNNYXNrPShfdTMyKW1hc2s7CgkJc2xfV2xhblNldChTTF9XTEFOX0NGR19HRU5FUkFMX1BBUkFNX0lELCBTTF9XTEFOX0dFTkVSQUxfUEFSQU1fT1BUX1NVU1BFTkRfUFJPRklMRVMsc2l6ZW9mKHN1c3BlbmRlZFByb2ZpbGVzTWFzayksKF91MzIgKikmc3VzcGVuZGVkUHJvZmlsZXNNYXNrKTsKICAgIFxlbmRjb2RlCiAgICA8YnI+CgoJLSBTTF9XTEFOX1AyUF9PUFRfREVWX1RZUEU6CglcY29kZQoJCV91OCAgIHN0clsxN107CgkJX3UxNiAgbGVuID0gc3RybGVuKGRldmljZV90eXBlKTsKCQltZW1zZXQoc3RyLCAwLCAxNyk7CgkJbWVtY3B5KHN0ciwgZGV2aWNlX3R5cGUsIGxlbik7CgkJc2xfV2xhblNldChTTF9XTEFOX0NGR19QMlBfUEFSQU1fSUQsIFNMX1dMQU5fUDJQX09QVF9ERVZfVFlQRSwgbGVuLCBzdHIpOwogICAgXGVuZGNvZGUKCTxicj4KCgktIFNMX1dMQU5fUDJQX09QVF9DSEFOTkVMX05fUkVHUwogICAgXGNvZGUKCQlfdTggIHN0cls0XTsKCQlzdHJbMF0gPSAoX3U4KTExOyAgICAgICAgICAgLy8gbGlzdGVuIGNoYW5uZWwKCQlzdHJbMV0gPSAoX3U4KTgxOyAgICAgICAgICAgLy8gbGlzdGVuIHJlZ3VsYXRvcnkgY2xhc3MKCQlzdHJbMl0gPSAoX3U4KTY7ICAgICAgICAgICAgLy8gb3BlciBjaGFubmVsCgkJc3RyWzNdID0gKF91OCk4MTsgICAgICAgICAgIC8vIG9wZXIgcmVndWxhdG9yeSBjbGFzcwoJCXNsX1dsYW5TZXQoU0xfV0xBTl9DRkdfUDJQX1BBUkFNX0lELCBTTF9XTEFOX1AyUF9PUFRfQ0hBTk5FTF9OX1JFR1MsIDQsIHN0cik7CiAgICBcZW5kY29kZQoJPGJyPgoKCS0gU0xfV0xBTl9HRU5FUkFMX1BBUkFNX09QVF9JTkZPX0VMRU1FTlQ6CiAgICAgXGNvZGUKCQlTbFdsYW5TZXRJbmZvRWxlbWVudF90ICAgIGluZm9lbGU7CgkJaW5mb2VsZS5JbmRleCAgICAgPSBJbmRleDsgICAgICAgICAgICAgICAgICAvLyBJbmRleCBvZiB0aGUgaW5mbyBlbGVtZW50LiByYW5nZTogMCAtIFNMX1dMQU5fTUFYX1BSSVZBVEVfSU5GT19FTEVNRU5UU19TVVBQUk9URUQKCQlpbmZvZWxlLlJvbGUgICAgICA9IFJvbGU7ICAgICAgICAgICAgICAgICAgIC8vIFNMX1dMQU5fSU5GT19FTEVNRU5UX0FQX1JPTEUgKDApIG9yIFNMX1dMQU5fSU5GT19FTEVNRU5UX1AyUF9HT19ST0xFICgxKQoJCWluZm9lbGUuSUUuSWQgICAgID0gIElkOyAgICAgICAgICAgICAgICAgICAgLy8gSW5mbyBlbGVtZW50IElELiBpZiBTTF9XTEFOX0lORk9fRUxFTUVOVF9ERUZBVUxUX0lEICgwKSBpcyBzZXQsIElEIHdpbGwgYmUgc2V0IHRvIDIyMS4KCQkvLyBPcmdhbml6YXRpb24gdW5pcXVlIElELiBJZiBhbGwgMyBieXRlcyBhcmUgemVybyAtIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCAwOCwwMCwyOC4KCQlpbmZvZWxlLklFLk91aVswXSA9ICBPdWkwOyAgICAgICAgICAgICAgICAgIC8vIE9yZ2FuaXphdGlvbiB1bmlxdWUgSUQgZmlyc3QgQnl0ZQoJCWluZm9lbGUuSUUuT3VpWzFdID0gIE91aTE7ICAgICAgICAgICAgICAgICAgLy8gT3JnYW5pemF0aW9uIHVuaXF1ZSBJRCBzZWNvbmQgQnl0ZQoJCWluZm9lbGUuSUUuT3VpWzJdID0gIE91aTI7ICAgICAgICAgICAgICAgICAgLy8gT3JnYW5pemF0aW9uIHVuaXF1ZSBJRCB0aGlyZCBCeXRlCgkJaW5mb2VsZS5JRS5MZW5ndGggPSBMZW47ICAgICAgICAgICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhlIGluZm8gZWxlbWVudC4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gMjUzIGJ5dGVzCgkJbWVtc2V0KGluZm9lbGUuSUUuRGF0YSwgMCwgU0xfV0xBTl9JTkZPX0VMRU1FTlRfTUFYX1NJWkUpOwoJCWlmICggTGVuIDw9IFNMX1dMQU5fSU5GT19FTEVNRU5UX01BWF9TSVpFICkKCQl7CgkJCW1lbWNweShpbmZvZWxlLklFLkRhdGEsIElFLCBMZW4pOyAgICAgICAgICAgLy8gSW5mbyBlbGVtZW50LiBsZW5ndGggb2YgdGhlIGluZm8gZWxlbWVudCBpcyBbMC0yNTJdCgkJCXNsX1dsYW5TZXQoU0xfV0xBTl9DRkdfR0VORVJBTF9QQVJBTV9JRCxTTF9XTEFOX0dFTkVSQUxfUEFSQU1fT1BUX0lORk9fRUxFTUVOVCxzaXplb2YoU2xXbGFuU2V0SW5mb0VsZW1lbnRfdCksKF91OCogKSAmaW5mb2VsZSk7CgkJfQogICAgXGVuZGNvZGUKCTxicj4KCgktIFNMX1dMQU5fR0VORVJBTF9QQVJBTV9PUFRfU0NBTl9QQVJBTVM6CglcY29kZQogICAgICAgIFNsV2xhblNjYW5QYXJhbUNvbW1hbmRfdCBTY2FuUGFyYW1Db25maWc7CiAgICAgICAgU2NhblBhcmFtQ29uZmlnLlJzc2lUaGVyc2hvbGQgPSAtNzA7CiAgICAgICAgU2NhblBhcmFtQ29uZmlnLkNoYW5uZWxzTWFzayA9IDB4MUZGRjsKICAgICAgICBzbF9XbGFuU2V0KFNMX1dMQU5fQ0ZHX0dFTkVSQUxfUEFSQU1fSUQsU0xfV0xBTl9HRU5FUkFMX1BBUkFNX09QVF9TQ0FOX1BBUkFNUyxzaXplb2YoU2NhblBhcmFtQ29uZmlnKSwoX3U4KiApICZTY2FuUGFyYW1Db25maWcpOwogICAgXGVuZGNvZGUKCTxicj4KCgktIFNMX1dMQU5fR0VORVJBTF9QQVJBTV9ESVNBQkxFX0VOVF9TRVJWRVJfQVVUSDoKCVxjb2RlCgkJX3U4IHBhcmFtID0gMTsgLy8gMSBtZWFucyBkaXNhYmxlIHRoZSBzZXJ2ZXIgYXV0aGVudGljYXRpb24KCQlzbF9XbGFuU2V0KFNMX1dMQU5fQ0ZHX0dFTkVSQUxfUEFSQU1fSUQsU0xfV0xBTl9HRU5FUkFMX1BBUkFNX0RJU0FCTEVfRU5UX1NFUlZFUl9BVVRILDEsJnBhcmFtKTsKCVxlbmRjb2RlCgk8YnI+CgktIFNMX1dMQU5fUlhfRklMVEVSX1NUT1JFOiAKCVxjb2RlCiAgICAgc2xfV2xhblNldChTTF9XTEFOX1JYX0ZJTFRFUlNfSUQsIFNMX1dMQU5fUlhfRklMVEVSX1NUT1JFLCAwLCBOVUxMKTsKCVxlbmRjb2RlCgoqLwojaWYgX1NMX0lOQ0xVREVfRlVOQyhzbF9XbGFuU2V0KQpfaTE2IHNsX1dsYW5TZXQoY29uc3QgX3UxNiBDb25maWdJZCAsY29uc3QgX3UxNiBDb25maWdPcHQsY29uc3QgX3UxNiBDb25maWdMZW4sY29uc3QgIF91OCAqcFZhbHVlcyk7CiNlbmRpZgoKLyohCiAgICBcYnJpZWYgICAgIEdldHRpbmcgV0xBTiBjb25maWd1cmF0aW9ucwoKICAgIFxwYXJhbVtpbl0gQ29uZmlnSWQgLSAgY29uZmlndXJhdGlvbiBpZAogICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9DRkdfQVBfSUQ8L2I+CiAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX0NGR19HRU5FUkFMX1BBUkFNX0lEPC9iPgogICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9DRkdfUDJQX1BBUkFNX0lEPC9iPgogICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9DRkdfQVBfQUNDRVNTX0xJU1RfSUQ8L2I+CiAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX1JYX0ZJTFRFUlNfSUQ8L2I+CgogICAgXHBhcmFtW291dF0gcENvbmZpZ09wdCAtIGdldCBjb25maWd1cmF0aW9ucyBvcHRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1dMQU5fQ0ZHX0FQX0lEPC9iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1dMQU5fQVBfT1BUX1NTSUQ8L2I+IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0IFNTSUQgZm9yIEFQIG1vZGUuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0IHVwIHRvIDMyIGNoYXJhY3RlcnMgb2YgU1NJRCBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9ucyB0YWtlcyA8Yj5fdTg8L2I+IGFzIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1dMQU5fQVBfT1BUX0NIQU5ORUw8L2I+IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0IGNoYW5uZWwgZm9yIEFQIG1vZGUuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gdGFrZXMgPGI+X3U4PC9iPiBhcyBhIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1dMQU5fQVBfT1BUX0hJRERFTl9TU0lEPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldCBIaWRkZW4gU1NJRCBNb2RlIGZvciBBUCBtb2RlLkhpZGRlbiBvcHRpb25zOiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IGRpc2FibGVkIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogU2VuZCBlbXB0eSAobGVuZ3RoPTApIFNTSUQgaW4gYmVhY29uIGFuZCBpZ25vcmUgcHJvYmUgcmVxdWVzdCBmb3IgYnJvYWRjYXN0IFNTSUQgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiBDbGVhciBTU0lEIChBU0NJSSAwKSwgYnV0IGtlZXAgdGhlIG9yaWdpbmFsIGxlbmd0aCAodGhpcyBtYXkgYmUgcmVxdWlyZWQgd2l0aCBzb21lIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50cyB0aGF0IGRvIG5vdCBzdXBwb3J0IGVtcHR5IFNTSUQpIGFuZCBpZ25vcmUgcHJvYmUgcmVxdWVzdHMgZm9yIGJyb2FkY2FzdCBTU0lEIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gdGFrZXMgPGI+X3U4PC9iPiBhcyBhIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1dMQU5fQVBfT1BUX1NFQ1VSSVRZX1RZUEU8L2I+IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0IFNlY3VyaXR5IHR5cGUgZm9yIEFQIG1vZGUuIFNlY3VyaXR5IG9wdGlvbnMgYXJlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gT3BlbiBzZWN1cml0eTogU0xfV0xBTl9TRUNfVFlQRV9PUEVOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBXRVAgc2VjdXJpdHk6ICBTTF9XTEFOX1NFQ19UWVBFX1dFUAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gV1BBIHNlY3VyaXR5OiAgU0xfV0xBTl9TRUNfVFlQRV9XUEFfV1BBMiAgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiB0YWtlcyA8Yj5fdTg8L2I+IGFzIGEgcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9BUF9PUFRfUEFTU1dPUkQ8L2I+IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0IFBhc3N3b3JkIGZvciBmb3IgQVAgbW9kZSAoZm9yIFdFUCBvciBmb3IgV1BBKTogXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5zIHBhc3N3b3JkIC0gc3RyaW5nLCBmaWxscyB1cCB0byA2NCBjaGFyYWN0ZXJzLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9ucyB0YWtlcyA8Yj5fdTg8L2I+IGJ1ZmZlciBhcyBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX0FQX09QVF9NQVhfU1RBVElPTlM8L2I+IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0IE1heCBBUCBhbGxvd2VkIHN0YXRpb25zOiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9ucyB0YWtlcyA8Yj5fdTg8L2I+IGJ1ZmZlciBhcyBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX0FQX09QVF9NQVhfU1RBX0FHSU5HPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldCBBUCBhZ2luZyB0aW1lIGluIHNlY29uZHM6IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb25zIHRha2VzIDxiPl91MTY8L2I+IGJ1ZmZlciBhcyBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX0FQX0FDQ0VTU19MSVNUX05VTV9FTlRSSUVTPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldCBBUCBhY2Nlc3MgbGlzdCBudW1iZXIgb2YgZW50cmllczogXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbnMgdGFrZXMgPGI+X3U4PC9iPiBidWZmZXIgYXMgcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9DRkdfQVBfQUNDRVNTX0xJU1RfSUQ8L2I+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAgVGhlIG9wdGlvbiBpcyB0aGUgc3RhcnQgaW5kZXggaW4gdGhlIGFjY2VzcyBsaXN0IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0IHRoZSBBUCBhY2Nlc3MgbGlzdCBmcm9tIHN0YXJ0IGluZGV4LCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGxpc3QgaXMgZXh0cmFjdGVkIGZyb20gdGhlIHJlcXVlc3QgbGVuZ3RoLgogICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9DRkdfR0VORVJBTF9QQVJBTV9JRDwvYj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj4gU0xfV0xBTl9HRU5FUkFMX1BBUkFNX09QVF9TQ0FOX1BBUkFNUyA8L2I+IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0IHNjYW4gcGFyYW1ldGVycy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiB1c2VzIFNsV2xhblNjYW5QYXJhbUNvbW1hbmRfdCBhcyBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX0dFTkVSQUxfUEFSQU1fT1BUX0NPVU5UUllfQ09ERTwvYj4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXQgQ291bnRyeSBDb2RlIGZvciBBUCBtb2RlIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb25zIHRha2VzIDxiPl91ODwvYj4gYnVmZmVyIGFzIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1dMQU5fR0VORVJBTF9QQVJBTV9PUFRfU1RBX1RYX1BPV0VSPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldCBTVEEgbW9kZSBUeCBwb3dlciBsZXZlbCBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBiZXR3ZWVuIDAtMTUsIGFzIGRCIG9mZnNldCBmcm9tIG1heCBwb3dlciAoMCBpbmRpY2F0ZXMgTUFYIHBvd2VyKSBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9ucyB0YWtlcyA8Yj5fdTg8L2I+IGFzIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1dMQU5fR0VORVJBTF9QQVJBTV9PUFRfQVBfVFhfUE9XRVI8L2I+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0IEFQIG1vZGUgVHggcG93ZXIgbGV2ZWwgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgYmV0d2VlbiAwLTE1LCBhcyBkQiBvZmZzZXQgZnJvbSBtYXggcG93ZXIgKDAgaW5kaWNhdGVzIE1BWCBwb3dlcikgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbnMgdGFrZXMgPGI+X3U4PC9iPiBhcyBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1dMQU5fQ0ZHX1AyUF9QQVJBTV9JRDwvYj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9XTEFOX1AyUF9PUFRfQ0hBTk5FTF9OX1JFR1M8L2I+IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXQgUDJQIENoYW5uZWxzLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuIGNoYW5uZWwgKGVpdGhlciAxLzYvMTEgZm9yIDIuNEdIeikgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbiByZWd1bGF0b3J5IGNsYXNzICg4MSBmb3IgMi40R0h6KSAgIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyIGNoYW5uZWwgKGVpdGhlciAxLzYvMTEgZm9yIDIuNEdIeikgICBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlciByZWd1bGF0b3J5IGNsYXNzICg4MSBmb3IgMi40R0h6KSAgICAgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbiBjaGFubmVsIGFuZCByZWd1bGF0b3J5IGNsYXNzIHdpbGwgZGV0ZXJtaW5lIHRoZSBkZXZpY2UgbGlzdGVuIGNoYW5uZWwgZHVyaW5nIHAycCBmaW5kIGxpc3RlbiBwaGFzZSBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlciBjaGFubmVsIGFuZCByZWd1bGF0b3J5IGNsYXNzIHdpbGwgZGV0ZXJtaW5lIHRoZSBvcGVyYXRpbmcgY2hhbm5lbCBwcmVmZXJyZWQgYnkgdGhpcyBkZXZpY2UgKGluIGNhc2UgaXQgaXMgZ3JvdXAgb3duZXIgdGhpcyB3aWxsIGJlIHRoZSBvcGVyYXRpbmcgY2hhbm5lbCkgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzIHNob3VsZCBiZSBvbmUgb2YgdGhlIHNvY2lhbCBjaGFubmVscyAoMS82LzExKS4gSW4gY2FzZSBubyBsaXN0ZW4vb3BlciBjaGFubmVsIHNlbGVjdGVkLCBhIHJhbmRvbSAxLzYvMTEgd2lsbCBiZSBzZWxlY3RlZC4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIHRha2VzIHBvaW50ZXIgdG8gPGI+X3U4WzRdPC9iPiBhcyBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1dMQU5fUlhfRklMVEVSU19JRDwvYj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1dMQU5fUlhfRklMVEVSX1NUQVRFPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXRyaWV2ZXMgdGhlIGZpbHRlcnMgZW5hYmxlL2Rpc2FibGUgc3RhdHVzLiBUaGUgYnVmZmVyIGlucHV0IGlzIFNsV2xhblJ4RmlsdGVyUmV0cmlldmVTdGF0ZUJ1ZmZfdCBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfV0xBTl9SWF9GSUxURVJfU1lTX1NUQVRFPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXRyaWV2ZXMgdGhlIHN5c3RlbSBmaWx0ZXJzIGVuYWJsZS9kaXNhYmxlIHN0YXR1cy4gVGhlIGJ1ZmZlciBpbnB1dCBpcyBTbFdsYW5SeEZpbHRlclN5c0ZpbHRlcnNSZXRyaWV2ZVN0YXRlQnVmZl90OgoKICAgIFxwYXJhbVtvdXRdIHBDb25maWdMZW4gLSBUaGUgbGVuZ3RoIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFzIGlucHV0LCB3aGVuIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY29tcGxldGUsIHRoZSB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlciB3b3VsZCBiZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxlbiB0aGF0IGFjdHVhbGx5IHJlYWQgZnJvbSB0aGUgZGV2aWNlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGRldmljZSByZXR1cm4gbGVuZ3RoIHRoYXQgaXMgbG9uZ2VyIGZyb20gdGhlIGlucHV0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgdGhlIGZ1bmN0aW9uIHdpbGwgY3V0IHRoZSBlbmQgb2YgdGhlIHJldHVybmVkIHN0cnVjdHVyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHdpbGwgcmV0dXJuIFNMX0VTTUFMTEJVRi4KCgogICAgXHBhcmFtW291dF0gcFZhbHVlcyAtIGdldCBjb25maWd1cmF0aW9ucyB2YWx1ZXMKICAgIFxyZXR1cm4gICAgWmVybyBvbiBzdWNjZXNzLCBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKICAgIFxzYSAgIHNsX1dsYW5TZXQKICAgIFxub3RlCgkJCUluIGNhc2UgdGhlIGRldmljZSB3YXMgc3RhcnRlZCBhcyBBUCBtb2RlLCBidXQgbm8gU1NJRCB3YXMgc2V0LCB0aGUgR2V0IFNTSUQgd2lsbCByZXR1cm4gIm15c2ltcGxlbGluayIgYW5kIG5vdCAibXlzaW1wbGVsaW5rLXh4eXl6eiIKICAgIFx3YXJuaW5nCiAgICBccGFyICAgIEV4YW1wbGVzCiAgICAKCS0gU0xfV0xBTl9HRU5FUkFMX1BBUkFNX09QVF9TQ0FOX1BBUkFNUzoKCVxjb2RlCgkJU2xXbGFuU2NhblBhcmFtQ29tbWFuZF90IFNjYW5QYXJhbUNvbmZpZzsKCQlfdTE2IE9wdGlvbiA9IFNMX1dMQU5fR0VORVJBTF9QQVJBTV9PUFRfU0NBTl9QQVJBTVM7CgkJX3UxNiBPcHRpb25MZW4gPSBzaXplb2YoU2xXbGFuU2NhblBhcmFtQ29tbWFuZF90KTsKCQlzbF9XbGFuR2V0KFNMX1dMQU5fQ0ZHX0dFTkVSQUxfUEFSQU1fSUQgLCZPcHRpb24sJk9wdGlvbkxlbiwoX3U4ICopJlNjYW5QYXJhbUNvbmZpZyk7CiAgICBcZW5kY29kZQoJPGJyPgoKCS0gU0xfV0xBTl9HRU5FUkFMX1BBUkFNX09QVF9BUF9UWF9QT1dFUjoKICAgIFxjb2RlCiAgICAgICAgX2kzMiBUWFBvd2VyID0gMDsKICAgICAgICBfdTE2IE9wdGlvbiA9IFNMX1dMQU5fR0VORVJBTF9QQVJBTV9PUFRfQVBfVFhfUE9XRVI7CiAgICAgICAgX3UxNiBPcHRpb25MZW4gPSBzaXplb2YoVFhQb3dlcik7CiAgICAgICAgc2xfV2xhbkdldChTTF9XTEFOX0NGR19HRU5FUkFMX1BBUkFNX0lEICwmT3B0aW9uLCZPcHRpb25MZW4sKF91OCAqKSZUWFBvd2VyKTsKICAgIFxlbmRjb2RlCgk8YnI+CgoJLSBTTF9XTEFOX0dFTkVSQUxfUEFSQU1fT1BUU1RBX1RYX1BPV0VSOgogICAgXGNvZGUKCQlfaTMyIFRYUG93ZXIgPSAwOwoJCV91MTYgT3B0aW9uID0gU0xfV0xBTl9HRU5FUkFMX1BBUkFNX09QVF9TVEFfVFhfUE9XRVI7CgkJX3UxNiBPcHRpb25MZW4gPSBzaXplb2YoVFhQb3dlcik7CgkJc2xfV2xhbkdldChTTF9XTEFOX0NGR19HRU5FUkFMX1BBUkFNX0lEICwmT3B0aW9uLCZPcHRpb25MZW4sKF91OCAqKSZUWFBvd2VyKTsKICAgIFxlbmRjb2RlCgk8YnI+CgoJLSBTTF9XTEFOX1AyUF9PUFRfREVWX1RZUEU6CiAgICBcY29kZQogICAgICAgIF9pOCBkZXZpY2VfdHlwZVsxOF07CiAgICAgICAgX3UxNiBsZW4gPSAxODsKICAgICAgICBfdTE2IGNvbmZpZ19vcHQgPSBTTF9XTEFOX1AyUF9PUFRfREVWX1RZUEU7CiAgICAgICAgc2xfV2xhbkdldChTTF9XTEFOX0NGR19QMlBfUEFSQU1fSUQsICZjb25maWdfb3B0ICwgJmxlbiwgKF91OCogKWRldmljZV90eXBlKTsKICAgIFxlbmRjb2RlCgk8YnI+CgoJLSBTTF9XTEFOX0FQX09QVF9TU0lEOgogICAgXGNvZGUKICAgICAgICBfaTggc3NpZFszM107CiAgICAgICAgX3UxNiBsZW4gPSAzMzsKCQlzbF9NZW1zZXQoc3NpZCwwLDMzKTsKICAgICAgICBfdTE2ICBjb25maWdfb3B0ID0gU0xfV0xBTl9BUF9PUFRfU1NJRDsKICAgICAgICBzbF9XbGFuR2V0KFNMX1dMQU5fQ0ZHX0FQX0lELCAmY29uZmlnX29wdCAsICZsZW4sIChfdTgqIClzc2lkKTsKICAgIFxlbmRjb2RlCgk8YnI+CgoJLSBTTF9XTEFOX0dFTkVSQUxfUEFSQU1fT1BUX0NPVU5UUllfQ09ERToKICAgIFxjb2RlCgkJX2k4IGNvdW50cnlbM107CgkJX3UxNiBsZW4gPSAzOwoJCV91MTYgIGNvbmZpZ19vcHQgPSBTTF9XTEFOX0dFTkVSQUxfUEFSQU1fT1BUX0NPVU5UUllfQ09ERTsKCQlzbF9XbGFuR2V0KFNMX1dMQU5fQ0ZHX0dFTkVSQUxfUEFSQU1fSUQsICZjb25maWdfb3B0LCAmbGVuLCAoX3U4KiApY291bnRyeSk7CiAgICBcZW5kY29kZQoJPGJyPgoKCS0gU0xfV0xBTl9BUF9PUFRfQ0hBTk5FTDoKICAgIFxjb2RlCgkJX2k4IGNoYW5uZWw7CgkJX3UxNiBsZW4gPSAxOwoJCV91MTYgIGNvbmZpZ19vcHQgPSBTTF9XTEFOX0FQX09QVF9DSEFOTkVMOwoJCXNsX1dsYW5HZXQoU0xfV0xBTl9DRkdfQVBfSUQsICZjb25maWdfb3B0LCAmbGVuLCAoX3U4KiApJmNoYW5uZWwpOwogICAgXGVuZGNvZGUKCTxicj4KCgktIFNMX1dMQU5fQVBfT1BUX0hJRERFTl9TU0lEOgogICAgXGNvZGUKCQlfdTggaGlkZGVuOwoJCV91MTYgbGVuID0gMTsKCQlfdTE2ICBjb25maWdfb3B0ID0gU0xfV0xBTl9BUF9PUFRfSElEREVOX1NTSUQ7CgkJc2xfV2xhbkdldChTTF9XTEFOX0NGR19BUF9JRCwgJmNvbmZpZ19vcHQsICZsZW4sIChfdTgqICkmaGlkZGVuKTsKICAgIFxlbmRjb2RlCgk8YnI+CgoJLSBTTF9XTEFOX0FQX09QVF9TRUNVUklUWV9UWVBFOgogICAgXGNvZGUKCQlfdTggc2VjX3R5cGU7CgkJX3UxNiBsZW4gPSAxOwoJCV91MTYgIGNvbmZpZ19vcHQgPSBTTF9XTEFOX0FQX09QVF9TRUNVUklUWV9UWVBFOwoJCXNsX1dsYW5HZXQoU0xfV0xBTl9DRkdfQVBfSUQsICZjb25maWdfb3B0LCAmbGVuLCAoX3U4KiApJnNlY190eXBlKTsKICAgIFxlbmRjb2RlCgk8YnI+CiAgICAKCS0gU0xfV0xBTl9BUF9PUFRfUEFTU1dPUkQ6CglcY29kZQoJCV91OCBwYXNzd29yZFs2NF07CgkJX3UxNiBsZW4gPSA2NDsKCQlzbF9NZW1zZXQocGFzc3dvcmQsMCw2NCk7CgkJX3UxNiBjb25maWdfb3B0ID0gU0xfV0xBTl9BUF9PUFRfUEFTU1dPUkQ7CgkJc2xfV2xhbkdldChTTF9XTEFOX0NGR19BUF9JRCwgJmNvbmZpZ19vcHQsICZsZW4sIChfdTgqIClwYXNzd29yZCk7CiAgICBcZW5kY29kZQoJPGJyPgoKCS0gU0xfV0xBTl9BUF9PUFRfTUFYX1NUQVRJT05TOgogICAgXGNvZGUKCQlfdTggbWF4X2FwX3N0YXRpb25zCgkJX3UxNiBsZW4gPSAxOwoJCV91MTYgIGNvbmZpZ19vcHQgPSBTTF9XTEFOX0FQX09QVF9NQVhfU1RBVElPTlM7CgkJc2xfV2xhbkdldChTTF9XTEFOX0NGR19BUF9JRCwgJmNvbmZpZ19vcHQsICZsZW4sIChfdTggKikmbWF4X2FwX3N0YXRpb25zKTsKICAgIFxlbmRjb2RlCgk8YnI+CgoJLSBTTF9XTEFOX0FQX09QVF9NQVhfU1RBX0FHSU5HOgogICAgXGNvZGUKCQlfdTE2IGFwX3N0YV9hZ2luZzsKCQlfdTE2IGxlbiA9IDI7CgkJX3UxNiAgY29uZmlnX29wdCA9IFNMX1dMQU5fQVBfT1BUX01BWF9TVEFfQUdJTkc7CgkJc2xfV2xhbkdldChTTF9XTEFOX0NGR19BUF9JRCwgJmNvbmZpZ19vcHQsICZsZW4sIChfdTggKikmYXBfc3RhX2FnaW5nKTsKICAgIFxlbmRjb2RlCgk8YnI+CiAgICAKCS0gU0xfV0xBTl9BUF9BQ0NFU1NfTElTVF9OVU1fRU5UUklFUzoKCVxjb2RlCgkJX3U4IGFjbGlzdF9udW1fZW50cmllczsKCQlfdTE2IGNvbmZpZ19vcHQgPSBTTF9XTEFOX0FQX0FDQ0VTU19MSVNUX05VTV9FTlRSSUVTOwoJCV91MTYgbGVuID0gc2l6ZW9mKGFjbGlzdF9udW1fZW50cmllcyk7CgkJc2xfV2xhbkdldChTTF9XTEFOX0NGR19BUF9JRCwgJmNvbmZpZ19vcHQsICZsZW4sIChfdTggKikmYWNsaXN0X251bV9lbnRyaWVzKTsKICAgIFxlbmRjb2RlCgk8YnI+CgoJLSBTTF9XTEFOX0NGR19BUF9BQ0NFU1NfTElTVF9JRDoKICAgIFxjb2RlCgkJX3U4IGFjbGlzdF9tYWNbU0xfV0xBTl9NQVhfQUNDRVNTX0xJU1RfU1RBVElPTlNdW01BQ19MRU5dOwoJCXVuc2lnbmVkIGNoYXIgYWNsaXN0X251bV9lbnRyaWVzOwoJCXVuc2lnbmVkIHNob3J0IGNvbmZpZ19vcHQ7CgkJdW5zaWduZWQgc2hvcnQgbGVuOwoJCWludCBhY3R1YWxfYWNsaXN0X251bV9lbnRyaWVzOwoJCXVuc2lnbmVkIHNob3J0IHN0YXJ0X2FjbGlzdF9pbmRleDsKCQl1bnNpZ25lZCBzaG9ydCBhY2xpc3RfaW5mb19sZW47CgkJaW50IGk7CgoJCXN0YXJ0X2FjbGlzdF9pbmRleCA9IDA7CgkJYWNsaXN0X2luZm9fbGVuID0gMipNQUNfTEVOOwoJCXNsX1dsYW5HZXQoU0xfV0xBTl9DRkdfQVBfQUNDRVNTX0xJU1RfSUQsICZzdGFydF9hY2xpc3RfaW5kZXgsICZhY2xpc3RfaW5mb19sZW4sIChfdTggKikmYWNsaXN0X21hY1tzdGFydF9hY2xpc3RfaW5kZXhdKTsKCgkJYWN0dWFsX2FjbGlzdF9udW1fZW50cmllcyA9IGFjbGlzdF9pbmZvX2xlbiAvIE1BQ19MRU47CgkJcHJpbnRmKCItUHJpbnQgQVAgRGVueSBsaXN0LCBudW0gc3RhdGlvbnMgPSAlZFxuIiwgYWN0dWFsX2FjbGlzdF9udW1fZW50cmllcyk7CgkJZm9yIChpPTA7IGk8YWN0dWFsX2FjbGlzdF9udW1fZW50cmllczsgaSsrKQoJCXsKCQkJCV91OCAqcE1hYyA9IGFjbGlzdF9tYWNbaStzdGFydF9hY2xpc3RfaW5kZXhdOwoJCQkJcHJpbnRmKCIgICAgTUFDICVkOiAgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIGksIHBNYWNbMF0sIHBNYWNbMV0sIHBNYWNbMl0sIHBNYWNbM10sIHBNYWNbNF0sIHBNYWNbNV0pOwoJCX0KICAgIFxlbmRjb2RlCgk8YnI+CgoJLSBTTF9XTEFOX1AyUF9PUFRfQ0hBTk5FTF9OX1JFR1M6CiAgICBcY29kZQoJCV91MTYgbGlzdGVuX2NoYW5uZWwsbGlzdGVuX3JlZyxvcGVyX2NoYW5uZWwsb3Blcl9yZWc7CgkJX3UxNiBsZW4gPSA0OwoJCV91MTYgIGNvbmZpZ19vcHQgPSBTTF9XTEFOX1AyUF9PUFRfQ0hBTk5FTF9OX1JFR1M7CgkJX3U4IGNoYW5uZWxfbl9yZWdzWzRdOwoJCXNsX1dsYW5HZXQoU0xfV0xBTl9DRkdfUDJQX1BBUkFNX0lELCAmY29uZmlnX29wdCwgJmxlbiwgKF91OCogKWNoYW5uZWxfbl9yZWdzKTsKCQlsaXN0ZW5fY2hhbm5lbCA9IGNoYW5uZWxfbl9yZWdzWzBdOwoJCWxpc3Rlbl9yZWcgPSBjaGFubmVsX25fcmVnc1sxXTsKCQlvcGVyX2NoYW5uZWwgPSBjaGFubmVsX25fcmVnc1syXTsKCQlvcGVyX3JlZyA9IGNoYW5uZWxfbl9yZWdzWzNdOwogICAgXGVuZGNvZGUKCTxicj4KCgktIFNMX1dMQU5fUlhfRklMVEVSX1NUQVRFOgogICAgXGNvZGUKCQlpbnQgcmV0ID0gMDsKCQlTbFdsYW5SeEZpbHRlcklkTWFza190ICBGaWx0ZXJJZE1hc2s7CgkJX3UxNiBsZW4gPSBzaXplb2YoU2xXbGFuUnhGaWx0ZXJJZE1hc2tfdCk7OwoJCV91MTYgIGNvbmZpZ19vcHQgPSBTTF9XTEFOX1JYX0ZJTFRFUl9TVEFURTsKCQltZW1zZXQoRmlsdGVySWRNYXNrLDAsc2l6ZW9mKEZpbHRlcklkTWFzaykpOwoJCXJldCA9IHNsX1dsYW5HZXQoU0xfV0xBTl9SWF9GSUxURVJTX0lELCAmY29uZmlnX29wdCAsICZsZW4sIChfdTgqIClGaWx0ZXJJZE1hc2spOwogICAgXGVuZGNvZGUKCTxicj4KCgktIFNMX1dMQU5fUlhfRklMVEVSX1NZU19TVEFURToKICAgIFxjb2RlCgkJaW50IHJldCA9IDA7CgkJU2xXbGFuUnhGaWx0ZXJTeXNGaWx0ZXJzTWFza190ICBGaWx0ZXJTeXNJZE1hc2s7CgkJX3UxNiBsZW4gPSBzaXplb2YoU2xXbGFuUnhGaWx0ZXJTeXNGaWx0ZXJzTWFza190KTs7CgkJX3UxNiAgY29uZmlnX29wdCA9IFNMX1dMQU5fUlhfRklMVEVSX1NZU19TVEFURTsKCQltZW1zZXQoRmlsdGVyU3lzSWRNYXNrLDAsc2l6ZW9mKEZpbHRlclN5c0lkTWFzaykpOwoJCXJldCA9IHNsX1dsYW5HZXQoU0xfV0xBTl9SWF9GSUxURVJTX0lELCAmY29uZmlnX29wdCAsICZsZW4sIChfdTgqIClGaWx0ZXJTeXNJZE1hc2spOwogICAgXGVuZGNvZGUKCTxicj4KCgktIFNMX1dMQU5fQ09OTkVDVElPTl9JTkZPOgogICAgXGNvZGUKCQlfaTE2IFJldFZhbCA9IDAgOwoJCV91MTYgTGVuID0gc2l6ZW9mKFNsV2xhbkNvbm5TdGF0dXNQYXJhbV90KSA7CgkJU2xXbGFuQ29ublN0YXR1c1BhcmFtX3QgV2xhbkNvbm5lY3RJbmZvIDsKCQlSZXRWYWwgPSBzbF9XbGFuR2V0KFNMX1dMQU5fQ09OTkVDVElPTl9JTkZPLCBOVUxMICwgJkxlbiwgKF91OCopJldsYW5Db25uZWN0SW5mbyk7CiAgIFxlbmRjb2RlCgk8YnI+CgoqLwoKI2lmIF9TTF9JTkNMVURFX0ZVTkMoc2xfV2xhbkdldCkKX2kxNiBzbF9XbGFuR2V0KGNvbnN0IF91MTYgQ29uZmlnSWQsIF91MTYgKnBDb25maWdPcHQsX3UxNiAqcENvbmZpZ0xlbiwgX3U4ICpwVmFsdWVzKTsKI2VuZGlmCgovKiEKICBcYnJpZWYgQWRkcyBuZXcgZmlsdGVyIHJ1bGUgdG8gdGhlIHN5c3RlbQoKICBccGFyYW1baW5dICAgIFJ1bGVUeXBlICAgICBUaGUgcnVsZSB0eXBlCgkJCQkJCQkJLSBTTF9XTEFOX1JYX0ZJTFRFUl9IRUFERVIKCQkJCQkJCQktIFNMX1dMQU5fUlhfRklMVEVSX0NPTUJJTkFUSU9OCiAgCiAgXHBhcmFtW2luXSAgICBGbGFncyAgICAgICAgRmxhZ3Mgd2hpY2ggc2V0IHRoZSB0eXBlIG9mIGhlYWRlciBydWxlIEFyZ3MgYW5kIHNldHMgdGhlIHBlcnNpc3RlbnQgZmxhZwoJCQkJCQkJCS0gU0xfV0xBTl9SWF9GSUxURVJfQklOQVJZCgkJCQkJCQkJLSBTTF9XTEFOX1JYX0ZJTFRFUl9QRVJTSVNURU5UCgkJCQkJCQkJLSBTTF9XTEFOX1JYX0ZJTFRFUl9FTkFCTEUKICAKICBccGFyYW1baW5dICAgIHBSdWxlICAgICAgICBEZXRlcm1pbmUgdGhlIGZpbHRlciBydWxlIGxvZ2ljCiAgXHBhcmFtW2luXSAgICBwVHJpZ2dlciAgICAgRGV0ZXJtaW5lIHdoZW4gdGhlIHJ1bGUgaXMgdHJpZ2dlcmVkIGFsc28gc2V0cyBydWxlIHBhcmVudC4KICBccGFyYW1baW5dICAgIHBBY3Rpb24gICAgICBTZXRzIHRoZSBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQgaW4gY2FzZSB0aGUgbWF0Y2ggZnVuY3Rpb25zIHBhc3MKICBccGFyYW1bb3V0XSAgIHBGaWx0ZXJJZCAgICBUaGUgZmlsdGVySWQgd2hpY2ggd2FzIGNyZWF0ZWQKCiAgXHBhciBQZXJzaXN0ZW50ICAgCgkJCVNhdmUgdGhlIGZpbHRlcnMgZm9yIHBlcnNpc3RlbnQgY2FuIGJlIGRvbmUgYnkgY2FsbGluZyAgd2l0aCBTTF9XTEFOX1JYX0ZJTFRFUl9TVE9SRQoKICBccmV0dXJuICAgICAgIFplcm8gb24gc3VjY2Vzcywgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCiAgXHNhCiAgXG5vdGUKICBcd2FybmluZwogKi8KI2lmIF9TTF9JTkNMVURFX0ZVTkMoc2xfV2xhblJ4RmlsdGVyQWRkKQpfaTE2IHNsX1dsYW5SeEZpbHRlckFkZCggICAgU2xXbGFuUnhGaWx0ZXJSdWxlVHlwZV90ICAgICAgICAgICAgICAgIFJ1bGVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xXbGFuUnhGaWx0ZXJGbGFnc191ICAgICAgICAgICAgICAgICAgIEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2xXbGFuUnhGaWx0ZXJSdWxlX3UqIGNvbnN0ICAgICAgIHBSdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2xXbGFuUnhGaWx0ZXJUcmlnZ2VyX3QqIGNvbnN0ICAgIHBUcmlnZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2xXbGFuUnhGaWx0ZXJBY3Rpb25fdCogY29uc3QgICAgIHBBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbFdsYW5SeEZpbHRlcklEX3QqICAgICAgICAgICAgICAgICAgICAgcEZpbHRlcklkKTsKCiNlbmRpZgoKCgoKLyohCgogQ2xvc2UgdGhlIERveHlnZW4gZ3JvdXAuCiBAfQoKICovCgoKI2lmZGVmICBfX2NwbHVzcGx1cwp9CiNlbmRpZiAvKiAgX19jcGx1c3BsdXMgKi8KCiNlbmRpZiAgICAvKiAgX19XTEFOX0hfXyAqLwoK