LyoKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIDEwLzEwMC8xMDAwIEJhc2UtVCBFdGhlcm5ldCBEcml2ZXIgZm9yIHRoZSBFVDEzMDEgYW5kIEVUMTMxeCBzZXJpZXMgTUFDcwogKgogKiBDb3B5cmlnaHQgqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIGV0MTMxeF9kZWJ1Zy5jIC0gUm91dGluZXMgdXNlZCBmb3IgZGVidWdnaW5nLgogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBTT0ZUV0FSRSBMSUNFTlNFCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAogKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCiAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgogKgogKiBDb3B5cmlnaHQgqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCiAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCiAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAogKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIERpc2NsYWltZXIKICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCiAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQogKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgogKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAogKiBEQU1BR0UuCiAqCiAqLwoKI2lmZGVmIENPTkZJR19FVDEzMVhfREVCVUcKCiNpbmNsdWRlICJldDEzMXhfdmVyc2lvbi5oIgojaW5jbHVkZSAiZXQxMzF4X2RlYnVnLmgiCiNpbmNsdWRlICJldDEzMXhfZGVmcy5oIgoKI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CgojaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgojaW5jbHVkZSA8bGludXgvdGltZXIuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvaW4uaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KCiNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KCiNpbmNsdWRlICJldDEzMTBfcGh5LmgiCiNpbmNsdWRlICJldDEzMTBfcG0uaCIKI2luY2x1ZGUgImV0MTMxMF9qYWdjb3JlLmgiCgojaW5jbHVkZSAiZXQxMzF4X2FkYXB0ZXIuaCIKI2luY2x1ZGUgImV0MTMxeF9uZXRkZXYuaCIKI2luY2x1ZGUgImV0MTMxeF9jb25maWcuaCIKI2luY2x1ZGUgImV0MTMxeF9pc3IuaCIKCiNpbmNsdWRlICJldDEzMTBfYWRkcmVzc19tYXAuaCIKI2luY2x1ZGUgImV0MTMxMF90eC5oIgojaW5jbHVkZSAiZXQxMzEwX3J4LmgiCiNpbmNsdWRlICJldDEzMTBfbWFjLmgiCgovKiBEYXRhIGZvciBkZWJ1Z2dpbmcgZmFjaWxpdGllcyAqLwpleHRlcm4gZGJnX2luZm9fdCAqZXQxMzF4X2RiZ2luZm87CgovKioKICogRHVtcFR4UXVldWVDb250ZW50cyAtIER1bXAgb3V0IHRoZSB0eCBxdWV1ZSBhbmQgdGhlIHNoYWRvdyBwb2ludGVycwogKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIgc3RydWN0dXJlCiAqLwp2b2lkIER1bXBUeFF1ZXVlQ29udGVudHMoaW50IGRiZ0x2bCwgc3RydWN0IGV0MTMxeF9hZGFwdGVyICpwQWRhcHRlcikKewoJTU1DX3QgX19pb21lbSAqbW1jID0gJnBBZGFwdGVyLT5DU1JBZGRyZXNzLT5tbWM7Cgl1aW50MzJfdCBUeFF1ZXVlQWRkcjsKCglpZiAoREJHX0ZMQUdTKGV0MTMxeF9kYmdpbmZvKSAmIGRiZ0x2bCkgewoJCWZvciAoVHhRdWV1ZUFkZHIgPSAweDIwMDsgVHhRdWV1ZUFkZHIgPCAweDNmZjsgVHhRdWV1ZUFkZHIrKykgewoJCQlNTUNfU1JBTV9BQ0NFU1NfdCBzcmFtX2FjY2VzczsKCgkJCXNyYW1fYWNjZXNzLnZhbHVlID0gcmVhZGwoJm1tYy0+c3JhbV9hY2Nlc3MudmFsdWUpOwoJCQlzcmFtX2FjY2Vzcy5iaXRzLnJlcV9hZGRyID0gVHhRdWV1ZUFkZHI7CgkJCXNyYW1fYWNjZXNzLmJpdHMucmVxX2FjY2VzcyA9IDE7CgkJCXdyaXRlbChzcmFtX2FjY2Vzcy52YWx1ZSwgJm1tYy0+c3JhbV9hY2Nlc3MudmFsdWUpOwoKCQkJREJHX1BSSU5UKCJBZGRyIDB4JXgsIEFjY2VzcyAweCUwOHhcdCIKCQkJCSAgIlZhbHVlIDEgMHglMDh4LCBWYWx1ZSAyIDB4JTA4eCwgIgoJCQkJICAiVmFsdWUgMyAweCUwOHgsIFZhbHVlIDQgMHglMDh4LCBcbiIsCgkJCQkgIFR4UXVldWVBZGRyLAoJCQkJICByZWFkbCgmbW1jLT5zcmFtX2FjY2Vzcy52YWx1ZSksCgkJCQkgIHJlYWRsKCZtbWMtPnNyYW1fd29yZDEpLAoJCQkJICByZWFkbCgmbW1jLT5zcmFtX3dvcmQyKSwKCQkJCSAgcmVhZGwoJm1tYy0+c3JhbV93b3JkMyksCgkJCQkgIHJlYWRsKCZtbWMtPnNyYW1fd29yZDQpKTsKCQl9CgoJCURCR19QUklOVCgiU2hhZG93IFBvaW50ZXJzIDB4JTA4eFxuIiwKCQkJICByZWFkbCgmcEFkYXB0ZXItPkNTUkFkZHJlc3MtPnR4bWFjLnNoYWRvd19wdHIudmFsdWUpKTsKCX0KfQoKLyoqCiAqIER1bXBEZXZpY2VCbG9jawogKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKICoKICogRHVtcHMgdGhlIGZpcnN0IDY0IHJlZ3Mgb2YgZWFjaCBibG9jayBvZiB0aGUgZXQtMTMxMCAoZWFjaCBibG9jayBpcwogKiBtYXBwZWQgdG8gYSBuZXcgcGFnZSwgZWFjaCBwYWdlIGlzIDQwOTYgYnl0ZXMpLgogKi8KI2RlZmluZSBOVU1fQkxPQ0tTIDgKdm9pZCBEdW1wRGV2aWNlQmxvY2soaW50IGRiZ0x2bCwgc3RydWN0IGV0MTMxeF9hZGFwdGVyICpwQWRhcHRlciwKCQkgICAgIHVpbnQzMl90IEJsb2NrKQp7Cgl1aW50MzJfdCBBZGRyZXNzMSwgQWRkcmVzczI7Cgl1aW50MzJfdCBfX2lvbWVtICpCaWdEZXZpY2VQb2ludGVyID0KCQkodWludDMyX3QgX19pb21lbSAqKSBwQWRhcHRlci0+Q1NSQWRkcmVzczsKCWNvbnN0IGNoYXIgKkJsb2NrTmFtZXNbTlVNX0JMT0NLU10gPSB7CgkJIkdsb2JhbCIsICJUeCBETUEiLCAiUnggRE1BIiwgIlR4IE1BQyIsCgkJIlJ4IE1BQyIsICJNQUMiLCAiTUFDIFN0YXQiLCAiTU1DIgoJfTsKCgkvKiBPdXRwdXQgdGhlIGRlYnVnIGNvdW50ZXJzIHRvIHRoZSBkZWJ1ZyB0ZXJtaW5hbCAqLwoJaWYgKERCR19GTEFHUyhldDEzMXhfZGJnaW5mbykgJiBkYmdMdmwpIHsKCQlEQkdfUFJJTlQoIiVzIGJsb2NrXG4iLCBCbG9ja05hbWVzW0Jsb2NrXSk7CgkJQmlnRGV2aWNlUG9pbnRlciArPSBCbG9jayAqIDEwMjQ7CgkJZm9yIChBZGRyZXNzMSA9IDA7IEFkZHJlc3MxIDwgODsgQWRkcmVzczErKykgewoJCQlmb3IgKEFkZHJlc3MyID0gMDsgQWRkcmVzczIgPCA4OyBBZGRyZXNzMisrKSB7CgkJCQlpZiAoQmxvY2sgPT0gMCAmJgoJCQkJICAgIChBZGRyZXNzMSAqIDggKyBBZGRyZXNzMikgPT0gNikgewoJCQkJCURCR19QUklOVCgiICBJU1IgICAgLCAiKTsKCQkJCX0gZWxzZSB7CgkJCQkJREJHX1BSSU5UKCIweCUwOHgsICIsCgkJCQkJCSAgcmVhZGwoQmlnRGV2aWNlUG9pbnRlcisrKSk7CgkJCQl9CgkJCX0KCQkJREJHX1BSSU5UKCJcbiIpOwoJCX0KCQlEQkdfUFJJTlQoIlxuIik7Cgl9Cn0KCi8qKgogKiBEdW1wRGV2aWNlUmVnCiAqIEBwQWRhcHRlcjogcG9pbnRlciB0byBvdXIgYWRhcHRlcgogKgogKiBEdW1wcyB0aGUgZmlyc3QgNjQgcmVncyBvZiBlYWNoIGJsb2NrIG9mIHRoZSBldC0xMzEwIChlYWNoIGJsb2NrIGlzCiAqIG1hcHBlZCB0byBhIG5ldyBwYWdlLCBlYWNoIHBhZ2UgaXMgNDA5NiBieXRlcykuCiAqLwp2b2lkIER1bXBEZXZpY2VSZWcoaW50IGRiZ0x2bCwgc3RydWN0IGV0MTMxeF9hZGFwdGVyICpwQWRhcHRlcikKewoJdWludDMyX3QgQWRkcmVzczEsIEFkZHJlc3MyOwoJdWludDMyX3QgQmxvY2s7Cgl1aW50MzJfdCBfX2lvbWVtICpCaWdEZXZpY2VQb2ludGVyID0KCQkodWludDMyX3QgX19pb21lbSAqKSBwQWRhcHRlci0+Q1NSQWRkcmVzczsKCXVpbnQzMl90IF9faW9tZW0gKlBvaW50ZXI7Cgljb25zdCBjaGFyICpCbG9ja05hbWVzW05VTV9CTE9DS1NdID0gewoJCSJHbG9iYWwiLCAiVHggRE1BIiwgIlJ4IERNQSIsICJUeCBNQUMiLAoJCSJSeCBNQUMiLCAiTUFDIiwgIk1BQyBTdGF0IiwgIk1NQyIKCX07CgoJLyogT3V0cHV0IHRoZSBkZWJ1ZyBjb3VudGVycyB0byB0aGUgZGVidWcgdGVybWluYWwgKi8KCWlmIChEQkdfRkxBR1MoZXQxMzF4X2RiZ2luZm8pICYgZGJnTHZsKSB7CgkJZm9yIChCbG9jayA9IDA7IEJsb2NrIDwgTlVNX0JMT0NLUzsgQmxvY2srKykgewoJCQlEQkdfUFJJTlQoIiVzIGJsb2NrXG4iLCBCbG9ja05hbWVzW0Jsb2NrXSk7CgkJCVBvaW50ZXIgPSBCaWdEZXZpY2VQb2ludGVyICsgKEJsb2NrICogMTAyNCk7CgoJCQlmb3IgKEFkZHJlc3MxID0gMDsgQWRkcmVzczEgPCA4OyBBZGRyZXNzMSsrKSB7CgkJCQlmb3IgKEFkZHJlc3MyID0gMDsgQWRkcmVzczIgPCA4OyBBZGRyZXNzMisrKSB7CgkJCQkJREJHX1BSSU5UKCIweCUwOHgsICIsCgkJCQkJCSAgcmVhZGwoUG9pbnRlcisrKSk7CgkJCQl9CgkJCQlEQkdfUFJJTlQoIlxuIik7CgkJCX0KCQkJREJHX1BSSU5UKCJcbiIpOwoJCX0KCX0KfQoKI2VuZGlmIC8vIENPTkZJR19FVDEzMVhfREVCVUcK