Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIGZzY2suYyAtIGEgZmlsZSBzeXN0ZW0gY29uc2lzdGVuY3kgY2hlY2tlciBmb3IgTGludXguCiAqCiAqIChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzLgogKgogKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHRhcmJhbGwgZm9yIGRldGFpbHMuCiAqLwoKLyoKICogMDkuMTEuOTEgIC0gIG1hZGUgdGhlIGZpcnN0IHJ1ZGltZW50YXJ5IGZ1bmN0aW9ucwogKgogKiAxMC4xMS45MSAgLSAgdXBkYXRlZCwgZG9lcyBjaGVja2luZywgbm8gcmVwYWlycyB5ZXQuCiAqCQlTZW50IG91dCB0byB0aGUgbWFpbGluZy1saXN0IGZvciB0ZXN0aW5nLgogKgogKiAxNC4xMS45MSAgLQlUZXN0aW5nIHNlZW1zIHRvIGhhdmUgZ29uZSB3ZWxsLiBBZGRlZCBzb21lCiAqCQljb3JyZWN0aW9uLWNvZGUsIGFuZCBjaGFuZ2VkIHNvbWUgZnVuY3Rpb25zLgogKgogKiAxNS4xMS45MSAgLSAgTW9yZSBjb3JyZWN0aW9uIGNvZGUuIEhvcGVmdWxseSBpdCBub3RpY2VzIG1vc3QKICoJCWNhc2VzIG5vdywgYW5kIHRyaWVzIHRvIGRvIHNvbWV0aGluZyBhYm91dCB0aGVtLgogKgogKiAxNi4xMS45MSAgLSAgTW9yZSBjb3JyZWN0aW9ucyAodGhhbmtzIHRvIE1pa2EgSmFsYXZhKS4gTW9zdAogKgkJdGhpbmdzIHNlZW0gdG8gd29yayBub3cuIFllYWgsIHN1cmUuCiAqCiAqCiAqIDE5LjA0LjkyICAtCUhhZCB0byBzdGFydCBvdmVyIGFnYWluIGZyb20gdGhpcyBvbGQgdmVyc2lvbiwgYXMgYQogKgkJa2VybmVsIGJ1ZyBhdGUgbXkgZW5oYW5jZWQgZnNjayBpbiBmZWJydWFyeS4KICoKICogMjguMDIuOTMgIC0JYWRkZWQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IGRpcmVjdG9yeSBlbnRyeSBzaXplcy4uCiAqCiAqIFNhdCBNYXIgIDYgMTg6NTk6NDIgMTk5MywgZmFpdGhAY3MudW5jLmVkdTogT3V0cHV0IG5hbWVsZW4gd2l0aAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLWJsb2NrIGluZm9ybWF0aW9uCiAqCiAqIFNhdCBPY3QgIDkgMTE6MTc6MTEgMTk5MywgZmFpdGhAY3MudW5jLmVkdTogbWFrZSBleGl0IHN0YXR1cyBjb25mb3JtCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhhdCByZXF1aXJlZCBieSBmc3V0aWwKICoKICogTW9uIEphbiAgMyAxMTowNjo1MiAxOTk0IC0gRHIuIFdldHRzdGVpbiAoZ3JlZyV3aW5kLnV1Y3BAcGxhaW5zLm5vZGFrLmVkdSkKICoJCQkgICAgICBBZGRlZCBzdXBwb3J0IGZvciBmaWxlIHN5c3RlbSB2YWxpZCBmbGFnLiAgQWxzbwogKgkJCSAgICAgIGFkZGVkIHByb2dyYW1fdmVyc2lvbiB2YXJpYWJsZSBhbmQgb3V0cHV0IG9mCiAqCQkJICAgICAgcHJvZ3JhbSBuYW1lIGFuZCB2ZXJzaW9uIG51bWJlciB3aGVuIHByb2dyYW0KICoJCQkgICAgICBpcyBleGVjdXRlZC4KICoKICogMzAuMTAuOTQgLSBhZGRlZCBzdXBwb3J0IGZvciB2MiBmaWxlc3lzdGVtCiAqICAgICAgICAgICAgKEFuZHJlYXMgU2Nod2FiLCBzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGUpCiAqCiAqIDEwLjEyLjk0ICAtICBhZGRlZCB0ZXN0IHRvIHByZXZlbnQgY2hlY2tpbmcgb2YgbW91bnRlZCBmcyBhZGFwdGVkCiAqICAgICAgICAgICAgICBmcm9tIFRoZW9kb3JlIFRzJ28ncyAodHl0c29AYXRoZW5hLm1pdC5lZHUpIGUyZnNjawogKiAgICAgICAgICAgICAgcHJvZ3JhbS4gIChEYW5pZWwgUXVpbmxhbiwgcXVpbmxhbkB5Z2dkcmFzaWwuY29tKQogKgogKiAwMS4wNy45NiAgLSBGaXhlZCB0aGUgdjIgZnMgc3R1ZmYgdG8gdXNlIHRoZSByaWdodCAjZGVmaW5lcyBhbmQgc3VjaAogKgkgICAgICAgZm9yIG1vZGVybiBsaWJjcyAoamFubEBtYXRoLnVpby5ubywgTmljb2xhaSBMYW5nZmVsZHQpCiAqCiAqIDAyLjA3Ljk2ICAtIEFkZGVkIEMgYml0IGZpZGRsaW5nIHJvdXRpbmVzIGZyb20gcm1rQGVjcy5zb3Rvbi5hYy51awogKiAgICAgICAgICAgICAoUnVzc2VsbCBLaW5nKS4gIEhlIG1hZGUgdGhlbSBmb3IgQVJNLiAgSXQgd291bGQgc2VlbQogKgkgICAgICAgdGhhdCB0aGUgQVJNIGlzIHBvd2VyZnVsIGVub3VnaCB0byBkbyB0aGlzIGluIEMgd2hlcmVhcwogKiAgICAgICAgICAgICBpMzg2IGFuZCBtNjRrIG11c3QgdXNlIGFzc2VtYmx5IHRvIGdldCBpdCBmYXN0ID46LSkKICoJICAgICAgIFRoaXMgc2hvdWxkIG1ha2UgbWluaXggZnNjayBzeXN0ZW0taW5kZXBlbmRlbnQuCiAqCSAgICAgICAoamFubEBtYXRoLnVpby5ubywgTmljb2xhaSBMYW5nZmVsZHQpCiAqCiAqIDA0LjExLjk2ICAtIEFkZGVkIG1pbm9yIGZpeGVzIGZyb20gQW5kcmVhcyBTY2h3YWIgdG8gYXZvaWQgY29tcGlsZXIKICogICAgICAgICAgICAgd2FybmluZ3MuICBBZGRlZCBtYzY4ayBiaXRvcHMgZnJvbQogKgkgICAgICAgSm9lcmcgRG9yY2hhaW4gPGRvcmNoYWluQG1waS1zYi5tcGcuZGU+LgogKgogKiAwNi4xMS45NiAgLSBBZGRlZCB2MiBjb2RlIHN1Ym1pdHRlZCBieSBKb2VyZyBEb3JjaGFpbiwgYnV0IHdyaXR0ZW4gYnkKICogICAgICAgICAgICAgQW5kcmVhcyBTY2h3YWIuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqCiAqIEkndmUgaGFkIG5vIHRpbWUgdG8gYWRkIGNvbW1lbnRzIC0gaG9wZWZ1bGx5IHRoZSBmdW5jdGlvbiBuYW1lcwogKiBhcmUgY29tbWVudHMgZW5vdWdoLiBBcyB3aXRoIGFsbCBmaWxlIHN5c3RlbSBjaGVja2VycywgdGhpcyBhc3N1bWVzCiAqIHRoZSBmaWxlIHN5c3RlbSBpcyBxdWllc2NlbnQgLSBkb24ndCB1c2UgaXQgb24gYSBtb3VudGVkIGRldmljZQogKiB1bmxlc3MgeW91IGNhbiBiZSBzdXJlIG5vYm9keSBpcyB3cml0aW5nIHRvIGl0IChhbmQgcmVtZW1iZXIgdGhhdCB0aGUKICoga2VybmVsIGNhbiB3cml0ZSB0byBpdCB3aGVuIGl0IHNlYXJjaGVzIGZvciBmaWxlcykuCiAqCiAqIFVzYWdlOiBmc2NrIFstbGFydnNtXSBkZXZpY2UKICoJLWwgZm9yIGEgbGlzdGluZyBvZiBhbGwgdGhlIGZpbGVuYW1lcwogKgktYSBmb3IgYXV0b21hdGljIHJlcGFpcnMgKG5vdCBpbXBsZW1lbnRlZCkKICoJLXIgZm9yIHJlcGFpcnMgKGludGVyYWN0aXZlKSAobm90IGltcGxlbWVudGVkKQogKgktdiBmb3IgdmVyYm9zZSAodGVsbHMgaG93IG1hbnkgZmlsZXMpCiAqCS1zIGZvciBzdXBlci1ibG9jayBpbmZvCiAqCS1tIGZvciBtaW5peC1saWtlICJtb2RlIG5vdCBjbGVhcmVkIiB3YXJuaW5ncwogKgktZiBmb3JjZSBmaWxlc3lzdGVtIGNoZWNrIGV2ZW4gaWYgZmlsZXN5c3RlbSBtYXJrZWQgYXMgdmFsaWQKICoKICogVGhlIGRldmljZSBtYXkgYmUgYSBibG9jayBkZXZpY2Ugb3IgYSBpbWFnZSBvZiBvbmUsIGJ1dCB0aGlzIGlzbid0CiAqIGVuZm9yY2VkIChidXQgaXQncyBub3QgbXVjaCBmdW4gb24gYSBjaGFyYWN0ZXIgZGV2aWNlIDotKS4KICovCgojaW5jbHVkZSA8bW50ZW50Lmg+CiNpbmNsdWRlICJsaWJiYi5oIgojaW5jbHVkZSAibWluaXguaCIKCiNpZm5kZWYgQkxLR0VUU0laRQojZGVmaW5lIEJMS0dFVFNJWkUgX0lPKDB4MTIsOTYpICAgIC8qIHJldHVybiBkZXZpY2Ugc2l6ZSAqLwojZW5kaWYKCmVudW0gewojaWZkZWYgVU5VU0VECglNSU5JWDFfTElOS19NQVggPSAyNTAsCglNSU5JWDJfTElOS19NQVggPSA2NTUzMCwKCU1JTklYX0lfTUFQX1NMT1RTID0gOCwKCU1JTklYX1pfTUFQX1NMT1RTID0gNjQsCglNSU5JWF9WMSA9IDB4MDAwMSwgICAgICAvKiBvcmlnaW5hbCBtaW5peCBmcyAqLwoJTUlOSVhfVjIgPSAweDAwMDIsICAgICAgLyogbWluaXggVjIgZnMgKi8KI2VuZGlmCglNSU5JWF9OQU1FX01BWCA9IDI1NSwgICAgICAgICAvKiAjIGNoYXJzIGluIGEgZmlsZSBuYW1lICovCn07CgojaWYgIUVOQUJMRV9GRUFUVVJFX01JTklYMgplbnVtIHsgdmVyc2lvbjIgPSAwIH07CiNlbmRpZgoKZW51bSB7IE1BWF9ERVBUSCA9IDMyIH07CgpzdHJ1Y3QgZ2xvYmFscyB7CglpbnQgZGV2X2ZkOwojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCglzbWFsbGludCB2ZXJzaW9uMjsKI2VuZGlmCglzbWFsbGludCByZXBhaXIsIGF1dG9tYXRpYywgdmVyYm9zZSwgbGlzdCwgc2hvdywgd2Fybl9tb2RlLCBmb3JjZTsKCXNtYWxsaW50IGNoYW5nZWQ7ICAvKiBpcyBmaWxlc3lzdGVtIG1vZGlmaWVkPyAqLwoJc21hbGxpbnQgZXJyb3JzX3VuY29ycmVjdGVkOyAgLyogZmxhZyBpZiBzb21lIGVycm9yIHdhcyBub3QgY29ycmVjdGVkICovCglzbWFsbGludCB0ZXJtaW9zX3NldDsKCXNtYWxsaW50IGRpcnNpemU7CglzbWFsbGludCBuYW1lbGVuOwoJY2hhciAqZGV2aWNlX25hbWU7CglpbnQgZGlyZWN0b3J5LCByZWd1bGFyLCBibG9ja2RldiwgY2hhcmRldiwgbGlua3MsIHN5bWxpbmtzLCB0b3RhbDsKCWNoYXIgKmlub2RlX2J1ZmZlcjsKCgljaGFyICppbm9kZV9tYXA7CgljaGFyICp6b25lX21hcDsKCgl1bnNpZ25lZCBjaGFyICppbm9kZV9jb3VudDsKCXVuc2lnbmVkIGNoYXIgKnpvbmVfY291bnQ7CgoJLyogRmlsZS1uYW1lIGRhdGEgKi8KCWludCBuYW1lX2RlcHRoOwoJY2hhciAqbmFtZV9jb21wb25lbnRbTUFYX0RFUFRIKzFdOwoKCS8qIEJpZ2dlciBzdHVmZiAqLwoJc3RydWN0IHRlcm1pb3Mgc3ZfdGVybWlvczsKCWNoYXIgc3VwZXJfYmxvY2tfYnVmZmVyW0JMT0NLX1NJWkVdOwoJY2hhciBhZGRfem9uZV9pbmRfYmxrW0JMT0NLX1NJWkVdOwoJY2hhciBhZGRfem9uZV9kaW5kX2Jsa1tCTE9DS19TSVpFXTsKCVVTRV9GRUFUVVJFX01JTklYMihjaGFyIGFkZF96b25lX3RpbmRfYmxrW0JMT0NLX1NJWkVdOykKCWNoYXIgY2hlY2tfZmlsZV9ibGtbQkxPQ0tfU0laRV07CgoJLyogRmlsZS1uYW1lIGRhdGEgKi8KCWNoYXIgY3VycmVudF9uYW1lW01BWF9ERVBUSCAqIE1JTklYX05BTUVfTUFYXTsKfTsKCiNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQojZGVmaW5lIGRldl9mZCAgICAgICAgICAgICAoRy5kZXZfZmQgICAgICAgICAgICAgKQojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCiNkZWZpbmUgdmVyc2lvbjIgICAgICAgICAgIChHLnZlcnNpb24yICAgICAgICAgICApCiNlbmRpZgojZGVmaW5lIHJlcGFpciAgICAgICAgICAgICAoRy5yZXBhaXIgICAgICAgICAgICAgKQojZGVmaW5lIGF1dG9tYXRpYyAgICAgICAgICAoRy5hdXRvbWF0aWMgICAgICAgICAgKQojZGVmaW5lIHZlcmJvc2UgICAgICAgICAgICAoRy52ZXJib3NlICAgICAgICAgICAgKQojZGVmaW5lIGxpc3QgICAgICAgICAgICAgICAoRy5saXN0ICAgICAgICAgICAgICAgKQojZGVmaW5lIHNob3cgICAgICAgICAgICAgICAoRy5zaG93ICAgICAgICAgICAgICAgKQojZGVmaW5lIHdhcm5fbW9kZSAgICAgICAgICAoRy53YXJuX21vZGUgICAgICAgICAgKQojZGVmaW5lIGZvcmNlICAgICAgICAgICAgICAoRy5mb3JjZSAgICAgICAgICAgICAgKQojZGVmaW5lIGNoYW5nZWQgICAgICAgICAgICAoRy5jaGFuZ2VkICAgICAgICAgICAgKQojZGVmaW5lIGVycm9yc191bmNvcnJlY3RlZCAoRy5lcnJvcnNfdW5jb3JyZWN0ZWQgKQojZGVmaW5lIHRlcm1pb3Nfc2V0ICAgICAgICAoRy50ZXJtaW9zX3NldCAgICAgICAgKQojZGVmaW5lIGRpcnNpemUgICAgICAgICAgICAoRy5kaXJzaXplICAgICAgICAgICAgKQojZGVmaW5lIG5hbWVsZW4gICAgICAgICAgICAoRy5uYW1lbGVuICAgICAgICAgICAgKQojZGVmaW5lIGRldmljZV9uYW1lICAgICAgICAoRy5kZXZpY2VfbmFtZSAgICAgICAgKQojZGVmaW5lIGRpcmVjdG9yeSAgICAgICAgICAoRy5kaXJlY3RvcnkgICAgICAgICAgKQojZGVmaW5lIHJlZ3VsYXIgICAgICAgICAgICAoRy5yZWd1bGFyICAgICAgICAgICAgKQojZGVmaW5lIGJsb2NrZGV2ICAgICAgICAgICAoRy5ibG9ja2RldiAgICAgICAgICAgKQojZGVmaW5lIGNoYXJkZXYgICAgICAgICAgICAoRy5jaGFyZGV2ICAgICAgICAgICAgKQojZGVmaW5lIGxpbmtzICAgICAgICAgICAgICAoRy5saW5rcyAgICAgICAgICAgICAgKQojZGVmaW5lIHN5bWxpbmtzICAgICAgICAgICAoRy5zeW1saW5rcyAgICAgICAgICAgKQojZGVmaW5lIHRvdGFsICAgICAgICAgICAgICAoRy50b3RhbCAgICAgICAgICAgICAgKQojZGVmaW5lIGlub2RlX2J1ZmZlciAgICAgICAoRy5pbm9kZV9idWZmZXIgICAgICAgKQojZGVmaW5lIGlub2RlX21hcCAgICAgICAgICAoRy5pbm9kZV9tYXAgICAgICAgICAgKQojZGVmaW5lIHpvbmVfbWFwICAgICAgICAgICAoRy56b25lX21hcCAgICAgICAgICAgKQojZGVmaW5lIGlub2RlX2NvdW50ICAgICAgICAoRy5pbm9kZV9jb3VudCAgICAgICAgKQojZGVmaW5lIHpvbmVfY291bnQgICAgICAgICAoRy56b25lX2NvdW50ICAgICAgICAgKQojZGVmaW5lIG5hbWVfZGVwdGggICAgICAgICAoRy5uYW1lX2RlcHRoICAgICAgICAgKQojZGVmaW5lIG5hbWVfY29tcG9uZW50ICAgICAoRy5uYW1lX2NvbXBvbmVudCAgICAgKQojZGVmaW5lIHN2X3Rlcm1pb3MgICAgICAgICAoRy5zdl90ZXJtaW9zICAgICAgICAgKQojZGVmaW5lIHN1cGVyX2Jsb2NrX2J1ZmZlciAoRy5zdXBlcl9ibG9ja19idWZmZXIgKQojZGVmaW5lIGFkZF96b25lX2luZF9ibGsgICAoRy5hZGRfem9uZV9pbmRfYmxrICAgKQojZGVmaW5lIGFkZF96b25lX2RpbmRfYmxrICAoRy5hZGRfem9uZV9kaW5kX2JsayAgKQojZGVmaW5lIGFkZF96b25lX3RpbmRfYmxrICAoRy5hZGRfem9uZV90aW5kX2JsayAgKQojZGVmaW5lIGNoZWNrX2ZpbGVfYmxrICAgICAoRy5jaGVja19maWxlX2JsayAgICAgKQojZGVmaW5lIGN1cnJlbnRfbmFtZSAgICAgICAoRy5jdXJyZW50X25hbWUgICAgICAgKQojZGVmaW5lIElOSVRfRygpIGRvIHsgXAoJUFRSX1RPX0dMT0JBTFMgPSB4emFsbG9jKHNpemVvZihHKSk7IFwKCWRpcnNpemUgPSAxNjsgXAoJbmFtZWxlbiA9IDE0OyBcCgljdXJyZW50X25hbWVbMF0gPSAnLyc7IFwKCS8qY3VycmVudF9uYW1lWzFdID0gJ1wwJzsqLyBcCgluYW1lX2NvbXBvbmVudFswXSA9ICZjdXJyZW50X25hbWVbMF07IFwKfSB3aGlsZSAoMCkKCiNkZWZpbmUgSW5vZGUxICgoKHN0cnVjdCBtaW5peDFfaW5vZGUgKikgaW5vZGVfYnVmZmVyKS0xKQojZGVmaW5lIElub2RlMiAoKChzdHJ1Y3QgbWluaXgyX2lub2RlICopIGlub2RlX2J1ZmZlciktMSkKCiNkZWZpbmUgU3VwZXIgKCooc3RydWN0IG1pbml4X3N1cGVyX2Jsb2NrICopKHN1cGVyX2Jsb2NrX2J1ZmZlcikpCgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCiMgZGVmaW5lIFpPTkVTICAgICgodW5zaWduZWQpKHZlcnNpb24yID8gU3VwZXIuc196b25lcyA6IFN1cGVyLnNfbnpvbmVzKSkKI2Vsc2UKIyBkZWZpbmUgWk9ORVMgICAgKCh1bnNpZ25lZCkoU3VwZXIuc19uem9uZXMpKQojZW5kaWYKI2RlZmluZSBJTk9ERVMgICAgKCh1bnNpZ25lZClTdXBlci5zX25pbm9kZXMpCiNkZWZpbmUgSU1BUFMgICAgICgodW5zaWduZWQpU3VwZXIuc19pbWFwX2Jsb2NrcykKI2RlZmluZSBaTUFQUyAgICAgKCh1bnNpZ25lZClTdXBlci5zX3ptYXBfYmxvY2tzKQojZGVmaW5lIEZJUlNUWk9ORSAoKHVuc2lnbmVkKVN1cGVyLnNfZmlyc3RkYXRhem9uZSkKI2RlZmluZSBaT05FU0laRSAgKCh1bnNpZ25lZClTdXBlci5zX2xvZ196b25lX3NpemUpCiNkZWZpbmUgTUFYU0laRSAgICgodW5zaWduZWQpU3VwZXIuc19tYXhfc2l6ZSkKI2RlZmluZSBNQUdJQyAgICAgKFN1cGVyLnNfbWFnaWMpCgovKiBnY2MgbGlrZXMgdGhpcyBtb3JlIChjb2RlIGlzIHNtYWxsZXIpIHRoYW4gbWFjcm8gdmFyaWFudCAqLwpzdGF0aWMgQUxXQVlTX0lOTElORSB1bnNpZ25lZCBkaXZfcm91bmR1cCh1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCBuKQp7CglyZXR1cm4gKHNpemUgKyBuLTEpIC8gbjsKfQoKI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgojZGVmaW5lIElOT0RFX0JMT0NLUyBkaXZfcm91bmR1cChJTk9ERVMsICh2ZXJzaW9uMiA/IE1JTklYMl9JTk9ERVNfUEVSX0JMT0NLIFwKCQkJCSAgICA6IE1JTklYMV9JTk9ERVNfUEVSX0JMT0NLKSkKI2Vsc2UKI2RlZmluZSBJTk9ERV9CTE9DS1MgZGl2X3JvdW5kdXAoSU5PREVTLCBNSU5JWDFfSU5PREVTX1BFUl9CTE9DSykKI2VuZGlmCgojZGVmaW5lIElOT0RFX0JVRkZFUl9TSVpFIChJTk9ERV9CTE9DS1MgKiBCTE9DS19TSVpFKQojZGVmaW5lIE5PUk1fRklSU1RaT05FICAgICgyICsgSU1BUFMgKyBaTUFQUyArIElOT0RFX0JMT0NLUykKCi8qIEJlZm9yZSB5b3UgYXNrICJ3aGVyZSB0aGV5IGNvbWUgZnJvbT8iOiAqLwovKiBzZXRiaXQvY2xyYml0IGFyZSBzdXBwbGllZCBieSBzeXMvcGFyYW0uaCAqLwoKc3RhdGljIGludCBtaW5peF9iaXQoY29uc3QgY2hhciAqYSwgdW5zaWduZWQgaSkKewoJcmV0dXJuIChhW2kgPj4gM10gJiAoMTw8KGkgJiA3KSkpOwp9CgpzdGF0aWMgdm9pZCBtaW5peF9zZXRiaXQoY2hhciAqYSwgdW5zaWduZWQgaSkKewoJc2V0Yml0KGEsIGkpOwoJY2hhbmdlZCA9IDE7Cn0Kc3RhdGljIHZvaWQgbWluaXhfY2xyYml0KGNoYXIgKmEsIHVuc2lnbmVkIGkpCnsKCWNscmJpdChhLCBpKTsKCWNoYW5nZWQgPSAxOwp9CgovKiBOb3RlOiBkbyBub3QgYXNzdW1lIDAvMSwgaXQgaXMgMC9ub256ZXJvICovCiNkZWZpbmUgem9uZV9pbl91c2UoeCkgIChtaW5peF9iaXQoem9uZV9tYXAsKHgpLUZJUlNUWk9ORSsxKSkKI2RlZmluZSBpbm9kZV9pbl91c2UoeCkgKG1pbml4X2JpdChpbm9kZV9tYXAsKHgpKSkKCiNkZWZpbmUgbWFya19pbm9kZSh4KSAgIChtaW5peF9zZXRiaXQoaW5vZGVfbWFwLCh4KSkpCiNkZWZpbmUgdW5tYXJrX2lub2RlKHgpIChtaW5peF9jbHJiaXQoaW5vZGVfbWFwLCh4KSkpCgojZGVmaW5lIG1hcmtfem9uZSh4KSAgICAobWluaXhfc2V0Yml0KHpvbmVfbWFwLCh4KS1GSVJTVFpPTkUrMSkpCiNkZWZpbmUgdW5tYXJrX3pvbmUoeCkgIChtaW5peF9jbHJiaXQoem9uZV9tYXAsKHgpLUZJUlNUWk9ORSsxKSkKCgpzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2sodW5zaWduZWQgaW5vKTsKI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2syKHVuc2lnbmVkIGlubyk7CiNlbmRpZgoKc3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKnN0cikgQVRUUklCVVRFX05PUkVUVVJOOwpzdGF0aWMgdm9pZCBkaWUoY29uc3QgY2hhciAqc3RyKQp7CglpZiAodGVybWlvc19zZXQpCgkJdGNzZXRhdHRyKDAsIFRDU0FOT1csICZzdl90ZXJtaW9zKTsKCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyIsIHN0cik7Cn0KCnN0YXRpYyB2b2lkIHB1c2hfZmlsZW5hbWUoY29uc3QgY2hhciAqbmFtZSkKewoJLy8gIC9kaXIvZGlyL2Rpci9maWxlCgkvLyAgXiAgIF4gICBeCgkvLyBbMF0gWzFdIFsyXSA8LW5hbWVfY29tcG9uZW50W2ldCglpZiAobmFtZV9kZXB0aCA8IE1BWF9ERVBUSCkgewoJCWludCBsZW47CgkJY2hhciAqcCA9IG5hbWVfY29tcG9uZW50W25hbWVfZGVwdGhdOwoJCSpwKysgPSAnLyc7CgkJbGVuID0gc3ByaW50ZihwLCAiJS4qcyIsIG5hbWVsZW4sIG5hbWUpOwoJCW5hbWVfY29tcG9uZW50W25hbWVfZGVwdGggKyAxXSA9IHAgKyBsZW47Cgl9CgluYW1lX2RlcHRoKys7Cn0KCnN0YXRpYyB2b2lkIHBvcF9maWxlbmFtZSh2b2lkKQp7CgluYW1lX2RlcHRoLS07CglpZiAobmFtZV9kZXB0aCA8IE1BWF9ERVBUSCkgewoJCSpuYW1lX2NvbXBvbmVudFtuYW1lX2RlcHRoXSA9ICdcMCc7CgkJaWYgKCFuYW1lX2RlcHRoKSB7CgkJCWN1cnJlbnRfbmFtZVswXSA9ICcvJzsKCQkJY3VycmVudF9uYW1lWzFdID0gJ1wwJzsKCQl9Cgl9Cn0KCnN0YXRpYyBpbnQgYXNrKGNvbnN0IGNoYXIgKnN0cmluZywgaW50IGRlZikKewoJaW50IGM7CgoJaWYgKCFyZXBhaXIpIHsKCQlwdXRzKCIiKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCXJldHVybiAwOwoJfQoJaWYgKGF1dG9tYXRpYykgewoJCXB1dHMoIiIpOwoJCWlmICghZGVmKQoJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCXJldHVybiBkZWY7Cgl9CglwcmludGYoZGVmID8gIiVzICh5L24pPyAiIDogIiVzIChuL3kpPyAiLCBzdHJpbmcpOwoJZm9yICg7OykgewoJCWZmbHVzaChzdGRvdXQpOwoJCWMgPSBnZXRjaGFyKCk7CgkJaWYgKGMgPT0gRU9GKSB7CgkJCWlmICghZGVmKQoJCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQkJcmV0dXJuIGRlZjsKCQl9CgkJYyA9IHRvdXBwZXIoYyk7CgkJaWYgKGMgPT0gJ1knKSB7CgkJCWRlZiA9IDE7CgkJCWJyZWFrOwoJCX0gZWxzZSBpZiAoYyA9PSAnTicpIHsKCQkJZGVmID0gMDsKCQkJYnJlYWs7CgkJfSBlbHNlIGlmIChjID09ICcgJyB8fCBjID09ICdcbicpCgkJCWJyZWFrOwoJfQoJaWYgKGRlZikKCQlwcmludGYoInlcbiIpOwoJZWxzZSB7CgkJcHJpbnRmKCJuXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIGRlZjsKfQoKLyoKICogTWFrZSBjZXJ0YWluIHRoYXQgd2UgYXJlbid0IGNoZWNraW5nIGEgZmlsZXN5c3RlbSB0aGF0IGlzIG9uIGEKICogbW91bnRlZCBwYXJ0aXRpb24uICBDb2RlIGFkYXB0ZWQgZnJvbSBlMmZzY2ssIENvcHlyaWdodCAoQykgMTk5MywKICogMTk5NCBUaGVvZG9yZSBUcydvLiAgQWxzbyBsaWNlbnNlZCB1bmRlciBHUEwuCiAqLwpzdGF0aWMgdm9pZCBjaGVja19tb3VudCh2b2lkKQp7CglGSUxFICpmOwoJc3RydWN0IG1udGVudCAqbW50OwoJaW50IGNvbnQ7CglpbnQgZmQ7CgoJZiA9IHNldG1udGVudChNT1VOVEVELCAiciIpOwoJaWYgKGYgPT0gTlVMTCkKCQlyZXR1cm47Cgl3aGlsZSAoKG1udCA9IGdldG1udGVudChmKSkgIT0gTlVMTCkKCQlpZiAoc3RyY21wKGRldmljZV9uYW1lLCBtbnQtPm1udF9mc25hbWUpID09IDApCgkJCWJyZWFrOwoJZW5kbW50ZW50KGYpOwoJaWYgKCFtbnQpCgkJcmV0dXJuOwoKCS8qCgkgKiBJZiB0aGUgcm9vdCBpcyBtb3VudGVkIHJlYWQtb25seSwgdGhlbiAvZXRjL210YWIgaXMKCSAqIHByb2JhYmx5IG5vdCBjb3JyZWN0OyBzbyB3ZSB3b24ndCBpc3N1ZSBhIHdhcm5pbmcgYmFzZWQgb24KCSAqIGl0LgoJICovCglmZCA9IG9wZW4oTU9VTlRFRCwgT19SRFdSKTsKCWlmIChmZCA8IDAgJiYgZXJybm8gPT0gRVJPRlMpCgkJcmV0dXJuOwoJY2xvc2UoZmQpOwoKCXByaW50ZigiJXMgaXMgbW91bnRlZC4gIiwgZGV2aWNlX25hbWUpOwoJY29udCA9IDA7CglpZiAoaXNhdHR5KDApICYmIGlzYXR0eSgxKSkKCQljb250ID0gYXNrKCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gY29udGludWUiLCAwKTsKCWlmICghY29udCkgewoJCXByaW50ZigiQ2hlY2sgYWJvcnRlZFxuIik7CgkJZXhpdCgwKTsKCX0KfQoKLyoKICogY2hlY2tfem9uZV9uciBjaGVja3MgdG8gc2VlIHRoYXQgKm5yIGlzIGEgdmFsaWQgem9uZSBuci4gSWYgaXQKICogaXNuJ3QsIGl0IHdpbGwgcG9zc2libHkgYmUgcmVwYWlyZWQuIENoZWNrX3pvbmVfbnIgc2V0cyAqY29ycmVjdGVkCiAqIGlmIGFuIGVycm9yIHdhcyBjb3JyZWN0ZWQsIGFuZCByZXR1cm5zIHRoZSB6b25lICgwIGZvciBubyB6b25lCiAqIG9yIGEgYmFkIHpvbmUtbnVtYmVyKS4KICovCnN0YXRpYyBpbnQgY2hlY2tfem9uZV9ucjIodWludDMyX3QgKm5yLCBzbWFsbGludCAqY29ycmVjdGVkKQp7Cgljb25zdCBjaGFyICptc2c7CglpZiAoISpucikKCQlyZXR1cm4gMDsKCWlmICgqbnIgPCBGSVJTVFpPTkUpCgkJbXNnID0gIjwgRklSU1RaT05FIjsKCWVsc2UgaWYgKCpuciA+PSBaT05FUykKCQltc2cgPSAiPj0gWk9ORVMiOwoJZWxzZQoJCXJldHVybiAqbnI7CglwcmludGYoIlpvbmUgbnIgJXMgaW4gZmlsZSAnJXMnLiAiLCBtc2csIGN1cnJlbnRfbmFtZSk7CglpZiAoYXNrKCJSZW1vdmUgYmxvY2siLCAxKSkgewoJCSpuciA9IDA7CgkJKmNvcnJlY3RlZCA9IDE7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBjaGVja196b25lX25yKHVpbnQxNl90ICpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKewoJdWludDMyX3QgbnIzMiA9ICpucjsKCWludCByID0gY2hlY2tfem9uZV9ucjIoJm5yMzIsIGNvcnJlY3RlZCk7CgkqbnIgPSAodWludDE2X3QpbnIzMjsKCXJldHVybiByOwp9CgovKgogKiByZWFkLWJsb2NrIHJlYWRzIGJsb2NrIG5yIGludG8gdGhlIGJ1ZmZlciBhdCBhZGRyLgogKi8Kc3RhdGljIHZvaWQgcmVhZF9ibG9jayh1bnNpZ25lZCBuciwgY2hhciAqYWRkcikKewoJaWYgKCFucikgewoJCW1lbXNldChhZGRyLCAwLCBCTE9DS19TSVpFKTsKCQlyZXR1cm47Cgl9CglpZiAoQkxPQ0tfU0laRSAqIG5yICE9IGxzZWVrKGRldl9mZCwgQkxPQ0tfU0laRSAqIG5yLCBTRUVLX1NFVCkpIHsKCQlwcmludGYoIiVzOiBjYW5ub3Qgc2VlayB0byBibG9jayBpbiBmaWxlICclcydcbiIsCgkJCQliYl9tc2dfcmVhZF9lcnJvciwgY3VycmVudF9uYW1lKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCW1lbXNldChhZGRyLCAwLCBCTE9DS19TSVpFKTsKCX0gZWxzZSBpZiAoQkxPQ0tfU0laRSAhPSByZWFkKGRldl9mZCwgYWRkciwgQkxPQ0tfU0laRSkpIHsKCQlwcmludGYoIiVzOiBiYWQgYmxvY2sgaW4gZmlsZSAnJXMnXG4iLAoJCQkJYmJfbXNnX3JlYWRfZXJyb3IsIGN1cnJlbnRfbmFtZSk7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQltZW1zZXQoYWRkciwgMCwgQkxPQ0tfU0laRSk7Cgl9Cn0KCi8qCiAqIHdyaXRlX2Jsb2NrIHdyaXRlcyBibG9jayBuciB0byBkaXNrLgogKi8Kc3RhdGljIHZvaWQgd3JpdGVfYmxvY2sodW5zaWduZWQgbnIsIGNoYXIgKmFkZHIpCnsKCWlmICghbnIpCgkJcmV0dXJuOwoJaWYgKG5yIDwgRklSU1RaT05FIHx8IG5yID49IFpPTkVTKSB7CgkJcHJpbnRmKCJJbnRlcm5hbCBlcnJvcjogdHJ5aW5nIHRvIHdyaXRlIGJhZCBibG9ja1xuIgoJCQkgICAiV3JpdGUgcmVxdWVzdCBpZ25vcmVkXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCXJldHVybjsKCX0KCWlmIChCTE9DS19TSVpFICogbnIgIT0gbHNlZWsoZGV2X2ZkLCBCTE9DS19TSVpFICogbnIsIFNFRUtfU0VUKSkKCQlkaWUoInNlZWsgZmFpbGVkIGluIHdyaXRlX2Jsb2NrIik7CglpZiAoQkxPQ0tfU0laRSAhPSB3cml0ZShkZXZfZmQsIGFkZHIsIEJMT0NLX1NJWkUpKSB7CgkJcHJpbnRmKCIlczogYmFkIGJsb2NrIGluIGZpbGUgJyVzJ1xuIiwKCQkJCWJiX21zZ193cml0ZV9lcnJvciwgY3VycmVudF9uYW1lKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQp9CgovKgogKiBtYXBfYmxvY2sgY2FsY3VsYXRlcyB0aGUgYWJzb2x1dGUgYmxvY2sgbnIgb2YgYSBibG9jayBpbiBhIGZpbGUuCiAqIEl0IHNldHMgJ2NoYW5nZWQnIGlmIHRoZSBpbm9kZSBoYXMgbmVlZGVkIGNoYW5naW5nLCBhbmQgcmUtd3JpdGVzCiAqIGFueSBpbmRpcmVjdCBibG9ja3Mgd2l0aCBlcnJvcnMuCiAqLwpzdGF0aWMgaW50IG1hcF9ibG9jayhzdHJ1Y3QgbWluaXgxX2lub2RlICppbm9kZSwgdW5zaWduZWQgYmxrbnIpCnsKCXVpbnQxNl90IGluZFtCTE9DS19TSVpFID4+IDFdOwoJdWludDE2X3QgZGluZFtCTE9DS19TSVpFID4+IDFdOwoJaW50IGJsb2NrLCByZXN1bHQ7CglzbWFsbGludCBibGtfY2hnOwoKCWlmIChibGtuciA8IDcpCgkJcmV0dXJuIGNoZWNrX3pvbmVfbnIoaW5vZGUtPmlfem9uZSArIGJsa25yLCAmY2hhbmdlZCk7CglibGtuciAtPSA3OwoJaWYgKGJsa25yIDwgNTEyKSB7CgkJYmxvY2sgPSBjaGVja196b25lX25yKGlub2RlLT5pX3pvbmUgKyA3LCAmY2hhbmdlZCk7CgkJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlibGtfY2hnID0gMDsKCQlyZXN1bHQgPSBjaGVja196b25lX25yKGJsa25yICsgaW5kLCAmYmxrX2NoZyk7CgkJaWYgKGJsa19jaGcpCgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCXJldHVybiByZXN1bHQ7Cgl9CglibGtuciAtPSA1MTI7CglibG9jayA9IGNoZWNrX3pvbmVfbnIoaW5vZGUtPmlfem9uZSArIDgsICZjaGFuZ2VkKTsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yKGRpbmQgKyAoYmxrbnIgLyA1MTIpLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CglibG9jayA9IHJlc3VsdDsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIoaW5kICsgKGJsa25yICUgNTEyKSwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CglyZXR1cm4gcmVzdWx0Owp9CgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyBpbnQgbWFwX2Jsb2NrMihzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZSwgdW5zaWduZWQgYmxrbnIpCnsKCXVpbnQzMl90IGluZFtCTE9DS19TSVpFID4+IDJdOwoJdWludDMyX3QgZGluZFtCTE9DS19TSVpFID4+IDJdOwoJdWludDMyX3QgdGluZFtCTE9DS19TSVpFID4+IDJdOwoJaW50IGJsb2NrLCByZXN1bHQ7CglzbWFsbGludCBibGtfY2hnOwoKCWlmIChibGtuciA8IDcpCgkJcmV0dXJuIGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyBibGtuciwgJmNoYW5nZWQpOwoJYmxrbnIgLT0gNzsKCWlmIChibGtuciA8IDI1NikgewoJCWJsb2NrID0gY2hlY2tfem9uZV9ucjIoaW5vZGUtPmlfem9uZSArIDcsICZjaGFuZ2VkKTsKCQlyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGJsa25yICsgaW5kLCAmYmxrX2NoZyk7CgkJaWYgKGJsa19jaGcpCgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCXJldHVybiByZXN1bHQ7Cgl9CglibGtuciAtPSAyNTY7CglpZiAoYmxrbnIgPj0gMjU2ICogMjU2KSB7CgkJYmxvY2sgPSBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgOCwgJmNoYW5nZWQpOwoJCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGRpbmQgKyBibGtuciAvIDI1NiwgJmJsa19jaGcpOwoJCWlmIChibGtfY2hnKQoJCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CgkJYmxvY2sgPSByZXN1bHQ7CgkJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlibGtfY2hnID0gMDsKCQlyZXN1bHQgPSBjaGVja196b25lX25yMihpbmQgKyBibGtuciAlIDI1NiwgJmJsa19jaGcpOwoJCWlmIChibGtfY2hnKQoJCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoJYmxrbnIgLT0gMjU2ICogMjU2OwoJYmxvY2sgPSBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgOSwgJmNoYW5nZWQpOwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgdGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKHRpbmQgKyBibGtuciAvICgyNTYgKiAyNTYpLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgdGluZCk7CglibG9jayA9IHJlc3VsdDsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yMihkaW5kICsgKGJsa25yIC8gMjU2KSAlIDI1NiwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJYmxvY2sgPSByZXN1bHQ7CglyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yMihpbmQgKyBibGtuciAlIDI1NiwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CglyZXR1cm4gcmVzdWx0Owp9CiNlbmRpZgoKc3RhdGljIHZvaWQgd3JpdGVfc3VwZXJfYmxvY2sodm9pZCkKewoJLyoKCSAqIFNldCB0aGUgc3RhdGUgb2YgdGhlIGZpbGVzeXN0ZW0gYmFzZWQgb24gd2hldGhlciBvciBub3QgdGhlcmUKCSAqIGFyZSB1bmNvcnJlY3RlZCBlcnJvcnMuICBUaGUgZmlsZXN5c3RlbSB2YWxpZCBmbGFnIGlzCgkgKiB1bmNvbmRpdGlvbmFsbHkgc2V0IGlmIHdlIGdldCB0aGlzIGZhci4KCSAqLwoJU3VwZXIuc19zdGF0ZSB8PSBNSU5JWF9WQUxJRF9GUyB8IE1JTklYX0VSUk9SX0ZTOwoJaWYgKCFlcnJvcnNfdW5jb3JyZWN0ZWQpCgkJU3VwZXIuc19zdGF0ZSAmPSB+TUlOSVhfRVJST1JfRlM7CgoJaWYgKEJMT0NLX1NJWkUgIT0gbHNlZWsoZGV2X2ZkLCBCTE9DS19TSVpFLCBTRUVLX1NFVCkpCgkJZGllKCJzZWVrIGZhaWxlZCBpbiB3cml0ZV9zdXBlcl9ibG9jayIpOwoJaWYgKEJMT0NLX1NJWkUgIT0gd3JpdGUoZGV2X2ZkLCBzdXBlcl9ibG9ja19idWZmZXIsIEJMT0NLX1NJWkUpKQoJCWRpZSgiY2Fubm90IHdyaXRlIHN1cGVyLWJsb2NrIik7Cn0KCnN0YXRpYyB2b2lkIHdyaXRlX3RhYmxlcyh2b2lkKQp7Cgl3cml0ZV9zdXBlcl9ibG9jaygpOwoKCWlmIChJTUFQUyAqIEJMT0NLX1NJWkUgIT0gd3JpdGUoZGV2X2ZkLCBpbm9kZV9tYXAsIElNQVBTICogQkxPQ0tfU0laRSkpCgkJZGllKCJjYW5ub3Qgd3JpdGUgaW5vZGUgbWFwIik7CglpZiAoWk1BUFMgKiBCTE9DS19TSVpFICE9IHdyaXRlKGRldl9mZCwgem9uZV9tYXAsIFpNQVBTICogQkxPQ0tfU0laRSkpCgkJZGllKCJjYW5ub3Qgd3JpdGUgem9uZSBtYXAiKTsKCWlmIChJTk9ERV9CVUZGRVJfU0laRSAhPSB3cml0ZShkZXZfZmQsIGlub2RlX2J1ZmZlciwgSU5PREVfQlVGRkVSX1NJWkUpKQoJCWRpZSgiY2Fubm90IHdyaXRlIGlub2RlcyIpOwp9CgpzdGF0aWMgdm9pZCBnZXRfZGlyc2l6ZSh2b2lkKQp7CglpbnQgYmxvY2s7CgljaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBzaXplOwoKI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgoJaWYgKHZlcnNpb24yKQoJCWJsb2NrID0gSW5vZGUyW01JTklYX1JPT1RfSU5PXS5pX3pvbmVbMF07CgllbHNlCiNlbmRpZgoJCWJsb2NrID0gSW5vZGUxW01JTklYX1JPT1RfSU5PXS5pX3pvbmVbMF07CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChzaXplID0gMTY7IHNpemUgPCBCTE9DS19TSVpFOyBzaXplIDw8PSAxKSB7CgkJaWYgKHN0cmNtcChibGsgKyBzaXplICsgMiwgIi4uIikgPT0gMCkgewoJCQlkaXJzaXplID0gc2l6ZTsKCQkJbmFtZWxlbiA9IHNpemUgLSAyOwoJCQlyZXR1cm47CgkJfQoJfQoJLyogdXNlIGRlZmF1bHRzICovCn0KCnN0YXRpYyB2b2lkIHJlYWRfc3VwZXJibG9jayh2b2lkKQp7CglpZiAoQkxPQ0tfU0laRSAhPSBsc2VlayhkZXZfZmQsIEJMT0NLX1NJWkUsIFNFRUtfU0VUKSkKCQlkaWUoInNlZWsgZmFpbGVkIik7CglpZiAoQkxPQ0tfU0laRSAhPSByZWFkKGRldl9mZCwgc3VwZXJfYmxvY2tfYnVmZmVyLCBCTE9DS19TSVpFKSkKCQlkaWUoImNhbm5vdCByZWFkIHN1cGVyIGJsb2NrIik7CgkvKiBhbHJlYWR5IGluaXRpYWxpemVkIHRvOgoJbmFtZWxlbiA9IDE0OwoJZGlyc2l6ZSA9IDE2OwoJdmVyc2lvbjIgPSAwOwoJKi8KCWlmIChNQUdJQyA9PSBNSU5JWDFfU1VQRVJfTUFHSUMpIHsKCX0gZWxzZSBpZiAoTUFHSUMgPT0gTUlOSVgxX1NVUEVSX01BR0lDMikgewoJCW5hbWVsZW4gPSAzMDsKCQlkaXJzaXplID0gMzI7CiNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKCX0gZWxzZSBpZiAoTUFHSUMgPT0gTUlOSVgyX1NVUEVSX01BR0lDKSB7CgkJdmVyc2lvbjIgPSAxOwoJfSBlbHNlIGlmIChNQUdJQyA9PSBNSU5JWDJfU1VQRVJfTUFHSUMyKSB7CgkJbmFtZWxlbiA9IDMwOwoJCWRpcnNpemUgPSAzMjsKCQl2ZXJzaW9uMiA9IDE7CiNlbmRpZgoJfSBlbHNlCgkJZGllKCJiYWQgbWFnaWMgbnVtYmVyIGluIHN1cGVyLWJsb2NrIik7CglpZiAoWk9ORVNJWkUgIT0gMCB8fCBCTE9DS19TSVpFICE9IDEwMjQpCgkJZGllKCJvbmx5IDFrIGJsb2Nrcy96b25lcyBzdXBwb3J0ZWQiKTsKCWlmIChJTUFQUyAqIEJMT0NLX1NJWkUgKiA4IDwgSU5PREVTICsgMSkKCQlkaWUoImJhZCBzX2ltYXBfYmxvY2tzIGZpZWxkIGluIHN1cGVyLWJsb2NrIik7CglpZiAoWk1BUFMgKiBCTE9DS19TSVpFICogOCA8IFpPTkVTIC0gRklSU1RaT05FICsgMSkKCQlkaWUoImJhZCBzX3ptYXBfYmxvY2tzIGZpZWxkIGluIHN1cGVyLWJsb2NrIik7Cn0KCnN0YXRpYyB2b2lkIHJlYWRfdGFibGVzKHZvaWQpCnsKCWlub2RlX21hcCA9IHh6YWxsb2MoSU1BUFMgKiBCTE9DS19TSVpFKTsKCXpvbmVfbWFwID0geHphbGxvYyhaTUFQUyAqIEJMT0NLX1NJWkUpOwoJaW5vZGVfYnVmZmVyID0geG1hbGxvYyhJTk9ERV9CVUZGRVJfU0laRSk7Cglpbm9kZV9jb3VudCA9IHhtYWxsb2MoSU5PREVTICsgMSk7Cgl6b25lX2NvdW50ID0geG1hbGxvYyhaT05FUyk7CglpZiAoSU1BUFMgKiBCTE9DS19TSVpFICE9IHJlYWQoZGV2X2ZkLCBpbm9kZV9tYXAsIElNQVBTICogQkxPQ0tfU0laRSkpCgkJZGllKCJjYW5ub3QgcmVhZCBpbm9kZSBtYXAiKTsKCWlmIChaTUFQUyAqIEJMT0NLX1NJWkUgIT0gcmVhZChkZXZfZmQsIHpvbmVfbWFwLCBaTUFQUyAqIEJMT0NLX1NJWkUpKQoJCWRpZSgiY2Fubm90IHJlYWQgem9uZSBtYXAiKTsKCWlmIChJTk9ERV9CVUZGRVJfU0laRSAhPSByZWFkKGRldl9mZCwgaW5vZGVfYnVmZmVyLCBJTk9ERV9CVUZGRVJfU0laRSkpCgkJZGllKCJjYW5ub3QgcmVhZCBpbm9kZXMiKTsKCWlmIChOT1JNX0ZJUlNUWk9ORSAhPSBGSVJTVFpPTkUpIHsKCQlwcmludGYoIndhcm5pbmc6IGZpcnN0em9uZSE9bm9ybV9maXJzdHpvbmVcbiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9CglnZXRfZGlyc2l6ZSgpOwoJaWYgKHNob3cpIHsKCQlwcmludGYoIiV1IGlub2Rlc1xuIgoJCQkiJXUgYmxvY2tzXG4iCgkJCSJGaXJzdGRhdGF6b25lPSV1ICgldSlcbiIKCQkJIlpvbmVzaXplPSV1XG4iCgkJCSJNYXhzaXplPSV1XG4iCgkJCSJGaWxlc3lzdGVtIHN0YXRlPSV1XG4iCgkJCSJuYW1lbGVuPSV1XG5cbiIsCgkJCUlOT0RFUywKCQkJWk9ORVMsCgkJCUZJUlNUWk9ORSwgTk9STV9GSVJTVFpPTkUsCgkJCUJMT0NLX1NJWkUgPDwgWk9ORVNJWkUsCgkJCU1BWFNJWkUsCgkJCVN1cGVyLnNfc3RhdGUsCgkJCW5hbWVsZW4pOwoJfQp9CgpzdGF0aWMgc3RydWN0IG1pbml4MV9pbm9kZSAqZ2V0X2lub2RlKHVuc2lnbmVkIG5yKQp7CglzdHJ1Y3QgbWluaXgxX2lub2RlICppbm9kZTsKCglpZiAoIW5yIHx8IG5yID4gSU5PREVTKQoJCXJldHVybiBOVUxMOwoJdG90YWwrKzsKCWlub2RlID0gSW5vZGUxICsgbnI7CglpZiAoIWlub2RlX2NvdW50W25yXSkgewoJCWlmICghaW5vZGVfaW5fdXNlKG5yKSkgewoJCQlwcmludGYoIklub2RlICVkIGlzIG1hcmtlZCBhcyAndW51c2VkJywgYnV0IGl0IGlzIHVzZWQgIgoJCQkJCSJmb3IgZmlsZSAnJXMnXG4iLCBuciwgY3VycmVudF9uYW1lKTsKCQkJaWYgKHJlcGFpcikgewoJCQkJaWYgKGFzaygiTWFyayBhcyAnaW4gdXNlJyIsIDEpKQoJCQkJCW1hcmtfaW5vZGUobnIpOwoJCQkJZWxzZQoJCQkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJCX0KCQl9CgkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJCWRpcmVjdG9yeSsrOwoJCWVsc2UgaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCgkJCXJlZ3VsYXIrKzsKCQllbHNlIGlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpKQoJCQljaGFyZGV2Kys7CgkJZWxzZSBpZiAoU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKCQkJYmxvY2tkZXYrKzsKCQllbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQoJCQlzeW1saW5rcysrOwoJCWVsc2UgaWYgKFNfSVNTT0NLKGlub2RlLT5pX21vZGUpKTsKCQllbHNlIGlmIChTX0lTRklGTyhpbm9kZS0+aV9tb2RlKSk7CgkJZWxzZSB7CgkJCXByaW50ZigiJXMgaGFzIG1vZGUgJTA1b1xuIiwgY3VycmVudF9uYW1lLCBpbm9kZS0+aV9tb2RlKTsKCQl9CgoJfSBlbHNlCgkJbGlua3MrKzsKCWlmICghKytpbm9kZV9jb3VudFtucl0pIHsKCQlwcmludGYoIldhcm5pbmc6IGlub2RlIGNvdW50IHRvbyBiaWdcbiIpOwoJCWlub2RlX2NvdW50W25yXS0tOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9CglyZXR1cm4gaW5vZGU7Cn0KCiNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHN0cnVjdCBtaW5peDJfaW5vZGUgKmdldF9pbm9kZTIodW5zaWduZWQgbnIpCnsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlOwoKCWlmICghbnIgfHwgbnIgPiBJTk9ERVMpCgkJcmV0dXJuIE5VTEw7Cgl0b3RhbCsrOwoJaW5vZGUgPSBJbm9kZTIgKyBucjsKCWlmICghaW5vZGVfY291bnRbbnJdKSB7CgkJaWYgKCFpbm9kZV9pbl91c2UobnIpKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgaXMgbWFya2VkIGFzICd1bnVzZWQnLCBidXQgaXQgaXMgdXNlZCAiCgkJCQkJImZvciBmaWxlICclcydcbiIsIG5yLCBjdXJyZW50X25hbWUpOwoJCQlpZiAocmVwYWlyKSB7CgkJCQlpZiAoYXNrKCJNYXJrIGFzICdpbiB1c2UnIiwgMSkpCgkJCQkJbWFya19pbm9kZShucik7CgkJCQllbHNlCgkJCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQkJfQoJCX0KCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQkJZGlyZWN0b3J5Kys7CgkJZWxzZSBpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKCQkJcmVndWxhcisrOwoJCWVsc2UgaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkpCgkJCWNoYXJkZXYrKzsKCQllbHNlIGlmIChTX0lTQkxLKGlub2RlLT5pX21vZGUpKQoJCQlibG9ja2RldisrOwoJCWVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCgkJCXN5bWxpbmtzKys7CgkJZWxzZSBpZiAoU19JU1NPQ0soaW5vZGUtPmlfbW9kZSkpOwoJCWVsc2UgaWYgKFNfSVNGSUZPKGlub2RlLT5pX21vZGUpKTsKCQllbHNlIHsKCQkJcHJpbnRmKCIlcyBoYXMgbW9kZSAlMDVvXG4iLCBjdXJyZW50X25hbWUsIGlub2RlLT5pX21vZGUpOwoJCX0KCX0gZWxzZQoJCWxpbmtzKys7CglpZiAoISsraW5vZGVfY291bnRbbnJdKSB7CgkJcHJpbnRmKCJXYXJuaW5nOiBpbm9kZSBjb3VudCB0b28gYmlnXG4iKTsKCQlpbm9kZV9jb3VudFtucl0tLTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIGlub2RlOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgY2hlY2tfcm9vdCh2b2lkKQp7CglzdHJ1Y3QgbWluaXgxX2lub2RlICppbm9kZSA9IElub2RlMSArIE1JTklYX1JPT1RfSU5POwoKCWlmICghaW5vZGUgfHwgIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJZGllKCJyb290IGlub2RlIGlzbid0IGEgZGlyZWN0b3J5Iik7Cn0KCiNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2tfcm9vdDIodm9pZCkKewoJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGUgPSBJbm9kZTIgKyBNSU5JWF9ST09UX0lOTzsKCglpZiAoIWlub2RlIHx8ICFTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCWRpZSgicm9vdCBpbm9kZSBpc24ndCBhIGRpcmVjdG9yeSIpOwp9CiNlbHNlCnZvaWQgY2hlY2tfcm9vdDIodm9pZCk7CiNlbmRpZgoKc3RhdGljIGludCBhZGRfem9uZSh1aW50MTZfdCAqem5yLCBzbWFsbGludCAqY29ycmVjdGVkKQp7CglpbnQgcmVzdWx0OwoJaW50IGJsb2NrOwoKCXJlc3VsdCA9IDA7CglibG9jayA9IGNoZWNrX3pvbmVfbnIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm4gMDsKCWlmICh6b25lX2NvdW50W2Jsb2NrXSkgewoJCXByaW50ZigiQWxyZWFkeSB1c2VkIGJsb2NrIGlzIHJldXNlZCBpbiBmaWxlICclcycuICIsCgkJCQljdXJyZW50X25hbWUpOwoJCWlmIChhc2soIkNsZWFyIiwgMSkpIHsKCQkJKnpuciA9IDA7CgkJCWJsb2NrID0gMDsKCQkJKmNvcnJlY3RlZCA9IDE7CgkJCXJldHVybiAwOwoJCX0KCX0KCWlmICghem9uZV9pbl91c2UoYmxvY2spKSB7CgkJcHJpbnRmKCJCbG9jayAlZCBpbiBmaWxlICclcycgaXMgbWFya2VkIGFzICd1bnVzZWQnLiAiLAoJCQkJYmxvY2ssIGN1cnJlbnRfbmFtZSk7CgkJaWYgKGFzaygiQ29ycmVjdCIsIDEpKQoJCQltYXJrX3pvbmUoYmxvY2spOwoJfQoJaWYgKCErK3pvbmVfY291bnRbYmxvY2tdKQoJCXpvbmVfY291bnRbYmxvY2tdLS07CglyZXR1cm4gYmxvY2s7Cn0KCiNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKc3RhdGljIGludCBhZGRfem9uZTIodWludDMyX3QgKnpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKewoJaW50IHJlc3VsdDsKCWludCBibG9jazsKCglyZXN1bHQgPSAwOwoJYmxvY2sgPSBjaGVja196b25lX25yMih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybiAwOwoJaWYgKHpvbmVfY291bnRbYmxvY2tdKSB7CgkJcHJpbnRmKCJBbHJlYWR5IHVzZWQgYmxvY2sgaXMgcmV1c2VkIGluIGZpbGUgJyVzJy4gIiwKCQkJCWN1cnJlbnRfbmFtZSk7CgkJaWYgKGFzaygiQ2xlYXIiLCAxKSkgewoJCQkqem5yID0gMDsKCQkJYmxvY2sgPSAwOwoJCQkqY29ycmVjdGVkID0gMTsKCQkJcmV0dXJuIDA7CgkJfQoJfQoJaWYgKCF6b25lX2luX3VzZShibG9jaykpIHsKCQlwcmludGYoIkJsb2NrICVkIGluIGZpbGUgJyVzJyBpcyBtYXJrZWQgYXMgJ3VudXNlZCcuICIsCgkJCQlibG9jaywgY3VycmVudF9uYW1lKTsKCQlpZiAoYXNrKCJDb3JyZWN0IiwgMSkpCgkJCW1hcmtfem9uZShibG9jayk7Cgl9CglpZiAoISsrem9uZV9jb3VudFtibG9ja10pCgkJem9uZV9jb3VudFtibG9ja10tLTsKCXJldHVybiBibG9jazsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGFkZF96b25lX2luZCh1aW50MTZfdCAqem5yLCBzbWFsbGludCAqY29ycmVjdGVkKQp7CglpbnQgaTsKCWludCBibG9jazsKCXNtYWxsaW50IGNoZ19ibGsgPSAwOwoKCWJsb2NrID0gYWRkX3pvbmUoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBhZGRfem9uZV9pbmRfYmxrKTsKCWZvciAoaSA9IDA7IGkgPCAoQkxPQ0tfU0laRSA+PiAxKTsgaSsrKQoJCWFkZF96b25lKGkgKyAodWludDE2X3QgKikgYWRkX3pvbmVfaW5kX2JsaywgJmNoZ19ibGspOwoJaWYgKGNoZ19ibGspCgkJd3JpdGVfYmxvY2soYmxvY2ssIGFkZF96b25lX2luZF9ibGspOwp9CgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGFkZF96b25lX2luZDIodWludDMyX3QgKnpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKewoJaW50IGk7CglpbnQgYmxvY2s7CglzbWFsbGludCBjaGdfYmxrID0gMDsKCglibG9jayA9IGFkZF96b25lMih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybjsKCXJlYWRfYmxvY2soYmxvY2ssIGFkZF96b25lX2luZF9ibGspOwoJZm9yIChpID0gMDsgaSA8IEJMT0NLX1NJWkUgPj4gMjsgaSsrKQoJCWFkZF96b25lMihpICsgKHVpbnQzMl90ICopIGFkZF96b25lX2luZF9ibGssICZjaGdfYmxrKTsKCWlmIChjaGdfYmxrKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCBhZGRfem9uZV9pbmRfYmxrKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGFkZF96b25lX2RpbmQodWludDE2X3QgKnpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKewoJaW50IGk7CglpbnQgYmxvY2s7CglzbWFsbGludCBjaGdfYmxrID0gMDsKCglibG9jayA9IGFkZF96b25lKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayhibG9jaywgYWRkX3pvbmVfZGluZF9ibGspOwoJZm9yIChpID0gMDsgaSA8IChCTE9DS19TSVpFID4+IDEpOyBpKyspCgkJYWRkX3pvbmVfaW5kKGkgKyAodWludDE2X3QgKikgYWRkX3pvbmVfZGluZF9ibGssICZjaGdfYmxrKTsKCWlmIChjaGdfYmxrKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCBhZGRfem9uZV9kaW5kX2Jsayk7Cn0KCiNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgYWRkX3pvbmVfZGluZDIodWludDMyX3QgKnpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKewoJaW50IGk7CglpbnQgYmxvY2s7CglzbWFsbGludCBjaGdfYmxrID0gMDsKCglibG9jayA9IGFkZF96b25lMih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybjsKCXJlYWRfYmxvY2soYmxvY2ssIGFkZF96b25lX2RpbmRfYmxrKTsKCWZvciAoaSA9IDA7IGkgPCBCTE9DS19TSVpFID4+IDI7IGkrKykKCQlhZGRfem9uZV9pbmQyKGkgKyAodWludDMyX3QgKikgYWRkX3pvbmVfZGluZF9ibGssICZjaGdfYmxrKTsKCWlmIChjaGdfYmxrKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCBhZGRfem9uZV9kaW5kX2Jsayk7Cn0KCnN0YXRpYyB2b2lkIGFkZF96b25lX3RpbmQyKHVpbnQzMl90ICp6bnIsIHNtYWxsaW50ICpjb3JyZWN0ZWQpCnsKCWludCBpOwoJaW50IGJsb2NrOwoJc21hbGxpbnQgY2hnX2JsayA9IDA7CgoJYmxvY2sgPSBhZGRfem9uZTIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBhZGRfem9uZV90aW5kX2Jsayk7Cglmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfU0laRSA+PiAyOyBpKyspCgkJYWRkX3pvbmVfZGluZDIoaSArICh1aW50MzJfdCAqKSBhZGRfem9uZV90aW5kX2JsaywgJmNoZ19ibGspOwoJaWYgKGNoZ19ibGspCgkJd3JpdGVfYmxvY2soYmxvY2ssIGFkZF96b25lX3RpbmRfYmxrKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrX3pvbmVzKHVuc2lnbmVkIGkpCnsKCXN0cnVjdCBtaW5peDFfaW5vZGUgKmlub2RlOwoKCWlmICghaSB8fCBpID4gSU5PREVTKQoJCXJldHVybjsKCWlmIChpbm9kZV9jb3VudFtpXSA+IDEpCQkvKiBoYXZlIHdlIGNvdW50ZWQgdGhpcyBmaWxlIGFscmVhZHk/ICovCgkJcmV0dXJuOwoJaW5vZGUgPSBJbm9kZTEgKyBpOwoJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpICYmICFTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCgkJIVNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHJldHVybjsKCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCgkJYWRkX3pvbmUoaSArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKCWFkZF96b25lX2luZCg3ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfZGluZCg4ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwp9CgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrX3pvbmVzMih1bnNpZ25lZCBpKQp7CglzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZTsKCglpZiAoIWkgfHwgaSA+IElOT0RFUykKCQlyZXR1cm47CglpZiAoaW5vZGVfY291bnRbaV0gPiAxKQkJLyogaGF2ZSB3ZSBjb3VudGVkIHRoaXMgZmlsZSBhbHJlYWR5PyAqLwoJCXJldHVybjsKCWlub2RlID0gSW5vZGUyICsgaTsKCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiAhU19JU1JFRyhpbm9kZS0+aV9tb2RlKQoJCSYmICFTX0lTTE5LKGlub2RlLT5pX21vZGUpKQoJCXJldHVybjsKCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCgkJYWRkX3pvbmUyKGkgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV9pbmQyKDcgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV9kaW5kMig4ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfdGluZDIoOSArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrX2ZpbGUoc3RydWN0IG1pbml4MV9pbm9kZSAqZGlyLCB1bnNpZ25lZCBvZmZzZXQpCnsKCXN0cnVjdCBtaW5peDFfaW5vZGUgKmlub2RlOwoJaW50IGlubzsKCWNoYXIgKm5hbWU7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBtYXBfYmxvY2soZGlyLCBvZmZzZXQgLyBCTE9DS19TSVpFKTsKCXJlYWRfYmxvY2soYmxvY2ssIGNoZWNrX2ZpbGVfYmxrKTsKCW5hbWUgPSBjaGVja19maWxlX2JsayArIChvZmZzZXQgJSBCTE9DS19TSVpFKSArIDI7Cglpbm8gPSAqKHVpbnQxNl90ICopIChuYW1lIC0gMik7CglpZiAoaW5vID4gSU5PREVTKSB7CgkJcHJpbnRmKCIlcyBjb250YWlucyBhIGJhZCBpbm9kZSBudW1iZXIgZm9yIGZpbGUgJyUuKnMnLiAiLAoJCQkJY3VycmVudF9uYW1lLCBuYW1lbGVuLCBuYW1lKTsKCQlpZiAoYXNrKCJSZW1vdmUiLCAxKSkgewoJCQkqKHVpbnQxNl90ICopIChuYW1lIC0gMikgPSAwOwoJCQl3cml0ZV9ibG9jayhibG9jaywgY2hlY2tfZmlsZV9ibGspOwoJCX0KCQlpbm8gPSAwOwoJfQoJcHVzaF9maWxlbmFtZShuYW1lKTsKCWlub2RlID0gZ2V0X2lub2RlKGlubyk7Cglwb3BfZmlsZW5hbWUoKTsKCWlmICghb2Zmc2V0KSB7CgkJaWYgKGlub2RlICYmIExPTkVfQ0hBUihuYW1lLCAnLicpKQoJCQlyZXR1cm47CgkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogJy4nIGlzbid0IGZpcnN0XG4iLCBjdXJyZW50X25hbWUpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9CglpZiAob2Zmc2V0ID09IGRpcnNpemUpIHsKCQlpZiAoaW5vZGUgJiYgc3RyY21wKCIuLiIsIG5hbWUpID09IDApCgkJCXJldHVybjsKCQlwcmludGYoIiVzOiBiYWQgZGlyZWN0b3J5OiAnLi4nIGlzbid0IHNlY29uZFxuIiwgY3VycmVudF9uYW1lKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJaWYgKCFpbm9kZSkKCQlyZXR1cm47CglwdXNoX2ZpbGVuYW1lKG5hbWUpOwoJaWYgKGxpc3QpIHsKCQlpZiAodmVyYm9zZSkKCQkJcHJpbnRmKCIlNmQgJTA3byAlM2QgIiwgaW5vLCBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9ubGlua3MpOwoJCXByaW50ZigiJXMlc1xuIiwgY3VycmVudF9uYW1lLCBTX0lTRElSKGlub2RlLT5pX21vZGUpID8gIjoiIDogIiIpOwoJfQoJY2hlY2tfem9uZXMoaW5vKTsKCWlmIChpbm9kZSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCXJlY3Vyc2l2ZV9jaGVjayhpbm8pOwoJcG9wX2ZpbGVuYW1lKCk7Cn0KCiNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2tfZmlsZTIoc3RydWN0IG1pbml4Ml9pbm9kZSAqZGlyLCB1bnNpZ25lZCBvZmZzZXQpCnsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlOwoJaW50IGlubzsKCWNoYXIgKm5hbWU7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBtYXBfYmxvY2syKGRpciwgb2Zmc2V0IC8gQkxPQ0tfU0laRSk7CglyZWFkX2Jsb2NrKGJsb2NrLCBjaGVja19maWxlX2Jsayk7CgluYW1lID0gY2hlY2tfZmlsZV9ibGsgKyAob2Zmc2V0ICUgQkxPQ0tfU0laRSkgKyAyOwoJaW5vID0gKih1aW50MTZfdCAqKSAobmFtZSAtIDIpOwoJaWYgKGlubyA+IElOT0RFUykgewoJCXByaW50ZigiJXMgY29udGFpbnMgYSBiYWQgaW5vZGUgbnVtYmVyIGZvciBmaWxlICclLipzJy4gIiwKCQkJCWN1cnJlbnRfbmFtZSwgbmFtZWxlbiwgbmFtZSk7CgkJaWYgKGFzaygiUmVtb3ZlIiwgMSkpIHsKCQkJKih1aW50MTZfdCAqKSAobmFtZSAtIDIpID0gMDsKCQkJd3JpdGVfYmxvY2soYmxvY2ssIGNoZWNrX2ZpbGVfYmxrKTsKCQl9CgkJaW5vID0gMDsKCX0KCXB1c2hfZmlsZW5hbWUobmFtZSk7Cglpbm9kZSA9IGdldF9pbm9kZTIoaW5vKTsKCXBvcF9maWxlbmFtZSgpOwoJaWYgKCFvZmZzZXQpIHsKCQlpZiAoaW5vZGUgJiYgTE9ORV9DSEFSKG5hbWUsICcuJykpCgkJCXJldHVybjsKCQlwcmludGYoIiVzOiBiYWQgZGlyZWN0b3J5OiAnLicgaXNuJ3QgZmlyc3RcbiIsIGN1cnJlbnRfbmFtZSk7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCWlmIChvZmZzZXQgPT0gZGlyc2l6ZSkgewoJCWlmIChpbm9kZSAmJiBzdHJjbXAoIi4uIiwgbmFtZSkgPT0gMCkKCQkJcmV0dXJuOwoJCXByaW50ZigiJXM6IGJhZCBkaXJlY3Rvcnk6ICcuLicgaXNuJ3Qgc2Vjb25kXG4iLCBjdXJyZW50X25hbWUpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9CglpZiAoIWlub2RlKQoJCXJldHVybjsKCXB1c2hfZmlsZW5hbWUobmFtZSk7CglpZiAobGlzdCkgewoJCWlmICh2ZXJib3NlKQoJCQlwcmludGYoIiU2ZCAlMDdvICUzZCAiLCBpbm8sIGlub2RlLT5pX21vZGUsIGlub2RlLT5pX25saW5rcyk7CgkJcHJpbnRmKCIlcyVzXG4iLCBjdXJyZW50X25hbWUsIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgPyAiOiIgOiAiIik7Cgl9CgljaGVja196b25lczIoaW5vKTsKCWlmIChpbm9kZSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCXJlY3Vyc2l2ZV9jaGVjazIoaW5vKTsKCXBvcF9maWxlbmFtZSgpOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgcmVjdXJzaXZlX2NoZWNrKHVuc2lnbmVkIGlubykKewoJc3RydWN0IG1pbml4MV9pbm9kZSAqZGlyOwoJdW5zaWduZWQgb2Zmc2V0OwoKCWRpciA9IElub2RlMSArIGlubzsKCWlmICghU19JU0RJUihkaXItPmlfbW9kZSkpCgkJZGllKCJpbnRlcm5hbCBlcnJvciIpOwoJaWYgKGRpci0+aV9zaXplIDwgMiAqIGRpcnNpemUpIHsKCQlwcmludGYoIiVzOiBiYWQgZGlyZWN0b3J5OiBzaXplPDMyIiwgY3VycmVudF9uYW1lKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBkaXItPmlfc2l6ZTsgb2Zmc2V0ICs9IGRpcnNpemUpCgkJY2hlY2tfZmlsZShkaXIsIG9mZnNldCk7Cn0KCiNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgcmVjdXJzaXZlX2NoZWNrMih1bnNpZ25lZCBpbm8pCnsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmRpcjsKCXVuc2lnbmVkIG9mZnNldDsKCglkaXIgPSBJbm9kZTIgKyBpbm87CglpZiAoIVNfSVNESVIoZGlyLT5pX21vZGUpKQoJCWRpZSgiaW50ZXJuYWwgZXJyb3IiKTsKCWlmIChkaXItPmlfc2l6ZSA8IDIgKiBkaXJzaXplKSB7CgkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogc2l6ZTwzMiIsIGN1cnJlbnRfbmFtZSk7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGlyLT5pX3NpemU7IG9mZnNldCArPSBkaXJzaXplKQoJCWNoZWNrX2ZpbGUyKGRpciwgb2Zmc2V0KTsKfQojZW5kaWYKCnN0YXRpYyBpbnQgYmFkX3pvbmUoaW50IGkpCnsKCWNoYXIgYnVmZmVyW0JMT0NLX1NJWkVdOwoKCWlmIChCTE9DS19TSVpFICogaSAhPSBsc2VlayhkZXZfZmQsIEJMT0NLX1NJWkUgKiBpLCBTRUVLX1NFVCkpCgkJZGllKCJzZWVrIGZhaWxlZCBpbiBiYWRfem9uZSIpOwoJcmV0dXJuIChCTE9DS19TSVpFICE9IHJlYWQoZGV2X2ZkLCBidWZmZXIsIEJMT0NLX1NJWkUpKTsKfQoKc3RhdGljIHZvaWQgY2hlY2tfY291bnRzKHZvaWQpCnsKCWludCBpOwoKCWZvciAoaSA9IDE7IGkgPD0gSU5PREVTOyBpKyspIHsKCQlpZiAod2Fybl9tb2RlICYmIElub2RlMVtpXS5pX21vZGUgJiYgIWlub2RlX2luX3VzZShpKSkgewoJCQlwcmludGYoIklub2RlICVkIGhhcyBub24temVybyBtb2RlLiAiLCBpKTsKCQkJaWYgKGFzaygiQ2xlYXIiLCAxKSkgewoJCQkJSW5vZGUxW2ldLmlfbW9kZSA9IDA7CgkJCQljaGFuZ2VkID0gMTsKCQkJfQoJCX0KCQlpZiAoIWlub2RlX2NvdW50W2ldKSB7CgkJCWlmICghaW5vZGVfaW5fdXNlKGkpKQoJCQkJY29udGludWU7CgkJCXByaW50ZigiVW51c2VkIGlub2RlICVkIGlzIG1hcmtlZCBhcyAndXNlZCcgaW4gdGhlIGJpdG1hcC4gIiwgaSk7CgkJCWlmIChhc2soIkNsZWFyIiwgMSkpCgkJCQl1bm1hcmtfaW5vZGUoaSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIWlub2RlX2luX3VzZShpKSkgewoJCQlwcmludGYoIklub2RlICVkIGlzIHVzZWQsIGJ1dCBtYXJrZWQgYXMgJ3VudXNlZCcgaW4gdGhlIGJpdG1hcC4gIiwgaSk7CgkJCWlmIChhc2soIlNldCIsIDEpKQoJCQkJbWFya19pbm9kZShpKTsKCQl9CgkJaWYgKElub2RlMVtpXS5pX25saW5rcyAhPSBpbm9kZV9jb3VudFtpXSkgewoJCQlwcmludGYoIklub2RlICVkIChtb2RlPSUwN28pLCBpX25saW5rcz0lZCwgY291bnRlZD0lZC4gIiwKCQkJCWksIElub2RlMVtpXS5pX21vZGUsIElub2RlMVtpXS5pX25saW5rcywKCQkJCWlub2RlX2NvdW50W2ldKTsKCQkJaWYgKGFzaygiU2V0IGlfbmxpbmtzIHRvIGNvdW50IiwgMSkpIHsKCQkJCUlub2RlMVtpXS5pX25saW5rcyA9IGlub2RlX2NvdW50W2ldOwoJCQkJY2hhbmdlZCA9IDE7CgkJCX0KCQl9Cgl9Cglmb3IgKGkgPSBGSVJTVFpPTkU7IGkgPCBaT05FUzsgaSsrKSB7CgkJaWYgKCh6b25lX2luX3VzZShpKSAhPSAwKSA9PSB6b25lX2NvdW50W2ldKQoJCQljb250aW51ZTsKCQlpZiAoIXpvbmVfY291bnRbaV0pIHsKCQkJaWYgKGJhZF96b25lKGkpKQoJCQkJY29udGludWU7CgkJCXByaW50ZigiWm9uZSAlZCBpcyBtYXJrZWQgJ2luIHVzZScsIGJ1dCBubyBmaWxlIHVzZXMgaXQuICIsIGkpOwoJCQlpZiAoYXNrKCJVbm1hcmsiLCAxKSkKCQkJCXVubWFya196b25lKGkpOwoJCQljb250aW51ZTsKCQl9CgkJcHJpbnRmKCJab25lICVkOiAlc2luIHVzZSwgY291bnRlZD0lZFxuIiwKCQkJICAgaSwgem9uZV9pbl91c2UoaSkgPyAiIiA6ICJub3QgIiwgem9uZV9jb3VudFtpXSk7Cgl9Cn0KCiNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2tfY291bnRzMih2b2lkKQp7CglpbnQgaTsKCglmb3IgKGkgPSAxOyBpIDw9IElOT0RFUzsgaSsrKSB7CgkJaWYgKHdhcm5fbW9kZSAmJiBJbm9kZTJbaV0uaV9tb2RlICYmICFpbm9kZV9pbl91c2UoaSkpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCBoYXMgbm9uLXplcm8gbW9kZS4gIiwgaSk7CgkJCWlmIChhc2soIkNsZWFyIiwgMSkpIHsKCQkJCUlub2RlMltpXS5pX21vZGUgPSAwOwoJCQkJY2hhbmdlZCA9IDE7CgkJCX0KCQl9CgkJaWYgKCFpbm9kZV9jb3VudFtpXSkgewoJCQlpZiAoIWlub2RlX2luX3VzZShpKSkKCQkJCWNvbnRpbnVlOwoJCQlwcmludGYoIlVudXNlZCBpbm9kZSAlZCBpcyBtYXJrZWQgYXMgJ3VzZWQnIGluIHRoZSBiaXRtYXAuICIsIGkpOwoJCQlpZiAoYXNrKCJDbGVhciIsIDEpKQoJCQkJdW5tYXJrX2lub2RlKGkpOwoJCQljb250aW51ZTsKCQl9CgkJaWYgKCFpbm9kZV9pbl91c2UoaSkpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCBpcyB1c2VkLCBidXQgbWFya2VkIGFzICd1bnVzZWQnIGluIHRoZSBiaXRtYXAuICIsIGkpOwoJCQlpZiAoYXNrKCJTZXQiLCAxKSkKCQkJCW1hcmtfaW5vZGUoaSk7CgkJfQoJCWlmIChJbm9kZTJbaV0uaV9ubGlua3MgIT0gaW5vZGVfY291bnRbaV0pIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCAobW9kZT0lMDdvKSwgaV9ubGlua3M9JWQsIGNvdW50ZWQ9JWQuICIsCgkJCQlpLCBJbm9kZTJbaV0uaV9tb2RlLCBJbm9kZTJbaV0uaV9ubGlua3MsCgkJCQlpbm9kZV9jb3VudFtpXSk7CgkJCWlmIChhc2soIlNldCBpX25saW5rcyB0byBjb3VudCIsIDEpKSB7CgkJCQlJbm9kZTJbaV0uaV9ubGlua3MgPSBpbm9kZV9jb3VudFtpXTsKCQkJCWNoYW5nZWQgPSAxOwoJCQl9CgkJfQoJfQoJZm9yIChpID0gRklSU1RaT05FOyBpIDwgWk9ORVM7IGkrKykgewoJCWlmICgoem9uZV9pbl91c2UoaSkgIT0gMCkgPT0gem9uZV9jb3VudFtpXSkKCQkJY29udGludWU7CgkJaWYgKCF6b25lX2NvdW50W2ldKSB7CgkJCWlmIChiYWRfem9uZShpKSkKCQkJCWNvbnRpbnVlOwoJCQlwcmludGYoIlpvbmUgJWQgaXMgbWFya2VkICdpbiB1c2UnLCBidXQgbm8gZmlsZSB1c2VzIGl0LiAiLCBpKTsKCQkJaWYgKGFzaygiVW5tYXJrIiwgMSkpCgkJCQl1bm1hcmtfem9uZShpKTsKCQkJY29udGludWU7CgkJfQoJCXByaW50ZigiWm9uZSAlZDogJXNpbiB1c2UsIGNvdW50ZWQ9JWRcbiIsCgkJCSAgIGksIHpvbmVfaW5fdXNlKGkpID8gIiIgOiAibm90ICIsIHpvbmVfY291bnRbaV0pOwoJfQp9CiNlbmRpZgoKc3RhdGljIHZvaWQgY2hlY2sodm9pZCkKewoJbWVtc2V0KGlub2RlX2NvdW50LCAwLCAoSU5PREVTICsgMSkgKiBzaXplb2YoKmlub2RlX2NvdW50KSk7CgltZW1zZXQoem9uZV9jb3VudCwgMCwgWk9ORVMgKiBzaXplb2YoKnpvbmVfY291bnQpKTsKCWNoZWNrX3pvbmVzKE1JTklYX1JPT1RfSU5PKTsKCXJlY3Vyc2l2ZV9jaGVjayhNSU5JWF9ST09UX0lOTyk7CgljaGVja19jb3VudHMoKTsKfQoKI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBjaGVjazIodm9pZCkKewoJbWVtc2V0KGlub2RlX2NvdW50LCAwLCAoSU5PREVTICsgMSkgKiBzaXplb2YoKmlub2RlX2NvdW50KSk7CgltZW1zZXQoem9uZV9jb3VudCwgMCwgWk9ORVMgKiBzaXplb2YoKnpvbmVfY291bnQpKTsKCWNoZWNrX3pvbmVzMihNSU5JWF9ST09UX0lOTyk7CglyZWN1cnNpdmVfY2hlY2syKE1JTklYX1JPT1RfSU5PKTsKCWNoZWNrX2NvdW50czIoKTsKfQojZWxzZQp2b2lkIGNoZWNrMih2b2lkKTsKI2VuZGlmCgppbnQgZnNja19taW5peF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndik7CmludCBmc2NrX21pbml4X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CglzdHJ1Y3QgdGVybWlvcyB0bXA7CglpbnQgcmV0Y29kZSA9IDA7CgoJeGZ1bmNfZXJyb3JfcmV0dmFsID0gODsKCglJTklUX0coKTsKCglpZiAoSU5PREVfU0laRTEgKiBNSU5JWDFfSU5PREVTX1BFUl9CTE9DSyAhPSBCTE9DS19TSVpFKQoJCWRpZSgiYmFkIGlub2RlIHNpemUiKTsKI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgoJaWYgKElOT0RFX1NJWkUyICogTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0sgIT0gQkxPQ0tfU0laRSkKCQlkaWUoImJhZCB2MiBpbm9kZSBzaXplIik7CiNlbmRpZgoJd2hpbGUgKC0tYXJnYyAhPSAwKSB7CgkJYXJndisrOwoJCWlmIChhcmd2WzBdWzBdICE9ICctJykgewoJCQlpZiAoZGV2aWNlX25hbWUpCgkJCQliYl9zaG93X3VzYWdlKCk7CgkJCWRldmljZV9uYW1lID0gYXJndlswXTsKCQl9IGVsc2UgewoJCQl3aGlsZSAoKisrYXJndlswXSkgewoJCQkJc3dpdGNoIChhcmd2WzBdWzBdKSB7CgkJCQljYXNlICdsJzoKCQkJCQlsaXN0ID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ2EnOgoJCQkJCWF1dG9tYXRpYyA9IDE7CgkJCQkJcmVwYWlyID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3InOgoJCQkJCWF1dG9tYXRpYyA9IDA7CgkJCQkJcmVwYWlyID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3YnOgoJCQkJCXZlcmJvc2UgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAncyc6CgkJCQkJc2hvdyA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdtJzoKCQkJCQl3YXJuX21vZGUgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnZic6CgkJCQkJZm9yY2UgPSAxOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQliYl9zaG93X3VzYWdlKCk7CgkJCQl9CgkJCX0KCQl9Cgl9CglpZiAoIWRldmljZV9uYW1lKQoJCWJiX3Nob3dfdXNhZ2UoKTsKCgljaGVja19tb3VudCgpOwkJCQkvKiB0cnlpbmcgdG8gY2hlY2sgYSBtb3VudGVkIGZpbGVzeXN0ZW0/ICovCglpZiAocmVwYWlyICYmICFhdXRvbWF0aWMpIHsKCQlpZiAoIWlzYXR0eSgwKSB8fCAhaXNhdHR5KDEpKQoJCQlkaWUoIm5lZWQgdGVybWluYWwgZm9yIGludGVyYWN0aXZlIHJlcGFpcnMiKTsKCX0KCWRldl9mZCA9IHhvcGVuKGRldmljZV9uYW1lLCByZXBhaXIgPyBPX1JEV1IgOiBPX1JET05MWSk7CgoJLypzeW5jKCk7IHBhcmFub2lhPyAqLwoJcmVhZF9zdXBlcmJsb2NrKCk7CgoJLyoKCSAqIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgY29udGludWUgd2l0aCB0aGUgY2hlY2tpbmcuCgkgKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBzdGF0dXMgb2YgdGhlIGZpbGVzeXN0ZW0gdmFsaWQgYW5kIGVycm9yCgkgKiBmbGFncyBhbmQgd2hldGhlciBvciBub3QgdGhlIC1mIHN3aXRjaCB3YXMgc3BlY2lmaWVkIG9uIHRoZQoJICogY29tbWFuZCBsaW5lLgoJICovCglwcmludGYoIiVzOiAlc1xuIiwgYXBwbGV0X25hbWUsIGJiX2Jhbm5lcik7CgoJaWYgKCEoU3VwZXIuc19zdGF0ZSAmIE1JTklYX0VSUk9SX0ZTKQoJICYmIChTdXBlci5zX3N0YXRlICYgTUlOSVhfVkFMSURfRlMpICYmICFmb3JjZQoJKSB7CgkJaWYgKHJlcGFpcikKCQkJcHJpbnRmKCIlcyBpcyBjbGVhbiwgY2hlY2sgaXMgc2tpcHBlZFxuIiwgZGV2aWNlX25hbWUpOwoJCXJldHVybiAwOwoJfSBlbHNlIGlmIChmb3JjZSkKCQlwcmludGYoIkZvcmNpbmcgZmlsZXN5c3RlbSBjaGVjayBvbiAlc1xuIiwgZGV2aWNlX25hbWUpOwoJZWxzZSBpZiAocmVwYWlyKQoJCXByaW50ZigiRmlsZXN5c3RlbSBvbiAlcyBpcyBkaXJ0eSwgbmVlZHMgY2hlY2tpbmdcbiIsCgkJCSAgIGRldmljZV9uYW1lKTsKCglyZWFkX3RhYmxlcygpOwoKCWlmIChyZXBhaXIgJiYgIWF1dG9tYXRpYykgewoJCXRjZ2V0YXR0cigwLCAmc3ZfdGVybWlvcyk7CgkJdG1wID0gc3ZfdGVybWlvczsKCQl0bXAuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8pOwoJCXRjc2V0YXR0cigwLCBUQ1NBTk9XLCAmdG1wKTsKCQl0ZXJtaW9zX3NldCA9IDE7Cgl9CgoJaWYgKHZlcnNpb24yKSB7CgkJY2hlY2tfcm9vdDIoKTsKCQljaGVjazIoKTsKCX0gZWxzZSB7CgkJY2hlY2tfcm9vdCgpOwoJCWNoZWNrKCk7Cgl9CgoJaWYgKHZlcmJvc2UpIHsKCQlpbnQgaSwgZnJlZV9jbnQ7CgoJCWZvciAoaSA9IDEsIGZyZWVfY250ID0gMDsgaSA8PSBJTk9ERVM7IGkrKykKCQkJaWYgKCFpbm9kZV9pbl91c2UoaSkpCgkJCQlmcmVlX2NudCsrOwoJCXByaW50ZigiXG4lNnUgaW5vZGVzIHVzZWQgKCV1JSUpXG4iLCAoSU5PREVTIC0gZnJlZV9jbnQpLAoJCQkgICAxMDAgKiAoSU5PREVTIC0gZnJlZV9jbnQpIC8gSU5PREVTKTsKCQlmb3IgKGkgPSBGSVJTVFpPTkUsIGZyZWVfY250ID0gMDsgaSA8IFpPTkVTOyBpKyspCgkJCWlmICghem9uZV9pbl91c2UoaSkpCgkJCQlmcmVlX2NudCsrOwoJCXByaW50ZigiJTZ1IHpvbmVzIHVzZWQgKCV1JSUpXG5cbiIKCQkJICAgIiU2dSByZWd1bGFyIGZpbGVzXG4iCgkJCSAgICIlNnUgZGlyZWN0b3JpZXNcbiIKCQkJICAgIiU2dSBjaGFyYWN0ZXIgZGV2aWNlIGZpbGVzXG4iCgkJCSAgICIlNnUgYmxvY2sgZGV2aWNlIGZpbGVzXG4iCgkJCSAgICIlNnUgbGlua3NcbiIKCQkJICAgIiU2dSBzeW1ib2xpYyBsaW5rc1xuIgoJCQkgICAiLS0tLS0tXG4iCgkJCSAgICIlNnUgZmlsZXNcbiIsCgkJCSAgIChaT05FUyAtIGZyZWVfY250KSwgMTAwICogKFpPTkVTIC0gZnJlZV9jbnQpIC8gWk9ORVMsCgkJCSAgIHJlZ3VsYXIsIGRpcmVjdG9yeSwgY2hhcmRldiwgYmxvY2tkZXYsCgkJCSAgIGxpbmtzIC0gMiAqIGRpcmVjdG9yeSArIDEsIHN5bWxpbmtzLAoJCQkgICB0b3RhbCAtIDIgKiBkaXJlY3RvcnkgKyAxKTsKCX0KCWlmIChjaGFuZ2VkKSB7CgkJd3JpdGVfdGFibGVzKCk7CgkJcHJpbnRmKCJGSUxFIFNZU1RFTSBIQVMgQkVFTiBDSEFOR0VEXG4iKTsKCQlzeW5jKCk7Cgl9IGVsc2UgaWYgKHJlcGFpcikKCQl3cml0ZV9zdXBlcl9ibG9jaygpOwoKCWlmIChyZXBhaXIgJiYgIWF1dG9tYXRpYykKCQl0Y3NldGF0dHIoMCwgVENTQU5PVywgJnN2X3Rlcm1pb3MpOwoKCWlmIChjaGFuZ2VkKQoJCXJldGNvZGUgKz0gMzsKCWlmIChlcnJvcnNfdW5jb3JyZWN0ZWQpCgkJcmV0Y29kZSArPSA0OwoJcmV0dXJuIHJldGNvZGU7Cn0K