LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCi8qCiAqIERvcyBmbG9wcHkgc3VwcG9ydAogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8Y29tbWFuZC5oPgojaW5jbHVkZSA8ZmRjLmg+CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGRvX2Zkb3Nib290IC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCmludCBkb19mZG9zYm9vdChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKICAgIGNoYXIgKm5hbWU7CiAgICBjaGFyICplcDsKICAgIGludCBzaXplOwogICAgY2hhciBidWYgWzEyXTsKICAgIGludCBkcml2ZSA9IENPTkZJR19TWVNfRkRDX0RSSVZFX05VTUJFUjsKCiAgICAvKiBwcmUtc2V0IGxvYWRfYWRkciAqLwogICAgaWYgKChlcCA9IGdldGVudigibG9hZGFkZHIiKSkgIT0gTlVMTCkgewoJbG9hZF9hZGRyID0gc2ltcGxlX3N0cnRvdWwoZXAsIE5VTEwsIDE2KTsKICAgIH0KCiAgICAvKiBwcmUtc2V0IEJvb3QgZmlsZSBuYW1lICovCiAgICBpZiAoKG5hbWUgPSBnZXRlbnYoImJvb3RmaWxlIikpID09IE5VTEwpIHsKCW5hbWUgPSAidUltYWdlIjsKICAgIH0KCiAgICBzd2l0Y2ggKGFyZ2MpIHsKICAgIGNhc2UgMToKCWJyZWFrOwogICAgY2FzZSAyOgoJLyogb25seSBvbmUgYXJnIC0gYWNjZXB0IHR3byBmb3JtczoKCSAqIGp1c3QgbG9hZCBhZGRyZXNzLCBvciBqdXN0IGJvb3QgZmlsZSBuYW1lLgoJICogVGhlIGxhdHRlciBmb3JtIG11c3QgYmUgd3JpdHRlbiAiZmlsZW5hbWUiIGhlcmUuCgkgKi8KCWlmIChhcmd2WzFdWzBdID09ICciJykgewkvKiBqdXN0IGJvb3QgZmlsZW5hbWUgKi8KCSAgICBuYW1lID0gYXJndiBbMV07Cgl9IGVsc2UgewkJCS8qIGxvYWQgYWRkcmVzcwkqLwoJICAgIGxvYWRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKCX0KCWJyZWFrOwogICAgY2FzZSAzOgoJbG9hZF9hZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpOwoJbmFtZSA9IGFyZ3YgWzJdOwoJYnJlYWs7CiAgICBkZWZhdWx0OgoJcmV0dXJuIGNtZF91c2FnZShjbWR0cCk7CiAgICB9CgogICAgLyogSW5pdCBwaHlzaWNhbCBsYXllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBpZiAoIWZkY19mZG9zX2luaXQgKGRyaXZlKSkgewoJcmV0dXJuICgtMSk7CiAgICB9CgogICAgLyogT3BlbiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBpZiAoZG9zX29wZW4gKG5hbWUpIDwgMCkgewoJcHJpbnRmICgiVW5hYmxlIHRvIG9wZW4gJXNcbiIsIG5hbWUpOwoJcmV0dXJuIDE7CiAgICB9CiAgICBpZiAoKHNpemUgPSBkb3NfcmVhZCAobG9hZF9hZGRyKSkgPCAwKSB7CglwcmludGYgKCJib290IGVycm9yXG4iKTsKCXJldHVybiAxOwogICAgfQogICAgZmx1c2hfY2FjaGUgKGxvYWRfYWRkciwgc2l6ZSk7CgogICAgc3ByaW50ZihidWYsICIleCIsIHNpemUpOwogICAgc2V0ZW52KCJmaWxlc2l6ZSIsIGJ1Zik7CgogICAgcHJpbnRmKCJGbG9wcHkgRE9TIGxvYWQgY29tcGxldGU6ICVkIGJ5dGVzIGxvYWRlZCB0byAweCVseFxuIiwKCSAgIHNpemUsIGxvYWRfYWRkcik7CgogICAgcmV0dXJuIGJvb3RtX21heWJlX2F1dG9zdGFydChjbWR0cCwgYXJndlswXSk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogZG9fZmRvc2xzIC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCmludCBkb19mZG9zbHMoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CiAgICBjaGFyICpwYXRoID0gIiI7CiAgICBpbnQgZHJpdmUgPSBDT05GSUdfU1lTX0ZEQ19EUklWRV9OVU1CRVI7CgogICAgc3dpdGNoIChhcmdjKSB7CiAgICBjYXNlIDE6CglicmVhazsKICAgIGNhc2UgMjoKCXBhdGggPSBhcmd2IFsxXTsKCWJyZWFrOwogICAgfQoKICAgIC8qIEluaXQgcGh5c2ljYWwgbGF5ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgaWYgKCFmZGNfZmRvc19pbml0IChkcml2ZSkpIHsKCXJldHVybiAoLTEpOwogICAgfQogICAgLyogT3BlbiBkaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBpZiAoZG9zX29wZW4gKHBhdGgpIDwgMCkgewoJcHJpbnRmICgiVW5hYmxlIHRvIG9wZW4gJXNcbiIsIHBhdGgpOwoJcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gKGRvc19kaXIgKCkpOwp9CgpVX0JPT1RfQ01EKAoJZmRvc2Jvb3QsCTMsCTAsCWRvX2Zkb3Nib290LAoJImJvb3QgZnJvbSBhIGRvcyBmbG9wcHkgZmlsZSIsCgkiW2xvYWRBZGRyXSBbZmlsZW5hbWVdIgopOwoKVV9CT09UX0NNRCgKCWZkb3NscywJMiwJMCwJZG9fZmRvc2xzLAoJImxpc3QgZmlsZXMgaW4gYSBkaXJlY3RvcnkiLAoJIltkaXJlY3RvcnldIgopOwo=