LyoKICogUUVNVSBGbG9wcHkgZGlzayBlbXVsYXRvciAoSW50ZWwgODIwNzgpCiAqCiAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBKb2NlbHluIE1heWVyCiAqIENvcHlyaWdodCAoYykgMjAwOCBIZXJ26SBQb3Vzc2luZWF1CiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwogKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwogKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKgogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgogKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KICogVEhFIFNPRlRXQVJFLgogKi8KLyoKICogVGhlIGNvbnRyb2xsZXIgaXMgdXNlZCBpbiBTdW40bSBzeXN0ZW1zIGluIGEgc2xpZ2h0bHkgZGlmZmVyZW50CiAqIHdheS4gVGhlcmUgYXJlIGNoYW5nZXMgaW4gRE9SIHJlZ2lzdGVyIGFuZCBETUEgaXMgbm90IGF2YWlsYWJsZS4KICovCgojaW5jbHVkZSAiaHcuaCIKI2luY2x1ZGUgImZkYy5oIgojaW5jbHVkZSAicWVtdS1lcnJvci5oIgojaW5jbHVkZSAicWVtdS10aW1lci5oIgojaW5jbHVkZSAiaXNhLmgiCiNpbmNsdWRlICJzeXNidXMuaCIKI2luY2x1ZGUgInFkZXYtYWRkci5oIgojaW5jbHVkZSAiYmxvY2tkZXYuaCIKI2luY2x1ZGUgInN5c2VtdS5oIgojaW5jbHVkZSAiYmxvY2tfaW50LmgiCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIGRlYnVnIEZsb3BweSBkZXZpY2VzICovCi8vI2RlZmluZSBERUJVR19GTE9QUFkKCiNpZmRlZiBERUJVR19GTE9QUFkKI2RlZmluZSBGTE9QUFlfRFBSSU5URihmbXQsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGRvIHsgcHJpbnRmKCJGTE9QUFk6ICIgZm10ICwgIyMgX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQojZWxzZQojZGVmaW5lIEZMT1BQWV9EUFJJTlRGKGZtdCwgLi4uKQojZW5kaWYKCiNkZWZpbmUgRkxPUFBZX0VSUk9SKGZtdCwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGRvIHsgcHJpbnRmKCJGTE9QUFkgRVJST1I6ICVzOiAiIGZtdCwgX19mdW5jX18gLCAjIyBfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIEZsb3BweSBkcml2ZSBlbXVsYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNkZWZpbmUgR0VUX0NVUl9EUlYoZmRjdHJsKSAoKGZkY3RybCktPmN1cl9kcnYpCiNkZWZpbmUgU0VUX0NVUl9EUlYoZmRjdHJsLCBkcml2ZSkgKChmZGN0cmwpLT5jdXJfZHJ2ID0gKGRyaXZlKSkKCi8qIFdpbGwgYWx3YXlzIGJlIGEgZml4ZWQgcGFyYW1ldGVyIGZvciB1cyAqLwojZGVmaW5lIEZEX1NFQ1RPUl9MRU4gICAgICAgICAgNTEyCiNkZWZpbmUgRkRfU0VDVE9SX1NDICAgICAgICAgICAyICAgLyogU2VjdG9yIHNpemUgY29kZSAqLwojZGVmaW5lIEZEX1JFU0VUX1NFTlNFSV9DT1VOVCAgNCAgIC8qIE51bWJlciBvZiBzZW5zZSBpbnRlcnJ1cHRzIG9uIFJFU0VUICovCgovKiBGbG9wcHkgZGlzayBkcml2ZSBlbXVsYXRpb24gKi8KdHlwZWRlZiBlbnVtIEZEaXNrRmxhZ3MgewogICAgRkRJU0tfREJMX1NJREVTICA9IDB4MDEsCn0gRkRpc2tGbGFnczsKCnR5cGVkZWYgc3RydWN0IEZEcml2ZSB7CiAgICBCbG9ja0RyaXZlclN0YXRlICpiczsKICAgIC8qIERyaXZlIHN0YXR1cyAqLwogICAgRkRyaXZlVHlwZSBkcml2ZTsKICAgIHVpbnQ4X3QgcGVycGVuZGljdWxhcjsgICAgLyogMi44OCBNQiBhY2Nlc3MgbW9kZSAgICAqLwogICAgLyogUG9zaXRpb24gKi8KICAgIHVpbnQ4X3QgaGVhZDsKICAgIHVpbnQ4X3QgdHJhY2s7CiAgICB1aW50OF90IHNlY3Q7CiAgICAvKiBNZWRpYSAqLwogICAgRkRpc2tGbGFncyBmbGFnczsKICAgIHVpbnQ4X3QgbGFzdF9zZWN0OyAgICAgICAgLyogTmIgc2VjdG9yIHBlciB0cmFjayAgICAqLwogICAgdWludDhfdCBtYXhfdHJhY2s7ICAgICAgICAvKiBOYiBvZiB0cmFja3MgICAgICAgICAgICovCiAgICB1aW50MTZfdCBicHM7ICAgICAgICAgICAgIC8qIEJ5dGVzIHBlciBzZWN0b3IgICAgICAgKi8KICAgIHVpbnQ4X3Qgcm87ICAgICAgICAgICAgICAgLyogSXMgcmVhZC1vbmx5ICAgICAgICAgICAqLwogICAgdWludDhfdCBtZWRpYV9jaGFuZ2VkOyAgICAvKiBJcyBtZWRpYSBjaGFuZ2VkICAgICAgICovCn0gRkRyaXZlOwoKc3RhdGljIHZvaWQgZmRfaW5pdChGRHJpdmUgKmRydikKewogICAgLyogRHJpdmUgKi8KICAgIGRydi0+ZHJpdmUgPSBGRFJJVkVfRFJWX05PTkU7CiAgICBkcnYtPnBlcnBlbmRpY3VsYXIgPSAwOwogICAgLyogRGlzayAqLwogICAgZHJ2LT5sYXN0X3NlY3QgPSAwOwogICAgZHJ2LT5tYXhfdHJhY2sgPSAwOwp9CgpzdGF0aWMgaW50IGZkX3NlY3Rvcl9jYWxjKHVpbnQ4X3QgaGVhZCwgdWludDhfdCB0cmFjaywgdWludDhfdCBzZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGFzdF9zZWN0KQp7CiAgICByZXR1cm4gKCgodHJhY2sgKiAyKSArIGhlYWQpICogbGFzdF9zZWN0KSArIHNlY3QgLSAxOwp9CgovKiBSZXR1cm5zIGN1cnJlbnQgcG9zaXRpb24sIGluIHNlY3RvcnMsIGZvciBnaXZlbiBkcml2ZSAqLwpzdGF0aWMgaW50IGZkX3NlY3RvcihGRHJpdmUgKmRydikKewogICAgcmV0dXJuIGZkX3NlY3Rvcl9jYWxjKGRydi0+aGVhZCwgZHJ2LT50cmFjaywgZHJ2LT5zZWN0LCBkcnYtPmxhc3Rfc2VjdCk7Cn0KCi8qIFNlZWsgdG8gYSBuZXcgcG9zaXRpb246CiAqIHJldHVybnMgMCBpZiBhbHJlYWR5IG9uIHJpZ2h0IHRyYWNrCiAqIHJldHVybnMgMSBpZiB0cmFjayBjaGFuZ2VkCiAqIHJldHVybnMgMiBpZiB0cmFjayBpcyBpbnZhbGlkCiAqIHJldHVybnMgMyBpZiBzZWN0b3IgaXMgaW52YWxpZAogKiByZXR1cm5zIDQgaWYgc2VlayBpcyBkaXNhYmxlZAogKi8Kc3RhdGljIGludCBmZF9zZWVrKEZEcml2ZSAqZHJ2LCB1aW50OF90IGhlYWQsIHVpbnQ4X3QgdHJhY2ssIHVpbnQ4X3Qgc2VjdCwKICAgICAgICAgICAgICAgICAgIGludCBlbmFibGVfc2VlaykKewogICAgdWludDMyX3Qgc2VjdG9yOwogICAgaW50IHJldDsKCiAgICBpZiAodHJhY2sgPiBkcnYtPm1heF90cmFjayB8fAogICAgICAgIChoZWFkICE9IDAgJiYgKGRydi0+ZmxhZ3MgJiBGRElTS19EQkxfU0lERVMpID09IDApKSB7CiAgICAgICAgRkxPUFBZX0RQUklOVEYoInRyeSB0byByZWFkICVkICUwMnggJTAyeCAobWF4PSVkICVkICUwMnggJTAyeClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgaGVhZCwgdHJhY2ssIHNlY3QsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgKGRydi0+ZmxhZ3MgJiBGRElTS19EQkxfU0lERVMpID09IDAgPyAwIDogMSwKICAgICAgICAgICAgICAgICAgICAgICBkcnYtPm1heF90cmFjaywgZHJ2LT5sYXN0X3NlY3QpOwogICAgICAgIHJldHVybiAyOwogICAgfQogICAgaWYgKHNlY3QgPiBkcnYtPmxhc3Rfc2VjdCkgewogICAgICAgIEZMT1BQWV9EUFJJTlRGKCJ0cnkgdG8gcmVhZCAlZCAlMDJ4ICUwMnggKG1heD0lZCAlZCAlMDJ4ICUwMngpXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGhlYWQsIHRyYWNrLCBzZWN0LCAxLAogICAgICAgICAgICAgICAgICAgICAgIChkcnYtPmZsYWdzICYgRkRJU0tfREJMX1NJREVTKSA9PSAwID8gMCA6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgZHJ2LT5tYXhfdHJhY2ssIGRydi0+bGFzdF9zZWN0KTsKICAgICAgICByZXR1cm4gMzsKICAgIH0KICAgIHNlY3RvciA9IGZkX3NlY3Rvcl9jYWxjKGhlYWQsIHRyYWNrLCBzZWN0LCBkcnYtPmxhc3Rfc2VjdCk7CiAgICByZXQgPSAwOwogICAgaWYgKHNlY3RvciAhPSBmZF9zZWN0b3IoZHJ2KSkgewojaWYgMAogICAgICAgIGlmICghZW5hYmxlX3NlZWspIHsKICAgICAgICAgICAgRkxPUFBZX0VSUk9SKCJubyBpbXBsaWNpdCBzZWVrICVkICUwMnggJTAyeCAobWF4PSVkICUwMnggJTAyeClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkLCB0cmFjaywgc2VjdCwgMSwgZHJ2LT5tYXhfdHJhY2ssIGRydi0+bGFzdF9zZWN0KTsKICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgfQojZW5kaWYKICAgICAgICBkcnYtPmhlYWQgPSBoZWFkOwogICAgICAgIGlmIChkcnYtPnRyYWNrICE9IHRyYWNrKQogICAgICAgICAgICByZXQgPSAxOwogICAgICAgIGRydi0+dHJhY2sgPSB0cmFjazsKICAgICAgICBkcnYtPnNlY3QgPSBzZWN0OwogICAgfQoKICAgIHJldHVybiByZXQ7Cn0KCi8qIFNldCBkcml2ZSBiYWNrIHRvIHRyYWNrIDAgKi8Kc3RhdGljIHZvaWQgZmRfcmVjYWxpYnJhdGUoRkRyaXZlICpkcnYpCnsKICAgIEZMT1BQWV9EUFJJTlRGKCJyZWNhbGlicmF0ZVxuIik7CiAgICBkcnYtPmhlYWQgPSAwOwogICAgZHJ2LT50cmFjayA9IDA7CiAgICBkcnYtPnNlY3QgPSAxOwp9CgovKiBSZXZhbGlkYXRlIGEgZGlzayBkcml2ZSBhZnRlciBhIGRpc2sgY2hhbmdlICovCnN0YXRpYyB2b2lkIGZkX3JldmFsaWRhdGUoRkRyaXZlICpkcnYpCnsKICAgIGludCBuYl9oZWFkcywgbWF4X3RyYWNrLCBsYXN0X3NlY3QsIHJvOwogICAgRkRyaXZlVHlwZSBkcml2ZTsKCiAgICBGTE9QUFlfRFBSSU5URigicmV2YWxpZGF0ZVxuIik7CiAgICBpZiAoZHJ2LT5icyAhPSBOVUxMICYmIGJkcnZfaXNfaW5zZXJ0ZWQoZHJ2LT5icykpIHsKICAgICAgICBybyA9IGJkcnZfaXNfcmVhZF9vbmx5KGRydi0+YnMpOwogICAgICAgIGJkcnZfZ2V0X2Zsb3BweV9nZW9tZXRyeV9oaW50KGRydi0+YnMsICZuYl9oZWFkcywgJm1heF90cmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGFzdF9zZWN0LCBkcnYtPmRyaXZlLCAmZHJpdmUpOwogICAgICAgIGlmIChuYl9oZWFkcyAhPSAwICYmIG1heF90cmFjayAhPSAwICYmIGxhc3Rfc2VjdCAhPSAwKSB7CiAgICAgICAgICAgIEZMT1BQWV9EUFJJTlRGKCJVc2VyIGRlZmluZWQgZGlzayAoJWQgJWQgJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJfaGVhZHMgLSAxLCBtYXhfdHJhY2ssIGxhc3Rfc2VjdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgRkxPUFBZX0RQUklOVEYoIkZsb3BweSBkaXNrICglZCBoICVkIHQgJWQgcykgJXNcbiIsIG5iX2hlYWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdHJhY2ssIGxhc3Rfc2VjdCwgcm8gPyAicm8iIDogInJ3Iik7CiAgICAgICAgfQogICAgICAgIGlmIChuYl9oZWFkcyA9PSAxKSB7CiAgICAgICAgICAgIGRydi0+ZmxhZ3MgJj0gfkZESVNLX0RCTF9TSURFUzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkcnYtPmZsYWdzIHw9IEZESVNLX0RCTF9TSURFUzsKICAgICAgICB9CiAgICAgICAgZHJ2LT5tYXhfdHJhY2sgPSBtYXhfdHJhY2s7CiAgICAgICAgZHJ2LT5sYXN0X3NlY3QgPSBsYXN0X3NlY3Q7CiAgICAgICAgZHJ2LT5ybyA9IHJvOwogICAgICAgIGRydi0+ZHJpdmUgPSBkcml2ZTsKICAgIH0gZWxzZSB7CiAgICAgICAgRkxPUFBZX0RQUklOVEYoIk5vIGRpc2sgaW4gZHJpdmVcbiIpOwogICAgICAgIGRydi0+bGFzdF9zZWN0ID0gMDsKICAgICAgICBkcnYtPm1heF90cmFjayA9IDA7CiAgICAgICAgZHJ2LT5mbGFncyAmPSB+RkRJU0tfREJMX1NJREVTOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIEludGVsIDgyMDc4IGZsb3BweSBkaXNrIGNvbnRyb2xsZXIgZW11bGF0aW9uICAgICAgICAgICovCgp0eXBlZGVmIHN0cnVjdCBGREN0cmwgRkRDdHJsOwoKc3RhdGljIHZvaWQgZmRjdHJsX3Jlc2V0KEZEQ3RybCAqZmRjdHJsLCBpbnQgZG9faXJxKTsKc3RhdGljIHZvaWQgZmRjdHJsX3Jlc2V0X2ZpZm8oRkRDdHJsICpmZGN0cmwpOwpzdGF0aWMgaW50IGZkY3RybF90cmFuc2Zlcl9oYW5kbGVyICh2b2lkICpvcGFxdWUsIGludCBuY2hhbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRtYV9wb3MsIGludCBkbWFfbGVuKTsKc3RhdGljIHZvaWQgZmRjdHJsX3JhaXNlX2lycShGREN0cmwgKmZkY3RybCwgdWludDhfdCBzdGF0dXMwKTsKCnN0YXRpYyB1aW50MzJfdCBmZGN0cmxfcmVhZF9zdGF0dXNBKEZEQ3RybCAqZmRjdHJsKTsKc3RhdGljIHVpbnQzMl90IGZkY3RybF9yZWFkX3N0YXR1c0IoRkRDdHJsICpmZGN0cmwpOwpzdGF0aWMgdWludDMyX3QgZmRjdHJsX3JlYWRfZG9yKEZEQ3RybCAqZmRjdHJsKTsKc3RhdGljIHZvaWQgZmRjdHJsX3dyaXRlX2RvcihGREN0cmwgKmZkY3RybCwgdWludDMyX3QgdmFsdWUpOwpzdGF0aWMgdWludDMyX3QgZmRjdHJsX3JlYWRfdGFwZShGREN0cmwgKmZkY3RybCk7CnN0YXRpYyB2b2lkIGZkY3RybF93cml0ZV90YXBlKEZEQ3RybCAqZmRjdHJsLCB1aW50MzJfdCB2YWx1ZSk7CnN0YXRpYyB1aW50MzJfdCBmZGN0cmxfcmVhZF9tYWluX3N0YXR1cyhGREN0cmwgKmZkY3RybCk7CnN0YXRpYyB2b2lkIGZkY3RybF93cml0ZV9yYXRlKEZEQ3RybCAqZmRjdHJsLCB1aW50MzJfdCB2YWx1ZSk7CnN0YXRpYyB1aW50MzJfdCBmZGN0cmxfcmVhZF9kYXRhKEZEQ3RybCAqZmRjdHJsKTsKc3RhdGljIHZvaWQgZmRjdHJsX3dyaXRlX2RhdGEoRkRDdHJsICpmZGN0cmwsIHVpbnQzMl90IHZhbHVlKTsKc3RhdGljIHVpbnQzMl90IGZkY3RybF9yZWFkX2RpcihGREN0cmwgKmZkY3RybCk7CgplbnVtIHsKICAgIEZEX0RJUl9XUklURSAgID0gMCwKICAgIEZEX0RJUl9SRUFEICAgID0gMSwKICAgIEZEX0RJUl9TQ0FORSAgID0gMiwKICAgIEZEX0RJUl9TQ0FOTCAgID0gMywKICAgIEZEX0RJUl9TQ0FOSCAgID0gNCwKfTsKCmVudW0gewogICAgRkRfU1RBVEVfTVVMVEkgID0gMHgwMSwJLyogbXVsdGkgdHJhY2sgZmxhZyAqLwogICAgRkRfU1RBVEVfRk9STUFUID0gMHgwMiwJLyogZm9ybWF0IGZsYWcgKi8KICAgIEZEX1NUQVRFX1NFRUsgICA9IDB4MDQsCS8qIHNlZWsgZmxhZyAqLwp9OwoKZW51bSB7CiAgICBGRF9SRUdfU1JBID0gMHgwMCwKICAgIEZEX1JFR19TUkIgPSAweDAxLAogICAgRkRfUkVHX0RPUiA9IDB4MDIsCiAgICBGRF9SRUdfVERSID0gMHgwMywKICAgIEZEX1JFR19NU1IgPSAweDA0LAogICAgRkRfUkVHX0RTUiA9IDB4MDQsCiAgICBGRF9SRUdfRklGTyA9IDB4MDUsCiAgICBGRF9SRUdfRElSID0gMHgwNywKfTsKCmVudW0gewogICAgRkRfQ01EX1JFQURfVFJBQ0sgPSAweDAyLAogICAgRkRfQ01EX1NQRUNJRlkgPSAweDAzLAogICAgRkRfQ01EX1NFTlNFX0RSSVZFX1NUQVRVUyA9IDB4MDQsCiAgICBGRF9DTURfV1JJVEUgPSAweDA1LAogICAgRkRfQ01EX1JFQUQgPSAweDA2LAogICAgRkRfQ01EX1JFQ0FMSUJSQVRFID0gMHgwNywKICAgIEZEX0NNRF9TRU5TRV9JTlRFUlJVUFRfU1RBVFVTID0gMHgwOCwKICAgIEZEX0NNRF9XUklURV9ERUxFVEVEID0gMHgwOSwKICAgIEZEX0NNRF9SRUFEX0lEID0gMHgwYSwKICAgIEZEX0NNRF9SRUFEX0RFTEVURUQgPSAweDBjLAogICAgRkRfQ01EX0ZPUk1BVF9UUkFDSyA9IDB4MGQsCiAgICBGRF9DTURfRFVNUFJFRyA9IDB4MGUsCiAgICBGRF9DTURfU0VFSyA9IDB4MGYsCiAgICBGRF9DTURfVkVSU0lPTiA9IDB4MTAsCiAgICBGRF9DTURfU0NBTl9FUVVBTCA9IDB4MTEsCiAgICBGRF9DTURfUEVSUEVORElDVUxBUl9NT0RFID0gMHgxMiwKICAgIEZEX0NNRF9DT05GSUdVUkUgPSAweDEzLAogICAgRkRfQ01EX0xPQ0sgPSAweDE0LAogICAgRkRfQ01EX1ZFUklGWSA9IDB4MTYsCiAgICBGRF9DTURfUE9XRVJET1dOX01PREUgPSAweDE3LAogICAgRkRfQ01EX1BBUlRfSUQgPSAweDE4LAogICAgRkRfQ01EX1NDQU5fTE9XX09SX0VRVUFMID0gMHgxOSwKICAgIEZEX0NNRF9TQ0FOX0hJR0hfT1JfRVFVQUwgPSAweDFkLAogICAgRkRfQ01EX1NBVkUgPSAweDJlLAogICAgRkRfQ01EX09QVElPTiA9IDB4MzMsCiAgICBGRF9DTURfUkVTVE9SRSA9IDB4NGUsCiAgICBGRF9DTURfRFJJVkVfU1BFQ0lGSUNBVElPTl9DT01NQU5EID0gMHg4ZSwKICAgIEZEX0NNRF9SRUxBVElWRV9TRUVLX09VVCA9IDB4OGYsCiAgICBGRF9DTURfRk9STUFUX0FORF9XUklURSA9IDB4Y2QsCiAgICBGRF9DTURfUkVMQVRJVkVfU0VFS19JTiA9IDB4Y2YsCn07CgplbnVtIHsKICAgIEZEX0NPTkZJR19QUkVUUksgPSAweGZmLCAvKiBQcmUtY29tcGVuc2F0aW9uIHNldCB0byB0cmFjayAwICovCiAgICBGRF9DT05GSUdfRklGT1RIUiA9IDB4MGYsIC8qIEZJRk8gdGhyZXNob2xkIHNldCB0byAxIGJ5dGUgKi8KICAgIEZEX0NPTkZJR19QT0xMICA9IDB4MTAsIC8qIFBvbGwgZW5hYmxlZCAqLwogICAgRkRfQ09ORklHX0VGSUZPID0gMHgyMCwgLyogRklGTyBkaXNhYmxlZCAqLwogICAgRkRfQ09ORklHX0VJUyAgID0gMHg0MCwgLyogTm8gaW1wbGllZCBzZWVrcyAqLwp9OwoKZW51bSB7CiAgICBGRF9TUjBfRVFQTVQgICAgPSAweDEwLAogICAgRkRfU1IwX1NFRUsgICAgID0gMHgyMCwKICAgIEZEX1NSMF9BQk5URVJNICA9IDB4NDAsCiAgICBGRF9TUjBfSU5WQ01EICAgPSAweDgwLAogICAgRkRfU1IwX1JEWUNIRyAgID0gMHhjMCwKfTsKCmVudW0gewogICAgRkRfU1IxX0VDICAgICAgID0gMHg4MCwgLyogRW5kIG9mIGN5bGluZGVyICovCn07CgplbnVtIHsKICAgIEZEX1NSMl9TTlMgICAgICA9IDB4MDQsIC8qIFNjYW4gbm90IHNhdGlzZmllZCAqLwogICAgRkRfU1IyX1NFSCAgICAgID0gMHgwOCwgLyogU2NhbiBlcXVhbCBoaXQgKi8KfTsKCmVudW0gewogICAgRkRfU1JBX0RJUiAgICAgID0gMHgwMSwKICAgIEZEX1NSQV9uV1AgICAgICA9IDB4MDIsCiAgICBGRF9TUkFfbklORFggICAgPSAweDA0LAogICAgRkRfU1JBX0hEU0VMICAgID0gMHgwOCwKICAgIEZEX1NSQV9uVFJLMCAgICA9IDB4MTAsCiAgICBGRF9TUkFfU1RFUCAgICAgPSAweDIwLAogICAgRkRfU1JBX25EUlYyICAgID0gMHg0MCwKICAgIEZEX1NSQV9JTlRQRU5EICA9IDB4ODAsCn07CgplbnVtIHsKICAgIEZEX1NSQl9NVFIwICAgICA9IDB4MDEsCiAgICBGRF9TUkJfTVRSMSAgICAgPSAweDAyLAogICAgRkRfU1JCX1dHQVRFICAgID0gMHgwNCwKICAgIEZEX1NSQl9SREFUQSAgICA9IDB4MDgsCiAgICBGRF9TUkJfV0RBVEEgICAgPSAweDEwLAogICAgRkRfU1JCX0RSMCAgICAgID0gMHgyMCwKfTsKCmVudW0gewojaWYgTUFYX0ZEID09IDQKICAgIEZEX0RPUl9TRUxNQVNLICA9IDB4MDMsCiNlbHNlCiAgICBGRF9ET1JfU0VMTUFTSyAgPSAweDAxLAojZW5kaWYKICAgIEZEX0RPUl9uUkVTRVQgICA9IDB4MDQsCiAgICBGRF9ET1JfRE1BRU4gICAgPSAweDA4LAogICAgRkRfRE9SX01PVEVOMCAgID0gMHgxMCwKICAgIEZEX0RPUl9NT1RFTjEgICA9IDB4MjAsCiAgICBGRF9ET1JfTU9URU4yICAgPSAweDQwLAogICAgRkRfRE9SX01PVEVOMyAgID0gMHg4MCwKfTsKCmVudW0gewojaWYgTUFYX0ZEID09IDQKICAgIEZEX1REUl9CT09UU0VMICA9IDB4MGMsCiNlbHNlCiAgICBGRF9URFJfQk9PVFNFTCAgPSAweDA0LAojZW5kaWYKfTsKCmVudW0gewogICAgRkRfRFNSX0RSQVRFTUFTSz0gMHgwMywKICAgIEZEX0RTUl9QV1JET1dOICA9IDB4NDAsCiAgICBGRF9EU1JfU1dSRVNFVCAgPSAweDgwLAp9OwoKZW51bSB7CiAgICBGRF9NU1JfRFJWMEJVU1kgPSAweDAxLAogICAgRkRfTVNSX0RSVjFCVVNZID0gMHgwMiwKICAgIEZEX01TUl9EUlYyQlVTWSA9IDB4MDQsCiAgICBGRF9NU1JfRFJWM0JVU1kgPSAweDA4LAogICAgRkRfTVNSX0NNREJVU1kgID0gMHgxMCwKICAgIEZEX01TUl9OT05ETUEgICA9IDB4MjAsCiAgICBGRF9NU1JfRElPICAgICAgPSAweDQwLAogICAgRkRfTVNSX1JRTSAgICAgID0gMHg4MCwKfTsKCmVudW0gewogICAgRkRfRElSX0RTS0NIRyAgID0gMHg4MCwKfTsKCiNkZWZpbmUgRkRfTVVMVElfVFJBQ0soc3RhdGUpICgoc3RhdGUpICYgRkRfU1RBVEVfTVVMVEkpCiNkZWZpbmUgRkRfRElEX1NFRUsoc3RhdGUpICgoc3RhdGUpICYgRkRfU1RBVEVfU0VFSykKI2RlZmluZSBGRF9GT1JNQVRfQ01EKHN0YXRlKSAoKHN0YXRlKSAmIEZEX1NUQVRFX0ZPUk1BVCkKCnN0cnVjdCBGREN0cmwgewogICAgLyogQ29udHJvbGxlcidzIGlkZW50aWZpY2F0aW9uICovCiAgICB1aW50OF90IHZlcnNpb247CiAgICAvKiBIVyAqLwogICAgcWVtdV9pcnEgaXJxOwogICAgaW50IGRtYV9jaGFubjsKICAgIC8qIENvbnRyb2xsZXIgc3RhdGUgKi8KICAgIFFFTVVUaW1lciAqcmVzdWx0X3RpbWVyOwogICAgdWludDhfdCBzcmE7CiAgICB1aW50OF90IHNyYjsKICAgIHVpbnQ4X3QgZG9yOwogICAgdWludDhfdCBkb3Jfdm1zdGF0ZTsgLyogb25seSB1c2VkIGFzIHRlbXAgZHVyaW5nIHZtc3RhdGUgKi8KICAgIHVpbnQ4X3QgdGRyOwogICAgdWludDhfdCBkc3I7CiAgICB1aW50OF90IG1zcjsKICAgIHVpbnQ4X3QgY3VyX2RydjsKICAgIHVpbnQ4X3Qgc3RhdHVzMDsKICAgIHVpbnQ4X3Qgc3RhdHVzMTsKICAgIHVpbnQ4X3Qgc3RhdHVzMjsKICAgIC8qIENvbW1hbmQgRklGTyAqLwogICAgdWludDhfdCAqZmlmbzsKICAgIGludDMyX3QgZmlmb19zaXplOwogICAgdWludDMyX3QgZGF0YV9wb3M7CiAgICB1aW50MzJfdCBkYXRhX2xlbjsKICAgIHVpbnQ4X3QgZGF0YV9zdGF0ZTsKICAgIHVpbnQ4X3QgZGF0YV9kaXI7CiAgICB1aW50OF90IGVvdDsgLyogbGFzdCB3YW50ZWQgc2VjdG9yICovCiAgICAvKiBTdGF0ZXMga2VwdCBvbmx5IHRvIGJlIHJldHVybmVkIGJhY2sgKi8KICAgIC8qIFRpbWVycyBzdGF0ZSAqLwogICAgdWludDhfdCB0aW1lcjA7CiAgICB1aW50OF90IHRpbWVyMTsKICAgIC8qIHByZWNvbXBlbnNhdGlvbiAqLwogICAgdWludDhfdCBwcmVjb21wX3RyazsKICAgIHVpbnQ4X3QgY29uZmlnOwogICAgdWludDhfdCBsb2NrOwogICAgLyogUG93ZXIgZG93biBjb25maWcgKGFsc28gd2l0aCBzdGF0dXMgcmVnQiBhY2Nlc3MgbW9kZSAqLwogICAgdWludDhfdCBwd3JkOwogICAgLyogU3VuNG0gcXVpcmtzPyAqLwogICAgaW50IHN1bjRtOwogICAgLyogRmxvcHB5IGRyaXZlcyAqLwogICAgdWludDhfdCBudW1fZmxvcHBpZXM7CiAgICBGRHJpdmUgZHJpdmVzW01BWF9GRF07CiAgICBpbnQgcmVzZXRfc2Vuc2VpOwp9OwoKdHlwZWRlZiBzdHJ1Y3QgRkRDdHJsU3lzQnVzIHsKICAgIFN5c0J1c0RldmljZSBidXNkZXY7CiAgICBzdHJ1Y3QgRkRDdHJsIHN0YXRlOwp9IEZEQ3RybFN5c0J1czsKCnR5cGVkZWYgc3RydWN0IEZEQ3RybElTQUJ1cyB7CiAgICBJU0FEZXZpY2UgYnVzZGV2OwogICAgc3RydWN0IEZEQ3RybCBzdGF0ZTsKICAgIGludDMyX3QgYm9vdGluZGV4QTsKICAgIGludDMyX3QgYm9vdGluZGV4QjsKfSBGREN0cmxJU0FCdXM7CgpzdGF0aWMgdWludDMyX3QgZmRjdHJsX3JlYWQgKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgcmVnKQp7CiAgICBGREN0cmwgKmZkY3RybCA9IG9wYXF1ZTsKICAgIHVpbnQzMl90IHJldHZhbDsKCiAgICBzd2l0Y2ggKHJlZykgewogICAgY2FzZSBGRF9SRUdfU1JBOgogICAgICAgIHJldHZhbCA9IGZkY3RybF9yZWFkX3N0YXR1c0EoZmRjdHJsKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgRkRfUkVHX1NSQjoKICAgICAgICByZXR2YWwgPSBmZGN0cmxfcmVhZF9zdGF0dXNCKGZkY3RybCk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIEZEX1JFR19ET1I6CiAgICAgICAgcmV0dmFsID0gZmRjdHJsX3JlYWRfZG9yKGZkY3RybCk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIEZEX1JFR19URFI6CiAgICAgICAgcmV0dmFsID0gZmRjdHJsX3JlYWRfdGFwZShmZGN0cmwpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBGRF9SRUdfTVNSOgogICAgICAgIHJldHZhbCA9IGZkY3RybF9yZWFkX21haW5fc3RhdHVzKGZkY3RybCk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIEZEX1JFR19GSUZPOgogICAgICAgIHJldHZhbCA9IGZkY3RybF9yZWFkX2RhdGEoZmRjdHJsKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgRkRfUkVHX0RJUjoKICAgICAgICByZXR2YWwgPSBmZGN0cmxfcmVhZF9kaXIoZmRjdHJsKTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dmFsID0gKHVpbnQzMl90KSgtMSk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBGTE9QUFlfRFBSSU5URigicmVhZCByZWclZDogMHglMDJ4XG4iLCByZWcgJiA3LCByZXR2YWwpOwoKICAgIHJldHVybiByZXR2YWw7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF93cml0ZSAodm9pZCAqb3BhcXVlLCB1aW50MzJfdCByZWcsIHVpbnQzMl90IHZhbHVlKQp7CiAgICBGREN0cmwgKmZkY3RybCA9IG9wYXF1ZTsKCiAgICBGTE9QUFlfRFBSSU5URigid3JpdGUgcmVnJWQ6IDB4JTAyeFxuIiwgcmVnICYgNywgdmFsdWUpOwoKICAgIHN3aXRjaCAocmVnKSB7CiAgICBjYXNlIEZEX1JFR19ET1I6CiAgICAgICAgZmRjdHJsX3dyaXRlX2RvcihmZGN0cmwsIHZhbHVlKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgRkRfUkVHX1REUjoKICAgICAgICBmZGN0cmxfd3JpdGVfdGFwZShmZGN0cmwsIHZhbHVlKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgRkRfUkVHX0RTUjoKICAgICAgICBmZGN0cmxfd3JpdGVfcmF0ZShmZGN0cmwsIHZhbHVlKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgRkRfUkVHX0ZJRk86CiAgICAgICAgZmRjdHJsX3dyaXRlX2RhdGEoZmRjdHJsLCB2YWx1ZSk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGJyZWFrOwogICAgfQp9CgpzdGF0aWMgdWludDMyX3QgZmRjdHJsX3JlYWRfcG9ydCAodm9pZCAqb3BhcXVlLCB1aW50MzJfdCByZWcpCnsKICAgIHJldHVybiBmZGN0cmxfcmVhZChvcGFxdWUsIHJlZyAmIDcpOwp9CgpzdGF0aWMgdm9pZCBmZGN0cmxfd3JpdGVfcG9ydCAodm9pZCAqb3BhcXVlLCB1aW50MzJfdCByZWcsIHVpbnQzMl90IHZhbHVlKQp7CiAgICBmZGN0cmxfd3JpdGUob3BhcXVlLCByZWcgJiA3LCB2YWx1ZSk7Cn0KCnN0YXRpYyB1aW50MzJfdCBmZGN0cmxfcmVhZF9tZW0gKHZvaWQgKm9wYXF1ZSwgdGFyZ2V0X3BoeXNfYWRkcl90IHJlZykKewogICAgcmV0dXJuIGZkY3RybF9yZWFkKG9wYXF1ZSwgKHVpbnQzMl90KXJlZyk7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF93cml0ZV9tZW0gKHZvaWQgKm9wYXF1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3BoeXNfYWRkcl90IHJlZywgdWludDMyX3QgdmFsdWUpCnsKICAgIGZkY3RybF93cml0ZShvcGFxdWUsICh1aW50MzJfdClyZWcsIHZhbHVlKTsKfQoKc3RhdGljIENQVVJlYWRNZW1vcnlGdW5jICogY29uc3QgZmRjdHJsX21lbV9yZWFkWzNdID0gewogICAgZmRjdHJsX3JlYWRfbWVtLAogICAgZmRjdHJsX3JlYWRfbWVtLAogICAgZmRjdHJsX3JlYWRfbWVtLAp9OwoKc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqIGNvbnN0IGZkY3RybF9tZW1fd3JpdGVbM10gPSB7CiAgICBmZGN0cmxfd3JpdGVfbWVtLAogICAgZmRjdHJsX3dyaXRlX21lbSwKICAgIGZkY3RybF93cml0ZV9tZW0sCn07CgpzdGF0aWMgQ1BVUmVhZE1lbW9yeUZ1bmMgKiBjb25zdCBmZGN0cmxfbWVtX3JlYWRfc3RyaWN0WzNdID0gewogICAgZmRjdHJsX3JlYWRfbWVtLAogICAgTlVMTCwKICAgIE5VTEwsCn07CgpzdGF0aWMgQ1BVV3JpdGVNZW1vcnlGdW5jICogY29uc3QgZmRjdHJsX21lbV93cml0ZV9zdHJpY3RbM10gPSB7CiAgICBmZGN0cmxfd3JpdGVfbWVtLAogICAgTlVMTCwKICAgIE5VTEwsCn07CgpzdGF0aWMgdm9pZCBmZHJpdmVfbWVkaWFfY2hhbmdlZF9wcmVfc2F2ZSh2b2lkICpvcGFxdWUpCnsKICAgIEZEcml2ZSAqZHJpdmUgPSBvcGFxdWU7CgogICAgZHJpdmUtPm1lZGlhX2NoYW5nZWQgPSBkcml2ZS0+YnMtPm1lZGlhX2NoYW5nZWQ7Cn0KCnN0YXRpYyBpbnQgZmRyaXZlX21lZGlhX2NoYW5nZWRfcG9zdF9sb2FkKHZvaWQgKm9wYXF1ZSwgaW50IHZlcnNpb25faWQpCnsKICAgIEZEcml2ZSAqZHJpdmUgPSBvcGFxdWU7CgogICAgaWYgKGRyaXZlLT5icyAhPSBOVUxMKSB7CiAgICAgICAgZHJpdmUtPmJzLT5tZWRpYV9jaGFuZ2VkID0gZHJpdmUtPm1lZGlhX2NoYW5nZWQ7CiAgICB9CgogICAgLyogVXNlciBlamVjdGVkIHRoZSBmbG9wcHkgd2hlbiBkcml2ZS0+YnMgPT0gTlVMTCAqLwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBib29sIGZkcml2ZV9tZWRpYV9jaGFuZ2VkX25lZWRlZCh2b2lkICpvcGFxdWUpCnsKICAgIEZEcml2ZSAqZHJpdmUgPSBvcGFxdWU7CgogICAgcmV0dXJuIChkcml2ZS0+YnMgIT0gTlVMTCAmJiBkcml2ZS0+YnMtPm1lZGlhX2NoYW5nZWQgIT0gMSk7Cn0KCnN0YXRpYyBjb25zdCBWTVN0YXRlRGVzY3JpcHRpb24gdm1zdGF0ZV9mZHJpdmVfbWVkaWFfY2hhbmdlZCA9IHsKICAgIC5uYW1lID0gImZkcml2ZS9tZWRpYV9jaGFuZ2VkIiwKICAgIC52ZXJzaW9uX2lkID0gMSwKICAgIC5taW5pbXVtX3ZlcnNpb25faWQgPSAxLAogICAgLm1pbmltdW1fdmVyc2lvbl9pZF9vbGQgPSAxLAogICAgLnByZV9zYXZlID0gZmRyaXZlX21lZGlhX2NoYW5nZWRfcHJlX3NhdmUsCiAgICAucG9zdF9sb2FkID0gZmRyaXZlX21lZGlhX2NoYW5nZWRfcG9zdF9sb2FkLAogICAgLmZpZWxkcyAgICAgID0gKFZNU3RhdGVGaWVsZFtdKSB7CiAgICAgICAgVk1TVEFURV9VSU5UOChtZWRpYV9jaGFuZ2VkLCBGRHJpdmUpLAogICAgICAgIFZNU1RBVEVfRU5EX09GX0xJU1QoKQogICAgfQp9OwoKc3RhdGljIGNvbnN0IFZNU3RhdGVEZXNjcmlwdGlvbiB2bXN0YXRlX2Zkcml2ZSA9IHsKICAgIC5uYW1lID0gImZkcml2ZSIsCiAgICAudmVyc2lvbl9pZCA9IDEsCiAgICAubWluaW11bV92ZXJzaW9uX2lkID0gMSwKICAgIC5taW5pbXVtX3ZlcnNpb25faWRfb2xkID0gMSwKICAgIC5maWVsZHMgICAgICA9IChWTVN0YXRlRmllbGRbXSkgewogICAgICAgIFZNU1RBVEVfVUlOVDgoaGVhZCwgRkRyaXZlKSwKICAgICAgICBWTVNUQVRFX1VJTlQ4KHRyYWNrLCBGRHJpdmUpLAogICAgICAgIFZNU1RBVEVfVUlOVDgoc2VjdCwgRkRyaXZlKSwKICAgICAgICBWTVNUQVRFX0VORF9PRl9MSVNUKCkKICAgIH0sCiAgICAuc3Vic2VjdGlvbnMgPSAoVk1TdGF0ZVN1YnNlY3Rpb25bXSkgewogICAgICAgIHsKICAgICAgICAgICAgLnZtc2QgPSAmdm1zdGF0ZV9mZHJpdmVfbWVkaWFfY2hhbmdlZCwKICAgICAgICAgICAgLm5lZWRlZCA9ICZmZHJpdmVfbWVkaWFfY2hhbmdlZF9uZWVkZWQsCiAgICAgICAgfSAsIHsKICAgICAgICAgICAgLyogZW1wdHkgKi8KICAgICAgICB9CiAgICB9Cn07CgpzdGF0aWMgdm9pZCBmZGNfcHJlX3NhdmUodm9pZCAqb3BhcXVlKQp7CiAgICBGREN0cmwgKnMgPSBvcGFxdWU7CgogICAgcy0+ZG9yX3Ztc3RhdGUgPSBzLT5kb3IgfCBHRVRfQ1VSX0RSVihzKTsKfQoKc3RhdGljIGludCBmZGNfcG9zdF9sb2FkKHZvaWQgKm9wYXF1ZSwgaW50IHZlcnNpb25faWQpCnsKICAgIEZEQ3RybCAqcyA9IG9wYXF1ZTsKCiAgICBTRVRfQ1VSX0RSVihzLCBzLT5kb3Jfdm1zdGF0ZSAmIEZEX0RPUl9TRUxNQVNLKTsKICAgIHMtPmRvciA9IHMtPmRvcl92bXN0YXRlICYgfkZEX0RPUl9TRUxNQVNLOwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBWTVN0YXRlRGVzY3JpcHRpb24gdm1zdGF0ZV9mZGMgPSB7CiAgICAubmFtZSA9ICJmZGMiLAogICAgLnZlcnNpb25faWQgPSAyLAogICAgLm1pbmltdW1fdmVyc2lvbl9pZCA9IDIsCiAgICAubWluaW11bV92ZXJzaW9uX2lkX29sZCA9IDIsCiAgICAucHJlX3NhdmUgPSBmZGNfcHJlX3NhdmUsCiAgICAucG9zdF9sb2FkID0gZmRjX3Bvc3RfbG9hZCwKICAgIC5maWVsZHMgICAgICA9IChWTVN0YXRlRmllbGQgW10pIHsKICAgICAgICAvKiBDb250cm9sbGVyIFN0YXRlICovCiAgICAgICAgVk1TVEFURV9VSU5UOChzcmEsIEZEQ3RybCksCiAgICAgICAgVk1TVEFURV9VSU5UOChzcmIsIEZEQ3RybCksCiAgICAgICAgVk1TVEFURV9VSU5UOChkb3Jfdm1zdGF0ZSwgRkRDdHJsKSwKICAgICAgICBWTVNUQVRFX1VJTlQ4KHRkciwgRkRDdHJsKSwKICAgICAgICBWTVNUQVRFX1VJTlQ4KGRzciwgRkRDdHJsKSwKICAgICAgICBWTVNUQVRFX1VJTlQ4KG1zciwgRkRDdHJsKSwKICAgICAgICBWTVNUQVRFX1VJTlQ4KHN0YXR1czAsIEZEQ3RybCksCiAgICAgICAgVk1TVEFURV9VSU5UOChzdGF0dXMxLCBGREN0cmwpLAogICAgICAgIFZNU1RBVEVfVUlOVDgoc3RhdHVzMiwgRkRDdHJsKSwKICAgICAgICAvKiBDb21tYW5kIEZJRk8gKi8KICAgICAgICBWTVNUQVRFX1ZBUlJBWV9JTlQzMihmaWZvLCBGREN0cmwsIGZpZm9fc2l6ZSwgMCwgdm1zdGF0ZV9pbmZvX3VpbnQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QpLAogICAgICAgIFZNU1RBVEVfVUlOVDMyKGRhdGFfcG9zLCBGREN0cmwpLAogICAgICAgIFZNU1RBVEVfVUlOVDMyKGRhdGFfbGVuLCBGREN0cmwpLAogICAgICAgIFZNU1RBVEVfVUlOVDgoZGF0YV9zdGF0ZSwgRkRDdHJsKSwKICAgICAgICBWTVNUQVRFX1VJTlQ4KGRhdGFfZGlyLCBGREN0cmwpLAogICAgICAgIFZNU1RBVEVfVUlOVDgoZW90LCBGREN0cmwpLAogICAgICAgIC8qIFN0YXRlcyBrZXB0IG9ubHkgdG8gYmUgcmV0dXJuZWQgYmFjayAqLwogICAgICAgIFZNU1RBVEVfVUlOVDgodGltZXIwLCBGREN0cmwpLAogICAgICAgIFZNU1RBVEVfVUlOVDgodGltZXIxLCBGREN0cmwpLAogICAgICAgIFZNU1RBVEVfVUlOVDgocHJlY29tcF90cmssIEZEQ3RybCksCiAgICAgICAgVk1TVEFURV9VSU5UOChjb25maWcsIEZEQ3RybCksCiAgICAgICAgVk1TVEFURV9VSU5UOChsb2NrLCBGREN0cmwpLAogICAgICAgIFZNU1RBVEVfVUlOVDgocHdyZCwgRkRDdHJsKSwKICAgICAgICBWTVNUQVRFX1VJTlQ4X0VRVUFMKG51bV9mbG9wcGllcywgRkRDdHJsKSwKICAgICAgICBWTVNUQVRFX1NUUlVDVF9BUlJBWShkcml2ZXMsIEZEQ3RybCwgTUFYX0ZELCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtc3RhdGVfZmRyaXZlLCBGRHJpdmUpLAogICAgICAgIFZNU1RBVEVfRU5EX09GX0xJU1QoKQogICAgfQp9OwoKc3RhdGljIHZvaWQgZmRjdHJsX2V4dGVybmFsX3Jlc2V0X3N5c2J1cyhEZXZpY2VTdGF0ZSAqZCkKewogICAgRkRDdHJsU3lzQnVzICpzeXMgPSBjb250YWluZXJfb2YoZCwgRkRDdHJsU3lzQnVzLCBidXNkZXYucWRldik7CiAgICBGREN0cmwgKnMgPSAmc3lzLT5zdGF0ZTsKCiAgICBmZGN0cmxfcmVzZXQocywgMCk7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9leHRlcm5hbF9yZXNldF9pc2EoRGV2aWNlU3RhdGUgKmQpCnsKICAgIEZEQ3RybElTQUJ1cyAqaXNhID0gY29udGFpbmVyX29mKGQsIEZEQ3RybElTQUJ1cywgYnVzZGV2LnFkZXYpOwogICAgRkRDdHJsICpzID0gJmlzYS0+c3RhdGU7CgogICAgZmRjdHJsX3Jlc2V0KHMsIDApOwp9CgpzdGF0aWMgdm9pZCBmZGN0cmxfaGFuZGxlX3RjKHZvaWQgKm9wYXF1ZSwgaW50IGlycSwgaW50IGxldmVsKQp7CiAgICAvL0ZEQ3RybCAqcyA9IG9wYXF1ZTsKCiAgICBpZiAobGV2ZWwpIHsKICAgICAgICAvLyBYWFgKICAgICAgICBGTE9QUFlfRFBSSU5URigiVEMgcHVsc2VkXG4iKTsKICAgIH0KfQoKLyogQ2hhbmdlIElSUSBzdGF0ZSAqLwpzdGF0aWMgdm9pZCBmZGN0cmxfcmVzZXRfaXJxKEZEQ3RybCAqZmRjdHJsKQp7CiAgICBpZiAoIShmZGN0cmwtPnNyYSAmIEZEX1NSQV9JTlRQRU5EKSkKICAgICAgICByZXR1cm47CiAgICBGTE9QUFlfRFBSSU5URigiUmVzZXQgaW50ZXJydXB0XG4iKTsKICAgIHFlbXVfc2V0X2lycShmZGN0cmwtPmlycSwgMCk7CiAgICBmZGN0cmwtPnNyYSAmPSB+RkRfU1JBX0lOVFBFTkQ7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9yYWlzZV9pcnEoRkRDdHJsICpmZGN0cmwsIHVpbnQ4X3Qgc3RhdHVzMCkKewogICAgLyogU3BhcmMgbXV0YXRpb24gKi8KICAgIGlmIChmZGN0cmwtPnN1bjRtICYmIChmZGN0cmwtPm1zciAmIEZEX01TUl9DTURCVVNZKSkgewogICAgICAgIC8qIFhYWDogbm90IHN1cmUgKi8KICAgICAgICBmZGN0cmwtPm1zciAmPSB+RkRfTVNSX0NNREJVU1k7CiAgICAgICAgZmRjdHJsLT5tc3IgfD0gRkRfTVNSX1JRTSB8IEZEX01TUl9ESU87CiAgICAgICAgZmRjdHJsLT5zdGF0dXMwID0gc3RhdHVzMDsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIShmZGN0cmwtPnNyYSAmIEZEX1NSQV9JTlRQRU5EKSkgewogICAgICAgIHFlbXVfc2V0X2lycShmZGN0cmwtPmlycSwgMSk7CiAgICAgICAgZmRjdHJsLT5zcmEgfD0gRkRfU1JBX0lOVFBFTkQ7CiAgICB9CiAgICBmZGN0cmwtPnJlc2V0X3NlbnNlaSA9IDA7CiAgICBmZGN0cmwtPnN0YXR1czAgPSBzdGF0dXMwOwogICAgRkxPUFBZX0RQUklOVEYoIlNldCBpbnRlcnJ1cHQgc3RhdHVzIHRvIDB4JTAyeFxuIiwgZmRjdHJsLT5zdGF0dXMwKTsKfQoKLyogUmVzZXQgY29udHJvbGxlciAqLwpzdGF0aWMgdm9pZCBmZGN0cmxfcmVzZXQoRkRDdHJsICpmZGN0cmwsIGludCBkb19pcnEpCnsKICAgIGludCBpOwoKICAgIEZMT1BQWV9EUFJJTlRGKCJyZXNldCBjb250cm9sbGVyXG4iKTsKICAgIGZkY3RybF9yZXNldF9pcnEoZmRjdHJsKTsKICAgIC8qIEluaXRpYWxpc2UgY29udHJvbGxlciAqLwogICAgZmRjdHJsLT5zcmEgPSAwOwogICAgZmRjdHJsLT5zcmIgPSAweGMwOwogICAgaWYgKCFmZGN0cmwtPmRyaXZlc1sxXS5icykKICAgICAgICBmZGN0cmwtPnNyYSB8PSBGRF9TUkFfbkRSVjI7CiAgICBmZGN0cmwtPmN1cl9kcnYgPSAwOwogICAgZmRjdHJsLT5kb3IgPSBGRF9ET1JfblJFU0VUOwogICAgZmRjdHJsLT5kb3IgfD0gKGZkY3RybC0+ZG1hX2NoYW5uICE9IC0xKSA/IEZEX0RPUl9ETUFFTiA6IDA7CiAgICBmZGN0cmwtPm1zciA9IEZEX01TUl9SUU07CiAgICAvKiBGSUZPIHN0YXRlICovCiAgICBmZGN0cmwtPmRhdGFfcG9zID0gMDsKICAgIGZkY3RybC0+ZGF0YV9sZW4gPSAwOwogICAgZmRjdHJsLT5kYXRhX3N0YXRlID0gMDsKICAgIGZkY3RybC0+ZGF0YV9kaXIgPSBGRF9ESVJfV1JJVEU7CiAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0ZEOyBpKyspCiAgICAgICAgZmRfcmVjYWxpYnJhdGUoJmZkY3RybC0+ZHJpdmVzW2ldKTsKICAgIGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7CiAgICBpZiAoZG9faXJxKSB7CiAgICAgICAgZmRjdHJsX3JhaXNlX2lycShmZGN0cmwsIEZEX1NSMF9SRFlDSEcpOwogICAgICAgIGZkY3RybC0+cmVzZXRfc2Vuc2VpID0gRkRfUkVTRVRfU0VOU0VJX0NPVU5UOwogICAgfQp9CgpzdGF0aWMgaW5saW5lIEZEcml2ZSAqZHJ2MChGREN0cmwgKmZkY3RybCkKewogICAgcmV0dXJuICZmZGN0cmwtPmRyaXZlc1soZmRjdHJsLT50ZHIgJiBGRF9URFJfQk9PVFNFTCkgPj4gMl07Cn0KCnN0YXRpYyBpbmxpbmUgRkRyaXZlICpkcnYxKEZEQ3RybCAqZmRjdHJsKQp7CiAgICBpZiAoKGZkY3RybC0+dGRyICYgRkRfVERSX0JPT1RTRUwpIDwgKDEgPDwgMikpCiAgICAgICAgcmV0dXJuICZmZGN0cmwtPmRyaXZlc1sxXTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gJmZkY3RybC0+ZHJpdmVzWzBdOwp9CgojaWYgTUFYX0ZEID09IDQKc3RhdGljIGlubGluZSBGRHJpdmUgKmRydjIoRkRDdHJsICpmZGN0cmwpCnsKICAgIGlmICgoZmRjdHJsLT50ZHIgJiBGRF9URFJfQk9PVFNFTCkgPCAoMiA8PCAyKSkKICAgICAgICByZXR1cm4gJmZkY3RybC0+ZHJpdmVzWzJdOwogICAgZWxzZQogICAgICAgIHJldHVybiAmZmRjdHJsLT5kcml2ZXNbMV07Cn0KCnN0YXRpYyBpbmxpbmUgRkRyaXZlICpkcnYzKEZEQ3RybCAqZmRjdHJsKQp7CiAgICBpZiAoKGZkY3RybC0+dGRyICYgRkRfVERSX0JPT1RTRUwpIDwgKDMgPDwgMikpCiAgICAgICAgcmV0dXJuICZmZGN0cmwtPmRyaXZlc1szXTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gJmZkY3RybC0+ZHJpdmVzWzJdOwp9CiNlbmRpZgoKc3RhdGljIEZEcml2ZSAqZ2V0X2N1cl9kcnYoRkRDdHJsICpmZGN0cmwpCnsKICAgIHN3aXRjaCAoZmRjdHJsLT5jdXJfZHJ2KSB7CiAgICAgICAgY2FzZSAwOiByZXR1cm4gZHJ2MChmZGN0cmwpOwogICAgICAgIGNhc2UgMTogcmV0dXJuIGRydjEoZmRjdHJsKTsKI2lmIE1BWF9GRCA9PSA0CiAgICAgICAgY2FzZSAyOiByZXR1cm4gZHJ2MihmZGN0cmwpOwogICAgICAgIGNhc2UgMzogcmV0dXJuIGRydjMoZmRjdHJsKTsKI2VuZGlmCiAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7CiAgICB9Cn0KCi8qIFN0YXR1cyBBIHJlZ2lzdGVyIDogMHgwMCAocmVhZC1vbmx5KSAqLwpzdGF0aWMgdWludDMyX3QgZmRjdHJsX3JlYWRfc3RhdHVzQShGREN0cmwgKmZkY3RybCkKewogICAgdWludDMyX3QgcmV0dmFsID0gZmRjdHJsLT5zcmE7CgogICAgRkxPUFBZX0RQUklOVEYoInN0YXR1cyByZWdpc3RlciBBOiAweCUwMnhcbiIsIHJldHZhbCk7CgogICAgcmV0dXJuIHJldHZhbDsKfQoKLyogU3RhdHVzIEIgcmVnaXN0ZXIgOiAweDAxIChyZWFkLW9ubHkpICovCnN0YXRpYyB1aW50MzJfdCBmZGN0cmxfcmVhZF9zdGF0dXNCKEZEQ3RybCAqZmRjdHJsKQp7CiAgICB1aW50MzJfdCByZXR2YWwgPSBmZGN0cmwtPnNyYjsKCiAgICBGTE9QUFlfRFBSSU5URigic3RhdHVzIHJlZ2lzdGVyIEI6IDB4JTAyeFxuIiwgcmV0dmFsKTsKCiAgICByZXR1cm4gcmV0dmFsOwp9CgovKiBEaWdpdGFsIG91dHB1dCByZWdpc3RlciA6IDB4MDIgKi8Kc3RhdGljIHVpbnQzMl90IGZkY3RybF9yZWFkX2RvcihGREN0cmwgKmZkY3RybCkKewogICAgdWludDMyX3QgcmV0dmFsID0gZmRjdHJsLT5kb3I7CgogICAgLyogU2VsZWN0ZWQgZHJpdmUgKi8KICAgIHJldHZhbCB8PSBmZGN0cmwtPmN1cl9kcnY7CiAgICBGTE9QUFlfRFBSSU5URigiZGlnaXRhbCBvdXRwdXQgcmVnaXN0ZXI6IDB4JTAyeFxuIiwgcmV0dmFsKTsKCiAgICByZXR1cm4gcmV0dmFsOwp9CgpzdGF0aWMgdm9pZCBmZGN0cmxfd3JpdGVfZG9yKEZEQ3RybCAqZmRjdHJsLCB1aW50MzJfdCB2YWx1ZSkKewogICAgRkxPUFBZX0RQUklOVEYoImRpZ2l0YWwgb3V0cHV0IHJlZ2lzdGVyIHNldCB0byAweCUwMnhcbiIsIHZhbHVlKTsKCiAgICAvKiBNb3RvcnMgKi8KICAgIGlmICh2YWx1ZSAmIEZEX0RPUl9NT1RFTjApCiAgICAgICAgZmRjdHJsLT5zcmIgfD0gRkRfU1JCX01UUjA7CiAgICBlbHNlCiAgICAgICAgZmRjdHJsLT5zcmIgJj0gfkZEX1NSQl9NVFIwOwogICAgaWYgKHZhbHVlICYgRkRfRE9SX01PVEVOMSkKICAgICAgICBmZGN0cmwtPnNyYiB8PSBGRF9TUkJfTVRSMTsKICAgIGVsc2UKICAgICAgICBmZGN0cmwtPnNyYiAmPSB+RkRfU1JCX01UUjE7CgogICAgLyogRHJpdmUgKi8KICAgIGlmICh2YWx1ZSAmIDEpCiAgICAgICAgZmRjdHJsLT5zcmIgfD0gRkRfU1JCX0RSMDsKICAgIGVsc2UKICAgICAgICBmZGN0cmwtPnNyYiAmPSB+RkRfU1JCX0RSMDsKCiAgICAvKiBSZXNldCAqLwogICAgaWYgKCEodmFsdWUgJiBGRF9ET1JfblJFU0VUKSkgewogICAgICAgIGlmIChmZGN0cmwtPmRvciAmIEZEX0RPUl9uUkVTRVQpIHsKICAgICAgICAgICAgRkxPUFBZX0RQUklOVEYoImNvbnRyb2xsZXIgZW50ZXIgUkVTRVQgc3RhdGVcbiIpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCEoZmRjdHJsLT5kb3IgJiBGRF9ET1JfblJFU0VUKSkgewogICAgICAgICAgICBGTE9QUFlfRFBSSU5URigiY29udHJvbGxlciBvdXQgb2YgUkVTRVQgc3RhdGVcbiIpOwogICAgICAgICAgICBmZGN0cmxfcmVzZXQoZmRjdHJsLCAxKTsKICAgICAgICAgICAgZmRjdHJsLT5kc3IgJj0gfkZEX0RTUl9QV1JET1dOOwogICAgICAgIH0KICAgIH0KICAgIC8qIFNlbGVjdGVkIGRyaXZlICovCiAgICBmZGN0cmwtPmN1cl9kcnYgPSB2YWx1ZSAmIEZEX0RPUl9TRUxNQVNLOwoKICAgIGZkY3RybC0+ZG9yID0gdmFsdWU7Cn0KCi8qIFRhcGUgZHJpdmUgcmVnaXN0ZXIgOiAweDAzICovCnN0YXRpYyB1aW50MzJfdCBmZGN0cmxfcmVhZF90YXBlKEZEQ3RybCAqZmRjdHJsKQp7CiAgICB1aW50MzJfdCByZXR2YWwgPSBmZGN0cmwtPnRkcjsKCiAgICBGTE9QUFlfRFBSSU5URigidGFwZSBkcml2ZSByZWdpc3RlcjogMHglMDJ4XG4iLCByZXR2YWwpOwoKICAgIHJldHVybiByZXR2YWw7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF93cml0ZV90YXBlKEZEQ3RybCAqZmRjdHJsLCB1aW50MzJfdCB2YWx1ZSkKewogICAgLyogUmVzZXQgbW9kZSAqLwogICAgaWYgKCEoZmRjdHJsLT5kb3IgJiBGRF9ET1JfblJFU0VUKSkgewogICAgICAgIEZMT1BQWV9EUFJJTlRGKCJGbG9wcHkgY29udHJvbGxlciBpbiBSRVNFVCBzdGF0ZSAhXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBGTE9QUFlfRFBSSU5URigidGFwZSBkcml2ZSByZWdpc3RlciBzZXQgdG8gMHglMDJ4XG4iLCB2YWx1ZSk7CiAgICAvKiBEaXNrIGJvb3Qgc2VsZWN0aW9uIGluZGljYXRvciAqLwogICAgZmRjdHJsLT50ZHIgPSB2YWx1ZSAmIEZEX1REUl9CT09UU0VMOwogICAgLyogVGFwZSBpbmRpY2F0b3JzOiBuZXZlciBhbGxvdyAqLwp9CgovKiBNYWluIHN0YXR1cyByZWdpc3RlciA6IDB4MDQgKHJlYWQpICovCnN0YXRpYyB1aW50MzJfdCBmZGN0cmxfcmVhZF9tYWluX3N0YXR1cyhGREN0cmwgKmZkY3RybCkKewogICAgdWludDMyX3QgcmV0dmFsID0gZmRjdHJsLT5tc3I7CgogICAgZmRjdHJsLT5kc3IgJj0gfkZEX0RTUl9QV1JET1dOOwogICAgZmRjdHJsLT5kb3IgfD0gRkRfRE9SX25SRVNFVDsKCiAgICAvKiBTcGFyYyBtdXRhdGlvbiAqLwogICAgaWYgKGZkY3RybC0+c3VuNG0pIHsKICAgICAgICByZXR2YWwgfD0gRkRfTVNSX0RJTzsKICAgICAgICBmZGN0cmxfcmVzZXRfaXJxKGZkY3RybCk7CiAgICB9OwoKICAgIEZMT1BQWV9EUFJJTlRGKCJtYWluIHN0YXR1cyByZWdpc3RlcjogMHglMDJ4XG4iLCByZXR2YWwpOwoKICAgIHJldHVybiByZXR2YWw7Cn0KCi8qIERhdGEgc2VsZWN0IHJhdGUgcmVnaXN0ZXIgOiAweDA0ICh3cml0ZSkgKi8Kc3RhdGljIHZvaWQgZmRjdHJsX3dyaXRlX3JhdGUoRkRDdHJsICpmZGN0cmwsIHVpbnQzMl90IHZhbHVlKQp7CiAgICAvKiBSZXNldCBtb2RlICovCiAgICBpZiAoIShmZGN0cmwtPmRvciAmIEZEX0RPUl9uUkVTRVQpKSB7CiAgICAgICAgRkxPUFBZX0RQUklOVEYoIkZsb3BweSBjb250cm9sbGVyIGluIFJFU0VUIHN0YXRlICFcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIEZMT1BQWV9EUFJJTlRGKCJzZWxlY3QgcmF0ZSByZWdpc3RlciBzZXQgdG8gMHglMDJ4XG4iLCB2YWx1ZSk7CiAgICAvKiBSZXNldDogYXV0b2NsZWFyICovCiAgICBpZiAodmFsdWUgJiBGRF9EU1JfU1dSRVNFVCkgewogICAgICAgIGZkY3RybC0+ZG9yICY9IH5GRF9ET1JfblJFU0VUOwogICAgICAgIGZkY3RybF9yZXNldChmZGN0cmwsIDEpOwogICAgICAgIGZkY3RybC0+ZG9yIHw9IEZEX0RPUl9uUkVTRVQ7CiAgICB9CiAgICBpZiAodmFsdWUgJiBGRF9EU1JfUFdSRE9XTikgewogICAgICAgIGZkY3RybF9yZXNldChmZGN0cmwsIDEpOwogICAgfQogICAgZmRjdHJsLT5kc3IgPSB2YWx1ZTsKfQoKc3RhdGljIGludCBmZGN0cmxfbWVkaWFfY2hhbmdlZChGRHJpdmUgKmRydikKewogICAgaW50IHJldDsKCiAgICBpZiAoIWRydi0+YnMpCiAgICAgICAgcmV0dXJuIDA7CiAgICByZXQgPSBiZHJ2X21lZGlhX2NoYW5nZWQoZHJ2LT5icyk7CiAgICBpZiAocmV0KSB7CiAgICAgICAgZmRfcmV2YWxpZGF0ZShkcnYpOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKLyogRGlnaXRhbCBpbnB1dCByZWdpc3RlciA6IDB4MDcgKHJlYWQtb25seSkgKi8Kc3RhdGljIHVpbnQzMl90IGZkY3RybF9yZWFkX2RpcihGREN0cmwgKmZkY3RybCkKewogICAgdWludDMyX3QgcmV0dmFsID0gMDsKCiAgICBpZiAoZmRjdHJsX21lZGlhX2NoYW5nZWQoZHJ2MChmZGN0cmwpKQogICAgIHx8IGZkY3RybF9tZWRpYV9jaGFuZ2VkKGRydjEoZmRjdHJsKSkKI2lmIE1BWF9GRCA9PSA0CiAgICAgfHwgZmRjdHJsX21lZGlhX2NoYW5nZWQoZHJ2MihmZGN0cmwpKQogICAgIHx8IGZkY3RybF9tZWRpYV9jaGFuZ2VkKGRydjMoZmRjdHJsKSkKI2VuZGlmCiAgICAgICAgKQogICAgICAgIHJldHZhbCB8PSBGRF9ESVJfRFNLQ0hHOwogICAgaWYgKHJldHZhbCAhPSAwKSB7CiAgICAgICAgRkxPUFBZX0RQUklOVEYoIkZsb3BweSBkaWdpdGFsIGlucHV0IHJlZ2lzdGVyOiAweCUwMnhcbiIsIHJldHZhbCk7CiAgICB9CgogICAgcmV0dXJuIHJldHZhbDsKfQoKLyogRklGTyBzdGF0ZSBjb250cm9sICovCnN0YXRpYyB2b2lkIGZkY3RybF9yZXNldF9maWZvKEZEQ3RybCAqZmRjdHJsKQp7CiAgICBmZGN0cmwtPmRhdGFfZGlyID0gRkRfRElSX1dSSVRFOwogICAgZmRjdHJsLT5kYXRhX3BvcyA9IDA7CiAgICBmZGN0cmwtPm1zciAmPSB+KEZEX01TUl9DTURCVVNZIHwgRkRfTVNSX0RJTyk7Cn0KCi8qIFNldCBGSUZPIHN0YXR1cyBmb3IgdGhlIGhvc3QgdG8gcmVhZCAqLwpzdGF0aWMgdm9pZCBmZGN0cmxfc2V0X2ZpZm8oRkRDdHJsICpmZGN0cmwsIGludCBmaWZvX2xlbiwgaW50IGRvX2lycSkKewogICAgZmRjdHJsLT5kYXRhX2RpciA9IEZEX0RJUl9SRUFEOwogICAgZmRjdHJsLT5kYXRhX2xlbiA9IGZpZm9fbGVuOwogICAgZmRjdHJsLT5kYXRhX3BvcyA9IDA7CiAgICBmZGN0cmwtPm1zciB8PSBGRF9NU1JfQ01EQlVTWSB8IEZEX01TUl9SUU0gfCBGRF9NU1JfRElPOwogICAgaWYgKGRvX2lycSkKICAgICAgICBmZGN0cmxfcmFpc2VfaXJxKGZkY3RybCwgMHgwMCk7Cn0KCi8qIFNldCBhbiBlcnJvcjogdW5pbXBsZW1lbnRlZC91bmtub3duIGNvbW1hbmQgKi8Kc3RhdGljIHZvaWQgZmRjdHJsX3VuaW1wbGVtZW50ZWQoRkRDdHJsICpmZGN0cmwsIGludCBkaXJlY3Rpb24pCnsKICAgIEZMT1BQWV9FUlJPUigidW5pbXBsZW1lbnRlZCBjb21tYW5kIDB4JTAyeFxuIiwgZmRjdHJsLT5maWZvWzBdKTsKICAgIGZkY3RybC0+Zmlmb1swXSA9IEZEX1NSMF9JTlZDTUQ7CiAgICBmZGN0cmxfc2V0X2ZpZm8oZmRjdHJsLCAxLCAwKTsKfQoKLyogU2VlayB0byBuZXh0IHNlY3RvciAqLwpzdGF0aWMgaW50IGZkY3RybF9zZWVrX3RvX25leHRfc2VjdChGREN0cmwgKmZkY3RybCwgRkRyaXZlICpjdXJfZHJ2KQp7CiAgICBGTE9QUFlfRFBSSU5URigic2VlayB0byBuZXh0IHNlY3RvciAoJWQgJTAyeCAlMDJ4ID0+ICVkKVxuIiwKICAgICAgICAgICAgICAgICAgIGN1cl9kcnYtPmhlYWQsIGN1cl9kcnYtPnRyYWNrLCBjdXJfZHJ2LT5zZWN0LAogICAgICAgICAgICAgICAgICAgZmRfc2VjdG9yKGN1cl9kcnYpKTsKICAgIC8qIFhYWDogY3VyX2Rydi0+c2VjdCA+PSBjdXJfZHJ2LT5sYXN0X3NlY3Qgc2hvdWxkIGJlIGFuCiAgICAgICBlcnJvciBpbiBmYWN0ICovCiAgICBpZiAoY3VyX2Rydi0+c2VjdCA+PSBjdXJfZHJ2LT5sYXN0X3NlY3QgfHwKICAgICAgICBjdXJfZHJ2LT5zZWN0ID09IGZkY3RybC0+ZW90KSB7CiAgICAgICAgY3VyX2Rydi0+c2VjdCA9IDE7CiAgICAgICAgaWYgKEZEX01VTFRJX1RSQUNLKGZkY3RybC0+ZGF0YV9zdGF0ZSkpIHsKICAgICAgICAgICAgaWYgKGN1cl9kcnYtPmhlYWQgPT0gMCAmJgogICAgICAgICAgICAgICAgKGN1cl9kcnYtPmZsYWdzICYgRkRJU0tfREJMX1NJREVTKSAhPSAwKSB7CiAgICAgICAgICAgICAgICBjdXJfZHJ2LT5oZWFkID0gMTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGN1cl9kcnYtPmhlYWQgPSAwOwogICAgICAgICAgICAgICAgY3VyX2Rydi0+dHJhY2srKzsKICAgICAgICAgICAgICAgIGlmICgoY3VyX2Rydi0+ZmxhZ3MgJiBGRElTS19EQkxfU0lERVMpID09IDApCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjdXJfZHJ2LT50cmFjaysrOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgRkxPUFBZX0RQUklOVEYoInNlZWsgdG8gbmV4dCB0cmFjayAoJWQgJTAyeCAlMDJ4ID0+ICVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICBjdXJfZHJ2LT5oZWFkLCBjdXJfZHJ2LT50cmFjaywKICAgICAgICAgICAgICAgICAgICAgICBjdXJfZHJ2LT5zZWN0LCBmZF9zZWN0b3IoY3VyX2RydikpOwogICAgfSBlbHNlIHsKICAgICAgICBjdXJfZHJ2LT5zZWN0Kys7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKLyogQ2FsbGJhY2sgZm9yIHRyYW5zZmVyIGVuZCAoc3RvcCBvciBhYm9ydCkgKi8Kc3RhdGljIHZvaWQgZmRjdHJsX3N0b3BfdHJhbnNmZXIoRkRDdHJsICpmZGN0cmwsIHVpbnQ4X3Qgc3RhdHVzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdGF0dXMxLCB1aW50OF90IHN0YXR1czIpCnsKICAgIEZEcml2ZSAqY3VyX2RydjsKCiAgICBjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKICAgIEZMT1BQWV9EUFJJTlRGKCJ0cmFuc2ZlciBzdGF0dXM6ICUwMnggJTAyeCAlMDJ4ICglMDJ4KVxuIiwKICAgICAgICAgICAgICAgICAgIHN0YXR1czAsIHN0YXR1czEsIHN0YXR1czIsCiAgICAgICAgICAgICAgICAgICBzdGF0dXMwIHwgKGN1cl9kcnYtPmhlYWQgPDwgMikgfCBHRVRfQ1VSX0RSVihmZGN0cmwpKTsKICAgIGZkY3RybC0+Zmlmb1swXSA9IHN0YXR1czAgfCAoY3VyX2Rydi0+aGVhZCA8PCAyKSB8IEdFVF9DVVJfRFJWKGZkY3RybCk7CiAgICBmZGN0cmwtPmZpZm9bMV0gPSBzdGF0dXMxOwogICAgZmRjdHJsLT5maWZvWzJdID0gc3RhdHVzMjsKICAgIGZkY3RybC0+Zmlmb1szXSA9IGN1cl9kcnYtPnRyYWNrOwogICAgZmRjdHJsLT5maWZvWzRdID0gY3VyX2Rydi0+aGVhZDsKICAgIGZkY3RybC0+Zmlmb1s1XSA9IGN1cl9kcnYtPnNlY3Q7CiAgICBmZGN0cmwtPmZpZm9bNl0gPSBGRF9TRUNUT1JfU0M7CiAgICBmZGN0cmwtPmRhdGFfZGlyID0gRkRfRElSX1JFQUQ7CiAgICBpZiAoIShmZGN0cmwtPm1zciAmIEZEX01TUl9OT05ETUEpKSB7CiAgICAgICAgRE1BX3JlbGVhc2VfRFJFUShmZGN0cmwtPmRtYV9jaGFubik7CiAgICB9CiAgICBmZGN0cmwtPm1zciB8PSBGRF9NU1JfUlFNIHwgRkRfTVNSX0RJTzsKICAgIGZkY3RybC0+bXNyICY9IH5GRF9NU1JfTk9ORE1BOwogICAgZmRjdHJsX3NldF9maWZvKGZkY3RybCwgNywgMSk7Cn0KCi8qIFByZXBhcmUgYSBkYXRhIHRyYW5zZmVyIChlaXRoZXIgRE1BIG9yIEZJRk8pICovCnN0YXRpYyB2b2lkIGZkY3RybF9zdGFydF90cmFuc2ZlcihGREN0cmwgKmZkY3RybCwgaW50IGRpcmVjdGlvbikKewogICAgRkRyaXZlICpjdXJfZHJ2OwogICAgdWludDhfdCBraCwga3QsIGtzOwogICAgaW50IGRpZF9zZWVrID0gMDsKCiAgICBTRVRfQ1VSX0RSVihmZGN0cmwsIGZkY3RybC0+Zmlmb1sxXSAmIEZEX0RPUl9TRUxNQVNLKTsKICAgIGN1cl9kcnYgPSBnZXRfY3VyX2RydihmZGN0cmwpOwogICAga3QgPSBmZGN0cmwtPmZpZm9bMl07CiAgICBraCA9IGZkY3RybC0+Zmlmb1szXTsKICAgIGtzID0gZmRjdHJsLT5maWZvWzRdOwogICAgRkxPUFBZX0RQUklOVEYoIlN0YXJ0IHRyYW5zZmVyIGF0ICVkICVkICUwMnggJTAyeCAoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgR0VUX0NVUl9EUlYoZmRjdHJsKSwga2gsIGt0LCBrcywKICAgICAgICAgICAgICAgICAgIGZkX3NlY3Rvcl9jYWxjKGtoLCBrdCwga3MsIGN1cl9kcnYtPmxhc3Rfc2VjdCkpOwogICAgc3dpdGNoIChmZF9zZWVrKGN1cl9kcnYsIGtoLCBrdCwga3MsIGZkY3RybC0+Y29uZmlnICYgRkRfQ09ORklHX0VJUykpIHsKICAgIGNhc2UgMjoKICAgICAgICAvKiBzZWN0IHRvbyBiaWcgKi8KICAgICAgICBmZGN0cmxfc3RvcF90cmFuc2ZlcihmZGN0cmwsIEZEX1NSMF9BQk5URVJNLCAweDAwLCAweDAwKTsKICAgICAgICBmZGN0cmwtPmZpZm9bM10gPSBrdDsKICAgICAgICBmZGN0cmwtPmZpZm9bNF0gPSBraDsKICAgICAgICBmZGN0cmwtPmZpZm9bNV0gPSBrczsKICAgICAgICByZXR1cm47CiAgICBjYXNlIDM6CiAgICAgICAgLyogdHJhY2sgdG9vIGJpZyAqLwogICAgICAgIGZkY3RybF9zdG9wX3RyYW5zZmVyKGZkY3RybCwgRkRfU1IwX0FCTlRFUk0sIEZEX1NSMV9FQywgMHgwMCk7CiAgICAgICAgZmRjdHJsLT5maWZvWzNdID0ga3Q7CiAgICAgICAgZmRjdHJsLT5maWZvWzRdID0ga2g7CiAgICAgICAgZmRjdHJsLT5maWZvWzVdID0ga3M7CiAgICAgICAgcmV0dXJuOwogICAgY2FzZSA0OgogICAgICAgIC8qIE5vIHNlZWsgZW5hYmxlZCAqLwogICAgICAgIGZkY3RybF9zdG9wX3RyYW5zZmVyKGZkY3RybCwgRkRfU1IwX0FCTlRFUk0sIDB4MDAsIDB4MDApOwogICAgICAgIGZkY3RybC0+Zmlmb1szXSA9IGt0OwogICAgICAgIGZkY3RybC0+Zmlmb1s0XSA9IGtoOwogICAgICAgIGZkY3RybC0+Zmlmb1s1XSA9IGtzOwogICAgICAgIHJldHVybjsKICAgIGNhc2UgMToKICAgICAgICBkaWRfc2VlayA9IDE7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGJyZWFrOwogICAgfQoKICAgIC8qIFNldCB0aGUgRklGTyBzdGF0ZSAqLwogICAgZmRjdHJsLT5kYXRhX2RpciA9IGRpcmVjdGlvbjsKICAgIGZkY3RybC0+ZGF0YV9wb3MgPSAwOwogICAgZmRjdHJsLT5tc3IgfD0gRkRfTVNSX0NNREJVU1k7CiAgICBpZiAoZmRjdHJsLT5maWZvWzBdICYgMHg4MCkKICAgICAgICBmZGN0cmwtPmRhdGFfc3RhdGUgfD0gRkRfU1RBVEVfTVVMVEk7CiAgICBlbHNlCiAgICAgICAgZmRjdHJsLT5kYXRhX3N0YXRlICY9IH5GRF9TVEFURV9NVUxUSTsKICAgIGlmIChkaWRfc2VlaykKICAgICAgICBmZGN0cmwtPmRhdGFfc3RhdGUgfD0gRkRfU1RBVEVfU0VFSzsKICAgIGVsc2UKICAgICAgICBmZGN0cmwtPmRhdGFfc3RhdGUgJj0gfkZEX1NUQVRFX1NFRUs7CiAgICBpZiAoZmRjdHJsLT5maWZvWzVdID09IDAwKSB7CiAgICAgICAgZmRjdHJsLT5kYXRhX2xlbiA9IGZkY3RybC0+Zmlmb1s4XTsKICAgIH0gZWxzZSB7CiAgICAgICAgaW50IHRtcDsKICAgICAgICBmZGN0cmwtPmRhdGFfbGVuID0gMTI4IDw8IChmZGN0cmwtPmZpZm9bNV0gPiA3ID8gNyA6IGZkY3RybC0+Zmlmb1s1XSk7CiAgICAgICAgdG1wID0gKGZkY3RybC0+Zmlmb1s2XSAtIGtzICsgMSk7CiAgICAgICAgaWYgKGZkY3RybC0+Zmlmb1swXSAmIDB4ODApCiAgICAgICAgICAgIHRtcCArPSBmZGN0cmwtPmZpZm9bNl07CiAgICAgICAgZmRjdHJsLT5kYXRhX2xlbiAqPSB0bXA7CiAgICB9CiAgICBmZGN0cmwtPmVvdCA9IGZkY3RybC0+Zmlmb1s2XTsKICAgIGlmIChmZGN0cmwtPmRvciAmIEZEX0RPUl9ETUFFTikgewogICAgICAgIGludCBkbWFfbW9kZTsKICAgICAgICAvKiBETUEgdHJhbnNmZXIgYXJlIGVuYWJsZWQuIENoZWNrIGlmIERNQSBjaGFubmVsIGlzIHdlbGwgcHJvZ3JhbW1lZCAqLwogICAgICAgIGRtYV9tb2RlID0gRE1BX2dldF9jaGFubmVsX21vZGUoZmRjdHJsLT5kbWFfY2hhbm4pOwogICAgICAgIGRtYV9tb2RlID0gKGRtYV9tb2RlID4+IDIpICYgMzsKICAgICAgICBGTE9QUFlfRFBSSU5URigiZG1hX21vZGU9JWQgZGlyZWN0aW9uPSVkICglZCAtICVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICBkbWFfbW9kZSwgZGlyZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICgxMjggPDwgZmRjdHJsLT5maWZvWzVdKSAqCiAgICAgICAgICAgICAgICAgICAgICAgKGN1cl9kcnYtPmxhc3Rfc2VjdCAtIGtzICsgMSksIGZkY3RybC0+ZGF0YV9sZW4pOwogICAgICAgIGlmICgoKGRpcmVjdGlvbiA9PSBGRF9ESVJfU0NBTkUgfHwgZGlyZWN0aW9uID09IEZEX0RJUl9TQ0FOTCB8fAogICAgICAgICAgICAgIGRpcmVjdGlvbiA9PSBGRF9ESVJfU0NBTkgpICYmIGRtYV9tb2RlID09IDApIHx8CiAgICAgICAgICAgIChkaXJlY3Rpb24gPT0gRkRfRElSX1dSSVRFICYmIGRtYV9tb2RlID09IDIpIHx8CiAgICAgICAgICAgIChkaXJlY3Rpb24gPT0gRkRfRElSX1JFQUQgJiYgZG1hX21vZGUgPT0gMSkpIHsKICAgICAgICAgICAgLyogTm8gYWNjZXNzIGlzIGFsbG93ZWQgdW50aWwgRE1BIHRyYW5zZmVyIGhhcyBjb21wbGV0ZWQgKi8KICAgICAgICAgICAgZmRjdHJsLT5tc3IgJj0gfkZEX01TUl9SUU07CiAgICAgICAgICAgIC8qIE5vdywgd2UganVzdCBoYXZlIHRvIHdhaXQgZm9yIHRoZSBETUEgY29udHJvbGxlciB0bwogICAgICAgICAgICAgKiByZWNhbGwgdXMuLi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIERNQV9ob2xkX0RSRVEoZmRjdHJsLT5kbWFfY2hhbm4pOwogICAgICAgICAgICBETUFfc2NoZWR1bGUoZmRjdHJsLT5kbWFfY2hhbm4pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgRkxPUFBZX0VSUk9SKCJkbWFfbW9kZT0lZCBkaXJlY3Rpb249JWRcbiIsIGRtYV9tb2RlLCBkaXJlY3Rpb24pOwogICAgICAgIH0KICAgIH0KICAgIEZMT1BQWV9EUFJJTlRGKCJzdGFydCBub24tRE1BIHRyYW5zZmVyXG4iKTsKICAgIGZkY3RybC0+bXNyIHw9IEZEX01TUl9OT05ETUE7CiAgICBpZiAoZGlyZWN0aW9uICE9IEZEX0RJUl9XUklURSkKICAgICAgICBmZGN0cmwtPm1zciB8PSBGRF9NU1JfRElPOwogICAgLyogSU8gYmFzZWQgdHJhbnNmZXI6IGNhbGN1bGF0ZSBsZW4gKi8KICAgIGZkY3RybF9yYWlzZV9pcnEoZmRjdHJsLCAweDAwKTsKCiAgICByZXR1cm47Cn0KCi8qIFByZXBhcmUgYSB0cmFuc2ZlciBvZiBkZWxldGVkIGRhdGEgKi8Kc3RhdGljIHZvaWQgZmRjdHJsX3N0YXJ0X3RyYW5zZmVyX2RlbChGREN0cmwgKmZkY3RybCwgaW50IGRpcmVjdGlvbikKewogICAgRkxPUFBZX0VSUk9SKCJmZGN0cmxfc3RhcnRfdHJhbnNmZXJfZGVsKCkgdW5pbXBsZW1lbnRlZFxuIik7CgogICAgLyogV2UgZG9uJ3QgaGFuZGxlIGRlbGV0ZWQgZGF0YSwKICAgICAqIHNvIHdlIGRvbid0IHJldHVybiAqQU5ZVEhJTkcqCiAgICAgKi8KICAgIGZkY3RybF9zdG9wX3RyYW5zZmVyKGZkY3RybCwgRkRfU1IwX0FCTlRFUk0gfCBGRF9TUjBfU0VFSywgMHgwMCwgMHgwMCk7Cn0KCi8qIGhhbmRsZXJzIGZvciBETUEgdHJhbnNmZXJzICovCnN0YXRpYyBpbnQgZmRjdHJsX3RyYW5zZmVyX2hhbmRsZXIgKHZvaWQgKm9wYXF1ZSwgaW50IG5jaGFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZG1hX3BvcywgaW50IGRtYV9sZW4pCnsKICAgIEZEQ3RybCAqZmRjdHJsOwogICAgRkRyaXZlICpjdXJfZHJ2OwogICAgaW50IGxlbiwgc3RhcnRfcG9zLCByZWxfcG9zOwogICAgdWludDhfdCBzdGF0dXMwID0gMHgwMCwgc3RhdHVzMSA9IDB4MDAsIHN0YXR1czIgPSAweDAwOwoKICAgIGZkY3RybCA9IG9wYXF1ZTsKICAgIGlmIChmZGN0cmwtPm1zciAmIEZEX01TUl9SUU0pIHsKICAgICAgICBGTE9QUFlfRFBSSU5URigiTm90IGluIERNQSB0cmFuc2ZlciBtb2RlICFcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgY3VyX2RydiA9IGdldF9jdXJfZHJ2KGZkY3RybCk7CiAgICBpZiAoZmRjdHJsLT5kYXRhX2RpciA9PSBGRF9ESVJfU0NBTkUgfHwgZmRjdHJsLT5kYXRhX2RpciA9PSBGRF9ESVJfU0NBTkwgfHwKICAgICAgICBmZGN0cmwtPmRhdGFfZGlyID09IEZEX0RJUl9TQ0FOSCkKICAgICAgICBzdGF0dXMyID0gRkRfU1IyX1NOUzsKICAgIGlmIChkbWFfbGVuID4gZmRjdHJsLT5kYXRhX2xlbikKICAgICAgICBkbWFfbGVuID0gZmRjdHJsLT5kYXRhX2xlbjsKICAgIGlmIChjdXJfZHJ2LT5icyA9PSBOVUxMKSB7CiAgICAgICAgaWYgKGZkY3RybC0+ZGF0YV9kaXIgPT0gRkRfRElSX1dSSVRFKQogICAgICAgICAgICBmZGN0cmxfc3RvcF90cmFuc2ZlcihmZGN0cmwsIEZEX1NSMF9BQk5URVJNIHwgRkRfU1IwX1NFRUssIDB4MDAsIDB4MDApOwogICAgICAgIGVsc2UKICAgICAgICAgICAgZmRjdHJsX3N0b3BfdHJhbnNmZXIoZmRjdHJsLCBGRF9TUjBfQUJOVEVSTSwgMHgwMCwgMHgwMCk7CiAgICAgICAgbGVuID0gMDsKICAgICAgICBnb3RvIHRyYW5zZmVyX2Vycm9yOwogICAgfQogICAgcmVsX3BvcyA9IGZkY3RybC0+ZGF0YV9wb3MgJSBGRF9TRUNUT1JfTEVOOwogICAgZm9yIChzdGFydF9wb3MgPSBmZGN0cmwtPmRhdGFfcG9zOyBmZGN0cmwtPmRhdGFfcG9zIDwgZG1hX2xlbjspIHsKICAgICAgICBsZW4gPSBkbWFfbGVuIC0gZmRjdHJsLT5kYXRhX3BvczsKICAgICAgICBpZiAobGVuICsgcmVsX3BvcyA+IEZEX1NFQ1RPUl9MRU4pCiAgICAgICAgICAgIGxlbiA9IEZEX1NFQ1RPUl9MRU4gLSByZWxfcG9zOwogICAgICAgIEZMT1BQWV9EUFJJTlRGKCJjb3B5ICVkIGJ5dGVzICglZCAlZCAlZCkgJWQgcG9zICVkICUwMnggIgogICAgICAgICAgICAgICAgICAgICAgICIoJWQtMHglMDh4IDB4JTA4eClcbiIsIGxlbiwgZG1hX2xlbiwgZmRjdHJsLT5kYXRhX3BvcywKICAgICAgICAgICAgICAgICAgICAgICBmZGN0cmwtPmRhdGFfbGVuLCBHRVRfQ1VSX0RSVihmZGN0cmwpLCBjdXJfZHJ2LT5oZWFkLAogICAgICAgICAgICAgICAgICAgICAgIGN1cl9kcnYtPnRyYWNrLCBjdXJfZHJ2LT5zZWN0LCBmZF9zZWN0b3IoY3VyX2RydiksCiAgICAgICAgICAgICAgICAgICAgICAgZmRfc2VjdG9yKGN1cl9kcnYpICogRkRfU0VDVE9SX0xFTik7CiAgICAgICAgaWYgKGZkY3RybC0+ZGF0YV9kaXIgIT0gRkRfRElSX1dSSVRFIHx8CiAgICAgICAgICAgIGxlbiA8IEZEX1NFQ1RPUl9MRU4gfHwgcmVsX3BvcyAhPSAwKSB7CiAgICAgICAgICAgIC8qIFJFQUQgJiBTQ0FOIGNvbW1hbmRzIGFuZCByZWFsaWduIHRvIGEgc2VjdG9yIGZvciBXUklURSAqLwogICAgICAgICAgICBpZiAoYmRydl9yZWFkKGN1cl9kcnYtPmJzLCBmZF9zZWN0b3IoY3VyX2RydiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmRjdHJsLT5maWZvLCAxKSA8IDApIHsKICAgICAgICAgICAgICAgIEZMT1BQWV9EUFJJTlRGKCJGbG9wcHk6IGVycm9yIGdldHRpbmcgc2VjdG9yICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRfc2VjdG9yKGN1cl9kcnYpKTsKICAgICAgICAgICAgICAgIC8qIFN1cmUsIGltYWdlIHNpemUgaXMgdG9vIHNtYWxsLi4uICovCiAgICAgICAgICAgICAgICBtZW1zZXQoZmRjdHJsLT5maWZvLCAwLCBGRF9TRUNUT1JfTEVOKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKGZkY3RybC0+ZGF0YV9kaXIpIHsKICAgICAgICBjYXNlIEZEX0RJUl9SRUFEOgogICAgICAgICAgICAvKiBSRUFEIGNvbW1hbmRzICovCiAgICAgICAgICAgIERNQV93cml0ZV9tZW1vcnkgKG5jaGFuLCBmZGN0cmwtPmZpZm8gKyByZWxfcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZGN0cmwtPmRhdGFfcG9zLCBsZW4pOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEZEX0RJUl9XUklURToKICAgICAgICAgICAgLyogV1JJVEUgY29tbWFuZHMgKi8KICAgICAgICAgICAgRE1BX3JlYWRfbWVtb3J5IChuY2hhbiwgZmRjdHJsLT5maWZvICsgcmVsX3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZGN0cmwtPmRhdGFfcG9zLCBsZW4pOwogICAgICAgICAgICBpZiAoYmRydl93cml0ZShjdXJfZHJ2LT5icywgZmRfc2VjdG9yKGN1cl9kcnYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmZGN0cmwtPmZpZm8sIDEpIDwgMCkgewogICAgICAgICAgICAgICAgRkxPUFBZX0VSUk9SKCJ3cml0aW5nIHNlY3RvciAlZFxuIiwgZmRfc2VjdG9yKGN1cl9kcnYpKTsKICAgICAgICAgICAgICAgIGZkY3RybF9zdG9wX3RyYW5zZmVyKGZkY3RybCwgRkRfU1IwX0FCTlRFUk0gfCBGRF9TUjBfU0VFSywgMHgwMCwgMHgwMCk7CiAgICAgICAgICAgICAgICBnb3RvIHRyYW5zZmVyX2Vycm9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIC8qIFNDQU4gY29tbWFuZHMgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdWludDhfdCB0bXBidWZbRkRfU0VDVE9SX0xFTl07CiAgICAgICAgICAgICAgICBpbnQgcmV0OwogICAgICAgICAgICAgICAgRE1BX3JlYWRfbWVtb3J5IChuY2hhbiwgdG1wYnVmLCBmZGN0cmwtPmRhdGFfcG9zLCBsZW4pOwogICAgICAgICAgICAgICAgcmV0ID0gbWVtY21wKHRtcGJ1ZiwgZmRjdHJsLT5maWZvICsgcmVsX3BvcywgbGVuKTsKICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSBGRF9TUjJfU0VIOwogICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kX3RyYW5zZmVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKChyZXQgPCAwICYmIGZkY3RybC0+ZGF0YV9kaXIgPT0gRkRfRElSX1NDQU5MKSB8fAogICAgICAgICAgICAgICAgICAgIChyZXQgPiAwICYmIGZkY3RybC0+ZGF0YV9kaXIgPT0gRkRfRElSX1NDQU5IKSkgewogICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAweDAwOwogICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kX3RyYW5zZmVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBmZGN0cmwtPmRhdGFfcG9zICs9IGxlbjsKICAgICAgICByZWxfcG9zID0gZmRjdHJsLT5kYXRhX3BvcyAlIEZEX1NFQ1RPUl9MRU47CiAgICAgICAgaWYgKHJlbF9wb3MgPT0gMCkgewogICAgICAgICAgICAvKiBTZWVrIHRvIG5leHQgc2VjdG9yICovCiAgICAgICAgICAgIGlmICghZmRjdHJsX3NlZWtfdG9fbmV4dF9zZWN0KGZkY3RybCwgY3VyX2RydikpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiBlbmRfdHJhbnNmZXI6CiAgICBsZW4gPSBmZGN0cmwtPmRhdGFfcG9zIC0gc3RhcnRfcG9zOwogICAgRkxPUFBZX0RQUklOVEYoImVuZCB0cmFuc2ZlciAlZCAlZCAlZFxuIiwKICAgICAgICAgICAgICAgICAgIGZkY3RybC0+ZGF0YV9wb3MsIGxlbiwgZmRjdHJsLT5kYXRhX2xlbik7CiAgICBpZiAoZmRjdHJsLT5kYXRhX2RpciA9PSBGRF9ESVJfU0NBTkUgfHwKICAgICAgICBmZGN0cmwtPmRhdGFfZGlyID09IEZEX0RJUl9TQ0FOTCB8fAogICAgICAgIGZkY3RybC0+ZGF0YV9kaXIgPT0gRkRfRElSX1NDQU5IKQogICAgICAgIHN0YXR1czIgPSBGRF9TUjJfU0VIOwogICAgaWYgKEZEX0RJRF9TRUVLKGZkY3RybC0+ZGF0YV9zdGF0ZSkpCiAgICAgICAgc3RhdHVzMCB8PSBGRF9TUjBfU0VFSzsKICAgIGZkY3RybC0+ZGF0YV9sZW4gLT0gbGVuOwogICAgZmRjdHJsX3N0b3BfdHJhbnNmZXIoZmRjdHJsLCBzdGF0dXMwLCBzdGF0dXMxLCBzdGF0dXMyKTsKIHRyYW5zZmVyX2Vycm9yOgoKICAgIHJldHVybiBsZW47Cn0KCi8qIERhdGEgcmVnaXN0ZXIgOiAweDA1ICovCnN0YXRpYyB1aW50MzJfdCBmZGN0cmxfcmVhZF9kYXRhKEZEQ3RybCAqZmRjdHJsKQp7CiAgICBGRHJpdmUgKmN1cl9kcnY7CiAgICB1aW50MzJfdCByZXR2YWwgPSAwOwogICAgaW50IHBvczsKCiAgICBjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKICAgIGZkY3RybC0+ZHNyICY9IH5GRF9EU1JfUFdSRE9XTjsKICAgIGlmICghKGZkY3RybC0+bXNyICYgRkRfTVNSX1JRTSkgfHwgIShmZGN0cmwtPm1zciAmIEZEX01TUl9ESU8pKSB7CiAgICAgICAgRkxPUFBZX0VSUk9SKCJjb250cm9sbGVyIG5vdCByZWFkeSBmb3IgcmVhZGluZ1xuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBwb3MgPSBmZGN0cmwtPmRhdGFfcG9zOwogICAgaWYgKGZkY3RybC0+bXNyICYgRkRfTVNSX05PTkRNQSkgewogICAgICAgIHBvcyAlPSBGRF9TRUNUT1JfTEVOOwogICAgICAgIGlmIChwb3MgPT0gMCkgewogICAgICAgICAgICBpZiAoZmRjdHJsLT5kYXRhX3BvcyAhPSAwKQogICAgICAgICAgICAgICAgaWYgKCFmZGN0cmxfc2Vla190b19uZXh0X3NlY3QoZmRjdHJsLCBjdXJfZHJ2KSkgewogICAgICAgICAgICAgICAgICAgIEZMT1BQWV9EUFJJTlRGKCJlcnJvciBzZWVraW5nIHRvIG5leHQgc2VjdG9yICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkX3NlY3RvcihjdXJfZHJ2KSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiZHJ2X3JlYWQoY3VyX2Rydi0+YnMsIGZkX3NlY3RvcihjdXJfZHJ2KSwgZmRjdHJsLT5maWZvLCAxKSA8IDApIHsKICAgICAgICAgICAgICAgIEZMT1BQWV9EUFJJTlRGKCJlcnJvciBnZXR0aW5nIHNlY3RvciAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkX3NlY3RvcihjdXJfZHJ2KSk7CiAgICAgICAgICAgICAgICAvKiBTdXJlLCBpbWFnZSBzaXplIGlzIHRvbyBzbWFsbC4uLiAqLwogICAgICAgICAgICAgICAgbWVtc2V0KGZkY3RybC0+ZmlmbywgMCwgRkRfU0VDVE9SX0xFTik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR2YWwgPSBmZGN0cmwtPmZpZm9bcG9zXTsKICAgIGlmICgrK2ZkY3RybC0+ZGF0YV9wb3MgPT0gZmRjdHJsLT5kYXRhX2xlbikgewogICAgICAgIGZkY3RybC0+ZGF0YV9wb3MgPSAwOwogICAgICAgIC8qIFN3aXRjaCBmcm9tIHRyYW5zZmVyIG1vZGUgdG8gc3RhdHVzIG1vZGUKICAgICAgICAgKiB0aGVuIGZyb20gc3RhdHVzIG1vZGUgdG8gY29tbWFuZCBtb2RlCiAgICAgICAgICovCiAgICAgICAgaWYgKGZkY3RybC0+bXNyICYgRkRfTVNSX05PTkRNQSkgewogICAgICAgICAgICBmZGN0cmxfc3RvcF90cmFuc2ZlcihmZGN0cmwsIEZEX1NSMF9TRUVLLCAweDAwLCAweDAwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmZGN0cmxfcmVzZXRfZmlmbyhmZGN0cmwpOwogICAgICAgICAgICBmZGN0cmxfcmVzZXRfaXJxKGZkY3RybCk7CiAgICAgICAgfQogICAgfQogICAgRkxPUFBZX0RQUklOVEYoImRhdGEgcmVnaXN0ZXI6IDB4JTAyeFxuIiwgcmV0dmFsKTsKCiAgICByZXR1cm4gcmV0dmFsOwp9CgpzdGF0aWMgdm9pZCBmZGN0cmxfZm9ybWF0X3NlY3RvcihGREN0cmwgKmZkY3RybCkKewogICAgRkRyaXZlICpjdXJfZHJ2OwogICAgdWludDhfdCBraCwga3QsIGtzOwoKICAgIFNFVF9DVVJfRFJWKGZkY3RybCwgZmRjdHJsLT5maWZvWzFdICYgRkRfRE9SX1NFTE1BU0spOwogICAgY3VyX2RydiA9IGdldF9jdXJfZHJ2KGZkY3RybCk7CiAgICBrdCA9IGZkY3RybC0+Zmlmb1s2XTsKICAgIGtoID0gZmRjdHJsLT5maWZvWzddOwogICAga3MgPSBmZGN0cmwtPmZpZm9bOF07CiAgICBGTE9QUFlfRFBSSU5URigiZm9ybWF0IHNlY3RvciBhdCAlZCAlZCAlMDJ4ICUwMnggKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgIEdFVF9DVVJfRFJWKGZkY3RybCksIGtoLCBrdCwga3MsCiAgICAgICAgICAgICAgICAgICBmZF9zZWN0b3JfY2FsYyhraCwga3QsIGtzLCBjdXJfZHJ2LT5sYXN0X3NlY3QpKTsKICAgIHN3aXRjaCAoZmRfc2VlayhjdXJfZHJ2LCBraCwga3QsIGtzLCBmZGN0cmwtPmNvbmZpZyAmIEZEX0NPTkZJR19FSVMpKSB7CiAgICBjYXNlIDI6CiAgICAgICAgLyogc2VjdCB0b28gYmlnICovCiAgICAgICAgZmRjdHJsX3N0b3BfdHJhbnNmZXIoZmRjdHJsLCBGRF9TUjBfQUJOVEVSTSwgMHgwMCwgMHgwMCk7CiAgICAgICAgZmRjdHJsLT5maWZvWzNdID0ga3Q7CiAgICAgICAgZmRjdHJsLT5maWZvWzRdID0ga2g7CiAgICAgICAgZmRjdHJsLT5maWZvWzVdID0ga3M7CiAgICAgICAgcmV0dXJuOwogICAgY2FzZSAzOgogICAgICAgIC8qIHRyYWNrIHRvbyBiaWcgKi8KICAgICAgICBmZGN0cmxfc3RvcF90cmFuc2ZlcihmZGN0cmwsIEZEX1NSMF9BQk5URVJNLCBGRF9TUjFfRUMsIDB4MDApOwogICAgICAgIGZkY3RybC0+Zmlmb1szXSA9IGt0OwogICAgICAgIGZkY3RybC0+Zmlmb1s0XSA9IGtoOwogICAgICAgIGZkY3RybC0+Zmlmb1s1XSA9IGtzOwogICAgICAgIHJldHVybjsKICAgIGNhc2UgNDoKICAgICAgICAvKiBObyBzZWVrIGVuYWJsZWQgKi8KICAgICAgICBmZGN0cmxfc3RvcF90cmFuc2ZlcihmZGN0cmwsIEZEX1NSMF9BQk5URVJNLCAweDAwLCAweDAwKTsKICAgICAgICBmZGN0cmwtPmZpZm9bM10gPSBrdDsKICAgICAgICBmZGN0cmwtPmZpZm9bNF0gPSBraDsKICAgICAgICBmZGN0cmwtPmZpZm9bNV0gPSBrczsKICAgICAgICByZXR1cm47CiAgICBjYXNlIDE6CiAgICAgICAgZmRjdHJsLT5kYXRhX3N0YXRlIHw9IEZEX1NUQVRFX1NFRUs7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGJyZWFrOwogICAgfQogICAgbWVtc2V0KGZkY3RybC0+ZmlmbywgMCwgRkRfU0VDVE9SX0xFTik7CiAgICBpZiAoY3VyX2Rydi0+YnMgPT0gTlVMTCB8fAogICAgICAgIGJkcnZfd3JpdGUoY3VyX2Rydi0+YnMsIGZkX3NlY3RvcihjdXJfZHJ2KSwgZmRjdHJsLT5maWZvLCAxKSA8IDApIHsKICAgICAgICBGTE9QUFlfRVJST1IoImZvcm1hdHRpbmcgc2VjdG9yICVkXG4iLCBmZF9zZWN0b3IoY3VyX2RydikpOwogICAgICAgIGZkY3RybF9zdG9wX3RyYW5zZmVyKGZkY3RybCwgRkRfU1IwX0FCTlRFUk0gfCBGRF9TUjBfU0VFSywgMHgwMCwgMHgwMCk7CiAgICB9IGVsc2UgewogICAgICAgIGlmIChjdXJfZHJ2LT5zZWN0ID09IGN1cl9kcnYtPmxhc3Rfc2VjdCkgewogICAgICAgICAgICBmZGN0cmwtPmRhdGFfc3RhdGUgJj0gfkZEX1NUQVRFX0ZPUk1BVDsKICAgICAgICAgICAgLyogTGFzdCBzZWN0b3IgZG9uZSAqLwogICAgICAgICAgICBpZiAoRkRfRElEX1NFRUsoZmRjdHJsLT5kYXRhX3N0YXRlKSkKICAgICAgICAgICAgICAgIGZkY3RybF9zdG9wX3RyYW5zZmVyKGZkY3RybCwgRkRfU1IwX1NFRUssIDB4MDAsIDB4MDApOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBmZGN0cmxfc3RvcF90cmFuc2ZlcihmZGN0cmwsIDB4MDAsIDB4MDAsIDB4MDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qIE1vcmUgdG8gZG8gKi8KICAgICAgICAgICAgZmRjdHJsLT5kYXRhX3BvcyA9IDA7CiAgICAgICAgICAgIGZkY3RybC0+ZGF0YV9sZW4gPSA0OwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV9sb2NrKEZEQ3RybCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQp7CiAgICBmZGN0cmwtPmxvY2sgPSAoZmRjdHJsLT5maWZvWzBdICYgMHg4MCkgPyAxIDogMDsKICAgIGZkY3RybC0+Zmlmb1swXSA9IGZkY3RybC0+bG9jayA8PCA0OwogICAgZmRjdHJsX3NldF9maWZvKGZkY3RybCwgMSwgZmRjdHJsLT5sb2NrKTsKfQoKc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV9kdW1wcmVnKEZEQ3RybCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQp7CiAgICBGRHJpdmUgKmN1cl9kcnYgPSBnZXRfY3VyX2RydihmZGN0cmwpOwoKICAgIC8qIERyaXZlcyBwb3NpdGlvbiAqLwogICAgZmRjdHJsLT5maWZvWzBdID0gZHJ2MChmZGN0cmwpLT50cmFjazsKICAgIGZkY3RybC0+Zmlmb1sxXSA9IGRydjEoZmRjdHJsKS0+dHJhY2s7CiNpZiBNQVhfRkQgPT0gNAogICAgZmRjdHJsLT5maWZvWzJdID0gZHJ2MihmZGN0cmwpLT50cmFjazsKICAgIGZkY3RybC0+Zmlmb1szXSA9IGRydjMoZmRjdHJsKS0+dHJhY2s7CiNlbHNlCiAgICBmZGN0cmwtPmZpZm9bMl0gPSAwOwogICAgZmRjdHJsLT5maWZvWzNdID0gMDsKI2VuZGlmCiAgICAvKiB0aW1lcnMgKi8KICAgIGZkY3RybC0+Zmlmb1s0XSA9IGZkY3RybC0+dGltZXIwOwogICAgZmRjdHJsLT5maWZvWzVdID0gKGZkY3RybC0+dGltZXIxIDw8IDEpIHwgKGZkY3RybC0+ZG9yICYgRkRfRE9SX0RNQUVOID8gMSA6IDApOwogICAgZmRjdHJsLT5maWZvWzZdID0gY3VyX2Rydi0+bGFzdF9zZWN0OwogICAgZmRjdHJsLT5maWZvWzddID0gKGZkY3RybC0+bG9jayA8PCA3KSB8CiAgICAgICAgKGN1cl9kcnYtPnBlcnBlbmRpY3VsYXIgPDwgMik7CiAgICBmZGN0cmwtPmZpZm9bOF0gPSBmZGN0cmwtPmNvbmZpZzsKICAgIGZkY3RybC0+Zmlmb1s5XSA9IGZkY3RybC0+cHJlY29tcF90cms7CiAgICBmZGN0cmxfc2V0X2ZpZm8oZmRjdHJsLCAxMCwgMCk7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfdmVyc2lvbihGREN0cmwgKmZkY3RybCwgaW50IGRpcmVjdGlvbikKewogICAgLyogQ29udHJvbGxlcidzIHZlcnNpb24gKi8KICAgIGZkY3RybC0+Zmlmb1swXSA9IGZkY3RybC0+dmVyc2lvbjsKICAgIGZkY3RybF9zZXRfZmlmbyhmZGN0cmwsIDEsIDEpOwp9CgpzdGF0aWMgdm9pZCBmZGN0cmxfaGFuZGxlX3BhcnRpZChGREN0cmwgKmZkY3RybCwgaW50IGRpcmVjdGlvbikKewogICAgZmRjdHJsLT5maWZvWzBdID0gMHg0MTsgLyogU3RlcHBpbmcgMSAqLwogICAgZmRjdHJsX3NldF9maWZvKGZkY3RybCwgMSwgMCk7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfcmVzdG9yZShGREN0cmwgKmZkY3RybCwgaW50IGRpcmVjdGlvbikKewogICAgRkRyaXZlICpjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKCiAgICAvKiBEcml2ZXMgcG9zaXRpb24gKi8KICAgIGRydjAoZmRjdHJsKS0+dHJhY2sgPSBmZGN0cmwtPmZpZm9bM107CiAgICBkcnYxKGZkY3RybCktPnRyYWNrID0gZmRjdHJsLT5maWZvWzRdOwojaWYgTUFYX0ZEID09IDQKICAgIGRydjIoZmRjdHJsKS0+dHJhY2sgPSBmZGN0cmwtPmZpZm9bNV07CiAgICBkcnYzKGZkY3RybCktPnRyYWNrID0gZmRjdHJsLT5maWZvWzZdOwojZW5kaWYKICAgIC8qIHRpbWVycyAqLwogICAgZmRjdHJsLT50aW1lcjAgPSBmZGN0cmwtPmZpZm9bN107CiAgICBmZGN0cmwtPnRpbWVyMSA9IGZkY3RybC0+Zmlmb1s4XTsKICAgIGN1cl9kcnYtPmxhc3Rfc2VjdCA9IGZkY3RybC0+Zmlmb1s5XTsKICAgIGZkY3RybC0+bG9jayA9IGZkY3RybC0+Zmlmb1sxMF0gPj4gNzsKICAgIGN1cl9kcnYtPnBlcnBlbmRpY3VsYXIgPSAoZmRjdHJsLT5maWZvWzEwXSA+PiAyKSAmIDB4RjsKICAgIGZkY3RybC0+Y29uZmlnID0gZmRjdHJsLT5maWZvWzExXTsKICAgIGZkY3RybC0+cHJlY29tcF90cmsgPSBmZGN0cmwtPmZpZm9bMTJdOwogICAgZmRjdHJsLT5wd3JkID0gZmRjdHJsLT5maWZvWzEzXTsKICAgIGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfc2F2ZShGREN0cmwgKmZkY3RybCwgaW50IGRpcmVjdGlvbikKewogICAgRkRyaXZlICpjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKCiAgICBmZGN0cmwtPmZpZm9bMF0gPSAwOwogICAgZmRjdHJsLT5maWZvWzFdID0gMDsKICAgIC8qIERyaXZlcyBwb3NpdGlvbiAqLwogICAgZmRjdHJsLT5maWZvWzJdID0gZHJ2MChmZGN0cmwpLT50cmFjazsKICAgIGZkY3RybC0+Zmlmb1szXSA9IGRydjEoZmRjdHJsKS0+dHJhY2s7CiNpZiBNQVhfRkQgPT0gNAogICAgZmRjdHJsLT5maWZvWzRdID0gZHJ2MihmZGN0cmwpLT50cmFjazsKICAgIGZkY3RybC0+Zmlmb1s1XSA9IGRydjMoZmRjdHJsKS0+dHJhY2s7CiNlbHNlCiAgICBmZGN0cmwtPmZpZm9bNF0gPSAwOwogICAgZmRjdHJsLT5maWZvWzVdID0gMDsKI2VuZGlmCiAgICAvKiB0aW1lcnMgKi8KICAgIGZkY3RybC0+Zmlmb1s2XSA9IGZkY3RybC0+dGltZXIwOwogICAgZmRjdHJsLT5maWZvWzddID0gZmRjdHJsLT50aW1lcjE7CiAgICBmZGN0cmwtPmZpZm9bOF0gPSBjdXJfZHJ2LT5sYXN0X3NlY3Q7CiAgICBmZGN0cmwtPmZpZm9bOV0gPSAoZmRjdHJsLT5sb2NrIDw8IDcpIHwKICAgICAgICAoY3VyX2Rydi0+cGVycGVuZGljdWxhciA8PCAyKTsKICAgIGZkY3RybC0+Zmlmb1sxMF0gPSBmZGN0cmwtPmNvbmZpZzsKICAgIGZkY3RybC0+Zmlmb1sxMV0gPSBmZGN0cmwtPnByZWNvbXBfdHJrOwogICAgZmRjdHJsLT5maWZvWzEyXSA9IGZkY3RybC0+cHdyZDsKICAgIGZkY3RybC0+Zmlmb1sxM10gPSAwOwogICAgZmRjdHJsLT5maWZvWzE0XSA9IDA7CiAgICBmZGN0cmxfc2V0X2ZpZm8oZmRjdHJsLCAxNSwgMSk7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfcmVhZGlkKEZEQ3RybCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQp7CiAgICBGRHJpdmUgKmN1cl9kcnYgPSBnZXRfY3VyX2RydihmZGN0cmwpOwoKICAgIC8qIFhYWDogc2hvdWxkIHNldCBtYWluIHN0YXR1cyByZWdpc3RlciB0byBidXN5ICovCiAgICBjdXJfZHJ2LT5oZWFkID0gKGZkY3RybC0+Zmlmb1sxXSA+PiAyKSAmIDE7CiAgICBxZW11X21vZF90aW1lcihmZGN0cmwtPnJlc3VsdF90aW1lciwKICAgICAgICAgICAgICAgICAgIHFlbXVfZ2V0X2Nsb2NrX25zKHZtX2Nsb2NrKSArIChnZXRfdGlja3NfcGVyX3NlYygpIC8gNTApKTsKfQoKc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV9mb3JtYXRfdHJhY2soRkRDdHJsICpmZGN0cmwsIGludCBkaXJlY3Rpb24pCnsKICAgIEZEcml2ZSAqY3VyX2RydjsKCiAgICBTRVRfQ1VSX0RSVihmZGN0cmwsIGZkY3RybC0+Zmlmb1sxXSAmIEZEX0RPUl9TRUxNQVNLKTsKICAgIGN1cl9kcnYgPSBnZXRfY3VyX2RydihmZGN0cmwpOwogICAgZmRjdHJsLT5kYXRhX3N0YXRlIHw9IEZEX1NUQVRFX0ZPUk1BVDsKICAgIGlmIChmZGN0cmwtPmZpZm9bMF0gJiAweDgwKQogICAgICAgIGZkY3RybC0+ZGF0YV9zdGF0ZSB8PSBGRF9TVEFURV9NVUxUSTsKICAgIGVsc2UKICAgICAgICBmZGN0cmwtPmRhdGFfc3RhdGUgJj0gfkZEX1NUQVRFX01VTFRJOwogICAgZmRjdHJsLT5kYXRhX3N0YXRlICY9IH5GRF9TVEFURV9TRUVLOwogICAgY3VyX2Rydi0+YnBzID0KICAgICAgICBmZGN0cmwtPmZpZm9bMl0gPiA3ID8gMTYzODQgOiAxMjggPDwgZmRjdHJsLT5maWZvWzJdOwojaWYgMAogICAgY3VyX2Rydi0+bGFzdF9zZWN0ID0KICAgICAgICBjdXJfZHJ2LT5mbGFncyAmIEZESVNLX0RCTF9TSURFUyA/IGZkY3RybC0+Zmlmb1szXSA6CiAgICAgICAgZmRjdHJsLT5maWZvWzNdIC8gMjsKI2Vsc2UKICAgIGN1cl9kcnYtPmxhc3Rfc2VjdCA9IGZkY3RybC0+Zmlmb1szXTsKI2VuZGlmCiAgICAvKiBUT0RPOiBpbXBsZW1lbnQgZm9ybWF0IHVzaW5nIERNQSBleHBlY3RlZCBieSB0aGUgQm9jaHMgQklPUwogICAgICogYW5kIExpbnV4IGZkZm9ybWF0IChyZWFkIDMgYnl0ZXMgcGVyIHNlY3RvciB2aWEgRE1BIGFuZCBmaWxsCiAgICAgKiB0aGUgc2VjdG9yIHdpdGggdGhlIHNwZWNpZmllZCBmaWxsIGJ5dGUKICAgICAqLwogICAgZmRjdHJsLT5kYXRhX3N0YXRlICY9IH5GRF9TVEFURV9GT1JNQVQ7CiAgICBmZGN0cmxfc3RvcF90cmFuc2ZlcihmZGN0cmwsIDB4MDAsIDB4MDAsIDB4MDApOwp9CgpzdGF0aWMgdm9pZCBmZGN0cmxfaGFuZGxlX3NwZWNpZnkoRkRDdHJsICpmZGN0cmwsIGludCBkaXJlY3Rpb24pCnsKICAgIGZkY3RybC0+dGltZXIwID0gKGZkY3RybC0+Zmlmb1sxXSA+PiA0KSAmIDB4RjsKICAgIGZkY3RybC0+dGltZXIxID0gZmRjdHJsLT5maWZvWzJdID4+IDE7CiAgICBpZiAoZmRjdHJsLT5maWZvWzJdICYgMSkKICAgICAgICBmZGN0cmwtPmRvciAmPSB+RkRfRE9SX0RNQUVOOwogICAgZWxzZQogICAgICAgIGZkY3RybC0+ZG9yIHw9IEZEX0RPUl9ETUFFTjsKICAgIC8qIE5vIHJlc3VsdCBiYWNrICovCiAgICBmZGN0cmxfcmVzZXRfZmlmbyhmZGN0cmwpOwp9CgpzdGF0aWMgdm9pZCBmZGN0cmxfaGFuZGxlX3NlbnNlX2RyaXZlX3N0YXR1cyhGREN0cmwgKmZkY3RybCwgaW50IGRpcmVjdGlvbikKewogICAgRkRyaXZlICpjdXJfZHJ2OwoKICAgIFNFVF9DVVJfRFJWKGZkY3RybCwgZmRjdHJsLT5maWZvWzFdICYgRkRfRE9SX1NFTE1BU0spOwogICAgY3VyX2RydiA9IGdldF9jdXJfZHJ2KGZkY3RybCk7CiAgICBjdXJfZHJ2LT5oZWFkID0gKGZkY3RybC0+Zmlmb1sxXSA+PiAyKSAmIDE7CiAgICAvKiAxIEJ5dGUgc3RhdHVzIGJhY2sgKi8KICAgIGZkY3RybC0+Zmlmb1swXSA9IChjdXJfZHJ2LT5ybyA8PCA2KSB8CiAgICAgICAgKGN1cl9kcnYtPnRyYWNrID09IDAgPyAweDEwIDogMHgwMCkgfAogICAgICAgIChjdXJfZHJ2LT5oZWFkIDw8IDIpIHwKICAgICAgICBHRVRfQ1VSX0RSVihmZGN0cmwpIHwKICAgICAgICAweDI4OwogICAgZmRjdHJsX3NldF9maWZvKGZkY3RybCwgMSwgMCk7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfcmVjYWxpYnJhdGUoRkRDdHJsICpmZGN0cmwsIGludCBkaXJlY3Rpb24pCnsKICAgIEZEcml2ZSAqY3VyX2RydjsKCiAgICBTRVRfQ1VSX0RSVihmZGN0cmwsIGZkY3RybC0+Zmlmb1sxXSAmIEZEX0RPUl9TRUxNQVNLKTsKICAgIGN1cl9kcnYgPSBnZXRfY3VyX2RydihmZGN0cmwpOwogICAgZmRfcmVjYWxpYnJhdGUoY3VyX2Rydik7CiAgICBmZGN0cmxfcmVzZXRfZmlmbyhmZGN0cmwpOwogICAgLyogUmFpc2UgSW50ZXJydXB0ICovCiAgICBmZGN0cmxfcmFpc2VfaXJxKGZkY3RybCwgRkRfU1IwX1NFRUspOwp9CgpzdGF0aWMgdm9pZCBmZGN0cmxfaGFuZGxlX3NlbnNlX2ludGVycnVwdF9zdGF0dXMoRkRDdHJsICpmZGN0cmwsIGludCBkaXJlY3Rpb24pCnsKICAgIEZEcml2ZSAqY3VyX2RydiA9IGdldF9jdXJfZHJ2KGZkY3RybCk7CgogICAgaWYoZmRjdHJsLT5yZXNldF9zZW5zZWkgPiAwKSB7CiAgICAgICAgZmRjdHJsLT5maWZvWzBdID0KICAgICAgICAgICAgRkRfU1IwX1JEWUNIRyArIEZEX1JFU0VUX1NFTlNFSV9DT1VOVCAtIGZkY3RybC0+cmVzZXRfc2Vuc2VpOwogICAgICAgIGZkY3RybC0+cmVzZXRfc2Vuc2VpLS07CiAgICB9IGVsc2UgewogICAgICAgIC8qIFhYWDogc3RhdHVzMCBoYW5kbGluZyBpcyBicm9rZW4gZm9yIHJlYWQvd3JpdGUKICAgICAgICAgICBjb21tYW5kcywgc28gd2UgZG8gdGhpcyBoYWNrLiBJdCBzaG91bGQgYmUgc3VwcHJlc3NlZAogICAgICAgICAgIEFTQVAgKi8KICAgICAgICBmZGN0cmwtPmZpZm9bMF0gPQogICAgICAgICAgICBGRF9TUjBfU0VFSyB8IChjdXJfZHJ2LT5oZWFkIDw8IDIpIHwgR0VUX0NVUl9EUlYoZmRjdHJsKTsKICAgIH0KCiAgICBmZGN0cmwtPmZpZm9bMV0gPSBjdXJfZHJ2LT50cmFjazsKICAgIGZkY3RybF9zZXRfZmlmbyhmZGN0cmwsIDIsIDApOwogICAgZmRjdHJsX3Jlc2V0X2lycShmZGN0cmwpOwogICAgZmRjdHJsLT5zdGF0dXMwID0gRkRfU1IwX1JEWUNIRzsKfQoKc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV9zZWVrKEZEQ3RybCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQp7CiAgICBGRHJpdmUgKmN1cl9kcnY7CgogICAgU0VUX0NVUl9EUlYoZmRjdHJsLCBmZGN0cmwtPmZpZm9bMV0gJiBGRF9ET1JfU0VMTUFTSyk7CiAgICBjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKICAgIGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7CiAgICBpZiAoZmRjdHJsLT5maWZvWzJdID4gY3VyX2Rydi0+bWF4X3RyYWNrKSB7CiAgICAgICAgZmRjdHJsX3JhaXNlX2lycShmZGN0cmwsIEZEX1NSMF9BQk5URVJNIHwgRkRfU1IwX1NFRUspOwogICAgfSBlbHNlIHsKICAgICAgICBjdXJfZHJ2LT50cmFjayA9IGZkY3RybC0+Zmlmb1syXTsKICAgICAgICAvKiBSYWlzZSBJbnRlcnJ1cHQgKi8KICAgICAgICBmZGN0cmxfcmFpc2VfaXJxKGZkY3RybCwgRkRfU1IwX1NFRUspOwogICAgfQp9CgpzdGF0aWMgdm9pZCBmZGN0cmxfaGFuZGxlX3BlcnBlbmRpY3VsYXJfbW9kZShGREN0cmwgKmZkY3RybCwgaW50IGRpcmVjdGlvbikKewogICAgRkRyaXZlICpjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKCiAgICBpZiAoZmRjdHJsLT5maWZvWzFdICYgMHg4MCkKICAgICAgICBjdXJfZHJ2LT5wZXJwZW5kaWN1bGFyID0gZmRjdHJsLT5maWZvWzFdICYgMHg3OwogICAgLyogTm8gcmVzdWx0IGJhY2sgKi8KICAgIGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfY29uZmlndXJlKEZEQ3RybCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQp7CiAgICBmZGN0cmwtPmNvbmZpZyA9IGZkY3RybC0+Zmlmb1syXTsKICAgIGZkY3RybC0+cHJlY29tcF90cmsgPSAgZmRjdHJsLT5maWZvWzNdOwogICAgLyogTm8gcmVzdWx0IGJhY2sgKi8KICAgIGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfcG93ZXJkb3duX21vZGUoRkRDdHJsICpmZGN0cmwsIGludCBkaXJlY3Rpb24pCnsKICAgIGZkY3RybC0+cHdyZCA9IGZkY3RybC0+Zmlmb1sxXTsKICAgIGZkY3RybC0+Zmlmb1swXSA9IGZkY3RybC0+Zmlmb1sxXTsKICAgIGZkY3RybF9zZXRfZmlmbyhmZGN0cmwsIDEsIDEpOwp9CgpzdGF0aWMgdm9pZCBmZGN0cmxfaGFuZGxlX29wdGlvbihGREN0cmwgKmZkY3RybCwgaW50IGRpcmVjdGlvbikKewogICAgLyogTm8gcmVzdWx0IGJhY2sgKi8KICAgIGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfZHJpdmVfc3BlY2lmaWNhdGlvbl9jb21tYW5kKEZEQ3RybCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQp7CiAgICBGRHJpdmUgKmN1cl9kcnYgPSBnZXRfY3VyX2RydihmZGN0cmwpOwoKICAgIGlmIChmZGN0cmwtPmZpZm9bZmRjdHJsLT5kYXRhX3BvcyAtIDFdICYgMHg4MCkgewogICAgICAgIC8qIENvbW1hbmQgcGFyYW1ldGVycyBkb25lICovCiAgICAgICAgaWYgKGZkY3RybC0+Zmlmb1tmZGN0cmwtPmRhdGFfcG9zIC0gMV0gJiAweDQwKSB7CiAgICAgICAgICAgIGZkY3RybC0+Zmlmb1swXSA9IGZkY3RybC0+Zmlmb1sxXTsKICAgICAgICAgICAgZmRjdHJsLT5maWZvWzJdID0gMDsKICAgICAgICAgICAgZmRjdHJsLT5maWZvWzNdID0gMDsKICAgICAgICAgICAgZmRjdHJsX3NldF9maWZvKGZkY3RybCwgNCwgMSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZmRjdHJsX3Jlc2V0X2ZpZm8oZmRjdHJsKTsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGZkY3RybC0+ZGF0YV9sZW4gPiA3KSB7CiAgICAgICAgLyogRVJST1IgKi8KICAgICAgICBmZGN0cmwtPmZpZm9bMF0gPSAweDgwIHwKICAgICAgICAgICAgKGN1cl9kcnYtPmhlYWQgPDwgMikgfCBHRVRfQ1VSX0RSVihmZGN0cmwpOwogICAgICAgIGZkY3RybF9zZXRfZmlmbyhmZGN0cmwsIDEsIDEpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBmZGN0cmxfaGFuZGxlX3JlbGF0aXZlX3NlZWtfb3V0KEZEQ3RybCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQp7CiAgICBGRHJpdmUgKmN1cl9kcnY7CgogICAgU0VUX0NVUl9EUlYoZmRjdHJsLCBmZGN0cmwtPmZpZm9bMV0gJiBGRF9ET1JfU0VMTUFTSyk7CiAgICBjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKICAgIGlmIChmZGN0cmwtPmZpZm9bMl0gKyBjdXJfZHJ2LT50cmFjayA+PSBjdXJfZHJ2LT5tYXhfdHJhY2spIHsKICAgICAgICBjdXJfZHJ2LT50cmFjayA9IGN1cl9kcnYtPm1heF90cmFjayAtIDE7CiAgICB9IGVsc2UgewogICAgICAgIGN1cl9kcnYtPnRyYWNrICs9IGZkY3RybC0+Zmlmb1syXTsKICAgIH0KICAgIGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7CiAgICAvKiBSYWlzZSBJbnRlcnJ1cHQgKi8KICAgIGZkY3RybF9yYWlzZV9pcnEoZmRjdHJsLCBGRF9TUjBfU0VFSyk7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfcmVsYXRpdmVfc2Vla19pbihGREN0cmwgKmZkY3RybCwgaW50IGRpcmVjdGlvbikKewogICAgRkRyaXZlICpjdXJfZHJ2OwoKICAgIFNFVF9DVVJfRFJWKGZkY3RybCwgZmRjdHJsLT5maWZvWzFdICYgRkRfRE9SX1NFTE1BU0spOwogICAgY3VyX2RydiA9IGdldF9jdXJfZHJ2KGZkY3RybCk7CiAgICBpZiAoZmRjdHJsLT5maWZvWzJdID4gY3VyX2Rydi0+dHJhY2spIHsKICAgICAgICBjdXJfZHJ2LT50cmFjayA9IDA7CiAgICB9IGVsc2UgewogICAgICAgIGN1cl9kcnYtPnRyYWNrIC09IGZkY3RybC0+Zmlmb1syXTsKICAgIH0KICAgIGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7CiAgICAvKiBSYWlzZSBJbnRlcnJ1cHQgKi8KICAgIGZkY3RybF9yYWlzZV9pcnEoZmRjdHJsLCBGRF9TUjBfU0VFSyk7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgewogICAgdWludDhfdCB2YWx1ZTsKICAgIHVpbnQ4X3QgbWFzazsKICAgIGNvbnN0IGNoYXIqIG5hbWU7CiAgICBpbnQgcGFyYW1ldGVyczsKICAgIHZvaWQgKCpoYW5kbGVyKShGREN0cmwgKmZkY3RybCwgaW50IGRpcmVjdGlvbik7CiAgICBpbnQgZGlyZWN0aW9uOwp9IGhhbmRsZXJzW10gPSB7CiAgICB7IEZEX0NNRF9SRUFELCAweDFmLCAiUkVBRCIsIDgsIGZkY3RybF9zdGFydF90cmFuc2ZlciwgRkRfRElSX1JFQUQgfSwKICAgIHsgRkRfQ01EX1dSSVRFLCAweDNmLCAiV1JJVEUiLCA4LCBmZGN0cmxfc3RhcnRfdHJhbnNmZXIsIEZEX0RJUl9XUklURSB9LAogICAgeyBGRF9DTURfU0VFSywgMHhmZiwgIlNFRUsiLCAyLCBmZGN0cmxfaGFuZGxlX3NlZWsgfSwKICAgIHsgRkRfQ01EX1NFTlNFX0lOVEVSUlVQVF9TVEFUVVMsIDB4ZmYsICJTRU5TRSBJTlRFUlJVUFQgU1RBVFVTIiwgMCwgZmRjdHJsX2hhbmRsZV9zZW5zZV9pbnRlcnJ1cHRfc3RhdHVzIH0sCiAgICB7IEZEX0NNRF9SRUNBTElCUkFURSwgMHhmZiwgIlJFQ0FMSUJSQVRFIiwgMSwgZmRjdHJsX2hhbmRsZV9yZWNhbGlicmF0ZSB9LAogICAgeyBGRF9DTURfRk9STUFUX1RSQUNLLCAweGJmLCAiRk9STUFUIFRSQUNLIiwgNSwgZmRjdHJsX2hhbmRsZV9mb3JtYXRfdHJhY2sgfSwKICAgIHsgRkRfQ01EX1JFQURfVFJBQ0ssIDB4YmYsICJSRUFEIFRSQUNLIiwgOCwgZmRjdHJsX3N0YXJ0X3RyYW5zZmVyLCBGRF9ESVJfUkVBRCB9LAogICAgeyBGRF9DTURfUkVTVE9SRSwgMHhmZiwgIlJFU1RPUkUiLCAxNywgZmRjdHJsX2hhbmRsZV9yZXN0b3JlIH0sIC8qIHBhcnQgb2YgUkVBRCBERUxFVEVEIERBVEEgKi8KICAgIHsgRkRfQ01EX1NBVkUsIDB4ZmYsICJTQVZFIiwgMCwgZmRjdHJsX2hhbmRsZV9zYXZlIH0sIC8qIHBhcnQgb2YgUkVBRCBERUxFVEVEIERBVEEgKi8KICAgIHsgRkRfQ01EX1JFQURfREVMRVRFRCwgMHgxZiwgIlJFQUQgREVMRVRFRCBEQVRBIiwgOCwgZmRjdHJsX3N0YXJ0X3RyYW5zZmVyX2RlbCwgRkRfRElSX1JFQUQgfSwKICAgIHsgRkRfQ01EX1NDQU5fRVFVQUwsIDB4MWYsICJTQ0FOIEVRVUFMIiwgOCwgZmRjdHJsX3N0YXJ0X3RyYW5zZmVyLCBGRF9ESVJfU0NBTkUgfSwKICAgIHsgRkRfQ01EX1ZFUklGWSwgMHgxZiwgIlZFUklGWSIsIDgsIGZkY3RybF91bmltcGxlbWVudGVkIH0sCiAgICB7IEZEX0NNRF9TQ0FOX0xPV19PUl9FUVVBTCwgMHgxZiwgIlNDQU4gTE9XIE9SIEVRVUFMIiwgOCwgZmRjdHJsX3N0YXJ0X3RyYW5zZmVyLCBGRF9ESVJfU0NBTkwgfSwKICAgIHsgRkRfQ01EX1NDQU5fSElHSF9PUl9FUVVBTCwgMHgxZiwgIlNDQU4gSElHSCBPUiBFUVVBTCIsIDgsIGZkY3RybF9zdGFydF90cmFuc2ZlciwgRkRfRElSX1NDQU5IIH0sCiAgICB7IEZEX0NNRF9XUklURV9ERUxFVEVELCAweDNmLCAiV1JJVEUgREVMRVRFRCBEQVRBIiwgOCwgZmRjdHJsX3N0YXJ0X3RyYW5zZmVyX2RlbCwgRkRfRElSX1dSSVRFIH0sCiAgICB7IEZEX0NNRF9SRUFEX0lELCAweGJmLCAiUkVBRCBJRCIsIDEsIGZkY3RybF9oYW5kbGVfcmVhZGlkIH0sCiAgICB7IEZEX0NNRF9TUEVDSUZZLCAweGZmLCAiU1BFQ0lGWSIsIDIsIGZkY3RybF9oYW5kbGVfc3BlY2lmeSB9LAogICAgeyBGRF9DTURfU0VOU0VfRFJJVkVfU1RBVFVTLCAweGZmLCAiU0VOU0UgRFJJVkUgU1RBVFVTIiwgMSwgZmRjdHJsX2hhbmRsZV9zZW5zZV9kcml2ZV9zdGF0dXMgfSwKICAgIHsgRkRfQ01EX1BFUlBFTkRJQ1VMQVJfTU9ERSwgMHhmZiwgIlBFUlBFTkRJQ1VMQVIgTU9ERSIsIDEsIGZkY3RybF9oYW5kbGVfcGVycGVuZGljdWxhcl9tb2RlIH0sCiAgICB7IEZEX0NNRF9DT05GSUdVUkUsIDB4ZmYsICJDT05GSUdVUkUiLCAzLCBmZGN0cmxfaGFuZGxlX2NvbmZpZ3VyZSB9LAogICAgeyBGRF9DTURfUE9XRVJET1dOX01PREUsIDB4ZmYsICJQT1dFUkRPV04gTU9ERSIsIDIsIGZkY3RybF9oYW5kbGVfcG93ZXJkb3duX21vZGUgfSwKICAgIHsgRkRfQ01EX09QVElPTiwgMHhmZiwgIk9QVElPTiIsIDEsIGZkY3RybF9oYW5kbGVfb3B0aW9uIH0sCiAgICB7IEZEX0NNRF9EUklWRV9TUEVDSUZJQ0FUSU9OX0NPTU1BTkQsIDB4ZmYsICJEUklWRSBTUEVDSUZJQ0FUSU9OIENPTU1BTkQiLCA1LCBmZGN0cmxfaGFuZGxlX2RyaXZlX3NwZWNpZmljYXRpb25fY29tbWFuZCB9LAogICAgeyBGRF9DTURfUkVMQVRJVkVfU0VFS19PVVQsIDB4ZmYsICJSRUxBVElWRSBTRUVLIE9VVCIsIDIsIGZkY3RybF9oYW5kbGVfcmVsYXRpdmVfc2Vla19vdXQgfSwKICAgIHsgRkRfQ01EX0ZPUk1BVF9BTkRfV1JJVEUsIDB4ZmYsICJGT1JNQVQgQU5EIFdSSVRFIiwgMTAsIGZkY3RybF91bmltcGxlbWVudGVkIH0sCiAgICB7IEZEX0NNRF9SRUxBVElWRV9TRUVLX0lOLCAweGZmLCAiUkVMQVRJVkUgU0VFSyBJTiIsIDIsIGZkY3RybF9oYW5kbGVfcmVsYXRpdmVfc2Vla19pbiB9LAogICAgeyBGRF9DTURfTE9DSywgMHg3ZiwgIkxPQ0siLCAwLCBmZGN0cmxfaGFuZGxlX2xvY2sgfSwKICAgIHsgRkRfQ01EX0RVTVBSRUcsIDB4ZmYsICJEVU1QUkVHIiwgMCwgZmRjdHJsX2hhbmRsZV9kdW1wcmVnIH0sCiAgICB7IEZEX0NNRF9WRVJTSU9OLCAweGZmLCAiVkVSU0lPTiIsIDAsIGZkY3RybF9oYW5kbGVfdmVyc2lvbiB9LAogICAgeyBGRF9DTURfUEFSVF9JRCwgMHhmZiwgIlBBUlQgSUQiLCAwLCBmZGN0cmxfaGFuZGxlX3BhcnRpZCB9LAogICAgeyBGRF9DTURfV1JJVEUsIDB4MWYsICJXUklURSAoQmVPUykiLCA4LCBmZGN0cmxfc3RhcnRfdHJhbnNmZXIsIEZEX0RJUl9XUklURSB9LCAvKiBub3QgaW4gc3BlY2lmaWNhdGlvbiA7IEJlT1MgNC41IGJ1ZyAqLwogICAgeyAwLCAwLCAidW5rbm93biIsIDAsIGZkY3RybF91bmltcGxlbWVudGVkIH0sIC8qIGRlZmF1bHQgaGFuZGxlciAqLwp9OwovKiBBc3NvY2lhdGUgY29tbWFuZCB0byBhbiBpbmRleCBpbiB0aGUgJ2hhbmRsZXJzJyBhcnJheSAqLwpzdGF0aWMgdWludDhfdCBjb21tYW5kX3RvX2hhbmRsZXJbMjU2XTsKCnN0YXRpYyB2b2lkIGZkY3RybF93cml0ZV9kYXRhKEZEQ3RybCAqZmRjdHJsLCB1aW50MzJfdCB2YWx1ZSkKewogICAgRkRyaXZlICpjdXJfZHJ2OwogICAgaW50IHBvczsKCiAgICAvKiBSZXNldCBtb2RlICovCiAgICBpZiAoIShmZGN0cmwtPmRvciAmIEZEX0RPUl9uUkVTRVQpKSB7CiAgICAgICAgRkxPUFBZX0RQUklOVEYoIkZsb3BweSBjb250cm9sbGVyIGluIFJFU0VUIHN0YXRlICFcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghKGZkY3RybC0+bXNyICYgRkRfTVNSX1JRTSkgfHwgKGZkY3RybC0+bXNyICYgRkRfTVNSX0RJTykpIHsKICAgICAgICBGTE9QUFlfRVJST1IoImNvbnRyb2xsZXIgbm90IHJlYWR5IGZvciB3cml0aW5nXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBmZGN0cmwtPmRzciAmPSB+RkRfRFNSX1BXUkRPV047CiAgICAvKiBJcyBpdCB3cml0ZSBjb21tYW5kIHRpbWUgPyAqLwogICAgaWYgKGZkY3RybC0+bXNyICYgRkRfTVNSX05PTkRNQSkgewogICAgICAgIC8qIEZJRk8gZGF0YSB3cml0ZSAqLwogICAgICAgIHBvcyA9IGZkY3RybC0+ZGF0YV9wb3MrKzsKICAgICAgICBwb3MgJT0gRkRfU0VDVE9SX0xFTjsKICAgICAgICBmZGN0cmwtPmZpZm9bcG9zXSA9IHZhbHVlOwogICAgICAgIGlmIChwb3MgPT0gRkRfU0VDVE9SX0xFTiAtIDEgfHwKICAgICAgICAgICAgZmRjdHJsLT5kYXRhX3BvcyA9PSBmZGN0cmwtPmRhdGFfbGVuKSB7CiAgICAgICAgICAgIGN1cl9kcnYgPSBnZXRfY3VyX2RydihmZGN0cmwpOwogICAgICAgICAgICBpZiAoYmRydl93cml0ZShjdXJfZHJ2LT5icywgZmRfc2VjdG9yKGN1cl9kcnYpLCBmZGN0cmwtPmZpZm8sIDEpIDwgMCkgewogICAgICAgICAgICAgICAgRkxPUFBZX0VSUk9SKCJ3cml0aW5nIHNlY3RvciAlZFxuIiwgZmRfc2VjdG9yKGN1cl9kcnYpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWZkY3RybF9zZWVrX3RvX25leHRfc2VjdChmZGN0cmwsIGN1cl9kcnYpKSB7CiAgICAgICAgICAgICAgICBGTE9QUFlfRFBSSU5URigiZXJyb3Igc2Vla2luZyB0byBuZXh0IHNlY3RvciAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkX3NlY3RvcihjdXJfZHJ2KSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyogU3dpdGNoIGZyb20gdHJhbnNmZXIgbW9kZSB0byBzdGF0dXMgbW9kZQogICAgICAgICAqIHRoZW4gZnJvbSBzdGF0dXMgbW9kZSB0byBjb21tYW5kIG1vZGUKICAgICAgICAgKi8KICAgICAgICBpZiAoZmRjdHJsLT5kYXRhX3BvcyA9PSBmZGN0cmwtPmRhdGFfbGVuKQogICAgICAgICAgICBmZGN0cmxfc3RvcF90cmFuc2ZlcihmZGN0cmwsIEZEX1NSMF9TRUVLLCAweDAwLCAweDAwKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZmRjdHJsLT5kYXRhX3BvcyA9PSAwKSB7CiAgICAgICAgLyogQ29tbWFuZCAqLwogICAgICAgIHBvcyA9IGNvbW1hbmRfdG9faGFuZGxlclt2YWx1ZSAmIDB4ZmZdOwogICAgICAgIEZMT1BQWV9EUFJJTlRGKCIlcyBjb21tYW5kXG4iLCBoYW5kbGVyc1twb3NdLm5hbWUpOwogICAgICAgIGZkY3RybC0+ZGF0YV9sZW4gPSBoYW5kbGVyc1twb3NdLnBhcmFtZXRlcnMgKyAxOwogICAgfQoKICAgIEZMT1BQWV9EUFJJTlRGKCIlczogJTAyeFxuIiwgX19mdW5jX18sIHZhbHVlKTsKICAgIGZkY3RybC0+Zmlmb1tmZGN0cmwtPmRhdGFfcG9zKytdID0gdmFsdWU7CiAgICBpZiAoZmRjdHJsLT5kYXRhX3BvcyA9PSBmZGN0cmwtPmRhdGFfbGVuKSB7CiAgICAgICAgLyogV2Ugbm93IGhhdmUgYWxsIHBhcmFtZXRlcnMKICAgICAgICAgKiBhbmQgd2lsbCBiZSBhYmxlIHRvIHRyZWF0IHRoZSBjb21tYW5kCiAgICAgICAgICovCiAgICAgICAgaWYgKGZkY3RybC0+ZGF0YV9zdGF0ZSAmIEZEX1NUQVRFX0ZPUk1BVCkgewogICAgICAgICAgICBmZGN0cmxfZm9ybWF0X3NlY3RvcihmZGN0cmwpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBwb3MgPSBjb21tYW5kX3RvX2hhbmRsZXJbZmRjdHJsLT5maWZvWzBdICYgMHhmZl07CiAgICAgICAgRkxPUFBZX0RQUklOVEYoInRyZWF0ICVzIGNvbW1hbmRcbiIsIGhhbmRsZXJzW3Bvc10ubmFtZSk7CiAgICAgICAgKCpoYW5kbGVyc1twb3NdLmhhbmRsZXIpKGZkY3RybCwgaGFuZGxlcnNbcG9zXS5kaXJlY3Rpb24pOwogICAgfQp9CgpzdGF0aWMgdm9pZCBmZGN0cmxfcmVzdWx0X3RpbWVyKHZvaWQgKm9wYXF1ZSkKewogICAgRkRDdHJsICpmZGN0cmwgPSBvcGFxdWU7CiAgICBGRHJpdmUgKmN1cl9kcnYgPSBnZXRfY3VyX2RydihmZGN0cmwpOwoKICAgIC8qIFByZXRlbmQgd2UgYXJlIHNwaW5uaW5nLgogICAgICogVGhpcyBpcyBuZWVkZWQgZm9yIENvaGVyZW50LCB3aGljaCB1c2VzIFJFQUQgSUQgdG8gY2hlY2sgZm9yCiAgICAgKiBzZWN0b3IgaW50ZXJsZWF2aW5nLgogICAgICovCiAgICBpZiAoY3VyX2Rydi0+bGFzdF9zZWN0ICE9IDApIHsKICAgICAgICBjdXJfZHJ2LT5zZWN0ID0gKGN1cl9kcnYtPnNlY3QgJSBjdXJfZHJ2LT5sYXN0X3NlY3QpICsgMTsKICAgIH0KICAgIGZkY3RybF9zdG9wX3RyYW5zZmVyKGZkY3RybCwgMHgwMCwgMHgwMCwgMHgwMCk7Cn0KCi8qIEluaXQgZnVuY3Rpb25zICovCnN0YXRpYyBpbnQgZmRjdHJsX2Nvbm5lY3RfZHJpdmVzKEZEQ3RybCAqZmRjdHJsKQp7CiAgICB1bnNpZ25lZCBpbnQgaTsKICAgIEZEcml2ZSAqZHJpdmU7CgogICAgZm9yIChpID0gMDsgaSA8IE1BWF9GRDsgaSsrKSB7CiAgICAgICAgZHJpdmUgPSAmZmRjdHJsLT5kcml2ZXNbaV07CgogICAgICAgIGlmIChkcml2ZS0+YnMpIHsKICAgICAgICAgICAgaWYgKGJkcnZfZ2V0X29uX2Vycm9yKGRyaXZlLT5icywgMCkgIT0gQkxPQ0tfRVJSX1NUT1BfRU5PU1BDKSB7CiAgICAgICAgICAgICAgICBlcnJvcl9yZXBvcnQoImZkYyBkb2Vzbid0IHN1cHBvcnQgZHJpdmUgb3B0aW9uIHdlcnJvciIpOwogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiZHJ2X2dldF9vbl9lcnJvcihkcml2ZS0+YnMsIDEpICE9IEJMT0NLX0VSUl9SRVBPUlQpIHsKICAgICAgICAgICAgICAgIGVycm9yX3JlcG9ydCgiZmRjIGRvZXNuJ3Qgc3VwcG9ydCBkcml2ZSBvcHRpb24gcmVycm9yIik7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZkX2luaXQoZHJpdmUpOwogICAgICAgIGZkX3JldmFsaWRhdGUoZHJpdmUpOwogICAgICAgIGlmIChkcml2ZS0+YnMpIHsKICAgICAgICAgICAgYmRydl9zZXRfcmVtb3ZhYmxlKGRyaXZlLT5icywgMSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0KCnZvaWQgZmRjdHJsX2luaXRfc3lzYnVzKHFlbXVfaXJxIGlycSwgaW50IGRtYV9jaGFubiwKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3BoeXNfYWRkcl90IG1taW9fYmFzZSwgRHJpdmVJbmZvICoqZmRzKQp7CiAgICBGREN0cmwgKmZkY3RybDsKICAgIERldmljZVN0YXRlICpkZXY7CiAgICBGREN0cmxTeXNCdXMgKnN5czsKCiAgICBkZXYgPSBxZGV2X2NyZWF0ZShOVUxMLCAic3lzYnVzLWZkYyIpOwogICAgc3lzID0gRE9fVVBDQVNUKEZEQ3RybFN5c0J1cywgYnVzZGV2LnFkZXYsIGRldik7CiAgICBmZGN0cmwgPSAmc3lzLT5zdGF0ZTsKICAgIGZkY3RybC0+ZG1hX2NoYW5uID0gZG1hX2NoYW5uOyAvKiBGSVhNRSAqLwogICAgaWYgKGZkc1swXSkgewogICAgICAgIHFkZXZfcHJvcF9zZXRfZHJpdmVfbm9mYWlsKGRldiwgImRyaXZlQSIsIGZkc1swXS0+YmRydik7CiAgICB9CiAgICBpZiAoZmRzWzFdKSB7CiAgICAgICAgcWRldl9wcm9wX3NldF9kcml2ZV9ub2ZhaWwoZGV2LCAiZHJpdmVCIiwgZmRzWzFdLT5iZHJ2KTsKICAgIH0KICAgIHFkZXZfaW5pdF9ub2ZhaWwoZGV2KTsKICAgIHN5c2J1c19jb25uZWN0X2lycSgmc3lzLT5idXNkZXYsIDAsIGlycSk7CiAgICBzeXNidXNfbW1pb19tYXAoJnN5cy0+YnVzZGV2LCAwLCBtbWlvX2Jhc2UpOwp9Cgp2b2lkIHN1bjRtX2ZkY3RybF9pbml0KHFlbXVfaXJxIGlycSwgdGFyZ2V0X3BoeXNfYWRkcl90IGlvX2Jhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVJbmZvICoqZmRzLCBxZW11X2lycSAqZmRjX3RjKQp7CiAgICBEZXZpY2VTdGF0ZSAqZGV2OwogICAgRkRDdHJsU3lzQnVzICpzeXM7CgogICAgZGV2ID0gcWRldl9jcmVhdGUoTlVMTCwgIlNVTlcsZmR0d28iKTsKICAgIGlmIChmZHNbMF0pIHsKICAgICAgICBxZGV2X3Byb3Bfc2V0X2RyaXZlX25vZmFpbChkZXYsICJkcml2ZSIsIGZkc1swXS0+YmRydik7CiAgICB9CiAgICBxZGV2X2luaXRfbm9mYWlsKGRldik7CiAgICBzeXMgPSBET19VUENBU1QoRkRDdHJsU3lzQnVzLCBidXNkZXYucWRldiwgZGV2KTsKICAgIHN5c2J1c19jb25uZWN0X2lycSgmc3lzLT5idXNkZXYsIDAsIGlycSk7CiAgICBzeXNidXNfbW1pb19tYXAoJnN5cy0+YnVzZGV2LCAwLCBpb19iYXNlKTsKICAgICpmZGNfdGMgPSBxZGV2X2dldF9ncGlvX2luKGRldiwgMCk7Cn0KCnN0YXRpYyBpbnQgZmRjdHJsX2luaXRfY29tbW9uKEZEQ3RybCAqZmRjdHJsKQp7CiAgICBpbnQgaSwgajsKICAgIHN0YXRpYyBpbnQgY29tbWFuZF90YWJsZXNfaW5pdGVkID0gMDsKCiAgICAvKiBGaWxsICdjb21tYW5kX3RvX2hhbmRsZXInIGxvb2t1cCB0YWJsZSAqLwogICAgaWYgKCFjb21tYW5kX3RhYmxlc19pbml0ZWQpIHsKICAgICAgICBjb21tYW5kX3RhYmxlc19pbml0ZWQgPSAxOwogICAgICAgIGZvciAoaSA9IEFSUkFZX1NJWkUoaGFuZGxlcnMpIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemVvZihjb21tYW5kX3RvX2hhbmRsZXIpOyBqKyspIHsKICAgICAgICAgICAgICAgIGlmICgoaiAmIGhhbmRsZXJzW2ldLm1hc2spID09IGhhbmRsZXJzW2ldLnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgY29tbWFuZF90b19oYW5kbGVyW2pdID0gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBGTE9QUFlfRFBSSU5URigiaW5pdCBjb250cm9sbGVyXG4iKTsKICAgIGZkY3RybC0+ZmlmbyA9IHFlbXVfbWVtYWxpZ24oNTEyLCBGRF9TRUNUT1JfTEVOKTsKICAgIGZkY3RybC0+Zmlmb19zaXplID0gNTEyOwogICAgZmRjdHJsLT5yZXN1bHRfdGltZXIgPSBxZW11X25ld190aW1lcl9ucyh2bV9jbG9jaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRjdHJsX3Jlc3VsdF90aW1lciwgZmRjdHJsKTsKCiAgICBmZGN0cmwtPnZlcnNpb24gPSAweDkwOyAvKiBJbnRlbCA4MjA3OCBjb250cm9sbGVyICovCiAgICBmZGN0cmwtPmNvbmZpZyA9IEZEX0NPTkZJR19FSVMgfCBGRF9DT05GSUdfRUZJRk87IC8qIEltcGxpY2l0IHNlZWssIHBvbGxpbmcgJiBGSUZPIGVuYWJsZWQgKi8KICAgIGZkY3RybC0+bnVtX2Zsb3BwaWVzID0gTUFYX0ZEOwoKICAgIGlmIChmZGN0cmwtPmRtYV9jaGFubiAhPSAtMSkKICAgICAgICBETUFfcmVnaXN0ZXJfY2hhbm5lbChmZGN0cmwtPmRtYV9jaGFubiwgJmZkY3RybF90cmFuc2Zlcl9oYW5kbGVyLCBmZGN0cmwpOwogICAgcmV0dXJuIGZkY3RybF9jb25uZWN0X2RyaXZlcyhmZGN0cmwpOwp9CgpzdGF0aWMgaW50IGlzYWJ1c19mZGNfaW5pdDEoSVNBRGV2aWNlICpkZXYpCnsKICAgIEZEQ3RybElTQUJ1cyAqaXNhID0gRE9fVVBDQVNUKEZEQ3RybElTQUJ1cywgYnVzZGV2LCBkZXYpOwogICAgRkRDdHJsICpmZGN0cmwgPSAmaXNhLT5zdGF0ZTsKICAgIGludCBpb2Jhc2UgPSAweDNmMDsKICAgIGludCBpc2FpcnEgPSA2OwogICAgaW50IGRtYV9jaGFubiA9IDI7CiAgICBpbnQgcmV0OwoKICAgIHJlZ2lzdGVyX2lvcG9ydF9yZWFkKGlvYmFzZSArIDB4MDEsIDUsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAmZmRjdHJsX3JlYWRfcG9ydCwgZmRjdHJsKTsKICAgIHJlZ2lzdGVyX2lvcG9ydF9yZWFkKGlvYmFzZSArIDB4MDcsIDEsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAmZmRjdHJsX3JlYWRfcG9ydCwgZmRjdHJsKTsKICAgIHJlZ2lzdGVyX2lvcG9ydF93cml0ZShpb2Jhc2UgKyAweDAxLCA1LCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICZmZGN0cmxfd3JpdGVfcG9ydCwgZmRjdHJsKTsKICAgIHJlZ2lzdGVyX2lvcG9ydF93cml0ZShpb2Jhc2UgKyAweDA3LCAxLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICZmZGN0cmxfd3JpdGVfcG9ydCwgZmRjdHJsKTsKICAgIGlzYV9pbml0X2lvcG9ydF9yYW5nZShkZXYsIGlvYmFzZSwgNik7CiAgICBpc2FfaW5pdF9pb3BvcnQoZGV2LCBpb2Jhc2UgKyA3KTsKCiAgICBpc2FfaW5pdF9pcnEoJmlzYS0+YnVzZGV2LCAmZmRjdHJsLT5pcnEsIGlzYWlycSk7CiAgICBmZGN0cmwtPmRtYV9jaGFubiA9IGRtYV9jaGFubjsKCiAgICBxZGV2X3NldF9sZWdhY3lfaW5zdGFuY2VfaWQoJmRldi0+cWRldiwgaW9iYXNlLCAyKTsKICAgIHJldCA9IGZkY3RybF9pbml0X2NvbW1vbihmZGN0cmwpOwoKICAgIGFkZF9ib290X2RldmljZV9wYXRoKGlzYS0+Ym9vdGluZGV4QSwgJmRldi0+cWRldiwgIi9mbG9wcHlAMCIpOwogICAgYWRkX2Jvb3RfZGV2aWNlX3BhdGgoaXNhLT5ib290aW5kZXhCLCAmZGV2LT5xZGV2LCAiL2Zsb3BweUAxIik7CgogICAgcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCBzeXNidXNfZmRjX2luaXQxKFN5c0J1c0RldmljZSAqZGV2KQp7CiAgICBGREN0cmxTeXNCdXMgKnN5cyA9IERPX1VQQ0FTVChGREN0cmxTeXNCdXMsIGJ1c2RldiwgZGV2KTsKICAgIEZEQ3RybCAqZmRjdHJsID0gJnN5cy0+c3RhdGU7CiAgICBpbnQgaW87CiAgICBpbnQgcmV0OwoKICAgIGlvID0gY3B1X3JlZ2lzdGVyX2lvX21lbW9yeShmZGN0cmxfbWVtX3JlYWQsIGZkY3RybF9tZW1fd3JpdGUsIGZkY3RybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVZJQ0VfTkFUSVZFX0VORElBTik7CiAgICBzeXNidXNfaW5pdF9tbWlvKGRldiwgMHgwOCwgaW8pOwogICAgc3lzYnVzX2luaXRfaXJxKGRldiwgJmZkY3RybC0+aXJxKTsKICAgIHFkZXZfaW5pdF9ncGlvX2luKCZkZXYtPnFkZXYsIGZkY3RybF9oYW5kbGVfdGMsIDEpOwogICAgZmRjdHJsLT5kbWFfY2hhbm4gPSAtMTsKCiAgICBxZGV2X3NldF9sZWdhY3lfaW5zdGFuY2VfaWQoJmRldi0+cWRldiwgaW8sIDIpOwogICAgcmV0ID0gZmRjdHJsX2luaXRfY29tbW9uKGZkY3RybCk7CgogICAgcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCBzdW40bV9mZGNfaW5pdDEoU3lzQnVzRGV2aWNlICpkZXYpCnsKICAgIEZEQ3RybCAqZmRjdHJsID0gJihGUk9NX1NZU0JVUyhGREN0cmxTeXNCdXMsIGRldiktPnN0YXRlKTsKICAgIGludCBpbzsKCiAgICBpbyA9IGNwdV9yZWdpc3Rlcl9pb19tZW1vcnkoZmRjdHJsX21lbV9yZWFkX3N0cmljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZGN0cmxfbWVtX3dyaXRlX3N0cmljdCwgZmRjdHJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVklDRV9OQVRJVkVfRU5ESUFOKTsKICAgIHN5c2J1c19pbml0X21taW8oZGV2LCAweDA4LCBpbyk7CiAgICBzeXNidXNfaW5pdF9pcnEoZGV2LCAmZmRjdHJsLT5pcnEpOwogICAgcWRldl9pbml0X2dwaW9faW4oJmRldi0+cWRldiwgZmRjdHJsX2hhbmRsZV90YywgMSk7CgogICAgZmRjdHJsLT5zdW40bSA9IDE7CiAgICBxZGV2X3NldF9sZWdhY3lfaW5zdGFuY2VfaWQoJmRldi0+cWRldiwgaW8sIDIpOwogICAgcmV0dXJuIGZkY3RybF9pbml0X2NvbW1vbihmZGN0cmwpOwp9CgpzdGF0aWMgY29uc3QgVk1TdGF0ZURlc2NyaXB0aW9uIHZtc3RhdGVfaXNhX2ZkYyA9ewogICAgLm5hbWUgPSAiZmRjIiwKICAgIC52ZXJzaW9uX2lkID0gMiwKICAgIC5taW5pbXVtX3ZlcnNpb25faWQgPSAyLAogICAgLmZpZWxkcyA9IChWTVN0YXRlRmllbGQgW10pIHsKICAgICAgICBWTVNUQVRFX1NUUlVDVChzdGF0ZSwgRkRDdHJsSVNBQnVzLCAwLCB2bXN0YXRlX2ZkYywgRkRDdHJsKSwKICAgICAgICBWTVNUQVRFX0VORF9PRl9MSVNUKCkKICAgIH0KfTsKCnN0YXRpYyBJU0FEZXZpY2VJbmZvIGlzYV9mZGNfaW5mbyA9IHsKICAgIC5pbml0ID0gaXNhYnVzX2ZkY19pbml0MSwKICAgIC5xZGV2Lm5hbWUgID0gImlzYS1mZGMiLAogICAgLnFkZXYuZndfbmFtZSAgPSAiZmRjIiwKICAgIC5xZGV2LnNpemUgID0gc2l6ZW9mKEZEQ3RybElTQUJ1cyksCiAgICAucWRldi5ub191c2VyID0gMSwKICAgIC5xZGV2LnZtc2QgID0gJnZtc3RhdGVfaXNhX2ZkYywKICAgIC5xZGV2LnJlc2V0ID0gZmRjdHJsX2V4dGVybmFsX3Jlc2V0X2lzYSwKICAgIC5xZGV2LnByb3BzID0gKFByb3BlcnR5W10pIHsKICAgICAgICBERUZJTkVfUFJPUF9EUklWRSgiZHJpdmVBIiwgRkRDdHJsSVNBQnVzLCBzdGF0ZS5kcml2ZXNbMF0uYnMpLAogICAgICAgIERFRklORV9QUk9QX0RSSVZFKCJkcml2ZUIiLCBGREN0cmxJU0FCdXMsIHN0YXRlLmRyaXZlc1sxXS5icyksCiAgICAgICAgREVGSU5FX1BST1BfSU5UMzIoImJvb3RpbmRleEEiLCBGREN0cmxJU0FCdXMsIGJvb3RpbmRleEEsIC0xKSwKICAgICAgICBERUZJTkVfUFJPUF9JTlQzMigiYm9vdGluZGV4QiIsIEZEQ3RybElTQUJ1cywgYm9vdGluZGV4QiwgLTEpLAogICAgICAgIERFRklORV9QUk9QX0VORF9PRl9MSVNUKCksCiAgICB9LAp9OwoKc3RhdGljIGNvbnN0IFZNU3RhdGVEZXNjcmlwdGlvbiB2bXN0YXRlX3N5c2J1c19mZGMgPXsKICAgIC5uYW1lID0gImZkYyIsCiAgICAudmVyc2lvbl9pZCA9IDIsCiAgICAubWluaW11bV92ZXJzaW9uX2lkID0gMiwKICAgIC5maWVsZHMgPSAoVk1TdGF0ZUZpZWxkIFtdKSB7CiAgICAgICAgVk1TVEFURV9TVFJVQ1Qoc3RhdGUsIEZEQ3RybFN5c0J1cywgMCwgdm1zdGF0ZV9mZGMsIEZEQ3RybCksCiAgICAgICAgVk1TVEFURV9FTkRfT0ZfTElTVCgpCiAgICB9Cn07CgpzdGF0aWMgU3lzQnVzRGV2aWNlSW5mbyBzeXNidXNfZmRjX2luZm8gPSB7CiAgICAuaW5pdCA9IHN5c2J1c19mZGNfaW5pdDEsCiAgICAucWRldi5uYW1lICA9ICJzeXNidXMtZmRjIiwKICAgIC5xZGV2LnNpemUgID0gc2l6ZW9mKEZEQ3RybFN5c0J1cyksCiAgICAucWRldi52bXNkICA9ICZ2bXN0YXRlX3N5c2J1c19mZGMsCiAgICAucWRldi5yZXNldCA9IGZkY3RybF9leHRlcm5hbF9yZXNldF9zeXNidXMsCiAgICAucWRldi5wcm9wcyA9IChQcm9wZXJ0eVtdKSB7CiAgICAgICAgREVGSU5FX1BST1BfRFJJVkUoImRyaXZlQSIsIEZEQ3RybFN5c0J1cywgc3RhdGUuZHJpdmVzWzBdLmJzKSwKICAgICAgICBERUZJTkVfUFJPUF9EUklWRSgiZHJpdmVCIiwgRkRDdHJsU3lzQnVzLCBzdGF0ZS5kcml2ZXNbMV0uYnMpLAogICAgICAgIERFRklORV9QUk9QX0VORF9PRl9MSVNUKCksCiAgICB9LAp9OwoKc3RhdGljIFN5c0J1c0RldmljZUluZm8gc3VuNG1fZmRjX2luZm8gPSB7CiAgICAuaW5pdCA9IHN1bjRtX2ZkY19pbml0MSwKICAgIC5xZGV2Lm5hbWUgID0gIlNVTlcsZmR0d28iLAogICAgLnFkZXYuc2l6ZSAgPSBzaXplb2YoRkRDdHJsU3lzQnVzKSwKICAgIC5xZGV2LnZtc2QgID0gJnZtc3RhdGVfc3lzYnVzX2ZkYywKICAgIC5xZGV2LnJlc2V0ID0gZmRjdHJsX2V4dGVybmFsX3Jlc2V0X3N5c2J1cywKICAgIC5xZGV2LnByb3BzID0gKFByb3BlcnR5W10pIHsKICAgICAgICBERUZJTkVfUFJPUF9EUklWRSgiZHJpdmUiLCBGREN0cmxTeXNCdXMsIHN0YXRlLmRyaXZlc1swXS5icyksCiAgICAgICAgREVGSU5FX1BST1BfRU5EX09GX0xJU1QoKSwKICAgIH0sCn07CgpzdGF0aWMgdm9pZCBmZGNfcmVnaXN0ZXJfZGV2aWNlcyh2b2lkKQp7CiAgICBpc2FfcWRldl9yZWdpc3RlcigmaXNhX2ZkY19pbmZvKTsKICAgIHN5c2J1c19yZWdpc3Rlcl93aXRocHJvcCgmc3lzYnVzX2ZkY19pbmZvKTsKICAgIHN5c2J1c19yZWdpc3Rlcl93aXRocHJvcCgmc3VuNG1fZmRjX2luZm8pOwp9CgpkZXZpY2VfaW5pdChmZGNfcmVnaXN0ZXJfZGV2aWNlcykK