LyoKICogIENGSSBwYXJhbGxlbCBmbGFzaCB3aXRoIEFNRCBjb21tYW5kIHNldCBlbXVsYXRpb24KICoKICogIENvcHlyaWdodCAoYykgMjAwNSBKb2NlbHluIE1heWVyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgovKgogKiBGb3Igbm93LCB0aGlzIGNvZGUgY2FuIGVtdWxhdGUgZmxhc2hlcyBvZiAxLCAyIG9yIDQgYnl0ZXMgd2lkdGguCiAqIFN1cHBvcnRlZCBjb21tYW5kcy9tb2RlcyBhcmU6CiAqIC0gZmxhc2ggcmVhZAogKiAtIGZsYXNoIHdyaXRlCiAqIC0gZmxhc2ggSUQgcmVhZAogKiAtIHNlY3RvciBlcmFzZQogKiAtIGNoaXAgZXJhc2UKICogLSB1bmxvY2sgYnlwYXNzIGNvbW1hbmQKICogLSBDRkkgcXVlcmllcwogKgogKiBJdCBkb2VzIG5vdCBzdXBwb3J0IGZsYXNoIGludGVybGVhdmluZy4KICogSXQgZG9lcyBub3QgaW1wbGVtZW50IGJvb3QgYmxvY3Mgd2l0aCByZWR1Y2VkIHNpemUKICogSXQgZG9lcyBub3QgaW1wbGVtZW50IHNvZnR3YXJlIGRhdGEgcHJvdGVjdGlvbiBhcyBmb3VuZCBpbiBtYW55IHJlYWwgY2hpcHMKICogSXQgZG9lcyBub3QgaW1wbGVtZW50IGVyYXNlIHN1c3BlbmQvcmVzdW1lIGNvbW1hbmRzCiAqIEl0IGRvZXMgbm90IGltcGxlbWVudCBtdWx0aXBsZSBzZWN0b3JzIGVyYXNlCiAqLwoKI2luY2x1ZGUgImh3LmgiCiNpbmNsdWRlICJmbGFzaC5oIgojaW5jbHVkZSAicWVtdS10aW1lci5oIgojaW5jbHVkZSAiYmxvY2suaCIKCi8vI2RlZmluZSBQRkxBU0hfREVCVUcKI2lmZGVmIFBGTEFTSF9ERUJVRwojZGVmaW5lIERQUklOVEYoZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgICAgICBcCmRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBwcmludGYoIlBGTEFTSDogIiBmbXQgLCAjI2FyZ3MpOyAgICAgICAgICAgXAp9IHdoaWxlICgwKQojZWxzZQojZGVmaW5lIERQUklOVEYoZm10LCBhcmdzLi4uKSBkbyB7IH0gd2hpbGUgKDApCiNlbmRpZgoKc3RydWN0IHBmbGFzaF90IHsKICAgIEJsb2NrRHJpdmVyU3RhdGUgKmJzOwogICAgdGFyZ2V0X3BoeXNfYWRkcl90IGJhc2U7CiAgICB1aW50MzJfdCBzZWN0b3JfbGVuOwogICAgdWludDMyX3QgdG90YWxfbGVuOwogICAgaW50IHdpZHRoOwogICAgaW50IHdjeWNsZTsgLyogaWYgMCwgdGhlIGZsYXNoIGlzIHJlYWQgbm9ybWFsbHkgKi8KICAgIGludCBieXBhc3M7CiAgICBpbnQgcm87CiAgICB1aW50OF90IGNtZDsKICAgIHVpbnQ4X3Qgc3RhdHVzOwogICAgdWludDE2X3QgaWRlbnRbNF07CiAgICB1aW50OF90IGNmaV9sZW47CiAgICB1aW50OF90IGNmaV90YWJsZVsweDUyXTsKICAgIFFFTVVUaW1lciAqdGltZXI7CiAgICByYW1fYWRkcl90IG9mZjsKICAgIGludCBmbF9tZW07CiAgICB2b2lkICpzdG9yYWdlOwp9OwoKc3RhdGljIHZvaWQgcGZsYXNoX3RpbWVyICh2b2lkICpvcGFxdWUpCnsKICAgIHBmbGFzaF90ICpwZmwgPSBvcGFxdWU7CgogICAgRFBSSU5URigiJXM6IGNvbW1hbmQgJTAyeCBkb25lXG4iLCBfX2Z1bmNfXywgcGZsLT5jbWQpOwogICAgLyogUmVzZXQgZmxhc2ggKi8KICAgIHBmbC0+c3RhdHVzIF49IDB4ODA7CiAgICBpZiAocGZsLT5ieXBhc3MpIHsKICAgICAgICBwZmwtPndjeWNsZSA9IDI7CiAgICB9IGVsc2UgewogICAgICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkocGZsLT5iYXNlLCBwZmwtPnRvdGFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmbC0+b2ZmIHwgSU9fTUVNX1JPTUQgfCBwZmwtPmZsX21lbSk7CiAgICAgICAgcGZsLT53Y3ljbGUgPSAwOwogICAgfQogICAgcGZsLT5jbWQgPSAwOwp9CgpzdGF0aWMgdWludDMyX3QgcGZsYXNoX3JlYWQgKHBmbGFzaF90ICpwZmwsIHVpbnQzMl90IG9mZnNldCwgaW50IHdpZHRoKQp7CiAgICB1aW50MzJfdCBib2ZmOwogICAgdWludDMyX3QgcmV0OwogICAgdWludDhfdCAqcDsKCiAgICBEUFJJTlRGKCIlczogb2Zmc2V0ICIgVEFSR0VUX0ZNVF9seCAiXG4iLCBfX2Z1bmNfXywgb2Zmc2V0KTsKICAgIHJldCA9IC0xOwogICAgb2Zmc2V0IC09IHBmbC0+YmFzZTsKICAgIGJvZmYgPSBvZmZzZXQgJiAweEZGOwogICAgaWYgKHBmbC0+d2lkdGggPT0gMikKICAgICAgICBib2ZmID0gYm9mZiA+PiAxOwogICAgZWxzZSBpZiAocGZsLT53aWR0aCA9PSA0KQogICAgICAgIGJvZmYgPSBib2ZmID4+IDI7CiAgICBzd2l0Y2ggKHBmbC0+Y21kKSB7CiAgICBkZWZhdWx0OgogICAgICAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiA6IHJlc2V0IHN0YXRlICYgdHJlYXQgaXQgYXMgYSByZWFkKi8KICAgICAgICBEUFJJTlRGKCIlczogdW5rbm93biBjb21tYW5kIHN0YXRlOiAleFxuIiwgX19mdW5jX18sIHBmbC0+Y21kKTsKICAgICAgICBwZmwtPndjeWNsZSA9IDA7CiAgICAgICAgcGZsLT5jbWQgPSAwOwogICAgY2FzZSAweDgwOgogICAgICAgIC8qIFdlIGFjY2VwdCByZWFkcyBkdXJpbmcgc2Vjb25kIHVubG9jayBzZXF1ZW5jZS4uLiAqLwogICAgY2FzZSAweDAwOgogICAgZmxhc2hfcmVhZDoKICAgICAgICAvKiBGbGFzaCBhcmVhIHJlYWQgKi8KICAgICAgICBwID0gcGZsLT5zdG9yYWdlOwogICAgICAgIHN3aXRjaCAod2lkdGgpIHsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIHJldCA9IHBbb2Zmc2V0XTsKLy8gICAgICAgICAgICBEUFJJTlRGKCIlczogZGF0YSBvZmZzZXQgJTA4eCAlMDJ4XG4iLCBfX2Z1bmNfXywgb2Zmc2V0LCByZXQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiNpZiBkZWZpbmVkKFRBUkdFVF9XT1JEU19CSUdFTkRJQU4pCiAgICAgICAgICAgIHJldCA9IHBbb2Zmc2V0XSA8PCA4OwogICAgICAgICAgICByZXQgfD0gcFtvZmZzZXQgKyAxXTsKI2Vsc2UKICAgICAgICAgICAgcmV0ID0gcFtvZmZzZXRdOwogICAgICAgICAgICByZXQgfD0gcFtvZmZzZXQgKyAxXSA8PCA4OwojZW5kaWYKLy8gICAgICAgICAgICBEUFJJTlRGKCIlczogZGF0YSBvZmZzZXQgJTA4eCAlMDR4XG4iLCBfX2Z1bmNfXywgb2Zmc2V0LCByZXQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiNpZiBkZWZpbmVkKFRBUkdFVF9XT1JEU19CSUdFTkRJQU4pCiAgICAgICAgICAgIHJldCA9IHBbb2Zmc2V0XSA8PCAyNDsKICAgICAgICAgICAgcmV0IHw9IHBbb2Zmc2V0ICsgMV0gPDwgMTY7CiAgICAgICAgICAgIHJldCB8PSBwW29mZnNldCArIDJdIDw8IDg7CiAgICAgICAgICAgIHJldCB8PSBwW29mZnNldCArIDNdOwojZWxzZQogICAgICAgICAgICByZXQgPSBwW29mZnNldF07CiAgICAgICAgICAgIHJldCB8PSBwW29mZnNldCArIDFdIDw8IDg7CiAgICAgICAgICAgIHJldCB8PSBwW29mZnNldCArIDJdIDw8IDE2OwogICAgICAgICAgICByZXQgfD0gcFtvZmZzZXQgKyAzXSA8PCAyNDsKI2VuZGlmCi8vICAgICAgICAgICAgRFBSSU5URigiJXM6IGRhdGEgb2Zmc2V0ICUwOHggJTA4eFxuIiwgX19mdW5jX18sIG9mZnNldCwgcmV0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSAweDkwOgogICAgICAgIC8qIGZsYXNoIElEIHJlYWQgKi8KICAgICAgICBzd2l0Y2ggKGJvZmYpIHsKICAgICAgICBjYXNlIDB4MDA6CiAgICAgICAgY2FzZSAweDAxOgogICAgICAgICAgICByZXQgPSBwZmwtPmlkZW50W2JvZmYgJiAweDAxXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAyOgogICAgICAgICAgICByZXQgPSAweDAwOyAvKiBQcmV0ZW5kIGFsbCBzZWN0b3JzIGFyZSB1bnByb3RlY3RlZCAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MEU6CiAgICAgICAgY2FzZSAweDBGOgogICAgICAgICAgICBpZiAocGZsLT5pZGVudFsyICsgKGJvZmYgJiAweDAxKV0gPT0gKHVpbnQ4X3QpLTEpCiAgICAgICAgICAgICAgICBnb3RvIGZsYXNoX3JlYWQ7CiAgICAgICAgICAgIHJldCA9IHBmbC0+aWRlbnRbMiArIChib2ZmICYgMHgwMSldOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBnb3RvIGZsYXNoX3JlYWQ7CiAgICAgICAgfQogICAgICAgIERQUklOVEYoIiVzOiBJRCAiIFRBUkdFVF9GTVRfbGQgIiAleFxuIiwgX19mdW5jX18sIGJvZmYsIHJldCk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDB4QTA6CiAgICBjYXNlIDB4MTA6CiAgICBjYXNlIDB4MzA6CiAgICAgICAgLyogU3RhdHVzIHJlZ2lzdGVyIHJlYWQgKi8KICAgICAgICByZXQgPSBwZmwtPnN0YXR1czsKICAgICAgICBEUFJJTlRGKCIlczogc3RhdHVzICV4XG4iLCBfX2Z1bmNfXywgcmV0KTsKICAgICAgICAvKiBUb2dnbGUgYml0IDYgKi8KICAgICAgICBwZmwtPnN0YXR1cyBePSAweDQwOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAweDk4OgogICAgICAgIC8qIENGSSBxdWVyeSBtb2RlICovCiAgICAgICAgaWYgKGJvZmYgPiBwZmwtPmNmaV9sZW4pCiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXQgPSBwZmwtPmNmaV90YWJsZVtib2ZmXTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gcmV0Owp9CgovKiB1cGRhdGUgZmxhc2ggY29udGVudCBvbiBkaXNrICovCnN0YXRpYyB2b2lkIHBmbGFzaF91cGRhdGUocGZsYXNoX3QgKnBmbCwgaW50IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkKewogICAgaW50IG9mZnNldF9lbmQ7CiAgICBpZiAocGZsLT5icykgewogICAgICAgIG9mZnNldF9lbmQgPSBvZmZzZXQgKyBzaXplOwogICAgICAgIC8qIHJvdW5kIHRvIHNlY3RvcnMgKi8KICAgICAgICBvZmZzZXQgPSBvZmZzZXQgPj4gOTsKICAgICAgICBvZmZzZXRfZW5kID0gKG9mZnNldF9lbmQgKyA1MTEpID4+IDk7CiAgICAgICAgYmRydl93cml0ZShwZmwtPmJzLCBvZmZzZXQsIHBmbC0+c3RvcmFnZSArIChvZmZzZXQgPDwgOSksCiAgICAgICAgICAgICAgICAgICBvZmZzZXRfZW5kIC0gb2Zmc2V0KTsKICAgIH0KfQoKc3RhdGljIHZvaWQgcGZsYXNoX3dyaXRlIChwZmxhc2hfdCAqcGZsLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCkKewogICAgdWludDMyX3QgYm9mZjsKICAgIHVpbnQ4X3QgKnA7CiAgICB1aW50OF90IGNtZDsKCiAgICAvKiBXQVJOSU5HOiB3aGVuIHRoZSBtZW1vcnkgYXJlYSBpcyBpbiBST01EIG1vZGUsIHRoZSBvZmZzZXQgaXMgYQogICAgICAgcmFtIG9mZnNldCwgbm90IGEgcGh5c2ljYWwgYWRkcmVzcyAqLwogICAgY21kID0gdmFsdWU7CiAgICBpZiAocGZsLT5jbWQgIT0gMHhBMCAmJiBjbWQgPT0gMHhGMCkgewojaWYgMAogICAgICAgIERQUklOVEYoIiVzOiBmbGFzaCByZXNldCBhc2tlZCAoJTAyeCAlMDJ4KVxuIiwKICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwZmwtPmNtZCwgY21kKTsKI2VuZGlmCiAgICAgICAgZ290byByZXNldF9mbGFzaDsKICAgIH0KICAgIERQUklOVEYoIiVzOiBvZmZzZXQgIiBUQVJHRVRfRk1UX2x4ICIgJTA4eCAlZCAlZFxuIiwgX19mdW5jX18sCiAgICAgICAgICAgIG9mZnNldCwgdmFsdWUsIHdpZHRoLCBwZmwtPndjeWNsZSk7CiAgICBpZiAocGZsLT53Y3ljbGUgPT0gMCkKICAgICAgICBvZmZzZXQgLT0gKHVpbnQzMl90KShsb25nKXBmbC0+c3RvcmFnZTsKICAgIGVsc2UKICAgICAgICBvZmZzZXQgLT0gcGZsLT5iYXNlOwoKICAgIERQUklOVEYoIiVzOiBvZmZzZXQgIiBUQVJHRVRfRk1UX2x4ICIgJTA4eCAlZFxuIiwgX19mdW5jX18sCiAgICAgICAgICAgIG9mZnNldCwgdmFsdWUsIHdpZHRoKTsKICAgIC8qIFNldCB0aGUgZGV2aWNlIGluIEkvTyBhY2Nlc3MgbW9kZSAqLwogICAgY3B1X3JlZ2lzdGVyX3BoeXNpY2FsX21lbW9yeShwZmwtPmJhc2UsIHBmbC0+dG90YWxfbGVuLCBwZmwtPmZsX21lbSk7CiAgICBib2ZmID0gb2Zmc2V0ICYgKHBmbC0+c2VjdG9yX2xlbiAtIDEpOwogICAgaWYgKHBmbC0+d2lkdGggPT0gMikKICAgICAgICBib2ZmID0gYm9mZiA+PiAxOwogICAgZWxzZSBpZiAocGZsLT53aWR0aCA9PSA0KQogICAgICAgIGJvZmYgPSBib2ZmID4+IDI7CiAgICBzd2l0Y2ggKHBmbC0+d2N5Y2xlKSB7CiAgICBjYXNlIDA6CiAgICAgICAgLyogV2UncmUgaW4gcmVhZCBtb2RlICovCiAgICBjaGVja191bmxvY2swOgogICAgICAgIGlmIChib2ZmID09IDB4NTUgJiYgY21kID09IDB4OTgpIHsKICAgICAgICBlbnRlcl9DRklfbW9kZToKICAgICAgICAgICAgLyogRW50ZXIgQ0ZJIHF1ZXJ5IG1vZGUgKi8KICAgICAgICAgICAgcGZsLT53Y3ljbGUgPSA3OwogICAgICAgICAgICBwZmwtPmNtZCA9IDB4OTg7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGJvZmYgIT0gMHg1NTUgfHwgY21kICE9IDB4QUEpIHsKICAgICAgICAgICAgRFBSSU5URigiJXM6IHVubG9jazAgZmFpbGVkICIgVEFSR0VUX0ZNVF9seCAiICUwMnggJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYm9mZiwgY21kLCAweDU1NSk7CiAgICAgICAgICAgIGdvdG8gcmVzZXRfZmxhc2g7CiAgICAgICAgfQogICAgICAgIERQUklOVEYoIiVzOiB1bmxvY2sgc2VxdWVuY2Ugc3RhcnRlZFxuIiwgX19mdW5jX18pOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAxOgogICAgICAgIC8qIFdlIHN0YXJ0ZWQgYW4gdW5sb2NrIHNlcXVlbmNlICovCiAgICBjaGVja191bmxvY2sxOgogICAgICAgIGlmIChib2ZmICE9IDB4MkFBIHx8IGNtZCAhPSAweDU1KSB7CiAgICAgICAgICAgIERQUklOVEYoIiVzOiB1bmxvY2sxIGZhaWxlZCAiIFRBUkdFVF9GTVRfbHggIiAlMDJ4XG4iLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgICBib2ZmLCBjbWQpOwogICAgICAgICAgICBnb3RvIHJlc2V0X2ZsYXNoOwogICAgICAgIH0KICAgICAgICBEUFJJTlRGKCIlczogdW5sb2NrIHNlcXVlbmNlIGRvbmVcbiIsIF9fZnVuY19fKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgMjoKICAgICAgICAvKiBXZSBmaW5pc2hlZCBhbiB1bmxvY2sgc2VxdWVuY2UgKi8KICAgICAgICBpZiAoIXBmbC0+YnlwYXNzICYmIGJvZmYgIT0gMHg1NTUpIHsKICAgICAgICAgICAgRFBSSU5URigiJXM6IGNvbW1hbmQgZmFpbGVkICIgVEFSR0VUX0ZNVF9seCAiICUwMnhcbiIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAgICAgIGJvZmYsIGNtZCk7CiAgICAgICAgICAgIGdvdG8gcmVzZXRfZmxhc2g7CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAoY21kKSB7CiAgICAgICAgY2FzZSAweDIwOgogICAgICAgICAgICBwZmwtPmJ5cGFzcyA9IDE7CiAgICAgICAgICAgIGdvdG8gZG9fYnlwYXNzOwogICAgICAgIGNhc2UgMHg4MDoKICAgICAgICBjYXNlIDB4OTA6CiAgICAgICAgY2FzZSAweEEwOgogICAgICAgICAgICBwZmwtPmNtZCA9IGNtZDsKICAgICAgICAgICAgRFBSSU5URigiJXM6IHN0YXJ0aW5nIGNvbW1hbmQgJTAyeFxuIiwgX19mdW5jX18sIGNtZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIERQUklOVEYoIiVzOiB1bmtub3duIGNvbW1hbmQgJTAyeFxuIiwgX19mdW5jX18sIGNtZCk7CiAgICAgICAgICAgIGdvdG8gcmVzZXRfZmxhc2g7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSAzOgogICAgICAgIHN3aXRjaCAocGZsLT5jbWQpIHsKICAgICAgICBjYXNlIDB4ODA6CiAgICAgICAgICAgIC8qIFdlIG5lZWQgYW5vdGhlciB1bmxvY2sgc2VxdWVuY2UgKi8KICAgICAgICAgICAgZ290byBjaGVja191bmxvY2swOwogICAgICAgIGNhc2UgMHhBMDoKICAgICAgICAgICAgRFBSSU5URigiJXM6IHdyaXRlIGRhdGEgb2Zmc2V0ICIgVEFSR0VUX0ZNVF9seCAiICUwOHggJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG9mZnNldCwgdmFsdWUsIHdpZHRoKTsKICAgICAgICAgICAgcCA9IHBmbC0+c3RvcmFnZTsKICAgICAgICAgICAgc3dpdGNoICh3aWR0aCkgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICBwW29mZnNldF0gJj0gdmFsdWU7CiAgICAgICAgICAgICAgICBwZmxhc2hfdXBkYXRlKHBmbCwgb2Zmc2V0LCAxKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6CiNpZiBkZWZpbmVkKFRBUkdFVF9XT1JEU19CSUdFTkRJQU4pCiAgICAgICAgICAgICAgICBwW29mZnNldF0gJj0gdmFsdWUgPj4gODsKICAgICAgICAgICAgICAgIHBbb2Zmc2V0ICsgMV0gJj0gdmFsdWU7CiNlbHNlCiAgICAgICAgICAgICAgICBwW29mZnNldF0gJj0gdmFsdWU7CiAgICAgICAgICAgICAgICBwW29mZnNldCArIDFdICY9IHZhbHVlID4+IDg7CiNlbmRpZgogICAgICAgICAgICAgICAgcGZsYXNoX3VwZGF0ZShwZmwsIG9mZnNldCwgMik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA0OgojaWYgZGVmaW5lZChUQVJHRVRfV09SRFNfQklHRU5ESUFOKQogICAgICAgICAgICAgICAgcFtvZmZzZXRdICY9IHZhbHVlID4+IDI0OwogICAgICAgICAgICAgICAgcFtvZmZzZXQgKyAxXSAmPSB2YWx1ZSA+PiAxNjsKICAgICAgICAgICAgICAgIHBbb2Zmc2V0ICsgMl0gJj0gdmFsdWUgPj4gODsKICAgICAgICAgICAgICAgIHBbb2Zmc2V0ICsgM10gJj0gdmFsdWU7CiNlbHNlCiAgICAgICAgICAgICAgICBwW29mZnNldF0gJj0gdmFsdWU7CiAgICAgICAgICAgICAgICBwW29mZnNldCArIDFdICY9IHZhbHVlID4+IDg7CiAgICAgICAgICAgICAgICBwW29mZnNldCArIDJdICY9IHZhbHVlID4+IDE2OwogICAgICAgICAgICAgICAgcFtvZmZzZXQgKyAzXSAmPSB2YWx1ZSA+PiAyNDsKI2VuZGlmCiAgICAgICAgICAgICAgICBwZmxhc2hfdXBkYXRlKHBmbCwgb2Zmc2V0LCA0KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBmbC0+c3RhdHVzID0gMHgwMCB8IH4odmFsdWUgJiAweDgwKTsKICAgICAgICAgICAgLyogTGV0J3MgcHJldGVuZCB3cml0ZSBpcyBpbW1lZGlhdGUgKi8KICAgICAgICAgICAgaWYgKHBmbC0+YnlwYXNzKQogICAgICAgICAgICAgICAgZ290byBkb19ieXBhc3M7CiAgICAgICAgICAgIGdvdG8gcmVzZXRfZmxhc2g7CiAgICAgICAgY2FzZSAweDkwOgogICAgICAgICAgICBpZiAocGZsLT5ieXBhc3MgJiYgY21kID09IDB4MDApIHsKICAgICAgICAgICAgICAgIC8qIFVubG9jayBieXBhc3MgcmVzZXQgKi8KICAgICAgICAgICAgICAgIGdvdG8gcmVzZXRfZmxhc2g7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogV2UgY2FuIGVudGVyIENGSSBxdWVyeSBtb2RlIGZyb20gYXV0b3NlbGVjdCBtb2RlICovCiAgICAgICAgICAgIGlmIChib2ZmID09IDB4NTUgJiYgY21kID09IDB4OTgpCiAgICAgICAgICAgICAgICBnb3RvIGVudGVyX0NGSV9tb2RlOwogICAgICAgICAgICAvKiBObyBicmVhayBoZXJlICovCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRFBSSU5URigiJXM6IGludmFsaWQgd3JpdGUgZm9yIGNvbW1hbmQgJTAyeFxuIiwKICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGZsLT5jbWQpOwogICAgICAgICAgICBnb3RvIHJlc2V0X2ZsYXNoOwogICAgICAgIH0KICAgIGNhc2UgNDoKICAgICAgICBzd2l0Y2ggKHBmbC0+Y21kKSB7CiAgICAgICAgY2FzZSAweEEwOgogICAgICAgICAgICAvKiBJZ25vcmUgd3JpdGVzIHdoaWxlIGZsYXNoIGRhdGEgd3JpdGUgaXMgb2NjdXJpbmcgKi8KICAgICAgICAgICAgLyogQXMgd2Ugc3VwcG9zZSB3cml0ZSBpcyBpbW1lZGlhdGUsIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgY2FzZSAweDgwOgogICAgICAgICAgICBnb3RvIGNoZWNrX3VubG9jazE7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLwogICAgICAgICAgICBEUFJJTlRGKCIlczogaW52YWxpZCBjb21tYW5kIHN0YXRlICUwMnggKHdjIDQpXG4iLAogICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwZmwtPmNtZCk7CiAgICAgICAgICAgIGdvdG8gcmVzZXRfZmxhc2g7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSA1OgogICAgICAgIHN3aXRjaCAoY21kKSB7CiAgICAgICAgY2FzZSAweDEwOgogICAgICAgICAgICBpZiAoYm9mZiAhPSAweDU1NSkgewogICAgICAgICAgICAgICAgRFBSSU5URigiJXM6IGNoaXAgZXJhc2U6IGludmFsaWQgYWRkcmVzcyAiIFRBUkdFVF9GTVRfbHggIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG9mZnNldCk7CiAgICAgICAgICAgICAgICBnb3RvIHJlc2V0X2ZsYXNoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIENoaXAgZXJhc2UgKi8KICAgICAgICAgICAgRFBSSU5URigiJXM6IHN0YXJ0IGNoaXAgZXJhc2VcbiIsIF9fZnVuY19fKTsKICAgICAgICAgICAgbWVtc2V0KHBmbC0+c3RvcmFnZSwgMHhGRiwgcGZsLT50b3RhbF9sZW4pOwogICAgICAgICAgICBwZmwtPnN0YXR1cyA9IDB4MDA7CiAgICAgICAgICAgIHBmbGFzaF91cGRhdGUocGZsLCAwLCBwZmwtPnRvdGFsX2xlbik7CiAgICAgICAgICAgIC8qIExldCdzIHdhaXQgNSBzZWNvbmRzIGJlZm9yZSBjaGlwIGVyYXNlIGlzIGRvbmUgKi8KICAgICAgICAgICAgcWVtdV9tb2RfdGltZXIocGZsLT50aW1lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcWVtdV9nZXRfY2xvY2sodm1fY2xvY2spICsgKHRpY2tzX3Blcl9zZWMgKiA1KSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgzMDoKICAgICAgICAgICAgLyogU2VjdG9yIGVyYXNlICovCiAgICAgICAgICAgIHAgPSBwZmwtPnN0b3JhZ2U7CiAgICAgICAgICAgIG9mZnNldCAmPSB+KHBmbC0+c2VjdG9yX2xlbiAtIDEpOwogICAgICAgICAgICBEUFJJTlRGKCIlczogc3RhcnQgc2VjdG9yIGVyYXNlIGF0ICIgVEFSR0VUX0ZNVF9seCAiXG4iLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOwogICAgICAgICAgICBtZW1zZXQocCArIG9mZnNldCwgMHhGRiwgcGZsLT5zZWN0b3JfbGVuKTsKICAgICAgICAgICAgcGZsYXNoX3VwZGF0ZShwZmwsIG9mZnNldCwgcGZsLT5zZWN0b3JfbGVuKTsKICAgICAgICAgICAgcGZsLT5zdGF0dXMgPSAweDAwOwogICAgICAgICAgICAvKiBMZXQncyB3YWl0IDEvMiBzZWNvbmQgYmVmb3JlIHNlY3RvciBlcmFzZSBpcyBkb25lICovCiAgICAgICAgICAgIHFlbXVfbW9kX3RpbWVyKHBmbC0+dGltZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHFlbXVfZ2V0X2Nsb2NrKHZtX2Nsb2NrKSArICh0aWNrc19wZXJfc2VjIC8gMikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBEUFJJTlRGKCIlczogaW52YWxpZCBjb21tYW5kICUwMnggKHdjIDUpXG4iLCBfX2Z1bmNfXywgY21kKTsKICAgICAgICAgICAgZ290byByZXNldF9mbGFzaDsKICAgICAgICB9CiAgICAgICAgcGZsLT5jbWQgPSBjbWQ7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDY6CiAgICAgICAgc3dpdGNoIChwZmwtPmNtZCkgewogICAgICAgIGNhc2UgMHgxMDoKICAgICAgICAgICAgLyogSWdub3JlIHdyaXRlcyBkdXJpbmcgY2hpcCBlcmFzZSAqLwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgY2FzZSAweDMwOgogICAgICAgICAgICAvKiBJZ25vcmUgd3JpdGVzIGR1cmluZyBzZWN0b3IgZXJhc2UgKi8KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KICAgICAgICAgICAgRFBSSU5URigiJXM6IGludmFsaWQgY29tbWFuZCBzdGF0ZSAlMDJ4ICh3YyA2KVxuIiwKICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGZsLT5jbWQpOwogICAgICAgICAgICBnb3RvIHJlc2V0X2ZsYXNoOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIGNhc2UgNzogLyogU3BlY2lhbCB2YWx1ZSBmb3IgQ0ZJIHF1ZXJpZXMgKi8KICAgICAgICBEUFJJTlRGKCIlczogaW52YWxpZCB3cml0ZSBpbiBDRkkgcXVlcnkgbW9kZVxuIiwgX19mdW5jX18pOwogICAgICAgIGdvdG8gcmVzZXRfZmxhc2g7CiAgICBkZWZhdWx0OgogICAgICAgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KICAgICAgICBEUFJJTlRGKCIlczogaW52YWxpZCB3cml0ZSBzdGF0ZSAod2MgNylcbiIsICBfX2Z1bmNfXyk7CiAgICAgICAgZ290byByZXNldF9mbGFzaDsKICAgIH0KICAgIHBmbC0+d2N5Y2xlKys7CgogICAgcmV0dXJuOwoKICAgIC8qIFJlc2V0IGZsYXNoICovCiByZXNldF9mbGFzaDoKICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkocGZsLT5iYXNlLCBwZmwtPnRvdGFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZsLT5vZmYgfCBJT19NRU1fUk9NRCB8IHBmbC0+ZmxfbWVtKTsKICAgIHBmbC0+YnlwYXNzID0gMDsKICAgIHBmbC0+d2N5Y2xlID0gMDsKICAgIHBmbC0+Y21kID0gMDsKICAgIHJldHVybjsKCiBkb19ieXBhc3M6CiAgICBwZmwtPndjeWNsZSA9IDI7CiAgICBwZmwtPmNtZCA9IDA7CiAgICByZXR1cm47Cn0KCgpzdGF0aWMgdWludDMyX3QgcGZsYXNoX3JlYWRiICh2b2lkICpvcGFxdWUsIHRhcmdldF9waHlzX2FkZHJfdCBhZGRyKQp7CiAgICByZXR1cm4gcGZsYXNoX3JlYWQob3BhcXVlLCBhZGRyLCAxKTsKfQoKc3RhdGljIHVpbnQzMl90IHBmbGFzaF9yZWFkdyAodm9pZCAqb3BhcXVlLCB0YXJnZXRfcGh5c19hZGRyX3QgYWRkcikKewogICAgcGZsYXNoX3QgKnBmbCA9IG9wYXF1ZTsKCiAgICByZXR1cm4gcGZsYXNoX3JlYWQocGZsLCBhZGRyLCAyKTsKfQoKc3RhdGljIHVpbnQzMl90IHBmbGFzaF9yZWFkbCAodm9pZCAqb3BhcXVlLCB0YXJnZXRfcGh5c19hZGRyX3QgYWRkcikKewogICAgcGZsYXNoX3QgKnBmbCA9IG9wYXF1ZTsKCiAgICByZXR1cm4gcGZsYXNoX3JlYWQocGZsLCBhZGRyLCA0KTsKfQoKc3RhdGljIHZvaWQgcGZsYXNoX3dyaXRlYiAodm9pZCAqb3BhcXVlLCB0YXJnZXRfcGh5c19hZGRyX3QgYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpCnsKICAgIHBmbGFzaF93cml0ZShvcGFxdWUsIGFkZHIsIHZhbHVlLCAxKTsKfQoKc3RhdGljIHZvaWQgcGZsYXNoX3dyaXRldyAodm9pZCAqb3BhcXVlLCB0YXJnZXRfcGh5c19hZGRyX3QgYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpCnsKICAgIHBmbGFzaF90ICpwZmwgPSBvcGFxdWU7CgogICAgcGZsYXNoX3dyaXRlKHBmbCwgYWRkciwgdmFsdWUsIDIpOwp9CgpzdGF0aWMgdm9pZCBwZmxhc2hfd3JpdGVsICh2b2lkICpvcGFxdWUsIHRhcmdldF9waHlzX2FkZHJfdCBhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkKewogICAgcGZsYXNoX3QgKnBmbCA9IG9wYXF1ZTsKCiAgICBwZmxhc2hfd3JpdGUocGZsLCBhZGRyLCB2YWx1ZSwgNCk7Cn0KCnN0YXRpYyBDUFVXcml0ZU1lbW9yeUZ1bmMgKnBmbGFzaF93cml0ZV9vcHNbXSA9IHsKICAgICZwZmxhc2hfd3JpdGViLAogICAgJnBmbGFzaF93cml0ZXcsCiAgICAmcGZsYXNoX3dyaXRlbCwKfTsKCnN0YXRpYyBDUFVSZWFkTWVtb3J5RnVuYyAqcGZsYXNoX3JlYWRfb3BzW10gPSB7CiAgICAmcGZsYXNoX3JlYWRiLAogICAgJnBmbGFzaF9yZWFkdywKICAgICZwZmxhc2hfcmVhZGwsCn07CgovKiBDb3VudCB0cmFpbGluZyB6ZXJvZXMgb2YgYSAzMiBiaXRzIHF1YW50aXR5ICovCnN0YXRpYyBpbnQgY3R6MzIgKHVpbnQzMl90IG4pCnsKICAgIGludCByZXQ7CgogICAgcmV0ID0gMDsKICAgIGlmICghKG4gJiAweEZGRkYpKSB7CiAgICAgICAgcmV0ICs9IDE2OwogICAgICAgIG4gPSBuID4+IDE2OwogICAgfQogICAgaWYgKCEobiAmIDB4RkYpKSB7CiAgICAgICAgcmV0ICs9IDg7CiAgICAgICAgbiA9IG4gPj4gODsKICAgIH0KICAgIGlmICghKG4gJiAweEYpKSB7CiAgICAgICAgcmV0ICs9IDQ7CiAgICAgICAgbiA9IG4gPj4gNDsKICAgIH0KICAgIGlmICghKG4gJiAweDMpKSB7CiAgICAgICAgcmV0ICs9IDI7CiAgICAgICAgbiA9IG4gPj4gMjsKICAgIH0KICAgIGlmICghKG4gJiAweDEpKSB7CiAgICAgICAgcmV0Kys7CiAgICAgICAgbiA9IG4gPj4gMTsKICAgIH0KI2lmIDAgLyogVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGFzIG4gaXMgbmV2ZXIgMCAqLwogICAgaWYgKCFuKQogICAgICAgIHJldCsrOwojZW5kaWYKCiAgICByZXR1cm4gcmV0Owp9CgpwZmxhc2hfdCAqcGZsYXNoX2NmaTAyX3JlZ2lzdGVyKHRhcmdldF9waHlzX2FkZHJfdCBiYXNlLCByYW1fYWRkcl90IG9mZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0RyaXZlclN0YXRlICpicywgdWludDMyX3Qgc2VjdG9yX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfYmxvY3MsIGludCB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpZDAsIHVpbnQxNl90IGlkMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpZDIsIHVpbnQxNl90IGlkMykKewogICAgcGZsYXNoX3QgKnBmbDsKICAgIGludDMyX3QgdG90YWxfbGVuOwoKICAgIHRvdGFsX2xlbiA9IHNlY3Rvcl9sZW4gKiBuYl9ibG9jczsKICAgIC8qIFhYWDogdG8gYmUgZml4ZWQgKi8KI2lmIDAKICAgIGlmICh0b3RhbF9sZW4gIT0gKDggKiAxMDI0ICogMTAyNCkgJiYgdG90YWxfbGVuICE9ICgxNiAqIDEwMjQgKiAxMDI0KSAmJgogICAgICAgIHRvdGFsX2xlbiAhPSAoMzIgKiAxMDI0ICogMTAyNCkgJiYgdG90YWxfbGVuICE9ICg2NCAqIDEwMjQgKiAxMDI0KSkKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICBwZmwgPSBxZW11X21hbGxvY3ooc2l6ZW9mKHBmbGFzaF90KSk7CiAgICBpZiAocGZsID09IE5VTEwpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBwZmwtPnN0b3JhZ2UgPSBwaHlzX3JhbV9iYXNlICsgb2ZmOwogICAgcGZsLT5mbF9tZW0gPSBjcHVfcmVnaXN0ZXJfaW9fbWVtb3J5KDAsIHBmbGFzaF9yZWFkX29wcywgcGZsYXNoX3dyaXRlX29wcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZmwpOwogICAgcGZsLT5vZmYgPSBvZmY7CiAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KGJhc2UsIHRvdGFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmIHwgcGZsLT5mbF9tZW0gfCBJT19NRU1fUk9NRCk7CiAgICBwZmwtPmJzID0gYnM7CiAgICBpZiAocGZsLT5icykgewogICAgICAgIC8qIHJlYWQgdGhlIGluaXRpYWwgZmxhc2ggY29udGVudCAqLwogICAgICAgIGJkcnZfcmVhZChwZmwtPmJzLCAwLCBwZmwtPnN0b3JhZ2UsIHRvdGFsX2xlbiA+PiA5KTsKICAgIH0KI2lmIDAgLyogWFhYOiB0aGVyZSBzaG91bGQgYmUgYSBiaXQgdG8gc2V0IHVwIHJlYWQtb25seSwKICAgICAgICogICAgICB0aGUgc2FtZSB3YXkgdGhlIGhhcmR3YXJlIGRvZXMgKHdpdGggV1AgcGluKS4KICAgICAgICovCiAgICBwZmwtPnJvID0gMTsKI2Vsc2UKICAgIHBmbC0+cm8gPSAwOwojZW5kaWYKICAgIHBmbC0+dGltZXIgPSBxZW11X25ld190aW1lcih2bV9jbG9jaywgcGZsYXNoX3RpbWVyLCBwZmwpOwogICAgcGZsLT5iYXNlID0gYmFzZTsKICAgIHBmbC0+c2VjdG9yX2xlbiA9IHNlY3Rvcl9sZW47CiAgICBwZmwtPnRvdGFsX2xlbiA9IHRvdGFsX2xlbjsKICAgIHBmbC0+d2lkdGggPSB3aWR0aDsKICAgIHBmbC0+d2N5Y2xlID0gMDsKICAgIHBmbC0+Y21kID0gMDsKICAgIHBmbC0+c3RhdHVzID0gMDsKICAgIHBmbC0+aWRlbnRbMF0gPSBpZDA7CiAgICBwZmwtPmlkZW50WzFdID0gaWQxOwogICAgcGZsLT5pZGVudFsyXSA9IGlkMjsKICAgIHBmbC0+aWRlbnRbM10gPSBpZDM7CiAgICAvKiBIYXJkY29kZWQgQ0ZJIHRhYmxlIChtb3N0bHkgZnJvbSBTRzI5IFNwYW5zaW9uIGZsYXNoKSAqLwogICAgcGZsLT5jZmlfbGVuID0gMHg1MjsKICAgIC8qIFN0YW5kYXJkICJRUlkiIHN0cmluZyAqLwogICAgcGZsLT5jZmlfdGFibGVbMHgxMF0gPSAnUSc7CiAgICBwZmwtPmNmaV90YWJsZVsweDExXSA9ICdSJzsKICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MTJdID0gJ1knOwogICAgLyogQ29tbWFuZCBzZXQgKEFNRC9GdWppdHN1KSAqLwogICAgcGZsLT5jZmlfdGFibGVbMHgxM10gPSAweDAyOwogICAgcGZsLT5jZmlfdGFibGVbMHgxNF0gPSAweDAwOwogICAgLyogUHJpbWFyeSBleHRlbmRlZCB0YWJsZSBhZGRyZXNzIChub25lKSAqLwogICAgcGZsLT5jZmlfdGFibGVbMHgxNV0gPSAweDAwOwogICAgcGZsLT5jZmlfdGFibGVbMHgxNl0gPSAweDAwOwogICAgLyogQWx0ZXJuYXRlIGNvbW1hbmQgc2V0IChub25lKSAqLwogICAgcGZsLT5jZmlfdGFibGVbMHgxN10gPSAweDAwOwogICAgcGZsLT5jZmlfdGFibGVbMHgxOF0gPSAweDAwOwogICAgLyogQWx0ZXJuYXRlIGV4dGVuZGVkIHRhYmxlIChub25lKSAqLwogICAgcGZsLT5jZmlfdGFibGVbMHgxOV0gPSAweDAwOwogICAgcGZsLT5jZmlfdGFibGVbMHgxQV0gPSAweDAwOwogICAgLyogVmNjIG1pbiAqLwogICAgcGZsLT5jZmlfdGFibGVbMHgxQl0gPSAweDI3OwogICAgLyogVmNjIG1heCAqLwogICAgcGZsLT5jZmlfdGFibGVbMHgxQ10gPSAweDM2OwogICAgLyogVnBwIG1pbiAobm8gVnBwIHBpbikgKi8KICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MURdID0gMHgwMDsKICAgIC8qIFZwcCBtYXggKG5vIFZwcCBwaW4pICovCiAgICBwZmwtPmNmaV90YWJsZVsweDFFXSA9IDB4MDA7CiAgICAvKiBSZXNlcnZlZCAqLwogICAgcGZsLT5jZmlfdGFibGVbMHgxRl0gPSAweDA3OwogICAgLyogVGltZW91dCBmb3IgbWluIHNpemUgYnVmZmVyIHdyaXRlICgxNiC1cykgKi8KICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MjBdID0gMHgwNDsKICAgIC8qIFR5cGljYWwgdGltZW91dCBmb3IgYmxvY2sgZXJhc2UgKDUxMiBtcykgKi8KICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MjFdID0gMHgwOTsKICAgIC8qIFR5cGljYWwgdGltZW91dCBmb3IgZnVsbCBjaGlwIGVyYXNlICg0MDk2IG1zKSAqLwogICAgcGZsLT5jZmlfdGFibGVbMHgyMl0gPSAweDBDOwogICAgLyogUmVzZXJ2ZWQgKi8KICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MjNdID0gMHgwMTsKICAgIC8qIE1heCB0aW1lb3V0IGZvciBidWZmZXIgd3JpdGUgKi8KICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MjRdID0gMHgwNDsKICAgIC8qIE1heCB0aW1lb3V0IGZvciBibG9jayBlcmFzZSAqLwogICAgcGZsLT5jZmlfdGFibGVbMHgyNV0gPSAweDBBOwogICAgLyogTWF4IHRpbWVvdXQgZm9yIGNoaXAgZXJhc2UgKi8KICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MjZdID0gMHgwRDsKICAgIC8qIERldmljZSBzaXplICovCiAgICBwZmwtPmNmaV90YWJsZVsweDI3XSA9IGN0ejMyKHRvdGFsX2xlbikgKyAxOwogICAgLyogRmxhc2ggZGV2aWNlIGludGVyZmFjZSAoOCAmIDE2IGJpdHMpICovCiAgICBwZmwtPmNmaV90YWJsZVsweDI4XSA9IDB4MDI7CiAgICBwZmwtPmNmaV90YWJsZVsweDI5XSA9IDB4MDA7CiAgICAvKiBNYXggbnVtYmVyIG9mIGJ5dGVzIGluIG11bHRpLWJ5dGVzIHdyaXRlICovCiAgICAvKiBYWFg6IGRpc2FibGUgYnVmZmVyZWQgd3JpdGUgYXMgaXQncyBub3Qgc3VwcG9ydGVkICovCiAgICAvLyAgICBwZmwtPmNmaV90YWJsZVsweDJBXSA9IDB4MDU7CiAgICBwZmwtPmNmaV90YWJsZVsweDJBXSA9IDB4MDA7CiAgICBwZmwtPmNmaV90YWJsZVsweDJCXSA9IDB4MDA7CiAgICAvKiBOdW1iZXIgb2YgZXJhc2UgYmxvY2sgcmVnaW9ucyAodW5pZm9ybSkgKi8KICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MkNdID0gMHgwMTsKICAgIC8qIEVyYXNlIGJsb2NrIHJlZ2lvbiAxICovCiAgICBwZmwtPmNmaV90YWJsZVsweDJEXSA9IG5iX2Jsb2NzIC0gMTsKICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MkVdID0gKG5iX2Jsb2NzIC0gMSkgPj4gODsKICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MkZdID0gc2VjdG9yX2xlbiA+PiA4OwogICAgcGZsLT5jZmlfdGFibGVbMHgzMF0gPSBzZWN0b3JfbGVuID4+IDE2OwoKICAgIHJldHVybiBwZmw7Cn0K