ZGlmZiAtLWdpdCBhL21hYzgwMjExL0FuZHJvaWQubWsgYi9tYWM4MDIxMS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZGNkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tYWM4MDIxMS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMyBAQAoraWZlcSAoJChCT0FSRF9XTEFOX0RFVklDRSksd2wxMnh4X21hYzgwMjExKQorICAgIGluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQorZW5kaWYKZGlmZiAtLWdpdCBhL21hYzgwMjExL2NvbmZpZy9BbmRyb2lkLm1rIGIvbWFjODAyMTEvY29uZmlnL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE1YTYyYgotLS0gL2Rldi9udWxsCisrKyBiL21hYzgwMjExL2NvbmZpZy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTkgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSB3cGFfc3VwcGxpY2FudC5jb25mCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykvd2lmaQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gaG9zdGFwZC5jb25mCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykvd2lmaQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBkaGNwY2QuY29uZgorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9FVEMpL2RoY3BjZAorTE9DQUxfU1JDX0ZJTEVTIDo9IGFuZHJvaWRfZGhjcGNkLmNvbmYKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IFRRU19EXzEuNy5pbmkKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKS93aWZpCitMT0NBTF9TUkNfRklMRVMgOj0gJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvbWFjODAyMTEvY29uZmlnL1RRU19EXzEuNy5pbmkgYi9tYWM4MDIxMS9jb25maWcvVFFTX0RfMS43LmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTFhNzY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjODAyMTEvY29uZmlnL1RRU19EXzEuNy5pbmkKQEAgLTAsMCArMSw4NSBAQAorIyBJTkkgR2VuZXJhdG9yIHZlcnNpb24gMC41OyBBbGlnbmVkIHRvIFRTIHZlcnNpb24gNy4xLjIuMC4yNgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDE6ICAgTm9uIEZFTS1kZXBlbmRhbnQgc2VjdGlvbgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDEuMTogR2VuZXJhbCBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUWEJpUEZFTUF1dG9EZXRlY3QgID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IE9wdGlvbnMgKDA6IE1hbnVhbCBNb2RlLCAxOiBBdXRvbWF0aWMgbW9kZSk7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgYnkgdGhlIEZXIHRvIGRlY2lkZSBpZiB0aGUgZnJvbnQtZW5kIGlzIGRldGVybWluZWQgYXV0b21hdGljYWxseSBvciBtYW51YWxseQorVFhCaVBGRU1NYW51ZmFjdHVyZXIgID0gMDEgIyBMZW5ndGg6IDE7IFVuaXQ6IEJpdF9PcHRpb25zOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBCaXQxLDA6IHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIEZFTSB2ZW5kb3IgdHlwZSBpcyB1c2VkIG9uIHRoZSBwbGF0Zm9ybSAoMDogUkZNRCwgMTogVFFTLCAyOlNLVywgMzpIUCksIEJpdDMsMjogdW51c2VkLCBCaXQ3LTQ6RXh0ZXJuYWwvaW50ZXJuYWwgbG9hZCAoNC1TS1cgU0IsIDUtU0tXIEhCLCA2LUhQIFNCLCA3LUhQIEhCKQorUmVmQ2xrICA9IDAxICMgTGVuZ3RoOiAxOyBVbml0OiBCaXRfT3B0aW9uczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogNSdiWFgwMDAgOiBCaXQgMCwxLDIgLSAwOiAxOS4yTUh6LCAxOiAyNk1IeiwgMjogMzguNE1IeiAgW0RlZmF1bHRdLCAzOiA1Mk1IeiwgIDQ6IDM4LjRNSHogWFRBTCwgNTogMjZNSHogWFRBTCAsICA1J2JYMFhYWCA6IEJpdCAzIC0gQ0xLX1JFUSB0eXBlLCAgMCA9IHdpcmVkLU9SIFtEZWZhdWx0XSwgMT0gcHVzaC1wdWxsICwgIDUnYjBYWFhYIDogQml0IDQgLSBDTEtfUkVRIHBvbGFyaXR5LCAwID0gTm9ybWFsIFtEZWZhdWx0XSwgMT1JbnZlcnRlZAorU2V0dGxpbmdUaW1lICA9IDA1ICMgTGVuZ3RoOiAxOyBVbml0OiBtcyAoMC0xNSk7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSB0aW1lIGZyb20gYXNzZXJ0aW5nIENMS19SRVEgKGxvdyB0byBoaWdoKSB0byB2YWxpZCBGUkVGIGNsb2NrIG9uIHRoZSBkZXZpY2UgaW5wdXRzCitDbG9ja1ZhbGlkT25XYWtldXAgID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IE9wdGlvbnMgKDA6IFJlZmVyZW5jZSBjbG9jayBub3QgdmFsaWQsIDE6IFJlZmVyZW5jZSBjbG9jayBpcyB2YWxpZCBhbmQgc3RhYmxlKTsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIEZSRUYgY2xvY2sgaXMgdmFsaWQgb24gd2FrZXVwCitUQ1hPX0NsayAgPSAwMSAjIExlbmd0aDogMTsgVW5pdDogQml0X09wdGlvbnM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IDUnYlhYMDAwIDogQml0IDAsMSwyIC0gMDogMTkuMk1IeiwgMTogMjZNSHosIDI6IDM4LjRNSHogIFtEZWZhdWx0XSwgMzogNTJNSHosIDQ6IDE2LjM2OE1oeiwgNTogMzIuNzM2IE1oegorVENYT19TZXR0bGluZ1RpbWUgID0gMDUgIyBMZW5ndGg6IDE7IFVuaXQ6IG1zICgwLTE1KTsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIHRpbWUgZnJvbSBhc3NlcnRpbmcgQ0xLX1JFUSAobG93IHRvIGhpZ2gpIHRvIHZhbGlkIFRDWE8gY2xvY2sgb24gdGhlIGRldmljZSBpbnB1dHMKK1RDWE9fQ2xvY2tWYWxpZE9uV2FrZXVwICA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBPcHRpb25zICgwOiBSZWZlcmVuY2UgY2xvY2sgbm90IHZhbGlkLCAxOiBSZWZlcmVuY2UgY2xvY2sgaXMgdmFsaWQgYW5kIHN0YWJsZSk7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyIHRoZSBUQ1hPIGNsb2NrIGlzIHZhbGlkIG9uIHdha2V1cAorVENYT19MRE9fVm9sdGFnZSA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBPcHRpb25zICgwOjIuNXYsIDE6Mi41NXYsIDI6Mi42dik7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRDWE8gTERPIFZvbHRhZ2UKK1BsYXRmb3JtX2NvbmZpZ3VyYXRpb24gPSAwMiAjIExlbmd0aDogMTsgVW5pdDogQml0X09wdGlvbnM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXIgOyBDb21tZW50OiBCaXQgMDogTGV2ZWxzaGlmdGVyIHN1cHBvcnQgKDA6IE5vIExTLCAxOiBXaXRoIExTKSwgQml0IDEsMjpDb25maWd1cmUgSU8ncyBbU0RJTy93c3BpXSAoMDAtIDhtQSwgMDEtIDRtQSAoZGVmYXVsdCksIDEwLSA2bUEsIDExIC0gMm1BKSwgQml0IDM6RWVwcm9tICgwLU5vIEVlcHJvbSksIEJpdCA0OiBTRElPIElCIEVuYWJsZSBzeW5jLCBCaXQgNTogU0RJTyBJQiBFbmFibGUgYXN5bmMsIEJpdCA2OiBTRElPIElCIEVuYWJsZSBCbG9ja01vZGUsIEJpdCA3OiBTRElPIEhpZ2gtU3BlZWQgc3VwcG9ydAorU2luZ2xlX0R1YWxfQmFuZF9Tb2x1dGlvbiAgPSAwMSAjIExlbmd0aDogMTsgVW5pdDogT3B0aW9ucyAoMDogMi41diwgMTogMi41NXYsIDI6IDIuNnYpOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIGZpZWxkIG5vdGlmaWVzIHRoZSBGVyB3aGV0aGVyIHRoZSBzb2x1dGlvbiBpcyBhIHNpbmdsZS1iYW5kIG9yIGR1YWwtYmFuZAorU2V0dGluZ3MgID0gM2MgMDAgMDAgMDAgIyBMZW5ndGg6IDQ7IFVuaXQ6IEJpdF9PcHRpb25zOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBCaXQwOiBOQkkgKDA6IE9mZiwgMTogT24pLCBCaXQxOiBUZWxlYyBjaGFubmVsIDE0ICgwOiBPZmYsIDE6IE9uKSwgQml0MjogRkVNMC1MQiwgQml0MzogRkVNMC1IQiwgQml0NDogRkVNMS1MQiwgQml0NTogRkVNMS1IQiAtIFRYIEJpUCBsb2FkICgwOiBJbnRlcm5hbCwgMTogRXh0ZXJuYWwpLCBCaXQ2OiBMUEQgTG93IGJhbmQsIEJpdDc6IExQRCBIaWdoIGJhbmQKK1hUQUxJdHJpbVZhbCA9IDA0ICMgTGVuZ3RoOiAxOyBVbml0OiBDdXJyZW50IHRyaW1taW5nIGZvciBYVEFMOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBDdXJyZW50IHRyaW1taW5nIGZvciBYVEFMCitTUlN0YXRlID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IE9wdGlvbnMgKDA6IERpc2FibGVkLCAxOiBFbmFibGVkKTsgRm9ybWF0OiBEZWNpbWFsOyBTb3VyY2U6IFRJOyBDb21tZW50OiBTbWFydCBSZWZsYXggKHByb3ByaWV0YXJ5IG1lY2hhbmlzbSBvZiBUSSB0aGF0IGlkZW50aWZ5IHRoZSBzaWxpY29uIHByb2Nlc3Mgc3BlY2lmaWMgcGFyYW1zKSBzdGF0ZQorU1JGMSA9IDA5IDA0IDE5IDEwIDA4IDAwIEY3IEVGIEU2IERFIDAwIDAwIDAwIDAwIDBGIDNGICAjIExlbmd0aDogMTY7IFVuaXQ6IFNSRjEgdmFsdWVzOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIHRhYmxlIGhvbGRzIHRoZSBzcGVjaWZpYyBwYXJhbWV0ZXJzIGZvciB1c2luZyB0aGUgU21hcnRSZWZsZXggbWVjaGFuaXNtCitTUkYyID0gMDkgMDQgMTkgMTAgMDggMDAgRjcgRUYgRTYgREUgMDAgMDAgMDAgMDAgMDAgMDAgICMgTGVuZ3RoOiAxNjsgVW5pdDogU1JGMiB2YWx1ZXM7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgdGFibGUgaG9sZHMgdGhlIHNwZWNpZmljIHBhcmFtZXRlcnMgZm9yIHVzaW5nIHRoZSBTbWFydFJlZmxleCBtZWNoYW5pc20KK1NSRjMgPSAwOSAwNCAxOSAxMCAwOCAwMCBGNyBFRiBFNiBERSAwMCAwMCAwMCAwMCAwMCAwMCAgIyBMZW5ndGg6IDE2OyBVbml0OiBTUkYzIHZhbHVlczsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSB0YWJsZSBob2xkcyB0aGUgc3BlY2lmaWMgcGFyYW1ldGVycyBmb3IgdXNpbmcgdGhlIFNtYXJ0UmVmbGV4IG1lY2hhbmlzbQorI1NSX0RlYnVnX1RhYmxlID0gMDkgMDQgMTkgMTAgMDEgMDAgRjcgRUYgRTYgREUgMDAgMDAgMDAgMDAgMDAgMDAgICMgTGVuZ3RoOiAxNjsgVW5pdDogU1JfRGVidWdfVGFibGUgdmFsdWVzOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogU1IgRGVidWcgdmFsdWVzIJYgZm9yIFRJIGludGVybmFsIHVzZSBvbmx5CisjU1JfU0VOX05fUCA9IDExICMgTGVuZ3RoOiAxOyBVbml0OiBTUl9TRU5fTl9QIHZhbHVlczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogU1IgRGVidWcgdmFsdWVzIJYgZm9yIFRJIGludGVybmFsIHVzZSBvbmx5CisjU1JfU0VOX05fUF9HYWluID0gQUEgIyBMZW5ndGg6IDE7IFVuaXQ6IFNSX1NFTl9OX1BfR0FJTiB2YWx1ZXM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFNSIERlYnVnIHZhbHVlcyCWIGZvciBUSSBpbnRlcm5hbCB1c2Ugb25seQorI1NSX1NFTl9OUk4gPSBCNiAjIExlbmd0aDogMTsgVW5pdDogU1JfU0VOX05STiB2YWx1ZXM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEkgOyBDb21tZW50OiBTUiBEZWJ1ZyB2YWx1ZXMgliBmb3IgVEkgaW50ZXJuYWwgdXNlIG9ubHkKKyNTUl9TRU5fUFJOID0gRjAgIyBMZW5ndGg6IDE7IFVuaXQ6IFNSX1NFTl9QUk4gdmFsdWVzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJIDsgQ29tbWVudDogU1IgRGVidWcgdmFsdWVzIJYgZm9yIFRJIGludGVybmFsIHVzZSBvbmx5CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMS4yOiBCYW5kLWRlcGVuZGFudCBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMS4yLjE6IDIuNEcgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUnhUcmFjZUluc2VydGlvbkxvc3NfMl80RyA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiAxLzhkQjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBwcmludGVkIGNpcmN1aXQgYm9hcmQgKFBDQikgdHJhY2UgaW5zZXJ0aW9uIGxvc3MKK1R4VHJhY2VMb3NzXzJfNEcgPSAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAjIExlbmd0aDogMTQ7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIGFsaWduIHRoZSBvdXRwdXQgcG93ZXIgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24gb24gdGhlIGJvYXJkCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMS4yLjI6IDVHIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1J4VHJhY2VJbnNlcnRpb25Mb3NzXzVHICA9IDAwIDAwIDAwIDAwIDAwIDAwIDAwICMgTGVuZ3RoOiA3OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBwcmludGVkIGNpcmN1aXQgYm9hcmQgKFBDQikgdHJhY2UgaW5zZXJ0aW9uIGxvc3MKK1R4VHJhY2VMb3NzXzVHICA9IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICMgTGVuZ3RoOiAzNTsgVW5pdDogMS84ZEI7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgdG8gYWxpZ24gdGhlIG91dHB1dCBwb3dlciB0byBhIGRpZmZlcmVudCBsb2NhdGlvbiBvbiB0aGUgYm9hcmQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAyOiAgICAgRkVNLWRlcGVuZGFudCBzZWN0aW9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMi4xOiAgIEZFTSBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGZW1WZW5kb3JBbmRPcHRpb25zICA9IDAxICMgTGVuZ3RoOiAxOyBVbml0OiBCaXRfT3B0aW9uczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogQml0IDAuLjEgLSAwOiBSRk1ELCAxOiBUUVMsIDI6IFNLV1MsICBCaXQgNC4uNyBbVmVyc2lvbiBjb250cm9sXSAtICAwOiBUUVMtUzEuMCwgMTogVFFTLVMyLjAsIDI6IFRRUy1TMi41LCAzOiBUUVMtRDEuMCwgNDogVFFTLUQxLjUsIDU6IFJGTUQtUzEuNSwgNjogUkZNRC1TMi45LCA3OiBSRk1ELVMzLjAsIDg6IFJGTUQtRDEuNSwgOTogUkZNRC1TMi45LjUsIDEwOiBSRk1ELUQzLjAuMSwgMTE6IFRRUy1TMi42LCAxMjogVFFTLUQxLjcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAyLjEuMTogMi40RyBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGRU0xX1R4QmlQUmVmZXJlbmNlUER2b2x0YWdlXzJfNEcgPSAwMUQ5ICMgTGVuZ3RoOiAxOyBVbml0OiAxbVY7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGRlZmluZSB0aGUgcmVmZXJlbmNlIHBvaW50IG9mIHRoZSBGRU0gcG93ZXIgZGV0ZWN0b3IKK0ZFTTFfVHhCaVBSZWZlcmVuY2VQb3dlcl8yXzRHICA9IDgwICMgTGVuZ3RoOiAxOyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFJlZmVyZW5jZSBvdXRwdXQgcG93ZXIgdGhhdCBwcm9kdWNlcyBnaXZlbiByZWZlcmVuY2UgcG93ZXIgZGV0ZWN0b3Igb3V0cHV0IHZvbHRhZ2UgLiBUaGUgVFggQmlQIHJlZmVyZW5jZSBwb3dlciBpcyBsaW5rZWQgdG8gdGhlIFRYIEJpUCByZWZlcmVuY2UgUEQgdm9sdGFnZQorRkVNMV9UeEJpUE9mZnNldGRCXzJfNEcgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gZmluZS10dW5lIHRoZSBUWCBCaVAgYnkgdGhlIGN1c3RvbWVyCitGRU0xX1R4UGVyUmF0ZVBvd2VyTGltaXRzXzJfNEdfTm9ybWFsID0gMUQgMUYgMjIgMjYgMjcgMjkgMjUgIyBMZW5ndGg6IDc7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcGVyYXR1cmUgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfMl80R19EZWdyYWRlZCA9IDFEIDFGIDIyIDI2IDI3IDI3IDI0ICMgTGVuZ3RoOiA3OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXBlcmF0dXJlIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX1R4UGVyUmF0ZVBvd2VyTGltaXRzXzJfNEdfRXh0cmVtZSA9IDE2IDFEIDFFIDIwIDI0IDI1IDIyICMgTGVuZ3RoOiA3OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXBlcmF0dXJlIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX0RlZ3JhZGVkTG93VG9Ob3JtYWxUaHJfMl80RyA9IDFFICMgTGVuZ3RoOiAxOyBVbml0OiAxLzEwIHZvbHRzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wZXJhdHVyZSByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9Ob3JtYWxUb0RlZ3JhZGVkSGlnaFRocl8yXzRHID0gMkQgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvMTAgdm9sdHM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXBlcmF0dXJlIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX1R4UGVyQ2hhbm5lbFBvd2VyTGltaXRzXzJfNEdfMTFiID0gNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgIyBMZW5ndGg6IDE0OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBwdXJwb3NlIG9mIHRoaXMgdGFibGUgaXMgdG8gYWxsb3cgY2xpcHBpbmcgb2YgdGhlIG1heGltdW0gb3V0cHV0IHBvd2VyIG9uIGNlcnRhaW4gY2hhbm5lbHMKK0ZFTTFfVHhQZXJDaGFubmVsUG93ZXJMaW1pdHNfMl80R19PRkRNID0gNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgIyBMZW5ndGg6IDE0OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBwdXJwb3NlIG9mIHRoaXMgdGFibGUgaXMgdG8gYWxsb3cgY2xpcHBpbmcgb2YgdGhlIG1heGltdW0gb3V0cHV0IHBvd2VyIG9uIGNlcnRhaW4gY2hhbm5lbHMKK0ZFTTFfVHhQRFZzUmF0ZU9mZnNldHNfMl80RyA9IDAxIDAyIDAyIDAyIDAyIDAwIDAyICMgTGVuZ3RoOiA3OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIGEgcG93ZXIgZGV0ZWN0b3Igb2Zmc2V0IHZhbHVlIHVzZWQgdG8gY29ycmVjdCB0aGUgcG93ZXIgZGV0ZWN0b3IgY3VydmUgZm9yIGVhY2ggcmF0ZSBncm91cAorRkVNMV9UeFBEVnNDaGFubmVsT2Zmc2V0c18yXzRHID0gMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIyBMZW5ndGg6IDE0OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEkvQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIGEgcG93ZXIgZGV0ZWN0b3Igb2Zmc2V0IHZhbHVlIHVzZWQgdG8gY29ycmVjdCB0aGUgcG93ZXIgZGV0ZWN0b3IgY3VydmUgZm9yIGVhY2ggY2hhbm5lbAorRkVNMV9UeFBEVnNUZW1wZXJhdHVyZV8yXzRHID0gMDAgMDAgIyBMZW5ndGg6IDI7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaXMgYSBwb3dlciBkZXRlY3RvciBvZmZzZXQgdmFsdWUgdXNlZCB0byBjb3JyZWN0IHRoZSBwb3dlciBkZXRlY3RvciBjdXJ2ZSBmb3IgZWFjaCB0ZW1wZXJ0dXJlCitGRU0xX1R4SWJpYXNUYWJsZV8yXzRHICA9IDE3IDE3IDE3IDFhIDE2IDE3IDFhIDE3ICMgTGVuZ3RoOiA4OyBVbml0OiBDb2Rld29yZCA7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIHNldHMgdGhlIGJpYXMgY3VycmVudCBwcm92aWRlZCBieSB0aGUgU29DIHRvIHRoZSBQQSBpbiB0aGUgRkVNLiBPcHRpb25zIChNQ1M3LCA1NC80OCwgMzYvMjQsIDE4LzEyLCA5LzYsIDExYiwgTUNTMCwgMTFiQ2gxNCkKK0ZFTTFfUnhGZW1JbnNlcnRpb25Mb3NzXzJfNEcgID0gMTAgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHJlY2VpdmVkIGluc2VydGlvbiBsb3NzIG9mIHRoZSBXTDEyOHgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAyLjEuMjogNUcgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRkVNMV9UeEJpUFJlZmVyZW5jZVBEdm9sdGFnZV81RyAgPSAwMTlBIDAxQUUgMDFDMiAwMUNDIDAxREIgMDFEQiAwMUQxICMgTGVuZ3RoOiA3OyBVbml0OiAxbVY7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGRlZmluZSB0aGUgcmVmZXJlbmNlIHBvaW50IG9mIHRoZSBGRU0gcG93ZXIgZGV0ZWN0b3IKK0ZFTTFfVHhCaVBSZWZlcmVuY2VQb3dlcl81RyA9IDgwIDgwIDgwIDgwIDgwIDgwIDgwICMgTGVuZ3RoOiA3OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFJlZmVyZW5jZSBvdXRwdXQgcG93ZXIgdGhhdCBwcm9kdWNlcyBnaXZlbiByZWZlcmVuY2UgcG93ZXIgZGV0ZWN0b3Igb3V0cHV0IHZvbHRhZ2UgLiBUaGUgVFggQmlQIHJlZmVyZW5jZSBwb3dlciBpcyBsaW5rZWQgdG8gdGhlIFRYIEJpUCByZWZlcmVuY2UgUEQgdm9sdGFnZQorRkVNMV9UeEJpUE9mZnNldGRCXzVHID0gMDAgMDAgMDAgMDAgMDAgMDAgMDAgIyBMZW5ndGg6IDc7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGZpbmUtdHVuZSB0aGUgVFggQmlQIGJ5IHRoZSBjdXN0b21lcgorRkVNMV9UeFBlclJhdGVQb3dlckxpbWl0c181R19Ob3JtYWwgID0gMUMgMUUgMjEgMjMgMjUgNTAgMjUgIyBMZW5ndGg6IDc7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcGVyYXR1cmUgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfNUdfRGVncmFkZWQgID0gMTggMUUgMjEgMjMgMjUgNTAgMjQgIyBMZW5ndGg6IDc7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcGVyYXR1cmUgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfNUdfRXh0cmVtZSA9IDE2IDFDIDFFIDIwIDIwIDUwIDFFICMgTGVuZ3RoOiA3OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXBlcmF0dXJlIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX0RlZ3JhZGVkTG93VG9Ob3JtYWxUaHJfNUcgPSAxRSAjIExlbmd0aDogMTsgVW5pdDogMS8xMCB2b2x0czsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcGVyYXR1cmUgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfTm9ybWFsVG9EZWdyYWRlZEhpZ2hUaHJfNUcgPSAyRCAjIExlbmd0aDogMTsgVW5pdDogMS8xMCB2b2x0czsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcGVyYXR1cmUgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfVHhQZXJDaGFubmVsUG93ZXJMaW1pdHNfNUdfT0ZETSAgPSA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCAjIExlbmd0aDogMzU7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIHB1cnBvc2Ugb2YgdGhpcyB0YWJsZSBpcyB0byBhbGxvdyBjbGlwcGluZyBvZiB0aGUgbWF4aW11bSBvdXRwdXQgcG93ZXIgb24gY2VydGFpbiBjaGFubmVscworRkVNMV9UeFBEVnNSYXRlT2Zmc2V0c181RyAgPSAwMSAwMiAwMiAwMiAwMiAwMCAwMiAjIExlbmd0aDogNzsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpcyBhIHBvd2VyIGRldGVjdG9yIG9mZnNldCB2YWx1ZSB1c2VkIHRvIGNvcnJlY3QgdGhlIHBvd2VyIGRldGVjdG9yIGN1cnZlIGZvciBlYWNoIHJhdGUgZ3JvdXAKK0ZFTTFfVHhQRFZzQ2hhbm5lbE9mZnNldHNfNUcgPSAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAjIExlbmd0aDogMzU7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSS9DdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaXMgYSBwb3dlciBkZXRlY3RvciBvZmZzZXQgdmFsdWUgdXNlZCB0byBjb3JyZWN0IHRoZSBwb3dlciBkZXRlY3RvciBjdXJ2ZSBmb3IgZWFjaCBjaGFubmVsCitGRU0xX1R4UERWc1RlbXBlcmF0dXJlXzVHID0gMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIyBMZW5ndGg6IDE0OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIGEgcG93ZXIgZGV0ZWN0b3Igb2Zmc2V0IHZhbHVlIHVzZWQgdG8gY29ycmVjdCB0aGUgcG93ZXIgZGV0ZWN0b3IgY3VydmUgZm9yIGVhY2ggdGVtcGVydHVyZQorRkVNMV9UeEliaWFzVGFibGVfNUcgID0gMTAgMTAgMTAgMTAgMTAgMTAgMTAgIyBMZW5ndGg6IDc7IFVuaXQ6IENvZGV3b3JkOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBzZXRzIHRoZSBiaWFzIGN1cnJlbnQgcHJvdmlkZWQgYnkgdGhlIFNvQyB0byB0aGUgUEEgaW4gdGhlIEZFTQorRkVNMV9SeEZlbUluc2VydGlvbkxvc3NfNUcgID0gMTAgMTAgMTAgMTAgMTAgMTAgMTAgIyBMZW5ndGg6IDc7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHJlY2VpdmVkIGluc2VydGlvbiBsb3NzIG9mIHRoZSBXTDEyOHgKKwpkaWZmIC0tZ2l0IGEvbWFjODAyMTEvY29uZmlnL2FuZHJvaWRfZGhjcGNkLmNvbmYgYi9tYWM4MDIxMS9jb25maWcvYW5kcm9pZF9kaGNwY2QuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDAwNmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjODAyMTEvY29uZmlnL2FuZHJvaWRfZGhjcGNkLmNvbmYKQEAgLTAsMCArMSw2IEBACisjIGRoY3BjZCBjb25maWd1cmF0aW9uIGZvciBBbmRyb2lkIFdpLUZpIGludGVyZmFjZQorIyBTZWUgZGhjcGNkLmNvbmYoNSkgZm9yIGRldGFpbHMuCisKK2ludGVyZmFjZSB3bGFuMAorIyBkaGNwY2QtcnVuLWhvb2tzIHVzZXMgdGhlc2Ugb3B0aW9ucy4KK29wdGlvbiBzdWJuZXRfbWFzaywgcm91dGVycywgZG9tYWluX25hbWVfc2VydmVycwpkaWZmIC0tZ2l0IGEvbWFjODAyMTEvY29uZmlnL2hvc3RhcGQuY29uZiBiL21hYzgwMjExL2NvbmZpZy9ob3N0YXBkLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUyNTdhOAotLS0gL2Rldi9udWxsCisrKyBiL21hYzgwMjExL2NvbmZpZy9ob3N0YXBkLmNvbmYKQEAgLTAsMCArMSwzNSBAQAorZHJpdmVyPW5sODAyMTEKK2xvZ2dlcl9zeXNsb2c9LTEKK2xvZ2dlcl9zeXNsb2dfbGV2ZWw9MgorbG9nZ2VyX3N0ZG91dD0tMQorbG9nZ2VyX3N0ZG91dF9sZXZlbD0yCitkdW1wX2ZpbGU9L2RhdGEvbWlzYy93aWZpL2hvc3RhcGQuZHVtcAorY3RybF9pbnRlcmZhY2U9L2Rldi9zb2NrZXQKK2N0cmxfaW50ZXJmYWNlX2dyb3VwPTAKK2h3X21vZGU9ZworY2hhbm5lbD0xMQorYmVhY29uX2ludD0xMDAKK2R0aW1fcGVyaW9kPTIKK21heF9udW1fc3RhPTUKK3N1cHBvcnRlZF9yYXRlcz0xMCAyMCA1NSAxMTAgNjAgOTAgMTIwIDE4MCAyNDAgMzYwIDQ4MCA1NDAKK3ByZWFtYmxlPTEKK21hY2FkZHJfYWNsPTAKK2F1dGhfYWxncz0xCitpZ25vcmVfYnJvYWRjYXN0X3NzaWQ9MAord21lX2VuYWJsZWQ9MAord2VwX3Jla2V5X3BlcmlvZD0wCitlYXBfc2VydmVyPTAKK293bl9pcF9hZGRyPTEyNy4wLjAuMQord3BhX2dyb3VwX3Jla2V5PTAKK3dwYV9nbWtfcmVrZXk9MAord3BhX3B0a19yZWtleT0wCitpbnRlcmZhY2U9d2xhbjEKK3NzaWQ9QW5kcm9pZEFQCitjb3VudHJ5X2NvZGU9VVMKK2llZWU4MDIxMWQ9MQorYXBfdGFibGVfbWF4X3NpemU9MjU1CithcF90YWJsZV9leHBpcmF0aW9uX3RpbWU9MzYwMAordHhfcXVldWVfZGF0YTJfYWlmcz0yCit0eF9xdWV1ZV9kYXRhMl9jd21pbj0xNQordHhfcXVldWVfZGF0YTJfY3dtYXg9NjMKK3R4X3F1ZXVlX2RhdGEyX2J1cnN0PTAKZGlmZiAtLWdpdCBhL21hYzgwMjExL2NvbmZpZy93cGFfc3VwcGxpY2FudC5jb25mIGIvbWFjODAyMTEvY29uZmlnL3dwYV9zdXBwbGljYW50LmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0Y2U3NAotLS0gL2Rldi9udWxsCisrKyBiL21hYzgwMjExL2NvbmZpZy93cGFfc3VwcGxpY2FudC5jb25mCkBAIC0wLDAgKzEsNSBAQAorIyMjIyMgd3BhX3N1cHBsaWNhbnQgY29uZmlndXJhdGlvbiBmaWxlIHRlbXBsYXRlICMjIyMjCit1cGRhdGVfY29uZmlnPTEKK2N0cmxfaW50ZXJmYWNlPXdsYW4wCithcF9zY2FuPTEKK2Zhc3RfcmVhdXRoPTEKZGlmZiAtLWdpdCBhL21hYzgwMjExL3RpLXV0aWxzL0FuZHJvaWQubWsgYi9tYWM4MDIxMS90aS11dGlscy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4N2I3MDYKLS0tIC9kZXYvbnVsbAorKysgYi9tYWM4MDIxMS90aS11dGlscy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDIgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjCisjIENhbGlicmF0b3IKKyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICAgICBudnMuYyBcCisgICAgICAgIG1pc2NfY21kcy5jIFwKKyAgICAgICAgY2FsaWJyYXRvci5jIFwKKyAgICAgICAgcGx0LmMgXAorICAgICAgICBpbmkuYworCitMT0NBTF9DRkxBR1MgOj0gLURDT05GSUdfTElCTkwyMAorTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChMT0NBTF9QQVRIKSBcCisgICAgZXh0ZXJuYWwvbGlibmwtaGVhZGVycworCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYm5sXzIKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IGVuZworTE9DQUxfTU9EVUxFIDo9IGNhbGlicmF0b3IKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKyMKKyMgVUlNIEFwcGxpY2F0aW9uCisjCisjaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyNMT0NBTF9DX0lOQ0xVREVTOj0gXAorIyAgICAkKExPQ0FMX1BBVEgpL3VpbV9yZmtpbGwvIFwKKyMgICAgZXh0ZXJuYWwvYmx1ZXRvb3RoL2JsdWV6LworCisjTE9DQUxfU1JDX0ZJTEVTOj0gXAorIyAgICB1aW1fcmZraWxsL3VpbS5jCisjTE9DQUxfQ0ZMQUdTOj0gLWcgLWMgLVcgLVdhbGwgLU8yIC1EX1BPU0lYX1NPVVJDRQorI0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBsaWJuZXR1dGlscworI0xPQ0FMX01PRFVMRV9UQUdTIDo9IGVuZworI0xPQ0FMX01PRFVMRTo9dWltLXV0aWwKKworI2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWFjODAyMTEvdGktdXRpbHMvQ09QWUlORyBiL21hYzgwMjExL3RpLXV0aWxzL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVmMGQzMAotLS0gL2Rldi9udWxsCisrKyBiL21hYzgwMjExL3RpLXV0aWxzL0NPUFlJTkcKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodChjKSAxOTk4IC0gMjAxMCBUZXhhcyBJbnN0cnVtZW50cy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQmFzZSBvbiBjb2RlIGZyb20KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDgsIEpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA3LAlBbmR5IEx1dG9taXJza2kKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIE1pa2UgS2Vyc2hhdworICogIENvcHlyaWdodCAoYykgMjAwOC0yMDA5LCBMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQGdtYWlsLmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICogICogTmVpdGhlciB0aGUgbmFtZSBUZXhhcyBJbnN0cnVtZW50cyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwpkaWZmIC0tZ2l0IGEvbWFjODAyMTEvdGktdXRpbHMvTWFrZWZpbGUgYi9tYWM4MDIxMS90aS11dGlscy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGM3NTRmCi0tLSAvZGV2L251bGwKKysrIGIvbWFjODAyMTEvdGktdXRpbHMvTWFrZWZpbGUKQEAgLTAsMCArMSwyOCBAQAorQ0MgPSAkKENST1NTX0NPTVBJTEUpZ2NjCitDRkxBR1MgPSAtTzIgLVdhbGwKK0NGTEFHUyArPSAtRENPTkZJR19MSUJOTDIwIC1JJChORlNST09UKS91c3IvaW5jbHVkZSAtSSQoTkZTUk9PVCkvaW5jbHVkZQorCitMREZMQUdTICs9IC1MJChORlNST09UKS9saWIKK0xJQlMgKz0gLWxubCAtbG5sLWdlbmwgLWxtCisKK09CSlMgPSBudnMubyBtaXNjX2NtZHMubyBjYWxpYnJhdG9yLm8gcGx0Lm8gaW5pLm8KKworJS5vOiAlLmMgY2FsaWJyYXRvci5oIG5sODAyMTEuaCBwbHQuaCBudnNfZHVhbF9iYW5kLmgKKyAgICAkKENDKSAkKENGTEFHUykgLWMgLW8gJEAgJDwKKworYWxsOiAkKE9CSlMpIAorICAgICQoQ0MpICQoTERGTEFHUykgJChPQkpTKSAkKExJQlMpIC1vIGNhbGlicmF0b3IKKwordWltOgorICAgICQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIHVpbV9yZmtpbGwvJEAuYyAtbyAkQAorCitzdGF0aWM6ICQoT0JKUykgCisgICAgJChDQykgJChMREZMQUdTKSAtLXN0YXRpYyAkKE9CSlMpICQoTElCUykgLW8gY2FsaWJyYXRvcgorCitpbnN0YWxsOgorICAgIEBlY2hvIENvcHkgZmlsZXMgdG8gJChORlNST09UKS9ob21lL3Jvb3QKKyAgICBAY3AgLWYgLi9jYWxpYnJhdG9yICQoTkZTUk9PVCkvaG9tZS9yb290CisgICAgQGNwIC1mIC4vc2NyaXB0cy9nby5zaCAkKE5GU1JPT1QpL2hvbWUvcm9vdAorCitjbGVhbjoKKyAgICBAcm0gLWYgKi5vIGNhbGlicmF0b3IgdWltCmRpZmYgLS1naXQgYS9tYWM4MDIxMS90aS11dGlscy9SRUFETUUgYi9tYWM4MDIxMS90aS11dGlscy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmNGQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL21hYzgwMjExL3RpLXV0aWxzL1JFQURNRQpAQCAtMCwwICsxLDI3OCBAQAorCitUaGUgY2FsaWJyYXRvciBhbmQgb3RoZXIgdXNlZnVsIHV0aWxpdGllcyBmb3IgVEkgd2lyZWxlc3Mgc29sdXRpb24sCitiYXNlZCBvbiB3bDEyeHggZHJpdmVyLgorCitDYWxpYnJhdGlvbiBpcyBhIHByb2Nlc3MgaW4gd2hpY2ggc3BlY2lmaWMgcmFkaW8gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZQorZ2VuZXJhdGVkIGFuZCBzYXZlZCBpbnRvIHRoZSBOVlMgZmlsZSwgbGF0ZXIgdG8gYmUgdXNlZCBieSB0aGUgd2wxMnh4IGRyaXZlcgordXBvbiBpbml0aWFsaXphdGlvbi4KK1RoZXNlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgc3BlY2lmaWMgdG8gdGhlIGNoaXAgb24gdGhlIHNwZWNpZmljIGRlc2lnbgorYW5kIHRoZXJlZm9yZSBhcmUgc2VudCBiYWNrIHRvIHRoZSBkcml2ZXIgdG8gc3RvcmUgaW4gbm9uLXZvbGF0aWxlIG1lbW9yeSBmb3IKK2xhdGVyIHVzZS4gVXBvbiBpbml0aWFsaXphdGlvbiwgdGhlIHdsMTJ4eCBkcml2ZXIgd2lsbCBsb2FkIGFuIE5WUyBmaWxlIHdoZXJlCitpdCBleHBlY3RzIHRvIHJlYWQgdGhvc2UgcGFyYW1ldGVycyBhbmQgc2VuZCB0aGVtIHRvIHRoZSBjaGlwLgorCitUaGUgTlZTIGZpbGUgY29udGFpbnMgMiBtYWluIHBhcnRzIC0gb25lIHN0b3JlcyB0aGUgY2FsaWJyYXRpb24gcGFyYW1ldGVycyBhbmQKK3RoZSBvdGhlciBvbmUgc3RvcmVzIGluaXRpYWxpemF0aW9uIGluZm9ybWF0aW9uIHJlcXVpcmVkIGZvciB0aGUgd2wxMnh4IGRyaXZlci4KKworLS0tIEJ1aWxkIHByb2NlZHVyZQorCitLZXJuZWwgY29uZmlndXJhdGlvbi4KK01ha2Ugc3VyZSB5b3VyIGtlcm5lbCBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQgbmw4MDIxMSB0ZXN0bW9kZSBjb21tYW5kcworKE5MODAyMTFfVEVTVE1PREU9eSkuIEFsc28gZW5hYmxlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uczoKK0NSQzc9bQorRldfTE9BREVSPW0KKworSW4gdXNlcnNwYWNlIHRoZXJlIGlzIGRlcGVuZGVudCBvbiBsaWJubCB2Mi54IHBhY2thZ2UuIEl0IGNhbiBiZSBkb3dubG9hZGVkCitmcm9tIGh0dHA6Ly93d3cuaW5mcmFkZWFkLm9yZy9+dGdyL2xpYm5sL2ZpbGVzL2xpYm5sLTIuMC50YXIuZ3oKKworU2V0IGZvbGxvdyBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CitleHBvcnQgTkZTUk9PVD08cGF0aCB0byByb29mcyBvZiBhIHRhcmdldCB3aGVyZSBpbnN0YWxsZWQgbGlibmwgbGlicmFyeT4KK2V4cG9ydCBDUk9TU19DT01QSUxFPWFybS1ub25lLWxpbnV4LWdudWVhYmktCittYWtlCittYWtlIGluc3RhbGwKKworTWFrZSBzdXJlIHRoYXQgY2FsaWJyYXRvciB1dGlsaXR5IGFuZCBnby5zaCBzY3JpcHQgcGxhY2VkIGluIHRoZSBzYW1lIGRpci4KKworLS0tIEhvdyB0byBjYWxpYnJhdGUKKworTmF0aXZlIExpbnV4IGNhbGlicmF0aW9uIHByb2NlZHVyZS4KKworICAgIC4vZ28uc2ggLWMgPHBhdGggdG8gSU5JIGZpbGU+IFs8cGF0aCB0byBmaXJtd2FyZSBkaXJlY3Rvcnk+XQorCitBbmRyb2lkIGNhbGlicmF0aW9uIHByb2NlZHVyZS4KKworICAgIEJhc2VkIG9uIGFkYiB1dGlsaXR5IHdoaWNoIGNvbWVzIG5hdGl2ZSB3aXRoIEFuZHJvaWQgU0RLCisKKyAgICBhZGIgc2hlbGwgImVjaG8gR29pbmcgdG8gc3RvcCBHVUkiCisgICAgYWRiIHNoZWxsICJzdG9wIgorCisgICAgYWRiIHNoZWxsICJlY2hvIENyZWF0ZSByZWZlcmVuY2UgTlZTIgorICAgIGFkYiBzaGVsbCAiY2FsaWJyYXRvciBzZXQgcmVmX252cyAvZGF0YS9UUVNfRF8xLjcuaW5pIgorCisgICAgYWRiIHNoZWxsICJlY2hvIENvcHkgcmVmZXJlbmNlIE5WUyBmaWxlIgorICAgIGFkYiBzaGVsbCAiY2F0IC4vbmV3LW52cy5iaW4gPiAvc3lzdGVtL2V0Yy9maXJtd2FyZS90aS1jb25uZWN0aXZpdHkvd2wxMjcxLW52cy5iaW4iCisKKyAgICBhZGIgc2hlbGwgImVjaG8gSW5zZXJ0IHdsMTJ4eCBTRElPIG1vZHVsZSIKKyAgICBhZGIgc2hlbGwgImluc21vZCAvc3lzdGVtL2xpYi9tb2R1bGVzL3dsMTJ4eF9zZGlvLmtvIgorCisgICAgYWRiIHNoZWxsICJlY2hvIENhbGlicmF0ZSBkZXZpY2UiCisgICAgYWRiIHNoZWxsICJjYWxpYnJhdG9yIHdsYW4wIHBsdCBwb3dlcl9tb2RlIG9uIgorICAgIGFkYiBzaGVsbCAiY2FsaWJyYXRvciB3bGFuMCBwbHQgdHVuZV9jaGFubmVsIDAgNyIKKyAgICBhZGIgc2hlbGwgImNhbGlicmF0b3Igd2xhbjAgcGx0IHR4X2JpcCAxIDEgMSAxIDEgMSAxIDEiCisgICAgYWRiIHNoZWxsICJjYWxpYnJhdG9yIHdsYW4wIHBsdCBwb3dlcl9tb2RlIG9mZiIKKworICAgIGFkYiBzaGVsbCAiZWNobyBTZXQgTUFDIGFkZHJlc3MgaW4gTlZTIGZpbGUiCisgICAgYWRiIHNoZWxsICJjYWxpYnJhdG9yIHNldCBudnNfbWFjIC4vbmV3LW52cy5iaW4gMDg6MDA6Mjg6OTA6NjQ6MzEiCisKKyAgICBhZGIgc2hlbGwgImVjaG8gUmVtb3ZlIHdsMTJ4eCBtb2R1bGVzIgorICAgIGFkYiBzaGVsbCAicm1tb2Qgd2wxMnh4X3NkaW8gd2wxMnh4IgorICAgIGFkYiBzaGVsbCAicm1tb2Qgd2wxMnh4IgorCisgICAgYWRiIHNoZWxsICJlY2hvIENvcHkgY2FsaWJyYXRlZCBOVlMgZmlsZSIKKyAgICBhZGIgc2hlbGwgImNhdCAuL25ldy1udnMuYmluID4gL3N5c3RlbS9ldGMvZmlybXdhcmUvdGktY29ubmVjdGl2aXR5L3dsMTI3MS1udnMuYmluIgorICAgIGFkYiBzaGVsbCAiaW5zbW9kIC9zeXN0ZW0vbGliL21vZHVsZXMvd2wxMnh4LmtvIgorCisgICAgYWRiIHNoZWxsICJlY2hvIEdvaW5nIHRvIHN0YXJ0IEdVSSIKKyAgICBhZGIgc2hlbGwgInN0YXJ0IgorCistLS0gSG93IHRvIGNhbGlicmF0ZSB3aXRoIEF1dG9GRU0KKworVGhlIHdsMTJ4eCBkcml2ZXIgaGFzIGFiaWxpdHkgdG8gdXNlIGl0J3MgTlZTIGZpbGUgd2l0aCByYWRpbyBwYXJhbWV0ZXJzIGZvciAyCitkaWZmZXJlbnQgZnJvbnRlbmQgbW9kdWxlcy4gVGhlIGRyaXZlciByZXF1aXJlcyBmaXJtd2FyZSBhdCBib290IHRpbWUgd2hpY2gKK0ZFTSBwYXJhbWV0ZXJzIGl0IG5lZWRzIGFuZCBwcm92aWRlcyByYWRpbyBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBhbnN3ZXIuCisKK1RoZXJlIGlzIGFsc28gc2NlbmFyaW8gd2hlbiBkcml2ZXIgZGVjaWRlcyB3aGljaCByYWRpbyBwYXJhbWV0ZXJzIHRvIGdpdmUKK3RvIGZpcm13YXJlLiBJbiBzdWNoIGNhc2UsIDIgcGFyYW1ldGVycyBzaG91bGQgYmUgc2V0LiBUaGUgYXV0b2ZlbSBzaG91bGQgYmUKKzAgYW5kIGZlbV9tYW51ZiBzaG91bGQgYmUgMCBvciAxLCBkZXBlbmRzIG9uIEZFTSBtYW51ZmFjdHVyZXIuCisKK0luIG9yZGVyIHRvIHByZXBhcmUgTlZTIGZpbGUgd2l0aCByYWRpbyBwYXJhbWV0ZXJzIGZvciAyIEZFTXMsIGRvIGZvbGxvd3MKKworICAgIC4vZ28uc2ggLWMyIDxwYXRoIHRvIElOSSBmaWxlPiBbPHBhdGggdG8gSU5JIGZpbGU+XQorCitUaGVyZSBpcyBvcHRpb24gdG8gdXNlIHRoZSBmZWF0dXJlIG1hbnVhbHkuIEluIHN1Y2ggY2FzZSwgdGhlcmUgaXMgbmVlZCB0byBzZXQKK0F1dG9GRU0gZmxhZyB0byAwIGFuZCBleHBsaWNpdGx5IHNldCBmZW1fbWFudWYgZmxhZy4KKworICAgIC4vY2FsaWJyYXRvciBzZXQgYXV0b2ZlbSA8MC1tYW51YWx8MS1hdXRvPiBbPG52cyBmaWxlPl0KKyAgICAuL2NhbGlicmF0b3Igc2V0IGZlbV9tYW51ZiA8MHwxPiBbPG52cyBmaWxlPl0KKworLS0tIEhvdyB0byBjaG9vc2UgSU5JIGZpbGUKKworSXQgaXMgdmVyeSBpbXBvcnRhbnQgdG8gc2VsZWN0IElOSSBmaWxlIGFjY29yZGluZyB0byB0aGUgZmlybXdhcmUgKHNlZSBiZWxvdykuCitUaG9zZSBmaWxlcyBvcmdhbml6ZWQgaW4gMyBkaXJlY3RvcmllczoKK3N0YXRpb24gLSBjdXJyZW50bHkgc3VwcG9ydGVkIHN0YXRpb24gZmlybXdhcmUgKHdsMTI3MS1mdy5iaW4pCithY2Nlc3NfcG9pbnQgLSBjdXJyZW50bHkgc3VwcG9ydGVkIGFjY2VzcyBwb2ludCAod2wxMjcxLWZ3LWFwLmJpbikKKworRm9yIEJlYWdsZSBib2FyZCBhbmQgUGFuZGEgYm9hcmQgdXNlIGluaV9maWxlcy9zdGF0aW9uLzEyN3gvVFFTX1NfMi42LmluaQorRm9yIEJsYXplIGJvYXJkIHdpdGggRVMyLjEgb3IgRVMyLjEgdXNlIGluaV9maWxlcy9zdGF0aW9uLzEyOHgvVFFTX0RfMS43LmluaQorCisKKy0tLSBIb3cgdG8gY2hhbmdlIE1BQyBhZGRyZXNzIGluIGNhbGlicmF0ZWQgTlZTCisKKy4vY2FsaWJyYXRvciBzZXQgbnZzX21hYyA8bnZzIGZpbGU+IFs8bWFjIGFkZHIgeHg6eHg6eHg6eHg6eHg6eHg+XQorCitJZiB0aGUgTUFDIGFkZHJlc3MgbWlzc2luZywgdGhlIHJhbmRvbSB2YWxpZCB2YWx1ZSB3aWxsIGJlIGFkZGVkLgorCisKKy0tLSBIb3cgdG8gZHVtcCBOVlMgZmlsZQorCitjYWxpYnJhdG9yIGdldCBkdW1wX252cyBbPG52cyBmaWxlbmFtZT5dCisKKworLS0tIEZpcm13YXJlIGZpbGVzCisKK1RoZSBmaXJtd2FyZSBmaWxlcyBjYW4gYmUgcmVhY2hlZCBmcm9tIGdpdCByZXBvc2l0b3J5CitnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvZHdtdzIvbGludXgtZmlybXdhcmUuZ2l0Cit1bmRlciBkaXJlY3RvcnkgdGktY29ubmVjdGl2aXR5LgorVGhlcmUgYXJlIDIgZmlybXdhcmUgZmlsZXMgdGhlcmU6Cit3bDEyNzEtZncuYmluICAgIC0gc3RhdGlvbiBmaXJtd2FyZQord2wxMjcxLWZ3LWFwLmJpbiAgICAtIGFjY2VzcyBwb2ludCBmaXJtd2FyZQorCisKKy0tLSBEZXRhaWxlZCBpbnN0cnVjdGlvbnMgZm9yIGNhbGlicmF0b3IgcHJvY2VkdXJlcworCitUaGUgZm9sbG93aW5nIGRldGFpbGVkIGluc3RydWN0aW9ucyBhcmUgY29sbGVjdGlvbiBvZiBjb21tYW5kcyBkb25lIGJ5CitkZWZhdWx0IGNhbGlicmF0aW9uIHByb2NlZHVyZS4KKworICAgIFR4QmlwIHByb2NlZHVyZSAoY2FsaWJyYXRpb24pCisKK0l0IGlzIGltcG9ydGFudCB0byBzZXQgTUFDIGFkZHJlc3MgdG8gYW4gaW50ZXJmYWNlIGJlZm9yZSB0aGUgcHJvY2VkdXJlLgorRm9yIGV4YW1wbGUsIGBpZmNvbmZpZyB3bGFuMCBodyBldGhlciB4eDp4eDp4eDp4eDp4eDp4eCcKK1RoZXJlIGFyZSAyIHdheXMgdG8gZG8gaXQgLSBzaG9ydCB3aGVyZSBhbGwgcGFyYW1ldGVycyBoYXMgZGVmYXVsdCB2YWx1ZXMgYW5kCitmdWxsIHdoZXJlIHlvdSBoYXZlIHRvIHNldCBhbGwgcGFyYW1ldGVycyBtYW51YWxseS4KKworU2hvcnQgd2F5OgorY2FsaWJyYXRvciBwbHQgY2FsaWJyYXRlCisKK0Z1bGwgd2F5OgorY2FsaWJyYXRvciB3bGFuMCBwbHQgcG93ZXJfbW9kZSBvbgorY2FsaWJyYXRvciB3bGFuMCBwbHQgdHhfYmlwIDwwfDE+IDwwfDE+IDwwfDE+IDwwfDE+IDwwfDE+IDwwfDE+IDwwfDE+IDwwfDE+CitjYWxpYnJhdG9yIHdsYW4wIHBsdCBwb3dlcl9tb2RlIG9mZgorCitSZXN1bHQgb2YgdGhpcyBwcm9jZWR1cmUgaXMgbmV3IE5WUyBmaWxlIGNyZWF0ZWQgbG9jYWxseSAuL25ldy1udnMuYmluCitJbiBvcmRlciB0byB1c2UgaXQsIGNvcHkgdGhlIGZpbGUgdG8gL2xpYi9maXJtd2FyZS93bDEyNzEtbnZzLmJpbiBhbmQgcmVsb2FkLgorCisgICAgVHhDb250IHByb2NlZHVyZQorCitjYWxpYnJhdG9yIHdsYW4wIHBsdCBwb3dlcl9tb2RlIG9uCitjYWxpYnJhdG9yIHdsYW4wIHBsdCB0dW5lX2NoYW5uZWwgPGJhbmQ+IDxjaGFubmVsPgorY2FsaWJyYXRvciB3bGFuMCBwbHQgdHhfY29udCA8ZGVsYXk+IDxyYXRlPiA8c2l6ZT4gPGFtb3VudD4gPHBvd2VyPiA8c2VlZD4gPHBrdCBtb2RlPiA8REMgb24vb2ZmPiA8Z2k+IDxwcmVhbWJsZT4gPHR5cGU+IDxzY3JhbWJsZT4gPGNscGM+IDxzZXEgbmJyIG1vZGU+IDxkZXN0IG1hYz4KK2NhbGlicmF0b3Igd2xhbjAgcGx0IHR4X3N0b3AKK2NhbGlicmF0b3Igd2xhbjAgcGx0IHBvd2VyX21vZGUgb2ZmCisKK0Rlc2NyaXB0aW9uOiBUaGlzIHRlc3Qgc2VuZHMgcGFja2V0cyBvZiBkYXRhIGRpcmVjdGx5IHRvIGFpci4gSXQgcmVjZWl2ZXMKK3NldmVyYWwgcGFyYW1ldGVycyBhcyBkZXNjcmliZWQgYmVsbG93LCB0byBlbmFibGUgZGl2ZXJzaXR5IG9mCitvcGVyYXRpb25hbCBtb2Rlcy4KK0l0IGlzIG1vc3RseSB1c2VkIHRvIHNlZSBFbmVyZ3kgYW5kIHJhZGlvIGltcGFjdCBvbiBBaXIuCitDb250ZW50IG9mIFBhY2tldCBjYW4gYmUgUmFuZG9tLCBvciBaZXJvLCBPbmUsIFplcm8sIG9uZS4uLgorCitQYWNrZXRzIHNlbmQgYXJlIGNvbmZpZ3VyYWJsZSB3aXRoIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICBEZWxheSBiZXR3ZWVuIHBhY2tldHMgaW4gbWljcm9zZWNvbmRzCisgIFJhdGUKKyAgICAxIE1icHMgLSAgIDB4MDAwMDAwMDEgICAgICAgTUNTXzAgLSAweDAwMDAyMDAwCisgICAgMiBNYnBzIC0gICAweDAwMDAwMDAyICAgICAgIE1DU18xIC0gMHgwMDAwNDAwMAorICAgIDUuNSBNYnBzIC0gMHgwMDAwMDAwNCAgICAgICBNQ1NfMiAtIDB4MDAwMDgwMDAKKyAgICA2IE1icHMgLSAgIDB4MDAwMDAwMDggICAgICAgTUNTXzMgLSAweDAwMDEwMDAwCisgICAgOSBNYnBzIC0gICAweDAwMDAwMDEwICAgICAgIE1DU180IC0gMHgwMDAyMDAwMAorICAgIDExIE1icHMgLSAgMHgwMDAwMDAyMCAgICAgICBNQ1NfNSAtIDB4MDAwNDAwMDAKKyAgICAxMiBNYnBzIC0gIDB4MDAwMDAwNDAgICAgICAgTUNTXzYgLSAweDAwMDgwMDAwCisgICAgMTggTWJwcyAtICAweDAwMDAwMDgwICAgICAgIE1DU183IC0gMHgwMDEwMDAwMAorICAgIDI0IE1icHMgLSAgMHgwMDAwMDIwMAorICAgIDM2IE1icHMgLSAgMHgwMDAwMDQwMAorICAgIDQ4IE1icHMgLSAgMHgwMDAwMDgwMAorICAgIDU0IE1icHMgLSAgMHgwMDAwMTAwMAorICBTaXplIG9mIGRhdGEgZmllbGQgaW4gTVBEVSAoaW4gYnl0ZXMsIDAgLSAyMjg0KQorICBBbW91bnQgLSBudW1iZXIgb2YgcGFja2V0cyBpbiBjYXNlIG9mIHVzaW5nIHNlcmllcyBtb2RlCisgIFBvd2VyIC0gb3V0cHV0IHBvd2VyIGluIGRCbSoxMDAwCisgIFNlZWQgLSB2YWx1ZSBmb3IgdGhlIHNjcmFtYmxlcgorICBQYWNrZXQgbW9kZSAtIDAtc2luZ2xlLCAxLW11bHRpcGlsZSwgMy1jb250aW51b3VzLCA0LUZDQworICBEQyBvbi9vZmYgLSBhY3RpdmF0ZSBEQ0YKKyAgZ2kgLSBndWFyZCBpbnRlcnZhbCBvbi9vZmYgZm9yIDExbiByYXRlcworICBQcmVhbWJsZQorICAgIDEgTWJwcyAtIGxvbmcgcHJlYW1ibGUgbW9kZT0wCisgICAgMiwgNS41LCAxMSBNYnBzIC0gbG9uZyBwcmVhbWJsZSBtb2RlPTAsIHNob3J0IHByZWFtYmxlIG1vZGU9MQorICAgIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQgTWJwcyAtIG9mZG0gcHJlYW1ibGUgbW9kZT00CisgICAgZnJvbSBNQ1NfMCB0byBNQ1NfNyAtIG4gbWl4ZWQgbW9kZSBwcmVhbWJsZSBtb2RlPTYsIGdyZWVuZmllbGQgcHJlYW1ibGUgbW9kZT03CisgIFR5cGUgaXMgMC1kYXRhIHBhY2tldCwgMS1hY2ssIDItcHJvYmUgcmVxLCAzLXJhbmRvbSBkYXRhLCA0LXVzZXIgZGF0YQorICBTY3JhbWJsZXIgLSBvbi9vZmYKKyAgQ0xQQworICAgIHJhbmdlIDAtMTAwIGlzIGRpc2FibGUgY2FsaWJyYXRpb24KKyAgU2VxdWVuY2UgbnVtYmVyIG1vZGUgKGluY3JlbWVudGVkIG9yIGZpeGVkKQorICBEZXN0aW5hdGlvbiBNYWMgYWRkcmVzcworCisgICAgUnhTdGF0IHByb2NlZHVyZQorCitUaGVyZSBhcmUgMiB3YXlzIHRvIGRvIGl0IC0gc2hvcnQgd2hlcmUgYWxsIHBhcmFtZXRlcnMgaGFzIGRlZmF1bHQgdmFsdWVzIGFuZAorZnVsbCB3aGVyZSB5b3UgaGF2ZSB0byBzZXQgYWxsIHBhcmFtZXRlcnMgbWFudWFsbHkuCisKK1Nob3J0IHdheToKK2NhbGlicmF0b3IgcGx0IHJ4X3N0YXRpc3RpY3MKKworSW4gdGhlIHNob3J0IHdheSBlYWNoIHRpbWUgdGhlIHN0YXRpc3RpY3Mgd2lsbCBiZSByZXNldGVkLgorCitGdWxsIHdheToKK2NhbGlicmF0b3Igd2xhbjAgcGx0IHBvd2VyX21vZGUgb24KK2NhbGlicmF0b3Igd2xhbjAgcGx0IHN0YXJ0X3J4X3N0YXRjcworY2FsaWJyYXRvciB3bGFuMCBwbHQgZ2V0X3J4X3N0YXRjcworY2FsaWJyYXRvciB3bGFuMCBwbHQgc3RvcF9yeF9zdGF0Y3MKK2NhbGlicmF0b3Igd2xhbjAgcGx0IHBvd2VyX21vZGUgb2ZmCisKK1doaWxlIHdpbGxpbmcgdG8gcmVzZXQgdGhlIHN0YXRpc3RpYyBydW46CitjYWxpYnJhdG9yIHdsYW4wIHBsdCByZXNldF9yeF9zdGF0Y3MKKworICAgIFVwZGF0ZSBOVlMgZmlsZSBwcm9jZWR1cmUKKworVGhpcyBpcyBwcm9jZWR1cmUgY2hhbmdlcyBpbmkgcGFydCBvZiBOVlMgZmlsZS4gSXQgaGVscHMgd2hlbiB0aGVyZSBpcyBuZWVkCit0byBjaGFuZ2UgaW5pIHBhcnQgb2YgTlZTIHdoaWNoIGFscmVhZHkgY2FsaWJyYXRlZC4KKworY2FsaWJyYXRvciBzZXQgdXBkX252cyA8aW5pIGZpbGU+IFs8bnZzIGZpbGU+XQorCitJZiBOVlMgZmlsZW5hbWUgcGFyYW1ldGVyIG5vdCBwcm92aWRlZCB0aGUgY3VycmVudCBOVlMgZmlsZSB3aWxsIGJlIHVzZWQgZnJvbQorZGVzdGluYXRpb24gZGlyZWN0b3J5ICh1c3VhbGx5IC9saWIvZmlybXdhcmUpLgorCisKKy0tLSBNaXNjZWxsYW5lb3VzIHByb2NlZHVyZXMKKworICAgIFJlYWQgTUFDIGFkZHJlc3MgZnJvbSBOVlMgZmlsZQorCitjYWxpYnJhdG9yIGdldCBudnNfbWFjIDxudnMgZmlsZW5hbWU+CisKKworICAgIFB1c2ggbG9jYWwgTlZTIHRvIHRoZSBzeXN0ZW06CisKK2NhbGlicmF0b3IgcGh5IDxwaHluYW1lPiBzZXQgcHVzaF9udnMgPG52cyBmaWxlbmFtZT4KKworCisgICAgU2V0IE5WUyB0byB1c2UgYXV0byBGRU0gZGV0ZWN0aW9uCisKK2NhbGlicmF0b3Igc2V0IGF1dG9mZW0gMQorCisKKyAgICBTZXQgRkVNIG1hbnVmYWN0dXJlcgorCitjYWxpYnJhdG9yIHNldCBmZW1fbWFudWYgMHwxCisKKworICAgIFRvbmUgdHJhbnNtaXNzaW9uIHRlc3RpbmcKK0dldCBpbiBQTFQgbW9kZQorY2FsaWJyYXRvciB3bGFuMCBwbHQgcG93ZXJfbW9kZSBvbgorCitSdW4gVHhUb25lIHRyYW5zbWlzc2lvbgorY2FsaWJyYXRvciBzZXQgcGx0X3R4X3RvbmUgPHBvd2VyPiA8dG9uZSB0eXBlPgorUG93ZXIKK1RvbmUgdHlwZQorIDEgLSBTaW5nbGUgdG9uZQorIDIgLSBDYXJyaWVyIEZlZWRUaHJvdWdoCisKK1N0b3AgdHJhbnNtaXNzaW9uCitjYWxpYnJhdG9yIHdsYW4wIHBsdCB0eF9zdG9wCisKK0dldCBvdXQgZnJvbSBQTFQgbW9kZQorY2FsaWJyYXRvciB3bGFuMCBwbHQgcG93ZXJfbW9kZSBvZmYKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgcHJvamVjdCBjYW4gYmUgYWNjZXNzZWQgZnJvbSBnaXQgcmVwb3NpdG9yeToKKyAgICBnaXQgY2xvbmUgZ2l0Oi8vZ2l0aHViLmNvbS9neGsvdGktdXRpbHMuZ2l0CisKK1BsZWFzZSBzZW5kIGFsbCBwYXRjaGVzIHRvIEdlcnkgS2FobiA8Z2VyeWtAdGkuY29tPgorYW5kIENDIGxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZyBmb3IgY29tbXVuaXR5IHJldmlldy4KKwpkaWZmIC0tZ2l0IGEvbWFjODAyMTEvdGktdXRpbHMvY2FsaWJyYXRvci5jIGIvbWFjODAyMTEvdGktdXRpbHMvY2FsaWJyYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczY2UxZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tYWM4MDIxMS90aS11dGlscy9jYWxpYnJhdG9yLmMKQEAgLTAsMCArMSw1NjEgQEAKKy8qCisgKiBQTFQgdXRpbGl0eSBmb3Igd2lyZWxlc3MgY2hpcCBzdXBwb3J0ZWQgYnkgVEkncyBkcml2ZXIgd2wxMnh4CisgKgorICogU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2luY2x1ZGUgPG5ldGxpbmsvZ2VubC9nZW5sLmg+CisjaW5jbHVkZSA8bmV0bGluay9nZW5sL2ZhbWlseS5oPgorI2luY2x1ZGUgPG5ldGxpbmsvZ2VubC9jdHJsLmg+CisjaW5jbHVkZSA8bmV0bGluay9tc2cuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2F0dHIuaD4KKworI2luY2x1ZGUgIm5sODAyMTEuaCIKKyNpbmNsdWRlICJjYWxpYnJhdG9yLmgiCisjaW5jbHVkZSAicGx0LmgiCisjaW5jbHVkZSAiaW5pLmgiCisKK2NoYXIgY2FsaWJyYXRvcl92ZXJzaW9uW10gPSAiMC43MSI7CisjaWZuZGVmIENPTkZJR19MSUJOTDIwCisvKiBsaWJubCAyLjAgY29tcGF0aWJpbGl0eSBjb2RlICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5sX2hhbmRsZSAqbmxfc29ja2V0X2FsbG9jKHZvaWQpCit7CisgICAgcmV0dXJuIG5sX2hhbmRsZV9hbGxvYygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmxfc29ja2V0X2ZyZWUoc3RydWN0IG5sX3NvY2sgKmgpCit7CisgICAgbmxfaGFuZGxlX2Rlc3Ryb3koaCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fZ2VubF9jdHJsX2FsbG9jX2NhY2hlKHN0cnVjdCBubF9zb2NrICpoLAorICAgIHN0cnVjdCBubF9jYWNoZSAqKmNhY2hlKQoreworICAgIHN0cnVjdCBubF9jYWNoZSAqdG1wID0gZ2VubF9jdHJsX2FsbG9jX2NhY2hlKGgpOworICAgIGlmICghdG1wKSB7CisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIH0KKyAgICAqY2FjaGUgPSB0bXA7CisgICAgcmV0dXJuIDA7Cit9CisjZGVmaW5lIGdlbmxfY3RybF9hbGxvY19jYWNoZSBfX2dlbmxfY3RybF9hbGxvY19jYWNoZQorI2VuZGlmIC8qIENPTkZJR19MSUJOTDIwICovCisKK2ludCBjYWxpYnJhdG9yX2RlYnVnOworCitzdGF0aWMgaW50IG5sODAyMTFfaW5pdChzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUpCit7CisgICAgaW50IGVycjsKKworICAgIHN0YXRlLT5ubF9zb2NrID0gbmxfc29ja2V0X2FsbG9jKCk7CisgICAgaWYgKCFzdGF0ZS0+bmxfc29jaykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXRsaW5rIHNvY2tldC5cbiIpOworICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisKKyAgICBpZiAoZ2VubF9jb25uZWN0KHN0YXRlLT5ubF9zb2NrKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjb25uZWN0IHRvIGdlbmVyaWMgbmV0bGluay5cbiIpOworICAgICAgICBlcnIgPSAtRU5PTElOSzsKKyAgICAgICAgZ290byBvdXRfaGFuZGxlX2Rlc3Ryb3k7CisgICAgfQorCisgICAgaWYgKGdlbmxfY3RybF9hbGxvY19jYWNoZShzdGF0ZS0+bmxfc29jaywgJnN0YXRlLT5ubF9jYWNoZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gYWxsb2NhdGUgZ2VuZXJpYyBuZXRsaW5rIGNhY2hlLlxuIik7CisgICAgICAgIGVyciA9IC1FTk9NRU07CisgICAgICAgIGdvdG8gb3V0X2hhbmRsZV9kZXN0cm95OworICAgIH0KKworICAgIHN0YXRlLT5ubDgwMjExID0gZ2VubF9jdHJsX3NlYXJjaF9ieV9uYW1lKHN0YXRlLT5ubF9jYWNoZSwgIm5sODAyMTEiKTsKKyAgICBpZiAoIXN0YXRlLT5ubDgwMjExKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibmw4MDIxMSBub3QgZm91bmQuXG4iKTsKKyAgICAgICAgZXJyID0gLUVOT0VOVDsKKyAgICAgICAgZ290byBvdXRfY2FjaGVfZnJlZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworIG91dF9jYWNoZV9mcmVlOgorICAgIG5sX2NhY2hlX2ZyZWUoc3RhdGUtPm5sX2NhY2hlKTsKKyBvdXRfaGFuZGxlX2Rlc3Ryb3k6CisgICAgbmxfc29ja2V0X2ZyZWUoc3RhdGUtPm5sX3NvY2spOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIG5sODAyMTFfY2xlYW51cChzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUpCit7CisgICAgZ2VubF9mYW1pbHlfcHV0KHN0YXRlLT5ubDgwMjExKTsKKyAgICBubF9jYWNoZV9mcmVlKHN0YXRlLT5ubF9jYWNoZSk7CisgICAgbmxfc29ja2V0X2ZyZWUoc3RhdGUtPm5sX3NvY2spOworfQorCitzdGF0aWMgaW50IGNtZF9zaXplOworCitleHRlcm4gc3RydWN0IGNtZCBfX3N0YXJ0X19fY21kOworZXh0ZXJuIHN0cnVjdCBjbWQgX19zdG9wX19fY21kOworCisjZGVmaW5lIGZvcl9lYWNoX2NtZChfY21kKSAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoX2NtZCA9ICZfX3N0YXJ0X19fY21kOyBfY21kIDwgJl9fc3RvcF9fX2NtZDsgICAgICAgIFwKKyAgICAgICAgIF9jbWQgPSAoY29uc3Qgc3RydWN0IGNtZCAqKSgoY2hhciAqKV9jbWQgKyBjbWRfc2l6ZSkpCisKKworc3RhdGljIHZvaWQgX191c2FnZV9jbWQoY29uc3Qgc3RydWN0IGNtZCAqY21kLCBjaGFyICppbmRlbnQsIGJvb2wgZnVsbCkKK3sKKyAgICBjb25zdCBjaGFyICpzdGFydCwgKmxlbmQsICplbmQ7CisKKyAgICBwcmludGYoIiVzIiwgaW5kZW50KTsKKworICAgIHN3aXRjaCAoY21kLT5pZGJ5KSB7CisgICAgY2FzZSBDSUJfTk9ORToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDSUJfUEhZOgorICAgICAgICBwcmludGYoInBoeSA8cGh5bmFtZT4gIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0lCX05FVERFVjoKKyAgICAgICAgcHJpbnRmKCJkZXYgPGRldm5hbWU+ICIpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGNtZC0+cGFyZW50ICYmIGNtZC0+cGFyZW50LT5uYW1lKSB7CisgICAgICAgIHByaW50ZigiJXMgIiwgY21kLT5wYXJlbnQtPm5hbWUpOworICAgIH0KKyAgICBwcmludGYoIiVzIiwgY21kLT5uYW1lKTsKKyAgICBpZiAoY21kLT5hcmdzKSB7CisgICAgICAgIHByaW50ZigiICVzIiwgY21kLT5hcmdzKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworCisgICAgaWYgKCFmdWxsIHx8ICFjbWQtPmhlbHApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGhhY2sgKi8KKyAgICBpZiAoc3RybGVuKGluZGVudCkpIHsKKyAgICAgICAgaW5kZW50ID0gIlx0XHQiOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KKworICAgIC8qIHByaW50IGxpbmUgYnkgbGluZSAqLworICAgIHN0YXJ0ID0gY21kLT5oZWxwOworICAgIGVuZCA9IHN0cmNocihzdGFydCwgJ1wwJyk7CisgICAgZG8geworICAgICAgICBsZW5kID0gc3RyY2hyKHN0YXJ0LCAnXG4nKTsKKyAgICAgICAgaWYgKCFsZW5kKSB7CisgICAgICAgICAgICBsZW5kID0gZW5kOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiJXMiLCBpbmRlbnQpOworICAgICAgICBwcmludGYoIiUuKnNcbiIsIChpbnQpKGxlbmQgLSBzdGFydCksIHN0YXJ0KTsKKyAgICAgICAgc3RhcnQgPSBsZW5kICsgMTsKKyAgICB9IHdoaWxlIChlbmQgIT0gbGVuZCk7CisKKyAgICBwcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHVzYWdlX29wdGlvbnModm9pZCkKK3sKKyAgICBwcmludGYoIk9wdGlvbnM6XG4iKTsKKyAgICBwcmludGYoIlx0LS1kZWJ1Z1x0XHRlbmFibGUgbmV0bGluayBkZWJ1Z2dpbmdcbiIpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYXJndjA7CisKK3N0YXRpYyB2b2lkIHVzYWdlKGJvb2wgZnVsbCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgY21kICpzZWN0aW9uLCAqY21kOworCisgICAgcHJpbnRmKCJVc2FnZTpcdCVzIFtvcHRpb25zXSBjb21tYW5kXG4iLCBhcmd2MCk7CisgICAgdXNhZ2Vfb3B0aW9ucygpOworICAgIHByaW50ZigiXHQtLXZlcnNpb25cdHNob3cgdmVyc2lvbiAoJXMpXG4iLCBjYWxpYnJhdG9yX3ZlcnNpb24pOworICAgIHByaW50ZigiQ29tbWFuZHM6XG4iKTsKKyAgICBmb3JfZWFjaF9jbWQoc2VjdGlvbikgeworICAgICAgICBpZiAoc2VjdGlvbi0+cGFyZW50KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWN0aW9uLT5oYW5kbGVyICYmICFzZWN0aW9uLT5oaWRkZW4pIHsKKyAgICAgICAgICAgIF9fdXNhZ2VfY21kKHNlY3Rpb24sICJcdCIsIGZ1bGwpOworICAgICAgICB9CisKKyAgICAgICAgZm9yX2VhY2hfY21kKGNtZCkgeworICAgICAgICAgICAgaWYgKHNlY3Rpb24gIT0gY21kLT5wYXJlbnQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghY21kLT5oYW5kbGVyIHx8IGNtZC0+aGlkZGVuKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX3VzYWdlX2NtZChjbWQsICJcdCIsIGZ1bGwpOworICAgICAgICB9CisgICAgfQorI2lmIDAKKyAgICBwcmludGYoIlxuWW91IGNhbiBvbWl0IHRoZSAncGh5JyBvciAnZGV2JyBpZiAiCisgICAgICAgICAgICAidGhlIGlkZW50aWZpY2F0aW9uIGlzIHVuaXF1ZSxcbiIKKyAgICAgICAgICAgICJlLmcuIFwiaXcgd2xhbjAgaW5mb1wiIG9yIFwiaXcgcGh5MCBpbmZvXCIuICIKKyAgICAgICAgICAgICIoRG9uJ3Qgd2hlbiBzY3JpcHRpbmcuKVxuXG4iCisgICAgICAgICAgICAiRG8gTk9UIHNjcmVlbnNjcmFwZSB0aGlzIHRvb2wsIHdlIGRvbid0ICIKKyAgICAgICAgICAgICJjb25zaWRlciBpdHMgb3V0cHV0IHN0YWJsZS5cblxuIik7CisjZW5kaWYKK30KKworc3RhdGljIGludCBwcmludF9oZWxwKHN0cnVjdCBubDgwMjExX3N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgc3RydWN0IG5sX2NiICpjYiwKKyAgICAgICAgICAgICAgc3RydWN0IG5sX21zZyAqbXNnLAorICAgICAgICAgICAgICBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgZXhpdCgzKTsKK30KK1RPUExFVkVMKGhlbHAsIE5VTEwsIDAsIDAsIENJQl9OT05FLCBwcmludF9oZWxwLAorICAgICAiUHJpbnQgdXNhZ2UgZm9yIGVhY2ggY29tbWFuZC4iKTsKKworc3RhdGljIHZvaWQgdXNhZ2VfY21kKGNvbnN0IHN0cnVjdCBjbWQgKmNtZCkKK3sKKyAgICBwcmludGYoIlxuVXNhZ2U6XHQlcyBbb3B0aW9uc10gIiwgYXJndjApOworICAgIF9fdXNhZ2VfY21kKGNtZCwgIiIsIHRydWUpOworICAgIHVzYWdlX29wdGlvbnMoKTsKK30KKworc3RhdGljIHZvaWQgdmVyc2lvbih2b2lkKQoreworICAgIHByaW50ZigiY2FsaWJyYXRvciB2ZXJzaW9uICVzXG4iLCBjYWxpYnJhdG9yX3ZlcnNpb24pOworfQorCitzdGF0aWMgaW50IHBoeV9sb29rdXAoY2hhciAqbmFtZSkKK3sKKyAgICBjaGFyIGJ1ZlsyMDBdOworICAgIGludCBmZCwgcG9zOworCisgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIi9zeXMvY2xhc3MvaWVlZTgwMjExLyVzL2luZGV4IiwgbmFtZSk7CisKKyAgICBmZCA9IG9wZW4oYnVmLCBPX1JET05MWSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHBvcyA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTsKKyAgICBpZiAocG9zIDwgMCkgeworICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYnVmW3Bvc10gPSAnXDAnOworICAgIGNsb3NlKGZkKTsKKyAgICByZXR1cm4gYXRvaShidWYpOworfQorCitzdGF0aWMgaW50IGVycm9yX2hhbmRsZXIoc3RydWN0IHNvY2thZGRyX25sICpubGEsIHN0cnVjdCBubG1zZ2VyciAqZXJyLAorICAgICAgICAgICAgIHZvaWQgKmFyZykKK3sKKyAgICBpbnQgKnJldCA9IGFyZzsKKyAgICAqcmV0ID0gZXJyLT5lcnJvcjsKKworICAgIHJldHVybiBOTF9TVE9QOworfQorCitzdGF0aWMgaW50IGZpbmlzaF9oYW5kbGVyKHN0cnVjdCBubF9tc2cgKm1zZywgdm9pZCAqYXJnKQoreworICAgIGludCAqcmV0ID0gYXJnOworICAgICpyZXQgPSAwOworCisgICAgcmV0dXJuIE5MX1NLSVA7Cit9CisKK3N0YXRpYyBpbnQgYWNrX2hhbmRsZXIoc3RydWN0IG5sX21zZyAqbXNnLCB2b2lkICphcmcpCit7CisgICAgaW50ICpyZXQgPSBhcmc7CisgICAgKnJldCA9IDA7CisKKyAgICByZXR1cm4gTkxfU1RPUDsKK30KKworc3RhdGljIGludCBfX2hhbmRsZV9jbWQoc3RydWN0IG5sODAyMTFfc3RhdGUgKnN0YXRlLCBlbnVtIGlkX2lucHV0IGlkYnksCisgICAgICAgICAgICBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGNvbnN0IHN0cnVjdCBjbWQgKipjbWRvdXQpCit7CisgICAgY29uc3Qgc3RydWN0IGNtZCAqY21kLCAqbWF0Y2ggPSBOVUxMLCAqc2VjdGNtZDsKKyAgICBzdHJ1Y3QgbmxfY2IgKmNiOworICAgIHN0cnVjdCBubF9tc2cgKm1zZzsKKyAgICBpbnQgZGV2aWR4ID0gMDsKKyAgICBpbnQgZXJyLCBvX2FyZ2M7CisgICAgY29uc3QgY2hhciAqY29tbWFuZCwgKnNlY3Rpb247CisgICAgY2hhciAqdG1wLCAqKm9fYXJndjsKKyAgICBlbnVtIGNvbW1hbmRfaWRlbnRpZnlfYnkgY29tbWFuZF9pZGJ5ID0gQ0lCX05PTkU7CisjaWYgMAorICAgIGlmIChmaWxlX2V4aXN0KENVUlJFTlRfTlZTX05BTUUpIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuXHRVbmFibGUgdG8gZmluZCBOVlMgZmlsZSAoJXMpLlxuXHQiCisgICAgICAgICAgICAiTWFrZSBzdXJlIHRvIHVzZSByZWZlcmVuY2UtbnZzLmJpbiBpbnN0ZWFkLlxuXG4iLAorICAgICAgICAgICAgQ1VSUkVOVF9OVlNfTkFNRSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyNlbmRpZgorICAgIGlmIChhcmdjIDw9IDEpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgb19hcmdjID0gYXJnYzsKKyAgICBvX2FyZ3YgPSBhcmd2OworCisgICAgc3dpdGNoIChpZGJ5KSB7CisgICAgY2FzZSBJSV9QSFlfSURYOgorICAgICAgICBjb21tYW5kX2lkYnkgPSBDSUJfUEhZOworICAgICAgICBkZXZpZHggPSBzdHJ0b3VsKCphcmd2ICsgNCwgJnRtcCwgMCk7CisgICAgICAgIGlmICgqdG1wICE9ICdcMCcpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGFyZ2MtLTsKKyAgICAgICAgYXJndisrOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElJX1BIWV9OQU1FOgorICAgICAgICBjb21tYW5kX2lkYnkgPSBDSUJfUEhZOworICAgICAgICBkZXZpZHggPSBwaHlfbG9va3VwKCphcmd2KTsKKyAgICAgICAgYXJnYy0tOworICAgICAgICBhcmd2Kys7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSUlfTkVUREVWOgorICAgICAgICBjb21tYW5kX2lkYnkgPSBDSUJfTkVUREVWOworICAgICAgICBkZXZpZHggPSBpZl9uYW1ldG9pbmRleCgqYXJndik7CisgICAgICAgIGlmIChkZXZpZHggPT0gMCkgeworICAgICAgICAgICAgZGV2aWR4ID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgYXJnYy0tOworICAgICAgICBhcmd2Kys7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChkZXZpZHggPCAwKSB7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgc2VjdGlvbiA9ICphcmd2OworICAgIGFyZ2MtLTsKKyAgICBhcmd2Kys7CisKKyAgICBmb3JfZWFjaF9jbWQoc2VjdGNtZCkgeworICAgICAgICBpZiAoc2VjdGNtZC0+cGFyZW50KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvKiBvayAuLi4gYml0IG9mIGEgaGFjayBmb3IgdGhlIGR1cGUgJ2luZm8nIHNlY3Rpb24gKi8KKyAgICAgICAgaWYgKG1hdGNoICYmIHNlY3RjbWQtPmlkYnkgIT0gY29tbWFuZF9pZGJ5KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJjbXAoc2VjdGNtZC0+bmFtZSwgc2VjdGlvbikgPT0gMCkgeworICAgICAgICAgICAgbWF0Y2ggPSBzZWN0Y21kOworICAgICAgICB9CisgICAgfQorCisgICAgc2VjdGNtZCA9IG1hdGNoOworICAgIG1hdGNoID0gTlVMTDsKKyAgICBpZiAoIXNlY3RjbWQpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKGFyZ2MgPiAwKSB7CisgICAgICAgIGNvbW1hbmQgPSAqYXJndjsKKworICAgICAgICBmb3JfZWFjaF9jbWQoY21kKSB7CisgICAgICAgICAgICBpZiAoIWNtZC0+aGFuZGxlcikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNtZC0+cGFyZW50ICE9IHNlY3RjbWQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjbWQtPmlkYnkgIT0gY29tbWFuZF9pZGJ5KSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RyY21wKGNtZC0+bmFtZSwgY29tbWFuZCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhcmdjID4gMSAmJiAhY21kLT5hcmdzKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaCA9IGNtZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1hdGNoKSB7CisgICAgICAgICAgICBhcmdjLS07CisgICAgICAgICAgICBhcmd2Kys7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGlmIChtYXRjaCkgeworICAgICAgICBjbWQgPSBtYXRjaDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBVc2UgdGhlIHNlY3Rpb24gaXRzZWxmLCBpZiBwb3NzaWJsZS4gKi8KKyAgICAgICAgY21kID0gc2VjdGNtZDsKKyAgICAgICAgaWYgKGFyZ2MgJiYgIWNtZC0+YXJncykgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtZC0+aWRieSAhPSBjb21tYW5kX2lkYnkpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmICghY21kLT5oYW5kbGVyKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjbWRvdXQpIHsKKyAgICAgICAgKmNtZG91dCA9IGNtZDsKKyAgICB9CisKKyAgICBpZiAoIWNtZC0+Y21kKSB7CisgICAgICAgIGFyZ2MgPSBvX2FyZ2M7CisgICAgICAgIGFyZ3YgPSBvX2FyZ3Y7CisgICAgICAgIHJldHVybiBjbWQtPmhhbmRsZXIoc3RhdGUsIE5VTEwsIE5VTEwsIGFyZ2MsIGFyZ3YpOworICAgIH0KKworICAgIG1zZyA9IG5sbXNnX2FsbG9jKCk7CisgICAgaWYgKCFtc2cpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gYWxsb2NhdGUgbmV0bGluayBtZXNzYWdlXG4iKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgY2IgPSBubF9jYl9hbGxvYyhjYWxpYnJhdG9yX2RlYnVnID8gTkxfQ0JfREVCVUcgOiBOTF9DQl9ERUZBVUxUKTsKKyAgICBpZiAoIWNiKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIGFsbG9jYXRlIG5ldGxpbmsgY2FsbGJhY2tzXG4iKTsKKyAgICAgICAgZXJyID0gMjsKKyAgICAgICAgZ290byBvdXRfZnJlZV9tc2c7CisgICAgfQorCisgICAgZ2VubG1zZ19wdXQobXNnLCAwLCAwLCBnZW5sX2ZhbWlseV9nZXRfaWQoc3RhdGUtPm5sODAyMTEpLCAwLAorICAgICAgICAgICAgY21kLT5ubF9tc2dfZmxhZ3MsIGNtZC0+Y21kLCAwKTsKKworICAgIHN3aXRjaCAoY29tbWFuZF9pZGJ5KSB7CisgICAgY2FzZSBDSUJfUEhZOgorICAgICAgICBOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9XSVBIWSwgZGV2aWR4KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDSUJfTkVUREVWOgorICAgICAgICBOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9JRklOREVYLCBkZXZpZHgpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBlcnIgPSBjbWQtPmhhbmRsZXIoc3RhdGUsIGNiLCBtc2csIGFyZ2MsIGFyZ3YpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gaGFuZGxlXG4iKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgZXJyID0gbmxfc2VuZF9hdXRvX2NvbXBsZXRlKHN0YXRlLT5ubF9zb2NrLCBtc2cpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIGF1dG9jb21wbGV0ZVxuIik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGVyciA9IDE7CisKKyAgICBubF9jYl9lcnIoY2IsIE5MX0NCX0NVU1RPTSwgZXJyb3JfaGFuZGxlciwgJmVycik7CisgICAgbmxfY2Jfc2V0KGNiLCBOTF9DQl9GSU5JU0gsIE5MX0NCX0NVU1RPTSwgZmluaXNoX2hhbmRsZXIsICZlcnIpOworICAgIG5sX2NiX3NldChjYiwgTkxfQ0JfQUNLLCBOTF9DQl9DVVNUT00sIGFja19oYW5kbGVyLCAmZXJyKTsKKworICAgIHdoaWxlIChlcnIgPiAwKQorICAgICAgICBubF9yZWN2bXNncyhzdGF0ZS0+bmxfc29jaywgY2IpOworCisgb3V0OgorICAgIG5sX2NiX3B1dChjYik7Cisgb3V0X2ZyZWVfbXNnOgorICAgIG5sbXNnX2ZyZWUobXNnKTsKKyAgICByZXR1cm4gZXJyOworCisgbmxhX3B1dF9mYWlsdXJlOgorICAgIGZwcmludGYoc3RkZXJyLCAiYnVpbGRpbmcgbWVzc2FnZSBmYWlsZWRcbiIpOworICAgIHJldHVybiAyOworfQorCitpbnQgaGFuZGxlX2NtZChzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUsIGVudW0gaWRfaW5wdXQgaWRieSwKKyAgICAgICAgICAgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIHJldHVybiBfX2hhbmRsZV9jbWQoc3RhdGUsIGlkYnksIGFyZ2MsIGFyZ3YsIE5VTEwpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgc3RydWN0IG5sODAyMTFfc3RhdGUgbmxzdGF0ZTsKKyAgICBpbnQgZXJyOworICAgIGNvbnN0IHN0cnVjdCBjbWQgKmNtZCA9IE5VTEw7CisKKyAgICAvKiBjYWxjdWxhdGUgY29tbWFuZCBzaXplIGluY2x1ZGluZyBwYWRkaW5nICovCisgICAgY21kX3NpemUgPSBhYnMoKGxvbmcpJl9fc2VjdGlvbl9zZXQgLSAobG9uZykmX19zZWN0aW9uX2dldCk7CisgICAgLyogc3RyaXAgb2ZmIHNlbGYgKi8KKyAgICBhcmdjLS07CisgICAgYXJndjAgPSAqYXJndisrOworCisgICAgaWYgKGFyZ2MgPiAwICYmIHN0cmNtcCgqYXJndiwgIi0tZGVidWciKSA9PSAwKSB7CisgICAgICAgIGNhbGlicmF0b3JfZGVidWcgPSAxOworICAgICAgICBhcmdjLS07CisgICAgICAgIGFyZ3YrKzsKKyAgICB9CisKKyAgICBpZiAoYXJnYyA+IDAgJiYgc3RyY21wKCphcmd2LCAiLS12ZXJzaW9uIikgPT0gMCkgeworICAgICAgICB2ZXJzaW9uKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIG5lZWQgdG8gdHJlYXQgImhlbHAiIGNvbW1hbmQgc3BlY2lhbGx5IHNvIGl0IHdvcmtzIHcvbyBubDgwMjExICovCisgICAgaWYgKGFyZ2MgPT0gMCB8fCBzdHJjbXAoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworICAgICAgICB1c2FnZShhcmdjICE9IDApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBlcnIgPSBubDgwMjExX2luaXQoJm5sc3RhdGUpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKHN0cmNtcCgqYXJndiwgImRldiIpID09IDAgJiYgYXJnYyA+IDEpIHsKKyAgICAgICAgYXJnYy0tOworICAgICAgICBhcmd2Kys7CisgICAgICAgIGVyciA9IF9faGFuZGxlX2NtZCgmbmxzdGF0ZSwgSUlfTkVUREVWLCBhcmdjLCBhcmd2LCAmY21kKTsKKyAgICB9IGVsc2UgaWYgKHN0cm5jbXAoKmFyZ3YsICJwaHkiLCAzKSA9PSAwICYmIGFyZ2MgPiAxKSB7CisgICAgICAgIGlmIChzdHJsZW4oKmFyZ3YpID09IDMpIHsKKyAgICAgICAgICAgIGFyZ2MtLTsKKyAgICAgICAgICAgIGFyZ3YrKzsKKyAgICAgICAgICAgIGVyciA9IF9faGFuZGxlX2NtZCgmbmxzdGF0ZSwgSUlfUEhZX05BTUUsCisgICAgICAgICAgICAgICAgYXJnYywgYXJndiwgJmNtZCk7CisgICAgICAgIH0gZWxzZSBpZiAoKigqYXJndiArIDMpID09ICcjJykKKyAgICAgICAgICAgIGVyciA9IF9faGFuZGxlX2NtZCgmbmxzdGF0ZSwgSUlfUEhZX0lEWCwKKyAgICAgICAgICAgICAgICBhcmdjLCBhcmd2LCAmY21kKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ290byBkZXRlY3Q7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGlkeDsKKyAgICAgICAgZW51bSBpZF9pbnB1dCBpZGJ5ID0gSUlfTk9ORTsKKyBkZXRlY3Q6CisgICAgICAgIGlkeCA9IGlmX25hbWV0b2luZGV4KGFyZ3ZbMF0pOworICAgICAgICBpZiAoaWR4ICE9IDApIHsKKyAgICAgICAgICAgIGlkYnkgPSBJSV9ORVRERVY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZHggPSBwaHlfbG9va3VwKGFyZ3ZbMF0pOworICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWRieSA9IElJX1BIWV9OQU1FOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZXJyID0gX19oYW5kbGVfY21kKCZubHN0YXRlLCBpZGJ5LCBhcmdjLCBhcmd2LCAmY21kKTsKKyAgICB9CisKKyAgICBpZiAoZXJyID09IDEpIHsKKyAgICAgICAgaWYgKGNtZCkgeworICAgICAgICAgICAgdXNhZ2VfY21kKGNtZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdXNhZ2UoZmFsc2UpOworICAgIH0gZWxzZSBpZiAoZXJyIDwgMCkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb21tYW5kIGZhaWxlZDogJXMgKCVkKVxuIiwKKyAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCBlcnIpOworCisgICAgbmw4MDIxMV9jbGVhbnVwKCZubHN0YXRlKTsKKworICAgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9tYWM4MDIxMS90aS11dGlscy9jYWxpYnJhdG9yLmggYi9tYWM4MDIxMS90aS11dGlscy9jYWxpYnJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzZmFjNAotLS0gL2Rldi9udWxsCisrKyBiL21hYzgwMjExL3RpLXV0aWxzL2NhbGlicmF0b3IuaApAQCAtMCwwICsxLDE1NiBAQAorI2lmbmRlZiBfX0NBTElCUkFUT1JfSAorI2RlZmluZSBfX0NBTElCUkFUT1JfSAorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPG5ldGxpbmsvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldGxpbmsvZ2VubC9nZW5sLmg+CisjaW5jbHVkZSA8bmV0bGluay9nZW5sL2ZhbWlseS5oPgorI2luY2x1ZGUgPG5ldGxpbmsvZ2VubC9jdHJsLmg+CisKKyNpbmNsdWRlICJubDgwMjExLmgiCisKKyNkZWZpbmUgRVRIX0FMRU4gNgorCisjaWZuZGVmIENPTkZJR19MSUJOTDIwCisjICBkZWZpbmUgbmxfc29jayBubF9oYW5kbGUKKyNlbmRpZgorCitzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSB7CisgICAgc3RydWN0IG5sX3NvY2sgKm5sX3NvY2s7CisgICAgc3RydWN0IG5sX2NhY2hlICpubF9jYWNoZTsKKyAgICBzdHJ1Y3QgZ2VubF9mYW1pbHkgKm5sODAyMTE7Cit9OworCitlbnVtIGNvbW1hbmRfaWRlbnRpZnlfYnkgeworICAgIENJQl9OT05FLAorICAgIENJQl9QSFksCisgICAgQ0lCX05FVERFViwKK307CisKK2VudW0gaWRfaW5wdXQgeworICAgIElJX05PTkUsCisgICAgSUlfTkVUREVWLAorICAgIElJX1BIWV9OQU1FLAorICAgIElJX1BIWV9JRFgsCit9OworCitzdHJ1Y3QgY21kIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGNvbnN0IGNoYXIgKmFyZ3M7CisgICAgY29uc3QgY2hhciAqaGVscDsKKyAgICBjb25zdCBlbnVtIG5sODAyMTFfY29tbWFuZHMgY21kOworICAgIGludCBubF9tc2dfZmxhZ3M7CisgICAgaW50IGhpZGRlbjsKKyAgICBjb25zdCBlbnVtIGNvbW1hbmRfaWRlbnRpZnlfYnkgaWRieTsKKyAgICAvKgorICAgICAqIFRoZSBoYW5kbGVyIHNob3VsZCByZXR1cm4gYSBuZWdhdGl2ZSBlcnJvciBjb2RlLAorICAgICAqIHplcm8gb24gc3VjY2VzcywgMSBpZiB0aGUgYXJndW1lbnRzIHdlcmUgd3JvbmcKKyAgICAgKiBhbmQgdGhlIHVzYWdlIG1lc3NhZ2Ugc2hvdWxkIGFuZCAyIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBpbnQgKCpoYW5kbGVyKShzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICBzdHJ1Y3QgbmxfY2IgKmNiLAorICAgICAgICAgICAgICAgc3RydWN0IG5sX21zZyAqbXNnLAorICAgICAgICAgICAgICAgaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKyAgICBjb25zdCBzdHJ1Y3QgY21kICpwYXJlbnQ7Cit9OworCisjZGVmaW5lIEFSUkFZX1NJWkUoYXIpIChzaXplb2YoYXIpL3NpemVvZihhclswXSkpCisKKyNkZWZpbmUgX19DT01NQU5EKF9zZWN0aW9uLCBfc3ltbmFtZSwgX25hbWUsIF9hcmdzLCBfbmxjbWQsIF9mbGFncywgX2hpZGRlbiwgX2lkYnksIF9oYW5kbGVyLCBfaGVscClcCisgICAgc3RhdGljIHN0cnVjdCBjbWQgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19jbWQgIyMgXyAjIyBfc3ltbmFtZSAjIyBfICMjIF9oYW5kbGVyICMjIF8gIyMgX25sY21kICMjIF8gIyMgX2lkYnkgIyMgXyAjIyBfaGlkZGVuXAorICAgIF9fYXR0cmlidXRlX18oKHVzZWQpKSBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX2NtZCIpKSkgICAgPSB7ICAgIFwKKyAgICAgICAgLm5hbWUgPSAoX25hbWUpLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAuYXJncyA9IChfYXJncyksICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC5jbWQgPSAoX25sY21kKSwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLm5sX21zZ19mbGFncyA9IChfZmxhZ3MpLCAgICAgICAgICAgICAgICBcCisgICAgICAgIC5oaWRkZW4gPSAoX2hpZGRlbiksICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC5pZGJ5ID0gKF9pZGJ5KSwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLmhhbmRsZXIgPSAoX2hhbmRsZXIpLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAuaGVscCA9IChfaGVscCksICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC5wYXJlbnQgPSBfc2VjdGlvbiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfQorI2RlZmluZSBDT01NQU5EKHNlY3Rpb24sIG5hbWUsIGFyZ3MsIGNtZCwgZmxhZ3MsIGlkYnksIGhhbmRsZXIsIGhlbHApICAgIFwKKyAgICBfX0NPTU1BTkQoJihfX3NlY3Rpb24gIyMgXyAjIyBzZWN0aW9uKSwgbmFtZSwgI25hbWUsIGFyZ3MsIGNtZCwgZmxhZ3MsIDAsIGlkYnksIGhhbmRsZXIsIGhlbHApCisjZGVmaW5lIEhJRERFTihzZWN0aW9uLCBuYW1lLCBhcmdzLCBjbWQsIGZsYWdzLCBpZGJ5LCBoYW5kbGVyKSAgICAgICAgXAorICAgIF9fQ09NTUFORCgmKF9fc2VjdGlvbiAjIyBfICMjIHNlY3Rpb24pLCBuYW1lLCAjbmFtZSwgYXJncywgY21kLCBmbGFncywgMSwgaWRieSwgaGFuZGxlciwgTlVMTCkKKworI2RlZmluZSBUT1BMRVZFTChfbmFtZSwgX2FyZ3MsIF9ubGNtZCwgX2ZsYWdzLCBfaWRieSwgX2hhbmRsZXIsIF9oZWxwKSAgICBcCisgICAgc3RydWN0IGNtZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19zZWN0aW9uICMjIF8gIyMgX25hbWUgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hdHRyaWJ1dGVfXygodXNlZCkpIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9fY21kIikpKSAgICA9IHsgICAgXAorICAgICAgICAubmFtZSA9ICgjX25hbWUpLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAuYXJncyA9IChfYXJncyksICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC5jbWQgPSAoX25sY21kKSwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLm5sX21zZ19mbGFncyA9IChfZmxhZ3MpLCAgICAgICAgICAgICAgICBcCisgICAgICAgIC5pZGJ5ID0gKF9pZGJ5KSwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLmhhbmRsZXIgPSAoX2hhbmRsZXIpLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAuaGVscCA9IChfaGVscCksICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0KKyNkZWZpbmUgU0VDVElPTihfbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCBjbWQgX19zZWN0aW9uICMjIF8gIyMgX25hbWUgICAgICAgICAgICAgICAgXAorICAgIF9fYXR0cmlidXRlX18oKHVzZWQpKSBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX2NtZCIpKSkgPSB7ICAgIFwKKyAgICAgICAgLm5hbWUgPSAoI19uYW1lKSwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLmhpZGRlbiA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2RlZmluZSBERUNMQVJFX1NFQ1RJT04oX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGV4dGVybiBzdHJ1Y3QgY21kIF9fc2VjdGlvbiAjIyBfICMjIF9uYW1lOworCitleHRlcm4gaW50IGNhbGlicmF0b3JfZGVidWc7CisKK2ludCBoYW5kbGVfY21kKHN0cnVjdCBubDgwMjExX3N0YXRlICpzdGF0ZSwgZW51bSBpZF9pbnB1dCBpZGJ5LAorICAgICAgICAgICBpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCitzdHJ1Y3QgcHJpbnRfZXZlbnRfYXJncyB7CisgICAgYm9vbCBmcmFtZSwgdGltZTsKK307CisKK19fdTMyIGxpc3Rlbl9ldmVudHMoc3RydWN0IG5sODAyMTFfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgY29uc3QgaW50IG5fd2FpdHMsIGNvbnN0IF9fdTMyICp3YWl0cyk7CitfX3UzMiBfX2xpc3Rlbl9ldmVudHMoc3RydWN0IG5sODAyMTFfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICBjb25zdCBpbnQgbl93YWl0cywgY29uc3QgX191MzIgKndhaXRzLAorICAgICAgICAgICAgICBzdHJ1Y3QgcHJpbnRfZXZlbnRfYXJncyAqYXJncyk7CisKKworaW50IG1hY19hZGRyX2Eybih1bnNpZ25lZCBjaGFyICptYWNfYWRkciwgY2hhciAqYXJnKTsKK3ZvaWQgbWFjX2FkZHJfbjJhKGNoYXIgKm1hY19hZGRyLCB1bnNpZ25lZCBjaGFyICphcmcpOworCitpbnQgcGFyc2Vfa2V5cyhzdHJ1Y3QgbmxfbXNnICptc2csIGNoYXIgKiphcmd2LCBpbnQgYXJnYyk7CisKK3ZvaWQgcHJpbnRfaHRfbWNzKGNvbnN0IF9fdTggKm1jcyk7Cit2b2lkIHByaW50X2FtcGR1X2xlbmd0aChfX3U4IGV4cG9uZW50KTsKK3ZvaWQgcHJpbnRfYW1wZHVfc3BhY2luZyhfX3U4IHNwYWNpbmcpOwordm9pZCBwcmludF9odF9jYXBhYmlsaXR5KF9fdTE2IGNhcCk7CisKK2NvbnN0IGNoYXIgKmlmdHlwZV9uYW1lKGVudW0gbmw4MDIxMV9pZnR5cGUgaWZ0eXBlKTsKK2NvbnN0IGNoYXIgKmNvbW1hbmRfbmFtZShlbnVtIG5sODAyMTFfY29tbWFuZHMgY21kKTsKK2ludCBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koaW50IGNoYW4pOworaW50IGllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbChpbnQgZnJlcSk7CisKK3ZvaWQgcHJpbnRfc3NpZF9lc2NhcGVkKGNvbnN0IHVpbnQ4X3QgbGVuLCBjb25zdCB1aW50OF90ICpkYXRhKTsKKworaW50IG5sX2dldF9tdWx0aWNhc3RfaWQoc3RydWN0IG5sX3NvY2sgKnNvY2ssIGNvbnN0IGNoYXIgKmZhbWlseSwKKyAgICBjb25zdCBjaGFyICpncm91cCk7CisKK2NoYXIgKnJlZ19pbml0aWF0b3JfdG9fc3RyaW5nKF9fdTggaW5pdGlhdG9yKTsKKworY29uc3QgY2hhciAqZ2V0X3JlYXNvbl9zdHIodWludDE2X3QgcmVhc29uKTsKK2NvbnN0IGNoYXIgKmdldF9zdGF0dXNfc3RyKHVpbnQxNl90IHN0YXR1cyk7CisKK2VudW0gcHJpbnRfaWVfdHlwZSB7CisgICAgUFJJTlRfU0NBTiwKKyAgICBQUklOVF9MSU5LLAorfTsKKworI2RlZmluZSBCSVQoeCkgKDFVTEw8PCh4KSkKKwordm9pZCBwcmludF9pZXModW5zaWduZWQgY2hhciAqaWUsIGludCBpZWxlbiwgYm9vbCB1bmtub3duLAorICAgICAgICAgICBlbnVtIHByaW50X2llX3R5cGUgcHR5cGUpOworCisKK0RFQ0xBUkVfU0VDVElPTihzZXQpOworREVDTEFSRV9TRUNUSU9OKGdldCk7CitERUNMQVJFX1NFQ1RJT04ocGx0KTsKKworI2VuZGlmIC8qIF9fQ0FMSUJSQVRPUl9IICovCmRpZmYgLS1naXQgYS9tYWM4MDIxMS90aS11dGlscy9pbmkuYyBiL21hYzgwMjExL3RpLXV0aWxzL2luaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTBhMWMKLS0tIC9kZXYvbnVsbAorKysgYi9tYWM4MDIxMS90aS11dGlscy9pbmkuYwpAQCAtMCwwICsxLDExMTMgQEAKKy8qCisgKiBQTFQgdXRpbGl0eSBmb3Igd2lyZWxlc3MgY2hpcCBzdXBwb3J0ZWQgYnkgVEkncyBkcml2ZXIgd2wxMnh4CisgKgorICogU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2luY2x1ZGUgPG5ldGxpbmsvZ2VubC9nZW5sLmg+CisjaW5jbHVkZSA8bmV0bGluay9nZW5sL2ZhbWlseS5oPgorI2luY2x1ZGUgPG5ldGxpbmsvZ2VubC9jdHJsLmg+CisjaW5jbHVkZSA8bmV0bGluay9tc2cuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2F0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgIm5sODAyMTEuaCIKKworI2luY2x1ZGUgImNhbGlicmF0b3IuaCIKKyNpbmNsdWRlICJwbHQuaCIKKyNpbmNsdWRlICJpbmkuaCIKKyNpbmNsdWRlICJudnMuaCIKKworc3RhdGljIGNoYXIgKmluaV9nZXRfbGluZShjaGFyICpzLCBpbnQgc2l6ZSwgRklMRSAqc3RyZWFtLCBpbnQgKmxpbmUsCisJCQkJICBjaGFyICoqX3BvcykKK3sKKwljaGFyICpwb3MsICplbmQsICpzc3RhcnQ7CisKKwl3aGlsZSAoZmdldHMocywgc2l6ZSwgc3RyZWFtKSkgeworCQlzW3NpemUgLSAxXSA9ICdcMCc7CisJCXBvcyA9IHM7CisKKwkJLyogU2tpcCB3aGl0ZSBzcGFjZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgbGluZS4gKi8KKwkJd2hpbGUgKCpwb3MgPT0gJyAnIHx8ICpwb3MgPT0gJ1x0JyB8fCAqcG9zID09ICdccicpIHsKKwkJCXBvcysrOworICAgICAgICAgICAgICAgIH0KKworCQkvKiBTa2lwIGNvbW1lbnQgbGluZXMgYW5kIGVtcHR5IGxpbmVzICovCisJCWlmICgqcG9zID09ICcjJyB8fCAqcG9zID09ICdcbicgfHwgKnBvcyA9PSAnXDAnKSB7CisJCQljb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKwkJLyoKKwkJICogUmVtb3ZlICMgY29tbWVudHMgdW5sZXNzIHRoZXkgYXJlIHdpdGhpbiBhIGRvdWJsZSBxdW90ZWQKKwkJICogc3RyaW5nLgorCQkgKi8KKwkJc3N0YXJ0ID0gc3RyY2hyKHBvcywgJyInKTsKKwkJaWYgKHNzdGFydCkgeworCQkJc3N0YXJ0ID0gc3RycmNocihzc3RhcnQgKyAxLCAnIicpOworICAgICAgICAgICAgICAgIH0KKwkJaWYgKCFzc3RhcnQpIHsKKwkJCXNzdGFydCA9IHBvczsKKyAgICAgICAgICAgICAgICB9CisJCWVuZCA9IHN0cmNocihzc3RhcnQsICcjJyk7CisJCWlmIChlbmQpIHsKKwkJCSplbmQtLSA9ICdcMCc7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCWVuZCA9IHBvcyArIHN0cmxlbihwb3MpIC0gMTsKKyAgICAgICAgICAgICAgICB9CisKKwkJLyogUmVtb3ZlIHRyYWlsaW5nIHdoaXRlIHNwYWNlLiAqLworCQl3aGlsZSAoZW5kID4gcG9zICYmCisJCSAgICAgICAoKmVuZCA9PSAnXG4nIHx8ICplbmQgPT0gJyAnIHx8ICplbmQgPT0gJ1x0JyB8fAorCQkJKmVuZCA9PSAnXHInKSkgeworCQkJKmVuZC0tID0gJ1wwJzsKKyAgICAgICAgICAgICAgICB9CisKKwkJaWYgKCpwb3MgPT0gJ1wwJykgeworCQkJY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisJCSgqbGluZSkrKzsKKworCQlpZiAoX3BvcykgeworCQkJKl9wb3MgPSBwb3M7CisgICAgICAgICAgICAgICAgfQorCQlyZXR1cm4gcG9zOworCX0KKworCWlmIChfcG9zKSB7CisJCSpfcG9zID0gTlVMTDsKKyAgICAgICAgfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgc3BsaXRfbGluZShjaGFyICpsaW5lLCBjaGFyICoqbmFtZSwgY2hhciAqKnZhbHVlKQoreworCWNoYXIgKnBvcyA9IGxpbmU7CisKKwkqdmFsdWUgPSBzdHJjaHIocG9zLCAnPScpOworCWlmICghKnZhbHVlKSB7CisJCWZwcmludGYoc3RkZXJyLCAiV3JvbmcgZm9ybWF0IG9mIGxpbmVcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkqbmFtZSA9ICp2YWx1ZTsKKworCSgqbmFtZSktLTsKKwl3aGlsZSAoKipuYW1lID09ICcgJyB8fCAqKm5hbWUgPT0gJ1x0JyB8fCAqKm5hbWUgPT0gJ1xyJykgeworCQkoKm5hbWUpLS07CisgICAgICAgIH0KKworCSorKygqbmFtZSkgPSAnXDAnOworCisJKCp2YWx1ZSkrKzsKKwl3aGlsZSAoKip2YWx1ZSA9PSAnICcgfHwgKip2YWx1ZSA9PSAnXHQnIHx8ICoqdmFsdWUgPT0gJ1xyJykgeworCQkoKnZhbHVlKSsrOworICAgICAgICB9CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBDT01QQVJFX05fQUREKHRlbXAsIHN0ciwgdmFsLCBwdHIsIHNpemUpCQlcCisJaWYgKHN0cm5jbXAodGVtcCwgc3RyLCBzaXplb2YodGVtcCkpID09IDApIHsJCVwKKwkJaW50IGk7CQkJCQkJXAorCQl1bnNpZ25lZCBjaGFyICpwID0gcHRyOwkJCQlcCisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsJCQlcCisJCQkqcCA9IHN0cnRvbCh2YWwsIE5VTEwsIDE2KTsJCVwKKwkJCWlmIChpICE9IHNpemVvZihwdHIpLTEpIHsJCVwKKwkJCQl2YWwgKz0gMzsgcCsrOwkJCVwKKwkJCX0JCQkJCVwKKwkJfQkJCQkJCVwKKwkJcmV0dXJuIDA7CQkJCQlcCisJfQorCisjZGVmaW5lIERCR19DT01QQVJFX05fQUREKHRlbXAsIHN0ciwgdmFsLCBwdHIsIHNpemUpCQlcCisJaWYgKHN0cm5jbXAodGVtcCwgc3RyLCBzaXplb2YodGVtcCkpID09IDApIHsJCVwKKwkJaW50IGk7CQkJCQkJXAorCQl1bnNpZ25lZCBjaGFyICpwID0gcHRyOwkJCQlcCisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsJCQlcCisJCQkqcCA9IHN0cnRvbCh2YWwsIE5VTEwsIDE2KTsJCVwKKwkJCWlmIChpICE9IHNpemVvZihwdHIpLTEpIHsJCVwKKwkJCQl2YWwgKz0gMzsgcCsrOwkJCVwKKwkJCX0JCQkJCVwKKwkJfQkJCQkJCVwKKwkJcCA9IHB0cjsJCQkJCVwKKwkJcHJpbnRmKCIlcyAiLCB0ZW1wKTsJCQkJXAorCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CQkJXAorCQkJcHJpbnRmKCIlMDJYICIsICpwKTsJCQlcCisJCQlwKys7CQkJCQlcCisJCX0JCQkJCQlcCisJCXByaW50ZigiXG4iKTsJCQkJCVwKKwkJcmV0dXJuIDA7CQkJCQlcCisJfQorCisjZGVmaW5lIENPTVBBUkVfTl9BREQyKHRlbXAsIHN0ciwgdmFsLCBwdHIsIHNpemUpCQlcCisJaWYgKHN0cm5jbXAodGVtcCwgc3RyLCBzaXplb2YodGVtcCkpID09IDApIHsJCVwKKwkJaW50IGk7CQkJCQkJXAorCQl1bnNpZ25lZCBzaG9ydCAqcCA9IHB0cjsJCQlcCisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsJCQlcCisJCQkqcCA9IHN0cnRvbCh2YWwsIE5VTEwsIDE2KTsJCVwKKwkJCWlmIChpICE9IHNpemVvZihwdHIpLTEpIHsJCVwKKwkJCQl2YWwgKz0gNTsgcCsrOwkJCVwKKwkJCX0JCQkJCVwKKwkJfQkJCQkJCVwKKwkJcmV0dXJuIDA7CQkJCQlcCisJfQorCisjZGVmaW5lIERCR19DT01QQVJFX05fQUREMih0ZW1wLCBzdHIsIHZhbCwgcHRyLCBzaXplKQkJXAorCWlmIChzdHJuY21wKHRlbXAsIHN0ciwgc2l6ZW9mKHRlbXApKSA9PSAwKSB7CQlcCisJCWludCBpOwkJCQkJCVwKKwkJdW5zaWduZWQgc2hvcnQgKnAgPSBwdHI7CQkJXAorCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CQkJXAorCQkJKnAgPSBzdHJ0b2wodmFsLCBOVUxMLCAxNik7CQlcCisJCQlpZiAoaSAhPSBzaXplb2YocHRyKS0xKSB7CQlcCisJCQkJdmFsICs9IDU7IHArKzsJCQlcCisJCQl9CQkJCQlcCisJCX0JCQkJCQlcCisJCXAgPSBwdHI7CQkJCQlcCisJCXByaW50ZigiJXMgIiwgdGVtcCk7CQkJCVwKKwkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewkJCVwKKwkJCXByaW50ZigiJTA0WCAiLCAqcCk7CQkJXAorCQkJcCsrOwkJCQkJXAorCQl9CQkJCQkJXAorCQlwcmludGYoIlxuIik7CQkJCQlcCisJCXJldHVybiAwOwkJCQkJXAorCX0KKworc3RhdGljIGludCBwYXJzZV9nZW5lcmFsX3BybXMoY2hhciAqbCwgc3RydWN0IHdsMTJ4eF9jb21tb24gKmNtbiwKKwlzdHJ1Y3Qgd2wxMnh4X2luaSAqcCkKK3sKKwljaGFyICpuYW1lLCAqdmFsOworCXN0cnVjdCB3bDEyNzFfaW5pX2dlbmVyYWxfcGFyYW1zICpncCA9ICYocC0+aW5pMTI3MS5nZW5lcmFsX3BhcmFtcyk7CisKKwlpZiAoc3BsaXRfbGluZShsLCAmbmFtZSwgJnZhbCkpIHsKKwkJcmV0dXJuIDE7CisgICAgICAgIH0KKworCUNPTVBBUkVfTl9BREQoIlRYQmlQRkVNQXV0b0RldGVjdCIsIGwsIHZhbCwKKwkJJmdwLT50eF9iaXBfZmVtX2F1dG9fZGV0ZWN0LCAxKTsKKworCUNPTVBBUkVfTl9BREQoIlRYQmlQRkVNTWFudWZhY3R1cmVyIiwgbCwgdmFsLAorCQkmZ3AtPnR4X2JpcF9mZW1fbWFudWZhY3R1cmVyLCAxKTsKKworCUNPTVBBUkVfTl9BREQoIlJlZkNsayIsIGwsIHZhbCwgJmdwLT5yZWZfY2xvY2ssIDEpOworCisJQ09NUEFSRV9OX0FERCgiU2V0dGxpbmdUaW1lIiwgbCwgdmFsLCAmZ3AtPnNldHRsaW5nX3RpbWUsIDEpOworCisJQ09NUEFSRV9OX0FERCgiQ2xvY2tWYWxpZE9uV2FrZXVwIiwgbCwgdmFsLAorCQkmZ3AtPmNsa192YWxpZF9vbl93YWtldXAsIDEpOworCisJQ09NUEFSRV9OX0FERCgiREMyRENNb2RlIiwgbCwgdmFsLCAmZ3AtPmRjMmRjX21vZGUsIDEpOworCisJQ09NUEFSRV9OX0FERCgiU2luZ2xlX0R1YWxfQmFuZF9Tb2x1dGlvbiIsIGwsIHZhbCwKKwkJJmdwLT5kdWFsX21vZGVfc2VsZWN0LCAxKTsKKworCWlmIChjbW4tPmR1YWxfbW9kZSA9PSBEVUFMX01PREVfVU5TRVQpIHsKKwkJY21uLT5kdWFsX21vZGUgPSBncC0+ZHVhbF9tb2RlX3NlbGVjdDsKKyAgICAgICAgfQorCWVsc2UgaWYgKGNtbi0+ZHVhbF9tb2RlICE9IGdwLT5kdWFsX21vZGVfc2VsZWN0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3IsIEZFTXMgd2l0aCBkaWZmZXJlbnQgZHVhbCBtb2Rlc1xuIik7CisJCXJldHVybiAxOworCX0KKworCUNPTVBBUkVfTl9BREQoIlNldHRpbmdzIiwgbCwgdmFsLCAmZ3AtPmdlbmVyYWxfc2V0dGluZ3MsIDEpOworCisJQ09NUEFSRV9OX0FERCgiU1JTdGF0ZSIsIGwsIHZhbCwgJmdwLT5zcl9zdGF0ZSwgMSk7CisKKwlDT01QQVJFX05fQUREKCJTUkYxIiwgbCwgdmFsLAorCQlncC0+c3JmMSwgV0wxMjcxX0lOSV9NQVhfU01BUlRfUkVGTEVYX1BBUkFNKTsKKworCUNPTVBBUkVfTl9BREQoIlNSRjIiLCBsLCB2YWwsCisJCWdwLT5zcmYyLCBXTDEyNzFfSU5JX01BWF9TTUFSVF9SRUZMRVhfUEFSQU0pOworCisJQ09NUEFSRV9OX0FERCgiU1JGMyIsIGwsIHZhbCwKKwkJZ3AtPnNyZjMsIFdMMTI3MV9JTklfTUFYX1NNQVJUX1JFRkxFWF9QQVJBTSk7CisKKwlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBwYXJzZTogKCVzKVxuIiwgbCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwYXJzZV9nZW5lcmFsX3BybXNfMTI4eChjaGFyICpsLCBzdHJ1Y3Qgd2wxMnh4X2NvbW1vbiAqY21uLAorCXN0cnVjdCB3bDEyeHhfaW5pICpwKQoreworCWNoYXIgKm5hbWUsICp2YWw7CisJc3RydWN0IHdsMTI4eF9pbmlfZ2VuZXJhbF9wYXJhbXMgKmdwID0KKwkJJihwLT5pbmkxMjh4LmdlbmVyYWxfcGFyYW1zKTsKKworCWlmIChzcGxpdF9saW5lKGwsICZuYW1lLCAmdmFsKSkgeworCQlyZXR1cm4gMTsKKyAgICAgICAgfQorCisJQ09NUEFSRV9OX0FERCgiVFhCaVBGRU1BdXRvRGV0ZWN0IiwgbCwgdmFsLAorCQkmZ3AtPnR4X2JpcF9mZW1fYXV0b19kZXRlY3QsIDEpOworCisJQ09NUEFSRV9OX0FERCgiVFhCaVBGRU1NYW51ZmFjdHVyZXIiLCBsLCB2YWwsCisJCSZncC0+dHhfYmlwX2ZlbV9tYW51ZmFjdHVyZXIsIDEpOworCisJQ09NUEFSRV9OX0FERCgiUmVmQ2xrIiwgbCwgdmFsLCAmZ3AtPnJlZl9jbG9jaywgMSk7CisKKwlDT01QQVJFX05fQUREKCJTZXR0bGluZ1RpbWUiLCBsLCB2YWwsICZncC0+c2V0dGxpbmdfdGltZSwgMSk7CisKKwlDT01QQVJFX05fQUREKCJDbG9ja1ZhbGlkT25XYWtldXAiLCBsLCB2YWwsCisJCSZncC0+Y2xrX3ZhbGlkX29uX3dha2V1cCwgMSk7CisKKwlDT01QQVJFX05fQUREKCJUQ1hPX0NsayIsIGwsIHZhbCwgJmdwLT50Y3hvX3JlZl9jbG9jaywgMSk7CisKKwlDT01QQVJFX05fQUREKCJUQ1hPX1NldHRsaW5nVGltZSIsIGwsIHZhbCwgJmdwLT50Y3hvX3NldHRsaW5nX3RpbWUsIDEpOworCisJQ09NUEFSRV9OX0FERCgiVENYT19DbG9ja1ZhbGlkT25XYWtldXAiLCBsLCB2YWwsCisJCSZncC0+dGN4b192YWxpZF9vbl93YWtldXAsIDEpOworCisJQ09NUEFSRV9OX0FERCgiVENYT19MRE9fVm9sdGFnZSIsIGwsIHZhbCwKKwkJJmdwLT50Y3hvX2xkb192b2x0YWdlLCAxKTsKKworCUNPTVBBUkVfTl9BREQoIlBsYXRmb3JtX2NvbmZpZ3VyYXRpb24iLCBsLCB2YWwsCisJCSZncC0+cGxhdGZvcm1fY29uZiwgMSk7CisKKwlDT01QQVJFX05fQUREKCJTaW5nbGVfRHVhbF9CYW5kX1NvbHV0aW9uIiwgbCwgdmFsLAorCQkmZ3AtPmR1YWxfbW9kZV9zZWxlY3QsIDEpOworCisJaWYgKGNtbi0+ZHVhbF9tb2RlID09IERVQUxfTU9ERV9VTlNFVCkgeworCQljbW4tPmR1YWxfbW9kZSA9IGdwLT5kdWFsX21vZGVfc2VsZWN0OworICAgICAgICB9IGVsc2UgaWYgKGNtbi0+ZHVhbF9tb2RlICE9IGdwLT5kdWFsX21vZGVfc2VsZWN0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3IsIEZFTXMgd2l0aCBkaWZlcmVudCBkdWFsIG1vZGVzXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJQ09NUEFSRV9OX0FERCgiU2V0dGluZ3MiLCBsLCB2YWwsCisJCWdwLT5nZW5lcmFsX3NldHRpbmdzLCBXTDEyOFhfSU5JX01BWF9TRVRUSU5HU19QQVJBTSk7CisKKwlDT01QQVJFX05fQUREKCJYVEFMSXRyaW1WYWwiLCBsLCB2YWwsICZncC0+eHRhbF9pdHJpbV92YWwsIDEpOworCisJQ09NUEFSRV9OX0FERCgiU1JTdGF0ZSIsIGwsIHZhbCwgJmdwLT5zcl9zdGF0ZSwgMSk7CisKKwlDT01QQVJFX05fQUREKCJTUkYxIiwgbCwgdmFsLAorCQlncC0+c3JmMSwgV0wxMjcxX0lOSV9NQVhfU01BUlRfUkVGTEVYX1BBUkFNKTsKKworCUNPTVBBUkVfTl9BREQoIlNSRjIiLCBsLCB2YWwsCisJCWdwLT5zcmYyLCBXTDEyNzFfSU5JX01BWF9TTUFSVF9SRUZMRVhfUEFSQU0pOworCisJQ09NUEFSRV9OX0FERCgiU1JGMyIsIGwsIHZhbCwKKwkJZ3AtPnNyZjMsIFdMMTI3MV9JTklfTUFYX1NNQVJUX1JFRkxFWF9QQVJBTSk7CisKKwlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBwYXJzZTogKCVzKVxuIiwgbCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwYXJzZV9iYW5kMl9wcm1zKGNoYXIgKmwsIHN0cnVjdCB3bDEyeHhfaW5pICpwKQoreworCWNoYXIgKm5hbWUsICp2YWw7CisJc3RydWN0IHdsMTI3MV9pbmlfYmFuZF9wYXJhbXNfMiAqZ3AgPQorCQkmKHAtPmluaTEyNzEuc3RhdF9yYWRpb19wYXJhbXNfMik7CisKKwlpZiAoc3BsaXRfbGluZShsLCAmbmFtZSwgJnZhbCkpIHsKKwkJcmV0dXJuIDE7CisgICAgICAgIH0KKworCUNPTVBBUkVfTl9BREQoIlJ4VHJhY2VJbnNlcnRpb25Mb3NzXzJfNEciLCBsLCB2YWwsCisJCSZncC0+cnhfdHJhY2VfaW5zZXJ0aW9uX2xvc3MsIDEpOworCisJQ09NUEFSRV9OX0FERCgiVFhUcmFjZUxvc3NfMl80RyIsIGwsIHZhbCwKKwkJJmdwLT50eF90cmFjZV9sb3NzLCAxKTsKKworCUNPTVBBUkVfTl9BREQoIlJ4UnNzaUFuZFByb2Nlc3NDb21wZW5zYXRpb25fMl80RyIsIGwsIHZhbCwKKwkJZ3AtPnJ4X3Jzc2lfcHJvY2Vzc19jb21wZW5zLAorCQlXTDEyNzFfSU5JX1JTU0lfUFJPQ0VTU19DT01QRU5TX1NJWkUpOworCisJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gcGFyc2U6ICglcylcbiIsIGwpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYmFuZDJfcHJtc18xMjh4KGNoYXIgKmwsIHN0cnVjdCB3bDEyeHhfaW5pICpwKQoreworCWNoYXIgKm5hbWUsICp2YWw7CisJc3RydWN0IHdsMTI4eF9pbmlfYmFuZF9wYXJhbXNfMiAqZ3AgPSAmKHAtPmluaTEyOHguc3RhdF9yYWRpb19wYXJhbXNfMik7CisKKwlpZiAoc3BsaXRfbGluZShsLCAmbmFtZSwgJnZhbCkpIHsKKwkJcmV0dXJuIDE7CisgICAgICAgIH0KKworCUNPTVBBUkVfTl9BREQoIlJ4VHJhY2VJbnNlcnRpb25Mb3NzXzJfNEciLCBsLCB2YWwsCisJCSZncC0+cnhfdHJhY2VfaW5zZXJ0aW9uX2xvc3MsIDEpOworCisJQ09NUEFSRV9OX0FERCgiVHhUcmFjZUxvc3NfMl80RyIsIGwsIHZhbCwKKwkJZ3AtPnR4X3RyYWNlX2xvc3MsIFdMMTI3MV9JTklfQ0hBTk5FTF9DT1VOVF8yKTsKKworCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHBhcnNlOiAoJXMpXG4iLCBsKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBhcnNlX2JhbmQ1X3BybXMoY2hhciAqbCwgc3RydWN0IHdsMTJ4eF9pbmkgKnApCit7CisJY2hhciAqbmFtZSwgKnZhbDsKKwlzdHJ1Y3Qgd2wxMjcxX2luaV9iYW5kX3BhcmFtc181ICpncCA9CisJCSYocC0+aW5pMTI3MS5zdGF0X3JhZGlvX3BhcmFtc181KTsKKworCWlmIChzcGxpdF9saW5lKGwsICZuYW1lLCAmdmFsKSkgeworCQlyZXR1cm4gMTsKKyAgICAgICAgfQorCisJQ09NUEFSRV9OX0FERCgiUnhUcmFjZUluc2VydGlvbkxvc3NfNUciLCBsLCB2YWwsCisJCWdwLT5yeF90cmFjZV9pbnNlcnRpb25fbG9zcywgNyk7CisKKwlDT01QQVJFX05fQUREKCJUWFRyYWNlTG9zc181RyIsIGwsIHZhbCwKKwkJZ3AtPnR4X3RyYWNlX2xvc3MsIDcpOworCisJQ09NUEFSRV9OX0FERCgiUnhSc3NpQW5kUHJvY2Vzc0NvbXBlbnNhdGlvbl81RyIsIGwsIHZhbCwKKwkJZ3AtPnJ4X3Jzc2lfcHJvY2Vzc19jb21wZW5zLAorCQlXTDEyNzFfSU5JX1JTU0lfUFJPQ0VTU19DT01QRU5TX1NJWkUpOworCisJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gcGFyc2U6ICglcylcbiIsIGwpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYmFuZDVfcHJtc18xMjh4KGNoYXIgKmwsIHN0cnVjdCB3bDEyeHhfaW5pICpwKQoreworCWNoYXIgKm5hbWUsICp2YWw7CisJc3RydWN0IHdsMTI4eF9pbmlfYmFuZF9wYXJhbXNfNSAqZ3AgPSAmKHAtPmluaTEyOHguc3RhdF9yYWRpb19wYXJhbXNfNSk7CisKKwlpZiAoc3BsaXRfbGluZShsLCAmbmFtZSwgJnZhbCkpIHsKKwkJcmV0dXJuIDE7CisgICAgICAgIH0KKworCUNPTVBBUkVfTl9BREQoIlJ4VHJhY2VJbnNlcnRpb25Mb3NzXzVHIiwgbCwgdmFsLAorCQlncC0+cnhfdHJhY2VfaW5zZXJ0aW9uX2xvc3MsIDcpOworCisJQ09NUEFSRV9OX0FERCgiVHhUcmFjZUxvc3NfNUciLCBsLCB2YWwsCisJCWdwLT50eF90cmFjZV9sb3NzLCA3KTsKKworCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHBhcnNlOiAoJXMpXG4iLCBsKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBhcnNlX2ZlbTBfYmFuZDJfcHJtcyhjaGFyICpsLCBzdHJ1Y3Qgd2wxMnh4X2luaSAqcCkKK3sKKwljaGFyICpuYW1lLCAqdmFsOworCXN0cnVjdCB3bDEyNzFfaW5pX2ZlbV9wYXJhbXNfMiAqZ3AgPQorCQkmKHAtPmluaTEyNzEuZHluX3JhZGlvX3BhcmFtc18yWzBdLnBhcmFtcyk7CisKKwlpZiAoc3BsaXRfbGluZShsLCAmbmFtZSwgJnZhbCkpIHsKKwkJcmV0dXJuIDE7CisgICAgICAgIH0KKworCUNPTVBBUkVfTl9BREQyKCJGRU0wX1RYQmlQUmVmZXJlbmNlUER2b2x0YWdlXzJfNEciLCBsLCB2YWwsCisJCSZncC0+dHhfYmlwX3JlZl9wZF92b2x0YWdlLCAxKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTBfVHhCaVBSZWZlcmVuY2VQb3dlcl8yXzRHIiwgbCwgdmFsLAorCQkmZ3AtPnR4X2JpcF9yZWZfcG93ZXIsIDEpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMF9UeEJpUE9mZnNldGRCXzJfNEciLCBsLCB2YWwsCisJCSZncC0+dHhfYmlwX3JlZl9vZmZzZXQsIDEpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMF9UeFBlclJhdGVQb3dlckxpbWl0c18yXzRHX05vcm1hbCIsIGwsIHZhbCwKKwkJZ3AtPnR4X3Blcl9yYXRlX3B3cl9saW1pdHNfbm9ybWFsLAorCQlXTDEyNzFfSU5JX1JBVEVfR1JPVVBfQ09VTlQpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMF9UeFBlclJhdGVQb3dlckxpbWl0c18yXzRHX0RlZ3JhZGVkIiwgbCwgdmFsLAorCQlncC0+dHhfcGVyX3JhdGVfcHdyX2xpbWl0c19kZWdyYWRlZCwKKwkJV0wxMjcxX0lOSV9SQVRFX0dST1VQX0NPVU5UKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTBfVHhQZXJSYXRlUG93ZXJMaW1pdHNfMl80R19FeHRyZW1lIiwgbCwgdmFsLAorCQlncC0+dHhfcGVyX3JhdGVfcHdyX2xpbWl0c19leHRyZW1lLAorCQlXTDEyNzFfSU5JX1JBVEVfR1JPVVBfQ09VTlQpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMF9EZWdyYWRlZExvd1RvTm9ybWFsVGhyXzJfNEciLCBsLCB2YWwsCisJCSZncC0+ZGVncmFkZWRfbG93X3RvX25vcm1hbF90aHIsIDEpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMF9Ob3JtYWxUb0RlZ3JhZGVkSGlnaFRocl8yXzRHIiwgbCwgdmFsLAorCQkmZ3AtPm5vcm1hbF90b19kZWdyYWRlZF9oaWdoX3RociwgMSk7CisKKwlDT01QQVJFX05fQUREKCJGRU0wX1R4UGVyQ2hhbm5lbFBvd2VyTGltaXRzXzJfNEdfMTFiIiwgbCwgdmFsLAorCQlncC0+dHhfcGVyX2NoYW5fcHdyX2xpbWl0c18xMWIsCisJCVdMMTI3MV9JTklfQ0hBTk5FTF9DT1VOVF8yKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTBfVHhQZXJDaGFubmVsUG93ZXJMaW1pdHNfMl80R19PRkRNIiwgbCwgdmFsLAorCQlncC0+dHhfcGVyX2NoYW5fcHdyX2xpbWl0c19vZmRtLAorCQlXTDEyNzFfSU5JX0NIQU5ORUxfQ09VTlRfMik7CisKKwlDT01QQVJFX05fQUREKCJGRU0wX1R4UERWc1JhdGVPZmZzZXRzXzJfNEciLCBsLCB2YWwsCisJCWdwLT50eF9wZF92c19yYXRlX29mZnNldHMsCisJCVdMMTI3MV9JTklfUkFURV9HUk9VUF9DT1VOVCk7CisKKwlDT01QQVJFX05fQUREKCJGRU0wX1R4SWJpYXNUYWJsZV8yXzRHIiwgbCwgdmFsLAorCQlncC0+dHhfaWJpYXMsCisJCVdMMTI3MV9JTklfUkFURV9HUk9VUF9DT1VOVCk7CisKKwlDT01QQVJFX05fQUREKCJGRU0wX1J4RmVtSW5zZXJ0aW9uTG9zc18yXzRHIiwgbCwgdmFsLAorCQkmZ3AtPnJ4X2ZlbV9pbnNlcnRpb25fbG9zcywgMSk7CisKKwlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBwYXJzZTogKCVzKVxuIiwgbCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwYXJzZV9mZW0wX2JhbmQyX3BybXNfMTI4eChjaGFyICpsLCBzdHJ1Y3Qgd2wxMnh4X2luaSAqcCkKK3sKKwljaGFyICpuYW1lLCAqdmFsOworCXN0cnVjdCB3bDEyOHhfaW5pX2ZlbV9wYXJhbXNfMiAqZ3AgPQorCQkmKHAtPmluaTEyOHguZHluX3JhZGlvX3BhcmFtc18yWzBdLnBhcmFtcyk7CisKKwlpZiAoc3BsaXRfbGluZShsLCAmbmFtZSwgJnZhbCkpIHsKKwkJcmV0dXJuIDE7CisgICAgICAgIH0KKworCUNPTVBBUkVfTl9BREQyKCJGRU0wX1R4QmlQUmVmZXJlbmNlUER2b2x0YWdlXzJfNEciLCBsLCB2YWwsCisJCSZncC0+dHhfYmlwX3JlZl9wZF92b2x0YWdlLCAxKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTBfVHhCaVBSZWZlcmVuY2VQb3dlcl8yXzRHIiwgbCwgdmFsLAorCQkmZ3AtPnR4X2JpcF9yZWZfcG93ZXIsIDEpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMF9UeEJpUE9mZnNldGRCXzJfNEciLCBsLCB2YWwsCisJCSZncC0+dHhfYmlwX3JlZl9vZmZzZXQsIDEpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMF9UeFBlclJhdGVQb3dlckxpbWl0c18yXzRHX05vcm1hbCIsIGwsIHZhbCwKKwkJZ3AtPnR4X3Blcl9yYXRlX3B3cl9saW1pdHNfbm9ybWFsLAorCQlXTDEyNzFfSU5JX1JBVEVfR1JPVVBfQ09VTlQpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMF9UeFBlclJhdGVQb3dlckxpbWl0c18yXzRHX0RlZ3JhZGVkIiwgbCwgdmFsLAorCQlncC0+dHhfcGVyX3JhdGVfcHdyX2xpbWl0c19kZWdyYWRlZCwKKwkJV0wxMjcxX0lOSV9SQVRFX0dST1VQX0NPVU5UKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTBfVHhQZXJSYXRlUG93ZXJMaW1pdHNfMl80R19FeHRyZW1lIiwgbCwgdmFsLAorCQlncC0+dHhfcGVyX3JhdGVfcHdyX2xpbWl0c19leHRyZW1lLAorCQlXTDEyNzFfSU5JX1JBVEVfR1JPVVBfQ09VTlQpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMF9EZWdyYWRlZExvd1RvTm9ybWFsVGhyXzJfNEciLCBsLCB2YWwsCisJCSZncC0+ZGVncmFkZWRfbG93X3RvX25vcm1hbF90aHIsIDEpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMF9Ob3JtYWxUb0RlZ3JhZGVkSGlnaFRocl8yXzRHIiwgbCwgdmFsLAorCQkmZ3AtPm5vcm1hbF90b19kZWdyYWRlZF9oaWdoX3RociwgMSk7CisKKwlDT01QQVJFX05fQUREKCJGRU0wX1R4UGVyQ2hhbm5lbFBvd2VyTGltaXRzXzJfNEdfMTFiIiwgbCwgdmFsLAorCQlncC0+dHhfcGVyX2NoYW5fcHdyX2xpbWl0c18xMWIsCisJCVdMMTI3MV9JTklfQ0hBTk5FTF9DT1VOVF8yKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTBfVHhQZXJDaGFubmVsUG93ZXJMaW1pdHNfMl80R19PRkRNIiwgbCwgdmFsLAorCQlncC0+dHhfcGVyX2NoYW5fcHdyX2xpbWl0c19vZmRtLAorCQlXTDEyNzFfSU5JX0NIQU5ORUxfQ09VTlRfMik7CisKKwlDT01QQVJFX05fQUREKCJGRU0wX1R4UERWc1JhdGVPZmZzZXRzXzJfNEciLCBsLCB2YWwsCisJCWdwLT50eF9wZF92c19yYXRlX29mZnNldHMsCisJCVdMMTI3MV9JTklfUkFURV9HUk9VUF9DT1VOVCk7CisKKwlDT01QQVJFX05fQUREKCJGRU0wX1R4UERWc0NoYW5uZWxPZmZzZXRzXzJfNEciLCBsLCB2YWwsCisJCWdwLT50eF9wZF92c19jaGFuX29mZnNldHMsCisJCVdMMTI3MV9JTklfQ0hBTk5FTF9DT1VOVF8yKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTBfVHhQRFZzVGVtcGVyYXR1cmVfMl80RyIsIGwsIHZhbCwKKwkJZ3AtPnR4X3BkX3ZzX3RlbXBlcmF0dXJlLAorCQlXTDEyOFhfSU5JX1BEX1ZTX1RFTVBFUkFUVVJFX1JBTkdFUyk7CisKKwlDT01QQVJFX05fQUREKCJGRU0wX1R4SWJpYXNUYWJsZV8yXzRHIiwgbCwgdmFsLAorCQlncC0+dHhfaWJpYXMsCisJCVdMMTI3MV9JTklfUkFURV9HUk9VUF9DT1VOVCk7CisKKwlDT01QQVJFX05fQUREKCJGRU0wX1J4RmVtSW5zZXJ0aW9uTG9zc18yXzRHIiwgbCwgdmFsLAorCQkmZ3AtPnJ4X2ZlbV9pbnNlcnRpb25fbG9zcywgMSk7CisKKwlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBwYXJzZTogKCVzKVxuIiwgbCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwYXJzZV9mZW0xX2JhbmQyX3BybXMoY2hhciAqbCwgc3RydWN0IHdsMTJ4eF9pbmkgKnApCit7CisJY2hhciAqbmFtZSwgKnZhbDsKKwlzdHJ1Y3Qgd2wxMjcxX2luaV9mZW1fcGFyYW1zXzIgKmdwID0KKwkJJihwLT5pbmkxMjcxLmR5bl9yYWRpb19wYXJhbXNfMlsxXS5wYXJhbXMpOworCisJaWYgKHNwbGl0X2xpbmUobCwgJm5hbWUsICZ2YWwpKSB7CisJCXJldHVybiAxOworICAgICAgICB9CisKKwlDT01QQVJFX05fQUREMigiRkVNMV9UWEJpUFJlZmVyZW5jZVBEdm9sdGFnZV8yXzRHIiwgbCwgdmFsLAorCQkmZ3AtPnR4X2JpcF9yZWZfcGRfdm9sdGFnZSwgMSk7CisKKwlDT01QQVJFX05fQUREKCJGRU0xX1R4QmlQUmVmZXJlbmNlUG93ZXJfMl80RyIsIGwsIHZhbCwKKwkJJmdwLT50eF9iaXBfcmVmX3Bvd2VyLCAxKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTFfVHhCaVBPZmZzZXRkQl8yXzRHIiwgbCwgdmFsLAorCQkmZ3AtPnR4X2JpcF9yZWZfb2Zmc2V0LCAxKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfMl80R19Ob3JtYWwiLCBsLCB2YWwsCisJCWdwLT50eF9wZXJfcmF0ZV9wd3JfbGltaXRzX25vcm1hbCwKKwkJV0wxMjcxX0lOSV9SQVRFX0dST1VQX0NPVU5UKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfMl80R19EZWdyYWRlZCIsIGwsIHZhbCwKKwkJZ3AtPnR4X3Blcl9yYXRlX3B3cl9saW1pdHNfZGVncmFkZWQsCisJCVdMMTI3MV9JTklfUkFURV9HUk9VUF9DT1VOVCk7CisKKwlDT01QQVJFX05fQUREKCJGRU0xX1R4UGVyUmF0ZVBvd2VyTGltaXRzXzJfNEdfRXh0cmVtZSIsIGwsIHZhbCwKKwkJZ3AtPnR4X3Blcl9yYXRlX3B3cl9saW1pdHNfZXh0cmVtZSwKKwkJV0wxMjcxX0lOSV9SQVRFX0dST1VQX0NPVU5UKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTFfRGVncmFkZWRMb3dUb05vcm1hbFRocl8yXzRHIiwgbCwgdmFsLAorCQkmZ3AtPmRlZ3JhZGVkX2xvd190b19ub3JtYWxfdGhyLCAxKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTFfTm9ybWFsVG9EZWdyYWRlZEhpZ2hUaHJfMl80RyIsIGwsIHZhbCwKKwkJJmdwLT5ub3JtYWxfdG9fZGVncmFkZWRfaGlnaF90aHIsIDEpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9UeFBlckNoYW5uZWxQb3dlckxpbWl0c18yXzRHXzExYiIsIGwsIHZhbCwKKwkJZ3AtPnR4X3Blcl9jaGFuX3B3cl9saW1pdHNfMTFiLAorCQlXTDEyNzFfSU5JX0NIQU5ORUxfQ09VTlRfMik7CisKKwlDT01QQVJFX05fQUREKCJGRU0xX1R4UGVyQ2hhbm5lbFBvd2VyTGltaXRzXzJfNEdfT0ZETSIsIGwsIHZhbCwKKwkJZ3AtPnR4X3Blcl9jaGFuX3B3cl9saW1pdHNfb2ZkbSwKKwkJV0wxMjcxX0lOSV9DSEFOTkVMX0NPVU5UXzIpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9UeFBEVnNSYXRlT2Zmc2V0c18yXzRHIiwgbCwgdmFsLAorCQlncC0+dHhfcGRfdnNfcmF0ZV9vZmZzZXRzLAorCQlXTDEyNzFfSU5JX1JBVEVfR1JPVVBfQ09VTlQpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9UeEliaWFzVGFibGVfMl80RyIsIGwsIHZhbCwKKwkJZ3AtPnR4X2liaWFzLAorCQlXTDEyNzFfSU5JX1JBVEVfR1JPVVBfQ09VTlQpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9SeEZlbUluc2VydGlvbkxvc3NfMl80RyIsIGwsIHZhbCwKKwkJJmdwLT5yeF9mZW1faW5zZXJ0aW9uX2xvc3MsIDEpOworCisJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gcGFyc2U6ICglcylcbiIsIGwpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZmVtMV9iYW5kMl9wcm1zXzEyOHgoY2hhciAqbCwgc3RydWN0IHdsMTJ4eF9pbmkgKnApCit7CisJY2hhciAqbmFtZSwgKnZhbDsKKwlzdHJ1Y3Qgd2wxMjh4X2luaV9mZW1fcGFyYW1zXzIgKmdwID0KKwkJJihwLT5pbmkxMjh4LmR5bl9yYWRpb19wYXJhbXNfMlsxXS5wYXJhbXMpOworCisJaWYgKHNwbGl0X2xpbmUobCwgJm5hbWUsICZ2YWwpKSB7CisJCXJldHVybiAxOworICAgICAgICB9CisKKwlDT01QQVJFX05fQUREMigiRkVNMV9UeEJpUFJlZmVyZW5jZVBEdm9sdGFnZV8yXzRHIiwgbCwgdmFsLAorCQkmZ3AtPnR4X2JpcF9yZWZfcGRfdm9sdGFnZSwgMSk7CisKKwlDT01QQVJFX05fQUREKCJGRU0xX1R4QmlQUmVmZXJlbmNlUG93ZXJfMl80RyIsIGwsIHZhbCwKKwkJJmdwLT50eF9iaXBfcmVmX3Bvd2VyLCAxKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTFfVHhCaVBPZmZzZXRkQl8yXzRHIiwgbCwgdmFsLAorCQkmZ3AtPnR4X2JpcF9yZWZfb2Zmc2V0LCAxKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfMl80R19Ob3JtYWwiLCBsLCB2YWwsCisJCWdwLT50eF9wZXJfcmF0ZV9wd3JfbGltaXRzX25vcm1hbCwKKwkJV0wxMjhYX0lOSV9SQVRFX0dST1VQX0NPVU5UKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfMl80R19EZWdyYWRlZCIsIGwsIHZhbCwKKwkJZ3AtPnR4X3Blcl9yYXRlX3B3cl9saW1pdHNfZGVncmFkZWQsCisJCVdMMTI4WF9JTklfUkFURV9HUk9VUF9DT1VOVCk7CisKKwlDT01QQVJFX05fQUREKCJGRU0xX1R4UGVyUmF0ZVBvd2VyTGltaXRzXzJfNEdfRXh0cmVtZSIsIGwsIHZhbCwKKwkJZ3AtPnR4X3Blcl9yYXRlX3B3cl9saW1pdHNfZXh0cmVtZSwKKwkJV0wxMjhYX0lOSV9SQVRFX0dST1VQX0NPVU5UKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTFfRGVncmFkZWRMb3dUb05vcm1hbFRocl8yXzRHIiwgbCwgdmFsLAorCQkmZ3AtPmRlZ3JhZGVkX2xvd190b19ub3JtYWxfdGhyLCAxKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTFfTm9ybWFsVG9EZWdyYWRlZEhpZ2hUaHJfMl80RyIsIGwsIHZhbCwKKwkJJmdwLT5ub3JtYWxfdG9fZGVncmFkZWRfaGlnaF90aHIsIDEpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9UeFBlckNoYW5uZWxQb3dlckxpbWl0c18yXzRHXzExYiIsIGwsIHZhbCwKKwkJZ3AtPnR4X3Blcl9jaGFuX3B3cl9saW1pdHNfMTFiLAorCQlXTDEyNzFfSU5JX0NIQU5ORUxfQ09VTlRfMik7CisKKwlDT01QQVJFX05fQUREKCJGRU0xX1R4UGVyQ2hhbm5lbFBvd2VyTGltaXRzXzJfNEdfT0ZETSIsIGwsIHZhbCwKKwkJZ3AtPnR4X3Blcl9jaGFuX3B3cl9saW1pdHNfb2ZkbSwKKwkJV0wxMjcxX0lOSV9DSEFOTkVMX0NPVU5UXzIpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9UeFBEVnNSYXRlT2Zmc2V0c18yXzRHIiwgbCwgdmFsLAorCQlncC0+dHhfcGRfdnNfcmF0ZV9vZmZzZXRzLAorCQlXTDEyOFhfSU5JX1JBVEVfR1JPVVBfQ09VTlQpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9UeFBEVnNDaGFubmVsT2Zmc2V0c18yXzRHIiwgbCwgdmFsLAorCQlncC0+dHhfcGRfdnNfY2hhbl9vZmZzZXRzLAorCQlXTDEyNzFfSU5JX0NIQU5ORUxfQ09VTlRfMik7CisKKwlDT01QQVJFX05fQUREKCJGRU0xX1R4UERWc1RlbXBlcmF0dXJlXzJfNEciLCBsLCB2YWwsCisJCWdwLT50eF9wZF92c190ZW1wZXJhdHVyZSwKKwkJV0wxMjhYX0lOSV9QRF9WU19URU1QRVJBVFVSRV9SQU5HRVMpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9UeEliaWFzVGFibGVfMl80RyIsIGwsIHZhbCwKKwkJZ3AtPnR4X2liaWFzLAorCQlXTDEyOFhfSU5JX1JBVEVfR1JPVVBfQ09VTlQpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9SeEZlbUluc2VydGlvbkxvc3NfMl80RyIsIGwsIHZhbCwKKwkJJmdwLT5yeF9mZW1faW5zZXJ0aW9uX2xvc3MsIDEpOworCisJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gcGFyc2U6ICglcylcbiIsIGwpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZmVtMV9iYW5kNV9wcm1zKGNoYXIgKmwsIHN0cnVjdCB3bDEyeHhfaW5pICpwKQoreworCWNoYXIgKm5hbWUsICp2YWw7CisJc3RydWN0IHdsMTI3MV9pbmlfZmVtX3BhcmFtc181ICpncCA9CisJCSYocC0+aW5pMTI3MS5keW5fcmFkaW9fcGFyYW1zXzVbMV0ucGFyYW1zKTsKKworCWlmIChzcGxpdF9saW5lKGwsICZuYW1lLCAmdmFsKSkgeworCQlyZXR1cm4gMTsKKyAgICAgICAgfQorCisJQ09NUEFSRV9OX0FERDIoIkZFTTFfVFhCaVBSZWZlcmVuY2VQRHZvbHRhZ2VfNUciLCBsLCB2YWwsCisJCWdwLT50eF9iaXBfcmVmX3BkX3ZvbHRhZ2UsIFdMMTI3MV9JTklfU1VCX0JBTkRfQ09VTlRfNSk7CisKKwlDT01QQVJFX05fQUREKCJGRU0xX1R4QmlQUmVmZXJlbmNlUG93ZXJfNUciLCBsLCB2YWwsCisJCWdwLT50eF9iaXBfcmVmX3Bvd2VyLCBXTDEyNzFfSU5JX1NVQl9CQU5EX0NPVU5UXzUpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9UeEJpUE9mZnNldGRCXzVHIiwgbCwgdmFsLAorCQlncC0+dHhfYmlwX3JlZl9vZmZzZXQsIFdMMTI3MV9JTklfU1VCX0JBTkRfQ09VTlRfNSk7CisKKwlDT01QQVJFX05fQUREKCJGRU0xX1R4UGVyUmF0ZVBvd2VyTGltaXRzXzVHX05vcm1hbCIsIGwsIHZhbCwKKwkJZ3AtPnR4X3Blcl9yYXRlX3B3cl9saW1pdHNfbm9ybWFsLAorCQlXTDEyNzFfSU5JX1JBVEVfR1JPVVBfQ09VTlQpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9UeFBlclJhdGVQb3dlckxpbWl0c181R19EZWdyYWRlZCIsIGwsIHZhbCwKKwkJZ3AtPnR4X3Blcl9yYXRlX3B3cl9saW1pdHNfZGVncmFkZWQsCisJCVdMMTI3MV9JTklfUkFURV9HUk9VUF9DT1VOVCk7CisKKwlDT01QQVJFX05fQUREKCJGRU0xX1R4UGVyUmF0ZVBvd2VyTGltaXRzXzVHX0V4dHJlbWUiLCBsLCB2YWwsCisJCWdwLT50eF9wZXJfcmF0ZV9wd3JfbGltaXRzX2V4dHJlbWUsCisJCVdMMTI3MV9JTklfUkFURV9HUk9VUF9DT1VOVCk7CisKKwlDT01QQVJFX05fQUREKCJGRU0xX0RlZ3JhZGVkTG93VG9Ob3JtYWxUaHJfNUciLCBsLCB2YWwsCisJCSZncC0+ZGVncmFkZWRfbG93X3RvX25vcm1hbF90aHIsIDEpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9Ob3JtYWxUb0RlZ3JhZGVkSGlnaFRocl81RyIsIGwsIHZhbCwKKwkJJmdwLT5ub3JtYWxfdG9fZGVncmFkZWRfaGlnaF90aHIsIDEpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9UeFBlckNoYW5uZWxQb3dlckxpbWl0c181R19PRkRNIiwgbCwgdmFsLAorCQlncC0+dHhfcGVyX2NoYW5fcHdyX2xpbWl0c19vZmRtLAorCQlXTDEyNzFfSU5JX0NIQU5ORUxfQ09VTlRfNSk7CisKKwlDT01QQVJFX05fQUREKCJGRU0xX1R4UERWc1JhdGVPZmZzZXRzXzVHIiwgbCwgdmFsLAorCQlncC0+dHhfcGRfdnNfcmF0ZV9vZmZzZXRzLAorCQlXTDEyNzFfSU5JX1JBVEVfR1JPVVBfQ09VTlQpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9UeEliaWFzVGFibGVfNUciLCBsLCB2YWwsCisJCWdwLT50eF9pYmlhcywKKwkJV0wxMjcxX0lOSV9SQVRFX0dST1VQX0NPVU5UKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTFfUnhGZW1JbnNlcnRpb25Mb3NzXzVHIiwgbCwgdmFsLAorCQlncC0+cnhfZmVtX2luc2VydGlvbl9sb3NzLCBXTDEyNzFfSU5JX1NVQl9CQU5EX0NPVU5UXzUpOworCisJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gcGFyc2U6ICglcylcbiIsIGwpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZmVtMV9iYW5kNV9wcm1zXzEyOHgoY2hhciAqbCwgc3RydWN0IHdsMTJ4eF9pbmkgKnApCit7CisJY2hhciAqbmFtZSwgKnZhbDsKKwlzdHJ1Y3Qgd2wxMjh4X2luaV9mZW1fcGFyYW1zXzUgKmdwID0KKwkJJihwLT5pbmkxMjh4LmR5bl9yYWRpb19wYXJhbXNfNVsxXS5wYXJhbXMpOworCisJaWYgKHNwbGl0X2xpbmUobCwgJm5hbWUsICZ2YWwpKSB7CisJCXJldHVybiAxOworICAgICAgICB9ICAgICAgICAKKworCUNPTVBBUkVfTl9BREQyKCJGRU0xX1R4QmlQUmVmZXJlbmNlUER2b2x0YWdlXzVHIiwgbCwgdmFsLAorCQlncC0+dHhfYmlwX3JlZl9wZF92b2x0YWdlLCBXTDEyNzFfSU5JX1NVQl9CQU5EX0NPVU5UXzUpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9UeEJpUFJlZmVyZW5jZVBvd2VyXzVHIiwgbCwgdmFsLAorCQlncC0+dHhfYmlwX3JlZl9wb3dlciwgV0wxMjcxX0lOSV9TVUJfQkFORF9DT1VOVF81KTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTFfVHhCaVBPZmZzZXRkQl81RyIsIGwsIHZhbCwKKwkJZ3AtPnR4X2JpcF9yZWZfb2Zmc2V0LCBXTDEyNzFfSU5JX1NVQl9CQU5EX0NPVU5UXzUpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9UeFBlclJhdGVQb3dlckxpbWl0c181R19Ob3JtYWwiLCBsLCB2YWwsCisJCWdwLT50eF9wZXJfcmF0ZV9wd3JfbGltaXRzX25vcm1hbCwKKwkJV0wxMjhYX0lOSV9SQVRFX0dST1VQX0NPVU5UKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfNUdfRGVncmFkZWQiLCBsLCB2YWwsCisJCWdwLT50eF9wZXJfcmF0ZV9wd3JfbGltaXRzX2RlZ3JhZGVkLAorCQlXTDEyOFhfSU5JX1JBVEVfR1JPVVBfQ09VTlQpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9UeFBlclJhdGVQb3dlckxpbWl0c181R19FeHRyZW1lIiwgbCwgdmFsLAorCQlncC0+dHhfcGVyX3JhdGVfcHdyX2xpbWl0c19leHRyZW1lLAorCQlXTDEyOFhfSU5JX1JBVEVfR1JPVVBfQ09VTlQpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9EZWdyYWRlZExvd1RvTm9ybWFsVGhyXzVHIiwgbCwgdmFsLAorCQkmZ3AtPmRlZ3JhZGVkX2xvd190b19ub3JtYWxfdGhyLCAxKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTFfTm9ybWFsVG9EZWdyYWRlZEhpZ2hUaHJfNUciLCBsLCB2YWwsCisJCSZncC0+bm9ybWFsX3RvX2RlZ3JhZGVkX2hpZ2hfdGhyLCAxKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTFfVHhQZXJDaGFubmVsUG93ZXJMaW1pdHNfNUdfT0ZETSIsIGwsIHZhbCwKKwkJZ3AtPnR4X3Blcl9jaGFuX3B3cl9saW1pdHNfb2ZkbSwKKwkJV0wxMjcxX0lOSV9DSEFOTkVMX0NPVU5UXzUpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9UeFBEVnNSYXRlT2Zmc2V0c181RyIsIGwsIHZhbCwKKwkJZ3AtPnR4X3BkX3ZzX3JhdGVfb2Zmc2V0cywKKwkJV0wxMjhYX0lOSV9SQVRFX0dST1VQX0NPVU5UKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTFfVHhQRFZzQ2hhbm5lbE9mZnNldHNfNUciLCBsLCB2YWwsCisJCWdwLT50eF9wZF92c19jaGFuX29mZnNldHMsCisJCVdMMTI3MV9JTklfQ0hBTk5FTF9DT1VOVF81KTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTFfVHhQRFZzVGVtcGVyYXR1cmVfNUciLCBsLCB2YWwsCisJCWdwLT50eF9wZF92c190ZW1wZXJhdHVyZSwKKwkJV0wxMjcxX0lOSV9TVUJfQkFORF9DT1VOVF81ICogV0wxMjhYX0lOSV9QRF9WU19URU1QRVJBVFVSRV9SQU5HRVMpOworCisJQ09NUEFSRV9OX0FERCgiRkVNMV9UeEliaWFzVGFibGVfNUciLCBsLCB2YWwsCisJCWdwLT50eF9pYmlhcywKKwkJV0wxMjhYX0lOSV9SQVRFX0dST1VQX0NPVU5UKTsKKworCUNPTVBBUkVfTl9BREQoIkZFTTFfUnhGZW1JbnNlcnRpb25Mb3NzXzVHIiwgbCwgdmFsLAorCQlncC0+cnhfZmVtX2luc2VydGlvbl9sb3NzLCBXTDEyNzFfSU5JX1NVQl9CQU5EX0NPVU5UXzUpOworCisJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gcGFyc2U6ICglcylcbiIsIGwpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZmVtX3BybXNfMTI4eChjaGFyICpsLCBzdHJ1Y3Qgd2wxMnh4X2luaSAqcCkKK3sKKwljaGFyICpuYW1lLCAqdmFsOworCXN0cnVjdCB3bDEyOHhfaW5pICpncCA9ICZwLT5pbmkxMjh4OworCisJaWYgKHNwbGl0X2xpbmUobCwgJm5hbWUsICZ2YWwpKSB7CisJCXJldHVybiAxOworICAgICAgICB9CisKKwlDT01QQVJFX05fQUREKCJGZW1WZW5kb3JBbmRPcHRpb25zIiwgbCwgdmFsLAorCQkmZ3AtPmZlbV92ZW5kb3JfYW5kX29wdGlvbnMsIDEpOworCisJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gcGFyc2U6ICglcylcbiIsIGwpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9zZWN0aW9uKGNvbnN0IGNoYXIgKmwsIGVudW0gd2wxMjcxX2luaV9zZWN0aW9uICpzdCwgaW50ICpjbnRyLAorCWVudW0gd2wxMnh4X2FyY2ggYXJjaCkKK3sKKwlpZiAoc3RybmNtcCgiVFhCaVBGRU1BdXRvRGV0ZWN0IiwgbCwgMTgpID09IDApIHsKKwkJKnN0ID0gR0VORVJBTF9QUk1TOworCQlpZiAoYXJjaCA9PSBXTDEyOFhfQVJDSCkgeworCQkJKmNudHIgPSAxNzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJKmNudHIgPSAxMjsKKyAgICAgICAgICAgICAgICB9CisKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cm5jbXAoIlJ4VHJhY2VJbnNlcnRpb25Mb3NzXzJfNEciLCBsLCAyNSkgPT0gMCkgeworCQkqc3QgPSBCQU5EMl9QUk1TOworCQlpZiAoYXJjaCA9PSBXTDEyOFhfQVJDSCl7CisJCQkqY250ciA9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCSpjbnRyID0gMzsKKyAgICAgICAgICAgICAgICB9CisKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cm5jbXAoIkZlbVZlbmRvckFuZE9wdGlvbnMiLCBsLCAxOSkgPT0gMCkgeworCQkqc3QgPSBGRU1fUFJNUzsKKwkJKmNudHIgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RybmNtcCgiUnhUcmFjZUluc2VydGlvbkxvc3NfNUciLCBsLCAyMykgPT0gMCkgeworCQkqc3QgPSBCQU5ENV9QUk1TOworCQlpZiAoYXJjaCA9PSBXTDEyOFhfQVJDSCkgeworCQkJKmNudHIgPSAyOworCQl9IGVsc2UgeworCQkJKmNudHIgPSAzOworICAgICAgICAgICAgICAgIH0KKworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RybmNtcCgiRkVNMF9UWEJpUFJlZmVyZW5jZVBEdm9sdGFnZV8yXzRHIiwgbCwgMzMpID09IDAgfHwKKwkJc3RybmNtcCgiRkVNMF9UeEJpUFJlZmVyZW5jZVBEdm9sdGFnZV8yXzRHIiwgbCwgMzMpID09IDApIHsKKwkJKnN0ID0gRkVNMF9CQU5EMl9QUk1TOworCQlpZiAoYXJjaCA9PSBXTDEyOFhfQVJDSCkgeworCQkJKmNudHIgPSAxNTsKKwkJfSBlbHNlIHsKKwkJCSpjbnRyID0gMTM7CisgICAgICAgICAgICAgICAgfQorCisJCXJldHVybiAwOworCX0KKworCWlmIChzdHJuY21wKCJGRU0xX1RYQmlQUmVmZXJlbmNlUER2b2x0YWdlXzJfNEciLCBsLCAzMykgPT0gMCB8fAorCQlzdHJuY21wKCJGRU0xX1R4QmlQUmVmZXJlbmNlUER2b2x0YWdlXzJfNEciLCBsLCAzMykgPT0gMCkgeworCQkqc3QgPSBGRU0xX0JBTkQyX1BSTVM7CisJCWlmIChhcmNoID09IFdMMTI4WF9BUkNIKSB7CisJCQkqY250ciA9IDE1OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCQkqY250ciA9IDEzOworICAgICAgICAgICAgICAgIH0KKworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RybmNtcCgiRkVNMV9UWEJpUFJlZmVyZW5jZVBEdm9sdGFnZV81RyIsIGwsIDMxKSA9PSAwIHx8CisJCXN0cm5jbXAoIkZFTTFfVHhCaVBSZWZlcmVuY2VQRHZvbHRhZ2VfNUciLCBsLCAzMSkgPT0gMCkgeworCQkqc3QgPSBGRU0xX0JBTkQ1X1BSTVM7CisJCWlmIChhcmNoID09IFdMMTI4WF9BUkNIKSB7CisJCQkqY250ciA9IDE0OworCQl9IGVsc2UgeworCQkJKmNudHIgPSAxMjsKKyAgICAgICAgICAgICAgICB9CisKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaW5pX3BhcnNlX2xpbmUoY2hhciAqbCwgaW50IG5iciwgc3RydWN0IHdsMTJ4eF9jb21tb24gKmNtbikKK3sKKwlzdGF0aWMgZW51bSB3bDEyNzFfaW5pX3NlY3Rpb24gc3RhdHVzOworCXN0YXRpYyBpbnQgY250cjsKKworCWlmICghY250ciAmJiBmaW5kX3NlY3Rpb24obCwgJnN0YXR1cywgJmNudHIsIGNtbi0+YXJjaCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVa25vd24gaW5pIHNlY3Rpb24gJXNcbiIsIGwpOworCQlyZXR1cm4gMTsKKwl9CisKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgR0VORVJBTF9QUk1TOgkvKiBnZW5lcmFsIHBhcmFtZXRlcnMgKi8KKwkJY250ci0tOworCQlyZXR1cm4gY21uLT5wYXJzZV9vcHMtPnByc19nZW5lcmFsX3BybXMobCwgY21uLCAmY21uLT5pbmkpOworCWNhc2UgRkVNX1BSTVM6CS8qIEZFTSBwYXJhbWV0ZXJzICovCisJCWlmIChjbW4tPmFyY2ggPT0gV0wxMjcxX0FSQ0gpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiVGhlIHBhcmFtZXRlciBub3QgZnJvbSAxMjd4IGFyY2hpdGVjdHVyZVxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQljbnRyLS07CisJCXJldHVybiBwYXJzZV9mZW1fcHJtc18xMjh4KGwsICZjbW4tPmluaSk7CisJY2FzZSBCQU5EMl9QUk1TOgkvKiBiYW5kIDIuNEdIeiBwYXJhbWV0ZXJzICovCisJCWNudHItLTsKKwkJcmV0dXJuIGNtbi0+cGFyc2Vfb3BzLT5wcnNfYmFuZDJfcHJtcyhsLCAmY21uLT5pbmkpOworCWNhc2UgQkFORDVfUFJNUzoJLyogYmFuZCA1R0h6IHBhcmFtZXRlcnMgKi8KKwkJY250ci0tOworCQlyZXR1cm4gY21uLT5wYXJzZV9vcHMtPnByc19iYW5kNV9wcm1zKGwsICZjbW4tPmluaSk7CisJY2FzZSBGRU0wX0JBTkQyX1BSTVM6CS8qIEZFTTAgYmFuZCAyLjRHSHogcGFyYW1ldGVycyAqLworCQljbnRyLS07CisJCXJldHVybiBjbW4tPnBhcnNlX29wcy0+cHJzX2ZlbTBfYmFuZDJfcHJtcyhsLCAmY21uLT5pbmkpOworCWNhc2UgRkVNMV9CQU5EMl9QUk1TOgkvKiBGRU0xIGJhbmQgMi40R0h6IHBhcmFtZXRlcnMgKi8KKwkJY250ci0tOworCQlyZXR1cm4gY21uLT5wYXJzZV9vcHMtPnByc19mZW0xX2JhbmQyX3BybXMobCwgJmNtbi0+aW5pKTsKKwljYXNlIEZFTTFfQkFORDVfUFJNUzoJLyogRkVNMSBiYW5kIDVHSHogcGFyYW1ldGVycyAqLworCQljbnRyLS07CisJCXJldHVybiBjbW4tPnBhcnNlX29wcy0+cHJzX2ZlbTFfYmFuZDVfcHJtcyhsLCAmY21uLT5pbmkpOworCWNhc2UgVUtOT1dOX1NFQ1RJT046CisJCS8qIGFkZGVkIGJlY2F1c2Ugb2YgY29tcGlsYXRpb24gd2FybmluZy4gaGFuZGVsZWQgaW4gZmluZF9zZWN0aW9uKCkgKi8KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBpbmlfZHVtcChzdHJ1Y3Qgd2wxMjcxX2luaSAqaW5pKQoreworCWludCBpOworCisJcHJpbnRmKCJcbiIpOworCXByaW50ZigiR2VuZXJhbCBwYXJhbXM6XG4iKTsKKwlwcmludGYoInJlZiBjbG9jazogICAgICAgICAgICAgICAgICUwMlhcbiIsCisJCWluaS0+Z2VuZXJhbF9wYXJhbXMucmVmX2Nsb2NrKTsKKwlwcmludGYoInNldHRsaW5nIHRpbWU6ICAgICAgICAgICAgICUwMlhcbiIsCisJCWluaS0+Z2VuZXJhbF9wYXJhbXMuc2V0dGxpbmdfdGltZSk7CisJcHJpbnRmKCJjbGsgdmFsaWQgb24gd2FrZXVwOiAgICAgICAlMDJYXG4iLAorCQlpbmktPmdlbmVyYWxfcGFyYW1zLmNsa192YWxpZF9vbl93YWtldXApOworCXByaW50ZigiZGMyZGMgbW9kZTogICAgICAgICAgICAgICAgJTAyWFxuIiwKKwkJaW5pLT5nZW5lcmFsX3BhcmFtcy5kYzJkY19tb2RlKTsKKwlwcmludGYoImR1YWwgYmFuZCBtb2RlOiAgICAgICAgICAgICUwMlhcbiIsCisJCWluaS0+Z2VuZXJhbF9wYXJhbXMuZHVhbF9tb2RlX3NlbGVjdCk7CisJcHJpbnRmKCJ0eCBiaXAgZmVtIGF1dG8gZGV0ZWN0OiAgICAlMDJYXG4iLAorCQlpbmktPmdlbmVyYWxfcGFyYW1zLnR4X2JpcF9mZW1fYXV0b19kZXRlY3QpOworCXByaW50ZigidHggYmlwIGZlbSBtYW51ZmFjdHVyZXI6ICAgJTAyWFxuIiwKKwkJaW5pLT5nZW5lcmFsX3BhcmFtcy50eF9iaXBfZmVtX21hbnVmYWN0dXJlcik7CisJcHJpbnRmKCJnZW5lcmFsIHNldHRpbmdzOiAgICAgICAgICAlMDJYXG4iLAorCQlpbmktPmdlbmVyYWxfcGFyYW1zLmdlbmVyYWxfc2V0dGluZ3MpOworCXByaW50Zigic3Igc3RhdGU6ICAgICAgICAgICAgICAgICAgJTAyWFxuIiwKKwkJaW5pLT5nZW5lcmFsX3BhcmFtcy5zcl9zdGF0ZSk7CisKKwlwcmludGYoInNyZjE6Iik7CisJZm9yIChpID0gMDsgaSA8IFdMMTI3MV9JTklfTUFYX1NNQVJUX1JFRkxFWF9QQVJBTTsgaSsrKQorCQlwcmludGYoIiAlMDJYIiwgaW5pLT5nZW5lcmFsX3BhcmFtcy5zcmYxW2ldKTsKKwlwcmludGYoIlxuIik7CisKKwlwcmludGYoInNyZjI6Iik7CisJZm9yIChpID0gMDsgaSA8IFdMMTI3MV9JTklfTUFYX1NNQVJUX1JFRkxFWF9QQVJBTTsgaSsrKQorCQlwcmludGYoIiAlMDJYIiwgaW5pLT5nZW5lcmFsX3BhcmFtcy5zcmYyW2ldKTsKKwlwcmludGYoIlxuIik7CisKKwlwcmludGYoInNyZjM6Iik7CisJZm9yIChpID0gMDsgaSA8IFdMMTI3MV9JTklfTUFYX1NNQVJUX1JFRkxFWF9QQVJBTTsgaSsrKQorCQlwcmludGYoIiAlMDJYIiwgaW5pLT5nZW5lcmFsX3BhcmFtcy5zcmYzW2ldKTsKKwlwcmludGYoIlxuIik7CisKKwlwcmludGYoIlN0YXRpYyAyLjQgYmFuZCBwYXJhbXM6XG4iKTsKKworCXByaW50ZigicnggdHJhY2UgaW5zZXJ0aW9uIGxvc3M6ICUwMlhcbiIsCisJCWluaS0+c3RhdF9yYWRpb19wYXJhbXNfMi5yeF90cmFjZV9pbnNlcnRpb25fbG9zcyk7CisKKwlwcmludGYoInJ4IHJzc2kgbiBwcm9jZXNzIGNvbXBlbnNhdGlvbjoiKTsKKwlmb3IgKGkgPSAwOyBpIDwgV0wxMjcxX0lOSV9SU1NJX1BST0NFU1NfQ09NUEVOU19TSVpFOyBpKyspCisJCXByaW50ZigiICUwMlgiLAorCQkJaW5pLT5zdGF0X3JhZGlvX3BhcmFtc18yLnJ4X3Jzc2lfcHJvY2Vzc19jb21wZW5zW2ldKTsKKwlwcmludGYoIlxuIik7CisKKwlwcmludGYoInR4IHRyYWNlOiAlMDJYXG4iLAorCQlpbmktPnN0YXRfcmFkaW9fcGFyYW1zXzIudHhfdHJhY2VfbG9zcyk7CisKKwlwcmludGYoIkR5bmFtaWMgMi40IGJhbmQgcGFyYW1zIGZvciBGRU1cbiIpOworCisJcHJpbnRmKCJTdGF0aWMgNSBiYW5kIHBhcmFtczpcbiIpOworCisJcHJpbnRmKCJyeCB0cmFjZSBpbnNlcnRpb24gbG9zczoiKTsKKwlmb3IgKGkgPSAwOyBpIDwgV0wxMjcxX0lOSV9TVUJfQkFORF9DT1VOVF81OyBpKyspCisJCXByaW50ZigiICUwMlgiLAorCQkJaW5pLT5zdGF0X3JhZGlvX3BhcmFtc181LnJ4X3Jzc2lfcHJvY2Vzc19jb21wZW5zW2ldKTsKKwlwcmludGYoIlxuIik7CisKKwlwcmludGYoInJ4IHJzc2kgbiBwcm9jZXNzIGNvbXBlbnNhdGlvbjoiKTsKKwlmb3IgKGkgPSAwOyBpIDwgV0wxMjcxX0lOSV9SU1NJX1BST0NFU1NfQ09NUEVOU19TSVpFOyBpKyspCisJCXByaW50ZigiICUwMlgiLAorCQkJaW5pLT5zdGF0X3JhZGlvX3BhcmFtc181LnJ4X3Jzc2lfcHJvY2Vzc19jb21wZW5zW2ldKTsKKwlwcmludGYoIlxuIik7CisKKwlwcmludGYoInR4IHRyYWNlOiIpOworCWZvciAoaSA9IDA7IGkgPCBXTDEyNzFfSU5JX1NVQl9CQU5EX0NPVU5UXzU7IGkrKykKKwkJcHJpbnRmKCIgJTAyWCIsCisJCQlpbmktPnN0YXRfcmFkaW9fcGFyYW1zXzUudHhfdHJhY2VfbG9zc1tpXSk7CisJcHJpbnRmKCJcbiIpOworCisJcHJpbnRmKCJEeW5hbWljIDUgYmFuZCBwYXJhbXMgZm9yIEZFTVxuIik7CisKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHdsMTJ4eF9wYXJzZV9vcHMgd2wxMjcxX3BhcnNlX29wcyA9IHsKKwkucHJzX2dlbmVyYWxfcHJtcyAgICAgICA9IHBhcnNlX2dlbmVyYWxfcHJtcywKKwkucHJzX2JhbmQyX3BybXMgICAgICAgICA9IHBhcnNlX2JhbmQyX3BybXMsCisJLnByc19iYW5kNV9wcm1zICAgICAgICAgPSBwYXJzZV9iYW5kNV9wcm1zLAorCS5wcnNfZmVtMF9iYW5kMl9wcm1zICAgID0gcGFyc2VfZmVtMF9iYW5kMl9wcm1zLAorCS5wcnNfZmVtMV9iYW5kMl9wcm1zICAgID0gcGFyc2VfZmVtMV9iYW5kMl9wcm1zLAorCS5wcnNfZmVtMV9iYW5kNV9wcm1zICAgID0gcGFyc2VfZmVtMV9iYW5kNV9wcm1zLAorfTsKKworc3RhdGljIHN0cnVjdCB3bDEyeHhfcGFyc2Vfb3BzIHdsMTI4eF9wYXJzZV9vcHMgPSB7CisJLnByc19nZW5lcmFsX3BybXMgICAgICAgPSBwYXJzZV9nZW5lcmFsX3BybXNfMTI4eCwKKwkucHJzX2JhbmQyX3BybXMgICAgICAgICA9IHBhcnNlX2JhbmQyX3BybXNfMTI4eCwKKwkucHJzX2JhbmQ1X3BybXMgICAgICAgICA9IHBhcnNlX2JhbmQ1X3BybXNfMTI4eCwKKwkucHJzX2ZlbTBfYmFuZDJfcHJtcyAgICA9IHBhcnNlX2ZlbTBfYmFuZDJfcHJtc18xMjh4LAorCS5wcnNfZmVtMV9iYW5kMl9wcm1zICAgID0gcGFyc2VfZmVtMV9iYW5kMl9wcm1zXzEyOHgsCisJLnByc19mZW0xX2JhbmQ1X3BybXMgICAgPSBwYXJzZV9mZW0xX2JhbmQ1X3BybXNfMTI4eCwKK307CisKK2ludCBudnNfZ2V0X2FyY2goaW50IGZpbGVfc2l6ZSwgc3RydWN0IHdsMTJ4eF9jb21tb24gKmNtbikKK3sKKwllbnVtIHdsMTJ4eF9hcmNoIGFyY2ggPSBVTktOT1dOX0FSQ0g7CisKKwlzd2l0Y2ggKGZpbGVfc2l6ZSkgeworCQljYXNlIFdMMTI3WF9OVlNfRklMRV9TWjoKKwkJCWFyY2ggPSBXTDEyNzFfQVJDSDsKKwkJCWNtbi0+cGFyc2Vfb3BzID0gJndsMTI3MV9wYXJzZV9vcHM7CisJCQlicmVhazsKKwkJY2FzZSBXTDEyOFhfTlZTX0ZJTEVfU1o6CisJCQlhcmNoID0gV0wxMjhYX0FSQ0g7CisJCQljbW4tPnBhcnNlX29wcyA9ICZ3bDEyOHhfcGFyc2Vfb3BzOworCQkJYnJlYWs7CisJfQorCisJaWYgKGNtbi0+YXJjaCAhPSBVTktOT1dOX0FSQ0ggJiYgY21uLT5hcmNoICE9IGFyY2gpIHsKKwkJY21uLT5wYXJzZV9vcHMgPSBOVUxMOworCQlyZXR1cm4gMTsKKwl9CisKKwljbW4tPmFyY2ggPSBhcmNoOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pX2dldF9hcmNoKEZJTEUgKmYsIHN0cnVjdCB3bDEyeHhfY29tbW9uICpjbW4pCit7CisJY2hhciBidWZbMTAyNF0sICpwb3M7CisJaW50IGxpbmUgPSAwOworCWVudW0gd2wxMnh4X2FyY2ggYXJjaCA9IFVOS05PV05fQVJDSDsKKworCXdoaWxlIChpbmlfZ2V0X2xpbmUoYnVmLCBzaXplb2YoYnVmKSwgZiwgJmxpbmUsICZwb3MpKSB7CisJCWlmIChzdHJuY21wKCJUQ1hPX0NsayIsIHBvcywgOCkgPT0gMCkgeworCQkJYXJjaCA9IFdMMTI4WF9BUkNIOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoYXJjaCA9PSBVTktOT1dOX0FSQ0gpIHsKKwkJYXJjaCA9IFdMMTI3MV9BUkNIOworICAgICAgICB9CisKKwlpZiAoY21uLT5hcmNoICE9IFVOS05PV05fQVJDSCAmJiBjbW4tPmFyY2ggIT0gYXJjaCkgeworCQlyZXR1cm4gMTsKKyAgICAgICAgfQorCisJY21uLT5hcmNoID0gYXJjaDsKKworCWlmIChjbW4tPmFyY2ggPT0gV0wxMjcxX0FSQ0gpIHsKKwkJY21uLT5wYXJzZV9vcHMgPSAmd2wxMjcxX3BhcnNlX29wczsKKyAgICAgICAgfSBlbHNlIHsKKwkJY21uLT5wYXJzZV9vcHMgPSAmd2wxMjh4X3BhcnNlX29wczsKKyAgICAgICAgfQorCisJZnNlZWsoZiwgMEwsIFNFRUtfU0VUKTsKKworCXJldHVybiAwOworfQorCitpbnQgcmVhZF9pbmkoY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0cnVjdCB3bDEyeHhfY29tbW9uICpjbW4pCit7CisJRklMRSAqZjsKKwljaGFyIGJ1ZlsxMDI0XSwgKnBvczsKKwlpbnQgcmV0ID0gMCwgbGluZSA9IDA7CisKKwlmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisJaWYgKGYgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBvcGVuIGZpbGUgJXMgKCVzKVxuIiwKKwkJCWZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBjaGVjayBpZiBpdCAxMjd4IG9yIDEyOHggKi8KKwlpZiAoaW5pX2dldF9hcmNoKGYsIGNtbikpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZGVmaW5lIHdpcmVsZXNzIGFyY2hpdGVjdHVyZVxuIik7CisJCXJldCA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCS8qIHN0YXJ0IHBhcnNpbmcgKi8KKwl3aGlsZSAoaW5pX2dldF9saW5lKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGYsICZsaW5lLCAmcG9zKSkgeworCQlyZXQgPSBpbmlfcGFyc2VfbGluZShwb3MsIGxpbmUsIGNtbik7CisJCWlmIChyZXQpIGJyZWFrOworCX0KKworb3V0OgorCWZjbG9zZShmKTsKKyNpZiAwCisJaW5pX2R1bXAoaW5pKTsKKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9tYWM4MDIxMS90aS11dGlscy9pbmkuaCBiL21hYzgwMjExL3RpLXV0aWxzL2luaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzM0ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tYWM4MDIxMS90aS11dGlscy9pbmkuaApAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHdsMTI3MQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIENvbnRhY3Q6IEx1Y2lhbm8gQ29lbGhvIDxsdWNpYW5vLmNvZWxob0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fSU5JX0hfXworI2RlZmluZSBfX0lOSV9IX18KKworI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorCisjZGVmaW5lIFdMMTI3MV9JTklfTUFYX1NNQVJUX1JFRkxFWF9QQVJBTSAxNgorCitzdHJ1Y3Qgd2wxMjcxX2luaV9nZW5lcmFsX3BhcmFtcyB7Cit1bnNpZ25lZCBjaGFyIHJlZl9jbG9jazsKK3Vuc2lnbmVkIGNoYXIgc2V0dGxpbmdfdGltZTsKK3Vuc2lnbmVkIGNoYXIgY2xrX3ZhbGlkX29uX3dha2V1cDsKK3Vuc2lnbmVkIGNoYXIgZGMyZGNfbW9kZTsKK3Vuc2lnbmVkIGNoYXIgZHVhbF9tb2RlX3NlbGVjdDsKK3Vuc2lnbmVkIGNoYXIgdHhfYmlwX2ZlbV9hdXRvX2RldGVjdDsKK3Vuc2lnbmVkIGNoYXIgdHhfYmlwX2ZlbV9tYW51ZmFjdHVyZXI7Cit1bnNpZ25lZCBjaGFyIGdlbmVyYWxfc2V0dGluZ3M7Cit1bnNpZ25lZCBjaGFyIHNyX3N0YXRlOwordW5zaWduZWQgY2hhciBzcmYxW1dMMTI3MV9JTklfTUFYX1NNQVJUX1JFRkxFWF9QQVJBTV07Cit1bnNpZ25lZCBjaGFyIHNyZjJbV0wxMjcxX0lOSV9NQVhfU01BUlRfUkVGTEVYX1BBUkFNXTsKK3Vuc2lnbmVkIGNoYXIgc3JmM1tXTDEyNzFfSU5JX01BWF9TTUFSVF9SRUZMRVhfUEFSQU1dOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBXTDEyOFhfSU5JX01BWF9TRVRUSU5HU19QQVJBTSA0CisKK3N0cnVjdCB3bDEyOHhfaW5pX2dlbmVyYWxfcGFyYW1zIHsKK3Vuc2lnbmVkIGNoYXIgcmVmX2Nsb2NrOwordW5zaWduZWQgY2hhciBzZXR0bGluZ190aW1lOwordW5zaWduZWQgY2hhciBjbGtfdmFsaWRfb25fd2FrZXVwOwordW5zaWduZWQgY2hhciB0Y3hvX3JlZl9jbG9jazsKK3Vuc2lnbmVkIGNoYXIgdGN4b19zZXR0bGluZ190aW1lOwordW5zaWduZWQgY2hhciB0Y3hvX3ZhbGlkX29uX3dha2V1cDsKK3Vuc2lnbmVkIGNoYXIgdGN4b19sZG9fdm9sdGFnZTsKK3Vuc2lnbmVkIGNoYXIgeHRhbF9pdHJpbV92YWw7Cit1bnNpZ25lZCBjaGFyIHBsYXRmb3JtX2NvbmY7Cit1bnNpZ25lZCBjaGFyIGR1YWxfbW9kZV9zZWxlY3Q7Cit1bnNpZ25lZCBjaGFyIHR4X2JpcF9mZW1fYXV0b19kZXRlY3Q7Cit1bnNpZ25lZCBjaGFyIHR4X2JpcF9mZW1fbWFudWZhY3R1cmVyOwordW5zaWduZWQgY2hhciBnZW5lcmFsX3NldHRpbmdzW1dMMTI4WF9JTklfTUFYX1NFVFRJTkdTX1BBUkFNXTsKK3Vuc2lnbmVkIGNoYXIgc3Jfc3RhdGU7Cit1bnNpZ25lZCBjaGFyIHNyZjFbV0wxMjcxX0lOSV9NQVhfU01BUlRfUkVGTEVYX1BBUkFNXTsKK3Vuc2lnbmVkIGNoYXIgc3JmMltXTDEyNzFfSU5JX01BWF9TTUFSVF9SRUZMRVhfUEFSQU1dOwordW5zaWduZWQgY2hhciBzcmYzW1dMMTI3MV9JTklfTUFYX1NNQVJUX1JFRkxFWF9QQVJBTV07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIFdMMTI3MV9JTklfUlNTSV9QUk9DRVNTX0NPTVBFTlNfU0laRSAxNQorCitzdHJ1Y3Qgd2wxMjcxX2luaV9iYW5kX3BhcmFtc18yIHsKK3Vuc2lnbmVkIGNoYXIgcnhfdHJhY2VfaW5zZXJ0aW9uX2xvc3M7Cit1bnNpZ25lZCBjaGFyIHR4X3RyYWNlX2xvc3M7Cit1bnNpZ25lZCBjaGFyCityeF9yc3NpX3Byb2Nlc3NfY29tcGVuc1tXTDEyNzFfSU5JX1JTU0lfUFJPQ0VTU19DT01QRU5TX1NJWkVdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBXTDEyNzFfSU5JX0NIQU5ORUxfQ09VTlRfMiAxNAorCitzdHJ1Y3Qgd2wxMjh4X2luaV9iYW5kX3BhcmFtc18yIHsKK3Vuc2lnbmVkIGNoYXIgcnhfdHJhY2VfaW5zZXJ0aW9uX2xvc3M7Cit1bnNpZ25lZCBjaGFyIHR4X3RyYWNlX2xvc3NbV0wxMjcxX0lOSV9DSEFOTkVMX0NPVU5UXzJdOwordW5zaWduZWQgY2hhcgorcnhfcnNzaV9wcm9jZXNzX2NvbXBlbnNbV0wxMjcxX0lOSV9SU1NJX1BST0NFU1NfQ09NUEVOU19TSVpFXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgV0wxMjcxX0lOSV9SQVRFX0dST1VQX0NPVU5UIDYKKworc3RydWN0IHdsMTI3MV9pbmlfZmVtX3BhcmFtc18yIHsKK19fbGUxNiB0eF9iaXBfcmVmX3BkX3ZvbHRhZ2U7Cit1bnNpZ25lZCBjaGFyIHR4X2JpcF9yZWZfcG93ZXI7Cit1bnNpZ25lZCBjaGFyIHR4X2JpcF9yZWZfb2Zmc2V0OwordW5zaWduZWQgY2hhcgordHhfcGVyX3JhdGVfcHdyX2xpbWl0c19ub3JtYWxbV0wxMjcxX0lOSV9SQVRFX0dST1VQX0NPVU5UXTsKK3Vuc2lnbmVkIGNoYXIKK3R4X3Blcl9yYXRlX3B3cl9saW1pdHNfZGVncmFkZWRbV0wxMjcxX0lOSV9SQVRFX0dST1VQX0NPVU5UXTsKK3Vuc2lnbmVkIGNoYXIKK3R4X3Blcl9yYXRlX3B3cl9saW1pdHNfZXh0cmVtZVtXTDEyNzFfSU5JX1JBVEVfR1JPVVBfQ09VTlRdOwordW5zaWduZWQgY2hhciB0eF9wZXJfY2hhbl9wd3JfbGltaXRzXzExYltXTDEyNzFfSU5JX0NIQU5ORUxfQ09VTlRfMl07Cit1bnNpZ25lZCBjaGFyIHR4X3Blcl9jaGFuX3B3cl9saW1pdHNfb2ZkbVtXTDEyNzFfSU5JX0NIQU5ORUxfQ09VTlRfMl07Cit1bnNpZ25lZCBjaGFyIHR4X3BkX3ZzX3JhdGVfb2Zmc2V0c1tXTDEyNzFfSU5JX1JBVEVfR1JPVVBfQ09VTlRdOwordW5zaWduZWQgY2hhciB0eF9pYmlhc1tXTDEyNzFfSU5JX1JBVEVfR1JPVVBfQ09VTlRdOwordW5zaWduZWQgY2hhciByeF9mZW1faW5zZXJ0aW9uX2xvc3M7Cit1bnNpZ25lZCBjaGFyIGRlZ3JhZGVkX2xvd190b19ub3JtYWxfdGhyOwordW5zaWduZWQgY2hhciBub3JtYWxfdG9fZGVncmFkZWRfaGlnaF90aHI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIFdMMTI4WF9JTklfUkFURV9HUk9VUF9DT1VOVCA3CisvKiBsb3cgYW5kIGhpZ2ggdGVtcGVyYXR1cmVzKi8KKyNkZWZpbmUgV0wxMjhYX0lOSV9QRF9WU19URU1QRVJBVFVSRV9SQU5HRVMgMgorCitzdHJ1Y3Qgd2wxMjh4X2luaV9mZW1fcGFyYW1zXzIgeworX19sZTE2IHR4X2JpcF9yZWZfcGRfdm9sdGFnZTsKK3Vuc2lnbmVkIGNoYXIgdHhfYmlwX3JlZl9wb3dlcjsKK3Vuc2lnbmVkIGNoYXIgdHhfYmlwX3JlZl9vZmZzZXQ7Cit1bnNpZ25lZCBjaGFyCit0eF9wZXJfcmF0ZV9wd3JfbGltaXRzX25vcm1hbCBbV0wxMjhYX0lOSV9SQVRFX0dST1VQX0NPVU5UXTsKK3Vuc2lnbmVkIGNoYXIKK3R4X3Blcl9yYXRlX3B3cl9saW1pdHNfZGVncmFkZWQgW1dMMTI4WF9JTklfUkFURV9HUk9VUF9DT1VOVF07Cit1bnNpZ25lZCBjaGFyCit0eF9wZXJfcmF0ZV9wd3JfbGltaXRzX2V4dHJlbWUgW1dMMTI4WF9JTklfUkFURV9HUk9VUF9DT1VOVF07Cit1bnNpZ25lZCBjaGFyIHR4X3Blcl9jaGFuX3B3cl9saW1pdHNfMTFiW1dMMTI3MV9JTklfQ0hBTk5FTF9DT1VOVF8yXTsKK3Vuc2lnbmVkIGNoYXIgdHhfcGVyX2NoYW5fcHdyX2xpbWl0c19vZmRtW1dMMTI3MV9JTklfQ0hBTk5FTF9DT1VOVF8yXTsKK3Vuc2lnbmVkIGNoYXIgdHhfcGRfdnNfcmF0ZV9vZmZzZXRzW1dMMTI4WF9JTklfUkFURV9HUk9VUF9DT1VOVF07Cit1bnNpZ25lZCBjaGFyIHR4X2liaWFzW1dMMTI4WF9JTklfUkFURV9HUk9VUF9DT1VOVCArIDFdOwordW5zaWduZWQgY2hhciB0eF9wZF92c19jaGFuX29mZnNldHNbV0wxMjcxX0lOSV9DSEFOTkVMX0NPVU5UXzJdOwordW5zaWduZWQgY2hhciB0eF9wZF92c190ZW1wZXJhdHVyZVtXTDEyOFhfSU5JX1BEX1ZTX1RFTVBFUkFUVVJFX1JBTkdFU107Cit1bnNpZ25lZCBjaGFyIHJ4X2ZlbV9pbnNlcnRpb25fbG9zczsKK3Vuc2lnbmVkIGNoYXIgZGVncmFkZWRfbG93X3RvX25vcm1hbF90aHI7Cit1bnNpZ25lZCBjaGFyIG5vcm1hbF90b19kZWdyYWRlZF9oaWdoX3RocjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgV0wxMjcxX0lOSV9DSEFOTkVMX0NPVU5UXzUgMzUKKyNkZWZpbmUgV0wxMjcxX0lOSV9TVUJfQkFORF9DT1VOVF81IDcKKworc3RydWN0IHdsMTI3MV9pbmlfYmFuZF9wYXJhbXNfNSB7Cit1bnNpZ25lZCBjaGFyIHJ4X3RyYWNlX2luc2VydGlvbl9sb3NzW1dMMTI3MV9JTklfU1VCX0JBTkRfQ09VTlRfNV07Cit1bnNpZ25lZCBjaGFyIHR4X3RyYWNlX2xvc3NbV0wxMjcxX0lOSV9TVUJfQkFORF9DT1VOVF81XTsKK3Vuc2lnbmVkIGNoYXIKK3J4X3Jzc2lfcHJvY2Vzc19jb21wZW5zW1dMMTI3MV9JTklfUlNTSV9QUk9DRVNTX0NPTVBFTlNfU0laRV07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgd2wxMjh4X2luaV9iYW5kX3BhcmFtc181IHsKK3Vuc2lnbmVkIGNoYXIgcnhfdHJhY2VfaW5zZXJ0aW9uX2xvc3NbV0wxMjcxX0lOSV9TVUJfQkFORF9DT1VOVF81XTsKK3Vuc2lnbmVkIGNoYXIgdHhfdHJhY2VfbG9zc1tXTDEyNzFfSU5JX0NIQU5ORUxfQ09VTlRfNV07Cit1bnNpZ25lZCBjaGFyCityeF9yc3NpX3Byb2Nlc3NfY29tcGVuc1tXTDEyNzFfSU5JX1JTU0lfUFJPQ0VTU19DT01QRU5TX1NJWkVdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHdsMTI3MV9pbmlfZmVtX3BhcmFtc181IHsKK19fbGUxNiB0eF9iaXBfcmVmX3BkX3ZvbHRhZ2VbV0wxMjcxX0lOSV9TVUJfQkFORF9DT1VOVF81XTsKK3Vuc2lnbmVkIGNoYXIgdHhfYmlwX3JlZl9wb3dlcltXTDEyNzFfSU5JX1NVQl9CQU5EX0NPVU5UXzVdOwordW5zaWduZWQgY2hhciB0eF9iaXBfcmVmX29mZnNldFtXTDEyNzFfSU5JX1NVQl9CQU5EX0NPVU5UXzVdOwordW5zaWduZWQgY2hhcgordHhfcGVyX3JhdGVfcHdyX2xpbWl0c19ub3JtYWxbV0wxMjcxX0lOSV9SQVRFX0dST1VQX0NPVU5UXTsKK3Vuc2lnbmVkIGNoYXIKK3R4X3Blcl9yYXRlX3B3cl9saW1pdHNfZGVncmFkZWRbV0wxMjcxX0lOSV9SQVRFX0dST1VQX0NPVU5UXTsKK3Vuc2lnbmVkIGNoYXIKK3R4X3Blcl9yYXRlX3B3cl9saW1pdHNfZXh0cmVtZVtXTDEyNzFfSU5JX1JBVEVfR1JPVVBfQ09VTlRdOwordW5zaWduZWQgY2hhciB0eF9wZXJfY2hhbl9wd3JfbGltaXRzX29mZG1bV0wxMjcxX0lOSV9DSEFOTkVMX0NPVU5UXzVdOwordW5zaWduZWQgY2hhciB0eF9wZF92c19yYXRlX29mZnNldHNbV0wxMjcxX0lOSV9SQVRFX0dST1VQX0NPVU5UXTsKK3Vuc2lnbmVkIGNoYXIgdHhfaWJpYXNbV0wxMjcxX0lOSV9SQVRFX0dST1VQX0NPVU5UXTsKK3Vuc2lnbmVkIGNoYXIgcnhfZmVtX2luc2VydGlvbl9sb3NzW1dMMTI3MV9JTklfU1VCX0JBTkRfQ09VTlRfNV07Cit1bnNpZ25lZCBjaGFyIGRlZ3JhZGVkX2xvd190b19ub3JtYWxfdGhyOwordW5zaWduZWQgY2hhciBub3JtYWxfdG9fZGVncmFkZWRfaGlnaF90aHI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgd2wxMjh4X2luaV9mZW1fcGFyYW1zXzUgeworX19sZTE2IHR4X2JpcF9yZWZfcGRfdm9sdGFnZVtXTDEyNzFfSU5JX1NVQl9CQU5EX0NPVU5UXzVdOwordW5zaWduZWQgY2hhciB0eF9iaXBfcmVmX3Bvd2VyW1dMMTI3MV9JTklfU1VCX0JBTkRfQ09VTlRfNV07Cit1bnNpZ25lZCBjaGFyIHR4X2JpcF9yZWZfb2Zmc2V0W1dMMTI3MV9JTklfU1VCX0JBTkRfQ09VTlRfNV07Cit1bnNpZ25lZCBjaGFyCit0eF9wZXJfcmF0ZV9wd3JfbGltaXRzX25vcm1hbCBbV0wxMjhYX0lOSV9SQVRFX0dST1VQX0NPVU5UXTsKK3Vuc2lnbmVkIGNoYXIKK3R4X3Blcl9yYXRlX3B3cl9saW1pdHNfZGVncmFkZWQgW1dMMTI4WF9JTklfUkFURV9HUk9VUF9DT1VOVF07Cit1bnNpZ25lZCBjaGFyCit0eF9wZXJfcmF0ZV9wd3JfbGltaXRzX2V4dHJlbWUgW1dMMTI4WF9JTklfUkFURV9HUk9VUF9DT1VOVF07Cit1bnNpZ25lZCBjaGFyIHR4X3Blcl9jaGFuX3B3cl9saW1pdHNfb2ZkbVtXTDEyNzFfSU5JX0NIQU5ORUxfQ09VTlRfNV07Cit1bnNpZ25lZCBjaGFyIHR4X3BkX3ZzX3JhdGVfb2Zmc2V0c1tXTDEyOFhfSU5JX1JBVEVfR1JPVVBfQ09VTlRdOwordW5zaWduZWQgY2hhciB0eF9pYmlhc1tXTDEyOFhfSU5JX1JBVEVfR1JPVVBfQ09VTlRdOwordW5zaWduZWQgY2hhciB0eF9wZF92c19jaGFuX29mZnNldHNbV0wxMjcxX0lOSV9DSEFOTkVMX0NPVU5UXzVdOwordW5zaWduZWQgY2hhciB0eF9wZF92c190ZW1wZXJhdHVyZVtXTDEyNzFfSU5JX1NVQl9CQU5EX0NPVU5UXzUgKgorV0wxMjhYX0lOSV9QRF9WU19URU1QRVJBVFVSRV9SQU5HRVNdOwordW5zaWduZWQgY2hhciByeF9mZW1faW5zZXJ0aW9uX2xvc3NbV0wxMjcxX0lOSV9TVUJfQkFORF9DT1VOVF81XTsKK3Vuc2lnbmVkIGNoYXIgZGVncmFkZWRfbG93X3RvX25vcm1hbF90aHI7Cit1bnNpZ25lZCBjaGFyIG5vcm1hbF90b19kZWdyYWRlZF9oaWdoX3RocjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIE5WUyBkYXRhIHN0cnVjdHVyZSAqLworI2RlZmluZSBXTDEyNzFfSU5JX05WU19TRUNUSU9OX1NJWkUgICAgIDQ2OAorI2RlZmluZSBXTDEyNzFfSU5JX0ZFTV9NT0RVTEVfQ09VTlQgICAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgV0wxMjcxX0lOSV9MRUdBQ1lfTlZTX0ZJTEVfU0laRSAgICAgICAgICAgICAgODAwCisKK3N0cnVjdCB3bDEyNzFfbnZzX2ZpbGUgeworLyogTlZTIHNlY3Rpb24gKi8KK3Vuc2lnbmVkIGNoYXIgbnZzW1dMMTI3MV9JTklfTlZTX1NFQ1RJT05fU0laRV07CisKKy8qIElOSSBzZWN0aW9uICovCitzdHJ1Y3Qgd2wxMjcxX2luaV9nZW5lcmFsX3BhcmFtcyBnZW5lcmFsX3BhcmFtczsKK3Vuc2lnbmVkIGNoYXIgcGFkZGluZzE7CitzdHJ1Y3Qgd2wxMjcxX2luaV9iYW5kX3BhcmFtc18yIHN0YXRfcmFkaW9fcGFyYW1zXzI7Cit1bnNpZ25lZCBjaGFyIHBhZGRpbmcyOworc3RydWN0IHsKK3N0cnVjdCB3bDEyNzFfaW5pX2ZlbV9wYXJhbXNfMiBwYXJhbXM7Cit1bnNpZ25lZCBjaGFyIHBhZGRpbmc7Cit9IGR5bl9yYWRpb19wYXJhbXNfMltXTDEyNzFfSU5JX0ZFTV9NT0RVTEVfQ09VTlRdOworc3RydWN0IHdsMTI3MV9pbmlfYmFuZF9wYXJhbXNfNSBzdGF0X3JhZGlvX3BhcmFtc181OwordW5zaWduZWQgY2hhciBwYWRkaW5nMzsKK3N0cnVjdCB7CitzdHJ1Y3Qgd2wxMjcxX2luaV9mZW1fcGFyYW1zXzUgcGFyYW1zOwordW5zaWduZWQgY2hhciBwYWRkaW5nOworfSBkeW5fcmFkaW9fcGFyYW1zXzVbV0wxMjcxX0lOSV9GRU1fTU9EVUxFX0NPVU5UXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB3bDEyOHhfbnZzX2ZpbGUgeworLyogTlZTIHNlY3Rpb24gKi8KK3Vuc2lnbmVkIGNoYXIgbnZzW1dMMTI3MV9JTklfTlZTX1NFQ1RJT05fU0laRV07CisKKy8qIElOSSBzZWN0aW9uICovCitzdHJ1Y3Qgd2wxMjh4X2luaV9nZW5lcmFsX3BhcmFtcyBnZW5lcmFsX3BhcmFtczsKK3Vuc2lnbmVkIGNoYXIgZmVtX3ZlbmRvcl9hbmRfb3B0aW9uczsKK3N0cnVjdCB3bDEyOHhfaW5pX2JhbmRfcGFyYW1zXzIgc3RhdF9yYWRpb19wYXJhbXNfMjsKK3Vuc2lnbmVkIGNoYXIgcGFkZGluZzI7CitzdHJ1Y3Qgeworc3RydWN0IHdsMTI4eF9pbmlfZmVtX3BhcmFtc18yIHBhcmFtczsKK3Vuc2lnbmVkIGNoYXIgcGFkZGluZzsKK30gZHluX3JhZGlvX3BhcmFtc18yW1dMMTI3MV9JTklfRkVNX01PRFVMRV9DT1VOVF07CitzdHJ1Y3Qgd2wxMjh4X2luaV9iYW5kX3BhcmFtc181IHN0YXRfcmFkaW9fcGFyYW1zXzU7Cit1bnNpZ25lZCBjaGFyIHBhZGRpbmczOworc3RydWN0IHsKK3N0cnVjdCB3bDEyOHhfaW5pX2ZlbV9wYXJhbXNfNSBwYXJhbXM7Cit1bnNpZ25lZCBjaGFyIHBhZGRpbmc7Cit9IGR5bl9yYWRpb19wYXJhbXNfNVtXTDEyNzFfSU5JX0ZFTV9NT0RVTEVfQ09VTlRdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHdsMTI3MV9pbmkgeworc3RydWN0IHdsMTI3MV9pbmlfZ2VuZXJhbF9wYXJhbXMgZ2VuZXJhbF9wYXJhbXM7Cit1bnNpZ25lZCBjaGFyIHBhZGRpbmcxOworc3RydWN0IHdsMTI3MV9pbmlfYmFuZF9wYXJhbXNfMiBzdGF0X3JhZGlvX3BhcmFtc18yOwordW5zaWduZWQgY2hhciBwYWRkaW5nMjsKK3N0cnVjdCB7CitzdHJ1Y3Qgd2wxMjcxX2luaV9mZW1fcGFyYW1zXzIgcGFyYW1zOwordW5zaWduZWQgY2hhciBwYWRkaW5nOworfSBkeW5fcmFkaW9fcGFyYW1zXzJbV0wxMjcxX0lOSV9GRU1fTU9EVUxFX0NPVU5UXTsKK3N0cnVjdCB3bDEyNzFfaW5pX2JhbmRfcGFyYW1zXzUgc3RhdF9yYWRpb19wYXJhbXNfNTsKK3Vuc2lnbmVkIGNoYXIgcGFkZGluZzM7CitzdHJ1Y3Qgeworc3RydWN0IHdsMTI3MV9pbmlfZmVtX3BhcmFtc181IHBhcmFtczsKK3Vuc2lnbmVkIGNoYXIgcGFkZGluZzsKK30gZHluX3JhZGlvX3BhcmFtc181W1dMMTI3MV9JTklfRkVNX01PRFVMRV9DT1VOVF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgd2wxMjh4X2luaSB7CitzdHJ1Y3Qgd2wxMjh4X2luaV9nZW5lcmFsX3BhcmFtcyBnZW5lcmFsX3BhcmFtczsKK3Vuc2lnbmVkIGNoYXIgZmVtX3ZlbmRvcl9hbmRfb3B0aW9uczsKK3N0cnVjdCB3bDEyOHhfaW5pX2JhbmRfcGFyYW1zXzIgc3RhdF9yYWRpb19wYXJhbXNfMjsKK3Vuc2lnbmVkIGNoYXIgcGFkZGluZzI7CitzdHJ1Y3Qgeworc3RydWN0IHdsMTI4eF9pbmlfZmVtX3BhcmFtc18yIHBhcmFtczsKK3Vuc2lnbmVkIGNoYXIgcGFkZGluZzsKK30gZHluX3JhZGlvX3BhcmFtc18yW1dMMTI3MV9JTklfRkVNX01PRFVMRV9DT1VOVF07CitzdHJ1Y3Qgd2wxMjh4X2luaV9iYW5kX3BhcmFtc181IHN0YXRfcmFkaW9fcGFyYW1zXzU7Cit1bnNpZ25lZCBjaGFyIHBhZGRpbmczOworc3RydWN0IHsKK3N0cnVjdCB3bDEyOHhfaW5pX2ZlbV9wYXJhbXNfNSBwYXJhbXM7Cit1bnNpZ25lZCBjaGFyIHBhZGRpbmc7Cit9IGR5bl9yYWRpb19wYXJhbXNfNVtXTDEyNzFfSU5JX0ZFTV9NT0RVTEVfQ09VTlRdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworZW51bSB3bDEyNzFfaW5pX3NlY3Rpb24geworVUtOT1dOX1NFQ1RJT04sCitHRU5FUkFMX1BSTVMsCitGRU1fUFJNUywKK0JBTkQyX1BSTVMsCitCQU5ENV9QUk1TLAorRkVNMF9CQU5EMl9QUk1TLAorRkVNMV9CQU5EMl9QUk1TLAorRkVNMV9CQU5ENV9QUk1TCit9OworCitlbnVtIHdsMTJ4eF9hcmNoIHsKK1VOS05PV05fQVJDSCwKK1dMMTI3MV9BUkNILAorV0wxMjhYX0FSQ0gKK307CisKK3N0cnVjdCB3bDEyeHhfaW5pIHsKK3VuaW9uIHsKK3N0cnVjdCB3bDEyNzFfaW5pIGluaTEyNzE7CitzdHJ1Y3Qgd2wxMjh4X2luaSBpbmkxMjh4OworfTsKK307CisKKyNkZWZpbmUgRFVBTF9NT0RFX1VOU0VUICAgIDB4ZmYKKyNkZWZpbmUgTk9fRkVNX1BBUlNFRCAgICAgIDB4ZmYKKworc3RydWN0IHdsMTJ4eF9jb21tb24geworZW51bSB3bDEyeHhfYXJjaCBhcmNoOwordW5zaWduZWQgY2hhciBkdWFsX21vZGU7Cit1bnNpZ25lZCBjaGFyIGRvbmVfZmVtOyAvKiBOdW1iZXIgb2YgRkVNIGFscmVhZHkgcGFyc2VkICovCitzdHJ1Y3Qgd2wxMnh4X3BhcnNlX29wcyAqcGFyc2Vfb3BzOworc3RydWN0IHdsMTJ4eF9udnNfb3BzICAgKm52c19vcHM7CitzdHJ1Y3Qgd2wxMnh4X2luaSBpbmk7Cit9OworCitzdHJ1Y3Qgd2wxMnh4X3BhcnNlX29wcyB7CitpbnQgKCpwcnNfZ2VuZXJhbF9wcm1zKShjaGFyICpsLCBzdHJ1Y3Qgd2wxMnh4X2NvbW1vbiAqY21uLAorc3RydWN0IHdsMTJ4eF9pbmkgKnApOworLyogaW50ICgqcHJzX2ZlbV9wcm1zKShjaGFyICpsLCB2b2lkICpncCk7ICovCitpbnQgKCpwcnNfYmFuZDJfcHJtcykoY2hhciAqbCwgc3RydWN0IHdsMTJ4eF9pbmkgKnApOworaW50ICgqcHJzX2JhbmQ1X3BybXMpKGNoYXIgKmwsIHN0cnVjdCB3bDEyeHhfaW5pICpwKTsKK2ludCAoKnByc19mZW0wX2JhbmQyX3BybXMpKGNoYXIgKmwsIHN0cnVjdCB3bDEyeHhfaW5pICpwKTsKK2ludCAoKnByc19mZW0xX2JhbmQyX3BybXMpKGNoYXIgKmwsIHN0cnVjdCB3bDEyeHhfaW5pICpwKTsKK2ludCAoKnByc19mZW0xX2JhbmQ1X3BybXMpKGNoYXIgKmwsIHN0cnVjdCB3bDEyeHhfaW5pICpwKTsKK307CisKK3N0cnVjdCB3bDEyeHhfbnZzX29wcyB7CitpbnQgKCpudnNfZmlsbF9yYWRpb19wcm1zKShpbnQgZmQsIHN0cnVjdCB3bDEyeHhfaW5pICpwLCBjaGFyICpidWYpOworaW50ICgqbnZzX3NldF9hdXRvZmVtKShpbnQgZmQsIGNoYXIgKmJ1ZiwgdW5zaWduZWQgY2hhciB2YWwpOworaW50ICgqbnZzX3NldF9mZW1fbWFudWYpKGludCBmZCwgY2hhciAqYnVmLCB1bnNpZ25lZCBjaGFyIHZhbCk7Cit9OworCitpbnQgbnZzX2dldF9hcmNoKGludCBmaWxlX3NpemUsIHN0cnVjdCB3bDEyeHhfY29tbW9uICpjbW4pOworCitpbnQgcmVhZF9pbmkoY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0cnVjdCB3bDEyeHhfY29tbW9uICpjbW4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21hYzgwMjExL3RpLXV0aWxzL2luaV9maWxlcy8xMjd4L1JGTURfU18zLjUuaW5pIGIvbWFjODAyMTEvdGktdXRpbHMvaW5pX2ZpbGVzLzEyN3gvUkZNRF9TXzMuNS5pbmkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDU4NzM2OQotLS0gL2Rldi9udWxsCisrKyBiL21hYzgwMjExL3RpLXV0aWxzL2luaV9maWxlcy8xMjd4L1JGTURfU18zLjUuaW5pCkBAIC0wLDAgKzEsNjMgQEAKKyMgSU5JIEdlbmVyYXRvciB2ZXJzaW9uIDEuNDsgQWxpZ25lZCB0byBUUyB2ZXJzaW9uIDYuMS4yLjAuMjcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAxOiAgIE5vbiBGRU0tZGVwZW5kYW50IHNlY3Rpb24KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAxLjE6IEdlbmVyYWwgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVFhCaVBGRU1BdXRvRGV0ZWN0ICA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBPcHRpb25zICgwOiBNYW51YWwgTW9kZSwgMTogQXV0b21hdGljIG1vZGUpOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIGJ5IHRoZSBGVyB0byBkZWNpZGUgaWYgdGhlIGZyb250LWVuZCBpcyBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHkgb3IgbWFudWFsbHkKK1RYQmlQRkVNTWFudWZhY3R1cmVyICA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBCaXRfT3B0aW9uczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogQml0MSwwOiB1c2VkIHRvIGRldGVybWluZSB3aGljaCBGRU0gdmVuZG9yIHR5cGUgaXMgdXNlZCBvbiB0aGUgcGxhdGZvcm0gKDA6IFJGTUQsIDE6IFRRUywgMjpTS1csIDM6SFApLCBCaXQzLDI6IHVudXNlZCwgQml0Ny00OkV4dGVybmFsL2ludGVybmFsIGxvYWQgKDQtU0tXIFNCLCA1LVNLVyBIQiwgNi1IUCBTQiwgNy1IUCBIQikKK1JlZkNsayAgPSAwMiAjIExlbmd0aDogMTsgVW5pdDogQml0X09wdGlvbnM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IEJpdCAwLDEsMi0wOjE5LjJNSHosMToyNk1IeiwyOjM4LjRNSHpbRGVmYXVsdF0sMzo1Mk1Ieiw0OjM4LjRNSHogWFRBTCw1OjI2TUh6IFhUQUwsIEJpdCAzLUNMS19SRVEgdHlwZSwgMD13aXJlZC1PUiwgMT1wdXNoLXB1bGwsIEJpdCA0LUNMS19SRVEgcG9sYXJpdHkKK1NldHRsaW5nVGltZSAgPSAwNSAjIExlbmd0aDogMTsgVW5pdDogbXMgKDAtMTUpOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgdGltZSBmcm9tIGFzc2VydGluZyBDTEtfUkVRIChsb3cgdG8gaGlnaCkgdG8gdmFsaWQgRlJFRiBjbG9jayBvbiB0aGUgZGV2aWNlIGlucHV0cworQ2xvY2tWYWxpZE9uV2FrZXVwICA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBPcHRpb25zICgwOiBSZWZlcmVuY2UgY2xvY2sgbm90IHZhbGlkLCAxOiBSZWZlcmVuY2UgY2xvY2sgaXMgdmFsaWQgYW5kIHN0YWJsZSk7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyIHRoZSBGUkVGIGNsb2NrIGlzIHZhbGlkIG9uIHdha2V1cAorREMyRENNb2RlICA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBCaXRfT3B0aW9uczsgRm9ybWF0OiBVbnNpZ25lZCwgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogQml0MCAtIERDMkRDIG1vZGUgKDA6IGJ0U1BJIGlzIG5vdCB1c2VkOzE6IGJ0U1BJIHVzZWQgbXV4IERDMkRDIHRvIEJUX0ZVTkMyKSwgQml0MS0gTGV2ZWwgc2hpZnRlciBzdXBwb3J0ICgwOiBObyBMUywgMTogV2l0aCBMUykKK1NpbmdsZV9EdWFsX0JhbmRfU29sdXRpb24gID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IE9wdGlvbnMgKDA6IFNpbmdsZSBiYW5kLCAxOiBEdWFsIGJhbmQpOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgaWYgdGhlIHNvbHV0aW9uIGlzIHNpbmdsZSBiYW5kICgyLjRHSHogb25seSkgb3IgZHVhbCBiYW5kICgyLjRHSHogJiA1R0h6KQorU2V0dGluZ3MgID0gMDEgIyBMZW5ndGg6IDE7IFVuaXQ6IEJpdF9PcHRpb25zOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBCaXQwLU5CSSgwOk9mZiwxOk9uKSxCaXQxLVRlbGVjIGNoMTQoMDpPZmYsMTpPbiksQml0Mi1GRU0wLUxCLEJpdDMtRkVNMC1IQixCaXQ0LUZFTTEtTEIsQml0NS1GRU0xLUhCLVRYIEJpUCBsb2FkKDA6SW50LiwxOkV4dC4pLEJpdDYtTFBEIExCLEJpdDctTFBEIEhCCitTUlN0YXRlID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IE9wdGlvbnMgKDA6IERpc2FibGVkLCAxOiBFbmFibGVkKTsgRm9ybWF0OiBEZWNpbWFsOyBTb3VyY2U6IFRJOyBDb21tZW50OiBTbWFydCBSZWZsYXggKHByb3ByaWV0YXJ5IG1lY2hhbmlzbSBvZiBUSSB0aGF0IGlkZW50aWZ5IHRoZSBzaWxpY29uIHByb2Nlc3Mgc3BlY2lmaWMgcGFyYW1zKSBzdGF0ZQorU1JGMSA9IDA5IDA0IDE4IDEwIDA4IDAwIEY3IEVGIEU3IERGIDAwIDAwIDAwIDAwIDBGIDNGICAjIExlbmd0aDogMTY7IFVuaXQ6IFNSRjEgdmFsdWVzOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIHRhYmxlIGhvbGRzIHRoZSBzcGVjaWZpYyBwYXJhbWV0ZXJzIGZvciB1c2luZyB0aGUgU21hcnRSZWZsZXggbWVjaGFuaXNtCitTUkYyID0gMDkgMDQgMTggMTAgMDggMDAgRjcgRUYgRTcgREYgMDAgMDAgMDAgMDAgMDAgMDAgICMgTGVuZ3RoOiAxNjsgVW5pdDogU1JGMiB2YWx1ZXM7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgdGFibGUgaG9sZHMgdGhlIHNwZWNpZmljIHBhcmFtZXRlcnMgZm9yIHVzaW5nIHRoZSBTbWFydFJlZmxleCBtZWNoYW5pc20KK1NSRjMgPSAwOSAwNCAxOCAxMCAwOCAwMCBGNyBFRiBFNyBERiAwMCAwMCAwMCAwMCAwMCAwMCAgIyBMZW5ndGg6IDE2OyBVbml0OiBTUkYzIHZhbHVlczsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSB0YWJsZSBob2xkcyB0aGUgc3BlY2lmaWMgcGFyYW1ldGVycyBmb3IgdXNpbmcgdGhlIFNtYXJ0UmVmbGV4IG1lY2hhbmlzbQorI1NSX0RlYnVnX1RhYmxlID0gMDkgMDQgMTggMTAgMDggMDAgRjcgRUYgRTcgREYgMDAgMDAgMDAgMDAgMDAgMDAgICMgTGVuZ3RoOiAxNjsgVW5pdDogU1JfRGVidWdfVGFibGUgdmFsdWVzOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogU1IgRGVidWcgdmFsdWVzIJYgZm9yIFRJIGludGVybmFsIHVzZSBvbmx5CisjU1JfU0VOX05fUCA9IDIyICMgTGVuZ3RoOiAxOyBVbml0OiBTUl9TRU5fTl9QIHZhbHVlczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogU1IgRGVidWcgdmFsdWVzIJYgZm9yIFRJIGludGVybmFsIHVzZSBvbmx5CisjU1JfU0VOX05fUF9HYWluID0gYTkgIyBMZW5ndGg6IDE7IFVuaXQ6IFNSX1NFTl9OX1BfR0FJTiB2YWx1ZXM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFNSIERlYnVnIHZhbHVlcyCWIGZvciBUSSBpbnRlcm5hbCB1c2Ugb25seQorI1NSX1NFTl9OUk4gPSBjMSAjIExlbmd0aDogMTsgVW5pdDogU1JfU0VOX05STiB2YWx1ZXM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEkgOyBDb21tZW50OiBTUiBEZWJ1ZyB2YWx1ZXMgliBmb3IgVEkgaW50ZXJuYWwgdXNlIG9ubHkKKyNTUl9TRU5fUFJOID0gOGQgIyBMZW5ndGg6IDE7IFVuaXQ6IFNSX1NFTl9QUk4gdmFsdWVzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJIDsgQ29tbWVudDogU1IgRGVidWcgdmFsdWVzIJYgZm9yIFRJIGludGVybmFsIHVzZSBvbmx5CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMS4yOiBCYW5kLWRlcGVuZGFudCBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMS4yLjE6IDIuNEcgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUnhUcmFjZUluc2VydGlvbkxvc3NfMl80RyA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiAxLzhkQjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBwcmludGVkIGNpcmN1aXQgYm9hcmQgKFBDQikgdHJhY2UgaW5zZXJ0aW9uIGxvc3MKK1RYVHJhY2VMb3NzXzJfNEcgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogMS84ZEI7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgdG8gYWxpZ24gdGhlIG91dHB1dCBwb3dlciB0byBhIGRpZmZlcmVudCBsb2NhdGlvbiBvbiB0aGUgYm9hcmQKK1J4UnNzaUFuZFByb2Nlc3NDb21wZW5zYXRpb25fMl80RyAgPSBFQyBGNiAwMCAwQyAxOCBGOCBGQyAwMCAwOCAxMCBGMCBGOCAwMCAwQSAxNCAjIExlbmd0aDogMTU7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIFJTU0kgY29ybmVyIHBvaW50cyBhcmUgZGV0ZXJtaW5lZCBkdXJpbmcgUlNTSSB0ZW1wZXJhdHVyZSBhbmQgcHJvY2VzcyBjaGFyYWN0ZXJpemF0aW9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMS4yLjI6IDVHIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAyOiAgICAgRkVNLWRlcGVuZGFudCBzZWN0aW9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMi4xOiAgIEZFTSBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMi4xLjE6IDIuNEcgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRkVNMF9UWEJpUFJlZmVyZW5jZVBEdm9sdGFnZV8yXzRHID0gMDEzNiAjIExlbmd0aDogMTsgVW5pdDogMW1WOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBkZWZpbmUgdGhlIHJlZmVyZW5jZSBwb2ludCBvZiB0aGUgRkVNIHBvd2VyIGRldGVjdG9yCitGRU0wX1R4QmlQUmVmZXJlbmNlUG93ZXJfMl80RyAgPSA4MCAjIExlbmd0aDogMTsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBSZWZlcmVuY2Ugb3V0cHV0IHBvd2VyIHRoYXQgcHJvZHVjZXMgZ2l2ZW4gcmVmZXJlbmNlIHBvd2VyIGRldGVjdG9yIG91dHB1dCB2b2x0YWdlIC4KK0ZFTTBfVHhCaVBPZmZzZXRkQl8yXzRHID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGZpbmUtdHVuZSB0aGUgVFggQmlQIGJ5IHRoZSBjdXN0b21lcgorRkVNMF9UeFBlclJhdGVQb3dlckxpbWl0c18yXzRHX05vcm1hbCA9IDFEIDFGIDIyIDI2IDI3IDI5ICMgTGVuZ3RoOiA2OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXAgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTBfVHhQZXJSYXRlUG93ZXJMaW1pdHNfMl80R19EZWdyYWRlZCA9IDE5IDFGIDIyIDI1IDI1IDI3ICMgTGVuZ3RoOiA2OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXAgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTBfVHhQZXJSYXRlUG93ZXJMaW1pdHNfMl80R19FeHRyZW1lID0gMTYgMUQgMUUgMjAgMjQgMjUgIyBMZW5ndGg6IDY7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcCByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMF9EZWdyYWRlZExvd1RvTm9ybWFsVGhyXzJfNEcgPSAxRSAjIExlbmd0aDogMTsgVW5pdDogMS8xMCB2b2x0czsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcCByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMF9Ob3JtYWxUb0RlZ3JhZGVkSGlnaFRocl8yXzRHID0gMkQgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvMTAgdm9sdHM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXAgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTBfVHhQZXJDaGFubmVsUG93ZXJMaW1pdHNfMl80R18xMWIgPSA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCAjIExlbmd0aDogMTQ7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIHB1cnBvc2Ugb2YgdGhpcyB0YWJsZSBpcyB0byBhbGxvdyBjbGlwcGluZyBvZiB0aGUgbWF4aW11bSBvdXRwdXQgcG93ZXIgb24gY2VydGFpbiBjaGFubmVscworRkVNMF9UeFBlckNoYW5uZWxQb3dlckxpbWl0c18yXzRHX09GRE0gPSA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCAjIExlbmd0aDogMTQ7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIHB1cnBvc2Ugb2YgdGhpcyB0YWJsZSBpcyB0byBhbGxvdyBjbGlwcGluZyBvZiB0aGUgbWF4aW11bSBvdXRwdXQgcG93ZXIgb24gY2VydGFpbiBjaGFubmVscworRkVNMF9UeFBEVnNSYXRlT2Zmc2V0c18yXzRHID0gMDEgMDIgMDIgMDIgMDIgMDAgIyBMZW5ndGg6IDY7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaXMgYSBwb3dlciBkZXRlY3RvciBvZmZzZXQgdmFsdWUgdXNlZCB0byBjb3JyZWN0IHRoZSBwb3dlciBkZXRlY3RvciBjdXJ2ZSBmb3IgZWFjaCByYXRlIGdyb3VwCitGRU0wX1R4SWJpYXNUYWJsZV8yXzRHICA9IDMxIDMxIDM2IDM2IDNiIDNiICMgTGVuZ3RoOiA2OyBVbml0OiBDb2Rld29yZCA7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIHNldHMgdGhlIGJpYXMgY3VycmVudCBwcm92aWRlZCBieSB0aGUgU29DIHRvIHRoZSBQQSBpbiB0aGUgRkVNLiBPcHRpb25zIChNQ1M3LCA1NC80OCwgMzYvMjQsIDE4LzEyLCA5LzYsIDExYikKK0ZFTTBfUnhGZW1JbnNlcnRpb25Mb3NzXzJfNEcgID0gMEUgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHJlY2VpdmVkIGluc2VydGlvbiBsb3NzIG9mIHRoZSBXTDEyN3gKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAyLjEuMjogNUcgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9tYWM4MDIxMS90aS11dGlscy9pbmlfZmlsZXMvMTI3eC9UUVNfRF8xLjAuaW5pIGIvbWFjODAyMTEvdGktdXRpbHMvaW5pX2ZpbGVzLzEyN3gvVFFTX0RfMS4wLmluaQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOTA4YzZkCi0tLSAvZGV2L251bGwKKysrIGIvbWFjODAyMTEvdGktdXRpbHMvaW5pX2ZpbGVzLzEyN3gvVFFTX0RfMS4wLmluaQpAQCAtMCwwICsxLDc4IEBACisjIElOSSBHZW5lcmF0b3IgdmVyc2lvbiAxLjQ7IEFsaWduZWQgdG8gVFMgdmVyc2lvbiA2LjEuMi4wLjI3CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMTogICBOb24gRkVNLWRlcGVuZGFudCBzZWN0aW9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMS4xOiBHZW5lcmFsIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RYQmlQRkVNQXV0b0RldGVjdCAgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogT3B0aW9ucyAoMDogTWFudWFsIE1vZGUsIDE6IEF1dG9tYXRpYyBtb2RlKTsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCBieSB0aGUgRlcgdG8gZGVjaWRlIGlmIHRoZSBmcm9udC1lbmQgaXMgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5IG9yIG1hbnVhbGx5CitUWEJpUEZFTU1hbnVmYWN0dXJlciAgPSAwMSAjIExlbmd0aDogMTsgVW5pdDogQml0X09wdGlvbnM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IEJpdDEsMDogdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggRkVNIHZlbmRvciB0eXBlIGlzIHVzZWQgb24gdGhlIHBsYXRmb3JtICgwOiBSRk1ELCAxOiBUUVMsIDI6U0tXLCAzOkhQKSwgQml0MywyOiB1bnVzZWQsIEJpdDctNDpFeHRlcm5hbC9pbnRlcm5hbCBsb2FkICg0LVNLVyBTQiwgNS1TS1cgSEIsIDYtSFAgU0IsIDctSFAgSEIpCitSZWZDbGsgID0gMDIgIyBMZW5ndGg6IDE7IFVuaXQ6IEJpdF9PcHRpb25zOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBCaXQgMCwxLDItMDoxOS4yTUh6LDE6MjZNSHosMjozOC40TUh6W0RlZmF1bHRdLDM6NTJNSHosNDozOC40TUh6IFhUQUwsNToyNk1IeiBYVEFMLCBCaXQgMy1DTEtfUkVRIHR5cGUsIDA9d2lyZWQtT1IsIDE9cHVzaC1wdWxsLCBCaXQgNC1DTEtfUkVRIHBvbGFyaXR5CitTZXR0bGluZ1RpbWUgID0gMDUgIyBMZW5ndGg6IDE7IFVuaXQ6IG1zICgwLTE1KTsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIHRpbWUgZnJvbSBhc3NlcnRpbmcgQ0xLX1JFUSAobG93IHRvIGhpZ2gpIHRvIHZhbGlkIEZSRUYgY2xvY2sgb24gdGhlIGRldmljZSBpbnB1dHMKK0Nsb2NrVmFsaWRPbldha2V1cCAgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogT3B0aW9ucyAoMDogUmVmZXJlbmNlIGNsb2NrIG5vdCB2YWxpZCwgMTogUmVmZXJlbmNlIGNsb2NrIGlzIHZhbGlkIGFuZCBzdGFibGUpOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlciB0aGUgRlJFRiBjbG9jayBpcyB2YWxpZCBvbiB3YWtldXAKK0RDMkRDTW9kZSAgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogQml0X09wdGlvbnM7IEZvcm1hdDogVW5zaWduZWQsIFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IEJpdDAgLSBEQzJEQyBtb2RlICgwOiBidFNQSSBpcyBub3QgdXNlZDsxOiBidFNQSSB1c2VkIG11eCBEQzJEQyB0byBCVF9GVU5DMiksIEJpdDEtIExldmVsIHNoaWZ0ZXIgc3VwcG9ydCAoMDogTm8gTFMsIDE6IFdpdGggTFMpCitTaW5nbGVfRHVhbF9CYW5kX1NvbHV0aW9uICA9IDAxICMgTGVuZ3RoOiAxOyBVbml0OiBPcHRpb25zICgwOiBTaW5nbGUgYmFuZCwgMTogRHVhbCBiYW5kKTsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIGlmIHRoZSBzb2x1dGlvbiBpcyBzaW5nbGUgYmFuZCAoMi40R0h6IG9ubHkpIG9yIGR1YWwgYmFuZCAoMi40R0h6ICYgNUdIeikKK1NldHRpbmdzICA9IDAxICMgTGVuZ3RoOiAxOyBVbml0OiBCaXRfT3B0aW9uczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogQml0MC1OQkkoMDpPZmYsMTpPbiksQml0MS1UZWxlYyBjaDE0KDA6T2ZmLDE6T24pLEJpdDItRkVNMC1MQixCaXQzLUZFTTAtSEIsQml0NC1GRU0xLUxCLEJpdDUtRkVNMS1IQi1UWCBCaVAgbG9hZCgwOkludC4sMTpFeHQuKSxCaXQ2LUxQRCBMQixCaXQ3LUxQRCBIQgorU1JTdGF0ZSA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBPcHRpb25zICgwOiBEaXNhYmxlZCwgMTogRW5hYmxlZCk7IEZvcm1hdDogRGVjaW1hbDsgU291cmNlOiBUSTsgQ29tbWVudDogU21hcnQgUmVmbGF4IChwcm9wcmlldGFyeSBtZWNoYW5pc20gb2YgVEkgdGhhdCBpZGVudGlmeSB0aGUgc2lsaWNvbiBwcm9jZXNzIHNwZWNpZmljIHBhcmFtcykgc3RhdGUKK1NSRjEgPSAwOSAwNCAxOCAxMCAwOCAwMCBGNyBFRiBFNyBERiAwMCAwMCAwMCAwMCAwRiAzRiAgIyBMZW5ndGg6IDE2OyBVbml0OiBTUkYxIHZhbHVlczsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSB0YWJsZSBob2xkcyB0aGUgc3BlY2lmaWMgcGFyYW1ldGVycyBmb3IgdXNpbmcgdGhlIFNtYXJ0UmVmbGV4IG1lY2hhbmlzbQorU1JGMiA9IDA5IDA0IDE4IDEwIDA4IDAwIEY3IEVGIEU3IERGIDAwIDAwIDAwIDAwIDAwIDAwICAjIExlbmd0aDogMTY7IFVuaXQ6IFNSRjIgdmFsdWVzOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIHRhYmxlIGhvbGRzIHRoZSBzcGVjaWZpYyBwYXJhbWV0ZXJzIGZvciB1c2luZyB0aGUgU21hcnRSZWZsZXggbWVjaGFuaXNtCitTUkYzID0gMDkgMDQgMTggMTAgMDggMDAgRjcgRUYgRTcgREYgMDAgMDAgMDAgMDAgMDAgMDAgICMgTGVuZ3RoOiAxNjsgVW5pdDogU1JGMyB2YWx1ZXM7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgdGFibGUgaG9sZHMgdGhlIHNwZWNpZmljIHBhcmFtZXRlcnMgZm9yIHVzaW5nIHRoZSBTbWFydFJlZmxleCBtZWNoYW5pc20KKyNTUl9EZWJ1Z19UYWJsZSA9IDA5IDA0IDE4IDEwIDA4IDAwIEY3IEVGIEU3IERGIDAwIDAwIDAwIDAwIDAwIDAwICAjIExlbmd0aDogMTY7IFVuaXQ6IFNSX0RlYnVnX1RhYmxlIHZhbHVlczsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFNSIERlYnVnIHZhbHVlcyCWIGZvciBUSSBpbnRlcm5hbCB1c2Ugb25seQorI1NSX1NFTl9OX1AgPSAyMiAjIExlbmd0aDogMTsgVW5pdDogU1JfU0VOX05fUCB2YWx1ZXM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFNSIERlYnVnIHZhbHVlcyCWIGZvciBUSSBpbnRlcm5hbCB1c2Ugb25seQorI1NSX1NFTl9OX1BfR2FpbiA9IGE5ICMgTGVuZ3RoOiAxOyBVbml0OiBTUl9TRU5fTl9QX0dBSU4gdmFsdWVzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBTUiBEZWJ1ZyB2YWx1ZXMgliBmb3IgVEkgaW50ZXJuYWwgdXNlIG9ubHkKKyNTUl9TRU5fTlJOID0gYzEgIyBMZW5ndGg6IDE7IFVuaXQ6IFNSX1NFTl9OUk4gdmFsdWVzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJIDsgQ29tbWVudDogU1IgRGVidWcgdmFsdWVzIJYgZm9yIFRJIGludGVybmFsIHVzZSBvbmx5CisjU1JfU0VOX1BSTiA9IDhkICMgTGVuZ3RoOiAxOyBVbml0OiBTUl9TRU5fUFJOIHZhbHVlczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSSA7IENvbW1lbnQ6IFNSIERlYnVnIHZhbHVlcyCWIGZvciBUSSBpbnRlcm5hbCB1c2Ugb25seQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDEuMjogQmFuZC1kZXBlbmRhbnQgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDEuMi4xOiAyLjRHIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1J4VHJhY2VJbnNlcnRpb25Mb3NzXzJfNEcgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogMS84ZEI7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB0aGUgcHJpbnRlZCBjaXJjdWl0IGJvYXJkIChQQ0IpIHRyYWNlIGluc2VydGlvbiBsb3NzCitUWFRyYWNlTG9zc18yXzRHID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIGFsaWduIHRoZSBvdXRwdXQgcG93ZXIgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24gb24gdGhlIGJvYXJkCitSeFJzc2lBbmRQcm9jZXNzQ29tcGVuc2F0aW9uXzJfNEcgID0gRUMgRjYgMDAgMEMgMTggRjggRkMgMDAgMDggMTAgRjAgRjggMDAgMEEgMTQgIyBMZW5ndGg6IDE1OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSBSU1NJIGNvcm5lciBwb2ludHMgYXJlIGRldGVybWluZWQgZHVyaW5nIFJTU0kgdGVtcGVyYXR1cmUgYW5kIHByb2Nlc3MgY2hhcmFjdGVyaXphdGlvbgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDEuMi4yOiA1RyBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSeFRyYWNlSW5zZXJ0aW9uTG9zc181RyAgPSAwMCAwMCAwMCAwMCAwMCAwMCAwMCAjIExlbmd0aDogNzsgVW5pdDogMS84ZEI7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB0aGUgcHJpbnRlZCBjaXJjdWl0IGJvYXJkIChQQ0IpIHRyYWNlIGluc2VydGlvbiBsb3NzCitUWFRyYWNlTG9zc181RyAgPSAwMCAwMCAwMCAwMCAwMCAwMCAwMCAjIExlbmd0aDogNzsgVW5pdDogMS84ZEI7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgdG8gYWxpZ24gdGhlIG91dHB1dCBwb3dlciB0byBhIGRpZmZlcmVudCBsb2NhdGlvbiBvbiB0aGUgYm9hcmQKK1J4UnNzaUFuZFByb2Nlc3NDb21wZW5zYXRpb25fNUcgID0gRUUgRjQgRjggRkUgMDUgRUEgRjMgRkEgMDEgMDYgRTUgRjEgRkEgMDIgMDcgICMgTGVuZ3RoOiAxNTsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgUlNTSSBjb3JuZXIgcG9pbnRzIGFyZSBkZXRlcm1pbmVkIGR1cmluZyBSU1NJIHRlbXBlcmF0dXJlIGFuZCBwcm9jZXNzIGNoYXJhY3Rlcml6YXRpb24KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAyOiAgICAgRkVNLWRlcGVuZGFudCBzZWN0aW9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMi4xOiAgIEZFTSBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMi4xLjE6IDIuNEcgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRkVNMV9UWEJpUFJlZmVyZW5jZVBEdm9sdGFnZV8yXzRHID0gMDFFMCAjIExlbmd0aDogMTsgVW5pdDogMW1WOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBkZWZpbmUgdGhlIHJlZmVyZW5jZSBwb2ludCBvZiB0aGUgRkVNIHBvd2VyIGRldGVjdG9yCitGRU0xX1R4QmlQUmVmZXJlbmNlUG93ZXJfMl80RyAgPSA4MCAjIExlbmd0aDogMTsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBSZWZlcmVuY2Ugb3V0cHV0IHBvd2VyIHRoYXQgcHJvZHVjZXMgZ2l2ZW4gcmVmZXJlbmNlIHBvd2VyIGRldGVjdG9yIG91dHB1dCB2b2x0YWdlIC4KK0ZFTTFfVHhCaVBPZmZzZXRkQl8yXzRHID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGZpbmUtdHVuZSB0aGUgVFggQmlQIGJ5IHRoZSBjdXN0b21lcgorRkVNMV9UeFBlclJhdGVQb3dlckxpbWl0c18yXzRHX05vcm1hbCA9IDFEIDFGIDIyIDI2IDI4IDI5ICMgTGVuZ3RoOiA2OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXAgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfMl80R19EZWdyYWRlZCA9IDFBIDFGIDIyIDI0IDI2IDI4ICMgTGVuZ3RoOiA2OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXAgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfMl80R19FeHRyZW1lID0gMTYgMUQgMUUgMjAgMjQgMjUgIyBMZW5ndGg6IDY7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcCByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9EZWdyYWRlZExvd1RvTm9ybWFsVGhyXzJfNEcgPSAxRSAjIExlbmd0aDogMTsgVW5pdDogMS8xMCB2b2x0czsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcCByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9Ob3JtYWxUb0RlZ3JhZGVkSGlnaFRocl8yXzRHID0gMkQgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvMTAgdm9sdHM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXAgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfVHhQZXJDaGFubmVsUG93ZXJMaW1pdHNfMl80R18xMWIgPSA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCAjIExlbmd0aDogMTQ7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIHB1cnBvc2Ugb2YgdGhpcyB0YWJsZSBpcyB0byBhbGxvdyBjbGlwcGluZyBvZiB0aGUgbWF4aW11bSBvdXRwdXQgcG93ZXIgb24gY2VydGFpbiBjaGFubmVscworRkVNMV9UeFBlckNoYW5uZWxQb3dlckxpbWl0c18yXzRHX09GRE0gPSA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCAjIExlbmd0aDogMTQ7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIHB1cnBvc2Ugb2YgdGhpcyB0YWJsZSBpcyB0byBhbGxvdyBjbGlwcGluZyBvZiB0aGUgbWF4aW11bSBvdXRwdXQgcG93ZXIgb24gY2VydGFpbiBjaGFubmVscworRkVNMV9UeFBEVnNSYXRlT2Zmc2V0c18yXzRHID0gMDEgMDIgMDIgMDIgMDIgMDAgIyBMZW5ndGg6IDY7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaXMgYSBwb3dlciBkZXRlY3RvciBvZmZzZXQgdmFsdWUgdXNlZCB0byBjb3JyZWN0IHRoZSBwb3dlciBkZXRlY3RvciBjdXJ2ZSBmb3IgZWFjaCByYXRlIGdyb3VwCitGRU0xX1R4SWJpYXNUYWJsZV8yXzRHICA9IDE1IDE1IDE1IDE5IDE5IDE1ICMgTGVuZ3RoOiA2OyBVbml0OiBDb2Rld29yZCA7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIHNldHMgdGhlIGJpYXMgY3VycmVudCBwcm92aWRlZCBieSB0aGUgU29DIHRvIHRoZSBQQSBpbiB0aGUgRkVNLiBPcHRpb25zIChNQ1M3LCA1NC80OCwgMzYvMjQsIDE4LzEyLCA5LzYsIDExYikKK0ZFTTFfUnhGZW1JbnNlcnRpb25Mb3NzXzJfNEcgID0gMTAgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHJlY2VpdmVkIGluc2VydGlvbiBsb3NzIG9mIHRoZSBXTDEyN3gKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAyLjEuMjogNUcgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRkVNMV9UWEJpUFJlZmVyZW5jZVBEdm9sdGFnZV81RyAgPSAwMTczIDAxODggMDE4NyAwMThCIDAxOEEgMDE4NiAwMThDICMgTGVuZ3RoOiA3OyBVbml0OiAxbVY7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGRlZmluZSB0aGUgcmVmZXJlbmNlIHBvaW50IG9mIHRoZSBGRU0gcG93ZXIgZGV0ZWN0b3IKK0ZFTTFfVHhCaVBSZWZlcmVuY2VQb3dlcl81RyA9IDgwIDgwIDgwIDgwIDgwIDgwIDgwICMgTGVuZ3RoOiA3OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFJlZmVyZW5jZSBvdXRwdXQgcG93ZXIgdGhhdCBwcm9kdWNlcyBnaXZlbiByZWZlcmVuY2UgcG93ZXIgZGV0ZWN0b3Igb3V0cHV0IHZvbHRhZ2UgLgorRkVNMV9UeEJpUE9mZnNldGRCXzVHID0gMDAgMDAgMDAgMDAgMDAgMDAgMDAgIyBMZW5ndGg6IDc7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGZpbmUtdHVuZSB0aGUgVFggQmlQIGJ5IHRoZSBjdXN0b21lcgorRkVNMV9UeFBlclJhdGVQb3dlckxpbWl0c181R19Ob3JtYWwgID0gMUMgMUYgMjIgMjQgMjQgNTAgIyBMZW5ndGg6IDY7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcCByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9UeFBlclJhdGVQb3dlckxpbWl0c181R19EZWdyYWRlZCAgPSAxOCAxRiAyMiAyMiAyMiA1MCAjIExlbmd0aDogNjsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX1R4UGVyUmF0ZVBvd2VyTGltaXRzXzVHX0V4dHJlbWUgPSAxNiAxQyAxRSAyMCAyMCA1MCAjIExlbmd0aDogNjsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX0RlZ3JhZGVkTG93VG9Ob3JtYWxUaHJfNUcgPSAxRSAjIExlbmd0aDogMTsgVW5pdDogMS8xMCB2b2x0czsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcCByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9Ob3JtYWxUb0RlZ3JhZGVkSGlnaFRocl81RyA9IDJEICMgTGVuZ3RoOiAxOyBVbml0OiAxLzEwIHZvbHRzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX1R4UGVyQ2hhbm5lbFBvd2VyTGltaXRzXzVHX09GRE0gID0gNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgIyBMZW5ndGg6IDM1OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7CitGRU0xX1R4UERWc1JhdGVPZmZzZXRzXzVHICA9IDAxIDAyIDAyIDAyIDAyIDAwICMgTGVuZ3RoOiA3OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIGEgcG93ZXIgZGV0ZWN0b3Igb2Zmc2V0IHZhbHVlIHVzZWQgdG8gY29ycmVjdCB0aGUgcG93ZXIgZGV0ZWN0b3IgY3VydmUgZm9yIGVhY2ggcmF0ZSBncm91cAorRkVNMV9UeEliaWFzVGFibGVfNUcgID0gMTAgMTAgMTAgMTAgMTAgMTAgIyBMZW5ndGg6IDY7IFVuaXQ6IENvZGV3b3JkOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBzZXRzIHRoZSBiaWFzIGN1cnJlbnQgcHJvdmlkZWQgYnkgdGhlIFNvQyB0byB0aGUgUEEgaW4gdGhlIEZFTQorRkVNMV9SeEZlbUluc2VydGlvbkxvc3NfNUcgID0gMTAgMTAgMTAgMTAgMTAgMTAgMTAgIyBMZW5ndGg6IDc7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHJlY2VpdmVkIGluc2VydGlvbiBsb3NzIG9mIHRoZSBXTDEyN3gKKwpkaWZmIC0tZ2l0IGEvbWFjODAyMTEvdGktdXRpbHMvaW5pX2ZpbGVzLzEyN3gvVFFTX0RfMS43LmluaSBiL21hYzgwMjExL3RpLXV0aWxzL2luaV9maWxlcy8xMjd4L1RRU19EXzEuNy5pbmkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWE5ODZmOQotLS0gL2Rldi9udWxsCisrKyBiL21hYzgwMjExL3RpLXV0aWxzL2luaV9maWxlcy8xMjd4L1RRU19EXzEuNy5pbmkKQEAgLTAsMCArMSw3OCBAQAorIyBJTkkgR2VuZXJhdG9yIHZlcnNpb24gMS40OyBBbGlnbmVkIHRvIFRTIHZlcnNpb24gNi4xLjIuMC4yNworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDE6ICAgTm9uIEZFTS1kZXBlbmRhbnQgc2VjdGlvbgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDEuMTogR2VuZXJhbCBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUWEJpUEZFTUF1dG9EZXRlY3QgID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IE9wdGlvbnMgKDA6IE1hbnVhbCBNb2RlLCAxOiBBdXRvbWF0aWMgbW9kZSk7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgYnkgdGhlIEZXIHRvIGRlY2lkZSBpZiB0aGUgZnJvbnQtZW5kIGlzIGRldGVybWluZWQgYXV0b21hdGljYWxseSBvciBtYW51YWxseQorVFhCaVBGRU1NYW51ZmFjdHVyZXIgID0gMDEgIyBMZW5ndGg6IDE7IFVuaXQ6IEJpdF9PcHRpb25zOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBCaXQxLDA6IHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIEZFTSB2ZW5kb3IgdHlwZSBpcyB1c2VkIG9uIHRoZSBwbGF0Zm9ybSAoMDogUkZNRCwgMTogVFFTLCAyOlNLVywgMzpIUCksIEJpdDMsMjogdW51c2VkLCBCaXQ3LTQ6RXh0ZXJuYWwvaW50ZXJuYWwgbG9hZCAoNC1TS1cgU0IsIDUtU0tXIEhCLCA2LUhQIFNCLCA3LUhQIEhCKQorUmVmQ2xrICA9IDAyICMgTGVuZ3RoOiAxOyBVbml0OiBCaXRfT3B0aW9uczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogQml0IDAsMSwyLTA6MTkuMk1IeiwxOjI2TUh6LDI6MzguNE1IeltEZWZhdWx0XSwzOjUyTUh6LDQ6MzguNE1IeiBYVEFMLDU6MjZNSHogWFRBTCwgQml0IDMtQ0xLX1JFUSB0eXBlLCAwPXdpcmVkLU9SLCAxPXB1c2gtcHVsbCwgQml0IDQtQ0xLX1JFUSBwb2xhcml0eQorU2V0dGxpbmdUaW1lICA9IDA1ICMgTGVuZ3RoOiAxOyBVbml0OiBtcyAoMC0xNSk7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSB0aW1lIGZyb20gYXNzZXJ0aW5nIENMS19SRVEgKGxvdyB0byBoaWdoKSB0byB2YWxpZCBGUkVGIGNsb2NrIG9uIHRoZSBkZXZpY2UgaW5wdXRzCitDbG9ja1ZhbGlkT25XYWtldXAgID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IE9wdGlvbnMgKDA6IFJlZmVyZW5jZSBjbG9jayBub3QgdmFsaWQsIDE6IFJlZmVyZW5jZSBjbG9jayBpcyB2YWxpZCBhbmQgc3RhYmxlKTsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIEZSRUYgY2xvY2sgaXMgdmFsaWQgb24gd2FrZXVwCitEQzJEQ01vZGUgID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IEJpdF9PcHRpb25zOyBGb3JtYXQ6IFVuc2lnbmVkLCBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBCaXQwIC0gREMyREMgbW9kZSAoMDogYnRTUEkgaXMgbm90IHVzZWQ7MTogYnRTUEkgdXNlZCBtdXggREMyREMgdG8gQlRfRlVOQzIpLCBCaXQxLSBMZXZlbCBzaGlmdGVyIHN1cHBvcnQgKDA6IE5vIExTLCAxOiBXaXRoIExTKQorU2luZ2xlX0R1YWxfQmFuZF9Tb2x1dGlvbiAgPSAwMSAjIExlbmd0aDogMTsgVW5pdDogT3B0aW9ucyAoMDogU2luZ2xlIGJhbmQsIDE6IER1YWwgYmFuZCk7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyBpZiB0aGUgc29sdXRpb24gaXMgc2luZ2xlIGJhbmQgKDIuNEdIeiBvbmx5KSBvciBkdWFsIGJhbmQgKDIuNEdIeiAmIDVHSHopCitTZXR0aW5ncyAgPSAwMSAjIExlbmd0aDogMTsgVW5pdDogQml0X09wdGlvbnM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IEJpdDAtTkJJKDA6T2ZmLDE6T24pLEJpdDEtVGVsZWMgY2gxNCgwOk9mZiwxOk9uKSxCaXQyLUZFTTAtTEIsQml0My1GRU0wLUhCLEJpdDQtRkVNMS1MQixCaXQ1LUZFTTEtSEItVFggQmlQIGxvYWQoMDpJbnQuLDE6RXh0LiksQml0Ni1MUEQgTEIsQml0Ny1MUEQgSEIKK1NSU3RhdGUgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogT3B0aW9ucyAoMDogRGlzYWJsZWQsIDE6IEVuYWJsZWQpOyBGb3JtYXQ6IERlY2ltYWw7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFNtYXJ0IFJlZmxheCAocHJvcHJpZXRhcnkgbWVjaGFuaXNtIG9mIFRJIHRoYXQgaWRlbnRpZnkgdGhlIHNpbGljb24gcHJvY2VzcyBzcGVjaWZpYyBwYXJhbXMpIHN0YXRlCitTUkYxID0gMDkgMDQgMTggMTAgMDggMDAgRjcgRUYgRTcgREYgMDAgMDAgMDAgMDAgMEYgM0YgICMgTGVuZ3RoOiAxNjsgVW5pdDogU1JGMSB2YWx1ZXM7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgdGFibGUgaG9sZHMgdGhlIHNwZWNpZmljIHBhcmFtZXRlcnMgZm9yIHVzaW5nIHRoZSBTbWFydFJlZmxleCBtZWNoYW5pc20KK1NSRjIgPSAwOSAwNCAxOCAxMCAwOCAwMCBGNyBFRiBFNyBERiAwMCAwMCAwMCAwMCAwMCAwMCAgIyBMZW5ndGg6IDE2OyBVbml0OiBTUkYyIHZhbHVlczsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSB0YWJsZSBob2xkcyB0aGUgc3BlY2lmaWMgcGFyYW1ldGVycyBmb3IgdXNpbmcgdGhlIFNtYXJ0UmVmbGV4IG1lY2hhbmlzbQorU1JGMyA9IDA5IDA0IDE4IDEwIDA4IDAwIEY3IEVGIEU3IERGIDAwIDAwIDAwIDAwIDAwIDAwICAjIExlbmd0aDogMTY7IFVuaXQ6IFNSRjMgdmFsdWVzOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIHRhYmxlIGhvbGRzIHRoZSBzcGVjaWZpYyBwYXJhbWV0ZXJzIGZvciB1c2luZyB0aGUgU21hcnRSZWZsZXggbWVjaGFuaXNtCisjU1JfRGVidWdfVGFibGUgPSAwOSAwNCAxOCAxMCAwOCAwMCBGNyBFRiBFNyBERiAwMCAwMCAwMCAwMCAwMCAwMCAgIyBMZW5ndGg6IDE2OyBVbml0OiBTUl9EZWJ1Z19UYWJsZSB2YWx1ZXM7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBTUiBEZWJ1ZyB2YWx1ZXMgliBmb3IgVEkgaW50ZXJuYWwgdXNlIG9ubHkKKyNTUl9TRU5fTl9QID0gMjIgIyBMZW5ndGg6IDE7IFVuaXQ6IFNSX1NFTl9OX1AgdmFsdWVzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBTUiBEZWJ1ZyB2YWx1ZXMgliBmb3IgVEkgaW50ZXJuYWwgdXNlIG9ubHkKKyNTUl9TRU5fTl9QX0dhaW4gPSBhOSAjIExlbmd0aDogMTsgVW5pdDogU1JfU0VOX05fUF9HQUlOIHZhbHVlczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogU1IgRGVidWcgdmFsdWVzIJYgZm9yIFRJIGludGVybmFsIHVzZSBvbmx5CisjU1JfU0VOX05STiA9IGMxICMgTGVuZ3RoOiAxOyBVbml0OiBTUl9TRU5fTlJOIHZhbHVlczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSSA7IENvbW1lbnQ6IFNSIERlYnVnIHZhbHVlcyCWIGZvciBUSSBpbnRlcm5hbCB1c2Ugb25seQorI1NSX1NFTl9QUk4gPSA4ZCAjIExlbmd0aDogMTsgVW5pdDogU1JfU0VOX1BSTiB2YWx1ZXM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEkgOyBDb21tZW50OiBTUiBEZWJ1ZyB2YWx1ZXMgliBmb3IgVEkgaW50ZXJuYWwgdXNlIG9ubHkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAxLjI6IEJhbmQtZGVwZW5kYW50IHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAxLjIuMTogMi40RyBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSeFRyYWNlSW5zZXJ0aW9uTG9zc18yXzRHID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIHByaW50ZWQgY2lyY3VpdCBib2FyZCAoUENCKSB0cmFjZSBpbnNlcnRpb24gbG9zcworVFhUcmFjZUxvc3NfMl80RyA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiAxLzhkQjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCB0byBhbGlnbiB0aGUgb3V0cHV0IHBvd2VyIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uIG9uIHRoZSBib2FyZAorUnhSc3NpQW5kUHJvY2Vzc0NvbXBlbnNhdGlvbl8yXzRHICA9IEVDIEY2IDAwIDBDIDE4IEY4IEZDIDAwIDA4IDEwIEYwIEY4IDAwIDBBIDE0ICMgTGVuZ3RoOiAxNTsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgUlNTSSBjb3JuZXIgcG9pbnRzIGFyZSBkZXRlcm1pbmVkIGR1cmluZyBSU1NJIHRlbXBlcmF0dXJlIGFuZCBwcm9jZXNzIGNoYXJhY3Rlcml6YXRpb24KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAxLjIuMjogNUcgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUnhUcmFjZUluc2VydGlvbkxvc3NfNUcgID0gMDAgMDAgMDAgMDAgMDAgMDAgMDAgIyBMZW5ndGg6IDc7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIHByaW50ZWQgY2lyY3VpdCBib2FyZCAoUENCKSB0cmFjZSBpbnNlcnRpb24gbG9zcworVFhUcmFjZUxvc3NfNUcgID0gMDAgMDAgMDAgMDAgMDAgMDAgMDAgIyBMZW5ndGg6IDc7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIGFsaWduIHRoZSBvdXRwdXQgcG93ZXIgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24gb24gdGhlIGJvYXJkCitSeFJzc2lBbmRQcm9jZXNzQ29tcGVuc2F0aW9uXzVHICA9IEVFIEY0IEY4IEZFIDA1IEVBIEYzIEZBIDAxIDA2IEU1IEYxIEZBIDAyIDA3ICAjIExlbmd0aDogMTU7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIFJTU0kgY29ybmVyIHBvaW50cyBhcmUgZGV0ZXJtaW5lZCBkdXJpbmcgUlNTSSB0ZW1wZXJhdHVyZSBhbmQgcHJvY2VzcyBjaGFyYWN0ZXJpemF0aW9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMjogICAgIEZFTS1kZXBlbmRhbnQgc2VjdGlvbgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDIuMTogICBGRU0gcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDIuMS4xOiAyLjRHIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZFTTFfVFhCaVBSZWZlcmVuY2VQRHZvbHRhZ2VfMl80RyA9IDAxRDkgIyBMZW5ndGg6IDE7IFVuaXQ6IDFtVjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgZGVmaW5lIHRoZSByZWZlcmVuY2UgcG9pbnQgb2YgdGhlIEZFTSBwb3dlciBkZXRlY3RvcgorRkVNMV9UeEJpUFJlZmVyZW5jZVBvd2VyXzJfNEcgID0gODAgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogUmVmZXJlbmNlIG91dHB1dCBwb3dlciB0aGF0IHByb2R1Y2VzIGdpdmVuIHJlZmVyZW5jZSBwb3dlciBkZXRlY3RvciBvdXRwdXQgdm9sdGFnZSAuCitGRU0xX1R4QmlQT2Zmc2V0ZEJfMl80RyA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgZmllbGQgaXMgdXNlZCB0byBmaW5lLXR1bmUgdGhlIFRYIEJpUCBieSB0aGUgY3VzdG9tZXIKK0ZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfMl80R19Ob3JtYWwgPSAxRCAxRiAyMiAyNiAyNyAyOSAjIExlbmd0aDogNjsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX1R4UGVyUmF0ZVBvd2VyTGltaXRzXzJfNEdfRGVncmFkZWQgPSAxRCAxRiAyMiAyNiAyNyAyNyAjIExlbmd0aDogNjsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX1R4UGVyUmF0ZVBvd2VyTGltaXRzXzJfNEdfRXh0cmVtZSA9IDE2IDFEIDFFIDIwIDI0IDI1ICMgTGVuZ3RoOiA2OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXAgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfRGVncmFkZWRMb3dUb05vcm1hbFRocl8yXzRHID0gMUUgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvMTAgdm9sdHM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXAgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfTm9ybWFsVG9EZWdyYWRlZEhpZ2hUaHJfMl80RyA9IDJEICMgTGVuZ3RoOiAxOyBVbml0OiAxLzEwIHZvbHRzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX1R4UGVyQ2hhbm5lbFBvd2VyTGltaXRzXzJfNEdfMTFiID0gNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgIyBMZW5ndGg6IDE0OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBwdXJwb3NlIG9mIHRoaXMgdGFibGUgaXMgdG8gYWxsb3cgY2xpcHBpbmcgb2YgdGhlIG1heGltdW0gb3V0cHV0IHBvd2VyIG9uIGNlcnRhaW4gY2hhbm5lbHMKK0ZFTTFfVHhQZXJDaGFubmVsUG93ZXJMaW1pdHNfMl80R19PRkRNID0gNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgIyBMZW5ndGg6IDE0OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBwdXJwb3NlIG9mIHRoaXMgdGFibGUgaXMgdG8gYWxsb3cgY2xpcHBpbmcgb2YgdGhlIG1heGltdW0gb3V0cHV0IHBvd2VyIG9uIGNlcnRhaW4gY2hhbm5lbHMKK0ZFTTFfVHhQRFZzUmF0ZU9mZnNldHNfMl80RyA9IDAxIDAyIDAyIDAyIDAyIDAwICMgTGVuZ3RoOiA2OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIGEgcG93ZXIgZGV0ZWN0b3Igb2Zmc2V0IHZhbHVlIHVzZWQgdG8gY29ycmVjdCB0aGUgcG93ZXIgZGV0ZWN0b3IgY3VydmUgZm9yIGVhY2ggcmF0ZSBncm91cAorRkVNMV9UeEliaWFzVGFibGVfMl80RyAgPSAxNSAxNSAxNSAxOSAxOSAxNSAjIExlbmd0aDogNjsgVW5pdDogQ29kZXdvcmQgOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBzZXRzIHRoZSBiaWFzIGN1cnJlbnQgcHJvdmlkZWQgYnkgdGhlIFNvQyB0byB0aGUgUEEgaW4gdGhlIEZFTS4gT3B0aW9ucyAoTUNTNywgNTQvNDgsIDM2LzI0LCAxOC8xMiwgOS82LCAxMWIpCitGRU0xX1J4RmVtSW5zZXJ0aW9uTG9zc18yXzRHICA9IDEwICMgTGVuZ3RoOiAxOyBVbml0OiAxLzhkQjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSByZWNlaXZlZCBpbnNlcnRpb24gbG9zcyBvZiB0aGUgV0wxMjd4CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMi4xLjI6IDVHIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZFTTFfVFhCaVBSZWZlcmVuY2VQRHZvbHRhZ2VfNUcgID0gMDE5QSAwMUFFIDAxQzIgMDFDQyAwMURCIDAxREIgMDFEMSAjIExlbmd0aDogNzsgVW5pdDogMW1WOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBkZWZpbmUgdGhlIHJlZmVyZW5jZSBwb2ludCBvZiB0aGUgRkVNIHBvd2VyIGRldGVjdG9yCitGRU0xX1R4QmlQUmVmZXJlbmNlUG93ZXJfNUcgPSA4MCA4MCA4MCA4MCA4MCA4MCA4MCAjIExlbmd0aDogNzsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBSZWZlcmVuY2Ugb3V0cHV0IHBvd2VyIHRoYXQgcHJvZHVjZXMgZ2l2ZW4gcmVmZXJlbmNlIHBvd2VyIGRldGVjdG9yIG91dHB1dCB2b2x0YWdlIC4KK0ZFTTFfVHhCaVBPZmZzZXRkQl81RyA9IDAwIDAwIDAwIDAwIDAwIDAwIDAwICMgTGVuZ3RoOiA3OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgZmllbGQgaXMgdXNlZCB0byBmaW5lLXR1bmUgdGhlIFRYIEJpUCBieSB0aGUgY3VzdG9tZXIKK0ZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfNUdfTm9ybWFsICA9IDFDIDFFIDIxIDIzIDI1IDUwICMgTGVuZ3RoOiA2OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXAgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfNUdfRGVncmFkZWQgID0gMTggMUUgMjEgMjMgMjUgNTAgIyBMZW5ndGg6IDY7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcCByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9UeFBlclJhdGVQb3dlckxpbWl0c181R19FeHRyZW1lID0gMTYgMUMgMUUgMjAgMjAgNTAgIyBMZW5ndGg6IDY7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcCByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9EZWdyYWRlZExvd1RvTm9ybWFsVGhyXzVHID0gMUUgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvMTAgdm9sdHM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXAgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfTm9ybWFsVG9EZWdyYWRlZEhpZ2hUaHJfNUcgPSAyRCAjIExlbmd0aDogMTsgVW5pdDogMS8xMCB2b2x0czsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcCByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9UeFBlckNoYW5uZWxQb3dlckxpbWl0c181R19PRkRNICA9IDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwICMgTGVuZ3RoOiAzNTsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOworRkVNMV9UeFBEVnNSYXRlT2Zmc2V0c181RyAgPSAwMSAwMiAwMiAwMiAwMiAwMCAjIExlbmd0aDogNzsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpcyBhIHBvd2VyIGRldGVjdG9yIG9mZnNldCB2YWx1ZSB1c2VkIHRvIGNvcnJlY3QgdGhlIHBvd2VyIGRldGVjdG9yIGN1cnZlIGZvciBlYWNoIHJhdGUgZ3JvdXAKK0ZFTTFfVHhJYmlhc1RhYmxlXzVHICA9IDEwIDEwIDEwIDEwIDEwIDEwICMgTGVuZ3RoOiA2OyBVbml0OiBDb2Rld29yZDsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgc2V0cyB0aGUgYmlhcyBjdXJyZW50IHByb3ZpZGVkIGJ5IHRoZSBTb0MgdG8gdGhlIFBBIGluIHRoZSBGRU0KK0ZFTTFfUnhGZW1JbnNlcnRpb25Mb3NzXzVHICA9IDEwIDEwIDEwIDEwIDEwIDEwIDEwICMgTGVuZ3RoOiA3OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSByZWNlaXZlZCBpbnNlcnRpb24gbG9zcyBvZiB0aGUgV0wxMjd4CisKZGlmZiAtLWdpdCBhL21hYzgwMjExL3RpLXV0aWxzL2luaV9maWxlcy8xMjd4L1RRU19TXzIuNS5pbmkgYi9tYWM4MDIxMS90aS11dGlscy9pbmlfZmlsZXMvMTI3eC9UUVNfU18yLjUuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYxODEzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9tYWM4MDIxMS90aS11dGlscy9pbmlfZmlsZXMvMTI3eC9UUVNfU18yLjUuaW5pCkBAIC0wLDAgKzEsNjMgQEAKKyMgSU5JIEdlbmVyYXRvciB2ZXJzaW9uIDEuNDsgQWxpZ25lZCB0byBUUyB2ZXJzaW9uIDYuMS4yLjAuMjcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAxOiAgIE5vbiBGRU0tZGVwZW5kYW50IHNlY3Rpb24KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAxLjE6IEdlbmVyYWwgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVFhCaVBGRU1BdXRvRGV0ZWN0ICA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBPcHRpb25zICgwOiBNYW51YWwgTW9kZSwgMTogQXV0b21hdGljIG1vZGUpOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIGJ5IHRoZSBGVyB0byBkZWNpZGUgaWYgdGhlIGZyb250LWVuZCBpcyBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHkgb3IgbWFudWFsbHkKK1RYQmlQRkVNTWFudWZhY3R1cmVyICA9IDAxICMgTGVuZ3RoOiAxOyBVbml0OiBCaXRfT3B0aW9uczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogQml0MSwwOiB1c2VkIHRvIGRldGVybWluZSB3aGljaCBGRU0gdmVuZG9yIHR5cGUgaXMgdXNlZCBvbiB0aGUgcGxhdGZvcm0gKDA6IFJGTUQsIDE6IFRRUywgMjpTS1csIDM6SFApLCBCaXQzLDI6IHVudXNlZCwgQml0Ny00OkV4dGVybmFsL2ludGVybmFsIGxvYWQgKDQtU0tXIFNCLCA1LVNLVyBIQiwgNi1IUCBTQiwgNy1IUCBIQikKK1JlZkNsayAgPSAwMiAjIExlbmd0aDogMTsgVW5pdDogQml0X09wdGlvbnM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IEJpdCAwLDEsMi0wOjE5LjJNSHosMToyNk1IeiwyOjM4LjRNSHpbRGVmYXVsdF0sMzo1Mk1Ieiw0OjM4LjRNSHogWFRBTCw1OjI2TUh6IFhUQUwsIEJpdCAzLUNMS19SRVEgdHlwZSwgMD13aXJlZC1PUiwgMT1wdXNoLXB1bGwsIEJpdCA0LUNMS19SRVEgcG9sYXJpdHkKK1NldHRsaW5nVGltZSAgPSAwNSAjIExlbmd0aDogMTsgVW5pdDogbXMgKDAtMTUpOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgdGltZSBmcm9tIGFzc2VydGluZyBDTEtfUkVRIChsb3cgdG8gaGlnaCkgdG8gdmFsaWQgRlJFRiBjbG9jayBvbiB0aGUgZGV2aWNlIGlucHV0cworQ2xvY2tWYWxpZE9uV2FrZXVwICA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBPcHRpb25zICgwOiBSZWZlcmVuY2UgY2xvY2sgbm90IHZhbGlkLCAxOiBSZWZlcmVuY2UgY2xvY2sgaXMgdmFsaWQgYW5kIHN0YWJsZSk7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyIHRoZSBGUkVGIGNsb2NrIGlzIHZhbGlkIG9uIHdha2V1cAorREMyRENNb2RlICA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBCaXRfT3B0aW9uczsgRm9ybWF0OiBVbnNpZ25lZCwgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogQml0MCAtIERDMkRDIG1vZGUgKDA6IGJ0U1BJIGlzIG5vdCB1c2VkOzE6IGJ0U1BJIHVzZWQgbXV4IERDMkRDIHRvIEJUX0ZVTkMyKSwgQml0MS0gTGV2ZWwgc2hpZnRlciBzdXBwb3J0ICgwOiBObyBMUywgMTogV2l0aCBMUykKK1NpbmdsZV9EdWFsX0JhbmRfU29sdXRpb24gID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IE9wdGlvbnMgKDA6IFNpbmdsZSBiYW5kLCAxOiBEdWFsIGJhbmQpOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgaWYgdGhlIHNvbHV0aW9uIGlzIHNpbmdsZSBiYW5kICgyLjRHSHogb25seSkgb3IgZHVhbCBiYW5kICgyLjRHSHogJiA1R0h6KQorU2V0dGluZ3MgID0gMDEgIyBMZW5ndGg6IDE7IFVuaXQ6IEJpdF9PcHRpb25zOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBCaXQwLU5CSSgwOk9mZiwxOk9uKSxCaXQxLVRlbGVjIGNoMTQoMDpPZmYsMTpPbiksQml0Mi1GRU0wLUxCLEJpdDMtRkVNMC1IQixCaXQ0LUZFTTEtTEIsQml0NS1GRU0xLUhCLVRYIEJpUCBsb2FkKDA6SW50LiwxOkV4dC4pLEJpdDYtTFBEIExCLEJpdDctTFBEIEhCCitTUlN0YXRlID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IE9wdGlvbnMgKDA6IERpc2FibGVkLCAxOiBFbmFibGVkKTsgRm9ybWF0OiBEZWNpbWFsOyBTb3VyY2U6IFRJOyBDb21tZW50OiBTbWFydCBSZWZsYXggKHByb3ByaWV0YXJ5IG1lY2hhbmlzbSBvZiBUSSB0aGF0IGlkZW50aWZ5IHRoZSBzaWxpY29uIHByb2Nlc3Mgc3BlY2lmaWMgcGFyYW1zKSBzdGF0ZQorU1JGMSA9IDA5IDA0IDE4IDEwIDA4IDAwIEY3IEVGIEU3IERGIDAwIDAwIDAwIDAwIDBGIDNGICAjIExlbmd0aDogMTY7IFVuaXQ6IFNSRjEgdmFsdWVzOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIHRhYmxlIGhvbGRzIHRoZSBzcGVjaWZpYyBwYXJhbWV0ZXJzIGZvciB1c2luZyB0aGUgU21hcnRSZWZsZXggbWVjaGFuaXNtCitTUkYyID0gMDkgMDQgMTggMTAgMDggMDAgRjcgRUYgRTcgREYgMDAgMDAgMDAgMDAgMDAgMDAgICMgTGVuZ3RoOiAxNjsgVW5pdDogU1JGMiB2YWx1ZXM7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgdGFibGUgaG9sZHMgdGhlIHNwZWNpZmljIHBhcmFtZXRlcnMgZm9yIHVzaW5nIHRoZSBTbWFydFJlZmxleCBtZWNoYW5pc20KK1NSRjMgPSAwOSAwNCAxOCAxMCAwOCAwMCBGNyBFRiBFNyBERiAwMCAwMCAwMCAwMCAwMCAwMCAgIyBMZW5ndGg6IDE2OyBVbml0OiBTUkYzIHZhbHVlczsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSB0YWJsZSBob2xkcyB0aGUgc3BlY2lmaWMgcGFyYW1ldGVycyBmb3IgdXNpbmcgdGhlIFNtYXJ0UmVmbGV4IG1lY2hhbmlzbQorI1NSX0RlYnVnX1RhYmxlID0gMDkgMDQgMTggMTAgMDggMDAgRjcgRUYgRTcgREYgMDAgMDAgMDAgMDAgMDAgMDAgICMgTGVuZ3RoOiAxNjsgVW5pdDogU1JfRGVidWdfVGFibGUgdmFsdWVzOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogU1IgRGVidWcgdmFsdWVzIJYgZm9yIFRJIGludGVybmFsIHVzZSBvbmx5CisjU1JfU0VOX05fUCA9IDIyICMgTGVuZ3RoOiAxOyBVbml0OiBTUl9TRU5fTl9QIHZhbHVlczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogU1IgRGVidWcgdmFsdWVzIJYgZm9yIFRJIGludGVybmFsIHVzZSBvbmx5CisjU1JfU0VOX05fUF9HYWluID0gYTkgIyBMZW5ndGg6IDE7IFVuaXQ6IFNSX1NFTl9OX1BfR0FJTiB2YWx1ZXM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFNSIERlYnVnIHZhbHVlcyCWIGZvciBUSSBpbnRlcm5hbCB1c2Ugb25seQorI1NSX1NFTl9OUk4gPSBjMSAjIExlbmd0aDogMTsgVW5pdDogU1JfU0VOX05STiB2YWx1ZXM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEkgOyBDb21tZW50OiBTUiBEZWJ1ZyB2YWx1ZXMgliBmb3IgVEkgaW50ZXJuYWwgdXNlIG9ubHkKKyNTUl9TRU5fUFJOID0gOGQgIyBMZW5ndGg6IDE7IFVuaXQ6IFNSX1NFTl9QUk4gdmFsdWVzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJIDsgQ29tbWVudDogU1IgRGVidWcgdmFsdWVzIJYgZm9yIFRJIGludGVybmFsIHVzZSBvbmx5CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMS4yOiBCYW5kLWRlcGVuZGFudCBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMS4yLjE6IDIuNEcgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUnhUcmFjZUluc2VydGlvbkxvc3NfMl80RyA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiAxLzhkQjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBwcmludGVkIGNpcmN1aXQgYm9hcmQgKFBDQikgdHJhY2UgaW5zZXJ0aW9uIGxvc3MKK1RYVHJhY2VMb3NzXzJfNEcgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogMS84ZEI7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgdG8gYWxpZ24gdGhlIG91dHB1dCBwb3dlciB0byBhIGRpZmZlcmVudCBsb2NhdGlvbiBvbiB0aGUgYm9hcmQKK1J4UnNzaUFuZFByb2Nlc3NDb21wZW5zYXRpb25fMl80RyAgPSBFQyBGNiAwMCAwQyAxOCBGOCBGQyAwMCAwOCAxMCBGMCBGOCAwMCAwQSAxNCAjIExlbmd0aDogMTU7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIFJTU0kgY29ybmVyIHBvaW50cyBhcmUgZGV0ZXJtaW5lZCBkdXJpbmcgUlNTSSB0ZW1wZXJhdHVyZSBhbmQgcHJvY2VzcyBjaGFyYWN0ZXJpemF0aW9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMS4yLjI6IDVHIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAyOiAgICAgRkVNLWRlcGVuZGFudCBzZWN0aW9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMi4xOiAgIEZFTSBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMi4xLjE6IDIuNEcgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRkVNMV9UWEJpUFJlZmVyZW5jZVBEdm9sdGFnZV8yXzRHID0gMDE3NyAjIExlbmd0aDogMTsgVW5pdDogMW1WOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBkZWZpbmUgdGhlIHJlZmVyZW5jZSBwb2ludCBvZiB0aGUgRkVNIHBvd2VyIGRldGVjdG9yCitGRU0xX1R4QmlQUmVmZXJlbmNlUG93ZXJfMl80RyAgPSA4MCAjIExlbmd0aDogMTsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBSZWZlcmVuY2Ugb3V0cHV0IHBvd2VyIHRoYXQgcHJvZHVjZXMgZ2l2ZW4gcmVmZXJlbmNlIHBvd2VyIGRldGVjdG9yIG91dHB1dCB2b2x0YWdlIC4KK0ZFTTFfVHhCaVBPZmZzZXRkQl8yXzRHID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGZpbmUtdHVuZSB0aGUgVFggQmlQIGJ5IHRoZSBjdXN0b21lcgorRkVNMV9UeFBlclJhdGVQb3dlckxpbWl0c18yXzRHX05vcm1hbCA9IDFEIDFGIDIyIDI2IDI4IDI5ICMgTGVuZ3RoOiA2OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXAgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfMl80R19EZWdyYWRlZCA9IDFBIDFGIDIyIDI0IDI2IDI4ICMgTGVuZ3RoOiA2OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXAgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfMl80R19FeHRyZW1lID0gMTYgMUQgMUUgMjAgMjQgMjUgIyBMZW5ndGg6IDY7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcCByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9EZWdyYWRlZExvd1RvTm9ybWFsVGhyXzJfNEcgPSAxRSAjIExlbmd0aDogMTsgVW5pdDogMS8xMCB2b2x0czsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcCByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9Ob3JtYWxUb0RlZ3JhZGVkSGlnaFRocl8yXzRHID0gMkQgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvMTAgdm9sdHM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXAgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfVHhQZXJDaGFubmVsUG93ZXJMaW1pdHNfMl80R18xMWIgPSA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCAjIExlbmd0aDogMTQ7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIHB1cnBvc2Ugb2YgdGhpcyB0YWJsZSBpcyB0byBhbGxvdyBjbGlwcGluZyBvZiB0aGUgbWF4aW11bSBvdXRwdXQgcG93ZXIgb24gY2VydGFpbiBjaGFubmVscworRkVNMV9UeFBlckNoYW5uZWxQb3dlckxpbWl0c18yXzRHX09GRE0gPSA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCAjIExlbmd0aDogMTQ7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIHB1cnBvc2Ugb2YgdGhpcyB0YWJsZSBpcyB0byBhbGxvdyBjbGlwcGluZyBvZiB0aGUgbWF4aW11bSBvdXRwdXQgcG93ZXIgb24gY2VydGFpbiBjaGFubmVscworRkVNMV9UeFBEVnNSYXRlT2Zmc2V0c18yXzRHID0gMDEgMDIgMDIgMDIgMDIgMDAgIyBMZW5ndGg6IDY7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaXMgYSBwb3dlciBkZXRlY3RvciBvZmZzZXQgdmFsdWUgdXNlZCB0byBjb3JyZWN0IHRoZSBwb3dlciBkZXRlY3RvciBjdXJ2ZSBmb3IgZWFjaCByYXRlIGdyb3VwCitGRU0xX1R4SWJpYXNUYWJsZV8yXzRHICA9IDExIDExIDE1IDExIDE1IDBGICMgTGVuZ3RoOiA2OyBVbml0OiBDb2Rld29yZCA7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIHNldHMgdGhlIGJpYXMgY3VycmVudCBwcm92aWRlZCBieSB0aGUgU29DIHRvIHRoZSBQQSBpbiB0aGUgRkVNLiBPcHRpb25zIChNQ1M3LCA1NC80OCwgMzYvMjQsIDE4LzEyLCA5LzYsIDExYikKK0ZFTTFfUnhGZW1JbnNlcnRpb25Mb3NzXzJfNEcgID0gMEUgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHJlY2VpdmVkIGluc2VydGlvbiBsb3NzIG9mIHRoZSBXTDEyN3gKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAyLjEuMjogNUcgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9tYWM4MDIxMS90aS11dGlscy9pbmlfZmlsZXMvMTI3eC9UUVNfU18yLjYuaW5pIGIvbWFjODAyMTEvdGktdXRpbHMvaW5pX2ZpbGVzLzEyN3gvVFFTX1NfMi42LmluaQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNWIwODc3Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjODAyMTEvdGktdXRpbHMvaW5pX2ZpbGVzLzEyN3gvVFFTX1NfMi42LmluaQpAQCAtMCwwICsxLDYzIEBACisjIElOSSBHZW5lcmF0b3IgdmVyc2lvbiAxLjQ7IEFsaWduZWQgdG8gVFMgdmVyc2lvbiA2LjEuMi4wLjI3CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMTogICBOb24gRkVNLWRlcGVuZGFudCBzZWN0aW9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMS4xOiBHZW5lcmFsIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RYQmlQRkVNQXV0b0RldGVjdCAgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogT3B0aW9ucyAoMDogTWFudWFsIE1vZGUsIDE6IEF1dG9tYXRpYyBtb2RlKTsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCBieSB0aGUgRlcgdG8gZGVjaWRlIGlmIHRoZSBmcm9udC1lbmQgaXMgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5IG9yIG1hbnVhbGx5CitUWEJpUEZFTU1hbnVmYWN0dXJlciAgPSAwMSAjIExlbmd0aDogMTsgVW5pdDogQml0X09wdGlvbnM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IEJpdDEsMDogdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggRkVNIHZlbmRvciB0eXBlIGlzIHVzZWQgb24gdGhlIHBsYXRmb3JtICgwOiBSRk1ELCAxOiBUUVMsIDI6U0tXLCAzOkhQKSwgQml0MywyOiB1bnVzZWQsIEJpdDctNDpFeHRlcm5hbC9pbnRlcm5hbCBsb2FkICg0LVNLVyBTQiwgNS1TS1cgSEIsIDYtSFAgU0IsIDctSFAgSEIpCitSZWZDbGsgID0gMDIgIyBMZW5ndGg6IDE7IFVuaXQ6IEJpdF9PcHRpb25zOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBCaXQgMCwxLDItMDoxOS4yTUh6LDE6MjZNSHosMjozOC40TUh6W0RlZmF1bHRdLDM6NTJNSHosNDozOC40TUh6IFhUQUwsNToyNk1IeiBYVEFMLCBCaXQgMy1DTEtfUkVRIHR5cGUsIDA9d2lyZWQtT1IsIDE9cHVzaC1wdWxsLCBCaXQgNC1DTEtfUkVRIHBvbGFyaXR5CitTZXR0bGluZ1RpbWUgID0gMDUgIyBMZW5ndGg6IDE7IFVuaXQ6IG1zICgwLTE1KTsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIHRpbWUgZnJvbSBhc3NlcnRpbmcgQ0xLX1JFUSAobG93IHRvIGhpZ2gpIHRvIHZhbGlkIEZSRUYgY2xvY2sgb24gdGhlIGRldmljZSBpbnB1dHMKK0Nsb2NrVmFsaWRPbldha2V1cCAgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogT3B0aW9ucyAoMDogUmVmZXJlbmNlIGNsb2NrIG5vdCB2YWxpZCwgMTogUmVmZXJlbmNlIGNsb2NrIGlzIHZhbGlkIGFuZCBzdGFibGUpOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlciB0aGUgRlJFRiBjbG9jayBpcyB2YWxpZCBvbiB3YWtldXAKK0RDMkRDTW9kZSAgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogQml0X09wdGlvbnM7IEZvcm1hdDogVW5zaWduZWQsIFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IEJpdDAgLSBEQzJEQyBtb2RlICgwOiBidFNQSSBpcyBub3QgdXNlZDsxOiBidFNQSSB1c2VkIG11eCBEQzJEQyB0byBCVF9GVU5DMiksIEJpdDEtIExldmVsIHNoaWZ0ZXIgc3VwcG9ydCAoMDogTm8gTFMsIDE6IFdpdGggTFMpCitTaW5nbGVfRHVhbF9CYW5kX1NvbHV0aW9uICA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBPcHRpb25zICgwOiBTaW5nbGUgYmFuZCwgMTogRHVhbCBiYW5kKTsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIGlmIHRoZSBzb2x1dGlvbiBpcyBzaW5nbGUgYmFuZCAoMi40R0h6IG9ubHkpIG9yIGR1YWwgYmFuZCAoMi40R0h6ICYgNUdIeikKK1NldHRpbmdzICA9IDAxICMgTGVuZ3RoOiAxOyBVbml0OiBCaXRfT3B0aW9uczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogQml0MC1OQkkoMDpPZmYsMTpPbiksQml0MS1UZWxlYyBjaDE0KDA6T2ZmLDE6T24pLEJpdDItRkVNMC1MQixCaXQzLUZFTTAtSEIsQml0NC1GRU0xLUxCLEJpdDUtRkVNMS1IQi1UWCBCaVAgbG9hZCgwOkludC4sMTpFeHQuKSxCaXQ2LUxQRCBMQixCaXQ3LUxQRCBIQgorU1JTdGF0ZSA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBPcHRpb25zICgwOiBEaXNhYmxlZCwgMTogRW5hYmxlZCk7IEZvcm1hdDogRGVjaW1hbDsgU291cmNlOiBUSTsgQ29tbWVudDogU21hcnQgUmVmbGF4IChwcm9wcmlldGFyeSBtZWNoYW5pc20gb2YgVEkgdGhhdCBpZGVudGlmeSB0aGUgc2lsaWNvbiBwcm9jZXNzIHNwZWNpZmljIHBhcmFtcykgc3RhdGUKK1NSRjEgPSAwOSAwNCAxOCAxMCAwOCAwMCBGNyBFRiBFNyBERiAwMCAwMCAwMCAwMCAwRiAzRiAgIyBMZW5ndGg6IDE2OyBVbml0OiBTUkYxIHZhbHVlczsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSB0YWJsZSBob2xkcyB0aGUgc3BlY2lmaWMgcGFyYW1ldGVycyBmb3IgdXNpbmcgdGhlIFNtYXJ0UmVmbGV4IG1lY2hhbmlzbQorU1JGMiA9IDA5IDA0IDE4IDEwIDA4IDAwIEY3IEVGIEU3IERGIDAwIDAwIDAwIDAwIDAwIDAwICAjIExlbmd0aDogMTY7IFVuaXQ6IFNSRjIgdmFsdWVzOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIHRhYmxlIGhvbGRzIHRoZSBzcGVjaWZpYyBwYXJhbWV0ZXJzIGZvciB1c2luZyB0aGUgU21hcnRSZWZsZXggbWVjaGFuaXNtCitTUkYzID0gMDkgMDQgMTggMTAgMDggMDAgRjcgRUYgRTcgREYgMDAgMDAgMDAgMDAgMDAgMDAgICMgTGVuZ3RoOiAxNjsgVW5pdDogU1JGMyB2YWx1ZXM7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgdGFibGUgaG9sZHMgdGhlIHNwZWNpZmljIHBhcmFtZXRlcnMgZm9yIHVzaW5nIHRoZSBTbWFydFJlZmxleCBtZWNoYW5pc20KKyNTUl9EZWJ1Z19UYWJsZSA9IDA5IDA0IDE4IDEwIDA4IDAwIEY3IEVGIEU3IERGIDAwIDAwIDAwIDAwIDAwIDAwICAjIExlbmd0aDogMTY7IFVuaXQ6IFNSX0RlYnVnX1RhYmxlIHZhbHVlczsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFNSIERlYnVnIHZhbHVlcyCWIGZvciBUSSBpbnRlcm5hbCB1c2Ugb25seQorI1NSX1NFTl9OX1AgPSAyMiAjIExlbmd0aDogMTsgVW5pdDogU1JfU0VOX05fUCB2YWx1ZXM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFNSIERlYnVnIHZhbHVlcyCWIGZvciBUSSBpbnRlcm5hbCB1c2Ugb25seQorI1NSX1NFTl9OX1BfR2FpbiA9IGE5ICMgTGVuZ3RoOiAxOyBVbml0OiBTUl9TRU5fTl9QX0dBSU4gdmFsdWVzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBTUiBEZWJ1ZyB2YWx1ZXMgliBmb3IgVEkgaW50ZXJuYWwgdXNlIG9ubHkKKyNTUl9TRU5fTlJOID0gYzEgIyBMZW5ndGg6IDE7IFVuaXQ6IFNSX1NFTl9OUk4gdmFsdWVzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJIDsgQ29tbWVudDogU1IgRGVidWcgdmFsdWVzIJYgZm9yIFRJIGludGVybmFsIHVzZSBvbmx5CisjU1JfU0VOX1BSTiA9IDhkICMgTGVuZ3RoOiAxOyBVbml0OiBTUl9TRU5fUFJOIHZhbHVlczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSSA7IENvbW1lbnQ6IFNSIERlYnVnIHZhbHVlcyCWIGZvciBUSSBpbnRlcm5hbCB1c2Ugb25seQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDEuMjogQmFuZC1kZXBlbmRhbnQgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDEuMi4xOiAyLjRHIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1J4VHJhY2VJbnNlcnRpb25Mb3NzXzJfNEcgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogMS84ZEI7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB0aGUgcHJpbnRlZCBjaXJjdWl0IGJvYXJkIChQQ0IpIHRyYWNlIGluc2VydGlvbiBsb3NzCitUWFRyYWNlTG9zc18yXzRHID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIGFsaWduIHRoZSBvdXRwdXQgcG93ZXIgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24gb24gdGhlIGJvYXJkCitSeFJzc2lBbmRQcm9jZXNzQ29tcGVuc2F0aW9uXzJfNEcgID0gRUMgRjYgMDAgMEMgMTggRjggRkMgMDAgMDggMTAgRjAgRjggMDAgMEEgMTQgIyBMZW5ndGg6IDE1OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSBSU1NJIGNvcm5lciBwb2ludHMgYXJlIGRldGVybWluZWQgZHVyaW5nIFJTU0kgdGVtcGVyYXR1cmUgYW5kIHByb2Nlc3MgY2hhcmFjdGVyaXphdGlvbgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDEuMi4yOiA1RyBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMjogICAgIEZFTS1kZXBlbmRhbnQgc2VjdGlvbgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDIuMTogICBGRU0gcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDIuMS4xOiAyLjRHIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZFTTFfVFhCaVBSZWZlcmVuY2VQRHZvbHRhZ2VfMl80RyA9IDAxNzcgIyBMZW5ndGg6IDE7IFVuaXQ6IDFtVjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgZGVmaW5lIHRoZSByZWZlcmVuY2UgcG9pbnQgb2YgdGhlIEZFTSBwb3dlciBkZXRlY3RvcgorRkVNMV9UeEJpUFJlZmVyZW5jZVBvd2VyXzJfNEcgID0gODAgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogUmVmZXJlbmNlIG91dHB1dCBwb3dlciB0aGF0IHByb2R1Y2VzIGdpdmVuIHJlZmVyZW5jZSBwb3dlciBkZXRlY3RvciBvdXRwdXQgdm9sdGFnZSAuCitGRU0xX1R4QmlQT2Zmc2V0ZEJfMl80RyA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgZmllbGQgaXMgdXNlZCB0byBmaW5lLXR1bmUgdGhlIFRYIEJpUCBieSB0aGUgY3VzdG9tZXIKK0ZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfMl80R19Ob3JtYWwgPSAxRCAxRiAyMiAyNiAyNyAyOSAjIExlbmd0aDogNjsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX1R4UGVyUmF0ZVBvd2VyTGltaXRzXzJfNEdfRGVncmFkZWQgPSAxQSAxRiAyMiAyNSAyNSAyNyAjIExlbmd0aDogNjsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX1R4UGVyUmF0ZVBvd2VyTGltaXRzXzJfNEdfRXh0cmVtZSA9IDE2IDFEIDFFIDIwIDI0IDI1ICMgTGVuZ3RoOiA2OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXAgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfRGVncmFkZWRMb3dUb05vcm1hbFRocl8yXzRHID0gMUUgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvMTAgdm9sdHM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXAgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfTm9ybWFsVG9EZWdyYWRlZEhpZ2hUaHJfMl80RyA9IDJEICMgTGVuZ3RoOiAxOyBVbml0OiAxLzEwIHZvbHRzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX1R4UGVyQ2hhbm5lbFBvd2VyTGltaXRzXzJfNEdfMTFiID0gNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgIyBMZW5ndGg6IDE0OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBwdXJwb3NlIG9mIHRoaXMgdGFibGUgaXMgdG8gYWxsb3cgY2xpcHBpbmcgb2YgdGhlIG1heGltdW0gb3V0cHV0IHBvd2VyIG9uIGNlcnRhaW4gY2hhbm5lbHMKK0ZFTTFfVHhQZXJDaGFubmVsUG93ZXJMaW1pdHNfMl80R19PRkRNID0gNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgIyBMZW5ndGg6IDE0OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBwdXJwb3NlIG9mIHRoaXMgdGFibGUgaXMgdG8gYWxsb3cgY2xpcHBpbmcgb2YgdGhlIG1heGltdW0gb3V0cHV0IHBvd2VyIG9uIGNlcnRhaW4gY2hhbm5lbHMKK0ZFTTFfVHhQRFZzUmF0ZU9mZnNldHNfMl80RyA9IDAxIDAyIDAyIDAyIDAyIDAwICMgTGVuZ3RoOiA2OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIGEgcG93ZXIgZGV0ZWN0b3Igb2Zmc2V0IHZhbHVlIHVzZWQgdG8gY29ycmVjdCB0aGUgcG93ZXIgZGV0ZWN0b3IgY3VydmUgZm9yIGVhY2ggcmF0ZSBncm91cAorRkVNMV9UeEliaWFzVGFibGVfMl80RyAgPSAxNSAxNSAxNSAxMSAxNSAxNSAjIExlbmd0aDogNjsgVW5pdDogQ29kZXdvcmQgOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBzZXRzIHRoZSBiaWFzIGN1cnJlbnQgcHJvdmlkZWQgYnkgdGhlIFNvQyB0byB0aGUgUEEgaW4gdGhlIEZFTS4gT3B0aW9ucyAoTUNTNywgNTQvNDgsIDM2LzI0LCAxOC8xMiwgOS82LCAxMWIpCitGRU0xX1J4RmVtSW5zZXJ0aW9uTG9zc18yXzRHICA9IDBFICMgTGVuZ3RoOiAxOyBVbml0OiAxLzhkQjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSByZWNlaXZlZCBpbnNlcnRpb24gbG9zcyBvZiB0aGUgV0wxMjd4CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMi4xLjI6IDVHIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwpkaWZmIC0tZ2l0IGEvbWFjODAyMTEvdGktdXRpbHMvaW5pX2ZpbGVzLzEyOHgvUkZNRF9TXzMuNS5pbmkgYi9tYWM4MDIxMS90aS11dGlscy9pbmlfZmlsZXMvMTI4eC9SRk1EX1NfMy41LmluaQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMjIwYjE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjODAyMTEvdGktdXRpbHMvaW5pX2ZpbGVzLzEyOHgvUkZNRF9TXzMuNS5pbmkKQEAgLTAsMCArMSw2OSBAQAorIyBJTkkgR2VuZXJhdG9yIHZlcnNpb24gMC41OyBBbGlnbmVkIHRvIFRTIHZlcnNpb24gNy4xLjIuMC4yNgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDE6ICAgTm9uIEZFTS1kZXBlbmRhbnQgc2VjdGlvbgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDEuMTogR2VuZXJhbCBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUWEJpUEZFTUF1dG9EZXRlY3QgID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IE9wdGlvbnMgKDA6IE1hbnVhbCBNb2RlLCAxOiBBdXRvbWF0aWMgbW9kZSk7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgYnkgdGhlIEZXIHRvIGRlY2lkZSBpZiB0aGUgZnJvbnQtZW5kIGlzIGRldGVybWluZWQgYXV0b21hdGljYWxseSBvciBtYW51YWxseQorVFhCaVBGRU1NYW51ZmFjdHVyZXIgID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IEJpdF9PcHRpb25zOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBCaXQxLDA6IHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIEZFTSB2ZW5kb3IgdHlwZSBpcyB1c2VkIG9uIHRoZSBwbGF0Zm9ybSAoMDogUkZNRCwgMTogVFFTLCAyOlNLVywgMzpIUCksIEJpdDMsMjogdW51c2VkLCBCaXQ3LTQ6RXh0ZXJuYWwvaW50ZXJuYWwgbG9hZCAoNC1TS1cgU0IsIDUtU0tXIEhCLCA2LUhQIFNCLCA3LUhQIEhCKQorUmVmQ2xrICA9IDAxICMgTGVuZ3RoOiAxOyBVbml0OiBCaXRfT3B0aW9uczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogNSdiWFgwMDAgOiBCaXQgMCwxLDIgLSAwOiAxOS4yTUh6LCAxOiAyNk1IeiwgMjogMzguNE1IeiAgW0RlZmF1bHRdLCAzOiA1Mk1IeiwgIDQ6IDM4LjRNSHogWFRBTCwgNTogMjZNSHogWFRBTCAsICA1J2JYMFhYWCA6IEJpdCAzIC0gQ0xLX1JFUSB0eXBlLCAgMCA9IHdpcmVkLU9SIFtEZWZhdWx0XSwgMT0gcHVzaC1wdWxsICwgIDUnYjBYWFhYIDogQml0IDQgLSBDTEtfUkVRIHBvbGFyaXR5LCAwID0gTm9ybWFsIFtEZWZhdWx0XSwgMT1JbnZlcnRlZAorU2V0dGxpbmdUaW1lICA9IDA1ICMgTGVuZ3RoOiAxOyBVbml0OiBtcyAoMC0xNSk7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSB0aW1lIGZyb20gYXNzZXJ0aW5nIENMS19SRVEgKGxvdyB0byBoaWdoKSB0byB2YWxpZCBGUkVGIGNsb2NrIG9uIHRoZSBkZXZpY2UgaW5wdXRzCitDbG9ja1ZhbGlkT25XYWtldXAgID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IE9wdGlvbnMgKDA6IFJlZmVyZW5jZSBjbG9jayBub3QgdmFsaWQsIDE6IFJlZmVyZW5jZSBjbG9jayBpcyB2YWxpZCBhbmQgc3RhYmxlKTsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIEZSRUYgY2xvY2sgaXMgdmFsaWQgb24gd2FrZXVwCitUQ1hPX0NsayAgPSAwMSAjIExlbmd0aDogMTsgVW5pdDogQml0X09wdGlvbnM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IDUnYlhYMDAwIDogQml0IDAsMSwyIC0gMDogMTkuMk1IeiwgMTogMjZNSHosIDI6IDM4LjRNSHogIFtEZWZhdWx0XSwgMzogNTJNSHosIDQ6IDE2LjM2OE1oeiwgNTogMzIuNzM2IE1oeiAKK1RDWE9fU2V0dGxpbmdUaW1lICA9IDA1ICMgTGVuZ3RoOiAxOyBVbml0OiBtcyAoMC0xNSk7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSB0aW1lIGZyb20gYXNzZXJ0aW5nIENMS19SRVEgKGxvdyB0byBoaWdoKSB0byB2YWxpZCBUQ1hPIGNsb2NrIG9uIHRoZSBkZXZpY2UgaW5wdXRzCitUQ1hPX0Nsb2NrVmFsaWRPbldha2V1cCAgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogT3B0aW9ucyAoMDogUmVmZXJlbmNlIGNsb2NrIG5vdCB2YWxpZCwgMTogUmVmZXJlbmNlIGNsb2NrIGlzIHZhbGlkIGFuZCBzdGFibGUpOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlciB0aGUgVENYTyBjbG9jayBpcyB2YWxpZCBvbiB3YWtldXAgCitUQ1hPX0xET19Wb2x0YWdlID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IE9wdGlvbnMgKDA6Mi41diwgMToyLjU1diwgMjoyLjZ2KTsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVENYTyBMRE8gVm9sdGFnZSAKK1BsYXRmb3JtX2NvbmZpZ3VyYXRpb24gPSAwMiAjIExlbmd0aDogMTsgVW5pdDogQml0X09wdGlvbnM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXIgOyBDb21tZW50OiBCaXQgMDogTGV2ZWxzaGlmdGVyIHN1cHBvcnQgKDA6IE5vIExTLCAxOiBXaXRoIExTKSwgQml0IDEsMjpDb25maWd1cmUgSU8ncyBbU0RJTy93c3BpXSAoMDAtIDhtQSwgMDEtIDRtQSAoZGVmYXVsdCksIDEwLSA2bUEsIDExIC0gMm1BKSwgQml0IDM6RWVwcm9tICgwLU5vIEVlcHJvbSksIEJpdCA0OiBTRElPIElCIEVuYWJsZSBzeW5jLCBCaXQgNTogU0RJTyBJQiBFbmFibGUgYXN5bmMsIEJpdCA2OiBTRElPIElCIEVuYWJsZSBCbG9ja01vZGUsIEJpdCA3OiBTRElPIEhpZ2gtU3BlZWQgc3VwcG9ydAorU2luZ2xlX0R1YWxfQmFuZF9Tb2x1dGlvbiAgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogT3B0aW9ucyAoMDogMi41diwgMTogMi41NXYsIDI6IDIuNnYpOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIGZpZWxkIG5vdGlmaWVzIHRoZSBGVyB3aGV0aGVyIHRoZSBzb2x1dGlvbiBpcyBhIHNpbmdsZS1iYW5kIG9yIGR1YWwtYmFuZAorU2V0dGluZ3MgID0gMDAgMDAgMDAgMDAgIyBMZW5ndGg6IDQ7IFVuaXQ6IEJpdF9PcHRpb25zOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBCaXQwOiBOQkkgKDA6IE9mZiwgMTogT24pLCBCaXQxOiBUZWxlYyBjaGFubmVsIDE0ICgwOiBPZmYsIDE6IE9uKSwgQml0MjogRkVNMC1MQiwgQml0MzogRkVNMC1IQiwgQml0NDogRkVNMS1MQiwgQml0NTogRkVNMS1IQiAtIFRYIEJpUCBsb2FkICgwOiBJbnRlcm5hbCwgMTogRXh0ZXJuYWwpLCBCaXQ2OiBMUEQgTG93IGJhbmQsIEJpdDc6IExQRCBIaWdoIGJhbmQgCitYVEFMSXRyaW1WYWwgPSAwNCAjIExlbmd0aDogMTsgVW5pdDogQ3VycmVudCB0cmltbWluZyBmb3IgWFRBTDsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogQ3VycmVudCB0cmltbWluZyBmb3IgWFRBTAorU1JTdGF0ZSA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBPcHRpb25zICgwOiBEaXNhYmxlZCwgMTogRW5hYmxlZCk7IEZvcm1hdDogRGVjaW1hbDsgU291cmNlOiBUSTsgQ29tbWVudDogU21hcnQgUmVmbGF4IChwcm9wcmlldGFyeSBtZWNoYW5pc20gb2YgVEkgdGhhdCBpZGVudGlmeSB0aGUgc2lsaWNvbiBwcm9jZXNzIHNwZWNpZmljIHBhcmFtcykgc3RhdGUKK1NSRjEgPSAwOSAwNCAxOSAxMCAwOCAwMCBGNyBFRiBFNiBERSAwMCAwMCAwMCAwMCAwRiAzRiAgIyBMZW5ndGg6IDE2OyBVbml0OiBTUkYxIHZhbHVlczsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSB0YWJsZSBob2xkcyB0aGUgc3BlY2lmaWMgcGFyYW1ldGVycyBmb3IgdXNpbmcgdGhlIFNtYXJ0UmVmbGV4IG1lY2hhbmlzbQorU1JGMiA9IDA5IDA0IDE5IDEwIDA4IDAwIEY3IEVGIEU2IERFIDAwIDAwIDAwIDAwIDAwIDAwICAjIExlbmd0aDogMTY7IFVuaXQ6IFNSRjIgdmFsdWVzOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIHRhYmxlIGhvbGRzIHRoZSBzcGVjaWZpYyBwYXJhbWV0ZXJzIGZvciB1c2luZyB0aGUgU21hcnRSZWZsZXggbWVjaGFuaXNtCitTUkYzID0gMDkgMDQgMTkgMTAgMDggMDAgRjcgRUYgRTYgREUgMDAgMDAgMDAgMDAgMDAgMDAgICMgTGVuZ3RoOiAxNjsgVW5pdDogU1JGMyB2YWx1ZXM7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgdGFibGUgaG9sZHMgdGhlIHNwZWNpZmljIHBhcmFtZXRlcnMgZm9yIHVzaW5nIHRoZSBTbWFydFJlZmxleCBtZWNoYW5pc20KKyNTUl9EZWJ1Z19UYWJsZSA9IDA5IDA0IDE5IDEwIDAwIDAwIEY3IEVGIEU2IERFIDAwIDAwIDAwIDAwIDAwIDAwICAjIExlbmd0aDogMTY7IFVuaXQ6IFNSX0RlYnVnX1RhYmxlIHZhbHVlczsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFNSIERlYnVnIHZhbHVlcyCWIGZvciBUSSBpbnRlcm5hbCB1c2Ugb25seQorI1NSX1NFTl9OX1AgPSAxMSAjIExlbmd0aDogMTsgVW5pdDogU1JfU0VOX05fUCB2YWx1ZXM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFNSIERlYnVnIHZhbHVlcyCWIGZvciBUSSBpbnRlcm5hbCB1c2Ugb25seQorI1NSX1NFTl9OX1BfR2FpbiA9IEFBICMgTGVuZ3RoOiAxOyBVbml0OiBTUl9TRU5fTl9QX0dBSU4gdmFsdWVzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBTUiBEZWJ1ZyB2YWx1ZXMgliBmb3IgVEkgaW50ZXJuYWwgdXNlIG9ubHkKKyNTUl9TRU5fTlJOID0gQjYgIyBMZW5ndGg6IDE7IFVuaXQ6IFNSX1NFTl9OUk4gdmFsdWVzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJIDsgQ29tbWVudDogU1IgRGVidWcgdmFsdWVzIJYgZm9yIFRJIGludGVybmFsIHVzZSBvbmx5CisjU1JfU0VOX1BSTiA9IEYwICMgTGVuZ3RoOiAxOyBVbml0OiBTUl9TRU5fUFJOIHZhbHVlczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSSA7IENvbW1lbnQ6IFNSIERlYnVnIHZhbHVlcyCWIGZvciBUSSBpbnRlcm5hbCB1c2Ugb25seQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDEuMjogQmFuZC1kZXBlbmRhbnQgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDEuMi4xOiAyLjRHIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1J4VHJhY2VJbnNlcnRpb25Mb3NzXzJfNEcgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogMS84ZEI7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB0aGUgcHJpbnRlZCBjaXJjdWl0IGJvYXJkIChQQ0IpIHRyYWNlIGluc2VydGlvbiBsb3NzCitUeFRyYWNlTG9zc18yXzRHID0gMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIyBMZW5ndGg6IDE0OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCB0byBhbGlnbiB0aGUgb3V0cHV0IHBvd2VyIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uIG9uIHRoZSBib2FyZAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDEuMi4yOiA1RyBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMjogICAgIEZFTS1kZXBlbmRhbnQgc2VjdGlvbgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDIuMTogICBGRU0gcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRmVtVmVuZG9yQW5kT3B0aW9ucyAgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogQml0X09wdGlvbnM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IEJpdCAwLi4xIC0gMDogUkZNRCwgMTogVFFTLCAyOiBTS1dTLCAgQml0IDQuLjcgW1ZlcnNpb24gY29udHJvbF0gLSAgMDogVFFTLVMxLjAsIDE6IFRRUy1TMi4wLCAyOiBUUVMtUzIuNSwgMzogVFFTLUQxLjAsIDQ6IFRRUy1EMS41LCA1OiBSRk1ELVMxLjUsIDY6IFJGTUQtUzIuOSwgNzogUkZNRC1TMy4wLCA4OiBSRk1ELUQxLjUsIDk6IFJGTUQtUzIuOS41LCAxMDogUkZNRC1EMy4wLjEsIDExOiBUUVMtUzIuNiwgMTI6IFRRUy1EMS43CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMi4xLjE6IDIuNEcgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRkVNMF9UeEJpUFJlZmVyZW5jZVBEdm9sdGFnZV8yXzRHID0gMDEzNiAjIExlbmd0aDogMTsgVW5pdDogMW1WOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBkZWZpbmUgdGhlIHJlZmVyZW5jZSBwb2ludCBvZiB0aGUgRkVNIHBvd2VyIGRldGVjdG9yCitGRU0wX1R4QmlQUmVmZXJlbmNlUG93ZXJfMl80RyAgPSA4MCAjIExlbmd0aDogMTsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBSZWZlcmVuY2Ugb3V0cHV0IHBvd2VyIHRoYXQgcHJvZHVjZXMgZ2l2ZW4gcmVmZXJlbmNlIHBvd2VyIGRldGVjdG9yIG91dHB1dCB2b2x0YWdlIC4gVGhlIFRYIEJpUCByZWZlcmVuY2UgcG93ZXIgaXMgbGlua2VkIHRvIHRoZSBUWCBCaVAgcmVmZXJlbmNlIFBEIHZvbHRhZ2UKK0ZFTTBfVHhCaVBPZmZzZXRkQl8yXzRHID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGZpbmUtdHVuZSB0aGUgVFggQmlQIGJ5IHRoZSBjdXN0b21lcgorRkVNMF9UeFBlclJhdGVQb3dlckxpbWl0c18yXzRHX05vcm1hbCA9IDFEIDFGIDIyIDI2IDI3IDI5IDI1ICMgTGVuZ3RoOiA3OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXBlcmF0dXJlIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0wX1R4UGVyUmF0ZVBvd2VyTGltaXRzXzJfNEdfRGVncmFkZWQgPSAxOSAxRiAyMiAyNSAyNSAyNyAyMyAjIExlbmd0aDogNzsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wZXJhdHVyZSByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMF9UeFBlclJhdGVQb3dlckxpbWl0c18yXzRHX0V4dHJlbWUgPSAxNiAxRCAxRSAyMCAyNCAyNSAyMiAjIExlbmd0aDogNzsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wZXJhdHVyZSByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMF9EZWdyYWRlZExvd1RvTm9ybWFsVGhyXzJfNEcgPSAxRSAjIExlbmd0aDogMTsgVW5pdDogMS8xMCB2b2x0czsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcGVyYXR1cmUgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTBfTm9ybWFsVG9EZWdyYWRlZEhpZ2hUaHJfMl80RyA9IDJEICMgTGVuZ3RoOiAxOyBVbml0OiAxLzEwIHZvbHRzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wZXJhdHVyZSByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMF9UeFBlckNoYW5uZWxQb3dlckxpbWl0c18yXzRHXzExYiA9IDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwICMgTGVuZ3RoOiAxNDsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgcHVycG9zZSBvZiB0aGlzIHRhYmxlIGlzIHRvIGFsbG93IGNsaXBwaW5nIG9mIHRoZSBtYXhpbXVtIG91dHB1dCBwb3dlciBvbiBjZXJ0YWluIGNoYW5uZWxzCitGRU0wX1R4UGVyQ2hhbm5lbFBvd2VyTGltaXRzXzJfNEdfT0ZETSA9IDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwICMgTGVuZ3RoOiAxNDsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgcHVycG9zZSBvZiB0aGlzIHRhYmxlIGlzIHRvIGFsbG93IGNsaXBwaW5nIG9mIHRoZSBtYXhpbXVtIG91dHB1dCBwb3dlciBvbiBjZXJ0YWluIGNoYW5uZWxzCitGRU0wX1R4UERWc1JhdGVPZmZzZXRzXzJfNEcgPSAwMSAwMiAwMiAwMiAwMiAwMCAwMiAjIExlbmd0aDogNzsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpcyBhIHBvd2VyIGRldGVjdG9yIG9mZnNldCB2YWx1ZSB1c2VkIHRvIGNvcnJlY3QgdGhlIHBvd2VyIGRldGVjdG9yIGN1cnZlIGZvciBlYWNoIHJhdGUgZ3JvdXAKK0ZFTTBfVHhQRFZzQ2hhbm5lbE9mZnNldHNfMl80RyA9IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICMgTGVuZ3RoOiAxNDsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJL0N1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpcyBhIHBvd2VyIGRldGVjdG9yIG9mZnNldCB2YWx1ZSB1c2VkIHRvIGNvcnJlY3QgdGhlIHBvd2VyIGRldGVjdG9yIGN1cnZlIGZvciBlYWNoIGNoYW5uZWwKK0ZFTTBfVHhQRFZzVGVtcGVyYXR1cmVfMl80RyA9IDAwIDAwICMgTGVuZ3RoOiAyOyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIGEgcG93ZXIgZGV0ZWN0b3Igb2Zmc2V0IHZhbHVlIHVzZWQgdG8gY29ycmVjdCB0aGUgcG93ZXIgZGV0ZWN0b3IgY3VydmUgZm9yIGVhY2ggdGVtcGVydHVyZQorRkVNMF9UeEliaWFzVGFibGVfMl80RyAgPSAzMyAzMyAzOCAzOCAzZCAzZCAzZCAzZCAjIExlbmd0aDogODsgVW5pdDogQ29kZXdvcmQgOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBzZXRzIHRoZSBiaWFzIGN1cnJlbnQgcHJvdmlkZWQgYnkgdGhlIFNvQyB0byB0aGUgUEEgaW4gdGhlIEZFTS4gT3B0aW9ucyAoTUNTNywgNTQvNDgsIDM2LzI0LCAxOC8xMiwgOS82LCAxMWIsIE1DUzAsIDExYkNoMTQpCitGRU0wX1J4RmVtSW5zZXJ0aW9uTG9zc18yXzRHICA9IDBFICMgTGVuZ3RoOiAxOyBVbml0OiAxLzhkQjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSByZWNlaXZlZCBpbnNlcnRpb24gbG9zcyBvZiB0aGUgV0wxMjh4CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMi4xLjI6IDVHIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwpkaWZmIC0tZ2l0IGEvbWFjODAyMTEvdGktdXRpbHMvaW5pX2ZpbGVzLzEyOHgvVFFTX0RfMS4wLmluaSBiL21hYzgwMjExL3RpLXV0aWxzL2luaV9maWxlcy8xMjh4L1RRU19EXzEuMC5pbmkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2RiNDAzZQotLS0gL2Rldi9udWxsCisrKyBiL21hYzgwMjExL3RpLXV0aWxzL2luaV9maWxlcy8xMjh4L1RRU19EXzEuMC5pbmkKQEAgLTAsMCArMSw4NSBAQAorIyBJTkkgR2VuZXJhdG9yIHZlcnNpb24gMC41OyBBbGlnbmVkIHRvIFRTIHZlcnNpb24gNy4xLjIuMC4yNgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDE6ICAgTm9uIEZFTS1kZXBlbmRhbnQgc2VjdGlvbgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDEuMTogR2VuZXJhbCBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUWEJpUEZFTUF1dG9EZXRlY3QgID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IE9wdGlvbnMgKDA6IE1hbnVhbCBNb2RlLCAxOiBBdXRvbWF0aWMgbW9kZSk7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgYnkgdGhlIEZXIHRvIGRlY2lkZSBpZiB0aGUgZnJvbnQtZW5kIGlzIGRldGVybWluZWQgYXV0b21hdGljYWxseSBvciBtYW51YWxseQorVFhCaVBGRU1NYW51ZmFjdHVyZXIgID0gMDEgIyBMZW5ndGg6IDE7IFVuaXQ6IEJpdF9PcHRpb25zOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBCaXQxLDA6IHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIEZFTSB2ZW5kb3IgdHlwZSBpcyB1c2VkIG9uIHRoZSBwbGF0Zm9ybSAoMDogUkZNRCwgMTogVFFTLCAyOlNLVywgMzpIUCksIEJpdDMsMjogdW51c2VkLCBCaXQ3LTQ6RXh0ZXJuYWwvaW50ZXJuYWwgbG9hZCAoNC1TS1cgU0IsIDUtU0tXIEhCLCA2LUhQIFNCLCA3LUhQIEhCKQorUmVmQ2xrICA9IDAxICMgTGVuZ3RoOiAxOyBVbml0OiBCaXRfT3B0aW9uczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogNSdiWFgwMDAgOiBCaXQgMCwxLDIgLSAwOiAxOS4yTUh6LCAxOiAyNk1IeiwgMjogMzguNE1IeiAgW0RlZmF1bHRdLCAzOiA1Mk1IeiwgIDQ6IDM4LjRNSHogWFRBTCwgNTogMjZNSHogWFRBTCAsICA1J2JYMFhYWCA6IEJpdCAzIC0gQ0xLX1JFUSB0eXBlLCAgMCA9IHdpcmVkLU9SIFtEZWZhdWx0XSwgMT0gcHVzaC1wdWxsICwgIDUnYjBYWFhYIDogQml0IDQgLSBDTEtfUkVRIHBvbGFyaXR5LCAwID0gTm9ybWFsIFtEZWZhdWx0XSwgMT1JbnZlcnRlZAorU2V0dGxpbmdUaW1lICA9IDA1ICMgTGVuZ3RoOiAxOyBVbml0OiBtcyAoMC0xNSk7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSB0aW1lIGZyb20gYXNzZXJ0aW5nIENMS19SRVEgKGxvdyB0byBoaWdoKSB0byB2YWxpZCBGUkVGIGNsb2NrIG9uIHRoZSBkZXZpY2UgaW5wdXRzCitDbG9ja1ZhbGlkT25XYWtldXAgID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IE9wdGlvbnMgKDA6IFJlZmVyZW5jZSBjbG9jayBub3QgdmFsaWQsIDE6IFJlZmVyZW5jZSBjbG9jayBpcyB2YWxpZCBhbmQgc3RhYmxlKTsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIEZSRUYgY2xvY2sgaXMgdmFsaWQgb24gd2FrZXVwCitUQ1hPX0NsayAgPSAwMSAjIExlbmd0aDogMTsgVW5pdDogQml0X09wdGlvbnM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IDUnYlhYMDAwIDogQml0IDAsMSwyIC0gMDogMTkuMk1IeiwgMTogMjZNSHosIDI6IDM4LjRNSHogIFtEZWZhdWx0XSwgMzogNTJNSHosIDQ6IDE2LjM2OE1oeiwgNTogMzIuNzM2IE1oeiAKK1RDWE9fU2V0dGxpbmdUaW1lICA9IDA1ICMgTGVuZ3RoOiAxOyBVbml0OiBtcyAoMC0xNSk7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSB0aW1lIGZyb20gYXNzZXJ0aW5nIENMS19SRVEgKGxvdyB0byBoaWdoKSB0byB2YWxpZCBUQ1hPIGNsb2NrIG9uIHRoZSBkZXZpY2UgaW5wdXRzCitUQ1hPX0Nsb2NrVmFsaWRPbldha2V1cCAgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogT3B0aW9ucyAoMDogUmVmZXJlbmNlIGNsb2NrIG5vdCB2YWxpZCwgMTogUmVmZXJlbmNlIGNsb2NrIGlzIHZhbGlkIGFuZCBzdGFibGUpOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlciB0aGUgVENYTyBjbG9jayBpcyB2YWxpZCBvbiB3YWtldXAgCitUQ1hPX0xET19Wb2x0YWdlID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IE9wdGlvbnMgKDA6Mi41diwgMToyLjU1diwgMjoyLjZ2KTsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVENYTyBMRE8gVm9sdGFnZSAKK1BsYXRmb3JtX2NvbmZpZ3VyYXRpb24gPSAwMiAjIExlbmd0aDogMTsgVW5pdDogQml0X09wdGlvbnM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXIgOyBDb21tZW50OiBCaXQgMDogTGV2ZWxzaGlmdGVyIHN1cHBvcnQgKDA6IE5vIExTLCAxOiBXaXRoIExTKSwgQml0IDEsMjpDb25maWd1cmUgSU8ncyBbU0RJTy93c3BpXSAoMDAtIDhtQSwgMDEtIDRtQSAoZGVmYXVsdCksIDEwLSA2bUEsIDExIC0gMm1BKSwgQml0IDM6RWVwcm9tICgwLU5vIEVlcHJvbSksIEJpdCA0OiBTRElPIElCIEVuYWJsZSBzeW5jLCBCaXQgNTogU0RJTyBJQiBFbmFibGUgYXN5bmMsIEJpdCA2OiBTRElPIElCIEVuYWJsZSBCbG9ja01vZGUsIEJpdCA3OiBTRElPIEhpZ2gtU3BlZWQgc3VwcG9ydAorU2luZ2xlX0R1YWxfQmFuZF9Tb2x1dGlvbiAgPSAwMSAjIExlbmd0aDogMTsgVW5pdDogT3B0aW9ucyAoMDogMi41diwgMTogMi41NXYsIDI6IDIuNnYpOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIGZpZWxkIG5vdGlmaWVzIHRoZSBGVyB3aGV0aGVyIHRoZSBzb2x1dGlvbiBpcyBhIHNpbmdsZS1iYW5kIG9yIGR1YWwtYmFuZAorU2V0dGluZ3MgID0gMDAgMDAgMDAgMDAgIyBMZW5ndGg6IDQ7IFVuaXQ6IEJpdF9PcHRpb25zOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBCaXQwOiBOQkkgKDA6IE9mZiwgMTogT24pLCBCaXQxOiBUZWxlYyBjaGFubmVsIDE0ICgwOiBPZmYsIDE6IE9uKSwgQml0MjogRkVNMC1MQiwgQml0MzogRkVNMC1IQiwgQml0NDogRkVNMS1MQiwgQml0NTogRkVNMS1IQiAtIFRYIEJpUCBsb2FkICgwOiBJbnRlcm5hbCwgMTogRXh0ZXJuYWwpLCBCaXQ2OiBMUEQgTG93IGJhbmQsIEJpdDc6IExQRCBIaWdoIGJhbmQgCitYVEFMSXRyaW1WYWwgPSAwNCAjIExlbmd0aDogMTsgVW5pdDogQ3VycmVudCB0cmltbWluZyBmb3IgWFRBTDsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogQ3VycmVudCB0cmltbWluZyBmb3IgWFRBTAorU1JTdGF0ZSA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBPcHRpb25zICgwOiBEaXNhYmxlZCwgMTogRW5hYmxlZCk7IEZvcm1hdDogRGVjaW1hbDsgU291cmNlOiBUSTsgQ29tbWVudDogU21hcnQgUmVmbGF4IChwcm9wcmlldGFyeSBtZWNoYW5pc20gb2YgVEkgdGhhdCBpZGVudGlmeSB0aGUgc2lsaWNvbiBwcm9jZXNzIHNwZWNpZmljIHBhcmFtcykgc3RhdGUKK1NSRjEgPSAwOSAwNCAxOSAxMCAwOCAwMCBGNyBFRiBFNiBERSAwMCAwMCAwMCAwMCAwRiAzRiAgIyBMZW5ndGg6IDE2OyBVbml0OiBTUkYxIHZhbHVlczsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSB0YWJsZSBob2xkcyB0aGUgc3BlY2lmaWMgcGFyYW1ldGVycyBmb3IgdXNpbmcgdGhlIFNtYXJ0UmVmbGV4IG1lY2hhbmlzbQorU1JGMiA9IDA5IDA0IDE5IDEwIDA4IDAwIEY3IEVGIEU2IERFIDAwIDAwIDAwIDAwIDAwIDAwICAjIExlbmd0aDogMTY7IFVuaXQ6IFNSRjIgdmFsdWVzOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIHRhYmxlIGhvbGRzIHRoZSBzcGVjaWZpYyBwYXJhbWV0ZXJzIGZvciB1c2luZyB0aGUgU21hcnRSZWZsZXggbWVjaGFuaXNtCitTUkYzID0gMDkgMDQgMTkgMTAgMDggMDAgRjcgRUYgRTYgREUgMDAgMDAgMDAgMDAgMDAgMDAgICMgTGVuZ3RoOiAxNjsgVW5pdDogU1JGMyB2YWx1ZXM7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgdGFibGUgaG9sZHMgdGhlIHNwZWNpZmljIHBhcmFtZXRlcnMgZm9yIHVzaW5nIHRoZSBTbWFydFJlZmxleCBtZWNoYW5pc20KKyNTUl9EZWJ1Z19UYWJsZSA9IDA5IDA0IDE5IDEwIDAxIDAwIEY3IEVGIEU2IERFIDAwIDAwIDAwIDAwIDAwIDAwICAjIExlbmd0aDogMTY7IFVuaXQ6IFNSX0RlYnVnX1RhYmxlIHZhbHVlczsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFNSIERlYnVnIHZhbHVlcyCWIGZvciBUSSBpbnRlcm5hbCB1c2Ugb25seQorI1NSX1NFTl9OX1AgPSAxMSAjIExlbmd0aDogMTsgVW5pdDogU1JfU0VOX05fUCB2YWx1ZXM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFNSIERlYnVnIHZhbHVlcyCWIGZvciBUSSBpbnRlcm5hbCB1c2Ugb25seQorI1NSX1NFTl9OX1BfR2FpbiA9IEFBICMgTGVuZ3RoOiAxOyBVbml0OiBTUl9TRU5fTl9QX0dBSU4gdmFsdWVzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBTUiBEZWJ1ZyB2YWx1ZXMgliBmb3IgVEkgaW50ZXJuYWwgdXNlIG9ubHkKKyNTUl9TRU5fTlJOID0gQjYgIyBMZW5ndGg6IDE7IFVuaXQ6IFNSX1NFTl9OUk4gdmFsdWVzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJIDsgQ29tbWVudDogU1IgRGVidWcgdmFsdWVzIJYgZm9yIFRJIGludGVybmFsIHVzZSBvbmx5CisjU1JfU0VOX1BSTiA9IEYwICMgTGVuZ3RoOiAxOyBVbml0OiBTUl9TRU5fUFJOIHZhbHVlczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSSA7IENvbW1lbnQ6IFNSIERlYnVnIHZhbHVlcyCWIGZvciBUSSBpbnRlcm5hbCB1c2Ugb25seQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDEuMjogQmFuZC1kZXBlbmRhbnQgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDEuMi4xOiAyLjRHIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1J4VHJhY2VJbnNlcnRpb25Mb3NzXzJfNEcgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogMS84ZEI7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB0aGUgcHJpbnRlZCBjaXJjdWl0IGJvYXJkIChQQ0IpIHRyYWNlIGluc2VydGlvbiBsb3NzCitUeFRyYWNlTG9zc18yXzRHID0gMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIyBMZW5ndGg6IDE0OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCB0byBhbGlnbiB0aGUgb3V0cHV0IHBvd2VyIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uIG9uIHRoZSBib2FyZAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDEuMi4yOiA1RyBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSeFRyYWNlSW5zZXJ0aW9uTG9zc181RyAgPSAwMCAwMCAwMCAwMCAwMCAwMCAwMCAjIExlbmd0aDogNzsgVW5pdDogMS84ZEI7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB0aGUgcHJpbnRlZCBjaXJjdWl0IGJvYXJkIChQQ0IpIHRyYWNlIGluc2VydGlvbiBsb3NzCitUeFRyYWNlTG9zc181RyAgPSAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAjIExlbmd0aDogMzU7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIGFsaWduIHRoZSBvdXRwdXQgcG93ZXIgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24gb24gdGhlIGJvYXJkCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMjogICAgIEZFTS1kZXBlbmRhbnQgc2VjdGlvbgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDIuMTogICBGRU0gcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRmVtVmVuZG9yQW5kT3B0aW9ucyAgPSAwMSAjIExlbmd0aDogMTsgVW5pdDogQml0X09wdGlvbnM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IEJpdCAwLi4xIC0gMDogUkZNRCwgMTogVFFTLCAyOiBTS1dTLCAgQml0IDQuLjcgW1ZlcnNpb24gY29udHJvbF0gLSAgMDogVFFTLVMxLjAsIDE6IFRRUy1TMi4wLCAyOiBUUVMtUzIuNSwgMzogVFFTLUQxLjAsIDQ6IFRRUy1EMS41LCA1OiBSRk1ELVMxLjUsIDY6IFJGTUQtUzIuOSwgNzogUkZNRC1TMy4wLCA4OiBSRk1ELUQxLjUsIDk6IFJGTUQtUzIuOS41LCAxMDogUkZNRC1EMy4wLjEsIDExOiBUUVMtUzIuNiwgMTI6IFRRUy1EMS43CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMi4xLjE6IDIuNEcgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRkVNMV9UeEJpUFJlZmVyZW5jZVBEdm9sdGFnZV8yXzRHID0gMDFBNyAjIExlbmd0aDogMTsgVW5pdDogMW1WOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBkZWZpbmUgdGhlIHJlZmVyZW5jZSBwb2ludCBvZiB0aGUgRkVNIHBvd2VyIGRldGVjdG9yCitGRU0xX1R4QmlQUmVmZXJlbmNlUG93ZXJfMl80RyAgPSA4MCAjIExlbmd0aDogMTsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBSZWZlcmVuY2Ugb3V0cHV0IHBvd2VyIHRoYXQgcHJvZHVjZXMgZ2l2ZW4gcmVmZXJlbmNlIHBvd2VyIGRldGVjdG9yIG91dHB1dCB2b2x0YWdlIC4gVGhlIFRYIEJpUCByZWZlcmVuY2UgcG93ZXIgaXMgbGlua2VkIHRvIHRoZSBUWCBCaVAgcmVmZXJlbmNlIFBEIHZvbHRhZ2UKK0ZFTTFfVHhCaVBPZmZzZXRkQl8yXzRHID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGZpbmUtdHVuZSB0aGUgVFggQmlQIGJ5IHRoZSBjdXN0b21lcgorRkVNMV9UeFBlclJhdGVQb3dlckxpbWl0c18yXzRHX05vcm1hbCA9IDFEIDFGIDIyIDI2IDI3IDI5IDI1ICMgTGVuZ3RoOiA3OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXBlcmF0dXJlIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX1R4UGVyUmF0ZVBvd2VyTGltaXRzXzJfNEdfRGVncmFkZWQgPSAxRCAxRiAyMiAyNiAyNyAyNyAyNCAjIExlbmd0aDogNzsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wZXJhdHVyZSByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9UeFBlclJhdGVQb3dlckxpbWl0c18yXzRHX0V4dHJlbWUgPSAxNiAxRCAxRSAyMCAyNCAyNSAyMiAjIExlbmd0aDogNzsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wZXJhdHVyZSByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9EZWdyYWRlZExvd1RvTm9ybWFsVGhyXzJfNEcgPSAxRSAjIExlbmd0aDogMTsgVW5pdDogMS8xMCB2b2x0czsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcGVyYXR1cmUgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfTm9ybWFsVG9EZWdyYWRlZEhpZ2hUaHJfMl80RyA9IDJEICMgTGVuZ3RoOiAxOyBVbml0OiAxLzEwIHZvbHRzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wZXJhdHVyZSByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9UeFBlckNoYW5uZWxQb3dlckxpbWl0c18yXzRHXzExYiA9IDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwICMgTGVuZ3RoOiAxNDsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgcHVycG9zZSBvZiB0aGlzIHRhYmxlIGlzIHRvIGFsbG93IGNsaXBwaW5nIG9mIHRoZSBtYXhpbXVtIG91dHB1dCBwb3dlciBvbiBjZXJ0YWluIGNoYW5uZWxzCitGRU0xX1R4UGVyQ2hhbm5lbFBvd2VyTGltaXRzXzJfNEdfT0ZETSA9IDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwICMgTGVuZ3RoOiAxNDsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgcHVycG9zZSBvZiB0aGlzIHRhYmxlIGlzIHRvIGFsbG93IGNsaXBwaW5nIG9mIHRoZSBtYXhpbXVtIG91dHB1dCBwb3dlciBvbiBjZXJ0YWluIGNoYW5uZWxzCitGRU0xX1R4UERWc1JhdGVPZmZzZXRzXzJfNEcgPSAwMSAwMiAwMiAwMiAwMiAwMCAwMiAjIExlbmd0aDogNzsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpcyBhIHBvd2VyIGRldGVjdG9yIG9mZnNldCB2YWx1ZSB1c2VkIHRvIGNvcnJlY3QgdGhlIHBvd2VyIGRldGVjdG9yIGN1cnZlIGZvciBlYWNoIHJhdGUgZ3JvdXAKK0ZFTTFfVHhQRFZzQ2hhbm5lbE9mZnNldHNfMl80RyA9IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICMgTGVuZ3RoOiAxNDsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJL0N1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpcyBhIHBvd2VyIGRldGVjdG9yIG9mZnNldCB2YWx1ZSB1c2VkIHRvIGNvcnJlY3QgdGhlIHBvd2VyIGRldGVjdG9yIGN1cnZlIGZvciBlYWNoIGNoYW5uZWwKK0ZFTTFfVHhQRFZzVGVtcGVyYXR1cmVfMl80RyA9IDAwIDAwICMgTGVuZ3RoOiAyOyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIGEgcG93ZXIgZGV0ZWN0b3Igb2Zmc2V0IHZhbHVlIHVzZWQgdG8gY29ycmVjdCB0aGUgcG93ZXIgZGV0ZWN0b3IgY3VydmUgZm9yIGVhY2ggdGVtcGVydHVyZQorRkVNMV9UeEliaWFzVGFibGVfMl80RyAgPSAxNSAxNSAxNSAxOSAxOSAxNSAxOSAxNSAjIExlbmd0aDogODsgVW5pdDogQ29kZXdvcmQgOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBzZXRzIHRoZSBiaWFzIGN1cnJlbnQgcHJvdmlkZWQgYnkgdGhlIFNvQyB0byB0aGUgUEEgaW4gdGhlIEZFTS4gT3B0aW9ucyAoTUNTNywgNTQvNDgsIDM2LzI0LCAxOC8xMiwgOS82LCAxMWIsIE1DUzAsIDExYkNoMTQpCitGRU0xX1J4RmVtSW5zZXJ0aW9uTG9zc18yXzRHICA9IDEwICMgTGVuZ3RoOiAxOyBVbml0OiAxLzhkQjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSByZWNlaXZlZCBpbnNlcnRpb24gbG9zcyBvZiB0aGUgV0wxMjh4CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMi4xLjI6IDVHIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZFTTFfVHhCaVBSZWZlcmVuY2VQRHZvbHRhZ2VfNUcgID0gMDE3MyAwMTg4IDAxODcgMDE4QiAwMThBIDAxODYgMDE4QyAjIExlbmd0aDogNzsgVW5pdDogMW1WOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBkZWZpbmUgdGhlIHJlZmVyZW5jZSBwb2ludCBvZiB0aGUgRkVNIHBvd2VyIGRldGVjdG9yCitGRU0xX1R4QmlQUmVmZXJlbmNlUG93ZXJfNUcgPSA4MCA4MCA4MCA4MCA4MCA4MCA4MCAjIExlbmd0aDogNzsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBSZWZlcmVuY2Ugb3V0cHV0IHBvd2VyIHRoYXQgcHJvZHVjZXMgZ2l2ZW4gcmVmZXJlbmNlIHBvd2VyIGRldGVjdG9yIG91dHB1dCB2b2x0YWdlIC4gVGhlIFRYIEJpUCByZWZlcmVuY2UgcG93ZXIgaXMgbGlua2VkIHRvIHRoZSBUWCBCaVAgcmVmZXJlbmNlIFBEIHZvbHRhZ2UKK0ZFTTFfVHhCaVBPZmZzZXRkQl81RyA9IDAwIDAwIDAwIDAwIDAwIDAwIDAwICMgTGVuZ3RoOiA3OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgZmllbGQgaXMgdXNlZCB0byBmaW5lLXR1bmUgdGhlIFRYIEJpUCBieSB0aGUgY3VzdG9tZXIKK0ZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfNUdfTm9ybWFsICA9IDFDIDFFIDIxIDIzIDI1IDUwIDI1ICMgTGVuZ3RoOiA3OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXBlcmF0dXJlIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX1R4UGVyUmF0ZVBvd2VyTGltaXRzXzVHX0RlZ3JhZGVkICA9IDE4IDFFIDIxIDIzIDI1IDUwIDI0ICMgTGVuZ3RoOiA3OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXBlcmF0dXJlIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX1R4UGVyUmF0ZVBvd2VyTGltaXRzXzVHX0V4dHJlbWUgPSAxNiAxQyAxRSAyMCAyMCA1MCAxRSAjIExlbmd0aDogNzsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wZXJhdHVyZSByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9EZWdyYWRlZExvd1RvTm9ybWFsVGhyXzVHID0gMUUgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvMTAgdm9sdHM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXBlcmF0dXJlIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX05vcm1hbFRvRGVncmFkZWRIaWdoVGhyXzVHID0gMkQgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvMTAgdm9sdHM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXBlcmF0dXJlIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX1R4UGVyQ2hhbm5lbFBvd2VyTGltaXRzXzVHX09GRE0gID0gNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgIyBMZW5ndGg6IDM1OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBwdXJwb3NlIG9mIHRoaXMgdGFibGUgaXMgdG8gYWxsb3cgY2xpcHBpbmcgb2YgdGhlIG1heGltdW0gb3V0cHV0IHBvd2VyIG9uIGNlcnRhaW4gY2hhbm5lbHMKK0ZFTTFfVHhQRFZzUmF0ZU9mZnNldHNfNUcgID0gMDEgMDIgMDIgMDIgMDIgMDAgMDIgIyBMZW5ndGg6IDc7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaXMgYSBwb3dlciBkZXRlY3RvciBvZmZzZXQgdmFsdWUgdXNlZCB0byBjb3JyZWN0IHRoZSBwb3dlciBkZXRlY3RvciBjdXJ2ZSBmb3IgZWFjaCByYXRlIGdyb3VwCitGRU0xX1R4UERWc0NoYW5uZWxPZmZzZXRzXzVHID0gMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIyBMZW5ndGg6IDM1OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEkvQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIGEgcG93ZXIgZGV0ZWN0b3Igb2Zmc2V0IHZhbHVlIHVzZWQgdG8gY29ycmVjdCB0aGUgcG93ZXIgZGV0ZWN0b3IgY3VydmUgZm9yIGVhY2ggY2hhbm5lbAorRkVNMV9UeFBEVnNUZW1wZXJhdHVyZV81RyA9IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICMgTGVuZ3RoOiAxNDsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpcyBhIHBvd2VyIGRldGVjdG9yIG9mZnNldCB2YWx1ZSB1c2VkIHRvIGNvcnJlY3QgdGhlIHBvd2VyIGRldGVjdG9yIGN1cnZlIGZvciBlYWNoIHRlbXBlcnR1cmUKK0ZFTTFfVHhJYmlhc1RhYmxlXzVHICA9IDEwIDEwIDEwIDEwIDEwIDEwIDEwICMgTGVuZ3RoOiA3OyBVbml0OiBDb2Rld29yZDsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgc2V0cyB0aGUgYmlhcyBjdXJyZW50IHByb3ZpZGVkIGJ5IHRoZSBTb0MgdG8gdGhlIFBBIGluIHRoZSBGRU0KK0ZFTTFfUnhGZW1JbnNlcnRpb25Mb3NzXzVHICA9IDEwIDEwIDEwIDEwIDEwIDEwIDEwICMgTGVuZ3RoOiA3OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSByZWNlaXZlZCBpbnNlcnRpb24gbG9zcyBvZiB0aGUgV0wxMjh4CisKZGlmZiAtLWdpdCBhL21hYzgwMjExL3RpLXV0aWxzL2luaV9maWxlcy8xMjh4L1RRU19EXzEuNy5pbmkgYi9tYWM4MDIxMS90aS11dGlscy9pbmlfZmlsZXMvMTI4eC9UUVNfRF8xLjcuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZiNTkwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9tYWM4MDIxMS90aS11dGlscy9pbmlfZmlsZXMvMTI4eC9UUVNfRF8xLjcuaW5pCkBAIC0wLDAgKzEsODUgQEAKKyMgSU5JIEdlbmVyYXRvciB2ZXJzaW9uIDAuNTsgQWxpZ25lZCB0byBUUyB2ZXJzaW9uIDcuMS4yLjAuMjYKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAxOiAgIE5vbiBGRU0tZGVwZW5kYW50IHNlY3Rpb24KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAxLjE6IEdlbmVyYWwgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVFhCaVBGRU1BdXRvRGV0ZWN0ICA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBPcHRpb25zICgwOiBNYW51YWwgTW9kZSwgMTogQXV0b21hdGljIG1vZGUpOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIGJ5IHRoZSBGVyB0byBkZWNpZGUgaWYgdGhlIGZyb250LWVuZCBpcyBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHkgb3IgbWFudWFsbHkKK1RYQmlQRkVNTWFudWZhY3R1cmVyICA9IDAxICMgTGVuZ3RoOiAxOyBVbml0OiBCaXRfT3B0aW9uczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogQml0MSwwOiB1c2VkIHRvIGRldGVybWluZSB3aGljaCBGRU0gdmVuZG9yIHR5cGUgaXMgdXNlZCBvbiB0aGUgcGxhdGZvcm0gKDA6IFJGTUQsIDE6IFRRUywgMjpTS1csIDM6SFApLCBCaXQzLDI6IHVudXNlZCwgQml0Ny00OkV4dGVybmFsL2ludGVybmFsIGxvYWQgKDQtU0tXIFNCLCA1LVNLVyBIQiwgNi1IUCBTQiwgNy1IUCBIQikKK1JlZkNsayAgPSAwMSAjIExlbmd0aDogMTsgVW5pdDogQml0X09wdGlvbnM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IDUnYlhYMDAwIDogQml0IDAsMSwyIC0gMDogMTkuMk1IeiwgMTogMjZNSHosIDI6IDM4LjRNSHogIFtEZWZhdWx0XSwgMzogNTJNSHosICA0OiAzOC40TUh6IFhUQUwsIDU6IDI2TUh6IFhUQUwgLCAgNSdiWDBYWFggOiBCaXQgMyAtIENMS19SRVEgdHlwZSwgIDAgPSB3aXJlZC1PUiBbRGVmYXVsdF0sIDE9IHB1c2gtcHVsbCAsICA1J2IwWFhYWCA6IEJpdCA0IC0gQ0xLX1JFUSBwb2xhcml0eSwgMCA9IE5vcm1hbCBbRGVmYXVsdF0sIDE9SW52ZXJ0ZWQKK1NldHRsaW5nVGltZSAgPSAwNSAjIExlbmd0aDogMTsgVW5pdDogbXMgKDAtMTUpOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgdGltZSBmcm9tIGFzc2VydGluZyBDTEtfUkVRIChsb3cgdG8gaGlnaCkgdG8gdmFsaWQgRlJFRiBjbG9jayBvbiB0aGUgZGV2aWNlIGlucHV0cworQ2xvY2tWYWxpZE9uV2FrZXVwICA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBPcHRpb25zICgwOiBSZWZlcmVuY2UgY2xvY2sgbm90IHZhbGlkLCAxOiBSZWZlcmVuY2UgY2xvY2sgaXMgdmFsaWQgYW5kIHN0YWJsZSk7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyIHRoZSBGUkVGIGNsb2NrIGlzIHZhbGlkIG9uIHdha2V1cAorVENYT19DbGsgID0gMDEgIyBMZW5ndGg6IDE7IFVuaXQ6IEJpdF9PcHRpb25zOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiA1J2JYWDAwMCA6IEJpdCAwLDEsMiAtIDA6IDE5LjJNSHosIDE6IDI2TUh6LCAyOiAzOC40TUh6ICBbRGVmYXVsdF0sIDM6IDUyTUh6LCA0OiAxNi4zNjhNaHosIDU6IDMyLjczNiBNaHogCitUQ1hPX1NldHRsaW5nVGltZSAgPSAwNSAjIExlbmd0aDogMTsgVW5pdDogbXMgKDAtMTUpOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgdGltZSBmcm9tIGFzc2VydGluZyBDTEtfUkVRIChsb3cgdG8gaGlnaCkgdG8gdmFsaWQgVENYTyBjbG9jayBvbiB0aGUgZGV2aWNlIGlucHV0cworVENYT19DbG9ja1ZhbGlkT25XYWtldXAgID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IE9wdGlvbnMgKDA6IFJlZmVyZW5jZSBjbG9jayBub3QgdmFsaWQsIDE6IFJlZmVyZW5jZSBjbG9jayBpcyB2YWxpZCBhbmQgc3RhYmxlKTsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIFRDWE8gY2xvY2sgaXMgdmFsaWQgb24gd2FrZXVwIAorVENYT19MRE9fVm9sdGFnZSA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBPcHRpb25zICgwOjIuNXYsIDE6Mi41NXYsIDI6Mi42dik7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRDWE8gTERPIFZvbHRhZ2UgCitQbGF0Zm9ybV9jb25maWd1cmF0aW9uID0gMDIgIyBMZW5ndGg6IDE7IFVuaXQ6IEJpdF9PcHRpb25zOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyIDsgQ29tbWVudDogQml0IDA6IExldmVsc2hpZnRlciBzdXBwb3J0ICgwOiBObyBMUywgMTogV2l0aCBMUyksIEJpdCAxLDI6Q29uZmlndXJlIElPJ3MgW1NESU8vd3NwaV0gKDAwLSA4bUEsIDAxLSA0bUEgKGRlZmF1bHQpLCAxMC0gNm1BLCAxMSAtIDJtQSksIEJpdCAzOkVlcHJvbSAoMC1ObyBFZXByb20pLCBCaXQgNDogU0RJTyBJQiBFbmFibGUgc3luYywgQml0IDU6IFNESU8gSUIgRW5hYmxlIGFzeW5jLCBCaXQgNjogU0RJTyBJQiBFbmFibGUgQmxvY2tNb2RlLCBCaXQgNzogU0RJTyBIaWdoLVNwZWVkIHN1cHBvcnQKK1NpbmdsZV9EdWFsX0JhbmRfU29sdXRpb24gID0gMDEgIyBMZW5ndGg6IDE7IFVuaXQ6IE9wdGlvbnMgKDA6IDIuNXYsIDE6IDIuNTV2LCAyOiAyLjZ2KTsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBmaWVsZCBub3RpZmllcyB0aGUgRlcgd2hldGhlciB0aGUgc29sdXRpb24gaXMgYSBzaW5nbGUtYmFuZCBvciBkdWFsLWJhbmQKK1NldHRpbmdzICA9IDAwIDAwIDAwIDAwICMgTGVuZ3RoOiA0OyBVbml0OiBCaXRfT3B0aW9uczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogQml0MDogTkJJICgwOiBPZmYsIDE6IE9uKSwgQml0MTogVGVsZWMgY2hhbm5lbCAxNCAoMDogT2ZmLCAxOiBPbiksIEJpdDI6IEZFTTAtTEIsIEJpdDM6IEZFTTAtSEIsIEJpdDQ6IEZFTTEtTEIsIEJpdDU6IEZFTTEtSEIgLSBUWCBCaVAgbG9hZCAoMDogSW50ZXJuYWwsIDE6IEV4dGVybmFsKSwgQml0NjogTFBEIExvdyBiYW5kLCBCaXQ3OiBMUEQgSGlnaCBiYW5kIAorWFRBTEl0cmltVmFsID0gMDQgIyBMZW5ndGg6IDE7IFVuaXQ6IEN1cnJlbnQgdHJpbW1pbmcgZm9yIFhUQUw7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IEN1cnJlbnQgdHJpbW1pbmcgZm9yIFhUQUwKK1NSU3RhdGUgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogT3B0aW9ucyAoMDogRGlzYWJsZWQsIDE6IEVuYWJsZWQpOyBGb3JtYXQ6IERlY2ltYWw7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFNtYXJ0IFJlZmxheCAocHJvcHJpZXRhcnkgbWVjaGFuaXNtIG9mIFRJIHRoYXQgaWRlbnRpZnkgdGhlIHNpbGljb24gcHJvY2VzcyBzcGVjaWZpYyBwYXJhbXMpIHN0YXRlCitTUkYxID0gMDkgMDQgMTkgMTAgMDggMDAgRjcgRUYgRTYgREUgMDAgMDAgMDAgMDAgMEYgM0YgICMgTGVuZ3RoOiAxNjsgVW5pdDogU1JGMSB2YWx1ZXM7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgdGFibGUgaG9sZHMgdGhlIHNwZWNpZmljIHBhcmFtZXRlcnMgZm9yIHVzaW5nIHRoZSBTbWFydFJlZmxleCBtZWNoYW5pc20KK1NSRjIgPSAwOSAwNCAxOSAxMCAwOCAwMCBGNyBFRiBFNiBERSAwMCAwMCAwMCAwMCAwMCAwMCAgIyBMZW5ndGg6IDE2OyBVbml0OiBTUkYyIHZhbHVlczsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSB0YWJsZSBob2xkcyB0aGUgc3BlY2lmaWMgcGFyYW1ldGVycyBmb3IgdXNpbmcgdGhlIFNtYXJ0UmVmbGV4IG1lY2hhbmlzbQorU1JGMyA9IDA5IDA0IDE5IDEwIDA4IDAwIEY3IEVGIEU2IERFIDAwIDAwIDAwIDAwIDAwIDAwICAjIExlbmd0aDogMTY7IFVuaXQ6IFNSRjMgdmFsdWVzOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIHRhYmxlIGhvbGRzIHRoZSBzcGVjaWZpYyBwYXJhbWV0ZXJzIGZvciB1c2luZyB0aGUgU21hcnRSZWZsZXggbWVjaGFuaXNtCisjU1JfRGVidWdfVGFibGUgPSAwOSAwNCAxOSAxMCAwMSAwMCBGNyBFRiBFNiBERSAwMCAwMCAwMCAwMCAwMCAwMCAgIyBMZW5ndGg6IDE2OyBVbml0OiBTUl9EZWJ1Z19UYWJsZSB2YWx1ZXM7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBTUiBEZWJ1ZyB2YWx1ZXMgliBmb3IgVEkgaW50ZXJuYWwgdXNlIG9ubHkKKyNTUl9TRU5fTl9QID0gMTEgIyBMZW5ndGg6IDE7IFVuaXQ6IFNSX1NFTl9OX1AgdmFsdWVzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBTUiBEZWJ1ZyB2YWx1ZXMgliBmb3IgVEkgaW50ZXJuYWwgdXNlIG9ubHkKKyNTUl9TRU5fTl9QX0dhaW4gPSBBQSAjIExlbmd0aDogMTsgVW5pdDogU1JfU0VOX05fUF9HQUlOIHZhbHVlczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogU1IgRGVidWcgdmFsdWVzIJYgZm9yIFRJIGludGVybmFsIHVzZSBvbmx5CisjU1JfU0VOX05STiA9IEI2ICMgTGVuZ3RoOiAxOyBVbml0OiBTUl9TRU5fTlJOIHZhbHVlczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSSA7IENvbW1lbnQ6IFNSIERlYnVnIHZhbHVlcyCWIGZvciBUSSBpbnRlcm5hbCB1c2Ugb25seQorI1NSX1NFTl9QUk4gPSBGMCAjIExlbmd0aDogMTsgVW5pdDogU1JfU0VOX1BSTiB2YWx1ZXM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEkgOyBDb21tZW50OiBTUiBEZWJ1ZyB2YWx1ZXMgliBmb3IgVEkgaW50ZXJuYWwgdXNlIG9ubHkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAxLjI6IEJhbmQtZGVwZW5kYW50IHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAxLjIuMTogMi40RyBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSeFRyYWNlSW5zZXJ0aW9uTG9zc18yXzRHID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIHByaW50ZWQgY2lyY3VpdCBib2FyZCAoUENCKSB0cmFjZSBpbnNlcnRpb24gbG9zcworVHhUcmFjZUxvc3NfMl80RyA9IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICMgTGVuZ3RoOiAxNDsgVW5pdDogMS84ZEI7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgdG8gYWxpZ24gdGhlIG91dHB1dCBwb3dlciB0byBhIGRpZmZlcmVudCBsb2NhdGlvbiBvbiB0aGUgYm9hcmQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAxLjIuMjogNUcgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUnhUcmFjZUluc2VydGlvbkxvc3NfNUcgID0gMDAgMDAgMDAgMDAgMDAgMDAgMDAgIyBMZW5ndGg6IDc7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIHByaW50ZWQgY2lyY3VpdCBib2FyZCAoUENCKSB0cmFjZSBpbnNlcnRpb24gbG9zcworVHhUcmFjZUxvc3NfNUcgID0gMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIyBMZW5ndGg6IDM1OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCB0byBhbGlnbiB0aGUgb3V0cHV0IHBvd2VyIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uIG9uIHRoZSBib2FyZAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDI6ICAgICBGRU0tZGVwZW5kYW50IHNlY3Rpb24KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAyLjE6ICAgRkVNIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZlbVZlbmRvckFuZE9wdGlvbnMgID0gMDEgIyBMZW5ndGg6IDE7IFVuaXQ6IEJpdF9PcHRpb25zOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBCaXQgMC4uMSAtIDA6IFJGTUQsIDE6IFRRUywgMjogU0tXUywgIEJpdCA0Li43IFtWZXJzaW9uIGNvbnRyb2xdIC0gIDA6IFRRUy1TMS4wLCAxOiBUUVMtUzIuMCwgMjogVFFTLVMyLjUsIDM6IFRRUy1EMS4wLCA0OiBUUVMtRDEuNSwgNTogUkZNRC1TMS41LCA2OiBSRk1ELVMyLjksIDc6IFJGTUQtUzMuMCwgODogUkZNRC1EMS41LCA5OiBSRk1ELVMyLjkuNSwgMTA6IFJGTUQtRDMuMC4xLCAxMTogVFFTLVMyLjYsIDEyOiBUUVMtRDEuNworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDIuMS4xOiAyLjRHIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZFTTFfVHhCaVBSZWZlcmVuY2VQRHZvbHRhZ2VfMl80RyA9IDAxRDkgIyBMZW5ndGg6IDE7IFVuaXQ6IDFtVjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgZGVmaW5lIHRoZSByZWZlcmVuY2UgcG9pbnQgb2YgdGhlIEZFTSBwb3dlciBkZXRlY3RvcgorRkVNMV9UeEJpUFJlZmVyZW5jZVBvd2VyXzJfNEcgID0gODAgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogUmVmZXJlbmNlIG91dHB1dCBwb3dlciB0aGF0IHByb2R1Y2VzIGdpdmVuIHJlZmVyZW5jZSBwb3dlciBkZXRlY3RvciBvdXRwdXQgdm9sdGFnZSAuIFRoZSBUWCBCaVAgcmVmZXJlbmNlIHBvd2VyIGlzIGxpbmtlZCB0byB0aGUgVFggQmlQIHJlZmVyZW5jZSBQRCB2b2x0YWdlCitGRU0xX1R4QmlQT2Zmc2V0ZEJfMl80RyA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgZmllbGQgaXMgdXNlZCB0byBmaW5lLXR1bmUgdGhlIFRYIEJpUCBieSB0aGUgY3VzdG9tZXIKK0ZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfMl80R19Ob3JtYWwgPSAxRCAxRiAyMiAyNiAyNyAyOSAyNSAjIExlbmd0aDogNzsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wZXJhdHVyZSByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9UeFBlclJhdGVQb3dlckxpbWl0c18yXzRHX0RlZ3JhZGVkID0gMUQgMUYgMjIgMjYgMjcgMjcgMjQgIyBMZW5ndGg6IDc7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcGVyYXR1cmUgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfMl80R19FeHRyZW1lID0gMTYgMUQgMUUgMjAgMjQgMjUgMjIgIyBMZW5ndGg6IDc7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcGVyYXR1cmUgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfRGVncmFkZWRMb3dUb05vcm1hbFRocl8yXzRHID0gMUUgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvMTAgdm9sdHM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXBlcmF0dXJlIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX05vcm1hbFRvRGVncmFkZWRIaWdoVGhyXzJfNEcgPSAyRCAjIExlbmd0aDogMTsgVW5pdDogMS8xMCB2b2x0czsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcGVyYXR1cmUgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfVHhQZXJDaGFubmVsUG93ZXJMaW1pdHNfMl80R18xMWIgPSA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCAjIExlbmd0aDogMTQ7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIHB1cnBvc2Ugb2YgdGhpcyB0YWJsZSBpcyB0byBhbGxvdyBjbGlwcGluZyBvZiB0aGUgbWF4aW11bSBvdXRwdXQgcG93ZXIgb24gY2VydGFpbiBjaGFubmVscworRkVNMV9UeFBlckNoYW5uZWxQb3dlckxpbWl0c18yXzRHX09GRE0gPSA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCA1MCAjIExlbmd0aDogMTQ7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIHB1cnBvc2Ugb2YgdGhpcyB0YWJsZSBpcyB0byBhbGxvdyBjbGlwcGluZyBvZiB0aGUgbWF4aW11bSBvdXRwdXQgcG93ZXIgb24gY2VydGFpbiBjaGFubmVscworRkVNMV9UeFBEVnNSYXRlT2Zmc2V0c18yXzRHID0gMDEgMDIgMDIgMDIgMDIgMDAgMDIgIyBMZW5ndGg6IDc7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaXMgYSBwb3dlciBkZXRlY3RvciBvZmZzZXQgdmFsdWUgdXNlZCB0byBjb3JyZWN0IHRoZSBwb3dlciBkZXRlY3RvciBjdXJ2ZSBmb3IgZWFjaCByYXRlIGdyb3VwCitGRU0xX1R4UERWc0NoYW5uZWxPZmZzZXRzXzJfNEcgPSAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAjIExlbmd0aDogMTQ7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSS9DdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaXMgYSBwb3dlciBkZXRlY3RvciBvZmZzZXQgdmFsdWUgdXNlZCB0byBjb3JyZWN0IHRoZSBwb3dlciBkZXRlY3RvciBjdXJ2ZSBmb3IgZWFjaCBjaGFubmVsCitGRU0xX1R4UERWc1RlbXBlcmF0dXJlXzJfNEcgPSAwMCAwMCAjIExlbmd0aDogMjsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpcyBhIHBvd2VyIGRldGVjdG9yIG9mZnNldCB2YWx1ZSB1c2VkIHRvIGNvcnJlY3QgdGhlIHBvd2VyIGRldGVjdG9yIGN1cnZlIGZvciBlYWNoIHRlbXBlcnR1cmUKK0ZFTTFfVHhJYmlhc1RhYmxlXzJfNEcgID0gMTcgMTcgMTcgMWEgMTYgMTcgMWEgMTcgIyBMZW5ndGg6IDg7IFVuaXQ6IENvZGV3b3JkIDsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgc2V0cyB0aGUgYmlhcyBjdXJyZW50IHByb3ZpZGVkIGJ5IHRoZSBTb0MgdG8gdGhlIFBBIGluIHRoZSBGRU0uIE9wdGlvbnMgKE1DUzcsIDU0LzQ4LCAzNi8yNCwgMTgvMTIsIDkvNiwgMTFiLCBNQ1MwLCAxMWJDaDE0KQorRkVNMV9SeEZlbUluc2VydGlvbkxvc3NfMl80RyAgPSAxMCAjIExlbmd0aDogMTsgVW5pdDogMS84ZEI7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcmVjZWl2ZWQgaW5zZXJ0aW9uIGxvc3Mgb2YgdGhlIFdMMTI4eAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTRUNUSU9OIDIuMS4yOiA1RyBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGRU0xX1R4QmlQUmVmZXJlbmNlUER2b2x0YWdlXzVHICA9IDAxOUEgMDFBRSAwMUMyIDAxQ0MgMDFEQiAwMURCIDAxRDEgIyBMZW5ndGg6IDc7IFVuaXQ6IDFtVjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgZGVmaW5lIHRoZSByZWZlcmVuY2UgcG9pbnQgb2YgdGhlIEZFTSBwb3dlciBkZXRlY3RvcgorRkVNMV9UeEJpUFJlZmVyZW5jZVBvd2VyXzVHID0gODAgODAgODAgODAgODAgODAgODAgIyBMZW5ndGg6IDc7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogUmVmZXJlbmNlIG91dHB1dCBwb3dlciB0aGF0IHByb2R1Y2VzIGdpdmVuIHJlZmVyZW5jZSBwb3dlciBkZXRlY3RvciBvdXRwdXQgdm9sdGFnZSAuIFRoZSBUWCBCaVAgcmVmZXJlbmNlIHBvd2VyIGlzIGxpbmtlZCB0byB0aGUgVFggQmlQIHJlZmVyZW5jZSBQRCB2b2x0YWdlCitGRU0xX1R4QmlQT2Zmc2V0ZEJfNUcgPSAwMCAwMCAwMCAwMCAwMCAwMCAwMCAjIExlbmd0aDogNzsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gZmluZS10dW5lIHRoZSBUWCBCaVAgYnkgdGhlIGN1c3RvbWVyCitGRU0xX1R4UGVyUmF0ZVBvd2VyTGltaXRzXzVHX05vcm1hbCAgPSAxQyAxRSAyMSAyMyAyNSA1MCAyNSAjIExlbmd0aDogNzsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wZXJhdHVyZSByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9UeFBlclJhdGVQb3dlckxpbWl0c181R19EZWdyYWRlZCAgPSAxOCAxRSAyMSAyMyAyNSA1MCAyNCAjIExlbmd0aDogNzsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wZXJhdHVyZSByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9UeFBlclJhdGVQb3dlckxpbWl0c181R19FeHRyZW1lID0gMTYgMUMgMUUgMjAgMjAgNTAgMUUgIyBMZW5ndGg6IDc7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcGVyYXR1cmUgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfRGVncmFkZWRMb3dUb05vcm1hbFRocl81RyA9IDFFICMgTGVuZ3RoOiAxOyBVbml0OiAxLzEwIHZvbHRzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wZXJhdHVyZSByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9Ob3JtYWxUb0RlZ3JhZGVkSGlnaFRocl81RyA9IDJEICMgTGVuZ3RoOiAxOyBVbml0OiAxLzEwIHZvbHRzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wZXJhdHVyZSByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9UeFBlckNoYW5uZWxQb3dlckxpbWl0c181R19PRkRNICA9IDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwIDUwICMgTGVuZ3RoOiAzNTsgVW5pdDogMS8yZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGUgcHVycG9zZSBvZiB0aGlzIHRhYmxlIGlzIHRvIGFsbG93IGNsaXBwaW5nIG9mIHRoZSBtYXhpbXVtIG91dHB1dCBwb3dlciBvbiBjZXJ0YWluIGNoYW5uZWxzCitGRU0xX1R4UERWc1JhdGVPZmZzZXRzXzVHICA9IDAxIDAyIDAyIDAyIDAyIDAwIDAyICMgTGVuZ3RoOiA3OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIGEgcG93ZXIgZGV0ZWN0b3Igb2Zmc2V0IHZhbHVlIHVzZWQgdG8gY29ycmVjdCB0aGUgcG93ZXIgZGV0ZWN0b3IgY3VydmUgZm9yIGVhY2ggcmF0ZSBncm91cAorRkVNMV9UeFBEVnNDaGFubmVsT2Zmc2V0c181RyA9IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICMgTGVuZ3RoOiAzNTsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJL0N1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpcyBhIHBvd2VyIGRldGVjdG9yIG9mZnNldCB2YWx1ZSB1c2VkIHRvIGNvcnJlY3QgdGhlIHBvd2VyIGRldGVjdG9yIGN1cnZlIGZvciBlYWNoIGNoYW5uZWwKK0ZFTTFfVHhQRFZzVGVtcGVyYXR1cmVfNUcgPSAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAjIExlbmd0aDogMTQ7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaXMgYSBwb3dlciBkZXRlY3RvciBvZmZzZXQgdmFsdWUgdXNlZCB0byBjb3JyZWN0IHRoZSBwb3dlciBkZXRlY3RvciBjdXJ2ZSBmb3IgZWFjaCB0ZW1wZXJ0dXJlCitGRU0xX1R4SWJpYXNUYWJsZV81RyAgPSAxMCAxMCAxMCAxMCAxMCAxMCAxMCAjIExlbmd0aDogNzsgVW5pdDogQ29kZXdvcmQ7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIHNldHMgdGhlIGJpYXMgY3VycmVudCBwcm92aWRlZCBieSB0aGUgU29DIHRvIHRoZSBQQSBpbiB0aGUgRkVNCitGRU0xX1J4RmVtSW5zZXJ0aW9uTG9zc181RyAgPSAxMCAxMCAxMCAxMCAxMCAxMCAxMCAjIExlbmd0aDogNzsgVW5pdDogMS84ZEI7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcmVjZWl2ZWQgaW5zZXJ0aW9uIGxvc3Mgb2YgdGhlIFdMMTI4eAorCmRpZmYgLS1naXQgYS9tYWM4MDIxMS90aS11dGlscy9pbmlfZmlsZXMvMTI4eC9UUVNfU18yLjYuaW5pIGIvbWFjODAyMTEvdGktdXRpbHMvaW5pX2ZpbGVzLzEyOHgvVFFTX1NfMi42LmluaQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hM2QwZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjODAyMTEvdGktdXRpbHMvaW5pX2ZpbGVzLzEyOHgvVFFTX1NfMi42LmluaQpAQCAtMCwwICsxLDY5IEBACisjIElOSSBHZW5lcmF0b3IgdmVyc2lvbiAwLjU7IEFsaWduZWQgdG8gVFMgdmVyc2lvbiA3LjEuMi4wLjI2CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMTogICBOb24gRkVNLWRlcGVuZGFudCBzZWN0aW9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMS4xOiBHZW5lcmFsIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RYQmlQRkVNQXV0b0RldGVjdCAgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogT3B0aW9ucyAoMDogTWFudWFsIE1vZGUsIDE6IEF1dG9tYXRpYyBtb2RlKTsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCBieSB0aGUgRlcgdG8gZGVjaWRlIGlmIHRoZSBmcm9udC1lbmQgaXMgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5IG9yIG1hbnVhbGx5CitUWEJpUEZFTU1hbnVmYWN0dXJlciAgPSAwMSAjIExlbmd0aDogMTsgVW5pdDogQml0X09wdGlvbnM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IEJpdDEsMDogdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggRkVNIHZlbmRvciB0eXBlIGlzIHVzZWQgb24gdGhlIHBsYXRmb3JtICgwOiBSRk1ELCAxOiBUUVMsIDI6U0tXLCAzOkhQKSwgQml0MywyOiB1bnVzZWQsIEJpdDctNDpFeHRlcm5hbC9pbnRlcm5hbCBsb2FkICg0LVNLVyBTQiwgNS1TS1cgSEIsIDYtSFAgU0IsIDctSFAgSEIpCitSZWZDbGsgID0gMDEgIyBMZW5ndGg6IDE7IFVuaXQ6IEJpdF9PcHRpb25zOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiA1J2JYWDAwMCA6IEJpdCAwLDEsMiAtIDA6IDE5LjJNSHosIDE6IDI2TUh6LCAyOiAzOC40TUh6ICBbRGVmYXVsdF0sIDM6IDUyTUh6LCAgNDogMzguNE1IeiBYVEFMLCA1OiAyNk1IeiBYVEFMICwgIDUnYlgwWFhYIDogQml0IDMgLSBDTEtfUkVRIHR5cGUsICAwID0gd2lyZWQtT1IgW0RlZmF1bHRdLCAxPSBwdXNoLXB1bGwgLCAgNSdiMFhYWFggOiBCaXQgNCAtIENMS19SRVEgcG9sYXJpdHksIDAgPSBOb3JtYWwgW0RlZmF1bHRdLCAxPUludmVydGVkCitTZXR0bGluZ1RpbWUgID0gMDUgIyBMZW5ndGg6IDE7IFVuaXQ6IG1zICgwLTE1KTsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIHRpbWUgZnJvbSBhc3NlcnRpbmcgQ0xLX1JFUSAobG93IHRvIGhpZ2gpIHRvIHZhbGlkIEZSRUYgY2xvY2sgb24gdGhlIGRldmljZSBpbnB1dHMKK0Nsb2NrVmFsaWRPbldha2V1cCAgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogT3B0aW9ucyAoMDogUmVmZXJlbmNlIGNsb2NrIG5vdCB2YWxpZCwgMTogUmVmZXJlbmNlIGNsb2NrIGlzIHZhbGlkIGFuZCBzdGFibGUpOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlciB0aGUgRlJFRiBjbG9jayBpcyB2YWxpZCBvbiB3YWtldXAKK1RDWE9fQ2xrICA9IDAxICMgTGVuZ3RoOiAxOyBVbml0OiBCaXRfT3B0aW9uczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogNSdiWFgwMDAgOiBCaXQgMCwxLDIgLSAwOiAxOS4yTUh6LCAxOiAyNk1IeiwgMjogMzguNE1IeiAgW0RlZmF1bHRdLCAzOiA1Mk1IeiwgNDogMTYuMzY4TWh6LCA1OiAzMi43MzYgTWh6IAorVENYT19TZXR0bGluZ1RpbWUgID0gMDUgIyBMZW5ndGg6IDE7IFVuaXQ6IG1zICgwLTE1KTsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIHRpbWUgZnJvbSBhc3NlcnRpbmcgQ0xLX1JFUSAobG93IHRvIGhpZ2gpIHRvIHZhbGlkIFRDWE8gY2xvY2sgb24gdGhlIGRldmljZSBpbnB1dHMKK1RDWE9fQ2xvY2tWYWxpZE9uV2FrZXVwICA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBPcHRpb25zICgwOiBSZWZlcmVuY2UgY2xvY2sgbm90IHZhbGlkLCAxOiBSZWZlcmVuY2UgY2xvY2sgaXMgdmFsaWQgYW5kIHN0YWJsZSk7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyIHRoZSBUQ1hPIGNsb2NrIGlzIHZhbGlkIG9uIHdha2V1cCAKK1RDWE9fTERPX1ZvbHRhZ2UgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogT3B0aW9ucyAoMDoyLjV2LCAxOjIuNTV2LCAyOjIuNnYpOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUQ1hPIExETyBWb2x0YWdlIAorUGxhdGZvcm1fY29uZmlndXJhdGlvbiA9IDAyICMgTGVuZ3RoOiAxOyBVbml0OiBCaXRfT3B0aW9uczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lciA7IENvbW1lbnQ6IEJpdCAwOiBMZXZlbHNoaWZ0ZXIgc3VwcG9ydCAoMDogTm8gTFMsIDE6IFdpdGggTFMpLCBCaXQgMSwyOkNvbmZpZ3VyZSBJTydzIFtTRElPL3dzcGldICgwMC0gOG1BLCAwMS0gNG1BIChkZWZhdWx0KSwgMTAtIDZtQSwgMTEgLSAybUEpLCBCaXQgMzpFZXByb20gKDAtTm8gRWVwcm9tKSwgQml0IDQ6IFNESU8gSUIgRW5hYmxlIHN5bmMsIEJpdCA1OiBTRElPIElCIEVuYWJsZSBhc3luYywgQml0IDY6IFNESU8gSUIgRW5hYmxlIEJsb2NrTW9kZSwgQml0IDc6IFNESU8gSGlnaC1TcGVlZCBzdXBwb3J0CitTaW5nbGVfRHVhbF9CYW5kX1NvbHV0aW9uICA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiBPcHRpb25zICgwOiAyLjV2LCAxOiAyLjU1diwgMjogMi42dik7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgZmllbGQgbm90aWZpZXMgdGhlIEZXIHdoZXRoZXIgdGhlIHNvbHV0aW9uIGlzIGEgc2luZ2xlLWJhbmQgb3IgZHVhbC1iYW5kCitTZXR0aW5ncyAgPSAwMCAwMCAwMCAwMCAjIExlbmd0aDogNDsgVW5pdDogQml0X09wdGlvbnM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IEJpdDA6IE5CSSAoMDogT2ZmLCAxOiBPbiksIEJpdDE6IFRlbGVjIGNoYW5uZWwgMTQgKDA6IE9mZiwgMTogT24pLCBCaXQyOiBGRU0wLUxCLCBCaXQzOiBGRU0wLUhCLCBCaXQ0OiBGRU0xLUxCLCBCaXQ1OiBGRU0xLUhCIC0gVFggQmlQIGxvYWQgKDA6IEludGVybmFsLCAxOiBFeHRlcm5hbCksIEJpdDY6IExQRCBMb3cgYmFuZCwgQml0NzogTFBEIEhpZ2ggYmFuZCAKK1hUQUxJdHJpbVZhbCA9IDA0ICMgTGVuZ3RoOiAxOyBVbml0OiBDdXJyZW50IHRyaW1taW5nIGZvciBYVEFMOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBDdXJyZW50IHRyaW1taW5nIGZvciBYVEFMCitTUlN0YXRlID0gMDAgIyBMZW5ndGg6IDE7IFVuaXQ6IE9wdGlvbnMgKDA6IERpc2FibGVkLCAxOiBFbmFibGVkKTsgRm9ybWF0OiBEZWNpbWFsOyBTb3VyY2U6IFRJOyBDb21tZW50OiBTbWFydCBSZWZsYXggKHByb3ByaWV0YXJ5IG1lY2hhbmlzbSBvZiBUSSB0aGF0IGlkZW50aWZ5IHRoZSBzaWxpY29uIHByb2Nlc3Mgc3BlY2lmaWMgcGFyYW1zKSBzdGF0ZQorU1JGMSA9IDA5IDA0IDE5IDEwIDA4IDAwIEY3IEVGIEU2IERFIDAwIDAwIDAwIDAwIDBGIDNGICAjIExlbmd0aDogMTY7IFVuaXQ6IFNSRjEgdmFsdWVzOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhlIHRhYmxlIGhvbGRzIHRoZSBzcGVjaWZpYyBwYXJhbWV0ZXJzIGZvciB1c2luZyB0aGUgU21hcnRSZWZsZXggbWVjaGFuaXNtCitTUkYyID0gMDkgMDQgMTkgMTAgMDggMDAgRjcgRUYgRTYgREUgMDAgMDAgMDAgMDAgMDAgMDAgICMgTGVuZ3RoOiAxNjsgVW5pdDogU1JGMiB2YWx1ZXM7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgdGFibGUgaG9sZHMgdGhlIHNwZWNpZmljIHBhcmFtZXRlcnMgZm9yIHVzaW5nIHRoZSBTbWFydFJlZmxleCBtZWNoYW5pc20KK1NSRjMgPSAwOSAwNCAxOSAxMCAwOCAwMCBGNyBFRiBFNiBERSAwMCAwMCAwMCAwMCAwMCAwMCAgIyBMZW5ndGg6IDE2OyBVbml0OiBTUkYzIHZhbHVlczsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSB0YWJsZSBob2xkcyB0aGUgc3BlY2lmaWMgcGFyYW1ldGVycyBmb3IgdXNpbmcgdGhlIFNtYXJ0UmVmbGV4IG1lY2hhbmlzbQorI1NSX0RlYnVnX1RhYmxlID0gMDkgMDQgMTkgMTAgMDEgMDAgRjcgRUYgRTYgREUgMDAgMDAgMDAgMDAgMDAgMDAgICMgTGVuZ3RoOiAxNjsgVW5pdDogU1JfRGVidWdfVGFibGUgdmFsdWVzOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogU1IgRGVidWcgdmFsdWVzIJYgZm9yIFRJIGludGVybmFsIHVzZSBvbmx5CisjU1JfU0VOX05fUCA9IDExICMgTGVuZ3RoOiAxOyBVbml0OiBTUl9TRU5fTl9QIHZhbHVlczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogU1IgRGVidWcgdmFsdWVzIJYgZm9yIFRJIGludGVybmFsIHVzZSBvbmx5CisjU1JfU0VOX05fUF9HYWluID0gQUEgIyBMZW5ndGg6IDE7IFVuaXQ6IFNSX1NFTl9OX1BfR0FJTiB2YWx1ZXM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFNSIERlYnVnIHZhbHVlcyCWIGZvciBUSSBpbnRlcm5hbCB1c2Ugb25seQorI1NSX1NFTl9OUk4gPSBCNiAjIExlbmd0aDogMTsgVW5pdDogU1JfU0VOX05STiB2YWx1ZXM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEkgOyBDb21tZW50OiBTUiBEZWJ1ZyB2YWx1ZXMgliBmb3IgVEkgaW50ZXJuYWwgdXNlIG9ubHkKKyNTUl9TRU5fUFJOID0gRjAgIyBMZW5ndGg6IDE7IFVuaXQ6IFNSX1NFTl9QUk4gdmFsdWVzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJIDsgQ29tbWVudDogU1IgRGVidWcgdmFsdWVzIJYgZm9yIFRJIGludGVybmFsIHVzZSBvbmx5CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMS4yOiBCYW5kLWRlcGVuZGFudCBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMS4yLjE6IDIuNEcgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUnhUcmFjZUluc2VydGlvbkxvc3NfMl80RyA9IDAwICMgTGVuZ3RoOiAxOyBVbml0OiAxLzhkQjsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBwcmludGVkIGNpcmN1aXQgYm9hcmQgKFBDQikgdHJhY2UgaW5zZXJ0aW9uIGxvc3MKK1R4VHJhY2VMb3NzXzJfNEcgPSAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAjIExlbmd0aDogMTQ7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIGFsaWduIHRoZSBvdXRwdXQgcG93ZXIgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24gb24gdGhlIGJvYXJkCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMS4yLjI6IDVHIHBhcmFtZXRlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAyOiAgICAgRkVNLWRlcGVuZGFudCBzZWN0aW9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNFQ1RJT04gMi4xOiAgIEZFTSBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGZW1WZW5kb3JBbmRPcHRpb25zICA9IDAxICMgTGVuZ3RoOiAxOyBVbml0OiBCaXRfT3B0aW9uczsgRm9ybWF0OiBVbnNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogQml0IDAuLjEgLSAwOiBSRk1ELCAxOiBUUVMsIDI6IFNLV1MsICBCaXQgNC4uNyBbVmVyc2lvbiBjb250cm9sXSAtICAwOiBUUVMtUzEuMCwgMTogVFFTLVMyLjAsIDI6IFRRUy1TMi41LCAzOiBUUVMtRDEuMCwgNDogVFFTLUQxLjUsIDU6IFJGTUQtUzEuNSwgNjogUkZNRC1TMi45LCA3OiBSRk1ELVMzLjAsIDg6IFJGTUQtRDEuNSwgOTogUkZNRC1TMi45LjUsIDEwOiBSRk1ELUQzLjAuMSwgMTE6IFRRUy1TMi42LCAxMjogVFFTLUQxLjcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAyLjEuMTogMi40RyBwYXJhbWV0ZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGRU0xX1R4QmlQUmVmZXJlbmNlUER2b2x0YWdlXzJfNEcgPSAwMTc3ICMgTGVuZ3RoOiAxOyBVbml0OiAxbVY7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGRlZmluZSB0aGUgcmVmZXJlbmNlIHBvaW50IG9mIHRoZSBGRU0gcG93ZXIgZGV0ZWN0b3IKK0ZFTTFfVHhCaVBSZWZlcmVuY2VQb3dlcl8yXzRHICA9IDgwICMgTGVuZ3RoOiAxOyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFJlZmVyZW5jZSBvdXRwdXQgcG93ZXIgdGhhdCBwcm9kdWNlcyBnaXZlbiByZWZlcmVuY2UgcG93ZXIgZGV0ZWN0b3Igb3V0cHV0IHZvbHRhZ2UgLiBUaGUgVFggQmlQIHJlZmVyZW5jZSBwb3dlciBpcyBsaW5rZWQgdG8gdGhlIFRYIEJpUCByZWZlcmVuY2UgUEQgdm9sdGFnZQorRkVNMV9UeEJpUE9mZnNldGRCXzJfNEcgPSAwMCAjIExlbmd0aDogMTsgVW5pdDogMS84ZEI7IEZvcm1hdDogU2lnbmVkOyBTb3VyY2U6IEN1c3RvbWVyOyBDb21tZW50OiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gZmluZS10dW5lIHRoZSBUWCBCaVAgYnkgdGhlIGN1c3RvbWVyCitGRU0xX1R4UGVyUmF0ZVBvd2VyTGltaXRzXzJfNEdfTm9ybWFsID0gMUQgMUYgMjIgMjYgMjcgMjkgMjUgIyBMZW5ndGg6IDc7IFVuaXQ6IDEvMmRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBDdXN0b21lcjsgQ29tbWVudDogVGhlIGxpbWl0cyBhcmUgYXBwbGllZCB0byB0aGUgcG93ZXIgY29udHJvbCBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgVkJBVCBhbmQgdGVtcGVyYXR1cmUgcmFuZ2UgaW4gd2hpY2ggdGhlIEZFTSBpcyBvcGVyYXRpbmcKK0ZFTTFfVHhQZXJSYXRlUG93ZXJMaW1pdHNfMl80R19EZWdyYWRlZCA9IDFBIDFGIDIyIDI1IDI1IDI3IDIzICMgTGVuZ3RoOiA3OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXBlcmF0dXJlIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX1R4UGVyUmF0ZVBvd2VyTGltaXRzXzJfNEdfRXh0cmVtZSA9IDE2IDFEIDFFIDIwIDI0IDI1IDIyICMgTGVuZ3RoOiA3OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXBlcmF0dXJlIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX0RlZ3JhZGVkTG93VG9Ob3JtYWxUaHJfMl80RyA9IDFFICMgTGVuZ3RoOiAxOyBVbml0OiAxLzEwIHZvbHRzOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGUgbGltaXRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwb3dlciBjb250cm9sIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBWQkFUIGFuZCB0ZW1wZXJhdHVyZSByYW5nZSBpbiB3aGljaCB0aGUgRkVNIGlzIG9wZXJhdGluZworRkVNMV9Ob3JtYWxUb0RlZ3JhZGVkSGlnaFRocl8yXzRHID0gMkQgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvMTAgdm9sdHM7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoZSBsaW1pdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBvd2VyIGNvbnRyb2wgcHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIFZCQVQgYW5kIHRlbXBlcmF0dXJlIHJhbmdlIGluIHdoaWNoIHRoZSBGRU0gaXMgb3BlcmF0aW5nCitGRU0xX1R4UGVyQ2hhbm5lbFBvd2VyTGltaXRzXzJfNEdfMTFiID0gNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgIyBMZW5ndGg6IDE0OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBwdXJwb3NlIG9mIHRoaXMgdGFibGUgaXMgdG8gYWxsb3cgY2xpcHBpbmcgb2YgdGhlIG1heGltdW0gb3V0cHV0IHBvd2VyIG9uIGNlcnRhaW4gY2hhbm5lbHMKK0ZFTTFfVHhQZXJDaGFubmVsUG93ZXJMaW1pdHNfMl80R19PRkRNID0gNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgNTAgIyBMZW5ndGg6IDE0OyBVbml0OiAxLzJkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogQ3VzdG9tZXI7IENvbW1lbnQ6IFRoZSBwdXJwb3NlIG9mIHRoaXMgdGFibGUgaXMgdG8gYWxsb3cgY2xpcHBpbmcgb2YgdGhlIG1heGltdW0gb3V0cHV0IHBvd2VyIG9uIGNlcnRhaW4gY2hhbm5lbHMKK0ZFTTFfVHhQRFZzUmF0ZU9mZnNldHNfMl80RyA9IDAxIDAyIDAyIDAyIDAyIDAwIDAyICMgTGVuZ3RoOiA3OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIGEgcG93ZXIgZGV0ZWN0b3Igb2Zmc2V0IHZhbHVlIHVzZWQgdG8gY29ycmVjdCB0aGUgcG93ZXIgZGV0ZWN0b3IgY3VydmUgZm9yIGVhY2ggcmF0ZSBncm91cAorRkVNMV9UeFBEVnNDaGFubmVsT2Zmc2V0c18yXzRHID0gMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIyBMZW5ndGg6IDE0OyBVbml0OiAxLzhkQjsgRm9ybWF0OiBTaWduZWQ7IFNvdXJjZTogVEkvQ3VzdG9tZXI7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIGlzIGEgcG93ZXIgZGV0ZWN0b3Igb2Zmc2V0IHZhbHVlIHVzZWQgdG8gY29ycmVjdCB0aGUgcG93ZXIgZGV0ZWN0b3IgY3VydmUgZm9yIGVhY2ggY2hhbm5lbAorRkVNMV9UeFBEVnNUZW1wZXJhdHVyZV8yXzRHID0gMDAgMDAgIyBMZW5ndGg6IDI7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFNpZ25lZDsgU291cmNlOiBUSTsgQ29tbWVudDogVGhpcyBwYXJhbWV0ZXIgaXMgYSBwb3dlciBkZXRlY3RvciBvZmZzZXQgdmFsdWUgdXNlZCB0byBjb3JyZWN0IHRoZSBwb3dlciBkZXRlY3RvciBjdXJ2ZSBmb3IgZWFjaCB0ZW1wZXJ0dXJlCitGRU0xX1R4SWJpYXNUYWJsZV8yXzRHICA9IDE3IDE3IDE3IDEzIDE3IDE3IDE3IDE3ICMgTGVuZ3RoOiA4OyBVbml0OiBDb2Rld29yZCA7IEZvcm1hdDogVW5zaWduZWQ7IFNvdXJjZTogVEk7IENvbW1lbnQ6IFRoaXMgcGFyYW1ldGVyIHNldHMgdGhlIGJpYXMgY3VycmVudCBwcm92aWRlZCBieSB0aGUgU29DIHRvIHRoZSBQQSBpbiB0aGUgRkVNLiBPcHRpb25zIChNQ1M3LCA1NC80OCwgMzYvMjQsIDE4LzEyLCA5LzYsIDExYiwgTUNTMCwgMTFiQ2gxNCkKK0ZFTTFfUnhGZW1JbnNlcnRpb25Mb3NzXzJfNEcgID0gMEUgIyBMZW5ndGg6IDE7IFVuaXQ6IDEvOGRCOyBGb3JtYXQ6IFVuc2lnbmVkOyBTb3VyY2U6IFRJOyBDb21tZW50OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHJlY2VpdmVkIGluc2VydGlvbiBsb3NzIG9mIHRoZSBXTDEyOHgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU0VDVElPTiAyLjEuMjogNUcgcGFyYW1ldGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9tYWM4MDIxMS90aS11dGlscy9taXNjX2NtZHMuYyBiL21hYzgwMjExL3RpLXV0aWxzL21pc2NfY21kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMmViYzYKLS0tIC9kZXYvbnVsbAorKysgYi9tYWM4MDIxMS90aS11dGlscy9taXNjX2NtZHMuYwpAQCAtMCwwICsxLDQ0MiBAQAorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2luY2x1ZGUgImNhbGlicmF0b3IuaCIKKyNpbmNsdWRlICJwbHQuaCIKKyNpbmNsdWRlICJpbmkuaCIKKyNpbmNsdWRlICJudnMuaCIKKworU0VDVElPTihnZXQpOworU0VDVElPTihzZXQpOworCitzdGF0aWMgaW50IGhhbmRsZV9wdXNoX252cyhzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICBzdHJ1Y3QgbmxfY2IgKmNiLAorICAgICAgICAgICAgc3RydWN0IG5sX21zZyAqbXNnLAorICAgICAgICAgICAgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIHZvaWQgKm1hcCA9IE1BUF9GQUlMRUQ7CisgICAgaW50IGZkLCByZXR2YWwgPSAwOworICAgIHN0cnVjdCBubGF0dHIgKmtleTsKKyAgICBzdHJ1Y3Qgc3RhdCBmaWxlc3RhdDsKKworICAgIGlmIChhcmdjICE9IDEpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgZmQgPSBvcGVuKGFyZ3ZbMF0sIE9fUkRPTkxZKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHBlcnJvcigiRXJyb3Igb3BlbmluZyBmaWxlIGZvciByZWFkaW5nIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmIChmc3RhdChmZCwgJmZpbGVzdGF0KSA8IDApIHsKKyAgICAgICAgcGVycm9yKCJFcnJvciBzdGF0aW5nIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgbWFwID0gbW1hcCgwLCBmaWxlc3RhdC5zdF9zaXplLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIGZkLCAwKTsKKyAgICBpZiAobWFwID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgcGVycm9yKCJFcnJvciBtbWFwcGluZyB0aGUgZmlsZSIpOworICAgICAgICBnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKyAgICB9CisKKyAgICBrZXkgPSBubGFfbmVzdF9zdGFydChtc2csIE5MODAyMTFfQVRUUl9URVNUREFUQSk7CisgICAgaWYgKCFrZXkpIHsKKyAgICAgICAgZ290byBubGFfcHV0X2ZhaWx1cmU7CisgICAgfQorCisgICAgTkxBX1BVVF9VMzIobXNnLCBXTDEyNzFfVE1fQVRUUl9DTURfSUQsIFdMMTI3MV9UTV9DTURfTlZTX1BVU0gpOworICAgIE5MQV9QVVQobXNnLCBXTDEyNzFfVE1fQVRUUl9EQVRBLCBmaWxlc3RhdC5zdF9zaXplLCBtYXApOworCisgICAgbmxhX25lc3RfZW5kKG1zZywga2V5KTsKKworICAgIGdvdG8gY2xlYW51cDsKKworbmxhX3B1dF9mYWlsdXJlOgorICAgIHJldHZhbCA9IC1FTk9CVUZTOworCitjbGVhbnVwOgorICAgIGlmIChtYXAgIT0gTUFQX0ZBSUxFRCkgeworICAgICAgICBtdW5tYXAobWFwLCBmaWxlc3RhdC5zdF9zaXplKTsKKyAgICB9CisKKyAgICBjbG9zZShmZCk7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitDT01NQU5EKHNldCwgcHVzaF9udnMsICI8bnZzIGZpbGVuYW1lPiIsCisgICAgTkw4MDIxMV9DTURfVEVTVE1PREUsIDAsIENJQl9QSFksIGhhbmRsZV9wdXNoX252cywKKyAgICAiUHVzaCBOVlMgZmlsZSBpbnRvIHRoZSBzeXN0ZW0iKTsKKworI2lmIDAKK3N0YXRpYyBpbnQgaGFuZGxlX2ZldGNoX252cyhzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICBzdHJ1Y3QgbmxfY2IgKmNiLAorICAgICAgICAgICAgc3RydWN0IG5sX21zZyAqbXNnLAorICAgICAgICAgICAgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGNoYXIgKmVuZDsKKyAgICB2b2lkICptYXAgPSBNQVBfRkFJTEVEOworICAgIGludCBmZCwgcmV0dmFsID0gMDsKKyAgICBzdHJ1Y3QgbmxhdHRyICprZXk7CisgICAgc3RydWN0IHN0YXQgZmlsZXN0YXQ7CisKKyAgICBpZiAoYXJnYyAhPSAwKQorICAgICAgICByZXR1cm4gMTsKKworICAgIGtleSA9IG5sYV9uZXN0X3N0YXJ0KG1zZywgTkw4MDIxMV9BVFRSX1RFU1REQVRBKTsKKyAgICBpZiAoIWtleSkKKyAgICAgICAgZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKyAgICBOTEFfUFVUX1UzMihtc2csIFdMMTI3MV9UTV9BVFRSX0NNRF9JRCwgV0wxMjcxX1RNX0NNRF9OVlNfUFVTSCk7CisgICAgTkxBX1BVVF9VMzIobXNnLCBXTDEyNzFfVE1fQVRUUl9JRV9JRCwgV0wxMjcxX1RNX0NNRF9OVlNfUFVTSCk7CisKKyAgICBubGFfbmVzdF9lbmQobXNnLCBrZXkpOworCisgICAgZ290byBjbGVhbnVwOworCitubGFfcHV0X2ZhaWx1cmU6CisgICAgcmV0dmFsID0gLUVOT0JVRlM7CisKK2NsZWFudXA6CisgICAgaWYgKG1hcCAhPSBNQVBfRkFJTEVEKQorICAgICAgICBtdW5tYXAobWFwLCBmaWxlc3RhdC5zdF9zaXplKTsKKworICAgIGNsb3NlKGZkKTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKK0NPTU1BTkQoc2V0LCBmZXRjaF9udnMsIE5VTEwsCisgICAgTkw4MDIxMV9DTURfVEVTVE1PREUsIDAsIENJQl9ORVRERVYsIGhhbmRsZV9mZXRjaF9udnMsCisgICAgIlNlbmQgY29tbWFuZCB0byBmZXRjaCBOVlMgZmlsZSIpOworI2VuZGlmCitzdGF0aWMgaW50IGdldF9udnNfbWFjKHN0cnVjdCBubDgwMjExX3N0YXRlICpzdGF0ZSwgc3RydWN0IG5sX2NiICpjYiwKKyAgICAgICAgICAgIHN0cnVjdCBubF9tc2cgKm1zZywgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIHVuc2lnbmVkIGNoYXIgbWFjX2J1ZmZbMTJdOworICAgIGludCBmZDsKKworICAgIGFyZ2MgLT0gMjsKKyAgICBhcmd2ICs9IDI7CisKKyAgICBpZiAoYXJnYyAhPSAxKSB7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKworICAgIGZkID0gb3Blbihhcmd2WzBdLCBPX1JET05MWSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBwZXJyb3IoIkVycm9yIG9wZW5pbmcgZmlsZSBmb3IgcmVhZGluZyIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZWFkKGZkLCBtYWNfYnVmZiwgMTIpOworCisgICAgcHJpbnRmKCJNQUMgYWRkciBmcm9tIE5WUzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgIG1hY19idWZmWzExXSwgbWFjX2J1ZmZbMTBdLCBtYWNfYnVmZls2XSwKKyAgICAgICAgbWFjX2J1ZmZbNV0sIG1hY19idWZmWzRdLCBtYWNfYnVmZlszXSk7CisKKyAgICBjbG9zZShmZCk7CisKKyAgICByZXR1cm4gMDsKK30KKworQ09NTUFORChnZXQsIG52c19tYWMsICI8bnZzIGZpbGVuYW1lPiIsIDAsIDAsIENJQl9OT05FLCBnZXRfbnZzX21hYywKKyAgICAiR2V0IE1BQyBhZGRyIGZyb20gTlZTIGZpbGUgKG9mZmxpbmUpIik7CisKKy8qCisgKiBTZXRzIE1BQyBhZGRyZXNzIGluIE5WUy4KKyAqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBNQUMgaXMgcmFuZG9tIHdoZXJlIDEgYnl0ZSB6ZXJvLgorICovCitzdGF0aWMgaW50IHNldF9udnNfbWFjKHN0cnVjdCBubDgwMjExX3N0YXRlICpzdGF0ZSwgc3RydWN0IG5sX2NiICpjYiwKKyAgICAgICAgICAgIHN0cnVjdCBubF9tc2cgKm1zZywgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIHVuc2lnbmVkIGNoYXIgbWFjX2J1ZmZbMTJdOworICAgIHVuc2lnbmVkIGNoYXIgaW5fbWFjWzZdOworICAgIGludCBmZDsKKworICAgIGFyZ2MgLT0gMjsKKyAgICBhcmd2ICs9IDI7CisKKyAgICBpZiAoYXJnYyA8IDEgfHwgKGFyZ2MgPT0gMiAmJiAoc3RybGVuKGFyZ3ZbMV0pICE9IDE3KSkpIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgaWYgKGFyZ2MgPT0gMikgeworICAgICAgICBzc2NhbmYoYXJndlsxXSwgIiUyeDolMng6JTJ4OiUyeDolMng6JTJ4IiwKKyAgICAgICAgKHVuc2lnbmVkIGludCAqKSZpbl9tYWNbMF0sICh1bnNpZ25lZCBpbnQgKikmaW5fbWFjWzFdLAorICAgICAgICAodW5zaWduZWQgaW50ICopJmluX21hY1syXSwgKHVuc2lnbmVkIGludCAqKSZpbl9tYWNbM10sCisgICAgICAgICh1bnNpZ25lZCBpbnQgKikmaW5fbWFjWzRdLCAodW5zaWduZWQgaW50ICopJmluX21hY1s1XSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3JhbmQoKHVuc2lnbmVkKXRpbWUoTlVMTCkpOworCisgICAgICAgIGluX21hY1swXSA9IDB4MDsKKyAgICAgICAgaW5fbWFjWzFdID0gcmFuZCgpJTI1NjsKKyAgICAgICAgaW5fbWFjWzJdID0gcmFuZCgpJTI1NjsKKyAgICAgICAgaW5fbWFjWzNdID0gcmFuZCgpJTI1NjsKKyAgICAgICAgaW5fbWFjWzRdID0gcmFuZCgpJTI1NjsKKyAgICAgICAgaW5fbWFjWzVdID0gcmFuZCgpJTI1NjsKKyAgICB9CisKKyAgICBmZCA9IG9wZW4oYXJndlswXSwgT19SRFdSKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHBlcnJvcigiRXJyb3Igb3BlbmluZyBmaWxlIGZvciByZWFkaW5nIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJlYWQoZmQsIG1hY19idWZmLCAxMik7CisjaWYgMAorICAgIHByaW50ZigiR290IE1BQyBhZGRyIGZvciBOVlM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICBpbl9tYWNbMF0sIGluX21hY1sxXSwgaW5fbWFjWzJdLAorICAgICAgICBpbl9tYWNbM10sIGluX21hY1s0XSwgaW5fbWFjWzVdKTsKKworICAgIHByaW50ZigiR290IE1BQyBhZGRyIGZyb20gTlZTOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgbWFjX2J1ZmZbMTFdLCBtYWNfYnVmZlsxMF0sIG1hY19idWZmWzZdLAorICAgICAgICBtYWNfYnVmZls1XSwgbWFjX2J1ZmZbNF0sIG1hY19idWZmWzNdKTsKKyNlbmRpZgorICAgIG1hY19idWZmWzExXSA9IGluX21hY1swXTsKKyAgICBtYWNfYnVmZlsxMF0gPSBpbl9tYWNbMV07CisgICAgbWFjX2J1ZmZbNl0gID0gaW5fbWFjWzJdOworICAgIG1hY19idWZmWzVdICA9IGluX21hY1szXTsKKyAgICBtYWNfYnVmZls0XSAgPSBpbl9tYWNbNF07CisgICAgbWFjX2J1ZmZbM10gID0gaW5fbWFjWzVdOworCisgICAgbHNlZWsoZmQsIDBMLCAwKTsKKworICAgIHdyaXRlKGZkLCBtYWNfYnVmZiwgMTIpOworCisgICAgY2xvc2UoZmQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0NPTU1BTkQoc2V0LCBudnNfbWFjLCAiPG52cyBmaWxlPiBbPG1hYyBhZGRyPl0iLCAwLCAwLCBDSUJfTk9ORSwgc2V0X252c19tYWMsCisgICAgIlNldCBNQUMgYWRkciBpbiBOVlMgZmlsZSAob2ZmbGluZSksIGxpa2UgWFg6WFg6WFg6WFg6WFg6WFgiKTsKKworc3RhdGljIGludCBzZXRfcmVmX252cyhzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBubF9jYiAqY2IsCisgICAgICAgICAgICBzdHJ1Y3QgbmxfbXNnICptc2csIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBzdHJ1Y3Qgd2wxMnh4X2NvbW1vbiBjbW4gPSB7CisgICAgICAgIC5hcmNoID0gVU5LTk9XTl9BUkNILAorICAgICAgICAucGFyc2Vfb3BzID0gTlVMTCwKKyAgICAgICAgLmR1YWxfbW9kZSA9IERVQUxfTU9ERV9VTlNFVCwKKyAgICAgICAgLmRvbmVfZmVtID0gTk9fRkVNX1BBUlNFRAorICAgIH07CisKKyAgICBhcmdjIC09IDI7CisgICAgYXJndiArPSAyOworCisgICAgaWYgKGFyZ2MgIT0gMSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAocmVhZF9pbmkoKmFyZ3YsICZjbW4pKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbCB0byByZWFkIGluaSBmaWxlXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgY2ZnX252c19vcHMoJmNtbik7CisKKyAgICBpZiAoY3JlYXRlX252c19maWxlKCZjbW4pKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbCB0byBjcmVhdGUgcmVmZXJlbmNlIE5WUyBmaWxlXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorI2lmIDAKKyAgICBwcmludGYoIlxuXHRUaGUgTlZTIGZpbGUgKCVzKSBpcyByZWFkeVxuXHRDb3B5IGl0IHRvICVzIGFuZCAiCisgICAgICAgICJyZWJvb3QgdGhlIHN5c3RlbVxuXG4iLAorICAgICAgICBORVdfTlZTX05BTUUsIENVUlJFTlRfTlZTX05BTUUpOworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK0NPTU1BTkQoc2V0LCByZWZfbnZzLCAiPGluaSBmaWxlPiIsIDAsIDAsIENJQl9OT05FLCBzZXRfcmVmX252cywKKyAgICAiQ3JlYXRlIHJlZmVyZW5jZSBOVlMgZmlsZSIpOworCitzdGF0aWMgaW50IHNldF9yZWZfbnZzMihzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBubF9jYiAqY2IsCisgICAgICAgICAgICBzdHJ1Y3QgbmxfbXNnICptc2csIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBzdHJ1Y3Qgd2wxMnh4X2NvbW1vbiBjbW4gPSB7CisgICAgICAgIC5hcmNoID0gVU5LTk9XTl9BUkNILAorICAgICAgICAucGFyc2Vfb3BzID0gTlVMTCwKKyAgICAgICAgLmR1YWxfbW9kZSA9IERVQUxfTU9ERV9VTlNFVCwKKyAgICAgICAgLmRvbmVfZmVtID0gTk9fRkVNX1BBUlNFRAorICAgIH07CisKKyAgICBhcmdjIC09IDI7CisgICAgYXJndiArPSAyOworCisgICAgaWYgKGFyZ2MgIT0gMikgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAocmVhZF9pbmkoKmFyZ3YsICZjbW4pKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGFyZ3YrKzsKKyAgICBpZiAocmVhZF9pbmkoKmFyZ3YsICZjbW4pKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGNmZ19udnNfb3BzKCZjbW4pOworCisgICAgaWYgKGNyZWF0ZV9udnNfZmlsZSgmY21uKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWwgdG8gY3JlYXRlIHJlZmVyZW5jZSBOVlMgZmlsZVxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyNpZiAwCisgICAgcHJpbnRmKCJcblx0VGhlIE5WUyBmaWxlICglcykgaXMgcmVhZHlcblx0Q29weSBpdCB0byAlcyBhbmQgIgorICAgICAgICAicmVib290IHRoZSBzeXN0ZW1cblxuIiwKKyAgICAgICAgTkVXX05WU19OQU1FLCBDVVJSRU5UX05WU19OQU1FKTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCitDT01NQU5EKHNldCwgcmVmX252czIsICI8aW5pIGZpbGU+IDxpbmkgZmlsZT4iLCAwLCAwLCBDSUJfTk9ORSwgc2V0X3JlZl9udnMyLAorICAgICJDcmVhdGUgcmVmZXJlbmNlIE5WUyBmaWxlIGZvciAyIEZFTXMiKTsKKworc3RhdGljIGludCBzZXRfdXBkX252cyhzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBubF9jYiAqY2IsCisgICAgc3RydWN0IG5sX21zZyAqbXNnLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgY2hhciAqZm5hbWUgPSBOVUxMOworICAgIHN0cnVjdCB3bDEyeHhfY29tbW9uIGNtbiA9IHsKKyAgICAgICAgLmFyY2ggPSBVTktOT1dOX0FSQ0gsCisgICAgICAgIC5wYXJzZV9vcHMgPSBOVUxMCisgICAgfTsKKworICAgIGFyZ2MgLT0gMjsKKyAgICBhcmd2ICs9IDI7CisKKyAgICBpZiAoYXJnYyA8IDEpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKHJlYWRfaW5pKCphcmd2LCAmY21uKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWwgdG8gcmVhZCBpbmkgZmlsZVxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGNmZ19udnNfb3BzKCZjbW4pOworCisgICAgaWYgKGFyZ2MgPT0gMikgeworICAgICAgICBmbmFtZSA9ICorK2FyZ3Y7CisgICAgfQorCisgICAgaWYgKHVwZGF0ZV9udnNfZmlsZShmbmFtZSwgJmNtbikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsIHRvIHVwZGF0ZSBOVlMgZmlsZVxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyNpZiAwCisgICAgcHJpbnRmKCJcblx0VGhlIHVwZGF0ZWQgTlZTIGZpbGUgKCVzKSBpcyByZWFkeVxuXHRDb3B5IGl0IHRvICVzIGFuZCAiCisgICAgICAgICJyZWJvb3QgdGhlIHN5c3RlbVxuXG4iLCBORVdfTlZTX05BTUUsIENVUlJFTlRfTlZTX05BTUUpOworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK0NPTU1BTkQoc2V0LCB1cGRfbnZzLCAiPGluaSBmaWxlPiBbPG52cyBmaWxlPl0iLCAwLCAwLCBDSUJfTk9ORSwgc2V0X3VwZF9udnMsCisgICAgIlVwZGF0ZSB2YWx1ZXMgb2YgYSBOVlMgZnJvbSBJTkkgZmlsZSIpOworCitzdGF0aWMgaW50IGdldF9kdW1wX252cyhzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBubF9jYiAqY2IsCisgICAgICAgICAgICBzdHJ1Y3QgbmxfbXNnICptc2csIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBjaGFyICpmbmFtZSA9IE5VTEw7CisgICAgc3RydWN0IHdsMTJ4eF9jb21tb24gY21uID0geworICAgICAgICAuYXJjaCA9IFVOS05PV05fQVJDSCwKKyAgICAgICAgLnBhcnNlX29wcyA9IE5VTEwKKyAgICB9OworCisgICAgYXJnYyAtPSAyOworICAgIGFyZ3YgKz0gMjsKKworICAgIGlmIChhcmdjID4gMCkgeworICAgICAgICBmbmFtZSA9ICphcmd2OworICAgIH0KKworICAgIGlmIChkdW1wX252c19maWxlKGZuYW1lLCAmY21uKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWwgdG8gZHVtcCBOVlMgZmlsZVxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitDT01NQU5EKGdldCwgZHVtcF9udnMsICJbPG52cyBmaWxlPl0iLCAwLCAwLCBDSUJfTk9ORSwgZ2V0X2R1bXBfbnZzLAorICAgICJEdW1wIE5WUyBmaWxlLCBzcGVjaWZpZWQgYnkgb3B0aW9uIG9yIGN1cnJlbnQiKTsKKworc3RhdGljIGludCBzZXRfYXV0b2ZlbShzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBubF9jYiAqY2IsCisgICAgICAgICAgICBzdHJ1Y3QgbmxfbXNnICptc2csIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBjaGFyICpmbmFtZSA9IE5VTEw7CisgICAgdW5zaWduZWQgY2hhciB2YWw7CisgICAgc3RydWN0IHdsMTJ4eF9jb21tb24gY21uID0geworICAgICAgICAuYXJjaCA9IFVOS05PV05fQVJDSCwKKyAgICAgICAgLnBhcnNlX29wcyA9IE5VTEwKKyAgICB9OworCisgICAgYXJnYyAtPSAyOworICAgIGFyZ3YgKz0gMjsKKworICAgIGlmIChhcmdjIDwgMSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgYXJndW1lbnRcbiIpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisKKyAgICBzc2NhbmYoYXJndlswXSwgIiUyeCIsICh1bnNpZ25lZCBpbnQgKikmdmFsKTsKKworICAgIGlmIChhcmdjID09IDIpIHsKKyAgICAgICAgZm5hbWUgPSBhcmd2WzFdOworICAgIH0KKworICAgIGlmIChzZXRfbnZzX2ZpbGVfYXV0b2ZlbShmbmFtZSwgdmFsLCAmY21uKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWwgdG8gc2V0IEF1dG9GRU1cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworQ09NTUFORChzZXQsIGF1dG9mZW0sICI8MC1tYW51YWx8MS1hdXRvPiBbPG52cyBmaWxlPl0iLCAwLCAwLCBDSUJfTk9ORSwgc2V0X2F1dG9mZW0sCisgICAgIlNldCBBdXRvIEZFTSBkZXRlY3Rpb24sIHdoZXJlIDAgLSBtYW51YWwsIDEgLSBhdXRvIGRldGVjdGlvbiIpOworCitzdGF0aWMgaW50IHNldF9mZW1fbWFudWYoc3RydWN0IG5sODAyMTFfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgbmxfY2IgKmNiLAorICAgICAgICAgICAgc3RydWN0IG5sX21zZyAqbXNnLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgY2hhciAqZm5hbWUgPSBOVUxMOworICAgIHVuc2lnbmVkIGNoYXIgdmFsOworICAgIHN0cnVjdCB3bDEyeHhfY29tbW9uIGNtbiA9IHsKKyAgICAgICAgLmFyY2ggPSBVTktOT1dOX0FSQ0gsCisgICAgICAgIC5wYXJzZV9vcHMgPSBOVUxMCisgICAgfTsKKworICAgIGFyZ2MgLT0gMjsKKyAgICBhcmd2ICs9IDI7CisKKyAgICBpZiAoYXJnYyA8IDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgc3NjYW5mKGFyZ3ZbMF0sICIlMngiLCAodW5zaWduZWQgaW50ICopJnZhbCk7CisKKyAgICBpZiAoYXJnYyA9PSAyKSB7CisgICAgICAgIGZuYW1lID0gYXJndlsxXTsKKyAgICB9CisKKyAgICBpZiAoc2V0X252c19maWxlX2ZlbV9tYW51ZihmbmFtZSwgdmFsLCAmY21uKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWwgdG8gc2V0IEF1dG9GRU1cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworQ09NTUFORChzZXQsIGZlbV9tYW51ZiwgIjwwfDE+IFs8bnZzIGZpbGU+XSIsIDAsIDAsIENJQl9OT05FLCBzZXRfZmVtX21hbnVmLAorICAgICJTZXQgRkVNIG1hbnVmYWN0dXJlciIpOworCmRpZmYgLS1naXQgYS9tYWM4MDIxMS90aS11dGlscy9ubDgwMjExLmggYi9tYWM4MDIxMS90aS11dGlscy9ubDgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiM2I3ZAotLS0gL2Rldi9udWxsCisrKyBiL21hYzgwMjExL3RpLXV0aWxzL25sODAyMTEuaApAQCAtMCwwICsxLDE0MzQgQEAKKyNpZm5kZWYgX19MSU5VWF9OTDgwMjExX0gKKyNkZWZpbmUgX19MSU5VWF9OTDgwMjExX0gKKy8qCisgKiA4MDIuMTEgbmV0bGluayBpbnRlcmZhY2UgcHVibGljIGhlYWRlcgorICoKKyAqIENvcHlyaWdodCAyMDA2LCAyMDA3LCAyMDA4IEpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CisgKiBDb3B5cmlnaHQgMjAwOCBNaWNoYWVsIFd1IDxmbGFtaW5naWNlQHNvdXJtaWxrLm5ldD4KKyAqIENvcHlyaWdodCAyMDA4IEx1aXMgQ2FybG9zIENvYm8gPGx1aXNjYUBjb3p5Yml0LmNvbT4KKyAqIENvcHlyaWdodCAyMDA4IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgKiBDb3B5cmlnaHQgMjAwOCwgMjAwOSBMdWlzIFIuIFJvZHJpZ3VleiA8bHJvZHJpZ3VlekBhdGhlcm9zLmNvbT4KKyAqIENvcHlyaWdodCAyMDA4IEpvdW5pIE1hbGluZW4gPGpvdW5pLm1hbGluZW5AYXRoZXJvcy5jb20+CisgKiBDb3B5cmlnaHQgMjAwOCBDb2xpbiBNY0NhYmUgPGNvbGluQGNvenliaXQuY29tPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoqCisgKiBET0M6IFN0YXRpb24gaGFuZGxpbmcKKyAqCisgKiBTdGF0aW9ucyBhcmUgYWRkZWQgcGVyIGludGVyZmFjZSwgYnV0IGEgc3BlY2lhbCBjYXNlIGV4aXN0cyB3aXRoIFZMQU4KKyAqIGludGVyZmFjZXMuIFdoZW4gYSBzdGF0aW9uIGlzIGJvdW5kIHRvIGFuIEFQIGludGVyZmFjZSwgaXQgbWF5IGJlIG1vdmVkCisgKiBpbnRvIGEgVkxBTiBpZGVudGlmaWVkIGJ5IGEgVkxBTiBpbnRlcmZhY2UgaW5kZXggKCVOTDgwMjExX0FUVFJfU1RBX1ZMQU4pLgorICogVGhlIHN0YXRpb24gaXMgc3RpbGwgYXNzdW1lZCB0byBiZWxvbmcgdG8gdGhlIEFQIGludGVyZmFjZSBpdCB3YXMgYWRkZWQKKyAqIHRvLgorICoKKyAqIFRPRE86IG5lZWQgbW9yZSBpbmZvPworICovCisKKy8qKgorICogZW51bSBubDgwMjExX2NvbW1hbmRzIC0gc3VwcG9ydGVkIG5sODAyMTEgY29tbWFuZHMKKyAqCisgKiBATkw4MDIxMV9DTURfVU5TUEVDOiB1bnNwZWNpZmllZCBjb21tYW5kIHRvIGNhdGNoIGVycm9ycworICoKKyAqIEBOTDgwMjExX0NNRF9HRVRfV0lQSFk6IHJlcXVlc3QgaW5mb3JtYXRpb24gYWJvdXQgYSB3aXBoeSBvciBkdW1wIHJlcXVlc3QKKyAqICAgdG8gZ2V0IGEgbGlzdCBvZiBhbGwgcHJlc2VudCB3aXBoeXMuCisgKiBATkw4MDIxMV9DTURfU0VUX1dJUEhZOiBzZXQgd2lwaHkgcGFyYW1ldGVycywgbmVlZHMgJU5MODAyMTFfQVRUUl9XSVBIWSBvcgorICogICAlTkw4MDIxMV9BVFRSX0lGSU5ERVg7IGNhbiBiZSB1c2VkIHRvIHNldCAlTkw4MDIxMV9BVFRSX1dJUEhZX05BTUUsCisgKiAgICVOTDgwMjExX0FUVFJfV0lQSFlfVFhRX1BBUkFNUywgJU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRLAorICogICAlTkw4MDIxMV9BVFRSX1dJUEhZX0NIQU5ORUxfVFlQRSwgJU5MODAyMTFfQVRUUl9XSVBIWV9SRVRSWV9TSE9SVCwKKyAqICAgJU5MODAyMTFfQVRUUl9XSVBIWV9SRVRSWV9MT05HLCAlTkw4MDIxMV9BVFRSX1dJUEhZX0ZSQUdfVEhSRVNIT0xELAorICogICBhbmQvb3IgJU5MODAyMTFfQVRUUl9XSVBIWV9SVFNfVEhSRVNIT0xELgorICogQE5MODAyMTFfQ01EX05FV19XSVBIWTogTmV3bHkgY3JlYXRlZCB3aXBoeSwgcmVzcG9uc2UgdG8gZ2V0IHJlcXVlc3QKKyAqICAgb3IgcmVuYW1lIG5vdGlmaWNhdGlvbi4gSGFzIGF0dHJpYnV0ZXMgJU5MODAyMTFfQVRUUl9XSVBIWSBhbmQKKyAqICAgJU5MODAyMTFfQVRUUl9XSVBIWV9OQU1FLgorICogQE5MODAyMTFfQ01EX0RFTF9XSVBIWTogV2lwaHkgZGVsZXRlZC4gSGFzIGF0dHJpYnV0ZXMKKyAqICAgJU5MODAyMTFfQVRUUl9XSVBIWSBhbmQgJU5MODAyMTFfQVRUUl9XSVBIWV9OQU1FLgorICoKKyAqIEBOTDgwMjExX0NNRF9HRVRfSU5URVJGQUNFOiBSZXF1ZXN0IGFuIGludGVyZmFjZSdzIGNvbmZpZ3VyYXRpb247CisgKiAgIGVpdGhlciBhIGR1bXAgcmVxdWVzdCBvbiBhICVOTDgwMjExX0FUVFJfV0lQSFkgb3IgYSBzcGVjaWZpYyBnZXQKKyAqICAgb24gYW4gJU5MODAyMTFfQVRUUl9JRklOREVYIGlzIHN1cHBvcnRlZC4KKyAqIEBOTDgwMjExX0NNRF9TRVRfSU5URVJGQUNFOiBTZXQgdHlwZSBvZiBhIHZpcnR1YWwgaW50ZXJmYWNlLCByZXF1aXJlcworICogICAlTkw4MDIxMV9BVFRSX0lGSU5ERVggYW5kICVOTDgwMjExX0FUVFJfSUZUWVBFLgorICogQE5MODAyMTFfQ01EX05FV19JTlRFUkZBQ0U6IE5ld2x5IGNyZWF0ZWQgdmlydHVhbCBpbnRlcmZhY2Ugb3IgcmVzcG9uc2UKKyAqICAgdG8gJU5MODAyMTFfQ01EX0dFVF9JTlRFUkZBQ0UuIEhhcyAlTkw4MDIxMV9BVFRSX0lGSU5ERVgsCisgKiAgICVOTDgwMjExX0FUVFJfV0lQSFkgYW5kICVOTDgwMjExX0FUVFJfSUZUWVBFIGF0dHJpYnV0ZXMuIENhbiBhbHNvCisgKiAgIGJlIHNlbnQgZnJvbSB1c2Vyc3BhY2UgdG8gcmVxdWVzdCBjcmVhdGlvbiBvZiBhIG5ldyB2aXJ0dWFsIGludGVyZmFjZSwKKyAqICAgdGhlbiByZXF1aXJlcyBhdHRyaWJ1dGVzICVOTDgwMjExX0FUVFJfV0lQSFksICVOTDgwMjExX0FUVFJfSUZUWVBFIGFuZAorICogICAlTkw4MDIxMV9BVFRSX0lGTkFNRS4KKyAqIEBOTDgwMjExX0NNRF9ERUxfSU5URVJGQUNFOiBWaXJ0dWFsIGludGVyZmFjZSB3YXMgZGVsZXRlZCwgaGFzIGF0dHJpYnV0ZXMKKyAqICAgJU5MODAyMTFfQVRUUl9JRklOREVYIGFuZCAlTkw4MDIxMV9BVFRSX1dJUEhZLiBDYW4gYWxzbyBiZSBzZW50IGZyb20KKyAqICAgdXNlcnNwYWNlIHRvIHJlcXVlc3QgZGVsZXRpb24gb2YgYSB2aXJ0dWFsIGludGVyZmFjZSwgdGhlbiByZXF1aXJlcworICogICBhdHRyaWJ1dGUgJU5MODAyMTFfQVRUUl9JRklOREVYLgorICoKKyAqIEBOTDgwMjExX0NNRF9HRVRfS0VZOiBHZXQgc2VxdWVuY2UgY291bnRlciBpbmZvcm1hdGlvbiBmb3IgYSBrZXkgc3BlY2lmaWVkCisgKiAgIGJ5ICVOTDgwMjExX0FUVFJfS0VZX0lEWCBhbmQvb3IgJU5MODAyMTFfQVRUUl9NQUMuCisgKiBATkw4MDIxMV9DTURfU0VUX0tFWTogU2V0IGtleSBhdHRyaWJ1dGVzICVOTDgwMjExX0FUVFJfS0VZX0RFRkFVTFQsCisgKiAgICVOTDgwMjExX0FUVFJfS0VZX0RFRkFVTFRfTUdNVCwgb3IgJU5MODAyMTFfQVRUUl9LRVlfVEhSRVNIT0xELgorICogQE5MODAyMTFfQ01EX05FV19LRVk6IGFkZCBhIGtleSB3aXRoIGdpdmVuICVOTDgwMjExX0FUVFJfS0VZX0RBVEEsCisgKiAgICVOTDgwMjExX0FUVFJfS0VZX0lEWCwgJU5MODAyMTFfQVRUUl9NQUMsICVOTDgwMjExX0FUVFJfS0VZX0NJUEhFUiwKKyAqICAgYW5kICVOTDgwMjExX0FUVFJfS0VZX1NFUSBhdHRyaWJ1dGVzLgorICogQE5MODAyMTFfQ01EX0RFTF9LRVk6IGRlbGV0ZSBhIGtleSBpZGVudGlmaWVkIGJ5ICVOTDgwMjExX0FUVFJfS0VZX0lEWAorICogICBvciAlTkw4MDIxMV9BVFRSX01BQy4KKyAqCisgKiBATkw4MDIxMV9DTURfR0VUX0JFQUNPTjogcmV0cmlldmUgYmVhY29uIGluZm9ybWF0aW9uIChyZXR1cm5lZCBpbiBhCisgKiAgICVOTDgwMjIyX0NNRF9ORVdfQkVBQ09OIG1lc3NhZ2UpCisgKiBATkw4MDIxMV9DTURfU0VUX0JFQUNPTjogc2V0IHRoZSBiZWFjb24gb24gYW4gYWNjZXNzIHBvaW50IGludGVyZmFjZQorICogICB1c2luZyB0aGUgJU5MODAyMTFfQVRUUl9CRUFDT05fSU5URVJWQUwsICVOTDgwMjExX0FUVFJfRFRJTV9QRVJJT0QsCisgKiAgICVOTDgwMjExX0FUVFJfQkVBQ09OX0hFQUQgYW5kICVOTDgwMjExX0FUVFJfQkVBQ09OX1RBSUwgYXR0cmlidXRlcy4KKyAqIEBOTDgwMjExX0NNRF9ORVdfQkVBQ09OOiBhZGQgYSBuZXcgYmVhY29uIHRvIGFuIGFjY2VzcyBwb2ludCBpbnRlcmZhY2UsCisgKiAgIHBhcmFtZXRlcnMgYXJlIGxpa2UgZm9yICVOTDgwMjExX0NNRF9TRVRfQkVBQ09OLgorICogQE5MODAyMTFfQ01EX0RFTF9CRUFDT046IHJlbW92ZSB0aGUgYmVhY29uLCBzdG9wIHNlbmRpbmcgaXQKKyAqCisgKiBATkw4MDIxMV9DTURfR0VUX1NUQVRJT046IEdldCBzdGF0aW9uIGF0dHJpYnV0ZXMgZm9yIHN0YXRpb24gaWRlbnRpZmllZCBieQorICogICAlTkw4MDIxMV9BVFRSX01BQyBvbiB0aGUgaW50ZXJmYWNlIGlkZW50aWZpZWQgYnkgJU5MODAyMTFfQVRUUl9JRklOREVYLgorICogQE5MODAyMTFfQ01EX1NFVF9TVEFUSU9OOiBTZXQgc3RhdGlvbiBhdHRyaWJ1dGVzIGZvciBzdGF0aW9uIGlkZW50aWZpZWQgYnkKKyAqICAgJU5MODAyMTFfQVRUUl9NQUMgb24gdGhlIGludGVyZmFjZSBpZGVudGlmaWVkIGJ5ICVOTDgwMjExX0FUVFJfSUZJTkRFWC4KKyAqIEBOTDgwMjExX0NNRF9ORVdfU1RBVElPTjogQWRkIGEgc3RhdGlvbiB3aXRoIGdpdmVuIGF0dHJpYnV0ZXMgdG8gdGhlCisgKiAgIHRoZSBpbnRlcmZhY2UgaWRlbnRpZmllZCBieSAlTkw4MDIxMV9BVFRSX0lGSU5ERVguCisgKiBATkw4MDIxMV9DTURfREVMX1NUQVRJT046IFJlbW92ZSBhIHN0YXRpb24gaWRlbnRpZmllZCBieSAlTkw4MDIxMV9BVFRSX01BQworICogICBvciwgaWYgbm8gTUFDIGFkZHJlc3MgZ2l2ZW4sIGFsbCBzdGF0aW9ucywgb24gdGhlIGludGVyZmFjZSBpZGVudGlmaWVkCisgKiAgIGJ5ICVOTDgwMjExX0FUVFJfSUZJTkRFWC4KKyAqCisgKiBATkw4MDIxMV9DTURfR0VUX01QQVRIOiBHZXQgbWVzaCBwYXRoIGF0dHJpYnV0ZXMgZm9yIG1lc2ggcGF0aCB0bworICogICBkZXN0aW5hdGlvbiAlTkw4MDIxMV9BVFRSX01BQyBvbiB0aGUgaW50ZXJmYWNlIGlkZW50aWZpZWQgYnkKKyAqICAgJU5MODAyMTFfQVRUUl9JRklOREVYLgorICogQE5MODAyMTFfQ01EX1NFVF9NUEFUSDogIFNldCBtZXNoIHBhdGggYXR0cmlidXRlcyBmb3IgbWVzaCBwYXRoIHRvCisgKiAgIGRlc3RpbmF0aW9uICVOTDgwMjExX0FUVFJfTUFDIG9uIHRoZSBpbnRlcmZhY2UgaWRlbnRpZmllZCBieQorICogICAlTkw4MDIxMV9BVFRSX0lGSU5ERVguCisgKiBATkw4MDIxMV9DTURfTkVXX1BBVEg6IEFkZCBhIG1lc2ggcGF0aCB3aXRoIGdpdmVuIGF0dHJpYnV0ZXMgdG8gdGhlCisgKiAgIHRoZSBpbnRlcmZhY2UgaWRlbnRpZmllZCBieSAlTkw4MDIxMV9BVFRSX0lGSU5ERVguCisgKiBATkw4MDIxMV9DTURfREVMX1BBVEg6IFJlbW92ZSBhIG1lc2ggcGF0aCBpZGVudGlmaWVkIGJ5ICVOTDgwMjExX0FUVFJfTUFDCisgKiAgIG9yLCBpZiBubyBNQUMgYWRkcmVzcyBnaXZlbiwgYWxsIG1lc2ggcGF0aHMsIG9uIHRoZSBpbnRlcmZhY2UgaWRlbnRpZmllZAorICogICBieSAlTkw4MDIxMV9BVFRSX0lGSU5ERVguCisgKiBATkw4MDIxMV9DTURfU0VUX0JTUzogU2V0IEJTUyBhdHRyaWJ1dGVzIGZvciBCU1MgaWRlbnRpZmllZCBieQorICogICAlTkw4MDIxMV9BVFRSX0lGSU5ERVguCisgKgorICogQE5MODAyMTFfQ01EX0dFVF9SRUc6IGFzayB0aGUgd2lyZWxlc3MgY29yZSB0byBzZW5kIHVzIGl0cyBjdXJyZW50bHkgc2V0CisgKiAgIHJlZ3VsYXRvcnkgZG9tYWluLgorICogQE5MODAyMTFfQ01EX1NFVF9SRUc6IFNldCBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluLiBDUkRBIHNlbmRzIHRoaXMgY29tbWFuZAorICogICBhZnRlciBiZWluZyBxdWVyaWVkIGJ5IHRoZSBrZXJuZWwuIENSREEgcmVwbGllcyBieSBzZW5kaW5nIGEgcmVndWxhdG9yeQorICogICBkb21haW4gc3RydWN0dXJlIHdoaWNoIGNvbnNpc3RzIG9mICVOTDgwMjExX0FUVFJfUkVHX0FMUEhBIHNldCB0byBvdXIKKyAqICAgY3VycmVudCBhbHBoYTIgaWYgaXQgZm91bmQgYSBtYXRjaC4gSXQgYWxzbyBwcm92aWRlcworICogICBOTDgwMjExX0FUVFJfUkVHX1JVTEVfRkxBR1MsIGFuZCBhIHNldCBvZiByZWd1bGF0b3J5IHJ1bGVzLiBFYWNoCisgKiAgIHJlZ3VsYXRvcnkgcnVsZSBpcyBhIG5lc3RlZCBzZXQgb2YgYXR0cmlidXRlcyAgZ2l2ZW4gYnkKKyAqICAgJU5MODAyMTFfQVRUUl9SRUdfUlVMRV9GUkVRX1tTVEFSVHxFTkRdIGFuZAorICogICAlTkw4MDIxMV9BVFRSX0ZSRVFfUkFOR0VfTUFYX0JXIHdpdGggYW4gYXR0YWNoZWQgcG93ZXIgcnVsZSBnaXZlbiBieQorICogICAlTkw4MDIxMV9BVFRSX1JFR19SVUxFX1BPV0VSX01BWF9BTlRfR0FJTiBhbmQKKyAqICAgJU5MODAyMTFfQVRUUl9SRUdfUlVMRV9QT1dFUl9NQVhfRUlSUC4KKyAqIEBOTDgwMjExX0NNRF9SRVFfU0VUX1JFRzogYXNrIHRoZSB3aXJlbGVzcyBjb3JlIHRvIHNldCB0aGUgcmVndWxhdG9yeSBkb21haW4KKyAqICAgdG8gdGhlIHRoZSBzcGVjaWZpZWQgSVNPL0lFQyAzMTY2LTEgYWxwaGEyIGNvdW50cnkgY29kZS4gVGhlIGNvcmUgd2lsbAorICogICBzdG9yZSB0aGlzIGFzIGEgdmFsaWQgcmVxdWVzdCBhbmQgdGhlbiBxdWVyeSB1c2Vyc3BhY2UgZm9yIGl0LgorICoKKyAqIEBOTDgwMjExX0NNRF9HRVRfTUVTSF9QQVJBTVM6IEdldCBtZXNoIG5ldHdvcmtpbmcgcHJvcGVydGllcyBmb3IgdGhlCisgKiAgIGludGVyZmFjZSBpZGVudGlmaWVkIGJ5ICVOTDgwMjExX0FUVFJfSUZJTkRFWAorICoKKyAqIEBOTDgwMjExX0NNRF9TRVRfTUVTSF9QQVJBTVM6IFNldCBtZXNoIG5ldHdvcmtpbmcgcHJvcGVydGllcyBmb3IgdGhlCisgKiAgICAgIGludGVyZmFjZSBpZGVudGlmaWVkIGJ5ICVOTDgwMjExX0FUVFJfSUZJTkRFWAorICoKKyAqIEBOTDgwMjExX0NNRF9TRVRfTUdNVF9FWFRSQV9JRTogU2V0IGV4dHJhIElFcyBmb3IgbWFuYWdlbWVudCBmcmFtZXMuIFRoZQorICogICBpbnRlcmZhY2UgaXMgaWRlbnRpZmllZCB3aXRoICVOTDgwMjExX0FUVFJfSUZJTkRFWCBhbmQgdGhlIG1hbmFnZW1lbnQKKyAqICAgZnJhbWUgc3VidHlwZSB3aXRoICVOTDgwMjExX0FUVFJfTUdNVF9TVUJUWVBFLiBUaGUgZXh0cmEgSUUgZGF0YSB0byBiZQorICogICBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgbWFuYWdlbWVudCBmcmFtZSBpcyBzcGVjaWZpZWQgd2l0aAorICogICAlTkw4MDIxMV9BVFRSX0lFLiBJZiB0aGUgY29tbWFuZCBzdWNjZWVkcywgdGhlIHJlcXVlc3RlZCBkYXRhIHdpbGwgYmUKKyAqICAgYWRkZWQgdG8gYWxsIHNwZWNpZmllZCBtYW5hZ2VtZW50IGZyYW1lcyBnZW5lcmF0ZWQgYnkKKyAqICAga2VybmVsL2Zpcm13YXJlL2RyaXZlci4KKyAqICAgTm90ZTogVGhpcyBjb21tYW5kIGhhcyBiZWVuIHJlbW92ZWQgYW5kIGl0IGlzIG9ubHkgcmVzZXJ2ZWQgYXQgdGhpcworICogICBwb2ludCB0byBhdm9pZCByZS11c2luZyBleGlzdGluZyBjb21tYW5kIG51bWJlci4gVGhlIGZ1bmN0aW9uYWxpdHkgdGhpcworICogICBjb21tYW5kIHdhcyBwbGFubmVkIGZvciBoYXMgYmVlbiBwcm92aWRlZCB3aXRoIGNsZWFuZXIgZGVzaWduIHdpdGggdGhlCisgKiAgIG9wdGlvbiB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgSUVzIGluIE5MODAyMTFfQ01EX1RSSUdHRVJfU0NBTiwKKyAqICAgTkw4MDIxMV9DTURfQVVUSEVOVElDQVRFLCBOTDgwMjExX0NNRF9BU1NPQ0lBVEUsCisgKiAgIE5MODAyMTFfQ01EX0RFQVVUSEVOVElDQVRFLCBhbmQgTkw4MDIxMV9DTURfRElTQVNTT0NJQVRFLgorICoKKyAqIEBOTDgwMjExX0NNRF9HRVRfU0NBTjogZ2V0IHNjYW4gcmVzdWx0cworICogQE5MODAyMTFfQ01EX1RSSUdHRVJfU0NBTjogdHJpZ2dlciBhIG5ldyBzY2FuIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMKKyAqIEBOTDgwMjExX0NNRF9ORVdfU0NBTl9SRVNVTFRTOiBzY2FuIG5vdGlmaWNhdGlvbiAoYXMgYSByZXBseSB0bworICogICBOTDgwMjExX0NNRF9HRVRfU0NBTiBhbmQgb24gdGhlICJzY2FuIiBtdWx0aWNhc3QgZ3JvdXApCisgKiBATkw4MDIxMV9DTURfU0NBTl9BQk9SVEVEOiBzY2FuIHdhcyBhYm9ydGVkLCBmb3IgdW5zcGVjaWZpZWQgcmVhc29ucywKKyAqICAgcGFydGlhbCBzY2FuIHJlc3VsdHMgbWF5IGJlIGF2YWlsYWJsZQorICoKKyAqIEBOTDgwMjExX0NNRF9HRVRfU1VSVkVZOiBnZXQgc3VydmV5IHJlc3VscywgZS5nLiBjaGFubmVsIG9jY3VwYXRpb24KKyAqICAgICAgb3Igbm9pc2UgbGV2ZWwKKyAqIEBOTDgwMjExX0NNRF9ORVdfU1VSVkVZX1JFU1VMVFM6IHN1cnZleSBkYXRhIG5vdGlmaWNhdGlvbiAoYXMgYSByZXBseSB0bworICogICBOTDgwMjExX0NNRF9HRVRfU1VSVkVZIGFuZCBvbiB0aGUgInNjYW4iIG11bHRpY2FzdCBncm91cCkKKyAqCisgKiBATkw4MDIxMV9DTURfUkVHX0NIQU5HRTogaW5kaWNhdGVzIHRvIHVzZXJzcGFjZSB0aGUgcmVndWxhdG9yeSBkb21haW4KKyAqICAgaGFzIGJlZW4gY2hhbmdlZCBhbmQgcHJvdmlkZXMgZGV0YWlscyBvZiB0aGUgcmVxdWVzdCBpbmZvcm1hdGlvbgorICogICB0aGF0IGNhdXNlZCB0aGUgY2hhbmdlIHN1Y2ggYXMgd2hvIGluaXRpYXRlZCB0aGUgcmVndWxhdG9yeSByZXF1ZXN0CisgKiAgICglTkw4MDIxMV9BVFRSX1JFR19JTklUSUFUT1IpLCB0aGUgd2lwaHlfaWR4CisgKiAgICglTkw4MDIxMV9BVFRSX1JFR19BTFBIQTIpIG9uIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyBtYWRlIGZyb20gaWYKKyAqICAgdGhlIGluaXRpYXRvciB3YXMgJU5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1VOVFJZX0lFIG9yCisgKiAgICVOTDgwMjExX1JFR0RPTV9TRVRfQllfRFJJVkVSLCB0aGUgdHlwZSBvZiByZWd1bGF0b3J5IGRvbWFpbgorICogICBzZXQgKCVOTDgwMjExX0FUVFJfUkVHX1RZUEUpLCBpZiB0aGUgdHlwZSBvZiByZWd1bGF0b3J5IGRvbWFpbiBpcworICogICAlTkw4MDIxMV9SRUdfVFlQRV9DT1VOVFJZIHRoZSBhbHBoYTIgdG8gd2hpY2ggd2UgaGF2ZSBtb3ZlZCBvbgorICogICB0byAoJU5MODAyMTFfQVRUUl9SRUdfQUxQSEEyKS4KKyAqIEBOTDgwMjExX0NNRF9SRUdfQkVBQ09OX0hJTlQ6IGluZGljYXRlcyB0byB1c2Vyc3BhY2UgdGhhdCBhbiBBUCBiZWFjb24KKyAqICAgaGFzIGJlZW4gZm91bmQgd2hpbGUgd29ybGQgcm9hbWluZyB0aHVzIGVuYWJsaW5nIGFjdGl2ZSBzY2FuIG9yCisgKiAgIGFueSBtb2RlIG9mIG9wZXJhdGlvbiB0aGF0IGluaXRpYXRlcyBUWCAoYmVhY29ucykgb24gYSBjaGFubmVsCisgKiAgIHdoZXJlIHdlIHdvdWxkIG5vdCBoYXZlIGJlZW4gYWJsZSB0byBkbyBlaXRoZXIgYmVmb3JlLiBBcyBhbiBleGFtcGxlCisgKiAgIGlmIHlvdSBhcmUgd29ybGQgcm9hbWluZyAocmVndWxhdG9yeSBkb21haW4gc2V0IHRvIHdvcmxkIG9yIGlmIHlvdXIKKyAqICAgZHJpdmVyIGlzIHVzaW5nIGEgY3VzdG9tIHdvcmxkIHJvYW1pbmcgcmVndWxhdG9yeSBkb21haW4pIGFuZCB3aGlsZQorICogICBkb2luZyBhIHBhc3NpdmUgc2NhbiBvbiB0aGUgNSBHSHogYmFuZCB5b3UgZmluZCBhbiBBUCB0aGVyZSAoaWYgbm90CisgKiAgIG9uIGEgREZTIGNoYW5uZWwpIHlvdSB3aWxsIG5vdyBiZSBhYmxlIHRvIGFjdGl2ZWx5IHNjYW4gZm9yIHRoYXQgQVAKKyAqICAgb3IgdXNlIEFQIG1vZGUgb24geW91ciBjYXJkIG9uIHRoYXQgc2FtZSBjaGFubmVsLiBOb3RlIHRoYXQgdGhpcyB3aWxsCisgKiAgIG5ldmVyIGJlIHVzZWQgZm9yIGNoYW5uZWxzIDEtMTEgb24gdGhlIDIgR0h6IGJhbmQgYXMgdGhleSBhcmUgYWx3YXlzCisgKiAgIGVuYWJsZWQgd29ybGQgd2lkZS4gVGhpcyBiZWFjb24gaGludCBpcyBvbmx5IHNlbnQgaWYgeW91ciBkZXZpY2UgaGFkCisgKiAgIGVpdGhlciBkaXNhYmxlZCBhY3RpdmUgc2Nhbm5pbmcgb3IgYmVhY29uaW5nIG9uIGEgY2hhbm5lbC4gV2Ugc2VuZCB0bworICogICB1c2Vyc3BhY2UgdGhlIHdpcGh5IG9uIHdoaWNoIHdlIHJlbW92ZWQgYSByZXN0cmljdGlvbiBmcm9tCisgKiAgICglTkw4MDIxMV9BVFRSX1dJUEhZKSBhbmQgdGhlIGNoYW5uZWwgb24gd2hpY2ggdGhpcyBvY2N1cnJlZAorICogICBiZWZvcmUgKCVOTDgwMjExX0FUVFJfRlJFUV9CRUZPUkUpIGFuZCBhZnRlciAoJU5MODAyMTFfQVRUUl9GUkVRX0FGVEVSKQorICogICB0aGUgYmVhY29uIGhpbnQgd2FzIHByb2Nlc3NlZC4KKyAqCisgKiBATkw4MDIxMV9DTURfQVVUSEVOVElDQVRFOiBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGFuZCBub3RpZmljYXRpb24uCisgKiAgIFRoaXMgY29tbWFuZCBpcyB1c2VkIGJvdGggYXMgYSBjb21tYW5kIChyZXF1ZXN0IHRvIGF1dGhlbnRpY2F0ZSkgYW5kCisgKiAgIGFzIGFuIGV2ZW50IG9uIHRoZSAibWxtZSIgbXVsdGljYXN0IGdyb3VwIGluZGljYXRpbmcgY29tcGxldGlvbiBvZiB0aGUKKyAqICAgYXV0aGVudGljYXRpb24gcHJvY2Vzcy4KKyAqICAgV2hlbiB1c2VkIGFzIGEgY29tbWFuZCwgJU5MODAyMTFfQVRUUl9JRklOREVYIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlCisgKiAgIGludGVyZmFjZS4gJU5MODAyMTFfQVRUUl9NQUMgaXMgdXNlZCB0byBzcGVjaWZ5IFBlZXJTVEFBZGRyZXNzIChhbmQKKyAqICAgQlNTSUQgaW4gY2FzZSBvZiBzdGF0aW9uIG1vZGUpLiAlTkw4MDIxMV9BVFRSX1NTSUQgaXMgdXNlZCB0byBzcGVjaWZ5CisgKiAgIHRoZSBTU0lEIChtYWlubHkgZm9yIGFzc29jaWF0aW9uLCBidXQgaXMgaW5jbHVkZWQgaW4gYXV0aGVudGljYXRpb24KKyAqICAgcmVxdWVzdCwgdG9vLCB0byBoZWxwIEJTUyBzZWxlY3Rpb24uICVOTDgwMjExX0FUVFJfV0lQSFlfRlJFUSBpcyB1c2VkCisgKiAgIHRvIHNwZWNpZnkgdGhlIGZyZXF1ZW5jZSBvZiB0aGUgY2hhbm5lbCBpbiBNSHouICVOTDgwMjExX0FUVFJfQVVUSF9UWVBFCisgKiAgIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgYXV0aGVudGljYXRpb24gdHlwZS4gJU5MODAyMTFfQVRUUl9JRSBpcyB1c2VkIHRvCisgKiAgIGRlZmluZSBJRXMgKFZlbmRvclNwZWNpZmljSW5mbywgYnV0IGFsc28gaW5jbHVkaW5nIFJTTiBJRSBhbmQgRlQgSUVzKQorICogICB0byBiZSBhZGRlZCB0byB0aGUgZnJhbWUuCisgKiAgIFdoZW4gdXNlZCBhcyBhbiBldmVudCwgdGhpcyByZXBvcnRzIHJlY2VwdGlvbiBvZiBhbiBBdXRoZW50aWNhdGlvbgorICogICBmcmFtZSBpbiBzdGF0aW9uIGFuZCBJQlNTIG1vZGVzIHdoZW4gdGhlIGxvY2FsIE1MTUUgcHJvY2Vzc2VkIHRoZQorICogICBmcmFtZSwgaS5lLiwgaXQgd2FzIGZvciB0aGUgbG9jYWwgU1RBIGFuZCB3YXMgcmVjZWl2ZWQgaW4gY29ycmVjdAorICogICBzdGF0ZS4gVGhpcyBpcyBzaW1pbGFyIHRvIE1MTUUtQVVUSEVOVElDQVRFLmNvbmZpcm0gcHJpbWl0aXZlIGluIHRoZQorICogICBNTE1FIFNBUCBpbnRlcmZhY2UgKGtlcm5lbCBwcm92aWRpbmcgTUxNRSwgdXNlcnNwYWNlIFNNRSkuIFRoZQorICogICBpbmNsdWRlZCAlTkw4MDIxMV9BVFRSX0ZSQU1FIGF0dHJpYnV0ZSBjb250YWlucyB0aGUgbWFuYWdlbWVudCBmcmFtZQorICogICAoaW5jbHVkaW5nIGJvdGggdGhlIGhlYWRlciBhbmQgZnJhbWUgYm9keSwgYnV0IG5vdCBGQ1MpLiBUaGlzIGV2ZW50IGlzCisgKiAgIGFsc28gdXNlZCB0byBpbmRpY2F0ZSBpZiB0aGUgYXV0aGVudGljYXRpb24gYXR0ZW1wdCB0aW1lZCBvdXQuIEluIHRoYXQKKyAqICAgY2FzZSB0aGUgJU5MODAyMTFfQVRUUl9GUkFNRSBhdHRyaWJ1dGUgaXMgcmVwbGFjZWQgd2l0aCBhCisgKiAgICVOTDgwMjExX0FUVFJfVElNRURfT1VUIGZsYWcgKGFuZCAlTkw4MDIxMV9BVFRSX01BQyB0byBpbmRpY2F0ZSB3aGljaAorICogICBwZW5kaW5nIGF1dGhlbnRpY2F0aW9uIHRpbWVkIG91dCkuCisgKiBATkw4MDIxMV9DTURfQVNTT0NJQVRFOiBhc3NvY2lhdGlvbiByZXF1ZXN0IGFuZCBub3RpZmljYXRpb247IGxpa2UKKyAqICAgTkw4MDIxMV9DTURfQVVUSEVOVElDQVRFIGJ1dCBmb3IgQXNzb2NpYXRpb24gYW5kIFJlYXNzb2NpYXRpb24KKyAqICAgKHNpbWlsYXIgdG8gTUxNRS1BU1NPQ0lBVEUucmVxdWVzdCwgTUxNRS1SRUFTU09DSUFURS5yZXF1ZXN0LAorICogICBNTE1FLUFTU09DSUFURS5jb25maXJtIG9yIE1MTUUtUkVBU1NPQ0lBVEUuY29uZmlybSBwcmltaXRpdmVzKS4KKyAqIEBOTDgwMjExX0NNRF9ERUFVVEhFTlRJQ0FURTogZGVhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGFuZCBub3RpZmljYXRpb247IGxpa2UKKyAqICAgTkw4MDIxMV9DTURfQVVUSEVOVElDQVRFIGJ1dCBmb3IgRGVhdXRoZW50aWNhdGlvbiBmcmFtZXMgKHNpbWlsYXIgdG8KKyAqICAgTUxNRS1ERUFVVEhFTlRJQ0FUSU9OLnJlcXVlc3QgYW5kIE1MTUUtREVBVVRIRU5USUNBVEUuaW5kaWNhdGlvbgorICogICBwcmltaXRpdmVzKS4KKyAqIEBOTDgwMjExX0NNRF9ESVNBU1NPQ0lBVEU6IGRpc2Fzc29jaWF0aW9uIHJlcXVlc3QgYW5kIG5vdGlmaWNhdGlvbjsgbGlrZQorICogICBOTDgwMjExX0NNRF9BVVRIRU5USUNBVEUgYnV0IGZvciBEaXNhc3NvY2lhdGlvbiBmcmFtZXMgKHNpbWlsYXIgdG8KKyAqICAgTUxNRS1ESVNBU1NPQ0lBVEUucmVxdWVzdCBhbmQgTUxNRS1ESVNBU1NPQ0lBVEUuaW5kaWNhdGlvbiBwcmltaXRpdmVzKS4KKyAqCisgKiBATkw4MDIxMV9DTURfTUlDSEFFTF9NSUNfRkFJTFVSRTogbm90aWZpY2F0aW9uIG9mIGEgbG9jYWxseSBkZXRlY3RlZCBNaWNoYWVsCisgKiAgIE1JQyAocGFydCBvZiBUS0lQKSBmYWlsdXJlOyBzZW50IG9uIHRoZSAibWxtZSIgbXVsdGljYXN0IGdyb3VwOyB0aGUKKyAqICAgZXZlbnQgaW5jbHVkZXMgJU5MODAyMTFfQVRUUl9NQUMgdG8gZGVzY3JpYmUgdGhlIHNvdXJjZSBNQUMgYWRkcmVzcyBvZgorICogICB0aGUgZnJhbWUgd2l0aCBpbnZhbGlkIE1JQywgJU5MODAyMTFfQVRUUl9LRVlfVFlQRSB0byBzaG93IHRoZSBrZXkKKyAqICAgdHlwZSwgJU5MODAyMTFfQVRUUl9LRVlfSURYIHRvIGluZGljYXRlIHRoZSBrZXkgaWRlbnRpZmllciwgYW5kCisgKiAgICVOTDgwMjExX0FUVFJfS0VZX1NFUSB0byBpbmRpY2F0ZSB0aGUgVFNDIHZhbHVlIG9mIHRoZSBmcmFtZTsgdGhpcworICogICBldmVudCBtYXRjaGVzIHdpdGggTUxNRS1NSUNIQUVMTUlDRkFJTFVSRS5pbmRpY2F0aW9uKCkgcHJpbWl0aXZlCisgKgorICogQE5MODAyMTFfQ01EX0pPSU5fSUJTUzogSm9pbiBhIG5ldyBJQlNTIC0tIGdpdmVuIGF0IGxlYXN0IGFuIFNTSUQgYW5kIGEKKyAqICAgRlJFUSBhdHRyaWJ1dGUgKGZvciB0aGUgaW5pdGlhbCBmcmVxdWVuY3kgaWYgbm8gcGVlciBjYW4gYmUgZm91bmQpCisgKiAgIGFuZCBvcHRpb25hbGx5IGEgTUFDIChhcyBCU1NJRCkgYW5kIEZSRVFfRklYRUQgYXR0cmlidXRlIGlmIHRob3NlCisgKiAgIHNob3VsZCBiZSBmaXhlZCByYXRoZXIgdGhhbiBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQuIENhbiBvbmx5IGJlCisgKiAgIGV4ZWN1dGVkIG9uIGEgbmV0d29yayBpbnRlcmZhY2UgdGhhdCBpcyBVUCwgYW5kIGZpeGVkIEJTU0lEL0ZSRVEKKyAqICAgbWF5IGJlIHJlamVjdGVkLiBBbm90aGVyIG9wdGlvbmFsIHBhcmFtZXRlciBpcyB0aGUgYmVhY29uIGludGVydmFsLAorICogICBnaXZlbiBpbiB0aGUgJU5MODAyMTFfQVRUUl9CRUFDT05fSU5URVJWQUwgYXR0cmlidXRlLCB3aGljaCBpZiBub3QKKyAqICAgZ2l2ZW4gZGVmYXVsdHMgdG8gMTAwIFRVICgxMDIuNG1zKS4KKyAqIEBOTDgwMjExX0NNRF9MRUFWRV9JQlNTOiBMZWF2ZSB0aGUgSUJTUyAtLSBubyBzcGVjaWFsIGFyZ3VtZW50cywgdGhlIElCU1MgaXMKKyAqICAgZGV0ZXJtaW5lZCBieSB0aGUgbmV0d29yayBpbnRlcmZhY2UuCisgKgorICogQE5MODAyMTFfQ01EX1RFU1RNT0RFOiB0ZXN0bW9kZSBjb21tYW5kLCB0YWtlcyBhIHdpcGh5IChvciBpZmluZGV4KSBhdHRyaWJ1dGUKKyAqICAgdG8gaWRlbnRpZnkgdGhlIGRldmljZSwgYW5kIHRoZSBURVNUREFUQSBibG9iIGF0dHJpYnV0ZSB0byBwYXNzIHRocm91Z2gKKyAqICAgdG8gdGhlIGRyaXZlci4KKyAqCisgKiBATkw4MDIxMV9DTURfQ09OTkVDVDogY29ubmVjdGlvbiByZXF1ZXN0IGFuZCBub3RpZmljYXRpb247IHRoaXMgY29tbWFuZAorICogICByZXF1ZXN0cyB0byBjb25uZWN0IHRvIGEgc3BlY2lmaWVkIG5ldHdvcmsgYnV0IHdpdGhvdXQgc2VwYXJhdGluZworICogICBhdXRoIGFuZCBhc3NvYyBzdGVwcy4gRm9yIHRoaXMsIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIFNTSUQgaW4gYQorICogICAlTkw4MDIxMV9BVFRSX1NTSUQgYXR0cmlidXRlLCBhbmQgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgYXNzb2NpYXRpb24KKyAqICAgSUVzIGluICVOTDgwMjExX0FUVFJfSUUsICVOTDgwMjExX0FUVFJfQVVUSF9UWVBFLCAlTkw4MDIxMV9BVFRSX01BQywKKyAqICAgJU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRIGFuZCAlTkw4MDIxMV9BVFRSX0NPTlRST0xfUE9SVC4KKyAqICAgSXQgaXMgYWxzbyBzZW50IGFzIGFuIGV2ZW50LCB3aXRoIHRoZSBCU1NJRCBhbmQgcmVzcG9uc2UgSUVzIHdoZW4gdGhlCisgKiAgIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgb3IgZmFpbGVkIHRvIGJlIGVzdGFibGlzaGVkLiBUaGlzIGNhbiBiZQorICogICBkZXRlcm1pbmVkIGJ5IHRoZSBTVEFUVVNfQ09ERSBhdHRyaWJ1dGUuCisgKiBATkw4MDIxMV9DTURfUk9BTTogcmVxdWVzdCB0aGF0IHRoZSBjYXJkIHJvYW0gKGN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQpLAorICogICBzZW50IGFzIGFuIGV2ZW50IHdoZW4gdGhlIGNhcmQvZHJpdmVyIHJvYW1lZCBieSBpdHNlbGYuCisgKiBATkw4MDIxMV9DTURfRElTQ09OTkVDVDogZHJvcCBhIGdpdmVuIGNvbm5lY3Rpb247IGFsc28gdXNlZCB0byBub3RpZnkKKyAqICAgdXNlcnNwYWNlIHRoYXQgYSBjb25uZWN0aW9uIHdhcyBkcm9wcGVkIGJ5IHRoZSBBUCBvciBkdWUgdG8gb3RoZXIKKyAqICAgcmVhc29ucywgZm9yIHRoaXMgdGhlICVOTDgwMjExX0FUVFJfRElTQ09OTkVDVEVEX0JZX0FQIGFuZAorICogICAlTkw4MDIxMV9BVFRSX1JFQVNPTl9DT0RFIGF0dHJpYnV0ZXMgYXJlIHVzZWQuCisgKgorICogQE5MODAyMTFfQ01EX1NFVF9XSVBIWV9ORVROUzogU2V0IGEgd2lwaHkncyBuZXRucy4gTm90ZSB0aGF0IGFsbCBkZXZpY2VzCisgKiAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdpcGh5IG11c3QgYmUgZG93biBhbmQgd2lsbCBmb2xsb3cuCisgKgorICogQE5MODAyMTFfQ01EX01BWDogaGlnaGVzdCB1c2VkIGNvbW1hbmQgbnVtYmVyCisgKiBAX19OTDgwMjExX0NNRF9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqLworZW51bSBubDgwMjExX2NvbW1hbmRzIHsKKy8qIGRvbid0IGNoYW5nZSB0aGUgb3JkZXIgb3IgYWRkIGFueXRoaW5nIGluYmV0d2VlbiwgdGhpcyBpcyBBQkkhICovCisgICBOTDgwMjExX0NNRF9VTlNQRUMsCisKKyAgIE5MODAyMTFfQ01EX0dFVF9XSVBIWSwgICAgICAvKiBjYW4gZHVtcCAqLworICAgTkw4MDIxMV9DTURfU0VUX1dJUEhZLAorICAgTkw4MDIxMV9DTURfTkVXX1dJUEhZLAorICAgTkw4MDIxMV9DTURfREVMX1dJUEhZLAorCisgICBOTDgwMjExX0NNRF9HRVRfSU5URVJGQUNFLCAgIC8qIGNhbiBkdW1wICovCisgICBOTDgwMjExX0NNRF9TRVRfSU5URVJGQUNFLAorICAgTkw4MDIxMV9DTURfTkVXX0lOVEVSRkFDRSwKKyAgIE5MODAyMTFfQ01EX0RFTF9JTlRFUkZBQ0UsCisKKyAgIE5MODAyMTFfQ01EX0dFVF9LRVksCisgICBOTDgwMjExX0NNRF9TRVRfS0VZLAorICAgTkw4MDIxMV9DTURfTkVXX0tFWSwKKyAgIE5MODAyMTFfQ01EX0RFTF9LRVksCisKKyAgIE5MODAyMTFfQ01EX0dFVF9CRUFDT04sCisgICBOTDgwMjExX0NNRF9TRVRfQkVBQ09OLAorICAgTkw4MDIxMV9DTURfTkVXX0JFQUNPTiwKKyAgIE5MODAyMTFfQ01EX0RFTF9CRUFDT04sCisKKyAgIE5MODAyMTFfQ01EX0dFVF9TVEFUSU9OLAorICAgTkw4MDIxMV9DTURfU0VUX1NUQVRJT04sCisgICBOTDgwMjExX0NNRF9ORVdfU1RBVElPTiwKKyAgIE5MODAyMTFfQ01EX0RFTF9TVEFUSU9OLAorCisgICBOTDgwMjExX0NNRF9HRVRfTVBBVEgsCisgICBOTDgwMjExX0NNRF9TRVRfTVBBVEgsCisgICBOTDgwMjExX0NNRF9ORVdfTVBBVEgsCisgICBOTDgwMjExX0NNRF9ERUxfTVBBVEgsCisKKyAgIE5MODAyMTFfQ01EX1NFVF9CU1MsCisKKyAgIE5MODAyMTFfQ01EX1NFVF9SRUcsCisgICBOTDgwMjExX0NNRF9SRVFfU0VUX1JFRywKKworICAgTkw4MDIxMV9DTURfR0VUX01FU0hfUEFSQU1TLAorICAgTkw4MDIxMV9DTURfU0VUX01FU0hfUEFSQU1TLAorCisgICBOTDgwMjExX0NNRF9TRVRfTUdNVF9FWFRSQV9JRSAvKiByZXNlcnZlZDsgbm90IHVzZWQgKi8sCisKKyAgIE5MODAyMTFfQ01EX0dFVF9SRUcsCisKKyAgIE5MODAyMTFfQ01EX0dFVF9TQ0FOLAorICAgTkw4MDIxMV9DTURfVFJJR0dFUl9TQ0FOLAorICAgTkw4MDIxMV9DTURfTkVXX1NDQU5fUkVTVUxUUywKKyAgIE5MODAyMTFfQ01EX1NDQU5fQUJPUlRFRCwKKworICAgTkw4MDIxMV9DTURfUkVHX0NIQU5HRSwKKworICAgTkw4MDIxMV9DTURfQVVUSEVOVElDQVRFLAorICAgTkw4MDIxMV9DTURfQVNTT0NJQVRFLAorICAgTkw4MDIxMV9DTURfREVBVVRIRU5USUNBVEUsCisgICBOTDgwMjExX0NNRF9ESVNBU1NPQ0lBVEUsCisKKyAgIE5MODAyMTFfQ01EX01JQ0hBRUxfTUlDX0ZBSUxVUkUsCisKKyAgIE5MODAyMTFfQ01EX1JFR19CRUFDT05fSElOVCwKKworICAgTkw4MDIxMV9DTURfSk9JTl9JQlNTLAorICAgTkw4MDIxMV9DTURfTEVBVkVfSUJTUywKKworICAgTkw4MDIxMV9DTURfVEVTVE1PREUsCisKKyAgIE5MODAyMTFfQ01EX0NPTk5FQ1QsCisgICBOTDgwMjExX0NNRF9ST0FNLAorICAgTkw4MDIxMV9DTURfRElTQ09OTkVDVCwKKworICAgTkw4MDIxMV9DTURfU0VUX1dJUEhZX05FVE5TLAorCisgICBOTDgwMjExX0NNRF9HRVRfU1VSVkVZLAorICAgTkw4MDIxMV9DTURfTkVXX1NVUlZFWV9SRVNVTFRTLAorCisgICAvKiBhZGQgbmV3IGNvbW1hbmRzIGFib3ZlIGhlcmUgKi8KKworICAgLyogdXNlZCB0byBkZWZpbmUgTkw4MDIxMV9DTURfTUFYIGJlbG93ICovCisgICBfX05MODAyMTFfQ01EX0FGVEVSX0xBU1QsCisgICBOTDgwMjExX0NNRF9NQVggPSBfX05MODAyMTFfQ01EX0FGVEVSX0xBU1QgLSAxCit9OworCisvKgorICogQWxsb3cgdXNlciBzcGFjZSBwcm9ncmFtcyB0byB1c2UgI2lmZGVmIG9uIG5ldyBjb21tYW5kcyBieSBkZWZpbmluZyB0aGVtCisgKiBoZXJlCisgKi8KKyNkZWZpbmUgTkw4MDIxMV9DTURfU0VUX0JTUyBOTDgwMjExX0NNRF9TRVRfQlNTCisjZGVmaW5lIE5MODAyMTFfQ01EX1NFVF9NR01UX0VYVFJBX0lFIE5MODAyMTFfQ01EX1NFVF9NR01UX0VYVFJBX0lFCisjZGVmaW5lIE5MODAyMTFfQ01EX1JFR19DSEFOR0UgTkw4MDIxMV9DTURfUkVHX0NIQU5HRQorI2RlZmluZSBOTDgwMjExX0NNRF9BVVRIRU5USUNBVEUgTkw4MDIxMV9DTURfQVVUSEVOVElDQVRFCisjZGVmaW5lIE5MODAyMTFfQ01EX0FTU09DSUFURSBOTDgwMjExX0NNRF9BU1NPQ0lBVEUKKyNkZWZpbmUgTkw4MDIxMV9DTURfREVBVVRIRU5USUNBVEUgTkw4MDIxMV9DTURfREVBVVRIRU5USUNBVEUKKyNkZWZpbmUgTkw4MDIxMV9DTURfRElTQVNTT0NJQVRFIE5MODAyMTFfQ01EX0RJU0FTU09DSUFURQorI2RlZmluZSBOTDgwMjExX0NNRF9SRUdfQkVBQ09OX0hJTlQgTkw4MDIxMV9DTURfUkVHX0JFQUNPTl9ISU5UCisKKy8qKgorICogZW51bSBubDgwMjExX2F0dHJzIC0gbmw4MDIxMSBuZXRsaW5rIGF0dHJpYnV0ZXMKKyAqCisgKiBATkw4MDIxMV9BVFRSX1VOU1BFQzogdW5zcGVjaWZpZWQgYXR0cmlidXRlIHRvIGNhdGNoIGVycm9ycworICoKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFk6IGluZGV4IG9mIHdpcGh5IHRvIG9wZXJhdGUgb24sIGNmLgorICogICAvc3lzL2NsYXNzL2llZWU4MDIxMS88cGh5bmFtZT4vaW5kZXgKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfTkFNRTogd2lwaHkgbmFtZSAodXNlZCBmb3IgcmVuYW1pbmcpCisgKiBATkw4MDIxMV9BVFRSX1dJUEhZX1RYUV9QQVJBTVM6IGEgbmVzdGVkIGFycmF5IG9mIFRYIHF1ZXVlIHBhcmFtZXRlcnMKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfRlJFUTogZnJlcXVlbmN5IG9mIHRoZSBzZWxlY3RlZCBjaGFubmVsIGluIE1IegorICogQE5MODAyMTFfQVRUUl9XSVBIWV9DSEFOTkVMX1RZUEU6IGluY2x1ZGVkIHdpdGggTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEKKyAqICAgaWYgSFQyMCBvciBIVDQwIGFyZSBhbGxvd2VkIChpLmUuLCA4MDIuMTFuIGRpc2FibGVkIGlmIG5vdCBpbmNsdWRlZCk6CisgKiAgIE5MODAyMTFfQ0hBTl9OT19IVCA9IEhUIG5vdCBhbGxvd2VkIChpLmUuLCBzYW1lIGFzIG5vdCBpbmNsdWRpbmcKKyAqICAgICAgdGhpcyBhdHRyaWJ1dGUpCisgKiAgIE5MODAyMTFfQ0hBTl9IVDIwID0gSFQyMCBvbmx5CisgKiAgIE5MODAyMTFfQ0hBTl9IVDQwTUlOVVMgPSBzZWNvbmRhcnkgY2hhbm5lbCBpcyBiZWxvdyB0aGUgcHJpbWFyeSBjaGFubmVsCisgKiAgIE5MODAyMTFfQ0hBTl9IVDQwUExVUyA9IHNlY29uZGFyeSBjaGFubmVsIGlzIGFib3ZlIHRoZSBwcmltYXJ5IGNoYW5uZWwKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfUkVUUllfU0hPUlQ6IFRYIHJldHJ5IGxpbWl0IGZvciBmcmFtZXMgd2hvc2UgbGVuZ3RoIGlzCisgKiAgIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgUlRTIHRocmVzaG9sZDsgYWxsb3dlZCByYW5nZTogMS4uMjU1OworICogICBkb3QxMVNob3J0UmV0cnlMaW1pdDsgdTgKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfUkVUUllfTE9ORzogVFggcmV0cnkgbGltaXQgZm9yIGZyYW1lcyB3aG9zZSBsZW5ndGggaXMKKyAqICAgZ3JlYXRlciB0aGFuIHRoZSBSVFMgdGhyZXNob2xkOyBhbGxvd2VkIHJhbmdlOiAxLi4yNTU7CisgKiAgIGRvdDExU2hvcnRMb25nTGltaXQ7IHU4CisgKiBATkw4MDIxMV9BVFRSX1dJUEhZX0ZSQUdfVEhSRVNIT0xEOiBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCwgaS5lLiwgbWF4aW11bQorICogICBsZW5ndGggaW4gb2N0ZXRzIGZvciBmcmFtZXM7IGFsbG93ZWQgcmFuZ2U6IDI1Ni4uODAwMCwgZGlzYWJsZQorICogICBmcmFnbWVudGF0aW9uIHdpdGggKHUzMiktMTsgZG90MTFGcmFnbWVudGF0aW9uVGhyZXNob2xkOyB1MzIKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfUlRTX1RIUkVTSE9MRDogUlRTIHRocmVzaG9sZCAoVFggZnJhbWVzIHdpdGggbGVuZ3RoCisgKiAgIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgdXNlIFJUUy9DVFMgaGFuZHNoYWtlKTsgYWxsb3dlZCByYW5nZToKKyAqICAgMC4uNjU1MzYsIGRpc2FibGUgd2l0aCAodTMyKS0xOyBkb3QxMVJUU1RocmVzaG9sZDsgdTMyCisgKgorICogQE5MODAyMTFfQVRUUl9JRklOREVYOiBuZXR3b3JrIGludGVyZmFjZSBpbmRleCBvZiB0aGUgZGV2aWNlIHRvIG9wZXJhdGUgb24KKyAqIEBOTDgwMjExX0FUVFJfSUZOQU1FOiBuZXR3b3JrIGludGVyZmFjZSBuYW1lCisgKiBATkw4MDIxMV9BVFRSX0lGVFlQRTogdHlwZSBvZiB2aXJ0dWFsIGludGVyZmFjZSwgc2VlICZlbnVtIG5sODAyMTFfaWZ0eXBlCisgKgorICogQE5MODAyMTFfQVRUUl9NQUM6IE1BQyBhZGRyZXNzICh2YXJpb3VzIHVzZXMpCisgKgorICogQE5MODAyMTFfQVRUUl9LRVlfREFUQTogKHRlbXBvcmFsKSBrZXkgZGF0YTsgZm9yIFRLSVAgdGhpcyBjb25zaXN0cyBvZgorICogICAxNiBieXRlcyBlbmNyeXB0aW9uIGtleSBmb2xsb3dlZCBieSA4IGJ5dGVzIGVhY2ggZm9yIFRYIGFuZCBSWCBNSUMKKyAqICAga2V5cworICogQE5MODAyMTFfQVRUUl9LRVlfSURYOiBrZXkgSUQgKHU4LCAwLTMpCisgKiBATkw4MDIxMV9BVFRSX0tFWV9DSVBIRVI6IGtleSBjaXBoZXIgc3VpdGUgKHUzMiwgYXMgZGVmaW5lZCBieSBJRUVFIDgwMi4xMQorICogICBzZWN0aW9uIDcuMy4yLjI1LjEsIGUuZy4gMHgwMDBGQUMwNCkKKyAqIEBOTDgwMjExX0FUVFJfS0VZX1NFUTogdHJhbnNtaXQga2V5IHNlcXVlbmNlIG51bWJlciAoSVYvUE4pIGZvciBUS0lQIGFuZAorICogICBDQ01QIGtleXMsIGVhY2ggc2l4IGJ5dGVzIGluIGxpdHRsZSBlbmRpYW4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0JFQUNPTl9JTlRFUlZBTDogYmVhY29uIGludGVydmFsIGluIFRVCisgKiBATkw4MDIxMV9BVFRSX0RUSU1fUEVSSU9EOiBEVElNIHBlcmlvZCBmb3IgYmVhY29uaW5nCisgKiBATkw4MDIxMV9BVFRSX0JFQUNPTl9IRUFEOiBwb3J0aW9uIG9mIHRoZSBiZWFjb24gYmVmb3JlIHRoZSBUSU0gSUUKKyAqIEBOTDgwMjExX0FUVFJfQkVBQ09OX1RBSUw6IHBvcnRpb24gb2YgdGhlIGJlYWNvbiBhZnRlciB0aGUgVElNIElFCisgKgorICogQE5MODAyMTFfQVRUUl9TVEFfQUlEOiBBc3NvY2lhdGlvbiBJRCBmb3IgdGhlIHN0YXRpb24gKHUxNikKKyAqIEBOTDgwMjExX0FUVFJfU1RBX0ZMQUdTOiBmbGFncywgbmVzdGVkIGVsZW1lbnQgd2l0aCBOTEFfRkxBRyBhdHRyaWJ1dGVzIG9mCisgKiAgICZlbnVtIG5sODAyMTFfc3RhX2ZsYWdzIChkZXByZWNhdGVkLCB1c2UgJU5MODAyMTFfQVRUUl9TVEFfRkxBR1MyKQorICogQE5MODAyMTFfQVRUUl9TVEFfTElTVEVOX0lOVEVSVkFMOiBsaXN0ZW4gaW50ZXJ2YWwgYXMgZGVmaW5lZCBieQorICogICBJRUVFIDgwMi4xMSA3LjMuMS42ICh1MTYpLgorICogQE5MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX1JBVEVTOiBzdXBwb3J0ZWQgcmF0ZXMsIGFycmF5IG9mIHN1cHBvcnRlZAorICogICByYXRlcyBhcyBkZWZpbmVkIGJ5IElFRUUgODAyLjExIDcuMy4yLjIgYnV0IHdpdGhvdXQgdGhlIGxlbmd0aAorICogICByZXN0cmljdGlvbiAoYXQgbW9zdCAlTkw4MDIxMV9NQVhfU1VQUF9SQVRFUykuCisgKiBATkw4MDIxMV9BVFRSX1NUQV9WTEFOOiBpbnRlcmZhY2UgaW5kZXggb2YgVkxBTiBpbnRlcmZhY2UgdG8gbW92ZSBzdGF0aW9uCisgKiAgIHRvLCBvciB0aGUgQVAgaW50ZXJmYWNlIHRoZSBzdGF0aW9uIHdhcyBvcmlnaW5hbGx5IGFkZGVkIHRvIHRvLgorICogQE5MODAyMTFfQVRUUl9TVEFfSU5GTzogaW5mb3JtYXRpb24gYWJvdXQgYSBzdGF0aW9uLCBwYXJ0IG9mIHN0YXRpb24gaW5mbworICogICBnaXZlbiBmb3IgJU5MODAyMTFfQ01EX0dFVF9TVEFUSU9OLCBuZXN0ZWQgYXR0cmlidXRlIGNvbnRhaW5pbmcKKyAqICAgaW5mbyBhcyBwb3NzaWJsZSwgc2VlICZlbnVtIG5sODAyMTFfc3RhX2luZm8uCisgKgorICogQE5MODAyMTFfQVRUUl9XSVBIWV9CQU5EUzogSW5mb3JtYXRpb24gYWJvdXQgYW4gb3BlcmF0aW5nIGJhbmRzLAorICogICBjb25zaXN0aW5nIG9mIGEgbmVzdGVkIGFycmF5LgorICoKKyAqIEBOTDgwMjExX0FUVFJfTUVTSF9JRDogbWVzaCBpZCAoMS0zMiBieXRlcykuCisgKiBATkw4MDIxMV9BVFRSX1BMSU5LX0FDVElPTjogYWN0aW9uIHRvIHBlcmZvcm0gb24gdGhlIG1lc2ggcGVlciBsaW5rLgorICogQE5MODAyMTFfQVRUUl9NUEFUSF9ORVhUX0hPUDogTUFDIGFkZHJlc3Mgb2YgdGhlIG5leHQgaG9wIGZvciBhIG1lc2ggcGF0aC4KKyAqIEBOTDgwMjExX0FUVFJfTVBBVEhfSU5GTzogaW5mb3JtYXRpb24gYWJvdXQgYSBtZXNoX3BhdGgsIHBhcnQgb2YgbWVzaCBwYXRoCisgKiAgIGluZm8gZ2l2ZW4gZm9yICVOTDgwMjExX0NNRF9HRVRfTVBBVEgsIG5lc3RlZCBhdHRyaWJ1dGUgZGVzY3JpYmVkIGF0CisgKiAgICZlbnVtIG5sODAyMTFfbXBhdGhfaW5mby4KKyAqCisgKiBATkw4MDIxMV9BVFRSX01OVFJfRkxBR1M6IGZsYWdzLCBuZXN0ZWQgZWxlbWVudCB3aXRoIE5MQV9GTEFHIGF0dHJpYnV0ZXMgb2YKKyAqICAgJmVudW0gbmw4MDIxMV9tbnRyX2ZsYWdzLgorICoKKyAqIEBOTDgwMjExX0FUVFJfUkVHX0FMUEhBMjogYW4gSVNPLTMxNjYtYWxwaGEyIGNvdW50cnkgY29kZSBmb3Igd2hpY2ggdGhlCisgKiAgIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4gc2hvdWxkIGJlIHNldCB0byBvciBpcyBhbHJlYWR5IHNldCB0by4KKyAqICAgRm9yIGV4YW1wbGUsICdDUicsIGZvciBDb3N0YSBSaWNhLiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGJ5IHRoZSBrZXJuZWwKKyAqICAgdG8gcXVlcnkgdGhlIENSREEgdG8gcmV0cmlldmUgb25lIHJlZ3VsYXRvcnkgZG9tYWluLiBUaGlzIGF0dHJpYnV0ZSBjYW4KKyAqICAgYWxzbyBiZSB1c2VkIGJ5IHVzZXJzcGFjZSB0byBxdWVyeSB0aGUga2VybmVsIGZvciB0aGUgY3VycmVudGx5IHNldAorICogICByZWd1bGF0b3J5IGRvbWFpbi4gV2UgY2hvc2UgYW4gYWxwaGEyIGFzIHRoYXQgaXMgYWxzbyB1c2VkIGJ5IHRoZQorICogICBJRUVFLTgwMi4xMWQgY291bnRyeSBpbmZvcm1hdGlvbiBlbGVtZW50IHRvIGlkZW50aWZ5IGEgY291bnRyeS4KKyAqICAgVXNlcnMgY2FuIGFsc28gc2ltcGx5IGFzayB0aGUgd2lyZWxlc3MgY29yZSB0byBzZXQgcmVndWxhdG9yeSBkb21haW4KKyAqICAgdG8gYSBzcGVjaWZpYyBhbHBoYTIuCisgKiBATkw4MDIxMV9BVFRSX1JFR19SVUxFUzogYSBuZXN0ZWQgYXJyYXkgb2YgcmVndWxhdG9yeSBkb21haW4gcmVndWxhdG9yeQorICogICBydWxlcy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0JTU19DVFNfUFJPVDogd2hldGhlciBDVFMgcHJvdGVjdGlvbiBpcyBlbmFibGVkICh1OCwgMCBvciAxKQorICogQE5MODAyMTFfQVRUUl9CU1NfU0hPUlRfUFJFQU1CTEU6IHdoZXRoZXIgc2hvcnQgcHJlYW1ibGUgaXMgZW5hYmxlZAorICogICAodTgsIDAgb3IgMSkKKyAqIEBOTDgwMjExX0FUVFJfQlNTX1NIT1JUX1NMT1RfVElNRTogd2hldGhlciBzaG9ydCBzbG90IHRpbWUgZW5hYmxlZAorICogICAodTgsIDAgb3IgMSkKKyAqIEBOTDgwMjExX0FUVFJfQlNTX0JBU0lDX1JBVEVTOiBiYXNpYyByYXRlcywgYXJyYXkgb2YgYmFzaWMKKyAqICAgcmF0ZXMgaW4gZm9ybWF0IGRlZmluZWQgYnkgSUVFRSA4MDIuMTEgNy4zLjIuMiBidXQgd2l0aG91dCB0aGUgbGVuZ3RoCisgKiAgIHJlc3RyaWN0aW9uIChhdCBtb3N0ICVOTDgwMjExX01BWF9TVVBQX1JBVEVTKS4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFk6IEhUIENhcGFiaWxpdHkgaW5mb3JtYXRpb24gZWxlbWVudCAoZnJvbQorICogICBhc3NvY2lhdGlvbiByZXF1ZXN0IHdoZW4gdXNlZCB3aXRoIE5MODAyMTFfQ01EX05FV19TVEFUSU9OKQorICoKKyAqIEBOTDgwMjExX0FUVFJfU1VQUE9SVEVEX0lGVFlQRVM6IG5lc3RlZCBhdHRyaWJ1dGUgY29udGFpbmluZyBhbGwKKyAqICAgc3VwcG9ydGVkIGludGVyZmFjZSB0eXBlcywgZWFjaCBhIGZsYWcgYXR0cmlidXRlIHdpdGggdGhlIG51bWJlcgorICogICBvZiB0aGUgaW50ZXJmYWNlIG1vZGUuCisgKgorICogQE5MODAyMTFfQVRUUl9NR01UX1NVQlRZUEU6IE1hbmFnZW1lbnQgZnJhbWUgc3VidHlwZSBmb3IKKyAqICAgJU5MODAyMTFfQ01EX1NFVF9NR01UX0VYVFJBX0lFLgorICoKKyAqIEBOTDgwMjExX0FUVFJfSUU6IEluZm9ybWF0aW9uIGVsZW1lbnQocykgZGF0YSAodXNlZCwgZS5nLiwgd2l0aAorICogICAlTkw4MDIxMV9DTURfU0VUX01HTVRfRVhUUkFfSUUpLgorICoKKyAqIEBOTDgwMjExX0FUVFJfTUFYX05VTV9TQ0FOX1NTSURTOiBudW1iZXIgb2YgU1NJRHMgeW91IGNhbiBzY2FuIHdpdGgKKyAqICAgYSBzaW5nbGUgc2NhbiByZXF1ZXN0LCBhIHdpcGh5IGF0dHJpYnV0ZS4KKyAqIEBOTDgwMjExX0FUVFJfTUFYX1NDQU5fSUVfTEVOOiBtYXhpbXVtIGxlbmd0aCBvZiBpbmZvcm1hdGlvbiBlbGVtZW50cworICogICB0aGF0IGNhbiBiZSBhZGRlZCB0byBhIHNjYW4gcmVxdWVzdAorICoKKyAqIEBOTDgwMjExX0FUVFJfU0NBTl9GUkVRVUVOQ0lFUzogbmVzdGVkIGF0dHJpYnV0ZSB3aXRoIGZyZXF1ZW5jaWVzIChpbiBNSHopCisgKiBATkw4MDIxMV9BVFRSX1NDQU5fU1NJRFM6IG5lc3RlZCBhdHRyaWJ1dGUgd2l0aCBTU0lEcywgbGVhdmUgb3V0IGZvciBwYXNzaXZlCisgKiAgIHNjYW5uaW5nIGFuZCBpbmNsdWRlIGEgemVyby1sZW5ndGggU1NJRCAod2lsZGNhcmQpIGZvciB3aWxkY2FyZCBzY2FuCisgKiBATkw4MDIxMV9BVFRSX0JTUzogc2NhbiByZXN1bHQgQlNTCisgKgorICogQE5MODAyMTFfQVRUUl9SRUdfSU5JVElBVE9SOiBpbmRpY2F0ZXMgd2hvIHJlcXVlc3RlZCB0aGUgcmVndWxhdG9yeSBkb21haW4KKyAqICAgY3VycmVudGx5IGluIGVmZmVjdC4gVGhpcyBjb3VsZCBiZSBhbnkgb2YgdGhlICVOTDgwMjExX1JFR0RPTV9TRVRfQllfKgorICogQE5MODAyMTFfQVRUUl9SRUdfVFlQRTogaW5kaWNhdGVzIHRoZSB0eXBlIG9mIHRoZSByZWd1bGF0b3J5IGRvbWFpbiBjdXJyZW50bHkKKyAqICAgc2V0LiBUaGlzIGNhbiBiZSBvbmUgb2YgdGhlIG5sODAyMTFfcmVnX3R5cGUgKCVOTDgwMjExX1JFR0RPTV9UWVBFXyopCisgKgorICogQE5MODAyMTFfQVRUUl9TVVBQT1JURURfQ09NTUFORFM6IHdpcGh5IGF0dHJpYnV0ZSB0aGF0IHNwZWNpZmllcworICogICBhbiBhcnJheSBvZiBjb21tYW5kIG51bWJlcnMgKGkuZS4gYSBtYXBwaW5nIGluZGV4IHRvIGNvbW1hbmQgbnVtYmVyKQorICogICB0aGF0IHRoZSBkcml2ZXIgZm9yIHRoZSBnaXZlbiB3aXBoeSBzdXBwb3J0cy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0ZSQU1FOiBmcmFtZSBkYXRhIChiaW5hcnkgYXR0cmlidXRlKSwgaW5jbHVkaW5nIGZyYW1lIGhlYWRlcgorICogICBhbmQgYm9keSwgYnV0IG5vdCBGQ1M7IHVzZWQsIGUuZy4sIHdpdGggTkw4MDIxMV9DTURfQVVUSEVOVElDQVRFIGFuZAorICogICBOTDgwMjExX0NNRF9BU1NPQ0lBVEUgZXZlbnRzCisgKiBATkw4MDIxMV9BVFRSX1NTSUQ6IFNTSUQgKGJpbmFyeSBhdHRyaWJ1dGUsIDAuLjMyIG9jdGV0cykKKyAqIEBOTDgwMjExX0FUVFJfQVVUSF9UWVBFOiBBdXRoZW50aWNhdGlvblR5cGUsIHNlZSAmZW51bSBubDgwMjExX2F1dGhfdHlwZSwKKyAqICAgcmVwcmVzZW50ZWQgYXMgYSB1MzIKKyAqIEBOTDgwMjExX0FUVFJfUkVBU09OX0NPREU6IFJlYXNvbkNvZGUgZm9yICVOTDgwMjExX0NNRF9ERUFVVEhFTlRJQ0FURSBhbmQKKyAqICAgJU5MODAyMTFfQ01EX0RJU0FTU09DSUFURSwgdTE2CisgKgorICogQE5MODAyMTFfQVRUUl9LRVlfVFlQRTogS2V5IFR5cGUsIHNlZSAmZW51bSBubDgwMjExX2tleV90eXBlLCByZXByZXNlbnRlZCBhcworICogICBhIHUzMgorICoKKyAqIEBOTDgwMjExX0FUVFJfRlJFUV9CRUZPUkU6IEEgY2hhbm5lbCB3aGljaCBoYXMgc3VmZmVyZWQgYSByZWd1bGF0b3J5IGNoYW5nZQorICogICBkdWUgdG8gY29uc2lkZXJhdGlvbnMgZnJvbSBhIGJlYWNvbiBoaW50LiBUaGlzIGF0dHJpYnV0ZSByZWZsZWN0cworICogICB0aGUgc3RhdGUgb2YgdGhlIGNoYW5uZWwgX2JlZm9yZV8gdGhlIGJlYWNvbiBoaW50IHByb2Nlc3NpbmcuIFRoaXMKKyAqICAgYXR0cmlidXRlcyBjb25zaXN0cyBvZiBhIG5lc3RlZCBhdHRyaWJ1dGUgY29udGFpbmluZworICogICBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSXyoKKyAqIEBOTDgwMjExX0FUVFJfRlJFUV9BRlRFUjogQSBjaGFubmVsIHdoaWNoIGhhcyBzdWZmZXJlZCBhIHJlZ3VsYXRvcnkgY2hhbmdlCisgKiAgIGR1ZSB0byBjb25zaWRlcmF0aW9ucyBmcm9tIGEgYmVhY29uIGhpbnQuIFRoaXMgYXR0cmlidXRlIHJlZmxlY3RzCisgKiAgIHRoZSBzdGF0ZSBvZiB0aGUgY2hhbm5lbCBfYWZ0ZXJfIHRoZSBiZWFjb24gaGludCBwcm9jZXNzaW5nLiBUaGlzCisgKiAgIGF0dHJpYnV0ZXMgY29uc2lzdHMgb2YgYSBuZXN0ZWQgYXR0cmlidXRlIGNvbnRhaW5pbmcKKyAqICAgTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl8qCisgKgorICogQE5MODAyMTFfQVRUUl9DSVBIRVJfU1VJVEVTOiBhIHNldCBvZiB1MzIgdmFsdWVzIGluZGljYXRpbmcgdGhlIHN1cHBvcnRlZAorICogICBjaXBoZXIgc3VpdGVzCisgKgorICogQE5MODAyMTFfQVRUUl9GUkVRX0ZJWEVEOiBhIGZsYWcgaW5kaWNhdGluZyB0aGUgSUJTUyBzaG91bGQgbm90IHRyeSB0byBsb29rCisgKiAgIGZvciBvdGhlciBuZXR3b3JrcyBvbiBkaWZmZXJlbnQgY2hhbm5lbHMKKyAqCisgKiBATkw4MDIxMV9BVFRSX1RJTUVEX09VVDogYSBmbGFnIGluZGljYXRpbmcgdGhhbiBhbiBvcGVyYXRpb24gdGltZWQgb3V0OyB0aGlzCisgKiAgIGlzIHVzZWQsIGUuZy4sIHdpdGggJU5MODAyMTFfQ01EX0FVVEhFTlRJQ0FURSBldmVudAorICoKKyAqIEBOTDgwMjExX0FUVFJfVVNFX01GUDogV2hldGhlciBtYW5hZ2VtZW50IGZyYW1lIHByb3RlY3Rpb24gKElFRUUgODAyLjExdykgaXMKKyAqICAgdXNlZCBmb3IgdGhlIGFzc29jaWF0aW9uICgmZW51bSBubDgwMjExX21mcCwgcmVwcmVzZW50ZWQgYXMgYSB1MzIpOworICogICB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZAorICogICB3aXRoICVOTDgwMjExX0NNRF9BU1NPQ0lBVEUgcmVxdWVzdAorICoKKyAqIEBOTDgwMjExX0FUVFJfU1RBX0ZMQUdTMjogQXR0cmlidXRlIGNvbnRhaW5pbmcgYQorICogICAmc3RydWN0IG5sODAyMTFfc3RhX2ZsYWdfdXBkYXRlLgorICoKKyAqIEBOTDgwMjExX0FUVFJfQ09OVFJPTF9QT1JUOiBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHVzZXIgc3BhY2UgY29udHJvbHMKKyAqICAgSUVFRSA4MDIuMVggcG9ydCwgaS5lLiwgc2V0cy9jbGVhcnMgJU5MODAyMTFfU1RBX0ZMQUdfQVVUSE9SSVpFRCwgaW4KKyAqICAgc3RhdGlvbiBtb2RlLiBJZiB0aGUgZmxhZyBpcyBpbmNsdWRlZCBpbiAlTkw4MDIxMV9DTURfQVNTT0NJQVRFCisgKiAgIHJlcXVlc3QsIHRoZSBkcml2ZXIgd2lsbCBhc3N1bWUgdGhhdCB0aGUgcG9ydCBpcyB1bmF1dGhvcml6ZWQgdW50aWwKKyAqICAgYXV0aG9yaXplZCBieSB1c2VyIHNwYWNlLiBPdGhlcndpc2UsIHBvcnQgaXMgbWFya2VkIGF1dGhvcml6ZWQgYnkKKyAqICAgZGVmYXVsdCBpbiBzdGF0aW9uIG1vZGUuCisgKgorICogQE5MODAyMTFfQVRUUl9URVNUREFUQTogVGVzdG1vZGUgZGF0YSBibG9iLCBwYXNzZWQgdGhyb3VnaCB0byB0aGUgZHJpdmVyLgorICogICBXZSByZWNvbW1lbmQgdXNpbmcgbmVzdGVkLCBkcml2ZXItc3BlY2lmaWMgYXR0cmlidXRlcyB3aXRoaW4gdGhpcy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0RJU0NPTk5FQ1RFRF9CWV9BUDogQSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgRElTQ09OTkVDVAorICogICBldmVudCB3YXMgZHVlIHRvIHRoZSBBUCBkaXNjb25uZWN0aW5nIHRoZSBzdGF0aW9uLCBhbmQgbm90IGR1ZSB0bworICogICBhIGxvY2FsIGRpc2Nvbm5lY3QgcmVxdWVzdC4KKyAqIEBOTDgwMjExX0FUVFJfU1RBVFVTX0NPREU6IFN0YXR1c0NvZGUgZm9yIHRoZSAlTkw4MDIxMV9DTURfQ09OTkVDVAorICogICBldmVudCAodTE2KQorICogQE5MODAyMTFfQVRUUl9QUklWQUNZOiBGbGFnIGF0dHJpYnV0ZSwgdXNlZCB3aXRoIGNvbm5lY3QoKSwgaW5kaWNhdGluZworICogICB0aGF0IHByb3RlY3RlZCBBUHMgc2hvdWxkIGJlIHVzZWQuCisgKgorICogQE5MODAyMTFfQVRUUl9DSVBIRVJTX1BBSVJXSVNFOiBVc2VkIHdpdGggQ09OTkVDVCBhbmQgQVNTT0NJQVRFIHRvCisgKiAgIGluZGljYXRlIHdoaWNoIHVuaWNhc3Qga2V5IGNpcGhlcnMgd2lsbCBiZSB1c2VkIHdpdGggdGhlIGNvbm5lY3Rpb24KKyAqICAgKGFuIGFycmF5IG9mIHUzMikuCisgKiBATkw4MDIxMV9BVFRSX0NJUEhFUl9HUk9VUDogVXNlZCB3aXRoIENPTk5FQ1QgYW5kIEFTU09DSUFURSB0byBpbmRpY2F0ZQorICogICB3aGljaCBncm91cCBrZXkgY2lwaGVyIHdpbGwgYmUgdXNlZCB3aXRoIHRoZSBjb25uZWN0aW9uIChhIHUzMikuCisgKiBATkw4MDIxMV9BVFRSX1dQQV9WRVJTSU9OUzogVXNlZCB3aXRoIENPTk5FQ1QgYW5kIEFTU09DSUFURSB0byBpbmRpY2F0ZQorICogICB3aGljaCBXUEEgdmVyc2lvbihzKSB0aGUgQVAgd2Ugd2FudCB0byBhc3NvY2lhdGUgd2l0aCBpcyB1c2luZworICogICAoYSB1MzIgd2l0aCBmbGFncyBmcm9tICZlbnVtIG5sODAyMTFfd3BhX3ZlcnNpb25zKS4KKyAqIEBOTDgwMjExX0FUVFJfQUtNX1NVSVRFUzogVXNlZCB3aXRoIENPTk5FQ1QgYW5kIEFTU09DSUFURSB0byBpbmRpY2F0ZQorICogICB3aGljaCBrZXkgbWFuYWdlbWVudCBhbGdvcml0aG0ocykgdG8gdXNlIChhbiBhcnJheSBvZiB1MzIpLgorICoKKyAqIEBOTDgwMjExX0FUVFJfUkVRX0lFOiAoUmUpYXNzb2NpYXRpb24gcmVxdWVzdCBpbmZvcm1hdGlvbiBlbGVtZW50cyBhcworICogICBzZW50IG91dCBieSB0aGUgY2FyZCwgZm9yIFJPQU0gYW5kIHN1Y2Nlc3NmdWwgQ09OTkVDVCBldmVudHMuCisgKiBATkw4MDIxMV9BVFRSX1JFU1BfSUU6IChSZSlhc3NvY2lhdGlvbiByZXNwb25zZSBpbmZvcm1hdGlvbiBlbGVtZW50cyBhcworICogICBzZW50IGJ5IHBlZXIsIGZvciBST0FNIGFuZCBzdWNjZXNzZnVsIENPTk5FQ1QgZXZlbnRzLgorICoKKyAqIEBOTDgwMjExX0FUVFJfUFJFVl9CU1NJRDogcHJldmlvdXMgQlNTSUQsIHRvIGJlIHVzZWQgYnkgaW4gQVNTT0NJQVRFCisgKiAgIGNvbW1hbmRzIHRvIHNwZWNpZnkgdXNpbmcgYSByZWFzc29jaWF0ZSBmcmFtZQorICoKKyAqIEBOTDgwMjExX0FUVFJfS0VZOiBrZXkgaW5mb3JtYXRpb24gaW4gYSBuZXN0ZWQgYXR0cmlidXRlIHdpdGgKKyAqICAgJU5MODAyMTFfS0VZXyogc3ViLWF0dHJpYnV0ZXMKKyAqIEBOTDgwMjExX0FUVFJfS0VZUzogYXJyYXkgb2Yga2V5cyBmb3Igc3RhdGljIFdFUCBrZXlzIGZvciBjb25uZWN0KCkKKyAqICAgYW5kIGpvaW5faWJzcygpLCBrZXkgaW5mb3JtYXRpb24gaXMgaW4gYSBuZXN0ZWQgYXR0cmlidXRlIGVhY2gKKyAqICAgd2l0aCAlTkw4MDIxMV9LRVlfKiBzdWItYXR0cmlidXRlcworICoKKyAqIEBOTDgwMjExX0FUVFJfUElEOiBQcm9jZXNzIElEIG9mIGEgbmV0d29yayBuYW1lc3BhY2UuCisgKgorICogQE5MODAyMTFfQVRUUl9HRU5FUkFUSU9OOiBVc2VkIHRvIGluZGljYXRlIGNvbnNpc3RlbnQgc25hcHNob3RzIGZvcgorICogICBkdW1wcy4gVGhpcyBudW1iZXIgaW5jcmVhc2VzIHdoZW5ldmVyIHRoZSBvYmplY3QgbGlzdCBiZWluZworICogICBkdW1wZWQgY2hhbmdlcywgYW5kIGFzIHN1Y2ggdXNlcnNwYWNlIGNhbiB2ZXJpZnkgdGhhdCBpdCBoYXMKKyAqICAgb2J0YWluZWQgYSBjb21wbGV0ZSBhbmQgY29uc2lzdGVudCBzbmFwc2hvdCBieSB2ZXJpZnlpbmcgdGhhdAorICogICBhbGwgZHVtcCBtZXNzYWdlcyBjb250YWluIHRoZSBzYW1lIGdlbmVyYXRpb24gbnVtYmVyLiBJZiBpdAorICogICBjaGFuZ2VkIHRoZW4gdGhlIGxpc3QgY2hhbmdlZCBhbmQgdGhlIGR1bXAgc2hvdWxkIGJlIHJlcGVhdGVkCisgKiAgIGNvbXBsZXRlbHkgZnJvbSBzY3JhdGNoLgorICoKKyAqIEBOTDgwMjExX0FUVFJfNEFERFI6IFVzZSA0LWFkZHJlc3MgZnJhbWVzIG9uIGEgdmlydHVhbCBpbnRlcmZhY2UKKyAqCisgKiBATkw4MDIxMV9BVFRSX1NVUlZFWV9JTkZPOiBzdXJ2ZXkgaW5mb3JtYXRpb24gYWJvdXQgYSBjaGFubmVsLCBwYXJ0IG9mCisgKiAgICAgIHRoZSBzdXJ2ZXkgcmVzcG9uc2UgZm9yICVOTDgwMjExX0NNRF9HRVRfU1VSVkVZLCBuZXN0ZWQgYXR0cmlidXRlCisgKiAgICAgIGNvbnRhaW5pbmcgaW5mbyBhcyBwb3NzaWJsZSwgc2VlICZlbnVtIHN1cnZleV9pbmZvLgorICoKKyAqIEBOTDgwMjExX0FUVFJfTUFYOiBoaWdoZXN0IGF0dHJpYnV0ZSBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKKyAqIEBfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqLworZW51bSBubDgwMjExX2F0dHJzIHsKKy8qIGRvbid0IGNoYW5nZSB0aGUgb3JkZXIgb3IgYWRkIGFueXRoaW5nIGluYmV0d2VlbiwgdGhpcyBpcyBBQkkhICovCisgICBOTDgwMjExX0FUVFJfVU5TUEVDLAorCisgICBOTDgwMjExX0FUVFJfV0lQSFksCisgICBOTDgwMjExX0FUVFJfV0lQSFlfTkFNRSwKKworICAgTkw4MDIxMV9BVFRSX0lGSU5ERVgsCisgICBOTDgwMjExX0FUVFJfSUZOQU1FLAorICAgTkw4MDIxMV9BVFRSX0lGVFlQRSwKKworICAgTkw4MDIxMV9BVFRSX01BQywKKworICAgTkw4MDIxMV9BVFRSX0tFWV9EQVRBLAorICAgTkw4MDIxMV9BVFRSX0tFWV9JRFgsCisgICBOTDgwMjExX0FUVFJfS0VZX0NJUEhFUiwKKyAgIE5MODAyMTFfQVRUUl9LRVlfU0VRLAorICAgTkw4MDIxMV9BVFRSX0tFWV9ERUZBVUxULAorCisgICBOTDgwMjExX0FUVFJfQkVBQ09OX0lOVEVSVkFMLAorICAgTkw4MDIxMV9BVFRSX0RUSU1fUEVSSU9ELAorICAgTkw4MDIxMV9BVFRSX0JFQUNPTl9IRUFELAorICAgTkw4MDIxMV9BVFRSX0JFQUNPTl9UQUlMLAorCisgICBOTDgwMjExX0FUVFJfU1RBX0FJRCwKKyAgIE5MODAyMTFfQVRUUl9TVEFfRkxBR1MsCisgICBOTDgwMjExX0FUVFJfU1RBX0xJU1RFTl9JTlRFUlZBTCwKKyAgIE5MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX1JBVEVTLAorICAgTkw4MDIxMV9BVFRSX1NUQV9WTEFOLAorICAgTkw4MDIxMV9BVFRSX1NUQV9JTkZPLAorCisgICBOTDgwMjExX0FUVFJfV0lQSFlfQkFORFMsCisKKyAgIE5MODAyMTFfQVRUUl9NTlRSX0ZMQUdTLAorCisgICBOTDgwMjExX0FUVFJfTUVTSF9JRCwKKyAgIE5MODAyMTFfQVRUUl9TVEFfUExJTktfQUNUSU9OLAorICAgTkw4MDIxMV9BVFRSX01QQVRIX05FWFRfSE9QLAorICAgTkw4MDIxMV9BVFRSX01QQVRIX0lORk8sCisKKyAgIE5MODAyMTFfQVRUUl9CU1NfQ1RTX1BST1QsCisgICBOTDgwMjExX0FUVFJfQlNTX1NIT1JUX1BSRUFNQkxFLAorICAgTkw4MDIxMV9BVFRSX0JTU19TSE9SVF9TTE9UX1RJTUUsCisKKyAgIE5MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZLAorCisgICBOTDgwMjExX0FUVFJfU1VQUE9SVEVEX0lGVFlQRVMsCisKKyAgIE5MODAyMTFfQVRUUl9SRUdfQUxQSEEyLAorICAgTkw4MDIxMV9BVFRSX1JFR19SVUxFUywKKworICAgTkw4MDIxMV9BVFRSX01FU0hfUEFSQU1TLAorCisgICBOTDgwMjExX0FUVFJfQlNTX0JBU0lDX1JBVEVTLAorCisgICBOTDgwMjExX0FUVFJfV0lQSFlfVFhRX1BBUkFNUywKKyAgIE5MODAyMTFfQVRUUl9XSVBIWV9GUkVRLAorICAgTkw4MDIxMV9BVFRSX1dJUEhZX0NIQU5ORUxfVFlQRSwKKworICAgTkw4MDIxMV9BVFRSX0tFWV9ERUZBVUxUX01HTVQsCisKKyAgIE5MODAyMTFfQVRUUl9NR01UX1NVQlRZUEUsCisgICBOTDgwMjExX0FUVFJfSUUsCisKKyAgIE5MODAyMTFfQVRUUl9NQVhfTlVNX1NDQU5fU1NJRFMsCisKKyAgIE5MODAyMTFfQVRUUl9TQ0FOX0ZSRVFVRU5DSUVTLAorICAgTkw4MDIxMV9BVFRSX1NDQU5fU1NJRFMsCisgICBOTDgwMjExX0FUVFJfR0VORVJBVElPTiwgLyogcmVwbGFjZXMgb2xkIFNDQU5fR0VORVJBVElPTiAqLworICAgTkw4MDIxMV9BVFRSX0JTUywKKworICAgTkw4MDIxMV9BVFRSX1JFR19JTklUSUFUT1IsCisgICBOTDgwMjExX0FUVFJfUkVHX1RZUEUsCisKKyAgIE5MODAyMTFfQVRUUl9TVVBQT1JURURfQ09NTUFORFMsCisKKyAgIE5MODAyMTFfQVRUUl9GUkFNRSwKKyAgIE5MODAyMTFfQVRUUl9TU0lELAorICAgTkw4MDIxMV9BVFRSX0FVVEhfVFlQRSwKKyAgIE5MODAyMTFfQVRUUl9SRUFTT05fQ09ERSwKKworICAgTkw4MDIxMV9BVFRSX0tFWV9UWVBFLAorCisgICBOTDgwMjExX0FUVFJfTUFYX1NDQU5fSUVfTEVOLAorICAgTkw4MDIxMV9BVFRSX0NJUEhFUl9TVUlURVMsCisKKyAgIE5MODAyMTFfQVRUUl9GUkVRX0JFRk9SRSwKKyAgIE5MODAyMTFfQVRUUl9GUkVRX0FGVEVSLAorCisgICBOTDgwMjExX0FUVFJfRlJFUV9GSVhFRCwKKworCisgICBOTDgwMjExX0FUVFJfV0lQSFlfUkVUUllfU0hPUlQsCisgICBOTDgwMjExX0FUVFJfV0lQSFlfUkVUUllfTE9ORywKKyAgIE5MODAyMTFfQVRUUl9XSVBIWV9GUkFHX1RIUkVTSE9MRCwKKyAgIE5MODAyMTFfQVRUUl9XSVBIWV9SVFNfVEhSRVNIT0xELAorCisgICBOTDgwMjExX0FUVFJfVElNRURfT1VULAorCisgICBOTDgwMjExX0FUVFJfVVNFX01GUCwKKworICAgTkw4MDIxMV9BVFRSX1NUQV9GTEFHUzIsCisKKyAgIE5MODAyMTFfQVRUUl9DT05UUk9MX1BPUlQsCisKKyAgIE5MODAyMTFfQVRUUl9URVNUREFUQSwKKworICAgTkw4MDIxMV9BVFRSX1BSSVZBQ1ksCisKKyAgIE5MODAyMTFfQVRUUl9ESVNDT05ORUNURURfQllfQVAsCisgICBOTDgwMjExX0FUVFJfU1RBVFVTX0NPREUsCisKKyAgIE5MODAyMTFfQVRUUl9DSVBIRVJfU1VJVEVTX1BBSVJXSVNFLAorICAgTkw4MDIxMV9BVFRSX0NJUEhFUl9TVUlURV9HUk9VUCwKKyAgIE5MODAyMTFfQVRUUl9XUEFfVkVSU0lPTlMsCisgICBOTDgwMjExX0FUVFJfQUtNX1NVSVRFUywKKworICAgTkw4MDIxMV9BVFRSX1JFUV9JRSwKKyAgIE5MODAyMTFfQVRUUl9SRVNQX0lFLAorCisgICBOTDgwMjExX0FUVFJfUFJFVl9CU1NJRCwKKworICAgTkw4MDIxMV9BVFRSX0tFWSwKKyAgIE5MODAyMTFfQVRUUl9LRVlTLAorCisgICBOTDgwMjExX0FUVFJfUElELAorCisgICBOTDgwMjExX0FUVFJfNEFERFIsCisKKyAgIE5MODAyMTFfQVRUUl9TVVJWRVlfSU5GTywKKworICAgLyogYWRkIGF0dHJpYnV0ZXMgaGVyZSwgdXBkYXRlIHRoZSBwb2xpY3kgaW4gbmw4MDIxMS5jICovCisKKyAgIF9fTkw4MDIxMV9BVFRSX0FGVEVSX0xBU1QsCisgICBOTDgwMjExX0FUVFJfTUFYID0gX19OTDgwMjExX0FUVFJfQUZURVJfTEFTVCAtIDEKK307CisKKy8qIHNvdXJjZS1sZXZlbCBBUEkgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBOTDgwMjExX0FUVFJfU0NBTl9HRU5FUkFUSU9OIE5MODAyMTFfQVRUUl9HRU5FUkFUSU9OCisKKy8qCisgKiBBbGxvdyB1c2VyIHNwYWNlIHByb2dyYW1zIHRvIHVzZSAjaWZkZWYgb24gbmV3IGF0dHJpYnV0ZXMgYnkgZGVmaW5pbmcgdGhlbQorICogaGVyZQorICovCisjZGVmaW5lIE5MODAyMTFfQ01EX0NPTk5FQ1QgTkw4MDIxMV9DTURfQ09OTkVDVAorI2RlZmluZSBOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWSBOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWQorI2RlZmluZSBOTDgwMjExX0FUVFJfQlNTX0JBU0lDX1JBVEVTIE5MODAyMTFfQVRUUl9CU1NfQkFTSUNfUkFURVMKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX1dJUEhZX1RYUV9QQVJBTVMgTkw4MDIxMV9BVFRSX1dJUEhZX1RYUV9QQVJBTVMKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEgTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX1dJUEhZX0NIQU5ORUxfVFlQRSBOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFCisjZGVmaW5lIE5MODAyMTFfQVRUUl9NR01UX1NVQlRZUEUgTkw4MDIxMV9BVFRSX01HTVRfU1VCVFlQRQorI2RlZmluZSBOTDgwMjExX0FUVFJfSUUgTkw4MDIxMV9BVFRSX0lFCisjZGVmaW5lIE5MODAyMTFfQVRUUl9SRUdfSU5JVElBVE9SIE5MODAyMTFfQVRUUl9SRUdfSU5JVElBVE9SCisjZGVmaW5lIE5MODAyMTFfQVRUUl9SRUdfVFlQRSBOTDgwMjExX0FUVFJfUkVHX1RZUEUKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX0ZSQU1FIE5MODAyMTFfQVRUUl9GUkFNRQorI2RlZmluZSBOTDgwMjExX0FUVFJfU1NJRCBOTDgwMjExX0FUVFJfU1NJRAorI2RlZmluZSBOTDgwMjExX0FUVFJfQVVUSF9UWVBFIE5MODAyMTFfQVRUUl9BVVRIX1RZUEUKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX1JFQVNPTl9DT0RFIE5MODAyMTFfQVRUUl9SRUFTT05fQ09ERQorI2RlZmluZSBOTDgwMjExX0FUVFJfQ0lQSEVSX1NVSVRFU19QQUlSV0lTRSBOTDgwMjExX0FUVFJfQ0lQSEVSX1NVSVRFU19QQUlSV0lTRQorI2RlZmluZSBOTDgwMjExX0FUVFJfQ0lQSEVSX1NVSVRFX0dST1VQIE5MODAyMTFfQVRUUl9DSVBIRVJfU1VJVEVfR1JPVVAKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX1dQQV9WRVJTSU9OUyBOTDgwMjExX0FUVFJfV1BBX1ZFUlNJT05TCisjZGVmaW5lIE5MODAyMTFfQVRUUl9BS01fU1VJVEVTIE5MODAyMTFfQVRUUl9BS01fU1VJVEVTCisjZGVmaW5lIE5MODAyMTFfQVRUUl9LRVkgTkw4MDIxMV9BVFRSX0tFWQorI2RlZmluZSBOTDgwMjExX0FUVFJfS0VZUyBOTDgwMjExX0FUVFJfS0VZUworCisjZGVmaW5lIE5MODAyMTFfTUFYX1NVUFBfUkFURVMgICAgICAgICAzMgorI2RlZmluZSBOTDgwMjExX01BWF9TVVBQX1JFR19SVUxFUyAgICAgIDMyCisjZGVmaW5lIE5MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9FTkNSX0tFWSAgIDAKKyNkZWZpbmUgTkw4MDIxMV9US0lQX0RBVEFfT0ZGU0VUX1RYX01JQ19LRVkgICAxNgorI2RlZmluZSBOTDgwMjExX1RLSVBfREFUQV9PRkZTRVRfUlhfTUlDX0tFWSAgIDI0CisjZGVmaW5lIE5MODAyMTFfSFRfQ0FQQUJJTElUWV9MRU4gICAgICAyNgorCisjZGVmaW5lIE5MODAyMTFfTUFYX05SX0NJUEhFUl9TVUlURVMgICAgICA1CisjZGVmaW5lIE5MODAyMTFfTUFYX05SX0FLTV9TVUlURVMgICAgICAyCisKKy8qKgorICogZW51bSBubDgwMjExX2lmdHlwZSAtICh2aXJ0dWFsKSBpbnRlcmZhY2UgdHlwZXMKKyAqCisgKiBATkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ6IHVuc3BlY2lmaWVkIHR5cGUsIGRyaXZlciBkZWNpZGVzCisgKiBATkw4MDIxMV9JRlRZUEVfQURIT0M6IGluZGVwZW5kZW50IEJTUyBtZW1iZXIKKyAqIEBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOiBtYW5hZ2VkIEJTUyBtZW1iZXIKKyAqIEBOTDgwMjExX0lGVFlQRV9BUDogYWNjZXNzIHBvaW50CisgKiBATkw4MDIxMV9JRlRZUEVfQVBfVkxBTjogVkxBTiBpbnRlcmZhY2UgZm9yIGFjY2VzcyBwb2ludHMKKyAqIEBOTDgwMjExX0lGVFlQRV9XRFM6IHdpcmVsZXNzIGRpc3RyaWJ1dGlvbiBpbnRlcmZhY2UKKyAqIEBOTDgwMjExX0lGVFlQRV9NT05JVE9SOiBtb25pdG9yIGludGVyZmFjZSByZWNlaXZpbmcgYWxsIGZyYW1lcworICogQE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6IG1lc2ggcG9pbnQKKyAqIEBOTDgwMjExX0lGVFlQRV9NQVg6IGhpZ2hlc3QgaW50ZXJmYWNlIHR5cGUgbnVtYmVyIGN1cnJlbnRseSBkZWZpbmVkCisgKiBAX19OTDgwMjExX0lGVFlQRV9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqCisgKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgd2l0aCB0aGUgJU5MODAyMTFfQVRUUl9JRlRZUEUKKyAqIHRvIHNldCB0aGUgdHlwZSBvZiBhbiBpbnRlcmZhY2UuCisgKgorICovCitlbnVtIG5sODAyMTFfaWZ0eXBlIHsKKyAgIE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVELAorICAgTkw4MDIxMV9JRlRZUEVfQURIT0MsCisgICBOTDgwMjExX0lGVFlQRV9TVEFUSU9OLAorICAgTkw4MDIxMV9JRlRZUEVfQVAsCisgICBOTDgwMjExX0lGVFlQRV9BUF9WTEFOLAorICAgTkw4MDIxMV9JRlRZUEVfV0RTLAorICAgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiwKKyAgIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQsCisKKyAgIC8qIGtlZXAgbGFzdCAqLworICAgX19OTDgwMjExX0lGVFlQRV9BRlRFUl9MQVNULAorICAgTkw4MDIxMV9JRlRZUEVfTUFYID0gX19OTDgwMjExX0lGVFlQRV9BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfc3RhX2ZsYWdzIC0gc3RhdGlvbiBmbGFncworICoKKyAqIFN0YXRpb24gZmxhZ3MuIFdoZW4gYSBzdGF0aW9uIGlzIGFkZGVkIHRvIGFuIEFQIGludGVyZmFjZSwgaXQgaXMKKyAqIGFzc3VtZWQgdG8gYmUgYWxyZWFkeSBhc3NvY2lhdGVkIChhbmQgaGVuY2UgYXV0aGVudGljYXRlZC4pCisgKgorICogQE5MODAyMTFfU1RBX0ZMQUdfQVVUSE9SSVpFRDogc3RhdGlvbiBpcyBhdXRob3JpemVkICg4MDIuMVgpCisgKiBATkw4MDIxMV9TVEFfRkxBR19TSE9SVF9QUkVBTUJMRTogc3RhdGlvbiBpcyBjYXBhYmxlIG9mIHJlY2VpdmluZyBmcmFtZXMKKyAqICAgd2l0aCBzaG9ydCBiYXJrZXIgcHJlYW1ibGUKKyAqIEBOTDgwMjExX1NUQV9GTEFHX1dNRTogc3RhdGlvbiBpcyBXTUUvUW9TIGNhcGFibGUKKyAqIEBOTDgwMjExX1NUQV9GTEFHX01GUDogc3RhdGlvbiB1c2VzIG1hbmFnZW1lbnQgZnJhbWUgcHJvdGVjdGlvbgorICovCitlbnVtIG5sODAyMTFfc3RhX2ZsYWdzIHsKKyAgIF9fTkw4MDIxMV9TVEFfRkxBR19JTlZBTElELAorICAgTkw4MDIxMV9TVEFfRkxBR19BVVRIT1JJWkVELAorICAgTkw4MDIxMV9TVEFfRkxBR19TSE9SVF9QUkVBTUJMRSwKKyAgIE5MODAyMTFfU1RBX0ZMQUdfV01FLAorICAgTkw4MDIxMV9TVEFfRkxBR19NRlAsCisKKyAgIC8qIGtlZXAgbGFzdCAqLworICAgX19OTDgwMjExX1NUQV9GTEFHX0FGVEVSX0xBU1QsCisgICBOTDgwMjExX1NUQV9GTEFHX01BWCA9IF9fTkw4MDIxMV9TVEFfRkxBR19BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBzdHJ1Y3Qgbmw4MDIxMV9zdGFfZmxhZ191cGRhdGUgLSBzdGF0aW9uIGZsYWdzIG1hc2svc2V0CisgKiBAbWFzazogbWFzayBvZiBzdGF0aW9uIGZsYWdzIHRvIHNldAorICogQHNldDogd2hpY2ggdmFsdWVzIHRvIHNldCB0aGVtIHRvCisgKgorICogQm90aCBtYXNrIGFuZCBzZXQgY29udGFpbiBiaXRzIGFzIHBlciAmZW51bSBubDgwMjExX3N0YV9mbGFncy4KKyAqLworc3RydWN0IG5sODAyMTFfc3RhX2ZsYWdfdXBkYXRlIHsKKyAgIF9fdTMyIG1hc2s7CisgICBfX3UzMiBzZXQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKioKKyAqIGVudW0gbmw4MDIxMV9yYXRlX2luZm8gLSBiaXRyYXRlIGluZm9ybWF0aW9uCisgKgorICogVGhlc2UgYXR0cmlidXRlIHR5cGVzIGFyZSB1c2VkIHdpdGggJU5MODAyMTFfU1RBX0lORk9fVFhSQVRFCisgKiB3aGVuIGdldHRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJpdHJhdGUgb2YgYSBzdGF0aW9uLgorICoKKyAqIEBfX05MODAyMTFfUkFURV9JTkZPX0lOVkFMSUQ6IGF0dHJpYnV0ZSBudW1iZXIgMCBpcyByZXNlcnZlZAorICogQE5MODAyMTFfUkFURV9JTkZPX0JJVFJBVEU6IHRvdGFsIGJpdHJhdGUgKHUxNiwgMTAwa2JpdC9zKQorICogQE5MODAyMTFfUkFURV9JTkZPX01DUzogbWNzIGluZGV4IGZvciA4MDIuMTFuICh1OCkKKyAqIEBOTDgwMjExX1JBVEVfSU5GT180MF9NSFpfV0lEVEg6IDQwIE1oeiBkdWFsY2hhbm5lbCBiaXRyYXRlCisgKiBATkw4MDIxMV9SQVRFX0lORk9fU0hPUlRfR0k6IDQwMG5zIGd1YXJkIGludGVydmFsCisgKiBATkw4MDIxMV9SQVRFX0lORk9fTUFYOiBoaWdoZXN0IHJhdGVfaW5mbyBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKKyAqIEBfX05MODAyMTFfUkFURV9JTkZPX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQorICovCitlbnVtIG5sODAyMTFfcmF0ZV9pbmZvIHsKKyAgIF9fTkw4MDIxMV9SQVRFX0lORk9fSU5WQUxJRCwKKyAgIE5MODAyMTFfUkFURV9JTkZPX0JJVFJBVEUsCisgICBOTDgwMjExX1JBVEVfSU5GT19NQ1MsCisgICBOTDgwMjExX1JBVEVfSU5GT180MF9NSFpfV0lEVEgsCisgICBOTDgwMjExX1JBVEVfSU5GT19TSE9SVF9HSSwKKworICAgLyoga2VlcCBsYXN0ICovCisgICBfX05MODAyMTFfUkFURV9JTkZPX0FGVEVSX0xBU1QsCisgICBOTDgwMjExX1JBVEVfSU5GT19NQVggPSBfX05MODAyMTFfUkFURV9JTkZPX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9zdGFfaW5mbyAtIHN0YXRpb24gaW5mb3JtYXRpb24KKyAqCisgKiBUaGVzZSBhdHRyaWJ1dGUgdHlwZXMgYXJlIHVzZWQgd2l0aCAlTkw4MDIxMV9BVFRSX1NUQV9JTkZPCisgKiB3aGVuIGdldHRpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBzdGF0aW9uLgorICoKKyAqIEBfX05MODAyMTFfU1RBX0lORk9fSU5WQUxJRDogYXR0cmlidXRlIG51bWJlciAwIGlzIHJlc2VydmVkCisgKiBATkw4MDIxMV9TVEFfSU5GT19JTkFDVElWRV9USU1FOiB0aW1lIHNpbmNlIGxhc3QgYWN0aXZpdHkgKHUzMiwgbXNlY3MpCisgKiBATkw4MDIxMV9TVEFfSU5GT19SWF9CWVRFUzogdG90YWwgcmVjZWl2ZWQgYnl0ZXMgKHUzMiwgZnJvbSB0aGlzIHN0YXRpb24pCisgKiBATkw4MDIxMV9TVEFfSU5GT19UWF9CWVRFUzogdG90YWwgdHJhbnNtaXR0ZWQgYnl0ZXMgKHUzMiwgdG8gdGhpcyBzdGF0aW9uKQorICogQF9fTkw4MDIxMV9TVEFfSU5GT19BRlRFUl9MQVNUOiBpbnRlcm5hbAorICogQE5MODAyMTFfU1RBX0lORk9fTUFYOiBoaWdoZXN0IHBvc3NpYmxlIHN0YXRpb24gaW5mbyBhdHRyaWJ1dGUKKyAqIEBOTDgwMjExX1NUQV9JTkZPX1NJR05BTDogc2lnbmFsIHN0cmVuZ3RoIG9mIGxhc3QgcmVjZWl2ZWQgUFBEVSAodTgsIGRCbSkKKyAqIEBOTDgwMjExX1NUQV9JTkZPX1RYX0JJVFJBVEU6IGN1cnJlbnQgdW5pY2FzdCB0eCByYXRlLCBuZXN0ZWQgYXR0cmlidXRlCisgKiAgIGNvbnRhaW5pbmcgaW5mbyBhcyBwb3NzaWJsZSwgc2VlICZlbnVtIG5sODAyMTFfc3RhX2luZm9fdHhyYXRlLgorICogQE5MODAyMTFfU1RBX0lORk9fUlhfUEFDS0VUUzogdG90YWwgcmVjZWl2ZWQgcGFja2V0ICh1MzIsIGZyb20gdGhpcyBzdGF0aW9uKQorICogQE5MODAyMTFfU1RBX0lORk9fVFhfUEFDS0VUUzogdG90YWwgdHJhbnNtaXR0ZWQgcGFja2V0cyAodTMyLCB0byB0aGlzCisgKiAgIHN0YXRpb24pCisgKi8KK2VudW0gbmw4MDIxMV9zdGFfaW5mbyB7CisgICBfX05MODAyMTFfU1RBX0lORk9fSU5WQUxJRCwKKyAgIE5MODAyMTFfU1RBX0lORk9fSU5BQ1RJVkVfVElNRSwKKyAgIE5MODAyMTFfU1RBX0lORk9fUlhfQllURVMsCisgICBOTDgwMjExX1NUQV9JTkZPX1RYX0JZVEVTLAorICAgTkw4MDIxMV9TVEFfSU5GT19MTElELAorICAgTkw4MDIxMV9TVEFfSU5GT19QTElELAorICAgTkw4MDIxMV9TVEFfSU5GT19QTElOS19TVEFURSwKKyAgIE5MODAyMTFfU1RBX0lORk9fU0lHTkFMLAorICAgTkw4MDIxMV9TVEFfSU5GT19UWF9CSVRSQVRFLAorICAgTkw4MDIxMV9TVEFfSU5GT19SWF9QQUNLRVRTLAorICAgTkw4MDIxMV9TVEFfSU5GT19UWF9QQUNLRVRTLAorCisgICAvKiBrZWVwIGxhc3QgKi8KKyAgIF9fTkw4MDIxMV9TVEFfSU5GT19BRlRFUl9MQVNULAorICAgTkw4MDIxMV9TVEFfSU5GT19NQVggPSBfX05MODAyMTFfU1RBX0lORk9fQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX21wYXRoX2ZsYWdzIC0gbmw4MDIxMSBtZXNoIHBhdGggZmxhZ3MKKyAqCisgKiBATkw4MDIxMV9NUEFUSF9GTEFHX0FDVElWRTogdGhlIG1lc2ggcGF0aCBpcyBhY3RpdmUKKyAqIEBOTDgwMjExX01QQVRIX0ZMQUdfUkVTT0xWSU5HOiB0aGUgbWVzaCBwYXRoIGRpc2NvdmVyeSBwcm9jZXNzIGlzIHJ1bm5pbmcKKyAqIEBOTDgwMjExX01QQVRIX0ZMQUdfU05fVkFMSUQ6IHRoZSBtZXNoIHBhdGggY29udGFpbnMgYSB2YWxpZCBTTgorICogQE5MODAyMTFfTVBBVEhfRkxBR19GSVhFRDogdGhlIG1lc2ggcGF0aCBoYXMgYmVlbiBtYW51YWxseSBzZXQKKyAqIEBOTDgwMjExX01QQVRIX0ZMQUdfUkVTT0xWRUQ6IHRoZSBtZXNoIHBhdGggZGlzY292ZXJ5IHByb2Nlc3Mgc3VjY2VlZGVkCisgKi8KK2VudW0gbmw4MDIxMV9tcGF0aF9mbGFncyB7CisgICBOTDgwMjExX01QQVRIX0ZMQUdfQUNUSVZFID0gICAxPDwwLAorICAgTkw4MDIxMV9NUEFUSF9GTEFHX1JFU09MVklORyA9ICAgMTw8MSwKKyAgIE5MODAyMTFfTVBBVEhfRkxBR19TTl9WQUxJRCA9ICAgMTw8MiwKKyAgIE5MODAyMTFfTVBBVEhfRkxBR19GSVhFRCA9ICAgMTw8MywKKyAgIE5MODAyMTFfTVBBVEhfRkxBR19SRVNPTFZFRCA9ICAgMTw8NCwKK307CisKKy8qKgorICogZW51bSBubDgwMjExX21wYXRoX2luZm8gLSBtZXNoIHBhdGggaW5mb3JtYXRpb24KKyAqCisgKiBUaGVzZSBhdHRyaWJ1dGUgdHlwZXMgYXJlIHVzZWQgd2l0aCAlTkw4MDIxMV9BVFRSX01QQVRIX0lORk8gd2hlbiBnZXR0aW5nCisgKiBpbmZvcm1hdGlvbiBhYm91dCBhIG1lc2ggcGF0aC4KKyAqCisgKiBAX19OTDgwMjExX01QQVRIX0lORk9fSU5WQUxJRDogYXR0cmlidXRlIG51bWJlciAwIGlzIHJlc2VydmVkCisgKiBATkw4MDIxMV9BVFRSX01QQVRIX0ZSQU1FX1FMRU46IG51bWJlciBvZiBxdWV1ZWQgZnJhbWVzIGZvciB0aGlzIGRlc3RpbmF0aW9uCisgKiBATkw4MDIxMV9BVFRSX01QQVRIX1NOOiBkZXN0aW5hdGlvbiBzZXF1ZW5jZSBudW1iZXIKKyAqIEBOTDgwMjExX0FUVFJfTVBBVEhfTUVUUklDOiBtZXRyaWMgKGNvc3QpIG9mIHRoaXMgbWVzaCBwYXRoCisgKiBATkw4MDIxMV9BVFRSX01QQVRIX0VYUFRJTUU6IGV4cGlyYXRpb24gdGltZSBmb3IgdGhlIHBhdGgsIGluIG1zZWMgZnJvbSBub3cKKyAqIEBOTDgwMjExX0FUVFJfTVBBVEhfRkxBR1M6IG1lc2ggcGF0aCBmbGFncywgZW51bWVyYXRlZCBpbgorICogICAmZW51bSBubDgwMjExX21wYXRoX2ZsYWdzOworICogQE5MODAyMTFfQVRUUl9NUEFUSF9ESVNDT1ZFUllfVElNRU9VVDogdG90YWwgcGF0aCBkaXNjb3ZlcnkgdGltZW91dCwgaW4gbXNlYworICogQE5MODAyMTFfQVRUUl9NUEFUSF9ESVNDT1ZFUllfUkVUUklFUzogbWVzaCBwYXRoIGRpc2NvdmVyeSByZXRyaWVzCisgKi8KK2VudW0gbmw4MDIxMV9tcGF0aF9pbmZvIHsKKyAgIF9fTkw4MDIxMV9NUEFUSF9JTkZPX0lOVkFMSUQsCisgICBOTDgwMjExX01QQVRIX0lORk9fRlJBTUVfUUxFTiwKKyAgIE5MODAyMTFfTVBBVEhfSU5GT19TTiwKKyAgIE5MODAyMTFfTVBBVEhfSU5GT19NRVRSSUMsCisgICBOTDgwMjExX01QQVRIX0lORk9fRVhQVElNRSwKKyAgIE5MODAyMTFfTVBBVEhfSU5GT19GTEFHUywKKyAgIE5MODAyMTFfTVBBVEhfSU5GT19ESVNDT1ZFUllfVElNRU9VVCwKKyAgIE5MODAyMTFfTVBBVEhfSU5GT19ESVNDT1ZFUllfUkVUUklFUywKKworICAgLyoga2VlcCBsYXN0ICovCisgICBfX05MODAyMTFfTVBBVEhfSU5GT19BRlRFUl9MQVNULAorICAgTkw4MDIxMV9NUEFUSF9JTkZPX01BWCA9IF9fTkw4MDIxMV9NUEFUSF9JTkZPX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9iYW5kX2F0dHIgLSBiYW5kIGF0dHJpYnV0ZXMKKyAqIEBfX05MODAyMTFfQkFORF9BVFRSX0lOVkFMSUQ6IGF0dHJpYnV0ZSBudW1iZXIgMCBpcyByZXNlcnZlZAorICogQE5MODAyMTFfQkFORF9BVFRSX0ZSRVFTOiBzdXBwb3J0ZWQgZnJlcXVlbmNpZXMgaW4gdGhpcyBiYW5kLAorICogICBhbiBhcnJheSBvZiBuZXN0ZWQgZnJlcXVlbmN5IGF0dHJpYnV0ZXMKKyAqIEBOTDgwMjExX0JBTkRfQVRUUl9SQVRFUzogc3VwcG9ydGVkIGJpdHJhdGVzIGluIHRoaXMgYmFuZCwKKyAqICAgYW4gYXJyYXkgb2YgbmVzdGVkIGJpdHJhdGUgYXR0cmlidXRlcworICogQE5MODAyMTFfQkFORF9BVFRSX0hUX01DU19TRVQ6IDE2LWJ5dGUgYXR0cmlidXRlIGNvbnRhaW5pbmcgdGhlIE1DUyBzZXQgYXMKKyAqICAgZGVmaW5lZCBpbiA4MDIuMTFuCisgKiBATkw4MDIxMV9CQU5EX0FUVFJfSFRfQ0FQQTogSFQgY2FwYWJpbGl0aWVzLCBhcyBpbiB0aGUgSFQgaW5mb3JtYXRpb24gSUUKKyAqIEBOTDgwMjExX0JBTkRfQVRUUl9IVF9BTVBEVV9GQUNUT1I6IEEtTVBEVSBmYWN0b3IsIGFzIGluIDExbgorICogQE5MODAyMTFfQkFORF9BVFRSX0hUX0FNUERVX0RFTlNJVFk6IEEtTVBEVSBkZW5zaXR5LCBhcyBpbiAxMW4KKyAqLworZW51bSBubDgwMjExX2JhbmRfYXR0ciB7CisgICBfX05MODAyMTFfQkFORF9BVFRSX0lOVkFMSUQsCisgICBOTDgwMjExX0JBTkRfQVRUUl9GUkVRUywKKyAgIE5MODAyMTFfQkFORF9BVFRSX1JBVEVTLAorCisgICBOTDgwMjExX0JBTkRfQVRUUl9IVF9NQ1NfU0VULAorICAgTkw4MDIxMV9CQU5EX0FUVFJfSFRfQ0FQQSwKKyAgIE5MODAyMTFfQkFORF9BVFRSX0hUX0FNUERVX0ZBQ1RPUiwKKyAgIE5MODAyMTFfQkFORF9BVFRSX0hUX0FNUERVX0RFTlNJVFksCisKKyAgIC8qIGtlZXAgbGFzdCAqLworICAgX19OTDgwMjExX0JBTkRfQVRUUl9BRlRFUl9MQVNULAorICAgTkw4MDIxMV9CQU5EX0FUVFJfTUFYID0gX19OTDgwMjExX0JBTkRfQVRUUl9BRlRFUl9MQVNUIC0gMQorfTsKKworI2RlZmluZSBOTDgwMjExX0JBTkRfQVRUUl9IVF9DQVBBIE5MODAyMTFfQkFORF9BVFRSX0hUX0NBUEEKKworLyoqCisgKiBlbnVtIG5sODAyMTFfZnJlcXVlbmN5X2F0dHIgLSBmcmVxdWVuY3kgYXR0cmlidXRlcworICogQE5MODAyMTFfRlJFUVVFTkNZX0FUVFJfRlJFUTogRnJlcXVlbmN5IGluIE1IegorICogQE5MODAyMTFfRlJFUVVFTkNZX0FUVFJfRElTQUJMRUQ6IENoYW5uZWwgaXMgZGlzYWJsZWQgaW4gY3VycmVudAorICogICByZWd1bGF0b3J5IGRvbWFpbi4KKyAqIEBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX1BBU1NJVkVfU0NBTjogT25seSBwYXNzaXZlIHNjYW5uaW5nIGlzCisgKiAgIHBlcm1pdHRlZCBvbiB0aGlzIGNoYW5uZWwgaW4gY3VycmVudCByZWd1bGF0b3J5IGRvbWFpbi4KKyAqIEBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX05PX0lCU1M6IElCU1MgbmV0d29ya3MgYXJlIG5vdCBwZXJtaXR0ZWQKKyAqICAgb24gdGhpcyBjaGFubmVsIGluIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uCisgKiBATkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9SQURBUjogUmFkYXIgZGV0ZWN0aW9uIGlzIG1hbmRhdG9yeQorICogICBvbiB0aGlzIGNoYW5uZWwgaW4gY3VycmVudCByZWd1bGF0b3J5IGRvbWFpbi4KKyAqIEBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX01BWF9UWF9QT1dFUjogTWF4aW11bSB0cmFuc21pc3Npb24gcG93ZXIgaW4gbUJtCisgKiAgICgxMDAgKiBkQm0pLgorICovCitlbnVtIG5sODAyMTFfZnJlcXVlbmN5X2F0dHIgeworICAgX19OTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0lOVkFMSUQsCisgICBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0ZSRVEsCisgICBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0RJU0FCTEVELAorICAgTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9QQVNTSVZFX1NDQU4sCisgICBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX05PX0lCU1MsCisgICBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX1JBREFSLAorICAgTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9NQVhfVFhfUE9XRVIsCisKKyAgIC8qIGtlZXAgbGFzdCAqLworICAgX19OTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0FGVEVSX0xBU1QsCisgICBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX01BWCA9IF9fTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9BRlRFUl9MQVNUIC0gMQorfTsKKworI2RlZmluZSBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX01BWF9UWF9QT1dFUiBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX01BWF9UWF9QT1dFUgorCisvKioKKyAqIGVudW0gbmw4MDIxMV9iaXRyYXRlX2F0dHIgLSBiaXRyYXRlIGF0dHJpYnV0ZXMKKyAqIEBOTDgwMjExX0JJVFJBVEVfQVRUUl9SQVRFOiBCaXRyYXRlIGluIHVuaXRzIG9mIDEwMCBrYnBzCisgKiBATkw4MDIxMV9CSVRSQVRFX0FUVFJfMkdIWl9TSE9SVFBSRUFNQkxFOiBTaG9ydCBwcmVhbWJsZSBzdXBwb3J0ZWQKKyAqICAgaW4gMi40IEdIeiBiYW5kLgorICovCitlbnVtIG5sODAyMTFfYml0cmF0ZV9hdHRyIHsKKyAgIF9fTkw4MDIxMV9CSVRSQVRFX0FUVFJfSU5WQUxJRCwKKyAgIE5MODAyMTFfQklUUkFURV9BVFRSX1JBVEUsCisgICBOTDgwMjExX0JJVFJBVEVfQVRUUl8yR0haX1NIT1JUUFJFQU1CTEUsCisKKyAgIC8qIGtlZXAgbGFzdCAqLworICAgX19OTDgwMjExX0JJVFJBVEVfQVRUUl9BRlRFUl9MQVNULAorICAgTkw4MDIxMV9CSVRSQVRFX0FUVFJfTUFYID0gX19OTDgwMjExX0JJVFJBVEVfQVRUUl9BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfaW5pdGlhdG9yIC0gSW5kaWNhdGVzIHRoZSBpbml0aWF0b3Igb2YgYSByZWcgZG9tYWluIHJlcXVlc3QKKyAqIEBOTDgwMjExX1JFR0RPTV9TRVRfQllfQ09SRTogQ29yZSBxdWVyaWVkIENSREEgZm9yIGEgZHluYW1pYyB3b3JsZAorICogICByZWd1bGF0b3J5IGRvbWFpbi4KKyAqIEBOTDgwMjExX1JFR0RPTV9TRVRfQllfVVNFUjogVXNlciBhc2tlZCB0aGUgd2lyZWxlc3MgY29yZSB0byBzZXQgdGhlCisgKiAgIHJlZ3VsYXRvcnkgZG9tYWluLgorICogQE5MODAyMTFfUkVHRE9NX1NFVF9CWV9EUklWRVI6IGEgd2lyZWxlc3MgZHJpdmVycyBoYXMgaGludGVkIHRvIHRoZQorICogICB3aXJlbGVzcyBjb3JlIGl0IHRoaW5rcyBpdHMga25vd3MgdGhlIHJlZ3VsYXRvcnkgZG9tYWluIHdlIHNob3VsZCBiZSBpbi4KKyAqIEBOTDgwMjExX1JFR0RPTV9TRVRfQllfQ09VTlRSWV9JRTogdGhlIHdpcmVsZXNzIGNvcmUgaGFzIHJlY2VpdmVkIGFuCisgKiAgIDgwMi4xMSBjb3VudHJ5IGluZm9ybWF0aW9uIGVsZW1lbnQgd2l0aCByZWd1bGF0b3J5IGluZm9ybWF0aW9uIGl0CisgKiAgIHRoaW5rcyB3ZSBzaG91bGQgY29uc2lkZXIuCisgKi8KK2VudW0gbmw4MDIxMV9yZWdfaW5pdGlhdG9yIHsKKyAgIE5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1JFLAorICAgTkw4MDIxMV9SRUdET01fU0VUX0JZX1VTRVIsCisgICBOTDgwMjExX1JFR0RPTV9TRVRfQllfRFJJVkVSLAorICAgTkw4MDIxMV9SRUdET01fU0VUX0JZX0NPVU5UUllfSUUsCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9yZWdfdHlwZSAtIHNwZWNpZmllcyB0aGUgdHlwZSBvZiByZWd1bGF0b3J5IGRvbWFpbgorICogQE5MODAyMTFfUkVHRE9NX1RZUEVfQ09VTlRSWTogdGhlIHJlZ3VsYXRvcnkgZG9tYWluIHNldCBpcyBvbmUgdGhhdCBwZXJ0YWlucworICogICB0byBhIHNwZWNpZmljIGNvdW50cnkuIFdoZW4gdGhpcyBpcyBzZXQgeW91IGNhbiBjb3VudCBvbiB0aGUKKyAqICAgSVNPIC8gSUVDIDMxNjYgYWxwaGEyIGNvdW50cnkgY29kZSBiZWluZyB2YWxpZC4KKyAqIEBOTDgwMjExX1JFR0RPTV9UWVBFX1dPUkxEOiB0aGUgcmVndWxhdG9yeSBzZXQgZG9tYWluIGlzIHRoZSB3b3JsZCByZWd1bGF0b3J5CisgKiAgIGRvbWFpbi4KKyAqIEBOTDgwMjExX1JFR0RPTV9UWVBFX0NVU1RPTV9XT1JMRDogdGhlIHJlZ3VsYXRvcnkgZG9tYWluIHNldCBpcyBhIGN1c3RvbQorICogICBkcml2ZXIgc3BlY2lmaWMgd29ybGQgcmVndWxhdG9yeSBkb21haW4uIFRoZXNlIGRvIG5vdCBhcHBseSBzeXN0ZW0td2lkZQorICogICBhbmQgYXJlIG9ubHkgYXBwbGljYWJsZSB0byB0aGUgaW5kaXZpZHVhbCBkZXZpY2VzIHdoaWNoIGhhdmUgcmVxdWVzdGVkCisgKiAgIHRoZW0gdG8gYmUgYXBwbGllZC4KKyAqIEBOTDgwMjExX1JFR0RPTV9UWVBFX0lOVEVSU0VDVElPTjogdGhlIHJlZ3VsYXRvcnkgZG9tYWluIHNldCBpcyB0aGUgcHJvZHVjdAorICogICBvZiBhbiBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0d28gcmVndWxhdG9yeSBkb21haW5zIC0tIHRoZSBwcmV2aW91c2x5CisgKiAgIHNldCByZWd1bGF0b3J5IGRvbWFpbiBvbiB0aGUgc3lzdGVtIGFuZCB0aGUgbGFzdCBhY2NlcHRlZCByZWd1bGF0b3J5CisgKiAgIGRvbWFpbiByZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZC4KKyAqLworZW51bSBubDgwMjExX3JlZ190eXBlIHsKKyAgIE5MODAyMTFfUkVHRE9NX1RZUEVfQ09VTlRSWSwKKyAgIE5MODAyMTFfUkVHRE9NX1RZUEVfV09STEQsCisgICBOTDgwMjExX1JFR0RPTV9UWVBFX0NVU1RPTV9XT1JMRCwKKyAgIE5MODAyMTFfUkVHRE9NX1RZUEVfSU5URVJTRUNUSU9OLAorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfcmVnX3J1bGVfYXR0ciAtIHJlZ3VsYXRvcnkgcnVsZSBhdHRyaWJ1dGVzCisgKiBATkw4MDIxMV9BVFRSX1JFR19SVUxFX0ZMQUdTOiBhIHNldCBvZiBmbGFncyB3aGljaCBzcGVjaWZ5IGFkZGl0aW9uYWwKKyAqICAgY29uc2lkZXJhdGlvbnMgZm9yIGEgZ2l2ZW4gZnJlcXVlbmN5IHJhbmdlLiBUaGVzZSBhcmUgdGhlCisgKiAgICZlbnVtIG5sODAyMTFfcmVnX3J1bGVfZmxhZ3MuCisgKiBATkw4MDIxMV9BVFRSX0ZSRVFfUkFOR0VfU1RBUlQ6IHN0YXJ0aW5nIGZyZXF1ZW5jcnkgZm9yIHRoZSByZWd1bGF0b3J5CisgKiAgIHJ1bGUgaW4gS0h6LiBUaGlzIGlzIG5vdCBhIGNlbnRlciBvZiBmcmVxdWVuY3kgYnV0IGFuIGFjdHVhbCByZWd1bGF0b3J5CisgKiAgIGJhbmQgZWRnZS4KKyAqIEBOTDgwMjExX0FUVFJfRlJFUV9SQU5HRV9FTkQ6IGVuZGluZyBmcmVxdWVuY3kgZm9yIHRoZSByZWd1bGF0b3J5IHJ1bGUKKyAqICAgaW4gS0h6LiBUaGlzIGlzIG5vdCBhIGNlbnRlciBhIGZyZXF1ZW5jeSBidXQgYW4gYWN0dWFsIHJlZ3VsYXRvcnkKKyAqICAgYmFuZCBlZGdlLgorICogQE5MODAyMTFfQVRUUl9GUkVRX1JBTkdFX01BWF9CVzogbWF4aW11bSBhbGxvd2VkIGJhbmR3aWR0aCBmb3IgdGhpcworICogICBmcmVxdWVuY3kgcmFuZ2UsIGluIEtIei4KKyAqIEBOTDgwMjExX0FUVFJfUE9XRVJfUlVMRV9NQVhfQU5UX0dBSU46IHRoZSBtYXhpbXVtIGFsbG93ZWQgYW50ZW5uYSBnYWluCisgKiAgIGZvciBhIGdpdmVuIGZyZXF1ZW5jeSByYW5nZS4gVGhlIHZhbHVlIGlzIGluIG1CaSAoMTAwICogZEJpKS4KKyAqICAgSWYgeW91IGRvbid0IGhhdmUgb25lIHRoZW4gZG9uJ3Qgc2VuZCB0aGlzLgorICogQE5MODAyMTFfQVRUUl9QT1dFUl9SVUxFX01BWF9FSVJQOiB0aGUgbWF4aW11bSBhbGxvd2VkIEVJUlAgZm9yCisgKiAgIGEgZ2l2ZW4gZnJlcXVlbmN5IHJhbmdlLiBUaGUgdmFsdWUgaXMgaW4gbUJtICgxMDAgKiBkQm0pLgorICovCitlbnVtIG5sODAyMTFfcmVnX3J1bGVfYXR0ciB7CisgICBfX05MODAyMTFfUkVHX1JVTEVfQVRUUl9JTlZBTElELAorICAgTkw4MDIxMV9BVFRSX1JFR19SVUxFX0ZMQUdTLAorCisgICBOTDgwMjExX0FUVFJfRlJFUV9SQU5HRV9TVEFSVCwKKyAgIE5MODAyMTFfQVRUUl9GUkVRX1JBTkdFX0VORCwKKyAgIE5MODAyMTFfQVRUUl9GUkVRX1JBTkdFX01BWF9CVywKKworICAgTkw4MDIxMV9BVFRSX1BPV0VSX1JVTEVfTUFYX0FOVF9HQUlOLAorICAgTkw4MDIxMV9BVFRSX1BPV0VSX1JVTEVfTUFYX0VJUlAsCisKKyAgIC8qIGtlZXAgbGFzdCAqLworICAgX19OTDgwMjExX1JFR19SVUxFX0FUVFJfQUZURVJfTEFTVCwKKyAgIE5MODAyMTFfUkVHX1JVTEVfQVRUUl9NQVggPSBfX05MODAyMTFfUkVHX1JVTEVfQVRUUl9BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfcmVnX3J1bGVfZmxhZ3MgLSByZWd1bGF0b3J5IHJ1bGUgZmxhZ3MKKyAqCisgKiBATkw4MDIxMV9SUkZfTk9fT0ZETTogT0ZETSBtb2R1bGF0aW9uIG5vdCBhbGxvd2VkCisgKiBATkw4MDIxMV9SUkZfTk9fQ0NLOiBDQ0sgbW9kdWxhdGlvbiBub3QgYWxsb3dlZAorICogQE5MODAyMTFfUlJGX05PX0lORE9PUjogaW5kb29yIG9wZXJhdGlvbiBub3QgYWxsb3dlZAorICogQE5MODAyMTFfUlJGX05PX09VVERPT1I6IG91dGRvb3Igb3BlcmF0aW9uIG5vdCBhbGxvd2VkCisgKiBATkw4MDIxMV9SUkZfREZTOiBERlMgc3VwcG9ydCBpcyByZXF1aXJlZCB0byBiZSB1c2VkCisgKiBATkw4MDIxMV9SUkZfUFRQX09OTFk6IHRoaXMgaXMgb25seSBmb3IgUG9pbnQgVG8gUG9pbnQgbGlua3MKKyAqIEBOTDgwMjExX1JSRl9QVE1QX09OTFk6IHRoaXMgaXMgb25seSBmb3IgUG9pbnQgVG8gTXVsdGkgUG9pbnQgbGlua3MKKyAqIEBOTDgwMjExX1JSRl9QQVNTSVZFX1NDQU46IHBhc3NpdmUgc2NhbiBpcyByZXF1aXJlZAorICogQE5MODAyMTFfUlJGX05PX0lCU1M6IG5vIElCU1MgaXMgYWxsb3dlZAorICovCitlbnVtIG5sODAyMTFfcmVnX3J1bGVfZmxhZ3MgeworICAgTkw4MDIxMV9SUkZfTk9fT0ZETSAgICAgID0gMTw8MCwKKyAgIE5MODAyMTFfUlJGX05PX0NDSyAgICAgID0gMTw8MSwKKyAgIE5MODAyMTFfUlJGX05PX0lORE9PUiAgICAgID0gMTw8MiwKKyAgIE5MODAyMTFfUlJGX05PX09VVERPT1IgICAgICA9IDE8PDMsCisgICBOTDgwMjExX1JSRl9ERlMgICAgICAgICA9IDE8PDQsCisgICBOTDgwMjExX1JSRl9QVFBfT05MWSAgICAgID0gMTw8NSwKKyAgIE5MODAyMTFfUlJGX1BUTVBfT05MWSAgICAgID0gMTw8NiwKKyAgIE5MODAyMTFfUlJGX1BBU1NJVkVfU0NBTiAgID0gMTw8NywKKyAgIE5MODAyMTFfUlJGX05PX0lCU1MgICAgICA9IDE8PDgsCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9zdXJ2ZXlfaW5mbyAtIHN1cnZleSBpbmZvcm1hdGlvbgorICoKKyAqIFRoZXNlIGF0dHJpYnV0ZSB0eXBlcyBhcmUgdXNlZCB3aXRoICVOTDgwMjExX0FUVFJfU1VSVkVZX0lORk8KKyAqIHdoZW4gZ2V0dGluZyBpbmZvcm1hdGlvbiBhYm91dCBhIHN1cnZleS4KKyAqCisgKiBAX19OTDgwMjExX1NVUlZFWV9JTkZPX0lOVkFMSUQ6IGF0dHJpYnV0ZSBudW1iZXIgMCBpcyByZXNlcnZlZAorICogQE5MODAyMTFfU1VSVkVZX0lORk9fRlJFUVVFTkNZOiBjZW50ZXIgZnJlcXVlbmN5IG9mIGNoYW5uZWwKKyAqIEBOTDgwMjExX1NVUlZFWV9JTkZPX05PSVNFOiBub2lzZSBsZXZlbCBvZiBjaGFubmVsICh1OCwgZEJtKQorICovCitlbnVtIG5sODAyMTFfc3VydmV5X2luZm8geworICAgX19OTDgwMjExX1NVUlZFWV9JTkZPX0lOVkFMSUQsCisgICBOTDgwMjExX1NVUlZFWV9JTkZPX0ZSRVFVRU5DWSwKKyAgIE5MODAyMTFfU1VSVkVZX0lORk9fTk9JU0UsCisKKyAgIC8qIGtlZXAgbGFzdCAqLworICAgX19OTDgwMjExX1NVUlZFWV9JTkZPX0FGVEVSX0xBU1QsCisgICBOTDgwMjExX1NVUlZFWV9JTkZPX01BWCA9IF9fTkw4MDIxMV9TVVJWRVlfSU5GT19BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfbW50cl9mbGFncyAtIG1vbml0b3IgY29uZmlndXJhdGlvbiBmbGFncworICoKKyAqIE1vbml0b3IgY29uZmlndXJhdGlvbiBmbGFncy4KKyAqCisgKiBAX19OTDgwMjExX01OVFJfRkxBR19JTlZBTElEOiByZXNlcnZlZAorICoKKyAqIEBOTDgwMjExX01OVFJfRkxBR19GQ1NGQUlMOiBwYXNzIGZyYW1lcyB3aXRoIGJhZCBGQ1MKKyAqIEBOTDgwMjExX01OVFJfRkxBR19QTENQRkFJTDogcGFzcyBmcmFtZXMgd2l0aCBiYWQgUExDUAorICogQE5MODAyMTFfTU5UUl9GTEFHX0NPTlRST0w6IHBhc3MgY29udHJvbCBmcmFtZXMKKyAqIEBOTDgwMjExX01OVFJfRkxBR19PVEhFUl9CU1M6IGRpc2FibGUgQlNTSUQgZmlsdGVyaW5nCisgKiBATkw4MDIxMV9NTlRSX0ZMQUdfQ09PS19GUkFNRVM6IHJlcG9ydCBmcmFtZXMgYWZ0ZXIgcHJvY2Vzc2luZy4KKyAqICAgb3ZlcnJpZGVzIGFsbCBvdGhlciBmbGFncy4KKyAqCisgKiBAX19OTDgwMjExX01OVFJfRkxBR19BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqIEBOTDgwMjExX01OVFJfRkxBR19NQVg6IGhpZ2hlc3QgcG9zc2libGUgbW9uaXRvciBmbGFnCisgKi8KK2VudW0gbmw4MDIxMV9tbnRyX2ZsYWdzIHsKKyAgIF9fTkw4MDIxMV9NTlRSX0ZMQUdfSU5WQUxJRCwKKyAgIE5MODAyMTFfTU5UUl9GTEFHX0ZDU0ZBSUwsCisgICBOTDgwMjExX01OVFJfRkxBR19QTENQRkFJTCwKKyAgIE5MODAyMTFfTU5UUl9GTEFHX0NPTlRST0wsCisgICBOTDgwMjExX01OVFJfRkxBR19PVEhFUl9CU1MsCisgICBOTDgwMjExX01OVFJfRkxBR19DT09LX0ZSQU1FUywKKworICAgLyoga2VlcCBsYXN0ICovCisgICBfX05MODAyMTFfTU5UUl9GTEFHX0FGVEVSX0xBU1QsCisgICBOTDgwMjExX01OVFJfRkxBR19NQVggPSBfX05MODAyMTFfTU5UUl9GTEFHX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9tZXNoY29uZl9wYXJhbXMgLSBtZXNoIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICoKKyAqIE1lc2ggY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKgorICogQF9fTkw4MDIxMV9NRVNIQ09ORl9JTlZBTElEOiBpbnRlcm5hbCB1c2UKKyAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9SRVRSWV9USU1FT1VUOiBzcGVjaWZpZXMgdGhlIGluaXRpYWwgcmV0cnkgdGltZW91dCBpbgorICogbWlsbGlzZWNvbmQgdW5pdHMsIHVzZWQgYnkgdGhlIFBlZXIgTGluayBPcGVuIG1lc3NhZ2UKKyAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9DT05GSVJNX1RJTUVPVVQ6IHNwZWNpZmllcyB0aGUgaW5pdGFsIGNvbmZpcm0gdGltZW91dCwgaW4KKyAqIG1pbGxpc2Vjb25kIHVuaXRzLCB1c2VkIGJ5IHRoZSBwZWVyIGxpbmsgbWFuYWdlbWVudCB0byBjbG9zZSBhIHBlZXIgbGluaworICoKKyAqIEBOTDgwMjExX01FU0hDT05GX0hPTERJTkdfVElNRU9VVDogc3BlY2lmaWVzIHRoZSBob2xkaW5nIHRpbWVvdXQsIGluCisgKiBtaWxsaXNlY29uZCB1bml0cworICoKKyAqIEBOTDgwMjExX01FU0hDT05GX01BWF9QRUVSX0xJTktTOiBtYXhpbXVtIG51bWJlciBvZiBwZWVyIGxpbmtzIGFsbG93ZWQKKyAqIG9uIHRoaXMgbWVzaCBpbnRlcmZhY2UKKyAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9NQVhfUkVUUklFUzogc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwZWVyIGxpbmsKKyAqIG9wZW4gcmV0cmllcyB0aGF0IGNhbiBiZSBzZW50IHRvIGVzdGFibGlzaCBhIG5ldyBwZWVyIGxpbmsgaW5zdGFuY2UgaW4gYQorICogbWVzaAorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX1RUTDogc3BlY2lmaWVzIHRoZSB2YWx1ZSBvZiBUVEwgZmllbGQgc2V0IGF0IGEgc291cmNlIG1lc2gKKyAqIHBvaW50LgorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX0FVVE9fT1BFTl9QTElOS1M6IHdoZXRoZXIgd2Ugc2hvdWxkIGF1dG9tYXRpY2FsbHkKKyAqIG9wZW4gcGVlciBsaW5rcyB3aGVuIHdlIGRldGVjdCBjb21wYXRpYmxlIG1lc2ggcGVlcnMuCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfSFdNUF9NQVhfUFJFUV9SRVRSSUVTOiB0aGUgbnVtYmVyIG9mIGFjdGlvbiBmcmFtZXMKKyAqIGNvbnRhaW5pbmcgYSBQUkVRIHRoYXQgYW4gTVAgY2FuIHNlbmQgdG8gYSBwYXJ0aWN1bGFyIGRlc3RpbmF0aW9uIChwYXRoCisgKiB0YXJnZXQpCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfUEFUSF9SRUZSRVNIX1RJTUU6IGhvdyBmcmVxdWVudGx5IHRvIHJlZnJlc2ggbWVzaCBwYXRocworICogKGluIG1pbGxpc2Vjb25kcykKKyAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9NSU5fRElTQ09WRVJZX1RJTUVPVVQ6IG1pbmltdW0gbGVuZ3RoIG9mIHRpbWUgdG8gd2FpdAorICogdW50aWwgZ2l2aW5nIHVwIG9uIGEgcGF0aCBkaXNjb3ZlcnkgKGluIG1pbGxpc2Vjb25kcykKKyAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9IV01QX0FDVElWRV9QQVRIX1RJTUVPVVQ6IFRoZSB0aW1lIChpbiBUVXMpIGZvciB3aGljaCBtZXNoCisgKiBwb2ludHMgcmVjZWl2aW5nIGEgUFJFUSBzaGFsbCBjb25zaWRlciB0aGUgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZQorICogcm9vdCB0byBiZSB2YWxpZC4gKFRVID0gdGltZSB1bml0KQorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX0hXTVBfUFJFUV9NSU5fSU5URVJWQUw6IFRoZSBtaW5pbXVtIGludGVydmFsIG9mIHRpbWUgKGluCisgKiBUVXMpIGR1cmluZyB3aGljaCBhbiBNUCBjYW4gc2VuZCBvbmx5IG9uZSBhY3Rpb24gZnJhbWUgY29udGFpbmluZyBhIFBSRVEKKyAqIHJlZmVyZW5jZSBlbGVtZW50CisgKgorICogQE5MODAyMTFfTUVTSENPTkZfSFdNUF9ORVRfRElBTV9UUlZTX1RJTUU6IFRoZSBpbnRlcnZhbCBvZiB0aW1lIChpbiBUVXMpCisgKiB0aGF0IGl0IHRha2VzIGZvciBhbiBIV01QIGluZm9ybWF0aW9uIGVsZW1lbnQgdG8gcHJvcGFnYXRlIGFjcm9zcyB0aGUgbWVzaAorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX1JPT1RNT0RFOiB3aGV0aGVyIHJvb3QgbW9kZSBpcyBlbmFibGVkIG9yIG5vdAorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX0FUVFJfTUFYOiBoaWdoZXN0IHBvc3NpYmxlIG1lc2ggY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUKKyAqCisgKiBAX19OTDgwMjExX01FU0hDT05GX0FUVFJfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCisgKi8KK2VudW0gbmw4MDIxMV9tZXNoY29uZl9wYXJhbXMgeworICAgX19OTDgwMjExX01FU0hDT05GX0lOVkFMSUQsCisgICBOTDgwMjExX01FU0hDT05GX1JFVFJZX1RJTUVPVVQsCisgICBOTDgwMjExX01FU0hDT05GX0NPTkZJUk1fVElNRU9VVCwKKyAgIE5MODAyMTFfTUVTSENPTkZfSE9MRElOR19USU1FT1VULAorICAgTkw4MDIxMV9NRVNIQ09ORl9NQVhfUEVFUl9MSU5LUywKKyAgIE5MODAyMTFfTUVTSENPTkZfTUFYX1JFVFJJRVMsCisgICBOTDgwMjExX01FU0hDT05GX1RUTCwKKyAgIE5MODAyMTFfTUVTSENPTkZfQVVUT19PUEVOX1BMSU5LUywKKyAgIE5MODAyMTFfTUVTSENPTkZfSFdNUF9NQVhfUFJFUV9SRVRSSUVTLAorICAgTkw4MDIxMV9NRVNIQ09ORl9QQVRIX1JFRlJFU0hfVElNRSwKKyAgIE5MODAyMTFfTUVTSENPTkZfTUlOX0RJU0NPVkVSWV9USU1FT1VULAorICAgTkw4MDIxMV9NRVNIQ09ORl9IV01QX0FDVElWRV9QQVRIX1RJTUVPVVQsCisgICBOTDgwMjExX01FU0hDT05GX0hXTVBfUFJFUV9NSU5fSU5URVJWQUwsCisgICBOTDgwMjExX01FU0hDT05GX0hXTVBfTkVUX0RJQU1fVFJWU19USU1FLAorICAgTkw4MDIxMV9NRVNIQ09ORl9IV01QX1JPT1RNT0RFLAorCisgICAvKiBrZWVwIGxhc3QgKi8KKyAgIF9fTkw4MDIxMV9NRVNIQ09ORl9BVFRSX0FGVEVSX0xBU1QsCisgICBOTDgwMjExX01FU0hDT05GX0FUVFJfTUFYID0gX19OTDgwMjExX01FU0hDT05GX0FUVFJfQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX3R4cV9hdHRyIC0gVFggcXVldWUgcGFyYW1ldGVyIGF0dHJpYnV0ZXMKKyAqIEBfX05MODAyMTFfVFhRX0FUVFJfSU5WQUxJRDogQXR0cmlidXRlIG51bWJlciAwIGlzIHJlc2VydmVkCisgKiBATkw4MDIxMV9UWFFfQVRUUl9RVUVVRTogVFggcXVldWUgaWRlbnRpZmllciAoTkw4MDIxMV9UWFFfUV8qKQorICogQE5MODAyMTFfVFhRX0FUVFJfVFhPUDogTWF4aW11bSBidXJzdCB0aW1lIGluIHVuaXRzIG9mIDMyIHVzZWNzLCAwIG1lYW5pbmcKKyAqICAgZGlzYWJsZWQKKyAqIEBOTDgwMjExX1RYUV9BVFRSX0NXTUlOOiBNaW5pbXVtIGNvbnRlbnRpb24gd2luZG93IFthIHZhbHVlIG9mIHRoZSBmb3JtCisgKiAgIDJebi0xIGluIHRoZSByYW5nZSAxLi4zMjc2N10KKyAqIEBOTDgwMjExX1RYUV9BVFRSX0NXTUFYOiBNYXhpbXVtIGNvbnRlbnRpb24gd2luZG93IFthIHZhbHVlIG9mIHRoZSBmb3JtCisgKiAgIDJebi0xIGluIHRoZSByYW5nZSAxLi4zMjc2N10KKyAqIEBOTDgwMjExX1RYUV9BVFRSX0FJRlM6IEFyYml0cmF0aW9uIGludGVyZnJhbWUgc3BhY2UgWzAuLjI1NV0KKyAqIEBfX05MODAyMTFfVFhRX0FUVFJfQUZURVJfTEFTVDogSW50ZXJuYWwKKyAqIEBOTDgwMjExX1RYUV9BVFRSX01BWDogTWF4aW11bSBUWFEgYXR0cmlidXRlIG51bWJlcgorICovCitlbnVtIG5sODAyMTFfdHhxX2F0dHIgeworICAgX19OTDgwMjExX1RYUV9BVFRSX0lOVkFMSUQsCisgICBOTDgwMjExX1RYUV9BVFRSX1FVRVVFLAorICAgTkw4MDIxMV9UWFFfQVRUUl9UWE9QLAorICAgTkw4MDIxMV9UWFFfQVRUUl9DV01JTiwKKyAgIE5MODAyMTFfVFhRX0FUVFJfQ1dNQVgsCisgICBOTDgwMjExX1RYUV9BVFRSX0FJRlMsCisKKyAgIC8qIGtlZXAgbGFzdCAqLworICAgX19OTDgwMjExX1RYUV9BVFRSX0FGVEVSX0xBU1QsCisgICBOTDgwMjExX1RYUV9BVFRSX01BWCA9IF9fTkw4MDIxMV9UWFFfQVRUUl9BRlRFUl9MQVNUIC0gMQorfTsKKworZW51bSBubDgwMjExX3R4cV9xIHsKKyAgIE5MODAyMTFfVFhRX1FfVk8sCisgICBOTDgwMjExX1RYUV9RX1ZJLAorICAgTkw4MDIxMV9UWFFfUV9CRSwKKyAgIE5MODAyMTFfVFhRX1FfQksKK307CisKK2VudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgeworICAgTkw4MDIxMV9DSEFOX05PX0hULAorICAgTkw4MDIxMV9DSEFOX0hUMjAsCisgICBOTDgwMjExX0NIQU5fSFQ0ME1JTlVTLAorICAgTkw4MDIxMV9DSEFOX0hUNDBQTFVTCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9ic3MgLSBuZXRsaW5rIGF0dHJpYnV0ZXMgZm9yIGEgQlNTCisgKgorICogQF9fTkw4MDIxMV9CU1NfSU5WQUxJRDogaW52YWxpZAorICogQE5MODAyMTFfQlNTX0ZSRVFVRU5DWTogZnJlcXVlbmN5IGluIE1IeiAodTMyKQorICogQE5MODAyMTFfQlNTX1RTRjogVFNGIG9mIHRoZSByZWNlaXZlZCBwcm9iZSByZXNwb25zZS9iZWFjb24gKHU2NCkKKyAqIEBOTDgwMjExX0JTU19CRUFDT05fSU5URVJWQUw6IGJlYWNvbiBpbnRlcnZhbCBvZiB0aGUgKEkpQlNTICh1MTYpCisgKiBATkw4MDIxMV9CU1NfQ0FQQUJJTElUWTogY2FwYWJpbGl0eSBmaWVsZCAoQ1BVIG9yZGVyLCB1MTYpCisgKiBATkw4MDIxMV9CU1NfSU5GT1JNQVRJT05fRUxFTUVOVFM6IGJpbmFyeSBhdHRyaWJ1dGUgY29udGFpbmluZyB0aGUKKyAqICAgcmF3IGluZm9ybWF0aW9uIGVsZW1lbnRzIGZyb20gdGhlIHByb2JlIHJlc3BvbnNlL2JlYWNvbiAoYmluKQorICogQE5MODAyMTFfQlNTX1NJR05BTF9NQk06IHNpZ25hbCBzdHJlbmd0aCBvZiBwcm9iZSByZXNwb25zZS9iZWFjb24KKyAqICAgaW4gbUJtICgxMDAgKiBkQm0pIChzMzIpCisgKiBATkw4MDIxMV9CU1NfU0lHTkFMX1VOU1BFQzogc2lnbmFsIHN0cmVuZ3RoIG9mIHRoZSBwcm9iZSByZXNwb25zZS9iZWFjb24KKyAqICAgaW4gdW5zcGVjaWZpZWQgdW5pdHMsIHNjYWxlZCB0byAwLi4xMDAgKHU4KQorICogQE5MODAyMTFfQlNTX1NUQVRVUzogc3RhdHVzLCBpZiB0aGlzIEJTUyBpcyAidXNlZCIKKyAqIEBOTDgwMjExX0JTU19TRUVOX01TX0FHTzogYWdlIG9mIHRoaXMgQlNTIGVudHJ5IGluIG1zCisgKiBAX19OTDgwMjExX0JTU19BRlRFUl9MQVNUOiBpbnRlcm5hbAorICogQE5MODAyMTFfQlNTX01BWDogaGlnaGVzdCBCU1MgYXR0cmlidXRlCisgKi8KK2VudW0gbmw4MDIxMV9ic3MgeworICAgX19OTDgwMjExX0JTU19JTlZBTElELAorICAgTkw4MDIxMV9CU1NfQlNTSUQsCisgICBOTDgwMjExX0JTU19GUkVRVUVOQ1ksCisgICBOTDgwMjExX0JTU19UU0YsCisgICBOTDgwMjExX0JTU19CRUFDT05fSU5URVJWQUwsCisgICBOTDgwMjExX0JTU19DQVBBQklMSVRZLAorICAgTkw4MDIxMV9CU1NfSU5GT1JNQVRJT05fRUxFTUVOVFMsCisgICBOTDgwMjExX0JTU19TSUdOQUxfTUJNLAorICAgTkw4MDIxMV9CU1NfU0lHTkFMX1VOU1BFQywKKyAgIE5MODAyMTFfQlNTX1NUQVRVUywKKyAgIE5MODAyMTFfQlNTX1NFRU5fTVNfQUdPLAorCisgICAvKiBrZWVwIGxhc3QgKi8KKyAgIF9fTkw4MDIxMV9CU1NfQUZURVJfTEFTVCwKKyAgIE5MODAyMTFfQlNTX01BWCA9IF9fTkw4MDIxMV9CU1NfQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX2Jzc19zdGF0dXMgLSBCU1MgInN0YXR1cyIKKyAqLworZW51bSBubDgwMjExX2Jzc19zdGF0dXMgeworICAgTkw4MDIxMV9CU1NfU1RBVFVTX0FVVEhFTlRJQ0FURUQsCisgICBOTDgwMjExX0JTU19TVEFUVVNfQVNTT0NJQVRFRCwKKyAgIE5MODAyMTFfQlNTX1NUQVRVU19JQlNTX0pPSU5FRCwKK307CisKKy8qKgorICogZW51bSBubDgwMjExX2F1dGhfdHlwZSAtIEF1dGhlbnRpY2F0aW9uVHlwZQorICoKKyAqIEBOTDgwMjExX0FVVEhUWVBFX09QRU5fU1lTVEVNOiBPcGVuIFN5c3RlbSBhdXRoZW50aWNhdGlvbgorICogQE5MODAyMTFfQVVUSFRZUEVfU0hBUkVEX0tFWTogU2hhcmVkIEtleSBhdXRoZW50aWNhdGlvbiAoV0VQIG9ubHkpCisgKiBATkw4MDIxMV9BVVRIVFlQRV9GVDogRmFzdCBCU1MgVHJhbnNpdGlvbiAoSUVFRSA4MDIuMTFyKQorICogQE5MODAyMTFfQVVUSFRZUEVfTkVUV09SS19FQVA6IE5ldHdvcmsgRUFQIChzb21lIENpc2NvIEFQcyBhbmQgbWFpbmx5IExFQVApCisgKiBAX19OTDgwMjExX0FVVEhUWVBFX05VTTogaW50ZXJuYWwKKyAqIEBOTDgwMjExX0FVVEhUWVBFX01BWDogbWF4aW11bSB2YWxpZCBhdXRoIGFsZ29yaXRobQorICogQE5MODAyMTFfQVVUSFRZUEVfQVVUT01BVElDOiBkZXRlcm1pbmUgYXV0b21hdGljYWxseSAoaWYgbmVjZXNzYXJ5IGJ5CisgKiAgIHRyeWluZyBtdWx0aXBsZSB0aW1lcyk7IHRoaXMgaXMgaW52YWxpZCBpbiBuZXRsaW5rIC0tIGxlYXZlIG91dAorICogICB0aGUgYXR0cmlidXRlIGZvciB0aGlzIG9uIENPTk5FQ1QgY29tbWFuZHMuCisgKi8KK2VudW0gbmw4MDIxMV9hdXRoX3R5cGUgeworICAgTkw4MDIxMV9BVVRIVFlQRV9PUEVOX1NZU1RFTSwKKyAgIE5MODAyMTFfQVVUSFRZUEVfU0hBUkVEX0tFWSwKKyAgIE5MODAyMTFfQVVUSFRZUEVfRlQsCisgICBOTDgwMjExX0FVVEhUWVBFX05FVFdPUktfRUFQLAorCisgICAvKiBrZWVwIGxhc3QgKi8KKyAgIF9fTkw4MDIxMV9BVVRIVFlQRV9OVU0sCisgICBOTDgwMjExX0FVVEhUWVBFX01BWCA9IF9fTkw4MDIxMV9BVVRIVFlQRV9OVU0gLSAxLAorICAgTkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUMKK307CisKKy8qKgorICogZW51bSBubDgwMjExX2tleV90eXBlIC0gS2V5IFR5cGUKKyAqIEBOTDgwMjExX0tFWVRZUEVfR1JPVVA6IEdyb3VwIChicm9hZGNhc3QvbXVsdGljYXN0KSBrZXkKKyAqIEBOTDgwMjExX0tFWVRZUEVfUEFJUldJU0U6IFBhaXJ3aXNlICh1bmljYXN0L2luZGl2aWR1YWwpIGtleQorICogQE5MODAyMTFfS0VZVFlQRV9QRUVSS0VZOiBQZWVyS2V5IChETFMpCisgKi8KK2VudW0gbmw4MDIxMV9rZXlfdHlwZSB7CisgICBOTDgwMjExX0tFWVRZUEVfR1JPVVAsCisgICBOTDgwMjExX0tFWVRZUEVfUEFJUldJU0UsCisgICBOTDgwMjExX0tFWVRZUEVfUEVFUktFWSwKK307CisKKy8qKgorICogZW51bSBubDgwMjExX21mcCAtIE1hbmFnZW1lbnQgZnJhbWUgcHJvdGVjdGlvbiBzdGF0ZQorICogQE5MODAyMTFfTUZQX05POiBNYW5hZ2VtZW50IGZyYW1lIHByb3RlY3Rpb24gbm90IHVzZWQKKyAqIEBOTDgwMjExX01GUF9SRVFVSVJFRDogTWFuYWdlbWVudCBmcmFtZSBwcm90ZWN0aW9uIHJlcXVpcmVkCisgKi8KK2VudW0gbmw4MDIxMV9tZnAgeworICAgTkw4MDIxMV9NRlBfTk8sCisgICBOTDgwMjExX01GUF9SRVFVSVJFRCwKK307CisKK2VudW0gbmw4MDIxMV93cGFfdmVyc2lvbnMgeworICAgTkw4MDIxMV9XUEFfVkVSU0lPTl8xID0gMSA8PCAwLAorICAgTkw4MDIxMV9XUEFfVkVSU0lPTl8yID0gMSA8PCAxLAorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfa2V5X2F0dHJpYnV0ZXMgLSBrZXkgYXR0cmlidXRlcworICogQF9fTkw4MDIxMV9LRVlfSU5WQUxJRDogaW52YWxpZAorICogQE5MODAyMTFfS0VZX0RBVEE6ICh0ZW1wb3JhbCkga2V5IGRhdGE7IGZvciBUS0lQIHRoaXMgY29uc2lzdHMgb2YKKyAqICAgMTYgYnl0ZXMgZW5jcnlwdGlvbiBrZXkgZm9sbG93ZWQgYnkgOCBieXRlcyBlYWNoIGZvciBUWCBhbmQgUlggTUlDCisgKiAgIGtleXMKKyAqIEBOTDgwMjExX0tFWV9JRFg6IGtleSBJRCAodTgsIDAtMykKKyAqIEBOTDgwMjExX0tFWV9DSVBIRVI6IGtleSBjaXBoZXIgc3VpdGUgKHUzMiwgYXMgZGVmaW5lZCBieSBJRUVFIDgwMi4xMQorICogICBzZWN0aW9uIDcuMy4yLjI1LjEsIGUuZy4gMHgwMDBGQUMwNCkKKyAqIEBOTDgwMjExX0tFWV9TRVE6IHRyYW5zbWl0IGtleSBzZXF1ZW5jZSBudW1iZXIgKElWL1BOKSBmb3IgVEtJUCBhbmQKKyAqICAgQ0NNUCBrZXlzLCBlYWNoIHNpeCBieXRlcyBpbiBsaXR0bGUgZW5kaWFuCisgKiBATkw4MDIxMV9LRVlfREVGQVVMVDogZmxhZyBpbmRpY2F0aW5nIGRlZmF1bHQga2V5CisgKiBATkw4MDIxMV9LRVlfREVGQVVMVF9NR01UOiBmbGFnIGluZGljYXRpbmcgZGVmYXVsdCBtYW5hZ2VtZW50IGtleQorICogQF9fTkw4MDIxMV9LRVlfQUZURVJfTEFTVDogaW50ZXJuYWwKKyAqIEBOTDgwMjExX0tFWV9NQVg6IGhpZ2hlc3Qga2V5IGF0dHJpYnV0ZQorICovCitlbnVtIG5sODAyMTFfa2V5X2F0dHJpYnV0ZXMgeworICAgX19OTDgwMjExX0tFWV9JTlZBTElELAorICAgTkw4MDIxMV9LRVlfREFUQSwKKyAgIE5MODAyMTFfS0VZX0lEWCwKKyAgIE5MODAyMTFfS0VZX0NJUEhFUiwKKyAgIE5MODAyMTFfS0VZX1NFUSwKKyAgIE5MODAyMTFfS0VZX0RFRkFVTFQsCisgICBOTDgwMjExX0tFWV9ERUZBVUxUX01HTVQsCisKKyAgIC8qIGtlZXAgbGFzdCAqLworICAgX19OTDgwMjExX0tFWV9BRlRFUl9MQVNULAorICAgTkw4MDIxMV9LRVlfTUFYID0gX19OTDgwMjExX0tFWV9BRlRFUl9MQVNUIC0gMQorfTsKKworI2VuZGlmIC8qIF9fTElOVVhfTkw4MDIxMV9IICovCmRpZmYgLS1naXQgYS9tYWM4MDIxMS90aS11dGlscy9udnMuYyBiL21hYzgwMjExL3RpLXV0aWxzL252cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZDM2YTMKLS0tIC9kZXYvbnVsbAorKysgYi9tYWM4MDIxMS90aS11dGlscy9udnMuYwpAQCAtMCwwICsxLDgzNiBAQAorLyoKKyAqIFBMVCB1dGlsaXR5IGZvciB3aXJlbGVzcyBjaGlwIHN1cHBvcnRlZCBieSBUSSdzIGRyaXZlciB3bDEyeHgKKyAqCisgKiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG5ldGxpbmsvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldGxpbmsvbXNnLmg+CisjaW5jbHVkZSA8bmV0bGluay9hdHRyLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlICJubDgwMjExLmgiCisKKyNpbmNsdWRlICJjYWxpYnJhdG9yLmgiCisjaW5jbHVkZSAicGx0LmgiCisjaW5jbHVkZSAiaW5pLmgiCisvKiAyMDQ4IC0gaXQgc2hvdWxkIGJlIGVub3VnaCBmb3IgYW55IGNoaXAsIHVudGlsLi4uIDIyZGVjMjAxMCAqLworI2RlZmluZSBCVUZfU0laRV80X05WU19GSUxFICAgIDIwNDgKKworc3RhdGljIGNvbnN0IGNoYXIgaWZfbmFtZV9mbXRbXSA9ICJ3bGFuJWQiOworCitpbnQgbnZzX2ZpbGxfcmFkaW9fcGFyYW1zKGludCBmZCwgc3RydWN0IHdsMTJ4eF9pbmkgKmluaSwgY2hhciAqYnVmKQoreworICAgIGludCBzaXplOworICAgIHN0cnVjdCB3bDEyNzFfaW5pICpncDsKKworICAgIGlmIChpbmkpIHsKKyAgICAgICAgZ3AgPSAmaW5pLT5pbmkxMjcxOworICAgIH0KKworICAgIHNpemUgID0gc2l6ZW9mKHN0cnVjdCB3bDEyNzFfaW5pKTsKKworICAgIGlmIChpbmkpIHsgICAgLyogZm9yIHJlZmVyZW5jZSBOVlMgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAqYyA9ICh1bnNpZ25lZCBjaGFyICopZ3A7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIHdyaXRlKGZkLCBjKyssIDEpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhciAqcCA9IGJ1ZiArIDB4MUQ0OworICAgICAgICB3cml0ZShmZCwgKGNvbnN0IHZvaWQgKilwLCBzaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudnNfZmlsbF9yYWRpb19wYXJhbXNfMTI4eChpbnQgZmQsIHN0cnVjdCB3bDEyeHhfaW5pICppbmksIGNoYXIgKmJ1ZikKK3sKKyAgICBpbnQgc2l6ZTsKKyAgICBzdHJ1Y3Qgd2wxMjh4X2luaSAqZ3AgPSAmaW5pLT5pbmkxMjh4OworCisgICAgc2l6ZSAgPSBzaXplb2Yoc3RydWN0IHdsMTI4eF9pbmkpOworCisgICAgaWYgKGluaSkgeyAgICAvKiBmb3IgcmVmZXJlbmNlIE5WUyAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICpjID0gKHVuc2lnbmVkIGNoYXIgKilncDsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgd3JpdGUoZmQsIGMrKywgMSk7CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXIgKnAgPSBidWYgKyAweDFENDsKKyAgICAgICAgd3JpdGUoZmQsIHAsIHNpemUpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgbnZzX3NldF9hdXRvZmVtKGludCBmZCwgY2hhciAqYnVmLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKyAgICBpbnQgc2l6ZTsKKyAgICBzdHJ1Y3Qgd2wxMjcxX2luaSAqZ3A7CisgICAgdW5zaWduZWQgY2hhciAqYzsKKyAgICBpbnQgaTsKKworICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBncCA9IChzdHJ1Y3Qgd2wxMjcxX2luaSAqKShidWYrMHgxZDQpOworICAgIGdwLT5nZW5lcmFsX3BhcmFtcy50eF9iaXBfZmVtX2F1dG9fZGV0ZWN0ID0gdmFsOworCisgICAgc2l6ZSAgPSBzaXplb2Yoc3RydWN0IHdsMTI3MV9pbmkpOworCisgICAgYyA9ICh1bnNpZ25lZCBjaGFyICopZ3A7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHdyaXRlKGZkLCBjKyssIDEpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgbnZzX3NldF9hdXRvZmVtXzEyOHgoaW50IGZkLCBjaGFyICpidWYsIHVuc2lnbmVkIGNoYXIgdmFsKQoreworICAgIGludCBzaXplOworICAgIHN0cnVjdCB3bDEyOHhfaW5pICpncDsKKyAgICB1bnNpZ25lZCBjaGFyICpjOworICAgIGludCBpOworCisgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGdwID0gKHN0cnVjdCB3bDEyOHhfaW5pICopKGJ1ZisweDFkNCk7CisgICAgZ3AtPmdlbmVyYWxfcGFyYW1zLnR4X2JpcF9mZW1fYXV0b19kZXRlY3QgPSB2YWw7CisKKyAgICBzaXplICA9IHNpemVvZihzdHJ1Y3Qgd2wxMjh4X2luaSk7CisKKyAgICBjID0gKHVuc2lnbmVkIGNoYXIgKilncDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgd3JpdGUoZmQsIGMrKywgMSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBudnNfc2V0X2ZlbV9tYW51ZihpbnQgZmQsIGNoYXIgKmJ1ZiwgdW5zaWduZWQgY2hhciB2YWwpCit7CisgICAgaW50IHNpemU7CisgICAgc3RydWN0IHdsMTI3MV9pbmkgKmdwOworICAgIHVuc2lnbmVkIGNoYXIgKmM7CisgICAgaW50IGk7CisKKyAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgZ3AgPSAoc3RydWN0IHdsMTI3MV9pbmkgKikoYnVmKzB4MWQ0KTsKKyAgICBncC0+Z2VuZXJhbF9wYXJhbXMudHhfYmlwX2ZlbV9tYW51ZmFjdHVyZXIgPSB2YWw7CisKKyAgICBzaXplICA9IHNpemVvZihzdHJ1Y3Qgd2wxMjcxX2luaSk7CisKKyAgICBjID0gKHVuc2lnbmVkIGNoYXIgKilncDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgd3JpdGUoZmQsIGMrKywgMSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBudnNfc2V0X2ZlbV9tYW51Zl8xMjh4KGludCBmZCwgY2hhciAqYnVmLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKyAgICBpbnQgc2l6ZTsKKyAgICBzdHJ1Y3Qgd2wxMjh4X2luaSAqZ3A7CisgICAgdW5zaWduZWQgY2hhciAqYzsKKyAgICBpbnQgaTsKKworICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBncCA9IChzdHJ1Y3Qgd2wxMjh4X2luaSAqKShidWYrMHgxZDQpOworICAgIGdwLT5nZW5lcmFsX3BhcmFtcy50eF9iaXBfZmVtX21hbnVmYWN0dXJlciA9IHZhbDsKKworICAgIHNpemUgID0gc2l6ZW9mKHN0cnVjdCB3bDEyOHhfaW5pKTsKKworICAgIGMgPSAodW5zaWduZWQgY2hhciAqKWdwOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICB3cml0ZShmZCwgYysrLCAxKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB3bDEyeHhfbnZzX29wcyB3bDEyNzFfbnZzX29wcyA9IHsKKyAgICAubnZzX2ZpbGxfcmFkaW9fcHJtcyA9IG52c19maWxsX3JhZGlvX3BhcmFtcywKKyAgICAubnZzX3NldF9hdXRvZmVtID0gbnZzX3NldF9hdXRvZmVtLAorICAgIC5udnNfc2V0X2ZlbV9tYW51ZiA9IG52c19zZXRfZmVtX21hbnVmLAorfTsKKworc3RhdGljIHN0cnVjdCB3bDEyeHhfbnZzX29wcyB3bDEyOHhfbnZzX29wcyA9IHsKKyAgICAubnZzX2ZpbGxfcmFkaW9fcHJtcyA9IG52c19maWxsX3JhZGlvX3BhcmFtc18xMjh4LAorICAgIC5udnNfc2V0X2F1dG9mZW0gPSBudnNfc2V0X2F1dG9mZW1fMTI4eCwKKyAgICAubnZzX3NldF9mZW1fbWFudWYgPSBudnNfc2V0X2ZlbV9tYW51Zl8xMjh4LAorfTsKKworaW50IGdldF9tYWNfYWRkcihpbnQgaWZjX251bSwgdW5zaWduZWQgY2hhciAqbWFjX2FkZHIpCit7CisgICAgaW50IHM7CisgICAgc3RydWN0IGlmcmVxIGlmcjsKKyNpZiAwCisgICAgaWYgKGlmY19udW0gPCAwIHx8IGlmY19udW0gPj0gRVRIX0RFVl9NQVgpCisgICAgICAgIHJldHVybiAxOworI2VuZGlmCisgICAgcyA9IHNvY2tldChQRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX0lQKTsKKyAgICBpZiAocyA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gc29ja2V0ICglcylcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIG1lbXNldCgmaWZyLCAwLCBzaXplb2Yoc3RydWN0IGlmcmVxKSk7CisgICAgc3ByaW50ZihpZnIuaWZyX25hbWUsIGlmX25hbWVfZm10LCBpZmNfbnVtKSA7CisgICAgaWYgKGlvY3RsKHMsIFNJT0NHSUZIV0FERFIsICZpZnIpIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBpb2N0bCAoJXMpXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBjbG9zZShzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgY2xvc2Uocyk7CisKKyAgICBtZW1jcHkobWFjX2FkZHIsICZpZnIuaWZyX2lmcnUuaWZydV9od2FkZHIuc2FfZGF0YVswXSwgNik7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZpbGVfZXhpc3QoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIGludCByZXQ7CisKKyAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIndyb25nIHBhcmFtZXRlclxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXQgPSBzdGF0KGZpbGVuYW1lLCAmYnVmKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsIHRvIHN0YXQgZmlsZSAlcyAoJXMpXG4iLCBmaWxlbmFtZSwKKyAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gKGludClidWYuc3Rfc2l6ZTsKK30KKwordm9pZCBjZmdfbnZzX29wcyhzdHJ1Y3Qgd2wxMnh4X2NvbW1vbiAqY21uKQoreworICAgIGlmIChjbW4tPmFyY2ggPT0gV0wxMjcxX0FSQ0gpIHsKKyAgICAgICAgY21uLT5udnNfb3BzID0gJndsMTI3MV9udnNfb3BzOworICAgIH0gZWxzZSB7CisgICAgICAgIGNtbi0+bnZzX29wcyA9ICZ3bDEyOHhfbnZzX29wczsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9mcm9tX2N1cnJlbnRfbnZzKGNvbnN0IGNoYXIgKm52c19maWxlLAorICAgIGNoYXIgKmJ1ZiwgaW50IHNpemUsIGludCAqbnZzX3N6KQoreworICAgIGludCBjdXJyX252cywgcmV0OworCisgICAgY3Vycl9udnMgPSBvcGVuKG52c19maWxlLCBPX1JET05MWSwgU19JUlVTUiB8IFNfSVdVU1IpOworICAgIGlmIChjdXJyX252cyA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcz4gVW5hYmxlIHRvIG9wZW4gTlZTIGZpbGUgZm9yIHJlZmVyZW5jZSAiCisgICAgICAgICAgICAiKCVzKVxuIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldCA9IHJlYWQoY3Vycl9udnMsIGJ1Ziwgc2l6ZSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsIHRvIHJlYWQgZmlsZSAlcyAoJXMpIiwgbnZzX2ZpbGUsCisgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgICAgICBjbG9zZShjdXJyX252cyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmIChudnNfc3opIHsKKyAgICAgICAgKm52c19zeiA9IHJldDsKKyAgICB9CisKKyAgICBjbG9zZShjdXJyX252cyk7CisKKyAgICAvL3ByaW50ZigiUmVhZCBOVlMgZmlsZSAoJXMpIG9mIHNpemUgJWRcbiIsIG52c19maWxlLCByZXQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9udnMoY29uc3QgY2hhciAqbnZzX2ZpbGUsIGNoYXIgKmJ1ZiwKKyAgICBpbnQgc2l6ZSwgaW50ICpudnNfc3opCit7CisgICAgaW50IGZsX3N6OworICAgIGNoYXIgZmlsZTJyZWFkW0ZJTEVOQU1FX01BWF07CisKKyAgICBpZiAobnZzX2ZpbGUgPT0gTlVMTCB8fCBzdHJsZW4obnZzX2ZpbGUpIDwgMikgeworICAgICAgICBwcmludGYoIlxuVGhlIHBhdGggdG8gTlZTIGZpbGUgbm90IHByb3ZpZGVkLCAiCisgICAgICAgICAgICAidXNlIGRlZmF1bHQgKCVzKVxuIiwgQ1VSUkVOVF9OVlNfTkFNRSk7CisKKyAgICAgICAgc3RybmNweShmaWxlMnJlYWQsIENVUlJFTlRfTlZTX05BTUUsIHN0cmxlbihDVVJSRU5UX05WU19OQU1FKSk7CisKKyAgICB9IGVsc2UKKyAgICAgICAgc3RybmNweShmaWxlMnJlYWQsIG52c19maWxlLCBzdHJsZW4obnZzX2ZpbGUpKTsKKworICAgIGZsX3N6ID0gZmlsZV9leGlzdChmaWxlMnJlYWQpOworICAgIGlmIChmbF9zeiA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGaWxlICVzIG5vdCBleGlzdHNcbiIsIENVUlJFTlRfTlZTX05BTUUpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVhZF9mcm9tX2N1cnJlbnRfbnZzKGZpbGUycmVhZCwgYnVmLCBzaXplLCBudnNfc3opOworfQorCitzdGF0aWMgaW50IGZpbGxfbnZzX2RlZl9yeF9wYXJhbXMoaW50IGZkKQoreworICAgIHVuc2lnbmVkIGNoYXIgdHlwZSA9IGVOVlNfUkFESU9fUlhfUEFSQU1FVEVSUzsKKyAgICB1bnNpZ25lZCBzaG9ydCBsZW5ndGggPSBOVlNfUlhfUEFSQU1fTEVOR1RIOworICAgIGludCBpOworCisgICAgLyogUnggdHlwZSAqLworICAgIHdyaXRlKGZkLCAmdHlwZSwgMSk7CisKKyAgICAvKiBSeCBsZW5ndGggKi8KKyAgICB3cml0ZShmZCwgJmxlbmd0aCwgMik7CisKKyAgICB0eXBlID0gREVGQVVMVF9FRlVTRV9WQUxVRTsgLyoganVzdCByZXVzZSBvZiB2YXIgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTlZTX1JYX1BBUkFNX0xFTkdUSDsgaSsrKSB7CisgICAgICAgIHdyaXRlKGZkLCAmdHlwZSwgMSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG52c19wYXJzZV9kYXRhKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKyAgICBzdHJ1Y3Qgd2wxMjcxX2NtZF9jYWxfcDJnICpwZGF0YSwgdW5zaWduZWQgaW50ICpwdmVyKQoreworI2RlZmluZSBCVUZGRVJfSU5ERVggICAgKGJ1Zl9pZHggKyBTVEFSVF9QQVJBTV9JTkRFWCArIGluZm9faWR4KQorICAgIHVuc2lnbmVkIHNob3J0IGJ1Zl9pZHg7CisgICAgdW5zaWduZWQgY2hhciB0bHZfdHlwZTsKKyAgICB1bnNpZ25lZCBzaG9ydCB0bHZfbGVuOworICAgIHVuc2lnbmVkIHNob3J0IGluZm9faWR4OworICAgIHVuc2lnbmVkIGludCBudnNUeXBlSW5mbzsKKyAgICB1bnNpZ25lZCBjaGFyIG52c192ZXJfb2N0X2lkeDsKKyAgICB1bnNpZ25lZCBjaGFyIHNoaWZ0OworCisgICAgZm9yIChidWZfaWR4ID0gMDsgYnVmX2lkeCA8IE5WU19UT1RBTF9MRU5HVEg7KSB7CisgICAgICAgIHRsdl90eXBlID0gYnVmW2J1Zl9pZHhdOworCisgICAgICAgIC8qIGZpbGwgdGhlIGNvcnJlY3QgbW9kZSB0byBmaWxsIHRoZSBOVlMgc3RydWN0IGJ1ZmZlciAqLworICAgICAgICAvKiBpZiB0aGUgdGx2X3R5cGUgaXMgdGhlIGxhc3QgdHlwZSBicmVhayBmcm9tIHRoZSBsb29wICovCisgICAgICAgIHN3aXRjaCAodGx2X3R5cGUpIHsKKyAgICAgICAgY2FzZSBlTlZTX1JBRElPX1RYX1BBUkFNRVRFUlM6CisgICAgICAgICAgICBudnNUeXBlSW5mbyA9IGVOVlNfUkFESU9fVFhfVFlQRV9QQVJBTUVURVJTX0lORk87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlTlZTX1JBRElPX1JYX1BBUkFNRVRFUlM6CisgICAgICAgICAgICBudnNUeXBlSW5mbyA9IGVOVlNfUkFESU9fUlhfVFlQRV9QQVJBTUVURVJTX0lORk87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlTlZTX1ZFUlNJT046CisgICAgICAgICAgICBmb3IgKCpwdmVyID0gMCwgbnZzX3Zlcl9vY3RfaWR4ID0gMDsKKyAgICAgICAgICAgICAgICBudnNfdmVyX29jdF9pZHggPCBOVlNfVkVSU0lPTl9QQVJBTUVURVJfTEVOR1RIOworICAgICAgICAgICAgICAgIG52c192ZXJfb2N0X2lkeCsrKSB7CisgICAgICAgICAgICAgICAgc2hpZnQgPSA4ICogKE5WU19WRVJTSU9OX1BBUkFNRVRFUl9MRU5HVEggLQorICAgICAgICAgICAgICAgICAgICAxIC0gbnZzX3Zlcl9vY3RfaWR4KTsKKyAgICAgICAgICAgICAgICAqcHZlciArPSAoKGJ1ZltidWZfaWR4ICsgU1RBUlRfUEFSQU1fSU5ERVggKworICAgICAgICAgICAgICAgICAgICBudnNfdmVyX29jdF9pZHhdKSA8PCBzaGlmdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlVExWX0xBU1Q6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0bHZfbGVuID0gKGJ1ZltidWZfaWR4ICsgU1RBUlRfTEVOR1RIX0lOREVYICArIDFdIDw8IDgpICsKKyAgICAgICAgICAgIGJ1ZltidWZfaWR4ICsgU1RBUlRfTEVOR1RIX0lOREVYXTsKKworICAgICAgICAvKiBpZiBUTFYgdHlwZSBpcyBub3QgTlZTIHZlciBmaWxsIHRoZSBOVlMgYWNjb3JkaW5nICovCisgICAgICAgIC8qIHRvIHRoZSBtb2RlIFRYL1JYICovCisgICAgICAgIGlmICgoZU5WU19SQURJT19UWF9QQVJBTUVURVJTID09IHRsdl90eXBlKSB8fAorICAgICAgICAgICAgKGVOVlNfUkFESU9fUlhfUEFSQU1FVEVSUyA9PSB0bHZfdHlwZSkpIHsKKyAgICAgICAgICAgIHBkYXRhW252c1R5cGVJbmZvXS50eXBlID0gdGx2X3R5cGU7CisgICAgICAgICAgICBwZGF0YVtudnNUeXBlSW5mb10ubGVuID0gdGx2X2xlbjsKKworICAgICAgICAgICAgZm9yIChpbmZvX2lkeCA9IDA7IChpbmZvX2lkeCA8IHRsdl9sZW4pICYmCisgICAgICAgICAgICAgICAgKEJVRkZFUl9JTkRFWCA8IE5WU19UT1RBTF9MRU5HVEgpOworICAgICAgICAgICAgICAgICAgICBpbmZvX2lkeCsrKSB7CisgICAgICAgICAgICAgICAgcGRhdGFbbnZzVHlwZUluZm9dLmJ1ZltpbmZvX2lkeF0gPQorICAgICAgICAgICAgICAgICAgICBidWZbQlVGRkVSX0lOREVYXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGluY3JlbWVudCB0byB0aGUgbmV4dCBUTFYgKi8KKyAgICAgICAgYnVmX2lkeCArPSBTVEFSVF9QQVJBTV9JTkRFWCArIHRsdl9sZW47CisgICAgfQorfQorCitzdGF0aWMgaW50IG52c19maWxsX3ZlcnNpb24oaW50IGZkLCB1bnNpZ25lZCBpbnQgKnBkYXRhKQoreworICAgIHVuc2lnbmVkIGNoYXIgdG1wID0gZU5WU19WRVJTSU9OOworICAgIHVuc2lnbmVkIHNob3J0IHRtcDIgPSBOVlNfVkVSU0lPTl9QQVJBTUVURVJfTEVOR1RIOworCisgICAgd3JpdGUoZmQsICZ0bXAsIDEpOworCisgICAgd3JpdGUoZmQsICZ0bXAyLCAyKTsKKworICAgIHRtcCA9ICgqcGRhdGEgPj4gMTYpICYgMHhmZjsKKyAgICB3cml0ZShmZCwgJnRtcCwgMSk7CisKKyAgICB0bXAgPSAoKnBkYXRhID4+IDgpICYgMHhmZjsKKyAgICB3cml0ZShmZCwgJnRtcCwgMSk7CisKKyAgICB0bXAgPSAqcGRhdGEgJiAweGZmOworICAgIHdyaXRlKGZkLCAmdG1wLCAxKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG52c19maWxsX29sZF9yeF9kYXRhKGludCBmZCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorICAgIHVuc2lnbmVkIHNob3J0IGxlbikKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBpZHg7CisgICAgdW5zaWduZWQgY2hhciByeF90eXBlOworCisgICAgLyogUlggQmlQIHR5cGUgKi8KKyAgICByeF90eXBlID0gZU5WU19SQURJT19SWF9QQVJBTUVURVJTOworICAgIHdyaXRlKGZkLCAmcnhfdHlwZSwgMSk7CisKKyAgICAvKiBSWCBCSVAgTGVuZ3RoICovCisgICAgd3JpdGUoZmQsICZsZW4sIDIpOworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBsZW47IGlkeCsrKSB7CisgICAgICAgIHdyaXRlKGZkLCAmKGJ1ZltpZHhdKSwgMSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnZzX3VwZF9udnNfcGFydChpbnQgZmQsIGNoYXIgKmJ1ZikKK3sKKyAgICBjaGFyICpwID0gYnVmOworCisgICAgd3JpdGUoZmQsIHAsIDB4MUQ0KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG52c19maWxsX252c19wYXJ0KGludCBmZCkKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBjaGFyIG1hY19hZGRyW01BQ19BRERSX0xFTl0gPSB7CisgICAgICAgICAweDBiLCAweGFkLCAweGRlLCAweGFkLCAweGJlLCAweGVmCisgICAgfTsKKyAgICBfX2xlMTYgbnZzX3R4X3N6ID0gTlZTX1RYX1BBUkFNX0xFTkdUSDsKKyAgICBfX2xlMzIgbnZzX3ZlciA9IDB4MDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbHNbXSA9IHsKKyAgICAgICAgMHgwLCAweDEsIDB4NmQsIDB4NTQsIDB4NzEsIGVUTFZfTEFTVCwgZU5WU19SQURJT19UWF9QQVJBTUVURVJTCisgICAgfTsKKworICAgIHdyaXRlKGZkLCAmdmFsc1sxXSwgMSk7CisgICAgd3JpdGUoZmQsICZ2YWxzWzJdLCAxKTsKKyAgICB3cml0ZShmZCwgJnZhbHNbM10sIDEpOworI2lmIDAKKyAgICBpZiAoZ2V0X21hY19hZGRyKDAsIG1hY19hZGRyKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzPiBGYWlsIHRvIGdldCBtYWMgYWRkcmVzc1xuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisjZW5kaWYKKyAgICAvKiB3cml0ZSBkb3duIE1BQyBhZGRyZXNzIGluIG5ldyBOVlMgZmlsZSAqLworICAgIHdyaXRlKGZkLCAmbWFjX2FkZHJbNV0sIDEpOworICAgIHdyaXRlKGZkLCAmbWFjX2FkZHJbNF0sIDEpOworICAgIHdyaXRlKGZkLCAmbWFjX2FkZHJbM10sIDEpOworICAgIHdyaXRlKGZkLCAmbWFjX2FkZHJbMl0sIDEpOworCisgICAgd3JpdGUoZmQsICZ2YWxzWzFdLCAxKTsKKyAgICB3cml0ZShmZCwgJnZhbHNbNF0sIDEpOworICAgIHdyaXRlKGZkLCAmdmFsc1szXSwgMSk7CisKKyAgICB3cml0ZShmZCwgJm1hY19hZGRyWzFdLCAxKTsKKyAgICB3cml0ZShmZCwgJm1hY19hZGRyWzBdLCAxKTsKKworICAgIHdyaXRlKGZkLCAmdmFsc1swXSwgMSk7CisgICAgd3JpdGUoZmQsICZ2YWxzWzBdLCAxKTsKKworICAgIC8qIGZpbGwgZW5kIGJ1cnN0IHRyYW5zYWN0aW9uIHplcm9zICovCisgICAgZm9yIChpID0gMDsgaSA8IE5WU19FTkRfQlVSU1RfVFJBTlNBQ1RJT05fTEVOR1RIOyBpKyspIHsKKyAgICAgICAgd3JpdGUoZmQsICZ2YWxzWzBdLCAxKTsKKyAgICB9CisKKyAgICAvKiBmaWxsIHplcm9zIHRvIEFsaWduIFRMViBzdGFydCBhZGRyZXNzICovCisgICAgZm9yIChpID0gMDsgaSA8IE5WU19BTElOR19UTFZfU1RBUlRfQUREUkVTU19MRU5HVEg7IGkrKykgeworICAgICAgICB3cml0ZShmZCwgJnZhbHNbMF0sIDEpOworICAgIH0gCisKKyAgICAvKiBGaWxsIFR4IGNhbGlicmF0aW9uIHBhcnQgKi8KKyAgICB3cml0ZShmZCwgJnZhbHNbNl0sIDEpOworICAgIHdyaXRlKGZkLCAmbnZzX3R4X3N6LCAyKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudnNfdHhfc3o7IGkrKykgeworICAgICAgICB3cml0ZShmZCwgJnZhbHNbMF0sIDEpOworICAgIH0KKworICAgIC8qIEZpbGwgUnggY2FsaWJyYXRpb24gcGFydCAqLworICAgIGZpbGxfbnZzX2RlZl9yeF9wYXJhbXMoZmQpOworCisgICAgLyogZmlsbCBOVlMgdmVyc2lvbiAqLworICAgIGlmIChudnNfZmlsbF92ZXJzaW9uKGZkLCAmbnZzX3ZlcikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsIHRvIGZpbGwgdmVyc2lvblxuIik7CisgICAgfQorCisgICAgLyogZmlsbCBlbmQgb2YgTlZTICovCisgICAgd3JpdGUoZmQsICZ2YWxzWzVdLCAxKTsgLyogZVRMVl9MQVNUICovCisgICAgd3JpdGUoZmQsICZ2YWxzWzVdLCAxKTsgLyogZVRMVl9MQVNUICovCisgICAgd3JpdGUoZmQsICZ2YWxzWzBdLCAxKTsKKyAgICB3cml0ZShmZCwgJnZhbHNbMF0sIDEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBwcmVwYXJlX252c19maWxlKHZvaWQgKmFyZywgY2hhciAqZmlsZV9uYW1lKQoreworICAgIGludCBuZXdfbnZzLCBpLCBudnNfc2l6ZTsKKyAgICB1bnNpZ25lZCBjaGFyIG1hY19hZGRyW01BQ19BRERSX0xFTl07CisgICAgc3RydWN0IHdsMTI3MV9jbWRfY2FsX3AyZyAqcGRhdGE7CisgICAgc3RydWN0IHdsMTI3MV9jbWRfY2FsX3AyZyBvbGRfZGF0YVtlTlVNQkVSX1JBRElPX1RZUEVfUEFSQU1FVEVSU19JTkZPXTsKKyAgICBjaGFyIGJ1ZlsyMDQ4XTsKKyAgICB1bnNpZ25lZCBjaGFyICpwOworICAgIHN0cnVjdCB3bDEyeHhfY29tbW9uIGNtbiA9IHsKKyAgICAgICAgLmFyY2ggPSBVTktOT1dOX0FSQ0gsCisgICAgICAgIC5wYXJzZV9vcHMgPSBOVUxMCisgICAgfTsKKworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsc1tdID0geworICAgICAgICAweDAsIDB4MSwgMHg2ZCwgMHg1NCwgMHg3MSwgZVRMVl9MQVNULCBlTlZTX1JBRElPX1RYX1BBUkFNRVRFUlMKKyAgICB9OworCisgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM+IE1pc3NpbmcgYXJnc1xuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAocmVhZF9udnMoZmlsZV9uYW1lLCBidWYsIEJVRl9TSVpFXzRfTlZTX0ZJTEUsICZudnNfc2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgc3dpdGNoIChudnNfc2l6ZSkgeworICAgICAgICBjYXNlIE5WU19GSUxFX1NJWkVfMTI3WDoKKyAgICAgICAgICAgIGNtbi5hcmNoID0gV0wxMjcxX0FSQ0g7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5WU19GSUxFX1NJWkVfMTI4WDoKKyAgICAgICAgICAgIGNtbi5hcmNoID0gV0wxMjhYX0FSQ0g7CisgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcz4gV3JvbmcgZmlsZSBzaXplXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGNmZ19udnNfb3BzKCZjbW4pOworCisgICAgLyogY3JlYXRlIG5ldyBOVlMgZmlsZSAqLworICAgIG5ld19udnMgPSBvcGVuKE5FV19OVlNfTkFNRSwKKyAgICAgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgU19JUlVTUiB8IFNfSVdVU1IpOworICAgIGlmIChuZXdfbnZzIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzPiBVbmFibGUgdG8gb3BlbiBuZXcgTlZTIGZpbGVcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgd3JpdGUobmV3X252cywgJnZhbHNbMV0sIDEpOworICAgIHdyaXRlKG5ld19udnMsICZ2YWxzWzJdLCAxKTsKKyAgICB3cml0ZShuZXdfbnZzLCAmdmFsc1szXSwgMSk7CisKKyAgICBpZiAoZ2V0X21hY19hZGRyKDAsIG1hY19hZGRyKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzPiBGYWlsIHRvIGdldCBtYWMgYWRkclxuIiwgX19mdW5jX18pOworICAgICAgICBjbG9zZShuZXdfbnZzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogd3JpdGUgZG93biBNQUMgYWRkcmVzcyBpbiBuZXcgTlZTIGZpbGUgKi8KKyAgICB3cml0ZShuZXdfbnZzLCAmbWFjX2FkZHJbNV0sIDEpOworICAgIHdyaXRlKG5ld19udnMsICZtYWNfYWRkcls0XSwgMSk7CisgICAgd3JpdGUobmV3X252cywgJm1hY19hZGRyWzNdLCAxKTsKKyAgICB3cml0ZShuZXdfbnZzLCAmbWFjX2FkZHJbMl0sIDEpOworCisgICAgd3JpdGUobmV3X252cywgJnZhbHNbMV0sIDEpOworICAgIHdyaXRlKG5ld19udnMsICZ2YWxzWzRdLCAxKTsKKyAgICB3cml0ZShuZXdfbnZzLCAmdmFsc1szXSwgMSk7CisKKyAgICB3cml0ZShuZXdfbnZzLCAmbWFjX2FkZHJbMV0sIDEpOworICAgIHdyaXRlKG5ld19udnMsICZtYWNfYWRkclswXSwgMSk7CisKKyAgICB3cml0ZShuZXdfbnZzLCAmdmFsc1swXSwgMSk7CisgICAgd3JpdGUobmV3X252cywgJnZhbHNbMF0sIDEpOworCisgICAgLyogZmlsbCBlbmQgYnVyc3QgdHJhbnNhY3Rpb24gemVyb3MgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTlZTX0VORF9CVVJTVF9UUkFOU0FDVElPTl9MRU5HVEg7IGkrKykgeworICAgICAgICB3cml0ZShuZXdfbnZzLCAmdmFsc1swXSwgMSk7CisgICAgfQorCisgICAgLyogZmlsbCB6ZXJvcyB0byBBbGlnbiBUTFYgc3RhcnQgYWRkcmVzcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOVlNfQUxJTkdfVExWX1NUQVJUX0FERFJFU1NfTEVOR1RIOyBpKyspIHsKKyAgICAgICAgd3JpdGUobmV3X252cywgJnZhbHNbMF0sIDEpOworICAgIH0KKworICAgIC8qIEZpbGwgVHhCaXAgKi8KKyAgICBwZGF0YSA9IChzdHJ1Y3Qgd2wxMjcxX2NtZF9jYWxfcDJnICopYXJnOworCisgICAgd3JpdGUobmV3X252cywgJnZhbHNbNl0sIDEpOworICAgIHdyaXRlKG5ld19udnMsICZwZGF0YS0+bGVuLCAyKTsKKworICAgIHAgPSAodW5zaWduZWQgY2hhciAqKSYocGRhdGEtPmJ1Zik7CisgICAgZm9yIChpID0gMDsgaSA8IHBkYXRhLT5sZW47IGkrKykgeworICAgICAgICB3cml0ZShuZXdfbnZzLCBwKyssIDEpOworICAgIH0KKworICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW50IG9sZF92ZXI7CisjaWYgMAorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKilidWY7CisgICAgICAgICAgICBmb3IgKG9sZF92ZXIgPSAwOyBvbGRfdmVyIDwgMTAyNDsgb2xkX3ZlcisrKSB7CisgICAgICAgICAgICAgICAgaWYgKG9sZF92ZXIlMTYgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgICAgIHByaW50ZigiJTAyeCAiLCAqcCsrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIG1lbXNldChvbGRfZGF0YSwgMCwKKyAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgd2wxMjcxX2NtZF9jYWxfcDJnKSoKKyAgICAgICAgICAgICAgICBlTlVNQkVSX1JBRElPX1RZUEVfUEFSQU1FVEVSU19JTkZPKTsKKyAgICAgICAgbnZzX3BhcnNlX2RhdGEoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikmYnVmW05WU19QUkVfUEFSQU1FVEVSU19MRU5HVEhdLAorICAgICAgICAgICAgb2xkX2RhdGEsICZvbGRfdmVyKTsKKworICAgICAgICBudnNfZmlsbF9vbGRfcnhfZGF0YShuZXdfbnZzLAorICAgICAgICAgICAgb2xkX2RhdGFbZU5WU19SQURJT19SWF9UWVBFX1BBUkFNRVRFUlNfSU5GT10uYnVmLAorICAgICAgICAgICAgb2xkX2RhdGFbZU5WU19SQURJT19SWF9UWVBFX1BBUkFNRVRFUlNfSU5GT10ubGVuKTsKKyAgICB9CisKKyAgICAvKiBmaWxsIE5WUyB2ZXJzaW9uICovCisgICAgaWYgKG52c19maWxsX3ZlcnNpb24obmV3X252cywgJnBkYXRhLT52ZXIpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbCB0byBmaWxsIHZlcnNpb25cbiIpOworICAgIH0KKworICAgIC8qIGZpbGwgZW5kIG9mIE5WUyAqLworICAgIHdyaXRlKG5ld19udnMsICZ2YWxzWzVdLCAxKTsgLyogZVRMVl9MQVNUICovCisgICAgd3JpdGUobmV3X252cywgJnZhbHNbNV0sIDEpOyAvKiBlVExWX0xBU1QgKi8KKyAgICB3cml0ZShuZXdfbnZzLCAmdmFsc1swXSwgMSk7CisgICAgd3JpdGUobmV3X252cywgJnZhbHNbMF0sIDEpOworCisgICAgLyogZmlsbCByYWRpbyBwYXJhbXMgKi8KKyAgICBpZiAoY21uLm52c19vcHMtPm52c19maWxsX3JhZGlvX3BybXMobmV3X252cywgTlVMTCwgYnVmKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWwgdG8gZmlsbCByYWRpbyBwYXJhbXNcbiIpOworICAgIH0KKworICAgIGNsb3NlKG5ld19udnMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBjcmVhdGVfbnZzX2ZpbGUoc3RydWN0IHdsMTJ4eF9jb21tb24gKmNtbikKK3sKKyAgICBpbnQgbmV3X252cywgcmVzID0gMDsKKyAgICBjaGFyIGJ1ZlsyMDQ4XTsKKworICAgIC8qIGNyZWF0ZSBuZXcgTlZTIGZpbGUgKi8KKyAgICBuZXdfbnZzID0gb3BlbihORVdfTlZTX05BTUUsCisgICAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgICBpZiAobmV3X252cyA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcz4gVW5hYmxlIHRvIG9wZW4gbmV3IE5WUyBmaWxlXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qIGZpbGwgbnZzIHBhcnQgKi8KKyAgICBpZiAobnZzX2ZpbGxfbnZzX3BhcnQobmV3X252cykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsIHRvIGZpbGwgTlZTIHBhcnRcbiIpOworICAgICAgICByZXMgPSAxOworCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8qIGZpbGwgcmFkaW8gcGFyYW1zICovCisgICAgaWYgKGNtbi0+bnZzX29wcy0+bnZzX2ZpbGxfcmFkaW9fcHJtcyhuZXdfbnZzLCAmY21uLT5pbmksIGJ1ZikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsIHRvIGZpbGwgcmFkaW8gcGFyYW1zXG4iKTsKKyAgICAgICAgcmVzID0gMTsKKyAgICB9CisKK291dDoKKyAgICBjbG9zZShuZXdfbnZzKTsKKworICAgIHJldHVybiByZXM7Cit9CisKK2ludCB1cGRhdGVfbnZzX2ZpbGUoY29uc3QgY2hhciAqbnZzX2ZpbGUsIHN0cnVjdCB3bDEyeHhfY29tbW9uICpjbW4pCit7CisgICAgaW50IG5ld19udnMsIHJlcyA9IDA7CisgICAgY2hhciBidWZbMjA0OF07CisKKyAgICByZXMgPSByZWFkX252cyhudnNfZmlsZSwgYnVmLCBCVUZfU0laRV80X05WU19GSUxFLCBOVUxMKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qIGNyZWF0ZSBuZXcgTlZTIGZpbGUgKi8KKyAgICBuZXdfbnZzID0gb3BlbihORVdfTlZTX05BTUUsCisgICAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgICBpZiAobmV3X252cyA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcz4gVW5hYmxlIHRvIG9wZW4gbmV3IE5WUyBmaWxlXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qIGZpbGwgbnZzIHBhcnQgKi8KKyAgICBpZiAobnZzX3VwZF9udnNfcGFydChuZXdfbnZzLCBidWYpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbCB0byBmaWxsIE5WUyBwYXJ0XG4iKTsKKyAgICAgICAgcmVzID0gMTsKKworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvKiBmaWxsIHJhZGlvIHBhcmFtcyAqLworICAgIGlmIChjbW4tPm52c19vcHMtPm52c19maWxsX3JhZGlvX3BybXMobmV3X252cywgJmNtbi0+aW5pLCBidWYpKSB7CisgICAgICAgIHByaW50ZigiRmFpbCB0byBmaWxsIHJhZGlvIHBhcmFtc1xuIik7CisgICAgICAgIHJlcyA9IDE7CisgICAgfQorCitvdXQ6CisgICAgY2xvc2UobmV3X252cyk7CisKKyAgICByZXR1cm4gcmVzOworfQorCitpbnQgZHVtcF9udnNfZmlsZShjb25zdCBjaGFyICpudnNfZmlsZSwgc3RydWN0IHdsMTJ4eF9jb21tb24gKmNtbikKK3sKKyAgICBpbnQgc3o9MCwgc2l6ZTsKKyAgICBjaGFyIGJ1ZlsyMDQ4XTsKKyAgICB1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKilidWY7CisKKyAgICBpZiAocmVhZF9udnMobnZzX2ZpbGUsIGJ1ZiwgQlVGX1NJWkVfNF9OVlNfRklMRSwgJnNpemUpKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHByaW50ZigiXG5UaGUgc2l6ZSBpcyAlZCBieXRlc1xuIiwgc2l6ZSk7CisKKyAgICBmb3IgKCA7IHN6IDwgc2l6ZTsgc3orKykgeworICAgICAgICBpZiAoc3olMTYgPT0gMCkgeworICAgICAgICAgICAgcHJpbnRmKCJcbiAlMDRYICIsIHN6KTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIiUwMnggIiwgKnArKyk7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgc2V0X252c19maWxlX2F1dG9mZW0oY29uc3QgY2hhciAqbnZzX2ZpbGUsIHVuc2lnbmVkIGNoYXIgdmFsLAorICAgIHN0cnVjdCB3bDEyeHhfY29tbW9uICpjbW4pCit7CisgICAgaW50IG5ld19udnMsIHJlcyA9IDA7CisgICAgY2hhciBidWZbMjA0OF07CisgICAgaW50IG52c19maWxlX3N6OworCisgICAgcmVzID0gcmVhZF9udnMobnZzX2ZpbGUsIGJ1ZiwgQlVGX1NJWkVfNF9OVlNfRklMRSwgJm52c19maWxlX3N6KTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmIChudnNfZ2V0X2FyY2gobnZzX2ZpbGVfc3osIGNtbikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsIHRvIGRlZmluZSBhcmNoaXRlY3R1cmVcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBjZmdfbnZzX29wcyhjbW4pOworCisgICAgLyogY3JlYXRlIG5ldyBOVlMgZmlsZSAqLworICAgIG5ld19udnMgPSBvcGVuKE5FV19OVlNfTkFNRSwKKyAgICAgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgU19JUlVTUiB8IFNfSVdVU1IpOworICAgIGlmIChuZXdfbnZzIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzPiBVbmFibGUgdG8gb3BlbiBuZXcgTlZTIGZpbGVcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogZmlsbCBudnMgcGFydCAqLworICAgIGlmIChudnNfdXBkX252c19wYXJ0KG5ld19udnMsIGJ1ZikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsIHRvIGZpbGwgTlZTIHBhcnRcbiIpOworICAgICAgICByZXMgPSAxOworCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8qIGZpbGwgcmFkaW8gcGFyYW1zICovCisgICAgaWYgKGNtbi0+bnZzX29wcy0+bnZzX3NldF9hdXRvZmVtKG5ld19udnMsIGJ1ZiwgdmFsKSkgeworICAgICAgICBwcmludGYoIkZhaWwgdG8gZmlsbCByYWRpbyBwYXJhbXNcbiIpOworICAgICAgICByZXMgPSAxOworICAgIH0KKworb3V0OgorICAgIGNsb3NlKG5ld19udnMpOworCisgICAgcmV0dXJuIHJlczsKK30KKworaW50IHNldF9udnNfZmlsZV9mZW1fbWFudWYoY29uc3QgY2hhciAqbnZzX2ZpbGUsIHVuc2lnbmVkIGNoYXIgdmFsLAorICAgIHN0cnVjdCB3bDEyeHhfY29tbW9uICpjbW4pCit7CisgICAgaW50IG5ld19udnMsIHJlcyA9IDA7CisgICAgY2hhciBidWZbMjA0OF07CisgICAgaW50IG52c19maWxlX3N6OworCisgICAgcmVzID0gcmVhZF9udnMobnZzX2ZpbGUsIGJ1ZiwgQlVGX1NJWkVfNF9OVlNfRklMRSwgJm52c19maWxlX3N6KTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmIChudnNfZ2V0X2FyY2gobnZzX2ZpbGVfc3osIGNtbikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsIHRvIGRlZmluZSBhcmNoaXRlY3R1cmVcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBjZmdfbnZzX29wcyhjbW4pOworCisgICAgLyogY3JlYXRlIG5ldyBOVlMgZmlsZSAqLworICAgIG5ld19udnMgPSBvcGVuKE5FV19OVlNfTkFNRSwKKyAgICAgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgU19JUlVTUiB8IFNfSVdVU1IpOworICAgIGlmIChuZXdfbnZzIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzPiBVbmFibGUgdG8gb3BlbiBuZXcgTlZTIGZpbGVcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogZmlsbCBudnMgcGFydCAqLworICAgIGlmIChudnNfdXBkX252c19wYXJ0KG5ld19udnMsIGJ1ZikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsIHRvIGZpbGwgTlZTIHBhcnRcbiIpOworICAgICAgICByZXMgPSAxOworCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8qIGZpbGwgcmFkaW8gcGFyYW1zICovCisgICAgaWYgKGNtbi0+bnZzX29wcy0+bnZzX3NldF9mZW1fbWFudWYobmV3X252cywgYnVmLCB2YWwpKSB7CisgICAgICAgIHByaW50ZigiRmFpbCB0byBmaWxsIHJhZGlvIHBhcmFtc1xuIik7CisgICAgICAgIHJlcyA9IDE7CisgICAgfQorCitvdXQ6CisgICAgY2xvc2UobmV3X252cyk7CisKKyAgICByZXR1cm4gcmVzOworfQorCmRpZmYgLS1naXQgYS9tYWM4MDIxMS90aS11dGlscy9udnMuaCBiL21hYzgwMjExL3RpLXV0aWxzL252cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNDM5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9tYWM4MDIxMS90aS11dGlscy9udnMuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9fTlZTX0gKKyNkZWZpbmUgX19OVlNfSAorCisjZGVmaW5lIFdMMTI3WF9OVlNfRklMRV9TWiAgICAgICAgOTEyCisjZGVmaW5lIFdMMTI4WF9OVlNfRklMRV9TWiAgICAgICAgMTExMworCitpbnQgcHJlcGFyZV9udnNfZmlsZSh2b2lkICphcmcsIGNoYXIgKmZpbGVfbmFtZSk7CisKK3ZvaWQgY2ZnX252c19vcHMoc3RydWN0IHdsMTJ4eF9jb21tb24gKmNtbik7CisKK2ludCBjcmVhdGVfbnZzX2ZpbGUoc3RydWN0IHdsMTJ4eF9jb21tb24gKmNtbik7CisKK2ludCB1cGRhdGVfbnZzX2ZpbGUoY29uc3QgY2hhciAqbnZzX2ZpbGUsIHN0cnVjdCB3bDEyeHhfY29tbW9uICpjbW4pOworCitpbnQgZHVtcF9udnNfZmlsZShjb25zdCBjaGFyICpudnNfZmlsZSwgc3RydWN0IHdsMTJ4eF9jb21tb24gKmNtbik7CisKK2ludCBzZXRfbnZzX2ZpbGVfYXV0b2ZlbShjb25zdCBjaGFyICpudnNfZmlsZSwgdW5zaWduZWQgY2hhciB2YWwsCisgICAgc3RydWN0IHdsMTJ4eF9jb21tb24gKmNtbik7CisKK2ludCBzZXRfbnZzX2ZpbGVfZmVtX21hbnVmKGNvbnN0IGNoYXIgKm52c19maWxlLCB1bnNpZ25lZCBjaGFyIHZhbCwKKyAgICBzdHJ1Y3Qgd2wxMnh4X2NvbW1vbiAqY21uKTsKKworI2VuZGlmIC8qIF9fTlZTX0ggKi8KZGlmZiAtLWdpdCBhL21hYzgwMjExL3RpLXV0aWxzL3BsdC5jIGIvbWFjODAyMTEvdGktdXRpbHMvcGx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYxNTNkNAotLS0gL2Rldi9udWxsCisrKyBiL21hYzgwMjExL3RpLXV0aWxzL3BsdC5jCkBAIC0wLDAgKzEsNzIzIEBACisvKgorICogUExUIHV0aWxpdHkgZm9yIHdpcmVsZXNzIGNoaXAgc3VwcG9ydGVkIGJ5IFRJJ3MgZHJpdmVyIHdsMTJ4eAorICoKKyAqIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNpbmNsdWRlIDxuZXRsaW5rL2dlbmwvZ2VubC5oPgorI2luY2x1ZGUgPG5ldGxpbmsvZ2VubC9mYW1pbHkuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2dlbmwvY3RybC5oPgorI2luY2x1ZGUgPG5ldGxpbmsvbXNnLmg+CisjaW5jbHVkZSA8bmV0bGluay9hdHRyLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlICJubDgwMjExLmgiCisKKyNpbmNsdWRlICJjYWxpYnJhdG9yLmgiCisjaW5jbHVkZSAicGx0LmgiCisjaW5jbHVkZSAiaW5pLmgiCisjaW5jbHVkZSAibnZzLmgiCisKK1NFQ1RJT04ocGx0KTsKKworc3RhdGljIHZvaWQgc3RyMm1hYyh1bnNpZ25lZCBjaGFyICpwbWFjLCBjaGFyICpwY2gpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFDX0FERFJfTEVOOyBpKyspIHsKKyAgICAgICAgcG1hY1tpXSA9ICh1bnNpZ25lZCBjaGFyKXN0cnRvdWwocGNoLCAmcGNoLCAxNik7CisgICAgICAgIHBjaCsrOworICAgIH0KK30KKworc3RhdGljIGludCBwbHRfcG93ZXJfbW9kZShzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBubF9jYiAqY2IsCisgICAgICAgICAgICAgIHN0cnVjdCBubF9tc2cgKm1zZywgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIHN0cnVjdCBubGF0dHIgKmtleTsKKyAgICB1bnNpZ25lZCBpbnQgcG1vZGU7CisKKyAgICBpZiAoYXJnYyAhPSAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM+IE1pc3NpbmcgYXJndW1lbnRzXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKworICAgIGlmIChzdHJjbXAoYXJndlswXSwgIm9uIikgPT0gMCkgeworICAgICAgICBwbW9kZSA9IDE7CisgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJndlswXSwgIm9mZiIpID09IDApIHsKKyAgICAgICAgcG1vZGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM+IEludmFsaWQgcGFyYW1ldGVyXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKworICAgIGtleSA9IG5sYV9uZXN0X3N0YXJ0KG1zZywgTkw4MDIxMV9BVFRSX1RFU1REQVRBKTsKKyAgICBpZiAoIWtleSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzPiBmYWlsIHRvIG5sYV9uZXN0X3N0YXJ0KClcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgTkxBX1BVVF9VMzIobXNnLCBXTDEyNzFfVE1fQVRUUl9DTURfSUQsIFdMMTI3MV9UTV9DTURfU0VUX1BMVF9NT0RFKTsKKyAgICBOTEFfUFVUX1UzMihtc2csIFdMMTI3MV9UTV9BVFRSX1BMVF9NT0RFLCBwbW9kZSk7CisKKyAgICBubGFfbmVzdF9lbmQobXNnLCBrZXkpOworCisgICAgcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzPiBidWlsZGluZyBtZXNzYWdlIGZhaWxlZFxuIiwgX19mdW5jX18pOworICAgIHJldHVybiAyOworfQorCitDT01NQU5EKHBsdCwgcG93ZXJfbW9kZSwgIjxvbnxvZmY+IiwKKyAgICBOTDgwMjExX0NNRF9URVNUTU9ERSwgMCwgQ0lCX05FVERFViwgcGx0X3Bvd2VyX21vZGUsCisgICAgIlNldCBQTFQgcG93ZXIgbW9kZVxuIik7CisKK3N0YXRpYyBpbnQgcGx0X3R1bmVfY2hhbm5lbChzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBubF9jYiAqY2IsCisgICAgICAgICAgICBzdHJ1Y3QgbmxfbXNnICptc2csIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBzdHJ1Y3QgbmxhdHRyICprZXk7CisgICAgc3RydWN0IHdsMTI3MV9jbWRfY2FsX2NoYW5uZWxfdHVuZSBwcm1zOworCisgICAgaWYgKGFyZ2MgPCAxIHx8IGFyZ2MgPiAyKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHBybXMudGVzdC5pZCA9IFRFU1RfQ01EX0NIQU5ORUxfVFVORTsKKyAgICBwcm1zLmJhbmQgPSAodW5zaWduZWQgY2hhcilhdG9pKGFyZ3ZbMF0pOworICAgIHBybXMuY2hhbm5lbCA9ICh1bnNpZ25lZCBjaGFyKWF0b2koYXJndlsxXSk7CisKKyAgICBrZXkgPSBubGFfbmVzdF9zdGFydChtc2csIE5MODAyMTFfQVRUUl9URVNUREFUQSk7CisgICAgaWYgKCFrZXkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsIHRvIG5sYV9uZXN0X3N0YXJ0KClcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBOTEFfUFVUX1UzMihtc2csIFdMMTI3MV9UTV9BVFRSX0NNRF9JRCwgV0wxMjcxX1RNX0NNRF9URVNUKTsKKyAgICBOTEFfUFVUKG1zZywgV0wxMjcxX1RNX0FUVFJfREFUQSwKKyAgICAgICAgc2l6ZW9mKHN0cnVjdCB3bDEyNzFfY21kX2NhbF9jaGFubmVsX3R1bmUpLAorICAgICAgICAmcHJtcyk7CisKKyAgICBubGFfbmVzdF9lbmQobXNnLCBrZXkpOworCisgICAgcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzPiBidWlsZGluZyBtZXNzYWdlIGZhaWxlZFxuIiwgX19mdW5jX18pOworICAgIHJldHVybiAyOworfQorCitDT01NQU5EKHBsdCwgdHVuZV9jaGFubmVsLCAiPGJhbmQ+IDxjaGFubmVsPiIsCisgICAgTkw4MDIxMV9DTURfVEVTVE1PREUsIDAsIENJQl9ORVRERVYsIHBsdF90dW5lX2NoYW5uZWwsCisgICAgIlNldCBiYW5kIGFuZCBjaGFubmVsIGZvciBQTFRcbiIpOworCitzdGF0aWMgaW50IHBsdF9yZWZfcG9pbnQoc3RydWN0IG5sODAyMTFfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgbmxfY2IgKmNiLAorICAgICAgICAgICAgc3RydWN0IG5sX21zZyAqbXNnLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgc3RydWN0IG5sYXR0ciAqa2V5OworICAgIHN0cnVjdCB3bDEyNzFfY21kX2NhbF91cGRhdGVfcmVmX3BvaW50IHBybXM7CisKKyAgICBpZiAoYXJnYyA8IDEgfHwgYXJnYyA+IDMpeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwcm1zLnRlc3QuaWQgPSBURVNUX0NNRF9VUERBVEVfUERfUkVGRVJFTkNFX1BPSU5UOworICAgIHBybXMucmVmX2RldGVjdG9yID0gYXRvaShhcmd2WzBdKTsKKyAgICBwcm1zLnJlZl9wb3dlciA9IGF0b2koYXJndlsxXSk7CisgICAgcHJtcy5zdWJfYmFuZCA9IGF0b2koYXJndlsyXSk7CisKKyAgICBrZXkgPSBubGFfbmVzdF9zdGFydChtc2csIE5MODAyMTFfQVRUUl9URVNUREFUQSk7CisgICAgaWYgKCFrZXkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsIHRvIG5sYV9uZXN0X3N0YXJ0KClcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBOTEFfUFVUX1UzMihtc2csIFdMMTI3MV9UTV9BVFRSX0NNRF9JRCwgV0wxMjcxX1RNX0NNRF9URVNUKTsKKyAgICBOTEFfUFVUKG1zZywgV0wxMjcxX1RNX0FUVFJfREFUQSwgc2l6ZW9mKHBybXMpLCAmcHJtcyk7CisKKyAgICBubGFfbmVzdF9lbmQobXNnLCBrZXkpOworCisgICAgcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzPiBidWlsZGluZyBtZXNzYWdlIGZhaWxlZFxuIiwgX19mdW5jX18pOworICAgIHJldHVybiAyOworfQorCitDT01NQU5EKHBsdCwgcmVmX3BvaW50LCAiPHZvbHRhZ2U+IDxwb3dlcj4gPHN1YmJhbmQ+IiwKKyAgICBOTDgwMjExX0NNRF9URVNUTU9ERSwgMCwgQ0lCX05FVERFViwgcGx0X3JlZl9wb2ludCwKKyAgICAiU2V0IHJlZmVyZW5jZSBwb2ludCBmb3IgUExUXG4iKTsKKworc3RhdGljIGludCBjYWxpYl92YWxpZF9oYW5kbGVyKHN0cnVjdCBubF9tc2cgKm1zZywgdm9pZCAqYXJnKQoreworICAgIHN0cnVjdCBubGF0dHIgKnRiW05MODAyMTFfQVRUUl9NQVggKyAxXTsKKyAgICBzdHJ1Y3QgZ2VubG1zZ2hkciAqZ25saCA9IG5sbXNnX2RhdGEobmxtc2dfaGRyKG1zZykpOworICAgIHN0cnVjdCBubGF0dHIgKnRkW1dMMTI3MV9UTV9BVFRSX01BWCArIDFdOworICAgIHN0cnVjdCB3bDEyNzFfY21kX2NhbF9wMmcgKnBybXM7CisjaWYgMAorICAgIGludCBpOyB1bnNpZ25lZCBjaGFyICpwYzsKKyNlbmRpZgorICAgIG5sYV9wYXJzZSh0YiwgTkw4MDIxMV9BVFRSX01BWCwgZ2VubG1zZ19hdHRyZGF0YShnbmxoLCAwKSwKKyAgICAgICAgZ2VubG1zZ19hdHRybGVuKGdubGgsIDApLCBOVUxMKTsKKworICAgIGlmICghdGJbTkw4MDIxMV9BVFRSX1RFU1REQVRBXSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5vIGRhdGEhXG4iKTsKKyAgICAgICAgcmV0dXJuIE5MX1NLSVA7CisgICAgfQorCisgICAgbmxhX3BhcnNlKHRkLCBXTDEyNzFfVE1fQVRUUl9NQVgsIG5sYV9kYXRhKHRiW05MODAyMTFfQVRUUl9URVNUREFUQV0pLAorICAgICAgICBubGFfbGVuKHRiW05MODAyMTFfQVRUUl9URVNUREFUQV0pLCBOVUxMKTsKKworICAgIHBybXMgPSAoc3RydWN0IHdsMTI3MV9jbWRfY2FsX3AyZyAqKW5sYV9kYXRhKHRkW1dMMTI3MV9UTV9BVFRSX0RBVEFdKTsKKworICAgIGlmIChwcm1zLT5yYWRpb19zdGF0dXMpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsIHRvIGNhbGlicmF0ZSBpdGggcmFkaW8gc3RhdHVzICglZClcbiIsCisgICAgICAgICAgICAoc2lnbmVkIHNob3J0KXBybXMtPnJhZGlvX3N0YXR1cyk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyNpZiAwCisgICAgcHJpbnRmKCIlcz4gaWQgJTA0eCBzdGF0dXMgJTA0eFxudGVzdCBpZCAlMDJ4IHZlciAlMDh4IGxlbiAlMDR4PSVkXG4iLAorICAgICAgICBfX2Z1bmNfXywKKyAgICAgICAgcHJtcy0+aGVhZGVyLmlkLCBwcm1zLT5oZWFkZXIuc3RhdHVzLCBwcm1zLT50ZXN0LmlkLAorICAgICAgICBwcm1zLT52ZXIsIHBybXMtPmxlbiwgcHJtcy0+bGVuKTsKKworICAgICAgICBwYyA9ICh1bnNpZ25lZCBjaGFyICopcHJtcy0+YnVmOworICAgICAgICBwcmludGYoIisrKysrKysrKysrKysrKysrKysrKysrK1xuIik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcm1zLT5sZW47IGkrKykgeworICAgICAgICAgICAgaWYgKGklMHhmID09IDApCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworCisgICAgICAgICAgICBwcmludGYoIiUwMnggIiwgKih1bnNpZ25lZCBjaGFyICopcGMpOworICAgICAgICAgICAgcGMgKz0gMTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIisrKysrKysrKysrKysrKysrKysrKysrK1xuIik7CisjZW5kaWYKKyAgICBpZiAocHJlcGFyZV9udnNfZmlsZShwcm1zLCBhcmcpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbCB0byBwcmVwYXJlIGNhbGlicmF0ZWQgTlZTIGZpbGVcbiIpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisjaWYgMAorICAgIHByaW50ZigiXG5cdFRoZSBOVlMgZmlsZSAoJXMpIGlzIHJlYWR5XG5cdENvcHkgaXQgdG8gJXMgYW5kICIKKyAgICAgICAgInJlYm9vdCB0aGUgc3lzdGVtXG5cbiIsCisgICAgICAgIE5FV19OVlNfTkFNRSwgQ1VSUkVOVF9OVlNfTkFNRSk7CisjZW5kaWYKKyAgICByZXR1cm4gTkxfU0tJUDsKK30KKworc3RhdGljIGludCBwbHRfdHhfYmlwKHN0cnVjdCBubDgwMjExX3N0YXRlICpzdGF0ZSwgc3RydWN0IG5sX2NiICpjYiwKKyAgICAgICAgICAgIHN0cnVjdCBubF9tc2cgKm1zZywgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIHN0cnVjdCBubGF0dHIgKmtleTsKKyAgICBzdHJ1Y3Qgd2wxMjcxX2NtZF9jYWxfcDJnIHBybXM7CisgICAgaW50IGk7CisgICAgY2hhciBudnNfcGF0aFtQQVRIX01BWF07CisKKyAgICBpZiAoYXJnYyA8IDgpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcz4gTWlzc2luZyBhcmd1bWVudHNcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgaWYgKGFyZ2MgPiA4KSB7CisgICAgICAgIHN0cm5jcHkobnZzX3BhdGgsIGFyZ3ZbOF0sIHN0cmxlbihhcmd2WzhdKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbnZzX3BhdGhbMF0gPSAnXDAnOworICAgIH0KKworICAgIG1lbXNldCgmcHJtcywgMCwgc2l6ZW9mKHN0cnVjdCB3bDEyNzFfY21kX2NhbF9wMmcpKTsKKworICAgIHBybXMudGVzdC5pZCA9IFRFU1RfQ01EX1AyR19DQUw7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBwcm1zLnN1Yl9iYW5kX21hc2sgfD0gKGF0b2koYXJndltpXSkgJiAweDEpPDxpOworICAgIH0KKworICAgIGtleSA9IG5sYV9uZXN0X3N0YXJ0KG1zZywgTkw4MDIxMV9BVFRSX1RFU1REQVRBKTsKKyAgICBpZiAoIWtleSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZhaWwgdG8gbmxhX25lc3Rfc3RhcnQoKVxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIE5MQV9QVVRfVTMyKG1zZywgV0wxMjcxX1RNX0FUVFJfQ01EX0lELCBXTDEyNzFfVE1fQ01EX1RFU1QpOworICAgIE5MQV9QVVQobXNnLCBXTDEyNzFfVE1fQVRUUl9EQVRBLCBzaXplb2YocHJtcyksICZwcm1zKTsKKyAgICBOTEFfUFVUX1U4KG1zZywgV0wxMjcxX1RNX0FUVFJfQU5TV0VSLCAxKTsKKworICAgIG5sYV9uZXN0X2VuZChtc2csIGtleSk7CisKKyAgICBubF9jYl9zZXQoY2IsIE5MX0NCX1ZBTElELCBOTF9DQl9DVVNUT00sIGNhbGliX3ZhbGlkX2hhbmRsZXIsIG52c19wYXRoKTsKKworICAgIHJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisgICAgZnByaW50ZihzdGRlcnIsICIlcz4gYnVpbGRpbmcgbWVzc2FnZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gMjsKK30KKworQ09NTUFORChwbHQsIHR4X2JpcCwKKyAgICAiPDB8MT4gPDB8MT4gPDB8MT4gPDB8MT4gPDB8MT4gPDB8MT4gPDB8MT4gPDB8MT4gWzxudnMgZmlsZT5dIiwKKyAgICBOTDgwMjExX0NNRF9URVNUTU9ERSwgMCwgQ0lCX05FVERFViwgcGx0X3R4X2JpcCwKKyAgICAiRG8gY2FsaWJyYXRlXG4iKTsKKworc3RhdGljIGludCBwbHRfdHhfdG9uZShzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBubF9jYiAqY2IsCisgICAgICAgICAgICBzdHJ1Y3QgbmxfbXNnICptc2csIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBzdHJ1Y3QgbmxhdHRyICprZXk7CisgICAgc3RydWN0IHdsMTI3MV9jbWRfY2FsX3R4X3RvbmUgcHJtczsKKworICAgIGlmIChhcmdjIDwgMikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzPiBNaXNzaW5nIGFyZ3VtZW50c1xuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisKKyAgICBtZW1zZXQoJnBybXMsIDAsIHNpemVvZihzdHJ1Y3Qgd2wxMjcxX2NtZF9jYWxfdHhfdG9uZSkpOworCisgICAgcHJtcy50ZXN0LmlkID0gVEVTVF9DTURfVEVMRUM7CisgICAgcHJtcy5wb3dlciA9IGF0b2koYXJndlswXSk7CisgICAgcHJtcy50b25lX3R5cGUgPSBhdG9pKGFyZ3ZbMV0pOworCisgICAga2V5ID0gbmxhX25lc3Rfc3RhcnQobXNnLCBOTDgwMjExX0FUVFJfVEVTVERBVEEpOworICAgIGlmICgha2V5KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbCB0byBubGFfbmVzdF9zdGFydCgpXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgTkxBX1BVVF9VMzIobXNnLCBXTDEyNzFfVE1fQVRUUl9DTURfSUQsIFdMMTI3MV9UTV9DTURfVEVTVCk7CisgICAgTkxBX1BVVChtc2csIFdMMTI3MV9UTV9BVFRSX0RBVEEsIHNpemVvZihwcm1zKSwgJnBybXMpOworCisgICAgbmxhX25lc3RfZW5kKG1zZywga2V5KTsKKworICAgIHJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisgICAgZnByaW50ZihzdGRlcnIsICIlcz4gYnVpbGRpbmcgbWVzc2FnZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gMjsKK30KKworQ09NTUFORChwbHQsIHR4X3RvbmUsICI8cG93ZXI+IDx0b25lIHR5cGU+IiwKKyAgICBOTDgwMjExX0NNRF9URVNUTU9ERSwgMCwgQ0lCX05FVERFViwgcGx0X3R4X3RvbmUsCisgICAgIkRvIGNvbW1hbmQgdHhfdG9uZSB0byB0cmFuc21pdCBhIHRvbmVcbiIpOworCitzdGF0aWMgaW50IHBsdF90eF9jb250KHN0cnVjdCBubDgwMjExX3N0YXRlICpzdGF0ZSwgc3RydWN0IG5sX2NiICpjYiwKKyAgICAgICAgICAgIHN0cnVjdCBubF9tc2cgKm1zZywgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIHN0cnVjdCBubGF0dHIgKmtleTsKKyAgICBzdHJ1Y3Qgd2wxMjcxX2NtZF9wa3RfcGFyYW1zIHBybXMgPSB7CisgICAgICAgIC5zcmNfbWFjID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH0sCisgICAgfTsKKworICAgIGlmIChhcmdjICE9IDE1KSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyNpZiAwCisgICAgcHJpbnRmKCIlcz4gZGVsYXkgKCVkKSByYXRlICglMDh4KSBzaXplICglZCkgYW1vdW50ICglZCkgcG93ZXIgKCVkKSAiCisgICAgICAgICJzZWVkICglZCkgcGt0X21vZGUgKCVkKSBEQ0YgKCVkKSBHSSAoJWQpIHByZWFtYmxlICglZCkgdHlwZSAiCisgICAgICAgICIoJWQpIHNjcmFtYmxlICglZCkgQ0xQQyAoJWQpLCBTZXFOYnJNb2RlICglZCkgRGVzdE1BQyAoJXMpXG4iLAorICAgICAgICBfX2Z1bmNfXywKKyAgICAgICAgYXRvaShhcmd2WzBdKSwgIGF0b2koYXJndlsxXSksICBhdG9pKGFyZ3ZbMl0pLCAgYXRvaShhcmd2WzNdKSwKKyAgICAgICAgYXRvaShhcmd2WzRdKSwgIGF0b2koYXJndls1XSksICBhdG9pKGFyZ3ZbNl0pLCAgYXRvaShhcmd2WzddKSwKKyAgICAgICAgYXRvaShhcmd2WzhdKSwgIGF0b2koYXJndls5XSksICBhdG9pKGFyZ3ZbMTBdKSwgYXRvaShhcmd2WzExXSksCisgICAgICAgIGF0b2koYXJndlsxMl0pLCBhdG9pKGFyZ3ZbMTNdKSwgYXJndlsxNF0KKyAgICApOworI2VuZGlmCisgICAgbWVtc2V0KCh2b2lkICopJnBybXMsIDAsIHNpemVvZihzdHJ1Y3Qgd2wxMjcxX2NtZF9wa3RfcGFyYW1zKSk7CisKKyAgICBwcm1zLnRlc3QuaWQgPSBURVNUX0NNRF9GQ0M7CisgICAgcHJtcy5kZWxheSA9IGF0b2koYXJndlswXSk7CisgICAgcHJtcy5yYXRlID0gYXRvaShhcmd2WzFdKTsKKyAgICBwcm1zLnNpemUgPSAodW5zaWduZWQgc2hvcnQpYXRvaShhcmd2WzJdKTsKKyAgICBwcm1zLmFtb3VudCA9ICh1bnNpZ25lZCBzaG9ydClhdG9pKGFyZ3ZbM10pOworICAgIHBybXMucG93ZXIgPSBhdG9pKGFyZ3ZbNF0pOworICAgIHBybXMuc2VlZCA9ICh1bnNpZ25lZCBzaG9ydClhdG9pKGFyZ3ZbNV0pOworICAgIHBybXMucGt0X21vZGUgPSAodW5zaWduZWQgY2hhcilhdG9pKGFyZ3ZbNl0pOworICAgIHBybXMuZGNmX2VuYWJsZSA9ICh1bnNpZ25lZCBjaGFyKWF0b2koYXJndls3XSk7CisgICAgcHJtcy5nX2ludGVydmFsID0gKHVuc2lnbmVkIGNoYXIpYXRvaShhcmd2WzhdKTsKKyAgICBwcm1zLnByZWFtYmxlID0gKHVuc2lnbmVkIGNoYXIpYXRvaShhcmd2WzldKTsKKyAgICBwcm1zLnR5cGUgPSAodW5zaWduZWQgY2hhcilhdG9pKGFyZ3ZbMTBdKTsKKyAgICBwcm1zLnNjcmFtYmxlID0gKHVuc2lnbmVkIGNoYXIpYXRvaShhcmd2WzExXSk7CisgICAgcHJtcy5jbHBjX2VuYWJsZSA9ICh1bnNpZ25lZCBjaGFyKWF0b2koYXJndlsxMl0pOworICAgIHBybXMuc2VxX25icl9tb2RlID0gKHVuc2lnbmVkIGNoYXIpYXRvaShhcmd2WzEzXSk7CisgICAgc3RyMm1hYyhwcm1zLmRzdF9tYWMsIGFyZ3ZbMTRdKTsKKworICAgIGlmIChnZXRfbWFjX2FkZHIoMCwgcHJtcy5zcmNfbWFjKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZhaWwgdG8gZ2V0IE1BQyBhZGRyXG4iKTsKKyAgICB9CisKKyAgICBwcmludGYoIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorICAgICAgICBwcm1zLnNyY19tYWNbMF0sIHBybXMuc3JjX21hY1sxXSwgcHJtcy5zcmNfbWFjWzJdLAorICAgICAgICBwcm1zLnNyY19tYWNbM10sIHBybXMuc3JjX21hY1s0XSwgcHJtcy5zcmNfbWFjWzVdKTsKKworICAgIGtleSA9IG5sYV9uZXN0X3N0YXJ0KG1zZywgTkw4MDIxMV9BVFRSX1RFU1REQVRBKTsKKyAgICBpZiAoIWtleSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZhaWwgdG8gbmxhX25lc3Rfc3RhcnQoKVxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIE5MQV9QVVRfVTMyKG1zZywgV0wxMjcxX1RNX0FUVFJfQ01EX0lELCBXTDEyNzFfVE1fQ01EX1RFU1QpOworICAgIE5MQV9QVVQobXNnLCBXTDEyNzFfVE1fQVRUUl9EQVRBLCBzaXplb2YocHJtcyksICZwcm1zKTsKKworICAgIG5sYV9uZXN0X2VuZChtc2csIGtleSk7CisKKyAgICByZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorICAgIGZwcmludGYoc3RkZXJyLCAiJXM+IGJ1aWxkaW5nIG1lc3NhZ2UgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIDI7Cit9CisKK0NPTU1BTkQocGx0LCB0eF9jb250LCAiPGRlbGF5PiA8cmF0ZT4gPHNpemU+IDxhbW91bnQ+IDxwb3dlcj5cblx0XHQ8c2VlZD4gIgorICAgICI8cGt0IG1vZGU+IDxEQyBvbi9vZmY+IDxnaT4gPHByZWFtYmxlPlxuXHRcdDx0eXBlPiA8c2NyYW1ibGU+ICIKKyAgICAiPGNscGM+IDxzZXEgbmJyIG1vZGU+IDxkZXN0IG1hYz4iLAorICAgIE5MODAyMTFfQ01EX1RFU1RNT0RFLCAwLCBDSUJfTkVUREVWLCBwbHRfdHhfY29udCwKKyAgICAiU3RhcnQgVHggQ29udFxuIik7CisKK3N0YXRpYyBpbnQgcGx0X3R4X3N0b3Aoc3RydWN0IG5sODAyMTFfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgbmxfY2IgKmNiLAorICAgICAgICAgICAgc3RydWN0IG5sX21zZyAqbXNnLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgc3RydWN0IG5sYXR0ciAqa2V5OworICAgIHN0cnVjdCB3bDEyNzFfY21kX3BrdF9wYXJhbXMgcHJtczsKKworICAgIHBybXMudGVzdC5pZCA9IFRFU1RfQ01EX1NUT1BfVFg7CisKKyAgICBrZXkgPSBubGFfbmVzdF9zdGFydChtc2csIE5MODAyMTFfQVRUUl9URVNUREFUQSk7CisgICAgaWYgKCFrZXkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsIHRvIG5sYV9uZXN0X3N0YXJ0KClcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBOTEFfUFVUX1UzMihtc2csIFdMMTI3MV9UTV9BVFRSX0NNRF9JRCwgV0wxMjcxX1RNX0NNRF9URVNUKTsKKyAgICBOTEFfUFVUKG1zZywgV0wxMjcxX1RNX0FUVFJfREFUQSwgc2l6ZW9mKHBybXMpLCAmcHJtcyk7CisKKyAgICBubGFfbmVzdF9lbmQobXNnLCBrZXkpOworCisgICAgcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzPiBidWlsZGluZyBtZXNzYWdlIGZhaWxlZFxuIiwgX19mdW5jX18pOworICAgIHJldHVybiAyOworfQorCitDT01NQU5EKHBsdCwgdHhfc3RvcCwgTlVMTCwKKyAgICBOTDgwMjExX0NNRF9URVNUTU9ERSwgMCwgQ0lCX05FVERFViwgcGx0X3R4X3N0b3AsCisgICAgIlN0b3AgVHggQ29udFxuIik7CisKK3N0YXRpYyBpbnQgcGx0X3N0YXJ0X3J4X3N0YXRjcyhzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBubF9jYiAqY2IsCisgICAgICAgICAgICBzdHJ1Y3QgbmxfbXNnICptc2csIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBzdHJ1Y3QgbmxhdHRyICprZXk7CisgICAgc3RydWN0IHdsMTI3MV9jbWRfcGt0X3BhcmFtcyBwcm1zOworCisgICAgcHJtcy50ZXN0LmlkID0gVEVTVF9DTURfUlhfU1RBVF9TVEFSVDsKKworICAgIGtleSA9IG5sYV9uZXN0X3N0YXJ0KG1zZywgTkw4MDIxMV9BVFRSX1RFU1REQVRBKTsKKyAgICBpZiAoIWtleSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzPiBmYWlsIHRvIG5sYV9uZXN0X3N0YXJ0KClcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgTkxBX1BVVF9VMzIobXNnLCBXTDEyNzFfVE1fQVRUUl9DTURfSUQsIFdMMTI3MV9UTV9DTURfVEVTVCk7CisgICAgTkxBX1BVVChtc2csIFdMMTI3MV9UTV9BVFRSX0RBVEEsIHNpemVvZihwcm1zKSwgJnBybXMpOworCisgICAgbmxhX25lc3RfZW5kKG1zZywga2V5KTsKKworICAgIHJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisgICAgZnByaW50ZihzdGRlcnIsICIlcz4gYnVpbGRpbmcgbWVzc2FnZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gMjsKK30KKworQ09NTUFORChwbHQsIHN0YXJ0X3J4X3N0YXRjcywgTlVMTCwKKyAgICBOTDgwMjExX0NNRF9URVNUTU9ERSwgMCwgQ0lCX05FVERFViwgcGx0X3N0YXJ0X3J4X3N0YXRjcywKKyAgICAiU3RhcnQgUnggc3RhdGlzdGljcyBjb2xsZWN0aW9uXG4iKTsKKworc3RhdGljIGludCBwbHRfc3RvcF9yeF9zdGF0Y3Moc3RydWN0IG5sODAyMTFfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgbmxfY2IgKmNiLAorICAgICAgICAgICAgc3RydWN0IG5sX21zZyAqbXNnLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgc3RydWN0IG5sYXR0ciAqa2V5OworICAgIHN0cnVjdCB3bDEyNzFfY21kX3BrdF9wYXJhbXMgcHJtczsKKworICAgIHBybXMudGVzdC5pZCA9IFRFU1RfQ01EX1JYX1NUQVRfU1RPUDsKKworICAgIGtleSA9IG5sYV9uZXN0X3N0YXJ0KG1zZywgTkw4MDIxMV9BVFRSX1RFU1REQVRBKTsKKyAgICBpZiAoIWtleSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzPiBmYWlsIHRvIG5sYV9uZXN0X3N0YXJ0KClcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgTkxBX1BVVF9VMzIobXNnLCBXTDEyNzFfVE1fQVRUUl9DTURfSUQsIFdMMTI3MV9UTV9DTURfVEVTVCk7CisgICAgTkxBX1BVVChtc2csIFdMMTI3MV9UTV9BVFRSX0RBVEEsIHNpemVvZihwcm1zKSwgJnBybXMpOworCisgICAgbmxhX25lc3RfZW5kKG1zZywga2V5KTsKKworICAgIHJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisgICAgZnByaW50ZihzdGRlcnIsICIlcz4gYnVpbGRpbmcgbWVzc2FnZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gMjsKK30KKworQ09NTUFORChwbHQsIHN0b3Bfcnhfc3RhdGNzLCBOVUxMLAorICAgIE5MODAyMTFfQ01EX1RFU1RNT0RFLCAwLCBDSUJfTkVUREVWLCBwbHRfc3RvcF9yeF9zdGF0Y3MsCisgICAgIlN0b3AgUnggc3RhdGlzdGljcyBjb2xsZWN0aW9uXG4iKTsKKworc3RhdGljIGludCBwbHRfcmVzZXRfcnhfc3RhdGNzKHN0cnVjdCBubDgwMjExX3N0YXRlICpzdGF0ZSwgc3RydWN0IG5sX2NiICpjYiwKKyAgICAgICAgICAgIHN0cnVjdCBubF9tc2cgKm1zZywgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIHN0cnVjdCBubGF0dHIgKmtleTsKKyAgICBzdHJ1Y3Qgd2wxMjcxX2NtZF9wa3RfcGFyYW1zIHBybXM7CisKKyAgICBwcm1zLnRlc3QuaWQgPSBURVNUX0NNRF9SWF9TVEFUX1JFU0VUOworCisgICAga2V5ID0gbmxhX25lc3Rfc3RhcnQobXNnLCBOTDgwMjExX0FUVFJfVEVTVERBVEEpOworICAgIGlmICgha2V5KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM+IGZhaWwgdG8gbmxhX25lc3Rfc3RhcnQoKVxuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBOTEFfUFVUX1UzMihtc2csIFdMMTI3MV9UTV9BVFRSX0NNRF9JRCwgV0wxMjcxX1RNX0NNRF9URVNUKTsKKyAgICBOTEFfUFVUKG1zZywgV0wxMjcxX1RNX0FUVFJfREFUQSwgc2l6ZW9mKHBybXMpLCAmcHJtcyk7CisKKyAgICBubGFfbmVzdF9lbmQobXNnLCBrZXkpOworCisgICAgcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzPiBidWlsZGluZyBtZXNzYWdlIGZhaWxlZFxuIiwgX19mdW5jX18pOworICAgIHJldHVybiAyOworfQorCitDT01NQU5EKHBsdCwgcmVzZXRfcnhfc3RhdGNzLCBOVUxMLAorICAgIE5MODAyMTFfQ01EX1RFU1RNT0RFLCAwLCBDSUJfTkVUREVWLCBwbHRfcmVzZXRfcnhfc3RhdGNzLAorICAgICJSZXNldCBSeCBzdGF0aXN0aWNzIGNvbGxlY3Rpb25cbiIpOworCitzdGF0aWMgaW50IGRpc3BsYXlfcnhfc3RhdGNzKHN0cnVjdCBubF9tc2cgKm1zZywgdm9pZCAqYXJnKQoreworICAgIHN0cnVjdCBubGF0dHIgKnRiW05MODAyMTFfQVRUUl9NQVggKyAxXTsKKyAgICBzdHJ1Y3QgZ2VubG1zZ2hkciAqZ25saCA9IG5sbXNnX2RhdGEobmxtc2dfaGRyKG1zZykpOworICAgIHN0cnVjdCBubGF0dHIgKnRkW1dMMTI3MV9UTV9BVFRSX01BWCArIDFdOworICAgIHN0cnVjdCB3bDEyNzFfcmFkaW9fcnhfc3RhdGNzICpwcm1zOworCisgICAgbmxhX3BhcnNlKHRiLCBOTDgwMjExX0FUVFJfTUFYLCBnZW5sbXNnX2F0dHJkYXRhKGdubGgsIDApLAorICAgICAgICBnZW5sbXNnX2F0dHJsZW4oZ25saCwgMCksIE5VTEwpOworCisgICAgaWYgKCF0YltOTDgwMjExX0FUVFJfVEVTVERBVEFdKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibm8gZGF0YSFcbiIpOworICAgICAgICByZXR1cm4gTkxfU0tJUDsKKyAgICB9CisKKyAgICBubGFfcGFyc2UodGQsIFdMMTI3MV9UTV9BVFRSX01BWCwgbmxhX2RhdGEodGJbTkw4MDIxMV9BVFRSX1RFU1REQVRBXSksCisgICAgICAgIG5sYV9sZW4odGJbTkw4MDIxMV9BVFRSX1RFU1REQVRBXSksIE5VTEwpOworCisgICAgcHJtcyA9CisgICAgICAgIChzdHJ1Y3Qgd2wxMjcxX3JhZGlvX3J4X3N0YXRjcyAqKQorICAgICAgICAgICAgbmxhX2RhdGEodGRbV0wxMjcxX1RNX0FUVFJfREFUQV0pOworCisgICAgcHJpbnRmKCJcblx0VG90YWwgbnVtYmVyIG9mIHBrdHNcdC0gJWRcblx0QWNjZXB0ZWQgcGt0c1x0XHQtICVkXG5cdCIKKyAgICAgICAgIkZDUyBlcnJvciBwa3RzXHRcdC0gJWRcblx0QWRkcmVzcyBtaXNtYXRjaCBwa3RzXHQtICVkXG5cdCIKKyAgICAgICAgIkF2ZXJhZ2UgU05SXHRcdC0gJSBkIGRCbVxuXHRBdmVyYWdlIFJTU0lcdFx0LSAlIGQgZEJtXG5cbiIsCisgICAgICAgIHBybXMtPmJhc2VfcGt0X2lkLCBwcm1zLT5yeF9wYXRoX3N0YXRjcy5uYnJfcnhfdmFsaWRfcGt0cywKKyAgICAgICAgcHJtcy0+cnhfcGF0aF9zdGF0Y3MubmJyX3J4X2Zjc19lcnJfcGt0cywKKyAgICAgICAgcHJtcy0+cnhfcGF0aF9zdGF0Y3MubmJyX3J4X3BsY3BfZXJyX3BrdHMsCisgICAgICAgIChzaWduZWQgc2hvcnQpcHJtcy0+cnhfcGF0aF9zdGF0Y3MuYXZlX3Nuci84LAorICAgICAgICAoc2lnbmVkIHNob3J0KXBybXMtPnJ4X3BhdGhfc3RhdGNzLmF2ZV9yc3NpLzgpOworCisgICAgcmV0dXJuIE5MX1NLSVA7Cit9CisKK3N0YXRpYyBpbnQgcGx0X2dldF9yeF9zdGF0Y3Moc3RydWN0IG5sODAyMTFfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgbmxfY2IgKmNiLAorICAgICAgICAgICAgc3RydWN0IG5sX21zZyAqbXNnLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgc3RydWN0IG5sYXR0ciAqa2V5OworICAgIHN0cnVjdCB3bDEyNzFfcmFkaW9fcnhfc3RhdGNzIHBybXM7CisKKyAgICBwcm1zLnRlc3QuaWQgPSBURVNUX0NNRF9SWF9TVEFUX0dFVDsKKworICAgIGtleSA9IG5sYV9uZXN0X3N0YXJ0KG1zZywgTkw4MDIxMV9BVFRSX1RFU1REQVRBKTsKKyAgICBpZiAoIWtleSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzPiBmYWlsIHRvIG5sYV9uZXN0X3N0YXJ0KClcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgTkxBX1BVVF9VMzIobXNnLCBXTDEyNzFfVE1fQVRUUl9DTURfSUQsIFdMMTI3MV9UTV9DTURfVEVTVCk7CisgICAgTkxBX1BVVChtc2csIFdMMTI3MV9UTV9BVFRSX0RBVEEsIHNpemVvZihwcm1zKSwgJnBybXMpOworICAgIE5MQV9QVVRfVTgobXNnLCBXTDEyNzFfVE1fQVRUUl9BTlNXRVIsIDEpOworCisgICAgbmxhX25lc3RfZW5kKG1zZywga2V5KTsKKworICAgIG5sX2NiX3NldChjYiwgTkxfQ0JfVkFMSUQsIE5MX0NCX0NVU1RPTSwgZGlzcGxheV9yeF9zdGF0Y3MsIE5VTEwpOworCisgICAgLyogSW1wb3J0YW50OiBuZWVkZWQgZ2FwIGJldHdlZW4gdHhfc3RhcnQgYW5kIHR4X2dldCAqLworICAgIHNsZWVwKDIpOworCisgICAgcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzPiBidWlsZGluZyBtZXNzYWdlIGZhaWxlZFxuIiwgX19mdW5jX18pOworICAgIHJldHVybiAyOworfQorCitDT01NQU5EKHBsdCwgZ2V0X3J4X3N0YXRjcywgTlVMTCwKKyAgICBOTDgwMjExX0NNRF9URVNUTU9ERSwgMCwgQ0lCX05FVERFViwgcGx0X2dldF9yeF9zdGF0Y3MsCisgICAgIkdldCBSeCBzdGF0aXN0aWNzXG4iKTsKKworc3RhdGljIGludCBwbHRfcnhfc3RhdGlzdGljcyhzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBubF9jYiAqY2IsCisgICAgICAgICAgICBzdHJ1Y3QgbmxfbXNnICptc2csIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgcmV0OworCisgICAgLyogcG93ZXIgbW9kZSBvbiAqLworICAgIHsKKyAgICAgICAgY2hhciAqcHJtc1s0XSA9IHsgIndsYW4wIiwgInBsdCIsICJwb3dlcl9tb2RlIiwgIm9uIiB9OworCisgICAgICAgIHJldCA9IGhhbmRsZV9jbWQoc3RhdGUsIElJX05FVERFViwgNCwgcHJtcyk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWwgdG8gc2V0IFBMVCBwb3dlciBtb2RlIG9uXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgLyogc3RhcnRfcnhfc3RhdGNzICovCisgICAgeworICAgICAgICBjaGFyICpwcm1zWzNdID0geyAid2xhbjAiLCAicGx0IiwgInN0YXJ0X3J4X3N0YXRjcyIgfTsKKworICAgICAgICByZXQgPSBoYW5kbGVfY21kKHN0YXRlLCBJSV9ORVRERVYsIDMsIHBybXMpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsIHRvIHN0YXJ0IFJ4IHN0YXRpc3RpY3NcbiIpOworICAgICAgICAgICAgZ290byBmYWlsX291dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGdldF9yeF9zdGF0Y3MgKi8KKyAgICB7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIGNoYXIgKnBybXNbM10gPSB7ICJ3bGFuMCIsICJwbHQiLCAiZ2V0X3J4X3N0YXRjcyIgfTsKKworICAgICAgICBlcnIgPSBoYW5kbGVfY21kKHN0YXRlLCBJSV9ORVRERVYsIDMsIHBybXMpOworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsIHRvIGdldCBSeCBzdGF0aXN0aWNzXG4iKTsKKyAgICAgICAgICAgIHJldCA9IGVycjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyogc3RvcF9yeF9zdGF0Y3MgKi8KKyAgICB7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIGNoYXIgKnBybXNbM10gPSB7ICJ3bGFuMCIsICJwbHQiLCAic3RvcF9yeF9zdGF0Y3MiIH07CisKKyAgICAgICAgZXJyID0gaGFuZGxlX2NtZChzdGF0ZSwgSUlfTkVUREVWLCAzLCBwcm1zKTsKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbCB0byBzdG9wIFJ4IHN0YXRpc3RpY3NcbiIpOworICAgICAgICAgICAgcmV0ID0gZXJyOworICAgICAgICB9CisgICAgfQorCitmYWlsX291dDoKKyAgICAvKiBwb3dlciBtb2RlIG9mZiAqLworICAgIHsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgY2hhciAqcHJtc1s0XSA9IHsgIndsYW4wIiwgInBsdCIsICJwb3dlcl9tb2RlIiwgIm9mZiJ9OworCisgICAgICAgIGVyciA9IGhhbmRsZV9jbWQoc3RhdGUsIElJX05FVERFViwgNCwgcHJtcyk7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWwgdG8gc2V0IFBMVCBwb3dlciBtb2RlIG9uXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK0NPTU1BTkQocGx0LCByeF9zdGF0aXN0aWNzLCBOVUxMLCAwLCAwLCBDSUJfTk9ORSwgcGx0X3J4X3N0YXRpc3RpY3MsCisgICAgIkdldCBSeCBzdGF0aXN0aWNzXG4iKTsKKworc3RhdGljIGludCBwbHRfY2FsaWJyYXRlKHN0cnVjdCBubDgwMjExX3N0YXRlICpzdGF0ZSwgc3RydWN0IG5sX2NiICpjYiwKKyAgICAgICAgICAgIHN0cnVjdCBubF9tc2cgKm1zZywgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCByZXQgPSAwLCBlcnI7CisgICAgaW50IHNpbmdsZV9kdWFsID0gMDsKKworICAgIGlmIChhcmdjID4gMiAmJiAoc3RybmNtcChhcmd2WzJdLCAiZHVhbCIsIDQpID09ICAwKSkgeworICAgICAgICBzaW5nbGVfZHVhbCA9IDE7ICAgIC8qIGdvaW5nIGZvciBkdWFsIGJhbmQgY2FsaWJyYXRpb24gKi8KKyAgICB9IGVsc2UgeworICAgICAgICBzaW5nbGVfZHVhbCA9IDA7ICAgIC8qIGdvaW5nIGZvciBzaW5nbGUgYmFuZCBjYWxpYnJhdGlvbiAqLworICAgIH0KKworICAgIC8qIHBvd2VyIG1vZGUgb24gKi8KKyAgICB7CisgICAgICAgIGNoYXIgKnBtX29uWzRdID0geyAid2xhbjAiLCAicGx0IiwgInBvd2VyX21vZGUiLCAib24iIH07CisKKyAgICAgICAgZXJyID0gaGFuZGxlX2NtZChzdGF0ZSwgSUlfTkVUREVWLCA0LCBwbV9vbik7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWwgdG8gc2V0IFBMVCBwb3dlciBtb2RlIG9uXG4iKTsKKyAgICAgICAgICAgIHJldCA9IGVycjsKKyAgICAgICAgICAgIGdvdG8gZmFpbF9vdXRfZmluYWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB0dW5lIGNoYW5uZWwgKi8KKyAgICB7CisgICAgICAgIGNoYXIgKnBtX29uWzVdID0geworICAgICAgICAgICAgIndsYW4wIiwgInBsdCIsICJ0dW5lX2NoYW5uZWwiLCAiMCIsICI3IgorICAgICAgICB9OworCisgICAgICAgIGVyciA9IGhhbmRsZV9jbWQoc3RhdGUsIElJX05FVERFViwgNSwgcG1fb24pOworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsIHRvIHR1bmUgY2hhbm5lbFxuIik7CisgICAgICAgICAgICByZXQgPSBlcnI7CisgICAgICAgICAgICBnb3RvIGZhaWxfb3V0OworICAgICAgICB9CisgICAgfQorCisgICAgLyogY2FsaWJyYXRlIGl0ICovCisgICAgeworICAgICAgICBjaGFyICpwcm1zWzExXSA9IHsKKyAgICAgICAgICAgICJ3bGFuMCIsICJwbHQiLCAidHhfYmlwIiwgIjEiLCAiMCIsICIwIiwgIjAiLAorICAgICAgICAgICAgIjAiLCAiMCIsICIwIiwgIjAiCisgICAgICAgIH07CisKKyAgICAgICAgLyogc2V0IGZsYWdzIGluIGNhc2Ugb2YgZHVhbCBiYW5kICovCisgICAgICAgIGlmIChzaW5nbGVfZHVhbCkgeworICAgICAgICAgICAgcHJtc1s0XSA9IHBybXNbNV0gPSBwcm1zWzZdID0gcHJtc1s3XSA9IHBybXNbOF0gPQorICAgICAgICAgICAgICAgIHBybXNbOV0gPSBwcm1zWzEwXSA9ICIxIjsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IGhhbmRsZV9jbWQoc3RhdGUsIElJX05FVERFViwgMTEsIHBybXMpOworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsIHRvIGNhbGlicmF0ZVxuIik7CisgICAgICAgICAgICByZXQgPSBlcnI7CisgICAgICAgIH0KKyAgICB9CisKK2ZhaWxfb3V0OgorICAgIC8qIHBvd2VyIG1vZGUgb2ZmICovCisgICAgeworICAgICAgICBjaGFyICpwcm1zWzRdID0geyAid2xhbjAiLCAicGx0IiwgInBvd2VyX21vZGUiLCAib2ZmIn07CisKKyAgICAgICAgZXJyID0gaGFuZGxlX2NtZChzdGF0ZSwgSUlfTkVUREVWLCA0LCBwcm1zKTsKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbCB0byBzZXQgUExUIHBvd2VyIG1vZGUgb25cbiIpOworICAgICAgICAgICAgcmV0ID0gZXJyOworICAgICAgICB9CisgICAgfQorCitmYWlsX291dF9maW5hbDoKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworQ09NTUFORChwbHQsIGNhbGlicmF0ZSwgIls8c2luZ2xlfGR1YWw+XSIsIDAsIDAsIENJQl9OT05FLAorICAgIHBsdF9jYWxpYnJhdGUsICJEbyBjYWxpYnJhdGUgZm9yIHNpbmdsZSBvciBkdWFsIGJhbmQgY2hpcFxuIik7CmRpZmYgLS1naXQgYS9tYWM4MDIxMS90aS11dGlscy9wbHQuaCBiL21hYzgwMjExL3RpLXV0aWxzL3BsdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOWJjYTQKLS0tIC9kZXYvbnVsbAorKysgYi9tYWM4MDIxMS90aS11dGlscy9wbHQuaApAQCAtMCwwICsxLDM3MiBAQAorI2lmbmRlZiBfX1BMVF9ICisjZGVmaW5lIF9fUExUX0gKKworI2lmZGVmIEFORFJPSUQKKyNkZWZpbmUgQ1VSUkVOVF9OVlNfTkFNRSAgICAiL3N5c3RlbS9ldGMvZmlybXdhcmUvdGktY29ubmVjdGl2aXR5L3dsMTI3MS1udnMuYmluIgorI2Vsc2UKKyNkZWZpbmUgQ1VSUkVOVF9OVlNfTkFNRSAgICAiL2xpYi9maXJtd2FyZS90aS1jb25uZWN0aXZpdHkvd2wxMjcxLW52cy5iaW4iCisjZW5kaWYKKyNkZWZpbmUgTkVXX05WU19OQU1FICAgICAgICAiLi9uZXctbnZzLmJpbiIKKyNkZWZpbmUgTlZTX0ZJTEVfU0laRV8xMjdYICAgIDB4MzkwCisjZGVmaW5lIE5WU19GSUxFX1NJWkVfMTI4WCAgICAweDQ1OQorCisvKiBOVlMgZGVmaW5pdGlvbiBzdGFydCBoZXJlICovCisKKyNkZWZpbmUgTlZTX1RYX1RZUEVfSU5ERVggICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgU1RBUlRfVFlQRV9JTkRFWF9JTl9UTFYgICAgICAgIDAKKyNkZWZpbmUgVExWX1RZUEVfTEVOR1RIICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNUQVJUX0xFTkdUSF9JTkRFWCAgICAgICAgICAgICAgXAorKFNUQVJUX1RZUEVfSU5ERVhfSU5fVExWICsgVExWX1RZUEVfTEVOR1RIKSAvKiAxICovCisjZGVmaW5lIFRMVl9MRU5HVEhfTEVOR1RIICAgICAgICAgICAgICAgMgorI2RlZmluZSBTVEFSVF9QQVJBTV9JTkRFWCAgICAgICAgICAgICAgIFwKKyhTVEFSVF9MRU5HVEhfSU5ERVggKyBUTFZfTEVOR1RIX0xFTkdUSCkgLyogMyAqLworCisjZGVmaW5lIE5WU19WRVJTSU9OXzEgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBOVlNfVkVSU0lPTl8yICAgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBOVlNfTUFDX0ZJUlNUX0xFTkdUSF9JTkRFWCAgICAgIDAKKyNkZWZpbmUgTlZTX01BQ19GSVJTVF9MRU5HSFRfVkFMVUUgICAgICAxCisKKyNkZWZpbmUgTlZTX01BQ19MX0FERFJFU1NfSU5ERVggICAgICAgICBcCisoKE5WU19NQUNfRklSU1RfTEVOR1RIX0lOREVYKSArIDEpIC8qIDEqLworI2RlZmluZSBOVlNfTUFDX0xfQUREUkVTU19MRU5HVEggICAgICAgIDIKKworI2RlZmluZSBOVlNfTUFDX0xfVkFMVUVfSU5ERVggXAorKChOVlNfTUFDX0xfQUREUkVTU19JTkRFWCkgKyAoTlZTX01BQ19MX0FERFJFU1NfTEVOR1RIKSkgLyogMyAqLworCisjZGVmaW5lIE5WU19NQUNfTF9WQUxVRV9MRU5HVEggICAgICAgICAgNAorCisjZGVmaW5lIE5WU19NQUNfU0VDT05ERV9MRU5HVEhfSU5ERVggICAgXAorKChOVlNfTUFDX0xfVkFMVUVfSU5ERVgpICsgNCkgLyogNyAqLworI2RlZmluZSBOVlNfTUFDX1NFQ09OREVfTEVOR0hUX1ZBTFVFICAgIDEKKworI2RlZmluZSBOVlNfTUFDX0hfQUREUkVTU19JTkRFWCAgICAgICAgIFwKKygoTlZTX01BQ19TRUNPTkRFX0xFTkdUSF9JTkRFWCkgKyAxKSAvKiA4Ki8KKyNkZWZpbmUgTlZTX01BQ19IX0FERFJFU1NfTEVOR1RIICAgICAgICAyCisKKyNkZWZpbmUgTlZTX01BQ19IX1ZBTFVFX0lOREVYICAgICAgICAgICBcCisoKE5WU19NQUNfSF9BRERSRVNTX0lOREVYKSArIChOVlNfTUFDX0hfQUREUkVTU19MRU5HVEgpKSAvKiAxMCAqLworI2RlZmluZSBOVlNfTUFDX0hfVkFMVUVfTEVOR1RIICAgICAgICAgIDQKKworI2RlZmluZSBOVlNfRU5EX0JVUlNUX1RSQU5TQUNUSU9OX0lOREVYICAgICAgICAgXAorKChOVlNfTUFDX0hfVkFMVUVfSU5ERVgpICsgKE5WU19NQUNfSF9WQUxVRV9MRU5HVEgpKSAgICAvKiAxNCAqLworI2RlZmluZSBOVlNfRU5EX0JVUlNUX1RSQU5TQUNUSU9OX1ZBTFVFICAgICAgICAgMAorI2RlZmluZSBOVlNfRU5EX0JVUlNUX1RSQU5TQUNUSU9OX0xFTkdUSCAgICAgICAgNworCisjZGVmaW5lIE5WU19BTElOR19UTFZfU1RBUlRfQUREUkVTU19JTkRFWCAgICAgICBcCisoKE5WU19FTkRfQlVSU1RfVFJBTlNBQ1RJT05fSU5ERVgpICsgXAorKE5WU19FTkRfQlVSU1RfVFJBTlNBQ1RJT05fTEVOR1RIKSkgLyogMjEgKi8KKyNkZWZpbmUgTlZTX0FMSU5HX1RMVl9TVEFSVF9BRERSRVNTX1ZBTFVFICAgICAgIDAKKyNkZWZpbmUgTlZTX0FMSU5HX1RMVl9TVEFSVF9BRERSRVNTX0xFTkdUSCAgICAgIDMKKworCisvKiBOVlMgcHJlIFRMViBsZW5ndGggKi8KKyNkZWZpbmUgTlZTX1BSRV9QQVJBTUVURVJTX0xFTkdUSCAgICAgICAgICAgICAgIFwKKygoTlZTX0FMSU5HX1RMVl9TVEFSVF9BRERSRVNTX0lOREVYKSArIFwKKyhOVlNfQUxJTkdfVExWX1NUQVJUX0FERFJFU1NfTEVOR1RIKSkgLyogMjQgKi8KKworLyogTlZTIFAyRyB0YWJsZSAqLworI2RlZmluZSBOVlNfVFhfUDJHX1RBQkxFX0xFTkdUSCAgICAgICAgICAgICAgICAgXAorKChOVU1CRVJfT0ZfU1VCX0JBTkRTX0UpICogMSAvKiBieXRlICovKSAvKiA4ICovCisKKy8qIE5WUyBQUEEgdGFibGUgKi8KKyNkZWZpbmUgTlZTX1RYX1BQQV9TVEVQU19UQUJMRV9MRU5HVEggICBcCisoKE5VTUJFUl9PRl9TVUJfQkFORFNfRSkgKiAoKFRYUFdSX0NGRzBfX1ZHQV9TVEVQX19OVU1CRVJfT0ZfU1RFUFNfRSkgXAorLSAxKSAqIDEgLyogYnl0ZSAqLykgIC8qIDMyICovCisKKy8qIE5WUyB2ZXJzaW9uIDEgVFggUEQgY3VydmUgdGFibGUgbGVuZ3RoICovCisjZGVmaW5lIE5WU19UWF9QRF9UQUJMRV9MRU5HVEhfTlZTX1YxICAgKDEgLyogYnl0ZSB0byBzZXQgc2l6ZSBvZiB0YWJsZSAqLyArIFwKKygoTlVNQkVSX09GX1NVQl9CQU5EU19FKSAqICgyIC8qIDEgYnl0ZSBvZmZzZXQsIDEgYnl0ZSBsb3cgcmFuZ2UgKi8gKyBcCisyIC8qIGZpcnN0IGluZGV4IGluIHRhYmxlICovICsgKCgoU0laRV9PRl9QT1dFUl9ERVRFQ1RPUl9UQUJMRSkgLSAxKSAqIFwKKzEgLyogMSBieXRlICovKSkpKSAvKiAyMzMgKi8KKworLyogTlZTIHZlcnNpb24gMiBUWCBQRCBjdXJ2ZSB0YWJsZSBsZW5ndGggKi8KKyNkZWZpbmUgTlZTX1RYX1BEX1RBQkxFX0xFTkdUSF9OVlNfVjIgICBcCisoKE5VTUJFUl9PRl9TVUJfQkFORFNfRSkgKiAoMTIgLyogMTJpbmRleCBvZiBvbmUgYnl0ZSAtMiBkQm0gLSA5ZEJtICovICtcCisyOCAvKiAxNCBpbmRleGVzIG9mIDIgYnl0ZSAtM2RCbSwgMTBkQm0gLSAyMiBkQm0gKi8pKSAvKiAzMjAgKi8KKworLyogTlZTIHZlcnNpb24gMSBUWCBwYXJhbWV0ZXJzIExlbmd0aCAqLworI2RlZmluZSBOVlNfVFhfUEFSQU1fTEVOR1RIX05WU19WMSAgICAgIFwKKygoTlZTX1RYX1AyR19UQUJMRV9MRU5HVEgpICsgKE5WU19UWF9QUEFfU1RFUFNfVEFCTEVfTEVOR1RIKSArXAorKE5WU19UWF9QRF9UQUJMRV9MRU5HVEhfTlZTX1YxKSkgLyogMjczICovCisKKy8qIE5WUyB2ZXJzaW9uIDIgVFggcGFyYW1ldGVycyBMZW5ndGggKi8KKyNkZWZpbmUgTlZTX1RYX1BBUkFNX0xFTkdUSF9OVlNfVjIgICAgICAgXAorKChOVlNfVFhfUDJHX1RBQkxFX0xFTkdUSCkgKyAoTlZTX1RYX1BQQV9TVEVQU19UQUJMRV9MRU5HVEgpICtcCisoTlZTX1RYX1BEX1RBQkxFX0xFTkdUSF9OVlNfVjIpICtcCisoTlVNQkVSX09GX1JBRElPX0NIQU5ORUxfSU5ERVhTX0UgLyogZm9yIFBlciBDaGFubmVsIHBvd2VyIEdhaW4gT2Zmc2V0IHRhYmwgKi8pKQorCisvKiBOVlMgVFggdmVyc2lvbiAqLworLyogI2RlZmluZSBOVlNfVFhfUEFSQU1fTEVOR1RIICAgICBOVlNfVFhfUEFSQU1fTEVOR1RIX05WU19WMiAqLworI2RlZmluZSBOVlNfVFhfUEFSQU1fTEVOR1RIICAgICAweDE5OQorCisvKiBOVlMgUlggdmVyc2lvbiAqLworI2RlZmluZSBOVlNfUlhfUEFSQU1fTEVOR1RIICAgIE5VTUJFUl9PRl9SWF9CSVBfRUZVU0VfUEFSQU1FVEVSU19FIC8qIDE5ICovCisKKy8qIE5WUyB2ZXJzaW9uIHBhcmFtZXRlciBsZW5ndGggKi8KKyNkZWZpbmUgTlZTX1ZFUlNJT05fUEFSQU1FVEVSX0xFTkdUSCAgICAzCisKKy8qIE5WUyBtYXggbGVuZ3RoICovCisvKiBvcmlnaW5hbCAoKE5WU19UT1RBTF9MRU5HVEgpICsgNCAtICgoTlZTX1RPVEFMX0xFTkdUSCkgJSA0KSkgKi8KKyNkZWZpbmUgTlZTX1RPVEFMX0xFTkdUSCAgICA1MDAKKworLyogVExWIG1heCBsZW5ndGggKi8KKyNkZWZpbmUgIE1BWF9UTFZfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlZTX1RPVEFMX0xFTkdUSAorCisjZGVmaW5lICBNQVhfTlZTX1ZFUlNJT05fTEVOR1RIICAgICAgICAgICAgICAgICAxMgorCitlbnVtIHdsMTI3MV90bV9jb21tYW5kcyB7CisgICAgV0wxMjcxX1RNX0NNRF9VTlNQRUMsCisgICAgV0wxMjcxX1RNX0NNRF9URVNULAorICAgIFdMMTI3MV9UTV9DTURfSU5URVJST0dBVEUsCisgICAgV0wxMjcxX1RNX0NNRF9DT05GSUdVUkUsCisgICAgV0wxMjcxX1RNX0NNRF9OVlNfUFVTSCwKKyAgICBXTDEyNzFfVE1fQ01EX1NFVF9QTFRfTU9ERSwKKyAgICBfX1dMMTI3MV9UTV9DTURfQUZURVJfTEFTVAorfTsKKworZW51bSB3bDEyNzFfdG1fYXR0cnMgeworICAgIFdMMTI3MV9UTV9BVFRSX1VOU1BFQywKKyAgICBXTDEyNzFfVE1fQVRUUl9DTURfSUQsCisgICAgV0wxMjcxX1RNX0FUVFJfQU5TV0VSLAorICAgIFdMMTI3MV9UTV9BVFRSX0RBVEEsCisgICAgV0wxMjcxX1RNX0FUVFJfSUVfSUQsCisgICAgV0wxMjcxX1RNX0FUVFJfUExUX01PREUsCisgICAgX19XTDEyNzFfVE1fQVRUUl9BRlRFUl9MQVNUCit9OworCisjZGVmaW5lIFdMMTI3MV9UTV9BVFRSX01BWCAoX19XTDEyNzFfVE1fQVRUUl9BRlRFUl9MQVNUIC0gMSkKKworZW51bSB3bDEyNzFfdGVzdF9jbWRzIHsKKyAgICBURVNUX0NNRF9QRF9CVUZGRVJfQ0FMID0gMHgxLCAvKiBUWCBQTFQgKi8KKyAgICBURVNUX0NNRF9QMkdfQ0FMLCAgICAgICAgICAgICAvKiBUWCBCaVAgKi8KKyAgICBURVNUX0NNRF9SWF9QTFRfRU5URVIsCisgICAgVEVTVF9DTURfUlhfUExUX0NBTCwgICAgICAgICAgLyogUlNTSSBDYWwgKi8KKyAgICBURVNUX0NNRF9SWF9QTFRfRVhJVCwKKyAgICBURVNUX0NNRF9SWF9QTFRfR0VULAorICAgIFRFU1RfQ01EX0ZDQywgICAgICAgICAgICAgICAgIC8qIENvbnRpbnVvdXMgVFggKi8KKyAgICBURVNUX0NNRF9URUxFQywgIC8qIENhcnJpZXIgd2F2ZSBpbiBhIHNwZWNpZmljIGNoYW5uZWwgYW5kIGJhbmQgKi8KKyAgICBURVNUX0NNRF9TVE9QX1RYLCAgICAgICAgICAgICAvKiBTdG9wIEZDQyBvciBURUxFQyAqLworICAgIFRFU1RfQ01EX1BMVF9URU1QTEFURSwgICAgICAgIC8qIGRlZmluZSBUZW1wbGF0ZSBmb3IgVFggKi8KKyAgICBURVNUX0NNRF9QTFRfR0FJTl9BREpVU1QsCisgICAgVEVTVF9DTURfUExUX0dBSU5fR0VULAorICAgIFRFU1RfQ01EX0NIQU5ORUxfVFVORSwKKyAgICBURVNUX0NNRF9GUkVFX1JVTl9SU1NJLCAgICAgICAgLyogRnJlZSBydW5uaW5nIFJTU0kgbWVhc3VyZW1lbnQgKi8KKyAgICBURVNUX0NNRF9ERUJVRywgICAgIC8qIHRlc3QgY29tbWFuZCBmb3IgZGVidWcgdXNpbmcgdGhlIHN0cnVjdDogKi8KKyAgICBURVNUX0NNRF9DTFBDX0NPTU1BTkRTLAorICAgIFJFU0VSVkVEXzQsCisgICAgVEVTVF9DTURfUlhfU1RBVF9TVE9QLAorICAgIFRFU1RfQ01EX1JYX1NUQVRfU1RBUlQsCisgICAgVEVTVF9DTURfUlhfU1RBVF9SRVNFVCwKKyAgICBURVNUX0NNRF9SWF9TVEFUX0dFVCwKKyAgICBURVNUX0NNRF9MT09QQkFDS19TVEFSVCwgICAgICAgLyogZm9yIEZXIFRlc3QgRGVidWcgKi8KKyAgICBURVNUX0NNRF9MT09QQkFDS19TVE9QLCAgICAgICAgLyogZm9yIEZXIFRlc3QgRGVidWcgKi8KKyAgICBURVNUX0NNRF9HRVRfRldfVkVSU0lPTlMsCisgICAgVEVTVF9DTURfSU5JX0ZJTEVfUkFESU9fUEFSQU0sCisgICAgVEVTVF9DTURfUlVOX0NBTElCUkFUSU9OX1RZUEUsCisgICAgVEVTVF9DTURfVFhfR0FJTl9BREpVU1QsCisgICAgVEVTVF9DTURfVVBEQVRFX1BEX0JVRkZFUl9FUlJPUlMsCisgICAgVEVTVF9DTURfVVBEQVRFX1BEX1JFRkVSRU5DRV9QT0lOVCwKKyAgICBURVNUX0NNRF9JTklfRklMRV9HRU5FUkFMX1BBUkFNLAorICAgIFRFU1RfQ01EX1NFVF9FRlVTRSwKKyAgICBURVNUX0NNRF9HRVRfRUZVU0UsCisgICAgVEVTVF9DTURfVEVTVF9UT05FLAorICAgIFRFU1RfQ01EX1BPV0VSX01PREUsCisgICAgVEVTVF9DTURfU01BUlRfUkVGTEVYLAorICAgIFRFU1RfQ01EX0NIQU5ORUxfUkVTUE9OU0UsCisgICAgVEVTVF9DTURfRENPX0lUUklNX0ZFQVRVUkUsCisgICAgTUFYX1RFU1RfQ01EX0lEID0gMHhGRgorfTsKKworc3RydWN0IHdsMTI3MV9jbWRfaGVhZGVyIHsKKyAgICBfX3UxNiBpZDsKKyAgICBfX3UxNiBzdGF0dXM7CisgICAgLyogcGF5bG9hZCAqLworICAgIHVuc2lnbmVkIGNoYXIgZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB3bDEyNzFfY21kX3Rlc3RfaGVhZGVyIHsKKyAgICB1bnNpZ25lZCBjaGFyIGlkOworICAgIHVuc2lnbmVkIGNoYXIgcGFkZGluZ1szXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB3bDEyNzFfY21kX2NhbF9jaGFubmVsX3R1bmUgeworICAgIHN0cnVjdCB3bDEyNzFfY21kX2hlYWRlciBoZWFkZXI7CisKKyAgICBzdHJ1Y3Qgd2wxMjcxX2NtZF90ZXN0X2hlYWRlciB0ZXN0OworCisgICAgdW5zaWduZWQgY2hhciBiYW5kOworICAgIHVuc2lnbmVkIGNoYXIgY2hhbm5lbDsKKworICAgIF9fbGUxNiByYWRpb19zdGF0dXM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgd2wxMjcxX2NtZF9jYWxfdXBkYXRlX3JlZl9wb2ludCB7CisgICAgc3RydWN0IHdsMTI3MV9jbWRfaGVhZGVyIGhlYWRlcjsKKworICAgIHN0cnVjdCB3bDEyNzFfY21kX3Rlc3RfaGVhZGVyIHRlc3Q7CisKKyAgICBfX2xlMzIgcmVmX3Bvd2VyOworICAgIF9fbGUzMiByZWZfZGV0ZWN0b3I7CisgICAgdW5zaWduZWQgY2hhciAgc3ViX2JhbmQ7CisgICAgdW5zaWduZWQgY2hhciAgcGFkZGluZ1szXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB3bDEyNzFfY21kX2NhbF90eF90b25lIHsKKyAgICBzdHJ1Y3Qgd2wxMjcxX2NtZF9oZWFkZXIgaGVhZGVyOworCisgICAgc3RydWN0IHdsMTI3MV9jbWRfdGVzdF9oZWFkZXIgdGVzdDsKKworICAgIF9fbGUzMiBwb3dlcjsKKyAgICBfX2xlMzIgdG9uZV90eXBlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHdsMTI3MV9jbWRfY2FsX3AyZyB7CisgICAgc3RydWN0IHdsMTI3MV9jbWRfaGVhZGVyIGhlYWRlcjsKKworICAgIHN0cnVjdCB3bDEyNzFfY21kX3Rlc3RfaGVhZGVyIHRlc3Q7CisKKyAgICBfX2xlMzIgdmVyOworICAgIF9fbGUxNiBsZW47CisgICAgdW5zaWduZWQgY2hhciAgYnVmW01BWF9UTFZfTEVOR1RIXTsKKyAgICB1bnNpZ25lZCBjaGFyICB0eXBlOworICAgIHVuc2lnbmVkIGNoYXIgIHBhZGRpbmc7CisKKyAgICBfX2xlMTYgcmFkaW9fc3RhdHVzOworCisgICAgdW5zaWduZWQgY2hhciAgc3ViX2JhbmRfbWFzazsKKyAgICB1bnNpZ25lZCBjaGFyICBwYWRkaW5nMjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgTUFDX0FERFJfTEVOICA2CisKK3N0cnVjdCB3bDEyNzFfY21kX3BrdF9wYXJhbXMgeworICAgIHN0cnVjdCB3bDEyNzFfY21kX2hlYWRlciBoZWFkZXI7CisKKyAgICBzdHJ1Y3Qgd2wxMjcxX2NtZF90ZXN0X2hlYWRlciB0ZXN0OworCisgICAgX19sZTE2IHJhZGlvX3N0YXR1czsKKyAgICB1bnNpZ25lZCBjaGFyIHBhZGRpbmdbMl07CisgICAgX19sZTMyIGRlbGF5OworICAgIF9fbGUzMiByYXRlOworICAgIF9fbGUxNiBzaXplOworICAgIF9fbGUxNiBhbW91bnQ7CisgICAgX19sZTMyIHBvd2VyOworICAgIF9fbGUxNiBzZWVkOworICAgIHVuc2lnbmVkIGNoYXIgcGt0X21vZGU7CisgICAgdW5zaWduZWQgY2hhciBkY2ZfZW5hYmxlOworICAgIHVuc2lnbmVkIGNoYXIgZ19pbnRlcnZhbDsKKyAgICB1bnNpZ25lZCBjaGFyIHByZWFtYmxlOworICAgIHVuc2lnbmVkIGNoYXIgdHlwZTsKKyAgICB1bnNpZ25lZCBjaGFyIHNjcmFtYmxlOworICAgIHVuc2lnbmVkIGNoYXIgY2xwY19lbmFibGU7CisgICAgdW5zaWduZWQgY2hhciBzZXFfbmJyX21vZGU7CisgICAgdW5zaWduZWQgY2hhciBzcmNfbWFjW01BQ19BRERSX0xFTl07CisgICAgdW5zaWduZWQgY2hhciBkc3RfbWFjW01BQ19BRERSX0xFTl07CisgICAgdW5zaWduZWQgY2hhciBwYWRkaW5nMVsyXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB3bDEyNzFfcnhfcGF0aF9zdGF0Y3MgeworICAgIF9fbGUzMiBuYnJfcnhfdmFsaWRfcGt0czsKKyAgICBfX2xlMzIgbmJyX3J4X2Zjc19lcnJfcGt0czsKKyAgICBfX2xlMzIgbmJyX3J4X3BsY3BfZXJyX3BrdHM7CisgICAgX19sZTMyIHNlcV9uYnJfbWlzc19jbnQ7IC8qIEZvciBQRVIgY2FsY3VsYXRpb24gKi8KKyAgICBfX2xlMTYgYXZlX3NucjsgLyogYXZlcmFnZSBTTlIgKi8KKyAgICBfX2xlMTYgYXZlX3Jzc2k7IC8qIGF2ZXJhZ2UgUlNTSSAqLworICAgIF9fbGUxNiBhdmVfZXZtOworICAgIHVuc2lnbmVkIGNoYXIgcGFkZGluZ1syXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB3bDEyNzFfcnhfcGt0X3N0YXRjcyB7CisgICAgX19sZTMyIGxlbmd0aDsKKyAgICBfX2xlMzIgZXZtOworICAgIF9fbGUzMiByc3NpOworICAgIF9fbGUxNiBmcmVxX2RlbHRhOworICAgIF9fbGUxNiBmbGFnczsKKyAgICBjaGFyIHR5cGU7CisgICAgdW5zaWduZWQgY2hhciByYXRlOworICAgIHVuc2lnbmVkIGNoYXIgbm9pc2U7CisgICAgdW5zaWduZWQgY2hhciBhZ2NfZ2FpbjsKKyAgICB1bnNpZ25lZCBjaGFyIHBhZGRpbmdbMl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIFJYX1NUQVRfUEFDS0VUU19QRVJfTUVTU0FHRSAgICAgICAgKDIwKQorCitzdHJ1Y3Qgd2wxMjcxX3JhZGlvX3J4X3N0YXRjcyB7CisgICAgc3RydWN0IHdsMTI3MV9jbWRfaGVhZGVyIGhlYWRlcjsKKworICAgIHN0cnVjdCB3bDEyNzFfY21kX3Rlc3RfaGVhZGVyIHRlc3Q7CisKKyAgICBzdHJ1Y3Qgd2wxMjcxX3J4X3BhdGhfc3RhdGNzIHJ4X3BhdGhfc3RhdGNzOworICAgIF9fbGUzMiBiYXNlX3BrdF9pZDsKKyAgICBfX2xlMzIgbmJyX3BrdHM7IC8qIGlucHV0L291dHB1dDogbnVtYmVyIG9mIGZvbGxvd2luZyBwYWNrZXRzICovCisgICAgX19sZTMyIG5icl9taXNzX3BrdHM7CisgICAgX19sZTE2IHJhZGlvX3N0YXR1czsKKyAgICB1bnNpZ25lZCBjaGFyIHBhZGRpbmdbMl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitlbnVtIHdsMTI3MV9udnNfdHlwZSB7CisgICAgZU5WU19WRVJTSU9OID0gMHhhYSwKKyAgICBlTlZTX1JBRElPX1RYX1BBUkFNRVRFUlMgPSAxLAorICAgIGVOVlNfUkFESU9fUlhfUEFSQU1FVEVSUyA9IDIsCisgICAgZU5WU19SQURJT19JTkkgPSAxNiwKKyAgICBlTlZTX05PTl9GSUxFID0gMHhGRSwKKyAgICBlVExWX0xBU1QgPSAweEZGIC8qIGxhc3QgVExWIHR5cGUgKi8KK307CisKKyNkZWZpbmUgREVGQVVMVF9FRlVTRV9WQUxVRSAgICAgICAgICAgICgwKQorCitlbnVtIHdsMTI3MV9udnNfdHlwZV9pbmZvIHsKKyAgICBlRklSU1RfUkFESU9fVFlQRV9QQVJBTUVURVJTX0lORk8sCisgICAgZU5WU19SQURJT19UWF9UWVBFX1BBUkFNRVRFUlNfSU5GTyA9IGVGSVJTVF9SQURJT19UWVBFX1BBUkFNRVRFUlNfSU5GTywKKyAgICBlTlZTX1JBRElPX1JYX1RZUEVfUEFSQU1FVEVSU19JTkZPLAorICAgIGVMQVNUX1JBRElPX1RZUEVfUEFSQU1FVEVSU19JTkZPID0gZU5WU19SQURJT19SWF9UWVBFX1BBUkFNRVRFUlNfSU5GTywKKyAgICBVTlVTRURfUkFESU9fVFlQRV9QQVJBTUVURVJTX0lORk8sCisgICAgZU5VTUJFUl9SQURJT19UWVBFX1BBUkFNRVRFUlNfSU5GTyA9IFVOVVNFRF9SQURJT19UWVBFX1BBUkFNRVRFUlNfSU5GTywKKyAgICBMQVNUX1JBRElPX1RZUEVfUEFSQU1FVEVSU19JTkZPID0KKyAgICAgICAgKGVOVU1CRVJfUkFESU9fVFlQRV9QQVJBTUVURVJTX0lORk8gLSAxKQorfTsKKworZW51bSBFRlVTRV9QQVJBTUVURVJfVFlQRV9FTk1UIHsKKyAgICBFRlVTRV9GSVJTVF9QQVJBTUVURVJfRSwKKyAgICAvKiBSWCBQQVJBTUVURVJTICovCisgICAgRUZVU0VfRklSU1RfUlhfUEFSQU1FVEVSX0UgPSBFRlVTRV9GSVJTVF9QQVJBTUVURVJfRSwKKyAgICBSWF9CSVBfTUFYX0dBSU5fRVJST1JfQkFORF9CX0UgPSBFRlVTRV9GSVJTVF9SWF9QQVJBTUVURVJfRSwKKworICAgIFJYX0JJUF9NQVhfR0FJTl9FUlJPUl9KX0xPV19NSURfRSwKKyAgICBSWF9CSVBfTUFYX0dBSU5fRVJST1JfSl9ISUdIX0UsCisKKyAgICBSWF9CSVBfTUFYX0dBSU5fRVJST1JfNUdfMVNUX0UsCisgICAgUlhfQklQX01BWF9HQUlOX0VSUk9SXzVHXzJORF9FLAorICAgIFJYX0JJUF9NQVhfR0FJTl9FUlJPUl81R18zUkRfRSwKKyAgICBSWF9CSVBfTUFYX0dBSU5fRVJST1JfNUdfNFRIX0UsCisKKyAgICBSWF9CSVBfTE5BX1NURVBfQ09SUl9CQU5EX0JfNFRPM19FLAorICAgIFJYX0JJUF9MTkFfU1RFUF9DT1JSX0JBTkRfQl8zVE8yX0UsCisgICAgUlhfQklQX0xOQV9TVEVQX0NPUlJfQkFORF9CXzJUTzFfRSwKKyAgICBSWF9CSVBfTE5BX1NURVBfQ09SUl9CQU5EX0JfMVRPMF9FLAorCisgICAgUlhfQklQX0xOQV9TVEVQX0NPUlJfQkFORF9BXzRUTzNfRSwKKyAgICBSWF9CSVBfTE5BX1NURVBfQ09SUl9CQU5EX0FfM1RPMl9FLAorICAgIFJYX0JJUF9MTkFfU1RFUF9DT1JSX0JBTkRfQV8yVE8xX0UsCisgICAgUlhfQklQX0xOQV9TVEVQX0NPUlJfQkFORF9BXzFUTzBfRSwKKworICAgIFJYX0JJUF9UQV9TVEVQX0NPUlJfQkFORF9CXzJUTzFfRSwKKyAgICBSWF9CSVBfVEFfU1RFUF9DT1JSX0JBTkRfQl8xVE8wX0UsCisgICAgUlhfQklQX1RBX1NURVBfQ09SUl9CQU5EX0FfMlRPMV9FLAorICAgIFJYX0JJUF9UQV9TVEVQX0NPUlJfQkFORF9BXzFUTzBfRSwKKyAgICBOVU1CRVJfT0ZfUlhfQklQX0VGVVNFX1BBUkFNRVRFUlNfRSwKKworICAgIC8qIFRYIFBBUkFNRVRFUlMgKi8KKyAgICBUWF9CSVBfUERfQlVGRkVSX0dBSU5fRVJST1JfRSA9IE5VTUJFUl9PRl9SWF9CSVBfRUZVU0VfUEFSQU1FVEVSU19FLAorICAgIFRYX0JJUF9QRF9CVUZGRVJfVkJJQVNfRVJST1JfRSwKKyAgICBFRlVTRV9OVU1CRVJfT0ZfUEFSQU1FVEVSU19FLAorICAgIEVGVVNFX0xBU1RfUEFSQU1FVEVSX0UgPSAoRUZVU0VfTlVNQkVSX09GX1BBUkFNRVRFUlNfRSAtIDEpCit9IEVGVVNFX1BBUkFNRVRFUl9UWVBFX0VOTTsKKworaW50IGdldF9tYWNfYWRkcihpbnQgaWZjX251bSwgdW5zaWduZWQgY2hhciAqbWFjX2FkZHIpOworCitpbnQgZmlsZV9leGlzdChjb25zdCBjaGFyICpmaWxlbmFtZSk7CisKKyNlbmRpZiAvKiBfX1BMVF9IICovCmRpZmYgLS1naXQgYS9tYWM4MDIxMS90aS11dGlscy9zY3JpcHRzL2dvLnNoIGIvbWFjODAyMTEvdGktdXRpbHMvc2NyaXB0cy9nby5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NWRhNjdlCi0tLSAvZGV2L251bGwKKysrIGIvbWFjODAyMTEvdGktdXRpbHMvc2NyaXB0cy9nby5zaApAQCAtMCwwICsxLDUyOSBAQAorIyEvYmluL3NoCisKKyMgQm9vdGxldmVscworIyAgIDEgLSBzdGFydCBvbmx5IGluZXRkICAgICAgICAgICAgMDAwMCAwMDAxCisjICAgMiAtIGxvYWQgbWF2ODAyMTEgICAgICAgICAgICAgICAgMDAwMCAwMDEwCisjICAgNCAtIGxvYWQgZHJpdmVyICAgICAgICAgICAgICAgIDAwMDAgMDEwMAorIyAgIDggLSB1cCBkZXYsIGxvYWQgd3BhX3N1cHBsaWNhbnQgICAgICAgIDAwMDAgMTAwMAorIyAgMTYgLSBTZXR0aW5ncyBmb3IgQW5kcm9pZCAgICAgICAgICAgICAgICAwMDAxIDAwMDAKKyMgIDMyIC0gcnVubmluZyBBUCAgICAgICAgICAgICAgICAwMDEwIDAwMDAKKyMgIDY0IC0gMS1jb21tYW5kIGNhbGlicmF0aW9uICAgICAgICAgICAgMDEwMCAwMDAwCisKK2dvX3ZlcnNpb249IjAuOTEiCit1c2FnZSgpCit7CisgICAgZWNobyAtZSAiXHRVU0FHRTpcblx0ICAgIGBiYXNlbmFtZSAkMGAgPG9wdGlvbj4gW3ZhbHVlXSIKKyAgICBlY2hvIC1lICJcdFx0LWIgPHZhbHVlPiAtIGJvb3RsZXZlbCwgd2hlcmVcblx0XHRcdDctUExUIGJvb3QiCisgICAgZWNobyAtZSAiXHRcdFx0MTUtZnVsbCBib290IgorICAgIGVjaG8gLWUgIlx0XHQtYyA8cGF0aCB0byBJTkkgZmlsZT4gW3BhdGggdG8gaW5zdGFsbCBOVlNdIC0iIFwKKyJydW4gY2FsaWJyYXRpb24iCisgICAgZWNobyAtZSAiXHRcdC1jMiA8cGF0aCB0byBJTkkgZmlsZT4gPHBhdGggdG8gSU5JIGZpbGU+IC0iIFwKKyJydW4gY2FsaWJyYXRpb24gd2l0aCAyIEZFTXMiCisgICAgZWNobyAtZSAiXHRcdFx0d2hlcmUgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGluc3RhbGwgcGF0aCBpcyAiCisgICAgZWNobyAtZSAiXHRcdFx0L2xpYi9maXJtd2FyZS90aS1jb25uZWN0aXZpdHkvd2wxMjcxLW52cy5iaW4iCisgICAgZWNobyAtZSAiXHRcdC1kIDx2YWx1ZT4gLSBkZWJ1Z2xldmVsLCB3aGVyZSIKKyAgICBlY2hvIC1lICJcdFx0XHQgIC0xICAgICAgLSBzaG93cyBjdXJyZW50IHZhbHVlCitcdFx0XHRERUJVR19JUlEgICAgICAgPSBCSVQoMCkKK1x0XHRcdERFQlVHX1NQSSAgICAgICA9IEJJVCgxKQorXHRcdFx0REVCVUdfQk9PVCAgICAgID0gQklUKDIpCitcdFx0XHRERUJVR19NQUlMQk9YICAgPSBCSVQoMykKK1x0XHRcdERFQlVHX1RFU1RNT0RFICA9IEJJVCg0KQorXHRcdFx0REVCVUdfRVZFTlQgICAgID0gQklUKDUpCitcdFx0XHRERUJVR19UWCAgICAgICAgPSBCSVQoNikKK1x0XHRcdERFQlVHX1JYICAgICAgICA9IEJJVCg3KQorXHRcdFx0REVCVUdfU0NBTiAgICAgID0gQklUKDgpCitcdFx0XHRERUJVR19DUllQVCAgICAgPSBCSVQoOSkKK1x0XHRcdERFQlVHX1BTTSAgICAgICA9IEJJVCgxMCkKK1x0XHRcdERFQlVHX01BQzgwMjExICA9IEJJVCgxMSkKK1x0XHRcdERFQlVHX0NNRCAgICAgICA9IEJJVCgxMikKK1x0XHRcdERFQlVHX0FDWCAgICAgICA9IEJJVCgxMykKK1x0XHRcdERFQlVHX1NESU8gICAgICA9IEJJVCgxNCkKK1x0XHRcdERFQlVHX0ZJTFRFUlMgICA9IEJJVCgxNSkKK1x0XHRcdERFQlVHX0FESE9DICAgICA9IEJJVCgxNikKK1x0XHRcdERFQlVHX0FMTCAgICAgICA9IH4wIgorICAgIGVjaG8gLWUgIlx0XHQtbSA8dmFsdWU+IC0gc2V0IE1BQyBhZGRyZXNzIgorICAgIGVjaG8gLWUgIlx0XHQtaXAgW3ZhbHVlXSAtIHNldCBJUCBhZGRyZXNzIgorICAgIGVjaG8gLWUgIlx0XHQtdiAtIGdldCBzY3JpcHQgdmVyc2lvbiIKKyAgICBlY2hvIC1lICJcdFx0LWggLSBnZXQgdGhpcyBoZWxwIgorfQorCitpPTAKK25icl9hcmdzPSQjCitib290bGV2ZWw9MAorZGJnX2x2bD0wCityZWZfY2xrPTAKK21hY19hZGRyPSIwODowMDoyODo5MDo2NDozMSIKK2lwX2FkZHI9IjE5Mi4xNjguMS4xIgorc2V0X2lwX2FkZHI9MAoraGF2ZV9wYXRoX3RvX2luaT0wCitwYXRoX3RvX2luaT0iIgorcGF0aF90b19pbmkyPSIiCitoYXZlX3BhdGhfdG9faW5zdGFsbD0wCitwYXRoX3RvX2luc3RhbGw9Ii9saWIvZmlybXdhcmUvdGktY29ubmVjdGl2aXR5L3dsMTI3MS1udnMuYmluIgoraXNfYW5kcm9pZD0wCitwcmVmaXhfcGF0aDJtb2R1bGVzPQord2hpbGUgWyAiJGkiIC1sdCAiJG5icl9hcmdzIiBdCitkbworICAgIGNhc2UgJDEgaW4KKyAgICAgICAgLWIpIGJvb3RsZXZlbD0kMgorICAgICAgICBuYnJfYXJncz1gZXhwciAkbmJyX2FyZ3MgLSAxYAorICAgICAgICBzaGlmdAorICAgICAgICA7OworICAgICAgICAjLXIpIHJlZl9jbGs9JDIKKyAgICAgICAgI25icl9hcmdzPWBleHByICRuYnJfYXJncyAtIDFgCisgICAgICAgICNzaGlmdAorICAgICAgICAjOzsKKyAgICAgICAgLWMpCisgICAgICAgICAgICBpZiBbICIkbmJyX2FyZ3MiIC1sdCAiMiIgXTsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gLWUgIm1pc3NpbmcgYXJndW1lbnRzIgorICAgICAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgYm9vdGxldmVsPTY2CisgICAgICAgICAgICBoYXZlX3BhdGhfdG9faW5pPWBleHByICRoYXZlX3BhdGhfdG9faW5pICsgMWAKKyAgICAgICAgICAgIHBhdGhfdG9faW5pPSQyCisgICAgICAgICAgICBpZiBbICIkbmJyX2FyZ3MiIC1lcSAiMiIgXTsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gLWUgIiAgICBUaGUgaW5zdGFsbCBwYXRoIG5vdCBwcm92aWRlZCIKKyAgICAgICAgICAgICAgICBlY2hvIC1lICIgICAgVXNlIGRlZmF1bHQgKCRwYXRoX3RvX2luc3RhbGwpIgorICAgICAgICAgICAgICAgIG5icl9hcmdzPWBleHByICRuYnJfYXJncyAtIDFgCisgICAgICAgICAgICAgICAgc2hpZnQKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaGF2ZV9wYXRoX3RvX2luc3RhbGw9YGV4cHIgJGhhdmVfcGF0aF90b19pbnN0YWxsICsgMWAKKyAgICAgICAgICAgIHBhdGhfdG9faW5zdGFsbD0kMworICAgICAgICAgICAgbmJyX2FyZ3M9YGV4cHIgJG5icl9hcmdzIC0gMmAKKyAgICAgICAgICAgIHNoaWZ0CisgICAgICAgICAgICBzaGlmdAorICAgICAgICA7OworICAgICAgICAtYzIpICAgICMgY2FsaWJyYXRpb24gd2l0aCAyIEZFTXMKKyAgICAgICAgICAgIGlmIFsgIiRuYnJfYXJncyIgLWx0ICIzIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyAtZSAibWlzc2luZyBhcmd1bWVudHMiCisgICAgICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBib290bGV2ZWw9MzQKKyAgICAgICAgICAgIGhhdmVfcGF0aF90b19pbmk9YGV4cHIgJGhhdmVfcGF0aF90b19pbmkgKyAxYAorICAgICAgICAgICAgcGF0aF90b19pbmk9JDIKKyAgICAgICAgICAgIHBhdGhfdG9faW5pMj0kMworICAgICAgICAgICAgbmJyX2FyZ3M9YGV4cHIgJG5icl9hcmdzIC0gMmAKKyAgICAgICAgICAgIHNoaWZ0CisgICAgICAgICAgICBzaGlmdAorICAgICAgICA7OworICAgICAgICAtZCkgZGJnX2x2bD0kMgorICAgICAgICBuYnJfYXJncz1gZXhwciAkbmJyX2FyZ3MgLSAxYAorICAgICAgICBzaGlmdAorICAgICAgICA7OworICAgICAgICAtbSkgbWFjX2FkZHI9JDIKKyAgICAgICAgbmJyX2FyZ3M9YGV4cHIgJG5icl9hcmdzIC0gMWAKKyAgICAgICAgc2hpZnQKKyAgICAgICAgOzsKKyAgICAgICAgLWlwKSBzZXRfaXBfYWRkcj1gZXhwciAkc2V0X2lwX2FkZHIgKyAxYAorICAgICAgICAgICAgY2FzZSAkMiBpbgorICAgICAgICAgICAgICAgICIiKSBlY2hvIC1lICJ1c2luZyBkZWZhdWx0IGlwIGFkZHJlc3MiCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAtKikgZWNobyAtZSAidGhpcyBpcyBhbm90aGVyIG9wdGlvbiIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICopIGlwX2FkZHI9JDIKKyAgICAgICAgICAgICAgICBuYnJfYXJncz1gZXhwciAkbmJyX2FyZ3MgLSAxYAorICAgICAgICAgICAgICAgIHNoaWZ0CisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKyAgICAgICAgLWluaSkKKyAgICAgICAgICAgIGhhdmVfcGF0aF90b19pbmk9YGV4cHIgJGhhdmVfcGF0aF90b19pbmkgKyAxYAorICAgICAgICAgICAgcGF0aF90b19pbmk9JDIKKyAgICAgICAgICAgIG5icl9hcmdzPWBleHByICRuYnJfYXJncyAtIDFgCisgICAgICAgICAgICBzaGlmdAorICAgICAgICA7OworICAgICAgICAtdikKKyAgICAgICAgZWNobyAtZSAiXHRnby5zaCB2ZXJzaW9uICRnb192ZXJzaW9uIgorICAgICAgICA7OworICAgICAgICAtaCkgdXNhZ2UKKyAgICAgICAgZXhpdCAwCisgICAgICAgIDs7CisgICAgICAgICopIGVjaG8gLWUgIlx0Tm90aGluZyB0byBkbyIKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgaT1gZXhwciAkaSArIDFgCisgICAgc2hpZnQKK2RvbmUKKworc3RhZ2VfdW5vPTAKK3N0YWdlX2R1ZT0wCitzdGFnZV9xdWF0dHJvPTAKK3N0YWdlX290dG89MAorc3RhZ2Vfc2VkaWNpPTAKK3N0YWdlX3RyZW50YWR1ZT0wCitzdGFnZV9zZXNzYW50YV9xdWF0dHJvPTAKK2Nhc2UgJGJvb3RsZXZlbCBpbgorICAgIDEpIHN0YWdlX3Vubz1gZXhwciAkc3RhZ2VfdW5vICsgMWAKKyAgICA7OworICAgIDIpIHN0YWdlX2R1ZT1gZXhwciAkc3RhZ2VfZHVlICsgMWAKKyAgICA7OworICAgIDMpIHN0YWdlX3Vubz1gZXhwciAkc3RhZ2VfdW5vICsgMWAKKyAgICAgICBzdGFnZV9kdWU9YGV4cHIgJHN0YWdlX2R1ZSArIDFgCisgICAgOzsKKyAgICA0KSBzdGFnZV9xdWF0dHJvPWBleHByICRzdGFnZV9xdWF0dHJvICsgMWAKKyAgICA7OworICAgIDUpIHN0YWdlX3Vubz1gZXhwciAkc3RhZ2VfdW5vICsgMWAKKyAgICAgICBzdGFnZV9xdWF0dHJvPWBleHByICRzdGFnZV9xdWF0dHJvICsgMWAKKyAgICA7OworICAgIDYpIHN0YWdlX2R1ZT1gZXhwciAkc3RhZ2VfZHVlICsgMWAKKyAgICAgICBzdGFnZV9xdWF0dHJvPWBleHByICRzdGFnZV9xdWF0dHJvICsgMWAKKyAgICA7OworICAgIDcpIHN0YWdlX3Vubz1gZXhwciAkc3RhZ2VfdW5vICsgMWAKKyAgICAgICBzdGFnZV9kdWU9YGV4cHIgJHN0YWdlX2R1ZSArIDFgCisgICAgICAgc3RhZ2VfcXVhdHRybz1gZXhwciAkc3RhZ2VfcXVhdHRybyArIDFgCisgICAgOzsKKyAgICA4KSBzdGFnZV9vdHRvPWBleHByICRzdGFnZV9vdHRvICsgMWAKKyAgICA7OworICAgIDEyKSBzdGFnZV9xdWF0dHJvPWBleHByICRzdGFnZV9xdWF0dHJvICsgMWAKKyAgICAgICAgICAgIHN0YWdlX290dG89YGV4cHIgJHN0YWdlX290dG8gKyAxYAorICAgIDs7CisgICAgMTUpIHN0YWdlX3Vubz1gZXhwciAkc3RhZ2VfdW5vICsgMWAKKyAgICAgICAgc3RhZ2VfZHVlPWBleHByICRzdGFnZV9kdWUgKyAxYAorICAgICAgICBzdGFnZV9xdWF0dHJvPWBleHByICRzdGFnZV9xdWF0dHJvICsgMWAKKyAgICAgICAgc3RhZ2Vfb3R0bz1gZXhwciAkc3RhZ2Vfb3R0byArIDFgCisgICAgOzsKKyAgICAxNikgc3RhZ2Vfc2VkaWNpPWBleHByICRzdGFnZV9zZWRpY2kgKyAxYAorICAgIDs7CisgICAgMzIpIHN0YWdlX3RyZW50YWR1ZT1gZXhwciAkc3RhZ2VfdHJlbnRhZHVlICsgMWAKKyAgICA7OworICAgIDM0KQorICAgICAgICBzdGFnZV9kdWU9YGV4cHIgJHN0YWdlX2R1ZSArIDFgCisgICAgICAgIHN0YWdlX3RyZW50YWR1ZT1gZXhwciAkc3RhZ2VfdHJlbnRhZHVlICsgMWAKKyAgICA7OworICAgIDY0KSBzdGFnZV9zZXNzYW50YV9xdWF0dHJvPWBleHByICRzdGFnZV9zZXNzYW50YV9xdWF0dHJvICsgMWAKKyAgICA7OworICAgIDY2KQorICAgICAgICBzdGFnZV9kdWU9YGV4cHIgJHN0YWdlX2R1ZSArIDFgCisgICAgICAgIHN0YWdlX3Nlc3NhbnRhX3F1YXR0cm89YGV4cHIgJHN0YWdlX3Nlc3NhbnRhX3F1YXR0cm8gKyAxYAorICAgIDs7Citlc2FjCisKK2VjaG8gLWUgIlx0LS0tLS0tLS0tLS0tICAgICAgICAgLS0tLS0tLS0tLS0tXG4iCitlY2hvIC1lICJcdC0tLT09PTw8PCgoKCBXRUxDT01FICkpKT4+Pj09PS0tLVxuIgorZWNobyAtZSAiXHQtLS0tLS0tLS0tLS0gICAgICAgICAtLS0tLS0tLS0tLS1cbiIKKworaW5zbW9kX3BhdGg9CitybW1vZF9wYXRoPQorCitpZiBbICRBTkRST0lEX1JPT1QgXTsgdGhlbgorICAgIGlzX2FuZHJvaWQ9YGV4cHIgJGlzX2FuZHJvaWQgKyAxYAorICAgIHByZWZpeF9wYXRoMm1vZHVsZXM9Ii9zeXN0ZW0vIgorICAgIGluc21vZF9wYXRoPSIvc3lzdGVtL2Jpbi8iCisgICAgcm1tb2RfcGF0aD0iL3N5c3RlbS9iaW4vIgorZmkKKworaWYgWyAiJHN0YWdlX3VubyIgLW5lICIwIiBdOyB0aGVuCisgICAgZWNobyAtZSAiKysrIE1vdW50IHRoZSBkZWJ1Z2ZzIG9uIC9zeXMva2VybmVsL2RlYnVnIgorCisgICAgZWNobyA4ID4gL3Byb2Mvc3lzL2tlcm5lbC9wcmludGsKKworICAgIGlmIFsgLWUgL2xpYmV4ZWMvaW5ldGQgXTsgdGhlbgorICAgICAgICAvbGliZXhlYy9pbmV0ZCAvZXRjL2luZXRkLmNvbmYgJgorICAgIGZpCisKKyAgICBpZiBbICEgLWUgL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZyBdOyB0aGVuCisgICAgICAgIG1vdW50IC10IGRlYnVnZnMgbm9uZSAvc3lzL2tlcm5lbC9kZWJ1Zy8KKyAgICBmaQorZmkKKworaWYgWyAiJHN0YWdlX2R1ZSIgLW5lICIwIiBdOyB0aGVuCisgICAgZWNobyAtZSAiKysrIExvYWQgbWFjODAyMTEsIGNmZzgwMjExLCBjcmM3IGFuZCBmaXJtd2FyZV9jbGFzcyIKKworICAgIHJ1bl9pdD1gY2F0IC9wcm9jL21vZHVsZXMgfCBncmVwICJjZmc4MDIxMSJgCisgICAgaWYgWyAiJHJ1bl9pdCIgPT0gIiIgXTsgdGhlbgorICAgICAgICAiJGluc21vZF9wYXRoImluc21vZCAvbGliL21vZHVsZXMvYHVuYW1lIC1yYC9rZXJuZWwvbmV0L3dpcmVsZXNzL2NmZzgwMjExLmtvCisgICAgZmkKKyAgICBydW5faXQ9YGNhdCAvcHJvYy9tb2R1bGVzIHwgZ3JlcCAibWFjODAyMTEiYAorICAgIGlmIFsgIiRydW5faXQiID09ICIiIF07IHRoZW4KKyAgICAgICAgaW5zbW9kIC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgL2tlcm5lbC9uZXQvbWFjODAyMTEvbWFjODAyMTEua28KKyAgICBmaQorICAgIHJ1bl9pdD1gY2F0IC9wcm9jL21vZHVsZXMgfCBncmVwICJjcmM3ImAKKyAgICBpZiBbICIkcnVuX2l0IiA9PSAiIiBdOyB0aGVuCisgICAgICAgIGluc21vZCAvbGliL21vZHVsZXMvYHVuYW1lIC1yYC9rZXJuZWwvbGliL2NyYzcua28KKyAgICBmaQorICAgIHJ1bl9pdD1gY2F0IC9wcm9jL21vZHVsZXMgfCBncmVwICJmaXJtd2FyZV9jbGFzcyJgCisgICAgaWYgWyAiJHJ1bl9pdCIgPT0gIiIgXTsgdGhlbgorICAgICAgICBpbnNtb2QgL2xpYi9tb2R1bGVzL2B1bmFtZSAtcmAva2VybmVsL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5rbworICAgIGZpCitmaQorCitpZiBbICIkc3RhZ2VfcXVhdHRybyIgLW5lICIwIiBdOyB0aGVuCisgICAgZWNobyAtZSAiKysrIExvYWQgd2wxMnh4IGRyaXZlciwgZW5hYmxlIG1hYzgwMjExIHRyYWNpbmciCisKKyAgICBydW5faXQ9YGNhdCAvcHJvYy9tb2R1bGVzIHwgZ3JlcCAid2wxMnh4ImAKKyAgICBpZiBbICIkcnVuX2l0IiA9PSAiIiBdOyB0aGVuCisgICAgICAgIGlmIFsgIiRpc19hbmRyb2lkIiAtZXEgIjAiIF07IHRoZW4KKyAgICAgICAgICAgICIkaW5zbW9kX3BhdGgiaW5zbW9kIC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgL2tlcm5lbC9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMnh4LmtvCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICIkaW5zbW9kX3BhdGgiaW5zbW9kIC9zeXN0ZW0vbGliL21vZHVsZXMvd2wxMnh4LmtvCisgICAgICAgIGZpCisgICAgICAgIGlmIFsgIiQ/IiAhPSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAtZSAiRmFpbCB0byBsb2FkIHdsMTJ4eCIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorICAgIGZpCisKKyAgICBydW5faXQ9YGNhdCAvcHJvYy9tb2R1bGVzIHwgZ3JlcCAid2wxMnh4X3NkaW8iYAorICAgIGlmIFsgIiRydW5faXQiID09ICIiIF07IHRoZW4KKyAgICAgICAgaWYgWyAiJGlzX2FuZHJvaWQiIC1lcSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgIiRpbnNtb2RfcGF0aCJpbnNtb2QgL2xpYi9tb2R1bGVzL2B1bmFtZSAtcmAva2VybmVsL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyeHhfc2Rpby5rbworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbnNtb2QgL3N5c3RlbS9saWIvbW9kdWxlcy93bDEyeHhfc2Rpby5rbworICAgICAgICBmaQorICAgICAgICBpZiBbICIkPyIgIT0gIjAiIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gLWUgIkZhaWwgdG8gbG9hZCB3bDEyeHhfc2RpbyIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorICAgIGZpCisKKyAgICBzbGVlcCAxCisgICAgaWYgWyAtZSAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nIF07IHRoZW4KKyAgICAgICAgZWNobyAxID4gL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy9ldmVudHMvbWFjODAyMTEvZW5hYmxlCisgICAgZmkKKworICAgICNpZmNvbmZpZyB3bGFuMCBodyBldGhlciAkbWFjX2FkZHIKKyAgICAjY2F0IC9zeXMva2VybmVsL2RlYnVnL21tYzIvaW9zCitmaQorCitpZiBbICIkc3RhZ2Vfb3R0byIgLW5lICIwIiBdOyB0aGVuCisgICAgZWNobyAtZSAiKysrIFN0YXJ0IGludGVyZmFjZSwgZW5hYmxlIG1vbml0b3JpbmcgZXZlbnRzLCBydW4gd3BhX3N1cHBsaWNhbnQiCisKKyAgICBpZmNvbmZpZyB3bGFuMCB1cAorICAgIGlmIFsgIiQ/IiAhPSAiMCIgXTsgdGhlbgorICAgICAgICBlY2hvIC1lICJGYWlsIHRvIHN0YXJ0IGlmYWNlIgorICAgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgc2xlZXAgMQorICAgIGl3IGV2ZW50ID4gL3Zhci9sb2cvaXdldmVudHMgJgorCisgICAgI3dwYV9zdXBwbGljYW50IC1QL3Zhci9ydW4vd3BhX3N1cHBsaWNhbnQucGlkIC1pd2xhbjAKKyAgICAjICAgIC1jL2V0Yy93cGFfc3VwcGxpY2FudC5jb25mIC1Ebmw4MDIxMSAtZi92YXIvbG9nL3dwYV9zdXBwbGljYW50LmxvZyAmCisgICAgI2l3IHdsYW4wIGNxbSByc3NpIC01NSAyCisgICAgI3dwYV9zdXBwbGljYW50IC1kZHQgLWl3bGFuMCAtYy9ldGMvd3BhX3N1cHBsaWNhbnQuY29uZiAtRG5sODAyMTEgLWYvdmFyL2xvZy93cGEubG9nICYKKyAgICB3cGFfc3VwcGxpY2FudCAtaXdsYW4wIC1jL2V0Yy93cGFfc3VwcGxpY2FudC5jb25mIC1Ebmw4MDIxMSAmCisgICAgI3B5dGhvbiAvdXNyL3NoYXJlL3BlcmlwaGVyYWxzLXRlc3QtYXV0b20vZHV0LnB5IC12ICYKK2ZpCisKK2lmIFsgIiRzdGFnZV9zZWRpY2kiIC1uZSAiMCIgXTsgdGhlbgorICAgIGVjaG8gbWFudWFsX2xvY2sgPiAvc3lzL3Bvd2VyL3dha2VfbG9jaworICAgIGVjaG8gcGVyZm9ybWFuY2UgPiAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUwL2NwdWZyZXEvc2NhbGluZ19nb3Zlcm5vcgorICAgIGVjaG8gMSA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdTEvb25saW5lCisgICAgZWNobyBwZXJmb3JtYW5jZSA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdTEvY3B1ZnJlcS9zY2FsaW5nX2dvdmVybm9yCitmaQorCitpZiBbICIkc3RhZ2VfdHJlbnRhZHVlIiAtbmUgIjAiIF07IHRoZW4KKworICAgIGlmIFsgIiRoYXZlX3BhdGhfdG9faW5pIiAtZXEgIjAiIF07IHRoZW4KKyAgICAgICAgZWNobyAtZSAiTWlzc2luZyBpbmkgZmlsZSBwYXJhbWV0ZXIiCisgICAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICAjIDEuIHVubG9hZCB3bDEyeHgga2VybmVsIG1vZHVsZXMKKyAgICBlY2hvIC1lICIrKysgVW5sb2FkIHdsMTJ4eCBkcml2ZXIiCisgICAgcnVuX2l0PWBjYXQgL3Byb2MvbW9kdWxlcyB8IGdyZXAgIndsMTJ4eF9zZGlvImAKKyAgICBpZiBbICIkcnVuX2l0IiAhPSAiIiBdOyB0aGVuCisgICAgICAgIHJtbW9kIHdsMTJ4eF9zZGlvCisgICAgZmkKKyAgICBydW5faXQ9YGNhdCAvcHJvYy9tb2R1bGVzIHwgZ3JlcCAid2wxMnh4ImAKKyAgICBpZiBbICIkcnVuX2l0IiAhPSAiIiBdOyB0aGVuCisgICAgICAgIHJtbW9kIHdsMTJ4eAorICAgIGZpCisKKyAgICAjIDIuIGNyZWF0ZSByZWZlcmVuY2UgTlZTIGZpbGUgd2l0aCBkZWZhdWx0IE1BQworICAgIGVjaG8gLWUgIisrKyBDcmVhdGUgcmVmZXJlbmNlIE5WUyB3aXRoICRwYXRoX3RvX2luaSAkcGF0aF90b19pbmkyIgorICAgIC4vY2FsaWJyYXRvciBzZXQgcmVmX252czIgJHBhdGhfdG9faW5pICRwYXRoX3RvX2luaTIKKyAgICBpZiBbICIkPyIgIT0gIjAiIF07IHRoZW4KKyAgICAgICAgZWNobyAtZSAiRmFpbCB0byB0dW5lIGNoYW5uZWwiCisgICAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICAjIDMuIFNldCBBdXRvRkVNIGRldGVjdGlvbiB0byBhdXRvCisgICAgZWNobyAtZSAiKysrIFNldCBBdXRvIEZFTSBkZXRlY3Rpb24gdG8gYXV0byIKKyAgICBydW5faXQ9YC4vY2FsaWJyYXRvciBzZXQgbnZzX2F1dG9mZW0gMSAuL25ldy1udnMuYmluYAorCisgICAgIyA0LiBjb3B5IE5WUyB0byBwcm9wZXIgcGxhY2UKKyAgICBlY2hvIC1lICIrKysgQ29weSByZWZlcmVuY2UgTlZTIGZpbGUgdG8gJHBhdGhfdG9faW5zdGFsbCIKKyAgICBydW5faXQ9YGNwIC1mIC4vbmV3LW52cy5iaW4gJHBhdGhfdG9faW5zdGFsbGAKKworICAgICMgNS4gbG9hZCB3bDEyeHgga2VybmVsIG1vZHVsZXMKKyAgICBzaCAkMCAtYiA0CisKKyAgICAjIDYuIGNhbGlicmF0ZQorICAgIGVjaG8gLWUgIisrKyBDYWxpYnJhdGUiCisgICAgLi9jYWxpYnJhdG9yIHdsYW4wIHBsdCBwb3dlcl9tb2RlIG9uCisgICAgaWYgWyAiJD8iICE9ICIwIiBdOyB0aGVuCisgICAgICAgIGVjaG8gLWUgIkZhaWwgdG8gc2V0IHBvd2VyIG1vZGUgdG8gb24iCisgICAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICAuL2NhbGlicmF0b3Igd2xhbjAgcGx0IHR1bmVfY2hhbm5lbCAwIDcKKyAgICBpZiBbICIkPyIgIT0gIjAiIF07IHRoZW4KKyAgICAgICAgZWNobyAtZSAiRmFpbCB0byB0dW5lIGNoYW5uZWwiCisgICAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBydW5faXQ9YGNhdCAkcGF0aF90b19pbmkgfCBncmVwICJSeFRyYWNlSW5zZXJ0aW9uTG9zc181RyJgCisgICAgaWYgWyAiJHJ1bl9pdCIgIT0gIiIgXTsgdGhlbgorICAgICAgICAuL2NhbGlicmF0b3Igd2xhbjAgcGx0IHR4X2JpcCAxIDEgMSAxIDEgMSAxIDEgJHBhdGhfdG9faW5zdGFsbAorICAgICAgICBpZiBbICIkPyIgIT0gIjAiIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gLWUgIkZhaWwgdG8gY2FsaWJyYXRlIgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgIGZpCisgICAgZWxzZQorICAgICAgICAuL2NhbGlicmF0b3Igd2xhbjAgcGx0IHR4X2JpcCAxIDAgMCAwIDAgMCAwIDAgJHBhdGhfdG9faW5zdGFsbAorICAgICAgICBpZiBbICIkPyIgIT0gIjAiIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gLWUgIkZhaWwgdG8gY2FsaWJyYXRlIgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgIGZpCisgICAgZmkKKworICAgIC4vY2FsaWJyYXRvciB3bGFuMCBwbHQgcG93ZXJfbW9kZSBvZmYKKyAgICBpZiBbICIkPyIgIT0gIjAiIF07IHRoZW4KKyAgICAgICAgZWNobyAtZSAiRmFpbCB0byBzZXQgcG93ZXIgbW9kZSB0byBvZmYiCisgICAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICAjIDcuIHVubG9hZCB3bDEyeHgga2VybmVsIG1vZHVsZXMKKyAgICBybW1vZCB3bDEyeHhfc2RpbyB3bDEyeHgKKworICAgICMgOC4gdXBkYXRlIE5WUyBmaWxlIHdpdGggcmFuZG9tIGFuZCB2YWxpZCBNQUMgYWRkcmVzcworICAgIGVjaG8gLWUgIisrKyBVcGRhdGUgTlZTIGZpbGUgd2l0aCByYW5kb20gdmFsaWQgTUFDIGFkZHJlc3MiCisgICAgLi9jYWxpYnJhdG9yIHNldCBudnNfbWFjIC4vbmV3LW52cy5iaW4KKyAgICBpZiBbICIkPyIgIT0gIjAiIF07IHRoZW4KKyAgICAgICAgZWNobyAtZSAiRmFpbCB0byBzZXQgTlZTIE1BQyBhZGRyZXNzIgorICAgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgIyA5LiBjb3B5IGNhbGlicmF0ZWQgTlZTIGZpbGUgdG8gcHJvcGVyIHBsYWNlCisgICAgZWNobyAtZSAiKysrIENvcHkgY2FsaWJyYXRlZCBOVlMgZmlsZSB0byAkcGF0aF90b19pbnN0YWxsIgorICAgIHJ1bl9pdD1gY3AgLWYgLi9uZXctbnZzLmJpbiAkcGF0aF90b19pbnN0YWxsYAorCisgICAgIyAxMC4gbG9hZCB3bDEyeHgga2VybmVsIG1vZHVsZXMKKyAgICBpZiBbICEgLWUgL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZyBdOyB0aGVuCisgICAgICAgIG1vdW50IC10IGRlYnVnZnMgbm9uZSAvc3lzL2tlcm5lbC9kZWJ1Zy8KKyAgICBmaQorICAgIHNoICQwIC1iIDQKKworICAgIGVjaG8gLWUgIlxuXHREZWFyIEN1c3RvbWVyLCB5b3UgYXJlIHJlYWR5IHRvIHVzZSBvdXIgY2FsaWJyYXRlZCBkZXZpY2VcbiIKK2ZpCisKKyMKKyMgMS1jb21tYW5kIGNhbGlicmF0aW9uCisjIHBhcmFtZXRlcnMgYXJlIElOSSBmaWxlLCBwYXRoIHdoZXJlIHRvIGluc3RhbGwgTlZTIChkZWZhdWx0IC9saWIvZmlybXdhcmUpCisjCisKK2lmIFsgIiRzdGFnZV9zZXNzYW50YV9xdWF0dHJvIiAtbmUgIjAiIF07IHRoZW4KKworICAgIGlmIFsgIiRoYXZlX3BhdGhfdG9faW5pIiAtZXEgIjAiIF07IHRoZW4KKyAgICAgICAgZWNobyAtZSAiTWlzc2luZyBpbmkgZmlsZSBwYXJhbWV0ZXIiCisgICAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICAjIDEuIHVubG9hZCB3bDEyeHgga2VybmVsIG1vZHVsZXMKKyAgICBlY2hvIC1lICIrKysgVW5sb2FkIHdsMTJ4eCBkcml2ZXIiCisgICAgcnVuX2l0PWBjYXQgL3Byb2MvbW9kdWxlcyB8IGdyZXAgIndsMTJ4eF9zZGlvImAKKyAgICBpZiBbICIkcnVuX2l0IiAhPSAiIiBdOyB0aGVuCisgICAgICAgIHJtbW9kIHdsMTJ4eF9zZGlvCisgICAgZmkKKyAgICBydW5faXQ9YGNhdCAvcHJvYy9tb2R1bGVzIHwgZ3JlcCAid2wxMnh4ImAKKyAgICBpZiBbICIkcnVuX2l0IiAhPSAiIiBdOyB0aGVuCisgICAgICAgIHJtbW9kIHdsMTJ4eAorICAgIGZpCisKKyAgICAjIDIuIGNyZWF0ZSByZWZlcmVuY2UgTlZTIGZpbGUgd2l0aCBkZWZhdWx0IE1BQworICAgIGVjaG8gLWUgIisrKyBDcmVhdGUgcmVmZXJlbmNlIE5WUyB3aXRoIElOSSAkcGF0aF90b19pbmkiCisgICAgLi9jYWxpYnJhdG9yIHNldCByZWZfbnZzICRwYXRoX3RvX2luaQorICAgIGlmIFsgIiQ/IiAhPSAiMCIgXTsgdGhlbgorICAgICAgICBlY2hvIC1lICJGYWlsIHRvIHR1bmUgY2hhbm5lbCIKKyAgICAgICAgZXhpdCAxCisgICAgZmkKKworICAgICMgMy4gY29weSBOVlMgdG8gcHJvcGVyIHBsYWNlCisgICAgZWNobyAtZSAiKysrIENvcHkgcmVmZXJlbmNlIE5WUyBmaWxlIHRvICRwYXRoX3RvX2luc3RhbGwiCisgICAgcnVuX2l0PWBjcCAtZiAuL25ldy1udnMuYmluICRwYXRoX3RvX2luc3RhbGxgCisKKyAgICAjIDQuIGxvYWQgd2wxMnh4IGtlcm5lbCBtb2R1bGVzCisgICAgc2ggJDAgLWIgNAorCisgICAgIyA1LiBjYWxpYnJhdGUKKyAgICBlY2hvIC1lICIrKysgQ2FsaWJyYXRlIgorICAgIC4vY2FsaWJyYXRvciB3bGFuMCBwbHQgcG93ZXJfbW9kZSBvbgorICAgIGlmIFsgIiQ/IiAhPSAiMCIgXTsgdGhlbgorICAgICAgICBlY2hvIC1lICJGYWlsIHRvIHNldCBwb3dlciBtb2RlIHRvIG9uIgorICAgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgLi9jYWxpYnJhdG9yIHdsYW4wIHBsdCB0dW5lX2NoYW5uZWwgMCA3CisgICAgaWYgWyAiJD8iICE9ICIwIiBdOyB0aGVuCisgICAgICAgIGVjaG8gLWUgIkZhaWwgdG8gdHVuZSBjaGFubmVsIgorICAgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgcnVuX2l0PWBjYXQgJHBhdGhfdG9faW5pIHwgZ3JlcCAiUnhUcmFjZUluc2VydGlvbkxvc3NfNUciYAorICAgIGlmIFsgIiRydW5faXQiICE9ICIiIF07IHRoZW4KKyAgICAgICAgLi9jYWxpYnJhdG9yIHdsYW4wIHBsdCB0eF9iaXAgMSAxIDEgMSAxIDEgMSAxICRwYXRoX3RvX2luc3RhbGwKKyAgICAgICAgaWYgWyAiJD8iICE9ICIwIiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvIC1lICJGYWlsIHRvIGNhbGlicmF0ZSIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorICAgIGVsc2UKKyAgICAgICAgLi9jYWxpYnJhdG9yIHdsYW4wIHBsdCB0eF9iaXAgMSAwIDAgMCAwIDAgMCAwICRwYXRoX3RvX2luc3RhbGwKKyAgICAgICAgaWYgWyAiJD8iICE9ICIwIiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvIC1lICJGYWlsIHRvIGNhbGlicmF0ZSIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorICAgIGZpCisKKyAgICAuL2NhbGlicmF0b3Igd2xhbjAgcGx0IHBvd2VyX21vZGUgb2ZmCisgICAgaWYgWyAiJD8iICE9ICIwIiBdOyB0aGVuCisgICAgICAgIGVjaG8gLWUgIkZhaWwgdG8gc2V0IHBvd2VyIG1vZGUgdG8gb2ZmIgorICAgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgIyA2LiB1bmxvYWQgd2wxMnh4IGtlcm5lbCBtb2R1bGVzCisgICAgcm1tb2Qgd2wxMnh4X3NkaW8gd2wxMnh4CisKKyAgICAjIDcuIHVwZGF0ZSBOVlMgZmlsZSB3aXRoIHJhbmRvbSBhbmQgdmFsaWQgTUFDIGFkZHJlc3MKKyAgICBlY2hvIC1lICIrKysgVXBkYXRlIE5WUyBmaWxlIHdpdGggcmFuZG9tIHZhbGlkIE1BQyBhZGRyZXNzIgorICAgIC4vY2FsaWJyYXRvciBzZXQgbnZzX21hYyAuL25ldy1udnMuYmluCisgICAgaWYgWyAiJD8iICE9ICIwIiBdOyB0aGVuCisgICAgICAgIGVjaG8gLWUgIkZhaWwgdG8gc2V0IE5WUyBNQUMgYWRkcmVzcyIKKyAgICAgICAgZXhpdCAxCisgICAgZmkKKworICAgICMgOC4gY29weSBjYWxpYnJhdGVkIE5WUyBmaWxlIHRvIHByb3BlciBwbGFjZQorICAgIGVjaG8gLWUgIisrKyBDb3B5IGNhbGlicmF0ZWQgTlZTIGZpbGUgdG8gJHBhdGhfdG9faW5zdGFsbCIKKyAgICBydW5faXQ9YGNwIC1mIC4vbmV3LW52cy5iaW4gJHBhdGhfdG9faW5zdGFsbGAKKworICAgICMgOS4gbG9hZCB3bDEyeHgga2VybmVsIG1vZHVsZXMKKyAgICBpZiBbICEgLWUgL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZyBdOyB0aGVuCisgICAgICAgIG1vdW50IC10IGRlYnVnZnMgbm9uZSAvc3lzL2tlcm5lbC9kZWJ1Zy8KKyAgICBmaQorICAgIHNoICQwIC1iIDQKKworICAgIGVjaG8gLWUgIlxuXHREZWFyIEN1c3RvbWVyLCB5b3UgYXJlIHJlYWR5IHRvIHVzZSBvdXIgY2FsaWJyYXRlZCBkZXZpY2VcbiIKK2ZpCisKK2lmIFsgIiRkYmdfbHZsIiAtZXEgIi0xIiBdICYmIFsgLWUgL3N5cy9tb2R1bGUvd2wxMnh4L3BhcmFtZXRlcnMvZGVidWdfbGV2ZWwgXTsgdGhlbgorICAgIGRiZ19sdmw9YGNhdCAvc3lzL21vZHVsZS93bDEyeHgvcGFyYW1ldGVycy9kZWJ1Z19sZXZlbGAKKyAgICBlY2hvIC1lICJcbmRiZyBsdmw6ICRkYmdfbHZsXG4iCitlbGlmIFsgIiRkYmdfbHZsIiAtbmUgIjAiIF0gJiYgWyAtZSAvc3lzL21vZHVsZS93bDEyeHgvcGFyYW1ldGVycy9kZWJ1Z19sZXZlbCBdOyB0aGVuCisgICAgZWNobyAiJGRiZ19sdmwiID4gL3N5cy9tb2R1bGUvd2wxMnh4L3BhcmFtZXRlcnMvZGVidWdfbGV2ZWwKKworICAgIGVjaG8gJ21vZHVsZSBjZmc4MDIxMSArcCcgPiAvc3lzL2tlcm5lbC9kZWJ1Zy9keW5hbWljX2RlYnVnL2NvbnRyb2wKKyAgICBlY2hvICdtb2R1bGUgbWFjODAyMTEgK3AnID4gL3N5cy9rZXJuZWwvZGVidWcvZHluYW1pY19kZWJ1Zy9jb250cm9sCisgICAgZWNobyAnbW9kdWxlIHdsMTJ4eCArcCcgPiAvc3lzL2tlcm5lbC9kZWJ1Zy9keW5hbWljX2RlYnVnL2NvbnRyb2wKKyAgICBlY2hvICdtb2R1bGUgd2wxMnh4X3NkaW8gK3AnID4gL3N5cy9rZXJuZWwvZGVidWcvZHluYW1pY19kZWJ1Zy9jb250cm9sCitmaQorCitpZiBbICIkc2V0X2lwX2FkZHIiIC1uZSAiMCIgXTsgdGhlbgorICAgIGVjaG8gLWUgIkdvaW5nIHRvIHNldCBJUCAkaXBfYWRkciIKKyAgICBpZmNvbmZpZyB3bGFuMCAkaXBfYWRkciB1cAorZmkKKworZXhpdCAwCmRpZmYgLS1naXQgYS9tYWM4MDIxMS90aS11dGlscy9zY3JpcHRzL21rY2FyZC5zaCBiL21hYzgwMjExL3RpLXV0aWxzL3NjcmlwdHMvbWtjYXJkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUwMDc3OWUKLS0tIC9kZXYvbnVsbAorKysgYi9tYWM4MDIxMS90aS11dGlscy9zY3JpcHRzL21rY2FyZC5zaApAQCAtMCwwICsxLDIyIEBACisjISAvYmluL3NoCisKK0RSSVZFPSQxCisKK2RkIGlmPS9kZXYvemVybyBvZj0kRFJJVkUgYnM9MTAyNCBjb3VudD0xMDI0CisKK1NJWkU9YGZkaXNrIC1sICREUklWRSB8IGdyZXAgRGlzayB8IGF3ayAne3ByaW50ICQ1fSdgCisKK2VjaG8gRElTSyBTSVpFIC0gJFNJWkUgYnl0ZXMKKworQ1lMSU5ERVJTPWBlY2hvICRTSVpFLzI1NS82My81MTIgfCBiY2AKKworZWNobyBDWUxJTkRFUlMgLSAkQ1lMSU5ERVJTCisKK3sKK2VjaG8gLDksMHgwQywqCitlY2hvICwsLC0KK30gfCBzZmRpc2sgLUQgLUggMjU1IC1TIDYzIC1DICRDWUxJTkRFUlMgJERSSVZFCisKK21rZnMudmZhdCAtRiAzMiAtbiAiYm9vdCIgJHtEUklWRX0xCitta2UyZnMgLWogLUwgInJvb3RmcyIgJHtEUklWRX0yCisKZGlmZiAtLWdpdCBhL21hYzgwMjExL3RpLXV0aWxzL3VpbV9yZmtpbGwvcmVhZG1lLnR4dCBiL21hYzgwMjExL3RpLXV0aWxzL3VpbV9yZmtpbGwvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDEwOGEzCi0tLSAvZGV2L251bGwKKysrIGIvbWFjODAyMTEvdGktdXRpbHMvdWltX3Jma2lsbC9yZWFkbWUudHh0CkBAIC0wLDAgKzEsMjUgQEAKK1RoaXMgaXMgVUlNIHV0aWxpdHkgcmVxdWlyZWQgZm9yIFRJJ3Mgc2hhcmVkIHRyYW5zcG9ydCBkcml2ZXIgaW4gb3JkZXIKK3RvIG9wZW4gVUFSVCBhbmQgdG8gZGVsaXZlciB0aGUgY29udHJvbCBvZiBpdCB0byB0aGUgZHJpdmVyLgorCitUaGUgYXV0aG9yIG9mIHRoZSB1dGlsaXR5IGlzIFBhdmFuIFNhdm95IDxwYXZhbl9zYXZveUB0aS5jb20+CisKKy0tLSBSdW5uaW5nIFVJTSB1dGlsaXR5CisKK0l0IG5lZWRzIHRvIGJlIHJ1biBhdCBib290LCBTaW5jZSBsaW51eCBmbGF2b3JzIG1pZ2h0IHJlcXVpcmUgQmx1ZXRvb3RoIG9yCitHUFMgdG8gYmUgdHVybmVkIG9uIGF0IGJvb3QuIEZvciB0aGlzIGhhdmUgdGhlIFVJTSBlbnRyeSBpbiB5b3VyIGVpdGhlciBvbmUKK29mIHlvdXIgcmMuUyBmaWxlcyBvciB5b3UgY2FuIGhhdmUgc3BlY2lhbCB1ZGV2IHJ1bGUgYmFzZWQgb24gdGhlIHBsYXRmb3JtCitkcml2ZXIgYWRkaXRpb24gb2YgZGV2aWNlICJraW0iLgorCitGb3IgQW5kcm9pZCwgdGhlIGZvbGxvd2luZyBlbnRyeSBpbiBpbml0LnJjIHNob3VsZCBzdWZmaWNlLAorc2VydmljZSB1aW0gL3N5c3RlbS9iaW4vdWltLXN5c2ZzCisgICAgdXNlciByb290CisgICAgZ3JvdXAgbWVkaWEgYmx1ZXRvb3RoCisgICAgb25lc2hvdAorW2VkaXRdCisKK0ZvciBBbmdzdHJvbSwgdGhlIGZvbGxvd2luZyBjb21tYW5kIHNob3VsZCBiZSBkb25lLAorLi91aW0gL2Rldi90dHlPMSAzNjg2NDAwIG5vbmUgMjIgJgorCistLS0gQnVpbGRpbmcgVUlNIHV0aWxpdHkKK21ha2UgdWltCisKZGlmZiAtLWdpdCBhL21hYzgwMjExL3RpLXV0aWxzL3VpbV9yZmtpbGwvdWltLmMgYi9tYWM4MDIxMS90aS11dGlscy91aW1fcmZraWxsL3VpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZWE2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9tYWM4MDIxMS90aS11dGlscy91aW1fcmZraWxsL3VpbS5jCkBAIC0wLDAgKzEsOTM4IEBACisvKgorICogIFVzZXIgTW9kZSBJbml0IG1hbmFnZXIgLSBGb3IgVEkgc2hhcmVkIHRyYW5zcG9ydAorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtO2lmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNpZmRlZiBBTkRST0lECisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2VuZGlmCisKKyNpZmRlZiBBTkRST0lECisjaW5jbHVkZSA8Y29tbW9uL3Bwb2xsLmg+IC8qIGZvciBwcG9sbCAqLworI2VuZGlmCisjaW5jbHVkZSAidWltLmgiCisKKyNpZm5kZWYgQU5EUk9JRAorI2RlZmluZSBJTkNMVURFX0ZNIDAKKyNlbmRpZgorCisvKiBNYWludGFpbnMgdGhlIGV4aXQgc3RhdGUgb2YgVUlNKi8KK3N0YXRpYyBpbnQgZXhpdGluZzsKKworLyogVUFSVCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMqLworaW50IHVhcnRfZmxvd19jb250cm9sOworaW50IGN1c3RfYmF1ZF9yYXRlOworY2hhciB1YXJ0X2Rldl9uYW1lWzE1XTsKK3Vuc2lnbmVkIGludCB1YXJ0X2JhdWRfcmF0ZTsKK3N0cnVjdCB0ZXJtaW9zIHRpOworaW50IGxpbmVfZGlzY2lwbGluZTsKKworLyogQkQgYWRkcmVzcyBhcyBzdHJpbmcgYW5kIGEgcG9pbnRlciB0byBhcnJheSBvZiBoZXggYnl0ZXMgKi8KK2NoYXIgdWltX2JkX2FkZHJlc3NbMTddOworYmRhZGRyX3QgKmJkX2FkZHI7CisKKy8qIEZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIFVBUlQgZGV2aWNlKi8KK2ludCBkZXZfZmQ7CisKKy8qIE1haW50YWlucyB0aGUgc3RhdGUgb2YgTl9USV9XTCBsaW5lIGRpc2NpcGxpbmUgaW5zdGFsbGF0aW9uKi8KK3Vuc2lnbmVkIGNoYXIgc3Rfc3RhdGUgPSBVTklOU1RBTExfTl9USV9XTDsKK3Vuc2lnbmVkIGNoYXIgcHJldl9zdF9zdGF0ZSA9IFVOSU5TVEFMTF9OX1RJX1dMOworCisvKiBmcm9tIGtlcm5lbCdzIGluY2x1ZGUvbGludXgvcmZraWxsLmgKKyAqIHRoZSBoZWFkZXIgaW4gaXRzZWxmIG5vdCBpbmNsdWRlZCBiZWNhdXNlIG9mIHRoZQorICogdmVyc2lvbiBtaXNtYXRjaCBvZiBhbmRyb2lkIGtlcm5lbCBoZWFkZXJzIHByb2plY3QKKyAqLworCisvKioKKyAqIGVudW0gcmZraWxsX29wZXJhdGlvbiAtIG9wZXJhdGlvbiB0eXBlcworICogQFJGS0lMTF9PUF9BREQ6IGEgZGV2aWNlIHdhcyBhZGRlZAorICogQFJGS0lMTF9PUF9ERUw6IGEgZGV2aWNlIHdhcyByZW1vdmVkCisgKiBAUkZLSUxMX09QX0NIQU5HRTogYSBkZXZpY2UncyBzdGF0ZSBjaGFuZ2VkIC0tIHVzZXJzcGFjZSBjaGFuZ2VzIG9uZSBkZXZpY2UKKyAqIEBSRktJTExfT1BfQ0hBTkdFX0FMTDogdXNlcnNwYWNlIGNoYW5nZXMgYWxsIGRldmljZXMgKG9mIGEgdHlwZSwgb3IgYWxsKQorICovCitlbnVtIHJma2lsbF9vcGVyYXRpb24geworICAgIFJGS0lMTF9PUF9BREQgPSAwLAorICAgIFJGS0lMTF9PUF9ERUwsCisgICAgUkZLSUxMX09QX0NIQU5HRSwKKyAgICBSRktJTExfT1BfQ0hBTkdFX0FMTCwKK307CisKKy8qKgorICogc3RydWN0IHJma2lsbF9ldmVudCAtIGV2ZW50cyBmb3IgdXNlcnNwYWNlIG9uIC9kZXYvcmZraWxsCisgKiBAaWR4OiBpbmRleCBvZiBkZXYgcmZraWxsCisgKiBAdHlwZTogdHlwZSBvZiB0aGUgcmZraWxsIHN0cnVjdAorICogQG9wOiBvcGVyYXRpb24gY29kZQorICogQGhhcmQ6IGhhcmQgc3RhdGUgKDAvMSkKKyAqIEBzb2Z0OiBzb2Z0IHN0YXRlICgwLzEpCisgKgorICogU3RydWN0dXJlIHVzZWQgZm9yIHVzZXJzcGFjZSBjb21tdW5pY2F0aW9uIG9uIC9kZXYvcmZraWxsLAorICogdXNlZCBmb3IgZXZlbnRzIGZyb20gdGhlIGtlcm5lbCBhbmQgY29udHJvbCB0byB0aGUga2VybmVsLgorICovCisjaWZkZWYgQU5EUk9JRAorc3RydWN0IHJma2lsbF9ldmVudCB7CisgICAgX191MzIgaWR4OworICAgIF9fdTggIHR5cGU7CisgICAgX191OCAgb3A7CisgICAgX191OCAgc29mdCwgaGFyZDsKK30gX19wYWNrZWQ7CisjZWxzZQorc3RydWN0IHJma2lsbF9ldmVudCB7CisgICAgdWludDMyX3QgaWR4OworICAgIHVpbnQ4X3QgIHR5cGU7CisgICAgdWludDhfdCAgb3A7CisgICAgdWludDhfdCAgc29mdCwgaGFyZDsKK30gX19wYWNrZWQ7CisjZW5kaWYgLyogQU5EUk9JRCAqLworCisvKiB0byByZWFkIGV2ZW50cyBhbmQgZmlsdGVyIG5vdGlmaWNhdGlvbnMgZm9yIHVzICovCitzdHJ1Y3QgcmZraWxsX2V2ZW50IHJmX2V2ZW50OwordW5zaWduZWQgaW50ICAgcmZraWxsX2lkeDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFVJTV9ERUJVRworLyogIEZ1bmN0aW9uIHRvIFJlYWQgdGhlIGZpcm13YXJlIHZlcnNpb24KKyAqICBtb2R1bGUgaW50byB0aGUgc3lzdGVtLiBDdXJyZW50bHkgdXNlZCBmb3IKKyAqICBkZWJ1Z2dpbmcgcHVycG9zZSwgd2hlbmV2ZXIgdGhlIGJhdWQgcmF0ZSBpcyBjaGFuZ2VkCisgKi8KK3ZvaWQgcmVhZF9maXJtd2FyZV92ZXJzaW9uKCkKK3sKKyAgICBpbnQgaW5kZXggPSAwOworICAgIGNoYXIgcmVzcF9idWZmZXJbMjBdID0geyAwIH07CisgICAgdW5zaWduZWQgY2hhciBidWZmZXJbXSA9IHsgMHgwMSwgMHgwMSwgMHgxMCwgMHgwMCB9OworCisgICAgVUlNX1NUQVJUX0ZVTkMoKTsKKyAgICBVSU1fVkVSKCIgd3JvdGUgJWQgYnl0ZXMiLCAoaW50KXdyaXRlKGRldl9mZCwgYnVmZmVyLCA0KSk7CisgICAgVUlNX1ZFUigiIHJlYWRpbmcgJWQgYnl0ZXMiLCAoaW50KXJlYWQoZGV2X2ZkLCByZXNwX2J1ZmZlciwgMTUpKTsKKworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDE1OyBpbmRleCsrKSB7CisgICAgICAgIFVJTV9WRVIoIiAleCAiLCByZXNwX2J1ZmZlcltpbmRleF0pOworICAgIH0KKworICAgIHByaW50ZigiXG4iKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQU5EUk9JRCAgICAgICAgICAgICAgICAgLyogbGlicmFyeSBmb3IgYW5kcm9pZCB0byBkbyBpbnNtb2Qvcm1tb2QgICovCisKKy8qIEZ1bmN0aW9uIHRvIGluc2VydCB0aGUga2VybmVsIG1vZHVsZSBpbnRvIHRoZSBzeXN0ZW0qLworc3RhdGljIGludCBpbnNtb2QoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmFyZ3MpCit7CisgICAgdm9pZCAqbW9kdWxlOworICAgIHVuc2lnbmVkIGludCBzaXplOworICAgIGludCByZXQgPSAtMTsKKworICAgIFVJTV9TVEFSVF9GVU5DKCk7CisKKyAgICBtb2R1bGUgPSAodm9pZCAqKWxvYWRfZmlsZShmaWxlbmFtZSwgJnNpemUpOworICAgIGlmICghbW9kdWxlKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0ID0gaW5pdF9tb2R1bGUobW9kdWxlLCBzaXplLCBhcmdzKTsKKyAgICBmcmVlKG1vZHVsZSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBGdW5jdGlvbiB0byByZW1vdmUgdGhlIGtlcm5lbCBtb2R1bGUgZnJvbSB0aGUgc3lzdGVtKi8KK3N0YXRpYyBpbnQgcm1tb2QoY29uc3QgY2hhciAqbW9kbmFtZSkKK3sKKyAgICBpbnQgcmV0ID0gLTE7CisgICAgaW50IG1heHRyeSA9IE1BWF9UUlk7CisKKyAgICBVSU1fU1RBUlRfRlVOQygpOworCisgICAgLyogUmV0cnkgTUFYX1RSWSBudW1iZXIgb2YgdGltZXMgaW4gY2FzZSBvZgorICAgICAqIGZhaWx1cmUKKyAgICAgKi8KKyAgICB3aGlsZSAobWF4dHJ5LS0gPiAwKSB7CisgICAgICAgIHJldCA9IGRlbGV0ZV9tb2R1bGUobW9kbmFtZSwgT19OT05CTE9DSyB8IE9fRVhDTCk7CisgICAgICAgIGlmIChyZXQgPCAwICYmIGVycm5vID09IEVBR0FJTikgeworICAgICAgICAgICAgc2xlZXAoMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogRmFpbGVkIHRvIHJlbW92ZSB0aGUgbW9kdWxlCisgICAgKi8KKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgVUlNX0VSUigiVW5hYmxlIHRvIHVubG9hZCBkcml2ZXIgbW9kdWxlIFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgIG1vZG5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYgLypBTkRST0lEKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb24gdG8gcmVhZCB0aGUgSENJIGV2ZW50IGZyb20gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvcgorICoKKyAqIFRoaXMgd2lsbCBwYXJzZSB0aGUgcmVzcG9uc2UgcmVjZWl2ZWQgYW5kIHJldHVybnMgZXJyb3IKKyAqIGlmIHRoZSByZXF1aXJlZCByZXNwb25zZSBpcyBub3QgcmVjZWl2ZWQKKyAqLworaW50IHJlYWRfaGNpX2V2ZW50KGludCBmZCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgcmVtYWluLCByZDsKKyAgICBpbnQgY291bnQgPSAwOworICAgIGludCByZWFkaW5nID0gMTsKKyAgICBpbnQgcmRfcmV0cnlfY291bnQgPSAwOworICAgIHN0cnVjdCB0aW1lc3BlYyB0bSA9IHswLCA1MCoxMDAwKjEwMDB9OworCisgICAgVUlNX1NUQVJUX0ZVTkMoKTsKKworICAgIFVJTV9WRVIoIiByZWFkX2hjaV9ldmVudCIpOworICAgIGlmIChzaXplIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFRoZSBmaXJzdCBieXRlIGlkZW50aWZpZXMgdGhlIHBhY2tldCB0eXBlLiBGb3IgSENJIGV2ZW50IHBhY2tldHMsIGl0CisgICAgICogc2hvdWxkIGJlIDB4MDQsIHNvIHdlIHJlYWQgdW50aWwgd2UgZ2V0IHRvIHRoZSAweDA0LiAqLworICAgIHdoaWxlIChyZWFkaW5nKSB7CisgICAgICAgIHJkID0gcmVhZChmZCwgYnVmLCAxKTsKKyAgICAgICAgaWYgKHJkIDw9IDAgJiYgcmRfcmV0cnlfY291bnQrKyA8IDQpIHsKKyAgICAgICAgICAgIG5hbm9zbGVlcCgmdG0sIE5VTEwpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAocmRfcmV0cnlfY291bnQgPj0gNCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ1ZlswXSA9PSBSRVNQX1BSRUZJWCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgY291bnQrKzsKKworICAgIC8qIFRoZSBuZXh0IHR3byBieXRlcyBhcmUgdGhlIGV2ZW50IGNvZGUgYW5kIHBhcmFtZXRlciB0b3RhbCBsZW5ndGguICovCisgICAgd2hpbGUgKGNvdW50IDwgMykgeworICAgICAgICByZCA9IHJlYWQoZmQsIGJ1ZiArIGNvdW50LCAzIC0gY291bnQpOworICAgICAgICBpZiAocmQgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGNvdW50ICs9IHJkOworICAgIH0KKworICAgIC8qIE5vdyB3ZSByZWFkIHRoZSBwYXJhbWV0ZXJzLiAqLworICAgIGlmIChidWZbMl0gPCAoc2l6ZSAtIDMpKSB7CisgICAgICAgIHJlbWFpbiA9IGJ1ZlsyXTsKKyAgICB9IGVsc2UgeworICAgICAgICByZW1haW4gPSBzaXplIC0gMzsKKyAgICB9CisKKyAgICB3aGlsZSAoKGNvdW50IC0gMykgPCByZW1haW4pIHsKKyAgICAgICAgcmQgPSByZWFkKGZkLCBidWYgKyBjb3VudCwgcmVtYWluIC0gKGNvdW50IC0gMykpOworICAgICAgICBpZiAocmQgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGNvdW50ICs9IHJkOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyogRnVuY3Rpb24gdG8gcmVhZCB0aGUgQ29tbWFuZCBjb21wbGV0ZSBldmVudAorICoKKyAqIFRoaXMgd2lsbCByZWFkIHRoZSByZXNwb25zZSBmb3IgdGhlIGNoYW5nZSBzcGVlZAorICogY29tbWFuZCB0aGF0IHdhcyBzZW50IHRvIGNvbmZpZ3VyZSB0aGUgVUFSVCBzcGVlZAorICogd2l0aCB0aGUgY3VzdG9tIGJhdWQgcmF0ZQorICovCitzdGF0aWMgaW50IHJlYWRfY29tbWFuZF9jb21wbGV0ZShpbnQgZmQsIHVuc2lnbmVkIHNob3J0IG9wY29kZSkKK3sKKyAgICBjb21tYW5kX2NvbXBsZXRlX3QgcmVzcDsKKworICAgIFVJTV9TVEFSVF9GVU5DKCk7CisKKyAgICBVSU1fVkVSKCIgQ29tbWFuZCBjb21wbGV0ZSBzdGFydGVkIik7CisgICAgaWYgKHJlYWRfaGNpX2V2ZW50KGZkLCAodW5zaWduZWQgY2hhciAqKSZyZXNwLCBzaXplb2YocmVzcCkpIDwgMCkgeworICAgICAgICBVSU1fRVJSKCIgSW52YWxpZCByZXNwb25zZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogUmVzcG9uc2Ugc2hvdWxkIGJlIGFuIGV2ZW50IHBhY2tldCAqLworICAgIGlmIChyZXNwLnVhcnRfcHJlZml4ICE9IEhDSV9FVkVOVF9QS1QpIHsKKyAgICAgICAgVUlNX0VSUgorICAgICAgICAgICAgKCIgRXJyb3IgaW4gcmVzcG9uc2U6IG5vdCBhbiBldmVudCBwYWNrZXQsIGJ1dCAweCUwMnghIiwKKyAgICAgICAgICAgICByZXNwLnVhcnRfcHJlZml4KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFJlc3BvbnNlIHNob3VsZCBiZSBhIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgKi8KKyAgICBpZiAocmVzcC5oY2lfaGRyLmV2dCAhPSBFVlRfQ01EX0NPTVBMRVRFKSB7CisgICAgICAgIC8qIGV2ZW50IG11c3QgYmUgZXZlbnQtY29tcGxldGUgKi8KKyAgICAgICAgVUlNX0VSUgorICAgICAgICAgICAgKCIgRXJyb3IgaW4gcmVzcG9uc2U6IG5vdCBhIGNtZC1jb21wbGV0ZSBldmVudCxidXQgMHglMDJ4ISIsCisgICAgICAgICAgICAgcmVzcC5oY2lfaGRyLmV2dCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAocmVzcC5oY2lfaGRyLnBsZW4gPCA0KSB7CisgICAgICAgIC8qIHBsZW4gPj0gNCBmb3IgRVZUX0NNRF9DT01QTEVURSAqLworICAgICAgICBVSU1fRVJSKCIgRXJyb3IgaW4gcmVzcG9uc2U6IHBsZW4gaXMgbm90ID49IDQsIGJ1dCAweCUwMnghIiwKKyAgICAgICAgICAgICAgICByZXNwLmhjaV9oZHIucGxlbik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAocmVzcC5jbWRfY29tcGxldGUub3Bjb2RlICE9ICh1bnNpZ25lZCBzaG9ydClvcGNvZGUpIHsKKyAgICAgICAgVUlNX0VSUigiIEVycm9yIGluIHJlc3BvbnNlOiBvcGNvZGUgaXMgMHglMDR4LCBub3QgMHglMDR4ISIsCisgICAgICAgICAgICAgICAgcmVzcC5jbWRfY29tcGxldGUub3Bjb2RlLCBvcGNvZGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgVUlNX0RCRygiIENvbW1hbmQgY29tcGxldGUgZG9uZSIpOworICAgIHJldHVybiByZXNwLnN0YXR1cyA9PSAwID8gMCA6IC0xOworfQorCisvKiBGdW5jdGlvbiB0byBzZXQgdGhlIGRlZmF1bHQgYmF1ZCByYXRlCisgKgorICogVGhlIGRlZmF1bHQgYmF1ZCByYXRlIG9mIDExNTIwMCBpcyBzZXQgdG8gdGhlIFVBUlQgZnJvbSB0aGUgaG9zdCBzaWRlCisgKiBieSBtYWtpbmcgYSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uVGhpcyBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCBiZWZvcmUKKyAqIG1ha2luZyBhIGNhbGwgdG8gc2V0IHRoZSBjdXN0b20gYmF1ZCByYXRlCisgKi8KK3N0YXRpYyBpbnQgc2V0X2JhdWRfcmF0ZSgpCit7CisgICAgVUlNX1NUQVJUX0ZVTkMoKTsKKworICAgIHRjZmx1c2goZGV2X2ZkLCBUQ0lPRkxVU0gpOworCisgICAgLyogR2V0IHRoZSBhdHRyaWJ1dGVzIG9mIFVBUlQgKi8KKyAgICBpZiAodGNnZXRhdHRyKGRldl9mZCwgJnRpKSA8IDApIHsKKyAgICAgICAgVUlNX0VSUigiIENhbid0IGdldCBwb3J0IHNldHRpbmdzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBDaGFuZ2UgdGhlIFVBUlQgYXR0cmlidXRlcyBiZWZvcmUKKyAgICAgKiBzZXR0aW5nIHRoZSBkZWZhdWx0IGJhdWQgcmF0ZSovCisgICAgY2ZtYWtlcmF3KCZ0aSk7CisKKyAgICB0aS5jX2NmbGFnIHw9IDE7CisgICAgdGkuY19jZmxhZyB8PSBDUlRTQ1RTOworCisgICAgLyogU2V0IHRoZSBhdHRyaWJ1dGVzIG9mIFVBUlQgYWZ0ZXIgbWFraW5nCisgICAgICogdGhlIGFib3ZlIGNoYW5nZXMKKyAgICAgKi8KKyAgICB0Y3NldGF0dHIoZGV2X2ZkLCBUQ1NBTk9XLCAmdGkpOworCisgICAgLyogU2V0IHRoZSBhY3R1YWwgZGVmYXVsdCBiYXVkIHJhdGUgKi8KKyAgICBjZnNldG9zcGVlZCgmdGksIEIxMTUyMDApOworICAgIGNmc2V0aXNwZWVkKCZ0aSwgQjExNTIwMCk7CisgICAgdGNzZXRhdHRyKGRldl9mZCwgVENTQU5PVywgJnRpKTsKKworICAgIHRjZmx1c2goZGV2X2ZkLCBUQ0lPRkxVU0gpOworICAgIFVJTV9EQkcoIiBzZXRfYmF1ZF9yYXRlKCkgZG9uZSIpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIHNldCB0aGUgVUFSVCBjdXN0b20gYmF1ZCByYXRlLgorICoKKyAqIFRoZSBVQVJUIGJhdWQgcmF0ZSBoYXMgYWxyZWFkeSBiZWVuCisgKiBzZXQgdG8gZGVmYXVsdCB2YWx1ZSAxMTUyMDAgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqIFRoZSBiYXVkIHJhdGUgaXMgdGhlbiBjaGFuZ2VkIHRvIGN1c3RvbSBiYXVkIHJhdGUgYnkgdGhpcyBmdW5jdGlvbiovCitzdGF0aWMgaW50IHNldF9jdXN0b21fYmF1ZF9yYXRlKCkKK3sKKyAgICBVSU1fU1RBUlRfRlVOQygpOworCisgICAgc3RydWN0IHRlcm1pb3MyIHRpMjsKKworICAgIFVJTV9WRVIoIiBDaGFuZ2luZyBiYXVkIHJhdGUgdG8gJXUsIGZsb3cgY29udHJvbCB0byAldSIsCisgICAgICAgICAgICBjdXN0X2JhdWRfcmF0ZSwgdWFydF9mbG93X2NvbnRyb2wpOworCisgICAgLyogRmx1c2ggbm9uLXRyYW5zbWl0dGVkIG91dHB1dCBkYXRhLAorICAgICAqIG5vbi1yZWFkIGlucHV0IGRhdGEgb3IgYm90aCovCisgICAgdGNmbHVzaChkZXZfZmQsIFRDSU9GTFVTSCk7CisKKyAgICAvKlNldCB0aGUgVUFSVCBmbG93IGNvbnRyb2wgKi8KKyAgICBpZiAodWFydF9mbG93X2NvbnRyb2wpIHsKKyAgICAgICAgdGkuY19jZmxhZyB8PSBDUlRTQ1RTOworICAgIH0gZWxzZSB7CisgICAgICAgIHRpLmNfY2ZsYWcgJj0gfkNSVFNDVFM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBVQVJUCisgICAgICogVGhlIGNoYW5nZSB3aWxsIG9jY3VyIGltbWVkaWF0ZWx5IGJ5IHVzaW5nIFRDU0FOT1cKKyAgICAgKi8KKyAgICBpZiAodGNzZXRhdHRyKGRldl9mZCwgVENTQU5PVywgJnRpKSA8IDApIHsKKyAgICAgICAgVUlNX0VSUigiIENhbid0IHNldCBwb3J0IHNldHRpbmdzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB0Y2ZsdXNoKGRldl9mZCwgVENJT0ZMVVNIKTsKKworICAgIC8qU2V0IHRoZSBhY3R1YWwgYmF1ZCByYXRlICovCisgICAgaW9jdGwoZGV2X2ZkLCBUQ0dFVFMyLCAmdGkyKTsKKyAgICB0aTIuY19jZmxhZyAmPSB+Q0JBVUQ7CisgICAgdGkyLmNfY2ZsYWcgfD0gQk9USEVSOworICAgIHRpMi5jX29zcGVlZCA9IGN1c3RfYmF1ZF9yYXRlOworICAgIGlvY3RsKGRldl9mZCwgVENTRVRTMiwgJnRpMik7CisKKyAgICBVSU1fREJHKCIgc2V0X2N1c3RvbV9iYXVkX3JhdGUoKSBkb25lIik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBIYW5kbGluZyB0aGUgU2lnbmFscyBzZW50IGZyb20gdGhlIEtlcm5lbCBJbml0IE1hbmFnZXIuCisgKiBBZnRlciByZWNlaXZpbmcgdGhlIHNpZ25hbHMsIGNvbmZpZ3VyZSB0aGUgYmF1ZCByYXRlLCBmbG93CisgKiBjb250cm9sIGFuZCBJbnN0YWxsIHRoZSBOX1RJX1dMIGxpbmUgZGlzY2lwbGluZQorICovCitpbnQgc3Rfc2lnX2hhbmRsZXIoaW50IHNpZ25vKQoreworICAgIGludCBsZGlzYywgbGVuOworICAgIHVpbV9zcGVlZF9jaGFuZ2VfY21kIGNtZDsKKworICAgIHVpbV9iZGFkZHJfY2hhbmdlX2NtZCBhZGRyX2NtZDsKKworICAgIFVJTV9TVEFSVF9GVU5DKCk7CisKKyAgICAvKiBSYWlzZSBhIHNpZ25hbCBhZnRlciB3aGVuIFVJTSBpcyBraWxsZWQuCisgICAgICogVGhpcyB3aWxsIGV4aXQgVUlNLCBhbmQgcmVtb3ZlIHRoZSBpbnNlcnRlZCBrZXJuZWwKKyAgICAgKiBtb2R1bGVzCisgICAgICovCisgICAgaWYgKHNpZ25vID09IFNJR0lOVCkgeworICAgICAgICBVSU1fREJHKCIgRXhpdGluZy4gLiAuIik7CisgICAgICAgIGV4aXRpbmcgPSAxOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogSW5zdGFsbCB0aGUgbGluZSBkaXNjaXBsaW5lIHdoZW4gdGhlIHNpZ25hbCBpcyByZWNlaXZlZCBieSBVSU0uCisgICAgICogV2hlbmV2ZXIgdGhlIGZpcnN0IHByb3RvY29sIHRyaWVzIHRvIHJlZ2lzdGVyIHdpdGggdGhlIFNUIGNvcmUsIHRoZQorICAgICAqIFNUIEtJTSB3aWxsIHNlbmQgYSBzaWduYWwgU0lHVVNSMiB0byB0aGUgVUlNIHRvIGluc3RhbGwgdGhlIE5fVElfV0wKKyAgICAgKiBsaW5lIGRpc2NpcGxpbmUgYW5kIGRvIHRoZSBob3N0IHNpZGUgVUFSVCBjb25maWd1cmF0aW9ucy4KKyAgICAgKgorICAgICAqIE9uIGZhaWx1cmUsIFNUIEtJTSdzIGxpbmUgZGlzY2lwbGluZSBpbnN0YWxsYXRpb24gdGltZXMgb3V0LCBhbmQgdGhlCisgICAgICogcmVsZXZhbnQgcHJvdG9jb2wgcmVnaXN0ZXIgZmFpbHMKKyAgICAgKi8KKyAgICBpZiAoc3Rfc3RhdGUgPT0gSU5TVEFMTF9OX1RJX1dMKSB7CisgICAgICAgIFVJTV9WRVIoIiBzaWduYWwgcmVjZWl2ZWQsIG9wZW5pbmcgJXMiLCB1YXJ0X2Rldl9uYW1lKTsKKyAgICAgICAgZGV2X2ZkID0gb3Blbih1YXJ0X2Rldl9uYW1lLCBPX1JEV1IpOworICAgICAgICBpZiAoZGV2X2ZkIDwgMCkgeworICAgICAgICAgICAgVUlNX0VSUigiIENhbid0IG9wZW4gJXMiLCB1YXJ0X2Rldl9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICAgKiBTZXQgb25seSB0aGUgZGVmYXVsdCBiYXVkIHJhdGUuCisgICAgICAgICAqIFRoaXMgd2lsbCBzZXQgdGhlIGJhdWQgcmF0ZSB0byBkZWZhdWx0IDExNTIwMAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNldF9iYXVkX3JhdGUoKSA8IDApIHsKKyAgICAgICAgICAgIFVJTV9FUlIoIiBzZXRfYmF1ZHJhdGUoKSBmYWlsZWQiKTsKKyAgICAgICAgICAgIGNsb3NlKGRldl9mZCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBmY250bChkZXZfZmQsIEZfU0VURkwsZmNudGwoZGV2X2ZkLCBGX0dFVEZMKSB8IE9fTk9OQkxPQ0spOworICAgICAgICAvKiBTZXQgb25seSB0aGVjdXN0b20gYmF1ZCByYXRlICovCisgICAgICAgIGlmIChjdXN0X2JhdWRfcmF0ZSkgeworCisgICAgICAgICAgICAvKiBGb3JtaW5nIHRoZSBwYWNrZXQgZm9yIENoYW5nZSBzcGVlZCBjb21tYW5kICovCisgICAgICAgICAgICBjbWQudWFydF9wcmVmaXggPSBIQ0lfQ09NTUFORF9QS1Q7CisgICAgICAgICAgICBjbWQuaGNpX2hkci5vcGNvZGUgPSBIQ0lfSERSX09QQ09ERTsKKyAgICAgICAgICAgIGNtZC5oY2lfaGRyLnBsZW4gPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisgICAgICAgICAgICBjbWQuc3BlZWQgPSBjdXN0X2JhdWRfcmF0ZTsKKworICAgICAgICAgICAgLyogV3JpdGluZyB0aGUgY2hhbmdlIHNwZWVkIGNvbW1hbmQgdG8gdGhlIFVBUlQKKyAgICAgICAgICAgICAqIFRoaXMgd2lsbCBjaGFuZ2UgdGhlIFVBUlQgc3BlZWQgYXQgdGhlIGNvbnRyb2xsZXIKKyAgICAgICAgICAgICAqIHNpZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgVUlNX1ZFUigiIFNldHRpbmcgc3BlZWQgdG8gJWQiLCBjdXN0X2JhdWRfcmF0ZSk7CisgICAgICAgICAgICBsZW4gPSB3cml0ZShkZXZfZmQsICZjbWQsIHNpemVvZihjbWQpKTsKKyAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgICAgICAgICAgVUlNX0VSUigiIEZhaWxlZCB0byB3cml0ZSBzcGVlZC1zZXQgY29tbWFuZCIpOworICAgICAgICAgICAgICAgIGNsb3NlKGRldl9mZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBSZWFkIHRoZSByZXNwb25zZSBmb3IgdGhlIENoYW5nZSBzcGVlZCBjb21tYW5kICovCisgICAgICAgICAgICBpZiAocmVhZF9jb21tYW5kX2NvbXBsZXRlKGRldl9mZCwgSENJX0hEUl9PUENPREUpIDwgMCkgeworICAgICAgICAgICAgICAgIGNsb3NlKGRldl9mZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBVSU1fVkVSKCIgU3BlZWQgY2hhbmdlZCB0byAlZCIsIGN1c3RfYmF1ZF9yYXRlKTsKKworICAgICAgICAgICAgLyogU2V0IHRoZSBhY3R1YWwgY3VzdG9tIGJhdWQgcmF0ZSBhdCB0aGUgaG9zdCBzaWRlICovCisgICAgICAgICAgICBpZiAoc2V0X2N1c3RvbV9iYXVkX3JhdGUoKSA8IDApIHsKKyAgICAgICAgICAgICAgICBVSU1fRVJSKCIgc2V0X2N1c3RvbV9iYXVkX3JhdGUoKSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBjbG9zZShkZXZfZmQpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTZXQgdGhlIHVpbSBCRCBhZGRyZXNzICovCisgICAgICAgICAgICBpZiAodWltX2JkX2FkZHJlc3NbMF0gIT0gMCkgeworCisgICAgICAgICAgICAgICAgbWVtc2V0KCZhZGRyX2NtZCwgMCwgc2l6ZW9mKGFkZHJfY21kKSk7CisgICAgICAgICAgICAgICAgLyogRm9ybWluZyB0aGUgcGFja2V0IGZvciBjaGFuZ2UgQkQgYWRkcmVzcyBjb21tYW5kKi8KKyAgICAgICAgICAgICAgICBhZGRyX2NtZC51YXJ0X3ByZWZpeCA9IEhDSV9DT01NQU5EX1BLVDsKKyAgICAgICAgICAgICAgICBhZGRyX2NtZC5oY2lfaGRyLm9wY29kZSA9IFdSSVRFX0JEX0FERFJfT1BDT0RFOworICAgICAgICAgICAgICAgIGFkZHJfY21kLmhjaV9oZHIucGxlbiA9IHNpemVvZihiZGFkZHJfdCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZhZGRyX2NtZC5hZGRyLCBiZF9hZGRyLCBzaXplb2YoYmRhZGRyX3QpKTsKKworICAgICAgICAgICAgICAgIC8qIFdyaXRpbmcgdGhlIGNoYW5nZSBCRCBhZGRyZXNzIGNvbW1hbmQgdG8gdGhlIFVBUlQKKyAgICAgICAgICAgICAgICAgKiBUaGlzIHdpbGwgY2hhbmdlIHRoZSBjaGFuZ2UgQkQgYWRkcmVzcyAgYXQgdGhlIGNvbnRyb2xsZXIKKyAgICAgICAgICAgICAgICAgKiBzaWRlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbGVuID0gd3JpdGUoZGV2X2ZkLCAmYWRkcl9jbWQsIHNpemVvZihhZGRyX2NtZCkpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIFVJTV9FUlIoIiBGYWlsZWQgdG8gd3JpdGUgQkQgYWRkcmVzcyBjb21tYW5kIik7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlKGRldl9mZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSByZXNwb25zZSBmb3IgdGhlIGNoYW5nZSBCRCBhZGRyZXNzIGNvbW1hbmQgKi8KKyAgICAgICAgICAgICAgICBpZiAocmVhZF9jb21tYW5kX2NvbXBsZXRlKGRldl9mZCwgV1JJVEVfQkRfQUREUl9PUENPREUpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBjbG9zZShkZXZfZmQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVUlNX1ZFUigiIEJEIGFkZHJlc3MgY2hhbmdlZCB0byAlcyIsIHVpbV9iZF9hZGRyZXNzKTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBVSU1fREVCVUcKKyAgICAgICAgICAgIHJlYWRfZmlybXdhcmVfdmVyc2lvbigpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICAvKiBBZnRlciB0aGUgVUFSVCBzcGVlZCBoYXMgYmVlbiBjaGFuZ2VkLCB0aGUgSU9DVEwgaXMKKyAgICAgICAgICogaXMgY2FsbGVkIHRvIHNldCB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIE5fVElfV0wKKyAgICAgICAgICovCisgICAgICAgIGxkaXNjID0gbGluZV9kaXNjaXBsaW5lOworICAgICAgICBpZiAoaW9jdGwoZGV2X2ZkLCBUSU9DU0VURCwgJmxkaXNjKSA8IDApIHsKKyAgICAgICAgICAgIFVJTV9FUlIoIiBDYW4ndCBzZXQgbGluZSBkaXNjaXBsaW5lIik7CisgICAgICAgICAgICBjbG9zZShkZXZfZmQpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgVUlNX0RCRygiIEluc3RhbGxlZCBOX1RJX1dMIExpbmUgZGlzcGxpbmUiKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFVJTV9EQkcoIiBVbi1JbnN0YWxsZWQgTl9USV9XTCBMaW5lIGRpc3BsaW5lIik7CisgICAgICAgIC8qIFVOSU5TVEFMTF9OX1RJX1dMIC0gV2hlbiB0aGUgU2lnbmFsIGlzIHJlY2VpdmVkIGZyb20gS0lNICovCisgICAgICAgIC8qIGNsb3NpbmcgVUFSVCBmZCAqLworICAgICAgICBjbG9zZShkZXZfZmQpOworICAgIH0KKyAgICBwcmV2X3N0X3N0YXRlID0gc3Rfc3RhdGU7CisgICAgcmV0dXJuIDA7Cit9CitpbnQgcmVtb3ZlX21vZHVsZXMoKQoreworICAgIGludCBlcnIgPSAwOworCisjaWZkZWYgQU5EUk9JRAorICAgIFVJTV9WRVIoIiBSZW1vdmluZyBncHNfZHJ2ICIpOworICAgIGlmIChybW1vZCgiZ3BzX2RydiIpICE9IDApIHsKKyAgICAgICAgVUlNX0VSUigiIEVycm9yIHJlbW92aW5nIGdwc19kcnYgbW9kdWxlIik7CisgICAgICAgIGVyciA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIFVJTV9EQkcoIiBSZW1vdmVkIGdwc19kcnYgbW9kdWxlIik7CisgICAgfQorCisgICAgVUlNX1ZFUigiIFJlbW92aW5nIGZtX2RydiAiKTsKKyAgICBpZiAocm1tb2QoImZtX2RydiIpICE9IDApIHsKKyAgICAgICAgVUlNX0VSUigiIEVycm9yIHJlbW92aW5nIGZtX2RydiBtb2R1bGUiKTsKKyAgICAgICAgZXJyID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVUlNX0RCRygiIFJlbW92ZWQgZm1fZHJ2IG1vZHVsZSIpOworICAgIH0KKyAgICBVSU1fREJHKCIgUmVtb3ZlZCBmbV9kcnYgbW9kdWxlIik7CisKKyAgICBVSU1fVkVSKCIgUmVtb3ZpbmcgYnRfZHJ2ICIpOworCisgICAgaWYgKHJtbW9kKCJidF9kcnYiKSAhPSAwKSB7CisgICAgICAgIFVJTV9FUlIoIiBFcnJvciByZW1vdmluZyBidF9kcnYgbW9kdWxlIik7CisgICAgICAgIGVyciA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIFVJTV9EQkcoIiBSZW1vdmVkIGJ0X2RydiBtb2R1bGUiKTsKKyAgICB9CisgICAgVUlNX0RCRygiIFJlbW92ZWQgYnRfZHJ2IG1vZHVsZSIpOworCisgICAgLypSZW1vdmUgdGhlIFNoYXJlZCBUcmFuc3BvcnQgKi8KKyAgICBVSU1fVkVSKCIgUmVtb3Zpbmcgc3RfZHJ2ICIpOworCisgICAgaWYgKHJtbW9kKCJzdF9kcnYiKSAhPSAwKSB7CisgICAgICAgIFVJTV9FUlIoIiBFcnJvciByZW1vdmluZyBzdF9kcnYgbW9kdWxlIik7CisgICAgICAgIGVyciA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIFVJTV9EQkcoIiBSZW1vdmVkIHN0X2RydiBtb2R1bGUgIik7CisgICAgfQorICAgIFVJTV9EQkcoIiBSZW1vdmVkIHN0X2RydiBtb2R1bGUgIik7CisjZWxzZQorI2lmIElOQ0xVREVfRk0KKyAgICBVSU1fVkVSKCIgUmVtb3ZpbmcgZm1fZHJ2ICIpOworICAgIGlmIChzeXN0ZW0oInJtbW9kIGZtX2RydiIpICE9IDApIHsKKyAgICAgICAgVUlNX0VSUigiIEVycm9yIHJlbW92aW5nIGZtX2RydiBtb2R1bGUiKTsKKyAgICAgICAgZXJyID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVUlNX0RCRygiIFJlbW92ZWQgZm1fZHJ2IG1vZHVsZSIpOworICAgIH0KKyNlbmRpZiAvKiBJTkNMVURFX0ZNICovCisgICAgVUlNX1ZFUigiIFJlbW92aW5nIGJ0X2RydiAiKTsKKyAgICBpZiAoc3lzdGVtKCJybW1vZCBidF9kcnYiKSAhPSAwKSB7CisgICAgICAgIFVJTV9FUlIoIiBFcnJvciByZW1vdmluZyBidF9kcnYgbW9kdWxlIik7CisgICAgICAgIGVyciA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIFVJTV9EQkcoIiBSZW1vdmVkIGJ0X2RydiBtb2R1bGUiKTsKKyAgICB9CisKKyAgICAvKlJlbW92ZSB0aGUgU2hhcmVkIFRyYW5zcG9ydCAqLworICAgIFVJTV9WRVIoIiBSZW1vdmluZyBzdF9kcnYgIik7CisKKyAgICBpZiAoc3lzdGVtKCJybW1vZCBzdF9kcnYiKSAhPSAwKSB7CisgICAgICAgIFVJTV9FUlIoIiBFcnJvciByZW1vdmluZyBzdF9kcnYgbW9kdWxlIik7CisgICAgICAgIGVyciA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIFVJTV9EQkcoIiBSZW1vdmVkIHN0X2RydiBtb2R1bGUgIik7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIGVycjsKK30KKworaW50IGNoYW5nZV9yZmtpbGxfcGVybXModm9pZCkKK3sKKyAgICBpbnQgZmQsIGlkLCBzejsKKyAgICBjaGFyIHBhdGhbNjRdOworICAgIGNoYXIgYnVmWzE2XTsKKyAgICBmb3IgKGlkID0gMDsgaWQgPCA1MDsgaWQrKykgeworICAgICAgICBzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIvc3lzL2NsYXNzL3Jma2lsbC9yZmtpbGwlZC90eXBlIiwgaWQpOworICAgICAgICBmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworICAgICAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgICAgICBVSU1fREJHKCJvcGVuKCVzKSBmYWlsZWQ6ICVzICglZClcbiIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3ogPSByZWFkKGZkLCAmYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgaWYgKHN6ID49IDkgJiYgbWVtY21wKGJ1ZiwgImJsdWV0b290aCIsIDkpID09IDApIHsKKyAgICAgICAgICAgIFVJTV9EQkcoImZvdW5kIGJsdWV0b290aCByZmtpbGwgZW50cnkgQCAlZFxuIiwgaWQpOworICAgICAgICAgICAgcmZraWxsX2lkeCA9IGlkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGlkID09IDUwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisjaWZkZWYgQU5EUk9JRAorICAgIHNwcmludGYocGF0aCwgIi9zeXMvY2xhc3MvcmZraWxsL3Jma2lsbCVkL3N0YXRlIiwgaWQpOworICAgIHN6ID0gY2hvd24ocGF0aCwgQUlEX0JMVUVUT09USCwgQUlEX0JMVUVUT09USCk7CisgICAgaWYgKHN6IDwgMCkgeworICAgICAgICBVSU1fRVJSKCJjaGFuZ2UgbW9kZSBmYWlsZWQgZm9yICVzICglZClcbiIsIHBhdGgsIGVycm5vKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyNlbmRpZiAvKiBBTkRST0lEICovCisgICAgLyoKKyAgICAgKiBibHVldG9vdGggZ3JvdXAncyB1c2VyIHN5c3RlbSBuZWVkcyB3cml0ZSBwZXJtaXNzaW9uCisgICAgICovCisgICAgc3ogPSBjaG1vZChwYXRoLCAwNjYwKTsKKyAgICBpZiAoc3ogPCAwKSB7CisgICAgICAgIFVJTV9FUlIoImNoYW5nZSBtb2RlIGZhaWxlZCBmb3IgJXMgKCVkKVxuIiwgcGF0aCwgZXJybm8pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFVJTV9EQkcoImNoYW5nZWQgcGVybWlzc2lvbnMgZm9yICVzKCVkKSBcbiIsIHBhdGgsIHN6KTsKKyAgICAvKiBlbmQgb2YgY2hhbmdlX3Blcm1zICovCisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCAqYnRfbWFsbG9jKHNpemVfdCBzaXplKQoreworICAgIHJldHVybiBtYWxsb2Moc2l6ZSk7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGNvbnZlcnQgdGhlIEJEIGFkZHJlc3MgZnJvbSBhc2NpaSB0byBoZXggdmFsdWUgKi8KK2JkYWRkcl90ICpzdHJ0b2JhKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBjb25zdCBjaGFyICpwdHIgPSBzdHI7CisgICAgaW50IGk7CisKKyAgICB1aW50OF90ICpiYSA9IGJ0X21hbGxvYyhzaXplb2YoYmRhZGRyX3QpKTsKKyAgICBpZiAoIWJhKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgYmFbaV0gPSAodWludDhfdCkgc3RydG9sKHB0ciwgTlVMTCwgMTYpOworICAgICAgICBpZiAoaSAhPSA1ICYmICEocHRyID0gc3RyY2hyKHB0ciwgJzonKSkpIHsKKyAgICAgICAgICAgIHB0ciA9ICI6MDA6MDA6MDA6MDA6MDAiOworICAgICAgICB9CisgICAgICAgIHB0cisrOworICAgIH0KKworICAgIHJldHVybiAoYmRhZGRyX3QgKikgYmE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgaW50IHN0X2ZkLGVycjsKKyAgICBzdHJ1Y3Qgc3RhdCBmaWxlX3N0YXQ7CisjaWZuZGVmIEFORFJPSUQgICAgICAgIC8qIHVzZWQgb24gdWJ1bnR1ICovCisgICAgY2hhciAqdGlzdF9rb19wYXRoOworICAgIHN0cnVjdCB1dHNuYW1lIG5hbWU7CisjZW5kaWYKKyAgICBzdHJ1Y3QgcG9sbGZkICAgcDsKKyAgICBzaWdzZXRfdCAgICAgICAgc2lnczsKKworICAgIFVJTV9TVEFSVF9GVU5DKCk7CisgICAgZXJyID0gMDsKKworICAgIC8qIFBhcnNlIHRoZSB1c2VyIGlucHV0ICovCisgICAgaWYgKChhcmdjID09IDUpIHx8IChhcmdjID09IDYpKSB7CisgICAgICAgIHN0cmNweSh1YXJ0X2Rldl9uYW1lLCBhcmd2WzFdKTsKKyAgICAgICAgdWFydF9iYXVkX3JhdGUgPSBhdG9pKGFyZ3ZbMl0pOworICAgICAgICB1YXJ0X2Zsb3dfY29udHJvbCA9IGF0b2koYXJndlszXSk7CisgICAgICAgIGxpbmVfZGlzY2lwbGluZSA9IGF0b2koYXJndls0XSk7CisKKyAgICAgICAgLyogRGVwZW5kaW5nIHVwb24gdGhlIGJhdWQgcmF0ZSB2YWx1ZSwgZGlmZmVyZW50aWF0ZQorICAgICAgICAgKiB0aGUgY3VzdG9tIGJhdWQgcmF0ZSBhbmQgZGVmYXVsdCBiYXVkIHJhdGUKKyAgICAgICAgICovCisgICAgICAgIHN3aXRjaCAodWFydF9iYXVkX3JhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgMTE1MjAwOgorICAgICAgICAgICAgICAgIFVJTV9WRVIoIiBCYXVkcmF0ZSAxMTUyMDAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTYwMDoKKyAgICAgICAgICAgIGNhc2UgMTkyMDA6CisgICAgICAgICAgICBjYXNlIDM4NDAwOgorICAgICAgICAgICAgY2FzZSA1NzYwMDoKKyAgICAgICAgICAgIGNhc2UgMjMwNDAwOgorICAgICAgICAgICAgY2FzZSA0NjA4MDA6CisgICAgICAgICAgICBjYXNlIDUwMDAwMDoKKyAgICAgICAgICAgIGNhc2UgNTc2MDAwOgorICAgICAgICAgICAgY2FzZSA5MjE2MDA6CisgICAgICAgICAgICBjYXNlIDEwMDAwMDA6CisgICAgICAgICAgICBjYXNlIDExNTIwMDA6CisgICAgICAgICAgICBjYXNlIDE1MDAwMDA6CisgICAgICAgICAgICBjYXNlIDIwMDAwMDA6CisgICAgICAgICAgICBjYXNlIDI1MDAwMDA6CisgICAgICAgICAgICBjYXNlIDMwMDAwMDA6CisgICAgICAgICAgICBjYXNlIDM1MDAwMDA6CisgICAgICAgICAgICBjYXNlIDM2ODY0MDA6CisgICAgICAgICAgICBjYXNlIDQwMDAwMDA6CisgICAgICAgICAgICAgICAgY3VzdF9iYXVkX3JhdGUgPSB1YXJ0X2JhdWRfcmF0ZTsKKyAgICAgICAgICAgICAgICBVSU1fVkVSKCIgQmF1ZHJhdGUgJWQiLCBjdXN0X2JhdWRfcmF0ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFVJTV9FUlIoIiBJbmF2YWxpZCBCYXVkIFJhdGUiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCgmdWltX2JkX2FkZHJlc3MsIDAsIHNpemVvZih1aW1fYmRfYWRkcmVzcykpOworICAgIH0gZWxzZSB7CisgICAgICAgIFVJTV9FUlIoIiBJbnZhbGlkIGFyZ3VlbWVudHMiKTsKKyAgICAgICAgVUlNX0VSUigiIFVzYWdlOiB1aW0gW1VhcnQgZGV2aWNlXSBbQmF1ZCByYXRlXSBbRmxvdyBjb250cm9sXSBbTGluZSBkaXNjaXBsaW5lXSA8YmQgYWRkcmVzcz4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoYXJnYyA9PSA2KSB7CisgICAgICAgIC8qIEJEIGFkZHJlc3MgcGFzc2VkIGFzIHN0cmluZyBpbiB4eDp4eDp4eDp4eDp4eDp4eCBmb3JtYXQgKi8KKyAgICAgICAgc3RyY3B5KHVpbV9iZF9hZGRyZXNzLCBhcmd2WzVdKTsKKyAgICAgICAgYmRfYWRkciA9IHN0cnRvYmEodWltX2JkX2FkZHJlc3MpOworICAgIH0KKworCisjaWZuZGVmIEFORFJPSUQKKyAgICBpZiAodW5hbWUgKCZuYW1lKSA9PSAtMSkgeworICAgICAgICBVSU1fRVJSKCJjYW5ub3QgZ2V0IGtlcm5lbCByZWxlYXNlIG5hbWUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyNlbHNlICAvKiBpZiBBTkRST0lEICovCisKKyAgICBpZiAoMCA9PSBsc3RhdCgiL3N0X2Rydi5rbyIsICZmaWxlX3N0YXQpKSB7CisgICAgICAgIGlmIChpbnNtb2QoIi9zdF9kcnYua28iLCAiIikgPCAwKSB7CisgICAgICAgICAgICBVSU1fRVJSKCIgRXJyb3IgaW5zZXJ0aW5nIHN0X2RydiBtb2R1bGUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFVJTV9EQkcoIiBJbnNlcnRlZCBzdF9kcnYgbW9kdWxlIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoMCA9PSBsc3RhdCgiL2Rldi9yZmtpbGwiLCAmZmlsZV9zdGF0KSkgeworICAgICAgICAgICAgVUlNX0RCRygiU1QgYnVpbHQgaW50byB0aGUga2VybmVsID8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFVJTV9FUlIoIkJUL0ZNL0dQUyB3b3VsZCBiZSB1bmF2YWlsYWJsZSBvbiBzeXN0ZW0iKTsKKyAgICAgICAgICAgIFVJTV9FUlIoIiByZmtpbGwgZGV2aWNlICcvZGV2L3Jma2lsbCcgbm90IGZvdW5kICIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyNpZm5kZWYgQU5EUk9JRAorICAgIC8qLS0gSW5zbW9kIG9mIFNUIGRyaXZlciAtLSovCisgICAgYXNwcmludGYoJnRpc3Rfa29fcGF0aCwKKyAgICAgICAgICAgICIvbGliL21vZHVsZXMvJXMva2VybmVsL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9kcnYua28iLG5hbWUucmVsZWFzZSk7CisgICAgaWYgKDAgPT0gbHN0YXQodGlzdF9rb19wYXRoLCAmZmlsZV9zdGF0KSkgeworICAgICAgICBpZiAoc3lzdGVtKCJpbnNtb2QgL2xpYi9tb2R1bGVzL2B1bmFtZSAtcmAva2VybmVsL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9kcnYua28iKSAhPSAwKSB7CisgICAgICAgICAgICBVSU1fRVJSKCIgRXJyb3IgaW5zZXJ0aW5nIHN0X2RydiBtb2R1bGUiKTsKKyAgICAgICAgICAgIGZyZWUodGlzdF9rb19wYXRoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFVJTV9EQkcoIiBJbnNlcnRlZCBzdF9kcnYgbW9kdWxlIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBVSU1fRVJSKCJTVCBkcml2ZXIgYnVpbHQgaW50byB0aGUga2VybmVsID8iKTsKKyAgICB9CisgICAgZnJlZSh0aXN0X2tvX3BhdGgpOworI2VuZGlmCisKKyAgICBpZiAoY2hhbmdlX3Jma2lsbF9wZXJtcygpIDwgMCkgeworICAgICAgICAvKiBwb3NzaWJsZSBlcnJvciBjb25kaXRpb24gKi8KKyAgICAgICAgVUlNX0VSUigicmZraWxsIG5vdCBlbmFibGVkIGluIHN0X2RydiAtIEJUIG9uIGZyb20gVUkgbWlnaHQgZmFpbFxuIik7CisgICAgfQorCisjaWZuZGVmIEFORFJPSUQKKyAgICAvKi0tIEluc21vZCBvZiBCVCBkcml2ZXIgLS0qLworICAgIGFzcHJpbnRmKCZ0aXN0X2tvX3BhdGgsCisgICAgICAgICAgICAiL2xpYi9tb2R1bGVzLyVzL2tlcm5lbC9kcml2ZXJzL3N0YWdpbmcvdGktc3QvYnRfZHJ2LmtvIixuYW1lLnJlbGVhc2UpOworICAgIGlmICgwID09IGxzdGF0KHRpc3Rfa29fcGF0aCwgJmZpbGVfc3RhdCkpIHsKKyAgICAgICAgaWYgKHN5c3RlbSgiaW5zbW9kIC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgL2tlcm5lbC9kcml2ZXJzL3N0YWdpbmcvdGktc3QvYnRfZHJ2LmtvIikgIT0gMCkgeworICAgICAgICAgICAgVUlNX0VSUigiIEVycm9yIGluc2VydGluZyBidF9kcnYgbW9kdWxlIik7CisgICAgICAgICAgICBzeXN0ZW0oInJtbW9kIHN0X2RydiIpOworICAgICAgICAgICAgZnJlZSh0aXN0X2tvX3BhdGgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVUlNX0RCRygiIEluc2VydGVkIGJ0X2RydiBtb2R1bGUiKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIFVJTV9FUlIoIkJUIGRyaXZlciBidWlsdCBpbnRvIHRoZSBrZXJuZWwgPyIpOworICAgIH0KKyAgICBmcmVlKHRpc3Rfa29fcGF0aCk7CisKKyNpZiBJTkNMVURFX0ZNCisgICAgLyotLSBJbnNtb2Qgb2YgRk0gZHJpdmVyIC0tKi8KKyAgICBhc3ByaW50ZigmdGlzdF9rb19wYXRoLAorICAgICAgICAgICAgIi9saWIvbW9kdWxlcy8lcy9rZXJuZWwvZHJpdmVycy9zdGFnaW5nL3RpLXN0L2ZtX2Rydi5rbyIsbmFtZS5yZWxlYXNlKTsKKyAgICBpZiAoMCA9PSBsc3RhdCh0aXN0X2tvX3BhdGgsICZmaWxlX3N0YXQpKSB7CisgICAgICAgIGlmIChzeXN0ZW0oImluc21vZCAvbGliL21vZHVsZXMvYHVuYW1lIC1yYC9rZXJuZWwvZHJpdmVycy9zdGFnaW5nL3RpLXN0L2ZtX2Rydi5rbyIpICE9IDApIHsKKyAgICAgICAgICAgIFVJTV9FUlIoIiBFcnJvciBpbnNlcnRpbmcgZm1fZHJ2IG1vZHVsZSIpOworICAgICAgICAgICAgc3lzdGVtKCJybW1vZCBidF9kcnYiKTsKKyAgICAgICAgICAgIHN5c3RlbSgicm1tb2Qgc3RfZHJ2Iik7CisgICAgICAgICAgICBmcmVlKHRpc3Rfa29fcGF0aCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBVSU1fREJHKCIgSW5zZXJ0ZWQgZm1fZHJ2IG1vZHVsZSIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgVUlNX0VSUigiRk0gZHJpdmVyIGJ1aWx0IGludG8gdGhlIGtlcm5lbCA/Iik7CisgICAgfQorICAgIGZyZWUodGlzdF9rb19wYXRoKTsKKyNlbmRpZiAvKiBJTkNMVURFX0ZNICovCisjZWxzZSAgLyogaWYgQU5EUk9JRCAqLworICAgIGlmICgwID09IGxzdGF0KCIvYnRfZHJ2LmtvIiwgJmZpbGVfc3RhdCkpIHsKKyAgICAgICAgaWYgKGluc21vZCgiL2J0X2Rydi5rbyIsICIiKSA8IDApIHsKKyAgICAgICAgICAgIFVJTV9FUlIoIiBFcnJvciBpbnNlcnRpbmcgYnRfZHJ2IG1vZHVsZSwgTk8gQlQ/ICIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVUlNX0RCRygiIEluc2VydGVkIGJ0X2RydiBtb2R1bGUiKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIFVJTV9EQkcoIkJUIGRyaXZlciBtb2R1bGUgdW4tYXZhaWxhYmxlLi4uICIpOworICAgICAgICBVSU1fREJHKCJCVCBkcml2ZXIgYnVpbHQgaW50byB0aGUga2VybmVsID8iKTsKKyAgICB9CisKKyAgICBpZiAoMCA9PSBsc3RhdCgiL2ZtX2Rydi5rbyIsICZmaWxlX3N0YXQpKSB7CisgICAgICAgIGlmIChpbnNtb2QoIi9mbV9kcnYua28iLCAiIikgPCAwKSB7CisgICAgICAgICAgICBVSU1fRVJSKCIgRXJyb3IgaW5zZXJ0aW5nIGZtX2RydiBtb2R1bGUsIE5PIEZNPyAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFVJTV9EQkcoIiBJbnNlcnRlZCBmbV9kcnYgbW9kdWxlIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBVSU1fREJHKCJGTSBkcml2ZXIgbW9kdWxlIHVuLWF2YWlsYWJsZS4uLiAiKTsKKyAgICAgICAgVUlNX0RCRygiRk0gZHJpdmVyIGJ1aWx0IGludG8gdGhlIGtlcm5lbCA/Iik7CisgICAgfQorCisgICAgaWYgKDAgPT0gbHN0YXQoIi9ncHNfZHJ2LmtvIiwgJmZpbGVfc3RhdCkpIHsKKyAgICAgICAgaWYgKGluc21vZCgiL2dwc19kcnYua28iLCAiIikgPCAwKSB7CisgICAgICAgICAgICBVSU1fRVJSKCIgRXJyb3IgaW5zZXJ0aW5nIGdwc19kcnYgbW9kdWxlLCBOTyBHUFM/ICIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVUlNX0RCRygiIEluc2VydGVkIGdwc19kcnYgbW9kdWxlIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBVSU1fREJHKCJHUFMgZHJpdmVyIG1vZHVsZSB1bi1hdmFpbGFibGUuLi4gIik7CisgICAgICAgIFVJTV9EQkcoIkdQUyBkcml2ZXIgYnVpbHQgaW50byB0aGUga2VybmVsID8iKTsKKyAgICB9CisKKyAgICBpZiAoY2htb2QoIi9kZXYvdGlmbSIsIDA2NjYpIDwgMCkgeworICAgICAgICBVSU1fRVJSKCJ1bmFibGUgdG8gY2htb2QgL2Rldi90aWZtIik7CisgICAgfQorI2VuZGlmCisgICAgLyogcmZraWxsIGRldmljZSdzIG9wZW4vcG9sbC9yZWFkICovCisgICAgc3RfZmQgPSBvcGVuKCIvZGV2L3Jma2lsbCIsIE9fUkRPTkxZKTsKKyAgICBpZiAoc3RfZmQgPCAwKSB7CisgICAgICAgIFVJTV9EQkcoInVuYWJsZSB0byBvcGVuIC9kZXYvcmZraWxsICglcykiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZW1vdmVfbW9kdWxlcygpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisKKyAgICBwLmZkID0gc3RfZmQ7CisgICAgcC5ldmVudHMgPSBQT0xMRVJSIHwgUE9MTEhVUCB8IFBPTExPVVQgfCBQT0xMSU47CisKKyAgICBzaWdmaWxsc2V0KCZzaWdzKTsKKyAgICBzaWdkZWxzZXQoJnNpZ3MsIFNJR0NITEQpOworICAgIHNpZ2RlbHNldCgmc2lncywgU0lHUElQRSk7CisgICAgc2lnZGVsc2V0KCZzaWdzLCBTSUdURVJNKTsKKyAgICBzaWdkZWxzZXQoJnNpZ3MsIFNJR0lOVCk7CisgICAgc2lnZGVsc2V0KCZzaWdzLCBTSUdIVVApOworCitSRV9QT0xMOgorICAgIHdoaWxlICghZXhpdGluZykgeworICAgICAgICBwLnJldmVudHMgPSAwOworI2lmZGVmIEFORFJPSUQKKyAgICAgICAgZXJyID0gcHBvbGwoJnAsIDEsIE5VTEwsICZzaWdzKTsKKyNlbHNlCisgICAgICAgIGVyciA9IHBvbGwoJnAsIDEsIC0xKTsKKyNlbmRpZiAvKiBBTkRST0lEICovCisgICAgICAgIGlmIChlcnIgPCAwICYmIGVycm5vID09IEVJTlRSKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWV4aXRpbmcpIHsKKyAgICAgICAgZXJyID0gcmVhZChzdF9mZCwgJnJmX2V2ZW50LCBzaXplb2YocmZfZXZlbnQpKTsKKyAgICAgICAgVUlNX0RCRygicmZfZXZlbnQ6ICVkLCAlZCwgJWQsICVkLCAlZFxuIiwgcmZfZXZlbnQuaWR4LAorICAgICAgICAgICAgICAgIHJmX2V2ZW50LnR5cGUsIHJmX2V2ZW50Lm9wICxyZl9ldmVudC5oYXJkLAorICAgICAgICAgICAgICAgIHJmX2V2ZW50LnNvZnQpOworICAgICAgICBpZiAoKHJmX2V2ZW50Lm9wID09IFJGS0lMTF9PUF9DSEFOR0UpICYmCisgICAgICAgICAgICAgICAgKHJmX2V2ZW50LmlkeCA9PSByZmtpbGxfaWR4KSkgeworICAgICAgICAgICAgaWYgKHJmX2V2ZW50LmhhcmQgPT0gMSkgLyogaGFyZCBibG9ja2VkICovIHsKKyAgICAgICAgICAgICAgICBzdF9zdGF0ZSA9IFVOSU5TVEFMTF9OX1RJX1dMOworICAgICAgICAgICAgfSBlbHNlICAgIC8qIHVuYmxvY2tlZCAqLyB7CisgICAgICAgICAgICAgICAgc3Rfc3RhdGUgPSBJTlNUQUxMX05fVElfV0w7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwcmV2X3N0X3N0YXRlICE9IHN0X3N0YXRlKSB7CisgICAgICAgICAgICAgICAgc3Rfc2lnX2hhbmRsZXIoU0lHVVNSMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ290byBSRV9QT0xMOworICAgIH0KKworICAgIGlmKHJlbW92ZV9tb2R1bGVzKCkgPCAwKSB7CisgICAgICAgIFVJTV9FUlIoIiBFcnJvciByZW1vdmluZyBtb2R1bGVzICIpOworICAgICAgICBjbG9zZShzdF9mZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBjbG9zZShzdF9mZCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tYWM4MDIxMS90aS11dGlscy91aW1fcmZraWxsL3VpbS5oIGIvbWFjODAyMTEvdGktdXRpbHMvdWltX3Jma2lsbC91aW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzczZmFmCi0tLSAvZGV2L251bGwKKysrIGIvbWFjODAyMTEvdGktdXRpbHMvdWltX3Jma2lsbC91aW0uaApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqICBVc2VyIE1vZGUgSW5pdCBtYW5hZ2VyIC0gRm9yIHNoYXJlZCB0cmFuc3BvcnQKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTtpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgVUlNX0gKKyNkZWZpbmUgVUlNX0gKKworLyogUGFyYW1hdGVycyB0byBzZXQgdGhlIGJhdWQgcmF0ZSovCisjZGVmaW5lICBGTE9XX0NUTCAgICAgICAweDAwMDEKKyNkZWZpbmUgIEJPVEhFUiAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgIEFSTV9OQ0NTICAgICAgIDE5CisKKyNkZWZpbmUgVENHRVRTMiAgICAgIF9JT1IoJ1QnLDB4MkEsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTMiAgICAgIF9JT1coJ1QnLDB4MkIsIHN0cnVjdCB0ZXJtaW9zMikKKworLypIQ0kgQ29tbWFuZCBhbmQgRXZlbnQgaW5mb3JtYXRpb24qLworI2RlZmluZSBIQ0lfSERSX09QQ09ERSAgICAgICAgICAweGZmMzYKKyNkZWZpbmUgV1JJVEVfQkRfQUREUl9PUENPREUgICAgMHhGQzA2CisjZGVmaW5lIFJFU1BfUFJFRklYICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgTUFYX1RSWSAgICAgICAgICAgICAgICAgMTAKKworLyogSENJIFBhY2tldCB0eXBlcyAqLworI2RlZmluZSBIQ0lfQ09NTUFORF9QS1QgICAgICAgICAweDAxCisjZGVmaW5lIEhDSV9FVkVOVF9QS1QgICAgICAgICAgIDB4MDQKKworLyogSENJIGNvbW1hbmQgbWFjcm9zKi8KKyNkZWZpbmUgSENJX0VWRU5UX0hEUl9TSVpFICAgICAgICAgICAgICAyCisjZGVmaW5lIEhDSV9DT01NQU5EX0hEUl9TSVpFICAgICAgICAgICAgMworI2RlZmluZSBVSU1fV1JJVEVfQkRfQUREUl9DUF9TSVpFICAgICAgIDYKKworCisvKiBIQ0kgZXZlbnQgbWFjcm9zKi8KKyNkZWZpbmUgRVZUX0NNRF9DT01QTEVURV9TSVpFICAgMworI2RlZmluZSBFVlRfQ01EX1NUQVRVU19TSVpFICAgICA0CisjZGVmaW5lIEVWVF9DTURfQ09NUExFVEUgICAgICAgIDB4MEUKKyNkZWZpbmUgRVZUX0NNRF9TVEFUVVMgICAgICAgICAgMHgwRgorCisKKyNkZWZpbmUgVkVSQk9TRQorI2lmbmRlZiBBTkRST0lECisjZGVmaW5lIExPR0UgcHJpbnRmCisjZW5kaWYgLyogQU5EUk9JRCAqLworI2RlZmluZSBMT0dfVEFHICJ1aW0tcmZraWxsOiAiCisjZGVmaW5lIFVJTV9FUlIoZm10LCBhcmcuLi4pICBMT0dFKCJ1aW06ImZtdCJcbiIgLCAjI2FyZykKKyNpZiBkZWZpbmVkKFVJTV9ERUJVRykgICAgICAgICAgLyogbGltaXRlZCBkZWJ1ZyBtZXNzYWdlcyAqLworI2RlZmluZSBVSU1fU1RBUlRfRlVOQygpICAgICAgTE9HRSgidWltOiBJbnNpZGUgJXNcbiIsIF9fRlVOQ1RJT05fXykKKyNkZWZpbmUgVUlNX0RCRyhmbXQsIGFyZy4uLikgIExPR0UoInVpbToiZm10IlxuIiAsICMjIGFyZykKKyNkZWZpbmUgVUlNX1ZFUihmbXQsIGFyZy4uLikKKyNlbGlmIGRlZmluZWQoVkVSQk9TRSkgICAgICAgICAgLyogdmVyeSB2ZXJib3NlICovCisjZGVmaW5lIFVJTV9TVEFSVF9GVU5DKCkgICAgICBMT0dFKCJ1aW06IEluc2lkZSAlc1xuIiwgX19GVU5DVElPTl9fKQorI2RlZmluZSBVSU1fREJHKGZtdCwgYXJnLi4uKSAgTE9HRSgidWltOiJmbXQiXG4iICwgIyMgYXJnKQorI2RlZmluZSBVSU1fVkVSKGZtdCwgYXJnLi4uKSAgTE9HRSgidWltOiJmbXQiXG4iICwgIyMgYXJnKQorI2Vsc2UgLyogZXJyb3IgbXNncyBvbmx5ICovCisjZGVmaW5lIFVJTV9TVEFSVF9GVU5DKCkKKyNkZWZpbmUgVUlNX0RCRyhmbXQsIGFyZy4uLikKKyNkZWZpbmUgVUlNX1ZFUihmbXQsIGFyZy4uLikKKyNlbmRpZgorCisvKlRlcm1pb3MyIHN0cnVjdHVyZSBmb3Igc2V0dGluZyB0aGUgQ3VzdG9tIGJhdWQgcmF0ZSovCitzdHJ1Y3QgdGVybWlvczIgeworICAgIHRjZmxhZ190IGNfaWZsYWc7ICAgICAgIC8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKyAgICB0Y2ZsYWdfdCBjX29mbGFnOyAgICAgICAvKiBvdXRwdXQgbW9kZSBmbGFncyAqLworICAgIHRjZmxhZ190IGNfY2ZsYWc7ICAgICAgIC8qIGNvbnRyb2wgbW9kZSBmbGFncyAqLworICAgIHRjZmxhZ190IGNfbGZsYWc7ICAgICAgIC8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKyAgICBjY190IGNfbGluZTsgICAgICAgICAgICAvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKyAgICBjY190IGNfY2NbQVJNX05DQ1NdOyAgICAvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KKyAgICBzcGVlZF90IGNfaXNwZWVkOyAgICAgICAvKiBpbnB1dCBzcGVlZCAqLworICAgIHNwZWVkX3QgY19vc3BlZWQ7ICAgICAgIC8qIG91dHB1dCBzcGVlZCAqLworfTsKKworLyogSENJIGNvbW1hbmQgaGVhZGVyKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MTZfdCAgICAgICAgb3Bjb2RlOyAgICAgICAgIC8qIE9DRiAmIE9HRiAqLworICAgIHVpbnQ4X3QgICAgICAgICBwbGVuOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgICAgICBoY2lfY29tbWFuZF9oZHI7CisKKy8qIEhDSSBldmVudCBoZWFkZXIqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgICAgICBldnQ7CisgICAgdWludDhfdCAgICAgICAgIHBsZW47Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgICAgIGhjaV9ldmVudF9oZHI7CisKKy8qIEhDSSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50Ki8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICAgICAgbmNtZDsKKyAgICB1aW50MTZfdCAgICAgICAgb3Bjb2RlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZXZ0X2NtZF9jb21wbGV0ZTsKKworLyogSENJIGV2ZW50IHN0YXR1cyovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgICAgIHN0YXR1czsKKyAgICB1aW50OF90ICAgICAgICAgbmNtZDsKKyAgICB1aW50MTZfdCAgICAgICAgb3Bjb2RlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZXZ0X2NtZF9zdGF0dXM7CisKKy8qIEhDSSBFdmVudCBzdHJ1Y3R1cmUgdG8gc2V0IHRoZSBjdXNyb20gYmF1ZCByYXRlKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IHVhcnRfcHJlZml4OworICAgIGhjaV9ldmVudF9oZHIgaGNpX2hkcjsKKyAgICBldnRfY21kX2NvbXBsZXRlIGNtZF9jb21wbGV0ZTsKKyAgICB1aW50OF90IHN0YXR1czsKKyAgICB1aW50OF90IGRhdGFbMTZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgY29tbWFuZF9jb21wbGV0ZV90OworCisvKiBIQ0kgQ29tbWFuZCBzdHJ1Y3R1cmUgdG8gc2V0IHRoZSBjdXNyb20gYmF1ZCByYXRlKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IHVhcnRfcHJlZml4OworICAgIGhjaV9jb21tYW5kX2hkciBoY2lfaGRyOworICAgIHVpbnQzMl90IHNwZWVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdWltX3NwZWVkX2NoYW5nZV9jbWQ7CisKKy8qIEJEIGFkZHJlc3Mgc3RydWN0dXJlIHRvIHNldCB0aGUgdWltIEJEIGFkZHJlc3MqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNoYXIgYls2XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYmRhZGRyX3Q7CisKKy8qIEhDSSBDb21tYW5kIHN0cnVjdHVyZSB0byBzZXQgdGhlIHVpbSBCRCBhZGRyZXNzKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IHVhcnRfcHJlZml4OworICAgIGhjaV9jb21tYW5kX2hkciBoY2lfaGRyOworICAgIGJkYWRkcl90IGFkZHI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1aW1fYmRhZGRyX2NoYW5nZV9jbWQ7CisKKy8qIFNpZ25hbCByZWNlaXZlZCBmcm9tIEtJTSB3aWxsIGluc3RhbGwgbGluZSBkaXNjaXBsaW5lIGF0IGZpcnN0LAorICogdGhlIG5leHQgc2lnbmFsIHJlY2VpdmVkIGZyb20gS0lNIHdpbGwgdW4taW5zdGFsbCB0aGUKKyAqIGxpbmUgZGlzY2lwbGluZSovCitlbnVtIHsKKyAgICAvKiBleHBlY3Rpbmcgc2lnbmFsIGZyb20gS0lNIHRvIHNldHVwIHVhcnQgZmQgZm9yIFNUICovCisgICAgSU5TVEFMTF9OX1RJX1dMLAorCisgICAgLyogZXhwZWN0aW5nIHNpZ25hbCBmcm9tIEtJTSB0byBjbG9zZSB1YXJ0IGZkICovCisgICAgVU5JTlNUQUxMX05fVElfV0wsCit9OworCisvKiBGdW5jdGlvbnMgdG8gaW5zZXJ0IGFuZCByZW1vdmUgdGhlIGtlcm5lbCBtb2R1bGVzIGZyb20gdGhlIHN5c3RlbSovCitleHRlcm4gaW50IGluaXRfbW9kdWxlKHZvaWQgKiwgdW5zaWduZWQgaW50LCBjb25zdCBjaGFyICopOworZXh0ZXJuIGludCBkZWxldGVfbW9kdWxlKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50KTsKK2V4dGVybiBpbnQgbG9hZF9maWxlKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50ICopOworCisjZW5kaWYgLyogVUlNX0ggKi8KZGlmZiAtLWdpdCBhL21hYzgwMjExL3dwYV9zdXBwbGljYW50X2xpYi9BbmRyb2lkLm1rIGIvbWFjODAyMTEvd3BhX3N1cHBsaWNhbnRfbGliL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxZDhiZAotLS0gL2Rldi9udWxsCisrKyBiL21hYzgwMjExL3dwYV9zdXBwbGljYW50X2xpYi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNjggQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorICAkKGVycm9yIFRoaXMgbWFrZWZpbGUgbXVzdCBub3QgYmUgaW5jbHVkZWQgd2hlbiBidWlsZGluZyB0aGUgc2ltdWxhdG9yKQorZW5kaWYKKworaWZlcSAoJChXUEFfU1VQUExJQ0FOVF9WRVJTSU9OKSxWRVJfMF82X1gpCisgICAgV1BBX1NVUFBMX0RJUiA9IGV4dGVybmFsL3dwYV9zdXBwbGljYW50XzYvd3BhX3N1cHBsaWNhbnQKK2VuZGlmCisKK2lmZXEgKCQoV1BBX1NVUFBMSUNBTlRfVkVSU0lPTiksVkVSXzBfOF9YKQorICAgIFdQQV9TVVBQTF9ESVIgPSBleHRlcm5hbC93cGFfc3VwcGxpY2FudF84L3dwYV9zdXBwbGljYW50CitlbmRpZgorCitpbmNsdWRlICQoV1BBX1NVUFBMX0RJUikvLmNvbmZpZworCitpZm5lcSAoJChCT0FSRF9XUEFfU1VQUExJQ0FOVF9EUklWRVIpLCkKKyAgQ09ORklHX0RSSVZFUl8kKEJPQVJEX1dQQV9TVVBQTElDQU5UX0RSSVZFUikgOj0geQorZW5kaWYKKworTF9DRkxBR1MgPSAtRENPTkZJR19EUklWRVJfQ1VTVE9NIC1EV1BBX1NVUFBMSUNBTlRfJChXUEFfU1VQUExJQ0FOVF9WRVJTSU9OKQorTF9TUkMgOj0KKworaWZkZWYgQ09ORklHX05PX1NURE9VVF9ERUJVRworTF9DRkxBR1MgKz0gLURDT05GSUdfTk9fU1RET1VUX0RFQlVHCitlbmRpZgorCitpZmRlZiBDT05GSUdfREVCVUdfRklMRQorTF9DRkxBR1MgKz0gLURDT05GSUdfREVCVUdfRklMRQorZW5kaWYKKworaWZkZWYgQ09ORklHX0FORFJPSURfTE9HCitMX0NGTEFHUyArPSAtRENPTkZJR19BTkRST0lEX0xPRworZW5kaWYKKworaWZkZWYgQ09ORklHX0lFRUU4MDIxWF9FQVBPTAorTF9DRkxBR1MgKz0gLURJRUVFODAyMVhfRUFQT0wKK2VuZGlmCisKK2lmZGVmIENPTkZJR19XUFMKK0xfQ0ZMQUdTICs9IC1EQ09ORklHX1dQUworZW5kaWYKKworaWZkZWYgQ09ORklHX0RSSVZFUl9XRVhUCitMX1NSQyArPSBkcml2ZXJfbWFjODAyMTEuYworZW5kaWYKKworaWZkZWYgQ09ORklHX0RSSVZFUl9OTDgwMjExCitMX1NSQyArPSBkcml2ZXJfbWFjODAyMTFfbmwuYworZW5kaWYKKworSU5DTFVERVMgPSAkKFdQQV9TVVBQTF9ESVIpIFwKKyAgICAkKFdQQV9TVVBQTF9ESVIpL3NyYyBcCisgICAgJChXUEFfU1VQUExfRElSKS9zcmMvY29tbW9uIFwKKyAgICAkKFdQQV9TVVBQTF9ESVIpL3NyYy9kcml2ZXJzIFwKKyAgICAkKFdQQV9TVVBQTF9ESVIpL3NyYy9sMl9wYWNrZXQgXAorICAgICQoV1BBX1NVUFBMX0RJUikvc3JjL3V0aWxzIFwKKyAgICAkKFdQQV9TVVBQTF9ESVIpL3NyYy93cHMgXAorICAgIGV4dGVybmFsL2xpYm5sLWhlYWRlcnMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gbGliX2RyaXZlcl9jbWRfd2wxMnh4CitMT0NBTF9NT0RVTEVfVEFHUyA6PSBlbmcKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYyBsaWJjdXRpbHMgbGlibmwKK0xPQ0FMX0NGTEFHUyA6PSAkKExfQ0ZMQUdTKQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoTF9TUkMpCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoSU5DTFVERVMpCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tYWM4MDIxMS93cGFfc3VwcGxpY2FudF9saWIvZHJpdmVyX21hYzgwMjExLmMgYi9tYWM4MDIxMS93cGFfc3VwcGxpY2FudF9saWIvZHJpdmVyX21hYzgwMjExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkNDFlMAotLS0gL2Rldi9udWxsCisrKyBiL21hYzgwMjExL3dwYV9zdXBwbGljYW50X2xpYi9kcml2ZXJfbWFjODAyMTEuYwpAQCAtMCwwICsxLDIxNzkgQEAKKy8qCisgKiBXUEEgU3VwcGxpY2FudCAtIGRyaXZlciBpbnRlcmFjdGlvbiB3aXRoIGdlbmVyaWMgTGludXggV2lyZWxlc3MgRXh0ZW5zaW9ucworICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgQlNECisgKiBsaWNlbnNlLgorICoKKyAqIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIGRyaXZlciBpbnRlcmZhY2UgZm9yIHRoZSBMaW51eCBXaXJlbGVzcyBFeHRlbnNpb25zLgorICogV2hlbiB1c2VkIHdpdGggV0UtMTggb3IgbmV3ZXIsIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIGFzLWlzIHdpdGggbnVtYmVyCisgKiBvZiBkcml2ZXJzLiBJbiBhZGRpdGlvbiB0byB0aGlzLCBzb21lIG9mIHRoZSBjb21tb24gZnVuY3Rpb25zIGluIHRoaXMgZmlsZQorICogY2FuIGJlIHVzZWQgYnkgb3RoZXIgZHJpdmVyIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbnMgdGhhdCB1c2UgZ2VuZXJpYyBXRQorICogaW9jdGxzLCBidXQgcmVxdWlyZSBwcml2YXRlIGlvY3RscyBmb3Igc29tZSBvZiB0aGUgZnVuY3Rpb25hbGl0eS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxuZXQvaWZfYXJwLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgPG5ldGxpbmsvZ2VubC9nZW5sLmg+CisjaW5jbHVkZSA8bmV0bGluay9nZW5sL2ZhbWlseS5oPgorI2luY2x1ZGUgPG5ldGxpbmsvZ2VubC9jdHJsLmg+CisjaW5jbHVkZSA8bmV0bGluay9tc2cuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2F0dHIuaD4KKworI2luY2x1ZGUgIm5sODAyMTEuaCIKKworI2luY2x1ZGUgIndpcmVsZXNzX2NvcHkuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJkcml2ZXIuaCIKKyNpbmNsdWRlICJlbG9vcC5oIgorI2luY2x1ZGUgImRyaXZlcl93ZXh0LmgiCisjaW5jbHVkZSAiaWVlZTgwMl8xMV9kZWZzLmgiCisjaW5jbHVkZSAid3BhX2NvbW1vbi5oIgorI2luY2x1ZGUgIndwYV9jdHJsLmgiCisjaW5jbHVkZSAid3BhX3N1cHBsaWNhbnRfaS5oIgorI2luY2x1ZGUgImNvbmZpZ19zc2lkLmgiCisjaW5jbHVkZSAid3BhX2RlYnVnLmgiCisKKworc3RhdGljIGludCB3cGFfZHJpdmVyX3dleHRfZmx1c2hfcG1raWQodm9pZCAqcHJpdik7CitzdGF0aWMgaW50IHdwYV9kcml2ZXJfd2V4dF9nZXRfcmFuZ2Uodm9pZCAqcHJpdik7CitzdGF0aWMgdm9pZCB3cGFfZHJpdmVyX3dleHRfZmluaXNoX2Rydl9pbml0KHN0cnVjdCB3cGFfZHJpdmVyX3dleHRfZGF0YSAqZHJ2KTsKK3N0YXRpYyB2b2lkIHdwYV9kcml2ZXJfd2V4dF9kaXNjb25uZWN0KHN0cnVjdCB3cGFfZHJpdmVyX3dleHRfZGF0YSAqZHJ2KTsKKworCitzdGF0aWMgaW50IHdwYV9kcml2ZXJfd2V4dF9zZW5kX29wZXJfaWZsYShzdHJ1Y3Qgd3BhX2RyaXZlcl93ZXh0X2RhdGEgKmRydiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlua21vZGUsIGludCBvcGVyc3RhdGUpCit7CisgICAgc3RydWN0IHsKKyAgICAgICAgc3RydWN0IG5sbXNnaGRyIGhkcjsKKyAgICAgICAgc3RydWN0IGlmaW5mb21zZyBpZmluZm87CisgICAgICAgIGNoYXIgb3B0c1sxNl07CisgICAgfSByZXE7CisgICAgc3RydWN0IHJ0YXR0ciAqcnRhOworICAgIHN0YXRpYyBpbnQgbmxfc2VxOworICAgIHNzaXplX3QgcmV0OworCisgICAgb3NfbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKworICAgIHJlcS5oZHIubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSk7CisgICAgcmVxLmhkci5ubG1zZ190eXBlID0gUlRNX1NFVExJTks7CisgICAgcmVxLmhkci5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisgICAgcmVxLmhkci5ubG1zZ19zZXEgPSArK25sX3NlcTsKKyAgICByZXEuaGRyLm5sbXNnX3BpZCA9IDA7CisKKyAgICByZXEuaWZpbmZvLmlmaV9mYW1pbHkgPSBBRl9VTlNQRUM7CisgICAgcmVxLmlmaW5mby5pZmlfdHlwZSA9IDA7CisgICAgcmVxLmlmaW5mby5pZmlfaW5kZXggPSBkcnYtPmlmaW5kZXg7CisgICAgcmVxLmlmaW5mby5pZmlfZmxhZ3MgPSAwOworICAgIHJlcS5pZmluZm8uaWZpX2NoYW5nZSA9IDA7CisKKyAgICBpZiAobGlua21vZGUgIT0gLTEpIHsKKyAgICAgICAgcnRhID0gYWxpYXNpbmdfaGlkZV90eXBlY2FzdCgKKyAgICAgICAgICAgICgoY2hhciAqKSAmcmVxICsgTkxNU0dfQUxJR04ocmVxLmhkci5ubG1zZ19sZW4pKSwKKyAgICAgICAgICAgIHN0cnVjdCBydGF0dHIpOworICAgICAgICBydGEtPnJ0YV90eXBlID0gSUZMQV9MSU5LTU9ERTsKKyAgICAgICAgcnRhLT5ydGFfbGVuID0gUlRBX0xFTkdUSChzaXplb2YoY2hhcikpOworICAgICAgICAqKChjaGFyICopIFJUQV9EQVRBKHJ0YSkpID0gbGlua21vZGU7CisgICAgICAgIHJlcS5oZHIubmxtc2dfbGVuID0gTkxNU0dfQUxJR04ocmVxLmhkci5ubG1zZ19sZW4pICsKKyAgICAgICAgICAgIFJUQV9MRU5HVEgoc2l6ZW9mKGNoYXIpKTsKKyAgICB9CisgICAgaWYgKG9wZXJzdGF0ZSAhPSAtMSkgeworICAgICAgICBydGEgPSAoc3RydWN0IHJ0YXR0ciAqKQorICAgICAgICAgICAgKChjaGFyICopICZyZXEgKyBOTE1TR19BTElHTihyZXEuaGRyLm5sbXNnX2xlbikpOworICAgICAgICBydGEtPnJ0YV90eXBlID0gSUZMQV9PUEVSU1RBVEU7CisgICAgICAgIHJ0YS0+cnRhX2xlbiA9IFJUQV9MRU5HVEgoc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgKigoY2hhciAqKSBSVEFfREFUQShydGEpKSA9IG9wZXJzdGF0ZTsKKyAgICAgICAgcmVxLmhkci5ubG1zZ19sZW4gPSBOTE1TR19BTElHTihyZXEuaGRyLm5sbXNnX2xlbikgKworICAgICAgICAgICAgUlRBX0xFTkdUSChzaXplb2YoY2hhcikpOworICAgIH0KKworICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiV0VYVDogT3BlcnN0YXRlOiBsaW5rbW9kZT0lZCwgb3BlcnN0YXRlPSVkIiwKKyAgICAgICAgICAgbGlua21vZGUsIG9wZXJzdGF0ZSk7CisKKyAgICByZXQgPSBzZW5kKGRydi0+aW9jdGxfc29jaywgJnJlcSwgcmVxLmhkci5ubG1zZ19sZW4sIDApOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiV0VYVDogU2VuZGluZyBvcGVyc3RhdGUgSUZMQSBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICIlcyAoYXNzdW1lIG9wZXJzdGF0ZSBpcyBub3Qgc3VwcG9ydGVkKSIsCisgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgIH0KKworICAgIHJldHVybiByZXQgPCAwID8gLTEgOiAwOworfQorCisKK3N0YXRpYyB2b2lkCit3cGFfZHJpdmVyX3dleHRfZXZlbnRfd2lyZWxlc3NfY3VzdG9tKHZvaWQgKmN0eCwgY2hhciAqY3VzdG9tKQoreworICAgIHVuaW9uIHdwYV9ldmVudF9kYXRhIGRhdGE7CisKKyAgICB3cGFfcHJpbnRmKE1TR19NU0dEVU1QLCAiV0VYVDogQ3VzdG9tIHdpcmVsZXNzIGV2ZW50OiAnJXMnIiwKKyAgICAgICAgICAgY3VzdG9tKTsKKworICAgIG9zX21lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKyAgICAvKiBIb3N0IEFQIGRyaXZlciAqLworICAgIGlmIChvc19zdHJuY21wKGN1c3RvbSwgIk1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbiIsIDMzKSA9PSAwKSB7CisgICAgICAgIGRhdGEubWljaGFlbF9taWNfZmFpbHVyZS51bmljYXN0ID0KKyAgICAgICAgICAgIG9zX3N0cnN0cihjdXN0b20sICIgdW5pY2FzdCAiKSAhPSBOVUxMOworICAgICAgICAvKiBUT0RPOiBwYXJzZSBwYXJhbWV0ZXJzKD8pICovCisgICAgICAgIHdwYV9zdXBwbGljYW50X2V2ZW50KGN0eCwgRVZFTlRfTUlDSEFFTF9NSUNfRkFJTFVSRSwgJmRhdGEpOworICAgIH0gZWxzZSBpZiAob3Nfc3RybmNtcChjdXN0b20sICJBU1NPQ0lORk8oUmVxSUVzPSIsIDE3KSA9PSAwKSB7CisgICAgICAgIGNoYXIgKnNwb3M7CisgICAgICAgIGludCBieXRlczsKKworICAgICAgICBzcG9zID0gY3VzdG9tICsgMTc7CisKKyAgICAgICAgYnl0ZXMgPSBzdHJzcG4oc3BvcywgIjAxMjM0NTY3ODlhYmNkZWZBQkNERUYiKTsKKyAgICAgICAgaWYgKCFieXRlcyB8fCAoYnl0ZXMgJiAxKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJ5dGVzIC89IDI7CisKKyAgICAgICAgZGF0YS5hc3NvY19pbmZvLnJlcV9pZXMgPSBvc19tYWxsb2MoYnl0ZXMpOworICAgICAgICBpZiAoZGF0YS5hc3NvY19pbmZvLnJlcV9pZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGRhdGEuYXNzb2NfaW5mby5yZXFfaWVzX2xlbiA9IGJ5dGVzOworICAgICAgICBoZXhzdHIyYmluKHNwb3MsIGRhdGEuYXNzb2NfaW5mby5yZXFfaWVzLCBieXRlcyk7CisKKyAgICAgICAgc3BvcyArPSBieXRlcyAqIDI7CisKKyAgICAgICAgZGF0YS5hc3NvY19pbmZvLnJlc3BfaWVzID0gTlVMTDsKKyAgICAgICAgZGF0YS5hc3NvY19pbmZvLnJlc3BfaWVzX2xlbiA9IDA7CisKKyAgICAgICAgaWYgKG9zX3N0cm5jbXAoc3BvcywgIiBSZXNwSUVzPSIsIDkpID09IDApIHsKKyAgICAgICAgICAgIHNwb3MgKz0gOTsKKworICAgICAgICAgICAgYnl0ZXMgPSBzdHJzcG4oc3BvcywgIjAxMjM0NTY3ODlhYmNkZWZBQkNERUYiKTsKKyAgICAgICAgICAgIGlmICghYnl0ZXMgfHwgKGJ5dGVzICYgMSkpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlcyAvPSAyOworCisgICAgICAgICAgICBkYXRhLmFzc29jX2luZm8ucmVzcF9pZXMgPSBvc19tYWxsb2MoYnl0ZXMpOworICAgICAgICAgICAgaWYgKGRhdGEuYXNzb2NfaW5mby5yZXNwX2llcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkYXRhLmFzc29jX2luZm8ucmVzcF9pZXNfbGVuID0gYnl0ZXM7CisgICAgICAgICAgICBoZXhzdHIyYmluKHNwb3MsIGRhdGEuYXNzb2NfaW5mby5yZXNwX2llcywgYnl0ZXMpOworICAgICAgICB9CisKKyAgICAgICAgd3BhX3N1cHBsaWNhbnRfZXZlbnQoY3R4LCBFVkVOVF9BU1NPQ0lORk8sICZkYXRhKTsKKworICAgIGRvbmU6CisgICAgICAgIG9zX2ZyZWUoZGF0YS5hc3NvY19pbmZvLnJlc3BfaWVzKTsKKyAgICAgICAgb3NfZnJlZShkYXRhLmFzc29jX2luZm8ucmVxX2llcyk7CisjaWZkZWYgQ09ORklHX1BFRVJLRVkKKyAgICB9IGVsc2UgaWYgKG9zX3N0cm5jbXAoY3VzdG9tLCAiU1RLU1RBUlQucmVxdWVzdD0iLCAxNykgPT0gMCkgeworICAgICAgICBpZiAoaHdhZGRyX2F0b24oY3VzdG9tICsgMTcsIGRhdGEuc3Rrc3RhcnQucGVlcikpIHsKKyAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiV0VYVDogdW5yZWNvZ25pemVkICIKKyAgICAgICAgICAgICAgICAgICAiU1RLU1RBUlQucmVxdWVzdCAnJXMnIiwgY3VzdG9tICsgMTcpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdwYV9zdXBwbGljYW50X2V2ZW50KGN0eCwgRVZFTlRfU1RLU1RBUlQsICZkYXRhKTsKKyNlbmRpZiAvKiBDT05GSUdfUEVFUktFWSAqLworI2lmZGVmIEFORFJPSUQKKyAgICB9IGVsc2UgaWYgKG9zX3N0cm5jbXAoY3VzdG9tLCAiU1RPUCIsIDQpID09IDApIHsKKyAgICAgICAgd3BhX21zZyhjdHgsIE1TR19JTkZPLCBXUEFfRVZFTlRfRFJJVkVSX1NUQVRFICJTVE9QUEVEIik7CisgICAgfSBlbHNlIGlmIChvc19zdHJuY21wKGN1c3RvbSwgIlNUQVJUIiwgNSkgPT0gMCkgeworICAgICAgICB3cGFfbXNnKGN0eCwgTVNHX0lORk8sIFdQQV9FVkVOVF9EUklWRVJfU1RBVEUgIlNUQVJURUQiKTsKKyAgICB9IGVsc2UgaWYgKG9zX3N0cm5jbXAoY3VzdG9tLCAiSEFORyIsIDQpID09IDApIHsKKyAgICAgICAgd3BhX21zZyhjdHgsIE1TR19JTkZPLCBXUEFfRVZFTlRfRFJJVkVSX1NUQVRFICJIQU5HRUQiKTsKKyNlbmRpZiAvKiBBTkRST0lEICovCisgICAgfQorfQorCisKK3N0YXRpYyBpbnQgd3BhX2RyaXZlcl93ZXh0X2V2ZW50X3dpcmVsZXNzX21pY2hhZWxtaWNmYWlsdXJlKAorICAgIHZvaWQgKmN0eCwgY29uc3QgY2hhciAqZXYsIHNpemVfdCBsZW4pCit7CisgICAgY29uc3Qgc3RydWN0IGl3X21pY2hhZWxtaWNmYWlsdXJlICptaWM7CisgICAgdW5pb24gd3BhX2V2ZW50X2RhdGEgZGF0YTsKKworICAgIGlmIChsZW4gPCBzaXplb2YoKm1pYykpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1pYyA9IChjb25zdCBzdHJ1Y3QgaXdfbWljaGFlbG1pY2ZhaWx1cmUgKikgZXY7CisKKyAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgIk1pY2hhZWwgTUlDIGZhaWx1cmUgd2lyZWxlc3MgZXZlbnQ6ICIKKyAgICAgICAgICAgImZsYWdzPTB4JXggc3JjX2FkZHI9IiBNQUNTVFIsIG1pYy0+ZmxhZ3MsCisgICAgICAgICAgIE1BQzJTVFIobWljLT5zcmNfYWRkci5zYV9kYXRhKSk7CisKKyAgICBvc19tZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisgICAgZGF0YS5taWNoYWVsX21pY19mYWlsdXJlLnVuaWNhc3QgPSAhKG1pYy0+ZmxhZ3MgJiBJV19NSUNGQUlMVVJFX0dST1VQKTsKKyAgICB3cGFfc3VwcGxpY2FudF9ldmVudChjdHgsIEVWRU5UX01JQ0hBRUxfTUlDX0ZBSUxVUkUsICZkYXRhKTsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgd3BhX2RyaXZlcl93ZXh0X2V2ZW50X3dpcmVsZXNzX3Bta2lkY2FuZCgKKyAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl93ZXh0X2RhdGEgKmRydiwgY29uc3QgY2hhciAqZXYsIHNpemVfdCBsZW4pCit7CisgICAgY29uc3Qgc3RydWN0IGl3X3Bta2lkX2NhbmQgKmNhbmQ7CisgICAgdW5pb24gd3BhX2V2ZW50X2RhdGEgZGF0YTsKKyAgICBjb25zdCB1OCAqYWRkcjsKKworICAgIGlmIChsZW4gPCBzaXplb2YoKmNhbmQpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBjYW5kID0gKGNvbnN0IHN0cnVjdCBpd19wbWtpZF9jYW5kICopIGV2OworICAgIGFkZHIgPSAoY29uc3QgdTggKikgY2FuZC0+YnNzaWQuc2FfZGF0YTsKKworICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiUE1LSUQgY2FuZGlkYXRlIHdpcmVsZXNzIGV2ZW50OiAiCisgICAgICAgICAgICJmbGFncz0weCV4IGluZGV4PSVkIGJzc2lkPSIgTUFDU1RSLCBjYW5kLT5mbGFncywKKyAgICAgICAgICAgY2FuZC0+aW5kZXgsIE1BQzJTVFIoYWRkcikpOworCisgICAgb3NfbWVtc2V0KCZkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworICAgIG9zX21lbWNweShkYXRhLnBta2lkX2NhbmRpZGF0ZS5ic3NpZCwgYWRkciwgRVRIX0FMRU4pOworICAgIGRhdGEucG1raWRfY2FuZGlkYXRlLmluZGV4ID0gY2FuZC0+aW5kZXg7CisgICAgZGF0YS5wbWtpZF9jYW5kaWRhdGUucHJlYXV0aCA9IGNhbmQtPmZsYWdzICYgSVdfUE1LSURfQ0FORF9QUkVBVVRIOworICAgIHdwYV9zdXBwbGljYW50X2V2ZW50KGRydi0+Y3R4LCBFVkVOVF9QTUtJRF9DQU5ESURBVEUsICZkYXRhKTsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgd3BhX2RyaXZlcl93ZXh0X2V2ZW50X3dpcmVsZXNzX2Fzc29jcmVxaWUoCisgICAgc3RydWN0IHdwYV9kcml2ZXJfd2V4dF9kYXRhICpkcnYsIGNvbnN0IGNoYXIgKmV2LCBpbnQgbGVuKQoreworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJBc3NvY1JlcSBJRSB3aXJlbGVzcyBldmVudCIsIChjb25zdCB1OCAqKSBldiwKKyAgICAgICAgICAgIGxlbik7CisgICAgb3NfZnJlZShkcnYtPmFzc29jX3JlcV9pZXMpOworICAgIGRydi0+YXNzb2NfcmVxX2llcyA9IG9zX21hbGxvYyhsZW4pOworICAgIGlmIChkcnYtPmFzc29jX3JlcV9pZXMgPT0gTlVMTCkgeworICAgICAgICBkcnYtPmFzc29jX3JlcV9pZXNfbGVuID0gMDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBvc19tZW1jcHkoZHJ2LT5hc3NvY19yZXFfaWVzLCBldiwgbGVuKTsKKyAgICBkcnYtPmFzc29jX3JlcV9pZXNfbGVuID0gbGVuOworCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB3cGFfZHJpdmVyX3dleHRfZXZlbnRfd2lyZWxlc3NfYXNzb2NyZXNwaWUoCisgICAgc3RydWN0IHdwYV9kcml2ZXJfd2V4dF9kYXRhICpkcnYsIGNvbnN0IGNoYXIgKmV2LCBpbnQgbGVuKQoreworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJBc3NvY1Jlc3AgSUUgd2lyZWxlc3MgZXZlbnQiLCAoY29uc3QgdTggKikgZXYsCisgICAgICAgICAgICBsZW4pOworICAgIG9zX2ZyZWUoZHJ2LT5hc3NvY19yZXNwX2llcyk7CisgICAgZHJ2LT5hc3NvY19yZXNwX2llcyA9IG9zX21hbGxvYyhsZW4pOworICAgIGlmIChkcnYtPmFzc29jX3Jlc3BfaWVzID09IE5VTEwpIHsKKyAgICAgICAgZHJ2LT5hc3NvY19yZXNwX2llc19sZW4gPSAwOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG9zX21lbWNweShkcnYtPmFzc29jX3Jlc3BfaWVzLCBldiwgbGVuKTsKKyAgICBkcnYtPmFzc29jX3Jlc3BfaWVzX2xlbiA9IGxlbjsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHdwYV9kcml2ZXJfd2V4dF9ldmVudF9hc3NvY19pZXMoc3RydWN0IHdwYV9kcml2ZXJfd2V4dF9kYXRhICpkcnYpCit7CisgICAgdW5pb24gd3BhX2V2ZW50X2RhdGEgZGF0YTsKKworICAgIGlmIChkcnYtPmFzc29jX3JlcV9pZXMgPT0gTlVMTCAmJiBkcnYtPmFzc29jX3Jlc3BfaWVzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG9zX21lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKyAgICBpZiAoZHJ2LT5hc3NvY19yZXFfaWVzKSB7CisgICAgICAgIGRhdGEuYXNzb2NfaW5mby5yZXFfaWVzID0gZHJ2LT5hc3NvY19yZXFfaWVzOworICAgICAgICBkcnYtPmFzc29jX3JlcV9pZXMgPSBOVUxMOworICAgICAgICBkYXRhLmFzc29jX2luZm8ucmVxX2llc19sZW4gPSBkcnYtPmFzc29jX3JlcV9pZXNfbGVuOworICAgIH0KKyAgICBpZiAoZHJ2LT5hc3NvY19yZXNwX2llcykgeworICAgICAgICBkYXRhLmFzc29jX2luZm8ucmVzcF9pZXMgPSBkcnYtPmFzc29jX3Jlc3BfaWVzOworICAgICAgICBkcnYtPmFzc29jX3Jlc3BfaWVzID0gTlVMTDsKKyAgICAgICAgZGF0YS5hc3NvY19pbmZvLnJlc3BfaWVzX2xlbiA9IGRydi0+YXNzb2NfcmVzcF9pZXNfbGVuOworICAgIH0KKworICAgIHdwYV9zdXBwbGljYW50X2V2ZW50KGRydi0+Y3R4LCBFVkVOVF9BU1NPQ0lORk8sICZkYXRhKTsKKworICAgIG9zX2ZyZWUoZGF0YS5hc3NvY19pbmZvLnJlcV9pZXMpOworICAgIG9zX2ZyZWUoZGF0YS5hc3NvY19pbmZvLnJlc3BfaWVzKTsKK30KKworCitzdGF0aWMgdm9pZCB3cGFfZHJpdmVyX3dleHRfZXZlbnRfd2lyZWxlc3Moc3RydWN0IHdwYV9kcml2ZXJfd2V4dF9kYXRhICpkcnYsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmN0eCwgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKyAgICBzdHJ1Y3QgaXdfZXZlbnQgaXdlX2J1ZiwgKml3ZSA9ICZpd2VfYnVmOworICAgIGNoYXIgKnBvcywgKmVuZCwgKmN1c3RvbSwgKmJ1ZjsKKworICAgIHBvcyA9IGRhdGE7CisgICAgZW5kID0gZGF0YSArIGxlbjsKKworICAgIHdoaWxlIChwb3MgKyBJV19FVl9MQ1BfTEVOIDw9IGVuZCkgeworICAgICAgICAvKiBFdmVudCBkYXRhIG1heSBiZSB1bmFsaWduZWQsIHNvIG1ha2UgYSBsb2NhbCwgYWxpZ25lZCBjb3B5CisgICAgICAgICAqIGJlZm9yZSBwcm9jZXNzaW5nLiAqLworICAgICAgICBvc19tZW1jcHkoJml3ZV9idWYsIHBvcywgSVdfRVZfTENQX0xFTik7CisgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiV2lyZWxlc3MgZXZlbnQ6IGNtZD0weCV4IGxlbj0lZCIsCisgICAgICAgICAgICAgICBpd2UtPmNtZCwgaXdlLT5sZW4pOworICAgICAgICBpZiAoaXdlLT5sZW4gPD0gSVdfRVZfTENQX0xFTikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY3VzdG9tID0gcG9zICsgSVdfRVZfUE9JTlRfTEVOOworICAgICAgICBpZiAoZHJ2LT53ZV92ZXJzaW9uX2NvbXBpbGVkID4gMTggJiYKKyAgICAgICAgICAgIChpd2UtPmNtZCA9PSBJV0VWTUlDSEFFTE1JQ0ZBSUxVUkUgfHwKKyAgICAgICAgICAgICBpd2UtPmNtZCA9PSBJV0VWQ1VTVE9NIHx8CisgICAgICAgICAgICAgaXdlLT5jbWQgPT0gSVdFVkFTU09DUkVRSUUgfHwKKyAgICAgICAgICAgICBpd2UtPmNtZCA9PSBJV0VWQVNTT0NSRVNQSUUgfHwKKyAgICAgICAgICAgICBpd2UtPmNtZCA9PSBJV0VWUE1LSURDQU5EKSkgeworICAgICAgICAgICAgLyogV0UtMTkgcmVtb3ZlZCB0aGUgcG9pbnRlciBmcm9tIHN0cnVjdCBpd19wb2ludCAqLworICAgICAgICAgICAgY2hhciAqZHBvcyA9IChjaGFyICopICZpd2VfYnVmLnUuZGF0YS5sZW5ndGg7CisgICAgICAgICAgICBpbnQgZGxlbiA9IGRwb3MgLSAoY2hhciAqKSAmaXdlX2J1ZjsKKyAgICAgICAgICAgIG9zX21lbWNweShkcG9zLCBwb3MgKyBJV19FVl9MQ1BfTEVOLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpd19ldmVudCkgLSBkbGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9zX21lbWNweSgmaXdlX2J1ZiwgcG9zLCBzaXplb2Yoc3RydWN0IGl3X2V2ZW50KSk7CisgICAgICAgICAgICBjdXN0b20gKz0gSVdfRVZfUE9JTlRfT0ZGOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChpd2UtPmNtZCkgeworICAgICAgICBjYXNlIFNJT0NHSVdBUDoKKyAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiV2lyZWxlc3MgZXZlbnQ6IG5ldyBBUDogIgorICAgICAgICAgICAgICAgICAgIE1BQ1NUUiwKKyAgICAgICAgICAgICAgICAgICBNQUMyU1RSKCh1OCAqKSBpd2UtPnUuYXBfYWRkci5zYV9kYXRhKSk7CisgICAgICAgICAgICBpZiAoaXNfemVyb19ldGhlcl9hZGRyKAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgdTggKikgaXdlLT51LmFwX2FkZHIuc2FfZGF0YSkgfHwKKyAgICAgICAgICAgICAgICBvc19tZW1jbXAoaXdlLT51LmFwX2FkZHIuc2FfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAiXHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0IiwgRVRIX0FMRU4pID09CisgICAgICAgICAgICAgICAgMCkgeworICAgICAgICAgICAgICAgIG9zX2ZyZWUoZHJ2LT5hc3NvY19yZXFfaWVzKTsKKyAgICAgICAgICAgICAgICBkcnYtPmFzc29jX3JlcV9pZXMgPSBOVUxMOworICAgICAgICAgICAgICAgIG9zX2ZyZWUoZHJ2LT5hc3NvY19yZXNwX2llcyk7CisgICAgICAgICAgICAgICAgZHJ2LT5hc3NvY19yZXNwX2llcyA9IE5VTEw7CisjaWZkZWYgQU5EUk9JRAorICAgICAgICAgICAgICAgIGlmICghZHJ2LT5za2lwX2Rpc2Nvbm5lY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgZHJ2LT5za2lwX2Rpc2Nvbm5lY3QgPSAxOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHdwYV9zdXBwbGljYW50X2V2ZW50KGN0eCwgRVZFTlRfRElTQVNTT0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworI2lmZGVmIEFORFJPSUQKKyAgICAgICAgICAgICAgICAgICAgd3BhX2RyaXZlcl93ZXh0X2Rpc2Nvbm5lY3QoZHJ2KTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBBTkRST0lECisgICAgICAgICAgICAgICAgZHJ2LT5za2lwX2Rpc2Nvbm5lY3QgPSAwOworI2VuZGlmCisgICAgICAgICAgICAgICAgd3BhX2RyaXZlcl93ZXh0X2V2ZW50X2Fzc29jX2llcyhkcnYpOworICAgICAgICAgICAgICAgIHdwYV9zdXBwbGljYW50X2V2ZW50KGN0eCwgRVZFTlRfQVNTT0MsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVdFVk1JQ0hBRUxNSUNGQUlMVVJFOgorICAgICAgICAgICAgaWYgKGN1c3RvbSArIGl3ZS0+dS5kYXRhLmxlbmd0aCA+IGVuZCkgeworICAgICAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiV0VYVDogSW52YWxpZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJJV0VWTUlDSEFFTE1JQ0ZBSUxVUkUgbGVuZ3RoIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3BhX2RyaXZlcl93ZXh0X2V2ZW50X3dpcmVsZXNzX21pY2hhZWxtaWNmYWlsdXJlKAorICAgICAgICAgICAgICAgIGN0eCwgY3VzdG9tLCBpd2UtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVdFVkNVU1RPTToKKyAgICAgICAgICAgIGlmIChjdXN0b20gKyBpd2UtPnUuZGF0YS5sZW5ndGggPiBlbmQpIHsKKyAgICAgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgIldFWFQ6IEludmFsaWQgIgorICAgICAgICAgICAgICAgICAgICAgICAiSVdFVkNVU1RPTSBsZW5ndGgiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYgPSBvc19tYWxsb2MoaXdlLT51LmRhdGEubGVuZ3RoICsgMSk7CisgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvc19tZW1jcHkoYnVmLCBjdXN0b20sIGl3ZS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBidWZbaXdlLT51LmRhdGEubGVuZ3RoXSA9ICdcMCc7CisgICAgICAgICAgICB3cGFfZHJpdmVyX3dleHRfZXZlbnRfd2lyZWxlc3NfY3VzdG9tKGN0eCwgYnVmKTsKKyAgICAgICAgICAgIG9zX2ZyZWUoYnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJT0NHSVdTQ0FOOgorICAgICAgICAgICAgZHJ2LT5zY2FuX2NvbXBsZXRlX2V2ZW50cyA9IDE7CisgICAgICAgICAgICBlbG9vcF9jYW5jZWxfdGltZW91dCh3cGFfZHJpdmVyX3dleHRfc2Nhbl90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRydiwgY3R4KTsKKyAgICAgICAgICAgIHdwYV9zdXBwbGljYW50X2V2ZW50KGN0eCwgRVZFTlRfU0NBTl9SRVNVTFRTLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElXRVZBU1NPQ1JFUUlFOgorICAgICAgICAgICAgaWYgKGN1c3RvbSArIGl3ZS0+dS5kYXRhLmxlbmd0aCA+IGVuZCkgeworICAgICAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiV0VYVDogSW52YWxpZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJJV0VWQVNTT0NSRVFJRSBsZW5ndGgiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cGFfZHJpdmVyX3dleHRfZXZlbnRfd2lyZWxlc3NfYXNzb2NyZXFpZSgKKyAgICAgICAgICAgICAgICBkcnYsIGN1c3RvbSwgaXdlLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElXRVZBU1NPQ1JFU1BJRToKKyAgICAgICAgICAgIGlmIChjdXN0b20gKyBpd2UtPnUuZGF0YS5sZW5ndGggPiBlbmQpIHsKKyAgICAgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgIldFWFQ6IEludmFsaWQgIgorICAgICAgICAgICAgICAgICAgICAgICAiSVdFVkFTU09DUkVTUElFIGxlbmd0aCIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdwYV9kcml2ZXJfd2V4dF9ldmVudF93aXJlbGVzc19hc3NvY3Jlc3BpZSgKKyAgICAgICAgICAgICAgICBkcnYsIGN1c3RvbSwgaXdlLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElXRVZQTUtJRENBTkQ6CisgICAgICAgICAgICBpZiAoY3VzdG9tICsgaXdlLT51LmRhdGEubGVuZ3RoID4gZW5kKSB7CisgICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJXRVhUOiBJbnZhbGlkICIKKyAgICAgICAgICAgICAgICAgICAgICAgIklXRVZQTUtJRENBTkQgbGVuZ3RoIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3BhX2RyaXZlcl93ZXh0X2V2ZW50X3dpcmVsZXNzX3Bta2lkY2FuZCgKKyAgICAgICAgICAgICAgICBkcnYsIGN1c3RvbSwgaXdlLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcG9zICs9IGl3ZS0+bGVuOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCB3cGFfZHJpdmVyX3dleHRfZXZlbnRfbGluayhzdHJ1Y3Qgd3BhX2RyaXZlcl93ZXh0X2RhdGEgKmRydiwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY3R4LCBjaGFyICpidWYsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWwpCit7CisgICAgdW5pb24gd3BhX2V2ZW50X2RhdGEgZXZlbnQ7CisKKyAgICBvc19tZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YoZXZlbnQpKTsKKyAgICBpZiAobGVuID4gc2l6ZW9mKGV2ZW50LmludGVyZmFjZV9zdGF0dXMuaWZuYW1lKSkgeworICAgICAgICBsZW4gPSBzaXplb2YoZXZlbnQuaW50ZXJmYWNlX3N0YXR1cy5pZm5hbWUpIC0gMTsKKyAgICB9CisgICAgb3NfbWVtY3B5KGV2ZW50LmludGVyZmFjZV9zdGF0dXMuaWZuYW1lLCBidWYsIGxlbik7CisgICAgZXZlbnQuaW50ZXJmYWNlX3N0YXR1cy5pZXZlbnQgPSBkZWwgPyBFVkVOVF9JTlRFUkZBQ0VfUkVNT1ZFRCA6CisgICAgICAgIEVWRU5UX0lOVEVSRkFDRV9BRERFRDsKKworICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiUlRNXyVzTElOSywgSUZMQV9JRk5BTUU6IEludGVyZmFjZSAnJXMnICVzIiwKKyAgICAgICAgICAgZGVsID8gIkRFTCIgOiAiTkVXIiwKKyAgICAgICAgICAgZXZlbnQuaW50ZXJmYWNlX3N0YXR1cy5pZm5hbWUsCisgICAgICAgICAgIGRlbCA/ICJyZW1vdmVkIiA6ICJhZGRlZCIpOworCisgICAgaWYgKG9zX3N0cmNtcChkcnYtPmlmbmFtZSwgZXZlbnQuaW50ZXJmYWNlX3N0YXR1cy5pZm5hbWUpID09IDApIHsKKyAgICAgICAgaWYgKGRlbCkgeworICAgICAgICAgICAgZHJ2LT5pZl9yZW1vdmVkID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRydi0+aWZfcmVtb3ZlZCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3cGFfc3VwcGxpY2FudF9ldmVudChjdHgsIEVWRU5UX0lOVEVSRkFDRV9TVEFUVVMsICZldmVudCk7Cit9CisKKworc3RhdGljIGludCB3cGFfZHJpdmVyX3dleHRfb3duX2lmbmFtZShzdHJ1Y3Qgd3BhX2RyaXZlcl93ZXh0X2RhdGEgKmRydiwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKmgpCit7CisgICAgc3RydWN0IGlmaW5mb21zZyAqaWZpOworICAgIGludCBhdHRybGVuLCBubG1zZ19sZW4sIHJ0YV9sZW47CisgICAgc3RydWN0IHJ0YXR0ciAqYXR0cjsKKworICAgIGlmaSA9IE5MTVNHX0RBVEEoaCk7CisKKyAgICBubG1zZ19sZW4gPSBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IGlmaW5mb21zZykpOworCisgICAgYXR0cmxlbiA9IGgtPm5sbXNnX2xlbiAtIG5sbXNnX2xlbjsKKyAgICBpZiAoYXR0cmxlbiA8IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXR0ciA9IChzdHJ1Y3QgcnRhdHRyICopICgoKGNoYXIgKikgaWZpKSArIG5sbXNnX2xlbik7CisKKyAgICBydGFfbGVuID0gUlRBX0FMSUdOKHNpemVvZihzdHJ1Y3QgcnRhdHRyKSk7CisgICAgd2hpbGUgKFJUQV9PSyhhdHRyLCBhdHRybGVuKSkgeworICAgICAgICBpZiAoYXR0ci0+cnRhX3R5cGUgPT0gSUZMQV9JRk5BTUUpIHsKKyAgICAgICAgICAgIGlmIChvc19zdHJjbXAoKChjaGFyICopIGF0dHIpICsgcnRhX2xlbiwgZHJ2LT5pZm5hbWUpCisgICAgICAgICAgICAgICAgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdHRyID0gUlRBX05FWFQoYXR0ciwgYXR0cmxlbik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB3cGFfZHJpdmVyX3dleHRfb3duX2lmaW5kZXgoc3RydWN0IHdwYV9kcml2ZXJfd2V4dF9kYXRhICpkcnYsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBpZmluZGV4LCBzdHJ1Y3Qgbmxtc2doZHIgKmgpCit7CisgICAgaWYgKGRydi0+aWZpbmRleCA9PSBpZmluZGV4IHx8IGRydi0+aWZpbmRleDIgPT0gaWZpbmRleCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoZHJ2LT5pZl9yZW1vdmVkICYmIHdwYV9kcml2ZXJfd2V4dF9vd25faWZuYW1lKGRydiwgaCkpIHsKKyAgICAgICAgZHJ2LT5pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoZHJ2LT5pZm5hbWUpOworICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgIldFWFQ6IFVwZGF0ZSBpZmluZGV4IGZvciBhIHJlbW92ZWQgIgorICAgICAgICAgICAgICAgImludGVyZmFjZSIpOworICAgICAgICB3cGFfZHJpdmVyX3dleHRfZmluaXNoX2Rydl9pbml0KGRydik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHdwYV9kcml2ZXJfd2V4dF9ldmVudF9ydG1fbmV3bGluayhzdHJ1Y3Qgd3BhX2RyaXZlcl93ZXh0X2RhdGEgKmRydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY3R4LCBzdHJ1Y3Qgbmxtc2doZHIgKmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pCit7CisgICAgc3RydWN0IGlmaW5mb21zZyAqaWZpOworICAgIGludCBhdHRybGVuLCBubG1zZ19sZW4sIHJ0YV9sZW47CisgICAgc3RydWN0IHJ0YXR0ciAqIGF0dHI7CisKKyAgICBpZiAobGVuIDwgc2l6ZW9mKCppZmkpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZmkgPSBOTE1TR19EQVRBKGgpOworCisgICAgaWYgKCF3cGFfZHJpdmVyX3dleHRfb3duX2lmaW5kZXgoZHJ2LCBpZmktPmlmaV9pbmRleCwgaCkpIHsKKyAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJJZ25vcmUgZXZlbnQgZm9yIGZvcmVpZ24gaWZpbmRleCAlZCIsCisgICAgICAgICAgICAgICBpZmktPmlmaV9pbmRleCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgIlJUTV9ORVdMSU5LOiBvcGVyc3RhdGU9JWQgaWZpX2ZsYWdzPTB4JXggIgorICAgICAgICAgICAiKCVzJXMlcyVzKSIsCisgICAgICAgICAgIGRydi0+b3BlcnN0YXRlLCBpZmktPmlmaV9mbGFncywKKyAgICAgICAgICAgKGlmaS0+aWZpX2ZsYWdzICYgSUZGX1VQKSA/ICJbVVBdIiA6ICIiLAorICAgICAgICAgICAoaWZpLT5pZmlfZmxhZ3MgJiBJRkZfUlVOTklORykgPyAiW1JVTk5JTkddIiA6ICIiLAorICAgICAgICAgICAoaWZpLT5pZmlfZmxhZ3MgJiBJRkZfTE9XRVJfVVApID8gIltMT1dFUl9VUF0iIDogIiIsCisgICAgICAgICAgIChpZmktPmlmaV9mbGFncyAmIElGRl9ET1JNQU5UKSA/ICJbRE9STUFOVF0iIDogIiIpOworICAgIC8qCisgICAgICogU29tZSBkcml2ZXJzIHNlbmQgdGhlIGFzc29jaWF0aW9uIGV2ZW50IGJlZm9yZSB0aGUgb3BlcnVwIGV2ZW50LS1pbgorICAgICAqIHRoaXMgY2FzZSwgbGlmdGluZyBvcGVyc3RhdGUgaW4gd3BhX2RyaXZlcl93ZXh0X3NldF9vcGVyc3RhdGUoKQorICAgICAqIGZhaWxzLiBUaGlzIHdpbGwgaGl0IHVzIHdoZW4gd3BhX3N1cHBsaWNhbnQgZG9lcyBub3QgbmVlZCB0byBkbworICAgICAqIElFRUUgODAyLjFYIGF1dGhlbnRpY2F0aW9uCisgICAgICovCisgICAgaWYgKGRydi0+b3BlcnN0YXRlID09IDEgJiYKKyAgICAgICAgKGlmaS0+aWZpX2ZsYWdzICYgKElGRl9MT1dFUl9VUCB8IElGRl9ET1JNQU5UKSkgPT0gSUZGX0xPV0VSX1VQICYmCisgICAgICAgICEoaWZpLT5pZmlfZmxhZ3MgJiBJRkZfUlVOTklORykpIHsKKyAgICAgICAgd3BhX2RyaXZlcl93ZXh0X3NlbmRfb3Blcl9pZmxhKGRydiwgLTEsIElGX09QRVJfVVApOworICAgIH0KKworICAgIG5sbXNnX2xlbiA9IE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSk7CisKKyAgICBhdHRybGVuID0gaC0+bmxtc2dfbGVuIC0gbmxtc2dfbGVuOworICAgIGlmIChhdHRybGVuIDwgMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXR0ciA9IChzdHJ1Y3QgcnRhdHRyICopICgoKGNoYXIgKikgaWZpKSArIG5sbXNnX2xlbik7CisKKyAgICBydGFfbGVuID0gUlRBX0FMSUdOKHNpemVvZihzdHJ1Y3QgcnRhdHRyKSk7CisgICAgd2hpbGUgKFJUQV9PSyhhdHRyLCBhdHRybGVuKSkgeworICAgICAgICBpZiAoYXR0ci0+cnRhX3R5cGUgPT0gSUZMQV9XSVJFTEVTUykgeworICAgICAgICAgICAgd3BhX2RyaXZlcl93ZXh0X2V2ZW50X3dpcmVsZXNzKAorICAgICAgICAgICAgICAgIGRydiwgY3R4LCAoKGNoYXIgKikgYXR0cikgKyBydGFfbGVuLAorICAgICAgICAgICAgICAgIGF0dHItPnJ0YV9sZW4gLSBydGFfbGVuKTsKKyAgICAgICAgfSBlbHNlIGlmIChhdHRyLT5ydGFfdHlwZSA9PSBJRkxBX0lGTkFNRSkgeworICAgICAgICAgICAgd3BhX2RyaXZlcl93ZXh0X2V2ZW50X2xpbmsoZHJ2LCBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoYXIgKikgYXR0cikgKyBydGFfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci0+cnRhX2xlbiAtIHJ0YV9sZW4sIDApOworICAgICAgICB9CisgICAgICAgIGF0dHIgPSBSVEFfTkVYVChhdHRyLCBhdHRybGVuKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgd3BhX2RyaXZlcl93ZXh0X2V2ZW50X3J0bV9kZWxsaW5rKHN0cnVjdCB3cGFfZHJpdmVyX3dleHRfZGF0YSAqZHJ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjdHgsIHN0cnVjdCBubG1zZ2hkciAqaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbikKK3sKKyAgICBzdHJ1Y3QgaWZpbmZvbXNnICppZmk7CisgICAgaW50IGF0dHJsZW4sIG5sbXNnX2xlbiwgcnRhX2xlbjsKKyAgICBzdHJ1Y3QgcnRhdHRyICogYXR0cjsKKworICAgIGlmIChsZW4gPCBzaXplb2YoKmlmaSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmaSA9IE5MTVNHX0RBVEEoaCk7CisKKyAgICBubG1zZ19sZW4gPSBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IGlmaW5mb21zZykpOworCisgICAgYXR0cmxlbiA9IGgtPm5sbXNnX2xlbiAtIG5sbXNnX2xlbjsKKyAgICBpZiAoYXR0cmxlbiA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF0dHIgPSAoc3RydWN0IHJ0YXR0ciAqKSAoKChjaGFyICopIGlmaSkgKyBubG1zZ19sZW4pOworCisgICAgcnRhX2xlbiA9IFJUQV9BTElHTihzaXplb2Yoc3RydWN0IHJ0YXR0cikpOworICAgIHdoaWxlIChSVEFfT0soYXR0ciwgYXR0cmxlbikpIHsKKyAgICAgICAgaWYgKGF0dHItPnJ0YV90eXBlID09IElGTEFfSUZOQU1FKSB7CisgICAgICAgICAgICB3cGFfZHJpdmVyX3dleHRfZXZlbnRfbGluayhkcnYsICBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoYXIgKikgYXR0cikgKyBydGFfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci0+cnRhX2xlbiAtIHJ0YV9sZW4sIDEpOworICAgICAgICB9CisgICAgICAgIGF0dHIgPSBSVEFfTkVYVChhdHRyLCBhdHRybGVuKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgd3BhX2RyaXZlcl93ZXh0X2V2ZW50X3JlY2VpdmUoaW50IHNvY2ssIHZvaWQgKmVsb29wX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICpzb2NrX2N0eCkKK3sKKyAgICBjaGFyIGJ1Zls4MTkyXTsKKyAgICBpbnQgbGVmdDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfbmwgZnJvbTsKKyAgICBzb2NrbGVuX3QgZnJvbWxlbjsKKyAgICBzdHJ1Y3Qgbmxtc2doZHIgKmg7CisgICAgaW50IG1heF9ldmVudHMgPSAxMDsKKwordHJ5X2FnYWluOgorICAgIGZyb21sZW4gPSBzaXplb2YoZnJvbSk7CisgICAgbGVmdCA9IHJlY3Zmcm9tKHNvY2ssIGJ1Ziwgc2l6ZW9mKGJ1ZiksIE1TR19ET05UV0FJVCwKKyAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmZyb20sICZmcm9tbGVuKTsKKyAgICBpZiAobGVmdCA8IDApIHsKKyAgICAgICAgaWYgKGVycm5vICE9IEVJTlRSICYmIGVycm5vICE9IEVBR0FJTikgeworICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfRVJST1IsICIlczogcmVjdmZyb20obmV0bGluayk6ICVkIiwgX19mdW5jX18sIGVycm5vKTsgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGggPSAoc3RydWN0IG5sbXNnaGRyICopIGJ1ZjsKKyAgICB3aGlsZSAobGVmdCA+PSAoaW50KSBzaXplb2YoKmgpKSB7CisgICAgICAgIGludCBsZW4sIHBsZW47CisKKyAgICAgICAgbGVuID0gaC0+bmxtc2dfbGVuOworICAgICAgICBwbGVuID0gbGVuIC0gc2l6ZW9mKCpoKTsKKyAgICAgICAgaWYgKGxlbiA+IGxlZnQgfHwgcGxlbiA8IDApIHsKKyAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiTWFsZm9ybWVkIG5ldGxpbmsgbWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICJsZW49JWQgbGVmdD0lZCBwbGVuPSVkIiwKKyAgICAgICAgICAgICAgICAgICBsZW4sIGxlZnQsIHBsZW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGgtPm5sbXNnX3R5cGUpIHsKKyAgICAgICAgY2FzZSBSVE1fTkVXTElOSzoKKyAgICAgICAgICAgIHdwYV9kcml2ZXJfd2V4dF9ldmVudF9ydG1fbmV3bGluayhlbG9vcF9jdHgsIHNvY2tfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwgcGxlbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVE1fREVMTElOSzoKKyAgICAgICAgICAgIHdwYV9kcml2ZXJfd2V4dF9ldmVudF9ydG1fZGVsbGluayhlbG9vcF9jdHgsIHNvY2tfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwgcGxlbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiA9IE5MTVNHX0FMSUdOKGxlbik7CisgICAgICAgIGxlZnQgLT0gbGVuOworICAgICAgICBoID0gKHN0cnVjdCBubG1zZ2hkciAqKSAoKGNoYXIgKikgaCArIGxlbik7CisgICAgfQorCisgICAgaWYgKGxlZnQgPiAwKSB7CisgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiJWQgZXh0cmEgYnl0ZXMgaW4gdGhlIGVuZCBvZiBuZXRsaW5rICIKKyAgICAgICAgICAgICAgICJtZXNzYWdlIiwgbGVmdCk7CisgICAgfQorCisgICAgaWYgKC0tbWF4X2V2ZW50cyA+IDApIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogVHJ5IHRvIHJlY2VpdmUgYWxsIGV2ZW50cyBpbiBvbmUgZWxvb3AgY2FsbCBpbiBvcmRlciB0bworICAgICAgICAgKiBsaW1pdCByYWNlIGNvbmRpdGlvbiBvbiBjYXNlcyB3aGVyZSBBc3NvY0luZm8gZXZlbnQsIEFzc29jCisgICAgICAgICAqIGV2ZW50LCBhbmQgRUFQT0wgZnJhbWVzIGFyZSByZWNlaXZlZCBtb3JlIG9yIGxlc3MgYXQgdGhlCisgICAgICAgICAqIHNhbWUgdGltZS4gV2Ugd2FudCB0byBwcm9jZXNzIHRoZSBldmVudCBtZXNzYWdlcyBmaXJzdAorICAgICAgICAgKiBiZWZvcmUgc3RhcnRpbmcgRUFQT0wgcHJvY2Vzc2luZy4KKyAgICAgICAgICovCisgICAgICAgIGdvdG8gdHJ5X2FnYWluOworICAgIH0KK30KKworCitzdGF0aWMgaW50IHdwYV9kcml2ZXJfd2V4dF9nZXRfaWZmbGFnc19pZm5hbWUoc3RydWN0IHdwYV9kcml2ZXJfd2V4dF9kYXRhICpkcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmlmbmFtZSwgaW50ICpmbGFncykKK3sKKyAgICBzdHJ1Y3QgaWZyZXEgaWZyOworCisgICAgb3NfbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKyAgICBvc19zdHJsY3B5KGlmci5pZnJfbmFtZSwgaWZuYW1lLCBJRk5BTVNJWik7CisgICAgaWYgKGlvY3RsKGRydi0+aW9jdGxfc29jaywgU0lPQ0dJRkZMQUdTLCAoY2FkZHJfdCkgJmlmcikgPCAwKSB7CisgICAgICAgIHdwYV9wcmludGYoTVNHX0VSUk9SLCAiaW9jdGxbU0lPQ0dJRkZMQUdTXSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICpmbGFncyA9IGlmci5pZnJfZmxhZ3MgJiAweGZmZmY7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgd3BhX2RyaXZlcl93ZXh0X2ZpbmlzaF9kcnZfaW5pdChzdHJ1Y3Qgd3BhX2RyaXZlcl93ZXh0X2RhdGEgKmRydikKK3sKKyAgICBpbnQgZmxhZ3M7CisKKyAgICBpZiAod3BhX2RyaXZlcl93ZXh0X2dldF9pZmZsYWdzKGRydiwgJmZsYWdzKSAhPSAwKSB7CisgICAgICAgIHByaW50ZigiQ291bGQgbm90IGdldCBpbnRlcmZhY2UgJyVzJyBmbGFnc1xuIiwgZHJ2LT5pZm5hbWUpOworICAgIH0gZWxzZSBpZiAoIShmbGFncyAmIElGRl9VUCkpIHsKKyAgICAgICAgaWYgKHdwYV9kcml2ZXJfd2V4dF9zZXRfaWZmbGFncyhkcnYsIGZsYWdzIHwgSUZGX1VQKSAhPSAwKSB7CisgICAgICAgICAgICBwcmludGYoIkNvdWxkIG5vdCBzZXQgaW50ZXJmYWNlICclcycgVVBcbiIsCisgICAgICAgICAgICAgICAgICAgZHJ2LT5pZm5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFdhaXQgc29tZSB0aW1lIHRvIGFsbG93IGRyaXZlciB0byBpbml0aWFsaXplIGJlZm9yZQorICAgICAgICAgICAgICogc3RhcnRpbmcgY29uZmlndXJpbmcgdGhlIGRyaXZlci4gVGhpcyBzZWVtcyB0byBiZQorICAgICAgICAgICAgICogbmVlZGVkIGF0IGxlYXN0IHNvbWUgZHJpdmVycyB0aGF0IGxvYWQgZmlybXdhcmUgZXRjLgorICAgICAgICAgICAgICogd2hlbiB0aGUgaW50ZXJmYWNlIGlzIHNldCB1cC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJJbnRlcmZhY2UgJXMgc2V0IFVQIC0gd2FpdGluZyAiCisgICAgICAgICAgICAgICAgICAgImEgc2Vjb25kIGZvciB0aGUgZHJpdmVyIHRvIGNvbXBsZXRlICIKKyAgICAgICAgICAgICAgICAgICAiaW5pdGlhbGl6YXRpb24iLCBkcnYtPmlmbmFtZSk7CisgICAgICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTWFrZSBzdXJlIHRoYXQgdGhlIGRyaXZlciBkb2VzIG5vdCBoYXZlIGFueSBvYnNvbGV0ZSBQTUtJRCBlbnRyaWVzLgorICAgICAqLworICAgIHdwYV9kcml2ZXJfd2V4dF9mbHVzaF9wbWtpZChkcnYpOworCisgICAgaWYgKHdwYV9kcml2ZXJfd2V4dF9zZXRfbW9kZShkcnYsIDApIDwgMCkgeworICAgICAgICBwcmludGYoIkNvdWxkIG5vdCBjb25maWd1cmUgZHJpdmVyIHRvIHVzZSBtYW5hZ2VkIG1vZGVcbiIpOworICAgIH0KKworICAgIHdwYV9kcml2ZXJfd2V4dF9nZXRfcmFuZ2UoZHJ2KTsKKworICAgIC8qCisgICAgICogVW5sb2NrIHRoZSBkcml2ZXIncyBCU1NJRCBhbmQgZm9yY2UgdG8gYSByYW5kb20gU1NJRCB0byBjbGVhciBhbnkKKyAgICAgKiBwcmV2aW91cyBhc3NvY2lhdGlvbiB0aGUgZHJpdmVyIG1pZ2h0IGhhdmUgd2hlbiB0aGUgc3VwcGxpY2FudAorICAgICAqIHN0YXJ0cyB1cC4KKyAgICAgKi8KKyAgICB3cGFfZHJpdmVyX3dleHRfZGlzY29ubmVjdChkcnYpOworCisgICAgZHJ2LT5pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoZHJ2LT5pZm5hbWUpOworCisgICAgaWYgKG9zX3N0cm5jbXAoZHJ2LT5pZm5hbWUsICJ3bGFuIiwgNCkgPT0gMCkgeworICAgICAgICAvKgorICAgICAgICAgKiBIb3N0IEFQIGRyaXZlciBtYXkgdXNlIGJvdGggd2xhbiMgYW5kIHdpZmkjIGludGVyZmFjZSBpbgorICAgICAgICAgKiB3aXJlbGVzcyBldmVudHMuIFNpbmNlIHNvbWUgb2YgdGhlIHZlcnNpb25zIGluY2x1ZGVkIFdFLTE4CisgICAgICAgICAqIHN1cHBvcnQsIGxldCdzIGFkZCB0aGUgYWx0ZXJuYXRpdmUgaWZpbmRleCBhbHNvIGZyb20KKyAgICAgICAgICogZHJpdmVyX3dleHQuYyBmb3IgdGhlIHRpbWUgYmVpbmcuIFRoaXMgbWF5IGJlIHJlbW92ZWQgYXQKKyAgICAgICAgICogc29tZSBwb2ludCBvbmNlIGl0IGlzIGJlbGlldmVkIHRoYXQgb2xkIHZlcnNpb25zIG9mIHRoZQorICAgICAgICAgKiBkcml2ZXIgYXJlIG5vdCBpbiB1c2UgYW55bW9yZS4KKyAgICAgICAgICovCisgICAgICAgIGNoYXIgaWZuYW1lMltJRk5BTVNJWiArIDFdOworICAgICAgICBvc19zdHJsY3B5KGlmbmFtZTIsIGRydi0+aWZuYW1lLCBzaXplb2YoaWZuYW1lMikpOworICAgICAgICBvc19tZW1jcHkoaWZuYW1lMiwgIndpZmkiLCA0KTsKKyAgICAgICAgd3BhX2RyaXZlcl93ZXh0X2FsdGVybmF0aXZlX2lmaW5kZXgoZHJ2LCBpZm5hbWUyKTsKKyAgICB9CisKKyAgICB3cGFfZHJpdmVyX3dleHRfc2VuZF9vcGVyX2lmbGEoZHJ2LCAxLCBJRl9PUEVSX0RPUk1BTlQpOworfQorCisKKy8qKgorICogd3BhX2RyaXZlcl93ZXh0X3NldF9zY2FuX3RpbWVvdXQgLSBTZXQgc2NhbiB0aW1lb3V0IHRvIHJlcG9ydCBzY2FuIGNvbXBsZXRpb24KKyAqIEBwcml2OiAgUG9pbnRlciB0byBwcml2YXRlIHdleHQgZGF0YSBmcm9tIHdwYV9kcml2ZXJfd2V4dF9pbml0KCkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHNldCByZWdpc3RlcmVkIHRpbWVvdXQgd2hlbiBzdGFydGluZyBhIHNjYW4gdG8KKyAqIGdlbmVyYXRlIGEgc2NhbiBjb21wbGV0ZWQgZXZlbnQgaWYgdGhlIGRyaXZlciBkb2VzIG5vdCByZXBvcnQgdGhpcy4KKyAqLworc3RhdGljIHZvaWQgd3BhX2RyaXZlcl93ZXh0X3NldF9zY2FuX3RpbWVvdXQodm9pZCAqcHJpdikKK3sKKyAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl93ZXh0X2RhdGEgKmRydiA9IHByaXY7CisgICAgaW50IHRpbWVvdXQgPSAxMDsgLyogSW4gY2FzZSBzY2FuIEEgYW5kIEIgYmFuZHMgaXQgY2FuIGJlIGxvbmcgKi8KKworICAgIC8qIE5vdCBhbGwgZHJpdmVycyBnZW5lcmF0ZSAic2NhbiBjb21wbGV0ZWQiIHdpcmVsZXNzIGV2ZW50LCBzbyB0cnkgdG8KKyAgICAgKiByZWFkIHJlc3VsdHMgYWZ0ZXIgYSB0aW1lb3V0LiAqLworICAgIGlmIChkcnYtPnNjYW5fY29tcGxldGVfZXZlbnRzKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBkcml2ZXIgc2VlbXMgdG8gZGVsaXZlciBTSU9DR0lXU0NBTiBldmVudHMgdG8gbm90aWZ5CisgICAgICAgICAqIHdoZW4gc2NhbiBpcyBjb21wbGV0ZSwgc28gdXNlIGxvbmdlciB0aW1lb3V0IHRvIGF2b2lkIHJhY2UKKyAgICAgICAgICogY29uZGl0aW9ucyB3aXRoIHNjYW5uaW5nIGFuZCBmb2xsb3dpbmcgYXNzb2NpYXRpb24gcmVxdWVzdC4KKyAgICAgICAgICovCisgICAgICAgIHRpbWVvdXQgPSAzMDsKKyAgICB9CisgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJTY2FuIHJlcXVlc3RlZCAtIHNjYW4gdGltZW91dCAlZCBzZWNvbmRzIiwKKyAgICAgICAgICAgdGltZW91dCk7CisgICAgZWxvb3BfY2FuY2VsX3RpbWVvdXQod3BhX2RyaXZlcl93ZXh0X3NjYW5fdGltZW91dCwgZHJ2LCBkcnYtPmN0eCk7CisgICAgZWxvb3BfcmVnaXN0ZXJfdGltZW91dCh0aW1lb3V0LCAwLCB3cGFfZHJpdmVyX3dleHRfc2Nhbl90aW1lb3V0LCBkcnYsCisgICAgICAgICAgICAgICAgICAgZHJ2LT5jdHgpOworfQorCisKK3N0YXRpYyB1OCAqIHdwYV9kcml2ZXJfd2V4dF9naXdzY2FuKHN0cnVjdCB3cGFfZHJpdmVyX3dleHRfZGF0YSAqZHJ2LAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmxlbikKK3sKKyAgICBzdHJ1Y3QgaXdyZXEgaXdyOworICAgIHU4ICpyZXNfYnVmOworICAgIHNpemVfdCByZXNfYnVmX2xlbjsKKworICAgIHJlc19idWZfbGVuID0gSVdfU0NBTl9NQVhfREFUQTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHJlc19idWYgPSBvc19tYWxsb2MocmVzX2J1Zl9sZW4pOworICAgICAgICBpZiAocmVzX2J1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBvc19tZW1zZXQoJml3ciwgMCwgc2l6ZW9mKGl3cikpOworICAgICAgICBvc19zdHJsY3B5KGl3ci5pZnJfbmFtZSwgZHJ2LT5pZm5hbWUsIElGTkFNU0laKTsKKyAgICAgICAgaXdyLnUuZGF0YS5wb2ludGVyID0gcmVzX2J1ZjsKKyAgICAgICAgaXdyLnUuZGF0YS5sZW5ndGggPSByZXNfYnVmX2xlbjsKKworICAgICAgICBpZiAoaW9jdGwoZHJ2LT5pb2N0bF9zb2NrLCBTSU9DR0lXU0NBTiwgJml3cikgPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJybm8gPT0gRTJCSUcgJiYgcmVzX2J1Zl9sZW4gPCA2NTUzNSkgeworICAgICAgICAgICAgb3NfZnJlZShyZXNfYnVmKTsKKyAgICAgICAgICAgIHJlc19idWYgPSBOVUxMOworICAgICAgICAgICAgcmVzX2J1Zl9sZW4gKj0gMjsKKyAgICAgICAgICAgIGlmIChyZXNfYnVmX2xlbiA+IDY1NTM1KSB7CisgICAgICAgICAgICAgICAgcmVzX2J1Zl9sZW4gPSA2NTUzNTsgLyogMTYtYml0IGxlbmd0aCBmaWVsZCAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJTY2FuIHJlc3VsdHMgZGlkIG5vdCBmaXQgLSAiCisgICAgICAgICAgICAgICAgICAgInRyeWluZyBsYXJnZXIgYnVmZmVyICglbHUgYnl0ZXMpIiwKKyAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgcmVzX2J1Zl9sZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfRVJST1IsICJpb2N0bFtTSU9DR0lXU0NBTl06ICVkIiwgZXJybm8pOworICAgICAgICAgICAgb3NfZnJlZShyZXNfYnVmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGl3ci51LmRhdGEubGVuZ3RoID4gcmVzX2J1Zl9sZW4pIHsKKyAgICAgICAgb3NfZnJlZShyZXNfYnVmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgICpsZW4gPSBpd3IudS5kYXRhLmxlbmd0aDsKKworICAgIHJldHVybiByZXNfYnVmOworfQorCisKKy8qCisgKiBEYXRhIHN0cnVjdHVyZSBmb3IgY29sbGVjdGluZyBXRVhUIHNjYW4gcmVzdWx0cy4gVGhpcyBpcyBuZWVkZWQgdG8gYWxsb3cKKyAqIHRoZSB2YXJpb3VzIG1ldGhvZHMgb2YgcmVwb3J0aW5nIElFcyB0byBiZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIElFIGJ1ZmZlci4KKyAqLworc3RydWN0IHdleHRfc2Nhbl9kYXRhIHsKKyAgICBzdHJ1Y3Qgd3BhX3NjYW5fcmVzIHJlczsKKyAgICB1OCAqaWU7CisgICAgc2l6ZV90IGllX2xlbjsKKyAgICB1OCBzc2lkWzMyXTsKKyAgICBzaXplX3Qgc3NpZF9sZW47CisgICAgaW50IG1heHJhdGU7Cit9OworCisKK3N0YXRpYyB2b2lkIHdleHRfZ2V0X3NjYW5fbW9kZShzdHJ1Y3QgaXdfZXZlbnQgKml3ZSwKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd2V4dF9zY2FuX2RhdGEgKnJlcykKK3sKKyAgICBpZiAoaXdlLT51Lm1vZGUgPT0gSVdfTU9ERV9BREhPQykgeworICAgICAgICByZXMtPnJlcy5jYXBzIHw9IElFRUU4MDIxMV9DQVBfSUJTUzsKKyAgICB9IGVsc2UgaWYgKGl3ZS0+dS5tb2RlID09IElXX01PREVfTUFTVEVSIHx8CisgICAgICAgICAgICAgaXdlLT51Lm1vZGUgPT0gSVdfTU9ERV9JTkZSQSkgeworICAgICAgICByZXMtPnJlcy5jYXBzIHw9IElFRUU4MDIxMV9DQVBfRVNTOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCB3ZXh0X2dldF9zY2FuX3NzaWQoc3RydWN0IGl3X2V2ZW50ICppd2UsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IHdleHRfc2Nhbl9kYXRhICpyZXMsIGNoYXIgKmN1c3RvbSwKKyAgICAgICAgICAgICAgICAgICBjaGFyICplbmQpCit7CisgICAgaW50IHNzaWRfbGVuID0gaXdlLT51LmVzc2lkLmxlbmd0aDsKKyAgICBpZiAoY3VzdG9tICsgc3NpZF9sZW4gPiBlbmQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoaXdlLT51LmVzc2lkLmZsYWdzICYmCisgICAgICAgIHNzaWRfbGVuID4gMCAmJgorICAgICAgICBzc2lkX2xlbiA8PSBJV19FU1NJRF9NQVhfU0laRSkgeworICAgICAgICBvc19tZW1jcHkocmVzLT5zc2lkLCBjdXN0b20sIHNzaWRfbGVuKTsKKyAgICAgICAgcmVzLT5zc2lkX2xlbiA9IHNzaWRfbGVuOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCB3ZXh0X2dldF9zY2FuX2ZyZXEoc3RydWN0IGl3X2V2ZW50ICppd2UsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IHdleHRfc2Nhbl9kYXRhICpyZXMpCit7CisgICAgaW50IGRpdmkgPSAxMDAwMDAwLCBpOworCisgICAgaWYgKGl3ZS0+dS5mcmVxLmUgPT0gMCkgeworICAgICAgICAvKgorICAgICAgICAgKiBTb21lIGRyaXZlcnMgZG8gbm90IHJlcG9ydCBmcmVxdWVuY3ksIGJ1dCBhIGNoYW5uZWwuCisgICAgICAgICAqIFRyeSB0byBtYXAgdGhpcyB0byBmcmVxdWVuY3kgYnkgYXNzdW1pbmcgdGhleSBhcmUgdXNpbmcKKyAgICAgICAgICogSUVFRSA4MDIuMTFiL2cuICBCdXQgZG9uJ3Qgb3ZlcndyaXRlIGEgcHJldmlvdXNseSBwYXJzZWQKKyAgICAgICAgICogZnJlcXVlbmN5IGlmIHRoZSBkcml2ZXIgc2VuZHMgYm90aCBmcmVxdWVuY3kgYW5kIGNoYW5uZWwsCisgICAgICAgICAqIHNpbmNlIHRoZSBkcml2ZXIgbWF5IGJlIHNlbmRpbmcgYW4gQS1iYW5kIGNoYW5uZWwgdGhhdCB3ZQorICAgICAgICAgKiBkb24ndCBoYW5kbGUgaGVyZS4KKyAgICAgICAgICovCisKKyAgICAgICAgaWYgKHJlcy0+cmVzLmZyZXEpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpd2UtPnUuZnJlcS5tID49IDEgJiYgaXdlLT51LmZyZXEubSA8PSAxMykgeworICAgICAgICAgICAgcmVzLT5yZXMuZnJlcSA9IDI0MDcgKyA1ICogaXdlLT51LmZyZXEubTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChpd2UtPnUuZnJlcS5tID09IDE0KSB7CisgICAgICAgICAgICByZXMtPnJlcy5mcmVxID0gMjQ4NDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpd2UtPnUuZnJlcS5lID4gNikgeworICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgIkludmFsaWQgZnJlcSBpbiBzY2FuIHJlc3VsdHMgKEJTU0lEPSIKKyAgICAgICAgICAgICAgIE1BQ1NUUiAiIG09JWQgZT0lZCkiLAorICAgICAgICAgICAgICAgTUFDMlNUUihyZXMtPnJlcy5ic3NpZCksIGl3ZS0+dS5mcmVxLm0sCisgICAgICAgICAgICAgICBpd2UtPnUuZnJlcS5lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBpd2UtPnUuZnJlcS5lOyBpKyspCisgICAgICAgIGRpdmkgLz0gMTA7CisgICAgcmVzLT5yZXMuZnJlcSA9IGl3ZS0+dS5mcmVxLm0gLyBkaXZpOworfQorCisKK3N0YXRpYyB2b2lkIHdleHRfZ2V0X3NjYW5fcXVhbChzdHJ1Y3QgaXdfZXZlbnQgKml3ZSwKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd2V4dF9zY2FuX2RhdGEgKnJlcykKK3sKKyAgICByZXMtPnJlcy5xdWFsID0gaXdlLT51LnF1YWwucXVhbDsKKyAgICByZXMtPnJlcy5ub2lzZSA9IGl3ZS0+dS5xdWFsLm5vaXNlOworICAgIHJlcy0+cmVzLmxldmVsID0gaXdlLT51LnF1YWwubGV2ZWw7Cit9CisKKworc3RhdGljIHZvaWQgd2V4dF9nZXRfc2Nhbl9lbmNvZGUoc3RydWN0IGl3X2V2ZW50ICppd2UsCisgICAgICAgICAgICAgICAgIHN0cnVjdCB3ZXh0X3NjYW5fZGF0YSAqcmVzKQoreworICAgIGlmICghKGl3ZS0+dS5kYXRhLmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSkgeworICAgICAgICByZXMtPnJlcy5jYXBzIHw9IElFRUU4MDIxMV9DQVBfUFJJVkFDWTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgd2V4dF9nZXRfc2Nhbl9yYXRlKHN0cnVjdCBpd19ldmVudCAqaXdlLAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3ZXh0X3NjYW5fZGF0YSAqcmVzLCBjaGFyICpwb3MsCisgICAgICAgICAgICAgICAgICAgY2hhciAqZW5kKQoreworICAgIGludCBtYXhyYXRlOworICAgIGNoYXIgKmN1c3RvbSA9IHBvcyArIElXX0VWX0xDUF9MRU47CisgICAgc3RydWN0IGl3X3BhcmFtIHA7CisgICAgc2l6ZV90IGNsZW47CisKKyAgICBjbGVuID0gaXdlLT5sZW47CisgICAgaWYgKGN1c3RvbSArIGNsZW4gPiBlbmQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtYXhyYXRlID0gMDsKKyAgICB3aGlsZSAoKChzc2l6ZV90KSBjbGVuKSA+PSAoc3NpemVfdCkgc2l6ZW9mKHN0cnVjdCBpd19wYXJhbSkpIHsKKyAgICAgICAgLyogTm90ZTogbWF5IGJlIG1pc2FsaWduZWQsIG1ha2UgYSBsb2NhbCwgYWxpZ25lZCBjb3B5ICovCisgICAgICAgIG9zX21lbWNweSgmcCwgY3VzdG9tLCBzaXplb2Yoc3RydWN0IGl3X3BhcmFtKSk7CisgICAgICAgIGlmIChwLnZhbHVlID4gbWF4cmF0ZSkgeworICAgICAgICAgICAgbWF4cmF0ZSA9IHAudmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgY2xlbiAtPSBzaXplb2Yoc3RydWN0IGl3X3BhcmFtKTsKKyAgICAgICAgY3VzdG9tICs9IHNpemVvZihzdHJ1Y3QgaXdfcGFyYW0pOworICAgIH0KKworICAgIC8qIENvbnZlcnQgdGhlIG1heHJhdGUgZnJvbSBXRS1zdHlsZSAoYi9zIHVuaXRzKSB0bworICAgICAqIDgwMi4xMSByYXRlcyAoNTAwMDAwIGIvcyB1bml0cykuCisgICAgICovCisgICAgcmVzLT5tYXhyYXRlID0gbWF4cmF0ZSAvIDUwMDAwMDsKK30KKworCitzdGF0aWMgdm9pZCB3ZXh0X2dldF9zY2FuX2l3ZXZnZW5pZShzdHJ1Y3QgaXdfZXZlbnQgKml3ZSwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IHdleHRfc2Nhbl9kYXRhICpyZXMsIGNoYXIgKmN1c3RvbSwKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqZW5kKQoreworICAgIGNoYXIgKmdlbmllLCAqZ3BvcywgKmdlbmQ7CisgICAgdTggKnRtcDsKKworICAgIGlmIChpd2UtPnUuZGF0YS5sZW5ndGggPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ3BvcyA9IGdlbmllID0gY3VzdG9tOworICAgIGdlbmQgPSBnZW5pZSArIGl3ZS0+dS5kYXRhLmxlbmd0aDsKKyAgICBpZiAoZ2VuZCA+IGVuZCkgeworICAgICAgICB3cGFfcHJpbnRmKE1TR19JTkZPLCAiSVdFVkdFTklFIG92ZXJmbG93Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0bXAgPSBvc19yZWFsbG9jKHJlcy0+aWUsIHJlcy0+aWVfbGVuICsgZ2VuZCAtIGdwb3MpOworICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG9zX21lbWNweSh0bXAgKyByZXMtPmllX2xlbiwgZ3BvcywgZ2VuZCAtIGdwb3MpOworICAgIHJlcy0+aWUgPSB0bXA7CisgICAgcmVzLT5pZV9sZW4gKz0gZ2VuZCAtIGdwb3M7Cit9CisKKworc3RhdGljIHZvaWQgd2V4dF9nZXRfc2Nhbl9jdXN0b20oc3RydWN0IGl3X2V2ZW50ICppd2UsCisgICAgICAgICAgICAgICAgIHN0cnVjdCB3ZXh0X3NjYW5fZGF0YSAqcmVzLCBjaGFyICpjdXN0b20sCisgICAgICAgICAgICAgICAgIGNoYXIgKmVuZCkKK3sKKyAgICBzaXplX3QgY2xlbjsKKyAgICB1OCAqdG1wOworCisgICAgY2xlbiA9IGl3ZS0+dS5kYXRhLmxlbmd0aDsKKyAgICBpZiAoY3VzdG9tICsgY2xlbiA+IGVuZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGNsZW4gPiA3ICYmIG9zX3N0cm5jbXAoY3VzdG9tLCAid3BhX2llPSIsIDcpID09IDApIHsKKyAgICAgICAgY2hhciAqc3BvczsKKyAgICAgICAgaW50IGJ5dGVzOworICAgICAgICBzcG9zID0gY3VzdG9tICsgNzsKKyAgICAgICAgYnl0ZXMgPSBjdXN0b20gKyBjbGVuIC0gc3BvczsKKyAgICAgICAgaWYgKGJ5dGVzICYgMSB8fCBieXRlcyA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnl0ZXMgLz0gMjsKKyAgICAgICAgdG1wID0gb3NfcmVhbGxvYyhyZXMtPmllLCByZXMtPmllX2xlbiArIGJ5dGVzKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaGV4c3RyMmJpbihzcG9zLCB0bXAgKyByZXMtPmllX2xlbiwgYnl0ZXMpOworICAgICAgICByZXMtPmllID0gdG1wOworICAgICAgICByZXMtPmllX2xlbiArPSBieXRlczsKKyAgICB9IGVsc2UgaWYgKGNsZW4gPiA3ICYmIG9zX3N0cm5jbXAoY3VzdG9tLCAicnNuX2llPSIsIDcpID09IDApIHsKKyAgICAgICAgY2hhciAqc3BvczsKKyAgICAgICAgaW50IGJ5dGVzOworICAgICAgICBzcG9zID0gY3VzdG9tICsgNzsKKyAgICAgICAgYnl0ZXMgPSBjdXN0b20gKyBjbGVuIC0gc3BvczsKKyAgICAgICAgaWYgKGJ5dGVzICYgMSB8fCBieXRlcyA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnl0ZXMgLz0gMjsKKyAgICAgICAgdG1wID0gb3NfcmVhbGxvYyhyZXMtPmllLCByZXMtPmllX2xlbiArIGJ5dGVzKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaGV4c3RyMmJpbihzcG9zLCB0bXAgKyByZXMtPmllX2xlbiwgYnl0ZXMpOworICAgICAgICByZXMtPmllID0gdG1wOworICAgICAgICByZXMtPmllX2xlbiArPSBieXRlczsKKyAgICB9IGVsc2UgaWYgKGNsZW4gPiA0ICYmIG9zX3N0cm5jbXAoY3VzdG9tLCAidHNmPSIsIDQpID09IDApIHsKKyAgICAgICAgY2hhciAqc3BvczsKKyAgICAgICAgaW50IGJ5dGVzOworICAgICAgICB1OCBiaW5bOF07CisgICAgICAgIHNwb3MgPSBjdXN0b20gKyA0OworICAgICAgICBieXRlcyA9IGN1c3RvbSArIGNsZW4gLSBzcG9zOworICAgICAgICBpZiAoYnl0ZXMgIT0gMTYpIHsKKyAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0lORk8sICJJbnZhbGlkIFRTRiBsZW5ndGggKCVkKSIsIGJ5dGVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBieXRlcyAvPSAyOworICAgICAgICBoZXhzdHIyYmluKHNwb3MsIGJpbiwgYnl0ZXMpOworICAgICAgICByZXMtPnJlcy50c2YgKz0gV1BBX0dFVF9CRTY0KGJpbik7CisgICAgfQorfQorCisKK3N0YXRpYyBpbnQgd2V4dF8xOV9pd19wb2ludChzdHJ1Y3Qgd3BhX2RyaXZlcl93ZXh0X2RhdGEgKmRydiwgdTE2IGNtZCkKK3sKKyAgICByZXR1cm4gZHJ2LT53ZV92ZXJzaW9uX2NvbXBpbGVkID4gMTggJiYKKyAgICAgICAgKGNtZCA9PSBTSU9DR0lXRVNTSUQgfHwgY21kID09IFNJT0NHSVdFTkNPREUgfHwKKyAgICAgICAgIGNtZCA9PSBJV0VWR0VOSUUgfHwgY21kID09IElXRVZDVVNUT00pOworfQorCisKK3N0YXRpYyB2b2lkIHdwYV9kcml2ZXJfd2V4dF9hZGRfc2Nhbl9lbnRyeShzdHJ1Y3Qgd3BhX3NjYW5fcmVzdWx0cyAqcmVzLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd2V4dF9zY2FuX2RhdGEgKmRhdGEpCit7CisgICAgc3RydWN0IHdwYV9zY2FuX3JlcyAqKnRtcDsKKyAgICBzdHJ1Y3Qgd3BhX3NjYW5fcmVzICpyOworICAgIHNpemVfdCBleHRyYV9sZW47CisgICAgdTggKnBvcywgKmVuZCwgKnNzaWRfaWUgPSBOVUxMLCAqcmF0ZV9pZSA9IE5VTEw7CisKKyAgICAvKiBGaWd1cmUgb3V0IHdoZXRoZXIgd2UgbmVlZCB0byBmYWtlIGFueSBJRXMgKi8KKyAgICBwb3MgPSBkYXRhLT5pZTsKKyAgICBlbmQgPSBwb3MgKyBkYXRhLT5pZV9sZW47CisgICAgd2hpbGUgKHBvcyAmJiBwb3MgKyAxIDwgZW5kKSB7CisgICAgICAgIGlmIChwb3MgKyAyICsgcG9zWzFdID4gZW5kKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAocG9zWzBdID09IFdMQU5fRUlEX1NTSUQpIHsKKyAgICAgICAgICAgIHNzaWRfaWUgPSBwb3M7CisgICAgICAgIH0gZWxzZSBpZiAocG9zWzBdID09IFdMQU5fRUlEX1NVUFBfUkFURVMpIHsKKyAgICAgICAgICAgIHJhdGVfaWUgPSBwb3M7CisgICAgICAgIH0gZWxzZSBpZiAocG9zWzBdID09IFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTKSB7CisgICAgICAgICAgICByYXRlX2llID0gcG9zOworICAgICAgICB9CisgICAgICAgIHBvcyArPSAyICsgcG9zWzFdOworICAgIH0KKworICAgIGV4dHJhX2xlbiA9IDA7CisgICAgaWYgKHNzaWRfaWUgPT0gTlVMTCkgeworICAgICAgICBleHRyYV9sZW4gKz0gMiArIGRhdGEtPnNzaWRfbGVuOworICAgIH0KKyAgICBpZiAocmF0ZV9pZSA9PSBOVUxMICYmIGRhdGEtPm1heHJhdGUpIHsKKyAgICAgICAgZXh0cmFfbGVuICs9IDM7CisgICAgfQorCisgICAgciA9IG9zX3phbGxvYyhzaXplb2YoKnIpICsgZXh0cmFfbGVuICsgZGF0YS0+aWVfbGVuKTsKKyAgICBpZiAociA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgb3NfbWVtY3B5KHIsICZkYXRhLT5yZXMsIHNpemVvZigqcikpOworICAgIHItPmllX2xlbiA9IGV4dHJhX2xlbiArIGRhdGEtPmllX2xlbjsKKyAgICBwb3MgPSAodTggKikgKHIgKyAxKTsKKyAgICBpZiAoc3NpZF9pZSA9PSBOVUxMKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIEdlbmVyYXRlIGEgZmFrZSBTU0lEIElFIHNpbmNlIHRoZSBkcml2ZXIgZGlkIG5vdCByZXBvcnQKKyAgICAgICAgICogYSBmdWxsIElFIGxpc3QuCisgICAgICAgICAqLworICAgICAgICAqcG9zKysgPSBXTEFOX0VJRF9TU0lEOworICAgICAgICAqcG9zKysgPSBkYXRhLT5zc2lkX2xlbjsKKyAgICAgICAgb3NfbWVtY3B5KHBvcywgZGF0YS0+c3NpZCwgZGF0YS0+c3NpZF9sZW4pOworICAgICAgICBwb3MgKz0gZGF0YS0+c3NpZF9sZW47CisgICAgfQorICAgIGlmIChyYXRlX2llID09IE5VTEwgJiYgZGF0YS0+bWF4cmF0ZSkgeworICAgICAgICAvKgorICAgICAgICAgKiBHZW5lcmF0ZSBhIGZha2UgU3VwcG9ydGVkIFJhdGVzIElFIHNpbmNlIHRoZSBkcml2ZXIgZGlkIG5vdAorICAgICAgICAgKiByZXBvcnQgYSBmdWxsIElFIGxpc3QuCisgICAgICAgICAqLworICAgICAgICAqcG9zKysgPSBXTEFOX0VJRF9TVVBQX1JBVEVTOworICAgICAgICAqcG9zKysgPSAxOworICAgICAgICAqcG9zKysgPSBkYXRhLT5tYXhyYXRlOworICAgIH0KKyAgICBpZiAoZGF0YS0+aWUpIHsKKyAgICAgICAgb3NfbWVtY3B5KHBvcywgZGF0YS0+aWUsIGRhdGEtPmllX2xlbik7CisgICAgfQorCisgICAgdG1wID0gb3NfcmVhbGxvYyhyZXMtPnJlcywKKyAgICAgICAgICAgICAocmVzLT5udW0gKyAxKSAqIHNpemVvZihzdHJ1Y3Qgd3BhX3NjYW5fcmVzICopKTsKKyAgICBpZiAodG1wID09IE5VTEwpIHsKKyAgICAgICAgb3NfZnJlZShyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB0bXBbcmVzLT5udW0rK10gPSByOworICAgIHJlcy0+cmVzID0gdG1wOworfQorCisKKworc3RhdGljIGludCB3cGFfZHJpdmVyX3dleHRfZ2V0X3JhbmdlKHZvaWQgKnByaXYpCit7CisgICAgc3RydWN0IHdwYV9kcml2ZXJfd2V4dF9kYXRhICpkcnYgPSBwcml2OworICAgIHN0cnVjdCBpd19yYW5nZSAqcmFuZ2U7CisgICAgc3RydWN0IGl3cmVxIGl3cjsKKyAgICBpbnQgbWlubGVuOworICAgIHNpemVfdCBidWZsZW47CisKKyAgICAvKgorICAgICAqIFVzZSBsYXJnZXIgYnVmZmVyIHRoYW4gc3RydWN0IGl3X3JhbmdlIGluIG9yZGVyIHRvIGFsbG93IHRoZQorICAgICAqIHN0cnVjdHVyZSB0byBncm93IGluIHRoZSBmdXR1cmUuCisgICAgICovCisgICAgYnVmbGVuID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkgKyA1MDA7CisgICAgcmFuZ2UgPSBvc196YWxsb2MoYnVmbGVuKTsKKyAgICBpZiAocmFuZ2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgb3NfbWVtc2V0KCZpd3IsIDAsIHNpemVvZihpd3IpKTsKKyAgICBvc19zdHJsY3B5KGl3ci5pZnJfbmFtZSwgZHJ2LT5pZm5hbWUsIElGTkFNU0laKTsKKyAgICBpd3IudS5kYXRhLnBvaW50ZXIgPSAoY2FkZHJfdCkgcmFuZ2U7CisgICAgaXdyLnUuZGF0YS5sZW5ndGggPSBidWZsZW47CisKKyAgICBtaW5sZW4gPSAoKGNoYXIgKikgJnJhbmdlLT5lbmNfY2FwYSkgLSAoY2hhciAqKSByYW5nZSArCisgICAgICAgIHNpemVvZihyYW5nZS0+ZW5jX2NhcGEpOworCisgICAgaWYgKGlvY3RsKGRydi0+aW9jdGxfc29jaywgU0lPQ0dJV1JBTkdFLCAmaXdyKSA8IDApIHsKKyAgICAgICAgd3BhX3ByaW50ZihNU0dfRVJST1IsICJpb2N0bFtTSU9DR0lSQU5HRV0iKTsKKyAgICAgICAgb3NfZnJlZShyYW5nZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKGl3ci51LmRhdGEubGVuZ3RoID49IG1pbmxlbiAmJgorICAgICAgICAgICByYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA+PSAxOCkgeworICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNJT0NHSVdSQU5HRTogV0UoY29tcGlsZWQpPSVkICIKKyAgICAgICAgICAgICAgICJXRShzb3VyY2UpPSVkIGVuY19jYXBhPTB4JXgiLAorICAgICAgICAgICAgICAgcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQsCisgICAgICAgICAgICAgICByYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UsCisgICAgICAgICAgICAgICByYW5nZS0+ZW5jX2NhcGEpOworICAgICAgICBkcnYtPmhhc19jYXBhYmlsaXR5ID0gMTsKKyAgICAgICAgZHJ2LT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQ7CisgICAgICAgIGlmIChyYW5nZS0+ZW5jX2NhcGEgJiBJV19FTkNfQ0FQQV9XUEEpIHsKKyAgICAgICAgICAgIGRydi0+Y2FwYS5rZXlfbWdtdCB8PSBXUEFfRFJJVkVSX0NBUEFfS0VZX01HTVRfV1BBIHwKKyAgICAgICAgICAgICAgICBXUEFfRFJJVkVSX0NBUEFfS0VZX01HTVRfV1BBX1BTSzsKKyAgICAgICAgfQorICAgICAgICBpZiAocmFuZ2UtPmVuY19jYXBhICYgSVdfRU5DX0NBUEFfV1BBMikgeworICAgICAgICAgICAgZHJ2LT5jYXBhLmtleV9tZ210IHw9IFdQQV9EUklWRVJfQ0FQQV9LRVlfTUdNVF9XUEEyIHwKKyAgICAgICAgICAgICAgICBXUEFfRFJJVkVSX0NBUEFfS0VZX01HTVRfV1BBMl9QU0s7CisgICAgICAgIH0KKyAgICAgICAgZHJ2LT5jYXBhLmVuYyB8PSBXUEFfRFJJVkVSX0NBUEFfRU5DX1dFUDQwIHwKKyAgICAgICAgICAgIFdQQV9EUklWRVJfQ0FQQV9FTkNfV0VQMTA0OworICAgICAgICBpZiAocmFuZ2UtPmVuY19jYXBhICYgSVdfRU5DX0NBUEFfQ0lQSEVSX1RLSVApIHsKKyAgICAgICAgICAgIGRydi0+Y2FwYS5lbmMgfD0gV1BBX0RSSVZFUl9DQVBBX0VOQ19US0lQOworICAgICAgICB9CisgICAgICAgIGlmIChyYW5nZS0+ZW5jX2NhcGEgJiBJV19FTkNfQ0FQQV9DSVBIRVJfQ0NNUCkgeworICAgICAgICAgICAgZHJ2LT5jYXBhLmVuYyB8PSBXUEFfRFJJVkVSX0NBUEFfRU5DX0NDTVA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJhbmdlLT5lbmNfY2FwYSAmIElXX0VOQ19DQVBBXzRXQVlfSEFORFNIQUtFKSB7CisgICAgICAgICAgICBkcnYtPmNhcGEuZmxhZ3MgfD0gV1BBX0RSSVZFUl9GTEFHU180V0FZX0hBTkRTSEFLRTsKKyAgICAgICAgfQorICAgICAgICBkcnYtPmNhcGEuYXV0aCA9IFdQQV9EUklWRVJfQVVUSF9PUEVOIHwKKyAgICAgICAgICAgIFdQQV9EUklWRVJfQVVUSF9TSEFSRUQgfAorICAgICAgICAgICAgV1BBX0RSSVZFUl9BVVRIX0xFQVA7CisKKyAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICIgIGNhcGFiaWxpdGllczoga2V5X21nbXQgMHgleCBlbmMgMHgleCAiCisgICAgICAgICAgICAgICAiZmxhZ3MgMHgleCIsCisgICAgICAgICAgICAgICBkcnYtPmNhcGEua2V5X21nbXQsIGRydi0+Y2FwYS5lbmMsIGRydi0+Y2FwYS5mbGFncyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJTSU9DR0lXUkFOR0U6IHRvbyBvbGQgKHNob3J0KSBkYXRhIC0gIgorICAgICAgICAgICAgICAgImFzc3VtaW5nIFdQQSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgb3NfZnJlZShyYW5nZSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB3cGFfZHJpdmVyX3dleHRfc2V0X3dwYSh2b2lkICpwcml2LCBpbnQgZW5hYmxlZCkKK3sKKyAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl93ZXh0X2RhdGEgKmRydiA9IHByaXY7CisgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICByZXR1cm4gd3BhX2RyaXZlcl93ZXh0X3NldF9hdXRoX3BhcmFtKGRydiwgSVdfQVVUSF9XUEFfRU5BQkxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCk7Cit9CisKKworc3RhdGljIGludCB3cGFfZHJpdmVyX3dleHRfc2V0X3BzayhzdHJ1Y3Qgd3BhX2RyaXZlcl93ZXh0X2RhdGEgKmRydiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqcHNrKQoreworICAgIHN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQ7CisgICAgc3RydWN0IGl3cmVxIGl3cjsKKyAgICBpbnQgcmV0OworCisgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBpZiAoIShkcnYtPmNhcGEuZmxhZ3MgJiBXUEFfRFJJVkVSX0ZMQUdTXzRXQVlfSEFORFNIQUtFKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIXBzaykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBvc19tZW1zZXQoJml3ciwgMCwgc2l6ZW9mKGl3cikpOworICAgIG9zX3N0cmxjcHkoaXdyLmlmcl9uYW1lLCBkcnYtPmlmbmFtZSwgSUZOQU1TSVopOworCisgICAgZXh0ID0gb3NfemFsbG9jKHNpemVvZigqZXh0KSArIFBNS19MRU4pOworICAgIGlmIChleHQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaXdyLnUuZW5jb2RpbmcucG9pbnRlciA9IChjYWRkcl90KSBleHQ7CisgICAgaXdyLnUuZW5jb2RpbmcubGVuZ3RoID0gc2l6ZW9mKCpleHQpICsgUE1LX0xFTjsKKyAgICBleHQtPmtleV9sZW4gPSBQTUtfTEVOOworICAgIG9zX21lbWNweSgmZXh0LT5rZXksIHBzaywgZXh0LT5rZXlfbGVuKTsKKyAgICBleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfUE1LOworCisgICAgcmV0ID0gaW9jdGwoZHJ2LT5pb2N0bF9zb2NrLCBTSU9DU0lXRU5DT0RFRVhULCAmaXdyKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwgImlvY3RsW1NJT0NTSVdFTkNPREVFWFRdIFBNSyIpOworICAgIH0KKyAgICBvc19mcmVlKGV4dCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgd3BhX2RyaXZlcl93ZXh0X3NldF9rZXlfZXh0KHZvaWQgKnByaXYsIHdwYV9hbGcgYWxnLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqYWRkciwgaW50IGtleV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXRfdHgsIGNvbnN0IHU4ICpzZXEsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzZXFfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqa2V5LCBzaXplX3Qga2V5X2xlbikKK3sKKyAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl93ZXh0X2RhdGEgKmRydiA9IHByaXY7CisgICAgc3RydWN0IGl3cmVxIGl3cjsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0OworCisgICAgaWYgKHNlcV9sZW4gPiBJV19FTkNPREVfU0VRX01BWF9TSVpFKSB7CisgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiJXM6IEludmFsaWQgc2VxX2xlbiAlbHUiLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAodW5zaWduZWQgbG9uZykgc2VxX2xlbik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBleHQgPSBvc196YWxsb2Moc2l6ZW9mKCpleHQpICsga2V5X2xlbik7CisgICAgaWYgKGV4dCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgb3NfbWVtc2V0KCZpd3IsIDAsIHNpemVvZihpd3IpKTsKKyAgICBvc19zdHJsY3B5KGl3ci5pZnJfbmFtZSwgZHJ2LT5pZm5hbWUsIElGTkFNU0laKTsKKyAgICBpd3IudS5lbmNvZGluZy5mbGFncyA9IGtleV9pZHggKyAxOworICAgIGl3ci51LmVuY29kaW5nLmZsYWdzIHw9IElXX0VOQ09ERV9URU1QOworICAgIGlmIChhbGcgPT0gV1BBX0FMR19OT05FKSB7CisgICAgICAgIGl3ci51LmVuY29kaW5nLmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKyAgICB9CisgICAgaXdyLnUuZW5jb2RpbmcucG9pbnRlciA9IChjYWRkcl90KSBleHQ7CisgICAgaXdyLnUuZW5jb2RpbmcubGVuZ3RoID0gc2l6ZW9mKCpleHQpICsga2V5X2xlbjsKKworICAgIGlmIChhZGRyID09IE5VTEwgfHwKKyAgICAgICAgb3NfbWVtY21wKGFkZHIsICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiLCBFVEhfQUxFTikgPT0gMCkgeworICAgICAgICBleHQtPmV4dF9mbGFncyB8PSBJV19FTkNPREVfRVhUX0dST1VQX0tFWTsKKyAgICB9CisgICAgaWYgKHNldF90eCkgeworICAgICAgICBleHQtPmV4dF9mbGFncyB8PSBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVk7CisgICAgfQorCisgICAgZXh0LT5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgICBpZiAoYWRkcikgeworICAgICAgICBvc19tZW1jcHkoZXh0LT5hZGRyLnNhX2RhdGEsIGFkZHIsIEVUSF9BTEVOKTsKKyAgICB9IGVsc2UgeworICAgICAgICBvc19tZW1zZXQoZXh0LT5hZGRyLnNhX2RhdGEsIDB4ZmYsIEVUSF9BTEVOKTsKKyAgICB9CisgICAgaWYgKGtleSAmJiBrZXlfbGVuKSB7CisgICAgICAgIG9zX21lbWNweShleHQgKyAxLCBrZXksIGtleV9sZW4pOworICAgICAgICBleHQtPmtleV9sZW4gPSBrZXlfbGVuOworICAgIH0KKyAgICBzd2l0Y2ggKGFsZykgeworICAgIGNhc2UgV1BBX0FMR19OT05FOgorICAgICAgICBleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfTk9ORTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXUEFfQUxHX1dFUDoKKyAgICAgICAgZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1dFUDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXUEFfQUxHX1RLSVA6CisgICAgICAgIGV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19US0lQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdQQV9BTEdfQ0NNUDoKKyAgICAgICAgZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX0NDTVA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV1BBX0FMR19QTUs6CisgICAgICAgIGV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19QTUs7CisgICAgICAgIGJyZWFrOworI2lmZGVmIENPTkZJR19JRUVFODAyMTFXCisgICAgY2FzZSBXUEFfQUxHX0lHVEs6CisgICAgICAgIGV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19BRVNfQ01BQzsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KKyAgICBkZWZhdWx0OgorICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgIiVzOiBVbmtub3duIGFsZ29yaXRobSAlZCIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFsZyk7CisgICAgICAgIG9zX2ZyZWUoZXh0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChzZXEgJiYgc2VxX2xlbikgeworICAgICAgICBleHQtPmV4dF9mbGFncyB8PSBJV19FTkNPREVfRVhUX1JYX1NFUV9WQUxJRDsKKyAgICAgICAgb3NfbWVtY3B5KGV4dC0+cnhfc2VxLCBzZXEsIHNlcV9sZW4pOworICAgIH0KKworICAgIGlmIChpb2N0bChkcnYtPmlvY3RsX3NvY2ssIFNJT0NTSVdFTkNPREVFWFQsICZpd3IpIDwgMCkgeworICAgICAgICByZXQgPSBlcnJubyA9PSBFT1BOT1RTVVBQID8gLTIgOiAtMTsKKyAgICAgICAgaWYgKGVycm5vID09IEVOT0RFVikgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIG5kaXN3cmFwcGVyIHNlZW1zIHRvIGJlIHJldHVybmluZyBpbmNvcnJlY3QgZXJyb3IKKyAgICAgICAgICAgICAqIGNvZGUuLiAqLworICAgICAgICAgICAgcmV0ID0gLTI7CisgICAgICAgIH0KKworICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwgImlvY3RsW1NJT0NTSVdFTkNPREVFWFRdIik7CisgICAgfQorCisgICAgb3NfZnJlZShleHQpOworICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCB3cGFfZHJpdmVyX3dleHRfc2V0X2NvdW50ZXJtZWFzdXJlcyh2b2lkICpwcml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuYWJsZWQpCit7CisgICAgc3RydWN0IHdwYV9kcml2ZXJfd2V4dF9kYXRhICpkcnYgPSBwcml2OworICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiB3cGFfZHJpdmVyX3dleHRfc2V0X2F1dGhfcGFyYW0oZHJ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBJV19BVVRIX1RLSVBfQ09VTlRFUk1FQVNVUkVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkKTsKK30KKworCitzdGF0aWMgaW50IHdwYV9kcml2ZXJfd2V4dF9zZXRfZHJvcF91bmVuY3J5cHRlZCh2b2lkICpwcml2LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuYWJsZWQpCit7CisgICAgc3RydWN0IHdwYV9kcml2ZXJfd2V4dF9kYXRhICpkcnYgPSBwcml2OworICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIGRydi0+dXNlX2NyeXB0ID0gZW5hYmxlZDsKKyAgICByZXR1cm4gd3BhX2RyaXZlcl93ZXh0X3NldF9hdXRoX3BhcmFtKGRydiwgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkKTsKK30KKworCitzdGF0aWMgaW50IHdwYV9kcml2ZXJfd2V4dF9tbG1lKHN0cnVjdCB3cGFfZHJpdmVyX3dleHRfZGF0YSAqZHJ2LAorICAgICAgICAgICAgICAgIGNvbnN0IHU4ICphZGRyLCBpbnQgY21kLCBpbnQgcmVhc29uX2NvZGUpCit7CisgICAgc3RydWN0IGl3cmVxIGl3cjsKKyAgICBzdHJ1Y3QgaXdfbWxtZSBtbG1lOworICAgIGludCByZXQgPSAwOworCisgICAgb3NfbWVtc2V0KCZpd3IsIDAsIHNpemVvZihpd3IpKTsKKyAgICBvc19zdHJsY3B5KGl3ci5pZnJfbmFtZSwgZHJ2LT5pZm5hbWUsIElGTkFNU0laKTsKKyAgICBvc19tZW1zZXQoJm1sbWUsIDAsIHNpemVvZihtbG1lKSk7CisgICAgbWxtZS5jbWQgPSBjbWQ7CisgICAgbWxtZS5yZWFzb25fY29kZSA9IHJlYXNvbl9jb2RlOworICAgIG1sbWUuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgb3NfbWVtY3B5KG1sbWUuYWRkci5zYV9kYXRhLCBhZGRyLCBFVEhfQUxFTik7CisgICAgaXdyLnUuZGF0YS5wb2ludGVyID0gKGNhZGRyX3QpICZtbG1lOworICAgIGl3ci51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKG1sbWUpOworCisgICAgaWYgKGlvY3RsKGRydi0+aW9jdGxfc29jaywgU0lPQ1NJV01MTUUsICZpd3IpIDwgMCkgeworICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwgImlvY3RsW1NJT0NTSVdNTE1FXSIpOworICAgICAgICByZXQgPSAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkIHdwYV9kcml2ZXJfd2V4dF9kaXNjb25uZWN0KHN0cnVjdCB3cGFfZHJpdmVyX3dleHRfZGF0YSAqZHJ2KQoreworICAgIHN0cnVjdCBpd3JlcSBpd3I7CisgICAgY29uc3QgdTggbnVsbF9ic3NpZFtFVEhfQUxFTl0gPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKyNpZm5kZWYgQU5EUk9JRAorICAgIHU4IHNzaWRbMzJdOworICAgIGludCBpOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIE9ubHkgZm9yY2UtZGlzY29ubmVjdCB3aGVuIHRoZSBjYXJkIGlzIGluIGluZnJhc3RydWN0dXJlIG1vZGUsCisgICAgICogb3RoZXJ3aXNlIHRoZSBkcml2ZXIgbWlnaHQgaW50ZXJwcmV0IHRoZSBjbGVhcmVkIEJTU0lEIGFuZCByYW5kb20KKyAgICAgKiBTU0lEIGFzIGFuIGF0dGVtcHQgdG8gY3JlYXRlIGEgbmV3IGFkLWhvYyBuZXR3b3JrLgorICAgICAqLworICAgIG9zX21lbXNldCgmaXdyLCAwLCBzaXplb2YoaXdyKSk7CisgICAgb3Nfc3RybGNweShpd3IuaWZyX25hbWUsIGRydi0+aWZuYW1lLCBJRk5BTVNJWik7CisgICAgaWYgKGlvY3RsKGRydi0+aW9jdGxfc29jaywgU0lPQ0dJV01PREUsICZpd3IpIDwgMCkgeworICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwgImlvY3RsW1NJT0NHSVdNT0RFXSIpOworICAgICAgICBpd3IudS5tb2RlID0gSVdfTU9ERV9JTkZSQTsKKyAgICB9CisKKyAgICBpZiAoaXdyLnUubW9kZSA9PSBJV19NT0RFX0lORlJBKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIENsZWFyIHRoZSBCU1NJRCBzZWxlY3Rpb24gYW5kIHNldCBhIHJhbmRvbSBTU0lEIHRvIG1ha2Ugc3VyZQorICAgICAgICAgKiB0aGUgZHJpdmVyIHdpbGwgbm90IGJlIHRyeWluZyB0byBhc3NvY2lhdGUgd2l0aCBzb21ldGhpbmcKKyAgICAgICAgICogZXZlbiBpZiBpdCBkb2VzIG5vdCB1bmRlcnN0YW5kIFNJT0NTSVdNTE1FIGNvbW1hbmRzIChvcgorICAgICAgICAgKiB0cmllcyB0byBhc3NvY2lhdGUgYXV0b21hdGljYWxseSBhZnRlciBkZWF1dGgvZGlzYXNzb2MpLgorICAgICAgICAgKi8KKyAgICAgICAgd3BhX2RyaXZlcl93ZXh0X3NldF9ic3NpZChkcnYsIG51bGxfYnNzaWQpOworI2lmbmRlZiBBTkRST0lECisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorICAgICAgICAgICAgc3NpZFtpXSA9IHJhbmQoKSAmIDB4RkY7CisgICAgICAgIHdwYV9kcml2ZXJfd2V4dF9zZXRfc3NpZChkcnYsIHNzaWQsIDMyKTsKKyNlbmRpZgorICAgIH0KK30KKworCitzdGF0aWMgaW50IHdwYV9kcml2ZXJfd2V4dF9kZWF1dGhlbnRpY2F0ZSh2b2lkICpwcml2LCBjb25zdCB1OCAqYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVhc29uX2NvZGUpCit7CisgICAgc3RydWN0IHdwYV9kcml2ZXJfd2V4dF9kYXRhICpkcnYgPSBwcml2OworICAgIGludCByZXQ7CisgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0ID0gd3BhX2RyaXZlcl93ZXh0X21sbWUoZHJ2LCBhZGRyLCBJV19NTE1FX0RFQVVUSCwgcmVhc29uX2NvZGUpOworICAgIHdwYV9kcml2ZXJfd2V4dF9kaXNjb25uZWN0KGRydik7CisgICAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHdwYV9kcml2ZXJfd2V4dF9kaXNhc3NvY2lhdGUodm9pZCAqcHJpdiwgY29uc3QgdTggKmFkZHIsCisgICAgICAgICAgICAgICAgICAgIGludCByZWFzb25fY29kZSkKK3sKKyAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl93ZXh0X2RhdGEgKmRydiA9IHByaXY7CisgICAgaW50IHJldDsKKyAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXQgPSB3cGFfZHJpdmVyX3dleHRfbWxtZShkcnYsIGFkZHIsIElXX01MTUVfRElTQVNTT0MsIHJlYXNvbl9jb2RlKTsKKyAgICB3cGFfZHJpdmVyX3dleHRfZGlzY29ubmVjdChkcnYpOworICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCB3cGFfZHJpdmVyX3dleHRfc2V0X2dlbl9pZSh2b2lkICpwcml2LCBjb25zdCB1OCAqaWUsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGllX2xlbikKK3sKKyAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl93ZXh0X2RhdGEgKmRydiA9IHByaXY7CisgICAgc3RydWN0IGl3cmVxIGl3cjsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIG9zX21lbXNldCgmaXdyLCAwLCBzaXplb2YoaXdyKSk7CisgICAgb3Nfc3RybGNweShpd3IuaWZyX25hbWUsIGRydi0+aWZuYW1lLCBJRk5BTVNJWik7CisgICAgaXdyLnUuZGF0YS5wb2ludGVyID0gKGNhZGRyX3QpIGllOworICAgIGl3ci51LmRhdGEubGVuZ3RoID0gaWVfbGVuOworCisgICAgaWYgKGlvY3RsKGRydi0+aW9jdGxfc29jaywgU0lPQ1NJV0dFTklFLCAmaXdyKSA8IDApIHsKKyAgICAgICAgd3BhX3ByaW50ZihNU0dfRVJST1IsICJpb2N0bFtTSU9DU0lXR0VOSUVdIik7CisgICAgICAgIHJldCA9IC0xOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludAord3BhX2RyaXZlcl93ZXh0X2F1dGhfYWxnX2ZhbGxiYWNrKHN0cnVjdCB3cGFfZHJpdmVyX3dleHRfZGF0YSAqZHJ2LAorICAgICAgICAgICAgICAgICAgc3RydWN0IHdwYV9kcml2ZXJfYXNzb2NpYXRlX3BhcmFtcyAqcGFyYW1zKQoreworICAgIHN0cnVjdCBpd3JlcSBpd3I7CisgICAgaW50IHJldCA9IDA7CisKKyAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgIldFWFQ6IERyaXZlciBkaWQgbm90IHN1cHBvcnQgIgorICAgICAgICAgICAiU0lPQ1NJV0FVVEggZm9yIEFVVEhfQUxHLCB0cnlpbmcgU0lPQ1NJV0VOQ09ERSIpOworCisgICAgb3NfbWVtc2V0KCZpd3IsIDAsIHNpemVvZihpd3IpKTsKKyAgICBvc19zdHJsY3B5KGl3ci5pZnJfbmFtZSwgZHJ2LT5pZm5hbWUsIElGTkFNU0laKTsKKyAgICAvKiBKdXN0IGNoYW5naW5nIG1vZGUsIG5vdCBhY3R1YWwga2V5cyAqLworICAgIGl3ci51LmVuY29kaW5nLmZsYWdzID0gMDsKKyAgICBpd3IudS5lbmNvZGluZy5wb2ludGVyID0gKGNhZGRyX3QpIE5VTEw7CisgICAgaXdyLnUuZW5jb2RpbmcubGVuZ3RoID0gMDsKKworICAgIC8qCisgICAgICogTm90ZTogSVdfRU5DT0RFX3tPUEVOLFJFU1RSSUNURUR9IGNhbiBiZSBpbnRlcnByZXRlZCB0byBtZWFuIHR3bworICAgICAqIGRpZmZlcmVudCB0aGluZ3MuIEhlcmUgdGhleSBhcmUgdXNlZCB0byBpbmRpY2F0ZSBPcGVuIFN5c3RlbSB2cy4KKyAgICAgKiBTaGFyZWQgS2V5IGF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobS4gSG93ZXZlciwgc29tZSBkcml2ZXJzIG1heSB1c2UKKyAgICAgKiB0aGVtIHRvIHNlbGVjdCBiZXR3ZWVuIG9wZW4vcmVzdHJpY3RlZCBXRVAgZW5jcnlwdGVkIChvcGVuID0gYWxsb3cKKyAgICAgKiBib3RoIHVuZW5jcnlwdGVkIGFuZCBlbmNyeXB0ZWQgZnJhbWVzOyByZXN0cmljdGVkID0gb25seSBhbGxvdworICAgICAqIGVuY3J5cHRlZCBmcmFtZXMpLgorICAgICAqLworCisgICAgaWYgKCFkcnYtPnVzZV9jcnlwdCkgeworICAgICAgICBpd3IudS5lbmNvZGluZy5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHBhcmFtcy0+YXV0aF9hbGcgJiBBVVRIX0FMR19PUEVOX1NZU1RFTSkgeworICAgICAgICAgICAgaXdyLnUuZW5jb2RpbmcuZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmFtcy0+YXV0aF9hbGcgJiBBVVRIX0FMR19TSEFSRURfS0VZKSB7CisgICAgICAgICAgICBpd3IudS5lbmNvZGluZy5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpb2N0bChkcnYtPmlvY3RsX3NvY2ssIFNJT0NTSVdFTkNPREUsICZpd3IpIDwgMCkgeworICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwgImlvY3RsW1NJT0NTSVdFTkNPREVdIik7CisgICAgICAgIHJldCA9IC0xOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd3BhX2RyaXZlcl93ZXh0X3NldF9hdXRoX2FsZyh2b2lkICpwcml2LCBpbnQgYXV0aF9hbGcpCit7CisgICAgc3RydWN0IHdwYV9kcml2ZXJfd2V4dF9kYXRhICpkcnYgPSBwcml2OworICAgIGludCBhbGdzID0gMCwgcmVzOworCisgICAgaWYgKGF1dGhfYWxnICYgQVVUSF9BTEdfT1BFTl9TWVNURU0pIHsKKyAgICAgICAgYWxncyB8PSBJV19BVVRIX0FMR19PUEVOX1NZU1RFTTsKKyAgICB9CisgICAgaWYgKGF1dGhfYWxnICYgQVVUSF9BTEdfU0hBUkVEX0tFWSkgeworICAgICAgICBhbGdzIHw9IElXX0FVVEhfQUxHX1NIQVJFRF9LRVk7CisgICAgfQorICAgIGlmIChhdXRoX2FsZyAmIEFVVEhfQUxHX0xFQVApIHsKKyAgICAgICAgYWxncyB8PSBJV19BVVRIX0FMR19MRUFQOworICAgIH0KKyAgICBpZiAoYWxncyA9PSAwKSB7CisgICAgICAgIC8qIGF0IGxlYXN0IG9uZSBhbGdvcml0aG0gc2hvdWxkIGJlIHNldCAqLworICAgICAgICBhbGdzID0gSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07CisgICAgfQorCisgICAgcmVzID0gd3BhX2RyaXZlcl93ZXh0X3NldF9hdXRoX3BhcmFtKGRydiwgSVdfQVVUSF84MDIxMV9BVVRIX0FMRywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbGdzKTsKKyAgICBkcnYtPmF1dGhfYWxnX2ZhbGxiYWNrID0gcmVzID09IC0yOworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgd3BhX2RyaXZlcl93ZXh0X3Bta3NhKHN0cnVjdCB3cGFfZHJpdmVyX3dleHRfZGF0YSAqZHJ2LAorICAgICAgICAgICAgICAgICB1MzIgY21kLCBjb25zdCB1OCAqYnNzaWQsIGNvbnN0IHU4ICpwbWtpZCkKK3sKKyAgICBzdHJ1Y3QgaXdyZXEgaXdyOworICAgIHN0cnVjdCBpd19wbWtzYSBwbWtzYTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIG9zX21lbXNldCgmaXdyLCAwLCBzaXplb2YoaXdyKSk7CisgICAgb3Nfc3RybGNweShpd3IuaWZyX25hbWUsIGRydi0+aWZuYW1lLCBJRk5BTVNJWik7CisgICAgb3NfbWVtc2V0KCZwbWtzYSwgMCwgc2l6ZW9mKHBta3NhKSk7CisgICAgcG1rc2EuY21kID0gY21kOworICAgIHBta3NhLmJzc2lkLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgICBpZiAoYnNzaWQpIHsKKyAgICAgICAgb3NfbWVtY3B5KHBta3NhLmJzc2lkLnNhX2RhdGEsIGJzc2lkLCBFVEhfQUxFTik7CisgICAgfQorICAgIGlmIChwbWtpZCkgeworICAgICAgICBvc19tZW1jcHkocG1rc2EucG1raWQsIHBta2lkLCBJV19QTUtJRF9MRU4pOworICAgIH0KKyAgICBpd3IudS5kYXRhLnBvaW50ZXIgPSAoY2FkZHJfdCkgJnBta3NhOworICAgIGl3ci51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBta3NhKTsKKworICAgIGlmIChpb2N0bChkcnYtPmlvY3RsX3NvY2ssIFNJT0NTSVdQTUtTQSwgJml3cikgPCAwKSB7CisgICAgICAgIGlmIChlcnJubyAhPSBFT1BOT1RTVVBQKSB7CisgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwgImlvY3RsW1NJT0NTSVdQTUtTQV0iKTsKKyAgICAgICAgfQorICAgICAgICByZXQgPSAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgd3BhX2RyaXZlcl93ZXh0X2FkZF9wbWtpZCh2b2lkICpwcml2LCBjb25zdCB1OCAqYnNzaWQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqcG1raWQpCit7CisgICAgc3RydWN0IHdwYV9kcml2ZXJfd2V4dF9kYXRhICpkcnYgPSBwcml2OworICAgIHJldHVybiB3cGFfZHJpdmVyX3dleHRfcG1rc2EoZHJ2LCBJV19QTUtTQV9BREQsIGJzc2lkLCBwbWtpZCk7Cit9CisKKworc3RhdGljIGludCB3cGFfZHJpdmVyX3dleHRfcmVtb3ZlX3Bta2lkKHZvaWQgKnByaXYsIGNvbnN0IHU4ICpic3NpZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnBta2lkKQoreworICAgIHN0cnVjdCB3cGFfZHJpdmVyX3dleHRfZGF0YSAqZHJ2ID0gcHJpdjsKKyAgICByZXR1cm4gd3BhX2RyaXZlcl93ZXh0X3Bta3NhKGRydiwgSVdfUE1LU0FfUkVNT1ZFLCBic3NpZCwgcG1raWQpOworfQorCisKK3N0YXRpYyBpbnQgd3BhX2RyaXZlcl93ZXh0X2ZsdXNoX3Bta2lkKHZvaWQgKnByaXYpCit7CisgICAgc3RydWN0IHdwYV9kcml2ZXJfd2V4dF9kYXRhICpkcnYgPSBwcml2OworICAgIHJldHVybiB3cGFfZHJpdmVyX3dleHRfcG1rc2EoZHJ2LCBJV19QTUtTQV9GTFVTSCwgTlVMTCwgTlVMTCk7Cit9CisKKworI2lmZGVmIEFORFJPSUQKKworc3RhdGljIGludCB3cGFfZHJpdmVyX3dleHRfZ2V0X21hY19hZGRyKHZvaWQgKnByaXYsIHU4ICphZGRyKQoreworICAgIHN0cnVjdCB3cGFfZHJpdmVyX3dleHRfZGF0YSAqZHJ2ID0gcHJpdjsKKyAgICBzdHJ1Y3QgaWZyZXEgaWZyOworICAgIHN0YXRpYyBjb25zdCB1OCBudWxsbWFjW0VUSF9BTEVOXSA9IHswfTsKKworICAgIG9zX21lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisgICAgb3Nfc3RybmNweShpZnIuaWZyX25hbWUsIGRydi0+aWZuYW1lLCBJRk5BTVNJWik7CisKKyAgICBpZiAoaW9jdGwoZHJ2LT5pb2N0bF9zb2NrLCBTSU9DR0lGSFdBRERSLCAmaWZyKSA8IDApIHsKKyAgICAgICAgcGVycm9yKCJpb2N0bFtTSU9DR0lGSFdBRERSXSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG9zX21lbWNweShhZGRyLCBpZnIuaWZyX2h3YWRkci5zYV9kYXRhLCBFVEhfQUxFTik7CisgICAgaWYgKG9zX21lbWNtcChhZGRyLCBudWxsbWFjLCBFVEhfQUxFTikgPT0gMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3BhX2RyaXZlcl93ZXh0X2dldF9yc3NpKHZvaWQgKnByaXYpCit7CisgICAgc3RydWN0IHdwYV9kcml2ZXJfd2V4dF9kYXRhICpkcnYgPSBwcml2OworICAgIHN0cnVjdCBpd3JlcSBpd3I7CisgICAgc3RydWN0IGl3X3N0YXRpc3RpY3MgaXdzOworICAgIGludCBzaWcgPSAwOworCisgICAgb3NfbWVtc2V0KCZpd3IsIDAsIHNpemVvZihpd3IpKTsKKyAgICBpd3IudS5kYXRhLnBvaW50ZXIgPSAoY2hhciopJml3czsKKyAgICBpd3IudS5kYXRhLmxlbmd0aCAgPSBzaXplb2YoaXdzKTsKKyAgICBpd3IudS5kYXRhLmZsYWdzID0gMTsKKyAgICBvc19zdHJsY3B5KGl3ci5pZnJfbmFtZSwgZHJ2LT5pZm5hbWUsIElGTkFNU0laKTsKKworICAgIGlmIChpb2N0bChkcnYtPmlvY3RsX3NvY2ssIFNJT0NHSVdTVEFUUywgJml3cikgPCAwKSB7CisgICAgICAgIHBlcnJvcigiaW9jdGxbU0lPQ0dJV1NUQVRTXSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc2lnID0gaXdzLnF1YWwubGV2ZWw7CisgICAgaWYgKHNpZyA9PSAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGl3cy5xdWFsLnVwZGF0ZWQgJiBJV19RVUFMX0RCTSkgeworICAgICAgICBzaWcgLT0gMHgxMDA7CisgICAgfQorCisgICAgcmV0dXJuIHNpZzsKK30KKworc3RhdGljIGludCB3cGFfZHJpdmVyX3dleHRfZ2V0X2xpbmtzcGVlZCh2b2lkICpwcml2KQoreworICAgIHN0cnVjdCB3cGFfZHJpdmVyX3dleHRfZGF0YSAqZHJ2ID0gcHJpdjsKKyAgICBzdHJ1Y3QgaXdyZXEgaXdyOworICAgIGludCBsaW5rc3BlZWQ7CisKKyAgICBvc19zdHJsY3B5KGl3ci5pZnJfbmFtZSwgZHJ2LT5pZm5hbWUsIElGTkFNU0laKTsKKworICAgIGlmIChpb2N0bChkcnYtPmlvY3RsX3NvY2ssIFNJT0NHSVdSQVRFLCAmaXdyKSA8IDApIHsKKyAgICAgICAgcGVycm9yKCJpb2N0bFtTSU9DR0lXUkFURV0iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGxpbmtzcGVlZCA9IGl3ci51LmJpdHJhdGUudmFsdWUgLyAxMDAwMDAwOworCisgICAgcmV0dXJuIGxpbmtzcGVlZDsKK30KKworc3RhdGljIGNoYXIgKndwYV9kcml2ZXJfZ2V0X2NvdW50cnlfY29kZShpbnQgY2hhbm5lbHMpCit7CisgICAgc3RhdGljIGNoYXIgKmNvdW50cnkgPSAiVVMiOyAvKiBXRVhUX05VTUJFUl9TQ0FOX0NIQU5ORUxTX0ZDQyAqLworCisgICAgaWYgKGNoYW5uZWxzID09IFdFWFRfTlVNQkVSX1NDQU5fQ0hBTk5FTFNfRVRTSSkgeworICAgICAgICBjb3VudHJ5ID0gIkVVIjsKKyAgICB9IGVsc2UgaWYoIGNoYW5uZWxzID09IFdFWFRfTlVNQkVSX1NDQU5fQ0hBTk5FTFNfTUtLMSkgeworICAgICAgICBjb3VudHJ5ID0gIkpQIjsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50cnk7Cit9CisKKy8qIGdsb2JhbCBOTCBzdHJ1Y3R1cmVzICovCitzdHJ1Y3QgbmxfaGFuZGxlICpubF9zb2NrOworc3RydWN0IG5sX2NhY2hlICpubF9jYWNoZTsKK3N0cnVjdCBnZW5sX2ZhbWlseSAqbmw4MDIxMTsKKworc3RhdGljIGludCB3cGFfZHJpdmVyX2luaXRfbmwoKSB7CisgICAgaW50IGVycjsKKworICAgIG5sX3NvY2sgPSBubF9zb2NrZXRfYWxsb2MoKTsKKyAgICBpZiAoIW5sX3NvY2spIHsKKyAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXRsaW5rIHNvY2tldC4iKTsKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgfQorCisgICAgaWYgKGdlbmxfY29ubmVjdChubF9zb2NrKSkgeworICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiRmFpbGVkIHRvIGNvbm5lY3QgdG8gZ2VuZXJpYyBuZXRsaW5rLiIpOworICAgICAgICBlcnIgPSAtRU5PTElOSzsKKyAgICAgICAgZ290byBvdXRfaGFuZGxlX2Rlc3Ryb3k7CisgICAgfQorCisgICAgZ2VubF9jdHJsX2FsbG9jX2NhY2hlKG5sX3NvY2ssICZubF9jYWNoZSk7CisgICAgaWYgKCFubF9jYWNoZSkgeworICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiRmFpbGVkIHRvIGFsbG9jYXRlIGdlbmVyaWMgbmV0bGluayBjYWNoZS4iKTsKKyAgICAgICAgZXJyID0gLUVOT01FTTsKKyAgICAgICAgZ290byBvdXRfaGFuZGxlX2Rlc3Ryb3k7CisgICAgfQorCisgICAgbmw4MDIxMSA9IGdlbmxfY3RybF9zZWFyY2hfYnlfbmFtZShubF9jYWNoZSwgIm5sODAyMTEiKTsKKyAgICBpZiAoIW5sODAyMTEpIHsKKyAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIm5sODAyMTEgbm90IGZvdW5kLiIpOworICAgICAgICBlcnIgPSAtRU5PRU5UOworICAgICAgICBnb3RvIG91dF9jYWNoZV9mcmVlOworICAgIH0KKworICAgIHJldHVybiAwOworCitvdXRfY2FjaGVfZnJlZToKKyAgICBubF9jYWNoZV9mcmVlKG5sX2NhY2hlKTsKK291dF9oYW5kbGVfZGVzdHJveToKKyAgICBubF9zb2NrZXRfZnJlZShubF9zb2NrKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB3cGFfZHJpdmVyX2RlaW5pdF9ubCgpIHsKKyAgICBnZW5sX2ZhbWlseV9wdXQobmw4MDIxMSk7CisgICAgbmxfY2FjaGVfZnJlZShubF9jYWNoZSk7CisgICAgbmxfc29ja2V0X2ZyZWUobmxfc29jayk7Cit9CisKK3N0YXRpYyBpbnQgbmxfZXJyb3JfaGFuZGxlcihzdHJ1Y3Qgc29ja2FkZHJfbmwgKm5sYSwgc3RydWN0IG5sbXNnZXJyICplcnIsIHZvaWQgKmFyZykKK3sKKyAgICBpbnQgKnJldCA9IChpbnQgKilhcmc7CisgICAgKnJldCA9IGVyci0+ZXJyb3I7CisgICAgcmV0dXJuIE5MX1NUT1A7Cit9CisKK3N0YXRpYyBpbnQgbmxfZmluaXNoX2hhbmRsZXIoc3RydWN0IG5sX21zZyAqbXNnLCB2b2lkICphcmcpCit7CisgICAgIGludCAqcmV0ID0gKGludCAqKWFyZzsKKyAgICAgKnJldCA9IDA7CisgICAgIHJldHVybiBOTF9TS0lQOworfQorCitzdGF0aWMgaW50IG5sX2Fja19oYW5kbGVyKHN0cnVjdCBubF9tc2cgKm1zZywgdm9pZCAqYXJnKQoreworICAgIGludCAqcmV0ID0gKGludCAqKWFyZzsKKyAgICAqcmV0ID0gMDsKKyAgICByZXR1cm4gTkxfU1RPUDsKK30KKworc3RhdGljIGludCB3cGFfZHJpdmVyX3NldF9wb3dlcl9zYXZlKGNoYXIgKmlmYWNlLCBpbnQgc3RhdGUpCit7CisgICAgaW50IHJldDsKKyAgICBzdHJ1Y3QgbmxfY2IgKmNiOworICAgIHN0cnVjdCBubF9tc2cgKm1zZzsKKyAgICBpbnQgZGV2aWR4ID0gMDsKKyAgICBpbnQgZXJyOworICAgIGVudW0gbmw4MDIxMV9wc19zdGF0ZSBwc19zdGF0ZTsKKworICAgIHJldCA9IHdwYV9kcml2ZXJfaW5pdF9ubCgpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IC0xOworCisgICAgICAgIGRldmlkeCA9IGlmX25hbWV0b2luZGV4KGlmYWNlKTsKKyAgICAgICAgaWYgKGRldmlkeCA9PSAwKSB7CisgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiZmFpbGVkIHRvIHRyYW5zbGF0ZSBpZm5hbWUgdG8gaWR4Iik7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgIG1zZyA9IG5sbXNnX2FsbG9jKCk7CisgICAgaWYgKCFtc2cpIHsKKyAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsImZhaWxlZCB0byBhbGxvY2F0ZSBuZXRsaW5rIG1lc3NhZ2UiKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGNiID0gbmxfY2JfYWxsb2MoTkxfQ0JfREVGQVVMVCk7CisgICAgaWYgKCFjYikgeworICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiZmFpbGVkIHRvIGFsbG9jYXRlIG5ldGxpbmsgY2FsbGJhY2tzIik7CisgICAgICAgIGdvdG8gb3V0X2ZyZWVfbXNnOworICAgIH0KKworICAgIGdlbmxtc2dfcHV0KG1zZywgMCwgMCwgZ2VubF9mYW1pbHlfZ2V0X2lkKG5sODAyMTEpLCAwLCAwLAorICAgICAgICAgICAgTkw4MDIxMV9DTURfU0VUX1BPV0VSX1NBVkUsIDApOworCisgICAgaWYgKHN0YXRlICE9IDApIHsKKyAgICAgICAgcHNfc3RhdGUgPSBOTDgwMjExX1BTX0VOQUJMRUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfc3RhdGUgPSBOTDgwMjExX1BTX0RJU0FCTEVEOworICAgIH0KKworICAgIE5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0lGSU5ERVgsIGRldmlkeCk7CisgICAgTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfUFNfU1RBVEUsIHBzX3N0YXRlKTsKKworICAgIGVyciA9IG5sX3NlbmRfYXV0b19jb21wbGV0ZShubF9zb2NrLCBtc2cpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiY291bGQgbm90IHNlbmQgYXV0b19jb21wbGV0ZTogJWQiLCBlcnIpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBlcnIgPSAxOworCisgICAgbmxfY2JfZXJyKGNiLCBOTF9DQl9DVVNUT00sIG5sX2Vycm9yX2hhbmRsZXIsICZlcnIpOworICAgIG5sX2NiX3NldChjYiwgTkxfQ0JfRklOSVNILCBOTF9DQl9DVVNUT00sIG5sX2ZpbmlzaF9oYW5kbGVyLCAmZXJyKTsKKyAgICBubF9jYl9zZXQoY2IsIE5MX0NCX0FDSywgTkxfQ0JfQ1VTVE9NLCBubF9hY2tfaGFuZGxlciwgJmVycik7CisKKyAgICB3aGlsZSAoZXJyID4gMCkKKyAgICAgICAgbmxfcmVjdm1zZ3Mobmxfc29jaywgY2IpOworCisgICAgcmV0ID0gMDsKK291dDoKKyAgICBubF9jYl9wdXQoY2IpOworb3V0X2ZyZWVfbXNnOgorICAgIG5sbXNnX2ZyZWUobXNnKTsKK25sYV9wdXRfZmFpbHVyZToKKworZXhpdDoKKyAgICB3cGFfZHJpdmVyX2RlaW5pdF9ubCgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd3BhX2RyaXZlcl9zZXRfY291bnRyeShjaGFyICppZmFjZSwgY2hhciAqY291bnRyeSkKK3sKKyAgICBpbnQgcmV0OworICAgIHN0cnVjdCBubF9jYiAqY2I7CisgICAgc3RydWN0IG5sX21zZyAqbXNnOworICAgIGludCBkZXZpZHggPSAwOworICAgIGludCBlcnI7CisgICAgY2hhciBhbHBoYTJbM107CisgICAgcmV0ID0gd3BhX2RyaXZlcl9pbml0X25sKCk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0ID0gLTE7CisKKyAgICBkZXZpZHggPSBpZl9uYW1ldG9pbmRleChpZmFjZSk7CisgICAgaWYgKGRldmlkeCA9PSAwKSB7CisgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJmYWlsZWQgdG8gdHJhbnNsYXRlIGlmbmFtZSB0byBpZHgiKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIG1zZyA9IG5sbXNnX2FsbG9jKCk7CisgICAgaWYgKCFtc2cpIHsKKyAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsImZhaWxlZCB0byBhbGxvY2F0ZSBuZXRsaW5rIG1lc3NhZ2UiKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGNiID0gbmxfY2JfYWxsb2MoTkxfQ0JfREVGQVVMVCk7CisgICAgaWYgKCFjYikgeworICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiZmFpbGVkIHRvIGFsbG9jYXRlIG5ldGxpbmsgY2FsbGJhY2tzIik7CisgICAgICAgIGdvdG8gb3V0X2ZyZWVfbXNnOworICAgIH0KKworICAgIGFscGhhMlswXSA9IGNvdW50cnlbMF07CisgICAgYWxwaGEyWzFdID0gY291bnRyeVsxXTsKKyAgICBhbHBoYTJbMl0gPSAnXDAnOworCisgICAgZ2VubG1zZ19wdXQobXNnLCAwLCAwLCBnZW5sX2ZhbWlseV9nZXRfaWQobmw4MDIxMSksIDAsIDAsCisgICAgICAgICAgICBOTDgwMjExX0NNRF9SRVFfU0VUX1JFRywgMCk7CisKKyAgICBOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9JRklOREVYLCBkZXZpZHgpOworICAgIE5MQV9QVVRfU1RSSU5HKG1zZywgTkw4MDIxMV9BVFRSX1JFR19BTFBIQTIsIGFscGhhMik7CisKKyAgICBlcnIgPSBubF9zZW5kX2F1dG9fY29tcGxldGUobmxfc29jaywgbXNnKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgImNvdWxkIG5vdCBzZW5kIGF1dG9fY29tcGxldGU6ICVkIiwgZXJyKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgZXJyID0gMTsKKworICAgIG5sX2NiX2VycihjYiwgTkxfQ0JfQ1VTVE9NLCBubF9lcnJvcl9oYW5kbGVyLCAmZXJyKTsKKyAgICBubF9jYl9zZXQoY2IsIE5MX0NCX0ZJTklTSCwgTkxfQ0JfQ1VTVE9NLCBubF9maW5pc2hfaGFuZGxlciwgJmVycik7CisgICAgbmxfY2Jfc2V0KGNiLCBOTF9DQl9BQ0ssIE5MX0NCX0NVU1RPTSwgbmxfYWNrX2hhbmRsZXIsICZlcnIpOworCisgICAgd2hpbGUgKGVyciA+IDApCisgICAgICAgIG5sX3JlY3Ztc2dzKG5sX3NvY2ssIGNiKTsKKworICAgIHJldCA9IDA7CitvdXQ6CisgICAgbmxfY2JfcHV0KGNiKTsKK291dF9mcmVlX21zZzoKKyAgICBubG1zZ19mcmVlKG1zZyk7CitubGFfcHV0X2ZhaWx1cmU6CisKK2V4aXQ6CisgICAgd3BhX2RyaXZlcl9kZWluaXRfbmwoKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdwYV9kcml2ZXJfdG9nZ2xlX2J0Y29leF9zdGF0ZShjaGFyIHN0YXRlKQoreworICAgIGludCByZXQ7CisgICAgaW50IGZkID0gb3BlbigiL3N5cy9kZXZpY2VzL3BsYXRmb3JtL3dsMTI3MS9idF9jb2V4X3N0YXRlIiwgT19SRFdSLCAwKTsKKyAgICBpZiAoZmQgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldCA9IHdyaXRlKGZkLCAmc3RhdGUsIHNpemVvZihzdGF0ZSkpOworICAgIGNsb3NlKGZkKTsKKworICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiJXM6ICBzZXQgYnRjb2V4IHN0YXRlIHRvICclYycgcmVzdWx0ID0gJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgc3RhdGUsIHJldCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3cGFfZHJpdmVyX3RvZ2dsZV9yeF9maWx0ZXIoY2hhciBzdGF0ZSkKK3sKKyAgICByZXR1cm4gMDsgLyogbm90IGltcGxlbWVudGVkIHlldCAqLworfQorCisvKiB3ZSBzdGFydCB3aXRoICJhdXRvIiBwb3dlciBtb2RlIC0gcG93ZXJfc2F2ZSBpcyBvbiAqLworaW50IGdfcG93ZXJfbW9kZSA9IDA7CisKKy8qIGN1cnJlbnRseSBjYWNoZWQgc2NhbiB0eXBlICovCit1OCBnX3NjYW5fdHlwZSA9IElXX1NDQU5fVFlQRV9BQ1RJVkU7CisKKy8qIHN0YXJ0IHdpdGggIndvcmxkIiBudW0gb2YgY2hhbm5lbHMgKi8KK2ludCBnX251bV9jaGFubmVscyA9IDEzOworCitzdGF0aWMgaW50IHdwYV9kcml2ZXJfcHJpdl9kcml2ZXJfY21kKCB2b2lkICpwcml2LCBjaGFyICpjbWQsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4gKQoreworICAgIHN0cnVjdCB3cGFfZHJpdmVyX3dleHRfZGF0YSAqZHJ2ID0gcHJpdjsKKyAgICBzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zID0gKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqKShkcnYtPmN0eCk7CisgICAgaW50IHJldCA9IDAsIGZsYWdzOworCisgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICIlcyAlcyBsZW4gPSAlZCIsIF9fZnVuY19fLCBjbWQsIGJ1Zl9sZW4pOworCisgICAgaWYgKG9zX3N0cmNhc2VjbXAoY21kLCAiU1RPUCIpID09IDApIHsKKyAgICAgICAgaWYgKCh3cGFfZHJpdmVyX3dleHRfZ2V0X2lmZmxhZ3MoZHJ2LCAmZmxhZ3MpID09IDApICYmCisgICAgICAgICAgICAoZmxhZ3MgJiBJRkZfVVApKSB7CisgICAgICAgICAgICB3cGFfZHJpdmVyX3dleHRfc2V0X2lmZmxhZ3MoZHJ2LCBmbGFncyAmIH5JRkZfVVApOworICAgICAgICB9CisgICAgICAgIHdwYV9tc2cod3BhX3MsIE1TR19JTkZPLCBXUEFfRVZFTlRfRFJJVkVSX1NUQVRFICJTVE9QUEVEIik7CisgICAgfSBlbHNlIGlmIChvc19zdHJjYXNlY21wKGNtZCwgIlNUQVJUIikgPT0gMCkgeworICAgICAgICBpZiAoKHdwYV9kcml2ZXJfd2V4dF9nZXRfaWZmbGFncyhkcnYsICZmbGFncykgPT0gMCkgJiYKKyAgICAgICAgICAgICEoZmxhZ3MgJiBJRkZfVVApKSB7CisgICAgICAgICAgICB3cGFfZHJpdmVyX3dleHRfc2V0X2lmZmxhZ3MoZHJ2LCBmbGFncyB8IElGRl9VUCk7CisgICAgICAgIH0KKyAgICAgICAgd3BhX21zZyh3cGFfcywgTVNHX0lORk8sIFdQQV9FVkVOVF9EUklWRVJfU1RBVEUgIlNUQVJURUQiKTsKKyAgICB9IGVsc2UgaWYgKG9zX3N0cmNhc2VjbXAoY21kLCAiTUFDQUREUiIpID09IDApIHsKKyAgICAgICAgdTggbWFjYWRkcltFVEhfQUxFTl0gPSB7fTsKKworICAgICAgICByZXQgPSB3cGFfZHJpdmVyX3dleHRfZ2V0X21hY19hZGRyKHByaXYsIG1hY2FkZHIpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBvc19zbnByaW50ZihidWYsIGJ1Zl9sZW4sICJNYWNhZGRyID0gIiBNQUNTVFIgIlxuIiwgTUFDMlNUUihtYWNhZGRyKSk7CisgICAgfSBlbHNlIGlmICgob3Nfc3RyY2FzZWNtcChjbWQsICJSU1NJIikgPT0gMCkgfHwgKG9zX3N0cmNhc2VjbXAoY21kLCAiUlNTSS1BUFBST1giKSA9PSAwKSkgeworICAgICAgICB1OCBzc2lkW01BWF9TU0lEX0xFTl07CisgICAgICAgIGludCByc3NpOworCisgICAgICAgIHJzc2kgPSB3cGFfZHJpdmVyX3dleHRfZ2V0X3Jzc2kocHJpdik7CisgICAgICAgIGlmICgocnNzaSAhPSAtMSkgJiYgKHdwYV9kcml2ZXJfd2V4dF9nZXRfc3NpZChwcml2LCBzc2lkKSA+IDApKSB7CisgICAgICAgICAgICByZXQgPSBvc19zbnByaW50ZihidWYsIGJ1Zl9sZW4sICIlcyByc3NpICVkXG4iLCBzc2lkLCByc3NpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChvc19zdHJjYXNlY21wKGNtZCwgIkxJTktTUEVFRCIpID09IDApIHsKKyAgICAgICAgaW50IGxpbmtzcGVlZDsKKworICAgICAgICBsaW5rc3BlZWQgPSB3cGFfZHJpdmVyX3dleHRfZ2V0X2xpbmtzcGVlZChwcml2KTsKKyAgICAgICAgaWYgKGxpbmtzcGVlZCAhPSAtMSkgeworICAgICAgICAgICAgcmV0ID0gb3Nfc25wcmludGYoYnVmLCBidWZfbGVuLCAiTGlua1NwZWVkICVkXG4iLCBsaW5rc3BlZWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAiUkVMT0FEIikgPT0gMCApIHsKKyAgICAgICAgd3BhX21zZyh3cGFfcywgTVNHX0lORk8sIFdQQV9FVkVOVF9EUklWRVJfU1RBVEUgIkhBTkdFRCIpOworICAgIH0gZWxzZSBpZiggb3Nfc3RyY2FzZWNtcChjbWQsICJTQ0FOLVBBU1NJVkUiKSA9PSAwICkgeworICAgICAgICBnX3NjYW5fdHlwZSA9IElXX1NDQU5fVFlQRV9QQVNTSVZFOworICAgICAgICByZXQgPSAwOworICAgIH0gZWxzZSBpZiggb3Nfc3RyY2FzZWNtcChjbWQsICJTQ0FOLUFDVElWRSIpID09IDAgKSB7CisgICAgICAgIGdfc2Nhbl90eXBlID0gSVdfU0NBTl9UWVBFX0FDVElWRTsKKyAgICAgICAgcmV0ID0gMDsKKyAgICB9IGVsc2UgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAiU0NBTi1NT0RFIikgPT0gMCApIHsKKyAgICAgICAgcmV0ID0gc25wcmludGYoYnVmLCBidWZfbGVuLCAiU2Nhbk1vZGUgPSAldVxuIiwgZ19zY2FuX3R5cGUpOworICAgICAgICBpZiAocmV0IDwgKGludClidWZfbGVuKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfSBlbHNlIGlmKCBvc19zdHJuY2FzZWNtcChjbWQsICJQT1dFUk1PREUiLCA5KSA9PSAwICkgeworICAgICAgICBpbnQgbW9kZSA9IGF0b2koY21kICsgOSk7CisKKyAgICAgICAgaWYgKG1vZGUgPT0gZ19wb3dlcl9tb2RlKSB7CisgICAgICAgICAgICByZXQgPSAwOworICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gMSkgeyAvKiBhY3RpdmUgbW9kZSAqLworICAgICAgICAgICAgcmV0ID0gd3BhX2RyaXZlcl9zZXRfcG93ZXJfc2F2ZShkcnYtPmlmbmFtZSwgMCk7CisgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSAwKSB7IC8qIGF1dG8gbW9kZSAqLworICAgICAgICAgICAgcmV0ID0gd3BhX2RyaXZlcl9zZXRfcG93ZXJfc2F2ZShkcnYtPmlmbmFtZSwgMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgICAgZ19wb3dlcl9tb2RlID0gbW9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiZ2xvYmFsIFBPV0VSTU9ERSBzZXQgdG8gJWQgKHdhbnRlZCAlZCksIHJldCAlZCIsCisgICAgICAgICAgICAgICBnX3Bvd2VyX21vZGUsIG1vZGUsIHJldCk7CisgICAgfSBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgIkdFVFBPV0VSIikgPT0gMCApIHsKKyAgICAgICAgcmV0ID0gc3ByaW50ZihidWYsICJwb3dlcm1vZGUgPSAldVxuIiwgZ19wb3dlcl9tb2RlKTsKKyAgICB9IGVsc2UgaWYoIG9zX3N0cm5jYXNlY21wKGNtZCwgIkJUQ09FWE1PREUiLCAxMCkgPT0gMCApIHsKKyAgICAgICAgaW50IG1vZGUgPSBhdG9pKGNtZCArIDEwKTsKKworICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgIndpbGwgY2hhbmdlIGJ0Y29leCBtb2RlIHRvOiAlZCIsIG1vZGUpOworCisgICAgICAgIGlmIChtb2RlID09IDEpIHsgLyogZGlzYWJsZSBCVC1jb2V4ICovCisgICAgICAgICAgICByZXQgPSB3cGFfZHJpdmVyX3RvZ2dsZV9idGNvZXhfc3RhdGUoJzAnKTsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IDIpIHsgLyogZW5hYmxlIEJULWNvZXggKi8KKyAgICAgICAgICAgIHJldCA9IHdwYV9kcml2ZXJfdG9nZ2xlX2J0Y29leF9zdGF0ZSgnMScpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJpbnZhbGlkIGJ0Y29leCBtb2RlOiAlZCIsIG1vZGUpOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAiUlhGSUxURVItU1RBUlQiKSA9PSAwICkgeworICAgICAgICByZXQgPSB3cGFfZHJpdmVyX3RvZ2dsZV9yeF9maWx0ZXIoJzEnKTsKKyAgICB9IGVsc2UgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAiUlhGSUxURVItU1RPUCIpID09IDAgKSB7CisgICAgICAgIHJldCA9IHdwYV9kcml2ZXJfdG9nZ2xlX3J4X2ZpbHRlcignMCcpOworICAgIH0gZWxzZSBpZiggb3Nfc3RybmNhc2VjbXAoY21kLCAiY291bnRyeSIsIDcpID09IDAgKSB7CisgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAic2V0dGluZyBjb3VudHJ5IGNvZGUgdG86ICVzIiwgY21kICsgOCk7CisgICAgICAgIHJldCA9IHdwYV9kcml2ZXJfc2V0X2NvdW50cnkoZHJ2LT5pZm5hbWUsIGNtZCArIDgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHdwYV9wcmludGYoTVNHX0VSUk9SLCAiVW5zdXBwb3J0ZWQgY29tbWFuZDogJXMiLCBjbWQpOworICAgICAgICByZXQgPSAtMTsKKyAgICB9CisKK291dDoKKyAgICByZXR1cm4gcmV0OworfQorCisjZW5kaWYKKworLyoqCisgKiB3cGFfZHJpdmVyX3dleHRfc2Nhbl9jdXN0b20gLSBSZXF1ZXN0IHRoZSBkcml2ZXIgdG8gaW5pdGlhdGUgc2NhbgorICogQHByaXY6IFBvaW50ZXIgdG8gcHJpdmF0ZSB3ZXh0IGRhdGEgZnJvbSB3cGFfZHJpdmVyX3dleHRfaW5pdCgpCisgKiBAc3NpZDogU3BlY2lmaWMgU1NJRCB0byBzY2FuIGZvciAoUHJvYmVSZXEpIG9yICVOVUxMIHRvIHNjYW4gZm9yCisgKiAgICBhbGwgU1NJRHMgKGVpdGhlciBhY3RpdmUgc2NhbiB3aXRoIGJyb2FkY2FzdCBTU0lEIG9yIHBhc3NpdmUKKyAqICAgIHNjYW4KKyAqIEBzc2lkX2xlbjogTGVuZ3RoIG9mIHRoZSBTU0lECisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqLworaW50IHdwYV9kcml2ZXJfd2V4dF9zY2FuX2N1c3RvbSh2b2lkICpwcml2LCBjb25zdCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuKQoreworICAgIHN0cnVjdCB3cGFfZHJpdmVyX3dleHRfZGF0YSAqZHJ2ID0gcHJpdjsKKyAgICBzdHJ1Y3QgaXdyZXEgaXdyOworICAgIGludCByZXQgPSAwOworICAgIHN0cnVjdCBpd19zY2FuX3JlcSByZXE7CisjaWZkZWYgQU5EUk9JRAorICAgIHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MgPSAoc3RydWN0IHdwYV9zdXBwbGljYW50ICopKGRydi0+Y3R4KTsKKyAgICBpbnQgc2Nhbl9wcm9iZV9mbGFnID0gMDsKKyNlbmRpZgorCisgICAgaWYgKHNzaWRfbGVuID4gSVdfRVNTSURfTUFYX1NJWkUpIHsKKyAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICIlczogdG9vIGxvbmcgU1NJRCAoJWx1KSIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICh1bnNpZ25lZCBsb25nKSBzc2lkX2xlbik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBvc19tZW1zZXQoJml3ciwgMCwgc2l6ZW9mKGl3cikpOworICAgIG9zX3N0cmxjcHkoaXdyLmlmcl9uYW1lLCBkcnYtPmlmbmFtZSwgSUZOQU1TSVopOworCisgICAgb3NfbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKyAgICByZXEuc2Nhbl90eXBlID0gZ19zY2FuX3R5cGU7IC8qIFNjYW4gdHlwZSBpcyBjYWNoZWQgKi8KKyAgICByZXEuYnNzaWQuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworICAgIG9zX21lbXNldChyZXEuYnNzaWQuc2FfZGF0YSwgMHhmZiwgRVRIX0FMRU4pOworICAgIGl3ci51LmRhdGEucG9pbnRlciA9IChjYWRkcl90KSAmcmVxOworICAgIGl3ci51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHJlcSk7CisgICAgaXdyLnUuZGF0YS5mbGFncyA9IElXX1NDQU5fVEhJU19FU1NJRDsKKworICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiJXM6IHNjYW5uaW5nIHdpdGggc2NhbiB0eXBlOiAlcyIsIF9fZnVuY19fLAorICAgICAgICAgICBnX3NjYW5fdHlwZSA9PSBJV19TQ0FOX1RZUEVfUEFTU0lWRSA/ICJQQVNTSVZFIiA6ICJBQ1RJVkUiKTsKKworI2lmZGVmIEFORFJPSUQKKyAgICBpZiAod3BhX3MtPnByZXZfc2Nhbl9zc2lkICE9IEJST0FEQ0FTVF9TU0lEX1NDQU4pIHsKKyAgICAgICAgc2Nhbl9wcm9iZV9mbGFnID0gd3BhX3MtPnByZXZfc2Nhbl9zc2lkLT5zY2FuX3NzaWQ7CisgICAgfQorICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiJXM6IHNwZWNpZmljIHNjYW4gPSAlZCIsIF9fZnVuY19fLAorICAgICAgICAoc2Nhbl9wcm9iZV9mbGFnICYmIChzc2lkICYmIHNzaWRfbGVuKSkgPyAxIDogMCk7CisgICAgaWYgKHNjYW5fcHJvYmVfZmxhZyAmJiAoc3NpZCAmJiBzc2lkX2xlbikpIHsKKyNlbHNlCisgICAgaWYgKHNzaWQgJiYgc3NpZF9sZW4pIHsKKyNlbmRpZgorICAgICAgICByZXEuZXNzaWRfbGVuID0gc3NpZF9sZW47CisgICAgICAgIG9zX21lbWNweShyZXEuZXNzaWQsIHNzaWQsIHNzaWRfbGVuKTsKKyAgICB9CisKKyAgICBpZiAoaW9jdGwoZHJ2LT5pb2N0bF9zb2NrLCBTSU9DU0lXU0NBTiwgJml3cikgPCAwKSB7CisgICAgICAgIHdwYV9wcmludGYoTVNHX0VSUk9SLCAiaW9jdGxbU0lPQ1NJV1NDQU5dIik7CisgICAgICAgIHJldCA9IC0xOworICAgIH0KKworICAgIHdwYV9kcml2ZXJfd2V4dF9zZXRfc2Nhbl90aW1lb3V0KHByaXYpOworCisgICAgcmV0dXJuIHJldDsKK30KKworY29uc3Qgc3RydWN0IHdwYV9kcml2ZXJfb3BzIHdwYV9kcml2ZXJfY3VzdG9tX29wcyA9IHsKKyAgICAubmFtZSA9ICJtYWM4MDIxMV93ZXh0IiwKKyAgICAuZGVzYyA9ICJtYWM4MDIxMSBzdGF0aW9uIGRyaXZlciBmb3IgVEkgd2wxMnh4IiwKKyAgICAuZ2V0X2Jzc2lkID0gd3BhX2RyaXZlcl93ZXh0X2dldF9ic3NpZCwKKyAgICAuZ2V0X3NzaWQgPSB3cGFfZHJpdmVyX3dleHRfZ2V0X3NzaWQsCisgICAgLnNldF93cGEgPSB3cGFfZHJpdmVyX3dleHRfc2V0X3dwYSwKKyAgICAuc2V0X2tleSA9IHdwYV9kcml2ZXJfd2V4dF9zZXRfa2V5LAorICAgIC5zZXRfY291bnRlcm1lYXN1cmVzID0gd3BhX2RyaXZlcl93ZXh0X3NldF9jb3VudGVybWVhc3VyZXMsCisgICAgLnNldF9kcm9wX3VuZW5jcnlwdGVkID0gd3BhX2RyaXZlcl93ZXh0X3NldF9kcm9wX3VuZW5jcnlwdGVkLAorICAgIC5zY2FuID0gd3BhX2RyaXZlcl93ZXh0X3NjYW5fY3VzdG9tLAorICAgIC5nZXRfc2Nhbl9yZXN1bHRzMiA9IHdwYV9kcml2ZXJfd2V4dF9nZXRfc2Nhbl9yZXN1bHRzLAorICAgIC5kZWF1dGhlbnRpY2F0ZSA9IHdwYV9kcml2ZXJfd2V4dF9kZWF1dGhlbnRpY2F0ZSwKKyAgICAuZGlzYXNzb2NpYXRlID0gd3BhX2RyaXZlcl93ZXh0X2Rpc2Fzc29jaWF0ZSwKKyAgICAuc2V0X21vZGUgPSB3cGFfZHJpdmVyX3dleHRfc2V0X21vZGUsCisgICAgLmFzc29jaWF0ZSA9IHdwYV9kcml2ZXJfd2V4dF9hc3NvY2lhdGUsCisgICAgLnNldF9hdXRoX2FsZyA9IHdwYV9kcml2ZXJfd2V4dF9zZXRfYXV0aF9hbGcsCisgICAgLmluaXQgPSB3cGFfZHJpdmVyX3dleHRfaW5pdCwKKyAgICAuZGVpbml0ID0gd3BhX2RyaXZlcl93ZXh0X2RlaW5pdCwKKyAgICAuYWRkX3Bta2lkID0gd3BhX2RyaXZlcl93ZXh0X2FkZF9wbWtpZCwKKyAgICAucmVtb3ZlX3Bta2lkID0gd3BhX2RyaXZlcl93ZXh0X3JlbW92ZV9wbWtpZCwKKyAgICAuZmx1c2hfcG1raWQgPSB3cGFfZHJpdmVyX3dleHRfZmx1c2hfcG1raWQsCisgICAgLmdldF9jYXBhID0gd3BhX2RyaXZlcl93ZXh0X2dldF9jYXBhLAorICAgIC5zZXRfb3BlcnN0YXRlID0gd3BhX2RyaXZlcl93ZXh0X3NldF9vcGVyc3RhdGUsCisjaWZkZWYgQU5EUk9JRAorICAgIC5kcml2ZXJfY21kID0gd3BhX2RyaXZlcl9wcml2X2RyaXZlcl9jbWQsCisjZW5kaWYKK307CmRpZmYgLS1naXQgYS9tYWM4MDIxMS93cGFfc3VwcGxpY2FudF9saWIvZHJpdmVyX21hYzgwMjExX25sLmMgYi9tYWM4MDIxMS93cGFfc3VwcGxpY2FudF9saWIvZHJpdmVyX21hYzgwMjExX25sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmYzIzZgotLS0gL2Rldi9udWxsCisrKyBiL21hYzgwMjExL3dwYV9zdXBwbGljYW50X2xpYi9kcml2ZXJfbWFjODAyMTFfbmwuYwpAQCAtMCwwICsxLDI1NyBAQAorI2luY2x1ZGUgImluY2x1ZGVzLmgiCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8bmV0L2lmX2FycC5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPG5ldGxpbmsvZ2VubC9nZW5sLmg+CisjaW5jbHVkZSA8bmV0bGluay9nZW5sL2ZhbWlseS5oPgorI2luY2x1ZGUgPG5ldGxpbmsvZ2VubC9jdHJsLmg+CisjaW5jbHVkZSA8bmV0bGluay9tc2cuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2F0dHIuaD4KKworI2luY2x1ZGUgIndpcmVsZXNzX2NvcHkuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJkcml2ZXIuaCIKKyNpbmNsdWRlICJlbG9vcC5oIgorI2luY2x1ZGUgImRyaXZlcl93ZXh0LmgiCisjaW5jbHVkZSAiaWVlZTgwMl8xMV9kZWZzLmgiCisjaW5jbHVkZSAid3BhX2NvbW1vbi5oIgorI2luY2x1ZGUgIndwYV9jdHJsLmgiCisjaW5jbHVkZSAid3BhX3N1cHBsaWNhbnRfaS5oIgorI2luY2x1ZGUgImNvbmZpZ19zc2lkLmgiCisjaW5jbHVkZSAid3BhX2RlYnVnLmgiCisjaW5jbHVkZSAibGludXhfaW9jdGwuaCIKKyNpbmNsdWRlICJkcml2ZXJfbmw4MDIxMS5oIgorCisjZGVmaW5lIFdQQV9FVkVOVF9EUklWRVJfU1RBVEUgICAgICAgICAgIkNUUkwtRVZFTlQtRFJJVkVSLVNUQVRFICIKKyNkZWZpbmUgRFJWX05VTUJFUl9TRVFVRU5USUFMX0VSUk9SUyAgICAgNAorCisjZGVmaW5lIFdQQV9QU19FTkFCTEVEICAgMAorI2RlZmluZSBXUEFfUFNfRElTQUJMRUQgIDEKKworI2RlZmluZSBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9FTkFCTEVEICAgMAorI2RlZmluZSBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9ESVNBQkxFRCAgMQorI2RlZmluZSBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9TRU5TRSAgICAgMgorCisKK3N0YXRpYyBpbnQgZ19kcnZfZXJyb3JzID0gMDsKK3N0YXRpYyBpbnQgZ19wb3dlcl9tb2RlID0gMDsKKworaW50IHNlbmRfYW5kX3JlY3ZfbXNncyhzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydiwgc3RydWN0IG5sX21zZyAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCp2YWxpZF9oYW5kbGVyKShzdHJ1Y3QgbmxfbXNnICosIHZvaWQgKiksCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnZhbGlkX2RhdGEpOworCitzdGF0aWMgdm9pZCB3cGFfZHJpdmVyX3NlbmRfaGFuZ19tc2coc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYpCit7CisJZ19kcnZfZXJyb3JzKys7CisJaWYgKGdfZHJ2X2Vycm9ycyA+IERSVl9OVU1CRVJfU0VRVUVOVElBTF9FUlJPUlMpIHsKKwkJZ19kcnZfZXJyb3JzID0gMDsKKwkJd3BhX21zZyhkcnYtPmN0eCwgTVNHX0lORk8sIFdQQV9FVkVOVF9EUklWRVJfU1RBVEUgIkhBTkdFRCIpOworCX0KK30KKworc3RhdGljIGludCBnZXRfbGlua19zaWduYWwoc3RydWN0IG5sX21zZyAqbXNnLCB2b2lkICphcmcpCit7CisJc3RydWN0IG5sYXR0ciAqdGJbTkw4MDIxMV9BVFRSX01BWCArIDFdOworCXN0cnVjdCBnZW5sbXNnaGRyICpnbmxoID0gbmxtc2dfZGF0YShubG1zZ19oZHIobXNnKSk7CisJc3RydWN0IG5sYXR0ciAqc2luZm9bTkw4MDIxMV9TVEFfSU5GT19NQVggKyAxXTsKKwlzdGF0aWMgc3RydWN0IG5sYV9wb2xpY3kgcG9saWN5W05MODAyMTFfU1RBX0lORk9fTUFYICsgMV0gPSB7CisJCVtOTDgwMjExX1NUQV9JTkZPX1NJR05BTF0gPSB7IC50eXBlID0gTkxBX1U4IH0sCisJfTsKKwlzdHJ1Y3QgbmxhdHRyICpyaW5mb1tOTDgwMjExX1JBVEVfSU5GT19NQVggKyAxXTsKKwlzdGF0aWMgc3RydWN0IG5sYV9wb2xpY3kgcmF0ZV9wb2xpY3lbTkw4MDIxMV9SQVRFX0lORk9fTUFYICsgMV0gPSB7CisJCVtOTDgwMjExX1JBVEVfSU5GT19CSVRSQVRFXSA9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJCVtOTDgwMjExX1JBVEVfSU5GT19NQ1NdID0geyAudHlwZSA9IE5MQV9VOCB9LAorCQlbTkw4MDIxMV9SQVRFX0lORk9fNDBfTUhaX1dJRFRIXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorCQlbTkw4MDIxMV9SQVRFX0lORk9fU0hPUlRfR0ldID0geyAudHlwZSA9IE5MQV9GTEFHIH0sCisJfTsKKwlzdHJ1Y3Qgd3BhX3NpZ25hbF9pbmZvICpzaWdfY2hhbmdlID0gYXJnOworCisJbmxhX3BhcnNlKHRiLCBOTDgwMjExX0FUVFJfTUFYLCBnZW5sbXNnX2F0dHJkYXRhKGdubGgsIDApLAorCQkgIGdlbmxtc2dfYXR0cmxlbihnbmxoLCAwKSwgTlVMTCk7CisJaWYgKCF0YltOTDgwMjExX0FUVFJfU1RBX0lORk9dIHx8CisJICAgIG5sYV9wYXJzZV9uZXN0ZWQoc2luZm8sIE5MODAyMTFfU1RBX0lORk9fTUFYLAorCQkJICAgICB0YltOTDgwMjExX0FUVFJfU1RBX0lORk9dLCBwb2xpY3kpKQorCQlyZXR1cm4gTkxfU0tJUDsKKwlpZiAoIXNpbmZvW05MODAyMTFfU1RBX0lORk9fU0lHTkFMXSkKKwkJcmV0dXJuIE5MX1NLSVA7CisKKwlzaWdfY2hhbmdlLT5jdXJyZW50X3NpZ25hbCA9CisJCShzOCkgbmxhX2dldF91OChzaW5mb1tOTDgwMjExX1NUQV9JTkZPX1NJR05BTF0pOworCisJaWYgKHNpbmZvW05MODAyMTFfU1RBX0lORk9fVFhfQklUUkFURV0pIHsKKwkJaWYgKG5sYV9wYXJzZV9uZXN0ZWQocmluZm8sIE5MODAyMTFfUkFURV9JTkZPX01BWCwKKwkJCQkgICAgIHNpbmZvW05MODAyMTFfU1RBX0lORk9fVFhfQklUUkFURV0sCisJCQkJICAgICByYXRlX3BvbGljeSkpIHsKKwkJCXNpZ19jaGFuZ2UtPmN1cnJlbnRfdHhyYXRlID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChyaW5mb1tOTDgwMjExX1JBVEVfSU5GT19CSVRSQVRFXSkgeworCQkJCXNpZ19jaGFuZ2UtPmN1cnJlbnRfdHhyYXRlID0KKwkJCQkJbmxhX2dldF91MTYocmluZm9bCisJCQkJCSAgICAgTkw4MDIxMV9SQVRFX0lORk9fQklUUkFURV0pICogMTAwOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIE5MX1NLSVA7Cit9CisKK3N0YXRpYyBpbnQgd3BhX2RyaXZlcl9nZXRfbGlua19zaWduYWwodm9pZCAqcHJpdiwgc3RydWN0IHdwYV9zaWduYWxfaW5mbyAqc2lnKQoreworCXN0cnVjdCBpODAyX2JzcyAqYnNzID0gcHJpdjsKKwlzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydiA9IGJzcy0+ZHJ2OworCXN0cnVjdCBubF9tc2cgKm1zZzsKKwlpbnQgcmV0ID0gLTE7CisKKwlzaWctPmN1cnJlbnRfc2lnbmFsID0gLTk5OTk7CisJc2lnLT5jdXJyZW50X3R4cmF0ZSA9IDA7CisKKwltc2cgPSBubG1zZ19hbGxvYygpOworCWlmICghbXNnKQorCQlyZXR1cm4gLTE7CisKKwlnZW5sbXNnX3B1dChtc2csIDAsIDAsIGdlbmxfZmFtaWx5X2dldF9pZChkcnYtPm5sODAyMTEpLCAwLAorCQkgICAgMCwgTkw4MDIxMV9DTURfR0VUX1NUQVRJT04sIDApOworCisJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfSUZJTkRFWCwgZHJ2LT5pZmluZGV4KTsKKwlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX01BQywgRVRIX0FMRU4sIGRydi0+YnNzaWQpOworCisJcmV0ID0gc2VuZF9hbmRfcmVjdl9tc2dzKGRydiwgbXNnLCBnZXRfbGlua19zaWduYWwsIHNpZyk7CisJbXNnID0gTlVMTDsKKwlpZiAocmV0IDwgMCkKKwkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJubDgwMjExOiBnZXQgbGluayBzaWduYWwgZmFpbDogJWQiLCByZXQpOworbmxhX3B1dF9mYWlsdXJlOgorCW5sbXNnX2ZyZWUobXNnKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdwYV9kcml2ZXJfdG9nZ2xlX2J0Y29leF9zdGF0ZShjaGFyIHN0YXRlKQoreworCWludCByZXQ7CisJaW50IGZkID0gb3BlbigiL3N5cy9kZXZpY2VzL3BsYXRmb3JtL3dsMTI3MS9idF9jb2V4X3N0YXRlIiwgT19SRFdSLCAwKTsKKwlpZiAoZmQgPT0gLTEpCisJCXJldHVybiAtMTsKKworCXJldCA9IHdyaXRlKGZkLCAmc3RhdGUsIHNpemVvZihzdGF0ZSkpOworCWNsb3NlKGZkKTsKKworCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiJXM6ICBzZXQgYnRjb2V4IHN0YXRlIHRvICclYycgcmVzdWx0ID0gJWQiLCBfX2Z1bmNfXywKKwkJICAgc3RhdGUsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3cGFfZHJpdmVyX3NldF9wb3dlcl9zYXZlKHZvaWQgKnByaXYsIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgaTgwMl9ic3MgKmJzcyA9IHByaXY7CisJc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYgPSBic3MtPmRydjsKKwlzdHJ1Y3QgbmxfbXNnICptc2c7CisJaW50IHJldCA9IC0xOworCWVudW0gbmw4MDIxMV9wc19zdGF0ZSBwc19zdGF0ZTsKKworCW1zZyA9IG5sbXNnX2FsbG9jKCk7CisJaWYgKCFtc2cpCisJCXJldHVybiAtMTsKKworCWdlbmxtc2dfcHV0KG1zZywgMCwgMCwgZ2VubF9mYW1pbHlfZ2V0X2lkKGRydi0+bmw4MDIxMSksIDAsIDAsCisJCSAgICBOTDgwMjExX0NNRF9TRVRfUE9XRVJfU0FWRSwgMCk7CisKKwlpZiAoc3RhdGUgPT0gV1BBX1BTX0VOQUJMRUQpCisJCXBzX3N0YXRlID0gTkw4MDIxMV9QU19FTkFCTEVEOworCWVsc2UKKwkJcHNfc3RhdGUgPSBOTDgwMjExX1BTX0RJU0FCTEVEOworCisJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfSUZJTkRFWCwgZHJ2LT5pZmluZGV4KTsKKwlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9QU19TVEFURSwgcHNfc3RhdGUpOworCisJcmV0ID0gc2VuZF9hbmRfcmVjdl9tc2dzKGRydiwgbXNnLCBOVUxMLCBOVUxMKTsKKwltc2cgPSBOVUxMOworCWlmIChyZXQgPCAwKQorCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIm5sODAyMTE6IFNldCBwb3dlciBtb2RlIGZhaWw6ICVkIiwgcmV0KTsKK25sYV9wdXRfZmFpbHVyZToKKwlubG1zZ19mcmVlKG1zZyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHdwYV9kcml2ZXJfbmw4MDIxMV9kcml2ZXJfY21kKHZvaWQgKnByaXYsIGNoYXIgKmNtZCwgY2hhciAqYnVmLAorCQkJCSAgc2l6ZV90IGJ1Zl9sZW4gKQoreworCXN0cnVjdCBpODAyX2JzcyAqYnNzID0gcHJpdjsKKwlzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydiA9IGJzcy0+ZHJ2OworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IHJldCA9IDA7CisKKwlpZiAob3Nfc3RyY2FzZWNtcChjbWQsICJTVE9QIikgPT0gMCkgeworCQlsaW51eF9zZXRfaWZhY2VfZmxhZ3MoZHJ2LT5pb2N0bF9zb2NrLCBic3MtPmlmbmFtZSwgMCk7CisJCXdwYV9tc2coZHJ2LT5jdHgsIE1TR19JTkZPLCBXUEFfRVZFTlRfRFJJVkVSX1NUQVRFICJTVE9QUEVEIik7CisJfSBlbHNlIGlmIChvc19zdHJjYXNlY21wKGNtZCwgIlNUQVJUIikgPT0gMCkgeworCQlsaW51eF9zZXRfaWZhY2VfZmxhZ3MoZHJ2LT5pb2N0bF9zb2NrLCBic3MtPmlmbmFtZSwgMSk7CisJCXdwYV9tc2coZHJ2LT5jdHgsIE1TR19JTkZPLCBXUEFfRVZFTlRfRFJJVkVSX1NUQVRFICJTVEFSVEVEIik7CisJfSBlbHNlIGlmIChvc19zdHJjYXNlY21wKGNtZCwgIlJFTE9BRCIpID09IDApIHsKKwkJd3BhX21zZyhkcnYtPmN0eCwgTVNHX0lORk8sIFdQQV9FVkVOVF9EUklWRVJfU1RBVEUgIkhBTkdFRCIpOworCX0gZWxzZSBpZiAob3Nfc3RybmNhc2VjbXAoY21kLCAiUE9XRVJNT0RFICIsIDEwKSA9PSAwKSB7CisJCWludCBtb2RlOworCQltb2RlID0gYXRvaShjbWQgKyAxMCk7CisJCXJldCA9IHdwYV9kcml2ZXJfc2V0X3Bvd2VyX3NhdmUocHJpdiwgbW9kZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQl3cGFfZHJpdmVyX3NlbmRfaGFuZ19tc2coZHJ2KTsKKwkJfSBlbHNlIHsKKwkJCWdfcG93ZXJfbW9kZSA9IG1vZGU7CisJCQlnX2Rydl9lcnJvcnMgPSAwOworCQl9CisJfSBlbHNlIGlmIChvc19zdHJuY2FzZWNtcChjbWQsICJHRVRQT1dFUiIsIDgpID09IDApIHsKKwkJcmV0ID0gb3Nfc25wcmludGYoYnVmLCBidWZfbGVuLCAiUE9XRVJNT0RFID0gJWRcbiIsIGdfcG93ZXJfbW9kZSk7CisJfSBlbHNlIGlmIChvc19zdHJuY2FzZWNtcChjbWQsICJCVENPRVhNT0RFICIsIDExKSA9PSAwKSB7CisJCWludCBtb2RlID0gYXRvaShjbWQgKyAxMSk7CisJCWlmIChtb2RlID09IEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0RJU0FCTEVEKSB7IC8qIGRpc2FibGUgQlQtY29leCAqLworCQkJcmV0ID0gd3BhX2RyaXZlcl90b2dnbGVfYnRjb2V4X3N0YXRlKCcwJyk7CisJCX0gZWxzZSBpZiAobW9kZSA9PSBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9TRU5TRSkgeyAvKiBlbmFibGUgQlQtY29leCAqLworCQkJcmV0ID0gd3BhX2RyaXZlcl90b2dnbGVfYnRjb2V4X3N0YXRlKCcxJyk7CisJCX0gZWxzZSB7CisJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgImludmFsaWQgYnRjb2V4IG1vZGU6ICVkIiwgbW9kZSk7CisJCQlyZXQgPSAtMTsKKwkJfQorCX0gZWxzZSBpZiAoKG9zX3N0cmNhc2VjbXAoY21kLCAiUlNTSSIpID09IDApIHx8IChvc19zdHJjYXNlY21wKGNtZCwgIlJTU0ktQVBQUk9YIikgPT0gMCkpIHsKKwkJc3RydWN0IHdwYV9zaWduYWxfaW5mbyBzaWc7CisJCWludCByc3NpOworCisJCWlmICghZHJ2LT5hc3NvY2lhdGVkKQorCQkJcmV0dXJuIC0xOworCisJCXJldCA9IHdwYV9kcml2ZXJfZ2V0X2xpbmtfc2lnbmFsKHByaXYsICZzaWcpOworCQlpZiAocmV0IDwgMCkgeworCQkJd3BhX2RyaXZlcl9zZW5kX2hhbmdfbXNnKGRydik7CisJCX0gZWxzZSB7CisJCQlyc3NpID0gc2lnLmN1cnJlbnRfc2lnbmFsOworCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICIlcyByc3NpICVkXG4iLCBkcnYtPnNzaWQsIHJzc2kpOworCQkJcmV0ID0gb3Nfc25wcmludGYoYnVmLCBidWZfbGVuLCAiJXMgcnNzaSAlZFxuIiwgZHJ2LT5zc2lkLCByc3NpKTsKKwkJfQorCX0gZWxzZSBpZiAob3Nfc3RyY2FzZWNtcChjbWQsICJMSU5LU1BFRUQiKSA9PSAwKSB7CisJCXN0cnVjdCB3cGFfc2lnbmFsX2luZm8gc2lnOworCQlpbnQgbGlua3NwZWVkOworCisJCWlmICghZHJ2LT5hc3NvY2lhdGVkKQorCQkJcmV0dXJuIC0xOworCisJCXJldCA9IHdwYV9kcml2ZXJfZ2V0X2xpbmtfc2lnbmFsKHByaXYsICZzaWcpOworCQlpZiAocmV0IDwgMCkgeworCQkJd3BhX2RyaXZlcl9zZW5kX2hhbmdfbXNnKGRydik7CisJCX0gZWxzZSB7CisJCQlsaW5rc3BlZWQgPSBzaWcuY3VycmVudF90eHJhdGUgLyAxMDAwOworCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJMaW5rU3BlZWQgJWRcbiIsIGxpbmtzcGVlZCk7CisJCQlyZXQgPSBvc19zbnByaW50ZihidWYsIGJ1Zl9sZW4sICJMaW5rU3BlZWQgJWRcbiIsIGxpbmtzcGVlZCk7CisJCX0KKwl9IGVsc2UgaWYgKG9zX3N0cmNhc2VjbXAoY21kLCAiTUFDQUREUiIpID09IDApIHsKKwkJdTggbWFjYWRkcltFVEhfQUxFTl0gPSB7fTsKKworCQlyZXQgPSBsaW51eF9nZXRfaWZod2FkZHIoZHJ2LT5pb2N0bF9zb2NrLCBic3MtPmlmbmFtZSwgbWFjYWRkcik7CisJCWlmICghcmV0KQorCQkJcmV0ID0gb3Nfc25wcmludGYoYnVmLCBidWZfbGVuLAorCQkJCQkgICJNYWNhZGRyID0gIiBNQUNTVFIgIlxuIiwgTUFDMlNUUihtYWNhZGRyKSk7CisJfSBlbHNlIHsKKwkJd3BhX3ByaW50ZihNU0dfSU5GTywgIiVzOiBVbnN1cHBvcnRlZCBjb21tYW5kICVzIiwgX19mdW5jX18sIGNtZCk7CisJfQorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9tYWM4MDIxMS93cGFfc3VwcGxpY2FudF9saWIvZHJpdmVyX25sODAyMTEuaCBiL21hYzgwMjExL3dwYV9zdXBwbGljYW50X2xpYi9kcml2ZXJfbmw4MDIxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMGYzZjQKLS0tIC9kZXYvbnVsbAorKysgYi9tYWM4MDIxMS93cGFfc3VwcGxpY2FudF9saWIvZHJpdmVyX25sODAyMTEuaApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIERyaXZlciBpbnRlcmFjdGlvbiB3aXRoIExpbnV4IG5sODAyMTEvY2ZnODAyMTEKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDEwLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQsIEluc3RhbnQ4MDIgTmV0d29ya3MsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA2LCBEZXZpY2VzY2FwZSBTb2Z0d2FyZSwgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCBKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAsIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBCU0QKKyAqIGxpY2Vuc2UuCisgKgorICogU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0RSSVZFUl9OTDgwMjExX0hfCisjZGVmaW5lIF9EUklWRVJfTkw4MDIxMV9IXworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0bGluay9nZW5sL2dlbmwuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2dlbmwvZmFtaWx5Lmg+CisjaW5jbHVkZSA8bmV0bGluay9nZW5sL2N0cmwuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXRwYWNrZXQvcGFja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CisjaW5jbHVkZSAibmw4MDIxMV9jb3B5LmgiCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJlbG9vcC5oIgorI2luY2x1ZGUgInV0aWxzL2xpc3QuaCIKKyNpbmNsdWRlICJjb21tb24vaWVlZTgwMl8xMV9kZWZzLmgiCisjaW5jbHVkZSAibmV0bGluay5oIgorI2luY2x1ZGUgImxpbnV4X2lvY3RsLmgiCisjaW5jbHVkZSAicmFkaW90YXAuaCIKKyNpbmNsdWRlICJyYWRpb3RhcF9pdGVyLmgiCisjaW5jbHVkZSAicmZraWxsLmgiCisjaW5jbHVkZSAiZHJpdmVyLmgiCisKKyNpZmRlZiBDT05GSUdfTElCTkwyMAorLyogbGlibmwgMi4wIGNvbXBhdGliaWxpdHkgY29kZSAqLworI2RlZmluZSBubF9oYW5kbGUgbmxfc29jaworI2RlZmluZSBubDgwMjExX2hhbmRsZV9hbGxvYyBubF9zb2NrZXRfYWxsb2NfY2IKKyNkZWZpbmUgbmw4MDIxMV9oYW5kbGVfZGVzdHJveSBubF9zb2NrZXRfZnJlZQorI2VuZGlmIC8qIENPTkZJR19MSUJOTDIwICovCisKKyNpZm5kZWYgSUZGX0xPV0VSX1VQCisjZGVmaW5lIElGRl9MT1dFUl9VUCAgIDB4MTAwMDAgICAgICAgICAvKiBkcml2ZXIgc2lnbmFscyBMMSB1cCAgICAgICAgICovCisjZW5kaWYKKyNpZm5kZWYgSUZGX0RPUk1BTlQKKyNkZWZpbmUgSUZGX0RPUk1BTlQgICAgMHgyMDAwMCAgICAgICAgIC8qIGRyaXZlciBzaWduYWxzIGRvcm1hbnQgICAgICAgKi8KKyNlbmRpZgorCisjaWZuZGVmIElGX09QRVJfRE9STUFOVAorI2RlZmluZSBJRl9PUEVSX0RPUk1BTlQgNQorI2VuZGlmCisjaWZuZGVmIElGX09QRVJfVVAKKyNkZWZpbmUgSUZfT1BFUl9VUCA2CisjZW5kaWYKKworc3RydWN0IG5sODAyMTFfZ2xvYmFsIHsKKwlzdHJ1Y3QgZGxfbGlzdCBpbnRlcmZhY2VzOworfTsKKworc3RydWN0IGk4MDJfYnNzIHsKKwlzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydjsKKwlzdHJ1Y3QgaTgwMl9ic3MgKm5leHQ7CisJaW50IGlmaW5kZXg7CisJY2hhciBpZm5hbWVbSUZOQU1TSVogKyAxXTsKKwljaGFyIGJybmFtZVtJRk5BTVNJWl07CisJdW5zaWduZWQgaW50IGJlYWNvbl9zZXQ6MTsKKwl1bnNpZ25lZCBpbnQgYWRkZWRfaWZfaW50b19icmlkZ2U6MTsKKwl1bnNpZ25lZCBpbnQgYWRkZWRfYnJpZGdlOjE7Cit9OworCitzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgeworCXN0cnVjdCBubDgwMjExX2dsb2JhbCAqZ2xvYmFsOworCXN0cnVjdCBkbF9saXN0IGxpc3Q7CisJdTggYWRkcltFVEhfQUxFTl07CisJY2hhciBwaHluYW1lWzMyXTsKKwl2b2lkICpjdHg7CisJc3RydWN0IG5ldGxpbmtfZGF0YSAqbmV0bGluazsKKwlpbnQgaW9jdGxfc29jazsgLyogc29ja2V0IGZvciBpb2N0bCgpIHVzZSAqLworCWludCBpZmluZGV4OworCWludCBpZl9yZW1vdmVkOworCWludCBpZl9kaXNhYmxlZDsKKwlzdHJ1Y3QgcmZraWxsX2RhdGEgKnJma2lsbDsKKwlzdHJ1Y3Qgd3BhX2RyaXZlcl9jYXBhIGNhcGE7CisJaW50IGhhc19jYXBhYmlsaXR5OworCisJaW50IG9wZXJzdGF0ZTsKKworCWludCBzY2FuX2NvbXBsZXRlX2V2ZW50czsKKworCXN0cnVjdCBubF9oYW5kbGUgKm5sX2hhbmRsZTsKKwlzdHJ1Y3QgbmxfaGFuZGxlICpubF9oYW5kbGVfZXZlbnQ7CisJc3RydWN0IG5sX2hhbmRsZSAqbmxfaGFuZGxlX3ByZXE7CisJc3RydWN0IG5sX2NhY2hlICpubF9jYWNoZTsKKwlzdHJ1Y3QgbmxfY2FjaGUgKm5sX2NhY2hlX2V2ZW50OworCXN0cnVjdCBubF9jYWNoZSAqbmxfY2FjaGVfcHJlcTsKKwlzdHJ1Y3QgbmxfY2IgKm5sX2NiOworCXN0cnVjdCBnZW5sX2ZhbWlseSAqbmw4MDIxMTsKKworCXU4IGF1dGhfYnNzaWRbRVRIX0FMRU5dOworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKwlpbnQgYXNzb2NpYXRlZDsKKwl1OCBzc2lkWzMyXTsKKwlzaXplX3Qgc3NpZF9sZW47CisJaW50IG5sbW9kZTsKKwlpbnQgYXBfc2Nhbl9hc19zdGF0aW9uOworCXVuc2lnbmVkIGludCBhc3NvY19mcmVxOworCisJaW50IG1vbml0b3Jfc29jazsKKwlpbnQgbW9uaXRvcl9pZmlkeDsKKwlpbnQgbm9fbW9uaXRvcl9pZmFjZV9jYXBhYjsKKwlpbnQgZGlzYWJsZV8xMWJfcmF0ZXM7CisKKwl1bnNpZ25lZCBpbnQgcGVuZGluZ19yZW1haW5fb25fY2hhbjoxOworCisJdTY0IHJlbWFpbl9vbl9jaGFuX2Nvb2tpZTsKKwl1NjQgc2VuZF9hY3Rpb25fY29va2llOworCisJdW5zaWduZWQgaW50IGxhc3RfbWdtdF9mcmVxOworCisJc3RydWN0IHdwYV9kcml2ZXJfc2Nhbl9maWx0ZXIgKmZpbHRlcl9zc2lkczsKKwlzaXplX3QgbnVtX2ZpbHRlcl9zc2lkczsKKworCXN0cnVjdCBpODAyX2JzcyBmaXJzdF9ic3M7CisKKyNpZmRlZiBIT1NUQVBECisJaW50IGVhcG9sX3NvY2s7IC8qIHNvY2tldCBmb3IgRUFQT0wgZnJhbWVzICovCisKKwlpbnQgZGVmYXVsdF9pZl9pbmRpY2VzWzE2XTsKKwlpbnQgKmlmX2luZGljZXM7CisJaW50IG51bV9pZl9pbmRpY2VzOworCisJaW50IGxhc3RfZnJlcTsKKwlpbnQgbGFzdF9mcmVxX2h0OworI2VuZGlmIC8qIEhPU1RBUEQgKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWFjODAyMTEvd3BhX3N1cHBsaWNhbnRfbGliL25sODAyMTEuaCBiL21hYzgwMjExL3dwYV9zdXBwbGljYW50X2xpYi9ubDgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3NDliOAotLS0gL2Rldi9udWxsCisrKyBiL21hYzgwMjExL3dwYV9zdXBwbGljYW50X2xpYi9ubDgwMjExLmgKQEAgLTAsMCArMSwxODEzIEBACisjaWZuZGVmIF9fTElOVVhfTkw4MDIxMV9ICisjZGVmaW5lIF9fTElOVVhfTkw4MDIxMV9ICisvKgorICogODAyLjExIG5ldGxpbmsgaW50ZXJmYWNlIHB1YmxpYyBoZWFkZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwNi0yMDEwIEpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CisgKiBDb3B5cmlnaHQgMjAwOCBNaWNoYWVsIFd1IDxmbGFtaW5naWNlQHNvdXJtaWxrLm5ldD4KKyAqIENvcHlyaWdodCAyMDA4IEx1aXMgQ2FybG9zIENvYm8gPGx1aXNjYUBjb3p5Yml0LmNvbT4KKyAqIENvcHlyaWdodCAyMDA4IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgKiBDb3B5cmlnaHQgMjAwOCwgMjAwOSBMdWlzIFIuIFJvZHJpZ3VleiA8bHJvZHJpZ3VlekBhdGhlcm9zLmNvbT4KKyAqIENvcHlyaWdodCAyMDA4IEpvdW5pIE1hbGluZW4gPGpvdW5pLm1hbGluZW5AYXRoZXJvcy5jb20+CisgKiBDb3B5cmlnaHQgMjAwOCBDb2xpbiBNY0NhYmUgPGNvbGluQGNvenliaXQuY29tPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoqCisgKiBET0M6IFN0YXRpb24gaGFuZGxpbmcKKyAqCisgKiBTdGF0aW9ucyBhcmUgYWRkZWQgcGVyIGludGVyZmFjZSwgYnV0IGEgc3BlY2lhbCBjYXNlIGV4aXN0cyB3aXRoIFZMQU4KKyAqIGludGVyZmFjZXMuIFdoZW4gYSBzdGF0aW9uIGlzIGJvdW5kIHRvIGFuIEFQIGludGVyZmFjZSwgaXQgbWF5IGJlIG1vdmVkCisgKiBpbnRvIGEgVkxBTiBpZGVudGlmaWVkIGJ5IGEgVkxBTiBpbnRlcmZhY2UgaW5kZXggKCVOTDgwMjExX0FUVFJfU1RBX1ZMQU4pLgorICogVGhlIHN0YXRpb24gaXMgc3RpbGwgYXNzdW1lZCB0byBiZWxvbmcgdG8gdGhlIEFQIGludGVyZmFjZSBpdCB3YXMgYWRkZWQKKyAqIHRvLgorICoKKyAqIFRPRE86IG5lZWQgbW9yZSBpbmZvPworICovCisKKy8qKgorICogRE9DOiBGcmFtZSB0cmFuc21pc3Npb24vcmVnaXN0cmF0aW9uIHN1cHBvcnQKKyAqCisgKiBGcmFtZSB0cmFuc21pc3Npb24gYW5kIHJlZ2lzdHJhdGlvbiBzdXBwb3J0IGV4aXN0cyB0byBhbGxvdyB1c2Vyc3BhY2UKKyAqIG1hbmFnZW1lbnQgZW50aXRpZXMgc3VjaCBhcyB3cGFfc3VwcGxpY2FudCByZWFjdCB0byBtYW5hZ2VtZW50IGZyYW1lcworICogdGhhdCBhcmUgbm90IGJlaW5nIGhhbmRsZWQgYnkgdGhlIGtlcm5lbC4gVGhpcyBpbmNsdWRlcywgZm9yIGV4YW1wbGUsCisgKiBjZXJ0YWluIGNsYXNzZXMgb2YgYWN0aW9uIGZyYW1lcyB0aGF0IGNhbm5vdCBiZSBoYW5kbGVkIGluIHRoZSBrZXJuZWwKKyAqIGZvciB2YXJpb3VzIHJlYXNvbnMuCisgKgorICogRnJhbWUgcmVnaXN0cmF0aW9uIGlzIGRvbmUgb24gYSBwZXItaW50ZXJmYWNlIGJhc2lzIGFuZCByZWdpc3RyYXRpb25zCisgKiBjYW5ub3QgYmUgcmVtb3ZlZCBvdGhlciB0aGFuIGJ5IGNsb3NpbmcgdGhlIHNvY2tldC4gSXQgaXMgcG9zc2libGUgdG8KKyAqIHNwZWNpZnkgYSByZWdpc3RyYXRpb24gZmlsdGVyIHRvIHJlZ2lzdGVyLCBmb3IgZXhhbXBsZSwgb25seSBmb3IgYQorICogY2VydGFpbiB0eXBlIG9mIGFjdGlvbiBmcmFtZS4gSW4gcGFydGljdWxhciB3aXRoIGFjdGlvbiBmcmFtZXMsIHRob3NlCisgKiB0aGF0IHVzZXJzcGFjZSByZWdpc3RlcnMgZm9yIHdpbGwgbm90IGJlIHJldHVybmVkIGFzIHVuaGFuZGxlZCBieSB0aGUKKyAqIGRyaXZlciwgc28gdGhhdCB0aGUgcmVnaXN0ZXJlZCBhcHBsaWNhdGlvbiBoYXMgdG8gdGFrZSByZXNwb25zaWJpbGl0eQorICogZm9yIGRvaW5nIHRoYXQuCisgKgorICogVGhlIHR5cGUgb2YgZnJhbWUgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCBmb3IgaXMgYWxzbyBkZXBlbmRlbnQgb24gdGhlCisgKiBkcml2ZXIgYW5kIGludGVyZmFjZSB0eXBlLiBUaGUgZnJhbWUgdHlwZXMgYXJlIGFkdmVydGlzZWQgaW4gd2lwaHkKKyAqIGF0dHJpYnV0ZXMgc28gYXBwbGljYXRpb25zIGtub3cgd2hhdCB0byBleHBlY3QuCisgKgorICogTk9URTogV2hlbiBhbiBpbnRlcmZhY2UgY2hhbmdlcyB0eXBlIHdoaWxlIHJlZ2lzdHJhdGlvbnMgYXJlIGFjdGl2ZSwKKyAqICAgICAgIHRoZXNlIHJlZ2lzdHJhdGlvbnMgYXJlIGlnbm9yZWQgdW50aWwgdGhlIGludGVyZmFjZSB0eXBlIGlzCisgKiAgICAgICBjaGFuZ2VkIGFnYWluLiBUaGlzIG1lYW5zIHRoYXQgY2hhbmdpbmcgdGhlIGludGVyZmFjZSB0eXBlIGNhbgorICogICAgICAgbGVhZCB0byBhIHNpdHVhdGlvbiB0aGF0IGNvdWxkbid0IG90aGVyd2lzZSBiZSBwcm9kdWNlZCwgYnV0CisgKiAgICAgICBhbnkgc3VjaCByZWdpc3RyYXRpb25zIHdpbGwgYmUgZG9ybWFudCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5CisgKiAgICAgICB3aWxsIG5vdCBiZSBzZXJ2aWNlZCwgaS5lLiB0aGV5IHdpbGwgbm90IHJlY2VpdmUgYW55IGZyYW1lcy4KKyAqCisgKiBGcmFtZSB0cmFuc21pc3Npb24gYWxsb3dzIHVzZXJzcGFjZSB0byBzZW5kIGZvciBleGFtcGxlIHRoZSByZXF1aXJlZAorICogcmVzcG9uc2VzIHRvIGFjdGlvbiBmcmFtZXMuIEl0IGlzIHN1YmplY3QgdG8gc29tZSBzYW5pdHkgY2hlY2tpbmcsCisgKiBidXQgbWFueSBmcmFtZXMgY2FuIGJlIHRyYW5zbWl0dGVkLiBXaGVuIGEgZnJhbWUgd2FzIHRyYW5zbWl0dGVkLCBpdHMKKyAqIHN0YXR1cyBpcyBpbmRpY2F0ZWQgdG8gdGhlIHNlbmRpbmcgc29ja2V0LgorICoKKyAqIEZvciBtb3JlIHRlY2huaWNhbCBkZXRhaWxzLCBzZWUgdGhlIGNvcnJlc3BvbmRpbmcgY29tbWFuZCBkZXNjcmlwdGlvbnMKKyAqIGJlbG93LgorICovCisKKy8qKgorICogZW51bSBubDgwMjExX2NvbW1hbmRzIC0gc3VwcG9ydGVkIG5sODAyMTEgY29tbWFuZHMKKyAqCisgKiBATkw4MDIxMV9DTURfVU5TUEVDOiB1bnNwZWNpZmllZCBjb21tYW5kIHRvIGNhdGNoIGVycm9ycworICoKKyAqIEBOTDgwMjExX0NNRF9HRVRfV0lQSFk6IHJlcXVlc3QgaW5mb3JtYXRpb24gYWJvdXQgYSB3aXBoeSBvciBkdW1wIHJlcXVlc3QKKyAqICAgIHRvIGdldCBhIGxpc3Qgb2YgYWxsIHByZXNlbnQgd2lwaHlzLgorICogQE5MODAyMTFfQ01EX1NFVF9XSVBIWTogc2V0IHdpcGh5IHBhcmFtZXRlcnMsIG5lZWRzICVOTDgwMjExX0FUVFJfV0lQSFkgb3IKKyAqICAgICVOTDgwMjExX0FUVFJfSUZJTkRFWDsgY2FuIGJlIHVzZWQgdG8gc2V0ICVOTDgwMjExX0FUVFJfV0lQSFlfTkFNRSwKKyAqICAgICVOTDgwMjExX0FUVFJfV0lQSFlfVFhRX1BBUkFNUywgJU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRLAorICogICAgJU5MODAyMTFfQVRUUl9XSVBIWV9DSEFOTkVMX1RZUEUsICVOTDgwMjExX0FUVFJfV0lQSFlfUkVUUllfU0hPUlQsCisgKiAgICAlTkw4MDIxMV9BVFRSX1dJUEhZX1JFVFJZX0xPTkcsICVOTDgwMjExX0FUVFJfV0lQSFlfRlJBR19USFJFU0hPTEQsCisgKiAgICBhbmQvb3IgJU5MODAyMTFfQVRUUl9XSVBIWV9SVFNfVEhSRVNIT0xELgorICogICAgSG93ZXZlciwgZm9yIHNldHRpbmcgdGhlIGNoYW5uZWwsIHNlZSAlTkw4MDIxMV9DTURfU0VUX0NIQU5ORUwKKyAqICAgIGluc3RlYWQsIHRoZSBzdXBwb3J0IGhlcmUgaXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seS4KKyAqIEBOTDgwMjExX0NNRF9ORVdfV0lQSFk6IE5ld2x5IGNyZWF0ZWQgd2lwaHksIHJlc3BvbnNlIHRvIGdldCByZXF1ZXN0CisgKiAgICBvciByZW5hbWUgbm90aWZpY2F0aW9uLiBIYXMgYXR0cmlidXRlcyAlTkw4MDIxMV9BVFRSX1dJUEhZIGFuZAorICogICAgJU5MODAyMTFfQVRUUl9XSVBIWV9OQU1FLgorICogQE5MODAyMTFfQ01EX0RFTF9XSVBIWTogV2lwaHkgZGVsZXRlZC4gSGFzIGF0dHJpYnV0ZXMKKyAqICAgICVOTDgwMjExX0FUVFJfV0lQSFkgYW5kICVOTDgwMjExX0FUVFJfV0lQSFlfTkFNRS4KKyAqCisgKiBATkw4MDIxMV9DTURfR0VUX0lOVEVSRkFDRTogUmVxdWVzdCBhbiBpbnRlcmZhY2UncyBjb25maWd1cmF0aW9uOworICogICAgZWl0aGVyIGEgZHVtcCByZXF1ZXN0IG9uIGEgJU5MODAyMTFfQVRUUl9XSVBIWSBvciBhIHNwZWNpZmljIGdldAorICogICAgb24gYW4gJU5MODAyMTFfQVRUUl9JRklOREVYIGlzIHN1cHBvcnRlZC4KKyAqIEBOTDgwMjExX0NNRF9TRVRfSU5URVJGQUNFOiBTZXQgdHlwZSBvZiBhIHZpcnR1YWwgaW50ZXJmYWNlLCByZXF1aXJlcworICogICAgJU5MODAyMTFfQVRUUl9JRklOREVYIGFuZCAlTkw4MDIxMV9BVFRSX0lGVFlQRS4KKyAqIEBOTDgwMjExX0NNRF9ORVdfSU5URVJGQUNFOiBOZXdseSBjcmVhdGVkIHZpcnR1YWwgaW50ZXJmYWNlIG9yIHJlc3BvbnNlCisgKiAgICB0byAlTkw4MDIxMV9DTURfR0VUX0lOVEVSRkFDRS4gSGFzICVOTDgwMjExX0FUVFJfSUZJTkRFWCwKKyAqICAgICVOTDgwMjExX0FUVFJfV0lQSFkgYW5kICVOTDgwMjExX0FUVFJfSUZUWVBFIGF0dHJpYnV0ZXMuIENhbiBhbHNvCisgKiAgICBiZSBzZW50IGZyb20gdXNlcnNwYWNlIHRvIHJlcXVlc3QgY3JlYXRpb24gb2YgYSBuZXcgdmlydHVhbCBpbnRlcmZhY2UsCisgKiAgICB0aGVuIHJlcXVpcmVzIGF0dHJpYnV0ZXMgJU5MODAyMTFfQVRUUl9XSVBIWSwgJU5MODAyMTFfQVRUUl9JRlRZUEUgYW5kCisgKiAgICAlTkw4MDIxMV9BVFRSX0lGTkFNRS4KKyAqIEBOTDgwMjExX0NNRF9ERUxfSU5URVJGQUNFOiBWaXJ0dWFsIGludGVyZmFjZSB3YXMgZGVsZXRlZCwgaGFzIGF0dHJpYnV0ZXMKKyAqICAgICVOTDgwMjExX0FUVFJfSUZJTkRFWCBhbmQgJU5MODAyMTFfQVRUUl9XSVBIWS4gQ2FuIGFsc28gYmUgc2VudCBmcm9tCisgKiAgICB1c2Vyc3BhY2UgdG8gcmVxdWVzdCBkZWxldGlvbiBvZiBhIHZpcnR1YWwgaW50ZXJmYWNlLCB0aGVuIHJlcXVpcmVzCisgKiAgICBhdHRyaWJ1dGUgJU5MODAyMTFfQVRUUl9JRklOREVYLgorICoKKyAqIEBOTDgwMjExX0NNRF9HRVRfS0VZOiBHZXQgc2VxdWVuY2UgY291bnRlciBpbmZvcm1hdGlvbiBmb3IgYSBrZXkgc3BlY2lmaWVkCisgKiAgICBieSAlTkw4MDIxMV9BVFRSX0tFWV9JRFggYW5kL29yICVOTDgwMjExX0FUVFJfTUFDLgorICogQE5MODAyMTFfQ01EX1NFVF9LRVk6IFNldCBrZXkgYXR0cmlidXRlcyAlTkw4MDIxMV9BVFRSX0tFWV9ERUZBVUxULAorICogICAgJU5MODAyMTFfQVRUUl9LRVlfREVGQVVMVF9NR01ULCBvciAlTkw4MDIxMV9BVFRSX0tFWV9USFJFU0hPTEQuCisgKiBATkw4MDIxMV9DTURfTkVXX0tFWTogYWRkIGEga2V5IHdpdGggZ2l2ZW4gJU5MODAyMTFfQVRUUl9LRVlfREFUQSwKKyAqICAgICVOTDgwMjExX0FUVFJfS0VZX0lEWCwgJU5MODAyMTFfQVRUUl9NQUMsICVOTDgwMjExX0FUVFJfS0VZX0NJUEhFUiwKKyAqICAgIGFuZCAlTkw4MDIxMV9BVFRSX0tFWV9TRVEgYXR0cmlidXRlcy4KKyAqIEBOTDgwMjExX0NNRF9ERUxfS0VZOiBkZWxldGUgYSBrZXkgaWRlbnRpZmllZCBieSAlTkw4MDIxMV9BVFRSX0tFWV9JRFgKKyAqICAgIG9yICVOTDgwMjExX0FUVFJfTUFDLgorICoKKyAqIEBOTDgwMjExX0NNRF9HRVRfQkVBQ09OOiByZXRyaWV2ZSBiZWFjb24gaW5mb3JtYXRpb24gKHJldHVybmVkIGluIGEKKyAqICAgICVOTDgwMjIyX0NNRF9ORVdfQkVBQ09OIG1lc3NhZ2UpCisgKiBATkw4MDIxMV9DTURfU0VUX0JFQUNPTjogc2V0IHRoZSBiZWFjb24gb24gYW4gYWNjZXNzIHBvaW50IGludGVyZmFjZQorICogICAgdXNpbmcgdGhlICVOTDgwMjExX0FUVFJfQkVBQ09OX0lOVEVSVkFMLCAlTkw4MDIxMV9BVFRSX0RUSU1fUEVSSU9ELAorICogICAgJU5MODAyMTFfQVRUUl9CRUFDT05fSEVBRCBhbmQgJU5MODAyMTFfQVRUUl9CRUFDT05fVEFJTCBhdHRyaWJ1dGVzLgorICogQE5MODAyMTFfQ01EX05FV19CRUFDT046IGFkZCBhIG5ldyBiZWFjb24gdG8gYW4gYWNjZXNzIHBvaW50IGludGVyZmFjZSwKKyAqICAgIHBhcmFtZXRlcnMgYXJlIGxpa2UgZm9yICVOTDgwMjExX0NNRF9TRVRfQkVBQ09OLgorICogQE5MODAyMTFfQ01EX0RFTF9CRUFDT046IHJlbW92ZSB0aGUgYmVhY29uLCBzdG9wIHNlbmRpbmcgaXQKKyAqCisgKiBATkw4MDIxMV9DTURfR0VUX1NUQVRJT046IEdldCBzdGF0aW9uIGF0dHJpYnV0ZXMgZm9yIHN0YXRpb24gaWRlbnRpZmllZCBieQorICogICAgJU5MODAyMTFfQVRUUl9NQUMgb24gdGhlIGludGVyZmFjZSBpZGVudGlmaWVkIGJ5ICVOTDgwMjExX0FUVFJfSUZJTkRFWC4KKyAqIEBOTDgwMjExX0NNRF9TRVRfU1RBVElPTjogU2V0IHN0YXRpb24gYXR0cmlidXRlcyBmb3Igc3RhdGlvbiBpZGVudGlmaWVkIGJ5CisgKiAgICAlTkw4MDIxMV9BVFRSX01BQyBvbiB0aGUgaW50ZXJmYWNlIGlkZW50aWZpZWQgYnkgJU5MODAyMTFfQVRUUl9JRklOREVYLgorICogQE5MODAyMTFfQ01EX05FV19TVEFUSU9OOiBBZGQgYSBzdGF0aW9uIHdpdGggZ2l2ZW4gYXR0cmlidXRlcyB0byB0aGUKKyAqICAgIHRoZSBpbnRlcmZhY2UgaWRlbnRpZmllZCBieSAlTkw4MDIxMV9BVFRSX0lGSU5ERVguCisgKiBATkw4MDIxMV9DTURfREVMX1NUQVRJT046IFJlbW92ZSBhIHN0YXRpb24gaWRlbnRpZmllZCBieSAlTkw4MDIxMV9BVFRSX01BQworICogICAgb3IsIGlmIG5vIE1BQyBhZGRyZXNzIGdpdmVuLCBhbGwgc3RhdGlvbnMsIG9uIHRoZSBpbnRlcmZhY2UgaWRlbnRpZmllZAorICogICAgYnkgJU5MODAyMTFfQVRUUl9JRklOREVYLgorICoKKyAqIEBOTDgwMjExX0NNRF9HRVRfTVBBVEg6IEdldCBtZXNoIHBhdGggYXR0cmlidXRlcyBmb3IgbWVzaCBwYXRoIHRvCisgKiAgICAgZGVzdGluYXRpb24gJU5MODAyMTFfQVRUUl9NQUMgb24gdGhlIGludGVyZmFjZSBpZGVudGlmaWVkIGJ5CisgKiAgICAgJU5MODAyMTFfQVRUUl9JRklOREVYLgorICogQE5MODAyMTFfQ01EX1NFVF9NUEFUSDogIFNldCBtZXNoIHBhdGggYXR0cmlidXRlcyBmb3IgbWVzaCBwYXRoIHRvCisgKiAgICAgZGVzdGluYXRpb24gJU5MODAyMTFfQVRUUl9NQUMgb24gdGhlIGludGVyZmFjZSBpZGVudGlmaWVkIGJ5CisgKiAgICAgJU5MODAyMTFfQVRUUl9JRklOREVYLgorICogQE5MODAyMTFfQ01EX05FV19QQVRIOiBBZGQgYSBtZXNoIHBhdGggd2l0aCBnaXZlbiBhdHRyaWJ1dGVzIHRvIHRoZQorICogICAgdGhlIGludGVyZmFjZSBpZGVudGlmaWVkIGJ5ICVOTDgwMjExX0FUVFJfSUZJTkRFWC4KKyAqIEBOTDgwMjExX0NNRF9ERUxfUEFUSDogUmVtb3ZlIGEgbWVzaCBwYXRoIGlkZW50aWZpZWQgYnkgJU5MODAyMTFfQVRUUl9NQUMKKyAqICAgIG9yLCBpZiBubyBNQUMgYWRkcmVzcyBnaXZlbiwgYWxsIG1lc2ggcGF0aHMsIG9uIHRoZSBpbnRlcmZhY2UgaWRlbnRpZmllZAorICogICAgYnkgJU5MODAyMTFfQVRUUl9JRklOREVYLgorICogQE5MODAyMTFfQ01EX1NFVF9CU1M6IFNldCBCU1MgYXR0cmlidXRlcyBmb3IgQlNTIGlkZW50aWZpZWQgYnkKKyAqICAgICVOTDgwMjExX0FUVFJfSUZJTkRFWC4KKyAqCisgKiBATkw4MDIxMV9DTURfR0VUX1JFRzogYXNrIHRoZSB3aXJlbGVzcyBjb3JlIHRvIHNlbmQgdXMgaXRzIGN1cnJlbnRseSBzZXQKKyAqICAgICByZWd1bGF0b3J5IGRvbWFpbi4KKyAqIEBOTDgwMjExX0NNRF9TRVRfUkVHOiBTZXQgY3VycmVudCByZWd1bGF0b3J5IGRvbWFpbi4gQ1JEQSBzZW5kcyB0aGlzIGNvbW1hbmQKKyAqICAgIGFmdGVyIGJlaW5nIHF1ZXJpZWQgYnkgdGhlIGtlcm5lbC4gQ1JEQSByZXBsaWVzIGJ5IHNlbmRpbmcgYSByZWd1bGF0b3J5CisgKiAgICBkb21haW4gc3RydWN0dXJlIHdoaWNoIGNvbnNpc3RzIG9mICVOTDgwMjExX0FUVFJfUkVHX0FMUEhBIHNldCB0byBvdXIKKyAqICAgIGN1cnJlbnQgYWxwaGEyIGlmIGl0IGZvdW5kIGEgbWF0Y2guIEl0IGFsc28gcHJvdmlkZXMKKyAqICAgICBOTDgwMjExX0FUVFJfUkVHX1JVTEVfRkxBR1MsIGFuZCBhIHNldCBvZiByZWd1bGF0b3J5IHJ1bGVzLiBFYWNoCisgKiAgICAgcmVndWxhdG9yeSBydWxlIGlzIGEgbmVzdGVkIHNldCBvZiBhdHRyaWJ1dGVzICBnaXZlbiBieQorICogICAgICVOTDgwMjExX0FUVFJfUkVHX1JVTEVfRlJFUV9bU1RBUlR8RU5EXSBhbmQKKyAqICAgICAlTkw4MDIxMV9BVFRSX0ZSRVFfUkFOR0VfTUFYX0JXIHdpdGggYW4gYXR0YWNoZWQgcG93ZXIgcnVsZSBnaXZlbiBieQorICogICAgICVOTDgwMjExX0FUVFJfUkVHX1JVTEVfUE9XRVJfTUFYX0FOVF9HQUlOIGFuZAorICogICAgICVOTDgwMjExX0FUVFJfUkVHX1JVTEVfUE9XRVJfTUFYX0VJUlAuCisgKiBATkw4MDIxMV9DTURfUkVRX1NFVF9SRUc6IGFzayB0aGUgd2lyZWxlc3MgY29yZSB0byBzZXQgdGhlIHJlZ3VsYXRvcnkgZG9tYWluCisgKiAgICAgdG8gdGhlIHNwZWNpZmllZCBJU08vSUVDIDMxNjYtMSBhbHBoYTIgY291bnRyeSBjb2RlLiBUaGUgY29yZSB3aWxsCisgKiAgICAgc3RvcmUgdGhpcyBhcyBhIHZhbGlkIHJlcXVlc3QgYW5kIHRoZW4gcXVlcnkgdXNlcnNwYWNlIGZvciBpdC4KKyAqCisgKiBATkw4MDIxMV9DTURfR0VUX01FU0hfUEFSQU1TOiBHZXQgbWVzaCBuZXR3b3JraW5nIHByb3BlcnRpZXMgZm9yIHRoZQorICogICAgaW50ZXJmYWNlIGlkZW50aWZpZWQgYnkgJU5MODAyMTFfQVRUUl9JRklOREVYCisgKgorICogQE5MODAyMTFfQ01EX1NFVF9NRVNIX1BBUkFNUzogU2V0IG1lc2ggbmV0d29ya2luZyBwcm9wZXJ0aWVzIGZvciB0aGUKKyAqICAgICAgaW50ZXJmYWNlIGlkZW50aWZpZWQgYnkgJU5MODAyMTFfQVRUUl9JRklOREVYCisgKgorICogQE5MODAyMTFfQ01EX1NFVF9NR01UX0VYVFJBX0lFOiBTZXQgZXh0cmEgSUVzIGZvciBtYW5hZ2VtZW50IGZyYW1lcy4gVGhlCisgKiAgICBpbnRlcmZhY2UgaXMgaWRlbnRpZmllZCB3aXRoICVOTDgwMjExX0FUVFJfSUZJTkRFWCBhbmQgdGhlIG1hbmFnZW1lbnQKKyAqICAgIGZyYW1lIHN1YnR5cGUgd2l0aCAlTkw4MDIxMV9BVFRSX01HTVRfU1VCVFlQRS4gVGhlIGV4dHJhIElFIGRhdGEgdG8gYmUKKyAqICAgIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBtYW5hZ2VtZW50IGZyYW1lIGlzIHNwZWNpZmllZCB3aXRoCisgKiAgICAlTkw4MDIxMV9BVFRSX0lFLiBJZiB0aGUgY29tbWFuZCBzdWNjZWVkcywgdGhlIHJlcXVlc3RlZCBkYXRhIHdpbGwgYmUKKyAqICAgIGFkZGVkIHRvIGFsbCBzcGVjaWZpZWQgbWFuYWdlbWVudCBmcmFtZXMgZ2VuZXJhdGVkIGJ5CisgKiAgICBrZXJuZWwvZmlybXdhcmUvZHJpdmVyLgorICogICAgTm90ZTogVGhpcyBjb21tYW5kIGhhcyBiZWVuIHJlbW92ZWQgYW5kIGl0IGlzIG9ubHkgcmVzZXJ2ZWQgYXQgdGhpcworICogICAgcG9pbnQgdG8gYXZvaWQgcmUtdXNpbmcgZXhpc3RpbmcgY29tbWFuZCBudW1iZXIuIFRoZSBmdW5jdGlvbmFsaXR5IHRoaXMKKyAqICAgIGNvbW1hbmQgd2FzIHBsYW5uZWQgZm9yIGhhcyBiZWVuIHByb3ZpZGVkIHdpdGggY2xlYW5lciBkZXNpZ24gd2l0aCB0aGUKKyAqICAgIG9wdGlvbiB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgSUVzIGluIE5MODAyMTFfQ01EX1RSSUdHRVJfU0NBTiwKKyAqICAgIE5MODAyMTFfQ01EX0FVVEhFTlRJQ0FURSwgTkw4MDIxMV9DTURfQVNTT0NJQVRFLAorICogICAgTkw4MDIxMV9DTURfREVBVVRIRU5USUNBVEUsIGFuZCBOTDgwMjExX0NNRF9ESVNBU1NPQ0lBVEUuCisgKgorICogQE5MODAyMTFfQ01EX0dFVF9TQ0FOOiBnZXQgc2NhbiByZXN1bHRzCisgKiBATkw4MDIxMV9DTURfVFJJR0dFUl9TQ0FOOiB0cmlnZ2VyIGEgbmV3IHNjYW4gd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycworICogQE5MODAyMTFfQ01EX05FV19TQ0FOX1JFU1VMVFM6IHNjYW4gbm90aWZpY2F0aW9uIChhcyBhIHJlcGx5IHRvCisgKiAgICBOTDgwMjExX0NNRF9HRVRfU0NBTiBhbmQgb24gdGhlICJzY2FuIiBtdWx0aWNhc3QgZ3JvdXApCisgKiBATkw4MDIxMV9DTURfU0NBTl9BQk9SVEVEOiBzY2FuIHdhcyBhYm9ydGVkLCBmb3IgdW5zcGVjaWZpZWQgcmVhc29ucywKKyAqICAgIHBhcnRpYWwgc2NhbiByZXN1bHRzIG1heSBiZSBhdmFpbGFibGUKKyAqCisgKiBATkw4MDIxMV9DTURfR0VUX1NVUlZFWTogZ2V0IHN1cnZleSByZXN1bHMsIGUuZy4gY2hhbm5lbCBvY2N1cGF0aW9uCisgKiAgICAgIG9yIG5vaXNlIGxldmVsCisgKiBATkw4MDIxMV9DTURfTkVXX1NVUlZFWV9SRVNVTFRTOiBzdXJ2ZXkgZGF0YSBub3RpZmljYXRpb24gKGFzIGEgcmVwbHkgdG8KKyAqICAgIE5MODAyMTFfQ01EX0dFVF9TVVJWRVkgYW5kIG9uIHRoZSAic2NhbiIgbXVsdGljYXN0IGdyb3VwKQorICoKKyAqIEBOTDgwMjExX0NNRF9SRUdfQ0hBTkdFOiBpbmRpY2F0ZXMgdG8gdXNlcnNwYWNlIHRoZSByZWd1bGF0b3J5IGRvbWFpbgorICogICAgIGhhcyBiZWVuIGNoYW5nZWQgYW5kIHByb3ZpZGVzIGRldGFpbHMgb2YgdGhlIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqICAgICB0aGF0IGNhdXNlZCB0aGUgY2hhbmdlIHN1Y2ggYXMgd2hvIGluaXRpYXRlZCB0aGUgcmVndWxhdG9yeSByZXF1ZXN0CisgKiAgICAgKCVOTDgwMjExX0FUVFJfUkVHX0lOSVRJQVRPUiksIHRoZSB3aXBoeV9pZHgKKyAqICAgICAoJU5MODAyMTFfQVRUUl9SRUdfQUxQSEEyKSBvbiB3aGljaCB0aGUgcmVxdWVzdCB3YXMgbWFkZSBmcm9tIGlmCisgKiAgICAgdGhlIGluaXRpYXRvciB3YXMgJU5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1VOVFJZX0lFIG9yCisgKiAgICAgJU5MODAyMTFfUkVHRE9NX1NFVF9CWV9EUklWRVIsIHRoZSB0eXBlIG9mIHJlZ3VsYXRvcnkgZG9tYWluCisgKiAgICAgc2V0ICglTkw4MDIxMV9BVFRSX1JFR19UWVBFKSwgaWYgdGhlIHR5cGUgb2YgcmVndWxhdG9yeSBkb21haW4gaXMKKyAqICAgICAlTkw4MDIxMV9SRUdfVFlQRV9DT1VOVFJZIHRoZSBhbHBoYTIgdG8gd2hpY2ggd2UgaGF2ZSBtb3ZlZCBvbgorICogICAgIHRvICglTkw4MDIxMV9BVFRSX1JFR19BTFBIQTIpLgorICogQE5MODAyMTFfQ01EX1JFR19CRUFDT05fSElOVDogaW5kaWNhdGVzIHRvIHVzZXJzcGFjZSB0aGF0IGFuIEFQIGJlYWNvbgorICogICAgIGhhcyBiZWVuIGZvdW5kIHdoaWxlIHdvcmxkIHJvYW1pbmcgdGh1cyBlbmFibGluZyBhY3RpdmUgc2NhbiBvcgorICogICAgIGFueSBtb2RlIG9mIG9wZXJhdGlvbiB0aGF0IGluaXRpYXRlcyBUWCAoYmVhY29ucykgb24gYSBjaGFubmVsCisgKiAgICAgd2hlcmUgd2Ugd291bGQgbm90IGhhdmUgYmVlbiBhYmxlIHRvIGRvIGVpdGhlciBiZWZvcmUuIEFzIGFuIGV4YW1wbGUKKyAqICAgICBpZiB5b3UgYXJlIHdvcmxkIHJvYW1pbmcgKHJlZ3VsYXRvcnkgZG9tYWluIHNldCB0byB3b3JsZCBvciBpZiB5b3VyCisgKiAgICAgZHJpdmVyIGlzIHVzaW5nIGEgY3VzdG9tIHdvcmxkIHJvYW1pbmcgcmVndWxhdG9yeSBkb21haW4pIGFuZCB3aGlsZQorICogICAgIGRvaW5nIGEgcGFzc2l2ZSBzY2FuIG9uIHRoZSA1IEdIeiBiYW5kIHlvdSBmaW5kIGFuIEFQIHRoZXJlIChpZiBub3QKKyAqICAgICBvbiBhIERGUyBjaGFubmVsKSB5b3Ugd2lsbCBub3cgYmUgYWJsZSB0byBhY3RpdmVseSBzY2FuIGZvciB0aGF0IEFQCisgKiAgICAgb3IgdXNlIEFQIG1vZGUgb24geW91ciBjYXJkIG9uIHRoYXQgc2FtZSBjaGFubmVsLiBOb3RlIHRoYXQgdGhpcyB3aWxsCisgKiAgICAgbmV2ZXIgYmUgdXNlZCBmb3IgY2hhbm5lbHMgMS0xMSBvbiB0aGUgMiBHSHogYmFuZCBhcyB0aGV5IGFyZSBhbHdheXMKKyAqICAgICBlbmFibGVkIHdvcmxkIHdpZGUuIFRoaXMgYmVhY29uIGhpbnQgaXMgb25seSBzZW50IGlmIHlvdXIgZGV2aWNlIGhhZAorICogICAgIGVpdGhlciBkaXNhYmxlZCBhY3RpdmUgc2Nhbm5pbmcgb3IgYmVhY29uaW5nIG9uIGEgY2hhbm5lbC4gV2Ugc2VuZCB0bworICogICAgIHVzZXJzcGFjZSB0aGUgd2lwaHkgb24gd2hpY2ggd2UgcmVtb3ZlZCBhIHJlc3RyaWN0aW9uIGZyb20KKyAqICAgICAoJU5MODAyMTFfQVRUUl9XSVBIWSkgYW5kIHRoZSBjaGFubmVsIG9uIHdoaWNoIHRoaXMgb2NjdXJyZWQKKyAqICAgICBiZWZvcmUgKCVOTDgwMjExX0FUVFJfRlJFUV9CRUZPUkUpIGFuZCBhZnRlciAoJU5MODAyMTFfQVRUUl9GUkVRX0FGVEVSKQorICogICAgIHRoZSBiZWFjb24gaGludCB3YXMgcHJvY2Vzc2VkLgorICoKKyAqIEBOTDgwMjExX0NNRF9BVVRIRU5USUNBVEU6IGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgYW5kIG5vdGlmaWNhdGlvbi4KKyAqICAgIFRoaXMgY29tbWFuZCBpcyB1c2VkIGJvdGggYXMgYSBjb21tYW5kIChyZXF1ZXN0IHRvIGF1dGhlbnRpY2F0ZSkgYW5kCisgKiAgICBhcyBhbiBldmVudCBvbiB0aGUgIm1sbWUiIG11bHRpY2FzdCBncm91cCBpbmRpY2F0aW5nIGNvbXBsZXRpb24gb2YgdGhlCisgKiAgICBhdXRoZW50aWNhdGlvbiBwcm9jZXNzLgorICogICAgV2hlbiB1c2VkIGFzIGEgY29tbWFuZCwgJU5MODAyMTFfQVRUUl9JRklOREVYIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlCisgKiAgICBpbnRlcmZhY2UuICVOTDgwMjExX0FUVFJfTUFDIGlzIHVzZWQgdG8gc3BlY2lmeSBQZWVyU1RBQWRkcmVzcyAoYW5kCisgKiAgICBCU1NJRCBpbiBjYXNlIG9mIHN0YXRpb24gbW9kZSkuICVOTDgwMjExX0FUVFJfU1NJRCBpcyB1c2VkIHRvIHNwZWNpZnkKKyAqICAgIHRoZSBTU0lEIChtYWlubHkgZm9yIGFzc29jaWF0aW9uLCBidXQgaXMgaW5jbHVkZWQgaW4gYXV0aGVudGljYXRpb24KKyAqICAgIHJlcXVlc3QsIHRvbywgdG8gaGVscCBCU1Mgc2VsZWN0aW9uLiAlTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEgaXMgdXNlZAorICogICAgdG8gc3BlY2lmeSB0aGUgZnJlcXVlbmNlIG9mIHRoZSBjaGFubmVsIGluIE1Iei4gJU5MODAyMTFfQVRUUl9BVVRIX1RZUEUKKyAqICAgIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgYXV0aGVudGljYXRpb24gdHlwZS4gJU5MODAyMTFfQVRUUl9JRSBpcyB1c2VkIHRvCisgKiAgICBkZWZpbmUgSUVzIChWZW5kb3JTcGVjaWZpY0luZm8sIGJ1dCBhbHNvIGluY2x1ZGluZyBSU04gSUUgYW5kIEZUIElFcykKKyAqICAgIHRvIGJlIGFkZGVkIHRvIHRoZSBmcmFtZS4KKyAqICAgIFdoZW4gdXNlZCBhcyBhbiBldmVudCwgdGhpcyByZXBvcnRzIHJlY2VwdGlvbiBvZiBhbiBBdXRoZW50aWNhdGlvbgorICogICAgZnJhbWUgaW4gc3RhdGlvbiBhbmQgSUJTUyBtb2RlcyB3aGVuIHRoZSBsb2NhbCBNTE1FIHByb2Nlc3NlZCB0aGUKKyAqICAgIGZyYW1lLCBpLmUuLCBpdCB3YXMgZm9yIHRoZSBsb2NhbCBTVEEgYW5kIHdhcyByZWNlaXZlZCBpbiBjb3JyZWN0CisgKiAgICBzdGF0ZS4gVGhpcyBpcyBzaW1pbGFyIHRvIE1MTUUtQVVUSEVOVElDQVRFLmNvbmZpcm0gcHJpbWl0aXZlIGluIHRoZQorICogICAgTUxNRSBTQVAgaW50ZXJmYWNlIChrZXJuZWwgcHJvdmlkaW5nIE1MTUUsIHVzZXJzcGFjZSBTTUUpLiBUaGUKKyAqICAgIGluY2x1ZGVkICVOTDgwMjExX0FUVFJfRlJBTUUgYXR0cmlidXRlIGNvbnRhaW5zIHRoZSBtYW5hZ2VtZW50IGZyYW1lCisgKiAgICAoaW5jbHVkaW5nIGJvdGggdGhlIGhlYWRlciBhbmQgZnJhbWUgYm9keSwgYnV0IG5vdCBGQ1MpLiBUaGlzIGV2ZW50IGlzCisgKiAgICBhbHNvIHVzZWQgdG8gaW5kaWNhdGUgaWYgdGhlIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHQgdGltZWQgb3V0LiBJbiB0aGF0CisgKiAgICBjYXNlIHRoZSAlTkw4MDIxMV9BVFRSX0ZSQU1FIGF0dHJpYnV0ZSBpcyByZXBsYWNlZCB3aXRoIGEKKyAqICAgICVOTDgwMjExX0FUVFJfVElNRURfT1VUIGZsYWcgKGFuZCAlTkw4MDIxMV9BVFRSX01BQyB0byBpbmRpY2F0ZSB3aGljaAorICogICAgcGVuZGluZyBhdXRoZW50aWNhdGlvbiB0aW1lZCBvdXQpLgorICogQE5MODAyMTFfQ01EX0FTU09DSUFURTogYXNzb2NpYXRpb24gcmVxdWVzdCBhbmQgbm90aWZpY2F0aW9uOyBsaWtlCisgKiAgICBOTDgwMjExX0NNRF9BVVRIRU5USUNBVEUgYnV0IGZvciBBc3NvY2lhdGlvbiBhbmQgUmVhc3NvY2lhdGlvbgorICogICAgKHNpbWlsYXIgdG8gTUxNRS1BU1NPQ0lBVEUucmVxdWVzdCwgTUxNRS1SRUFTU09DSUFURS5yZXF1ZXN0LAorICogICAgTUxNRS1BU1NPQ0lBVEUuY29uZmlybSBvciBNTE1FLVJFQVNTT0NJQVRFLmNvbmZpcm0gcHJpbWl0aXZlcykuCisgKiBATkw4MDIxMV9DTURfREVBVVRIRU5USUNBVEU6IGRlYXV0aGVudGljYXRpb24gcmVxdWVzdCBhbmQgbm90aWZpY2F0aW9uOyBsaWtlCisgKiAgICBOTDgwMjExX0NNRF9BVVRIRU5USUNBVEUgYnV0IGZvciBEZWF1dGhlbnRpY2F0aW9uIGZyYW1lcyAoc2ltaWxhciB0bworICogICAgTUxNRS1ERUFVVEhFTlRJQ0FUSU9OLnJlcXVlc3QgYW5kIE1MTUUtREVBVVRIRU5USUNBVEUuaW5kaWNhdGlvbgorICogICAgcHJpbWl0aXZlcykuCisgKiBATkw4MDIxMV9DTURfRElTQVNTT0NJQVRFOiBkaXNhc3NvY2lhdGlvbiByZXF1ZXN0IGFuZCBub3RpZmljYXRpb247IGxpa2UKKyAqICAgIE5MODAyMTFfQ01EX0FVVEhFTlRJQ0FURSBidXQgZm9yIERpc2Fzc29jaWF0aW9uIGZyYW1lcyAoc2ltaWxhciB0bworICogICAgTUxNRS1ESVNBU1NPQ0lBVEUucmVxdWVzdCBhbmQgTUxNRS1ESVNBU1NPQ0lBVEUuaW5kaWNhdGlvbiBwcmltaXRpdmVzKS4KKyAqCisgKiBATkw4MDIxMV9DTURfTUlDSEFFTF9NSUNfRkFJTFVSRTogbm90aWZpY2F0aW9uIG9mIGEgbG9jYWxseSBkZXRlY3RlZCBNaWNoYWVsCisgKiAgICBNSUMgKHBhcnQgb2YgVEtJUCkgZmFpbHVyZTsgc2VudCBvbiB0aGUgIm1sbWUiIG11bHRpY2FzdCBncm91cDsgdGhlCisgKiAgICBldmVudCBpbmNsdWRlcyAlTkw4MDIxMV9BVFRSX01BQyB0byBkZXNjcmliZSB0aGUgc291cmNlIE1BQyBhZGRyZXNzIG9mCisgKiAgICB0aGUgZnJhbWUgd2l0aCBpbnZhbGlkIE1JQywgJU5MODAyMTFfQVRUUl9LRVlfVFlQRSB0byBzaG93IHRoZSBrZXkKKyAqICAgIHR5cGUsICVOTDgwMjExX0FUVFJfS0VZX0lEWCB0byBpbmRpY2F0ZSB0aGUga2V5IGlkZW50aWZpZXIsIGFuZAorICogICAgJU5MODAyMTFfQVRUUl9LRVlfU0VRIHRvIGluZGljYXRlIHRoZSBUU0MgdmFsdWUgb2YgdGhlIGZyYW1lOyB0aGlzCisgKiAgICBldmVudCBtYXRjaGVzIHdpdGggTUxNRS1NSUNIQUVMTUlDRkFJTFVSRS5pbmRpY2F0aW9uKCkgcHJpbWl0aXZlCisgKgorICogQE5MODAyMTFfQ01EX0pPSU5fSUJTUzogSm9pbiBhIG5ldyBJQlNTIC0tIGdpdmVuIGF0IGxlYXN0IGFuIFNTSUQgYW5kIGEKKyAqICAgIEZSRVEgYXR0cmlidXRlIChmb3IgdGhlIGluaXRpYWwgZnJlcXVlbmN5IGlmIG5vIHBlZXIgY2FuIGJlIGZvdW5kKQorICogICAgYW5kIG9wdGlvbmFsbHkgYSBNQUMgKGFzIEJTU0lEKSBhbmQgRlJFUV9GSVhFRCBhdHRyaWJ1dGUgaWYgdGhvc2UKKyAqICAgIHNob3VsZCBiZSBmaXhlZCByYXRoZXIgdGhhbiBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQuIENhbiBvbmx5IGJlCisgKiAgICBleGVjdXRlZCBvbiBhIG5ldHdvcmsgaW50ZXJmYWNlIHRoYXQgaXMgVVAsIGFuZCBmaXhlZCBCU1NJRC9GUkVRCisgKiAgICBtYXkgYmUgcmVqZWN0ZWQuIEFub3RoZXIgb3B0aW9uYWwgcGFyYW1ldGVyIGlzIHRoZSBiZWFjb24gaW50ZXJ2YWwsCisgKiAgICBnaXZlbiBpbiB0aGUgJU5MODAyMTFfQVRUUl9CRUFDT05fSU5URVJWQUwgYXR0cmlidXRlLCB3aGljaCBpZiBub3QKKyAqICAgIGdpdmVuIGRlZmF1bHRzIHRvIDEwMCBUVSAoMTAyLjRtcykuCisgKiBATkw4MDIxMV9DTURfTEVBVkVfSUJTUzogTGVhdmUgdGhlIElCU1MgLS0gbm8gc3BlY2lhbCBhcmd1bWVudHMsIHRoZSBJQlNTIGlzCisgKiAgICBkZXRlcm1pbmVkIGJ5IHRoZSBuZXR3b3JrIGludGVyZmFjZS4KKyAqCisgKiBATkw4MDIxMV9DTURfVEVTVE1PREU6IHRlc3Rtb2RlIGNvbW1hbmQsIHRha2VzIGEgd2lwaHkgKG9yIGlmaW5kZXgpIGF0dHJpYnV0ZQorICogICAgdG8gaWRlbnRpZnkgdGhlIGRldmljZSwgYW5kIHRoZSBURVNUREFUQSBibG9iIGF0dHJpYnV0ZSB0byBwYXNzIHRocm91Z2gKKyAqICAgIHRvIHRoZSBkcml2ZXIuCisgKgorICogQE5MODAyMTFfQ01EX0NPTk5FQ1Q6IGNvbm5lY3Rpb24gcmVxdWVzdCBhbmQgbm90aWZpY2F0aW9uOyB0aGlzIGNvbW1hbmQKKyAqICAgIHJlcXVlc3RzIHRvIGNvbm5lY3QgdG8gYSBzcGVjaWZpZWQgbmV0d29yayBidXQgd2l0aG91dCBzZXBhcmF0aW5nCisgKiAgICBhdXRoIGFuZCBhc3NvYyBzdGVwcy4gRm9yIHRoaXMsIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIFNTSUQgaW4gYQorICogICAgJU5MODAyMTFfQVRUUl9TU0lEIGF0dHJpYnV0ZSwgYW5kIGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgdGhlIGFzc29jaWF0aW9uCisgKiAgICBJRXMgaW4gJU5MODAyMTFfQVRUUl9JRSwgJU5MODAyMTFfQVRUUl9BVVRIX1RZUEUsICVOTDgwMjExX0FUVFJfTUFDLAorICogICAgJU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRLCAlTkw4MDIxMV9BVFRSX0NPTlRST0xfUE9SVCwKKyAqICAgICVOTDgwMjExX0FUVFJfQ09OVFJPTF9QT1JUX0VUSEVSVFlQRSBhbmQKKyAqICAgICVOTDgwMjExX0FUVFJfQ09OVFJPTF9QT1JUX05PX0VOQ1JZUFQuCisgKiAgICBJdCBpcyBhbHNvIHNlbnQgYXMgYW4gZXZlbnQsIHdpdGggdGhlIEJTU0lEIGFuZCByZXNwb25zZSBJRXMgd2hlbiB0aGUKKyAqICAgIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgb3IgZmFpbGVkIHRvIGJlIGVzdGFibGlzaGVkLiBUaGlzIGNhbiBiZQorICogICAgZGV0ZXJtaW5lZCBieSB0aGUgU1RBVFVTX0NPREUgYXR0cmlidXRlLgorICogQE5MODAyMTFfQ01EX1JPQU06IHJlcXVlc3QgdGhhdCB0aGUgY2FyZCByb2FtIChjdXJyZW50bHkgbm90IGltcGxlbWVudGVkKSwKKyAqICAgIHNlbnQgYXMgYW4gZXZlbnQgd2hlbiB0aGUgY2FyZC9kcml2ZXIgcm9hbWVkIGJ5IGl0c2VsZi4KKyAqIEBOTDgwMjExX0NNRF9ESVNDT05ORUNUOiBkcm9wIGEgZ2l2ZW4gY29ubmVjdGlvbjsgYWxzbyB1c2VkIHRvIG5vdGlmeQorICogICAgdXNlcnNwYWNlIHRoYXQgYSBjb25uZWN0aW9uIHdhcyBkcm9wcGVkIGJ5IHRoZSBBUCBvciBkdWUgdG8gb3RoZXIKKyAqICAgIHJlYXNvbnMsIGZvciB0aGlzIHRoZSAlTkw4MDIxMV9BVFRSX0RJU0NPTk5FQ1RFRF9CWV9BUCBhbmQKKyAqICAgICVOTDgwMjExX0FUVFJfUkVBU09OX0NPREUgYXR0cmlidXRlcyBhcmUgdXNlZC4KKyAqCisgKiBATkw4MDIxMV9DTURfU0VUX1dJUEhZX05FVE5TOiBTZXQgYSB3aXBoeSdzIG5ldG5zLiBOb3RlIHRoYXQgYWxsIGRldmljZXMKKyAqICAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdpcGh5IG11c3QgYmUgZG93biBhbmQgd2lsbCBmb2xsb3cuCisgKgorICogQE5MODAyMTFfQ01EX1JFTUFJTl9PTl9DSEFOTkVMOiBSZXF1ZXN0IHRvIHJlbWFpbiBhd2FrZSBvbiB0aGUgc3BlY2lmaWVkCisgKiAgICBjaGFubmVsIGZvciB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRvCisgKiAgICBvZmYtY2hhbm5lbCBvcGVyYXRpb25zIGxpa2UgdHJhbnNtaXQgYSBQdWJsaWMgQWN0aW9uIGZyYW1lIGFuZCB3YWl0IGZvcgorICogICAgYSByZXNwb25zZSB3aGlsZSBiZWluZyBhc3NvY2lhdGVkIHRvIGFuIEFQIG9uIGFub3RoZXIgY2hhbm5lbC4KKyAqICAgICVOTDgwMjExX0FUVFJfSUZJTkRFWCBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggaW50ZXJmYWNlIChhbmQgdGh1cworICogICAgcmFkaW8pIGlzIHVzZWQuICVOTDgwMjExX0FUVFJfV0lQSFlfRlJFUSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCisgKiAgICBmcmVxdWVuY3kgZm9yIHRoZSBvcGVyYXRpb24gYW5kICVOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFIG1heSBiZQorICogICAgb3B0aW9uYWxseSB1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbCBjaGFubmVsIHBhcmFtZXRlcnMuCisgKiAgICAlTkw4MDIxMV9BVFRSX0RVUkFUSU9OIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzCisgKiAgICB0byByZW1haW4gb24gdGhlIGNoYW5uZWwuIFRoaXMgY29tbWFuZCBpcyBhbHNvIHVzZWQgYXMgYW4gZXZlbnQgdG8KKyAqICAgIG5vdGlmeSB3aGVuIHRoZSByZXF1ZXN0ZWQgZHVyYXRpb24gc3RhcnRzIChpdCBtYXkgdGFrZSBhIHdoaWxlIGZvciB0aGUKKyAqICAgIGRyaXZlciB0byBzY2hlZHVsZSB0aGlzIHRpbWUgZHVlIHRvIG90aGVyIGNvbmN1cnJlbnQgbmVlZHMgZm9yIHRoZQorICogICAgcmFkaW8pLgorICogICAgV2hlbiBjYWxsZWQsIHRoaXMgb3BlcmF0aW9uIHJldHVybnMgYSBjb29raWUgKCVOTDgwMjExX0FUVFJfQ09PS0lFKQorICogICAgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIHdpdGggYW55IGV2ZW50cyBwZXJ0YWluaW5nIHRvIHRoaXMgcmVxdWVzdDsKKyAqICAgIHRoZSBjb29raWUgaXMgYWxzbyB1c2VkIHRvIGNhbmNlbCB0aGUgcmVxdWVzdC4KKyAqIEBOTDgwMjExX0NNRF9DQU5DRUxfUkVNQUlOX09OX0NIQU5ORUw6IFRoaXMgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBjYW5jZWwgYQorICogICAgcGVuZGluZyByZW1haW4tb24tY2hhbm5lbCBkdXJhdGlvbiBpZiB0aGUgZGVzaXJlZCBvcGVyYXRpb24gaGFzIGJlZW4KKyAqICAgIGNvbXBsZXRlZCBwcmlvciB0byBleHBpcmF0aW9uIG9mIHRoZSBvcmlnaW5hbGx5IHJlcXVlc3RlZCBkdXJhdGlvbi4KKyAqICAgICVOTDgwMjExX0FUVFJfV0lQSFkgb3IgJU5MODAyMTFfQVRUUl9JRklOREVYIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUKKyAqICAgIHJhZGlvLiBUaGUgJU5MODAyMTFfQVRUUl9DT09LSUUgYXR0cmlidXRlIG11c3QgYmUgZ2l2ZW4gYXMgd2VsbCB0bworICogICAgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIHJlcXVlc3QuCisgKiAgICBUaGlzIGNvbW1hbmQgaXMgYWxzbyB1c2VkIGFzIGFuIGV2ZW50IHRvIG5vdGlmeSB3aGVuIGEgcmVxdWVzdGVkCisgKiAgICByZW1haW4tb24tY2hhbm5lbCBkdXJhdGlvbiBoYXMgZXhwaXJlZC4KKyAqCisgKiBATkw4MDIxMV9DTURfU0VUX1RYX0JJVFJBVEVfTUFTSzogU2V0IHRoZSBtYXNrIG9mIHJhdGVzIHRvIGJlIHVzZWQgaW4gVFgKKyAqICAgIHJhdGUgc2VsZWN0aW9uLiAlTkw4MDIxMV9BVFRSX0lGSU5ERVggaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBpbnRlcmZhY2UKKyAqICAgIGFuZCBATkw4MDIxMV9BVFRSX1RYX1JBVEVTIHRoZSBzZXQgb2YgYWxsb3dlZCByYXRlcy4KKyAqCisgKiBATkw4MDIxMV9DTURfUkVHSVNURVJfRlJBTUU6IFJlZ2lzdGVyIGZvciByZWNlaXZpbmcgY2VydGFpbiBtZ210IGZyYW1lcworICogICAgKHZpYSBATkw4MDIxMV9DTURfRlJBTUUpIGZvciBwcm9jZXNzaW5nIGluIHVzZXJzcGFjZS4gVGhpcyBjb21tYW5kCisgKiAgICByZXF1aXJlcyBhbiBpbnRlcmZhY2UgaW5kZXgsIGEgZnJhbWUgdHlwZSBhdHRyaWJ1dGUgKG9wdGlvbmFsIGZvcgorICogICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSByZWFzb25zLCBpZiBub3QgZ2l2ZW4gYXNzdW1lcyBhY3Rpb24gZnJhbWVzKQorICogICAgYW5kIGEgbWF0Y2ggYXR0cmlidXRlIGNvbnRhaW5pbmcgdGhlIGZpcnN0IGZldyBieXRlcyBvZiB0aGUgZnJhbWUKKyAqICAgIHRoYXQgc2hvdWxkIG1hdGNoLCBlLmcuIGEgc2luZ2xlIGJ5dGUgZm9yIG9ubHkgYSBjYXRlZ29yeSBtYXRjaCBvcgorICogICAgZm91ciBieXRlcyBmb3IgdmVuZG9yIGZyYW1lcyBpbmNsdWRpbmcgdGhlIE9VSS4gVGhlIHJlZ2lzdHJhdGlvbgorICogICAgY2Fubm90IGJlIGRyb3BwZWQsIGJ1dCBpcyByZW1vdmVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgbmV0bGluaworICogICAgc29ja2V0IGlzIGNsb3NlZC4gTXVsdGlwbGUgcmVnaXN0cmF0aW9ucyBjYW4gYmUgbWFkZS4KKyAqIEBOTDgwMjExX0NNRF9SRUdJU1RFUl9BQ1RJT046IEFsaWFzIGZvciBATkw4MDIxMV9DTURfUkVHSVNURVJfRlJBTUUgZm9yCisgKiAgICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgKiBATkw4MDIxMV9DTURfRlJBTUU6IE1hbmFnZW1lbnQgZnJhbWUgVFggcmVxdWVzdCBhbmQgUlggbm90aWZpY2F0aW9uLiBUaGlzCisgKiAgICBjb21tYW5kIGlzIHVzZWQgYm90aCBhcyBhIHJlcXVlc3QgdG8gdHJhbnNtaXQgYSBtYW5hZ2VtZW50IGZyYW1lIGFuZAorICogICAgYXMgYW4gZXZlbnQgaW5kaWNhdGluZyByZWNlcHRpb24gb2YgYSBmcmFtZSB0aGF0IHdhcyBub3QgcHJvY2Vzc2VkIGluCisgKiAgICBrZXJuZWwgY29kZSwgYnV0IGlzIGZvciB1cyAoaS5lLiwgd2hpY2ggbWF5IG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGluIGEKKyAqICAgIHVzZXIgc3BhY2UgYXBwbGljYXRpb24pLiAlTkw4MDIxMV9BVFRSX0ZSQU1FIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUKKyAqICAgIGZyYW1lIGNvbnRlbnRzIChpbmNsdWRpbmcgaGVhZGVyKS4gJU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRIChhbmQKKyAqICAgIG9wdGlvbmFsbHkgJU5MODAyMTFfQVRUUl9XSVBIWV9DSEFOTkVMX1RZUEUpIGlzIHVzZWQgdG8gaW5kaWNhdGUgb24KKyAqICAgIHdoaWNoIGNoYW5uZWwgdGhlIGZyYW1lIGlzIHRvIGJlIHRyYW5zbWl0dGVkIG9yIHdhcyByZWNlaXZlZC4gVGhpcworICogICAgY2hhbm5lbCBoYXMgdG8gYmUgdGhlIGN1cnJlbnQgY2hhbm5lbCAocmVtYWluLW9uLWNoYW5uZWwgb3IgdGhlCisgKiAgICBvcGVyYXRpb25hbCBjaGFubmVsKS4gV2hlbiBjYWxsZWQsIHRoaXMgb3BlcmF0aW9uIHJldHVybnMgYSBjb29raWUKKyAqICAgICglTkw4MDIxMV9BVFRSX0NPT0tJRSkgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIHdpdGggdGhlIFRYIHN0YXR1cyBldmVudAorICogICAgcGVydGFpbmluZyB0byB0aGUgVFggcmVxdWVzdC4KKyAqIEBOTDgwMjExX0NNRF9BQ1RJT046IEFsaWFzIGZvciBATkw4MDIxMV9DTURfRlJBTUUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKiBATkw4MDIxMV9DTURfRlJBTUVfVFhfU1RBVFVTOiBSZXBvcnQgVFggc3RhdHVzIG9mIGEgbWFuYWdlbWVudCBmcmFtZQorICogICAgdHJhbnNtaXR0ZWQgd2l0aCAlTkw4MDIxMV9DTURfRlJBTUUuICVOTDgwMjExX0FUVFJfQ09PS0lFIGlkZW50aWZpZXMKKyAqICAgIHRoZSBUWCBjb21tYW5kIGFuZCAlTkw4MDIxMV9BVFRSX0ZSQU1FIGluY2x1ZGVzIHRoZSBjb250ZW50cyBvZiB0aGUKKyAqICAgIGZyYW1lLiAlTkw4MDIxMV9BVFRSX0FDSyBmbGFnIGlzIGluY2x1ZGVkIGlmIHRoZSByZWNpcGllbnQgYWNrbm93bGVkZ2VkCisgKiAgICB0aGUgZnJhbWUuCisgKiBATkw4MDIxMV9DTURfQUNUSU9OX1RYX1NUQVRVUzogQWxpYXMgZm9yIEBOTDgwMjExX0NNRF9GUkFNRV9UWF9TVEFUVVMgZm9yCisgKiAgICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICogQE5MODAyMTFfQ01EX1NFVF9DUU06IENvbm5lY3Rpb24gcXVhbGl0eSBtb25pdG9yIGNvbmZpZ3VyYXRpb24uIFRoaXMgY29tbWFuZAorICogICAgaXMgdXNlZCB0byBjb25maWd1cmUgY29ubmVjdGlvbiBxdWFsaXR5IG1vbml0b3Jpbmcgbm90aWZpY2F0aW9uIHRyaWdnZXIKKyAqICAgIGxldmVscy4KKyAqIEBOTDgwMjExX0NNRF9OT1RJRllfQ1FNOiBDb25uZWN0aW9uIHF1YWxpdHkgbW9uaXRvciBub3RpZmljYXRpb24uIFRoaXMKKyAqICAgIGNvbW1hbmQgaXMgdXNlZCBhcyBhbiBldmVudCB0byBpbmRpY2F0ZSB0aGUgdGhhdCBhIHRyaWdnZXIgbGV2ZWwgd2FzCisgKiAgICByZWFjaGVkLgorICogQE5MODAyMTFfQ01EX1NFVF9DSEFOTkVMOiBTZXQgdGhlIGNoYW5uZWwgKHVzaW5nICVOTDgwMjExX0FUVFJfV0lQSFlfRlJFUQorICogICAgYW5kICVOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFKSB0aGUgZ2l2ZW4gaW50ZXJmYWNlIChpZGVudGlmZWQKKyAqICAgIGJ5ICVOTDgwMjExX0FUVFJfSUZJTkRFWCkgc2hhbGwgb3BlcmF0ZSBvbi4KKyAqICAgIEluIGNhc2UgbXVsdGlwbGUgY2hhbm5lbHMgYXJlIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLCB0aGUgbWVjaGFuaXNtCisgKiAgICB3aXRoIHdoaWNoIGl0IHN3aXRjaGVzIGNoYW5uZWxzIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQuCisgKiAgICBXaGVuIGEgbW9uaXRvciBpbnRlcmZhY2UgaXMgZ2l2ZW4sIGl0IGNhbiBvbmx5IHN3aXRjaCBjaGFubmVsIHdoaWxlCisgKiAgICBubyBvdGhlciBpbnRlcmZhY2VzIGFyZSBvcGVyYXRpbmcgdG8gYXZvaWQgZGlzdHVyYmluZyB0aGUgb3BlcmF0aW9uCisgKiAgICBvZiBhbnkgb3RoZXIgaW50ZXJmYWNlcywgYW5kIG90aGVyIGludGVyZmFjZXMgd2lsbCBhZ2FpbiB0YWtlCisgKiAgICBwcmVjZWRlbmNlIHdoZW4gdGhleSBhcmUgdXNlZC4KKyAqCisgKiBATkw4MDIxMV9DTURfU0VUX1dEU19QRUVSOiBTZXQgdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBwZWVyIG9uIGEgV0RTIGludGVyZmFjZS4KKyAqCisgKiBATkw4MDIxMV9DTURfTUFYOiBoaWdoZXN0IHVzZWQgY29tbWFuZCBudW1iZXIKKyAqIEBfX05MODAyMTFfQ01EX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQorICovCitlbnVtIG5sODAyMTFfY29tbWFuZHMgeworLyogZG9uJ3QgY2hhbmdlIHRoZSBvcmRlciBvciBhZGQgYW55dGhpbmcgaW5iZXR3ZWVuLCB0aGlzIGlzIEFCSSEgKi8KKyAgICBOTDgwMjExX0NNRF9VTlNQRUMsCisKKyAgICBOTDgwMjExX0NNRF9HRVRfV0lQSFksICAgICAgICAvKiBjYW4gZHVtcCAqLworICAgIE5MODAyMTFfQ01EX1NFVF9XSVBIWSwKKyAgICBOTDgwMjExX0NNRF9ORVdfV0lQSFksCisgICAgTkw4MDIxMV9DTURfREVMX1dJUEhZLAorCisgICAgTkw4MDIxMV9DTURfR0VUX0lOVEVSRkFDRSwgICAgLyogY2FuIGR1bXAgKi8KKyAgICBOTDgwMjExX0NNRF9TRVRfSU5URVJGQUNFLAorICAgIE5MODAyMTFfQ01EX05FV19JTlRFUkZBQ0UsCisgICAgTkw4MDIxMV9DTURfREVMX0lOVEVSRkFDRSwKKworICAgIE5MODAyMTFfQ01EX0dFVF9LRVksCisgICAgTkw4MDIxMV9DTURfU0VUX0tFWSwKKyAgICBOTDgwMjExX0NNRF9ORVdfS0VZLAorICAgIE5MODAyMTFfQ01EX0RFTF9LRVksCisKKyAgICBOTDgwMjExX0NNRF9HRVRfQkVBQ09OLAorICAgIE5MODAyMTFfQ01EX1NFVF9CRUFDT04sCisgICAgTkw4MDIxMV9DTURfTkVXX0JFQUNPTiwKKyAgICBOTDgwMjExX0NNRF9ERUxfQkVBQ09OLAorCisgICAgTkw4MDIxMV9DTURfR0VUX1NUQVRJT04sCisgICAgTkw4MDIxMV9DTURfU0VUX1NUQVRJT04sCisgICAgTkw4MDIxMV9DTURfTkVXX1NUQVRJT04sCisgICAgTkw4MDIxMV9DTURfREVMX1NUQVRJT04sCisKKyAgICBOTDgwMjExX0NNRF9HRVRfTVBBVEgsCisgICAgTkw4MDIxMV9DTURfU0VUX01QQVRILAorICAgIE5MODAyMTFfQ01EX05FV19NUEFUSCwKKyAgICBOTDgwMjExX0NNRF9ERUxfTVBBVEgsCisKKyAgICBOTDgwMjExX0NNRF9TRVRfQlNTLAorCisgICAgTkw4MDIxMV9DTURfU0VUX1JFRywKKyAgICBOTDgwMjExX0NNRF9SRVFfU0VUX1JFRywKKworICAgIE5MODAyMTFfQ01EX0dFVF9NRVNIX1BBUkFNUywKKyAgICBOTDgwMjExX0NNRF9TRVRfTUVTSF9QQVJBTVMsCisKKyAgICBOTDgwMjExX0NNRF9TRVRfTUdNVF9FWFRSQV9JRSAvKiByZXNlcnZlZDsgbm90IHVzZWQgKi8sCisKKyAgICBOTDgwMjExX0NNRF9HRVRfUkVHLAorCisgICAgTkw4MDIxMV9DTURfR0VUX1NDQU4sCisgICAgTkw4MDIxMV9DTURfVFJJR0dFUl9TQ0FOLAorICAgIE5MODAyMTFfQ01EX05FV19TQ0FOX1JFU1VMVFMsCisgICAgTkw4MDIxMV9DTURfU0NBTl9BQk9SVEVELAorCisgICAgTkw4MDIxMV9DTURfUkVHX0NIQU5HRSwKKworICAgIE5MODAyMTFfQ01EX0FVVEhFTlRJQ0FURSwKKyAgICBOTDgwMjExX0NNRF9BU1NPQ0lBVEUsCisgICAgTkw4MDIxMV9DTURfREVBVVRIRU5USUNBVEUsCisgICAgTkw4MDIxMV9DTURfRElTQVNTT0NJQVRFLAorCisgICAgTkw4MDIxMV9DTURfTUlDSEFFTF9NSUNfRkFJTFVSRSwKKworICAgIE5MODAyMTFfQ01EX1JFR19CRUFDT05fSElOVCwKKworICAgIE5MODAyMTFfQ01EX0pPSU5fSUJTUywKKyAgICBOTDgwMjExX0NNRF9MRUFWRV9JQlNTLAorCisgICAgTkw4MDIxMV9DTURfVEVTVE1PREUsCisKKyAgICBOTDgwMjExX0NNRF9DT05ORUNULAorICAgIE5MODAyMTFfQ01EX1JPQU0sCisgICAgTkw4MDIxMV9DTURfRElTQ09OTkVDVCwKKworICAgIE5MODAyMTFfQ01EX1NFVF9XSVBIWV9ORVROUywKKworICAgIE5MODAyMTFfQ01EX0dFVF9TVVJWRVksCisgICAgTkw4MDIxMV9DTURfTkVXX1NVUlZFWV9SRVNVTFRTLAorCisgICAgTkw4MDIxMV9DTURfU0VUX1BNS1NBLAorICAgIE5MODAyMTFfQ01EX0RFTF9QTUtTQSwKKyAgICBOTDgwMjExX0NNRF9GTFVTSF9QTUtTQSwKKworICAgIE5MODAyMTFfQ01EX1JFTUFJTl9PTl9DSEFOTkVMLAorICAgIE5MODAyMTFfQ01EX0NBTkNFTF9SRU1BSU5fT05fQ0hBTk5FTCwKKworICAgIE5MODAyMTFfQ01EX1NFVF9UWF9CSVRSQVRFX01BU0ssCisKKyAgICBOTDgwMjExX0NNRF9SRUdJU1RFUl9GUkFNRSwKKyAgICBOTDgwMjExX0NNRF9SRUdJU1RFUl9BQ1RJT04gPSBOTDgwMjExX0NNRF9SRUdJU1RFUl9GUkFNRSwKKyAgICBOTDgwMjExX0NNRF9GUkFNRSwKKyAgICBOTDgwMjExX0NNRF9BQ1RJT04gPSBOTDgwMjExX0NNRF9GUkFNRSwKKyAgICBOTDgwMjExX0NNRF9GUkFNRV9UWF9TVEFUVVMsCisgICAgTkw4MDIxMV9DTURfQUNUSU9OX1RYX1NUQVRVUyA9IE5MODAyMTFfQ01EX0ZSQU1FX1RYX1NUQVRVUywKKworICAgIE5MODAyMTFfQ01EX1NFVF9QT1dFUl9TQVZFLAorICAgIE5MODAyMTFfQ01EX0dFVF9QT1dFUl9TQVZFLAorCisgICAgTkw4MDIxMV9DTURfU0VUX0NRTSwKKyAgICBOTDgwMjExX0NNRF9OT1RJRllfQ1FNLAorCisgICAgTkw4MDIxMV9DTURfU0VUX0NIQU5ORUwsCisgICAgTkw4MDIxMV9DTURfU0VUX1dEU19QRUVSLAorCisgICAgLyogYWRkIG5ldyBjb21tYW5kcyBhYm92ZSBoZXJlICovCisKKyAgICAvKiB1c2VkIHRvIGRlZmluZSBOTDgwMjExX0NNRF9NQVggYmVsb3cgKi8KKyAgICBfX05MODAyMTFfQ01EX0FGVEVSX0xBU1QsCisgICAgTkw4MDIxMV9DTURfTUFYID0gX19OTDgwMjExX0NNRF9BRlRFUl9MQVNUIC0gMQorfTsKKworLyoKKyAqIEFsbG93IHVzZXIgc3BhY2UgcHJvZ3JhbXMgdG8gdXNlICNpZmRlZiBvbiBuZXcgY29tbWFuZHMgYnkgZGVmaW5pbmcgdGhlbQorICogaGVyZQorICovCisjZGVmaW5lIE5MODAyMTFfQ01EX1NFVF9CU1MgTkw4MDIxMV9DTURfU0VUX0JTUworI2RlZmluZSBOTDgwMjExX0NNRF9TRVRfTUdNVF9FWFRSQV9JRSBOTDgwMjExX0NNRF9TRVRfTUdNVF9FWFRSQV9JRQorI2RlZmluZSBOTDgwMjExX0NNRF9SRUdfQ0hBTkdFIE5MODAyMTFfQ01EX1JFR19DSEFOR0UKKyNkZWZpbmUgTkw4MDIxMV9DTURfQVVUSEVOVElDQVRFIE5MODAyMTFfQ01EX0FVVEhFTlRJQ0FURQorI2RlZmluZSBOTDgwMjExX0NNRF9BU1NPQ0lBVEUgTkw4MDIxMV9DTURfQVNTT0NJQVRFCisjZGVmaW5lIE5MODAyMTFfQ01EX0RFQVVUSEVOVElDQVRFIE5MODAyMTFfQ01EX0RFQVVUSEVOVElDQVRFCisjZGVmaW5lIE5MODAyMTFfQ01EX0RJU0FTU09DSUFURSBOTDgwMjExX0NNRF9ESVNBU1NPQ0lBVEUKKyNkZWZpbmUgTkw4MDIxMV9DTURfUkVHX0JFQUNPTl9ISU5UIE5MODAyMTFfQ01EX1JFR19CRUFDT05fSElOVAorCisvKioKKyAqIGVudW0gbmw4MDIxMV9hdHRycyAtIG5sODAyMTEgbmV0bGluayBhdHRyaWJ1dGVzCisgKgorICogQE5MODAyMTFfQVRUUl9VTlNQRUM6IHVuc3BlY2lmaWVkIGF0dHJpYnV0ZSB0byBjYXRjaCBlcnJvcnMKKyAqCisgKiBATkw4MDIxMV9BVFRSX1dJUEhZOiBpbmRleCBvZiB3aXBoeSB0byBvcGVyYXRlIG9uLCBjZi4KKyAqICAgIC9zeXMvY2xhc3MvaWVlZTgwMjExLzxwaHluYW1lPi9pbmRleAorICogQE5MODAyMTFfQVRUUl9XSVBIWV9OQU1FOiB3aXBoeSBuYW1lICh1c2VkIGZvciByZW5hbWluZykKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfVFhRX1BBUkFNUzogYSBuZXN0ZWQgYXJyYXkgb2YgVFggcXVldWUgcGFyYW1ldGVycworICogQE5MODAyMTFfQVRUUl9XSVBIWV9GUkVROiBmcmVxdWVuY3kgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwgaW4gTUh6CisgKiBATkw4MDIxMV9BVFRSX1dJUEhZX0NIQU5ORUxfVFlQRTogaW5jbHVkZWQgd2l0aCBOTDgwMjExX0FUVFJfV0lQSFlfRlJFUQorICogICAgaWYgSFQyMCBvciBIVDQwIGFyZSBhbGxvd2VkIChpLmUuLCA4MDIuMTFuIGRpc2FibGVkIGlmIG5vdCBpbmNsdWRlZCk6CisgKiAgICBOTDgwMjExX0NIQU5fTk9fSFQgPSBIVCBub3QgYWxsb3dlZCAoaS5lLiwgc2FtZSBhcyBub3QgaW5jbHVkaW5nCisgKiAgICAgICAgdGhpcyBhdHRyaWJ1dGUpCisgKiAgICBOTDgwMjExX0NIQU5fSFQyMCA9IEhUMjAgb25seQorICogICAgTkw4MDIxMV9DSEFOX0hUNDBNSU5VUyA9IHNlY29uZGFyeSBjaGFubmVsIGlzIGJlbG93IHRoZSBwcmltYXJ5IGNoYW5uZWwKKyAqICAgIE5MODAyMTFfQ0hBTl9IVDQwUExVUyA9IHNlY29uZGFyeSBjaGFubmVsIGlzIGFib3ZlIHRoZSBwcmltYXJ5IGNoYW5uZWwKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfUkVUUllfU0hPUlQ6IFRYIHJldHJ5IGxpbWl0IGZvciBmcmFtZXMgd2hvc2UgbGVuZ3RoIGlzCisgKiAgICBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIFJUUyB0aHJlc2hvbGQ7IGFsbG93ZWQgcmFuZ2U6IDEuLjI1NTsKKyAqICAgIGRvdDExU2hvcnRSZXRyeUxpbWl0OyB1OAorICogQE5MODAyMTFfQVRUUl9XSVBIWV9SRVRSWV9MT05HOiBUWCByZXRyeSBsaW1pdCBmb3IgZnJhbWVzIHdob3NlIGxlbmd0aCBpcworICogICAgZ3JlYXRlciB0aGFuIHRoZSBSVFMgdGhyZXNob2xkOyBhbGxvd2VkIHJhbmdlOiAxLi4yNTU7CisgKiAgICBkb3QxMVNob3J0TG9uZ0xpbWl0OyB1OAorICogQE5MODAyMTFfQVRUUl9XSVBIWV9GUkFHX1RIUkVTSE9MRDogZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQsIGkuZS4sIG1heGltdW0KKyAqICAgIGxlbmd0aCBpbiBvY3RldHMgZm9yIGZyYW1lczsgYWxsb3dlZCByYW5nZTogMjU2Li44MDAwLCBkaXNhYmxlCisgKiAgICBmcmFnbWVudGF0aW9uIHdpdGggKHUzMiktMTsgZG90MTFGcmFnbWVudGF0aW9uVGhyZXNob2xkOyB1MzIKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfUlRTX1RIUkVTSE9MRDogUlRTIHRocmVzaG9sZCAoVFggZnJhbWVzIHdpdGggbGVuZ3RoCisgKiAgICBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byB0aGlzIHVzZSBSVFMvQ1RTIGhhbmRzaGFrZSk7IGFsbG93ZWQgcmFuZ2U6CisgKiAgICAwLi42NTUzNiwgZGlzYWJsZSB3aXRoICh1MzIpLTE7IGRvdDExUlRTVGhyZXNob2xkOyB1MzIKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfQ09WRVJBR0VfQ0xBU1M6IENvdmVyYWdlIENsYXNzIGFzIGRlZmluZWQgYnkgSUVFRSA4MDIuMTEKKyAqICAgIHNlY3Rpb24gNy4zLjIuOTsgZG90MTFDb3ZlcmFnZUNsYXNzOyB1OAorICoKKyAqIEBOTDgwMjExX0FUVFJfSUZJTkRFWDogbmV0d29yayBpbnRlcmZhY2UgaW5kZXggb2YgdGhlIGRldmljZSB0byBvcGVyYXRlIG9uCisgKiBATkw4MDIxMV9BVFRSX0lGTkFNRTogbmV0d29yayBpbnRlcmZhY2UgbmFtZQorICogQE5MODAyMTFfQVRUUl9JRlRZUEU6IHR5cGUgb2YgdmlydHVhbCBpbnRlcmZhY2UsIHNlZSAmZW51bSBubDgwMjExX2lmdHlwZQorICoKKyAqIEBOTDgwMjExX0FUVFJfTUFDOiBNQUMgYWRkcmVzcyAodmFyaW91cyB1c2VzKQorICoKKyAqIEBOTDgwMjExX0FUVFJfS0VZX0RBVEE6ICh0ZW1wb3JhbCkga2V5IGRhdGE7IGZvciBUS0lQIHRoaXMgY29uc2lzdHMgb2YKKyAqICAgIDE2IGJ5dGVzIGVuY3J5cHRpb24ga2V5IGZvbGxvd2VkIGJ5IDggYnl0ZXMgZWFjaCBmb3IgVFggYW5kIFJYIE1JQworICogICAga2V5cworICogQE5MODAyMTFfQVRUUl9LRVlfSURYOiBrZXkgSUQgKHU4LCAwLTMpCisgKiBATkw4MDIxMV9BVFRSX0tFWV9DSVBIRVI6IGtleSBjaXBoZXIgc3VpdGUgKHUzMiwgYXMgZGVmaW5lZCBieSBJRUVFIDgwMi4xMQorICogICAgc2VjdGlvbiA3LjMuMi4yNS4xLCBlLmcuIDB4MDAwRkFDMDQpCisgKiBATkw4MDIxMV9BVFRSX0tFWV9TRVE6IHRyYW5zbWl0IGtleSBzZXF1ZW5jZSBudW1iZXIgKElWL1BOKSBmb3IgVEtJUCBhbmQKKyAqICAgIENDTVAga2V5cywgZWFjaCBzaXggYnl0ZXMgaW4gbGl0dGxlIGVuZGlhbgorICoKKyAqIEBOTDgwMjExX0FUVFJfQkVBQ09OX0lOVEVSVkFMOiBiZWFjb24gaW50ZXJ2YWwgaW4gVFUKKyAqIEBOTDgwMjExX0FUVFJfRFRJTV9QRVJJT0Q6IERUSU0gcGVyaW9kIGZvciBiZWFjb25pbmcKKyAqIEBOTDgwMjExX0FUVFJfQkVBQ09OX0hFQUQ6IHBvcnRpb24gb2YgdGhlIGJlYWNvbiBiZWZvcmUgdGhlIFRJTSBJRQorICogQE5MODAyMTFfQVRUUl9CRUFDT05fVEFJTDogcG9ydGlvbiBvZiB0aGUgYmVhY29uIGFmdGVyIHRoZSBUSU0gSUUKKyAqCisgKiBATkw4MDIxMV9BVFRSX1NUQV9BSUQ6IEFzc29jaWF0aW9uIElEIGZvciB0aGUgc3RhdGlvbiAodTE2KQorICogQE5MODAyMTFfQVRUUl9TVEFfRkxBR1M6IGZsYWdzLCBuZXN0ZWQgZWxlbWVudCB3aXRoIE5MQV9GTEFHIGF0dHJpYnV0ZXMgb2YKKyAqICAgICZlbnVtIG5sODAyMTFfc3RhX2ZsYWdzIChkZXByZWNhdGVkLCB1c2UgJU5MODAyMTFfQVRUUl9TVEFfRkxBR1MyKQorICogQE5MODAyMTFfQVRUUl9TVEFfTElTVEVOX0lOVEVSVkFMOiBsaXN0ZW4gaW50ZXJ2YWwgYXMgZGVmaW5lZCBieQorICogICAgSUVFRSA4MDIuMTEgNy4zLjEuNiAodTE2KS4KKyAqIEBOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFUzogc3VwcG9ydGVkIHJhdGVzLCBhcnJheSBvZiBzdXBwb3J0ZWQKKyAqICAgIHJhdGVzIGFzIGRlZmluZWQgYnkgSUVFRSA4MDIuMTEgNy4zLjIuMiBidXQgd2l0aG91dCB0aGUgbGVuZ3RoCisgKiAgICByZXN0cmljdGlvbiAoYXQgbW9zdCAlTkw4MDIxMV9NQVhfU1VQUF9SQVRFUykuCisgKiBATkw4MDIxMV9BVFRSX1NUQV9WTEFOOiBpbnRlcmZhY2UgaW5kZXggb2YgVkxBTiBpbnRlcmZhY2UgdG8gbW92ZSBzdGF0aW9uCisgKiAgICB0bywgb3IgdGhlIEFQIGludGVyZmFjZSB0aGUgc3RhdGlvbiB3YXMgb3JpZ2luYWxseSBhZGRlZCB0byB0by4KKyAqIEBOTDgwMjExX0FUVFJfU1RBX0lORk86IGluZm9ybWF0aW9uIGFib3V0IGEgc3RhdGlvbiwgcGFydCBvZiBzdGF0aW9uIGluZm8KKyAqICAgIGdpdmVuIGZvciAlTkw4MDIxMV9DTURfR0VUX1NUQVRJT04sIG5lc3RlZCBhdHRyaWJ1dGUgY29udGFpbmluZworICogICAgaW5mbyBhcyBwb3NzaWJsZSwgc2VlICZlbnVtIG5sODAyMTFfc3RhX2luZm8uCisgKgorICogQE5MODAyMTFfQVRUUl9XSVBIWV9CQU5EUzogSW5mb3JtYXRpb24gYWJvdXQgYW4gb3BlcmF0aW5nIGJhbmRzLAorICogICAgY29uc2lzdGluZyBvZiBhIG5lc3RlZCBhcnJheS4KKyAqCisgKiBATkw4MDIxMV9BVFRSX01FU0hfSUQ6IG1lc2ggaWQgKDEtMzIgYnl0ZXMpLgorICogQE5MODAyMTFfQVRUUl9QTElOS19BQ1RJT046IGFjdGlvbiB0byBwZXJmb3JtIG9uIHRoZSBtZXNoIHBlZXIgbGluay4KKyAqIEBOTDgwMjExX0FUVFJfTVBBVEhfTkVYVF9IT1A6IE1BQyBhZGRyZXNzIG9mIHRoZSBuZXh0IGhvcCBmb3IgYSBtZXNoIHBhdGguCisgKiBATkw4MDIxMV9BVFRSX01QQVRIX0lORk86IGluZm9ybWF0aW9uIGFib3V0IGEgbWVzaF9wYXRoLCBwYXJ0IG9mIG1lc2ggcGF0aAorICogICAgIGluZm8gZ2l2ZW4gZm9yICVOTDgwMjExX0NNRF9HRVRfTVBBVEgsIG5lc3RlZCBhdHRyaWJ1dGUgZGVzY3JpYmVkIGF0CisgKiAgICAmZW51bSBubDgwMjExX21wYXRoX2luZm8uCisgKgorICogQE5MODAyMTFfQVRUUl9NTlRSX0ZMQUdTOiBmbGFncywgbmVzdGVkIGVsZW1lbnQgd2l0aCBOTEFfRkxBRyBhdHRyaWJ1dGVzIG9mCisgKiAgICAgICZlbnVtIG5sODAyMTFfbW50cl9mbGFncy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1JFR19BTFBIQTI6IGFuIElTTy0zMTY2LWFscGhhMiBjb3VudHJ5IGNvZGUgZm9yIHdoaWNoIHRoZQorICogICAgIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4gc2hvdWxkIGJlIHNldCB0byBvciBpcyBhbHJlYWR5IHNldCB0by4KKyAqICAgICBGb3IgZXhhbXBsZSwgJ0NSJywgZm9yIENvc3RhIFJpY2EuIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgYnkgdGhlIGtlcm5lbAorICogICAgIHRvIHF1ZXJ5IHRoZSBDUkRBIHRvIHJldHJpZXZlIG9uZSByZWd1bGF0b3J5IGRvbWFpbi4gVGhpcyBhdHRyaWJ1dGUgY2FuCisgKiAgICAgYWxzbyBiZSB1c2VkIGJ5IHVzZXJzcGFjZSB0byBxdWVyeSB0aGUga2VybmVsIGZvciB0aGUgY3VycmVudGx5IHNldAorICogICAgIHJlZ3VsYXRvcnkgZG9tYWluLiBXZSBjaG9zZSBhbiBhbHBoYTIgYXMgdGhhdCBpcyBhbHNvIHVzZWQgYnkgdGhlCisgKiAgICAgSUVFRS04MDIuMTFkIGNvdW50cnkgaW5mb3JtYXRpb24gZWxlbWVudCB0byBpZGVudGlmeSBhIGNvdW50cnkuCisgKiAgICAgVXNlcnMgY2FuIGFsc28gc2ltcGx5IGFzayB0aGUgd2lyZWxlc3MgY29yZSB0byBzZXQgcmVndWxhdG9yeSBkb21haW4KKyAqICAgICB0byBhIHNwZWNpZmljIGFscGhhMi4KKyAqIEBOTDgwMjExX0FUVFJfUkVHX1JVTEVTOiBhIG5lc3RlZCBhcnJheSBvZiByZWd1bGF0b3J5IGRvbWFpbiByZWd1bGF0b3J5CisgKiAgICBydWxlcy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0JTU19DVFNfUFJPVDogd2hldGhlciBDVFMgcHJvdGVjdGlvbiBpcyBlbmFibGVkICh1OCwgMCBvciAxKQorICogQE5MODAyMTFfQVRUUl9CU1NfU0hPUlRfUFJFQU1CTEU6IHdoZXRoZXIgc2hvcnQgcHJlYW1ibGUgaXMgZW5hYmxlZAorICogICAgKHU4LCAwIG9yIDEpCisgKiBATkw4MDIxMV9BVFRSX0JTU19TSE9SVF9TTE9UX1RJTUU6IHdoZXRoZXIgc2hvcnQgc2xvdCB0aW1lIGVuYWJsZWQKKyAqICAgICh1OCwgMCBvciAxKQorICogQE5MODAyMTFfQVRUUl9CU1NfQkFTSUNfUkFURVM6IGJhc2ljIHJhdGVzLCBhcnJheSBvZiBiYXNpYworICogICAgcmF0ZXMgaW4gZm9ybWF0IGRlZmluZWQgYnkgSUVFRSA4MDIuMTEgNy4zLjIuMiBidXQgd2l0aG91dCB0aGUgbGVuZ3RoCisgKiAgICByZXN0cmljdGlvbiAoYXQgbW9zdCAlTkw4MDIxMV9NQVhfU1VQUF9SQVRFUykuCisgKgorICogQE5MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZOiBIVCBDYXBhYmlsaXR5IGluZm9ybWF0aW9uIGVsZW1lbnQgKGZyb20KKyAqICAgIGFzc29jaWF0aW9uIHJlcXVlc3Qgd2hlbiB1c2VkIHdpdGggTkw4MDIxMV9DTURfTkVXX1NUQVRJT04pCisgKgorICogQE5MODAyMTFfQVRUUl9TVVBQT1JURURfSUZUWVBFUzogbmVzdGVkIGF0dHJpYnV0ZSBjb250YWluaW5nIGFsbAorICogICAgc3VwcG9ydGVkIGludGVyZmFjZSB0eXBlcywgZWFjaCBhIGZsYWcgYXR0cmlidXRlIHdpdGggdGhlIG51bWJlcgorICogICAgb2YgdGhlIGludGVyZmFjZSBtb2RlLgorICoKKyAqIEBOTDgwMjExX0FUVFJfTUdNVF9TVUJUWVBFOiBNYW5hZ2VtZW50IGZyYW1lIHN1YnR5cGUgZm9yCisgKiAgICAlTkw4MDIxMV9DTURfU0VUX01HTVRfRVhUUkFfSUUuCisgKgorICogQE5MODAyMTFfQVRUUl9JRTogSW5mb3JtYXRpb24gZWxlbWVudChzKSBkYXRhICh1c2VkLCBlLmcuLCB3aXRoCisgKiAgICAlTkw4MDIxMV9DTURfU0VUX01HTVRfRVhUUkFfSUUpLgorICoKKyAqIEBOTDgwMjExX0FUVFJfTUFYX05VTV9TQ0FOX1NTSURTOiBudW1iZXIgb2YgU1NJRHMgeW91IGNhbiBzY2FuIHdpdGgKKyAqICAgIGEgc2luZ2xlIHNjYW4gcmVxdWVzdCwgYSB3aXBoeSBhdHRyaWJ1dGUuCisgKiBATkw4MDIxMV9BVFRSX01BWF9TQ0FOX0lFX0xFTjogbWF4aW11bSBsZW5ndGggb2YgaW5mb3JtYXRpb24gZWxlbWVudHMKKyAqICAgIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgc2NhbiByZXF1ZXN0CisgKgorICogQE5MODAyMTFfQVRUUl9TQ0FOX0ZSRVFVRU5DSUVTOiBuZXN0ZWQgYXR0cmlidXRlIHdpdGggZnJlcXVlbmNpZXMgKGluIE1IeikKKyAqIEBOTDgwMjExX0FUVFJfU0NBTl9TU0lEUzogbmVzdGVkIGF0dHJpYnV0ZSB3aXRoIFNTSURzLCBsZWF2ZSBvdXQgZm9yIHBhc3NpdmUKKyAqICAgIHNjYW5uaW5nIGFuZCBpbmNsdWRlIGEgemVyby1sZW5ndGggU1NJRCAod2lsZGNhcmQpIGZvciB3aWxkY2FyZCBzY2FuCisgKiBATkw4MDIxMV9BVFRSX0JTUzogc2NhbiByZXN1bHQgQlNTCisgKgorICogQE5MODAyMTFfQVRUUl9SRUdfSU5JVElBVE9SOiBpbmRpY2F0ZXMgd2hvIHJlcXVlc3RlZCB0aGUgcmVndWxhdG9yeSBkb21haW4KKyAqICAgICBjdXJyZW50bHkgaW4gZWZmZWN0LiBUaGlzIGNvdWxkIGJlIGFueSBvZiB0aGUgJU5MODAyMTFfUkVHRE9NX1NFVF9CWV8qCisgKiBATkw4MDIxMV9BVFRSX1JFR19UWVBFOiBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGhlIHJlZ3VsYXRvcnkgZG9tYWluIGN1cnJlbnRseQorICogICAgIHNldC4gVGhpcyBjYW4gYmUgb25lIG9mIHRoZSBubDgwMjExX3JlZ190eXBlICglTkw4MDIxMV9SRUdET01fVFlQRV8qKQorICoKKyAqIEBOTDgwMjExX0FUVFJfU1VQUE9SVEVEX0NPTU1BTkRTOiB3aXBoeSBhdHRyaWJ1dGUgdGhhdCBzcGVjaWZpZXMKKyAqICAgIGFuIGFycmF5IG9mIGNvbW1hbmQgbnVtYmVycyAoaS5lLiBhIG1hcHBpbmcgaW5kZXggdG8gY29tbWFuZCBudW1iZXIpCisgKiAgICB0aGF0IHRoZSBkcml2ZXIgZm9yIHRoZSBnaXZlbiB3aXBoeSBzdXBwb3J0cy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0ZSQU1FOiBmcmFtZSBkYXRhIChiaW5hcnkgYXR0cmlidXRlKSwgaW5jbHVkaW5nIGZyYW1lIGhlYWRlcgorICogICAgYW5kIGJvZHksIGJ1dCBub3QgRkNTOyB1c2VkLCBlLmcuLCB3aXRoIE5MODAyMTFfQ01EX0FVVEhFTlRJQ0FURSBhbmQKKyAqICAgIE5MODAyMTFfQ01EX0FTU09DSUFURSBldmVudHMKKyAqIEBOTDgwMjExX0FUVFJfU1NJRDogU1NJRCAoYmluYXJ5IGF0dHJpYnV0ZSwgMC4uMzIgb2N0ZXRzKQorICogQE5MODAyMTFfQVRUUl9BVVRIX1RZUEU6IEF1dGhlbnRpY2F0aW9uVHlwZSwgc2VlICZlbnVtIG5sODAyMTFfYXV0aF90eXBlLAorICogICAgcmVwcmVzZW50ZWQgYXMgYSB1MzIKKyAqIEBOTDgwMjExX0FUVFJfUkVBU09OX0NPREU6IFJlYXNvbkNvZGUgZm9yICVOTDgwMjExX0NNRF9ERUFVVEhFTlRJQ0FURSBhbmQKKyAqICAgICVOTDgwMjExX0NNRF9ESVNBU1NPQ0lBVEUsIHUxNgorICoKKyAqIEBOTDgwMjExX0FUVFJfS0VZX1RZUEU6IEtleSBUeXBlLCBzZWUgJmVudW0gbmw4MDIxMV9rZXlfdHlwZSwgcmVwcmVzZW50ZWQgYXMKKyAqICAgIGEgdTMyCisgKgorICogQE5MODAyMTFfQVRUUl9GUkVRX0JFRk9SRTogQSBjaGFubmVsIHdoaWNoIGhhcyBzdWZmZXJlZCBhIHJlZ3VsYXRvcnkgY2hhbmdlCisgKiAgICAgZHVlIHRvIGNvbnNpZGVyYXRpb25zIGZyb20gYSBiZWFjb24gaGludC4gVGhpcyBhdHRyaWJ1dGUgcmVmbGVjdHMKKyAqICAgICB0aGUgc3RhdGUgb2YgdGhlIGNoYW5uZWwgX2JlZm9yZV8gdGhlIGJlYWNvbiBoaW50IHByb2Nlc3NpbmcuIFRoaXMKKyAqICAgICBhdHRyaWJ1dGVzIGNvbnNpc3RzIG9mIGEgbmVzdGVkIGF0dHJpYnV0ZSBjb250YWluaW5nCisgKiAgICAgTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl8qCisgKiBATkw4MDIxMV9BVFRSX0ZSRVFfQUZURVI6IEEgY2hhbm5lbCB3aGljaCBoYXMgc3VmZmVyZWQgYSByZWd1bGF0b3J5IGNoYW5nZQorICogICAgIGR1ZSB0byBjb25zaWRlcmF0aW9ucyBmcm9tIGEgYmVhY29uIGhpbnQuIFRoaXMgYXR0cmlidXRlIHJlZmxlY3RzCisgKiAgICAgdGhlIHN0YXRlIG9mIHRoZSBjaGFubmVsIF9hZnRlcl8gdGhlIGJlYWNvbiBoaW50IHByb2Nlc3NpbmcuIFRoaXMKKyAqICAgICBhdHRyaWJ1dGVzIGNvbnNpc3RzIG9mIGEgbmVzdGVkIGF0dHJpYnV0ZSBjb250YWluaW5nCisgKiAgICAgTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl8qCisgKgorICogQE5MODAyMTFfQVRUUl9DSVBIRVJfU1VJVEVTOiBhIHNldCBvZiB1MzIgdmFsdWVzIGluZGljYXRpbmcgdGhlIHN1cHBvcnRlZAorICogICAgY2lwaGVyIHN1aXRlcworICoKKyAqIEBOTDgwMjExX0FUVFJfRlJFUV9GSVhFRDogYSBmbGFnIGluZGljYXRpbmcgdGhlIElCU1Mgc2hvdWxkIG5vdCB0cnkgdG8gbG9vaworICogICAgZm9yIG90aGVyIG5ldHdvcmtzIG9uIGRpZmZlcmVudCBjaGFubmVscworICoKKyAqIEBOTDgwMjExX0FUVFJfVElNRURfT1VUOiBhIGZsYWcgaW5kaWNhdGluZyB0aGFuIGFuIG9wZXJhdGlvbiB0aW1lZCBvdXQ7IHRoaXMKKyAqICAgIGlzIHVzZWQsIGUuZy4sIHdpdGggJU5MODAyMTFfQ01EX0FVVEhFTlRJQ0FURSBldmVudAorICoKKyAqIEBOTDgwMjExX0FUVFJfVVNFX01GUDogV2hldGhlciBtYW5hZ2VtZW50IGZyYW1lIHByb3RlY3Rpb24gKElFRUUgODAyLjExdykgaXMKKyAqICAgIHVzZWQgZm9yIHRoZSBhc3NvY2lhdGlvbiAoJmVudW0gbmw4MDIxMV9tZnAsIHJlcHJlc2VudGVkIGFzIGEgdTMyKTsKKyAqICAgIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkCisgKiAgICB3aXRoICVOTDgwMjExX0NNRF9BU1NPQ0lBVEUgcmVxdWVzdAorICoKKyAqIEBOTDgwMjExX0FUVFJfU1RBX0ZMQUdTMjogQXR0cmlidXRlIGNvbnRhaW5pbmcgYQorICogICAgJnN0cnVjdCBubDgwMjExX3N0YV9mbGFnX3VwZGF0ZS4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0NPTlRST0xfUE9SVDogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB1c2VyIHNwYWNlIGNvbnRyb2xzCisgKiAgICBJRUVFIDgwMi4xWCBwb3J0LCBpLmUuLCBzZXRzL2NsZWFycyAlTkw4MDIxMV9TVEFfRkxBR19BVVRIT1JJWkVELCBpbgorICogICAgc3RhdGlvbiBtb2RlLiBJZiB0aGUgZmxhZyBpcyBpbmNsdWRlZCBpbiAlTkw4MDIxMV9DTURfQVNTT0NJQVRFCisgKiAgICByZXF1ZXN0LCB0aGUgZHJpdmVyIHdpbGwgYXNzdW1lIHRoYXQgdGhlIHBvcnQgaXMgdW5hdXRob3JpemVkIHVudGlsCisgKiAgICBhdXRob3JpemVkIGJ5IHVzZXIgc3BhY2UuIE90aGVyd2lzZSwgcG9ydCBpcyBtYXJrZWQgYXV0aG9yaXplZCBieQorICogICAgZGVmYXVsdCBpbiBzdGF0aW9uIG1vZGUuCisgKiBATkw4MDIxMV9BVFRSX0NPTlRST0xfUE9SVF9FVEhFUlRZUEU6IEEgMTYtYml0IHZhbHVlIGluZGljYXRpbmcgdGhlCisgKiAgICBldGhlcnR5cGUgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGtleSBuZWdvdGlhdGlvbi4gSXQgY2FuIGJlCisgKiAgICBzcGVjaWZpZWQgd2l0aCB0aGUgYXNzb2NpYXRlIGFuZCBjb25uZWN0IGNvbW1hbmRzLiBJZiBpdCBpcyBub3QKKyAqICAgIHNwZWNpZmllZCwgdGhlIHZhbHVlIGRlZmF1bHRzIHRvIDB4ODg4RSAoUEFFLCA4MDIuMVgpLiBUaGlzCisgKiAgICBhdHRyaWJ1dGUgaXMgYWxzbyB1c2VkIGFzIGEgZmxhZyBpbiB0aGUgd2lwaHkgaW5mb3JtYXRpb24gdG8KKyAqICAgIGluZGljYXRlIHRoYXQgcHJvdG9jb2xzIG90aGVyIHRoYW4gUEFFIGFyZSBzdXBwb3J0ZWQuCisgKiBATkw4MDIxMV9BVFRSX0NPTlRST0xfUE9SVF9OT19FTkNSWVBUOiBXaGVuIGluY2x1ZGVkIGFsb25nIHdpdGgKKyAqICAgICVOTDgwMjExX0FUVFJfQ09OVFJPTF9QT1JUX0VUSEVSVFlQRSwgaW5kaWNhdGVzIHRoYXQgdGhlIGN1c3RvbQorICogICAgZXRoZXJ0eXBlIGZyYW1lcyB1c2VkIGZvciBrZXkgbmVnb3RpYXRpb24gbXVzdCBub3QgYmUgZW5jcnlwdGVkLgorICoKKyAqIEBOTDgwMjExX0FUVFJfVEVTVERBVEE6IFRlc3Rtb2RlIGRhdGEgYmxvYiwgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGRyaXZlci4KKyAqICAgIFdlIHJlY29tbWVuZCB1c2luZyBuZXN0ZWQsIGRyaXZlci1zcGVjaWZpYyBhdHRyaWJ1dGVzIHdpdGhpbiB0aGlzLgorICoKKyAqIEBOTDgwMjExX0FUVFJfRElTQ09OTkVDVEVEX0JZX0FQOiBBIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBESVNDT05ORUNUCisgKiAgICBldmVudCB3YXMgZHVlIHRvIHRoZSBBUCBkaXNjb25uZWN0aW5nIHRoZSBzdGF0aW9uLCBhbmQgbm90IGR1ZSB0bworICogICAgYSBsb2NhbCBkaXNjb25uZWN0IHJlcXVlc3QuCisgKiBATkw4MDIxMV9BVFRSX1NUQVRVU19DT0RFOiBTdGF0dXNDb2RlIGZvciB0aGUgJU5MODAyMTFfQ01EX0NPTk5FQ1QKKyAqICAgIGV2ZW50ICh1MTYpCisgKiBATkw4MDIxMV9BVFRSX1BSSVZBQ1k6IEZsYWcgYXR0cmlidXRlLCB1c2VkIHdpdGggY29ubmVjdCgpLCBpbmRpY2F0aW5nCisgKiAgICB0aGF0IHByb3RlY3RlZCBBUHMgc2hvdWxkIGJlIHVzZWQuCisgKgorICogQE5MODAyMTFfQVRUUl9DSVBIRVJTX1BBSVJXSVNFOiBVc2VkIHdpdGggQ09OTkVDVCBhbmQgQVNTT0NJQVRFIHRvCisgKiAgICBpbmRpY2F0ZSB3aGljaCB1bmljYXN0IGtleSBjaXBoZXJzIHdpbGwgYmUgdXNlZCB3aXRoIHRoZSBjb25uZWN0aW9uCisgKiAgICAoYW4gYXJyYXkgb2YgdTMyKS4KKyAqIEBOTDgwMjExX0FUVFJfQ0lQSEVSX0dST1VQOiBVc2VkIHdpdGggQ09OTkVDVCBhbmQgQVNTT0NJQVRFIHRvIGluZGljYXRlCisgKiAgICB3aGljaCBncm91cCBrZXkgY2lwaGVyIHdpbGwgYmUgdXNlZCB3aXRoIHRoZSBjb25uZWN0aW9uIChhIHUzMikuCisgKiBATkw4MDIxMV9BVFRSX1dQQV9WRVJTSU9OUzogVXNlZCB3aXRoIENPTk5FQ1QgYW5kIEFTU09DSUFURSB0byBpbmRpY2F0ZQorICogICAgd2hpY2ggV1BBIHZlcnNpb24ocykgdGhlIEFQIHdlIHdhbnQgdG8gYXNzb2NpYXRlIHdpdGggaXMgdXNpbmcKKyAqICAgIChhIHUzMiB3aXRoIGZsYWdzIGZyb20gJmVudW0gbmw4MDIxMV93cGFfdmVyc2lvbnMpLgorICogQE5MODAyMTFfQVRUUl9BS01fU1VJVEVTOiBVc2VkIHdpdGggQ09OTkVDVCBhbmQgQVNTT0NJQVRFIHRvIGluZGljYXRlCisgKiAgICB3aGljaCBrZXkgbWFuYWdlbWVudCBhbGdvcml0aG0ocykgdG8gdXNlIChhbiBhcnJheSBvZiB1MzIpLgorICoKKyAqIEBOTDgwMjExX0FUVFJfUkVRX0lFOiAoUmUpYXNzb2NpYXRpb24gcmVxdWVzdCBpbmZvcm1hdGlvbiBlbGVtZW50cyBhcworICogICAgc2VudCBvdXQgYnkgdGhlIGNhcmQsIGZvciBST0FNIGFuZCBzdWNjZXNzZnVsIENPTk5FQ1QgZXZlbnRzLgorICogQE5MODAyMTFfQVRUUl9SRVNQX0lFOiAoUmUpYXNzb2NpYXRpb24gcmVzcG9uc2UgaW5mb3JtYXRpb24gZWxlbWVudHMgYXMKKyAqICAgIHNlbnQgYnkgcGVlciwgZm9yIFJPQU0gYW5kIHN1Y2Nlc3NmdWwgQ09OTkVDVCBldmVudHMuCisgKgorICogQE5MODAyMTFfQVRUUl9QUkVWX0JTU0lEOiBwcmV2aW91cyBCU1NJRCwgdG8gYmUgdXNlZCBieSBpbiBBU1NPQ0lBVEUKKyAqICAgIGNvbW1hbmRzIHRvIHNwZWNpZnkgdXNpbmcgYSByZWFzc29jaWF0ZSBmcmFtZQorICoKKyAqIEBOTDgwMjExX0FUVFJfS0VZOiBrZXkgaW5mb3JtYXRpb24gaW4gYSBuZXN0ZWQgYXR0cmlidXRlIHdpdGgKKyAqICAgICVOTDgwMjExX0tFWV8qIHN1Yi1hdHRyaWJ1dGVzCisgKiBATkw4MDIxMV9BVFRSX0tFWVM6IGFycmF5IG9mIGtleXMgZm9yIHN0YXRpYyBXRVAga2V5cyBmb3IgY29ubmVjdCgpCisgKiAgICBhbmQgam9pbl9pYnNzKCksIGtleSBpbmZvcm1hdGlvbiBpcyBpbiBhIG5lc3RlZCBhdHRyaWJ1dGUgZWFjaAorICogICAgd2l0aCAlTkw4MDIxMV9LRVlfKiBzdWItYXR0cmlidXRlcworICoKKyAqIEBOTDgwMjExX0FUVFJfUElEOiBQcm9jZXNzIElEIG9mIGEgbmV0d29yayBuYW1lc3BhY2UuCisgKgorICogQE5MODAyMTFfQVRUUl9HRU5FUkFUSU9OOiBVc2VkIHRvIGluZGljYXRlIGNvbnNpc3RlbnQgc25hcHNob3RzIGZvcgorICogICAgZHVtcHMuIFRoaXMgbnVtYmVyIGluY3JlYXNlcyB3aGVuZXZlciB0aGUgb2JqZWN0IGxpc3QgYmVpbmcKKyAqICAgIGR1bXBlZCBjaGFuZ2VzLCBhbmQgYXMgc3VjaCB1c2Vyc3BhY2UgY2FuIHZlcmlmeSB0aGF0IGl0IGhhcworICogICAgb2J0YWluZWQgYSBjb21wbGV0ZSBhbmQgY29uc2lzdGVudCBzbmFwc2hvdCBieSB2ZXJpZnlpbmcgdGhhdAorICogICAgYWxsIGR1bXAgbWVzc2FnZXMgY29udGFpbiB0aGUgc2FtZSBnZW5lcmF0aW9uIG51bWJlci4gSWYgaXQKKyAqICAgIGNoYW5nZWQgdGhlbiB0aGUgbGlzdCBjaGFuZ2VkIGFuZCB0aGUgZHVtcCBzaG91bGQgYmUgcmVwZWF0ZWQKKyAqICAgIGNvbXBsZXRlbHkgZnJvbSBzY3JhdGNoLgorICoKKyAqIEBOTDgwMjExX0FUVFJfNEFERFI6IFVzZSA0LWFkZHJlc3MgZnJhbWVzIG9uIGEgdmlydHVhbCBpbnRlcmZhY2UKKyAqCisgKiBATkw4MDIxMV9BVFRSX1NVUlZFWV9JTkZPOiBzdXJ2ZXkgaW5mb3JtYXRpb24gYWJvdXQgYSBjaGFubmVsLCBwYXJ0IG9mCisgKiAgICAgIHRoZSBzdXJ2ZXkgcmVzcG9uc2UgZm9yICVOTDgwMjExX0NNRF9HRVRfU1VSVkVZLCBuZXN0ZWQgYXR0cmlidXRlCisgKiAgICAgIGNvbnRhaW5pbmcgaW5mbyBhcyBwb3NzaWJsZSwgc2VlICZlbnVtIHN1cnZleV9pbmZvLgorICoKKyAqIEBOTDgwMjExX0FUVFJfUE1LSUQ6IFBNSyBtYXRlcmlhbCBmb3IgUE1LU0EgY2FjaGluZy4KKyAqIEBOTDgwMjExX0FUVFJfTUFYX05VTV9QTUtJRFM6IG1heGltdW0gbnVtYmVyIG9mIFBNS0lEcyBhIGZpcm13YXJlIGNhbgorICogICAgY2FjaGUsIGEgd2lwaHkgYXR0cmlidXRlLgorICoKKyAqIEBOTDgwMjExX0FUVFJfRFVSQVRJT046IER1cmF0aW9uIG9mIGFuIG9wZXJhdGlvbiBpbiBtaWxsaXNlY29uZHMsIHUzMi4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0NPT0tJRTogR2VuZXJpYyA2NC1iaXQgY29va2llIHRvIGlkZW50aWZ5IG9iamVjdHMuCisgKgorICogQE5MODAyMTFfQVRUUl9UWF9SQVRFUzogTmVzdGVkIHNldCBvZiBhdHRyaWJ1dGVzCisgKiAgICAoZW51bSBubDgwMjExX3R4X3JhdGVfYXR0cmlidXRlcykgZGVzY3JpYmluZyBUWCByYXRlcyBwZXIgYmFuZC4gVGhlCisgKiAgICBlbnVtIG5sODAyMTFfYmFuZCB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBpbmRleCAobmxhX3R5cGUoKSBvZiB0aGUgbmVzdGVkCisgKiAgICBkYXRhLiBJZiBhIGJhbmQgaXMgbm90IGluY2x1ZGVkLCBpdCB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gYWxsb3cgYWxsCisgKiAgICByYXRlcyBiYXNlZCBvbiBuZWdvdGlhdGVkIHN1cHBvcnRlZCByYXRlcyBpbmZvcm1hdGlvbi4gVGhpcyBhdHRyaWJ1dGUKKyAqICAgIGlzIHVzZWQgd2l0aCAlTkw4MDIxMV9DTURfU0VUX1RYX0JJVFJBVEVfTUFTSy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0ZSQU1FX01BVENIOiBBIGJpbmFyeSBhdHRyaWJ1dGUgd2hpY2ggdHlwaWNhbGx5IG11c3QgY29udGFpbgorICogICAgYXQgbGVhc3Qgb25lIGJ5dGUsIGN1cnJlbnRseSB1c2VkIHdpdGggQE5MODAyMTFfQ01EX1JFR0lTVEVSX0ZSQU1FLgorICogQE5MODAyMTFfQVRUUl9GUkFNRV9UWVBFOiBBIHUxNiBpbmRpY2F0aW5nIHRoZSBmcmFtZSB0eXBlL3N1YnR5cGUgZm9yIHRoZQorICogICAgQE5MODAyMTFfQ01EX1JFR0lTVEVSX0ZSQU1FIGNvbW1hbmQuCisgKiBATkw4MDIxMV9BVFRSX1RYX0ZSQU1FX1RZUEVTOiB3aXBoeSBjYXBhYmlsaXR5IGF0dHJpYnV0ZSwgd2hpY2ggaXMgYQorICogICAgbmVzdGVkIGF0dHJpYnV0ZSBvZiAlTkw4MDIxMV9BVFRSX0ZSQU1FX1RZUEUgYXR0cmlidXRlcywgY29udGFpbmluZworICogICAgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggZnJhbWUgdHlwZXMgY2FuIGJlIHRyYW5zbWl0dGVkIHdpdGgKKyAqICAgICVOTDgwMjExX0NNRF9GUkFNRS4KKyAqIEBOTDgwMjExX0FUVFJfUlhfRlJBTUVfVFlQRVM6IHdpcGh5IGNhcGFiaWxpdHkgYXR0cmlidXRlLCB3aGljaCBpcyBhCisgKiAgICBuZXN0ZWQgYXR0cmlidXRlIG9mICVOTDgwMjExX0FUVFJfRlJBTUVfVFlQRSBhdHRyaWJ1dGVzLCBjb250YWluaW5nCisgKiAgICBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCBmcmFtZSB0eXBlcyBjYW4gYmUgcmVnaXN0ZXJlZCBmb3IgUlguCisgKgorICogQE5MODAyMTFfQVRUUl9BQ0s6IEZsYWcgYXR0cmlidXRlIGluZGljYXRpbmcgdGhhdCB0aGUgZnJhbWUgd2FzCisgKiAgICBhY2tub3dsZWRnZWQgYnkgdGhlIHJlY2lwaWVudC4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0NRTTogY29ubmVjdGlvbiBxdWFsaXR5IG1vbml0b3IgY29uZmlndXJhdGlvbiBpbiBhCisgKiAgICBuZXN0ZWQgYXR0cmlidXRlIHdpdGggJU5MODAyMTFfQVRUUl9DUU1fKiBzdWItYXR0cmlidXRlcy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0xPQ0FMX1NUQVRFX0NIQU5HRTogRmxhZyBhdHRyaWJ1dGUgdG8gaW5kaWNhdGUgdGhhdCBhIGNvbW1hbmQKKyAqICAgIGlzIHJlcXVlc3RpbmcgYSBsb2NhbCBhdXRoZW50aWNhdGlvbi9hc3NvY2lhdGlvbiBzdGF0ZSBjaGFuZ2Ugd2l0aG91dAorICogICAgaW52b2tpbmcgYWN0dWFsIG1hbmFnZW1lbnQgZnJhbWUgZXhjaGFuZ2UuIFRoaXMgY2FuIGJlIHVzZWQgd2l0aAorICogICAgTkw4MDIxMV9DTURfQVVUSEVOVElDQVRFLCBOTDgwMjExX0NNRF9ERUFVVEhFTlRJQ0FURSwKKyAqICAgIE5MODAyMTFfQ01EX0RJU0FTU09DSUFURS4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0FQX0lTT0xBVEU6IChBUCBtb2RlKSBEbyBub3QgZm9yd2FyZCB0cmFmZmljIGJldHdlZW4gc3RhdGlvbnMKKyAqICAgIGNvbm5lY3RlZCB0byB0aGlzIEJTUy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1dJUEhZX1RYX1BPV0VSX1NFVFRJTkc6IFRyYW5zbWl0IHBvd2VyIHNldHRpbmcgdHlwZS4gU2VlCisgKiAgICAgICZlbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyBmb3IgcG9zc2libGUgdmFsdWVzLgorICogQE5MODAyMTFfQVRUUl9XSVBIWV9UWF9QT1dFUl9MRVZFTDogVHJhbnNtaXQgcG93ZXIgbGV2ZWwgaW4gc2lnbmVkIG1CbSB1bml0cy4KKyAqICAgICAgVGhpcyBpcyB1c2VkIGluIGFzc29jaWF0aW9uIHdpdGggQE5MODAyMTFfQVRUUl9XSVBIWV9UWF9QT1dFUl9TRVRUSU5HCisgKiAgICAgIGZvciBub24tYXV0b21hdGljIHNldHRpbmdzLgorICoKKyAqIEBOTDgwMjExX0FUVFJfU1VQUE9SVF9JQlNTX1JTTjogVGhlIGRldmljZSBzdXBwb3J0cyBJQlNTIFJTTiwgd2hpY2ggbW9zdGx5CisgKiAgICBtZWFucyBzdXBwb3J0IGZvciBwZXItc3RhdGlvbiBHVEtzLgorICoKKyAqIEBOTDgwMjExX0FUVFJfTUFYOiBoaWdoZXN0IGF0dHJpYnV0ZSBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKKyAqIEBfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqLworZW51bSBubDgwMjExX2F0dHJzIHsKKy8qIGRvbid0IGNoYW5nZSB0aGUgb3JkZXIgb3IgYWRkIGFueXRoaW5nIGluYmV0d2VlbiwgdGhpcyBpcyBBQkkhICovCisgICAgTkw4MDIxMV9BVFRSX1VOU1BFQywKKworICAgIE5MODAyMTFfQVRUUl9XSVBIWSwKKyAgICBOTDgwMjExX0FUVFJfV0lQSFlfTkFNRSwKKworICAgIE5MODAyMTFfQVRUUl9JRklOREVYLAorICAgIE5MODAyMTFfQVRUUl9JRk5BTUUsCisgICAgTkw4MDIxMV9BVFRSX0lGVFlQRSwKKworICAgIE5MODAyMTFfQVRUUl9NQUMsCisKKyAgICBOTDgwMjExX0FUVFJfS0VZX0RBVEEsCisgICAgTkw4MDIxMV9BVFRSX0tFWV9JRFgsCisgICAgTkw4MDIxMV9BVFRSX0tFWV9DSVBIRVIsCisgICAgTkw4MDIxMV9BVFRSX0tFWV9TRVEsCisgICAgTkw4MDIxMV9BVFRSX0tFWV9ERUZBVUxULAorCisgICAgTkw4MDIxMV9BVFRSX0JFQUNPTl9JTlRFUlZBTCwKKyAgICBOTDgwMjExX0FUVFJfRFRJTV9QRVJJT0QsCisgICAgTkw4MDIxMV9BVFRSX0JFQUNPTl9IRUFELAorICAgIE5MODAyMTFfQVRUUl9CRUFDT05fVEFJTCwKKworICAgIE5MODAyMTFfQVRUUl9TVEFfQUlELAorICAgIE5MODAyMTFfQVRUUl9TVEFfRkxBR1MsCisgICAgTkw4MDIxMV9BVFRSX1NUQV9MSVNURU5fSU5URVJWQUwsCisgICAgTkw4MDIxMV9BVFRSX1NUQV9TVVBQT1JURURfUkFURVMsCisgICAgTkw4MDIxMV9BVFRSX1NUQV9WTEFOLAorICAgIE5MODAyMTFfQVRUUl9TVEFfSU5GTywKKworICAgIE5MODAyMTFfQVRUUl9XSVBIWV9CQU5EUywKKworICAgIE5MODAyMTFfQVRUUl9NTlRSX0ZMQUdTLAorCisgICAgTkw4MDIxMV9BVFRSX01FU0hfSUQsCisgICAgTkw4MDIxMV9BVFRSX1NUQV9QTElOS19BQ1RJT04sCisgICAgTkw4MDIxMV9BVFRSX01QQVRIX05FWFRfSE9QLAorICAgIE5MODAyMTFfQVRUUl9NUEFUSF9JTkZPLAorCisgICAgTkw4MDIxMV9BVFRSX0JTU19DVFNfUFJPVCwKKyAgICBOTDgwMjExX0FUVFJfQlNTX1NIT1JUX1BSRUFNQkxFLAorICAgIE5MODAyMTFfQVRUUl9CU1NfU0hPUlRfU0xPVF9USU1FLAorCisgICAgTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFksCisKKyAgICBOTDgwMjExX0FUVFJfU1VQUE9SVEVEX0lGVFlQRVMsCisKKyAgICBOTDgwMjExX0FUVFJfUkVHX0FMUEhBMiwKKyAgICBOTDgwMjExX0FUVFJfUkVHX1JVTEVTLAorCisgICAgTkw4MDIxMV9BVFRSX01FU0hfUEFSQU1TLAorCisgICAgTkw4MDIxMV9BVFRSX0JTU19CQVNJQ19SQVRFUywKKworICAgIE5MODAyMTFfQVRUUl9XSVBIWV9UWFFfUEFSQU1TLAorICAgIE5MODAyMTFfQVRUUl9XSVBIWV9GUkVRLAorICAgIE5MODAyMTFfQVRUUl9XSVBIWV9DSEFOTkVMX1RZUEUsCisKKyAgICBOTDgwMjExX0FUVFJfS0VZX0RFRkFVTFRfTUdNVCwKKworICAgIE5MODAyMTFfQVRUUl9NR01UX1NVQlRZUEUsCisgICAgTkw4MDIxMV9BVFRSX0lFLAorCisgICAgTkw4MDIxMV9BVFRSX01BWF9OVU1fU0NBTl9TU0lEUywKKworICAgIE5MODAyMTFfQVRUUl9TQ0FOX0ZSRVFVRU5DSUVTLAorICAgIE5MODAyMTFfQVRUUl9TQ0FOX1NTSURTLAorICAgIE5MODAyMTFfQVRUUl9HRU5FUkFUSU9OLCAvKiByZXBsYWNlcyBvbGQgU0NBTl9HRU5FUkFUSU9OICovCisgICAgTkw4MDIxMV9BVFRSX0JTUywKKworICAgIE5MODAyMTFfQVRUUl9SRUdfSU5JVElBVE9SLAorICAgIE5MODAyMTFfQVRUUl9SRUdfVFlQRSwKKworICAgIE5MODAyMTFfQVRUUl9TVVBQT1JURURfQ09NTUFORFMsCisKKyAgICBOTDgwMjExX0FUVFJfRlJBTUUsCisgICAgTkw4MDIxMV9BVFRSX1NTSUQsCisgICAgTkw4MDIxMV9BVFRSX0FVVEhfVFlQRSwKKyAgICBOTDgwMjExX0FUVFJfUkVBU09OX0NPREUsCisKKyAgICBOTDgwMjExX0FUVFJfS0VZX1RZUEUsCisKKyAgICBOTDgwMjExX0FUVFJfTUFYX1NDQU5fSUVfTEVOLAorICAgIE5MODAyMTFfQVRUUl9DSVBIRVJfU1VJVEVTLAorCisgICAgTkw4MDIxMV9BVFRSX0ZSRVFfQkVGT1JFLAorICAgIE5MODAyMTFfQVRUUl9GUkVRX0FGVEVSLAorCisgICAgTkw4MDIxMV9BVFRSX0ZSRVFfRklYRUQsCisKKworICAgIE5MODAyMTFfQVRUUl9XSVBIWV9SRVRSWV9TSE9SVCwKKyAgICBOTDgwMjExX0FUVFJfV0lQSFlfUkVUUllfTE9ORywKKyAgICBOTDgwMjExX0FUVFJfV0lQSFlfRlJBR19USFJFU0hPTEQsCisgICAgTkw4MDIxMV9BVFRSX1dJUEhZX1JUU19USFJFU0hPTEQsCisKKyAgICBOTDgwMjExX0FUVFJfVElNRURfT1VULAorCisgICAgTkw4MDIxMV9BVFRSX1VTRV9NRlAsCisKKyAgICBOTDgwMjExX0FUVFJfU1RBX0ZMQUdTMiwKKworICAgIE5MODAyMTFfQVRUUl9DT05UUk9MX1BPUlQsCisKKyAgICBOTDgwMjExX0FUVFJfVEVTVERBVEEsCisKKyAgICBOTDgwMjExX0FUVFJfUFJJVkFDWSwKKworICAgIE5MODAyMTFfQVRUUl9ESVNDT05ORUNURURfQllfQVAsCisgICAgTkw4MDIxMV9BVFRSX1NUQVRVU19DT0RFLAorCisgICAgTkw4MDIxMV9BVFRSX0NJUEhFUl9TVUlURVNfUEFJUldJU0UsCisgICAgTkw4MDIxMV9BVFRSX0NJUEhFUl9TVUlURV9HUk9VUCwKKyAgICBOTDgwMjExX0FUVFJfV1BBX1ZFUlNJT05TLAorICAgIE5MODAyMTFfQVRUUl9BS01fU1VJVEVTLAorCisgICAgTkw4MDIxMV9BVFRSX1JFUV9JRSwKKyAgICBOTDgwMjExX0FUVFJfUkVTUF9JRSwKKworICAgIE5MODAyMTFfQVRUUl9QUkVWX0JTU0lELAorCisgICAgTkw4MDIxMV9BVFRSX0tFWSwKKyAgICBOTDgwMjExX0FUVFJfS0VZUywKKworICAgIE5MODAyMTFfQVRUUl9QSUQsCisKKyAgICBOTDgwMjExX0FUVFJfNEFERFIsCisKKyAgICBOTDgwMjExX0FUVFJfU1VSVkVZX0lORk8sCisKKyAgICBOTDgwMjExX0FUVFJfUE1LSUQsCisgICAgTkw4MDIxMV9BVFRSX01BWF9OVU1fUE1LSURTLAorCisgICAgTkw4MDIxMV9BVFRSX0RVUkFUSU9OLAorCisgICAgTkw4MDIxMV9BVFRSX0NPT0tJRSwKKworICAgIE5MODAyMTFfQVRUUl9XSVBIWV9DT1ZFUkFHRV9DTEFTUywKKworICAgIE5MODAyMTFfQVRUUl9UWF9SQVRFUywKKworICAgIE5MODAyMTFfQVRUUl9GUkFNRV9NQVRDSCwKKworICAgIE5MODAyMTFfQVRUUl9BQ0ssCisKKyAgICBOTDgwMjExX0FUVFJfUFNfU1RBVEUsCisKKyAgICBOTDgwMjExX0FUVFJfQ1FNLAorCisgICAgTkw4MDIxMV9BVFRSX0xPQ0FMX1NUQVRFX0NIQU5HRSwKKworICAgIE5MODAyMTFfQVRUUl9BUF9JU09MQVRFLAorCisgICAgTkw4MDIxMV9BVFRSX1dJUEhZX1RYX1BPV0VSX1NFVFRJTkcsCisgICAgTkw4MDIxMV9BVFRSX1dJUEhZX1RYX1BPV0VSX0xFVkVMLAorCisgICAgTkw4MDIxMV9BVFRSX1RYX0ZSQU1FX1RZUEVTLAorICAgIE5MODAyMTFfQVRUUl9SWF9GUkFNRV9UWVBFUywKKyAgICBOTDgwMjExX0FUVFJfRlJBTUVfVFlQRSwKKworICAgIE5MODAyMTFfQVRUUl9DT05UUk9MX1BPUlRfRVRIRVJUWVBFLAorICAgIE5MODAyMTFfQVRUUl9DT05UUk9MX1BPUlRfTk9fRU5DUllQVCwKKworICAgIE5MODAyMTFfQVRUUl9TVVBQT1JUX0lCU1NfUlNOLAorCisgICAgLyogYWRkIGF0dHJpYnV0ZXMgaGVyZSwgdXBkYXRlIHRoZSBwb2xpY3kgaW4gbmw4MDIxMS5jICovCisKKyAgICBfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNULAorICAgIE5MODAyMTFfQVRUUl9NQVggPSBfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNUIC0gMQorfTsKKworLyogc291cmNlLWxldmVsIEFQSSBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIE5MODAyMTFfQVRUUl9TQ0FOX0dFTkVSQVRJT04gTkw4MDIxMV9BVFRSX0dFTkVSQVRJT04KKworLyoKKyAqIEFsbG93IHVzZXIgc3BhY2UgcHJvZ3JhbXMgdG8gdXNlICNpZmRlZiBvbiBuZXcgYXR0cmlidXRlcyBieSBkZWZpbmluZyB0aGVtCisgKiBoZXJlCisgKi8KKyNkZWZpbmUgTkw4MDIxMV9DTURfQ09OTkVDVCBOTDgwMjExX0NNRF9DT05ORUNUCisjZGVmaW5lIE5MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZIE5MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZCisjZGVmaW5lIE5MODAyMTFfQVRUUl9CU1NfQkFTSUNfUkFURVMgTkw4MDIxMV9BVFRSX0JTU19CQVNJQ19SQVRFUworI2RlZmluZSBOTDgwMjExX0FUVFJfV0lQSFlfVFhRX1BBUkFNUyBOTDgwMjExX0FUVFJfV0lQSFlfVFhRX1BBUkFNUworI2RlZmluZSBOTDgwMjExX0FUVFJfV0lQSFlfRlJFUSBOTDgwMjExX0FUVFJfV0lQSFlfRlJFUQorI2RlZmluZSBOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFIE5MODAyMTFfQVRUUl9XSVBIWV9DSEFOTkVMX1RZUEUKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX01HTVRfU1VCVFlQRSBOTDgwMjExX0FUVFJfTUdNVF9TVUJUWVBFCisjZGVmaW5lIE5MODAyMTFfQVRUUl9JRSBOTDgwMjExX0FUVFJfSUUKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX1JFR19JTklUSUFUT1IgTkw4MDIxMV9BVFRSX1JFR19JTklUSUFUT1IKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX1JFR19UWVBFIE5MODAyMTFfQVRUUl9SRUdfVFlQRQorI2RlZmluZSBOTDgwMjExX0FUVFJfRlJBTUUgTkw4MDIxMV9BVFRSX0ZSQU1FCisjZGVmaW5lIE5MODAyMTFfQVRUUl9TU0lEIE5MODAyMTFfQVRUUl9TU0lECisjZGVmaW5lIE5MODAyMTFfQVRUUl9BVVRIX1RZUEUgTkw4MDIxMV9BVFRSX0FVVEhfVFlQRQorI2RlZmluZSBOTDgwMjExX0FUVFJfUkVBU09OX0NPREUgTkw4MDIxMV9BVFRSX1JFQVNPTl9DT0RFCisjZGVmaW5lIE5MODAyMTFfQVRUUl9DSVBIRVJfU1VJVEVTX1BBSVJXSVNFIE5MODAyMTFfQVRUUl9DSVBIRVJfU1VJVEVTX1BBSVJXSVNFCisjZGVmaW5lIE5MODAyMTFfQVRUUl9DSVBIRVJfU1VJVEVfR1JPVVAgTkw4MDIxMV9BVFRSX0NJUEhFUl9TVUlURV9HUk9VUAorI2RlZmluZSBOTDgwMjExX0FUVFJfV1BBX1ZFUlNJT05TIE5MODAyMTFfQVRUUl9XUEFfVkVSU0lPTlMKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX0FLTV9TVUlURVMgTkw4MDIxMV9BVFRSX0FLTV9TVUlURVMKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX0tFWSBOTDgwMjExX0FUVFJfS0VZCisjZGVmaW5lIE5MODAyMTFfQVRUUl9LRVlTIE5MODAyMTFfQVRUUl9LRVlTCisKKyNkZWZpbmUgTkw4MDIxMV9NQVhfU1VQUF9SQVRFUyAgICAgICAgICAgIDMyCisjZGVmaW5lIE5MODAyMTFfTUFYX1NVUFBfUkVHX1JVTEVTICAgICAgICAzMgorI2RlZmluZSBOTDgwMjExX1RLSVBfREFUQV9PRkZTRVRfRU5DUl9LRVkgICAgMAorI2RlZmluZSBOTDgwMjExX1RLSVBfREFUQV9PRkZTRVRfVFhfTUlDX0tFWSAgICAxNgorI2RlZmluZSBOTDgwMjExX1RLSVBfREFUQV9PRkZTRVRfUlhfTUlDX0tFWSAgICAyNAorI2RlZmluZSBOTDgwMjExX0hUX0NBUEFCSUxJVFlfTEVOICAgICAgICAyNgorCisjZGVmaW5lIE5MODAyMTFfTUFYX05SX0NJUEhFUl9TVUlURVMgICAgICAgIDUKKyNkZWZpbmUgTkw4MDIxMV9NQVhfTlJfQUtNX1NVSVRFUyAgICAgICAgMgorCisvKioKKyAqIGVudW0gbmw4MDIxMV9pZnR5cGUgLSAodmlydHVhbCkgaW50ZXJmYWNlIHR5cGVzCisgKgorICogQE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOiB1bnNwZWNpZmllZCB0eXBlLCBkcml2ZXIgZGVjaWRlcworICogQE5MODAyMTFfSUZUWVBFX0FESE9DOiBpbmRlcGVuZGVudCBCU1MgbWVtYmVyCisgKiBATkw4MDIxMV9JRlRZUEVfU1RBVElPTjogbWFuYWdlZCBCU1MgbWVtYmVyCisgKiBATkw4MDIxMV9JRlRZUEVfQVA6IGFjY2VzcyBwb2ludAorICogQE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46IFZMQU4gaW50ZXJmYWNlIGZvciBhY2Nlc3MgcG9pbnRzCisgKiBATkw4MDIxMV9JRlRZUEVfV0RTOiB3aXJlbGVzcyBkaXN0cmlidXRpb24gaW50ZXJmYWNlCisgKiBATkw4MDIxMV9JRlRZUEVfTU9OSVRPUjogbW9uaXRvciBpbnRlcmZhY2UgcmVjZWl2aW5nIGFsbCBmcmFtZXMKKyAqIEBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOiBtZXNoIHBvaW50CisgKiBATkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDogUDJQIGNsaWVudAorICogQE5MODAyMTFfSUZUWVBFX1AyUF9HTzogUDJQIGdyb3VwIG93bmVyCisgKiBATkw4MDIxMV9JRlRZUEVfTUFYOiBoaWdoZXN0IGludGVyZmFjZSB0eXBlIG51bWJlciBjdXJyZW50bHkgZGVmaW5lZAorICogQE5VTV9OTDgwMjExX0lGVFlQRVM6IG51bWJlciBvZiBkZWZpbmVkIGludGVyZmFjZSB0eXBlcworICoKKyAqIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB3aXRoIHRoZSAlTkw4MDIxMV9BVFRSX0lGVFlQRQorICogdG8gc2V0IHRoZSB0eXBlIG9mIGFuIGludGVyZmFjZS4KKyAqCisgKi8KK2VudW0gbmw4MDIxMV9pZnR5cGUgeworICAgIE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVELAorICAgIE5MODAyMTFfSUZUWVBFX0FESE9DLAorICAgIE5MODAyMTFfSUZUWVBFX1NUQVRJT04sCisgICAgTkw4MDIxMV9JRlRZUEVfQVAsCisgICAgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTiwKKyAgICBOTDgwMjExX0lGVFlQRV9XRFMsCisgICAgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiwKKyAgICBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5ULAorICAgIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQsCisgICAgTkw4MDIxMV9JRlRZUEVfUDJQX0dPLAorCisgICAgLyoga2VlcCBsYXN0ICovCisgICAgTlVNX05MODAyMTFfSUZUWVBFUywKKyAgICBOTDgwMjExX0lGVFlQRV9NQVggPSBOVU1fTkw4MDIxMV9JRlRZUEVTIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfc3RhX2ZsYWdzIC0gc3RhdGlvbiBmbGFncworICoKKyAqIFN0YXRpb24gZmxhZ3MuIFdoZW4gYSBzdGF0aW9uIGlzIGFkZGVkIHRvIGFuIEFQIGludGVyZmFjZSwgaXQgaXMKKyAqIGFzc3VtZWQgdG8gYmUgYWxyZWFkeSBhc3NvY2lhdGVkIChhbmQgaGVuY2UgYXV0aGVudGljYXRlZC4pCisgKgorICogQF9fTkw4MDIxMV9TVEFfRkxBR19JTlZBTElEOiBhdHRyaWJ1dGUgbnVtYmVyIDAgaXMgcmVzZXJ2ZWQKKyAqIEBOTDgwMjExX1NUQV9GTEFHX0FVVEhPUklaRUQ6IHN0YXRpb24gaXMgYXV0aG9yaXplZCAoODAyLjFYKQorICogQE5MODAyMTFfU1RBX0ZMQUdfU0hPUlRfUFJFQU1CTEU6IHN0YXRpb24gaXMgY2FwYWJsZSBvZiByZWNlaXZpbmcgZnJhbWVzCisgKiAgICB3aXRoIHNob3J0IGJhcmtlciBwcmVhbWJsZQorICogQE5MODAyMTFfU1RBX0ZMQUdfV01FOiBzdGF0aW9uIGlzIFdNRS9Rb1MgY2FwYWJsZQorICogQE5MODAyMTFfU1RBX0ZMQUdfTUZQOiBzdGF0aW9uIHVzZXMgbWFuYWdlbWVudCBmcmFtZSBwcm90ZWN0aW9uCisgKiBATkw4MDIxMV9TVEFfRkxBR19NQVg6IGhpZ2hlc3Qgc3RhdGlvbiBmbGFnIG51bWJlciBjdXJyZW50bHkgZGVmaW5lZAorICogQF9fTkw4MDIxMV9TVEFfRkxBR19BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqLworZW51bSBubDgwMjExX3N0YV9mbGFncyB7CisgICAgX19OTDgwMjExX1NUQV9GTEFHX0lOVkFMSUQsCisgICAgTkw4MDIxMV9TVEFfRkxBR19BVVRIT1JJWkVELAorICAgIE5MODAyMTFfU1RBX0ZMQUdfU0hPUlRfUFJFQU1CTEUsCisgICAgTkw4MDIxMV9TVEFfRkxBR19XTUUsCisgICAgTkw4MDIxMV9TVEFfRkxBR19NRlAsCisKKyAgICAvKiBrZWVwIGxhc3QgKi8KKyAgICBfX05MODAyMTFfU1RBX0ZMQUdfQUZURVJfTEFTVCwKKyAgICBOTDgwMjExX1NUQV9GTEFHX01BWCA9IF9fTkw4MDIxMV9TVEFfRkxBR19BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBzdHJ1Y3Qgbmw4MDIxMV9zdGFfZmxhZ191cGRhdGUgLSBzdGF0aW9uIGZsYWdzIG1hc2svc2V0CisgKiBAbWFzazogbWFzayBvZiBzdGF0aW9uIGZsYWdzIHRvIHNldAorICogQHNldDogd2hpY2ggdmFsdWVzIHRvIHNldCB0aGVtIHRvCisgKgorICogQm90aCBtYXNrIGFuZCBzZXQgY29udGFpbiBiaXRzIGFzIHBlciAmZW51bSBubDgwMjExX3N0YV9mbGFncy4KKyAqLworc3RydWN0IG5sODAyMTFfc3RhX2ZsYWdfdXBkYXRlIHsKKyAgICBfX3UzMiBtYXNrOworICAgIF9fdTMyIHNldDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qKgorICogZW51bSBubDgwMjExX3JhdGVfaW5mbyAtIGJpdHJhdGUgaW5mb3JtYXRpb24KKyAqCisgKiBUaGVzZSBhdHRyaWJ1dGUgdHlwZXMgYXJlIHVzZWQgd2l0aCAlTkw4MDIxMV9TVEFfSU5GT19UWFJBVEUKKyAqIHdoZW4gZ2V0dGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYml0cmF0ZSBvZiBhIHN0YXRpb24uCisgKgorICogQF9fTkw4MDIxMV9SQVRFX0lORk9fSU5WQUxJRDogYXR0cmlidXRlIG51bWJlciAwIGlzIHJlc2VydmVkCisgKiBATkw4MDIxMV9SQVRFX0lORk9fQklUUkFURTogdG90YWwgYml0cmF0ZSAodTE2LCAxMDBrYml0L3MpCisgKiBATkw4MDIxMV9SQVRFX0lORk9fTUNTOiBtY3MgaW5kZXggZm9yIDgwMi4xMW4gKHU4KQorICogQE5MODAyMTFfUkFURV9JTkZPXzQwX01IWl9XSURUSDogNDAgTWh6IGR1YWxjaGFubmVsIGJpdHJhdGUKKyAqIEBOTDgwMjExX1JBVEVfSU5GT19TSE9SVF9HSTogNDAwbnMgZ3VhcmQgaW50ZXJ2YWwKKyAqIEBOTDgwMjExX1JBVEVfSU5GT19NQVg6IGhpZ2hlc3QgcmF0ZV9pbmZvIG51bWJlciBjdXJyZW50bHkgZGVmaW5lZAorICogQF9fTkw4MDIxMV9SQVRFX0lORk9fQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCisgKi8KK2VudW0gbmw4MDIxMV9yYXRlX2luZm8geworICAgIF9fTkw4MDIxMV9SQVRFX0lORk9fSU5WQUxJRCwKKyAgICBOTDgwMjExX1JBVEVfSU5GT19CSVRSQVRFLAorICAgIE5MODAyMTFfUkFURV9JTkZPX01DUywKKyAgICBOTDgwMjExX1JBVEVfSU5GT180MF9NSFpfV0lEVEgsCisgICAgTkw4MDIxMV9SQVRFX0lORk9fU0hPUlRfR0ksCisKKyAgICAvKiBrZWVwIGxhc3QgKi8KKyAgICBfX05MODAyMTFfUkFURV9JTkZPX0FGVEVSX0xBU1QsCisgICAgTkw4MDIxMV9SQVRFX0lORk9fTUFYID0gX19OTDgwMjExX1JBVEVfSU5GT19BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfc3RhX2luZm8gLSBzdGF0aW9uIGluZm9ybWF0aW9uCisgKgorICogVGhlc2UgYXR0cmlidXRlIHR5cGVzIGFyZSB1c2VkIHdpdGggJU5MODAyMTFfQVRUUl9TVEFfSU5GTworICogd2hlbiBnZXR0aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgc3RhdGlvbi4KKyAqCisgKiBAX19OTDgwMjExX1NUQV9JTkZPX0lOVkFMSUQ6IGF0dHJpYnV0ZSBudW1iZXIgMCBpcyByZXNlcnZlZAorICogQE5MODAyMTFfU1RBX0lORk9fSU5BQ1RJVkVfVElNRTogdGltZSBzaW5jZSBsYXN0IGFjdGl2aXR5ICh1MzIsIG1zZWNzKQorICogQE5MODAyMTFfU1RBX0lORk9fUlhfQllURVM6IHRvdGFsIHJlY2VpdmVkIGJ5dGVzICh1MzIsIGZyb20gdGhpcyBzdGF0aW9uKQorICogQE5MODAyMTFfU1RBX0lORk9fVFhfQllURVM6IHRvdGFsIHRyYW5zbWl0dGVkIGJ5dGVzICh1MzIsIHRvIHRoaXMgc3RhdGlvbikKKyAqIEBfX05MODAyMTFfU1RBX0lORk9fQUZURVJfTEFTVDogaW50ZXJuYWwKKyAqIEBOTDgwMjExX1NUQV9JTkZPX01BWDogaGlnaGVzdCBwb3NzaWJsZSBzdGF0aW9uIGluZm8gYXR0cmlidXRlCisgKiBATkw4MDIxMV9TVEFfSU5GT19TSUdOQUw6IHNpZ25hbCBzdHJlbmd0aCBvZiBsYXN0IHJlY2VpdmVkIFBQRFUgKHU4LCBkQm0pCisgKiBATkw4MDIxMV9TVEFfSU5GT19UWF9CSVRSQVRFOiBjdXJyZW50IHVuaWNhc3QgdHggcmF0ZSwgbmVzdGVkIGF0dHJpYnV0ZQorICogICAgIGNvbnRhaW5pbmcgaW5mbyBhcyBwb3NzaWJsZSwgc2VlICZlbnVtIG5sODAyMTFfc3RhX2luZm9fdHhyYXRlLgorICogQE5MODAyMTFfU1RBX0lORk9fUlhfUEFDS0VUUzogdG90YWwgcmVjZWl2ZWQgcGFja2V0ICh1MzIsIGZyb20gdGhpcyBzdGF0aW9uKQorICogQE5MODAyMTFfU1RBX0lORk9fVFhfUEFDS0VUUzogdG90YWwgdHJhbnNtaXR0ZWQgcGFja2V0cyAodTMyLCB0byB0aGlzCisgKiAgICBzdGF0aW9uKQorICogQE5MODAyMTFfU1RBX0lORk9fVFhfUkVUUklFUzogdG90YWwgcmV0cmllcyAodTMyLCB0byB0aGlzIHN0YXRpb24pCisgKiBATkw4MDIxMV9TVEFfSU5GT19UWF9GQUlMRUQ6IHRvdGFsIGZhaWxlZCBwYWNrZXRzICh1MzIsIHRvIHRoaXMgc3RhdGlvbikKKyAqLworZW51bSBubDgwMjExX3N0YV9pbmZvIHsKKyAgICBfX05MODAyMTFfU1RBX0lORk9fSU5WQUxJRCwKKyAgICBOTDgwMjExX1NUQV9JTkZPX0lOQUNUSVZFX1RJTUUsCisgICAgTkw4MDIxMV9TVEFfSU5GT19SWF9CWVRFUywKKyAgICBOTDgwMjExX1NUQV9JTkZPX1RYX0JZVEVTLAorICAgIE5MODAyMTFfU1RBX0lORk9fTExJRCwKKyAgICBOTDgwMjExX1NUQV9JTkZPX1BMSUQsCisgICAgTkw4MDIxMV9TVEFfSU5GT19QTElOS19TVEFURSwKKyAgICBOTDgwMjExX1NUQV9JTkZPX1NJR05BTCwKKyAgICBOTDgwMjExX1NUQV9JTkZPX1RYX0JJVFJBVEUsCisgICAgTkw4MDIxMV9TVEFfSU5GT19SWF9QQUNLRVRTLAorICAgIE5MODAyMTFfU1RBX0lORk9fVFhfUEFDS0VUUywKKyAgICBOTDgwMjExX1NUQV9JTkZPX1RYX1JFVFJJRVMsCisgICAgTkw4MDIxMV9TVEFfSU5GT19UWF9GQUlMRUQsCisKKyAgICAvKiBrZWVwIGxhc3QgKi8KKyAgICBfX05MODAyMTFfU1RBX0lORk9fQUZURVJfTEFTVCwKKyAgICBOTDgwMjExX1NUQV9JTkZPX01BWCA9IF9fTkw4MDIxMV9TVEFfSU5GT19BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfbXBhdGhfZmxhZ3MgLSBubDgwMjExIG1lc2ggcGF0aCBmbGFncworICoKKyAqIEBOTDgwMjExX01QQVRIX0ZMQUdfQUNUSVZFOiB0aGUgbWVzaCBwYXRoIGlzIGFjdGl2ZQorICogQE5MODAyMTFfTVBBVEhfRkxBR19SRVNPTFZJTkc6IHRoZSBtZXNoIHBhdGggZGlzY292ZXJ5IHByb2Nlc3MgaXMgcnVubmluZworICogQE5MODAyMTFfTVBBVEhfRkxBR19TTl9WQUxJRDogdGhlIG1lc2ggcGF0aCBjb250YWlucyBhIHZhbGlkIFNOCisgKiBATkw4MDIxMV9NUEFUSF9GTEFHX0ZJWEVEOiB0aGUgbWVzaCBwYXRoIGhhcyBiZWVuIG1hbnVhbGx5IHNldAorICogQE5MODAyMTFfTVBBVEhfRkxBR19SRVNPTFZFRDogdGhlIG1lc2ggcGF0aCBkaXNjb3ZlcnkgcHJvY2VzcyBzdWNjZWVkZWQKKyAqLworZW51bSBubDgwMjExX21wYXRoX2ZsYWdzIHsKKyAgICBOTDgwMjExX01QQVRIX0ZMQUdfQUNUSVZFID0gICAgMTw8MCwKKyAgICBOTDgwMjExX01QQVRIX0ZMQUdfUkVTT0xWSU5HID0gICAgMTw8MSwKKyAgICBOTDgwMjExX01QQVRIX0ZMQUdfU05fVkFMSUQgPSAgICAxPDwyLAorICAgIE5MODAyMTFfTVBBVEhfRkxBR19GSVhFRCA9ICAgIDE8PDMsCisgICAgTkw4MDIxMV9NUEFUSF9GTEFHX1JFU09MVkVEID0gICAgMTw8NCwKK307CisKKy8qKgorICogZW51bSBubDgwMjExX21wYXRoX2luZm8gLSBtZXNoIHBhdGggaW5mb3JtYXRpb24KKyAqCisgKiBUaGVzZSBhdHRyaWJ1dGUgdHlwZXMgYXJlIHVzZWQgd2l0aCAlTkw4MDIxMV9BVFRSX01QQVRIX0lORk8gd2hlbiBnZXR0aW5nCisgKiBpbmZvcm1hdGlvbiBhYm91dCBhIG1lc2ggcGF0aC4KKyAqCisgKiBAX19OTDgwMjExX01QQVRIX0lORk9fSU5WQUxJRDogYXR0cmlidXRlIG51bWJlciAwIGlzIHJlc2VydmVkCisgKiBATkw4MDIxMV9NUEFUSF9JTkZPX0ZSQU1FX1FMRU46IG51bWJlciBvZiBxdWV1ZWQgZnJhbWVzIGZvciB0aGlzIGRlc3RpbmF0aW9uCisgKiBATkw4MDIxMV9NUEFUSF9JTkZPX1NOOiBkZXN0aW5hdGlvbiBzZXF1ZW5jZSBudW1iZXIKKyAqIEBOTDgwMjExX01QQVRIX0lORk9fTUVUUklDOiBtZXRyaWMgKGNvc3QpIG9mIHRoaXMgbWVzaCBwYXRoCisgKiBATkw4MDIxMV9NUEFUSF9JTkZPX0VYUFRJTUU6IGV4cGlyYXRpb24gdGltZSBmb3IgdGhlIHBhdGgsIGluIG1zZWMgZnJvbSBub3cKKyAqIEBOTDgwMjExX01QQVRIX0lORk9fRkxBR1M6IG1lc2ggcGF0aCBmbGFncywgZW51bWVyYXRlZCBpbgorICogICAgICZlbnVtIG5sODAyMTFfbXBhdGhfZmxhZ3M7CisgKiBATkw4MDIxMV9NUEFUSF9JTkZPX0RJU0NPVkVSWV9USU1FT1VUOiB0b3RhbCBwYXRoIGRpc2NvdmVyeSB0aW1lb3V0LCBpbiBtc2VjCisgKiBATkw4MDIxMV9NUEFUSF9JTkZPX0RJU0NPVkVSWV9SRVRSSUVTOiBtZXNoIHBhdGggZGlzY292ZXJ5IHJldHJpZXMKKyAqIEBOTDgwMjExX01QQVRIX0lORk9fTUFYOiBoaWdoZXN0IG1lc2ggcGF0aCBpbmZvcm1hdGlvbiBhdHRyaWJ1dGUgbnVtYmVyCisgKiAgICBjdXJyZW50bHkgZGVmaW5kCisgKiBAX19OTDgwMjExX01QQVRIX0lORk9fQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCisgKi8KK2VudW0gbmw4MDIxMV9tcGF0aF9pbmZvIHsKKyAgICBfX05MODAyMTFfTVBBVEhfSU5GT19JTlZBTElELAorICAgIE5MODAyMTFfTVBBVEhfSU5GT19GUkFNRV9RTEVOLAorICAgIE5MODAyMTFfTVBBVEhfSU5GT19TTiwKKyAgICBOTDgwMjExX01QQVRIX0lORk9fTUVUUklDLAorICAgIE5MODAyMTFfTVBBVEhfSU5GT19FWFBUSU1FLAorICAgIE5MODAyMTFfTVBBVEhfSU5GT19GTEFHUywKKyAgICBOTDgwMjExX01QQVRIX0lORk9fRElTQ09WRVJZX1RJTUVPVVQsCisgICAgTkw4MDIxMV9NUEFUSF9JTkZPX0RJU0NPVkVSWV9SRVRSSUVTLAorCisgICAgLyoga2VlcCBsYXN0ICovCisgICAgX19OTDgwMjExX01QQVRIX0lORk9fQUZURVJfTEFTVCwKKyAgICBOTDgwMjExX01QQVRIX0lORk9fTUFYID0gX19OTDgwMjExX01QQVRIX0lORk9fQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX2JhbmRfYXR0ciAtIGJhbmQgYXR0cmlidXRlcworICogQF9fTkw4MDIxMV9CQU5EX0FUVFJfSU5WQUxJRDogYXR0cmlidXRlIG51bWJlciAwIGlzIHJlc2VydmVkCisgKiBATkw4MDIxMV9CQU5EX0FUVFJfRlJFUVM6IHN1cHBvcnRlZCBmcmVxdWVuY2llcyBpbiB0aGlzIGJhbmQsCisgKiAgICBhbiBhcnJheSBvZiBuZXN0ZWQgZnJlcXVlbmN5IGF0dHJpYnV0ZXMKKyAqIEBOTDgwMjExX0JBTkRfQVRUUl9SQVRFUzogc3VwcG9ydGVkIGJpdHJhdGVzIGluIHRoaXMgYmFuZCwKKyAqICAgIGFuIGFycmF5IG9mIG5lc3RlZCBiaXRyYXRlIGF0dHJpYnV0ZXMKKyAqIEBOTDgwMjExX0JBTkRfQVRUUl9IVF9NQ1NfU0VUOiAxNi1ieXRlIGF0dHJpYnV0ZSBjb250YWluaW5nIHRoZSBNQ1Mgc2V0IGFzCisgKiAgICBkZWZpbmVkIGluIDgwMi4xMW4KKyAqIEBOTDgwMjExX0JBTkRfQVRUUl9IVF9DQVBBOiBIVCBjYXBhYmlsaXRpZXMsIGFzIGluIHRoZSBIVCBpbmZvcm1hdGlvbiBJRQorICogQE5MODAyMTFfQkFORF9BVFRSX0hUX0FNUERVX0ZBQ1RPUjogQS1NUERVIGZhY3RvciwgYXMgaW4gMTFuCisgKiBATkw4MDIxMV9CQU5EX0FUVFJfSFRfQU1QRFVfREVOU0lUWTogQS1NUERVIGRlbnNpdHksIGFzIGluIDExbgorICogQE5MODAyMTFfQkFORF9BVFRSX01BWDogaGlnaGVzdCBiYW5kIGF0dHJpYnV0ZSBjdXJyZW50bHkgZGVmaW5lZAorICogQF9fTkw4MDIxMV9CQU5EX0FUVFJfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCisgKi8KK2VudW0gbmw4MDIxMV9iYW5kX2F0dHIgeworICAgIF9fTkw4MDIxMV9CQU5EX0FUVFJfSU5WQUxJRCwKKyAgICBOTDgwMjExX0JBTkRfQVRUUl9GUkVRUywKKyAgICBOTDgwMjExX0JBTkRfQVRUUl9SQVRFUywKKworICAgIE5MODAyMTFfQkFORF9BVFRSX0hUX01DU19TRVQsCisgICAgTkw4MDIxMV9CQU5EX0FUVFJfSFRfQ0FQQSwKKyAgICBOTDgwMjExX0JBTkRfQVRUUl9IVF9BTVBEVV9GQUNUT1IsCisgICAgTkw4MDIxMV9CQU5EX0FUVFJfSFRfQU1QRFVfREVOU0lUWSwKKworICAgIC8qIGtlZXAgbGFzdCAqLworICAgIF9fTkw4MDIxMV9CQU5EX0FUVFJfQUZURVJfTEFTVCwKKyAgICBOTDgwMjExX0JBTkRfQVRUUl9NQVggPSBfX05MODAyMTFfQkFORF9BVFRSX0FGVEVSX0xBU1QgLSAxCit9OworCisjZGVmaW5lIE5MODAyMTFfQkFORF9BVFRSX0hUX0NBUEEgTkw4MDIxMV9CQU5EX0FUVFJfSFRfQ0FQQQorCisvKioKKyAqIGVudW0gbmw4MDIxMV9mcmVxdWVuY3lfYXR0ciAtIGZyZXF1ZW5jeSBhdHRyaWJ1dGVzCisgKiBAX19OTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0lOVkFMSUQ6IGF0dHJpYnV0ZSBudW1iZXIgMCBpcyByZXNlcnZlZAorICogQE5MODAyMTFfRlJFUVVFTkNZX0FUVFJfRlJFUTogRnJlcXVlbmN5IGluIE1IegorICogQE5MODAyMTFfRlJFUVVFTkNZX0FUVFJfRElTQUJMRUQ6IENoYW5uZWwgaXMgZGlzYWJsZWQgaW4gY3VycmVudAorICogICAgcmVndWxhdG9yeSBkb21haW4uCisgKiBATkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9QQVNTSVZFX1NDQU46IE9ubHkgcGFzc2l2ZSBzY2FubmluZyBpcworICogICAgcGVybWl0dGVkIG9uIHRoaXMgY2hhbm5lbCBpbiBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluLgorICogQE5MODAyMTFfRlJFUVVFTkNZX0FUVFJfTk9fSUJTUzogSUJTUyBuZXR3b3JrcyBhcmUgbm90IHBlcm1pdHRlZAorICogICAgb24gdGhpcyBjaGFubmVsIGluIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uCisgKiBATkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9SQURBUjogUmFkYXIgZGV0ZWN0aW9uIGlzIG1hbmRhdG9yeQorICogICAgb24gdGhpcyBjaGFubmVsIGluIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uCisgKiBATkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9NQVhfVFhfUE9XRVI6IE1heGltdW0gdHJhbnNtaXNzaW9uIHBvd2VyIGluIG1CbQorICogICAgKDEwMCAqIGRCbSkuCisgKiBATkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9NQVg6IGhpZ2hlc3QgZnJlcXVlbmN5IGF0dHJpYnV0ZSBudW1iZXIKKyAqICAgIGN1cnJlbnRseSBkZWZpbmVkCisgKiBAX19OTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQorICovCitlbnVtIG5sODAyMTFfZnJlcXVlbmN5X2F0dHIgeworICAgIF9fTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9JTlZBTElELAorICAgIE5MODAyMTFfRlJFUVVFTkNZX0FUVFJfRlJFUSwKKyAgICBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0RJU0FCTEVELAorICAgIE5MODAyMTFfRlJFUVVFTkNZX0FUVFJfUEFTU0lWRV9TQ0FOLAorICAgIE5MODAyMTFfRlJFUVVFTkNZX0FUVFJfTk9fSUJTUywKKyAgICBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX1JBREFSLAorICAgIE5MODAyMTFfRlJFUVVFTkNZX0FUVFJfTUFYX1RYX1BPV0VSLAorCisgICAgLyoga2VlcCBsYXN0ICovCisgICAgX19OTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0FGVEVSX0xBU1QsCisgICAgTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9NQVggPSBfX05MODAyMTFfRlJFUVVFTkNZX0FUVFJfQUZURVJfTEFTVCAtIDEKK307CisKKyNkZWZpbmUgTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9NQVhfVFhfUE9XRVIgTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9NQVhfVFhfUE9XRVIKKworLyoqCisgKiBlbnVtIG5sODAyMTFfYml0cmF0ZV9hdHRyIC0gYml0cmF0ZSBhdHRyaWJ1dGVzCisgKiBAX19OTDgwMjExX0JJVFJBVEVfQVRUUl9JTlZBTElEOiBhdHRyaWJ1dGUgbnVtYmVyIDAgaXMgcmVzZXJ2ZWQKKyAqIEBOTDgwMjExX0JJVFJBVEVfQVRUUl9SQVRFOiBCaXRyYXRlIGluIHVuaXRzIG9mIDEwMCBrYnBzCisgKiBATkw4MDIxMV9CSVRSQVRFX0FUVFJfMkdIWl9TSE9SVFBSRUFNQkxFOiBTaG9ydCBwcmVhbWJsZSBzdXBwb3J0ZWQKKyAqICAgIGluIDIuNCBHSHogYmFuZC4KKyAqIEBOTDgwMjExX0JJVFJBVEVfQVRUUl9NQVg6IGhpZ2hlc3QgYml0cmF0ZSBhdHRyaWJ1dGUgbnVtYmVyCisgKiAgICBjdXJyZW50bHkgZGVmaW5lZAorICogQF9fTkw4MDIxMV9CSVRSQVRFX0FUVFJfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCisgKi8KK2VudW0gbmw4MDIxMV9iaXRyYXRlX2F0dHIgeworICAgIF9fTkw4MDIxMV9CSVRSQVRFX0FUVFJfSU5WQUxJRCwKKyAgICBOTDgwMjExX0JJVFJBVEVfQVRUUl9SQVRFLAorICAgIE5MODAyMTFfQklUUkFURV9BVFRSXzJHSFpfU0hPUlRQUkVBTUJMRSwKKworICAgIC8qIGtlZXAgbGFzdCAqLworICAgIF9fTkw4MDIxMV9CSVRSQVRFX0FUVFJfQUZURVJfTEFTVCwKKyAgICBOTDgwMjExX0JJVFJBVEVfQVRUUl9NQVggPSBfX05MODAyMTFfQklUUkFURV9BVFRSX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9pbml0aWF0b3IgLSBJbmRpY2F0ZXMgdGhlIGluaXRpYXRvciBvZiBhIHJlZyBkb21haW4gcmVxdWVzdAorICogQE5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1JFOiBDb3JlIHF1ZXJpZWQgQ1JEQSBmb3IgYSBkeW5hbWljIHdvcmxkCisgKiAgICAgcmVndWxhdG9yeSBkb21haW4uCisgKiBATkw4MDIxMV9SRUdET01fU0VUX0JZX1VTRVI6IFVzZXIgYXNrZWQgdGhlIHdpcmVsZXNzIGNvcmUgdG8gc2V0IHRoZQorICogICAgIHJlZ3VsYXRvcnkgZG9tYWluLgorICogQE5MODAyMTFfUkVHRE9NX1NFVF9CWV9EUklWRVI6IGEgd2lyZWxlc3MgZHJpdmVycyBoYXMgaGludGVkIHRvIHRoZQorICogICAgIHdpcmVsZXNzIGNvcmUgaXQgdGhpbmtzIGl0cyBrbm93cyB0aGUgcmVndWxhdG9yeSBkb21haW4gd2Ugc2hvdWxkIGJlIGluLgorICogQE5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1VOVFJZX0lFOiB0aGUgd2lyZWxlc3MgY29yZSBoYXMgcmVjZWl2ZWQgYW4KKyAqICAgICA4MDIuMTEgY291bnRyeSBpbmZvcm1hdGlvbiBlbGVtZW50IHdpdGggcmVndWxhdG9yeSBpbmZvcm1hdGlvbiBpdAorICogICAgIHRoaW5rcyB3ZSBzaG91bGQgY29uc2lkZXIuCisgKi8KK2VudW0gbmw4MDIxMV9yZWdfaW5pdGlhdG9yIHsKKyAgICBOTDgwMjExX1JFR0RPTV9TRVRfQllfQ09SRSwKKyAgICBOTDgwMjExX1JFR0RPTV9TRVRfQllfVVNFUiwKKyAgICBOTDgwMjExX1JFR0RPTV9TRVRfQllfRFJJVkVSLAorICAgIE5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1VOVFJZX0lFLAorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfcmVnX3R5cGUgLSBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgcmVndWxhdG9yeSBkb21haW4KKyAqIEBOTDgwMjExX1JFR0RPTV9UWVBFX0NPVU5UUlk6IHRoZSByZWd1bGF0b3J5IGRvbWFpbiBzZXQgaXMgb25lIHRoYXQgcGVydGFpbnMKKyAqICAgIHRvIGEgc3BlY2lmaWMgY291bnRyeS4gV2hlbiB0aGlzIGlzIHNldCB5b3UgY2FuIGNvdW50IG9uIHRoZQorICogICAgSVNPIC8gSUVDIDMxNjYgYWxwaGEyIGNvdW50cnkgY29kZSBiZWluZyB2YWxpZC4KKyAqIEBOTDgwMjExX1JFR0RPTV9UWVBFX1dPUkxEOiB0aGUgcmVndWxhdG9yeSBzZXQgZG9tYWluIGlzIHRoZSB3b3JsZCByZWd1bGF0b3J5CisgKiAgICAgZG9tYWluLgorICogQE5MODAyMTFfUkVHRE9NX1RZUEVfQ1VTVE9NX1dPUkxEOiB0aGUgcmVndWxhdG9yeSBkb21haW4gc2V0IGlzIGEgY3VzdG9tCisgKiAgICAgZHJpdmVyIHNwZWNpZmljIHdvcmxkIHJlZ3VsYXRvcnkgZG9tYWluLiBUaGVzZSBkbyBub3QgYXBwbHkgc3lzdGVtLXdpZGUKKyAqICAgICBhbmQgYXJlIG9ubHkgYXBwbGljYWJsZSB0byB0aGUgaW5kaXZpZHVhbCBkZXZpY2VzIHdoaWNoIGhhdmUgcmVxdWVzdGVkCisgKiAgICAgdGhlbSB0byBiZSBhcHBsaWVkLgorICogQE5MODAyMTFfUkVHRE9NX1RZUEVfSU5URVJTRUNUSU9OOiB0aGUgcmVndWxhdG9yeSBkb21haW4gc2V0IGlzIHRoZSBwcm9kdWN0CisgKiAgICBvZiBhbiBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0d28gcmVndWxhdG9yeSBkb21haW5zIC0tIHRoZSBwcmV2aW91c2x5CisgKiAgICBzZXQgcmVndWxhdG9yeSBkb21haW4gb24gdGhlIHN5c3RlbSBhbmQgdGhlIGxhc3QgYWNjZXB0ZWQgcmVndWxhdG9yeQorICogICAgZG9tYWluIHJlcXVlc3QgdG8gYmUgcHJvY2Vzc2VkLgorICovCitlbnVtIG5sODAyMTFfcmVnX3R5cGUgeworICAgIE5MODAyMTFfUkVHRE9NX1RZUEVfQ09VTlRSWSwKKyAgICBOTDgwMjExX1JFR0RPTV9UWVBFX1dPUkxELAorICAgIE5MODAyMTFfUkVHRE9NX1RZUEVfQ1VTVE9NX1dPUkxELAorICAgIE5MODAyMTFfUkVHRE9NX1RZUEVfSU5URVJTRUNUSU9OLAorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfcmVnX3J1bGVfYXR0ciAtIHJlZ3VsYXRvcnkgcnVsZSBhdHRyaWJ1dGVzCisgKiBAX19OTDgwMjExX1JFR19SVUxFX0FUVFJfSU5WQUxJRDogYXR0cmlidXRlIG51bWJlciAwIGlzIHJlc2VydmVkCisgKiBATkw4MDIxMV9BVFRSX1JFR19SVUxFX0ZMQUdTOiBhIHNldCBvZiBmbGFncyB3aGljaCBzcGVjaWZ5IGFkZGl0aW9uYWwKKyAqICAgICBjb25zaWRlcmF0aW9ucyBmb3IgYSBnaXZlbiBmcmVxdWVuY3kgcmFuZ2UuIFRoZXNlIGFyZSB0aGUKKyAqICAgICAmZW51bSBubDgwMjExX3JlZ19ydWxlX2ZsYWdzLgorICogQE5MODAyMTFfQVRUUl9GUkVRX1JBTkdFX1NUQVJUOiBzdGFydGluZyBmcmVxdWVuY3J5IGZvciB0aGUgcmVndWxhdG9yeQorICogICAgIHJ1bGUgaW4gS0h6LiBUaGlzIGlzIG5vdCBhIGNlbnRlciBvZiBmcmVxdWVuY3kgYnV0IGFuIGFjdHVhbCByZWd1bGF0b3J5CisgKiAgICAgYmFuZCBlZGdlLgorICogQE5MODAyMTFfQVRUUl9GUkVRX1JBTkdFX0VORDogZW5kaW5nIGZyZXF1ZW5jeSBmb3IgdGhlIHJlZ3VsYXRvcnkgcnVsZQorICogICAgIGluIEtIei4gVGhpcyBpcyBub3QgYSBjZW50ZXIgYSBmcmVxdWVuY3kgYnV0IGFuIGFjdHVhbCByZWd1bGF0b3J5CisgKiAgICAgYmFuZCBlZGdlLgorICogQE5MODAyMTFfQVRUUl9GUkVRX1JBTkdFX01BWF9CVzogbWF4aW11bSBhbGxvd2VkIGJhbmR3aWR0aCBmb3IgdGhpcworICogICAgIGZyZXF1ZW5jeSByYW5nZSwgaW4gS0h6LgorICogQE5MODAyMTFfQVRUUl9QT1dFUl9SVUxFX01BWF9BTlRfR0FJTjogdGhlIG1heGltdW0gYWxsb3dlZCBhbnRlbm5hIGdhaW4KKyAqICAgICBmb3IgYSBnaXZlbiBmcmVxdWVuY3kgcmFuZ2UuIFRoZSB2YWx1ZSBpcyBpbiBtQmkgKDEwMCAqIGRCaSkuCisgKiAgICAgSWYgeW91IGRvbid0IGhhdmUgb25lIHRoZW4gZG9uJ3Qgc2VuZCB0aGlzLgorICogQE5MODAyMTFfQVRUUl9QT1dFUl9SVUxFX01BWF9FSVJQOiB0aGUgbWF4aW11bSBhbGxvd2VkIEVJUlAgZm9yCisgKiAgICAgYSBnaXZlbiBmcmVxdWVuY3kgcmFuZ2UuIFRoZSB2YWx1ZSBpcyBpbiBtQm0gKDEwMCAqIGRCbSkuCisgKiBATkw4MDIxMV9SRUdfUlVMRV9BVFRSX01BWDogaGlnaGVzdCByZWd1bGF0b3J5IHJ1bGUgYXR0cmlidXRlIG51bWJlcgorICogICAgY3VycmVudGx5IGRlZmluZWQKKyAqIEBfX05MODAyMTFfUkVHX1JVTEVfQVRUUl9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqLworZW51bSBubDgwMjExX3JlZ19ydWxlX2F0dHIgeworICAgIF9fTkw4MDIxMV9SRUdfUlVMRV9BVFRSX0lOVkFMSUQsCisgICAgTkw4MDIxMV9BVFRSX1JFR19SVUxFX0ZMQUdTLAorCisgICAgTkw4MDIxMV9BVFRSX0ZSRVFfUkFOR0VfU1RBUlQsCisgICAgTkw4MDIxMV9BVFRSX0ZSRVFfUkFOR0VfRU5ELAorICAgIE5MODAyMTFfQVRUUl9GUkVRX1JBTkdFX01BWF9CVywKKworICAgIE5MODAyMTFfQVRUUl9QT1dFUl9SVUxFX01BWF9BTlRfR0FJTiwKKyAgICBOTDgwMjExX0FUVFJfUE9XRVJfUlVMRV9NQVhfRUlSUCwKKworICAgIC8qIGtlZXAgbGFzdCAqLworICAgIF9fTkw4MDIxMV9SRUdfUlVMRV9BVFRSX0FGVEVSX0xBU1QsCisgICAgTkw4MDIxMV9SRUdfUlVMRV9BVFRSX01BWCA9IF9fTkw4MDIxMV9SRUdfUlVMRV9BVFRSX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9yZWdfcnVsZV9mbGFncyAtIHJlZ3VsYXRvcnkgcnVsZSBmbGFncworICoKKyAqIEBOTDgwMjExX1JSRl9OT19PRkRNOiBPRkRNIG1vZHVsYXRpb24gbm90IGFsbG93ZWQKKyAqIEBOTDgwMjExX1JSRl9OT19DQ0s6IENDSyBtb2R1bGF0aW9uIG5vdCBhbGxvd2VkCisgKiBATkw4MDIxMV9SUkZfTk9fSU5ET09SOiBpbmRvb3Igb3BlcmF0aW9uIG5vdCBhbGxvd2VkCisgKiBATkw4MDIxMV9SUkZfTk9fT1VURE9PUjogb3V0ZG9vciBvcGVyYXRpb24gbm90IGFsbG93ZWQKKyAqIEBOTDgwMjExX1JSRl9ERlM6IERGUyBzdXBwb3J0IGlzIHJlcXVpcmVkIHRvIGJlIHVzZWQKKyAqIEBOTDgwMjExX1JSRl9QVFBfT05MWTogdGhpcyBpcyBvbmx5IGZvciBQb2ludCBUbyBQb2ludCBsaW5rcworICogQE5MODAyMTFfUlJGX1BUTVBfT05MWTogdGhpcyBpcyBvbmx5IGZvciBQb2ludCBUbyBNdWx0aSBQb2ludCBsaW5rcworICogQE5MODAyMTFfUlJGX1BBU1NJVkVfU0NBTjogcGFzc2l2ZSBzY2FuIGlzIHJlcXVpcmVkCisgKiBATkw4MDIxMV9SUkZfTk9fSUJTUzogbm8gSUJTUyBpcyBhbGxvd2VkCisgKi8KK2VudW0gbmw4MDIxMV9yZWdfcnVsZV9mbGFncyB7CisgICAgTkw4MDIxMV9SUkZfTk9fT0ZETSAgICAgICAgPSAxPDwwLAorICAgIE5MODAyMTFfUlJGX05PX0NDSyAgICAgICAgPSAxPDwxLAorICAgIE5MODAyMTFfUlJGX05PX0lORE9PUiAgICAgICAgPSAxPDwyLAorICAgIE5MODAyMTFfUlJGX05PX09VVERPT1IgICAgICAgID0gMTw8MywKKyAgICBOTDgwMjExX1JSRl9ERlMgICAgICAgICAgICA9IDE8PDQsCisgICAgTkw4MDIxMV9SUkZfUFRQX09OTFkgICAgICAgID0gMTw8NSwKKyAgICBOTDgwMjExX1JSRl9QVE1QX09OTFkgICAgICAgID0gMTw8NiwKKyAgICBOTDgwMjExX1JSRl9QQVNTSVZFX1NDQU4gICAgPSAxPDw3LAorICAgIE5MODAyMTFfUlJGX05PX0lCU1MgICAgICAgID0gMTw8OCwKK307CisKKy8qKgorICogZW51bSBubDgwMjExX3N1cnZleV9pbmZvIC0gc3VydmV5IGluZm9ybWF0aW9uCisgKgorICogVGhlc2UgYXR0cmlidXRlIHR5cGVzIGFyZSB1c2VkIHdpdGggJU5MODAyMTFfQVRUUl9TVVJWRVlfSU5GTworICogd2hlbiBnZXR0aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgc3VydmV5LgorICoKKyAqIEBfX05MODAyMTFfU1VSVkVZX0lORk9fSU5WQUxJRDogYXR0cmlidXRlIG51bWJlciAwIGlzIHJlc2VydmVkCisgKiBATkw4MDIxMV9TVVJWRVlfSU5GT19GUkVRVUVOQ1k6IGNlbnRlciBmcmVxdWVuY3kgb2YgY2hhbm5lbAorICogQE5MODAyMTFfU1VSVkVZX0lORk9fTk9JU0U6IG5vaXNlIGxldmVsIG9mIGNoYW5uZWwgKHU4LCBkQm0pCisgKiBATkw4MDIxMV9TVVJWRVlfSU5GT19JTl9VU0U6IGNoYW5uZWwgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQKKyAqIEBOTDgwMjExX1NVUlZFWV9JTkZPX01BWDogaGlnaGVzdCBzdXJ2ZXkgaW5mbyBhdHRyaWJ1dGUgbnVtYmVyCisgKiAgICBjdXJyZW50bHkgZGVmaW5lZAorICogQF9fTkw4MDIxMV9TVVJWRVlfSU5GT19BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqLworZW51bSBubDgwMjExX3N1cnZleV9pbmZvIHsKKyAgICBfX05MODAyMTFfU1VSVkVZX0lORk9fSU5WQUxJRCwKKyAgICBOTDgwMjExX1NVUlZFWV9JTkZPX0ZSRVFVRU5DWSwKKyAgICBOTDgwMjExX1NVUlZFWV9JTkZPX05PSVNFLAorICAgIE5MODAyMTFfU1VSVkVZX0lORk9fSU5fVVNFLAorCisgICAgLyoga2VlcCBsYXN0ICovCisgICAgX19OTDgwMjExX1NVUlZFWV9JTkZPX0FGVEVSX0xBU1QsCisgICAgTkw4MDIxMV9TVVJWRVlfSU5GT19NQVggPSBfX05MODAyMTFfU1VSVkVZX0lORk9fQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX21udHJfZmxhZ3MgLSBtb25pdG9yIGNvbmZpZ3VyYXRpb24gZmxhZ3MKKyAqCisgKiBNb25pdG9yIGNvbmZpZ3VyYXRpb24gZmxhZ3MuCisgKgorICogQF9fTkw4MDIxMV9NTlRSX0ZMQUdfSU5WQUxJRDogcmVzZXJ2ZWQKKyAqCisgKiBATkw4MDIxMV9NTlRSX0ZMQUdfRkNTRkFJTDogcGFzcyBmcmFtZXMgd2l0aCBiYWQgRkNTCisgKiBATkw4MDIxMV9NTlRSX0ZMQUdfUExDUEZBSUw6IHBhc3MgZnJhbWVzIHdpdGggYmFkIFBMQ1AKKyAqIEBOTDgwMjExX01OVFJfRkxBR19DT05UUk9MOiBwYXNzIGNvbnRyb2wgZnJhbWVzCisgKiBATkw4MDIxMV9NTlRSX0ZMQUdfT1RIRVJfQlNTOiBkaXNhYmxlIEJTU0lEIGZpbHRlcmluZworICogQE5MODAyMTFfTU5UUl9GTEFHX0NPT0tfRlJBTUVTOiByZXBvcnQgZnJhbWVzIGFmdGVyIHByb2Nlc3NpbmcuCisgKiAgICBvdmVycmlkZXMgYWxsIG90aGVyIGZsYWdzLgorICoKKyAqIEBfX05MODAyMTFfTU5UUl9GTEFHX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQorICogQE5MODAyMTFfTU5UUl9GTEFHX01BWDogaGlnaGVzdCBwb3NzaWJsZSBtb25pdG9yIGZsYWcKKyAqLworZW51bSBubDgwMjExX21udHJfZmxhZ3MgeworICAgIF9fTkw4MDIxMV9NTlRSX0ZMQUdfSU5WQUxJRCwKKyAgICBOTDgwMjExX01OVFJfRkxBR19GQ1NGQUlMLAorICAgIE5MODAyMTFfTU5UUl9GTEFHX1BMQ1BGQUlMLAorICAgIE5MODAyMTFfTU5UUl9GTEFHX0NPTlRST0wsCisgICAgTkw4MDIxMV9NTlRSX0ZMQUdfT1RIRVJfQlNTLAorICAgIE5MODAyMTFfTU5UUl9GTEFHX0NPT0tfRlJBTUVTLAorCisgICAgLyoga2VlcCBsYXN0ICovCisgICAgX19OTDgwMjExX01OVFJfRkxBR19BRlRFUl9MQVNULAorICAgIE5MODAyMTFfTU5UUl9GTEFHX01BWCA9IF9fTkw4MDIxMV9NTlRSX0ZMQUdfQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX21lc2hjb25mX3BhcmFtcyAtIG1lc2ggY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKgorICogTWVzaCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAqCisgKiBAX19OTDgwMjExX01FU0hDT05GX0lOVkFMSUQ6IGludGVybmFsIHVzZQorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX1JFVFJZX1RJTUVPVVQ6IHNwZWNpZmllcyB0aGUgaW5pdGlhbCByZXRyeSB0aW1lb3V0IGluCisgKiBtaWxsaXNlY29uZCB1bml0cywgdXNlZCBieSB0aGUgUGVlciBMaW5rIE9wZW4gbWVzc2FnZQorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX0NPTkZJUk1fVElNRU9VVDogc3BlY2lmaWVzIHRoZSBpbml0YWwgY29uZmlybSB0aW1lb3V0LCBpbgorICogbWlsbGlzZWNvbmQgdW5pdHMsIHVzZWQgYnkgdGhlIHBlZXIgbGluayBtYW5hZ2VtZW50IHRvIGNsb3NlIGEgcGVlciBsaW5rCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfSE9MRElOR19USU1FT1VUOiBzcGVjaWZpZXMgdGhlIGhvbGRpbmcgdGltZW91dCwgaW4KKyAqIG1pbGxpc2Vjb25kIHVuaXRzCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfTUFYX1BFRVJfTElOS1M6IG1heGltdW0gbnVtYmVyIG9mIHBlZXIgbGlua3MgYWxsb3dlZAorICogb24gdGhpcyBtZXNoIGludGVyZmFjZQorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX01BWF9SRVRSSUVTOiBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBlZXIgbGluaworICogb3BlbiByZXRyaWVzIHRoYXQgY2FuIGJlIHNlbnQgdG8gZXN0YWJsaXNoIGEgbmV3IHBlZXIgbGluayBpbnN0YW5jZSBpbiBhCisgKiBtZXNoCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfVFRMOiBzcGVjaWZpZXMgdGhlIHZhbHVlIG9mIFRUTCBmaWVsZCBzZXQgYXQgYSBzb3VyY2UgbWVzaAorICogcG9pbnQuCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfQVVUT19PUEVOX1BMSU5LUzogd2hldGhlciB3ZSBzaG91bGQgYXV0b21hdGljYWxseQorICogb3BlbiBwZWVyIGxpbmtzIHdoZW4gd2UgZGV0ZWN0IGNvbXBhdGlibGUgbWVzaCBwZWVycy4KKyAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9IV01QX01BWF9QUkVRX1JFVFJJRVM6IHRoZSBudW1iZXIgb2YgYWN0aW9uIGZyYW1lcworICogY29udGFpbmluZyBhIFBSRVEgdGhhdCBhbiBNUCBjYW4gc2VuZCB0byBhIHBhcnRpY3VsYXIgZGVzdGluYXRpb24gKHBhdGgKKyAqIHRhcmdldCkKKyAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9QQVRIX1JFRlJFU0hfVElNRTogaG93IGZyZXF1ZW50bHkgdG8gcmVmcmVzaCBtZXNoIHBhdGhzCisgKiAoaW4gbWlsbGlzZWNvbmRzKQorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX01JTl9ESVNDT1ZFUllfVElNRU9VVDogbWluaW11bSBsZW5ndGggb2YgdGltZSB0byB3YWl0CisgKiB1bnRpbCBnaXZpbmcgdXAgb24gYSBwYXRoIGRpc2NvdmVyeSAoaW4gbWlsbGlzZWNvbmRzKQorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX0hXTVBfQUNUSVZFX1BBVEhfVElNRU9VVDogVGhlIHRpbWUgKGluIFRVcykgZm9yIHdoaWNoIG1lc2gKKyAqIHBvaW50cyByZWNlaXZpbmcgYSBQUkVRIHNoYWxsIGNvbnNpZGVyIHRoZSBmb3J3YXJkaW5nIGluZm9ybWF0aW9uIGZyb20gdGhlCisgKiByb290IHRvIGJlIHZhbGlkLiAoVFUgPSB0aW1lIHVuaXQpCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfSFdNUF9QUkVRX01JTl9JTlRFUlZBTDogVGhlIG1pbmltdW0gaW50ZXJ2YWwgb2YgdGltZSAoaW4KKyAqIFRVcykgZHVyaW5nIHdoaWNoIGFuIE1QIGNhbiBzZW5kIG9ubHkgb25lIGFjdGlvbiBmcmFtZSBjb250YWluaW5nIGEgUFJFUQorICogcmVmZXJlbmNlIGVsZW1lbnQKKyAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9IV01QX05FVF9ESUFNX1RSVlNfVElNRTogVGhlIGludGVydmFsIG9mIHRpbWUgKGluIFRVcykKKyAqIHRoYXQgaXQgdGFrZXMgZm9yIGFuIEhXTVAgaW5mb3JtYXRpb24gZWxlbWVudCB0byBwcm9wYWdhdGUgYWNyb3NzIHRoZSBtZXNoCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfUk9PVE1PREU6IHdoZXRoZXIgcm9vdCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90CisgKgorICogQE5MODAyMTFfTUVTSENPTkZfQVRUUl9NQVg6IGhpZ2hlc3QgcG9zc2libGUgbWVzaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZQorICoKKyAqIEBfX05MODAyMTFfTUVTSENPTkZfQVRUUl9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqLworZW51bSBubDgwMjExX21lc2hjb25mX3BhcmFtcyB7CisgICAgX19OTDgwMjExX01FU0hDT05GX0lOVkFMSUQsCisgICAgTkw4MDIxMV9NRVNIQ09ORl9SRVRSWV9USU1FT1VULAorICAgIE5MODAyMTFfTUVTSENPTkZfQ09ORklSTV9USU1FT1VULAorICAgIE5MODAyMTFfTUVTSENPTkZfSE9MRElOR19USU1FT1VULAorICAgIE5MODAyMTFfTUVTSENPTkZfTUFYX1BFRVJfTElOS1MsCisgICAgTkw4MDIxMV9NRVNIQ09ORl9NQVhfUkVUUklFUywKKyAgICBOTDgwMjExX01FU0hDT05GX1RUTCwKKyAgICBOTDgwMjExX01FU0hDT05GX0FVVE9fT1BFTl9QTElOS1MsCisgICAgTkw4MDIxMV9NRVNIQ09ORl9IV01QX01BWF9QUkVRX1JFVFJJRVMsCisgICAgTkw4MDIxMV9NRVNIQ09ORl9QQVRIX1JFRlJFU0hfVElNRSwKKyAgICBOTDgwMjExX01FU0hDT05GX01JTl9ESVNDT1ZFUllfVElNRU9VVCwKKyAgICBOTDgwMjExX01FU0hDT05GX0hXTVBfQUNUSVZFX1BBVEhfVElNRU9VVCwKKyAgICBOTDgwMjExX01FU0hDT05GX0hXTVBfUFJFUV9NSU5fSU5URVJWQUwsCisgICAgTkw4MDIxMV9NRVNIQ09ORl9IV01QX05FVF9ESUFNX1RSVlNfVElNRSwKKyAgICBOTDgwMjExX01FU0hDT05GX0hXTVBfUk9PVE1PREUsCisKKyAgICAvKiBrZWVwIGxhc3QgKi8KKyAgICBfX05MODAyMTFfTUVTSENPTkZfQVRUUl9BRlRFUl9MQVNULAorICAgIE5MODAyMTFfTUVTSENPTkZfQVRUUl9NQVggPSBfX05MODAyMTFfTUVTSENPTkZfQVRUUl9BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfdHhxX2F0dHIgLSBUWCBxdWV1ZSBwYXJhbWV0ZXIgYXR0cmlidXRlcworICogQF9fTkw4MDIxMV9UWFFfQVRUUl9JTlZBTElEOiBBdHRyaWJ1dGUgbnVtYmVyIDAgaXMgcmVzZXJ2ZWQKKyAqIEBOTDgwMjExX1RYUV9BVFRSX1FVRVVFOiBUWCBxdWV1ZSBpZGVudGlmaWVyIChOTDgwMjExX1RYUV9RXyopCisgKiBATkw4MDIxMV9UWFFfQVRUUl9UWE9QOiBNYXhpbXVtIGJ1cnN0IHRpbWUgaW4gdW5pdHMgb2YgMzIgdXNlY3MsIDAgbWVhbmluZworICogICAgZGlzYWJsZWQKKyAqIEBOTDgwMjExX1RYUV9BVFRSX0NXTUlOOiBNaW5pbXVtIGNvbnRlbnRpb24gd2luZG93IFthIHZhbHVlIG9mIHRoZSBmb3JtCisgKiAgICAyXm4tMSBpbiB0aGUgcmFuZ2UgMS4uMzI3NjddCisgKiBATkw4MDIxMV9UWFFfQVRUUl9DV01BWDogTWF4aW11bSBjb250ZW50aW9uIHdpbmRvdyBbYSB2YWx1ZSBvZiB0aGUgZm9ybQorICogICAgMl5uLTEgaW4gdGhlIHJhbmdlIDEuLjMyNzY3XQorICogQE5MODAyMTFfVFhRX0FUVFJfQUlGUzogQXJiaXRyYXRpb24gaW50ZXJmcmFtZSBzcGFjZSBbMC4uMjU1XQorICogQF9fTkw4MDIxMV9UWFFfQVRUUl9BRlRFUl9MQVNUOiBJbnRlcm5hbAorICogQE5MODAyMTFfVFhRX0FUVFJfTUFYOiBNYXhpbXVtIFRYUSBhdHRyaWJ1dGUgbnVtYmVyCisgKi8KK2VudW0gbmw4MDIxMV90eHFfYXR0ciB7CisgICAgX19OTDgwMjExX1RYUV9BVFRSX0lOVkFMSUQsCisgICAgTkw4MDIxMV9UWFFfQVRUUl9RVUVVRSwKKyAgICBOTDgwMjExX1RYUV9BVFRSX1RYT1AsCisgICAgTkw4MDIxMV9UWFFfQVRUUl9DV01JTiwKKyAgICBOTDgwMjExX1RYUV9BVFRSX0NXTUFYLAorICAgIE5MODAyMTFfVFhRX0FUVFJfQUlGUywKKworICAgIC8qIGtlZXAgbGFzdCAqLworICAgIF9fTkw4MDIxMV9UWFFfQVRUUl9BRlRFUl9MQVNULAorICAgIE5MODAyMTFfVFhRX0FUVFJfTUFYID0gX19OTDgwMjExX1RYUV9BVFRSX0FGVEVSX0xBU1QgLSAxCit9OworCitlbnVtIG5sODAyMTFfdHhxX3EgeworICAgIE5MODAyMTFfVFhRX1FfVk8sCisgICAgTkw4MDIxMV9UWFFfUV9WSSwKKyAgICBOTDgwMjExX1RYUV9RX0JFLAorICAgIE5MODAyMTFfVFhRX1FfQksKK307CisKK2VudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgeworICAgIE5MODAyMTFfQ0hBTl9OT19IVCwKKyAgICBOTDgwMjExX0NIQU5fSFQyMCwKKyAgICBOTDgwMjExX0NIQU5fSFQ0ME1JTlVTLAorICAgIE5MODAyMTFfQ0hBTl9IVDQwUExVUworfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfYnNzIC0gbmV0bGluayBhdHRyaWJ1dGVzIGZvciBhIEJTUworICoKKyAqIEBfX05MODAyMTFfQlNTX0lOVkFMSUQ6IGludmFsaWQKKyAqIEBOTDgwMjExX0JTU19CU1NJRDogQlNTSUQgb2YgdGhlIEJTUyAoNiBvY3RldHMpCisgKiBATkw4MDIxMV9CU1NfRlJFUVVFTkNZOiBmcmVxdWVuY3kgaW4gTUh6ICh1MzIpCisgKiBATkw4MDIxMV9CU1NfVFNGOiBUU0Ygb2YgdGhlIHJlY2VpdmVkIHByb2JlIHJlc3BvbnNlL2JlYWNvbiAodTY0KQorICogQE5MODAyMTFfQlNTX0JFQUNPTl9JTlRFUlZBTDogYmVhY29uIGludGVydmFsIG9mIHRoZSAoSSlCU1MgKHUxNikKKyAqIEBOTDgwMjExX0JTU19DQVBBQklMSVRZOiBjYXBhYmlsaXR5IGZpZWxkIChDUFUgb3JkZXIsIHUxNikKKyAqIEBOTDgwMjExX0JTU19JTkZPUk1BVElPTl9FTEVNRU5UUzogYmluYXJ5IGF0dHJpYnV0ZSBjb250YWluaW5nIHRoZQorICogICAgcmF3IGluZm9ybWF0aW9uIGVsZW1lbnRzIGZyb20gdGhlIHByb2JlIHJlc3BvbnNlL2JlYWNvbiAoYmluKTsKKyAqICAgIGlmIHRoZSAlTkw4MDIxMV9CU1NfQkVBQ09OX0lFUyBhdHRyaWJ1dGUgaXMgcHJlc2VudCwgdGhlIElFcyBoZXJlIGFyZQorICogICAgZnJvbSBhIFByb2JlIFJlc3BvbnNlIGZyYW1lOyBvdGhlcndpc2UgdGhleSBhcmUgZnJvbSBhIEJlYWNvbiBmcmFtZS4KKyAqICAgIEhvd2V2ZXIsIGlmIHRoZSBkcml2ZXIgZG9lcyBub3QgaW5kaWNhdGUgdGhlIHNvdXJjZSBvZiB0aGUgSUVzLCB0aGVzZQorICogICAgSUVzIG1heSBiZSBmcm9tIGVpdGhlciBmcmFtZSBzdWJ0eXBlLgorICogQE5MODAyMTFfQlNTX1NJR05BTF9NQk06IHNpZ25hbCBzdHJlbmd0aCBvZiBwcm9iZSByZXNwb25zZS9iZWFjb24KKyAqICAgIGluIG1CbSAoMTAwICogZEJtKSAoczMyKQorICogQE5MODAyMTFfQlNTX1NJR05BTF9VTlNQRUM6IHNpZ25hbCBzdHJlbmd0aCBvZiB0aGUgcHJvYmUgcmVzcG9uc2UvYmVhY29uCisgKiAgICBpbiB1bnNwZWNpZmllZCB1bml0cywgc2NhbGVkIHRvIDAuLjEwMCAodTgpCisgKiBATkw4MDIxMV9CU1NfU1RBVFVTOiBzdGF0dXMsIGlmIHRoaXMgQlNTIGlzICJ1c2VkIgorICogQE5MODAyMTFfQlNTX1NFRU5fTVNfQUdPOiBhZ2Ugb2YgdGhpcyBCU1MgZW50cnkgaW4gbXMKKyAqIEBOTDgwMjExX0JTU19CRUFDT05fSUVTOiBiaW5hcnkgYXR0cmlidXRlIGNvbnRhaW5pbmcgdGhlIHJhdyBpbmZvcm1hdGlvbgorICogICAgZWxlbWVudHMgZnJvbSBhIEJlYWNvbiBmcmFtZSAoYmluKTsgbm90IHByZXNlbnQgaWYgbm8gQmVhY29uIGZyYW1lIGhhcworICogICAgeWV0IGJlZW4gcmVjZWl2ZWQKKyAqIEBfX05MODAyMTFfQlNTX0FGVEVSX0xBU1Q6IGludGVybmFsCisgKiBATkw4MDIxMV9CU1NfTUFYOiBoaWdoZXN0IEJTUyBhdHRyaWJ1dGUKKyAqLworZW51bSBubDgwMjExX2JzcyB7CisgICAgX19OTDgwMjExX0JTU19JTlZBTElELAorICAgIE5MODAyMTFfQlNTX0JTU0lELAorICAgIE5MODAyMTFfQlNTX0ZSRVFVRU5DWSwKKyAgICBOTDgwMjExX0JTU19UU0YsCisgICAgTkw4MDIxMV9CU1NfQkVBQ09OX0lOVEVSVkFMLAorICAgIE5MODAyMTFfQlNTX0NBUEFCSUxJVFksCisgICAgTkw4MDIxMV9CU1NfSU5GT1JNQVRJT05fRUxFTUVOVFMsCisgICAgTkw4MDIxMV9CU1NfU0lHTkFMX01CTSwKKyAgICBOTDgwMjExX0JTU19TSUdOQUxfVU5TUEVDLAorICAgIE5MODAyMTFfQlNTX1NUQVRVUywKKyAgICBOTDgwMjExX0JTU19TRUVOX01TX0FHTywKKyAgICBOTDgwMjExX0JTU19CRUFDT05fSUVTLAorCisgICAgLyoga2VlcCBsYXN0ICovCisgICAgX19OTDgwMjExX0JTU19BRlRFUl9MQVNULAorICAgIE5MODAyMTFfQlNTX01BWCA9IF9fTkw4MDIxMV9CU1NfQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX2Jzc19zdGF0dXMgLSBCU1MgInN0YXR1cyIKKyAqIEBOTDgwMjExX0JTU19TVEFUVVNfQVVUSEVOVElDQVRFRDogQXV0aGVudGljYXRlZCB3aXRoIHRoaXMgQlNTLgorICogQE5MODAyMTFfQlNTX1NUQVRVU19BU1NPQ0lBVEVEOiBBc3NvY2lhdGVkIHdpdGggdGhpcyBCU1MuCisgKiBATkw4MDIxMV9CU1NfU1RBVFVTX0lCU1NfSk9JTkVEOiBKb2luZWQgdG8gdGhpcyBJQlNTLgorICoKKyAqIFRoZSBCU1Mgc3RhdHVzIGlzIGEgQlNTIGF0dHJpYnV0ZSBpbiBzY2FuIGR1bXBzLCB3aGljaAorICogaW5kaWNhdGVzIHRoZSBzdGF0dXMgdGhlIGludGVyZmFjZSBoYXMgd3J0LiB0aGlzIEJTUy4KKyAqLworZW51bSBubDgwMjExX2Jzc19zdGF0dXMgeworICAgIE5MODAyMTFfQlNTX1NUQVRVU19BVVRIRU5USUNBVEVELAorICAgIE5MODAyMTFfQlNTX1NUQVRVU19BU1NPQ0lBVEVELAorICAgIE5MODAyMTFfQlNTX1NUQVRVU19JQlNTX0pPSU5FRCwKK307CisKKy8qKgorICogZW51bSBubDgwMjExX2F1dGhfdHlwZSAtIEF1dGhlbnRpY2F0aW9uVHlwZQorICoKKyAqIEBOTDgwMjExX0FVVEhUWVBFX09QRU5fU1lTVEVNOiBPcGVuIFN5c3RlbSBhdXRoZW50aWNhdGlvbgorICogQE5MODAyMTFfQVVUSFRZUEVfU0hBUkVEX0tFWTogU2hhcmVkIEtleSBhdXRoZW50aWNhdGlvbiAoV0VQIG9ubHkpCisgKiBATkw4MDIxMV9BVVRIVFlQRV9GVDogRmFzdCBCU1MgVHJhbnNpdGlvbiAoSUVFRSA4MDIuMTFyKQorICogQE5MODAyMTFfQVVUSFRZUEVfTkVUV09SS19FQVA6IE5ldHdvcmsgRUFQIChzb21lIENpc2NvIEFQcyBhbmQgbWFpbmx5IExFQVApCisgKiBAX19OTDgwMjExX0FVVEhUWVBFX05VTTogaW50ZXJuYWwKKyAqIEBOTDgwMjExX0FVVEhUWVBFX01BWDogbWF4aW11bSB2YWxpZCBhdXRoIGFsZ29yaXRobQorICogQE5MODAyMTFfQVVUSFRZUEVfQVVUT01BVElDOiBkZXRlcm1pbmUgYXV0b21hdGljYWxseSAoaWYgbmVjZXNzYXJ5IGJ5CisgKiAgICB0cnlpbmcgbXVsdGlwbGUgdGltZXMpOyB0aGlzIGlzIGludmFsaWQgaW4gbmV0bGluayAtLSBsZWF2ZSBvdXQKKyAqICAgIHRoZSBhdHRyaWJ1dGUgZm9yIHRoaXMgb24gQ09OTkVDVCBjb21tYW5kcy4KKyAqLworZW51bSBubDgwMjExX2F1dGhfdHlwZSB7CisgICAgTkw4MDIxMV9BVVRIVFlQRV9PUEVOX1NZU1RFTSwKKyAgICBOTDgwMjExX0FVVEhUWVBFX1NIQVJFRF9LRVksCisgICAgTkw4MDIxMV9BVVRIVFlQRV9GVCwKKyAgICBOTDgwMjExX0FVVEhUWVBFX05FVFdPUktfRUFQLAorCisgICAgLyoga2VlcCBsYXN0ICovCisgICAgX19OTDgwMjExX0FVVEhUWVBFX05VTSwKKyAgICBOTDgwMjExX0FVVEhUWVBFX01BWCA9IF9fTkw4MDIxMV9BVVRIVFlQRV9OVU0gLSAxLAorICAgIE5MODAyMTFfQVVUSFRZUEVfQVVUT01BVElDCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9rZXlfdHlwZSAtIEtleSBUeXBlCisgKiBATkw4MDIxMV9LRVlUWVBFX0dST1VQOiBHcm91cCAoYnJvYWRjYXN0L211bHRpY2FzdCkga2V5CisgKiBATkw4MDIxMV9LRVlUWVBFX1BBSVJXSVNFOiBQYWlyd2lzZSAodW5pY2FzdC9pbmRpdmlkdWFsKSBrZXkKKyAqIEBOTDgwMjExX0tFWVRZUEVfUEVFUktFWTogUGVlcktleSAoRExTKQorICogQE5VTV9OTDgwMjExX0tFWVRZUEVTOiBudW1iZXIgb2YgZGVmaW5lZCBrZXkgdHlwZXMKKyAqLworZW51bSBubDgwMjExX2tleV90eXBlIHsKKyAgICBOTDgwMjExX0tFWVRZUEVfR1JPVVAsCisgICAgTkw4MDIxMV9LRVlUWVBFX1BBSVJXSVNFLAorICAgIE5MODAyMTFfS0VZVFlQRV9QRUVSS0VZLAorCisgICAgTlVNX05MODAyMTFfS0VZVFlQRVMKK307CisKKy8qKgorICogZW51bSBubDgwMjExX21mcCAtIE1hbmFnZW1lbnQgZnJhbWUgcHJvdGVjdGlvbiBzdGF0ZQorICogQE5MODAyMTFfTUZQX05POiBNYW5hZ2VtZW50IGZyYW1lIHByb3RlY3Rpb24gbm90IHVzZWQKKyAqIEBOTDgwMjExX01GUF9SRVFVSVJFRDogTWFuYWdlbWVudCBmcmFtZSBwcm90ZWN0aW9uIHJlcXVpcmVkCisgKi8KK2VudW0gbmw4MDIxMV9tZnAgeworICAgIE5MODAyMTFfTUZQX05PLAorICAgIE5MODAyMTFfTUZQX1JFUVVJUkVELAorfTsKKworZW51bSBubDgwMjExX3dwYV92ZXJzaW9ucyB7CisgICAgTkw4MDIxMV9XUEFfVkVSU0lPTl8xID0gMSA8PCAwLAorICAgIE5MODAyMTFfV1BBX1ZFUlNJT05fMiA9IDEgPDwgMSwKK307CisKKy8qKgorICogZW51bSBubDgwMjExX2tleV9hdHRyaWJ1dGVzIC0ga2V5IGF0dHJpYnV0ZXMKKyAqIEBfX05MODAyMTFfS0VZX0lOVkFMSUQ6IGludmFsaWQKKyAqIEBOTDgwMjExX0tFWV9EQVRBOiAodGVtcG9yYWwpIGtleSBkYXRhOyBmb3IgVEtJUCB0aGlzIGNvbnNpc3RzIG9mCisgKiAgICAxNiBieXRlcyBlbmNyeXB0aW9uIGtleSBmb2xsb3dlZCBieSA4IGJ5dGVzIGVhY2ggZm9yIFRYIGFuZCBSWCBNSUMKKyAqICAgIGtleXMKKyAqIEBOTDgwMjExX0tFWV9JRFg6IGtleSBJRCAodTgsIDAtMykKKyAqIEBOTDgwMjExX0tFWV9DSVBIRVI6IGtleSBjaXBoZXIgc3VpdGUgKHUzMiwgYXMgZGVmaW5lZCBieSBJRUVFIDgwMi4xMQorICogICAgc2VjdGlvbiA3LjMuMi4yNS4xLCBlLmcuIDB4MDAwRkFDMDQpCisgKiBATkw4MDIxMV9LRVlfU0VROiB0cmFuc21pdCBrZXkgc2VxdWVuY2UgbnVtYmVyIChJVi9QTikgZm9yIFRLSVAgYW5kCisgKiAgICBDQ01QIGtleXMsIGVhY2ggc2l4IGJ5dGVzIGluIGxpdHRsZSBlbmRpYW4KKyAqIEBOTDgwMjExX0tFWV9ERUZBVUxUOiBmbGFnIGluZGljYXRpbmcgZGVmYXVsdCBrZXkKKyAqIEBOTDgwMjExX0tFWV9ERUZBVUxUX01HTVQ6IGZsYWcgaW5kaWNhdGluZyBkZWZhdWx0IG1hbmFnZW1lbnQga2V5CisgKiBATkw4MDIxMV9LRVlfVFlQRTogdGhlIGtleSB0eXBlIGZyb20gZW51bSBubDgwMjExX2tleV90eXBlLCBpZiBub3QKKyAqICAgIHNwZWNpZmllZCB0aGUgZGVmYXVsdCBkZXBlbmRzIG9uIHdoZXRoZXIgYSBNQUMgYWRkcmVzcyB3YXMKKyAqICAgIGdpdmVuIHdpdGggdGhlIGNvbW1hbmQgdXNpbmcgdGhlIGtleSBvciBub3QgKHUzMikKKyAqIEBfX05MODAyMTFfS0VZX0FGVEVSX0xBU1Q6IGludGVybmFsCisgKiBATkw4MDIxMV9LRVlfTUFYOiBoaWdoZXN0IGtleSBhdHRyaWJ1dGUKKyAqLworZW51bSBubDgwMjExX2tleV9hdHRyaWJ1dGVzIHsKKyAgICBfX05MODAyMTFfS0VZX0lOVkFMSUQsCisgICAgTkw4MDIxMV9LRVlfREFUQSwKKyAgICBOTDgwMjExX0tFWV9JRFgsCisgICAgTkw4MDIxMV9LRVlfQ0lQSEVSLAorICAgIE5MODAyMTFfS0VZX1NFUSwKKyAgICBOTDgwMjExX0tFWV9ERUZBVUxULAorICAgIE5MODAyMTFfS0VZX0RFRkFVTFRfTUdNVCwKKyAgICBOTDgwMjExX0tFWV9UWVBFLAorCisgICAgLyoga2VlcCBsYXN0ICovCisgICAgX19OTDgwMjExX0tFWV9BRlRFUl9MQVNULAorICAgIE5MODAyMTFfS0VZX01BWCA9IF9fTkw4MDIxMV9LRVlfQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX3R4X3JhdGVfYXR0cmlidXRlcyAtIFRYIHJhdGUgc2V0IGF0dHJpYnV0ZXMKKyAqIEBfX05MODAyMTFfVFhSQVRFX0lOVkFMSUQ6IGludmFsaWQKKyAqIEBOTDgwMjExX1RYUkFURV9MRUdBQ1k6IExlZ2FjeSAobm9uLU1DUykgcmF0ZXMgYWxsb3dlZCBmb3IgVFggcmF0ZSBzZWxlY3Rpb24KKyAqICAgIGluIGFuIGFycmF5IG9mIHJhdGVzIGFzIGRlZmluZWQgaW4gSUVFRSA4MDIuMTEgNy4zLjIuMiAodTggdmFsdWVzIHdpdGgKKyAqICAgIDEgPSA1MDAga2JwcykgYnV0IHdpdGhvdXQgdGhlIElFIGxlbmd0aCByZXN0cmljdGlvbiAoYXQgbW9zdAorICogICAgJU5MODAyMTFfTUFYX1NVUFBfUkFURVMgaW4gYSBzaW5nbGUgYXJyYXkpLgorICogQF9fTkw4MDIxMV9UWFJBVEVfQUZURVJfTEFTVDogaW50ZXJuYWwKKyAqIEBOTDgwMjExX1RYUkFURV9NQVg6IGhpZ2hlc3QgVFggcmF0ZSBhdHRyaWJ1dGUKKyAqLworZW51bSBubDgwMjExX3R4X3JhdGVfYXR0cmlidXRlcyB7CisgICAgX19OTDgwMjExX1RYUkFURV9JTlZBTElELAorICAgIE5MODAyMTFfVFhSQVRFX0xFR0FDWSwKKworICAgIC8qIGtlZXAgbGFzdCAqLworICAgIF9fTkw4MDIxMV9UWFJBVEVfQUZURVJfTEFTVCwKKyAgICBOTDgwMjExX1RYUkFURV9NQVggPSBfX05MODAyMTFfVFhSQVRFX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9iYW5kIC0gRnJlcXVlbmN5IGJhbmQKKyAqIEBOTDgwMjExX0JBTkRfMkdIWjogMi40IEdIeiBJU00gYmFuZAorICogQE5MODAyMTFfQkFORF81R0haOiBhcm91bmQgNSBHSHogYmFuZCAoNC45IC0gNS43IEdIeikKKyAqLworZW51bSBubDgwMjExX2JhbmQgeworICAgIE5MODAyMTFfQkFORF8yR0haLAorICAgIE5MODAyMTFfQkFORF81R0haLAorfTsKKworZW51bSBubDgwMjExX3BzX3N0YXRlIHsKKyAgICBOTDgwMjExX1BTX0RJU0FCTEVELAorICAgIE5MODAyMTFfUFNfRU5BQkxFRCwKK307CisKKy8qKgorICogZW51bSBubDgwMjExX2F0dHJfY3FtIC0gY29ubmVjdGlvbiBxdWFsaXR5IG1vbml0b3IgYXR0cmlidXRlcworICogQF9fTkw4MDIxMV9BVFRSX0NRTV9JTlZBTElEOiBpbnZhbGlkCisgKiBATkw4MDIxMV9BVFRSX0NRTV9SU1NJX1RIT0xEOiBSU1NJIHRocmVzaG9sZCBpbiBkQm0uIFRoaXMgdmFsdWUgc3BlY2lmaWVzCisgKiAgICB0aGUgdGhyZXNob2xkIGZvciB0aGUgUlNTSSBsZXZlbCBhdCB3aGljaCBhbiBldmVudCB3aWxsIGJlIHNlbnQuIFplcm8KKyAqICAgIHRvIGRpc2FibGUuCisgKiBATkw4MDIxMV9BVFRSX0NRTV9SU1NJX0hZU1Q6IFJTU0kgaHlzdGVyZXNpcyBpbiBkQm0uIFRoaXMgdmFsdWUgc3BlY2lmaWVzCisgKiAgICB0aGUgbWluaW11bSBhbW91bnQgdGhlIFJTU0kgbGV2ZWwgbXVzdCBjaGFuZ2UgYWZ0ZXIgYW4gZXZlbnQgYmVmb3JlIGEKKyAqICAgIG5ldyBldmVudCBtYXkgYmUgaXNzdWVkICh0byByZWR1Y2UgZWZmZWN0cyBvZiBSU1NJIG9zY2lsbGF0aW9uKS4KKyAqIEBOTDgwMjExX0FUVFJfQ1FNX1JTU0lfVEhSRVNIT0xEX0VWRU5UOiBSU1NJIHRocmVzaG9sZCBldmVudAorICogQF9fTkw4MDIxMV9BVFRSX0NRTV9BRlRFUl9MQVNUOiBpbnRlcm5hbAorICogQE5MODAyMTFfQVRUUl9DUU1fTUFYOiBoaWdoZXN0IGtleSBhdHRyaWJ1dGUKKyAqLworZW51bSBubDgwMjExX2F0dHJfY3FtIHsKKyAgICBfX05MODAyMTFfQVRUUl9DUU1fSU5WQUxJRCwKKyAgICBOTDgwMjExX0FUVFJfQ1FNX1JTU0lfVEhPTEQsCisgICAgTkw4MDIxMV9BVFRSX0NRTV9SU1NJX0hZU1QsCisgICAgTkw4MDIxMV9BVFRSX0NRTV9SU1NJX1RIUkVTSE9MRF9FVkVOVCwKKworICAgIC8qIGtlZXAgbGFzdCAqLworICAgIF9fTkw4MDIxMV9BVFRSX0NRTV9BRlRFUl9MQVNULAorICAgIE5MODAyMTFfQVRUUl9DUU1fTUFYID0gX19OTDgwMjExX0FUVFJfQ1FNX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9jcW1fcnNzaV90aHJlc2hvbGRfZXZlbnQgLSBSU1NJIHRocmVzaG9sZCBldmVudAorICogQE5MODAyMTFfQ1FNX1JTU0lfVEhSRVNIT0xEX0VWRU5UX0xPVzogVGhlIFJTU0kgbGV2ZWwgaXMgbG93ZXIgdGhhbiB0aGUKKyAqICAgICAgY29uZmlndXJlZCB0aHJlc2hvbGQKKyAqIEBOTDgwMjExX0NRTV9SU1NJX1RIUkVTSE9MRF9FVkVOVF9ISUdIOiBUaGUgUlNTSSBpcyBoaWdoZXIgdGhhbiB0aGUKKyAqICAgICAgY29uZmlndXJlZCB0aHJlc2hvbGQKKyAqLworZW51bSBubDgwMjExX2NxbV9yc3NpX3RocmVzaG9sZF9ldmVudCB7CisgICAgTkw4MDIxMV9DUU1fUlNTSV9USFJFU0hPTERfRVZFTlRfTE9XLAorICAgIE5MODAyMTFfQ1FNX1JTU0lfVEhSRVNIT0xEX0VWRU5UX0hJR0gsCit9OworCisKKy8qKgorICogZW51bSBubDgwMjExX3R4X3Bvd2VyX3NldHRpbmcgLSBUWCBwb3dlciBhZGp1c3RtZW50CisgKiBATkw4MDIxMV9UWF9QT1dFUl9BVVRPTUFUSUM6IGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHRyYW5zbWl0IHBvd2VyCisgKiBATkw4MDIxMV9UWF9QT1dFUl9MSU1JVEVEOiBsaW1pdCBUWCBwb3dlciBieSB0aGUgbUJtIHBhcmFtZXRlcgorICogQE5MODAyMTFfVFhfUE9XRVJfRklYRUQ6IGZpeCBUWCBwb3dlciB0byB0aGUgbUJtIHBhcmFtZXRlcgorICovCitlbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyB7CisgICAgTkw4MDIxMV9UWF9QT1dFUl9BVVRPTUFUSUMsCisgICAgTkw4MDIxMV9UWF9QT1dFUl9MSU1JVEVELAorICAgIE5MODAyMTFfVFhfUE9XRVJfRklYRUQsCit9OworCisjZW5kaWYgLyogX19MSU5VWF9OTDgwMjExX0ggKi8K