LyoKICoJVmlkZW8gZm9yIExpbnV4IFR3bwogKgogKglBIGdlbmVyaWMgdmlkZW8gZGV2aWNlIGludGVyZmFjZSBmb3IgdGhlIExJTlVYIG9wZXJhdGluZyBzeXN0ZW0KICoJdXNpbmcgYSBzZXQgb2YgZGV2aWNlIHN0cnVjdHVyZXMvdmVjdG9ycyBmb3IgbG93IGxldmVsIG9wZXJhdGlvbnMuCiAqCiAqCVRoaXMgZmlsZSByZXBsYWNlcyB0aGUgdmlkZW9kZXYuYyBmaWxlIHRoYXQgY29tZXMgd2l0aCB0aGUKICoJcmVndWxhciBrZXJuZWwgZGlzdHJpYnV0aW9uLgogKgogKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBBdXRob3I6CUJpbGwgRGlya3MgPGJpbGxAdGhlZGlya3Mub3JnPgogKgkJYmFzZWQgb24gY29kZSBieSBBbGFuIENveCwgPGFsYW5AY3ltcnUubmV0PgogKgogKi8KCi8qCiAqIFZpZGVvIGNhcHR1cmUgaW50ZXJmYWNlIGZvciBMaW51eAogKgogKglBIGdlbmVyaWMgdmlkZW8gZGV2aWNlIGludGVyZmFjZSBmb3IgdGhlIExJTlVYIG9wZXJhdGluZyBzeXN0ZW0KICoJdXNpbmcgYSBzZXQgb2YgZGV2aWNlIHN0cnVjdHVyZXMvdmVjdG9ycyBmb3IgbG93IGxldmVsIG9wZXJhdGlvbnMuCiAqCiAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBBdXRob3I6CUFsYW4gQ294LCA8YWxhbkByZWRoYXQuY29tPgogKgogKiBGaXhlczoKICovCgovKgogKiBWaWRlbzRsaW51eCAxLzIgaW50ZWdyYXRpb24gYnkgSnVzdGluIFNjaG9lbWFuCiAqIDxqdXN0aW5Ac3VudGlnZXIuZWUudXAuYWMuemE+CiAqIDIuNCBQUk9DRlMgc3VwcG9ydCBwb3J0ZWQgZnJvbSAyLjQga2VybmVscyBieQogKiAgSfFha2kgR2FyY+1hIEV0eGViYXJyaWEgPGdhcmV0eGVAZXVza2FsbmV0Lm5ldD4KICogTWFrZWZpbGUgZml4IGJ5ICJXLiBNaWNoYWVsIFBldHVsbG8iIDxtaWtlQGZseW4ub3JnPgogKiAyLjQgZGV2ZnMgc3VwcG9ydCBwb3J0ZWQgZnJvbSAyLjQga2VybmVscyBieQogKiAgRGFuIE1lcmlsbGF0IDxkYW5AbWVyaWxsYXQub3JnPgogKiBBZGRlZCBHZXJkIEtub3JycyB2NGwxIGVuaGFuY2VtZW50cyAoSnVzdGluIFNjaG9lbWFuKQogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiNpbmNsdWRlIDxsaW51eC9tbS5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvaTJjLmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgojaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CiNkZWZpbmUgX19PTERfVklESU9DXyAvKiBUbyBhbGxvdyBmaXhpbmcgb2xkIGNhbGxzKi8KI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CgojaWZkZWYgQ09ORklHX0tNT0QKI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KI2VuZGlmCgojaWYgZGVmaW5lZChDT05GSUdfVVNUKSB8fCBkZWZpbmVkKENPTkZJR19VU1RfTU9EVUxFKQojaW5jbHVkZSA8bGludXgvdXN0Lmg+CiNlbmRpZgoKCiNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgoKTU9EVUxFX0FVVEhPUigiQmlsbCBEaXJrcywgSnVzdGluIFNjaG9lbWFuLCBHZXJkIEtub3JyIik7Ck1PRFVMRV9ERVNDUklQVElPTigibWlzYyBoZWxwZXIgZnVuY3Rpb25zIGZvciB2NGwyIGRldmljZSBkcml2ZXJzIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCi8qCiAqCiAqCVYgNCBMIDIgICBEIFIgSSBWIEUgUiAgIEggRSBMIFAgRSBSICAgQSBQIEkKICoKICovCgovKgogKiAgVmlkZW8gU3RhbmRhcmQgT3BlcmF0aW9ucyAoY29udHJpYnV0ZWQgYnkgTWljaGFlbCBTY2hpbWVrKQogKi8KCgpjaGFyICp2NGwyX25vcm1fdG9fbmFtZSh2NGwyX3N0ZF9pZCBpZCkKewoJY2hhciAqbmFtZTsKCXUzMiBteWlkID0gaWQ7CgoJLyogSEFDSzogcHBjMzIgYXJjaGl0ZWN0dXJlIGRvZXNuJ3QgaGF2ZSBfX3VjbXBkaTIgZnVuY3Rpb24gdG8gaGFuZGxlCgkgICA2NCBiaXQgY29tcGFyYXRpb25zLiBTbywgb24gdGhhdCBhcmNoaXRlY3R1cmUsIHdpdGggc29tZSBnY2MgdmFyaWFudHMsCgkgICBjb21waWxhdGlvbiBmYWlscy4gQ3VycmVudGx5LCB0aGUgbWF4IHZhbHVlIGlzIDMwYml0IHdpZGUuCgkgKi8KCUJVR19PTihteWlkICE9IGlkKTsKCglzd2l0Y2ggKG15aWQpIHsKCWNhc2UgVjRMMl9TVERfUEFMOgoJCW5hbWU9IlBBTCI7CQlicmVhazsKCWNhc2UgVjRMMl9TVERfUEFMX0JHOgoJCW5hbWU9IlBBTC1CRyI7CQlicmVhazsKCWNhc2UgVjRMMl9TVERfUEFMX0RLOgoJCW5hbWU9IlBBTC1ESyI7CQlicmVhazsKCWNhc2UgVjRMMl9TVERfUEFMX0I6CgkJbmFtZT0iUEFMLUIiOwkJYnJlYWs7CgljYXNlIFY0TDJfU1REX1BBTF9CMToKCQluYW1lPSJQQUwtQjEiOwkJYnJlYWs7CgljYXNlIFY0TDJfU1REX1BBTF9HOgoJCW5hbWU9IlBBTC1HIjsJCWJyZWFrOwoJY2FzZSBWNEwyX1NURF9QQUxfSDoKCQluYW1lPSJQQUwtSCI7CQlicmVhazsKCWNhc2UgVjRMMl9TVERfUEFMX0k6CgkJbmFtZT0iUEFMLUkiOwkJYnJlYWs7CgljYXNlIFY0TDJfU1REX1BBTF9EOgoJCW5hbWU9IlBBTC1EIjsJCWJyZWFrOwoJY2FzZSBWNEwyX1NURF9QQUxfRDE6CgkJbmFtZT0iUEFMLUQxIjsJCWJyZWFrOwoJY2FzZSBWNEwyX1NURF9QQUxfSzoKCQluYW1lPSJQQUwtSyI7CQlicmVhazsKCWNhc2UgVjRMMl9TVERfUEFMX006CgkJbmFtZT0iUEFMLU0iOwkJYnJlYWs7CgljYXNlIFY0TDJfU1REX1BBTF9OOgoJCW5hbWU9IlBBTC1OIjsJCWJyZWFrOwoJY2FzZSBWNEwyX1NURF9QQUxfTmM6CgkJbmFtZT0iUEFMLU5jIjsJCWJyZWFrOwoJY2FzZSBWNEwyX1NURF9QQUxfNjA6CgkJbmFtZT0iUEFMLTYwIjsJCWJyZWFrOwoJY2FzZSBWNEwyX1NURF9OVFNDOgoJCW5hbWU9Ik5UU0MiOwkJYnJlYWs7CgljYXNlIFY0TDJfU1REX05UU0NfTToKCQluYW1lPSJOVFNDLU0iOwkJYnJlYWs7CgljYXNlIFY0TDJfU1REX05UU0NfTV9KUDoKCQluYW1lPSJOVFNDLU0tSlAiOwlicmVhazsKCWNhc2UgVjRMMl9TVERfTlRTQ180NDM6CgkJbmFtZT0iTlRTQy00NDMiOwlicmVhazsKCWNhc2UgVjRMMl9TVERfTlRTQ19NX0tSOgoJCW5hbWU9Ik5UU0MtTS1LUiI7CWJyZWFrOwoJY2FzZSBWNEwyX1NURF9TRUNBTToKCQluYW1lPSJTRUNBTSI7CQlicmVhazsKCWNhc2UgVjRMMl9TVERfU0VDQU1fREs6CgkJbmFtZT0iU0VDQU0tREsiOwlicmVhazsKCWNhc2UgVjRMMl9TVERfU0VDQU1fQjoKCQluYW1lPSJTRUNBTS1CIjsJCWJyZWFrOwoJY2FzZSBWNEwyX1NURF9TRUNBTV9EOgoJCW5hbWU9IlNFQ0FNLUQiOwkJYnJlYWs7CgljYXNlIFY0TDJfU1REX1NFQ0FNX0c6CgkJbmFtZT0iU0VDQU0tRyI7CQlicmVhazsKCWNhc2UgVjRMMl9TVERfU0VDQU1fSDoKCQluYW1lPSJTRUNBTS1IIjsJCWJyZWFrOwoJY2FzZSBWNEwyX1NURF9TRUNBTV9LOgoJCW5hbWU9IlNFQ0FNLUsiOwkJYnJlYWs7CgljYXNlIFY0TDJfU1REX1NFQ0FNX0sxOgoJCW5hbWU9IlNFQ0FNLUsxIjsJYnJlYWs7CgljYXNlIFY0TDJfU1REX1NFQ0FNX0w6CgkJbmFtZT0iU0VDQU0tTCI7CQlicmVhazsKCWNhc2UgVjRMMl9TVERfU0VDQU1fTEM6CgkJbmFtZT0iU0VDQU0tTEMiOwlicmVhazsKCWRlZmF1bHQ6CgkJbmFtZT0iVW5rbm93biI7CQlicmVhazsKCX0KCglyZXR1cm4gbmFtZTsKfQoKLyogRmlsbCBpbiB0aGUgZmllbGRzIG9mIGEgdjRsMl9zdGFuZGFyZCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIHRoZQogICAnaWQnIGFuZCAndHJhbnNtaXNzaW9uJyBwYXJhbWV0ZXJzLiAgUmV0dXJucyBuZWdhdGl2ZSBvbiBlcnJvci4gICovCmludCB2NGwyX3ZpZGVvX3N0ZF9jb25zdHJ1Y3Qoc3RydWN0IHY0bDJfc3RhbmRhcmQgKnZzLAoJCQkgICAgIGludCBpZCwgY2hhciAqbmFtZSkKewoJdTMyIGluZGV4ID0gdnMtPmluZGV4OwoKCW1lbXNldCh2cywgMCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3N0YW5kYXJkKSk7Cgl2cy0+aW5kZXggPSBpbmRleDsKCXZzLT5pZCAgICA9IGlkOwoJaWYgKGlkICYgVjRMMl9TVERfNTI1XzYwKSB7CgkJdnMtPmZyYW1lcGVyaW9kLm51bWVyYXRvciA9IDEwMDE7CgkJdnMtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0gMzAwMDA7CgkJdnMtPmZyYW1lbGluZXMgPSA1MjU7Cgl9IGVsc2UgewoJCXZzLT5mcmFtZXBlcmlvZC5udW1lcmF0b3IgPSAxOwoJCXZzLT5mcmFtZXBlcmlvZC5kZW5vbWluYXRvciA9IDI1OwoJCXZzLT5mcmFtZWxpbmVzID0gNjI1OwoJfQoJc3RybGNweSh2cy0+bmFtZSxuYW1lLHNpemVvZih2cy0+bmFtZSkpOwoJcmV0dXJuIDA7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIHByaW9yaXR5IGhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojZGVmaW5lIFY0TDJfUFJJT19WQUxJRCh2YWwpICh2YWwgPT0gVjRMMl9QUklPUklUWV9CQUNLR1JPVU5EICAgfHwgXAoJCQkgICAgICB2YWwgPT0gVjRMMl9QUklPUklUWV9JTlRFUkFDVElWRSAgfHwgXAoJCQkgICAgICB2YWwgPT0gVjRMMl9QUklPUklUWV9SRUNPUkQpCgppbnQgdjRsMl9wcmlvX2luaXQoc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsKQp7CgltZW1zZXQoZ2xvYmFsLDAsc2l6ZW9mKCpnbG9iYWwpKTsKCXJldHVybiAwOwp9CgppbnQgdjRsMl9wcmlvX2NoYW5nZShzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlICpnbG9iYWwsIGVudW0gdjRsMl9wcmlvcml0eSAqbG9jYWwsCgkJICAgICBlbnVtIHY0bDJfcHJpb3JpdHkgbmV3KQp7CglpZiAoIVY0TDJfUFJJT19WQUxJRChuZXcpKQoJCXJldHVybiAtRUlOVkFMOwoJaWYgKCpsb2NhbCA9PSBuZXcpCgkJcmV0dXJuIDA7CgoJYXRvbWljX2luYygmZ2xvYmFsLT5wcmlvc1tuZXddKTsKCWlmIChWNEwyX1BSSU9fVkFMSUQoKmxvY2FsKSkKCQlhdG9taWNfZGVjKCZnbG9iYWwtPnByaW9zWypsb2NhbF0pOwoJKmxvY2FsID0gbmV3OwoJcmV0dXJuIDA7Cn0KCmludCB2NGwyX3ByaW9fb3BlbihzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlICpnbG9iYWwsIGVudW0gdjRsMl9wcmlvcml0eSAqbG9jYWwpCnsKCXJldHVybiB2NGwyX3ByaW9fY2hhbmdlKGdsb2JhbCxsb2NhbCxWNEwyX1BSSU9SSVRZX0RFRkFVTFQpOwp9CgppbnQgdjRsMl9wcmlvX2Nsb3NlKHN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgKmdsb2JhbCwgZW51bSB2NGwyX3ByaW9yaXR5ICpsb2NhbCkKewoJaWYgKFY0TDJfUFJJT19WQUxJRCgqbG9jYWwpKQoJCWF0b21pY19kZWMoJmdsb2JhbC0+cHJpb3NbKmxvY2FsXSk7CglyZXR1cm4gMDsKfQoKZW51bSB2NGwyX3ByaW9yaXR5IHY0bDJfcHJpb19tYXgoc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsKQp7CglpZiAoYXRvbWljX3JlYWQoJmdsb2JhbC0+cHJpb3NbVjRMMl9QUklPUklUWV9SRUNPUkRdKSA+IDApCgkJcmV0dXJuIFY0TDJfUFJJT1JJVFlfUkVDT1JEOwoJaWYgKGF0b21pY19yZWFkKCZnbG9iYWwtPnByaW9zW1Y0TDJfUFJJT1JJVFlfSU5URVJBQ1RJVkVdKSA+IDApCgkJcmV0dXJuIFY0TDJfUFJJT1JJVFlfSU5URVJBQ1RJVkU7CglpZiAoYXRvbWljX3JlYWQoJmdsb2JhbC0+cHJpb3NbVjRMMl9QUklPUklUWV9CQUNLR1JPVU5EXSkgPiAwKQoJCXJldHVybiBWNEwyX1BSSU9SSVRZX0JBQ0tHUk9VTkQ7CglyZXR1cm4gVjRMMl9QUklPUklUWV9VTlNFVDsKfQoKaW50IHY0bDJfcHJpb19jaGVjayhzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlICpnbG9iYWwsIGVudW0gdjRsMl9wcmlvcml0eSAqbG9jYWwpCnsKCWlmICgqbG9jYWwgPCB2NGwyX3ByaW9fbWF4KGdsb2JhbCkpCgkJcmV0dXJuIC1FQlVTWTsKCXJldHVybiAwOwp9CgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogc29tZSBhcnJheXMgZm9yIHByZXR0eS1wcmludGluZyBkZWJ1ZyBtZXNzYWdlcyBvZiBlbnVtIHR5cGVzICAgICAgKi8KCmNoYXIgKnY0bDJfZmllbGRfbmFtZXNbXSA9IHsKCVtWNEwyX0ZJRUxEX0FOWV0gICAgICAgID0gImFueSIsCglbVjRMMl9GSUVMRF9OT05FXSAgICAgICA9ICJub25lIiwKCVtWNEwyX0ZJRUxEX1RPUF0gICAgICAgID0gInRvcCIsCglbVjRMMl9GSUVMRF9CT1RUT01dICAgICA9ICJib3R0b20iLAoJW1Y0TDJfRklFTERfSU5URVJMQUNFRF0gPSAiaW50ZXJsYWNlZCIsCglbVjRMMl9GSUVMRF9TRVFfVEJdICAgICA9ICJzZXEtdGIiLAoJW1Y0TDJfRklFTERfU0VRX0JUXSAgICAgPSAic2VxLWJ0IiwKCVtWNEwyX0ZJRUxEX0FMVEVSTkFURV0gID0gImFsdGVybmF0ZSIsCn07CgpjaGFyICp2NGwyX3R5cGVfbmFtZXNbXSA9IHsKCVtWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVdICAgICAgPSAidmlkZW8tY2FwIiwKCVtWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVldICAgICAgPSAidmlkZW8tb3ZlciIsCglbVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRdICAgICAgID0gInZpZGVvLW91dCIsCglbVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRV0gICAgICAgID0gInZiaS1jYXAiLAoJW1Y0TDJfQlVGX1RZUEVfVkJJX09VVFBVVF0gICAgICAgICA9ICJ2Ymktb3V0IiwKCVtWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRV0gPSAic2xpY2VkLXZiaS1jYXAiLAoJW1Y0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVRdICA9ICJzbGljZWMtdmJpLW91dCIsCn07CgoKI2RlZmluZSBwcnRfbmFtZXMoYSxhcnIpICgoKGEpPj0wKSYmKChhKTxBUlJBWV9TSVpFKGFycikpKT9hcnJbYV06InVua25vd24iCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogZGVidWcgaGVscCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUCnN0YXRpYyBjb25zdCBjaGFyICp2NGwxX2lvY3Rsc1tdID0gewoJW19JT0NfTlIoVklESU9DR0NBUCldICAgICAgID0gIlZJRElPQ0dDQVAiLAoJW19JT0NfTlIoVklESU9DR0NIQU4pXSAgICAgID0gIlZJRElPQ0dDSEFOIiwKCVtfSU9DX05SKFZJRElPQ1NDSEFOKV0gICAgICA9ICJWSURJT0NTQ0hBTiIsCglbX0lPQ19OUihWSURJT0NHVFVORVIpXSAgICAgPSAiVklESU9DR1RVTkVSIiwKCVtfSU9DX05SKFZJRElPQ1NUVU5FUildICAgICA9ICJWSURJT0NTVFVORVIiLAoJW19JT0NfTlIoVklESU9DR1BJQ1QpXSAgICAgID0gIlZJRElPQ0dQSUNUIiwKCVtfSU9DX05SKFZJRElPQ1NQSUNUKV0gICAgICA9ICJWSURJT0NTUElDVCIsCglbX0lPQ19OUihWSURJT0NDQVBUVVJFKV0gICAgPSAiVklESU9DQ0FQVFVSRSIsCglbX0lPQ19OUihWSURJT0NHV0lOKV0gICAgICAgPSAiVklESU9DR1dJTiIsCglbX0lPQ19OUihWSURJT0NTV0lOKV0gICAgICAgPSAiVklESU9DU1dJTiIsCglbX0lPQ19OUihWSURJT0NHRkJVRildICAgICAgPSAiVklESU9DR0ZCVUYiLAoJW19JT0NfTlIoVklESU9DU0ZCVUYpXSAgICAgID0gIlZJRElPQ1NGQlVGIiwKCVtfSU9DX05SKFZJRElPQ0tFWSldICAgICAgICA9ICJWSURJT0NLRVkiLAoJW19JT0NfTlIoVklESU9DR0ZSRVEpXSAgICAgID0gIlZJRElPQ0dGUkVRIiwKCVtfSU9DX05SKFZJRElPQ1NGUkVRKV0gICAgICA9ICJWSURJT0NTRlJFUSIsCglbX0lPQ19OUihWSURJT0NHQVVESU8pXSAgICAgPSAiVklESU9DR0FVRElPIiwKCVtfSU9DX05SKFZJRElPQ1NBVURJTyldICAgICA9ICJWSURJT0NTQVVESU8iLAoJW19JT0NfTlIoVklESU9DU1lOQyldICAgICAgID0gIlZJRElPQ1NZTkMiLAoJW19JT0NfTlIoVklESU9DTUNBUFRVUkUpXSAgID0gIlZJRElPQ01DQVBUVVJFIiwKCVtfSU9DX05SKFZJRElPQ0dNQlVGKV0gICAgICA9ICJWSURJT0NHTUJVRiIsCglbX0lPQ19OUihWSURJT0NHVU5JVCldICAgICAgPSAiVklESU9DR1VOSVQiLAoJW19JT0NfTlIoVklESU9DR0NBUFRVUkUpXSAgID0gIlZJRElPQ0dDQVBUVVJFIiwKCVtfSU9DX05SKFZJRElPQ1NDQVBUVVJFKV0gICA9ICJWSURJT0NTQ0FQVFVSRSIsCglbX0lPQ19OUihWSURJT0NTUExBWU1PREUpXSAgPSAiVklESU9DU1BMQVlNT0RFIiwKCVtfSU9DX05SKFZJRElPQ1NXUklURU1PREUpXSA9ICJWSURJT0NTV1JJVEVNT0RFIiwKCVtfSU9DX05SKFZJRElPQ0dQTEFZSU5GTyldICA9ICJWSURJT0NHUExBWUlORk8iLAoJW19JT0NfTlIoVklESU9DU01JQ1JPQ09ERSldID0gIlZJRElPQ1NNSUNST0NPREUiLAoJW19JT0NfTlIoVklESU9DR1ZCSUZNVCldICAgID0gIlZJRElPQ0dWQklGTVQiLAoJW19JT0NfTlIoVklESU9DU1ZCSUZNVCldICAgID0gIlZJRElPQ1NWQklGTVQiCn07CiNkZWZpbmUgVjRMMV9JT0NUTFMgQVJSQVlfU0laRSh2NGwxX2lvY3RscykKI2VuZGlmCgpzdGF0aWMgY29uc3QgY2hhciAqdjRsMl9pb2N0bHNbXSA9IHsKCVtfSU9DX05SKFZJRElPQ19RVUVSWUNBUCldICAgICAgICAgPSAiVklESU9DX1FVRVJZQ0FQIiwKCVtfSU9DX05SKFZJRElPQ19SRVNFUlZFRCldICAgICAgICAgPSAiVklESU9DX1JFU0VSVkVEIiwKCVtfSU9DX05SKFZJRElPQ19FTlVNX0ZNVCldICAgICAgICAgPSAiVklESU9DX0VOVU1fRk1UIiwKCVtfSU9DX05SKFZJRElPQ19HX0ZNVCldICAgICAgICAgICAgPSAiVklESU9DX0dfRk1UIiwKCVtfSU9DX05SKFZJRElPQ19TX0ZNVCldICAgICAgICAgICAgPSAiVklESU9DX1NfRk1UIiwKCVtfSU9DX05SKFZJRElPQ19HX01QRUdDT01QKV0gICAgICAgPSAiVklESU9DX0dfTVBFR0NPTVAiLAoJW19JT0NfTlIoVklESU9DX1NfTVBFR0NPTVApXSAgICAgICA9ICJWSURJT0NfU19NUEVHQ09NUCIsCglbX0lPQ19OUihWSURJT0NfUkVRQlVGUyldICAgICAgICAgID0gIlZJRElPQ19SRVFCVUZTIiwKCVtfSU9DX05SKFZJRElPQ19RVUVSWUJVRildICAgICAgICAgPSAiVklESU9DX1FVRVJZQlVGIiwKCVtfSU9DX05SKFZJRElPQ19HX0ZCVUYpXSAgICAgICAgICAgPSAiVklESU9DX0dfRkJVRiIsCglbX0lPQ19OUihWSURJT0NfU19GQlVGKV0gICAgICAgICAgID0gIlZJRElPQ19TX0ZCVUYiLAoJW19JT0NfTlIoVklESU9DX09WRVJMQVkpXSAgICAgICAgICA9ICJWSURJT0NfT1ZFUkxBWSIsCglbX0lPQ19OUihWSURJT0NfUUJVRildICAgICAgICAgICAgID0gIlZJRElPQ19RQlVGIiwKCVtfSU9DX05SKFZJRElPQ19EUUJVRildICAgICAgICAgICAgPSAiVklESU9DX0RRQlVGIiwKCVtfSU9DX05SKFZJRElPQ19TVFJFQU1PTildICAgICAgICAgPSAiVklESU9DX1NUUkVBTU9OIiwKCVtfSU9DX05SKFZJRElPQ19TVFJFQU1PRkYpXSAgICAgICAgPSAiVklESU9DX1NUUkVBTU9GRiIsCglbX0lPQ19OUihWSURJT0NfR19QQVJNKV0gICAgICAgICAgID0gIlZJRElPQ19HX1BBUk0iLAoJW19JT0NfTlIoVklESU9DX1NfUEFSTSldICAgICAgICAgICA9ICJWSURJT0NfU19QQVJNIiwKCVtfSU9DX05SKFZJRElPQ19HX1NURCldICAgICAgICAgICAgPSAiVklESU9DX0dfU1REIiwKCVtfSU9DX05SKFZJRElPQ19TX1NURCldICAgICAgICAgICAgPSAiVklESU9DX1NfU1REIiwKCVtfSU9DX05SKFZJRElPQ19FTlVNU1REKV0gICAgICAgICAgPSAiVklESU9DX0VOVU1TVEQiLAoJW19JT0NfTlIoVklESU9DX0VOVU1JTlBVVCldICAgICAgICA9ICJWSURJT0NfRU5VTUlOUFVUIiwKCVtfSU9DX05SKFZJRElPQ19HX0NUUkwpXSAgICAgICAgICAgPSAiVklESU9DX0dfQ1RSTCIsCglbX0lPQ19OUihWSURJT0NfU19DVFJMKV0gICAgICAgICAgID0gIlZJRElPQ19TX0NUUkwiLAoJW19JT0NfTlIoVklESU9DX0dfVFVORVIpXSAgICAgICAgICA9ICJWSURJT0NfR19UVU5FUiIsCglbX0lPQ19OUihWSURJT0NfU19UVU5FUildICAgICAgICAgID0gIlZJRElPQ19TX1RVTkVSIiwKCVtfSU9DX05SKFZJRElPQ19HX0FVRElPKV0gICAgICAgICAgPSAiVklESU9DX0dfQVVESU8iLAoJW19JT0NfTlIoVklESU9DX1NfQVVESU8pXSAgICAgICAgICA9ICJWSURJT0NfU19BVURJTyIsCglbX0lPQ19OUihWSURJT0NfUVVFUllDVFJMKV0gICAgICAgID0gIlZJRElPQ19RVUVSWUNUUkwiLAoJW19JT0NfTlIoVklESU9DX1FVRVJZTUVOVSldICAgICAgICA9ICJWSURJT0NfUVVFUllNRU5VIiwKCVtfSU9DX05SKFZJRElPQ19HX0lOUFVUKV0gICAgICAgICAgPSAiVklESU9DX0dfSU5QVVQiLAoJW19JT0NfTlIoVklESU9DX1NfSU5QVVQpXSAgICAgICAgICA9ICJWSURJT0NfU19JTlBVVCIsCglbX0lPQ19OUihWSURJT0NfR19PVVRQVVQpXSAgICAgICAgID0gIlZJRElPQ19HX09VVFBVVCIsCglbX0lPQ19OUihWSURJT0NfU19PVVRQVVQpXSAgICAgICAgID0gIlZJRElPQ19TX09VVFBVVCIsCglbX0lPQ19OUihWSURJT0NfRU5VTU9VVFBVVCldICAgICAgID0gIlZJRElPQ19FTlVNT1VUUFVUIiwKCVtfSU9DX05SKFZJRElPQ19HX0FVRE9VVCldICAgICAgICAgPSAiVklESU9DX0dfQVVET1VUIiwKCVtfSU9DX05SKFZJRElPQ19TX0FVRE9VVCldICAgICAgICAgPSAiVklESU9DX1NfQVVET1VUIiwKCVtfSU9DX05SKFZJRElPQ19HX01PRFVMQVRPUildICAgICAgPSAiVklESU9DX0dfTU9EVUxBVE9SIiwKCVtfSU9DX05SKFZJRElPQ19TX01PRFVMQVRPUildICAgICAgPSAiVklESU9DX1NfTU9EVUxBVE9SIiwKCVtfSU9DX05SKFZJRElPQ19HX0ZSRVFVRU5DWSldICAgICAgPSAiVklESU9DX0dfRlJFUVVFTkNZIiwKCVtfSU9DX05SKFZJRElPQ19TX0ZSRVFVRU5DWSldICAgICAgPSAiVklESU9DX1NfRlJFUVVFTkNZIiwKCVtfSU9DX05SKFZJRElPQ19DUk9QQ0FQKV0gICAgICAgICAgPSAiVklESU9DX0NST1BDQVAiLAoJW19JT0NfTlIoVklESU9DX0dfQ1JPUCldICAgICAgICAgICA9ICJWSURJT0NfR19DUk9QIiwKCVtfSU9DX05SKFZJRElPQ19TX0NST1ApXSAgICAgICAgICAgPSAiVklESU9DX1NfQ1JPUCIsCglbX0lPQ19OUihWSURJT0NfR19KUEVHQ09NUCldICAgICAgID0gIlZJRElPQ19HX0pQRUdDT01QIiwKCVtfSU9DX05SKFZJRElPQ19TX0pQRUdDT01QKV0gICAgICAgPSAiVklESU9DX1NfSlBFR0NPTVAiLAoJW19JT0NfTlIoVklESU9DX1FVRVJZU1REKV0gICAgICAgICA9ICJWSURJT0NfUVVFUllTVEQiLAoJW19JT0NfTlIoVklESU9DX1RSWV9GTVQpXSAgICAgICAgICA9ICJWSURJT0NfVFJZX0ZNVCIsCglbX0lPQ19OUihWSURJT0NfRU5VTUFVRElPKV0gICAgICAgID0gIlZJRElPQ19FTlVNQVVESU8iLAoJW19JT0NfTlIoVklESU9DX0VOVU1BVURPVVQpXSAgICAgICA9ICJWSURJT0NfRU5VTUFVRE9VVCIsCglbX0lPQ19OUihWSURJT0NfR19QUklPUklUWSldICAgICAgID0gIlZJRElPQ19HX1BSSU9SSVRZIiwKCVtfSU9DX05SKFZJRElPQ19TX1BSSU9SSVRZKV0gICAgICAgPSAiVklESU9DX1NfUFJJT1JJVFkiLAoJW19JT0NfTlIoVklESU9DX0dfU0xJQ0VEX1ZCSV9DQVApXSA9ICJWSURJT0NfR19TTElDRURfVkJJX0NBUCIsCglbX0lPQ19OUihWSURJT0NfTE9HX1NUQVRVUyldICAgICAgID0gIlZJRElPQ19MT0dfU1RBVFVTIiwKCVtfSU9DX05SKFZJRElPQ19HX0VYVF9DVFJMUyldICAgICAgPSAiVklESU9DX0dfRVhUX0NUUkxTIiwKCVtfSU9DX05SKFZJRElPQ19TX0VYVF9DVFJMUyldICAgICAgPSAiVklESU9DX1NfRVhUX0NUUkxTIiwKCVtfSU9DX05SKFZJRElPQ19UUllfRVhUX0NUUkxTKV0gICAgPSAiVklESU9DX1RSWV9FWFRfQ1RSTFMiLAojaWYgMQoJW19JT0NfTlIoVklESU9DX0VOVU1fRlJBTUVTSVpFUyldICA9ICJWSURJT0NfRU5VTV9GUkFNRVNJWkVTIiwKCVtfSU9DX05SKFZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTKV0gPSAiVklESU9DX0VOVU1fRlJBTUVJTlRFUlZBTFMiLAoJW19JT0NfTlIoVklESU9DX0dfRU5DX0lOREVYKV0gCSAgID0gIlZJRElPQ19HX0VOQ19JTkRFWCIsCglbX0lPQ19OUihWSURJT0NfRU5DT0RFUl9DTUQpXSAJICAgPSAiVklESU9DX0VOQ09ERVJfQ01EIiwKCVtfSU9DX05SKFZJRElPQ19UUllfRU5DT0RFUl9DTUQpXSAgPSAiVklESU9DX1RSWV9FTkNPREVSX0NNRCIsCgoJW19JT0NfTlIoVklESU9DX0RCR19TX1JFR0lTVEVSKV0gICA9ICJWSURJT0NfREJHX1NfUkVHSVNURVIiLAoJW19JT0NfTlIoVklESU9DX0RCR19HX1JFR0lTVEVSKV0gICA9ICJWSURJT0NfREJHX0dfUkVHSVNURVIiLAojZW5kaWYKfTsKI2RlZmluZSBWNEwyX0lPQ1RMUyBBUlJBWV9TSVpFKHY0bDJfaW9jdGxzKQoKc3RhdGljIGNvbnN0IGNoYXIgKnY0bDJfaW50X2lvY3Rsc1tdID0gewojaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUCglbX0lPQ19OUihERUNPREVSX0dFVF9DQVBBQklMSVRJRVMpXSAgICA9ICJERUNPREVSX0dFVF9DQVBBQklMSVRJRVMiLAoJW19JT0NfTlIoREVDT0RFUl9HRVRfU1RBVFVTKV0gICAgICAgICAgPSAiREVDT0RFUl9HRVRfU1RBVFVTIiwKCVtfSU9DX05SKERFQ09ERVJfU0VUX05PUk0pXSAgICAgICAgICAgID0gIkRFQ09ERVJfU0VUX05PUk0iLAoJW19JT0NfTlIoREVDT0RFUl9TRVRfSU5QVVQpXSAgICAgICAgICAgPSAiREVDT0RFUl9TRVRfSU5QVVQiLAoJW19JT0NfTlIoREVDT0RFUl9TRVRfT1VUUFVUKV0gICAgICAgICAgPSAiREVDT0RFUl9TRVRfT1VUUFVUIiwKCVtfSU9DX05SKERFQ09ERVJfRU5BQkxFX09VVFBVVCldICAgICAgID0gIkRFQ09ERVJfRU5BQkxFX09VVFBVVCIsCglbX0lPQ19OUihERUNPREVSX1NFVF9QSUNUVVJFKV0gICAgICAgICA9ICJERUNPREVSX1NFVF9QSUNUVVJFIiwKCVtfSU9DX05SKERFQ09ERVJfU0VUX0dQSU8pXSAgICAgICAgICAgID0gIkRFQ09ERVJfU0VUX0dQSU8iLAoJW19JT0NfTlIoREVDT0RFUl9JTklUKV0gICAgICAgICAgICAgICAgPSAiREVDT0RFUl9JTklUIiwKCVtfSU9DX05SKERFQ09ERVJfU0VUX1ZCSV9CWVBBU1MpXSAgICAgID0gIkRFQ09ERVJfU0VUX1ZCSV9CWVBBU1MiLAoJW19JT0NfTlIoREVDT0RFUl9EVU1QKV0gICAgICAgICAgICAgICAgPSAiREVDT0RFUl9EVU1QIiwKI2VuZGlmCglbX0lPQ19OUihBVURDX1NFVF9SQURJTyldICAgICAgICAgICAgICA9ICJBVURDX1NFVF9SQURJTyIsCgoJW19JT0NfTlIoVFVORVJfU0VUX1RZUEVfQUREUildICAgICAgICAgPSAiVFVORVJfU0VUX1RZUEVfQUREUiIsCglbX0lPQ19OUihUVU5FUl9TRVRfU1RBTkRCWSldICAgICAgICAgICA9ICJUVU5FUl9TRVRfU1RBTkRCWSIsCglbX0lPQ19OUihUREE5ODg3X1NFVF9DT05GSUcpXSAgICAgICAgICA9ICJUREE5ODg3X1NFVF9DT05GSUciLAoKCVtfSU9DX05SKFZJRElPQ19JTlRfU19UVU5FUl9NT0RFKV0gICAgID0gIlZJRElPQ19JTlRfU19UVU5FUl9NT0RFIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfUkVTRVQpXSAgICAgICAgICAgID0gIlZJRElPQ19JTlRfUkVTRVQiLAoJW19JT0NfTlIoVklESU9DX0lOVF9BVURJT19DTE9DS19GUkVRKV0gPSAiVklESU9DX0lOVF9BVURJT19DTE9DS19GUkVRIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfREVDT0RFX1ZCSV9MSU5FKV0gID0gIlZJRElPQ19JTlRfREVDT0RFX1ZCSV9MSU5FIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfU19WQklfREFUQSldICAgICAgID0gIlZJRElPQ19JTlRfU19WQklfREFUQSIsCglbX0lPQ19OUihWSURJT0NfSU5UX0dfVkJJX0RBVEEpXSAgICAgICA9ICJWSURJT0NfSU5UX0dfVkJJX0RBVEEiLAoJW19JT0NfTlIoVklESU9DX0lOVF9HX0NISVBfSURFTlQpXSAgICAgPSAiVklESU9DX0lOVF9HX0NISVBfSURFTlQiLAoJW19JT0NfTlIoVklESU9DX0lOVF9JMlNfQ0xPQ0tfRlJFUSldICAgPSAiVklESU9DX0lOVF9JMlNfQ0xPQ0tfRlJFUSIsCglbX0lPQ19OUihWSURJT0NfSU5UX1NfU1RBTkRCWSldICAgICAgICA9ICJWSURJT0NfSU5UX1NfU1RBTkRCWSIsCglbX0lPQ19OUihWSURJT0NfSU5UX1NfQVVESU9fUk9VVElORyldICA9ICJWSURJT0NfSU5UX1NfQVVESU9fUk9VVElORyIsCglbX0lPQ19OUihWSURJT0NfSU5UX0dfQVVESU9fUk9VVElORyldICA9ICJWSURJT0NfSU5UX0dfQVVESU9fUk9VVElORyIsCglbX0lPQ19OUihWSURJT0NfSU5UX1NfVklERU9fUk9VVElORyldICA9ICJWSURJT0NfSU5UX1NfVklERU9fUk9VVElORyIsCglbX0lPQ19OUihWSURJT0NfSU5UX0dfVklERU9fUk9VVElORyldICA9ICJWSURJT0NfSU5UX0dfVklERU9fUk9VVElORyIsCglbX0lPQ19OUihWSURJT0NfSU5UX1NfQ1JZU1RBTF9GUkVRKV0gICA9ICJWSURJT0NfSU5UX1NfQ1JZU1RBTF9GUkVRIgp9OwojZGVmaW5lIFY0TDJfSU5UX0lPQ1RMUyBBUlJBWV9TSVpFKHY0bDJfaW50X2lvY3RscykKCgovKiBDb21tb24gaW9jdGwgZGVidWcgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYnkKICAgZXh0ZXJuYWwgaW9jdGwgbWVzc2FnZXMgYXMgd2VsbCBhcyBpbnRlcm5hbCBWNEwgaW9jdGwgKi8Kdm9pZCB2NGxfcHJpbnRrX2lvY3RsKHVuc2lnbmVkIGludCBjbWQpCnsKCWNoYXIgKmRpcjsKCglzd2l0Y2ggKF9JT0NfRElSKGNtZCkpIHsKCWNhc2UgX0lPQ19OT05FOiAgICAgICAgICAgICAgZGlyID0gIi0tIjsgYnJlYWs7CgljYXNlIF9JT0NfUkVBRDogICAgICAgICAgICAgIGRpciA9ICJyLSI7IGJyZWFrOwoJY2FzZSBfSU9DX1dSSVRFOiAgICAgICAgICAgICBkaXIgPSAiLXciOyBicmVhazsKCWNhc2UgX0lPQ19SRUFEIHwgX0lPQ19XUklURTogZGlyID0gInJ3IjsgYnJlYWs7CglkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgIGRpciA9ICIqRVJSKiI7IGJyZWFrOwoJfQoJc3dpdGNoIChfSU9DX1RZUEUoY21kKSkgewoJY2FzZSAnZCc6CgkJcHJpbnRrKCJ2NGwyX2ludCBpb2N0bCAlcywgZGlyPSVzICgweCUwOHgpXG4iLAoJCSAgICAgICAoX0lPQ19OUihjbWQpIDwgVjRMMl9JTlRfSU9DVExTKSA/CgkJICAgICAgIHY0bDJfaW50X2lvY3Rsc1tfSU9DX05SKGNtZCldIDogIlVOS05PV04iLCBkaXIsIGNtZCk7CgkJYnJlYWs7CiNpZmRlZiBDT05GSUdfVklERU9fVjRMMV9DT01QQVQKCWNhc2UgJ3YnOgoJCXByaW50aygidjRsMSBpb2N0bCAlcywgZGlyPSVzICgweCUwOHgpXG4iLAoJCSAgICAgICAoX0lPQ19OUihjbWQpIDwgVjRMMV9JT0NUTFMpID8KCQkgICAgICAgdjRsMV9pb2N0bHNbX0lPQ19OUihjbWQpXSA6ICJVTktOT1dOIiwgZGlyLCBjbWQpOwoJCWJyZWFrOwojZW5kaWYKCWNhc2UgJ1YnOgoJCXByaW50aygidjRsMiBpb2N0bCAlcywgZGlyPSVzICgweCUwOHgpXG4iLAoJCSAgICAgICAoX0lPQ19OUihjbWQpIDwgVjRMMl9JT0NUTFMpID8KCQkgICAgICAgdjRsMl9pb2N0bHNbX0lPQ19OUihjbWQpXSA6ICJVTktOT1dOIiwgZGlyLCBjbWQpOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJcHJpbnRrKCJ1bmtub3duIGlvY3RsICclYycsIGRpcj0lcywgIyVkICgweCUwOHgpXG4iLAoJCSAgICAgICBfSU9DX1RZUEUoY21kKSwgZGlyLCBfSU9DX05SKGNtZCksIGNtZCk7Cgl9Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogSGVscGVyIGZ1bmN0aW9ucyBmb3IgY29udHJvbCBoYW5kbGluZwkJCSAgICAgKi8KCi8qIENoZWNrIGZvciBjb3JyZWN0bmVzcyBvZiB0aGUgY3RybCdzIHZhbHVlIGJhc2VkIG9uIHRoZSBkYXRhIGZyb20KICAgc3RydWN0IHY0bDJfcXVlcnljdHJsIGFuZCB0aGUgYXZhaWxhYmxlIG1lbnUgaXRlbXMuIE5vdGUgdGhhdAogICBtZW51X2l0ZW1zIG1heSBiZSBOVUxMLCBpbiB0aGF0IGNhc2UgaXQgaXMgaWdub3JlZC4gKi8KaW50IHY0bDJfY3RybF9jaGVjayhzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCAqY3RybCwgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCwKCQljb25zdCBjaGFyICoqbWVudV9pdGVtcykKewoJaWYgKHFjdHJsLT5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVEKQoJCXJldHVybiAtRUlOVkFMOwoJaWYgKHFjdHJsLT5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX0dSQUJCRUQpCgkJcmV0dXJuIC1FQlVTWTsKCWlmIChxY3RybC0+dHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9CVVRUT04gfHwKCSAgICBxY3RybC0+dHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSNjQgfHwKCSAgICBxY3RybC0+dHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNTKQoJCXJldHVybiAwOwoJaWYgKGN0cmwtPnZhbHVlIDwgcWN0cmwtPm1pbmltdW0gfHwgY3RybC0+dmFsdWUgPiBxY3RybC0+bWF4aW11bSkKCQlyZXR1cm4gLUVSQU5HRTsKCWlmIChxY3RybC0+dHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9NRU5VICYmIG1lbnVfaXRlbXMgIT0gTlVMTCkgewoJCWlmIChtZW51X2l0ZW1zW2N0cmwtPnZhbHVlXSA9PSBOVUxMIHx8CgkJICAgIG1lbnVfaXRlbXNbY3RybC0+dmFsdWVdWzBdID09ICdcMCcpCgkJCXJldHVybiAtRUlOVkFMOwoJfQoJcmV0dXJuIDA7Cn0KCi8qIFJldHVybnMgTlVMTCBvciBhIGNoYXJhY3RlciBwb2ludGVyIGFycmF5IGNvbnRhaW5pbmcgdGhlIG1lbnUgZm9yCiAgIHRoZSBnaXZlbiBjb250cm9sIElELiBUaGUgcG9pbnRlciBhcnJheSBlbmRzIHdpdGggYSBOVUxMIHBvaW50ZXIuCiAgIEFuIGVtcHR5IHN0cmluZyBzaWduaWZpZXMgYSBtZW51IGVudHJ5IHRoYXQgaXMgaW52YWxpZC4gVGhpcyBhbGxvd3MKICAgZHJpdmVycyB0byBkaXNhYmxlIGNlcnRhaW4gb3B0aW9ucyBpZiBpdCBpcyBub3Qgc3VwcG9ydGVkLiAqLwpjb25zdCBjaGFyICoqdjRsMl9jdHJsX2dldF9tZW51KHUzMiBpZCkKewoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fc2FtcGxpbmdfZnJlcVtdID0gewoJCSI0NC4xIGtIeiIsCgkJIjQ4IGtIeiIsCgkJIjMyIGtIeiIsCgkJTlVMTAoJfTsKCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX2F1ZGlvX2VuY29kaW5nW10gPSB7CgkJIkxheWVyIEkiLAoJCSJMYXllciBJSSIsCgkJIkxheWVyIElJSSIsCgkJTlVMTAoJfTsKCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX2F1ZGlvX2wxX2JpdHJhdGVbXSA9IHsKCQkiMzIga2JwcyIsCgkJIjY0IGticHMiLAoJCSI5NiBrYnBzIiwKCQkiMTI4IGticHMiLAoJCSIxNjAga2JwcyIsCgkJIjE5MiBrYnBzIiwKCQkiMjI0IGticHMiLAoJCSIyNTYga2JwcyIsCgkJIjI4OCBrYnBzIiwKCQkiMzIwIGticHMiLAoJCSIzNTIga2JwcyIsCgkJIjM4NCBrYnBzIiwKCQkiNDE2IGticHMiLAoJCSI0NDgga2JwcyIsCgkJTlVMTAoJfTsKCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX2F1ZGlvX2wyX2JpdHJhdGVbXSA9IHsKCQkiMzIga2JwcyIsCgkJIjQ4IGticHMiLAoJCSI1NiBrYnBzIiwKCQkiNjQga2JwcyIsCgkJIjgwIGticHMiLAoJCSI5NiBrYnBzIiwKCQkiMTEyIGticHMiLAoJCSIxMjgga2JwcyIsCgkJIjE2MCBrYnBzIiwKCQkiMTkyIGticHMiLAoJCSIyMjQga2JwcyIsCgkJIjI1NiBrYnBzIiwKCQkiMzIwIGticHMiLAoJCSIzODQga2JwcyIsCgkJTlVMTAoJfTsKCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX2F1ZGlvX2wzX2JpdHJhdGVbXSA9IHsKCQkiMzIga2JwcyIsCgkJIjQwIGticHMiLAoJCSI0OCBrYnBzIiwKCQkiNTYga2JwcyIsCgkJIjY0IGticHMiLAoJCSI4MCBrYnBzIiwKCQkiOTYga2JwcyIsCgkJIjExMiBrYnBzIiwKCQkiMTI4IGticHMiLAoJCSIxNjAga2JwcyIsCgkJIjE5MiBrYnBzIiwKCQkiMjI0IGticHMiLAoJCSIyNTYga2JwcyIsCgkJIjMyMCBrYnBzIiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fbW9kZVtdID0gewoJCSJTdGVyZW8iLAoJCSJKb2ludCBTdGVyZW8iLAoJCSJEdWFsIiwKCQkiTW9ubyIsCgkJTlVMTAoJfTsKCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX2F1ZGlvX21vZGVfZXh0ZW5zaW9uW10gPSB7CgkJIkJvdW5kIDQiLAoJCSJCb3VuZCA4IiwKCQkiQm91bmQgMTIiLAoJCSJCb3VuZCAxNiIsCgkJTlVMTAoJfTsKCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX2F1ZGlvX2VtcGhhc2lzW10gPSB7CgkJIk5vIEVtcGhhc2lzIiwKCQkiNTAvMTUgdXMiLAoJCSJDQ0lUVCBKMTciLAoJCU5VTEwKCX07CglzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19jcmNbXSA9IHsKCQkiTm8gQ1JDIiwKCQkiMTYtYml0IENSQyIsCgkJTlVMTAoJfTsKCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX3ZpZGVvX2VuY29kaW5nW10gPSB7CgkJIk1QRUctMSIsCgkJIk1QRUctMiIsCgkJTlVMTAoJfTsKCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX3ZpZGVvX2FzcGVjdFtdID0gewoJCSIxeDEiLAoJCSI0eDMiLAoJCSIxNng5IiwKCQkiMi4yMXgxIiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfdmlkZW9fYml0cmF0ZV9tb2RlW10gPSB7CgkJIlZhcmlhYmxlIEJpdHJhdGUiLAoJCSJDb25zdGFudCBCaXRyYXRlIiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfc3RyZWFtX3R5cGVbXSA9IHsKCQkiTVBFRy0yIFByb2dyYW0gU3RyZWFtIiwKCQkiTVBFRy0yIFRyYW5zcG9ydCBTdHJlYW0iLAoJCSJNUEVHLTEgU3lzdGVtIFN0cmVhbSIsCgkJIk1QRUctMiBEVkQtY29tcGF0aWJsZSBTdHJlYW0iLAoJCSJNUEVHLTEgVkNELWNvbXBhdGlibGUgU3RyZWFtIiwKCQkiTVBFRy0yIFNWQ0QtY29tcGF0aWJsZSBTdHJlYW0iLAoJCU5VTEwKCX07CglzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19zdHJlYW1fdmJpX2ZtdFtdID0gewoJCSJObyBWQkkiLAoJCSJQcml2YXRlIHBhY2tldCwgSVZUViBmb3JtYXQiLAoJCU5VTEwKCX07CgoJc3dpdGNoIChpZCkgewoJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVROgoJCQlyZXR1cm4gbXBlZ19hdWRpb19zYW1wbGluZ19mcmVxOwoJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORzoKCQkJcmV0dXJuIG1wZWdfYXVkaW9fZW5jb2Rpbmc7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wxX0JJVFJBVEU6CgkJCXJldHVybiBtcGVnX2F1ZGlvX2wxX2JpdHJhdGU7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wyX0JJVFJBVEU6CgkJCXJldHVybiBtcGVnX2F1ZGlvX2wyX2JpdHJhdGU7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wzX0JJVFJBVEU6CgkJCXJldHVybiBtcGVnX2F1ZGlvX2wzX2JpdHJhdGU7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6CgkJCXJldHVybiBtcGVnX2F1ZGlvX21vZGU7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OOgoJCQlyZXR1cm4gbXBlZ19hdWRpb19tb2RlX2V4dGVuc2lvbjsKCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVM6CgkJCXJldHVybiBtcGVnX2F1ZGlvX2VtcGhhc2lzOwoJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19DUkM6CgkJCXJldHVybiBtcGVnX2F1ZGlvX2NyYzsKCQljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc6CgkJCXJldHVybiBtcGVnX3ZpZGVvX2VuY29kaW5nOwoJCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1Q6CgkJCXJldHVybiBtcGVnX3ZpZGVvX2FzcGVjdDsKCQljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9NT0RFOgoJCQlyZXR1cm4gbXBlZ192aWRlb19iaXRyYXRlX21vZGU7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFOgoJCQlyZXR1cm4gbXBlZ19zdHJlYW1fdHlwZTsKCQljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1ZCSV9GTVQ6CgkJCXJldHVybiBtcGVnX3N0cmVhbV92YmlfZm10OwoJCWRlZmF1bHQ6CgkJCXJldHVybiBOVUxMOwoJfQp9CgovKiBGaWxsIGluIGEgc3RydWN0IHY0bDJfcXVlcnljdHJsICovCmludCB2NGwyX2N0cmxfcXVlcnlfZmlsbChzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsLCBzMzIgbWluLCBzMzIgbWF4LCBzMzIgc3RlcCwgczMyIGRlZikKewoJY29uc3QgY2hhciAqbmFtZTsKCglxY3RybC0+ZmxhZ3MgPSAwOwoJc3dpdGNoIChxY3RybC0+aWQpIHsKCS8qIFVTRVIgY29udHJvbHMgKi8KCWNhc2UgVjRMMl9DSURfVVNFUl9DTEFTUzogCW5hbWUgPSAiVXNlciBDb250cm9scyI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6IAluYW1lID0gIlZvbHVtZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOiAJbmFtZSA9ICJNdXRlIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6IAluYW1lID0gIkJhbGFuY2UiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzogCW5hbWUgPSAiQmFzcyI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6IAluYW1lID0gIlRyZWJsZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9BVURJT19MT1VETkVTUzogCW5hbWUgPSAiTG91ZG5lc3MiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzogCW5hbWUgPSAiQnJpZ2h0bmVzcyI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDogCW5hbWUgPSAiQ29udHJhc3QiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjogCW5hbWUgPSAiU2F0dXJhdGlvbiI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9IVUU6IAkJbmFtZSA9ICJIdWUiOyBicmVhazsKCgkvKiBNUEVHIGNvbnRyb2xzICovCgljYXNlIFY0TDJfQ0lEX01QRUdfQ0xBU1M6IAkJbmFtZSA9ICJNUEVHIEVuY29kZXIgQ29udHJvbHMiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVROiBuYW1lID0gIkF1ZGlvIFNhbXBsaW5nIEZyZXF1ZW5jeSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HOiAJbmFtZSA9ICJBdWRpbyBFbmNvZGluZyBMYXllciI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wxX0JJVFJBVEU6IAluYW1lID0gIkF1ZGlvIExheWVyIEkgQml0cmF0ZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wyX0JJVFJBVEU6IAluYW1lID0gIkF1ZGlvIExheWVyIElJIEJpdHJhdGUiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MM19CSVRSQVRFOiAJbmFtZSA9ICJBdWRpbyBMYXllciBJSUkgQml0cmF0ZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6IAkJbmFtZSA9ICJBdWRpbyBTdGVyZW8gTW9kZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OOiBuYW1lID0gIkF1ZGlvIFN0ZXJlbyBNb2RlIEV4dGVuc2lvbiI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VNUEhBU0lTOiAJbmFtZSA9ICJBdWRpbyBFbXBoYXNpcyI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0NSQzogCQluYW1lID0gIkF1ZGlvIENSQyI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HOiAJbmFtZSA9ICJWaWRlbyBFbmNvZGluZyI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVDogCW5hbWUgPSAiVmlkZW8gQXNwZWN0IjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQl9GUkFNRVM6IAluYW1lID0gIlZpZGVvIEIgRnJhbWVzIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX1NJWkU6IAluYW1lID0gIlZpZGVvIEdPUCBTaXplIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX0NMT1NVUkU6IAluYW1lID0gIlZpZGVvIEdPUCBDbG9zdXJlIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fUFVMTERPV046IAluYW1lID0gIlZpZGVvIFB1bGxkb3duIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9NT0RFOiAJbmFtZSA9ICJWaWRlbyBCaXRyYXRlIE1vZGUiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFOiAJbmFtZSA9ICJWaWRlbyBCaXRyYXRlIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9QRUFLOiAJbmFtZSA9ICJWaWRlbyBQZWFrIEJpdHJhdGUiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19URU1QT1JBTF9ERUNJTUFUSU9OOiBuYW1lID0gIlZpZGVvIFRlbXBvcmFsIERlY2ltYXRpb24iOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRTogCW5hbWUgPSAiU3RyZWFtIFR5cGUiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1BNVDogCW5hbWUgPSAiU3RyZWFtIFBNVCBQcm9ncmFtIElEIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9BVURJTzogCW5hbWUgPSAiU3RyZWFtIEF1ZGlvIFByb2dyYW0gSUQiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1ZJREVPOiAJbmFtZSA9ICJTdHJlYW0gVmlkZW8gUHJvZ3JhbSBJRCI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUENSOiAJbmFtZSA9ICJTdHJlYW0gUENSIFByb2dyYW0gSUQiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUEVTX0lEX0FVRElPOiBuYW1lID0gIlN0cmVhbSBQRVMgQXVkaW8gSUQiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUEVTX0lEX1ZJREVPOiBuYW1lID0gIlN0cmVhbSBQRVMgVmlkZW8gSUQiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVkJJX0ZNVDoJbmFtZSA9ICJTdHJlYW0gVkJJIEZvcm1hdCI7IGJyZWFrOwoKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cglzd2l0Y2ggKHFjdHJsLT5pZCkgewoJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgoJY2FzZSBWNEwyX0NJRF9BVURJT19MT1VETkVTUzoKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfQ0xPU1VSRToKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19QVUxMRE9XTjoKCQlxY3RybC0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU47CgkJbWluID0gMDsKCQltYXggPSBzdGVwID0gMTsKCQlicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVROgoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HOgoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wxX0JJVFJBVEU6CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURToKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MM19CSVRSQVRFOgoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT046CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVM6CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fQ1JDOgoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HOgoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVDoKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREU6CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEU6CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1ZCSV9GTVQ6CgkJcWN0cmwtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9NRU5VOwoJCXN0ZXAgPSAxOwoJCWJyZWFrOwoJY2FzZSBWNEwyX0NJRF9VU0VSX0NMQVNTOgoJY2FzZSBWNEwyX0NJRF9NUEVHX0NMQVNTOgoJCXFjdHJsLT50eXBlID0gVjRMMl9DVFJMX1RZUEVfQ1RSTF9DTEFTUzsKCQlxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfUkVBRF9PTkxZOwoJCW1pbiA9IG1heCA9IHN0ZXAgPSBkZWYgPSAwOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlxY3RybC0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI7CgkJYnJlYWs7Cgl9Cglzd2l0Y2ggKHFjdHJsLT5pZCkgewoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HOgoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9NT0RFOgoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JfRlJBTUVTOgoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFOgoJCXFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19VUERBVEU7CgkJYnJlYWs7CgljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzoKCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgoJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgoJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKCWNhc2UgVjRMMl9DSURfSFVFOgoJCXFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19TTElERVI7CgkJYnJlYWs7Cgl9CglxY3RybC0+bWluaW11bSA9IG1pbjsKCXFjdHJsLT5tYXhpbXVtID0gbWF4OwoJcWN0cmwtPnN0ZXAgPSBzdGVwOwoJcWN0cmwtPmRlZmF1bHRfdmFsdWUgPSBkZWY7CglxY3RybC0+cmVzZXJ2ZWRbMF0gPSBxY3RybC0+cmVzZXJ2ZWRbMV0gPSAwOwoJc25wcmludGYocWN0cmwtPm5hbWUsIHNpemVvZihxY3RybC0+bmFtZSksIG5hbWUpOwoJcmV0dXJuIDA7Cn0KCi8qIEZpbGwgaW4gYSBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgd2l0aCBzdGFuZGFyZCB2YWx1ZXMgYmFzZWQgb24KICAgdGhlIGNvbnRyb2wgSUQuICovCmludCB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQoc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCkKewoJc3dpdGNoIChxY3RybC0+aWQpIHsKCS8qIFVTRVIgY29udHJvbHMgKi8KCWNhc2UgVjRMMl9DSURfVVNFUl9DTEFTUzoKCWNhc2UgVjRMMl9DSURfTVBFR19DTEFTUzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDAsIDAsIDApOwoJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCA2NTUzNSwgNjU1MzUgLyAxMDAsIDU4ODgwKTsKCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKCWNhc2UgVjRMMl9DSURfQVVESU9fTE9VRE5FU1M6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAxLCAxLCAwKTsKCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzoKCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgNjU1MzUsIDY1NTM1IC8gMTAwLCAzMjc2OCk7CgljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAyNTUsIDEsIDEyOCk7CgljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgoJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMTI3LCAxLCA2NCk7CgljYXNlIFY0TDJfQ0lEX0hVRToKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIC0xMjgsIDEyNywgMSwgMCk7CgoJLyogTVBFRyBjb250cm9scyAqLwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVE6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfNDQxMDAsCgkJCQlWNEwyX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUV8zMjAwMCwgMSwKCQkJCVY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzQ4MDAwKTsKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMSwKCQkJCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8zLCAxLAoJCQkJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzIpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wxX0JJVFJBVEU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMzJLLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfNDQ4SywgMSwKCQkJCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzI1NkspOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wyX0JJVFJBVEU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzJLLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzg0SywgMSwKCQkJCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzIyNEspOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wzX0JJVFJBVEU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMzJLLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMzIwSywgMSwKCQkJCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzE5MkspOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX01PREVfU1RFUkVPLAoJCQkJVjRMMl9NUEVHX0FVRElPX01PREVfTU9OTywgMSwKCQkJCVY0TDJfTVBFR19BVURJT19NT0RFX1NURVJFTyk7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT046CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzQsCgkJCQlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfMTYsIDEsCgkJCQlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfNCk7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVM6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX0VNUEhBU0lTX05PTkUsCgkJCQlWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfQ0NJVFRfSjE3LCAxLAoJCQkJVjRMMl9NUEVHX0FVRElPX0VNUEhBU0lTX05PTkUpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0NSQzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfQVVESU9fQ1JDX05PTkUsCgkJCQlWNEwyX01QRUdfQVVESU9fQ1JDX0NSQzE2LCAxLAoJCQkJVjRMMl9NUEVHX0FVRElPX0NSQ19OT05FKTsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xLAoJCQkJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMiwgMSwKCQkJCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzIpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVDoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfVklERU9fQVNQRUNUXzF4MSwKCQkJCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMjIxeDEwMCwgMSwKCQkJCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfNHgzKTsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CX0ZSQU1FUzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDMzLCAxLCAyKTsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRToKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDEsIDM0LCAxLCAxMik7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX0NMT1NVUkU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAxLCAxLCAxKTsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19QVUxMRE9XTjoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDEsIDEsIDApOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERToKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX1ZCUiwKCQkJCVY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfQ0JSLCAxLAoJCQkJVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9WQlIpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAyNzAwMDAwMCwgMSwgNjAwMDAwMCk7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9QRUFLOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMjcwMDAwMDAsIDEsIDgwMDAwMDApOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1RFTVBPUkFMX0RFQ0lNQVRJT046CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAyNTUsIDEsIDApOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKCQkJCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9QUywKCQkJCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9TVkNELCAxLAoJCQkJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX1BTKTsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1BNVDoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsICgxIDw8IDE0KSAtIDEsIDEsIDE2KTsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX0FVRElPOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgKDEgPDwgMTQpIC0gMSwgMSwgMjYwKTsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1ZJREVPOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgKDEgPDwgMTQpIC0gMSwgMSwgMjU2KTsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1BDUjoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsICgxIDw8IDE0KSAtIDEsIDEsIDI1OSk7CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BFU19JRF9BVURJTzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDI1NSwgMSwgMCk7CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BFU19JRF9WSURFTzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDI1NSwgMSwgMCk7CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1ZCSV9GTVQ6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX1NUUkVBTV9WQklfRk1UX05PTkUsCgkJCQlWNEwyX01QRUdfU1RSRUFNX1ZCSV9GTVRfSVZUViwgMSwKCQkJCVY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9OT05FKTsKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCi8qIEZpbGwgaW4gYSBzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUgYmFzZWQgb24gdGhlIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBhbmQKICAgdGhlIG1lbnUuIFRoZSBxY3RybCBwb2ludGVyIG1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIGl0IGlzIGlnbm9yZWQuICovCmludCB2NGwyX2N0cmxfcXVlcnlfbWVudShzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUgKnFtZW51LCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsLAoJICAgICAgIGNvbnN0IGNoYXIgKiptZW51X2l0ZW1zKQp7CglpbnQgaTsKCglpZiAobWVudV9pdGVtcyA9PSBOVUxMIHx8CgkgICAgKHFjdHJsICYmIChxbWVudS0+aW5kZXggPCBxY3RybC0+bWluaW11bSB8fCBxbWVudS0+aW5kZXggPiBxY3RybC0+bWF4aW11bSkpKQoJCXJldHVybiAtRUlOVkFMOwoJZm9yIChpID0gMDsgaSA8IHFtZW51LT5pbmRleCAmJiBtZW51X2l0ZW1zW2ldOyBpKyspIDsKCWlmIChtZW51X2l0ZW1zW2ldID09IE5VTEwgfHwgbWVudV9pdGVtc1tpXVswXSA9PSAnXDAnKQoJCXJldHVybiAtRUlOVkFMOwoJc25wcmludGYocW1lbnUtPm5hbWUsIHNpemVvZihxbWVudS0+bmFtZSksIG1lbnVfaXRlbXNbcW1lbnUtPmluZGV4XSk7CglxbWVudS0+cmVzZXJ2ZWQgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qIGN0cmxfY2xhc3NlcyBwb2ludHMgdG8gYW4gYXJyYXkgb2YgdTMyIHBvaW50ZXJzLCB0aGUgbGFzdCBlbGVtZW50IGlzCiAgIGEgTlVMTCBwb2ludGVyLiBFYWNoIHUzMiBhcnJheSBpcyBhIDAtdGVybWluYXRlZCBhcnJheSBvZiBjb250cm9sIElEcy4KICAgRWFjaCBhcnJheSBtdXN0IGJlIHNvcnRlZCBsb3cgdG8gaGlnaCBhbmQgYmVsb25nIHRvIHRoZSBzYW1lIGNvbnRyb2wKICAgY2xhc3MuIFRoZSBhcnJheSBvZiB1MzIgcG9pbnRlciBtdXN0IGFsc28gYmUgc29ydGVkLCBmcm9tIGxvdyBjbGFzcyBJRHMKICAgdG8gaGlnaCBjbGFzcyBJRHMuCgogICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IElEIHRoYXQgZm9sbG93cyBhZnRlciB0aGUgZ2l2ZW4gSUQuCiAgIFdoZW4gbm8gbW9yZSBjb250cm9scyBhcmUgYXZhaWxhYmxlIDAgaXMgcmV0dXJuZWQuICovCnUzMiB2NGwyX2N0cmxfbmV4dChjb25zdCB1MzIgKiBjb25zdCAqIGN0cmxfY2xhc3NlcywgdTMyIGlkKQp7Cgl1MzIgY3RybF9jbGFzczsKCWNvbnN0IHUzMiAqcGN0cmw7CgoJLyogaWYgbm8gcXVlcnkgaXMgZGVzaXJlZCwgdGhlbiBqdXN0IHJldHVybiB0aGUgY29udHJvbCBJRCAqLwoJaWYgKChpZCAmIFY0TDJfQ1RSTF9GTEFHX05FWFRfQ1RSTCkgPT0gMCkKCQlyZXR1cm4gaWQ7CglpZiAoY3RybF9jbGFzc2VzID09IE5VTEwpCgkJcmV0dXJuIDA7CglpZCAmPSBWNEwyX0NUUkxfSURfTUFTSzsKCWN0cmxfY2xhc3MgPSBWNEwyX0NUUkxfSUQyQ0xBU1MoaWQpOwoJaWQrKzsJLyogc2VsZWN0IG5leHQgY29udHJvbCAqLwoJLyogZmluZCBmaXJzdCBjbGFzcyB0aGF0IG1hdGNoZXMgKG9yIGlzIGdyZWF0ZXIgdGhhbikgdGhlIGNsYXNzIG9mCgkgICB0aGUgSUQgKi8KCXdoaWxlICgqY3RybF9jbGFzc2VzICYmIFY0TDJfQ1RSTF9JRDJDTEFTUygqKmN0cmxfY2xhc3NlcykgPCBjdHJsX2NsYXNzKQoJCWN0cmxfY2xhc3NlcysrOwoJLyogbm8gbW9yZSBjbGFzc2VzICovCglpZiAoKmN0cmxfY2xhc3NlcyA9PSBOVUxMKQoJCXJldHVybiAwOwoJcGN0cmwgPSAqY3RybF9jbGFzc2VzOwoJLyogZmluZCBmaXJzdCBjdHJsIHdpdGhpbiB0aGUgY2xhc3MgdGhhdCBpcyA+PSBJRCAqLwoJd2hpbGUgKCpwY3RybCAmJiAqcGN0cmwgPCBpZCkgcGN0cmwrKzsKCWlmICgqcGN0cmwpCgkJcmV0dXJuICpwY3RybDsKCS8qIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBjb250cm9scyBvZiB0aGUgY3VycmVudCBjbGFzcy4gKi8KCS8qIGNvbnRpbnVlIHdpdGggbmV4dCBjbGFzcyBpZiBhdmFpbGFibGUgKi8KCWN0cmxfY2xhc3NlcysrOwoJaWYgKCpjdHJsX2NsYXNzZXMgPT0gTlVMTCkKCQlyZXR1cm4gMDsKCXJldHVybiAqKmN0cmxfY2xhc3NlczsKfQoKaW50IHY0bDJfY2hpcF9tYXRjaF9pMmNfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1MzIgbWF0Y2hfdHlwZSwgdTMyIG1hdGNoX2NoaXApCnsKCXN3aXRjaCAobWF0Y2hfdHlwZSkgewoJY2FzZSBWNEwyX0NISVBfTUFUQ0hfSTJDX0RSSVZFUjoKCQlyZXR1cm4gKGMgIT0gTlVMTCAmJiBjLT5kcml2ZXIgIT0gTlVMTCAmJiBjLT5kcml2ZXItPmlkID09IG1hdGNoX2NoaXApOwoJY2FzZSBWNEwyX0NISVBfTUFUQ0hfSTJDX0FERFI6CgkJcmV0dXJuIChjICE9IE5VTEwgJiYgYy0+YWRkciA9PSBtYXRjaF9jaGlwKTsKCWRlZmF1bHQ6CgkJcmV0dXJuIDA7Cgl9Cn0KCmludCB2NGwyX2NoaXBfbWF0Y2hfaG9zdCh1MzIgbWF0Y2hfdHlwZSwgdTMyIG1hdGNoX2NoaXApCnsKCXN3aXRjaCAobWF0Y2hfdHlwZSkgewoJY2FzZSBWNEwyX0NISVBfTUFUQ0hfSE9TVDoKCQlyZXR1cm4gbWF0Y2hfY2hpcCA9PSAwOwoJZGVmYXVsdDoKCQlyZXR1cm4gMDsKCX0KfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCkVYUE9SVF9TWU1CT0wodjRsMl9ub3JtX3RvX25hbWUpOwpFWFBPUlRfU1lNQk9MKHY0bDJfdmlkZW9fc3RkX2NvbnN0cnVjdCk7CgpFWFBPUlRfU1lNQk9MKHY0bDJfcHJpb19pbml0KTsKRVhQT1JUX1NZTUJPTCh2NGwyX3ByaW9fY2hhbmdlKTsKRVhQT1JUX1NZTUJPTCh2NGwyX3ByaW9fb3Blbik7CkVYUE9SVF9TWU1CT0wodjRsMl9wcmlvX2Nsb3NlKTsKRVhQT1JUX1NZTUJPTCh2NGwyX3ByaW9fbWF4KTsKRVhQT1JUX1NZTUJPTCh2NGwyX3ByaW9fY2hlY2spOwoKRVhQT1JUX1NZTUJPTCh2NGwyX2ZpZWxkX25hbWVzKTsKRVhQT1JUX1NZTUJPTCh2NGwyX3R5cGVfbmFtZXMpOwpFWFBPUlRfU1lNQk9MKHY0bF9wcmludGtfaW9jdGwpOwoKRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfbmV4dCk7CkVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX2NoZWNrKTsKRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfZ2V0X21lbnUpOwpFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9xdWVyeV9tZW51KTsKRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfcXVlcnlfZmlsbCk7CkVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKTsKCkVYUE9SVF9TWU1CT0wodjRsMl9jaGlwX21hdGNoX2kyY19jbGllbnQpOwpFWFBPUlRfU1lNQk9MKHY0bDJfY2hpcF9tYXRjaF9ob3N0KTsKCi8qCiAqIExvY2FsIHZhcmlhYmxlczoKICogYy1iYXNpYy1vZmZzZXQ6IDgKICogRW5kOgogKi8K