LyoKICogIGRyaXZlcnMvbXRkL25hbmQvZWRiNzMxMi5jCiAqCiAqICBDb3B5cmlnaHQgKEMpIDIwMDIgTWFyaXVzIEdy9mdlciAobWFnQHN5c2dvLmRlKQogKgogKiAgRGVyaXZlZCBmcm9tIGRyaXZlcnMvbXRkL25hbmQvYXV0Y3B1MTIuYwogKiAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDEgVGhvbWFzIEdsZWl4bmVyIChnbGVpeG5lckBhdXRyb25peC5kZSkKICoKICogJElkOiBlZGI3MzEyLmMsdiAxLjEyIDIwMDUvMTEvMDcgMTE6MTQ6MzAgZ2xlaXhuZXIgRXhwICQKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqICBPdmVydmlldzoKICogICBUaGlzIGlzIGEgZGV2aWNlIGRyaXZlciBmb3IgdGhlIE5BTkQgZmxhc2ggZGV2aWNlIGZvdW5kIG9uIHRoZQogKiAgIENMRVA3MzEyIGJvYXJkIHdoaWNoIHV0aWxpemVzIHRoZSBUb3NoaWJhIFRDNThWNjRBRlQgcGFydC4gVGhpcyBpcwogKiAgIGEgNjRNaWJpdCAoOE1pQiB4IDggYml0cykgTkFORCBmbGFzaCBkZXZpY2UuCiAqLwoKI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgojaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+IC8qIGZvciBDTFBTNzExMV9WSVJUX0JBU0UgKi8KI2luY2x1ZGUgPGFzbS9zaXplcy5oPgojaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2NscHM3MTExLmg+CgovKgogKiBNVEQgc3RydWN0dXJlIGZvciBFREI3MzEyIGJvYXJkCiAqLwpzdGF0aWMgc3RydWN0IG10ZF9pbmZvICplcDczMTJfbXRkID0gTlVMTDsKCi8qCiAqIFZhbHVlcyBzcGVjaWZpYyB0byB0aGUgRURCNzMxMiBib2FyZCAodXNlZCB3aXRoIEVQNzMxMiBwcm9jZXNzb3IpCiAqLwojZGVmaW5lIEVQNzMxMl9GSU9fUEJBU0UgMHgxMDAwMDAwMAkvKiBQaHlzIGFkZHJlc3Mgb2YgZmxhc2ggKi8KI2RlZmluZSBFUDczMTJfUFhEUgkweDAwMDEJLyoKCQkJCSAqIElPIG9mZnNldCB0byBQb3J0IEIgZGF0YSByZWdpc3RlcgoJCQkJICogd2hlcmUgdGhlIENMRSwgQUxFIGFuZCBOQ0UgcGlucwoJCQkJICogYXJlIHdpcmVkIHRvLgoJCQkJICovCiNkZWZpbmUgRVA3MzEyX1BYRERSCTB4MDA0MQkvKgoJCQkJICogSU8gb2Zmc2V0IHRvIFBvcnQgQiBkYXRhIGRpcmVjdGlvbgoJCQkJICogcmVnaXN0ZXIgc28gd2UgY2FuIGNvbnRyb2wgdGhlIElPCgkJCQkgKiBsaW5lcy4KCQkJCSAqLwoKLyoKICogTW9kdWxlIHN0dWZmCiAqLwoKc3RhdGljIHVuc2lnbmVkIGxvbmcgZXA3MzEyX2Zpb19wYmFzZSA9IEVQNzMxMl9GSU9fUEJBU0U7CnN0YXRpYyB2b2lkIF9faW9tZW0gKiBlcDczMTJfcHhkciA9ICh2b2lkIF9faW9tZW0gKikgRVA3MzEyX1BYRFI7CnN0YXRpYyB2b2lkIF9faW9tZW0gKiBlcDczMTJfcHhkZHIgPSAodm9pZCBfX2lvbWVtICopIEVQNzMxMl9QWEREUjsKCiNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKLyoKICogRGVmaW5lIHN0YXRpYyBwYXJ0aXRpb25zIGZvciBmbGFzaCBkZXZpY2UKICovCnN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYXJ0aXRpb25faW5mb1tdID0gewoJeyAubmFtZSA9ICJFUDczMTIgTmFuZCBGbGFzaCIsCgkJICAub2Zmc2V0ID0gMCwKCQkgIC5zaXplID0gOCoxMDI0KjEwMjQgfQp9OwojZGVmaW5lIE5VTV9QQVJUSVRJT05TIDEKCiNlbmRpZgoKCi8qCiAqCWhhcmR3YXJlIHNwZWNpZmljIGFjY2VzcyB0byBjb250cm9sLWxpbmVzCiAqLwpzdGF0aWMgdm9pZCBlcDczMTJfaHdjb250cm9sKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY21kKQp7Cglzd2l0Y2goY21kKSB7CgoJY2FzZSBOQU5EX0NUTF9TRVRDTEU6CgkJY2xwc193cml0ZWIoY2xwc19yZWFkYihlcDczMTJfcHhkcikgfCAweDEwLCBlcDczMTJfcHhkcik7CgkJYnJlYWs7CgljYXNlIE5BTkRfQ1RMX0NMUkNMRToKCQljbHBzX3dyaXRlYihjbHBzX3JlYWRiKGVwNzMxMl9weGRyKSAmIH4weDEwLCBlcDczMTJfcHhkcik7CgkJYnJlYWs7CgoJY2FzZSBOQU5EX0NUTF9TRVRBTEU6CgkJY2xwc193cml0ZWIoY2xwc19yZWFkYihlcDczMTJfcHhkcikgfCAweDIwLCBlcDczMTJfcHhkcik7CgkJYnJlYWs7CgljYXNlIE5BTkRfQ1RMX0NMUkFMRToKCQljbHBzX3dyaXRlYihjbHBzX3JlYWRiKGVwNzMxMl9weGRyKSAmIH4weDIwLCBlcDczMTJfcHhkcik7CgkJYnJlYWs7CgoJY2FzZSBOQU5EX0NUTF9TRVROQ0U6CgkJY2xwc193cml0ZWIoKGNscHNfcmVhZGIoZXA3MzEyX3B4ZHIpIHwgMHg4MCkgJiB+MHg0MCwgZXA3MzEyX3B4ZHIpOwoJCWJyZWFrOwoJY2FzZSBOQU5EX0NUTF9DTFJOQ0U6CgkJY2xwc193cml0ZWIoKGNscHNfcmVhZGIoZXA3MzEyX3B4ZHIpIHwgMHg4MCkgfCAweDQwLCBlcDczMTJfcHhkcik7CgkJYnJlYWs7Cgl9Cn0KCi8qCiAqCXJlYWQgZGV2aWNlIHJlYWR5IHBpbgogKi8Kc3RhdGljIGludCBlcDczMTJfZGV2aWNlX3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQp7CglyZXR1cm4gMTsKfQojaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCmNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKI2VuZGlmCgovKgogKiBNYWluIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKICovCnN0YXRpYyBpbnQgX19pbml0IGVwNzMxMl9pbml0ICh2b2lkKQp7CglzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzOwoJY29uc3QgY2hhciAqcGFydF90eXBlID0gMDsKCWludCBtdGRfcGFydHNfbmIgPSAwOwoJc3RydWN0IG10ZF9wYXJ0aXRpb24gKm10ZF9wYXJ0cyA9IDA7Cgl2b2lkIF9faW9tZW0gKiBlcDczMTJfZmlvX2Jhc2U7CgoJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBNVEQgZGV2aWNlIHN0cnVjdHVyZSBhbmQgcHJpdmF0ZSBkYXRhICovCgllcDczMTJfbXRkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSArCgkJCSAgICAgc2l6ZW9mKHN0cnVjdCBuYW5kX2NoaXApLAoJCQkgICAgIEdGUF9LRVJORUwpOwoJaWYgKCFlcDczMTJfbXRkKSB7CgkJcHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgRURCNzMxMiBOQU5EIE1URCBkZXZpY2Ugc3RydWN0dXJlLlxuIik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJLyogbWFwIHBoeXNpY2FsIGFkcmVzcyAqLwoJZXA3MzEyX2Zpb19iYXNlID0gaW9yZW1hcChlcDczMTJfZmlvX3BiYXNlLCBTWl8xSyk7CglpZighZXA3MzEyX2Zpb19iYXNlKSB7CgkJcHJpbnRrKCJpb3JlbWFwIEVEQjczMTIgTkFORCBmbGFzaCBmYWlsZWRcbiIpOwoJCWtmcmVlKGVwNzMxMl9tdGQpOwoJCXJldHVybiAtRUlPOwoJfQoKCS8qIEdldCBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSAqLwoJdGhpcyA9IChzdHJ1Y3QgbmFuZF9jaGlwICopICgmZXA3MzEyX210ZFsxXSk7CgoJLyogSW5pdGlhbGl6ZSBzdHJ1Y3R1cmVzICovCgltZW1zZXQoKGNoYXIgKikgZXA3MzEyX210ZCwgMCwgc2l6ZW9mKHN0cnVjdCBtdGRfaW5mbykpOwoJbWVtc2V0KChjaGFyICopIHRoaXMsIDAsIHNpemVvZihzdHJ1Y3QgbmFuZF9jaGlwKSk7CgoJLyogTGluayB0aGUgcHJpdmF0ZSBkYXRhIHdpdGggdGhlIE1URCBzdHJ1Y3R1cmUgKi8KCWVwNzMxMl9tdGQtPnByaXYgPSB0aGlzOwoKCS8qCgkgKiBTZXQgR1BJTyBQb3J0IEIgY29udHJvbCByZWdpc3RlciBzbyB0aGF0IHRoZSBwaW5zIGFyZSBjb25maWd1cmVkCgkgKiB0byBiZSBvdXRwdXRzIGZvciBjb250cm9sbGluZyB0aGUgTkFORCBmbGFzaC4KCSAqLwoJY2xwc193cml0ZWIoMHhmMCwgZXA3MzEyX3B4ZGRyKTsKCgkvKiBpbnNlcnQgY2FsbGJhY2tzICovCgl0aGlzLT5JT19BRERSX1IgPSBlcDczMTJfZmlvX2Jhc2U7Cgl0aGlzLT5JT19BRERSX1cgPSBlcDczMTJfZmlvX2Jhc2U7Cgl0aGlzLT5od2NvbnRyb2wgPSBlcDczMTJfaHdjb250cm9sOwoJdGhpcy0+ZGV2X3JlYWR5ID0gZXA3MzEyX2RldmljZV9yZWFkeTsKCS8qIDE1IHVzIGNvbW1hbmQgZGVsYXkgdGltZSAqLwoJdGhpcy0+Y2hpcF9kZWxheSA9IDE1OwoKCS8qIFNjYW4gdG8gZmluZCBleGlzdGVuY2Ugb2YgdGhlIGRldmljZSAqLwoJaWYgKG5hbmRfc2NhbiAoZXA3MzEyX210ZCwgMSkpIHsKCQlpb3VubWFwKCh2b2lkICopZXA3MzEyX2Zpb19iYXNlKTsKCQlrZnJlZSAoZXA3MzEyX210ZCk7CgkJcmV0dXJuIC1FTlhJTzsKCX0KCiNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKCWVwNzMxMl9tdGQtPm5hbWUgPSAiZWRiNzMxMi1uYW5kIjsKCW10ZF9wYXJ0c19uYiA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGVwNzMxMl9tdGQsIHBhcnRfcHJvYmVzLAoJCQkJCSAgICAmbXRkX3BhcnRzLCAwKTsKCWlmIChtdGRfcGFydHNfbmIgPiAwKQoJCXBhcnRfdHlwZSA9ICJjb21tYW5kIGxpbmUiOwoJZWxzZQoJCW10ZF9wYXJ0c19uYiA9IDA7CiNlbmRpZgoJaWYgKG10ZF9wYXJ0c19uYiA9PSAwKSB7CgkJbXRkX3BhcnRzID0gcGFydGl0aW9uX2luZm87CgkJbXRkX3BhcnRzX25iID0gTlVNX1BBUlRJVElPTlM7CgkJcGFydF90eXBlID0gInN0YXRpYyI7Cgl9CgoJLyogUmVnaXN0ZXIgdGhlIHBhcnRpdGlvbnMgKi8KCXByaW50ayhLRVJOX05PVElDRSAiVXNpbmcgJXMgcGFydGl0aW9uIGRlZmluaXRpb25cbiIsIHBhcnRfdHlwZSk7CglhZGRfbXRkX3BhcnRpdGlvbnMoZXA3MzEyX210ZCwgbXRkX3BhcnRzLCBtdGRfcGFydHNfbmIpOwoKCS8qIFJldHVybiBoYXBweSAqLwoJcmV0dXJuIDA7Cn0KbW9kdWxlX2luaXQoZXA3MzEyX2luaXQpOwoKLyoKICogQ2xlYW4gdXAgcm91dGluZQogKi8Kc3RhdGljIHZvaWQgX19leGl0IGVwNzMxMl9jbGVhbnVwICh2b2lkKQp7CglzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gKHN0cnVjdCBuYW5kX2NoaXAgKikgJmVwNzMxMl9tdGRbMV07CgoJLyogUmVsZWFzZSByZXNvdXJjZXMsIHVucmVnaXN0ZXIgZGV2aWNlICovCgluYW5kX3JlbGVhc2UgKGFwNzMxMl9tdGQpOwoKCS8qIEZyZWUgaW50ZXJuYWwgZGF0YSBidWZmZXIgKi8KCWtmcmVlICh0aGlzLT5kYXRhX2J1Zik7CgoJLyogRnJlZSB0aGUgTVREIGRldmljZSBzdHJ1Y3R1cmUgKi8KCWtmcmVlIChlcDczMTJfbXRkKTsKfQptb2R1bGVfZXhpdChlcDczMTJfY2xlYW51cCk7CgpNT0RVTEVfTElDRU5TRSgiR1BMIik7Ck1PRFVMRV9BVVRIT1IoIk1hcml1cyBHcm9lZ2VyIDxtYWdAc3lzZ28uZGU+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiTVREIG1hcCBkcml2ZXIgZm9yIENvZ2VudCBFREI3MzEyIGJvYXJkIik7Cg==