LyoKICogIGFybWJvb3QgLSBTdGFydHVwIENvZGUgZm9yIEFSTTkyMCBDUFUtY29yZQogKgogKiAgQ29weXJpZ2h0IChjKSAyMDAxCU1hcml1cyBHcvZnZXIgPG1hZ0BzeXNnby5kZT4KICogIENvcHlyaWdodCAoYykgMjAwMglBbGV4IFr8cGtlIDxhenVAc3lzZ28uZGU+CiAqICBDb3B5cmlnaHQgKGMpIDIwMDIJR2FyeSBKZW5uZWpvaG4gPGdhcnlqQGRlbnguZGU+CiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGFzbS1vZmZzZXRzLmg+CiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbmZpZy5oPgoKLyoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogSnVtcCB2ZWN0b3IgdGFibGUgYXMgaW4gdGFibGUgMy4xIGluIFsxXQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KCgouZ2xvYmwgX3N0YXJ0Cl9zdGFydDoJYglzdGFydF9jb2RlCglsZHIJcGMsIF91bmRlZmluZWRfaW5zdHJ1Y3Rpb24KCWxkcglwYywgX3NvZnR3YXJlX2ludGVycnVwdAoJbGRyCXBjLCBfcHJlZmV0Y2hfYWJvcnQKCWxkcglwYywgX2RhdGFfYWJvcnQKCWxkcglwYywgX25vdF91c2VkCglsZHIJcGMsIF9pcnEKCWxkcglwYywgX2ZpcQoKX3VuZGVmaW5lZF9pbnN0cnVjdGlvbjoJLndvcmQgdW5kZWZpbmVkX2luc3RydWN0aW9uCl9zb2Z0d2FyZV9pbnRlcnJ1cHQ6CS53b3JkIHNvZnR3YXJlX2ludGVycnVwdApfcHJlZmV0Y2hfYWJvcnQ6CS53b3JkIHByZWZldGNoX2Fib3J0Cl9kYXRhX2Fib3J0OgkJLndvcmQgZGF0YV9hYm9ydApfbm90X3VzZWQ6CQkud29yZCBub3RfdXNlZApfaXJxOgkJCS53b3JkIGlycQpfZmlxOgkJCS53b3JkIGZpcQoKCS5iYWxpZ25sIDE2LDB4ZGVhZGJlZWYKCgovKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBTdGFydHVwIENvZGUgKGNhbGxlZCBmcm9tIHRoZSBBUk0gcmVzZXQgZXhjZXB0aW9uIHZlY3RvcikKICoKICogZG8gaW1wb3J0YW50IGluaXQgb25seSBpZiB3ZSBkb24ndCBzdGFydCBmcm9tIG1lbW9yeSEKICogcmVsb2NhdGUgYXJtYm9vdCB0byByYW0KICogc2V0dXAgc3RhY2sKICoganVtcCB0byBzZWNvbmQgc3RhZ2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCgouZ2xvYmwgX1RFWFRfQkFTRQpfVEVYVF9CQVNFOgoJLndvcmQJQ09ORklHX1NZU19URVhUX0JBU0UKCiNpZiBkZWZpbmVkKENPTkZJR19TWVNfQVJNX1dJVEhPVVRfUkVMT0MpCi5nbG9ibCBfYXJtYm9vdF9zdGFydApfYXJtYm9vdF9zdGFydDoKCS53b3JkIF9zdGFydAojZW5kaWYKCi8qCiAqIFRoZXNlIGFyZSBkZWZpbmVkIGluIHRoZSBib2FyZC1zcGVjaWZpYyBsaW5rZXIgc2NyaXB0LgogKi8KLmdsb2JsIF9ic3Nfc3RhcnQKX2Jzc19zdGFydDoKCS53b3JkIF9fYnNzX3N0YXJ0CgouZ2xvYmwgX2Jzc19lbmQKX2Jzc19lbmQ6Cgkud29yZCBfZW5kCgojaWZkZWYgQ09ORklHX1VTRV9JUlEKLyogSVJRIHN0YWNrIG1lbW9yeSAoY2FsY3VsYXRlZCBhdCBydW4tdGltZSkgKi8KLmdsb2JsIElSUV9TVEFDS19TVEFSVApJUlFfU1RBQ0tfU1RBUlQ6Cgkud29yZAkweDBiYWRjMGRlCgovKiBJUlEgc3RhY2sgbWVtb3J5IChjYWxjdWxhdGVkIGF0IHJ1bi10aW1lKSAqLwouZ2xvYmwgRklRX1NUQUNLX1NUQVJUCkZJUV9TVEFDS19TVEFSVDoKCS53b3JkIDB4MGJhZGMwZGUKI2VuZGlmCgojaWYgIWRlZmluZWQoQ09ORklHX1NZU19BUk1fV0lUSE9VVF9SRUxPQykKLyogSVJRIHN0YWNrIG1lbW9yeSAoY2FsY3VsYXRlZCBhdCBydW4tdGltZSkgKyA4IGJ5dGVzICovCi5nbG9ibCBJUlFfU1RBQ0tfU1RBUlRfSU4KSVJRX1NUQUNLX1NUQVJUX0lOOgoJLndvcmQJMHgwYmFkYzBkZQoKLmdsb2JsIF9kYXRhcmVsX3N0YXJ0Cl9kYXRhcmVsX3N0YXJ0OgoJLndvcmQgX19kYXRhcmVsX3N0YXJ0CgouZ2xvYmwgX2RhdGFyZWxyb2xvY2FsX3N0YXJ0Cl9kYXRhcmVscm9sb2NhbF9zdGFydDoKCS53b3JkIF9fZGF0YXJlbHJvbG9jYWxfc3RhcnQKCi5nbG9ibCBfZGF0YXJlbGxvY2FsX3N0YXJ0Cl9kYXRhcmVsbG9jYWxfc3RhcnQ6Cgkud29yZCBfX2RhdGFyZWxsb2NhbF9zdGFydAoKLmdsb2JsIF9kYXRhcmVscm9fc3RhcnQKX2RhdGFyZWxyb19zdGFydDoKCS53b3JkIF9fZGF0YXJlbHJvX3N0YXJ0CgouZ2xvYmwgX2dvdF9zdGFydApfZ290X3N0YXJ0OgoJLndvcmQgX19nb3Rfc3RhcnQKCi5nbG9ibCBfZ290X2VuZApfZ290X2VuZDoKCS53b3JkIF9fZ290X2VuZAoKLyoKICogdGhlIGFjdHVhbCBzdGFydCBjb2RlCiAqLwoKc3RhcnRfY29kZToKCS8qCgkgKiBzZXQgdGhlIGNwdSB0byBTVkMzMiBtb2RlCgkgKi8KCW1ycwlyMCwgY3BzcgoJYmljCXIwLCByMCwgIzB4MWYKCW9ycglyMCwgcjAsICMweGQzCgltc3IJY3BzciwgcjAKCglibAljb2xvdXJlZF9MRURfaW5pdAoJYmwJcmVkX0xFRF9vbgoKI2lmCWRlZmluZWQoQ09ORklHX0FUOTFSTTkyMDBESykgfHwgZGVmaW5lZChDT05GSUdfQVQ5MVJNOTIwMEVLKQoJLyoKCSAqIHJlbG9jYXRlIGV4Y2VwdGlvbiB0YWJsZQoJICovCglsZHIJcjAsID1fc3RhcnQKCWxkcglyMSwgPTB4MAoJbW92CXIyLCAjMTYKY29weWV4OgoJc3VicwlyMiwgcjIsICMxCglsZHIJcjMsIFtyMF0sICM0CglzdHIJcjMsIFtyMV0sICM0CglibmUJY29weWV4CiNlbmRpZgoKI2lmZGVmIENPTkZJR19TM0MyNFgwCgkvKiB0dXJuIG9mZiB0aGUgd2F0Y2hkb2cgKi8KCiMgaWYgZGVmaW5lZChDT05GSUdfUzNDMjQwMCkKIyAgZGVmaW5lIHBXVENPTgkweDE1MzAwMDAwCiMgIGRlZmluZSBJTlRNU0sJMHgxNDQwMDAwOAkvKiBJbnRlcnVwdC1Db250cm9sbGVyIGJhc2UgYWRkcmVzc2VzICovCiMgIGRlZmluZSBDTEtESVZOCTB4MTQ4MDAwMTQJLyogY2xvY2sgZGl2aXNvciByZWdpc3RlciAqLwojZWxzZQojICBkZWZpbmUgcFdUQ09OCTB4NTMwMDAwMDAKIyAgZGVmaW5lIElOVE1TSwkweDRBMDAwMDA4CS8qIEludGVydXB0LUNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzZXMgKi8KIyAgZGVmaW5lIElOVFNVQk1TSwkweDRBMDAwMDFDCiMgIGRlZmluZSBDTEtESVZOCTB4NEMwMDAwMTQJLyogY2xvY2sgZGl2aXNvciByZWdpc3RlciAqLwojIGVuZGlmCgoJbGRyCXIwLCA9cFdUQ09OCgltb3YJcjEsICMweDAKCXN0cglyMSwgW3IwXQoKCS8qCgkgKiBtYXNrIGFsbCBJUlFzIGJ5IHNldHRpbmcgYWxsIGJpdHMgaW4gdGhlIElOVE1SIC0gZGVmYXVsdAoJICovCgltb3YJcjEsICMweGZmZmZmZmZmCglsZHIJcjAsID1JTlRNU0sKCXN0cglyMSwgW3IwXQojIGlmIGRlZmluZWQoQ09ORklHX1MzQzI0MTApCglsZHIJcjEsID0weDNmZgoJbGRyCXIwLCA9SU5UU1VCTVNLCglzdHIJcjEsIFtyMF0KIyBlbmRpZgoKCS8qIEZDTEs6SENMSzpQQ0xLID0gMToyOjQgKi8KCS8qIGRlZmF1bHQgRkNMSyBpcyAxMjAgTUh6ICEgKi8KCWxkcglyMCwgPUNMS0RJVk4KCW1vdglyMSwgIzMKCXN0cglyMSwgW3IwXQojZW5kaWYJLyogQ09ORklHX1MzQzI0WDAgKi8KCgkvKgoJICogd2UgZG8gc3lzLWNyaXRpY2FsIGluaXRzIG9ubHkgYXQgcmVib290LAoJICogbm90IHdoZW4gYm9vdGluZyBmcm9tIHJhbSEKCSAqLwojaWZuZGVmIENPTkZJR19TS0lQX0xPV0xFVkVMX0lOSVQKCWJsCWNwdV9pbml0X2NyaXQKI2VuZGlmCgovKiBTZXQgc3RhY2twb2ludGVyIGluIGludGVybmFsIFJBTSB0byBjYWxsIGJvYXJkX2luaXRfZiAqLwpjYWxsX2JvYXJkX2luaXRfZjoKCWxkcglzcCwgPShDT05GSUdfU1lTX0lOSVRfU1BfQUREUikKCWxkcglyMCw9MHgwMDAwMDAwMAoJYmwJYm9hcmRfaW5pdF9mCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKgogKiB2b2lkIHJlbG9jYXRlX2NvZGUgKGFkZHJfc3AsIGdkLCBhZGRyX21vbmkpCiAqCiAqIFRoaXMgImZ1bmN0aW9uIiBkb2VzIG5vdCByZXR1cm4sIGluc3RlYWQgaXQgY29udGludWVzIGluIFJBTQogKiBhZnRlciByZWxvY2F0aW5nIHRoZSBtb25pdG9yIGNvZGUuCiAqCiAqLwoJLmdsb2JsCXJlbG9jYXRlX2NvZGUKcmVsb2NhdGVfY29kZToKCW1vdglyNCwgcjAJLyogc2F2ZSBhZGRyX3NwICovCgltb3YJcjUsIHIxCS8qIHNhdmUgYWRkciBvZiBnZCAqLwoJbW92CXI2LCByMgkvKiBzYXZlIGFkZHIgb2YgZGVzdGluYXRpb24gKi8KCW1vdglyNywgcjIJLyogc2F2ZSBhZGRyIG9mIGRlc3RpbmF0aW9uICovCgoJLyogU2V0IHVwIHRoZSBzdGFjawkJCQkJCSAgICAqLwpzdGFja19zZXR1cDoKCW1vdglzcCwgcjQKCglhZHIJcjAsIF9zdGFydAoJbGRyCXIyLCBfVEVYVF9CQVNFCglsZHIJcjMsIF9ic3Nfc3RhcnQKCXN1YglyMiwgcjMsIHIyCQkvKiByMiA8LSBzaXplIG9mIGFybWJvb3QJICAgICovCglhZGQJcjIsIHIwLCByMgkJLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzCSAgICAqLwoJY21wCXIwLCByNgoJYmVxCWNsZWFyX2JzcwoKI2lmbmRlZiBDT05GSUdfU0tJUF9SRUxPQ0FURV9VQk9PVApjb3B5X2xvb3A6CglsZG1pYQlyMCEsIHtyOS1yMTB9CQkvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLwoJc3RtaWEJcjYhLCB7cjktcjEwfQkJLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KCWNtcAlyMCwgcjIJCQkvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLwoJYmxvCWNvcHlfbG9vcAoKI2lmbmRlZiBDT05GSUdfUFJFTE9BREVSCgkvKiBmaXggZ290IGVudHJpZXMgKi8KCWxkcglyMSwgX1RFWFRfQkFTRQkJLyogVGV4dCBiYXNlICovCgltb3YJcjAsIHI3CQkJLyogcmVsb2MgYWRkciAqLwoJbGRyCXIyLCBfZ290X3N0YXJ0CQkvKiBhZGRyIGluIEZsYXNoICovCglsZHIJcjMsIF9nb3RfZW5kCQkvKiBhZGRyIGluIEZsYXNoICovCglzdWIJcjMsIHIzLCByMQoJYWRkCXIzLCByMywgcjAKCXN1YglyMiwgcjIsIHIxCglhZGQJcjIsIHIyLCByMAoKZml4bG9vcDoKCWxkcglyNCwgW3IyXQoJc3ViCXI0LCByNCwgcjEKCWFkZAlyNCwgcjQsIHIwCglzdHIJcjQsIFtyMl0KCWFkZAlyMiwgcjIsICM0CgljbXAJcjIsIHIzCglibG8JZml4bG9vcAojZW5kaWYKI2VuZGlmCS8qICNpZm5kZWYgQ09ORklHX1NLSVBfUkVMT0NBVEVfVUJPT1QgKi8KCmNsZWFyX2JzczoKI2lmbmRlZiBDT05GSUdfUFJFTE9BREVSCglsZHIJcjAsIF9ic3Nfc3RhcnQKCWxkcglyMSwgX2Jzc19lbmQKCWxkcglyMywgX1RFWFRfQkFTRQkJLyogVGV4dCBiYXNlICovCgltb3YJcjQsIHI3CQkJLyogcmVsb2MgYWRkciAqLwoJc3ViCXIwLCByMCwgcjMKCWFkZAlyMCwgcjAsIHI0CglzdWIJcjEsIHIxLCByMwoJYWRkCXIxLCByMSwgcjQKCW1vdglyMiwgIzB4MDAwMDAwMDAJCS8qIGNsZWFyCQkJICAgICovCgpjbGJzc19sOnN0cglyMiwgW3IwXQkJLyogY2xlYXIgbG9vcC4uLgkJICAgICovCglhZGQJcjAsIHIwLCAjNAoJY21wCXIwLCByMQoJYm5lCWNsYnNzX2wKCglibCBjb2xvdXJlZF9MRURfaW5pdAoJYmwgcmVkX0xFRF9vbgojZW5kaWYKCi8qCiAqIFdlIGFyZSBkb25lLiBEbyBub3QgcmV0dXJuLCBpbnN0ZWFkIGJyYW5jaCB0byBzZWNvbmQgcGFydCBvZiBib2FyZAogKiBpbml0aWFsaXphdGlvbiwgbm93IHJ1bm5pbmcgZnJvbSBSQU0uCiAqLwojaWZkZWYgQ09ORklHX05BTkRfU1BMCglsZHIgICAgIHBjLCBfbmFuZF9ib290CgpfbmFuZF9ib290OiAud29yZCBuYW5kX2Jvb3QKI2Vsc2UKCWxkcglyMCwgX1RFWFRfQkFTRQoJbGRyCXIyLCBfYm9hcmRfaW5pdF9yCglzdWIJcjIsIHIyLCByMAoJYWRkCXIyLCByMiwgcjcJLyogcG9zaXRpb24gZnJvbSBib2FyZF9pbml0X3IgaW4gUkFNICovCgkvKiBzZXR1cCBwYXJhbWV0ZXJzIGZvciBib2FyZF9pbml0X3IgKi8KCW1vdglyMCwgcjUJCS8qIGdkX3QgKi8KCW1vdglyMSwgcjcJCS8qIGRlc3RfYWRkciAqLwoJLyoganVtcCB0byBpdCAuLi4gKi8KCW1vdglsciwgcjIKCW1vdglwYywgbHIKCl9ib2FyZF9pbml0X3I6IC53b3JkIGJvYXJkX2luaXRfcgojZW5kaWYKCiNlbHNlIC8qICNpZiAhZGVmaW5lZChDT05GSUdfU1lTX0FSTV9XSVRIT1VUX1JFTE9DKSAqLwovKgogKiB0aGUgYWN0dWFsIHN0YXJ0IGNvZGUKICovCgpzdGFydF9jb2RlOgoJLyoKCSAqIHNldCB0aGUgY3B1IHRvIFNWQzMyIG1vZGUKCSAqLwoJbXJzCXIwLCBjcHNyCgliaWMJcjAsIHIwLCAjMHgxZgoJb3JyCXIwLCByMCwgIzB4ZDMKCW1zcgljcHNyLCByMAoKCWJsCWNvbG91cmVkX0xFRF9pbml0CglibAlyZWRfTEVEX29uCgojaWYJZGVmaW5lZChDT05GSUdfQVQ5MVJNOTIwMERLKSB8fCBkZWZpbmVkKENPTkZJR19BVDkxUk05MjAwRUspCgkvKgoJICogcmVsb2NhdGUgZXhjZXB0aW9uIHRhYmxlCgkgKi8KCWxkcglyMCwgPV9zdGFydAoJbGRyCXIxLCA9MHgwCgltb3YJcjIsICMxNgpjb3B5ZXg6CglzdWJzCXIyLCByMiwgIzEKCWxkcglyMywgW3IwXSwgIzQKCXN0cglyMywgW3IxXSwgIzQKCWJuZQljb3B5ZXgKI2VuZGlmCgojaWZkZWYgQ09ORklHX1MzQzI0WDAKCS8qIHR1cm4gb2ZmIHRoZSB3YXRjaGRvZyAqLwoKIyBpZiBkZWZpbmVkKENPTkZJR19TM0MyNDAwKQojICBkZWZpbmUgcFdUQ09OCTB4MTUzMDAwMDAKIyAgZGVmaW5lIElOVE1TSwkweDE0NDAwMDA4CS8qIEludGVydXB0LUNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzZXMgKi8KIyAgZGVmaW5lIENMS0RJVk4JMHgxNDgwMDAxNAkvKiBjbG9jayBkaXZpc29yIHJlZ2lzdGVyICovCiNlbHNlCiMgIGRlZmluZSBwV1RDT04JMHg1MzAwMDAwMAojICBkZWZpbmUgSU5UTVNLCTB4NEEwMDAwMDgJLyogSW50ZXJ1cHQtQ29udHJvbGxlciBiYXNlIGFkZHJlc3NlcyAqLwojICBkZWZpbmUgSU5UU1VCTVNLCTB4NEEwMDAwMUMKIyAgZGVmaW5lIENMS0RJVk4JMHg0QzAwMDAxNAkvKiBjbG9jayBkaXZpc29yIHJlZ2lzdGVyICovCiMgZW5kaWYKCglsZHIJcjAsID1wV1RDT04KCW1vdglyMSwgIzB4MAoJc3RyCXIxLCBbcjBdCgoJLyoKCSAqIG1hc2sgYWxsIElSUXMgYnkgc2V0dGluZyBhbGwgYml0cyBpbiB0aGUgSU5UTVIgLSBkZWZhdWx0CgkgKi8KCW1vdglyMSwgIzB4ZmZmZmZmZmYKCWxkcglyMCwgPUlOVE1TSwoJc3RyCXIxLCBbcjBdCiMgaWYgZGVmaW5lZChDT05GSUdfUzNDMjQxMCkKCWxkcglyMSwgPTB4M2ZmCglsZHIJcjAsID1JTlRTVUJNU0sKCXN0cglyMSwgW3IwXQojIGVuZGlmCgoJLyogRkNMSzpIQ0xLOlBDTEsgPSAxOjI6NCAqLwoJLyogZGVmYXVsdCBGQ0xLIGlzIDEyMCBNSHogISAqLwoJbGRyCXIwLCA9Q0xLRElWTgoJbW92CXIxLCAjMwoJc3RyCXIxLCBbcjBdCiNlbmRpZgkvKiBDT05GSUdfUzNDMjRYMCAqLwoKCS8qCgkgKiB3ZSBkbyBzeXMtY3JpdGljYWwgaW5pdHMgb25seSBhdCByZWJvb3QsCgkgKiBub3Qgd2hlbiBib290aW5nIGZyb20gcmFtIQoJICovCiNpZm5kZWYgQ09ORklHX1NLSVBfTE9XTEVWRUxfSU5JVAoJYmwJY3B1X2luaXRfY3JpdAojZW5kaWYKCiNpZm5kZWYgQ09ORklHX1NLSVBfUkVMT0NBVEVfVUJPT1QKcmVsb2NhdGU6CQkJCS8qIHJlbG9jYXRlIFUtQm9vdCB0byBSQU0JICAgICovCglhZHIJcjAsIF9zdGFydAkJLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2RlICAgKi8KCWxkcglyMSwgX1RFWFRfQkFTRQkJLyogdGVzdCBpZiB3ZSBydW4gZnJvbSBmbGFzaCBvciBSQU0gKi8KCWNtcAlyMCwgcjEJCQkvKiBkb24ndCByZWxvYyBkdXJpbmcgZGVidWcgICAgICAgICAqLwoJYmVxCXN0YWNrX3NldHVwCgoJbGRyCXIyLCBfYXJtYm9vdF9zdGFydAoJbGRyCXIzLCBfYnNzX3N0YXJ0CglzdWIJcjIsIHIzLCByMgkJLyogcjIgPC0gc2l6ZSBvZiBhcm1ib290ICAgICAgICAgICAgKi8KCWFkZAlyMiwgcjAsIHIyCQkvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgICAgICAgICAqLwoKY29weV9sb29wOgoJbGRtaWEJcjAhLCB7cjMtcjEwfQkJLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KCXN0bWlhCXIxISwge3IzLXIxMH0JCS8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCgljbXAJcjAsIHIyCQkJLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KCWJsbwljb3B5X2xvb3AKI2VuZGlmCS8qIENPTkZJR19TS0lQX1JFTE9DQVRFX1VCT09UICovCgoJLyogU2V0IHVwIHRoZSBzdGFjawkJCQkJCSAgICAqLwpzdGFja19zZXR1cDoKCWxkcglyMCwgX1RFWFRfQkFTRQkJLyogdXBwZXIgMTI4IEtpQjogcmVsb2NhdGVkIHVib290ICAgKi8KCXN1YglyMCwgcjAsICNDT05GSUdfU1lTX01BTExPQ19MRU4JLyogbWFsbG9jIGFyZWEgICAgICAgICAgICAgICovCglzdWIJcjAsIHIwLCAjR0VORVJBVEVEX0dCTF9EQVRBX1NJWkUgLyogYmRpbmZvICAgICAgICAgICAgICAgICAqLwojaWZkZWYgQ09ORklHX1VTRV9JUlEKCXN1YglyMCwgcjAsICMoQ09ORklHX1NUQUNLU0laRV9JUlErQ09ORklHX1NUQUNLU0laRV9GSVEpCiNlbmRpZgoJc3ViCXNwLCByMCwgIzEyCQkvKiBsZWF2ZSAzIHdvcmRzIGZvciBhYm9ydC1zdGFjayAgICAqLwoJYmljCXNwLCBzcCwgIzcJCS8qIDgtYnl0ZSBhbGlnbm1lbnQgZm9yIEFCSSBjb21wbGlhbmNlICovCgpjbGVhcl9ic3M6CglsZHIJcjAsIF9ic3Nfc3RhcnQJCS8qIGZpbmQgc3RhcnQgb2YgYnNzIHNlZ21lbnQgICAgICAgICovCglsZHIJcjEsIF9ic3NfZW5kCQkvKiBzdG9wIGhlcmUgICAgICAgICAgICAgICAgICAgICAgICAqLwoJbW92CXIyLCAjMHgwMDAwMDAwMAkJLyogY2xlYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCmNsYnNzX2w6c3RyCXIyLCBbcjBdCQkvKiBjbGVhciBsb29wLi4uICAgICAgICAgICAgICAgICAgICAqLwoJYWRkCXIwLCByMCwgIzQKCWNtcAlyMCwgcjEKCWJsbwljbGJzc19sCgoJbGRyCXBjLCBfc3RhcnRfYXJtYm9vdAoKX3N0YXJ0X2FybWJvb3Q6CS53b3JkIHN0YXJ0X2FybWJvb3QKI2VuZGlmIC8qICNpZiAhZGVmaW5lZChDT05GSUdfU1lTX0FSTV9XSVRIT1VUX1JFTE9DKSAqLwoKLyoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ1BVX2luaXRfY3JpdGljYWwgcmVnaXN0ZXJzCiAqCiAqIHNldHVwIGltcG9ydGFudCByZWdpc3RlcnMKICogc2V0dXAgbWVtb3J5IHRpbWluZwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KCgojaWZuZGVmIENPTkZJR19TS0lQX0xPV0xFVkVMX0lOSVQKY3B1X2luaXRfY3JpdDoKCS8qCgkgKiBmbHVzaCB2NCBJL0QgY2FjaGVzCgkgKi8KCW1vdglyMCwgIzAKCW1jcglwMTUsIDAsIHIwLCBjNywgYzcsIDAJLyogZmx1c2ggdjMvdjQgY2FjaGUgKi8KCW1jcglwMTUsIDAsIHIwLCBjOCwgYzcsIDAJLyogZmx1c2ggdjQgVExCICovCgoJLyoKCSAqIGRpc2FibGUgTU1VIHN0dWZmIGFuZCBjYWNoZXMKCSAqLwoJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAoJYmljCXIwLCByMCwgIzB4MDAwMDIzMDAJQCBjbGVhciBiaXRzIDEzLCA5OjggKC0tVi0gLS1SUykKCWJpYwlyMCwgcjAsICMweDAwMDAwMDg3CUAgY2xlYXIgYml0cyA3LCAyOjAgKEItLS0gLUNBTSkKCW9ycglyMCwgcjAsICMweDAwMDAwMDAyCUAgc2V0IGJpdCAyIChBKSBBbGlnbgoJb3JyCXIwLCByMCwgIzB4MDAwMDEwMDAJQCBzZXQgYml0IDEyIChJKSBJLUNhY2hlCgltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCgoJLyoKCSAqIGJlZm9yZSByZWxvY2F0aW5nLCB3ZSBoYXZlIHRvIHNldHVwIFJBTSB0aW1pbmcKCSAqIGJlY2F1c2UgbWVtb3J5IHRpbWluZyBpcyBib2FyZC1kZXBlbmRlbmQsIHlvdSB3aWxsCgkgKiBmaW5kIGEgbG93bGV2ZWxfaW5pdC5TIGluIHlvdXIgYm9hcmQgZGlyZWN0b3J5LgoJICovCgltb3YJaXAsIGxyCgoJYmwJbG93bGV2ZWxfaW5pdAoKCW1vdglsciwgaXAKCW1vdglwYywgbHIKI2VuZGlmIC8qIENPTkZJR19TS0lQX0xPV0xFVkVMX0lOSVQgKi8KCi8qCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEludGVycnVwdCBoYW5kbGluZwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KCkAKQCBJUlEgc3RhY2sgZnJhbWUuCkAKI2RlZmluZSBTX0ZSQU1FX1NJWkUJNzIKCiNkZWZpbmUgU19PTERfUjAJNjgKI2RlZmluZSBTX1BTUgkJNjQKI2RlZmluZSBTX1BDCQk2MAojZGVmaW5lIFNfTFIJCTU2CiNkZWZpbmUgU19TUAkJNTIKCiNkZWZpbmUgU19JUAkJNDgKI2RlZmluZSBTX0ZQCQk0NAojZGVmaW5lIFNfUjEwCQk0MAojZGVmaW5lIFNfUjkJCTM2CiNkZWZpbmUgU19SOAkJMzIKI2RlZmluZSBTX1I3CQkyOAojZGVmaW5lIFNfUjYJCTI0CiNkZWZpbmUgU19SNQkJMjAKI2RlZmluZSBTX1I0CQkxNgojZGVmaW5lIFNfUjMJCTEyCiNkZWZpbmUgU19SMgkJOAojZGVmaW5lIFNfUjEJCTQKI2RlZmluZSBTX1IwCQkwCgojZGVmaW5lIE1PREVfU1ZDCTB4MTMKI2RlZmluZSBJX0JJVAkJMHg4MAoKLyoKICogdXNlIGJhZF9zYXZlX3VzZXJfcmVncyBmb3IgYWJvcnQvcHJlZmV0Y2gvdW5kZWYvc3dpIC4uLgogKiB1c2UgaXJxX3NhdmVfdXNlcl9yZWdzIC8gaXJxX3Jlc3RvcmVfdXNlcl9yZWdzIGZvciBJUlEvRklRIGhhbmRsaW5nCiAqLwoKCS5tYWNybwliYWRfc2F2ZV91c2VyX3JlZ3MKCXN1YglzcCwgc3AsICNTX0ZSQU1FX1NJWkUKCXN0bWlhCXNwLCB7cjAgLSByMTJ9CQkJQCBDYWxsaW5nIHIwLXIxMgojaWYgZGVmaW5lZChDT05GSUdfU1lTX0FSTV9XSVRIT1VUX1JFTE9DKQoJbGRyCXIyLCBfYXJtYm9vdF9zdGFydAoJc3ViCXIyLCByMiwgIyhDT05GSUdfU1RBQ0tTSVpFKQoJc3ViCXIyLCByMiwgIyhDT05GSUdfU1lTX01BTExPQ19MRU4pCgkvKiBzZXQgYmFzZSAyIHdvcmRzIGludG8gYWJvcnQgc3RhY2sgKi8KCXN1YglyMiwgcjIsICMoR0VORVJBVEVEX0dCTF9EQVRBX1NJWkUrOCkKI2Vsc2UKCWxkcglyMiwgSVJRX1NUQUNLX1NUQVJUX0lOCiNlbmRpZgoJbGRtaWEJcjIsIHtyMiAtIHIzfQkJCUAgZ2V0IHBjLCBjcHNyCglhZGQJcjAsIHNwLCAjU19GUkFNRV9TSVpFCQlAIHJlc3RvcmUgc3BfU1ZDCgoJYWRkCXI1LCBzcCwgI1NfU1AKCW1vdglyMSwgbHIKCXN0bWlhCXI1LCB7cjAgLSByM30JCQlAIHNhdmUgc3BfU1ZDLCBscl9TVkMsIHBjLCBjcHNyCgltb3YJcjAsIHNwCgkuZW5kbQoKCS5tYWNybwlpcnFfc2F2ZV91c2VyX3JlZ3MKCXN1YglzcCwgc3AsICNTX0ZSQU1FX1NJWkUKCXN0bWlhCXNwLCB7cjAgLSByMTJ9CQkJQCBDYWxsaW5nIHIwLXIxMgoJYWRkCXI3LCBzcCwgI1NfUEMKCXN0bWRiCXI3LCB7c3AsIGxyfV4JCQlAIENhbGxpbmcgU1AsIExSCglzdHIJbHIsIFtyNywgIzBdCQkJQCBTYXZlIGNhbGxpbmcgUEMKCW1ycwlyNiwgc3BzcgoJc3RyCXI2LCBbcjcsICM0XQkJCUAgU2F2ZSBDUFNSCglzdHIJcjAsIFtyNywgIzhdCQkJQCBTYXZlIE9MRF9SMAoJbW92CXIwLCBzcAoJLmVuZG0KCgkubWFjcm8JaXJxX3Jlc3RvcmVfdXNlcl9yZWdzCglsZG1pYQlzcCwge3IwIC0gbHJ9XgkJCUAgQ2FsbGluZyByMCAtIGxyCgltb3YJcjAsIHIwCglsZHIJbHIsIFtzcCwgI1NfUENdCQkJQCBHZXQgUEMKCWFkZAlzcCwgc3AsICNTX0ZSQU1FX1NJWkUKCS8qIHJldHVybiAmIG1vdmUgc3Bzcl9zdmMgaW50byBjcHNyICovCglzdWJzCXBjLCBsciwgIzQKCS5lbmRtCgoJLm1hY3JvIGdldF9iYWRfc3RhY2sKI2lmIGRlZmluZWQoQ09ORklHX1NZU19BUk1fV0lUSE9VVF9SRUxPQykKCWxkcglyMTMsIF9hcm1ib290X3N0YXJ0CQlAIHNldHVwIG91ciBtb2RlIHN0YWNrCglzdWIJcjEzLCByMTMsICMoQ09ORklHX1NUQUNLU0laRSkKCXN1YglyMTMsIHIxMywgIyhDT05GSUdfU1lTX01BTExPQ19MRU4pCgkvKiByZXNlcnZlIGEgY291cGxlIHNwb3RzIGluIGFib3J0IHN0YWNrICovCglzdWIJcjEzLCByMTMsICMoR0VORVJBVEVEX0dCTF9EQVRBX1NJWkUrOCkKI2Vsc2UKCWxkcglyMTMsIElSUV9TVEFDS19TVEFSVF9JTgkJQCBzZXR1cCBvdXIgbW9kZSBzdGFjawojZW5kaWYKCglzdHIJbHIsIFtyMTNdCQkJQCBzYXZlIGNhbGxlciBsciAvIHNwc3IKCW1ycwlsciwgc3BzcgoJc3RyCWxyLCBbcjEzLCAjNF0KCgltb3YJcjEzLCAjTU9ERV9TVkMJCQlAIHByZXBhcmUgU1ZDLU1vZGUKCUAgbXNyCXNwc3JfYywgcjEzCgltc3IJc3BzciwgcjEzCgltb3YJbHIsIHBjCgltb3ZzCXBjLCBscgoJLmVuZG0KCgkubWFjcm8gZ2V0X2lycV9zdGFjawkJCUAgc2V0dXAgSVJRIHN0YWNrCglsZHIJc3AsIElSUV9TVEFDS19TVEFSVAoJLmVuZG0KCgkubWFjcm8gZ2V0X2ZpcV9zdGFjawkJCUAgc2V0dXAgRklRIHN0YWNrCglsZHIJc3AsIEZJUV9TVEFDS19TVEFSVAoJLmVuZG0KCi8qCiAqIGV4Y2VwdGlvbiBoYW5kbGVycwogKi8KCS5hbGlnbiAgNQp1bmRlZmluZWRfaW5zdHJ1Y3Rpb246CglnZXRfYmFkX3N0YWNrCgliYWRfc2F2ZV91c2VyX3JlZ3MKCWJsCWRvX3VuZGVmaW5lZF9pbnN0cnVjdGlvbgoKCS5hbGlnbgk1CnNvZnR3YXJlX2ludGVycnVwdDoKCWdldF9iYWRfc3RhY2sKCWJhZF9zYXZlX3VzZXJfcmVncwoJYmwJZG9fc29mdHdhcmVfaW50ZXJydXB0CgoJLmFsaWduCTUKcHJlZmV0Y2hfYWJvcnQ6CglnZXRfYmFkX3N0YWNrCgliYWRfc2F2ZV91c2VyX3JlZ3MKCWJsCWRvX3ByZWZldGNoX2Fib3J0CgoJLmFsaWduCTUKZGF0YV9hYm9ydDoKCWdldF9iYWRfc3RhY2sKCWJhZF9zYXZlX3VzZXJfcmVncwoJYmwJZG9fZGF0YV9hYm9ydAoKCS5hbGlnbgk1Cm5vdF91c2VkOgoJZ2V0X2JhZF9zdGFjawoJYmFkX3NhdmVfdXNlcl9yZWdzCglibAlkb19ub3RfdXNlZAoKI2lmZGVmIENPTkZJR19VU0VfSVJRCgoJLmFsaWduCTUKaXJxOgoJZ2V0X2lycV9zdGFjawoJaXJxX3NhdmVfdXNlcl9yZWdzCglibAlkb19pcnEKCWlycV9yZXN0b3JlX3VzZXJfcmVncwoKCS5hbGlnbgk1CmZpcToKCWdldF9maXFfc3RhY2sKCS8qIHNvbWVvbmUgb3VnaHQgdG8gd3JpdGUgYSBtb3JlIGVmZmljdGlvbiBmaXFfc2F2ZV91c2VyX3JlZ3MgKi8KCWlycV9zYXZlX3VzZXJfcmVncwoJYmwJZG9fZmlxCglpcnFfcmVzdG9yZV91c2VyX3JlZ3MKCiNlbHNlCgoJLmFsaWduCTUKaXJxOgoJZ2V0X2JhZF9zdGFjawoJYmFkX3NhdmVfdXNlcl9yZWdzCglibAlkb19pcnEKCgkuYWxpZ24JNQpmaXE6CglnZXRfYmFkX3N0YWNrCgliYWRfc2F2ZV91c2VyX3JlZ3MKCWJsCWRvX2ZpcQoKI2VuZGlmCg==