LyoKICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGNvcmVib290IHByb2plY3QuCiAqCiAqIENvcHlyaWdodCAoQykgMjAwOCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCiAqIENvcHlyaWdodCAoQykgMjAxMCBTaWVtZW5zIEFHLCBJbmMuCiAqIChXcml0dGVuIGJ5IEpvc2VmIEtlbGxlcm1hbm4gPGpvc2VwaC5rZWxsZXJtYW5uQGhlaXRlYy5kZT4gZm9yIFNpZW1lbnMgQUcsIEluYy4pCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbnNvbGUvY29uc29sZS5oPgojaW5jbHVkZSA8ZGV2aWNlL2RldmljZS5oPgojaW5jbHVkZSA8ZGV2aWNlL3BjaS5oPgojaW5jbHVkZSA8YXJjaC9pby5oPgojaW5jbHVkZSA8YXJjaC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGRlbGF5Lmg+CiNpbmNsdWRlIDxjcHUveDg2L21zci5oPgojaW5jbHVkZSA8Y3B1L2FtZC9tdHJyLmg+CiNpbmNsdWRlIDxkZXZpY2UvcGNpX2RlZi5oPgojaW5jbHVkZSA8cGM4MC9tYzE0NjgxOHJ0Yy5oPgojaW5jbHVkZSA8Y3B1L3g4Ni9sYXBpYy5oPgojaW5jbHVkZSA8c291dGhicmlkZ2UvYW1kL3NiNjAwL3NiNjAwLmg+CiNpbmNsdWRlIDxzb3V0aGJyaWRnZS9hbWQvcnM2OTAvY2hpcC5oPgojaW5jbHVkZSA8c291dGhicmlkZ2UvYW1kL3JzNjkwL3JzNjkwLmg+CiNpbmNsdWRlIDxzdXBlcmlvL2l0ZS9pdDg3MTJmL2l0ODcxMmYuaD4KI2lmIENPTkZJR19QQ0lfT1BUSU9OX1JPTV9SVU5fWUFCRUwKI2luY2x1ZGUgPHg4NmVtdS94ODZlbXUuaD4KI2VuZGlmCiNpbmNsdWRlICJpbnQxNV9mdW5jLmgiCgovLyAqKioqTENEIHBhbmVsIElEIHN1cHBvcnQ6ICoqKioqCi8vIENhbGxiYWNrIFN1Yi1GdW5jdGlvbiAwMGggLSBHZXQgTENEIFBhbmVsIElECiNkZWZpbmUgUEFORUxfVEFCTEVfSURfTk8gCTAgLy8gbm8gTENECiNkZWZpbmUgUEFORUxfVEFCTEVfSUQxIAkxIC8vIDEwMjR4NzY4XzY1TUh6X0R1YWwKI2RlZmluZSBQQU5FTF9UQUJMRV9JRDIgCTIgLy8gOTIweDEyMDBfMTYyTUh6CiNkZWZpbmUgUEFORUxfVEFCTEVfSUQzIAkzIC8vIDYwMHgxMjAwXzE2Mk1IegojZGVmaW5lIFBBTkVMX1RBQkxFX0lENCAJNCAvLyAxMDI0eDc2OF82NU1IegojZGVmaW5lIFBBTkVMX1RBQkxFX0lENSAJNSAvLyAxNDAweDEwNTBfMTA4TUh6CiNkZWZpbmUgUEFORUxfVEFCTEVfSUQ2IAk2IC8vIDE2ODB4MTA1MF8xMTlNSHoKI2RlZmluZSBQQU5FTF9UQUJMRV9JRDcgCTcgLy8gMjA0OHgxNTM2XzE2NE1IegojZGVmaW5lIFBBTkVMX1RBQkxFX0lEOCAJOCAvLyAxMjgweDEwMjRfMTA4TUh6CiNkZWZpbmUgUEFORUxfVEFCTEVfSUQ5IAk5IC8vIDEzNjZ4NzY4Xzg2TUh6X2NoaW1laV9WMzJCMUwwMQoKLy8gQ2FsbGJhY2sgU3ViLUZ1bmN0aW9uIDA1aCCWIFNlbGVjdCBCb290LXVwIFRWIFN0YW5kYXJkCiNkZWZpbmUgVFZfTU9ERV8wMAkweDAwCS8qIE5UU0MgKi8KI2RlZmluZSBUVl9NT0RFXzAxCTB4MDEJLyogUEFMICovCiNkZWZpbmUgVFZfTU9ERV8wMgkweDAyCS8qIFBBTE0gKi8KI2RlZmluZSBUVl9NT0RFXzAzCTB4MDMJLyogUEFMNjAgKi8KI2RlZmluZSBUVl9NT0RFXzA0CTB4MDQJLyogTlRTQ0ogKi8KI2RlZmluZSBUVl9NT0RFXzA1CTB4MDUJLyogUEFMQ04gKi8KI2RlZmluZSBUVl9NT0RFXzA2CTB4MDYJLyogUEFMTiAqLwojZGVmaW5lIFRWX01PREVfMDkJMHgwOQkvKiBTQ0FSVC1SR0IgKi8KI2RlZmluZSBUVl9NT0RFX05PCTB4ZmYJLyogTm8gVFYgU3VwcG9ydCAqLwoKI2RlZmluZSBQTFhfVklERElEIDB4ODYxNjEwYjUKCi8qIDc0NzUgQ29tbW9uIFJlZ2lzdGVycyAqLwojZGVmaW5lIFJFR19ERVZSRVYyICAgICAgICAgICAgIDB4MTIgICAgLyogQURUNzQ5MCBvbmx5ICovCiNkZWZpbmUgUkVHX1ZUVCAgICAgICAgICAgICAgICAgMHgxRSAgICAvKiBBRFQ3NDkwIG9ubHkgKi8KI2RlZmluZSBSRUdfRVhURU5EMyAgICAgICAgICAgICAweDFGICAgIC8qIEFEVDc0OTAgb25seSAqLwojZGVmaW5lIFJFR19WT0xUQUdFX0JBU0UgICAgICAgIDB4MjAKI2RlZmluZSBSRUdfVEVNUF9CQVNFICAgICAgICAgICAweDI1CiNkZWZpbmUgUkVHX1RBQ0hfQkFTRSAgICAgICAgICAgMHgyOAojZGVmaW5lIFJFR19QV01fQkFTRSAgICAgICAgICAgIDB4MzAKI2RlZmluZSBSRUdfUFdNX01BWF9CQVNFICAgICAgICAweDM4CiNkZWZpbmUgUkVHX0RFVklEICAgICAgICAgICAgICAgMHgzRAojZGVmaW5lIFJFR19WRU5ESUQgICAgICAgICAgICAgIDB4M0UKI2RlZmluZSBSRUdfREVWSUQyICAgICAgICAgICAgICAweDNGCiNkZWZpbmUgUkVHX1NUQVRVUzEgICAgICAgICAgICAgMHg0MQojZGVmaW5lIFJFR19TVEFUVVMyICAgICAgICAgICAgIDB4NDIKI2RlZmluZSBSRUdfVklEICAgICAgICAgICAgICAgICAweDQzICAgIC8qIEFEVDc0NzYgb25seSAqLwojZGVmaW5lIFJFR19WT0xUQUdFX01JTl9CQVNFICAgIDB4NDQKI2RlZmluZSBSRUdfVk9MVEFHRV9NQVhfQkFTRSAgICAweDQ1CiNkZWZpbmUgUkVHX1RFTVBfTUlOX0JBU0UgICAgICAgMHg0RQojZGVmaW5lIFJFR19URU1QX01BWF9CQVNFICAgICAgIDB4NEYKI2RlZmluZSBSRUdfVEFDSF9NSU5fQkFTRSAgICAgICAweDU0CiNkZWZpbmUgUkVHX1BXTV9DT05GSUdfQkFTRSAgICAgMHg1QwojZGVmaW5lIFJFR19URU1QX1RSQU5HRV9CQVNFICAgIDB4NUYKI2RlZmluZSBSRUdfUFdNX01JTl9CQVNFICAgICAgICAweDY0CiNkZWZpbmUgUkVHX1RFTVBfVE1JTl9CQVNFICAgICAgMHg2NwojZGVmaW5lIFJFR19URU1QX1RIRVJNX0JBU0UgICAgIDB4NkEKI2RlZmluZSBSRUdfUkVNT1RFMV9IWVNURVJTSVMgICAweDZECiNkZWZpbmUgUkVHX1JFTU9URTJfSFlTVEVSU0lTICAgMHg2RQojZGVmaW5lIFJFR19URU1QX09GRlNFVF9CQVNFICAgIDB4NzAKI2RlZmluZSBSRUdfQ09ORklHMiAgICAgICAgICAgICAweDczCiNkZWZpbmUgUkVHX0VYVEVORDEgICAgICAgICAgICAgMHg3NgojZGVmaW5lIFJFR19FWFRFTkQyICAgICAgICAgICAgIDB4NzcKI2RlZmluZSBSRUdfQ09ORklHMQkJCQkweDQwCS8vIEFEVDc0NzUKI2RlZmluZSBSRUdfQ09ORklHMyAgICAgICAgICAgICAweDc4CiNkZWZpbmUgUkVHX0NPTkZJRzUgICAgICAgICAgICAgMHg3QwojZGVmaW5lIFJFR19DT05GSUc2CQkJCTB4MTAJLy8gQURUNzQ3NQojZGVmaW5lIFJFR19DT05GSUc3CQkJCTB4MTEJLy8gQURUNzQ3NQojZGVmaW5lIFJFR19DT05GSUc0ICAgICAgICAgICAgIDB4N0QKI2RlZmluZSBSRUdfU1RBVFVTNCAgICAgICAgICAgICAweDgxICAgIC8qIEFEVDc0OTAgb25seSAqLwojZGVmaW5lIFJFR19WVFRfTUlOICAgICAgICAgICAgIDB4ODQgICAgLyogQURUNzQ5MCBvbmx5ICovCiNkZWZpbmUgUkVHX1ZUVF9NQVggICAgICAgICAgICAgMHg4NiAgICAvKiBBRFQ3NDkwIG9ubHkgKi8KCiNkZWZpbmUgVklEX1ZJRFNFTCAgICAgICAgICAgICAgMHg4MCAgICAvKiBBRFQ3NDc2IG9ubHkgKi8KCiNkZWZpbmUgQ09ORklHMl9BVFROICAgICAgICAgICAgMHgyMAojZGVmaW5lIENPTkZJRzNfU01CQUxFUlQgICAgICAgIDB4MDEKI2RlZmluZSBDT05GSUczX1RIRVJNICAgICAgICAgICAweDAyCiNkZWZpbmUgQ09ORklHNF9QSU5GVU5DICAgICAgICAgMHgwMwojZGVmaW5lIENPTkZJRzRfTUFYRFVUWSAgICAgICAgIDB4MDgKI2RlZmluZSBDT05GSUc0X0FUVE5fSU4xMCAgICAgICAweDMwCiNkZWZpbmUgQ09ORklHNF9BVFROX0lONDMgICAgICAgMHhDMAojZGVmaW5lIENPTkZJRzVfVFdPU0NPTVAgICAgICAgIDB4MDEKI2RlZmluZSBDT05GSUc1X1RFTVBPRkZTRVQgICAgICAweDAyCiNkZWZpbmUgQ09ORklHNV9WSURHUElPICAgICAgICAgMHgxMCAgICAvKiBBRFQ3NDc2IG9ubHkgKi8KI2RlZmluZSBSRU1PVEUxCQkJCQkwCiNkZWZpbmUgTE9DQUwJCQkJCTEKI2RlZmluZSBSRU1PVEUyCQkJCQkyCgovKiBBRFQ3NDc1IFNldHRpbmdzICovCiNkZWZpbmUgQURUNzQ3NV9WT0xUQUdFX0NPVU5UICAgNSAgICAgICAvKiBOb3QgY291bnRpbmcgVnR0ICovCiNkZWZpbmUgQURUNzQ3NV9URU1QX0NPVU5UICAgICAgMwojZGVmaW5lIEFEVDc0NzVfVEFDSF9DT1VOVCAgICAgIDQKI2RlZmluZSBBRFQ3NDc1X1BXTV9DT1VOVCAgICAgICAzCgovKiBNYWNyb3MgdG8gZWFzaWx5IGluZGV4IHRoZSByZWdpc3RlcnMgKi8KI2RlZmluZSBUQUNIX1JFRyhpZHgpIChSRUdfVEFDSF9CQVNFICsgKChpZHgpICogMikpCiNkZWZpbmUgVEFDSF9NSU5fUkVHKGlkeCkgKFJFR19UQUNIX01JTl9CQVNFICsgKChpZHgpICogMikpCgojZGVmaW5lIFBXTV9SRUcoaWR4KSAoUkVHX1BXTV9CQVNFICsgKGlkeCkpCiNkZWZpbmUgUFdNX01BWF9SRUcoaWR4KSAoUkVHX1BXTV9NQVhfQkFTRSArIChpZHgpKQojZGVmaW5lIFBXTV9NSU5fUkVHKGlkeCkgKFJFR19QV01fTUlOX0JBU0UgKyAoaWR4KSkKI2RlZmluZSBQV01fQ09ORklHX1JFRyhpZHgpIChSRUdfUFdNX0NPTkZJR19CQVNFICsgKGlkeCkpCgojZGVmaW5lIFZPTFRBR0VfUkVHKGlkeCkgKFJFR19WT0xUQUdFX0JBU0UgKyAoaWR4KSkKI2RlZmluZSBWT0xUQUdFX01JTl9SRUcoaWR4KSAoUkVHX1ZPTFRBR0VfTUlOX0JBU0UgKyAoKGlkeCkgKiAyKSkKI2RlZmluZSBWT0xUQUdFX01BWF9SRUcoaWR4KSAoUkVHX1ZPTFRBR0VfTUFYX0JBU0UgKyAoKGlkeCkgKiAyKSkKCiNkZWZpbmUgVEVNUF9SRUcoaWR4KSAoUkVHX1RFTVBfQkFTRSArIChpZHgpKQojZGVmaW5lIFRFTVBfTUlOX1JFRyhpZHgpIChSRUdfVEVNUF9NSU5fQkFTRSArICgoaWR4KSAqIDIpKQojZGVmaW5lIFRFTVBfTUFYX1JFRyhpZHgpIChSRUdfVEVNUF9NQVhfQkFTRSArICgoaWR4KSAqIDIpKQojZGVmaW5lIFRFTVBfVE1JTl9SRUcoaWR4KSAoUkVHX1RFTVBfVE1JTl9CQVNFICsgKGlkeCkpCiNkZWZpbmUgVEVNUF9USEVSTV9SRUcoaWR4KSAoUkVHX1RFTVBfVEhFUk1fQkFTRSArIChpZHgpKQojZGVmaW5lIFRFTVBfT0ZGU0VUX1JFRyhpZHgpIChSRUdfVEVNUF9PRkZTRVRfQkFTRSArIChpZHgpKQojZGVmaW5lIFRFTVBfVFJBTkdFX1JFRyhpZHgpIChSRUdfVEVNUF9UUkFOR0VfQkFTRSArIChpZHgpKQoKI2RlZmluZSBTTUJVU19JT19CQVNFIDB4MTAwMAojZGVmaW5lIEFEVDc0NzVfQUREUkVTUyAweDJFCgojZGVmaW5lICAgRF9PUEVOCSgxIDw8IDYpCiNkZWZpbmUgICBEX0NMUwkJKDEgPDwgNSkKI2RlZmluZSAgIERfTENLCQkoMSA8PCA0KQojZGVmaW5lICAgR19TTVJBTUUJKDEgPDwgMykKI2RlZmluZSAgIEFfQkFTRV9TRUcJKCgwIDw8IDIpIHwgKDEgPDwgMSkgfCAoMCA8PCAwKSkgLy8gMHgyOiBTTU0gc3BhY2UgYXQgNjQwS0ItNzY4S0IKCmV4dGVybiBpbnQgZG9fc21idXNfcmVhZF9ieXRlKHUzMiBzbWJ1c19pb19iYXNlLCB1MzIgZGV2aWNlLCB1MzIgYWRkcmVzcyk7CmV4dGVybiBpbnQgZG9fc21idXNfd3JpdGVfYnl0ZSh1MzIgc21idXNfaW9fYmFzZSwgdTMyIGRldmljZSwgdTMyIGFkZHJlc3MsIHU4IHZhbCk7CgpzdGF0aWMgdTMyIHNtYnVzX2lvX2Jhc2UgPSBTTUJVU19JT19CQVNFOwpzdGF0aWMgdTMyIGFkdDc0NzVfYWRkcmVzcyA9IEFEVDc0NzVfQUREUkVTUzsKCi8qIE1hY3JvIHRvIHJlYWQgdGhlIHJlZ2lzdGVycyAqLwojZGVmaW5lIGFkdDc0NzVfcmVhZF9ieXRlKHJlZykgXAoJZG9fc21idXNfcmVhZF9ieXRlKHNtYnVzX2lvX2Jhc2UsIGFkdDc0NzVfYWRkcmVzcywgcmVnKQoKI2RlZmluZSBhZHQ3NDc1X3dyaXRlX2J5dGUocmVnLCB2YWwpIFwKCWRvX3NtYnVzX3dyaXRlX2J5dGUoc21idXNfaW9fYmFzZSwgYWR0NzQ3NV9hZGRyZXNzLCByZWcsIHZhbCkKCiNkZWZpbmUgVFdPU19DT01QTCAxCgpzdHJ1Y3QgX190YWJsZV9fewoJY29uc3QgY2hhciAqaW5mbzsKCXU4IHZhbDsKfTsKCnN0cnVjdCBfX3RhYmxlX18gZHV0eWN5Y2xlc1tdID0gewoJeyIyNSUiLCAweDNmfSx7IjMwJSIsIDB4NGN9LHsiMzUlIiwgMHg1OX0seyI0MCUiLCAweDY2fSx7IjQ1JSIsIDB4NzN9LAoJeyI1MCUiLCAweDgwfSx7IjU1JSIsIDB4OGR9LHsiNjAlIiwgMHg5YX0seyI2NSUiLCAweGE3fSx7IjcwJSIsIDB4YjR9LAoJeyI3NSUiLCAweGMxfSx7IjgwJSIsIDB4Y2V9LHsiODUlIiwgMHhkYn0seyI5MCUiLCAweGU4fSx7Ijk1JSIsIDB4ZjV9LAoJeyIxMDAlIiwgMHhmZn0KfTsKI2RlZmluZSBTSVpFT0ZfRFVUWUNZQ0xFUyBzaXplb2YoZHV0eWN5Y2xlcykvc2l6ZW9mKHN0cnVjdCBfX3RhYmxlX18pCiNkZWZpbmUgRFVUWUNZQ0xFKGksZCkgKGkgPCBTSVpFT0ZfRFVUWUNZQ0xFUykgPyBkdXR5Y3ljbGVzW2ldLnZhbCA6IGR1dHljeWNsZXNbZF0udmFsIC8vIGhvcGVmdWxseSBkIGlzIGEgY29ycmVjdCB2YWx1ZSAhISEgZml4CiNkZWZpbmUgRFVUWUNZQ0xFX0lORk8oaSkgKGkgPCBTSVpFT0ZfRFVUWUNZQ0xFUykgPyBkdXR5Y3ljbGVzW2ldLmluZm8gOiAib3V0X29mX3JhbmdlIgojaWYgVFdPU19DT01QTCA9PSAwCnN0cnVjdCBfX3RhYmxlX18gdGVtcGVyYXR1cmVzW10gPSB7Cgl7IjMwsEMiLCAweDVlfSx7IjM1sEMiLCAweDYzfSx7IjQwsEMiLCAweDY4fSx7IjQ1sEMiLCAweDZkfSx7IjUwsEMiLCAweDcyfSwKCXsiNTWwQyIsIDB4Nzd9LHsiNjCwQyIsIDB4N2N9LHsiNjWwQyIsIDB4ODF9LHsiNzCwQyIsIDB4ODZ9LHsiNzWwQyIsIDB4OGJ9LAoJeyI4MLBDIiwgMHg5MH0KfTsKI2Vsc2UKc3RydWN0IF9fdGFibGVfXyB0ZW1wZXJhdHVyZXNbXSA9IHsKCXsiMzCwQyIsIDMwfSx7IjM1sEMiLCAzNX0seyI0MLBDIiwgNDB9LHsiNDWwQyIsIDQ1fSx7IjUwsEMiLCA1MH0sCgl7IjU1sEMiLCA1NX0seyI2MLBDIiwgNjB9LHsiNjWwQyIsIDY1fSx7IjcwsEMiLCA3MH0seyI3NbBDIiwgNzV9LAoJeyI4MLBDIiwgODB9Cn07CiNlbmRpZgppbnQgdHJhbmdlW10gPSB7Mi4wLDIuNSwzLjMzLDQuMCw1LjAsNi42Nyw4LjAsMTAuMCwxMy4zMywxNi4wLDIwLjAsMjYuNjcsMzIuMCw0MC4wLDUzLjMzLDgwLjB9OwoKI2RlZmluZSBTSVpFT0ZfVEVNUEVSQVRVUkVTIHNpemVvZih0ZW1wZXJhdHVyZXMpL3NpemVvZihzdHJ1Y3QgX190YWJsZV9fKQojZGVmaW5lIFRFTVBFUkFUVVJFKGksZCkgKGkgPCBTSVpFT0ZfVEVNUEVSQVRVUkVTKSA/IHRlbXBlcmF0dXJlc1tpXS52YWwgOiB0ZW1wZXJhdHVyZXNbZF0udmFsIC8vIGhvcGVmdWxseSBkIGlzIGEgY29ycmVjdCB2YWx1ZSAhISEgZml4CiNkZWZpbmUgVEVNUEVSQVRVUkVfSU5GTyhpKSAoaSA8IFNJWkVPRl9URU1QRVJBVFVSRVMpID8gdGVtcGVyYXR1cmVzW2ldLmluZm8gOiAib3V0IG9mIHJhbmdlIgoKc3RydWN0IGZhbl9jb250cm9sIHsKCQl1bnNpZ25lZCBpbnQgZW5hYmxlIDogMTsKCQl1OCBwb2xhcml0eTsKCQl1OCB0X21pbjsKCQl1OCB0X21heDsKCQl1OCBwd21fbWluOwoJCXU4IHB3bV9tYXg7CgkJdTggdF9yYW5nZTsKfTsKLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCiNpZiBDT05GSUdfUENJX09QVElPTl9ST01fUlVOX1lBQkVMCnN0YXRpYyBpbnQgaW50MTVfaGFuZGxlcih2b2lkKQp7CiNkZWZpbmUgQk9PVF9ESVNQTEFZX0RFRkFVTFQJMAojZGVmaW5lIEJPT1RfRElTUExBWV9DUlQJKDEgPDwgMCkKI2RlZmluZSBCT09UX0RJU1BMQVlfVFYJCSgxIDw8IDEpCiNkZWZpbmUgQk9PVF9ESVNQTEFZX0VGUAkoMSA8PCAyKQojZGVmaW5lIEJPT1RfRElTUExBWV9MQ0QJKDEgPDwgMykKI2RlZmluZSBCT09UX0RJU1BMQVlfQ1JUMgkoMSA8PCA0KQojZGVmaW5lIEJPT1RfRElTUExBWV9UVjIJKDEgPDwgNSkKI2RlZmluZSBCT09UX0RJU1BMQVlfRUZQMgkoMSA8PCA2KQojZGVmaW5lIEJPT1RfRElTUExBWV9MQ0QyCSgxIDw8IDcpCgoJcHJpbnRrKEJJT1NfREVCVUcsICIlczogQVg9JTA0eCBCWD0lMDR4IENYPSUwNHggRFg9JTA0eFxuIiwKCQkJICBfX2Z1bmNfXywgWDg2X0FYLCBYODZfQlgsIFg4Nl9DWCwgWDg2X0RYKTsKCglzd2l0Y2ggKFg4Nl9BWCkgewoJY2FzZSAweDRlMDg6IC8qIEJvb3QgRGlzcGxheSAqLwoJICAgIHN3aXRjaCAoWDg2X0JYKSB7CgkJY2FzZSAweDgwOgoJCQlYODZfQVggJj0gfigweGZmKTsgLy8gU3VjY2VzcwoJCQlYODZfQlggJj0gfigweGZmKTsKCQkJcHJpbnRrKEJJT1NfREVCVUcsICJJbnRlZ3JhdGVkIFN5c3RlbSBJbmZvcm1hdGlvblxuIik7CgkJCWJyZWFrOwoJCWNhc2UgMHgwMDoKCQkJWDg2X0FYICY9IH4oMHhmZik7CgkJCVg4Nl9CWCA9IDB4MDA7CgkJCXByaW50ayhCSU9TX0RFQlVHLCAiUGFuZWwgSUQgPSAwXG4iKTsKCQkJYnJlYWs7CgkJY2FzZSAweDA1OgoJCQlYODZfQVggJj0gfigweGZmKTsKCQkJWDg2X0JYID0gMHhmZjsKCQkJcHJpbnRrKEJJT1NfREVCVUcsICJUViA9IG9mZlxuIik7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXJldHVybiAwOwoJCX0KCQlicmVhazsKCWNhc2UgMHg1ZjM1OiAvKiBCb290IERpc3BsYXkgKi8KCQlYODZfQVggPSAweDAwNWY7IC8vIFN1Y2Nlc3MKCQlYODZfQ0wgPSBCT09UX0RJU1BMQVlfREVGQVVMVDsKCQlicmVhazsKCWNhc2UgMHg1ZjQwOiAvKiBCb290IFBhbmVsIFR5cGUgKi8KCQkvLyBNLng4Ni5SX0FYID0gMHgwMTVmOyAvLyBTdXBwb3J0ZWQgYnV0IGZhaWxlZAoJCVg4Nl9BWCA9IDB4MDA1ZjsgLy8gU3VjY2VzcwoJCVg4Nl9DTCA9IDM7IC8vIERpc3BsYXkgSUQKCQlicmVhazsKCWRlZmF1bHQ6CgkJLyogSW50ZXJydXB0IHdhcyBub3QgaGFuZGxlZCAqLwoJCXJldHVybiAwOwoJfQoKCS8qIEludGVycnVwdCBoYW5kbGVkICovCglyZXR1cm4gMTsKfQojZW5kaWYKLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCgogLyoqCiAqIEBicmllZgogKgogKiBAcGFyYW0KICovCgpzdGF0aWMgdTggY2FsY190cmFuZ2UodTggdF9taW4sIHU4IHRfbWF4KSB7CgoJdTggcHJldjsKCWludCBpOwoJaW50IGRpZmYgPSB0X21heCAtIHRfbWluOwoKCS8vIHdhbGsgdGhyb3VnaCB0aGUgdHJhbmdlIHRhYmxlCglmb3IoaSA9IDAsIHByZXYgPSAwOyBpIDwgc2l6ZW9mKHRyYW5nZSkvc2l6ZW9mKGludCk7IGkrKykgewoJCWlmKCB0cmFuZ2VbaV0gPCBkaWZmICkgewoJCQlwcmV2ID0gaTsgLy8gc2F2ZSBsYXN0IHZhbAoJCQljb250aW51ZTsKCQl9CgkJaWYoIGRpZmYgPT0gdHJhbmdlW2ldICkgcmV0dXJuIGk7CgkJaWYoIChkaWZmIC0gdHJhbmdlW3ByZXZdKSA8ICh0cmFuZ2VbaV0gLSBkaWZmKSApIGJyZWFrOyAvLyByZXR1cm4gd2l0aCBsYXN0IHZhbCBpbmRleAoJCXJldHVybiBpOwoJfQoJcmV0dXJuIHByZXY7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIHNpbmEgdXNlcyBTQjYwMCBHUElPOSB0byBkZXRlY3QgSURFX0RNQTY2LgoqIElERV9ETUE2NiBpcyByb3V0ZWQgdG8gR1BJTyA5LiBTbyB3ZSByZWFkIEdwaW8gOSB0bwoqIGdldCB0aGUgY2FibGUgdHlwZSwgNDAgcGluIG9yIDgwIHBpbj8KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIGNhYmxlX2RldGVjdCh2b2lkKQp7CgoJdTggYnl0ZTsKCXN0cnVjdCBkZXZpY2UgKnNtX2RldjsKCXN0cnVjdCBkZXZpY2UgKmlkZV9kZXY7CgoJLyogU01CdXMgTW9kdWxlIGFuZCBBQ1BJIEJsb2NrIChEZXZpY2UgMjAsIEZ1bmN0aW9uIDApIG9uIFNCNjAwICovCglwcmludGsoQklPU19ERUJVRywgIiVzLlxuIiwgX19mdW5jX18pOwoJc21fZGV2ID0gZGV2X2ZpbmRfc2xvdCgwLCBQQ0lfREVWRk4oMHgxNCwgMCkpOwoKCWJ5dGUgPSBwY2lfcmVhZF9jb25maWc4KHNtX2RldiwgMHhBOSk7CglieXRlIHw9ICgxIDw8IDUpOwkvKiBTZXQgR3BpbzkgYXMgaW5wdXQgKi8KCXBjaV93cml0ZV9jb25maWc4KHNtX2RldiwgMHhBOSwgYnl0ZSk7CgoJLyogSURFIENvbnRyb2xsZXIgKERldmljZSAyMCwgRnVuY3Rpb24gMSkgb24gU0I2MDAgKi8KCWlkZV9kZXYgPSBkZXZfZmluZF9zbG90KDAsIFBDSV9ERVZGTigweDE0LCAxKSk7CgoJYnl0ZSA9IHBjaV9yZWFkX2NvbmZpZzgoaWRlX2RldiwgOSk7CglwcmludGsoQklPU19JTkZPLCAiSURFIGNvbnRyb2xsZXIgaW4gJXMgTW9kZVxuIiwgYnl0ZSAmICgxIDw8IDApID8gIk5hdGl2ZSIgOiAiQ29tcGF0aWJpbGl0eSIpOwoKCWJ5dGUgPSBwY2lfcmVhZF9jb25maWc4KGlkZV9kZXYsIDB4NTYpOwoJYnl0ZSAmPSB+KDcgPDwgMCk7CglpZiggcGNpX3JlYWRfY29uZmlnOChzbV9kZXYsIDB4QUEpICYgKDEgPDwgNSkgKQoJCWJ5dGUgfD0gMiA8PCAwOwkvKiBtb2RlIDIgKi8KCWVsc2UKCQlieXRlIHw9IDUgPDwgMDsJLyogbW9kZSA1ICovCglwcmludGsoQklPU19JTkZPLCAiRE1BIG1vZGUgJWQgc2VsZWN0ZWRcbiIsIGJ5dGUgJiAoNyA8PCAwKSk7CglwY2lfd3JpdGVfY29uZmlnOChpZGVfZGV2LCAweDU2LCBieXRlKTsKfQoKLyoqCiAqIEBicmllZiBEZXRlY3QgdGhlIEFEVDc0NzUgZGV2aWNlCiAqCiAqIEBwYXJhbQogKi8KCnN0YXRpYyBjb25zdCBjaGFyICogYWR0NzQ3NV9kZXRlY3QoIHZvaWQgKSB7CgogICAgICAgIGludCB2ZW5kaWQsIGRldmlkLCBkZXZpZDI7CiAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CgogICAgICAgIHZlbmRpZCA9IGFkdDc0NzVfcmVhZF9ieXRlKFJFR19WRU5ESUQpOwogICAgICAgIGRldmlkMiA9IGFkdDc0NzVfcmVhZF9ieXRlKFJFR19ERVZJRDIpOwogICAgICAgIGlmICh2ZW5kaWQgIT0gMHg0MSB8fCAgICAgICAgICAgLyogQW5hbG9nIERldmljZXMgKi8KICAgICAgICAgICAgKGRldmlkMiAmIDB4ZjgpICE9IDB4NjgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOwoJCX0KCiAgICAgICAgZGV2aWQgPSBhZHQ3NDc1X3JlYWRfYnl0ZShSRUdfREVWSUQpOwogICAgICAgIGlmIChkZXZpZCA9PSAweDczKQogICAgICAgICAgICAgICAgbmFtZSA9ICJhZHQ3NDczIjsKICAgICAgICBlbHNlIGlmIChkZXZpZCA9PSAweDc1ICYmIGFkdDc0NzVfYWRkcmVzcyA9PSAweDJlKQogICAgICAgICAgICAgICAgbmFtZSA9ICJhZHQ3NDc1IjsKICAgICAgICBlbHNlIGlmIChkZXZpZCA9PSAweDc2KQogICAgICAgICAgICAgICAgbmFtZSA9ICJhZHQ3NDc2IjsKICAgICAgICBlbHNlIGlmICgoZGV2aWQyICYgMHhmYykgPT0gMHg2YykKICAgICAgICAgICAgICAgIG5hbWUgPSAiYWR0NzQ5MCI7CgogICAgICAgIHJldHVybiBuYW1lOwp9CgovLyB0aGVybWFsIGNvbnRyb2wgZGVmYXVsdHMKY29uc3Qgc3RydWN0IGZhbl9jb250cm9sIGNwdV9mYW5fY29udHJvbF9kZWZhdWx0cyA9IHsKCS5lbmFibGUgPSAwLCAvLyBkaXNhYmxlIGJ5IGRlZmF1bHQKCS5wb2xhcml0eSA9IDAsIC8vIGhpZ2ggYnkgZGVmYXVsdAoJLnRfbWluID0gMywgLy8gZGVmYXVsdCA9IDQ1sEMKCS50X21heCA9IDcsIC8vIDY1sEMKCS5wd21fbWluID0gMSwgLy8gZGVmYXVsdCBkdXR5Y3ljbGUgPSAzMCUKCS5wd21fbWF4ID0gMTMsIC8vIDkwJQp9Owpjb25zdCBzdHJ1Y3QgZmFuX2NvbnRyb2wgY2FzZV9mYW5fY29udHJvbF9kZWZhdWx0cyA9IHsKCS5lbmFibGUgPSAwLCAvLyBkaXNhYmxlIGJ5IGRlZmF1bHQKCS5wb2xhcml0eSA9IDAsIC8vIGhpZ2ggYnkgZGVmYXVsdAoJLnRfbWluID0gMiwgLy8gZGVmYXVsdCA9IDQwsEMKCS50X21heCA9IDgsIC8vIDcwsEMKCS5wd21fbWluID0gMCwgLy8gZGVmYXVsdCBkdXR5Y3ljbGUgPSAyNSUKCS5wd21fbWF4ID0gMTMsIC8vIDkwJQp9OwoKc3RhdGljIHZvaWQgcG1faW5pdCggdm9pZCApCnsKCXUxNiB3b3JkOwoJdTggYnl0ZTsKCWRldmljZV90IHNtX2RldiA9IGRldl9maW5kX3Nsb3QoMCwgUENJX0RFVkZOKDB4MTQsIDApKTsKCgkvKiBzZXQgU0I2MDAgR1BJTyA2NCB0byBHUElPIHdpdGggcHVsbC11cCAqLwoJYnl0ZSA9IHBtMl9pb3JlYWQoMHg0Mik7CglieXRlICY9IDB4M2Y7CglwbTJfaW93cml0ZSgweDQyLCBieXRlKTsKCgkvKiBzZXQgR1BJTyA2NCB0byB0cmlzdGF0ZSAqLwoJd29yZCA9IHBjaV9yZWFkX2NvbmZpZzE2KHNtX2RldiwgMHg1Nik7Cgl3b3JkIHw9IDEgPDwgNzsKCXBjaV93cml0ZV9jb25maWcxNihzbV9kZXYsIDB4NTYsIHdvcmQpOwoKCS8qIHNldCBHUElPIDY0IGludGVybmFsIHB1bGwtdXAgKi8KCWJ5dGUgPSBwbTJfaW9yZWFkKDB4ZjApOwoJYnl0ZSAmPSAweGVlOwoJcG0yX2lvd3JpdGUoMHhmMCwgYnl0ZSk7CgoJLyogc2V0IFRhbGVydCB0byBiZSBhY3RpdmUgbG93ICovCglieXRlID0gcG1faW9yZWFkKDB4NjcpOwoJYnl0ZSAmPSB+KDEgPDwgNSk7CglwbV9pb3dyaXRlKDB4NjcsIGJ5dGUpOwoKCS8qIHNldCBUYWxlcnQgdG8gZ2VuZXJhdGUgQUNQSSBldmVudCAqLwoJYnl0ZSA9IHBtX2lvcmVhZCgweDNjKTsKCWJ5dGUgJj0gMHhmMzsKCXBtX2lvd3JpdGUoMHgzYywgYnl0ZSk7CgoJLyogc2V0IEdQTTUgdG8gbm90IHdha2UgZnJvbSBzNSAqLwoJYnl0ZSA9IHBtX2lvcmVhZCgweDc3KTsKCWJ5dGUgJj0gfigxIDw8IDUpOwoJcG1faW93cml0ZSgweDc3LCBieXRlKTsKfQoKIC8qKgogKiBAYnJpZWYgU2V0dXAgdGhlcm1hbCBjb25maWcgb24gU0lOQSBNYWluYm9hcmQKICoKICogQHBhcmFtCiAqLwoKc3RhdGljIHZvaWQgc2V0X3RoZXJtYWxfY29uZmlnKHZvaWQpCnsKCXU4IGJ5dGUsIGJ5dGUyOwoJdTggY3B1X3B3bV9jb25mLCBjYXNlX3B3bV9jb25mOwoJZGV2aWNlX3Qgc21fZGV2OwoJc3RydWN0IGZhbl9jb250cm9sIGNwdV9mYW5fY29udHJvbCwgY2FzZV9mYW5fY29udHJvbDsKCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwoKCglzbV9kZXYgPSBkZXZfZmluZF9zbG90KDAsIFBDSV9ERVZGTigweDE0LCAwKSk7CglzbWJ1c19pb19iYXNlID0gcGNpX3JlYWRfY29uZmlnMzIoc21fZGV2LCAweDEwKSAmIH4oMHhmKTsgLy8gZ2V0IEJBUjAtQWRkcmVzcyB3aGljaCBob2xkcyB0aGUgU01CVVNfSU9fQkFTRQoKCWlmKCAobmFtZSA9IGFkdDc0NzVfZGV0ZWN0KCkpID09IE5VTEwgKSB7CgkJcHJpbnRrKEJJT1NfTk9USUNFLCAiQ291bGRuJ3QgZGV0ZWN0IGFuIEFEVDc0NzMvNzUvNzYvOTAgcGFydCBhdCAleDoleFxuIiwgc21idXNfaW9fYmFzZSwgYWR0NzQ3NV9hZGRyZXNzKTsKCQlyZXR1cm47Cgl9CglwcmludGsoQklPU19ERUJVRywgIkZvdW5kICVzIHBhcnQgYXQgJXg6JXhcbiIsIG5hbWUsIHNtYnVzX2lvX2Jhc2UsIGFkdDc0NzVfYWRkcmVzcyk7CgoJY3B1X2Zhbl9jb250cm9sID0gY3B1X2Zhbl9jb250cm9sX2RlZmF1bHRzOwoJY2FzZV9mYW5fY29udHJvbCA9IGNhc2VfZmFuX2NvbnRyb2xfZGVmYXVsdHM7CgoJaWYoIGdldF9vcHRpb24oJmJ5dGUsICJjcHVfZmFuX2NvbnRyb2wiKSA9PSAtNCApIHsKCQlwcmludGsoQklPU19XQVJOSU5HLCAiJXM6IENNT1MgY2hlY2tzdW0gaW52YWxpZCwga2VlcGluZyBkZWZhdWx0IHZhbHVlc1xuIixfX2Z1bmNfXyk7Cgl9IGVsc2UgewoJCS8vIGdldCBhbGwgdGhlIG9wdGlvbnMgbmVlZGVkCgkJaWYoIGdldF9vcHRpb24oJmJ5dGUsICJjcHVfZmFuX2NvbnRyb2wiKSA9PSAwICkKCQkJY3B1X2Zhbl9jb250cm9sLmVuYWJsZSA9IGJ5dGUgPyAxIDogMDsKCgkJZ2V0X29wdGlvbigmY3B1X2Zhbl9jb250cm9sLnBvbGFyaXR5LCAiY3B1X2Zhbl9wb2xhcml0eSIpOwoJCWdldF9vcHRpb24oJmNwdV9mYW5fY29udHJvbC50X21pbiwgImNwdV90X21pbiIpOwoJCWdldF9vcHRpb24oJmNwdV9mYW5fY29udHJvbC50X21heCwgImNwdV90X21heCIpOwoJCWdldF9vcHRpb24oJmNwdV9mYW5fY29udHJvbC5wd21fbWluLCAiY3B1X2R1dHljeWNsZV9taW4iKTsKCQlnZXRfb3B0aW9uKCZjcHVfZmFuX2NvbnRyb2wucHdtX21heCwgImNwdV9kdXR5Y3ljbGVfbWF4Iik7CgoJCWlmKCBnZXRfb3B0aW9uKCZieXRlLCAiY2hhc3Npc19mYW5fY29udHJvbCIpID09IDApCgkJCWNhc2VfZmFuX2NvbnRyb2wuZW5hYmxlID0gYnl0ZSA/IDEgOiAwOwoJCWdldF9vcHRpb24oJmNhc2VfZmFuX2NvbnRyb2wucG9sYXJpdHksICJjaGFzc2lzX2Zhbl9wb2xhcml0eSIpOwoJCWdldF9vcHRpb24oJmNhc2VfZmFuX2NvbnRyb2wudF9taW4sICJjaGFzc2lzX3RfbWluIik7CgkJZ2V0X29wdGlvbigmY2FzZV9mYW5fY29udHJvbC50X21heCwgImNoYXNzaXNfdF9tYXgiKTsKCQlnZXRfb3B0aW9uKCZjYXNlX2Zhbl9jb250cm9sLnB3bV9taW4sICJjaGFzc2lzX2R1dHljeWNsZV9taW4iKTsKCQlnZXRfb3B0aW9uKCZjYXNlX2Zhbl9jb250cm9sLnB3bV9tYXgsICJjaGFzc2lzX2R1dHljeWNsZV9tYXgiKTsKCgl9CgoJcHJpbnRrKEJJT1NfREVCVUcsICJjcHVfZmFuX2NvbnRyb2w6JXMiLCBjcHVfZmFuX2NvbnRyb2wuZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOwoJcHJpbnRrKEJJT1NfREVCVUcsICIgY3B1X2Zhbl9wb2xhcml0eTolcyIsIGNwdV9mYW5fY29udHJvbC5wb2xhcml0eSA/ICJsb3ciIDogImhpZ2giKTsKCglwcmludGsoQklPU19ERUJVRywgIiBjcHVfdF9taW46JXMiLCBURU1QRVJBVFVSRV9JTkZPKGNwdV9mYW5fY29udHJvbC50X21pbikpOwoJY3B1X2Zhbl9jb250cm9sLnRfbWluID0gVEVNUEVSQVRVUkUoY3B1X2Zhbl9jb250cm9sLnRfbWluLCBjcHVfZmFuX2NvbnRyb2xfZGVmYXVsdHMudF9taW4pOwoKCXByaW50ayhCSU9TX0RFQlVHLCAiIGNwdV90X21heDolcyIsIFRFTVBFUkFUVVJFX0lORk8oY3B1X2Zhbl9jb250cm9sLnRfbWF4KSk7CgljcHVfZmFuX2NvbnRyb2wudF9tYXggPSBURU1QRVJBVFVSRShjcHVfZmFuX2NvbnRyb2wudF9tYXgsIGNwdV9mYW5fY29udHJvbF9kZWZhdWx0cy50X21heCk7CgoJcHJpbnRrKEJJT1NfREVCVUcsICIgY3B1X3B3bV9taW46JXMiLCBEVVRZQ1lDTEVfSU5GTyhjcHVfZmFuX2NvbnRyb2wucHdtX21pbikpOwoJY3B1X2Zhbl9jb250cm9sLnB3bV9taW4gPSBEVVRZQ1lDTEUoY3B1X2Zhbl9jb250cm9sLnB3bV9taW4sIGNwdV9mYW5fY29udHJvbF9kZWZhdWx0cy5wd21fbWluKTsKCglwcmludGsoQklPU19ERUJVRywgIiBjcHVfcHdtX21heDolcyIsIERVVFlDWUNMRV9JTkZPKGNwdV9mYW5fY29udHJvbC5wd21fbWF4KSk7CgljcHVfZmFuX2NvbnRyb2wucHdtX21heCA9IERVVFlDWUNMRShjcHVfZmFuX2NvbnRyb2wucHdtX21heCwgY3B1X2Zhbl9jb250cm9sX2RlZmF1bHRzLnB3bV9tYXgpOwoKCWNwdV9mYW5fY29udHJvbC50X3JhbmdlID0gY2FsY190cmFuZ2UoY3B1X2Zhbl9jb250cm9sLnRfbWluLCBjcHVfZmFuX2NvbnRyb2wudF9tYXgpOwoJcHJpbnRrKEJJT1NfREVCVUcsICIgY3B1X3RfcmFuZ2U6MHglMDJ4XG4iLCBjcHVfZmFuX2NvbnRyb2wudF9yYW5nZSk7CgljcHVfZmFuX2NvbnRyb2wudF9yYW5nZSA8PD0gNDsKCWNwdV9mYW5fY29udHJvbC50X3JhbmdlIHw9ICg0IDw8IDApOyAvLyAzNS4zSHoKCglwcmludGsoQklPU19ERUJVRywgImNoYXNzaXNfZmFuX2NvbnRyb2w6JXMiLCBjYXNlX2Zhbl9jb250cm9sLmVuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKCXByaW50ayhCSU9TX0RFQlVHLCAiIGNoYXNzaXNfZmFuX3BvbGFyaXR5OiVzIiwgY2FzZV9mYW5fY29udHJvbC5wb2xhcml0eSA/ICJsb3ciIDogImhpZ2giKTsKCglwcmludGsoQklPU19ERUJVRywgIiBjaGFzc2lzX3RfbWluOiVzIiwgVEVNUEVSQVRVUkVfSU5GTyhjYXNlX2Zhbl9jb250cm9sLnRfbWluKSk7CgljYXNlX2Zhbl9jb250cm9sLnRfbWluID0gVEVNUEVSQVRVUkUoY2FzZV9mYW5fY29udHJvbC50X21pbiwgY2FzZV9mYW5fY29udHJvbF9kZWZhdWx0cy50X21pbik7CgoJcHJpbnRrKEJJT1NfREVCVUcsICIgY2hhc3Npc190X21heDolcyIsIFRFTVBFUkFUVVJFX0lORk8oY2FzZV9mYW5fY29udHJvbC50X21heCkpOwoJY2FzZV9mYW5fY29udHJvbC50X21heCA9IFRFTVBFUkFUVVJFKGNhc2VfZmFuX2NvbnRyb2wudF9tYXgsIGNhc2VfZmFuX2NvbnRyb2xfZGVmYXVsdHMudF9tYXgpOwoKCXByaW50ayhCSU9TX0RFQlVHLCAiIGNoYXNzaXNfcHdtX21pbjolcyIsIERVVFlDWUNMRV9JTkZPKGNhc2VfZmFuX2NvbnRyb2wucHdtX21pbikpOwoJY2FzZV9mYW5fY29udHJvbC5wd21fbWluID0gRFVUWUNZQ0xFKGNhc2VfZmFuX2NvbnRyb2wucHdtX21pbiwgY2FzZV9mYW5fY29udHJvbF9kZWZhdWx0cy5wd21fbWluKTsKCglwcmludGsoQklPU19ERUJVRywgIiBjaGFzc2lzX3B3bV9tYXg6JXMiLCBEVVRZQ1lDTEVfSU5GTyhjYXNlX2Zhbl9jb250cm9sLnB3bV9tYXgpKTsKCWNhc2VfZmFuX2NvbnRyb2wucHdtX21heCA9IERVVFlDWUNMRShjYXNlX2Zhbl9jb250cm9sLnB3bV9tYXgsIGNhc2VfZmFuX2NvbnRyb2xfZGVmYXVsdHMucHdtX21heCk7CgoJY2FzZV9mYW5fY29udHJvbC50X3JhbmdlID0gY2FsY190cmFuZ2UoY2FzZV9mYW5fY29udHJvbC50X21pbiwgY2FzZV9mYW5fY29udHJvbC50X21heCk7CglwcmludGsoQklPU19ERUJVRywgIiBjYXNlX3RfcmFuZ2U6MHglMDJ4XG4iLCBjYXNlX2Zhbl9jb250cm9sLnRfcmFuZ2UpOwoJY2FzZV9mYW5fY29udHJvbC50X3JhbmdlIDw8PSA0OwoJY2FzZV9mYW5fY29udHJvbC50X3JhbmdlIHw9ICg0IDw8IDApOyAvLyAzNS4zSHoKCgljcHVfcHdtX2NvbmYgPSAoKChjcHVfZmFuX2NvbnRyb2wucG9sYXJpdHkgJiAweDEpIDw8IDQpIHwgMHgyKTsgLy8gYml0IDQgY29udHJvbCBwb2xhcml0eSBvZiBQV014IG91dHB1dAoJY2FzZV9wd21fY29uZiA9ICgoKGNhc2VfZmFuX2NvbnRyb2wucG9sYXJpdHkgJiAweDEpIDw8IDQpIHwgMHgyKTsgLy8gYml0IDQgY29udHJvbCBwb2xhcml0eSBvZiBQV014IG91dHB1dAoJY3B1X3B3bV9jb25mIHw9IGNwdV9mYW5fY29udHJvbC5lbmFibGUgPyAoMCA8PCA1KSA6ICg3IDw8IDUpOyAgLy8gbWFudWFsIGNvbnRyb2wKCWNhc2VfcHdtX2NvbmYgfD0gY2FzZV9mYW5fY29udHJvbC5lbmFibGUgPyAoMSA8PCA1KSA6ICg3IDw8IDUpOyAvLyBsb2NhbCB0ZW1wCgoJLyogc2V0IGFkdDc0NzUgKi8KCglhZHQ3NDc1X3dyaXRlX2J5dGUoUkVHX0NPTkZJRzEsIDB4MDQpOyAgLy8gY2xlYXIgcmVnaXN0ZXIsIGJpdCAyIGlzIHJlYWQgb25seQoKCS8qIENvbmZpZyBSZWdpc3RlciA2OiAgKi8KCWFkdDc0NzVfd3JpdGVfYnl0ZShSRUdfQ09ORklHNiwgMHgwMCk7CgkvKiBDb25maWcgUmVnaXN0ZXIgNyAqLwoJYWR0NzQ3NV93cml0ZV9ieXRlKFJFR19DT05GSUc3LCAweDAwKTsKCgkvKiBDb25maWcgUmVnaXN0ZXIgNTogKi8KCS8qIHNldCBPZmZzZXQgNjQgZm9ybWF0LCBlbmFibGUgVEhFUk0gb24gUmVtb3RlIDEmIExvY2FsICovCglhZHQ3NDc1X3dyaXRlX2J5dGUoUkVHX0NPTkZJRzUsIFRXT1NfQ09NUEwgPyAweDYxIDogMHg2MCk7CgkvKiBObyBvZmZzZXQgZm9yIHJlbW90ZSAxICovCglhZHQ3NDc1X3dyaXRlX2J5dGUoVEVNUF9PRkZTRVRfUkVHKDApLCAweDAwKTsKCS8qIE5vIG9mZnNldCBmb3IgbG9jYWwgKi8KCWFkdDc0NzVfd3JpdGVfYnl0ZShURU1QX09GRlNFVF9SRUcoMSksIDB4MDApOwoJLyogTm8gb2Zmc2V0IGZvciByZW1vdGUgMiAqLwoJYWR0NzQ3NV93cml0ZV9ieXRlKFRFTVBfT0ZGU0VUX1JFRygyKSwgMHgwMCk7CgoJLyogcmVtb3RlIDEgbG93IHRlbXAgbGltaXQgKi8KCWFkdDc0NzVfd3JpdGVfYnl0ZShURU1QX01JTl9SRUcoMCksIDB4MDApOwoJLyogcmVtb3RlIDEgSGlnaCB0ZW1wIGxpbWl0ICAgICg5MEMpICovCglhZHQ3NDc1X3dyaXRlX2J5dGUoVEVNUF9NQVhfUkVHKDApLCAweDlhKTsKCgkvKiBsb2NhbCBMb3cgVGVtcCBMaW1pdCAqLwoJYWR0NzQ3NV93cml0ZV9ieXRlKFRFTVBfTUlOX1JFRygxKSwgMHgwMCk7CgkvKiBsb2NhbCBIaWdoIExpbWl0ICAgICg5MEMpICovCglhZHQ3NDc1X3dyaXRlX2J5dGUoVEVNUF9NQVhfUkVHKDEpLCAweDlhKTsKCgkvKiAgcmVtb3RlIDEgdGhlcm0gdGVtcCBsaW1pdCAgICAoOTVDKSAqLwoJYWR0NzQ3NV93cml0ZV9ieXRlKFRFTVBfVEhFUk1fUkVHKDApLCAweDlmKTsKCS8qIGxvY2FsIHRoZXJtIHRlbXAgbGltaXQgICAgKDk1QykgKi8KCWFkdDc0NzVfd3JpdGVfYnl0ZShURU1QX1RIRVJNX1JFRygxKSwgMHg5Zik7CgoJLyogUFdNIDEgY29uZmlndXJhdGlvbiByZWdpc3RlciAgICBDUFUgZmFuIGNvbnRyb2xsZWQgYnkgQ1BVIFRoZXJtYWwgRGlvZGUgKi8KCWFkdDc0NzVfd3JpdGVfYnl0ZShQV01fQ09ORklHX1JFRygwKSwgY3B1X3B3bV9jb25mKTsKCS8qIFBXTSAzIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgICAgQ2FzZSBmYW4gY29udHJvbGxlZCBieSBBRFR4eHh4IHRlbXAgKi8KCWFkdDc0NzVfd3JpdGVfYnl0ZShQV01fQ09ORklHX1JFRygyKSwgY2FzZV9wd21fY29uZik7CgoJaWYoIGNwdV9mYW5fY29udHJvbC5lbmFibGUgKSB7CgkJLyogUFdNIDEgbWluaW11bSBkdXR5IGN5Y2xlICAgICAoMzclKSAqLwoJCWFkdDc0NzVfd3JpdGVfYnl0ZShQV01fTUlOX1JFRygwKSwgY3B1X2Zhbl9jb250cm9sLnB3bV9taW4pOwoJCS8qIFBXTSAxIE1heGltdW0gZHV0eSBjeWNsZSAgICAoMTAwJSkgKi8KCQlhZHQ3NDc1X3dyaXRlX2J5dGUoUFdNX01BWF9SRUcoMCksIGNwdV9mYW5fY29udHJvbC5wd21fbWF4KTsKCQkvKiAgUmVtb3RlIDEgdGVtcGVyYXR1cmUgVG1pbiAgICAgKDMyQykgKi8KCQlhZHQ3NDc1X3dyaXRlX2J5dGUoVEVNUF9UTUlOX1JFRygwKSwgY3B1X2Zhbl9jb250cm9sLnRfbWluKTsKCQkvKiByZW1vdGUgMSBUcmFuZ2UgICAgICAgICAgICAoNTNDIHJhbXAgcmFuZ2UpICovCgkJYWR0NzQ3NV93cml0ZV9ieXRlKFRFTVBfVFJBTkdFX1JFRygwKSwgY3B1X2Zhbl9jb250cm9sLnRfcmFuZ2UpOwoJfSBlbHNlIHsKCQlhZHQ3NDc1X3dyaXRlX2J5dGUoUFdNX1JFRygwKSwgY3B1X2Zhbl9jb250cm9sLnB3bV9tYXgpOwoJfQoKCWlmKCBjYXNlX2Zhbl9jb250cm9sLmVuYWJsZSApIHsKCQkvKiBQV00gMiBtaW5pbXVtIGR1dHkgY3ljbGUgICAgICgzNyUpICovCgkJYWR0NzQ3NV93cml0ZV9ieXRlKFBXTV9NSU5fUkVHKDIpLCBjYXNlX2Zhbl9jb250cm9sLnB3bV9taW4pOwoJCS8qIFBXTSAyIE1heGltdW0gRHV0eSBDeWNsZSAgICAoMTAwJSkgKi8KCQlhZHQ3NDc1X3dyaXRlX2J5dGUoUFdNX01BWF9SRUcoMiksIGNhc2VfZmFuX2NvbnRyb2wucHdtX21heCk7CgkJLyogbG9jYWwgdGVtcGVyYXR1cmUgVG1pbiAgICAgKDMyQykgKi8KCQlhZHQ3NDc1X3dyaXRlX2J5dGUoVEVNUF9UTUlOX1JFRygxKSwgY2FzZV9mYW5fY29udHJvbC50X21pbik7CgkJLyogbG9jYWwgVHJhbmdlICAgICAgICAgICAgKDUzQyByYW1wIHJhbmdlKSAqLwoJCWFkdDc0NzVfd3JpdGVfYnl0ZShURU1QX1RSQU5HRV9SRUcoMSksIGNhc2VfZmFuX2NvbnRyb2wudF9yYW5nZSk7IC8vIExvY2FsIFRSYW5nZQoJCWFkdDc0NzVfd3JpdGVfYnl0ZShURU1QX1RSQU5HRV9SRUcoMiksIGNhc2VfZmFuX2NvbnRyb2wudF9yYW5nZSk7IC8vIFBXTTIgRnJlcQoJfSBlbHNlIHsKCQlhZHQ3NDc1X3dyaXRlX2J5dGUoUFdNX1JFRygyKSwgY2FzZV9mYW5fY29udHJvbC5wd21fbWF4KTsKCX0KCgkvKiBDb25maWcgUmVnaXN0ZXIgMyAtIGVuYWJsZSBzbWJhbGVydCAmIHRoZXJtICovCglhZHQ3NDc1X3dyaXRlX2J5dGUoMHg3OCwgMHgwMyk7CgkvKiBDb25maWcgUmVnaXN0ZXIgNCAtIGVuYWJsZSB0aGVybSBvdXRwdXQgKi8KCWFkdDc0NzVfd3JpdGVfYnl0ZSgweDdkLCAweDA5KTsKCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyIDIgLSBNYXNrIFNNQiBhbGVydCBmb3IgVGhlcm0gQ29uZGl0aW9ucywgRmFuIDMgZmF1bHQsIFNtYkFsZXJ0IEZhbiBmb3IgVGhlcm0gVGltZXIgZXZlbnQgKi8KCWFkdDc0NzVfd3JpdGVfYnl0ZSgweDc1LCAweDJlKTsKCgkvKiBDb25maWcgUmVnaXN0ZXIgMSBTZXQgU3RhcnQgYml0ICovCglhZHQ3NDc1X3dyaXRlX2J5dGUoMHg0MCwgMHgwNSk7CgoJLyogUmVhZCBzdGF0dXMgcmVnaXN0ZXIgdG8gY2xlYXIgYW55IG9sZCBlcnJvcnMgKi8KCWJ5dGUyID0gYWR0NzQ3NV9yZWFkX2J5dGUoMHg0Mik7CglieXRlID0gYWR0NzQ3NV9yZWFkX2J5dGUoMHg0MSk7CgoJcHJpbnRrKEJJT1NfREVCVUcsICJJbml0ICdUaGVybWFsIE1vbml0b3InIGVuZCAsIHN0YXR1cyAweDQyID0gMHglMDJ4LCBzdGF0dXMgMHg0MSA9IDB4JTAyeFxuIiwKCQkgICAgYnl0ZTIsIGJ5dGUpOwoKfQoKIC8qKgogKiBAYnJpZWYKICoKICogQHBhcmFtCiAqLwoKc3RhdGljIHZvaWQgcGF0Y2hfbW1pb19ub25wb3N0ZWQoIHZvaWQgKQp7Cgl1bnNpZ25lZCByZWcsIGluZGV4OwoJcmVzb3VyY2VfdCByYmFzZSwgcmVuZDsKCXUzMiBiYXNlLCBsaW1pdDsKCXN0cnVjdCByZXNvdXJjZSAqcmVzb3VyY2U7CglkZXZpY2VfdCBkZXY7CglkZXZpY2VfdCBrOF9mMSA9IGRldl9maW5kX3Nsb3QoMCwgUENJX0RFVkZOKDB4MTgsMSkpOwoKCXByaW50ayhCSU9TX0RFQlVHLCIlcyAuLi5cbiIsIF9fZnVuY19fKTsKCglkZXYgPSBkZXZfZmluZF9zbG90KDEsIFBDSV9ERVZGTig1LDApKTsKCS8vIHRoZSB1bWEgZnJhbWUgYnVmZmVyCglpbmRleCA9IDB4MTA7CglyZXNvdXJjZSA9IHByb2JlX3Jlc291cmNlKGRldiwgaW5kZXgpOwoJaWYoIHJlc291cmNlICkgewoJCS8vIGZpeHVwIHJlc291cmNlIG5vbnBvc3RlZCBpbiBrOCBtbWlvCgkJLyogR2V0IHRoZSBiYXNlIGFkZHJlc3MgKi8KCQlyYmFzZSA9IChyZXNvdXJjZS0+YmFzZSA+PiA4KSAmIH4oMHhmZik7CgkJLyogR2V0IHRoZSBsaW1pdCAocm91bmRlZCB1cCkgKi8KCQlyZW5kICA9IChyZXNvdXJjZV9lbmQocmVzb3VyY2UpID4+IDgpICYgfigweGZmKTsKCgkJcHJpbnRrKEJJT1NfREVCVUcsIiVzICV4IGJhc2UgPSAlMGxseCBsaW1pdCA9ICUwbGx4XG4iLCBkZXZfcGF0aChkZXYpLCBpbmRleCwgcmJhc2UsIHJlbmQpOwoKCQlmb3IoIHJlZyA9IDB4Yjg7IHJlZyA+PSAweDgwOyByZWcgLT0gOCApIHsKCQkJYmFzZSA9IHBjaV9yZWFkX2NvbmZpZzMyKGs4X2YxLHJlZyk7CgkJCWxpbWl0ID0gcGNpX3JlYWRfY29uZmlnMzIoazhfZjEscmVnKzQpOwoJCQlwcmludGsoQklPU19ERUJVRywiICUwMnhbJTA4eF0gJTAyeFslMDh4XSIsIHJlZywgYmFzZSwgcmVnKzQsIGxpbWl0KTsKCQkJaWYoICgoYmFzZSAmIH4oMHhmZikpID09IHJiYXNlKSAmJiAoKGxpbWl0ICYgfigweGZmKSkgPT0gcmVuZCkgKSB7CgkJCQlsaW1pdCB8PSAoMSA8PCA3KTsKCQkJCXByaW50ayhCSU9TX0RFQlVHLCAiXG5QYXRjaGluZyAlcyAleCA8LSAlMDh4IiwgZGV2X3BhdGgoazhfZjEpLCByZWcsIGxpbWl0KTsKCQkJCXBjaV93cml0ZV9jb25maWczMihrOF9mMSwgcmVnKzQsIGxpbWl0KTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCXByaW50ayhCSU9TX0RFQlVHLCAiXG4iKTsKCX0KfQoKIC8qKgogKiBAYnJpZWYKICoKICogQHBhcmFtCiAqLwoKc3RydWN0IHsKCXVuc2lnbmVkIGludCBidXM7Cgl1bnNpZ25lZCBpbnQgZGV2Zm47Cn0gc2xvdFtdID0gewoJezAsIFBDSV9ERVZGTigwLDApfSwKCXswLCBQQ0lfREVWRk4oMTgsMCl9LAoJezAsIFBDSV9ERVZGTigxOSwwKX0sezAsIFBDSV9ERVZGTigxOSwxKX0sezAsIFBDSV9ERVZGTigxOSwyKX0sezAsIFBDSV9ERVZGTigxOSwzKX0sezAsIFBDSV9ERVZGTigxOSw0KX0sezAsIFBDSV9ERVZGTigxOSw1KX0sCgl7MCwgUENJX0RFVkZOKDIwLDApfSx7MCwgUENJX0RFVkZOKDIwLDEpfSx7MCwgUENJX0RFVkZOKDIwLDIpfSx7MCwgUENJX0RFVkZOKDIwLDMpfSx7MCwgUENJX0RFVkZOKDIwLDUpfSx7MCwgUENJX0RFVkZOKDIwLDYpfSwKCXswLCBQQ0lfREVWRk4oNSwwKX0sezAsIFBDSV9ERVZGTig1LDIpfSwKCXsyNTUsMH0sCn07CgoKdW5zaWduZWQgaW50IHBseF9wcmVzZW50ID0gMDsKCnN0YXRpYyB2b2lkIHVwZGF0ZV9zdWJzeXN0ZW1pZCggZGV2aWNlX3QgZGV2ICkKewoJaW50IGk7CgoJZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID0gMHgxMTBhOwoJaWYoIHBseF9wcmVzZW50ICl7CgkJZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID0gMHg0MDc2OyAvLyBVMVAxID0gMHg0MDc2LCBVMVAwID0gMHg0MDc3Cgl9IGVsc2UgewoJCWRldi0+c3Vic3lzdGVtX2RldmljZSA9IDB4NDA3NzsgLy8gVTFQMCA9IDB4NDA3NwoJfQoJcHJpbnRrKEJJT1NfSU5GTywgIiVzIFsleC8leF1cbiIsIGRldl9uYW1lKGRldiksIGRldi0+c3Vic3lzdGVtX3ZlbmRvciwgZGV2LT5zdWJzeXN0ZW1fZGV2aWNlICk7Cglmb3IoIGk9MDsgc2xvdFtpXS5idXMgPCAyNTU7IGkrKykgewoJCWRldmljZV90IGQ7CgkJZCA9IGRldl9maW5kX3Nsb3Qoc2xvdFtpXS5idXMsc2xvdFtpXS5kZXZmbik7CgkJaWYoIGQgKSB7CgkJCXByaW50ayhCSU9TX0RFQlVHLCIlcyBzdWJzeXN0ZW0gPC0gJXgvJXhcbiIsIGRldl9wYXRoKGQpLCBkZXYtPnN1YnN5c3RlbV92ZW5kb3IsIGRldi0+c3Vic3lzdGVtX2RldmljZSk7CgkJCWQtPnN1YnN5c3RlbV9kZXZpY2UgPSBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CgkJfQoJfQp9CgogLyoqCiAqIEBicmllZgogKgogKiBAcGFyYW0KICovCgpzdGF0aWMgdm9pZCBkZXRlY3RfaHdfdmFyaWFudCggZGV2aWNlX3QgZGV2ICkKewoKCWRldmljZV90IG5iX2RldiA9MCwgZGV2MiA9IDA7CglzdHJ1Y3Qgc291dGhicmlkZ2VfYW1kX3JzNjkwX2NvbmZpZyAqY2ZnOwoJdTMyIGxjX3N0YXRlLCBpZCA9IDA7CgoJcHJpbnRrKEJJT1NfSU5GTywgIlNjYW4gZm9yIFBMWCBkZXZpY2UgLi4uXG4iKTsKCW5iX2RldiA9IGRldl9maW5kX3Nsb3QoMCwgUENJX0RFVkZOKDAsIDApKTsKCWlmICghbmJfZGV2KSB7CgkJZGllKCJDQU4gTk9UIEZJTkQgUlM2OTAgREVWSUNFLCBIQUxUIVxuIik7CgkJLyogTk9UIFJFQUNIRUQgKi8KCX0KCglkZXYyID0gZGV2X2ZpbmRfc2xvdCgwLCBQQ0lfREVWRk4oMiwgMCkpOwoJaWYgKCFkZXYyKSB7CgkJZGllKCJDQU4gTk9UIEZJTkQgR0ZYIERFVklDRSAyLCBIQUxUIVxuIik7CgkJLyogTk9UIFJFQUNIRUQgKi8KCX0KCVBjaWVSZWxlYXNlUG9ydFRyYWluaW5nKG5iX2RldiwgZGV2MiwgMik7IC8vIHdlIGFzc3VtZSBQTFggaXMgY29ubmVjdGVkIHRvIHBvcnQgMgoKCW1kZWxheSg0MCk7CglsY19zdGF0ZSA9IG5icGNpZV9wX3JlYWRfaW5kZXgoZGV2MiwgMHhhNSk7CS8qIGxjX3N0YXRlICovCglwcmludGsoQklPU19ERUJVRywgImxjIGN1cnJlbnQgc3RhdGU9JXhcbiIsIGxjX3N0YXRlKTsKCS8qIExDX0NVUlJFTlRfU1RBVEUgPSBiaXQwLTUgKi8KCXN3aXRjaCggbGNfc3RhdGUgJiAweDNmICl7CgljYXNlIDB4MDA6CgljYXNlIDB4MDE6CgljYXNlIDB4MDI6CgljYXNlIDB4MDM6CgljYXNlIDB4MDQ6CgkJcHJpbnRrKEJJT1NfTk9USUNFLCAiTm8gZGV2aWNlIHByZXNlbnQsIHNraXBwaW5nIFBMWCBzY2FuIC4uXG4iKTsKCQlicmVhazsKCWNhc2UgMHgwNzoKCWNhc2UgMHgxMDoKCXsKCQlzdHJ1Y3QgZGV2aWNlIGR1bW15OwoJCXUzMiBwY2lfcHJpbWFyeV9idXMsIGJ1c2VzOwoJCXUxNiBzZWNvbmRhcnksIHN1Ym9yZGluYXRlOwoKCQlwcmludGsoQklPU19ERUJVRywgIlNjYW4gZm9yIFBMWCBicmlkZ2UgYmVoaW5kICVzWyV4XVxuIiwgZGV2X3BhdGgoZGV2MiksIHBjaV9yZWFkX2NvbmZpZzMyKGRldjIsIFBDSV9WRU5ET1JfSUQpKTsKCQkvLyBzYXZlIHRoZSBleGlzdGluZyBwcmltYXJ5L3NlY29uZGFyeS9zdWJvcmRpbmF0ZSBidXMgbnVtYmVyIGNvbmZpZ3VyYXRpb24uCgkJc2Vjb25kYXJ5ID0gZGV2Mi0+YnVzLT5zZWNvbmRhcnk7CgkJc3Vib3JkaW5hdGUgPSBkZXYyLT5idXMtPnN1Ym9yZGluYXRlOwoJCWJ1c2VzID0gcGNpX3ByaW1hcnlfYnVzID0gcGNpX3JlYWRfY29uZmlnMzIoZGV2MiwgUENJX1BSSU1BUllfQlVTKTsKCgkJLy8gQ29uZmlndXJlIHRoZSBidXMgbnVtYmVycyBmb3IgdGhpcyBicmlkZ2UKCQkvLyBidXMgbnVtYmVyIDEgaXMgZm9yIGludGVybmFsIGdmeCBkZXZpY2UsIHNvIHdlIHN0YXJ0IHdpdGggYnVzbnVtYmVyIDIKCgkJYnVzZXMgJj0gMHhmZjAwMDAwMDsKCQlidXNlcyB8PSAoKDIgPDwgOCkgfCAoMHhmZiA8PCAxNikpOwoJCS8vIHNldHVwIHRoZSBidXNlcyBpbiBkZXZpY2UgMgoJCXBjaV93cml0ZV9jb25maWczMihkZXYyLFBDSV9QUklNQVJZX0JVUywgYnVzZXMpOwoKCQkvLyBmYWtlIGEgZGV2aWNlIGRlc2NyaXB0b3IgZm9yIGEgZGV2aWNlIGJlaGluZCBkZXZpY2UgMgoJCWR1bW15LmJ1cyA9IGRldjItPmJ1czsKCQlkdW1teS5idXMtPnNlY29uZGFyeSA9IChidXNlcyA+PiA4KSAmIDB4ZmY7CgkJZHVtbXkuYnVzLT5zdWJvcmRpbmF0ZSA9IChidXNlcyA+PiAxNikgJiAweGZmOwoJCWR1bW15LnBhdGgudHlwZSA9IERFVklDRV9QQVRIX1BDSTsKCQlkdW1teS5wYXRoLnBjaS5kZXZmbiA9IFBDSV9ERVZGTigwLDApOyAvLyBQTFg6IGRldmljZSBudW1iZXIgMCwgZnVuY3Rpb24gMAoKCQlpZCA9IHBjaV9yZWFkX2NvbmZpZzMyKCZkdW1teSwgUENJX1ZFTkRPUl9JRCk7CgkJLyogSGF2ZSB3ZSBmb3VuZCBzb21ldGhpbmc/CgkJICogU29tZSBicm9rZW4gYm9hcmRzIHJldHVybiAwIGlmIGEgc2xvdCBpcyBlbXB0eSwgYnV0CgkJICogdGhlIGV4cGVjdGVkIGFuc3dlciBpcyAweGZmZmZmZmZmCgkJICovCgkJaWYgKChpZCA9PSAweGZmZmZmZmZmKSB8fCAoaWQgPT0gMHgwMDAwMDAwMCkgfHwgKGlkID09IDB4MDAwMGZmZmYpIHx8IChpZCA9PSAweGZmZmYwMDAwKSkgewoJCQlwcmludGsoQklPU19ERUJVRywgIiVzLCBiYWQgaWQgMHgleFxuIiwgZGV2X3BhdGgoJmR1bW15KSwgaWQpOwoJCX0gZWxzZSB7CgkJCXByaW50ayhCSU9TX0RFQlVHLCAiZm91bmQgZGV2aWNlIFsleF1cbiIsIGlkKTsKCQl9CgkJLy8gcmVzdG9yZSBjaGFuZ2VzIG1hZGUgZm9yIGRldmljZSAyCgkJZGV2Mi0+YnVzLT5zZWNvbmRhcnkgPSBzZWNvbmRhcnk7CgkJZGV2Mi0+YnVzLT5zZWNvbmRhcnkgPSBzdWJvcmRpbmF0ZTsKCQlwY2lfd3JpdGVfY29uZmlnMzIoZGV2MiwgUENJX1BSSU1BUllfQlVTLCBwY2lfcHJpbWFyeV9idXMpOwoJfQoJCWJyZWFrOwoJZGVmYXVsdDoKCQlicmVhazsKCX0KCglwbHhfcHJlc2VudCA9IDA7CglpZiggaWQgPT0gUExYX1ZJRERJRCApewoJCXByaW50ayhCSU9TX0lORk8sICJmb3VuZCBQTFggZGV2aWNlXG4iKTsKCQlwbHhfcHJlc2VudCA9IDE7CgkJY2ZnID0gKHN0cnVjdCBzb3V0aGJyaWRnZV9hbWRfcnM2OTBfY29uZmlnICopZGV2Mi0+Y2hpcF9pbmZvOwoJCWlmKCBjZmctPmdmeF90bWRzICkgewoJCQlwcmludGsoQklPU19JTkZPLCAiRGlzYWJsZSAnZ2Z4X3RtZHMnIHN1cHBvcnRcbiIpOwoJCQljZmctPmdmeF90bWRzID0gMDsKCQkJY2ZnLT5nZnhfbGlua193aWR0aCA9IDQ7CgkJfQoJCXJldHVybjsKCX0KfQoKc3RhdGljIHZvaWQgc21tX2xvY2soIHZvaWQgKQp7CgkvKiBMT0NLIHRoZSBTTU0gbWVtb3J5IHdpbmRvdyBhbmQgZW5hYmxlIG5vcm1hbCBTTU0uCgkgKiBBZnRlciBydW5uaW5nIHRoaXMgZnVuY3Rpb24sIG9ubHkgYSBmdWxsIHJlc2V0IGNhbgoJICogbWFrZSB0aGUgU01NIHJlZ2lzdGVycyB3cml0YWJsZSBhZ2Fpbi4KCSAqLwoJcHJpbnRrKEJJT1NfREVCVUcsICJMb2NraW5nIFNNTS5cbiIpOwoJcGNpX3dyaXRlX2NvbmZpZzgoZGV2X2ZpbmRfc2xvdCgwLCBQQ0lfREVWRk4oMCwgMCkpLCAweDY5LAoJCQlEX0xDSyB8IEdfU01SQU1FIHwgQV9CQVNFX1NFRyk7Cn0KCiAvKioKICogQGJyaWVmIEluaXQKICoKICogQHBhcmFtIHRoZSByb290IGRldmljZQogKi8KCnN0YXRpYyB2b2lkIG1haW5ib2FyZF9pbml0KGRldmljZV90IGRldikKewojaWYgQ09ORklHX1BDSV9PUFRJT05fUk9NX1JVTl9SRUFMTU9ERQoJSU5UMTVfZnVuY3Rpb25fZXh0ZW5zaW9ucyBpbnQxNV9mdW5jOwojZW5kaWYKCglwcmludGsoQklPU19ERUJVRywgIiVzICVzWyV4LyV4XSAlc1xuIiwKCQlkZXZfbmFtZShkZXYpLCBkZXZfcGF0aChkZXYpLCBkZXYtPnN1YnN5c3RlbV92ZW5kb3IsIGRldi0+c3Vic3lzdGVtX2RldmljZSwgX19mdW5jX18pOwoKI2lmIENPTkZJR19QQ0lfT1BUSU9OX1JPTV9SVU5fUkVBTE1PREUKCWlmKAlnZXRfb3B0aW9uKCZpbnQxNV9mdW5jLnJlZ3MuZnVuYzAwX0xDRF9wYW5lbF9pZCwgImxjZF9wYW5lbF9pZCIpIDwgMCApCgkJaW50MTVfZnVuYy5yZWdzLmZ1bmMwMF9MQ0RfcGFuZWxfaWQgPSBQQU5FTF9UQUJMRV9JRF9OTzsKCWludDE1X2Z1bmMucmVncy5mdW5jMDVfVFZfc3RhbmRhcmQgPSBUVl9NT0RFX05POwoJaW5zdGFsbF9JTlQxNV9mdW5jdGlvbl9leHRlbnNpb25zKCZpbnQxNV9mdW5jKTsKI2VuZGlmCglzZXRfdGhlcm1hbF9jb25maWcoKTsKCXBtX2luaXQoKTsKCWNhYmxlX2RldGVjdCgpOwoJcGF0Y2hfbW1pb19ub25wb3N0ZWQoKTsKCXNtbV9sb2NrKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZW5hYmxlIHRoZSBkZWRpY2F0ZWQgZnVuY3Rpb24gaW4gc2luYSBib2FyZC4KKiBUaGlzIGZ1bmN0aW9uIGNhbGxlZCBlYXJseSB0aGFuIHJzNjkwX2VuYWJsZS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgbWFpbmJvYXJkX2VuYWJsZShkZXZpY2VfdCBkZXYpCnsKCglwcmludGsoQklPU19JTkZPLCAiJXMgJXNbJXgvJXhdICVzXG4iLAoJCWRldl9uYW1lKGRldiksIGRldl9wYXRoKGRldiksIGRldi0+c3Vic3lzdGVtX3ZlbmRvciwgZGV2LT5zdWJzeXN0ZW1fZGV2aWNlLCBfX2Z1bmNfXyk7CiNpZiBDT05GSUdfUENJX09QVElPTl9ST01fUlVOX1lBQkVMCgkvKiBJbnN0YWxsIGN1c3RvbSBpbnQxNSBoYW5kbGVyIGZvciBWR0EgT1BST00gKi8KCW1haW5ib2FyZF9pbnRlcnJ1cHRfaGFuZGxlcnMoMHgxNSwgJmludDE1X2hhbmRsZXIpOwojZW5kaWYKCglkZXRlY3RfaHdfdmFyaWFudChkZXYpOwoJdXBkYXRlX3N1YnN5c3RlbWlkKGRldik7CgoJZGV2LT5vcHMtPmluaXQgPSBtYWluYm9hcmRfaW5pdDsgIC8vIHJlc3Qgb2YgbWFpbmJvYXJkIGluaXQgbGF0ZXIKfQoKc3RydWN0IGNoaXBfb3BlcmF0aW9ucyBtYWluYm9hcmRfb3BzID0gewoJLmVuYWJsZV9kZXYgPSBtYWluYm9hcmRfZW5hYmxlLAp9Owo=