Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIGZzY2suYyAtIGEgZmlsZSBzeXN0ZW0gY29uc2lzdGVuY3kgY2hlY2tlciBmb3IgTGludXguCiAqCiAqIChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzLiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQKICogYXMgcGVyIHRoZSBHTlUgY29weWxlZnQuCiAqLwoKLyoKICogMDkuMTEuOTEgIC0gIG1hZGUgdGhlIGZpcnN0IHJ1ZGltZW50YXJ5IGZ1bmN0aW9ucwogKgogKiAxMC4xMS45MSAgLSAgdXBkYXRlZCwgZG9lcyBjaGVja2luZywgbm8gcmVwYWlycyB5ZXQuCiAqCQlTZW50IG91dCB0byB0aGUgbWFpbGluZy1saXN0IGZvciB0ZXN0aW5nLgogKgogKiAxNC4xMS45MSAgLQlUZXN0aW5nIHNlZW1zIHRvIGhhdmUgZ29uZSB3ZWxsLiBBZGRlZCBzb21lCiAqCQljb3JyZWN0aW9uLWNvZGUsIGFuZCBjaGFuZ2VkIHNvbWUgZnVuY3Rpb25zLgogKgogKiAxNS4xMS45MSAgLSAgTW9yZSBjb3JyZWN0aW9uIGNvZGUuIEhvcGVmdWxseSBpdCBub3RpY2VzIG1vc3QKICoJCWNhc2VzIG5vdywgYW5kIHRyaWVzIHRvIGRvIHNvbWV0aGluZyBhYm91dCB0aGVtLgogKgogKiAxNi4xMS45MSAgLSAgTW9yZSBjb3JyZWN0aW9ucyAodGhhbmtzIHRvIE1pa2EgSmFsYXZhKS4gTW9zdAogKgkJdGhpbmdzIHNlZW0gdG8gd29yayBub3cuIFllYWgsIHN1cmUuCiAqCiAqCiAqIDE5LjA0LjkyICAtCUhhZCB0byBzdGFydCBvdmVyIGFnYWluIGZyb20gdGhpcyBvbGQgdmVyc2lvbiwgYXMgYQogKgkJa2VybmVsIGJ1ZyBhdGUgbXkgZW5oYW5jZWQgZnNjayBpbiBmZWJydWFyeS4KICoKICogMjguMDIuOTMgIC0JYWRkZWQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IGRpcmVjdG9yeSBlbnRyeSBzaXplcy4uCiAqCiAqIFNhdCBNYXIgIDYgMTg6NTk6NDIgMTk5MywgZmFpdGhAY3MudW5jLmVkdTogT3V0cHV0IG5hbWVsZW4gd2l0aAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLWJsb2NrIGluZm9ybWF0aW9uCiAqCiAqIFNhdCBPY3QgIDkgMTE6MTc6MTEgMTk5MywgZmFpdGhAY3MudW5jLmVkdTogbWFrZSBleGl0IHN0YXR1cyBjb25mb3JtCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhhdCByZXF1aXJlZCBieSBmc3V0aWwKICoKICogTW9uIEphbiAgMyAxMTowNjo1MiAxOTk0IC0gRHIuIFdldHRzdGVpbiAoZ3JlZyV3aW5kLnV1Y3BAcGxhaW5zLm5vZGFrLmVkdSkKICoJCQkgICAgICBBZGRlZCBzdXBwb3J0IGZvciBmaWxlIHN5c3RlbSB2YWxpZCBmbGFnLiAgQWxzbwogKgkJCSAgICAgIGFkZGVkIHByb2dyYW1fdmVyc2lvbiB2YXJpYWJsZSBhbmQgb3V0cHV0IG9mCiAqCQkJICAgICAgcHJvZ3JhbSBuYW1lIGFuZCB2ZXJzaW9uIG51bWJlciB3aGVuIHByb2dyYW0KICoJCQkgICAgICBpcyBleGVjdXRlZC4KICoKICogMzAuMTAuOTQgLSBhZGRlZCBzdXBwb3J0IGZvciB2MiBmaWxlc3lzdGVtCiAqICAgICAgICAgICAgKEFuZHJlYXMgU2Nod2FiLCBzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGUpCiAqCiAqIDEwLjEyLjk0ICAtICBhZGRlZCB0ZXN0IHRvIHByZXZlbnQgY2hlY2tpbmcgb2YgbW91bnRlZCBmcyBhZGFwdGVkCiAqICAgICAgICAgICAgICBmcm9tIFRoZW9kb3JlIFRzJ28ncyAodHl0c29AYXRoZW5hLm1pdC5lZHUpIGUyZnNjawogKiAgICAgICAgICAgICAgcHJvZ3JhbS4gIChEYW5pZWwgUXVpbmxhbiwgcXVpbmxhbkB5Z2dkcmFzaWwuY29tKQogKgogKiAwMS4wNy45NiAgLSBGaXhlZCB0aGUgdjIgZnMgc3R1ZmYgdG8gdXNlIHRoZSByaWdodCAjZGVmaW5lcyBhbmQgc3VjaAogKgkgICAgICAgZm9yIG1vZGVybiBsaWJjcyAoamFubEBtYXRoLnVpby5ubywgTmljb2xhaSBMYW5nZmVsZHQpCiAqCiAqIDAyLjA3Ljk2ICAtIEFkZGVkIEMgYml0IGZpZGRsaW5nIHJvdXRpbmVzIGZyb20gcm1rQGVjcy5zb3Rvbi5hYy51awogKiAgICAgICAgICAgICAoUnVzc2VsbCBLaW5nKS4gIEhlIG1hZGUgdGhlbSBmb3IgQVJNLiAgSXQgd291bGQgc2VlbQogKgkgICAgICAgdGhhdCB0aGUgQVJNIGlzIHBvd2VyZnVsIGVub3VnaCB0byBkbyB0aGlzIGluIEMgd2hlcmVhcwogKiAgICAgICAgICAgICBpMzg2IGFuZCBtNjRrIG11c3QgdXNlIGFzc2VtYmx5IHRvIGdldCBpdCBmYXN0ID46LSkKICoJICAgICAgIFRoaXMgc2hvdWxkIG1ha2UgbWluaXggZnNjayBzeXN0ZW0taW5kZXBlbmRlbnQuCiAqCSAgICAgICAoamFubEBtYXRoLnVpby5ubywgTmljb2xhaSBMYW5nZmVsZHQpCiAqCiAqIDA0LjExLjk2ICAtIEFkZGVkIG1pbm9yIGZpeGVzIGZyb20gQW5kcmVhcyBTY2h3YWIgdG8gYXZvaWQgY29tcGlsZXIKICogICAgICAgICAgICAgd2FybmluZ3MuICBBZGRlZCBtYzY4ayBiaXRvcHMgZnJvbQogKgkgICAgICAgSm9lcmcgRG9yY2hhaW4gPGRvcmNoYWluQG1waS1zYi5tcGcuZGU+LgogKgogKiAwNi4xMS45NiAgLSBBZGRlZCB2MiBjb2RlIHN1Ym1pdHRlZCBieSBKb2VyZyBEb3JjaGFpbiwgYnV0IHdyaXR0ZW4gYnkKICogICAgICAgICAgICAgQW5kcmVhcyBTY2h3YWIuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqCiAqIEkndmUgaGFkIG5vIHRpbWUgdG8gYWRkIGNvbW1lbnRzIC0gaG9wZWZ1bGx5IHRoZSBmdW5jdGlvbiBuYW1lcwogKiBhcmUgY29tbWVudHMgZW5vdWdoLiBBcyB3aXRoIGFsbCBmaWxlIHN5c3RlbSBjaGVja2VycywgdGhpcyBhc3N1bWVzCiAqIHRoZSBmaWxlIHN5c3RlbSBpcyBxdWllc2NlbnQgLSBkb24ndCB1c2UgaXQgb24gYSBtb3VudGVkIGRldmljZQogKiB1bmxlc3MgeW91IGNhbiBiZSBzdXJlIG5vYm9keSBpcyB3cml0aW5nIHRvIGl0IChhbmQgcmVtZW1iZXIgdGhhdCB0aGUKICoga2VybmVsIGNhbiB3cml0ZSB0byBpdCB3aGVuIGl0IHNlYXJjaGVzIGZvciBmaWxlcykuCiAqCiAqIFVzYWdlOiBmc2NrIFstbGFydnNtXSBkZXZpY2UKICoJLWwgZm9yIGEgbGlzdGluZyBvZiBhbGwgdGhlIGZpbGVuYW1lcwogKgktYSBmb3IgYXV0b21hdGljIHJlcGFpcnMgKG5vdCBpbXBsZW1lbnRlZCkKICoJLXIgZm9yIHJlcGFpcnMgKGludGVyYWN0aXZlKSAobm90IGltcGxlbWVudGVkKQogKgktdiBmb3IgdmVyYm9zZSAodGVsbHMgaG93IG1hbnkgZmlsZXMpCiAqCS1zIGZvciBzdXBlci1ibG9jayBpbmZvCiAqCS1tIGZvciBtaW5peC1saWtlICJtb2RlIG5vdCBjbGVhcmVkIiB3YXJuaW5ncwogKgktZiBmb3JjZSBmaWxlc3lzdGVtIGNoZWNrIGV2ZW4gaWYgZmlsZXN5c3RlbSBtYXJrZWQgYXMgdmFsaWQKICoKICogVGhlIGRldmljZSBtYXkgYmUgYSBibG9jayBkZXZpY2Ugb3IgYSBpbWFnZSBvZiBvbmUsIGJ1dCB0aGlzIGlzbid0CiAqIGVuZm9yY2VkIChidXQgaXQncyBub3QgbXVjaCBmdW4gb24gYSBjaGFyYWN0ZXIgZGV2aWNlIDotKS4KICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRlcm1pb3MuaD4KI2luY2x1ZGUgPG1udGVudC5oPgojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNpbmNsdWRlICJidXN5Ym94LmgiCgovKgogKiBUaGlzIGlzIHRoZSBvcmlnaW5hbCBtaW5peCBpbm9kZSBsYXlvdXQgb24gZGlzay4KICogTm90ZSB0aGUgOC1iaXQgZ2lkIGFuZCBhdGltZSBhbmQgY3RpbWUuCiAqLwpzdHJ1Y3QgbWluaXhfaW5vZGUgewoJdWludDE2X3QgaV9tb2RlOwoJdWludDE2X3QgaV91aWQ7Cgl1aW50MzJfdCBpX3NpemU7Cgl1aW50MzJfdCBpX3RpbWU7Cgl1aW50OF90ICBpX2dpZDsKCXVpbnQ4X3QgIGlfbmxpbmtzOwoJdWludDE2X3QgaV96b25lWzldOwp9OwoKLyoKICogVGhlIG5ldyBtaW5peCBpbm9kZSBoYXMgYWxsIHRoZSB0aW1lIGVudHJpZXMsIGFzIHdlbGwgYXMKICogbG9uZyBibG9jayBudW1iZXJzIGFuZCBhIHRoaXJkIGluZGlyZWN0IGJsb2NrICg3KzErMSsxCiAqIGluc3RlYWQgb2YgNysxKzEpLiBBbHNvLCBzb21lIHByZXZpb3VzbHkgOC1iaXQgdmFsdWVzIGFyZQogKiBub3cgMTYtYml0LiBUaGUgaW5vZGUgaXMgbm93IDY0IGJ5dGVzIGluc3RlYWQgb2YgMzIuCiAqLwpzdHJ1Y3QgbWluaXgyX2lub2RlIHsKCXVpbnQxNl90IGlfbW9kZTsKCXVpbnQxNl90IGlfbmxpbmtzOwoJdWludDE2X3QgaV91aWQ7Cgl1aW50MTZfdCBpX2dpZDsKCXVpbnQzMl90IGlfc2l6ZTsKCXVpbnQzMl90IGlfYXRpbWU7Cgl1aW50MzJfdCBpX210aW1lOwoJdWludDMyX3QgaV9jdGltZTsKCXVpbnQzMl90IGlfem9uZVsxMF07Cn07CgplbnVtIHsKCU1JTklYX1JPT1RfSU5PID0gMSwKCU1JTklYX0xJTktfTUFYID0gMjUwLAoJTUlOSVgyX0xJTktfTUFYID0gNjU1MzAsCgoJTUlOSVhfSV9NQVBfU0xPVFMgPSA4LAoJTUlOSVhfWl9NQVBfU0xPVFMgPSA2NCwKCU1JTklYX1NVUEVSX01BR0lDID0gMHgxMzdGLAkJLyogb3JpZ2luYWwgbWluaXggZnMgKi8KCU1JTklYX1NVUEVSX01BR0lDMiA9IDB4MTM4RiwJCS8qIG1pbml4IGZzLCAzMCBjaGFyIG5hbWVzICovCglNSU5JWDJfU1VQRVJfTUFHSUMgPSAweDI0NjgsCQkvKiBtaW5peCBWMiBmcyAqLwoJTUlOSVgyX1NVUEVSX01BR0lDMiA9IDB4MjQ3OCwJCS8qIG1pbml4IFYyIGZzLCAzMCBjaGFyIG5hbWVzICovCglNSU5JWF9WQUxJRF9GUyA9IDB4MDAwMSwJCS8qIENsZWFuIGZzLiAqLwoJTUlOSVhfRVJST1JfRlMgPSAweDAwMDIsCQkvKiBmcyBoYXMgZXJyb3JzLiAqLwoKCU1JTklYX0lOT0RFU19QRVJfQkxPQ0sgPSAoKEJMT0NLX1NJWkUpLyhzaXplb2YgKHN0cnVjdCBtaW5peF9pbm9kZSkpKSwKCU1JTklYMl9JTk9ERVNfUEVSX0JMT0NLID0gKChCTE9DS19TSVpFKS8oc2l6ZW9mIChzdHJ1Y3QgbWluaXgyX2lub2RlKSkpLAoKCU1JTklYX1YxID0gMHgwMDAxLAkJLyogb3JpZ2luYWwgbWluaXggZnMgKi8KCU1JTklYX1YyID0gMHgwMDAyIAkJLyogbWluaXggVjIgZnMgKi8KfTsKCiNkZWZpbmUgSU5PREVfVkVSU0lPTihpbm9kZSkJaW5vZGUtPmlfc2ItPnUubWluaXhfc2Iuc192ZXJzaW9uCgovKgogKiBtaW5peCBzdXBlci1ibG9jayBkYXRhIG9uIGRpc2sKICovCnN0cnVjdCBtaW5peF9zdXBlcl9ibG9jayB7Cgl1aW50MTZfdCBzX25pbm9kZXM7Cgl1aW50MTZfdCBzX256b25lczsKCXVpbnQxNl90IHNfaW1hcF9ibG9ja3M7Cgl1aW50MTZfdCBzX3ptYXBfYmxvY2tzOwoJdWludDE2X3Qgc19maXJzdGRhdGF6b25lOwoJdWludDE2X3Qgc19sb2dfem9uZV9zaXplOwoJdWludDMyX3Qgc19tYXhfc2l6ZTsKCXVpbnQxNl90IHNfbWFnaWM7Cgl1aW50MTZfdCBzX3N0YXRlOwoJdWludDMyX3Qgc196b25lczsKfTsKCnN0cnVjdCBtaW5peF9kaXJfZW50cnkgewoJdWludDE2X3QgaW5vZGU7CgljaGFyIG5hbWVbMF07Cn07CgoKI2RlZmluZSBOQU1FX01BWCAgICAgICAgIDI1NSAgIC8qICMgY2hhcnMgaW4gYSBmaWxlIG5hbWUgKi8KCiNkZWZpbmUgTUlOSVhfSU5PREVTX1BFUl9CTE9DSyAoKEJMT0NLX1NJWkUpLyhzaXplb2YgKHN0cnVjdCBtaW5peF9pbm9kZSkpKQoKI2lmbmRlZiBCTEtHRVRTSVpFCiNkZWZpbmUgQkxLR0VUU0laRSBfSU8oMHgxMiw5NikgICAgLyogcmV0dXJuIGRldmljZSBzaXplICovCiNlbmRpZgoKI2lmbmRlZiBfX2xpbnV4X18KI2RlZmluZSB2b2xhdGlsZQojZW5kaWYKCmVudW0geyBST09UX0lOTyA9IDEgfTsKCiNkZWZpbmUgVVBQRVIoc2l6ZSxuKSAoKHNpemUrKChuKS0xKSkvKG4pKQojZGVmaW5lIElOT0RFX1NJWkUgKHNpemVvZihzdHJ1Y3QgbWluaXhfaW5vZGUpKQojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCiNkZWZpbmUgSU5PREVfU0laRTIgKHNpemVvZihzdHJ1Y3QgbWluaXgyX2lub2RlKSkKI2RlZmluZSBJTk9ERV9CTE9DS1MgVVBQRVIoSU5PREVTLCAodmVyc2lvbjIgPyBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyBcCgkJCQkgICAgOiBNSU5JWF9JTk9ERVNfUEVSX0JMT0NLKSkKI2Vsc2UKI2RlZmluZSBJTk9ERV9CTE9DS1MgVVBQRVIoSU5PREVTLCAoTUlOSVhfSU5PREVTX1BFUl9CTE9DSykpCiNlbmRpZgojZGVmaW5lIElOT0RFX0JVRkZFUl9TSVpFIChJTk9ERV9CTE9DS1MgKiBCTE9DS19TSVpFKQoKI2RlZmluZSBCSVRTX1BFUl9CTE9DSyAoQkxPQ0tfU0laRTw8MykKCnN0YXRpYyBjaGFyICpwcm9ncmFtX3ZlcnNpb24gPSAiMS4yIC0gMTEvMTEvOTYiOwpzdGF0aWMgY2hhciAqZGV2aWNlX25hbWU7CnN0YXRpYyBpbnQgSU47CnN0YXRpYyBpbnQgcmVwYWlyLCBhdXRvbWF0aWMsIHZlcmJvc2UsIGxpc3QsIHNob3csIHdhcm5fbW9kZSwgZm9yY2U7CnN0YXRpYyBpbnQgZGlyZWN0b3J5LCByZWd1bGFyLCBibG9ja2RldiwgY2hhcmRldiwgbGlua3MsIHN5bWxpbmtzLCB0b3RhbDsKCnN0YXRpYyBpbnQgY2hhbmdlZDsJCQkvKiBmbGFncyBpZiB0aGUgZmlsZXN5c3RlbSBoYXMgYmVlbiBjaGFuZ2VkICovCnN0YXRpYyBpbnQgZXJyb3JzX3VuY29ycmVjdGVkOwkvKiBmbGFnIGlmIHNvbWUgZXJyb3Igd2FzIG5vdCBjb3JyZWN0ZWQgKi8Kc3RhdGljIGludCBkaXJzaXplID0gMTY7CnN0YXRpYyBpbnQgbmFtZWxlbiA9IDE0OwpzdGF0aWMgc3RydWN0IHRlcm1pb3MgdGVybWlvczsKc3RhdGljIGludCB0ZXJtaW9zX3NldDsKCnN0YXRpYyBjaGFyICppbm9kZV9idWZmZXI7CiNkZWZpbmUgSW5vZGUgKCgoc3RydWN0IG1pbml4X2lub2RlICopIGlub2RlX2J1ZmZlciktMSkKI2RlZmluZSBJbm9kZTIgKCgoc3RydWN0IG1pbml4Ml9pbm9kZSAqKSBpbm9kZV9idWZmZXIpLTEpCnN0YXRpYyBjaGFyIHN1cGVyX2Jsb2NrX2J1ZmZlcltCTE9DS19TSVpFXTsKCiNkZWZpbmUgU3VwZXIgKCooc3RydWN0IG1pbml4X3N1cGVyX2Jsb2NrICopc3VwZXJfYmxvY2tfYnVmZmVyKQojZGVmaW5lIElOT0RFUyAoKHVuc2lnbmVkIGxvbmcpU3VwZXIuc19uaW5vZGVzKQojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyBpbnQgdmVyc2lvbjI7CiNkZWZpbmUgWk9ORVMgKCh1bnNpZ25lZCBsb25nKSh2ZXJzaW9uMiA/IFN1cGVyLnNfem9uZXMgOiBTdXBlci5zX256b25lcykpCiNlbHNlCiNkZWZpbmUgWk9ORVMgKCh1bnNpZ25lZCBsb25nKShTdXBlci5zX256b25lcykpCiNlbmRpZgojZGVmaW5lIElNQVBTICgodW5zaWduZWQgbG9uZylTdXBlci5zX2ltYXBfYmxvY2tzKQojZGVmaW5lIFpNQVBTICgodW5zaWduZWQgbG9uZylTdXBlci5zX3ptYXBfYmxvY2tzKQojZGVmaW5lIEZJUlNUWk9ORSAoKHVuc2lnbmVkIGxvbmcpU3VwZXIuc19maXJzdGRhdGF6b25lKQojZGVmaW5lIFpPTkVTSVpFICgodW5zaWduZWQgbG9uZylTdXBlci5zX2xvZ196b25lX3NpemUpCiNkZWZpbmUgTUFYU0laRSAoKHVuc2lnbmVkIGxvbmcpU3VwZXIuc19tYXhfc2l6ZSkKI2RlZmluZSBNQUdJQyAoU3VwZXIuc19tYWdpYykKI2RlZmluZSBOT1JNX0ZJUlNUWk9ORSAoMitJTUFQUytaTUFQUytJTk9ERV9CTE9DS1MpCgpzdGF0aWMgY2hhciAqaW5vZGVfbWFwOwpzdGF0aWMgY2hhciAqem9uZV9tYXA7CgpzdGF0aWMgdW5zaWduZWQgY2hhciAqaW5vZGVfY291bnQ7CnN0YXRpYyB1bnNpZ25lZCBjaGFyICp6b25lX2NvdW50OwoKc3RhdGljIHZvaWQgcmVjdXJzaXZlX2NoZWNrKHVuc2lnbmVkIGludCBpbm8pOwojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjazIodW5zaWduZWQgaW50IGlubyk7CiNlbmRpZgoKc3RhdGljIGlubGluZSBpbnQgYml0KGNoYXIgKmEsIHVuc2lnbmVkIGludCBpKQp7CgkgIHJldHVybiAoYVtpID4+IDNdICYgKDE8PChpICYgNykpKSAhPSAwOwp9CiNkZWZpbmUgaW5vZGVfaW5fdXNlKHgpIChiaXQoaW5vZGVfbWFwLCh4KSkpCiNkZWZpbmUgem9uZV9pbl91c2UoeCkgKGJpdCh6b25lX21hcCwoeCktRklSU1RaT05FKzEpKQoKI2RlZmluZSBtYXJrX2lub2RlKHgpIChzZXRiaXQoaW5vZGVfbWFwLCh4KSksY2hhbmdlZD0xKQojZGVmaW5lIHVubWFya19pbm9kZSh4KSAoY2xyYml0KGlub2RlX21hcCwoeCkpLGNoYW5nZWQ9MSkKCiNkZWZpbmUgbWFya196b25lKHgpIChzZXRiaXQoem9uZV9tYXAsKHgpLUZJUlNUWk9ORSsxKSxjaGFuZ2VkPTEpCiNkZWZpbmUgdW5tYXJrX3pvbmUoeCkgKGNscmJpdCh6b25lX21hcCwoeCktRklSU1RaT05FKzEpLGNoYW5nZWQ9MSkKCnN0YXRpYyB2b2lkIGxlYXZlKGludCkgQVRUUklCVVRFX05PUkVUVVJOOwpzdGF0aWMgdm9pZCBsZWF2ZShpbnQgc3RhdHVzKQp7CglpZiAodGVybWlvc19zZXQpCgkJdGNzZXRhdHRyKDAsIFRDU0FOT1csICZ0ZXJtaW9zKTsKCWV4aXQoc3RhdHVzKTsKfQoKc3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKnN0cikKewoJYmJfZXJyb3JfbXNnKCIlcyIsIHN0cik7CglsZWF2ZSg4KTsKfQoKLyogRmlsZS1uYW1lIGRhdGEgKi8KZW51bSB7IE1BWF9ERVBUSCA9IDMyIH07CnN0YXRpYyBpbnQgbmFtZV9kZXB0aDsKc3RhdGljIGNoYXIgKmN1cnJlbnRfbmFtZTsKc3RhdGljIGNoYXIgKm5hbWVfY29tcG9uZW50W01BWF9ERVBUSCsxXTsKCi8qIFdlZCBGZWIgIDkgMTU6MTc6MDYgTVNUIDIwMDAgKi8KLyogZHluYW1pY2FsbHkgYWxsb2NhdGUgbmFtZV9saXN0IChpbnN0ZWFkIG9mIG1ha2luZyBpdCBzdGF0aWMpICovCnN0YXRpYyBpbmxpbmUgdm9pZCBhbGxvY19jdXJyZW50X25hbWUodm9pZCkKewoJY3VycmVudF9uYW1lID0geG1hbGxvYyhNQVhfREVQVEggKiAoQlVGU0laICsgMSkpOwoJY3VycmVudF9uYW1lWzBdID0gJy8nOwoJY3VycmVudF9uYW1lWzFdID0gJ1wwJzsKCW5hbWVfY29tcG9uZW50WzBdID0gJmN1cnJlbnRfbmFtZVswXTsKfQoKI2lmZGVmIENPTkZJR19GRUFUVVJFX0NMRUFOX1VQCi8qIGV4ZWN1dGUgdGhpcyBhdGV4aXQoKSB0byBkZWFsbG9jYXRlIG5hbWVfbGlzdFtdICovCi8qIHBpcHRpZ2dlciB3YXMgaGVyZSAqLwpzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9jdXJyZW50X25hbWUodm9pZCkKewoJZnJlZShjdXJyZW50X25hbWUpOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgcHVzaF9maWxlbmFtZShjb25zdCBjaGFyICpuYW1lKQp7CgkvLyAgL2Rpci9kaXIvZGlyL2ZpbGUKCS8vICBeICAgXiAgIF4KCS8vIFswXSBbMV0gWzJdIDwtbmFtZV9jb21wb25lbnRbaV0KCWlmIChuYW1lX2RlcHRoIDwgTUFYX0RFUFRIKSB7CgkJaW50IGxlbjsKCQljaGFyICpwID0gbmFtZV9jb21wb25lbnRbbmFtZV9kZXB0aF07CgkJKnArKyA9ICcvJzsKCQlsZW4gPSBzcHJpbnRmKHAsICIlLipzIiwgbmFtZWxlbiwgbmFtZSk7CgkJbmFtZV9jb21wb25lbnRbbmFtZV9kZXB0aCArIDFdID0gcCArIGxlbjsKCX0KCW5hbWVfZGVwdGgrKzsKfQoKc3RhdGljIHZvaWQgcG9wX2ZpbGVuYW1lKHZvaWQpIHsKCW5hbWVfZGVwdGgtLTsKCWlmIChuYW1lX2RlcHRoIDwgTUFYX0RFUFRIKSB7CgkJKm5hbWVfY29tcG9uZW50W25hbWVfZGVwdGhdID0gJ1wwJzsKCQlpZiAoIW5hbWVfZGVwdGgpIHsKCQkJY3VycmVudF9uYW1lWzBdID0gJy8nOwoJCQljdXJyZW50X25hbWVbMV0gPSAnXDAnOwoJCX0KCX0KfQoKc3RhdGljIGludCBhc2soY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgZGVmKQp7CglpbnQgYzsKCglpZiAoIXJlcGFpcikgewoJCXByaW50ZigiXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCXJldHVybiAwOwoJfQoJaWYgKGF1dG9tYXRpYykgewoJCXByaW50ZigiXG4iKTsKCQlpZiAoIWRlZikKCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQlyZXR1cm4gZGVmOwoJfQoJcHJpbnRmKGRlZiA/ICIlcyAoeS9uKT8gIiA6ICIlcyAobi95KT8gIiwgc3RyaW5nKTsKCWZvciAoOzspIHsKCQlmZmx1c2goc3Rkb3V0KTsKCQlpZiAoKGMgPSBnZXRjaGFyKCkpID09IEVPRikgewoJCQlpZiAoIWRlZikKCQkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJCXJldHVybiBkZWY7CgkJfQoJCWMgPSB0b3VwcGVyKGMpOwoJCWlmIChjID09ICdZJykgewoJCQlkZWYgPSAxOwoJCQlicmVhazsKCQl9IGVsc2UgaWYgKGMgPT0gJ04nKSB7CgkJCWRlZiA9IDA7CgkJCWJyZWFrOwoJCX0gZWxzZSBpZiAoYyA9PSAnICcgfHwgYyA9PSAnXG4nKQoJCQlicmVhazsKCX0KCWlmIChkZWYpCgkJcHJpbnRmKCJ5XG4iKTsKCWVsc2UgewoJCXByaW50ZigiblxuIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCXJldHVybiBkZWY7Cn0KCi8qCiAqIE1ha2UgY2VydGFpbiB0aGF0IHdlIGFyZW4ndCBjaGVja2luZyBhIGZpbGVzeXN0ZW0gdGhhdCBpcyBvbiBhCiAqIG1vdW50ZWQgcGFydGl0aW9uLiAgQ29kZSBhZGFwdGVkIGZyb20gZTJmc2NrLCBDb3B5cmlnaHQgKEMpIDE5OTMsCiAqIDE5OTQgVGhlb2RvcmUgVHMnby4gIEFsc28gbGljZW5zZWQgdW5kZXIgR1BMLgogKi8Kc3RhdGljIHZvaWQgY2hlY2tfbW91bnQodm9pZCkKewoJRklMRSAqZjsKCXN0cnVjdCBtbnRlbnQgKm1udDsKCWludCBjb250OwoJaW50IGZkOwoKCWlmICgoZiA9IHNldG1udGVudChNT1VOVEVELCAiciIpKSA9PSBOVUxMKQoJCXJldHVybjsKCXdoaWxlICgobW50ID0gZ2V0bW50ZW50KGYpKSAhPSBOVUxMKQoJCWlmIChzdHJjbXAoZGV2aWNlX25hbWUsIG1udC0+bW50X2ZzbmFtZSkgPT0gMCkKCQkJYnJlYWs7CgllbmRtbnRlbnQoZik7CglpZiAoIW1udCkKCQlyZXR1cm47CgoJLyoKCSAqIElmIHRoZSByb290IGlzIG1vdW50ZWQgcmVhZC1vbmx5LCB0aGVuIC9ldGMvbXRhYiBpcwoJICogcHJvYmFibHkgbm90IGNvcnJlY3Q7IHNvIHdlIHdvbid0IGlzc3VlIGEgd2FybmluZyBiYXNlZCBvbgoJICogaXQuCgkgKi8KCWZkID0gb3BlbihNT1VOVEVELCBPX1JEV1IpOwoJaWYgKGZkIDwgMCAmJiBlcnJubyA9PSBFUk9GUykKCQlyZXR1cm47CgllbHNlCgkJY2xvc2UoZmQpOwoKCXByaW50ZigiJXMgaXMgbW91bnRlZC4gIiwgZGV2aWNlX25hbWUpOwoJY29udCA9IDA7CglpZiAoaXNhdHR5KDApICYmIGlzYXR0eSgxKSkKCQljb250ID0gYXNrKCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gY29udGludWUiLCAwKTsKCWlmICghY29udCkgewoJCXByaW50ZigiQ2hlY2sgYWJvcnRlZFxuIik7CgkJZXhpdCgwKTsKCX0KCXJldHVybjsKfQoKLyoKICogY2hlY2tfem9uZV9uciBjaGVja3MgdG8gc2VlIHRoYXQgKm5yIGlzIGEgdmFsaWQgem9uZSBuci4gSWYgaXQKICogaXNuJ3QsIGl0IHdpbGwgcG9zc2libHkgYmUgcmVwYWlyZWQuIENoZWNrX3pvbmVfbnIgc2V0cyAqY29ycmVjdGVkCiAqIGlmIGFuIGVycm9yIHdhcyBjb3JyZWN0ZWQsIGFuZCByZXR1cm5zIHRoZSB6b25lICgwIGZvciBubyB6b25lCiAqIG9yIGEgYmFkIHpvbmUtbnVtYmVyKS4KICovCnN0YXRpYyBpbnQgY2hlY2tfem9uZV9ucjIodWludDMyX3QgKm5yLCBpbnQgKmNvcnJlY3RlZCkKewoJY29uc3QgY2hhciAqbXNnOwoJaWYgKCEqbnIpCgkJcmV0dXJuIDA7CglpZiAoKm5yIDwgRklSU1RaT05FKQoJCW1zZyA9ICI8IEZJUlNUWk9ORSI7CgllbHNlIGlmICgqbnIgPj0gWk9ORVMpCgkJbXNnID0gIj49IFpPTkVTIjsKCWVsc2UKCQlyZXR1cm4gKm5yOwoJcHJpbnRmKCJab25lIG5yICVzIGluIGZpbGUgJyVzJy4gIiwgbXNnLCBjdXJyZW50X25hbWUpOwoJaWYgKGFzaygiUmVtb3ZlIGJsb2NrIiwgMSkpIHsKCQkqbnIgPSAwOwoJCSpjb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgY2hlY2tfem9uZV9ucih1aW50MTZfdCAqbnIsIGludCAqY29ycmVjdGVkKQp7Cgl1aW50MzJfdCBucjMyID0gKm5yOwoJaW50IHIgPSBjaGVja196b25lX25yMigmbnIzMiwgY29ycmVjdGVkKTsKCSpuciA9ICh1aW50MTZfdClucjMyOwoJcmV0dXJuIHI7Cn0KCi8qCiAqIHJlYWQtYmxvY2sgcmVhZHMgYmxvY2sgbnIgaW50byB0aGUgYnVmZmVyIGF0IGFkZHIuCiAqLwpzdGF0aWMgdm9pZCByZWFkX2Jsb2NrKHVuc2lnbmVkIGludCBuciwgY2hhciAqYWRkcikKewoJaWYgKCFucikgewoJCW1lbXNldChhZGRyLCAwLCBCTE9DS19TSVpFKTsKCQlyZXR1cm47Cgl9CglpZiAoQkxPQ0tfU0laRSAqIG5yICE9IGxzZWVrKElOLCBCTE9DS19TSVpFICogbnIsIFNFRUtfU0VUKSkgewoJCXByaW50ZigiJXM6IHVuYWJsZSB0byBzZWVrIHRvIGJsb2NrIGluIGZpbGUgJyVzJ1xuIiwKCQkJCWJiX21zZ19yZWFkX2Vycm9yLCBjdXJyZW50X25hbWUpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJbWVtc2V0KGFkZHIsIDAsIEJMT0NLX1NJWkUpOwoJfSBlbHNlIGlmIChCTE9DS19TSVpFICE9IHJlYWQoSU4sIGFkZHIsIEJMT0NLX1NJWkUpKSB7CgkJcHJpbnRmKCIlczogYmFkIGJsb2NrIGluIGZpbGUgJyVzJ1xuIiwKCQkJCWJiX21zZ19yZWFkX2Vycm9yLCBjdXJyZW50X25hbWUpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJbWVtc2V0KGFkZHIsIDAsIEJMT0NLX1NJWkUpOwoJfQp9CgovKgogKiB3cml0ZV9ibG9jayB3cml0ZXMgYmxvY2sgbnIgdG8gZGlzay4KICovCnN0YXRpYyB2b2lkIHdyaXRlX2Jsb2NrKHVuc2lnbmVkIGludCBuciwgY2hhciAqYWRkcikKewoJaWYgKCFucikKCQlyZXR1cm47CglpZiAobnIgPCBGSVJTVFpPTkUgfHwgbnIgPj0gWk9ORVMpIHsKCQlwcmludGYoIkludGVybmFsIGVycm9yOiB0cnlpbmcgdG8gd3JpdGUgYmFkIGJsb2NrXG4iCgkJCSAgICJXcml0ZSByZXF1ZXN0IGlnbm9yZWRcbiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJcmV0dXJuOwoJfQoJaWYgKEJMT0NLX1NJWkUgKiBuciAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSAqIG5yLCBTRUVLX1NFVCkpCgkJZGllKCJTZWVrIGZhaWxlZCBpbiB3cml0ZV9ibG9jayIpOwoJaWYgKEJMT0NLX1NJWkUgIT0gd3JpdGUoSU4sIGFkZHIsIEJMT0NLX1NJWkUpKSB7CgkJcHJpbnRmKCIlczogYmFkIGJsb2NrIGluIGZpbGUgJyVzJ1xuIiwKCQkJCWJiX21zZ193cml0ZV9lcnJvciwgY3VycmVudF9uYW1lKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQp9CgovKgogKiBtYXBfYmxvY2sgY2FsY3VsYXRlcyB0aGUgYWJzb2x1dGUgYmxvY2sgbnIgb2YgYSBibG9jayBpbiBhIGZpbGUuCiAqIEl0IHNldHMgJ2NoYW5nZWQnIGlmIHRoZSBpbm9kZSBoYXMgbmVlZGVkIGNoYW5naW5nLCBhbmQgcmUtd3JpdGVzCiAqIGFueSBpbmRpcmVjdCBibG9ja3Mgd2l0aCBlcnJvcnMuCiAqLwpzdGF0aWMgaW50IG1hcF9ibG9jayhzdHJ1Y3QgbWluaXhfaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBpbnQgYmxrbnIpCnsKCXVpbnQxNl90IGluZFtCTE9DS19TSVpFID4+IDFdOwoJdWludDE2X3QgZGluZFtCTE9DS19TSVpFID4+IDFdOwoJaW50IGJsa19jaGcsIGJsb2NrLCByZXN1bHQ7CgoJaWYgKGJsa25yIDwgNykKCQlyZXR1cm4gY2hlY2tfem9uZV9ucihpbm9kZS0+aV96b25lICsgYmxrbnIsICZjaGFuZ2VkKTsKCWJsa25yIC09IDc7CglpZiAoYmxrbnIgPCA1MTIpIHsKCQlibG9jayA9IGNoZWNrX3pvbmVfbnIoaW5vZGUtPmlfem9uZSArIDcsICZjaGFuZ2VkKTsKCQlyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIoYmxrbnIgKyBpbmQsICZibGtfY2hnKTsKCQlpZiAoYmxrX2NoZykKCQkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJcmV0dXJuIHJlc3VsdDsKCX0KCWJsa25yIC09IDUxMjsKCWJsb2NrID0gY2hlY2tfem9uZV9ucihpbm9kZS0+aV96b25lICsgOCwgJmNoYW5nZWQpOwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIoZGluZCArIChibGtuciAvIDUxMiksICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCWJsb2NrID0gcmVzdWx0OwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucihpbmQgKyAoYmxrbnIgJSA1MTIpLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCXJldHVybiByZXN1bHQ7Cn0KCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKc3RhdGljIGludCBtYXBfYmxvY2syKHN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBpbnQgYmxrbnIpCnsKCXVpbnQzMl90IGluZFtCTE9DS19TSVpFID4+IDJdOwoJdWludDMyX3QgZGluZFtCTE9DS19TSVpFID4+IDJdOwoJdWludDMyX3QgdGluZFtCTE9DS19TSVpFID4+IDJdOwoJaW50IGJsa19jaGcsIGJsb2NrLCByZXN1bHQ7CgoJaWYgKGJsa25yIDwgNykKCQlyZXR1cm4gY2hlY2tfem9uZV9ucjIoaW5vZGUtPmlfem9uZSArIGJsa25yLCAmY2hhbmdlZCk7CglibGtuciAtPSA3OwoJaWYgKGJsa25yIDwgMjU2KSB7CgkJYmxvY2sgPSBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgNywgJmNoYW5nZWQpOwoJCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJYmxrX2NoZyA9IDA7CgkJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIoYmxrbnIgKyBpbmQsICZibGtfY2hnKTsKCQlpZiAoYmxrX2NoZykKCQkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJcmV0dXJuIHJlc3VsdDsKCX0KCWJsa25yIC09IDI1NjsKCWlmIChibGtuciA+PSAyNTYgKiAyNTYpIHsKCQlibG9jayA9IGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyA4LCAmY2hhbmdlZCk7CgkJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CgkJYmxrX2NoZyA9IDA7CgkJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIoZGluZCArIGJsa25yIC8gMjU2LCAmYmxrX2NoZyk7CgkJaWYgKGJsa19jaGcpCgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCQlibG9jayA9IHJlc3VsdDsKCQlyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGluZCArIGJsa25yICUgMjU2LCAmYmxrX2NoZyk7CgkJaWYgKGJsa19jaGcpCgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCXJldHVybiByZXN1bHQ7Cgl9CglibGtuciAtPSAyNTYgKiAyNTY7CglibG9jayA9IGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyA5LCAmY2hhbmdlZCk7CglyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSB0aW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIodGluZCArIGJsa25yIC8gKDI1NiAqIDI1NiksICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSB0aW5kKTsKCWJsb2NrID0gcmVzdWx0OwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGRpbmQgKyAoYmxrbnIgLyAyNTYpICUgMjU2LCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CglibG9jayA9IHJlc3VsdDsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGluZCArIGJsa25yICUgMjU2LCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCXJldHVybiByZXN1bHQ7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCB3cml0ZV9zdXBlcl9ibG9jayh2b2lkKQp7CgkvKgoJICogU2V0IHRoZSBzdGF0ZSBvZiB0aGUgZmlsZXN5c3RlbSBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCB0aGVyZQoJICogYXJlIHVuY29ycmVjdGVkIGVycm9ycy4gIFRoZSBmaWxlc3lzdGVtIHZhbGlkIGZsYWcgaXMKCSAqIHVuY29uZGl0aW9uYWxseSBzZXQgaWYgd2UgZ2V0IHRoaXMgZmFyLgoJICovCglTdXBlci5zX3N0YXRlIHw9IE1JTklYX1ZBTElEX0ZTOwoJaWYgKGVycm9yc191bmNvcnJlY3RlZCkKCQlTdXBlci5zX3N0YXRlIHw9IE1JTklYX0VSUk9SX0ZTOwoJZWxzZQoJCVN1cGVyLnNfc3RhdGUgJj0gfk1JTklYX0VSUk9SX0ZTOwoKCWlmIChCTE9DS19TSVpFICE9IGxzZWVrKElOLCBCTE9DS19TSVpFLCBTRUVLX1NFVCkpCgkJZGllKCJTZWVrIGZhaWxlZCBpbiB3cml0ZV9zdXBlcl9ibG9jayIpOwoJaWYgKEJMT0NLX1NJWkUgIT0gd3JpdGUoSU4sIHN1cGVyX2Jsb2NrX2J1ZmZlciwgQkxPQ0tfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gd3JpdGUgc3VwZXItYmxvY2siKTsKfQoKc3RhdGljIHZvaWQgd3JpdGVfdGFibGVzKHZvaWQpCnsKCXdyaXRlX3N1cGVyX2Jsb2NrKCk7CgoJaWYgKElNQVBTICogQkxPQ0tfU0laRSAhPSB3cml0ZShJTiwgaW5vZGVfbWFwLCBJTUFQUyAqIEJMT0NLX1NJWkUpKQoJCWRpZSgiVW5hYmxlIHRvIHdyaXRlIGlub2RlIG1hcCIpOwoJaWYgKFpNQVBTICogQkxPQ0tfU0laRSAhPSB3cml0ZShJTiwgem9uZV9tYXAsIFpNQVBTICogQkxPQ0tfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gd3JpdGUgem9uZSBtYXAiKTsKCWlmIChJTk9ERV9CVUZGRVJfU0laRSAhPSB3cml0ZShJTiwgaW5vZGVfYnVmZmVyLCBJTk9ERV9CVUZGRVJfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gd3JpdGUgaW5vZGVzIik7Cn0KCnN0YXRpYyB2b2lkIGdldF9kaXJzaXplKHZvaWQpCnsKCWludCBibG9jazsKCWNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJaW50IHNpemU7CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCglpZiAodmVyc2lvbjIpCgkJYmxvY2sgPSBJbm9kZTJbUk9PVF9JTk9dLmlfem9uZVswXTsKCWVsc2UKI2VuZGlmCgkJYmxvY2sgPSBJbm9kZVtST09UX0lOT10uaV96b25lWzBdOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoc2l6ZSA9IDE2OyBzaXplIDwgQkxPQ0tfU0laRTsgc2l6ZSA8PD0gMSkgewoJCWlmIChzdHJjbXAoYmxrICsgc2l6ZSArIDIsICIuLiIpID09IDApIHsKCQkJZGlyc2l6ZSA9IHNpemU7CgkJCW5hbWVsZW4gPSBzaXplIC0gMjsKCQkJcmV0dXJuOwoJCX0KCX0KCS8qIHVzZSBkZWZhdWx0cyAqLwp9CgpzdGF0aWMgdm9pZCByZWFkX3N1cGVyYmxvY2sodm9pZCkKewoJaWYgKEJMT0NLX1NJWkUgIT0gbHNlZWsoSU4sIEJMT0NLX1NJWkUsIFNFRUtfU0VUKSkKCQlkaWUoIlNlZWsgZmFpbGVkIik7CglpZiAoQkxPQ0tfU0laRSAhPSByZWFkKElOLCBzdXBlcl9ibG9ja19idWZmZXIsIEJMT0NLX1NJWkUpKQoJCWRpZSgiVW5hYmxlIHRvIHJlYWQgc3VwZXIgYmxvY2siKTsKCS8qIGFscmVhZHkgaW5pdGlhbGl6ZWQgdG86CgluYW1lbGVuID0gMTQ7CglkaXJzaXplID0gMTY7Cgl2ZXJzaW9uMiA9IDA7CgkqLwoJaWYgKE1BR0lDID09IE1JTklYX1NVUEVSX01BR0lDKSB7Cgl9IGVsc2UgaWYgKE1BR0lDID09IE1JTklYX1NVUEVSX01BR0lDMikgewoJCW5hbWVsZW4gPSAzMDsKCQlkaXJzaXplID0gMzI7CiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKCX0gZWxzZSBpZiAoTUFHSUMgPT0gTUlOSVgyX1NVUEVSX01BR0lDKSB7CgkJdmVyc2lvbjIgPSAxOwoJfSBlbHNlIGlmIChNQUdJQyA9PSBNSU5JWDJfU1VQRVJfTUFHSUMyKSB7CgkJbmFtZWxlbiA9IDMwOwoJCWRpcnNpemUgPSAzMjsKCQl2ZXJzaW9uMiA9IDE7CiNlbmRpZgoJfSBlbHNlCgkJZGllKCJCYWQgbWFnaWMgbnVtYmVyIGluIHN1cGVyLWJsb2NrIik7CglpZiAoWk9ORVNJWkUgIT0gMCB8fCBCTE9DS19TSVpFICE9IDEwMjQpCgkJZGllKCJPbmx5IDFrIGJsb2Nrcy96b25lcyBzdXBwb3J0ZWQiKTsKCWlmIChJTUFQUyAqIEJMT0NLX1NJWkUgKiA4IDwgSU5PREVTICsgMSkKCQlkaWUoIkJhZCBzX2ltYXBfYmxvY2tzIGZpZWxkIGluIHN1cGVyLWJsb2NrIik7CglpZiAoWk1BUFMgKiBCTE9DS19TSVpFICogOCA8IFpPTkVTIC0gRklSU1RaT05FICsgMSkKCQlkaWUoIkJhZCBzX3ptYXBfYmxvY2tzIGZpZWxkIGluIHN1cGVyLWJsb2NrIik7Cn0KCnN0YXRpYyB2b2lkIHJlYWRfdGFibGVzKHZvaWQpCnsKCWlub2RlX21hcCA9IHh6YWxsb2MoSU1BUFMgKiBCTE9DS19TSVpFKTsKCXpvbmVfbWFwID0geHphbGxvYyhaTUFQUyAqIEJMT0NLX1NJWkUpOwoJaW5vZGVfYnVmZmVyID0geG1hbGxvYyhJTk9ERV9CVUZGRVJfU0laRSk7Cglpbm9kZV9jb3VudCA9IHhtYWxsb2MoSU5PREVTICsgMSk7Cgl6b25lX2NvdW50ID0geG1hbGxvYyhaT05FUyk7CglpZiAoSU1BUFMgKiBCTE9DS19TSVpFICE9IHJlYWQoSU4sIGlub2RlX21hcCwgSU1BUFMgKiBCTE9DS19TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byByZWFkIGlub2RlIG1hcCIpOwoJaWYgKFpNQVBTICogQkxPQ0tfU0laRSAhPSByZWFkKElOLCB6b25lX21hcCwgWk1BUFMgKiBCTE9DS19TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byByZWFkIHpvbmUgbWFwIik7CglpZiAoSU5PREVfQlVGRkVSX1NJWkUgIT0gcmVhZChJTiwgaW5vZGVfYnVmZmVyLCBJTk9ERV9CVUZGRVJfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gcmVhZCBpbm9kZXMiKTsKCWlmIChOT1JNX0ZJUlNUWk9ORSAhPSBGSVJTVFpPTkUpIHsKCQlwcmludGYoIldhcm5pbmc6IEZpcnN0em9uZSE9Tm9ybV9maXJzdHpvbmVcbiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9CglnZXRfZGlyc2l6ZSgpOwoJaWYgKHNob3cpIHsKCQlwcmludGYoIiVsZCBpbm9kZXNcbiIKCQkJIiVsZCBibG9ja3NcbiIKCQkJIkZpcnN0ZGF0YXpvbmU9JWxkICglbGQpXG4iCgkJCSJab25lc2l6ZT0lZFxuIgoJCQkiTWF4c2l6ZT0lbGRcbiIKCQkJIkZpbGVzeXN0ZW0gc3RhdGU9JWRcbiIKCQkJIm5hbWVsZW49JWRcblxuIiwKCQkJSU5PREVTLAoJCQlaT05FUywKCQkJRklSU1RaT05FLCBOT1JNX0ZJUlNUWk9ORSwKCQkJQkxPQ0tfU0laRSA8PCBaT05FU0laRSwKCQkJTUFYU0laRSwKCQkJU3VwZXIuc19zdGF0ZSwKCQkJbmFtZWxlbik7Cgl9Cn0KCnN0YXRpYyBzdHJ1Y3QgbWluaXhfaW5vZGUgKmdldF9pbm9kZSh1bnNpZ25lZCBpbnQgbnIpCnsKCXN0cnVjdCBtaW5peF9pbm9kZSAqaW5vZGU7CgoJaWYgKCFuciB8fCBuciA+IElOT0RFUykKCQlyZXR1cm4gTlVMTDsKCXRvdGFsKys7Cglpbm9kZSA9IElub2RlICsgbnI7CglpZiAoIWlub2RlX2NvdW50W25yXSkgewoJCWlmICghaW5vZGVfaW5fdXNlKG5yKSkgewoJCQlwcmludGYoIklub2RlICVkIGlzIG1hcmtlZCBhcyAndW51c2VkJywgYnV0IGl0IGlzIHVzZWQgIgoJCQkJCSJmb3IgZmlsZSAnJXMnXG4iLCBuciwgY3VycmVudF9uYW1lKTsKCQkJaWYgKHJlcGFpcikgewoJCQkJaWYgKGFzaygiTWFyayBhcyAnaW4gdXNlJyIsIDEpKQoJCQkJCW1hcmtfaW5vZGUobnIpOwoJCQl9IGVsc2UgewoJCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQkJfQoJCX0KCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQkJZGlyZWN0b3J5Kys7CgkJZWxzZSBpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKCQkJcmVndWxhcisrOwoJCWVsc2UgaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkpCgkJCWNoYXJkZXYrKzsKCQllbHNlIGlmIChTX0lTQkxLKGlub2RlLT5pX21vZGUpKQoJCQlibG9ja2RldisrOwoJCWVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCgkJCXN5bWxpbmtzKys7CgkJZWxzZSBpZiAoU19JU1NPQ0soaW5vZGUtPmlfbW9kZSkpOwoJCWVsc2UgaWYgKFNfSVNGSUZPKGlub2RlLT5pX21vZGUpKTsKCQllbHNlIHsKCQkJcHJpbnRmKCIlcyBoYXMgbW9kZSAlMDVvXG4iLCBjdXJyZW50X25hbWUsIGlub2RlLT5pX21vZGUpOwoJCX0KCgl9IGVsc2UKCQlsaW5rcysrOwoJaWYgKCErK2lub2RlX2NvdW50W25yXSkgewoJCXByaW50ZigiV2FybmluZzogaW5vZGUgY291bnQgdG9vIGJpZ1xuIik7CgkJaW5vZGVfY291bnRbbnJdLS07CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCXJldHVybiBpbm9kZTsKfQoKI2lmZGVmIENPTkZJR19GRUFUVVJFX01JTklYMgpzdGF0aWMgc3RydWN0IG1pbml4Ml9pbm9kZSAqZ2V0X2lub2RlMih1bnNpZ25lZCBpbnQgbnIpCnsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlOwoKCWlmICghbnIgfHwgbnIgPiBJTk9ERVMpCgkJcmV0dXJuIE5VTEw7Cgl0b3RhbCsrOwoJaW5vZGUgPSBJbm9kZTIgKyBucjsKCWlmICghaW5vZGVfY291bnRbbnJdKSB7CgkJaWYgKCFpbm9kZV9pbl91c2UobnIpKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgaXMgbWFya2VkIGFzICd1bnVzZWQnLCBidXQgaXQgaXMgdXNlZCAiCgkJCQkJImZvciBmaWxlICclcydcbiIsIG5yLCBjdXJyZW50X25hbWUpOwoJCQlpZiAocmVwYWlyKSB7CgkJCQlpZiAoYXNrKCJNYXJrIGFzICdpbiB1c2UnIiwgMSkpCgkJCQkJbWFya19pbm9kZShucik7CgkJCQllbHNlCgkJCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQkJfQoJCX0KCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQkJZGlyZWN0b3J5Kys7CgkJZWxzZSBpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKCQkJcmVndWxhcisrOwoJCWVsc2UgaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkpCgkJCWNoYXJkZXYrKzsKCQllbHNlIGlmIChTX0lTQkxLKGlub2RlLT5pX21vZGUpKQoJCQlibG9ja2RldisrOwoJCWVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCgkJCXN5bWxpbmtzKys7CgkJZWxzZSBpZiAoU19JU1NPQ0soaW5vZGUtPmlfbW9kZSkpOwoJCWVsc2UgaWYgKFNfSVNGSUZPKGlub2RlLT5pX21vZGUpKTsKCQllbHNlIHsKCQkJcHJpbnRmKCIlcyBoYXMgbW9kZSAlMDVvXG4iLCBjdXJyZW50X25hbWUsIGlub2RlLT5pX21vZGUpOwoJCX0KCX0gZWxzZQoJCWxpbmtzKys7CglpZiAoISsraW5vZGVfY291bnRbbnJdKSB7CgkJcHJpbnRmKCJXYXJuaW5nOiBpbm9kZSBjb3VudCB0b28gYmlnXG4iKTsKCQlpbm9kZV9jb3VudFtucl0tLTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIGlub2RlOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgY2hlY2tfcm9vdCh2b2lkKQp7CglzdHJ1Y3QgbWluaXhfaW5vZGUgKmlub2RlID0gSW5vZGUgKyBST09UX0lOTzsKCglpZiAoIWlub2RlIHx8ICFTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCWRpZSgiUm9vdCBpbm9kZSBpc24ndCBhIGRpcmVjdG9yeSIpOwp9CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrX3Jvb3QyKHZvaWQpCnsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlID0gSW5vZGUyICsgUk9PVF9JTk87CgoJaWYgKCFpbm9kZSB8fCAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQlkaWUoIlJvb3QgaW5vZGUgaXNuJ3QgYSBkaXJlY3RvcnkiKTsKfQojZW5kaWYKCnN0YXRpYyBpbnQgYWRkX3pvbmUodWludDE2X3QgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCWludCByZXN1bHQ7CglpbnQgYmxvY2s7CgoJcmVzdWx0ID0gMDsKCWJsb2NrID0gY2hlY2tfem9uZV9ucih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybiAwOwoJaWYgKHpvbmVfY291bnRbYmxvY2tdKSB7CgkJcHJpbnRmKCJBbHJlYWR5IHVzZWQgYmxvY2sgaXMgcmV1c2VkIGluIGZpbGUgJyVzJy4gIiwKCQkJCWN1cnJlbnRfbmFtZSk7CgkJaWYgKGFzaygiQ2xlYXIiLCAxKSkgewoJCQkqem5yID0gMDsKCQkJYmxvY2sgPSAwOwoJCQkqY29ycmVjdGVkID0gMTsKCQkJcmV0dXJuIDA7CgkJfQoJfQoJaWYgKCF6b25lX2luX3VzZShibG9jaykpIHsKCQlwcmludGYoIkJsb2NrICVkIGluIGZpbGUgJyVzJyBpcyBtYXJrZWQgYXMgJ3VudXNlZCcuICIsCgkJCQlibG9jaywgY3VycmVudF9uYW1lKTsKCQlpZiAoYXNrKCJDb3JyZWN0IiwgMSkpCgkJCW1hcmtfem9uZShibG9jayk7Cgl9CglpZiAoISsrem9uZV9jb3VudFtibG9ja10pCgkJem9uZV9jb3VudFtibG9ja10tLTsKCXJldHVybiBibG9jazsKfQoKI2lmZGVmIENPTkZJR19GRUFUVVJFX01JTklYMgpzdGF0aWMgaW50IGFkZF96b25lMih1aW50MzJfdCAqem5yLCBpbnQgKmNvcnJlY3RlZCkKewoJaW50IHJlc3VsdDsKCWludCBibG9jazsKCglyZXN1bHQgPSAwOwoJYmxvY2sgPSBjaGVja196b25lX25yMih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybiAwOwoJaWYgKHpvbmVfY291bnRbYmxvY2tdKSB7CgkJcHJpbnRmKCJBbHJlYWR5IHVzZWQgYmxvY2sgaXMgcmV1c2VkIGluIGZpbGUgJyVzJy4gIiwKCQkJCWN1cnJlbnRfbmFtZSk7CgkJaWYgKGFzaygiQ2xlYXIiLCAxKSkgewoJCQkqem5yID0gMDsKCQkJYmxvY2sgPSAwOwoJCQkqY29ycmVjdGVkID0gMTsKCQkJcmV0dXJuIDA7CgkJfQoJfQoJaWYgKCF6b25lX2luX3VzZShibG9jaykpIHsKCQlwcmludGYoIkJsb2NrICVkIGluIGZpbGUgJyVzJyBpcyBtYXJrZWQgYXMgJ3VudXNlZCcuICIsCgkJCQlibG9jaywgY3VycmVudF9uYW1lKTsKCQlpZiAoYXNrKCJDb3JyZWN0IiwgMSkpCgkJCW1hcmtfem9uZShibG9jayk7Cgl9CglpZiAoISsrem9uZV9jb3VudFtibG9ja10pCgkJem9uZV9jb3VudFtibG9ja10tLTsKCXJldHVybiBibG9jazsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGFkZF96b25lX2luZCh1aW50MTZfdCAqem5yLCBpbnQgKmNvcnJlY3RlZCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJaW50IGksIGNoZ19ibGsgPSAwOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gYWRkX3pvbmUoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IChCTE9DS19TSVpFID4+IDEpOyBpKyspCgkJYWRkX3pvbmUoaSArICh1aW50MTZfdCAqKSBibGssICZjaGdfYmxrKTsKCWlmIChjaGdfYmxrKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwp9CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGFkZF96b25lX2luZDIodWludDMyX3QgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpLCBjaGdfYmxrID0gMDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lMih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybjsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfU0laRSA+PiAyOyBpKyspCgkJYWRkX3pvbmUyKGkgKyAodWludDMyX3QgKikgYmxrLCAmY2hnX2Jsayk7CglpZiAoY2hnX2JsaykKCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGFkZF96b25lX2RpbmQodWludDE2X3QgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpLCBibGtfY2hnID0gMDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoaSA9IDA7IGkgPCAoQkxPQ0tfU0laRSA+PiAxKTsgaSsrKQoJCWFkZF96b25lX2luZChpICsgKHVpbnQxNl90ICopIGJsaywgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7Cn0KCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgYWRkX3pvbmVfZGluZDIodWludDMyX3QgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpLCBibGtfY2hnID0gMDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lMih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybjsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfU0laRSA+PiAyOyBpKyspCgkJYWRkX3pvbmVfaW5kMihpICsgKHVpbnQzMl90ICopIGJsaywgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7Cn0KCnN0YXRpYyB2b2lkIGFkZF96b25lX3RpbmQyKHVpbnQzMl90ICp6bnIsIGludCAqY29ycmVjdGVkKQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgaSwgYmxrX2NoZyA9IDA7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBhZGRfem9uZTIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IEJMT0NLX1NJWkUgPj4gMjsgaSsrKQoJCWFkZF96b25lX2RpbmQyKGkgKyAodWludDMyX3QgKikgYmxrLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrX3pvbmVzKHVuc2lnbmVkIGludCBpKQp7CglzdHJ1Y3QgbWluaXhfaW5vZGUgKmlub2RlOwoKCWlmICghaSB8fCBpID4gSU5PREVTKQoJCXJldHVybjsKCWlmIChpbm9kZV9jb3VudFtpXSA+IDEpCQkvKiBoYXZlIHdlIGNvdW50ZWQgdGhpcyBmaWxlIGFscmVhZHk/ICovCgkJcmV0dXJuOwoJaW5vZGUgPSBJbm9kZSArIGk7CglpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYKCQkhU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgcmV0dXJuOwoJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKCQlhZGRfem9uZShpICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfaW5kKDcgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV9kaW5kKDggKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7Cn0KCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2tfem9uZXMyKHVuc2lnbmVkIGludCBpKQp7CglzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZTsKCglpZiAoIWkgfHwgaSA+IElOT0RFUykKCQlyZXR1cm47CglpZiAoaW5vZGVfY291bnRbaV0gPiAxKQkJLyogaGF2ZSB3ZSBjb3VudGVkIHRoaXMgZmlsZSBhbHJlYWR5PyAqLwoJCXJldHVybjsKCWlub2RlID0gSW5vZGUyICsgaTsKCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiAhU19JU1JFRyhpbm9kZS0+aV9tb2RlKQoJCSYmICFTX0lTTE5LKGlub2RlLT5pX21vZGUpKQoJCXJldHVybjsKCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCgkJYWRkX3pvbmUyKGkgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV9pbmQyKDcgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV9kaW5kMig4ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfdGluZDIoOSArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrX2ZpbGUoc3RydWN0IG1pbml4X2lub2RlICpkaXIsIHVuc2lnbmVkIGludCBvZmZzZXQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCXN0cnVjdCBtaW5peF9pbm9kZSAqaW5vZGU7CglpbnQgaW5vOwoJY2hhciAqbmFtZTsKCWludCBibG9jazsKCglibG9jayA9IG1hcF9ibG9jayhkaXIsIG9mZnNldCAvIEJMT0NLX1NJWkUpOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCW5hbWUgPSBibGsgKyAob2Zmc2V0ICUgQkxPQ0tfU0laRSkgKyAyOwoJaW5vID0gKih1aW50MTZfdCAqKSAobmFtZSAtIDIpOwoJaWYgKGlubyA+IElOT0RFUykgewoJCXByaW50ZigiJXMgY29udGFpbnMgYSBiYWQgaW5vZGUgbnVtYmVyIGZvciBmaWxlICclLipzJy4gIiwKCQkJCWN1cnJlbnRfbmFtZSwgbmFtZWxlbiwgbmFtZSk7CgkJaWYgKGFzaygiUmVtb3ZlIiwgMSkpIHsKCQkJKih1aW50MTZfdCAqKSAobmFtZSAtIDIpID0gMDsKCQkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7CgkJfQoJCWlubyA9IDA7Cgl9CglwdXNoX2ZpbGVuYW1lKG5hbWUpOwoJaW5vZGUgPSBnZXRfaW5vZGUoaW5vKTsKCXBvcF9maWxlbmFtZSgpOwoJaWYgKCFvZmZzZXQpIHsKCQlpZiAoIWlub2RlIHx8IHN0cmNtcCgiLiIsIG5hbWUpKSB7CgkJCXByaW50ZigiJXM6IGJhZCBkaXJlY3Rvcnk6ICcuJyBpc24ndCBmaXJzdFxuIiwgY3VycmVudF9uYW1lKTsKCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQl9IGVsc2UKCQkJcmV0dXJuOwoJfQoJaWYgKG9mZnNldCA9PSBkaXJzaXplKSB7CgkJaWYgKCFpbm9kZSB8fCBzdHJjbXAoIi4uIiwgbmFtZSkpIHsKCQkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogJy4uJyBpc24ndCBzZWNvbmRcbiIsIGN1cnJlbnRfbmFtZSk7CgkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJfSBlbHNlCgkJCXJldHVybjsKCX0KCWlmICghaW5vZGUpCgkJcmV0dXJuOwoJcHVzaF9maWxlbmFtZShuYW1lKTsKCWlmIChsaXN0KSB7CgkJaWYgKHZlcmJvc2UpCgkJCXByaW50ZigiJTZkICUwN28gJTNkICIsIGlubywgaW5vZGUtPmlfbW9kZSwgaW5vZGUtPmlfbmxpbmtzKTsKCQlwcmludGYoIiVzJXNcbiIsIGN1cnJlbnRfbmFtZSwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSA/ICI6IiA6ICIiKTsKCX0KCWNoZWNrX3pvbmVzKGlubyk7CglpZiAoaW5vZGUgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQlyZWN1cnNpdmVfY2hlY2soaW5vKTsKCXBvcF9maWxlbmFtZSgpOwoJcmV0dXJuOwp9CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrX2ZpbGUyKHN0cnVjdCBtaW5peDJfaW5vZGUgKmRpciwgdW5zaWduZWQgaW50IG9mZnNldCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGU7CglpbnQgaW5vOwoJY2hhciAqbmFtZTsKCWludCBibG9jazsKCglibG9jayA9IG1hcF9ibG9jazIoZGlyLCBvZmZzZXQgLyBCTE9DS19TSVpFKTsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7CgluYW1lID0gYmxrICsgKG9mZnNldCAlIEJMT0NLX1NJWkUpICsgMjsKCWlubyA9ICoodWludDE2X3QgKikgKG5hbWUgLSAyKTsKCWlmIChpbm8gPiBJTk9ERVMpIHsKCQlwcmludGYoIiVzIGNvbnRhaW5zIGEgYmFkIGlub2RlIG51bWJlciBmb3IgZmlsZSAnJS4qcycuICIsCgkJCQljdXJyZW50X25hbWUsIG5hbWVsZW4sIG5hbWUpOwoJCWlmIChhc2soIlJlbW92ZSIsIDEpKSB7CgkJCSoodWludDE2X3QgKikgKG5hbWUgLSAyKSA9IDA7CgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwoJCX0KCQlpbm8gPSAwOwoJfQoJcHVzaF9maWxlbmFtZShuYW1lKTsKCWlub2RlID0gZ2V0X2lub2RlMihpbm8pOwoJcG9wX2ZpbGVuYW1lKCk7CglpZiAoIW9mZnNldCkgewoJCWlmICghaW5vZGUgfHwgc3RyY21wKCIuIiwgbmFtZSkpIHsKCQkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogJy4nIGlzbid0IGZpcnN0XG4iLCBjdXJyZW50X25hbWUpOwoJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCX0gZWxzZQoJCQlyZXR1cm47Cgl9CglpZiAob2Zmc2V0ID09IGRpcnNpemUpIHsKCQlpZiAoIWlub2RlIHx8IHN0cmNtcCgiLi4iLCBuYW1lKSkgewoJCQlwcmludGYoIiVzOiBiYWQgZGlyZWN0b3J5OiAnLi4nIGlzbid0IHNlY29uZFxuIiwgY3VycmVudF9uYW1lKTsKCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQl9IGVsc2UKCQkJcmV0dXJuOwoJfQoJaWYgKCFpbm9kZSkKCQlyZXR1cm47CglwdXNoX2ZpbGVuYW1lKG5hbWUpOwoJaWYgKGxpc3QpIHsKCQlpZiAodmVyYm9zZSkKCQkJcHJpbnRmKCIlNmQgJTA3byAlM2QgIiwgaW5vLCBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9ubGlua3MpOwoJCXByaW50ZigiJXMlc1xuIiwgY3VycmVudF9uYW1lLCBTX0lTRElSKGlub2RlLT5pX21vZGUpID8gIjoiIDogIiIpOwoJfQoJY2hlY2tfem9uZXMyKGlubyk7CglpZiAoaW5vZGUgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQlyZWN1cnNpdmVfY2hlY2syKGlubyk7Cglwb3BfZmlsZW5hbWUoKTsKCXJldHVybjsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjayh1bnNpZ25lZCBpbnQgaW5vKQp7CglzdHJ1Y3QgbWluaXhfaW5vZGUgKmRpcjsKCXVuc2lnbmVkIGludCBvZmZzZXQ7CgoJZGlyID0gSW5vZGUgKyBpbm87CglpZiAoIVNfSVNESVIoZGlyLT5pX21vZGUpKQoJCWRpZSgiSW50ZXJuYWwgZXJyb3IiKTsKCWlmIChkaXItPmlfc2l6ZSA8IDIgKiBkaXJzaXplKSB7CgkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogc2l6ZTwzMiIsIGN1cnJlbnRfbmFtZSk7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGlyLT5pX3NpemU7IG9mZnNldCArPSBkaXJzaXplKQoJCWNoZWNrX2ZpbGUoZGlyLCBvZmZzZXQpOwp9CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjazIodW5zaWduZWQgaW50IGlubykKewoJc3RydWN0IG1pbml4Ml9pbm9kZSAqZGlyOwoJdW5zaWduZWQgaW50IG9mZnNldDsKCglkaXIgPSBJbm9kZTIgKyBpbm87CglpZiAoIVNfSVNESVIoZGlyLT5pX21vZGUpKQoJCWRpZSgiSW50ZXJuYWwgZXJyb3IiKTsKCWlmIChkaXItPmlfc2l6ZSA8IDIgKiBkaXJzaXplKSB7CgkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogc2l6ZTwzMiIsIGN1cnJlbnRfbmFtZSk7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGlyLT5pX3NpemU7IG9mZnNldCArPSBkaXJzaXplKQoJCWNoZWNrX2ZpbGUyKGRpciwgb2Zmc2V0KTsKfQojZW5kaWYKCnN0YXRpYyBpbnQgYmFkX3pvbmUoaW50IGkpCnsKCWNoYXIgYnVmZmVyWzEwMjRdOwoKCWlmIChCTE9DS19TSVpFICogaSAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSAqIGksIFNFRUtfU0VUKSkKCQlkaWUoIlNlZWsgZmFpbGVkIGluIGJhZF96b25lIik7CglyZXR1cm4gKEJMT0NLX1NJWkUgIT0gcmVhZChJTiwgYnVmZmVyLCBCTE9DS19TSVpFKSk7Cn0KCnN0YXRpYyB2b2lkIGNoZWNrX2NvdW50cyh2b2lkKQp7CglpbnQgaTsKCglmb3IgKGkgPSAxOyBpIDw9IElOT0RFUzsgaSsrKSB7CgkJaWYgKHdhcm5fbW9kZSAmJiBJbm9kZVtpXS5pX21vZGUgJiYgIWlub2RlX2luX3VzZShpKSkgewoJCQlwcmludGYoIklub2RlICVkIGhhcyBub24temVybyBtb2RlLiAiLCBpKTsKCQkJaWYgKGFzaygiQ2xlYXIiLCAxKSkgewoJCQkJSW5vZGVbaV0uaV9tb2RlID0gMDsKCQkJCWNoYW5nZWQgPSAxOwoJCQl9CgkJfQoJCWlmICghaW5vZGVfY291bnRbaV0pIHsKCQkJaWYgKCFpbm9kZV9pbl91c2UoaSkpCgkJCQljb250aW51ZTsKCQkJcHJpbnRmKCJVbnVzZWQgaW5vZGUgJWQgaXMgbWFya2VkIGFzICd1c2VkJyBpbiB0aGUgYml0bWFwLiAiLCBpKTsKCQkJaWYgKGFzaygiQ2xlYXIiLCAxKSkKCQkJCXVubWFya19pbm9kZShpKTsKCQkJY29udGludWU7CgkJfQoJCWlmICghaW5vZGVfaW5fdXNlKGkpKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgaXMgdXNlZCwgYnV0IG1hcmtlZCBhcyAndW51c2VkJyBpbiB0aGUgYml0bWFwLiAiLCBpKTsKCQkJaWYgKGFzaygiU2V0IiwgMSkpCgkJCQltYXJrX2lub2RlKGkpOwoJCX0KCQlpZiAoSW5vZGVbaV0uaV9ubGlua3MgIT0gaW5vZGVfY291bnRbaV0pIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCAobW9kZT0lMDdvKSwgaV9ubGlua3M9JWQsIGNvdW50ZWQ9JWQuICIsCgkJCQkgICBpLCBJbm9kZVtpXS5pX21vZGUsIElub2RlW2ldLmlfbmxpbmtzLCBpbm9kZV9jb3VudFtpXSk7CgkJCWlmIChhc2soIlNldCBpX25saW5rcyB0byBjb3VudCIsIDEpKSB7CgkJCQlJbm9kZVtpXS5pX25saW5rcyA9IGlub2RlX2NvdW50W2ldOwoJCQkJY2hhbmdlZCA9IDE7CgkJCX0KCQl9Cgl9Cglmb3IgKGkgPSBGSVJTVFpPTkU7IGkgPCBaT05FUzsgaSsrKSB7CgkJaWYgKHpvbmVfaW5fdXNlKGkpID09IHpvbmVfY291bnRbaV0pCgkJCWNvbnRpbnVlOwoJCWlmICghem9uZV9jb3VudFtpXSkgewoJCQlpZiAoYmFkX3pvbmUoaSkpCgkJCQljb250aW51ZTsKCQkJcHJpbnRmKCJab25lICVkIGlzIG1hcmtlZCAnaW4gdXNlJywgYnV0IG5vIGZpbGUgdXNlcyBpdC4gIiwgaSk7CgkJCWlmIChhc2soIlVubWFyayIsIDEpKQoJCQkJdW5tYXJrX3pvbmUoaSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlwcmludGYoIlpvbmUgJWQ6ICVzaW4gdXNlLCBjb3VudGVkPSVkXG4iLAoJCQkgICBpLCB6b25lX2luX3VzZShpKSA/ICIiIDogIm5vdCAiLCB6b25lX2NvdW50W2ldKTsKCX0KfQoKI2lmZGVmIENPTkZJR19GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBjaGVja19jb3VudHMyKHZvaWQpCnsKCWludCBpOwoKCWZvciAoaSA9IDE7IGkgPD0gSU5PREVTOyBpKyspIHsKCQlpZiAod2Fybl9tb2RlICYmIElub2RlMltpXS5pX21vZGUgJiYgIWlub2RlX2luX3VzZShpKSkgewoJCQlwcmludGYoIklub2RlICVkIGhhcyBub24temVybyBtb2RlLiAiLCBpKTsKCQkJaWYgKGFzaygiQ2xlYXIiLCAxKSkgewoJCQkJSW5vZGUyW2ldLmlfbW9kZSA9IDA7CgkJCQljaGFuZ2VkID0gMTsKCQkJfQoJCX0KCQlpZiAoIWlub2RlX2NvdW50W2ldKSB7CgkJCWlmICghaW5vZGVfaW5fdXNlKGkpKQoJCQkJY29udGludWU7CgkJCXByaW50ZigiVW51c2VkIGlub2RlICVkIGlzIG1hcmtlZCBhcyAndXNlZCcgaW4gdGhlIGJpdG1hcC4gIiwgaSk7CgkJCWlmIChhc2soIkNsZWFyIiwgMSkpCgkJCQl1bm1hcmtfaW5vZGUoaSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIWlub2RlX2luX3VzZShpKSkgewoJCQlwcmludGYoIklub2RlICVkIGlzIHVzZWQsIGJ1dCBtYXJrZWQgYXMgJ3VudXNlZCcgaW4gdGhlIGJpdG1hcC4gIiwgaSk7CgkJCWlmIChhc2soIlNldCIsIDEpKQoJCQkJbWFya19pbm9kZShpKTsKCQl9CgkJaWYgKElub2RlMltpXS5pX25saW5rcyAhPSBpbm9kZV9jb3VudFtpXSkgewoJCQlwcmludGYoIklub2RlICVkIChtb2RlPSUwN28pLCBpX25saW5rcz0lZCwgY291bnRlZD0lZC4gIiwKCQkJCSAgIGksIElub2RlMltpXS5pX21vZGUsIElub2RlMltpXS5pX25saW5rcywKCQkJCSAgIGlub2RlX2NvdW50W2ldKTsKCQkJaWYgKGFzaygiU2V0IGlfbmxpbmtzIHRvIGNvdW50IiwgMSkpIHsKCQkJCUlub2RlMltpXS5pX25saW5rcyA9IGlub2RlX2NvdW50W2ldOwoJCQkJY2hhbmdlZCA9IDE7CgkJCX0KCQl9Cgl9Cglmb3IgKGkgPSBGSVJTVFpPTkU7IGkgPCBaT05FUzsgaSsrKSB7CgkJaWYgKHpvbmVfaW5fdXNlKGkpID09IHpvbmVfY291bnRbaV0pCgkJCWNvbnRpbnVlOwoJCWlmICghem9uZV9jb3VudFtpXSkgewoJCQlpZiAoYmFkX3pvbmUoaSkpCgkJCQljb250aW51ZTsKCQkJcHJpbnRmKCJab25lICVkIGlzIG1hcmtlZCAnaW4gdXNlJywgYnV0IG5vIGZpbGUgdXNlcyBpdC4gIiwgaSk7CgkJCWlmIChhc2soIlVubWFyayIsIDEpKQoJCQkJdW5tYXJrX3pvbmUoaSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlwcmludGYoIlpvbmUgJWQ6ICVzaW4gdXNlLCBjb3VudGVkPSVkXG4iLAoJCQkgICBpLCB6b25lX2luX3VzZShpKSA/ICIiIDogIm5vdCAiLCB6b25lX2NvdW50W2ldKTsKCX0KfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrKHZvaWQpCnsKCW1lbXNldChpbm9kZV9jb3VudCwgMCwgKElOT0RFUyArIDEpICogc2l6ZW9mKCppbm9kZV9jb3VudCkpOwoJbWVtc2V0KHpvbmVfY291bnQsIDAsIFpPTkVTICogc2l6ZW9mKCp6b25lX2NvdW50KSk7CgljaGVja196b25lcyhST09UX0lOTyk7CglyZWN1cnNpdmVfY2hlY2soUk9PVF9JTk8pOwoJY2hlY2tfY291bnRzKCk7Cn0KCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2syKHZvaWQpCnsKCW1lbXNldChpbm9kZV9jb3VudCwgMCwgKElOT0RFUyArIDEpICogc2l6ZW9mKCppbm9kZV9jb3VudCkpOwoJbWVtc2V0KHpvbmVfY291bnQsIDAsIFpPTkVTICogc2l6ZW9mKCp6b25lX2NvdW50KSk7CgljaGVja196b25lczIoUk9PVF9JTk8pOwoJcmVjdXJzaXZlX2NoZWNrMihST09UX0lOTyk7CgljaGVja19jb3VudHMyKCk7Cn0KI2VuZGlmCgppbnQgZnNja19taW5peF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewoJc3RydWN0IHRlcm1pb3MgdG1wOwoJaW50IHJldGNvZGUgPSAwOwoKCWFsbG9jX2N1cnJlbnRfbmFtZSgpOwojaWZkZWYgQ09ORklHX0ZFQVRVUkVfQ0xFQU5fVVAKCS8qIERvbid0IGJvdGhlciB0byBmcmVlIG1lbW9yeS4gIEV4aXQgZG9lcwoJICogdGhhdCBhdXRvbWFnaWNhbGx5LCBzbyB3ZSBjYW4gc2F2ZSBhIGZldyBieXRlcyAqLwoJYXRleGl0KGZyZWVfY3VycmVudF9uYW1lKTsKI2VuZGlmCgoJaWYgKElOT0RFX1NJWkUgKiBNSU5JWF9JTk9ERVNfUEVSX0JMT0NLICE9IEJMT0NLX1NJWkUpCgkJZGllKCJCYWQgaW5vZGUgc2l6ZSIpOwojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCglpZiAoSU5PREVfU0laRTIgKiBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyAhPSBCTE9DS19TSVpFKQoJCWRpZSgiQmFkIHYyIGlub2RlIHNpemUiKTsKI2VuZGlmCgl3aGlsZSAoYXJnYy0tID4gMSkgewoJCWFyZ3YrKzsKCQlpZiAoYXJndlswXVswXSAhPSAnLScpIHsKCQkJaWYgKGRldmljZV9uYW1lKQoJCQkJYmJfc2hvd191c2FnZSgpOwoJCQllbHNlCgkJCQlkZXZpY2VfbmFtZSA9IGFyZ3ZbMF07CgkJfSBlbHNlCgkJCXdoaWxlICgqKythcmd2WzBdKQoJCQkJc3dpdGNoIChhcmd2WzBdWzBdKSB7CgkJCQljYXNlICdsJzoKCQkJCQlsaXN0ID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ2EnOgoJCQkJCWF1dG9tYXRpYyA9IDE7CgkJCQkJcmVwYWlyID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3InOgoJCQkJCWF1dG9tYXRpYyA9IDA7CgkJCQkJcmVwYWlyID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3YnOgoJCQkJCXZlcmJvc2UgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAncyc6CgkJCQkJc2hvdyA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdtJzoKCQkJCQl3YXJuX21vZGUgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnZic6CgkJCQkJZm9yY2UgPSAxOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQliYl9zaG93X3VzYWdlKCk7CgkJCQl9Cgl9CglpZiAoIWRldmljZV9uYW1lKQoJCWJiX3Nob3dfdXNhZ2UoKTsKCWNoZWNrX21vdW50KCk7CQkJCS8qIHRyeWluZyB0byBjaGVjayBhIG1vdW50ZWQgZmlsZXN5c3RlbT8gKi8KCWlmIChyZXBhaXIgJiYgIWF1dG9tYXRpYykgewoJCWlmICghaXNhdHR5KDApIHx8ICFpc2F0dHkoMSkpCgkJCWRpZSgiTmVlZCB0ZXJtaW5hbCBmb3IgaW50ZXJhY3RpdmUgcmVwYWlycyIpOwoJfQoJSU4gPSBvcGVuKGRldmljZV9uYW1lLCByZXBhaXIgPyBPX1JEV1IgOiBPX1JET05MWSk7CglpZiAoSU4gPCAwKXsKCQlwcmludGYoIlVuYWJsZSB0byBvcGVuIGRldmljZSAnJXMnXG4iLCBkZXZpY2VfbmFtZSk7CgkJbGVhdmUoOCk7Cgl9CglzeW5jKCk7IC8qIHBhcmFub2lhPyAqLwoJcmVhZF9zdXBlcmJsb2NrKCk7CgoJLyoKCSAqIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgY29udGludWUgd2l0aCB0aGUgY2hlY2tpbmcuCgkgKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBzdGF0dXMgb2YgdGhlIGZpbGVzeXN0ZW0gdmFsaWQgYW5kIGVycm9yCgkgKiBmbGFncyBhbmQgd2hldGhlciBvciBub3QgdGhlIC1mIHN3aXRjaCB3YXMgc3BlY2lmaWVkIG9uIHRoZQoJICogY29tbWFuZCBsaW5lLgoJICovCglwcmludGYoIiVzLCAlc1xuIiwgYmJfYXBwbGV0X25hbWUsIHByb2dyYW1fdmVyc2lvbik7CglpZiAoIShTdXBlci5zX3N0YXRlICYgTUlOSVhfRVJST1JfRlMpICYmCgkJKFN1cGVyLnNfc3RhdGUgJiBNSU5JWF9WQUxJRF9GUykgJiYgIWZvcmNlKSB7CgkJaWYgKHJlcGFpcikKCQkJcHJpbnRmKCIlcyBpcyBjbGVhbiwgY2hlY2sgaXMgc2tpcHBlZFxuIiwgZGV2aWNlX25hbWUpOwoJCXJldHVybiByZXRjb2RlOwoJfSBlbHNlIGlmIChmb3JjZSkKCQlwcmludGYoIkZvcmNpbmcgZmlsZXN5c3RlbSBjaGVjayBvbiAlc1xuIiwgZGV2aWNlX25hbWUpOwoJZWxzZSBpZiAocmVwYWlyKQoJCXByaW50ZigiRmlsZXN5c3RlbSBvbiAlcyBpcyBkaXJ0eSwgbmVlZHMgY2hlY2tpbmdcbiIsCgkJCSAgIGRldmljZV9uYW1lKTsKCglyZWFkX3RhYmxlcygpOwoKCWlmIChyZXBhaXIgJiYgIWF1dG9tYXRpYykgewoJCXRjZ2V0YXR0cigwLCAmdGVybWlvcyk7CgkJdG1wID0gdGVybWlvczsKCQl0bXAuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8pOwoJCXRjc2V0YXR0cigwLCBUQ1NBTk9XLCAmdG1wKTsKCQl0ZXJtaW9zX3NldCA9IDE7Cgl9CiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKCWlmICh2ZXJzaW9uMikgewoJCWNoZWNrX3Jvb3QyKCk7CgkJY2hlY2syKCk7Cgl9IGVsc2UKI2VuZGlmCgl7CgkJY2hlY2tfcm9vdCgpOwoJCWNoZWNrKCk7Cgl9CglpZiAodmVyYm9zZSkgewoJCWludCBpLCBmcmVlX2NudDsKCgkJZm9yIChpID0gMSwgZnJlZV9jbnQgPSAwOyBpIDw9IElOT0RFUzsgaSsrKQoJCQlpZiAoIWlub2RlX2luX3VzZShpKSkKCQkJCWZyZWVfY250Kys7CgkJcHJpbnRmKCJcbiU2bGQgaW5vZGVzIHVzZWQgKCVsZCUlKVxuIiwgKElOT0RFUyAtIGZyZWVfY250KSwKCQkJICAgMTAwICogKElOT0RFUyAtIGZyZWVfY250KSAvIElOT0RFUyk7CgkJZm9yIChpID0gRklSU1RaT05FLCBmcmVlX2NudCA9IDA7IGkgPCBaT05FUzsgaSsrKQoJCQlpZiAoIXpvbmVfaW5fdXNlKGkpKQoJCQkJZnJlZV9jbnQrKzsKCQlwcmludGYoIiU2bGQgem9uZXMgdXNlZCAoJWxkJSUpXG5cbiIKCQkJICAgIiU2ZCByZWd1bGFyIGZpbGVzXG4iCgkJCSAgICIlNmQgZGlyZWN0b3JpZXNcbiIKCQkJICAgIiU2ZCBjaGFyYWN0ZXIgZGV2aWNlIGZpbGVzXG4iCgkJCSAgICIlNmQgYmxvY2sgZGV2aWNlIGZpbGVzXG4iCgkJCSAgICIlNmQgbGlua3NcbiIKCQkJICAgIiU2ZCBzeW1ib2xpYyBsaW5rc1xuIgoJCQkgICAiLS0tLS0tXG4iCgkJCSAgICIlNmQgZmlsZXNcbiIsCgkJCSAgIChaT05FUyAtIGZyZWVfY250KSwgMTAwICogKFpPTkVTIC0gZnJlZV9jbnQpIC8gWk9ORVMsCgkJCSAgIHJlZ3VsYXIsIGRpcmVjdG9yeSwgY2hhcmRldiwgYmxvY2tkZXYsCgkJCSAgIGxpbmtzIC0gMiAqIGRpcmVjdG9yeSArIDEsIHN5bWxpbmtzLAoJCQkgICB0b3RhbCAtIDIgKiBkaXJlY3RvcnkgKyAxKTsKCX0KCWlmIChjaGFuZ2VkKSB7CgkJd3JpdGVfdGFibGVzKCk7CgkJcHJpbnRmKCJGSUxFIFNZU1RFTSBIQVMgQkVFTiBDSEFOR0VEXG4iKTsKCQlzeW5jKCk7Cgl9IGVsc2UgaWYgKHJlcGFpcikKCQl3cml0ZV9zdXBlcl9ibG9jaygpOwoKCWlmIChyZXBhaXIgJiYgIWF1dG9tYXRpYykKCQl0Y3NldGF0dHIoMCwgVENTQU5PVywgJnRlcm1pb3MpOwoKCWlmIChjaGFuZ2VkKQoJCXJldGNvZGUgKz0gMzsKCWlmIChlcnJvcnNfdW5jb3JyZWN0ZWQpCgkJcmV0Y29kZSArPSA0OwoJcmV0dXJuIHJldGNvZGU7Cn0K