LyoKICogIGRyaXZlcnMvbXRkL25hbmQvZWRiNzMxMi5jCiAqCiAqICBDb3B5cmlnaHQgKEMpIDIwMDIgTWFyaXVzIEdy9mdlciAobWFnQHN5c2dvLmRlKQogKgogKiAgRGVyaXZlZCBmcm9tIGRyaXZlcnMvbXRkL25hbmQvYXV0Y3B1MTIuYwogKiAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDEgVGhvbWFzIEdsZWl4bmVyIChnbGVpeG5lckBhdXRyb25peC5kZSkKICoKICogJElkOiBlZGI3MzEyLmMsdiAxLjExIDIwMDQvMTEvMDQgMTI6NTM6MTAgZ2xlaXhuZXIgRXhwICQKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqICBPdmVydmlldzoKICogICBUaGlzIGlzIGEgZGV2aWNlIGRyaXZlciBmb3IgdGhlIE5BTkQgZmxhc2ggZGV2aWNlIGZvdW5kIG9uIHRoZQogKiAgIENMRVA3MzEyIGJvYXJkIHdoaWNoIHV0aWxpemVzIHRoZSBUb3NoaWJhIFRDNThWNjRBRlQgcGFydC4gVGhpcyBpcwogKiAgIGEgNjRNaWJpdCAoOE1pQiB4IDggYml0cykgTkFORCBmbGFzaCBkZXZpY2UuCiAqLwoKI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgojaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+IC8qIGZvciBDTFBTNzExMV9WSVJUX0JBU0UgKi8KI2luY2x1ZGUgPGFzbS9zaXplcy5oPgojaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2NscHM3MTExLmg+CgovKgogKiBNVEQgc3RydWN0dXJlIGZvciBFREI3MzEyIGJvYXJkCiAqLwpzdGF0aWMgc3RydWN0IG10ZF9pbmZvICplcDczMTJfbXRkID0gTlVMTDsKCi8qCiAqIFZhbHVlcyBzcGVjaWZpYyB0byB0aGUgRURCNzMxMiBib2FyZCAodXNlZCB3aXRoIEVQNzMxMiBwcm9jZXNzb3IpCiAqLwojZGVmaW5lIEVQNzMxMl9GSU9fUEJBU0UgMHgxMDAwMDAwMAkvKiBQaHlzIGFkZHJlc3Mgb2YgZmxhc2ggKi8KI2RlZmluZSBFUDczMTJfUFhEUgkweDAwMDEJLyoKCQkJCSAqIElPIG9mZnNldCB0byBQb3J0IEIgZGF0YSByZWdpc3RlcgoJCQkJICogd2hlcmUgdGhlIENMRSwgQUxFIGFuZCBOQ0UgcGlucwoJCQkJICogYXJlIHdpcmVkIHRvLgoJCQkJICovCiNkZWZpbmUgRVA3MzEyX1BYRERSCTB4MDA0MQkvKgoJCQkJICogSU8gb2Zmc2V0IHRvIFBvcnQgQiBkYXRhIGRpcmVjdGlvbgoJCQkJICogcmVnaXN0ZXIgc28gd2UgY2FuIGNvbnRyb2wgdGhlIElPCgkJCQkgKiBsaW5lcy4KCQkJCSAqLwoKLyoKICogTW9kdWxlIHN0dWZmCiAqLwoKc3RhdGljIHVuc2lnbmVkIGxvbmcgZXA3MzEyX2Zpb19wYmFzZSA9IEVQNzMxMl9GSU9fUEJBU0U7CnN0YXRpYyB2b2lkIF9faW9tZW0gKiBlcDczMTJfcHhkciA9ICh2b2lkIF9faW9tZW0gKikgRVA3MzEyX1BYRFI7CnN0YXRpYyB2b2lkIF9faW9tZW0gKiBlcDczMTJfcHhkZHIgPSAodm9pZCBfX2lvbWVtICopIEVQNzMxMl9QWEREUjsKCiNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKLyoKICogRGVmaW5lIHN0YXRpYyBwYXJ0aXRpb25zIGZvciBmbGFzaCBkZXZpY2UKICovCnN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYXJ0aXRpb25faW5mb1tdID0gewoJeyAubmFtZSA9ICJFUDczMTIgTmFuZCBGbGFzaCIsCgkJICAub2Zmc2V0ID0gMCwKCQkgIC5zaXplID0gOCoxMDI0KjEwMjQgfQp9OwojZGVmaW5lIE5VTV9QQVJUSVRJT05TIDEKCiNlbmRpZgoKCi8qIAogKgloYXJkd2FyZSBzcGVjaWZpYyBhY2Nlc3MgdG8gY29udHJvbC1saW5lcwogKi8Kc3RhdGljIHZvaWQgZXA3MzEyX2h3Y29udHJvbChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGNtZCkgCnsKCXN3aXRjaChjbWQpIHsKCQkKCWNhc2UgTkFORF9DVExfU0VUQ0xFOiAKCQljbHBzX3dyaXRlYihjbHBzX3JlYWRiKGVwNzMxMl9weGRyKSB8IDB4MTAsIGVwNzMxMl9weGRyKTsgCgkJYnJlYWs7CgljYXNlIE5BTkRfQ1RMX0NMUkNMRTogCgkJY2xwc193cml0ZWIoY2xwc19yZWFkYihlcDczMTJfcHhkcikgJiB+MHgxMCwgZXA3MzEyX3B4ZHIpOwoJCWJyZWFrOwoJCQoJY2FzZSBOQU5EX0NUTF9TRVRBTEU6CgkJY2xwc193cml0ZWIoY2xwc19yZWFkYihlcDczMTJfcHhkcikgfCAweDIwLCBlcDczMTJfcHhkcik7CgkJYnJlYWs7CgljYXNlIE5BTkRfQ1RMX0NMUkFMRToKCQljbHBzX3dyaXRlYihjbHBzX3JlYWRiKGVwNzMxMl9weGRyKSAmIH4weDIwLCBlcDczMTJfcHhkcik7CgkJYnJlYWs7CgkJCgljYXNlIE5BTkRfQ1RMX1NFVE5DRToKCQljbHBzX3dyaXRlYigoY2xwc19yZWFkYihlcDczMTJfcHhkcikgfCAweDgwKSAmIH4weDQwLCBlcDczMTJfcHhkcik7CgkJYnJlYWs7CgljYXNlIE5BTkRfQ1RMX0NMUk5DRToKCQljbHBzX3dyaXRlYigoY2xwc19yZWFkYihlcDczMTJfcHhkcikgfCAweDgwKSB8IDB4NDAsIGVwNzMxMl9weGRyKTsKCQlicmVhazsKCX0KfQoKLyoKICoJcmVhZCBkZXZpY2UgcmVhZHkgcGluCiAqLwpzdGF0aWMgaW50IGVwNzMxMl9kZXZpY2VfcmVhZHkoc3RydWN0IG10ZF9pbmZvICptdGQpCnsKCXJldHVybiAxOwp9CiNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwojZW5kaWYKCi8qCiAqIE1haW4gaW5pdGlhbGl6YXRpb24gcm91dGluZQogKi8Kc3RhdGljIGludCBfX2luaXQgZXA3MzEyX2luaXQgKHZvaWQpCnsKCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXM7Cgljb25zdCBjaGFyICpwYXJ0X3R5cGUgPSAwOwoJaW50IG10ZF9wYXJ0c19uYiA9IDA7CglzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqbXRkX3BhcnRzID0gMDsKCXZvaWQgX19pb21lbSAqIGVwNzMxMl9maW9fYmFzZTsKCQoJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBNVEQgZGV2aWNlIHN0cnVjdHVyZSBhbmQgcHJpdmF0ZSBkYXRhICovCgllcDczMTJfbXRkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSArIAoJCQkgICAgIHNpemVvZihzdHJ1Y3QgbmFuZF9jaGlwKSwKCQkJICAgICBHRlBfS0VSTkVMKTsKCWlmICghZXA3MzEyX210ZCkgewoJCXByaW50aygiVW5hYmxlIHRvIGFsbG9jYXRlIEVEQjczMTIgTkFORCBNVEQgZGV2aWNlIHN0cnVjdHVyZS5cbiIpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoJCgkvKiBtYXAgcGh5c2ljYWwgYWRyZXNzICovCgllcDczMTJfZmlvX2Jhc2UgPSBpb3JlbWFwKGVwNzMxMl9maW9fcGJhc2UsIFNaXzFLKTsKCWlmKCFlcDczMTJfZmlvX2Jhc2UpIHsKCQlwcmludGsoImlvcmVtYXAgRURCNzMxMiBOQU5EIGZsYXNoIGZhaWxlZFxuIik7CgkJa2ZyZWUoZXA3MzEyX210ZCk7CgkJcmV0dXJuIC1FSU87Cgl9CgkKCS8qIEdldCBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSAqLwoJdGhpcyA9IChzdHJ1Y3QgbmFuZF9jaGlwICopICgmZXA3MzEyX210ZFsxXSk7CgkKCS8qIEluaXRpYWxpemUgc3RydWN0dXJlcyAqLwoJbWVtc2V0KChjaGFyICopIGVwNzMxMl9tdGQsIDAsIHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pKTsKCW1lbXNldCgoY2hhciAqKSB0aGlzLCAwLCBzaXplb2Yoc3RydWN0IG5hbmRfY2hpcCkpOwoJCgkvKiBMaW5rIHRoZSBwcml2YXRlIGRhdGEgd2l0aCB0aGUgTVREIHN0cnVjdHVyZSAqLwoJZXA3MzEyX210ZC0+cHJpdiA9IHRoaXM7CgkKCS8qCgkgKiBTZXQgR1BJTyBQb3J0IEIgY29udHJvbCByZWdpc3RlciBzbyB0aGF0IHRoZSBwaW5zIGFyZSBjb25maWd1cmVkCgkgKiB0byBiZSBvdXRwdXRzIGZvciBjb250cm9sbGluZyB0aGUgTkFORCBmbGFzaC4KCSAqLwoJY2xwc193cml0ZWIoMHhmMCwgZXA3MzEyX3B4ZGRyKTsKCQoJLyogaW5zZXJ0IGNhbGxiYWNrcyAqLwoJdGhpcy0+SU9fQUREUl9SID0gZXA3MzEyX2Zpb19iYXNlOwoJdGhpcy0+SU9fQUREUl9XID0gZXA3MzEyX2Zpb19iYXNlOwoJdGhpcy0+aHdjb250cm9sID0gZXA3MzEyX2h3Y29udHJvbDsKCXRoaXMtPmRldl9yZWFkeSA9IGVwNzMxMl9kZXZpY2VfcmVhZHk7CgkvKiAxNSB1cyBjb21tYW5kIGRlbGF5IHRpbWUgKi8KCXRoaXMtPmNoaXBfZGVsYXkgPSAxNTsKCQoJLyogU2NhbiB0byBmaW5kIGV4aXN0ZW5jZSBvZiB0aGUgZGV2aWNlICovCglpZiAobmFuZF9zY2FuIChlcDczMTJfbXRkLCAxKSkgewoJCWlvdW5tYXAoKHZvaWQgKillcDczMTJfZmlvX2Jhc2UpOwoJCWtmcmVlIChlcDczMTJfbXRkKTsKCQlyZXR1cm4gLUVOWElPOwoJfQoJCiNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKCWVwNzMxMl9tdGQtPm5hbWUgPSAiZWRiNzMxMi1uYW5kIjsKCW10ZF9wYXJ0c19uYiA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGVwNzMxMl9tdGQsIHBhcnRfcHJvYmVzLAoJCQkJCSAgICAmbXRkX3BhcnRzLCAwKTsKCWlmIChtdGRfcGFydHNfbmIgPiAwKQoJCXBhcnRfdHlwZSA9ICJjb21tYW5kIGxpbmUiOwoJZWxzZQoJCW10ZF9wYXJ0c19uYiA9IDA7CiNlbmRpZgoJaWYgKG10ZF9wYXJ0c19uYiA9PSAwKSB7CgkJbXRkX3BhcnRzID0gcGFydGl0aW9uX2luZm87CgkJbXRkX3BhcnRzX25iID0gTlVNX1BBUlRJVElPTlM7CgkJcGFydF90eXBlID0gInN0YXRpYyI7Cgl9CgkKCS8qIFJlZ2lzdGVyIHRoZSBwYXJ0aXRpb25zICovCglwcmludGsoS0VSTl9OT1RJQ0UgIlVzaW5nICVzIHBhcnRpdGlvbiBkZWZpbml0aW9uXG4iLCBwYXJ0X3R5cGUpOwoJYWRkX210ZF9wYXJ0aXRpb25zKGVwNzMxMl9tdGQsIG10ZF9wYXJ0cywgbXRkX3BhcnRzX25iKTsKCQoJLyogUmV0dXJuIGhhcHB5ICovCglyZXR1cm4gMDsKfQptb2R1bGVfaW5pdChlcDczMTJfaW5pdCk7CgovKgogKiBDbGVhbiB1cCByb3V0aW5lCiAqLwpzdGF0aWMgdm9pZCBfX2V4aXQgZXA3MzEyX2NsZWFudXAgKHZvaWQpCnsKCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSAoc3RydWN0IG5hbmRfY2hpcCAqKSAmZXA3MzEyX210ZFsxXTsKCQoJLyogUmVsZWFzZSByZXNvdXJjZXMsIHVucmVnaXN0ZXIgZGV2aWNlICovCgluYW5kX3JlbGVhc2UgKGFwNzMxMl9tdGQpOwoJCgkvKiBGcmVlIGludGVybmFsIGRhdGEgYnVmZmVyICovCglrZnJlZSAodGhpcy0+ZGF0YV9idWYpOwoJCgkvKiBGcmVlIHRoZSBNVEQgZGV2aWNlIHN0cnVjdHVyZSAqLwoJa2ZyZWUgKGVwNzMxMl9tdGQpOwp9Cm1vZHVsZV9leGl0KGVwNzMxMl9jbGVhbnVwKTsKCk1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX0FVVEhPUigiTWFyaXVzIEdyb2VnZXIgPG1hZ0BzeXNnby5kZT4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJNVEQgbWFwIGRyaXZlciBmb3IgQ29nZW50IEVEQjczMTIgYm9hcmQiKTsK