LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJsYXAuaAogKiBWZXJzaW9uOiAgICAgICAwLjgKICogRGVzY3JpcHRpb246ICAgQW4gSXJEQSBMQVAgZHJpdmVyIGZvciBMaW51eAogKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCiAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogQ3JlYXRlZCBhdDogICAgTW9uIEF1ZyAgNCAyMDo0MDo1MyAxOTk3CiAqIE1vZGlmaWVkIGF0OiAgIEZyaSBEZWMgMTAgMTM6MjE6MTcgMTk5OQogKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIAogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwgCiAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgogKiAgICAgCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCiAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgogKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZm5kZWYgSVJMQVBfSAojZGVmaW5lIElSTEFQX0gKCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgojaW5jbHVkZSA8bGludXgvdGltZXIuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcnF1ZXVlLmg+CQkvKiBpcmRhX3F1ZXVlX3QgKi8KI2luY2x1ZGUgPG5ldC9pcmRhL3Fvcy5oPgkJLyogc3RydWN0IHFvc19pbmZvICovCiNpbmNsdWRlIDxuZXQvaXJkYS9kaXNjb3ZlcnkuaD4JCS8qIGRpc2NvdmVyeV90ICovCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcF9ldmVudC5oPgkvKiBJUkxBUF9TVEFURSwgLi4uICovCiNpbmNsdWRlIDxuZXQvaXJkYS9pcm1vZC5oPgkJLyogc3RydWN0IG5vdGlmeV90ICovCgojZGVmaW5lIENPTkZJR19JUkRBX0RZTkFNSUNfV0lORE9XIDEKCiNkZWZpbmUgTEFQX1JFTElBQkxFICAgMQojZGVmaW5lIExBUF9VTlJFTElBQkxFIDAKCiNkZWZpbmUgTEFQX0FERFJfSEVBREVSIDEgIC8qIElyTEFQIEFkZHJlc3MgSGVhZGVyICovCiNkZWZpbmUgTEFQX0NUUkxfSEVBREVSIDEgIC8qIElyTEFQIENvbnRyb2wgSGVhZGVyICovCgovKiBNYXkgYmUgZGlmZmVyZW50IHdoZW4gd2UgZ2V0IFZGSVIgKi8KI2RlZmluZSBMQVBfTUFYX0hFQURFUiAoTEFQX0FERFJfSEVBREVSICsgTEFQX0NUUkxfSEVBREVSKQoKI2RlZmluZSBCUk9BRENBU1QgIDB4ZmZmZmZmZmYgLyogQnJvYWRjYXN0IGRldmljZSBhZGRyZXNzICovCiNkZWZpbmUgQ0JST0FEQ0FTVCAweGZlICAgICAgIC8qIENvbm5lY3Rpb24gYnJvYWRjYXN0IGFkZHJlc3MgKi8KI2RlZmluZSBYSURfRk9STUFUIDB4MDEgICAgICAgLyogRGlzY292ZXJ5IFhJRCBmb3JtYXQgKi8KCi8qIE5vYm9keSBzZWVtcyB0byB1c2UgdGhpcyBjb25zdGFudC4gKi8KI2RlZmluZSBMQVBfV0lORE9XX1NJWkUgOAovKiBXZSBrZWVwIHRoZSBMQVAgcXVldWUgdmVyeSBzbWFsbCB0byBtaW5pbWlzZSB0aGUgYW1vdW50IG9mIGJ1ZmZlcmluZy4KICogdGhpcyBpbXByb3ZlIGxhdGVuY3kgYW5kIHJlZHVjZSByZXNvdXJjZSBjb25zdW1wdGlvbi4KICogVGhpcyB3b3JrIG9ubHkgYmVjYXVzZSB3ZSBoYXZlIHN5bmNocm9ub3VzIHJlZmlsbGluZyBvZiBJckxBUCB0aHJvdWdoCiAqIHRoZSBmbG93IGNvbnRyb2wgbWVjaGFuaXNtICh2aWEgc2NoZWR1bGVyIGFuZCBJclRUUCkuCiAqIDIgYnVmZmVycyBpcyB0aGUgbWluaW11bSB3ZSBjYW4gd29yayB3aXRoLCBvbmUgdGhhdCB3ZSBzZW5kIHdoaWxlIHBvbGxpbmcKICogSXJUVFAsIGFuZCBhbm90aGVyIHRvIGtub3cgdGhhdCB3ZSBzaG91bGQgbm90IHNlbmQgdGhlIHBmIGJpdC4KICogSmVhbiBJSSAqLwojZGVmaW5lIExBUF9ISUdIX1RIUkVTSE9MRCAgICAgMgovKiBTb21lIHJhcmUgbm9uIFRUUCBjbGllbnRzIGRvbid0IGltcGxlbWVudCBmbG93IGNvbnRyb2wsIGFuZAogKiBzbyBkb24ndCBjb21wbHkgd2l0aCB0aGUgYWJvdmUgbGltaXQgKGFuZCBuZWl0aGVyIHdpdGggdGhpcyBvbmUpLgogKiBGb3IgSUFQIGFuZCBtYW5hZ2VtZW50LCBpdCBkb2Vzbid0IG1hdHRlciwgYmVjYXVzZSB0aGV5IG5ldmVyIHRyYW5zbWl0IG11Y2guCiAqLkZvciBJckxQVCwgdGhpcyBzaG91bGQgYmUgZml4ZWQuCiAqIC0gSmVhbiBJSSAqLwojZGVmaW5lIExBUF9NQVhfUVVFVUUgMTAKLyogUGxlYXNlIG5vdGUgdGhhdCBhbGwgSXJEQSBtYW5hZ2VtZW50IGZyYW1lcyAoTE1QL1RUUCBjb25uIHJlcS9kaXNjIGFuZAogKiBJQVMgcXVlcmllcykgZmFsbCBpbiB0aGUgc2Vjb25kIGNhdGVnb3J5IGFuZCBhcmUgc2VudCB0byBMQVAgZXZlbiBpZiBUVFAKICogaXMgc3RvcHBlZC4gVGhpcyBtZWFucyB0aGF0IHRob3NlIGZyYW1lcyB3aWxsIHdhaXQgb25seSBhIG1heGltdW0gb2YKICogdHdvICgyKSBkYXRhIGZyYW1lcyBiZWZvcmUgYmVlaW5nIHNlbnQgb24gdGhlICJ3aXJlIiwgd2hpY2ggc3BlZWQgdXAKICogbmV3IHNvY2tldCBzZXR1cCB3aGVuIHRoZSBsaW5rIGlzIHNhdHVyYXRlZC4KICogU2FtZSBzdG9yeSBmb3IgdHdvIHNvY2tldHMgY29tcGV0aW5nIGZvciB0aGUgbWVkaXVtIDogaWYgb25lIHNhdHVyYXRlcwogKiB0aGUgTEFQLCB3aGVuIHRoZSBvdGhlciB3YW50IHRvIHRyYW5zbWl0IGl0IG9ubHkgaGFzIHRvIHdhaXQgZm9yCiAqIG1heGltdW0gdGhyZWUgKDMpIHBhY2tldHMgKDIgKyBvbmUgc2NoZWR1bGluZyksIHdoaWNoIGltcHJvdmUgcGVyZm9ybWFuY2UKICogb2YgZGVsYXkgc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucy4KICogSmVhbiBJSSAqLwoKI2RlZmluZSBOUl9FWFBFQ1RFRCAgICAgMQojZGVmaW5lIE5SX1VORVhQRUNURUQgICAwCiNkZWZpbmUgTlJfSU5WQUxJRCAgICAgLTEKCiNkZWZpbmUgTlNfRVhQRUNURUQgICAgIDEKI2RlZmluZSBOU19VTkVYUEVDVEVEICAgMAojZGVmaW5lIE5TX0lOVkFMSUQgICAgIC0xCgovKgogKiAgTWV0YSBpbmZvcm1hdGlvbiBwYXNzZWQgd2l0aGluIHRoZSBJckxBUCBzdGF0ZSBtYWNoaW5lCiAqLwpzdHJ1Y3QgaXJsYXBfaW5mbyB7CglfX3U4IGNhZGRyOyAgIC8qIENvbm5lY3Rpb24gYWRkcmVzcyAqLwoJX191OCBjb250cm9sOyAvKiBGcmFtZSB0eXBlICovCiAgICAgICAgX191OCBjbWQ7CgoJX191MzIgc2FkZHI7CglfX3UzMiBkYWRkcjsKCQoJaW50IHBmOyAgICAgICAgLyogUG9sbC9maW5hbCBiaXQgc2V0ICovCgoJX191OCAgbnI7ICAgICAgLyogU2VxdWVuY2UgbnVtYmVyIG9mIG5leHQgZnJhbWUgZXhwZWN0ZWQgKi8KCV9fdTggIG5zOyAgICAgIC8qIFNlcXVlbmNlIG51bWJlciBvZiBmcmFtZSBzZW50ICovCgoJaW50ICBTOyAgICAgICAgLyogTnVtYmVyIG9mIHNsb3RzICovCglpbnQgIHNsb3Q7ICAgICAvKiBSYW5kb20gY2hvc2VuIHNsb3QgKi8KCWludCAgczsgICAgICAgIC8qIEN1cnJlbnQgc2xvdCAqLwoKCWRpc2NvdmVyeV90ICpkaXNjb3Zlcnk7IC8qIERpc2NvdmVyeSBpbmZvcm1hdGlvbiAqLwp9OwoKLyogTWFpbiBzdHJ1Y3R1cmUgb2YgSXJMQVAgKi8Kc3RydWN0IGlybGFwX2NiIHsKCWlyZGFfcXVldWVfdCBxOyAgICAgLyogTXVzdCBiZSBmaXJzdCAqLwoJbWFnaWNfdCBtYWdpYzsKCgkvKiBEZXZpY2Ugd2UgYXJlIGF0dGFjaGVkIHRvICovCglzdHJ1Y3QgbmV0X2RldmljZSAgKm5ldGRldjsKCWNoYXIJCWh3X25hbWVbMipJRk5BTVNJWiArIDFdOwoKCS8qIENvbm5lY3Rpb24gc3RhdGUgKi8KCXZvbGF0aWxlIElSTEFQX1NUQVRFIHN0YXRlOyAgICAgICAvKiBDdXJyZW50IHN0YXRlICovCgoJLyogVGltZXJzIHVzZWQgYnkgSXJMQVAgKi8KCXN0cnVjdCB0aW1lcl9saXN0IHF1ZXJ5X3RpbWVyOwoJc3RydWN0IHRpbWVyX2xpc3Qgc2xvdF90aW1lcjsKCXN0cnVjdCB0aW1lcl9saXN0IGRpc2NvdmVyeV90aW1lcjsKCXN0cnVjdCB0aW1lcl9saXN0IGZpbmFsX3RpbWVyOwoJc3RydWN0IHRpbWVyX2xpc3QgcG9sbF90aW1lcjsKCXN0cnVjdCB0aW1lcl9saXN0IHdkX3RpbWVyOwoJc3RydWN0IHRpbWVyX2xpc3QgYmFja29mZl90aW1lcjsKCgkvKiBNZWRpYSBidXN5IHN0dWZmICovCglzdHJ1Y3QgdGltZXJfbGlzdCBtZWRpYV9idXN5X3RpbWVyOwoJaW50IG1lZGlhX2J1c3k7CgoJLyogVGltZW91dHMgd2hpY2ggd2lsbCBiZSBkaWZmZXJlbnQgd2l0aCBkaWZmZXJlbnQgdHVybiB0aW1lICovCglpbnQgc2xvdF90aW1lb3V0OwoJaW50IHBvbGxfdGltZW91dDsKCWludCBmaW5hbF90aW1lb3V0OwoJaW50IHdkX3RpbWVvdXQ7CgoJc3RydWN0IHNrX2J1ZmZfaGVhZCB0eHE7ICAvKiBGcmFtZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KCXN0cnVjdCBza19idWZmX2hlYWQgdHhxX3VsdHJhOwoKIAlfX3U4ICAgIGNhZGRyOyAgICAgICAgLyogQ29ubmVjdGlvbiBhZGRyZXNzICovCglfX3UzMiAgIHNhZGRyOyAgICAgICAgLyogU291cmNlIGRldmljZSBhZGRyZXNzICovCglfX3UzMiAgIGRhZGRyOyAgICAgICAgLyogRGVzdGluYXRpb24gZGV2aWNlIGFkZHJlc3MgKi8KCglpbnQgICAgIHJldHJ5X2NvdW50OyAgLyogVGltZXMgdHJpZWQgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb24gKi8KCWludCAgICAgYWRkX3dhaXQ7ICAgICAvKiBUcnVlIGlmIHdlIGFyZSB3YWl0aW5nIGZvciBmcmFtZSAqLwoKCV9fdTggICAgY29ubmVjdF9wZW5kaW5nOwoJX191OCAgICBkaXNjb25uZWN0X3BlbmRpbmc7CgoJLyogIFRvIHNlbmQgYSBmYXN0ZXIgUlIgaWYgdHggcXVldWUgZW1wdHkgKi8KI2lmZGVmIENPTkZJR19JUkRBX0ZBU1RfUlIKCWludCAgICAgZmFzdF9SUl90aW1lb3V0OwoJaW50ICAgICBmYXN0X1JSOyAgICAgIAojZW5kaWYgLyogQ09ORklHX0lSREFfRkFTVF9SUiAqLwoJCglpbnQgTjE7IC8qIE4xICogRi10aW1lciA9IE5lZ2l0aWF0ZWQgbGluayBkaXNjb25uZWN0IHdhcm5pbmcgdGhyZXNob2xkICovCglpbnQgTjI7IC8qIE4yICogRi10aW1lciA9IE5lZ2l0aWF0ZWQgbGluayBkaXNjb25uZWN0IHRpbWUgKi8KCWludCBOMzsgLyogQ29ubmVjdGlvbiByZXRyeSBjb3VudCAqLwoKCWludCAgICAgbG9jYWxfYnVzeTsKCWludCAgICAgcmVtb3RlX2J1c3k7CglpbnQgICAgIHhtaXRmbGFnOwoKCV9fdTggICAgdnM7ICAgICAgICAgICAgLyogTmV4dCBmcmFtZSB0byBiZSBzZW50ICovCglfX3U4ICAgIHZyOyAgICAgICAgICAgIC8qIE5leHQgZnJhbWUgdG8gYmUgcmVjZWl2ZWQgKi8KCV9fdTggICAgdmE7ICAgICAgICAgICAgLyogTGFzdCBmcmFtZSBhY2tlZCAqLwogCWludCAgICAgd2luZG93OyAgICAgICAgLyogTnIgb2YgSS1mcmFtZXMgYWxsb3dlZCB0byBzZW5kICovCglpbnQgICAgIHdpbmRvd19zaXplOyAgIC8qIEN1cnJlbnQgbmVnb3RpYXRlZCB3aW5kb3cgc2l6ZSAqLwoKI2lmZGVmIENPTkZJR19JUkRBX0RZTkFNSUNfV0lORE9XCglfX3UzMiAgIGxpbmVfY2FwYWNpdHk7IC8qIE51bWJlciBvZiBieXRlcyBhbGxvd2VkIHRvIHNlbmQgKi8KCV9fdTMyICAgYnl0ZXNfbGVmdDsgICAgLyogTnVtYmVyIG9mIGJ5dGVzIHN0aWxsIGFsbG93ZWQgdG8gdHJhbnNtaXQgKi8KI2VuZGlmIC8qIENPTkZJR19JUkRBX0RZTkFNSUNfV0lORE9XICovCgoJc3RydWN0IHNrX2J1ZmZfaGVhZCB3eF9saXN0OwoKCV9fdTggICAgYWNrX3JlcXVpcmVkOwoJCgkvKiBYSUQgcGFyYW1ldGVycyAqLwogCV9fdTggICAgUzsgICAgICAgICAgIC8qIE51bWJlciBvZiBzbG90cyAqLwoJX191OCAgICBzbG90OyAgICAgICAgLyogUmFuZG9tIGNob3NlbiBzbG90ICovCiAJX191OCAgICBzOyAgICAgICAgICAgLyogQ3VycmVudCBzbG90ICovCglpbnQgICAgIGZyYW1lX3NlbnQ7ICAvKiBIYXZlIHdlIHNlbnQgcmVwbHk/ICovCgoJaGFzaGJpbl90ICAgKmRpc2NvdmVyeV9sb2c7CiAJZGlzY292ZXJ5X3QgKmRpc2NvdmVyeV9jbWQ7CgoJX191MzIgc3BlZWQ7CQkvKiBMaW5rIHNwZWVkICovCgoJc3RydWN0IHFvc19pbmZvICBxb3NfdHg7ICAgLyogUW9TIHJlcXVlc3RlZCBieSBwZWVyICovCglzdHJ1Y3QgcW9zX2luZm8gIHFvc19yeDsgICAvKiBRb1MgcmVxdWVzdGVkIGJ5IHNlbGYgKi8KCXN0cnVjdCBxb3NfaW5mbyAqcW9zX2RldjsgIC8qIFFvUyBzdXBwb3J0ZWQgYnkgZGV2aWNlICovCgoJbm90aWZ5X3Qgbm90aWZ5OyAvKiBDYWxsYmFja3MgdG8gSXJMTVAgKi8KCglpbnQgICAgbXR0X3JlcXVpcmVkOyAgLyogTWludW11bSB0dXJuYXJvdW5kIHRpbWUgcmVxdWlyZWQgKi8KCWludCAgICB4Ym9mc19kZWxheTsgICAvKiBOciBvZiBYQk9GJ3MgdXNlZCB0byBNVFQgKi8KCWludCAgICBib2ZzX2NvdW50OyAgICAvKiBOZWdvdGlhdGVkIGV4dHJhIEJPRnMgKi8KCWludCAgICBuZXh0X2JvZnM7ICAgICAvKiBOZWdvdGlhdGVkIGV4dHJhIEJPRnMgYWZ0ZXIgbmV4dCBmcmFtZSAqLwp9OwoKLyogCiAqICBGdW5jdGlvbiBwcm90b3R5cGVzIAogKi8KaW50IGlybGFwX2luaXQodm9pZCk7CnZvaWQgaXJsYXBfY2xlYW51cCh2b2lkKTsKCnN0cnVjdCBpcmxhcF9jYiAqaXJsYXBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcW9zX2luZm8gKnFvcywKCQkJICAgIGNvbnN0IGNoYXIgKmh3X25hbWUpOwp2b2lkIGlybGFwX2Nsb3NlKHN0cnVjdCBpcmxhcF9jYiAqc2VsZik7Cgp2b2lkIGlybGFwX2Nvbm5lY3RfcmVxdWVzdChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIF9fdTMyIGRhZGRyLCAKCQkJICAgc3RydWN0IHFvc19pbmZvICpxb3MsIGludCBzbmlmZik7CnZvaWQgaXJsYXBfY29ubmVjdF9yZXNwb25zZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpOwp2b2lkIGlybGFwX2Nvbm5lY3RfaW5kaWNhdGlvbihzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpOwp2b2lkIGlybGFwX2Nvbm5lY3RfY29uZmlybShzdHJ1Y3QgaXJsYXBfY2IgKiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Cgp2b2lkIGlybGFwX2RhdGFfaW5kaWNhdGlvbihzdHJ1Y3QgaXJsYXBfY2IgKiwgc3RydWN0IHNrX2J1ZmYgKiwgaW50IHVucmVsaWFibGUpOwp2b2lkIGlybGFwX2RhdGFfcmVxdWVzdChzdHJ1Y3QgaXJsYXBfY2IgKiwgc3RydWN0IHNrX2J1ZmYgKiwgaW50IHVucmVsaWFibGUpOwoKI2lmZGVmIENPTkZJR19JUkRBX1VMVFJBCnZvaWQgaXJsYXBfdW5pdGRhdGFfcmVxdWVzdChzdHJ1Y3QgaXJsYXBfY2IgKiwgc3RydWN0IHNrX2J1ZmYgKik7CnZvaWQgaXJsYXBfdW5pdGRhdGFfaW5kaWNhdGlvbihzdHJ1Y3QgaXJsYXBfY2IgKiwgc3RydWN0IHNrX2J1ZmYgKik7CiNlbmRpZiAvKiBDT05GSUdfSVJEQV9VTFRSQSAqLwoKdm9pZCBpcmxhcF9kaXNjb25uZWN0X3JlcXVlc3Qoc3RydWN0IGlybGFwX2NiICopOwp2b2lkIGlybGFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzdHJ1Y3QgaXJsYXBfY2IgKiwgTEFQX1JFQVNPTiByZWFzb24pOwoKdm9pZCBpcmxhcF9zdGF0dXNfaW5kaWNhdGlvbihzdHJ1Y3QgaXJsYXBfY2IgKiwgaW50IHF1YWxpdHlfb2ZfbGluayk7Cgp2b2lkIGlybGFwX3Rlc3RfcmVxdWVzdChfX3U4ICppbmZvLCBpbnQgbGVuKTsKCnZvaWQgaXJsYXBfZGlzY292ZXJ5X3JlcXVlc3Qoc3RydWN0IGlybGFwX2NiICosIGRpc2NvdmVyeV90ICpkaXNjb3ZlcnkpOwp2b2lkIGlybGFwX2Rpc2NvdmVyeV9jb25maXJtKHN0cnVjdCBpcmxhcF9jYiAqLCBoYXNoYmluX3QgKmRpc2NvdmVyeV9sb2cpOwp2b2lkIGlybGFwX2Rpc2NvdmVyeV9pbmRpY2F0aW9uKHN0cnVjdCBpcmxhcF9jYiAqLCBkaXNjb3ZlcnlfdCAqZGlzY292ZXJ5KTsKCnZvaWQgaXJsYXBfcmVzZXRfaW5kaWNhdGlvbihzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYpOwp2b2lkIGlybGFwX3Jlc2V0X2NvbmZpcm0odm9pZCk7Cgp2b2lkIGlybGFwX3VwZGF0ZV9ucl9yZWNlaXZlZChzdHJ1Y3QgaXJsYXBfY2IgKiwgaW50IG5yKTsKaW50IGlybGFwX3ZhbGlkYXRlX25yX3JlY2VpdmVkKHN0cnVjdCBpcmxhcF9jYiAqLCBpbnQgbnIpOwppbnQgaXJsYXBfdmFsaWRhdGVfbnNfcmVjZWl2ZWQoc3RydWN0IGlybGFwX2NiICosIGludCBucyk7CgppbnQgIGlybGFwX2dlbmVyYXRlX3JhbmRfdGltZV9zbG90KGludCBTLCBpbnQgcyk7CnZvaWQgaXJsYXBfaW5pdGlhdGVfY29ubmVjdGlvbl9zdGF0ZShzdHJ1Y3QgaXJsYXBfY2IgKik7CnZvaWQgaXJsYXBfZmx1c2hfYWxsX3F1ZXVlcyhzdHJ1Y3QgaXJsYXBfY2IgKik7CnZvaWQgaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc3RydWN0IGlybGFwX2NiICosIHN0cnVjdCBxb3NfaW5mbyAqKTsKCnZvaWQgaXJsYXBfYXBwbHlfZGVmYXVsdF9jb25uZWN0aW9uX3BhcmFtZXRlcnMoc3RydWN0IGlybGFwX2NiICpzZWxmKTsKdm9pZCBpcmxhcF9hcHBseV9jb25uZWN0aW9uX3BhcmFtZXRlcnMoc3RydWN0IGlybGFwX2NiICpzZWxmLCBpbnQgbm93KTsKCiNkZWZpbmUgSVJMQVBfR0VUX0hFQURFUl9TSVpFKHNlbGYpIChMQVBfTUFYX0hFQURFUikKI2RlZmluZSBJUkxBUF9HRVRfVFhfUVVFVUVfTEVOKHNlbGYpIHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4cSkKCi8qIFJldHVybiBUUlVFIGlmIHRoZSBub2RlIGlzIGluIHByaW1hcnkgbW9kZSAoaS5lLiBtYXN0ZXIpCiAqIC0gSmVhbiBJSSAqLwpzdGF0aWMgaW5saW5lIGludCBpcmxhcF9pc19wcmltYXJ5KHN0cnVjdCBpcmxhcF9jYiAqc2VsZikKewoJaW50IHJldDsKCXN3aXRjaChzZWxmLT5zdGF0ZSkgewoJY2FzZSBMQVBfWE1JVF9QOgoJY2FzZSBMQVBfTlJNX1A6CgkJcmV0ID0gMTsKCQlicmVhazsKCWNhc2UgTEFQX1hNSVRfUzoKCWNhc2UgTEFQX05STV9TOgoJCXJldCA9IDA7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldCA9IC0xOwoJfQoJcmV0dXJuKHJldCk7Cn0KCi8qIENsZWFyIGEgcGVuZGluZyBJckxBUCBkaXNjb25uZWN0LiAtIEplYW4gSUkgKi8Kc3RhdGljIGlubGluZSB2b2lkIGlybGFwX2NsZWFyX2Rpc2Nvbm5lY3Qoc3RydWN0IGlybGFwX2NiICpzZWxmKQp7CglzZWxmLT5kaXNjb25uZWN0X3BlbmRpbmcgPSBGQUxTRTsKfQoKI2VuZGlmCg==