LyoKICogbWliLmMKICoKICogJElkJAogKgogKiBVcGRhdGU6IDE5OTgtMDctMTcgPGpoeUBnc3UuZWR1PgogKiBBZGRlZCBwcmludF9vaWRfcmVwb3J0KiBmdW5jdGlvbnMuCiAqCiAqLwovKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHRzLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCUNvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkxLCAxOTkyIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CgogICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgbm90IGJlCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQpzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwpBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKQ01VIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgpBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwpTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgojaWYgSEFWRV9ESVJFTlRfSAojIGluY2x1ZGUgPGRpcmVudC5oPgojIGRlZmluZSBOQU1MRU4oZGlyZW50KSBzdHJsZW4oKGRpcmVudCktPmRfbmFtZSkKI2Vsc2UKIyBkZWZpbmUgZGlyZW50IGRpcmVjdAojIGRlZmluZSBOQU1MRU4oZGlyZW50KSAoZGlyZW50KS0+ZF9uYW1sZW4KIyBpZiBIQVZFX1NZU19ORElSX0gKIyAgaW5jbHVkZSA8c3lzL25kaXIuaD4KIyBlbmRpZgojIGlmIEhBVkVfU1lTX0RJUl9ICiMgIGluY2x1ZGUgPHN5cy9kaXIuaD4KIyBlbmRpZgojIGlmIEhBVkVfTkRJUl9ICiMgIGluY2x1ZGUgPG5kaXIuaD4KIyBlbmRpZgojZW5kaWYKCiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGlmZGVmIFdJTjMyCiMgIGluY2x1ZGUgPHN5cy90aW1lYi5oPgojIGVsc2UKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbmRpZgojIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyBpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHRpbWUuaD4KIyBlbmRpZgojZW5kaWYKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NFTEVDVF9ICiNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CiNlbmRpZgoKI2lmIEhBVkVfV0lOU09DS19ICiNpbmNsdWRlIDx3aW5zb2NrLmg+CiNlbmRpZgoKI2lmIEhBVkVfVU5JU1REX0gKI2luY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2lmIEhBVkVfRE1BTExPQ19ICiNpbmNsdWRlIDxkbWFsbG9jLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL3R5cGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9vdXRwdXRfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9jb25maWdfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC91dGlsaXRpZXMuaD4KCiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2FzbjEuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvbWliLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3BhcnNlLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2ludDY0Lmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NubXBfY2xpZW50Lmg+CgovKiogQGRlZmdyb3VwIG1pYl91dGlsaXRpZXMgbWliIHBhcnNpbmcgYW5kIGRhdGF0eXBlIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4KICogIEBpbmdyb3VwIGxpYnJhcnkKICoKICogIEB7CiAqLwoKc3RhdGljIGNoYXIgICAgKnVwdGltZVN0cmluZyh1X2xvbmcsIGNoYXIgKiwgc2l6ZV90KTsKCnN0YXRpYyBzdHJ1Y3QgdHJlZSAqX2dldF9yZWFsbG9jX3N5bWJvbChjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgKnN1YnRyZWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqaW5fZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBlbmRfb2Zfa25vd24pOwoKc3RhdGljIGludCAgICAgIHByaW50X3RyZWVfbm9kZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmVlICp0cCwgaW50IHdpZHRoKTsKc3RhdGljIHZvaWQgICAgIGhhbmRsZV9taWJkaXJzX2NvbmYoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpOwpzdGF0aWMgdm9pZCAgICAgaGFuZGxlX21pYnNfY29uZihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSk7CnN0YXRpYyB2b2lkICAgICBoYW5kbGVfbWliZmlsZV9jb25mKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKTsKCnN0YXRpYyB2b2lkICAgICBfb2lkX2ZpbmlzaF9wcmludGluZyhjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywgaW50ICpidWZfb3ZlcmZsb3cpOwoKLyoKICogaGVscGVyIGZ1bmN0aW9ucyBmb3IgZ2V0X21vZHVsZV9ub2RlIAogKi8Kc3RhdGljIGludCAgICAgIG5vZGVfdG9fb2lkKHN0cnVjdCB0cmVlICosIG9pZCAqLCBzaXplX3QgKik7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCnN0YXRpYyBpbnQgICAgICBfYWRkX3N0cmluZ3NfdG9fb2lkKHN0cnVjdCB0cmVlICosIGNoYXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICosIHNpemVfdCAqLCBzaXplX3QpOwojZWxzZQpzdGF0aWMgaW50ICAgICAgX2FkZF9zdHJpbmdzX3RvX29pZCh2b2lkICosIGNoYXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICosIHNpemVfdCAqLCBzaXplX3QpOwojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwpleHRlcm4gc3RydWN0IHRyZWUgKnRyZWVfaGVhZDsKc3RhdGljIHN0cnVjdCB0cmVlICp0cmVlX3RvcDsKCnN0cnVjdCB0cmVlICAgICpNaWI7ICAgICAgICAgICAgLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKb2lkICAgICAgICAgICAgIFJGQzEyMTNfTUlCW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEgfTsKc3RhdGljIGNoYXIgICAgIFN0YW5kYXJkX1ByZWZpeFtdID0gIi4xLjMuNi4xLjIuMSI7CgovKgogKiBTZXQgZGVmYXVsdCBoZXJlIGFzIHNvbWUgdXNlcyBvZiByZWFkX29iamlkIHJlcXVpcmUgdmFsaWQgcG9pbnRlci4gCiAqLwpzdGF0aWMgY2hhciAgICAqUHJlZml4ID0gJlN0YW5kYXJkX1ByZWZpeFswXTsKdHlwZWRlZiBzdHJ1Y3QgX1ByZWZpeExpc3QgewogICAgY29uc3QgY2hhciAgICAgKnN0cjsKICAgIGludCAgICAgICAgICAgICBsZW47Cn0gICAgICAgICAgICAgICpQcmVmaXhMaXN0UHRyLCBQcmVmaXhMaXN0OwoKLyoKICogSGVyZSBhcmUgdGhlIHByZWZpeCBzdHJpbmdzLgogKiBOb3RlIHRoYXQgdGhlIGZpcnN0IG9uZSBmaW5kcyB0aGUgdmFsdWUgb2YgUHJlZml4IG9yIFN0YW5kYXJkX1ByZWZpeC4KICogQW55IG9mIHRoZXNlIE1BWSBzdGFydCB3aXRoIHBlcmlvZDsgYWxsIHdpbGwgTk9UIGVuZCB3aXRoIHBlcmlvZC4KICogUGVyaW9kIGlzIGFkZGVkIHdoZXJlIG5lZWRlZC4gIFNlZSB1c2Ugb2YgUHJlZml4IGluIHRoaXMgbW9kdWxlLgogKi8KUHJlZml4TGlzdCAgICAgIG1pYl9wcmVmaXhlc1tdID0gewogICAgeyZTdGFuZGFyZF9QcmVmaXhbMF19LCAgICAgIC8qIHBsYWNlaG9sZGVyIGZvciBQcmVmaXggZGF0YSAqLwogICAgeyIuaXNvLm9yZy5kb2QuaW50ZXJuZXQubWdtdC5taWItMiJ9LAogICAgeyIuaXNvLm9yZy5kb2QuaW50ZXJuZXQuZXhwZXJpbWVudGFsIn0sCiAgICB7Ii5pc28ub3JnLmRvZC5pbnRlcm5ldC5wcml2YXRlIn0sCiAgICB7Ii5pc28ub3JnLmRvZC5pbnRlcm5ldC5zbm1wUGFydGllcyJ9LAogICAgeyIuaXNvLm9yZy5kb2QuaW50ZXJuZXQuc25tcFNlY3JldHMifSwKICAgIHtOVUxMLCAwfSAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgbGlzdCAqLwp9OwoKZW51bSBpbmV0X2FkZHJlc3NfdHlwZSB7CiAgICBJUFY0ID0gMSwKICAgIElQVjYgPSAyLAogICAgSVBWNFogPSAzLAogICAgSVBWNlogPSA0LAogICAgRE5TID0gMTYKfTsKCgovKioKICogQGludGVybmFsCiAqIENvbnZlcnRzIHRpbWV0aWNrcyB0byBob3VycywgbWludXRlcywgc2Vjb25kcyBzdHJpbmcuCiAqCiAqIEBwYXJhbSB0aW1ldGlja3MgICAgVGhlIHRpbWV0aWNrcyB0byBjb252ZXJ0LgogKiBAcGFyYW0gYnVmICAgICAgICAgIEJ1ZmZlciB0byB3cml0ZSB0bywgaGFzIHRvIGJlIGF0IAogKiAgICAgICAgICAgICAgICAgICAgIGxlYXN0IDQwIEJ5dGVzIGxhcmdlLgogKiAgICAgICAKICogQHJldHVybiBUaGUgYnVmZmVyLgogKi8Kc3RhdGljIGNoYXIgICAgKgp1cHRpbWVTdHJpbmcodV9sb25nIHRpbWV0aWNrcywgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgY2VudGlzZWNzLCBzZWNvbmRzLCBtaW51dGVzLCBob3VycywgZGF5czsKCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX05VTUVSSUNfVElNRVRJQ0tTKSkgewogICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJWx1IiwgdGltZXRpY2tzKTsKICAgICAgICByZXR1cm4gYnVmOwogICAgfQoKCiAgICBjZW50aXNlY3MgPSB0aW1ldGlja3MgJSAxMDA7CiAgICB0aW1ldGlja3MgLz0gMTAwOwogICAgZGF5cyA9IHRpbWV0aWNrcyAvICg2MCAqIDYwICogMjQpOwogICAgdGltZXRpY2tzICU9ICg2MCAqIDYwICogMjQpOwoKICAgIGhvdXJzID0gdGltZXRpY2tzIC8gKDYwICogNjApOwogICAgdGltZXRpY2tzICU9ICg2MCAqIDYwKTsKCiAgICBtaW51dGVzID0gdGltZXRpY2tzIC8gNjA7CiAgICBzZWNvbmRzID0gdGltZXRpY2tzICUgNjA7CgogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpCiAgICAgICAgc25wcmludGYoYnVmLCBidWZsZW4sICIlZDolZDolMDJkOiUwMmQuJTAyZCIsCiAgICAgICAgICAgICAgICBkYXlzLCBob3VycywgbWludXRlcywgc2Vjb25kcywgY2VudGlzZWNzKTsKICAgIGVsc2UgewogICAgICAgIGlmIChkYXlzID09IDApIHsKICAgICAgICAgICAgc25wcmludGYoYnVmLCBidWZsZW4sICIlZDolMDJkOiUwMmQuJTAyZCIsCiAgICAgICAgICAgICAgICAgICAgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGNlbnRpc2Vjcyk7CiAgICAgICAgfSBlbHNlIGlmIChkYXlzID09IDEpIHsKICAgICAgICAgICAgc25wcmludGYoYnVmLCBidWZsZW4sICIlZCBkYXksICVkOiUwMmQ6JTAyZC4lMDJkIiwKICAgICAgICAgICAgICAgICAgICBkYXlzLCBob3VycywgbWludXRlcywgc2Vjb25kcywgY2VudGlzZWNzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVkIGRheXMsICVkOiUwMmQ6JTAyZC4lMDJkIiwKICAgICAgICAgICAgICAgICAgICBkYXlzLCBob3VycywgbWludXRlcywgc2Vjb25kcywgY2VudGlzZWNzKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gYnVmOwp9CgoKCi8qKgogKiBAaW50ZXJuYWwKICogUHJpbnRzIHRoZSBjaGFyYWN0ZXIgcG9pbnRlZCB0byBpZiBpbiBodW1hbi1yZWFkYWJsZSBBU0NJSSByYW5nZSwKICogb3RoZXJ3aXNlIHByaW50cyBhIGRvdC4KICoKICogQHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcHJpbnQgdGhlIGNoYXJhY3RlciB0by4KICogQHBhcmFtIGNoICBDaGFyYWN0ZXIgdG8gcHJpbnQuCiAqLwpzdGF0aWMgdm9pZApzcHJpbnRfY2hhcihjaGFyICpidWYsIGNvbnN0IHVfY2hhciBjaCkKewogICAgaWYgKGlzcHJpbnQoY2gpIHx8IGlzc3BhY2UoY2gpKSB7CiAgICAgICAgc3ByaW50ZihidWYsICIlYyIsIChpbnQpIGNoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgc3ByaW50ZihidWYsICIuIik7CiAgICB9Cn0KCgoKLyoqCiAqIFByaW50cyBhIGhleGFkZWNpbWFsIHN0cmluZyBpbnRvIGEgYnVmZmVyLgogKgogKiBUaGUgY2hhcmFjdGVycyBwb2ludGVkIGJ5ICpjcCBhcmUgZW5jb2RlZCBhcyBoZXhhZGVjaW1hbCBzdHJpbmcuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgYWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgaW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIGNwICAgICAgIHRoZSBhcnJheSBvZiBjaGFyYWN0ZXJzIHRvIGVuY29kZS4KICogQHBhcmFtIGxpbmVfbGVuIHRoZSBhcnJheSBsZW5ndGggb2YgY3AuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50Cl9zcHJpbnRfaGV4c3RyaW5nX2xpbmUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywgY29uc3QgdV9jaGFyICogY3AsIHNpemVfdCBsaW5lX2xlbikKewogICAgY29uc3QgdV9jaGFyICAgKnRwOwogICAgY29uc3QgdV9jaGFyICAgKmNwMiA9IGNwOwogICAgc2l6ZV90ICAgICAgICAgIGxlbmxlZnQgPSBsaW5lX2xlbjsKCiAgICAvKgogICAgICogTWFrZSBzdXJlIHRoZXJlJ3MgZW5vdWdoIHJvb20gZm9yIHRoZSBoZXggb3V0cHV0Li4uLgogICAgICovCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgbGluZV9sZW4qMysxKSA+PSAqYnVmX2xlbikgewogICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogLi4uLiBhbmQgZGlzcGxheSB0aGUgaGV4IHZhbHVlcyB0aGVtc2VsdmVzLi4uLgogICAgICovCiAgICBmb3IgKDsgbGVubGVmdCA+PSA4OyBsZW5sZWZ0LT04KSB7CiAgICAgICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwKICAgICAgICAgICAgICAgICIlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggIiwgY3BbMF0sIGNwWzFdLAogICAgICAgICAgICAgICAgY3BbMl0sIGNwWzNdLCBjcFs0XSwgY3BbNV0sIGNwWzZdLCBjcFs3XSk7CiAgICAgICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKICAgICAgICBjcCAgICAgICArPSA4OwogICAgfQogICAgZm9yICg7IGxlbmxlZnQgPiAwOyBsZW5sZWZ0LS0pIHsKICAgICAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAiJTAyWCAiLCAqY3ArKyk7CiAgICAgICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKICAgIH0KCiAgICAvKgogICAgICogLi4uLiBwbHVzIChvcHRpb25hbGx5KSBkbyB0aGUgc2FtZSBmb3IgdGhlIEFTQ0lJIGVxdWl2YWxlbnQuCiAgICAgKi8KICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfSEVYX1RFWFQpKSB7CiAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIGxpbmVfbGVuKzUpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAiICBbIik7CiAgICAgICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKICAgICAgICBmb3IgKHRwID0gY3AyOyB0cCA8IGNwOyB0cCsrKSB7CiAgICAgICAgICAgIHNwcmludF9jaGFyKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAqdHApOwogICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgfQogICAgICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICJdIik7CiAgICAgICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgppbnQKc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywgY29uc3QgdV9jaGFyICogY3AsIHNpemVfdCBsZW4pCnsKICAgIGludCBsaW5lX2xlbiA9IG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfSEVYX09VVFBVVF9MRU5HVEgpOwogICAgaWYgKCFsaW5lX2xlbikKICAgICAgICBsaW5lX2xlbj1sZW47CgogICAgZm9yICg7IChpbnQpbGVuID4gbGluZV9sZW47IGxlbiAtPSBsaW5lX2xlbikgewogICAgICAgIGlmKCFfc3ByaW50X2hleHN0cmluZ19saW5lKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgY3AsIGxpbmVfbGVuKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgKigqYnVmICsgKCpvdXRfbGVuKSsrKSA9ICdcbic7CiAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gMDsKICAgICAgICBjcCArPSBsaW5lX2xlbjsKICAgIH0KICAgIGlmKCFfc3ByaW50X2hleHN0cmluZ19saW5lKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgY3AsIGxlbikpCiAgICAgICAgcmV0dXJuIDA7CiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAwOwogICAgcmV0dXJuIDE7Cn0KCgoKLyoqCiAqIFByaW50cyBhbiBhc2NpaSBzdHJpbmcgaW50byBhIGJ1ZmZlci4KICoKICogVGhlIGNoYXJhY3RlcnMgcG9pbnRlZCBieSAqY3AgYXJlIGVuY29kZWQgYXMgYW4gYXNjaWkgc3RyaW5nLgogKiAKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBhZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBhZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBpbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gY3AgICAgICAgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMgdG8gZW5jb2RlLgogKiBAcGFyYW0gbGVuICAgICAgdGhlIGFycmF5IGxlbmd0aCBvZiBjcC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfYXNjaWlzdHJpbmcodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVfY2hhciAqIGNwLCBzaXplX3QgbGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgbGVuOyBpKyspIHsKICAgICAgICBpZiAoaXNwcmludCgqY3ApIHx8IGlzc3BhY2UoKmNwKSkgewogICAgICAgICAgICBpZiAoKmNwID09ICdcXCcgfHwgKmNwID09ICciJykgewogICAgICAgICAgICAgICAgaWYgKCgqb3V0X2xlbiA+PSAqYnVmX2xlbikgJiYKICAgICAgICAgICAgICAgICAgICAhKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqKCpidWYgKyAoKm91dF9sZW4pKyspID0gJ1xcJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKCpvdXRfbGVuID49ICpidWZfbGVuKSAmJgogICAgICAgICAgICAgICAgIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKigqYnVmICsgKCpvdXRfbGVuKSsrKSA9ICpjcCsrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgoKm91dF9sZW4gPj0gKmJ1Zl9sZW4pICYmCiAgICAgICAgICAgICAgICAhKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAqKCpidWYgKyAoKm91dF9sZW4pKyspID0gJy4nOwogICAgICAgICAgICBjcCsrOwogICAgICAgIH0KICAgIH0KICAgIGlmICgoKm91dF9sZW4gPj0gKmJ1Zl9sZW4pICYmCiAgICAgICAgIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1wwJzsKICAgIHJldHVybiAxOwp9CgovKioKICogUHJpbnRzIGFuIG9jdGV0IHN0cmluZyBpbnRvIGEgYnVmZmVyLgogKgogKiBUaGUgdmFyaWFibGUgdmFyIGlzIGVuY29kZWQgYXMgb2N0ZXQgc3RyaW5nLgogKiAKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19vY3RldF9zdHJpbmcodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsIGNvbnN0IGNoYXIgKmhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIHNhdmVkX291dF9sZW4gPSAqb3V0X2xlbjsKICAgIGNvbnN0IGNoYXIgICAgICpzYXZlZF9oaW50ID0gaGludDsKICAgIGludCAgICAgICAgICAgICBoZXggPSAwLCB4ID0gMDsKICAgIHVfY2hhciAgICAgICAgICpjcDsKICAgIGludCAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0LCBjbnQ7CgogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX09DVEVUX1NUUikgJiYgCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICBjb25zdCBjaGFyICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE9DVEVUIFNUUklORyk6ICI7CiAgICAgICAgaWYgKHNubXBfY3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgoKICAgIGlmIChoaW50KSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIHJlcGVhdCwgd2lkdGggPSAxOwogICAgICAgIGxvbmcgICAgICAgICAgICB2YWx1ZTsKICAgICAgICBjaGFyICAgICAgICAgICAgY29kZSA9ICdkJywgc2VwYXIgPSAwLCB0ZXJtID0gMCwgY2gsIGludGJ1ZlszMl07CiAgICAgICAgdV9jaGFyICAgICAgICAgKmVjcDsKCiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlNUUklORzogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNwID0gdmFyLT52YWwuc3RyaW5nOwogICAgICAgIGVjcCA9IGNwICsgdmFyLT52YWxfbGVuOwoKICAgICAgICB3aGlsZSAoY3AgPCBlY3ApIHsKICAgICAgICAgICAgcmVwZWF0ID0gMTsKICAgICAgICAgICAgaWYgKCpoaW50KSB7CiAgICAgICAgICAgICAgICBpZiAoKmhpbnQgPT0gJyonKSB7CiAgICAgICAgICAgICAgICAgICAgcmVwZWF0ID0gKmNwKys7CiAgICAgICAgICAgICAgICAgICAgaGludCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2lkdGggPSAwOwogICAgICAgICAgICAgICAgd2hpbGUgKCcwJyA8PSAqaGludCAmJiAqaGludCA8PSAnOScpCiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAod2lkdGggKiAxMCkgKyAoKmhpbnQrKyAtICcwJyk7CiAgICAgICAgICAgICAgICBjb2RlID0gKmhpbnQrKzsKICAgICAgICAgICAgICAgIGlmICgoY2ggPSAqaGludCkgJiYgY2ggIT0gJyonICYmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykKICAgICAgICAgICAgICAgICAgICAmJiAod2lkdGggIT0gMAogICAgICAgICAgICAgICAgICAgICAgICB8fCAoY2ggIT0gJ3gnICYmIGNoICE9ICdkJyAmJiBjaCAhPSAnbycpKSkKICAgICAgICAgICAgICAgICAgICBzZXBhciA9ICpoaW50Kys7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgc2VwYXIgPSAwOwogICAgICAgICAgICAgICAgaWYgKChjaCA9ICpoaW50KSAmJiBjaCAhPSAnKicgJiYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQogICAgICAgICAgICAgICAgICAgICYmICh3aWR0aCAhPSAwCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaCAhPSAneCcgJiYgY2ggIT0gJ2QnICYmIGNoICE9ICdvJykpKQogICAgICAgICAgICAgICAgICAgIHRlcm0gPSAqaGludCsrOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHRlcm0gPSAwOwogICAgICAgICAgICAgICAgaWYgKHdpZHRoID09IDApICAvKiBIYW5kbGUgbWFsZm9ybWVkIGhpbnQgc3RyaW5ncyAqLwogICAgICAgICAgICAgICAgICAgIHdpZHRoID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2hpbGUgKHJlcGVhdCAmJiBjcCA8IGVjcCkgewogICAgICAgICAgICAgICAgdmFsdWUgPSAwOwogICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gJ2EnICYmIGNvZGUgIT0gJ3QnKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIDI1NiArICpjcCsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICAgICAgICAgY2FzZSAneCc6CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCXzJESUdJVF9IRVhfT1VUUFVUKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB2YWx1ZSA8IDE2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiMCVseCIsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiVseCIsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiVsZCIsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ28nOgogICAgICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJWxvIiwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAndCc6IC8qIG5ldyBpbiByZmMgMzQxMSAqLwogICAgICAgICAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgICAgICAgICAgY250ID0gU05NUF9NSU4od2lkdGgsIGVjcCAtIGNwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX2FzY2lpc3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIGNwLCBjbnQpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBjcCArPSBjbnQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICpvdXRfbGVuID0gc2F2ZWRfb3V0X2xlbjsKICAgICAgICAgICAgICAgICAgICBpZiAoc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoQmFkIGhpbnQgaWdub3JlZDogIikKICAgICAgICAgICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgc2F2ZWRfaGludCkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgIikgIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX29jdGV0X3N0cmluZyhidWYsIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChjcCA8IGVjcCAmJiBzZXBhcikgewogICAgICAgICAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAxKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gc2VwYXI7CiAgICAgICAgICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcMCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXBlYXQtLTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRlcm0gJiYgY3AgPCBlY3ApIHsKICAgICAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAxKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IHRlcm07CiAgICAgICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnXDAnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAodW5pdHMpIHsKICAgICAgICAgICAgcmV0dXJuIChzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICIpCiAgICAgICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdW5pdHMpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCgqb3V0X2xlbiA+PSAqYnVmX2xlbikgJiYKICAgICAgICAgICAgIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1wwJzsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgb3V0cHV0X2Zvcm1hdCA9IG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1NUUklOR19PVVRQVVRfRk9STUFUKTsKICAgIGlmICgwID09IG91dHB1dF9mb3JtYXQpIHsKICAgICAgICBvdXRwdXRfZm9ybWF0ID0gTkVUU05NUF9TVFJJTkdfT1VUUFVUX0dVRVNTOwogICAgfQogICAgc3dpdGNoIChvdXRwdXRfZm9ybWF0KSB7CiAgICBjYXNlIE5FVFNOTVBfU1RSSU5HX09VVFBVVF9HVUVTUzoKICAgICAgICBoZXggPSAwOwogICAgICAgIGZvciAoY3AgPSB2YXItPnZhbC5zdHJpbmcsIHggPSAwOyB4IDwgKGludCkgdmFyLT52YWxfbGVuOyB4KyssIGNwKyspIHsKICAgICAgICAgICAgaWYgKCFpc3ByaW50KCpjcCkgJiYgIWlzc3BhY2UoKmNwKSkgewogICAgICAgICAgICAgICAgaGV4ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIE5FVFNOTVBfU1RSSU5HX09VVFBVVF9BU0NJSToKICAgICAgICBoZXggPSAwOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgTkVUU05NUF9TVFJJTkdfT1VUUFVUX0hFWDoKICAgICAgICBoZXggPSAxOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIGlmICh2YXItPnZhbF9sZW4gPT0gMCkgewogICAgICAgIHJldHVybiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCJcIiIpOwogICAgfQoKICAgIGlmIChoZXgpIHsKICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIiIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiSGV4LVNUUklORzogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX2hleHN0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nLCB2YXItPnZhbF9sZW4pKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCIiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNUUklORzogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIiIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX2FzY2lpc3RyaW5nCiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHZhci0+dmFsLnN0cmluZywKICAgICAgICAgICAgIHZhci0+dmFsX2xlbikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiIikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCgovKioKICogUHJpbnRzIGEgZmxvYXQgaW50byBhIGJ1ZmZlci4KICoKICogVGhlIHZhcmlhYmxlIHZhciBpcyBlbmNvZGVkIGFzIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUuCiAqIAogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2Zsb2F0KHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9GTE9BVCkgJiYKICAgICAgICAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIGlmIChzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICJXcm9uZyBUeXBlIChzaG91bGQgYmUgRmxvYXQpOiAiKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJPcGFxdWU6IEZsb2F0OiAiKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgoKICAgIC8qCiAgICAgKiBIb3cgbXVjaCBzcGFjZSBuZWVkZWQgZm9yIG1heC4gbGVuZ3RoIGZsb2F0PyAgMTI4IGlzIG92ZXJraWxsLiAgCiAgICAgKi8KCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgMTI4ICsgMSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgIiVmIiwgKnZhci0+dmFsLmZsb2F0VmFsKTsKICAgICpvdXRfbGVuICs9IHN0cmxlbigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSk7CgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGEgZG91YmxlIGludG8gYSBidWZmZXIuCiAqCiAqIFRoZSB2YXJpYWJsZSB2YXIgaXMgZW5jb2RlZCBhcyBhIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUuCiAqIAogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2RvdWJsZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0RPVUJMRSkgJiYgCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICBpZiAoc25tcF9jc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIAogICAgICAgICAgICAgIldyb25nIFR5cGUgKHNob3VsZCBiZSBEb3VibGUpOiAiKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJPcGFxdWU6IEZsb2F0OiAiKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIEhvdyBtdWNoIHNwYWNlIG5lZWRlZCBmb3IgbWF4LiBsZW5ndGggZG91YmxlPyAgMTI4IGlzIG92ZXJraWxsLiAgCiAgICAgKi8KCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgMTI4ICsgMSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgIiVmIiwgKnZhci0+dmFsLmRvdWJsZVZhbCk7CiAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwoKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTICovCgoKLyoqCiAqIFByaW50cyBhIGNvdW50ZXIgaW50byBhIGJ1ZmZlci4KICoKICogVGhlIHZhcmlhYmxlIHZhciBpcyBlbmNvZGVkIGFzIGEgY291bnRlciB2YWx1ZS4KICogCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfY291bnRlcjY0KHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICBhNjRidWZbSTY0Q0hBUlNaICsgMV07CgogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX0NPVU5URVI2NAojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfQ09VTlRFUjY0CiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfSTY0ICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX1U2NAojZW5kaWYKICAgICAgICApICYmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgaWYgKHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIENvdW50ZXI2NCk6ICIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgICAgICBpZiAodmFyLT50eXBlICE9IEFTTl9DT1VOVEVSNjQpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJPcGFxdWU6ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KI2VuZGlmCiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgICAgICBzd2l0Y2ggKHZhci0+dHlwZSkgewogICAgICAgIGNhc2UgQVNOX09QQVFVRV9VNjQ6CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiVUludDY0OiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBU05fT1BBUVVFX0k2NDoKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJJbnQ2NDogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQVNOX0NPVU5URVI2NDoKICAgICAgICBjYXNlIEFTTl9PUEFRVUVfQ09VTlRFUjY0OgojZW5kaWYKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJDb3VudGVyNjQ6ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICAgICAgfQojZW5kaWYKICAgIH0KI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgaWYgKHZhci0+dHlwZSA9PSBBU05fT1BBUVVFX0k2NCkgewogICAgICAgIHByaW50STY0KGE2NGJ1ZiwgdmFyLT52YWwuY291bnRlcjY0KTsKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGE2NGJ1ZikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKI2VuZGlmCiAgICAgICAgcHJpbnRVNjQoYTY0YnVmLCB2YXItPnZhbC5jb3VudGVyNjQpOwogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgYTY0YnVmKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIH0KI2VuZGlmCgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGFuIG9iamVjdCBpZGVudGlmaWVyIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2Nfb3BhcXVlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9PUEFRVUUKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgICAgICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0NPVU5URVI2NAogICAgICAgICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX1U2NAogICAgICAgICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0k2NAogICAgICAgICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0ZMT0FUICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0RPVUJMRQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUyAqLwogICAgICAgICkgJiYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICBpZiAoc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE9wYXF1ZSk6ICIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIHN3aXRjaCAodmFyLT50eXBlKSB7CiAgICBjYXNlIEFTTl9PUEFRVUVfQ09VTlRFUjY0OgogICAgY2FzZSBBU05fT1BBUVVFX1U2NDoKICAgIGNhc2UgQVNOX09QQVFVRV9JNjQ6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2NvdW50ZXI2NChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX09QQVFVRV9GTE9BVDoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfZmxvYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT1BBUVVFX0RPVUJMRToKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfZG91YmxlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PUEFRVUU6CiNlbmRpZgogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiT1BBUVVFOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19oZXhzdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZywgdmFyLT52YWxfbGVuKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIH0KI2VuZGlmCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGFuIG9iamVjdCBpZGVudGlmaWVyIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2Nfb2JqZWN0X2lkZW50aWZpZXIodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBpbnQgICAgICAgICAgICAgYnVmX292ZXJmbG93ID0gMDsKCiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fT0JKRUNUX0lEKSAmJgogICAgICAgICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0KICAgICAgICAgICAgIldyb25nIFR5cGUgKHNob3VsZCBiZSBPQkpFQ1QgSURFTlRJRklFUik6ICI7CiAgICAgICAgaWYgKHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJPSUQ6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIG5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2lkICopICh2YXItPnZhbC5vYmppZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWxfbGVuIC8gc2l6ZW9mKG9pZCkpOwoKICAgIGlmIChidWZfb3ZlcmZsb3cpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgoKLyoqCiAqIFByaW50cyBhIHRpbWV0aWNrIHZhcmlhYmxlIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfdGltZXRpY2tzKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICB0aW1lYnVmWzQwXTsKCiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fVElNRVRJQ0tTKSAmJiAKICAgICAgICAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgVGltZXRpY2tzKTogIjsKICAgICAgICBpZiAoc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9OVU1FUklDX1RJTUVUSUNLUykpIHsKICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICBzcHJpbnRmKHN0ciwgIiVsdSIsICoodV9sb25nICopIHZhci0+dmFsLmludGVnZXIpOwogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgIHNwcmludGYoc3RyLCAiVGltZXRpY2tzOiAoJWx1KSAiLCAqKHVfbG9uZyAqKSB2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICB1cHRpbWVTdHJpbmcoKih1X2xvbmcgKikgKHZhci0+dmFsLmludGVnZXIpLCB0aW1lYnVmLCBzaXplb2YodGltZWJ1ZikpOwogICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgdGltZWJ1ZikpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYW4gaW50ZWdlciBhY2NvcmRpbmcgdG8gdGhlIGhpbnQgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFsICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGRlY2ltYWx0eXBlIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IF9OT1RfIGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19oaW50ZWRfaW50ZWdlcih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB2YWwsIGNvbnN0IGNoYXIgZGVjaW1hbHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAgZm10WzEwXSA9ICIlbEAiLCB0bXBbMjU2XTsKICAgIGludCAgICAgICAgICAgICBzaGlmdCwgbGVuOwoKICAgIGlmIChoaW50WzFdID09ICctJykgewogICAgICAgIHNoaWZ0ID0gYXRvaShoaW50ICsgMik7CiAgICB9IGVsc2UgewogICAgICAgIHNoaWZ0ID0gMDsKICAgIH0KCiAgICBpZiAoaGludFswXSA9PSAnZCcpIHsKICAgICAgICAvKgogICAgICAgICAqIFdlIG1pZ2h0ICphY3R1YWxseSogd2FudCBhICd1JyBoZXJlLiAgCiAgICAgICAgICovCiAgICAgICAgZm10WzJdID0gZGVjaW1hbHR5cGU7CiAgICB9IGVsc2UgewogICAgICAgIC8qCiAgICAgICAgICogRElTUExBWS1ISU5UIGNoYXJhY3RlciBpcyAnYicsICdvJywgb3IgJ3gnLiAgCiAgICAgICAgICovCiAgICAgICAgZm10WzJdID0gaGludFswXTsKICAgIH0KCiAgICBzcHJpbnRmKHRtcCwgZm10LCB2YWwpOwogICAgaWYgKHNoaWZ0ICE9IDApIHsKICAgICAgICBsZW4gPSBzdHJsZW4odG1wKTsKICAgICAgICBpZiAoc2hpZnQgPD0gbGVuKSB7CiAgICAgICAgICAgIHRtcFtsZW4gKyAxXSA9IDA7CiAgICAgICAgICAgIHdoaWxlIChzaGlmdC0tKSB7CiAgICAgICAgICAgICAgICB0bXBbbGVuXSA9IHRtcFtsZW4gLSAxXTsKICAgICAgICAgICAgICAgIGxlbi0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRtcFtsZW5dID0gJy4nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRtcFtzaGlmdCArIDFdID0gMDsKICAgICAgICAgICAgd2hpbGUgKHNoaWZ0KSB7CiAgICAgICAgICAgICAgICBpZiAobGVuLS0gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdG1wW3NoaWZ0XSA9IHRtcFtsZW5dOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0bXBbc2hpZnRdID0gJzAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2hpZnQtLTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0bXBbMF0gPSAnLic7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKHVfY2hhciAqKXRtcCk7Cn0KCgovKioKICogUHJpbnRzIGFuIGludGVnZXIgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19pbnRlZ2VyKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAqZW51bV9zdHJpbmcgPSBOVUxMOwoKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9JTlRFR0VSKSAmJiAKICAgICAgICAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgSU5URUdFUik6ICI7CiAgICAgICAgaWYgKHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgZm9yICg7IGVudW1zOyBlbnVtcyA9IGVudW1zLT5uZXh0KSB7CiAgICAgICAgaWYgKGVudW1zLT52YWx1ZSA9PSAqdmFyLT52YWwuaW50ZWdlcikgewogICAgICAgICAgICBlbnVtX3N0cmluZyA9IGVudW1zLT5sYWJlbDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiSU5URUdFUjogIikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChlbnVtX3N0cmluZyA9PSBOVUxMIHx8CiAgICAgICAgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX05VTUVSSUNfRU5VTSkpIHsKICAgICAgICBpZiAoaGludCkgewogICAgICAgICAgICBpZiAoIShzcHJpbnRfcmVhbGxvY19oaW50ZWRfaW50ZWdlcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YXItPnZhbC5pbnRlZ2VyLCAnZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQsIHVuaXRzKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJWxkIiwgKnZhci0+dmFsLmludGVnZXIpOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGVudW1fc3RyaW5nKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgIHNwcmludGYoc3RyLCAiKCVsZCkiLCAqdmFyLT52YWwuaW50ZWdlcik7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBlbnVtX3N0cmluZykpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGFuIHVuc2lnbmVkIGludGVnZXIgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY191aW50ZWdlcih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICplbnVtX3N0cmluZyA9IE5VTEw7CgogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX1VJTlRFR0VSKSAmJiAKICAgICAgICAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgVUludGVnZXIzMik6ICI7CiAgICAgICAgaWYgKHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoOyBlbnVtczsgZW51bXMgPSBlbnVtcy0+bmV4dCkgewogICAgICAgIGlmIChlbnVtcy0+dmFsdWUgPT0gKnZhci0+dmFsLmludGVnZXIpIHsKICAgICAgICAgICAgZW51bV9zdHJpbmcgPSBlbnVtcy0+bGFiZWw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoZW51bV9zdHJpbmcgPT0gTlVMTCB8fAogICAgICAgIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9OVU1FUklDX0VOVU0pKSB7CiAgICAgICAgaWYgKGhpbnQpIHsKICAgICAgICAgICAgaWYgKCEoc3ByaW50X3JlYWxsb2NfaGludGVkX2ludGVnZXIoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFyLT52YWwuaW50ZWdlciwgJ3UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50LCB1bml0cykpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVsdSIsICp2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBlbnVtX3N0cmluZykpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICBzcHJpbnRmKHN0ciwgIiglbHUpIiwgKnZhci0+dmFsLmludGVnZXIpOwogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgZW51bV9zdHJpbmcpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhIGdhdWdlIHZhbHVlIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfZ2F1Z2UodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAgdG1wWzMyXTsKCiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fR0FVR0UpICYmIAogICAgICAgICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0KICAgICAgICAgICAgIldyb25nIFR5cGUgKHNob3VsZCBiZSBHYXVnZTMyIG9yIFVuc2lnbmVkMzIpOiAiOwogICAgICAgIGlmIChzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiR2F1Z2UzMjogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBpZiAoaGludCkgewogICAgICAgIGlmICghc3ByaW50X3JlYWxsb2NfaGludGVkX2ludGVnZXIoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YXItPnZhbC5pbnRlZ2VyLCAndScsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cykpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBzcHJpbnRmKHRtcCwgIiV1IiwgKHVuc2lnbmVkIGludCkoKnZhci0+dmFsLmludGVnZXIgJiAweGZmZmZmZmZmKSk7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAoY29uc3QgdV9jaGFyICopIHRtcCkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhIGNvdW50ZXIgdmFsdWUgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19jb3VudGVyKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAgdG1wWzMyXTsKCiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fQ09VTlRFUikgJiYgCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIENvdW50ZXIzMik6ICI7CiAgICAgICAgaWYgKHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJDb3VudGVyMzI6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgc3ByaW50Zih0bXAsICIldSIsICh1bnNpZ25lZCBpbnQpKCp2YXItPnZhbC5pbnRlZ2VyICYgMHhmZmZmZmZmZikpOwogICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgdG1wKSkgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhIG5ldHdvcmsgYWRkcmVzcyBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX25ldHdvcmthZGRyZXNzKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLCBjb25zdCBjaGFyICpoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIGk7CgogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX0lQQUREUkVTUykgJiYgCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE5ldHdvcmtBZGRyZXNzKTogIjsKICAgICAgICBpZiAoc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIk5ldHdvcmsgQWRkcmVzczogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgd2hpbGUgKCgqb3V0X2xlbiArICh2YXItPnZhbF9sZW4gKiAzKSArIDIpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCB2YXItPnZhbF9sZW47IGkrKykgewogICAgICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICIlMDJYIiwgdmFyLT52YWwuc3RyaW5nW2ldKTsKICAgICAgICAqb3V0X2xlbiArPSAyOwogICAgICAgIGlmIChpIDwgdmFyLT52YWxfbGVuIC0gMSkgewogICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnOic7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYW4gaXAtYWRkcmVzcyBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2lwYWRkcmVzcyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICB1X2NoYXIgICAgICAgICAqaXAgPSB2YXItPnZhbC5zdHJpbmc7CgogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX0lQQUREUkVTUykgJiYgCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIElwQWRkcmVzcyk6ICI7CiAgICAgICAgaWYgKHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJJcEFkZHJlc3M6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgd2hpbGUgKCgqb3V0X2xlbiArIDE3KSA+PSAqYnVmX2xlbikgewogICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIGlmIChpcCkKICAgICAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAiJWQuJWQuJWQuJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwWzBdLCBpcFsxXSwgaXBbMl0sIGlwWzNdKTsKICAgICpvdXRfbGVuICs9IHN0cmxlbigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSk7CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYSBudWxsIHZhbHVlIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfbnVsbCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX05VTEwpICYmIAogICAgICAgICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBOVUxMKTogIjsKICAgICAgICBpZiAoc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJOVUxMIjsKICAgICAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpOwogICAgfQp9CgoKLyoqCiAqIFByaW50cyBhIGJpdCBzdHJpbmcgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19iaXRzdHJpbmcodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgaW50ICAgICAgICAgICAgIGxlbiwgYml0OwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgY2hhciAgICAgICAgICAgKmVudW1fc3RyaW5nOwoKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9CSVRfU1RSICYmIHZhci0+dHlwZSAhPSBBU05fT0NURVRfU1RSKSAmJgogICAgICAgICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBCSVRTKTogIjsKICAgICAgICBpZiAoc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiXCIiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIkJJVFM6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgaWYgKCFzcHJpbnRfcmVhbGxvY19oZXhzdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuYml0c3RyaW5nLCB2YXItPnZhbF9sZW4pKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiXCIiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgY3AgPSB2YXItPnZhbC5iaXRzdHJpbmc7CiAgICAgICAgZm9yIChsZW4gPSAwOyBsZW4gPCAoaW50KSB2YXItPnZhbF9sZW47IGxlbisrKSB7CiAgICAgICAgICAgIGZvciAoYml0ID0gMDsgYml0IDwgODsgYml0KyspIHsKICAgICAgICAgICAgICAgIGlmICgqY3AgJiAoMHg4MCA+PiBiaXQpKSB7CiAgICAgICAgICAgICAgICAgICAgZW51bV9zdHJpbmcgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIGZvciAoOyBlbnVtczsgZW51bXMgPSBlbnVtcy0+bmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW51bXMtPnZhbHVlID09IChsZW4gKiA4KSArIGJpdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bV9zdHJpbmcgPSBlbnVtcy0+bGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZW51bV9zdHJpbmcgPT0gTlVMTCB8fAogICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfUFJJTlRfTlVNRVJJQ19FTlVNKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlZCAiLCAobGVuICogOCkgKyBiaXQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIoJWQpICIsIChsZW4gKiA4KSArIGJpdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBlbnVtX3N0cmluZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjcCsrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgppbnQKc3ByaW50X3JlYWxsb2NfbnNhcGFkZHJlc3ModV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsIGNvbnN0IGNoYXIgKmhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fTlNBUCkgJiYgCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE5zYXBBZGRyZXNzKTogIjsKICAgICAgICBpZiAoc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIk5zYXBBZGRyZXNzOiAiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nLCB2YXItPnZhbF9sZW4pOwp9CgoKLyoqCiAqIEZhbGxiYWNrIHJvdXRpbmUgZm9yIGEgYmFkIHR5cGUsIHByaW50cyAiVmFyaWFibGUgaGFzIGJhZCB0eXBlIiBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2JhZHR5cGUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJWYXJpYWJsZSBoYXMgYmFkIHR5cGUiOwoKICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cik7Cn0KCgoKLyoqCiAqIFVuaXZlcnNhbCBwcmludCByb3V0aW5lLCBwcmludHMgYSB2YXJpYWJsZSBpbnRvIGEgYnVmZmVyIGFjY29yZGluZyB0byB0aGUgdmFyaWFibGUgCiAqIHR5cGUuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfYnlfdHlwZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgREVCVUdNU0dUTCgoIm91dHB1dCIsICJzcHJpbnRfYnlfdHlwZSwgdHlwZSAlZFxuIiwgdmFyLT50eXBlKSk7CgogICAgc3dpdGNoICh2YXItPnR5cGUpIHsKICAgIGNhc2UgQVNOX0lOVEVHRVI6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2ludGVnZXIoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgIGNhc2UgQVNOX09DVEVUX1NUUjoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2Nfb2N0ZXRfc3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICBjYXNlIEFTTl9CSVRfU1RSOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19iaXRzdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgIGNhc2UgQVNOX09QQVFVRToKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2Nfb3BhcXVlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgIGNhc2UgQVNOX09CSkVDVF9JRDoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2Nfb2JqZWN0X2lkZW50aWZpZXIoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9USU1FVElDS1M6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX3RpbWV0aWNrcyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgY2FzZSBBU05fR0FVR0U6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2dhdWdlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fQ09VTlRFUjoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfY291bnRlcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fSVBBRERSRVNTOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19pcGFkZHJlc3MoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgIGNhc2UgQVNOX05VTEw6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX251bGwoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgIGNhc2UgQVNOX1VJTlRFR0VSOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY191aW50ZWdlcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgIGNhc2UgQVNOX0NPVU5URVI2NDoKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgY2FzZSBBU05fT1BBUVVFX1U2NDoKICAgIGNhc2UgQVNOX09QQVFVRV9JNjQ6CiAgICBjYXNlIEFTTl9PUEFRVUVfQ09VTlRFUjY0OgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUyAqLwogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19jb3VudGVyNjQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgY2FzZSBBU05fT1BBUVVFX0ZMT0FUOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19mbG9hdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgIGNhc2UgQVNOX09QQVFVRV9ET1VCTEU6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2RvdWJsZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTICovCiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzcHJpbnRfYnlfdHlwZSIsICJiYWQgdHlwZTogJWRcbiIsIHZhci0+dHlwZSkpOwogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19iYWR0eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICB9Cn0KCgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwovKioKICogUmV0cmlldmVzIHRoZSB0cmVlIGhlYWQuCiAqCiAqIEByZXR1cm4gdGhlIHRyZWUgaGVhZC4KICovCnN0cnVjdCB0cmVlICAgICoKZ2V0X3RyZWVfaGVhZCh2b2lkKQp7CiAgICByZXR1cm4gKHRyZWVfaGVhZCk7Cn0KCnN0YXRpYyBjaGFyICAgICpjb25mbWliZGlyID0gTlVMTDsKc3RhdGljIGNoYXIgICAgKmNvbmZtaWJzID0gTlVMTDsKCnN0YXRpYyB2b2lkCmhhbmRsZV9taWJkaXJzX2NvbmYoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIGNoYXIgICAgICAgICAgICpjdG1wOwoKICAgIGlmIChjb25mbWliZGlyKSB7CiAgICAgICAgaWYgKCgqbGluZSA9PSAnKycpIHx8ICgqbGluZSA9PSAnLScpKSB7CiAgICAgICAgICAgIGN0bXAgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGNvbmZtaWJkaXIpICsgc3RybGVuKGxpbmUpICsgMik7CiAgICAgICAgICAgIGlmICghY3RtcCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pYmRpciBjb25mIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoKmxpbmUrKyA9PSAnKycpCiAgICAgICAgICAgICAgICBzcHJpbnRmKGN0bXAsICIlcyVjJXMiLCBjb25mbWliZGlyLCBFTlZfU0VQQVJBVE9SX0NIQVIsIGxpbmUpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzcHJpbnRmKGN0bXAsICIlcyVjJXMiLCBsaW5lLCBFTlZfU0VQQVJBVE9SX0NIQVIsIGNvbmZtaWJkaXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGN0bXAgPSBzdHJkdXAobGluZSk7CiAgICAgICAgICAgIGlmICghY3RtcCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAibWlicyBjb25mIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgU05NUF9GUkVFKGNvbmZtaWJkaXIpOwogICAgfSBlbHNlIHsKICAgICAgICBjdG1wID0gc3RyZHVwKGxpbmUpOwogICAgICAgIGlmICghY3RtcCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJtaWJzIGNvbmYgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGNvbmZtaWJkaXIgPSBjdG1wOwogICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAidXNpbmcgbWliZGlyczogJXNcbiIsIGNvbmZtaWJkaXIpKTsKfQoKc3RhdGljIHZvaWQKaGFuZGxlX21pYnNfY29uZihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSkKewogICAgY2hhciAgICAgICAgICAgKmN0bXA7CgogICAgaWYgKGNvbmZtaWJzKSB7CiAgICAgICAgaWYgKCgqbGluZSA9PSAnKycpIHx8ICgqbGluZSA9PSAnLScpKSB7CiAgICAgICAgICAgIGN0bXAgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGNvbmZtaWJzKSArIHN0cmxlbihsaW5lKSArIDIpOwogICAgICAgICAgICBpZiAoIWN0bXApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgIm1pYnMgY29uZiBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKCpsaW5lKysgPT0gJysnKQogICAgICAgICAgICAgICAgc3ByaW50ZihjdG1wLCAiJXMlYyVzIiwgY29uZm1pYnMsIEVOVl9TRVBBUkFUT1JfQ0hBUiwgbGluZSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHNwcmludGYoY3RtcCwgIiVzJWMlcyIsIGxpbmUsIEVOVl9TRVBBUkFUT1JfQ0hBUiwgY29uZm1pYmRpcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY3RtcCA9IHN0cmR1cChsaW5lKTsKICAgICAgICAgICAgaWYgKCFjdG1wKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJtaWJzIGNvbmYgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBTTk1QX0ZSRUUoY29uZm1pYnMpOwogICAgfSBlbHNlIHsKICAgICAgICBjdG1wID0gc3RyZHVwKGxpbmUpOwogICAgICAgIGlmICghY3RtcCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJtaWJzIGNvbmYgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGNvbmZtaWJzID0gY3RtcDsKICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgInVzaW5nIG1pYnM6ICVzXG4iLCBjb25mbWlicykpOwp9CgoKc3RhdGljIHZvaWQKaGFuZGxlX21pYmZpbGVfY29uZihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSkKewogICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAicmVhZGluZyBtaWJmaWxlOiAlc1xuIiwgbGluZSkpOwogICAgcmVhZF9taWIobGluZSk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZApoYW5kbGVfcHJpbnRfbnVtZXJpYyhjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSkKewogICAgY29uc3QgY2hhciAqdmFsdWU7CiAgICBjaGFyICAgICAgICpzdDsKCiAgICB2YWx1ZSA9IHN0cnRva19yKGxpbmUsICIgXHRcbiIsICZzdCk7CiAgICBpZiAodmFsdWUgJiYgKAoJICAgIChzdHJjYXNlY21wKHZhbHVlLCAieWVzIikgID09IDApIHx8IAoJICAgIChzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpID09IDApIHx8CgkgICAgKCp2YWx1ZSA9PSAnMScpICkpIHsKCiAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9PSURfT1VUUFVUX05VTUVSSUMpOwogICAgfQp9CgpjaGFyICAgICAgICAgICAqCnNubXBfb3V0X3RvZ2dsZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMpCnsKICAgIHdoaWxlICgqb3B0aW9ucykgewogICAgICAgIHN3aXRjaCAoKm9wdGlvbnMrKykgewogICAgICAgIGNhc2UgJzAnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl8yRElHSVRfSEVYX09VVFBVVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2EnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9TVFJJTkdfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9TVFJJTkdfT1VUUFVUX0FTQ0lJKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnYic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9ET05UX0JSRUFLRE9XTl9PSURTKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9OVU1FUklDX0VOVU0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdFJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VTQ0FQRV9RVU9URVMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdmJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfT0lEX09VVFBVVF9GVUxMKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3EnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdRJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCwgMSk7CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9PSURfT1VUUFVUX1NVRkZJWCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1MnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9PSURfT1VUUFVUX01PRFVMRSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3QnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTlVNRVJJQ19USU1FVElDS1MpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdUJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX0hFWF9URVhUKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAndSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX09JRF9PVVRQVVRfVUNEKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnVSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9ET05UX1BSSU5UX1VOSVRTKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAndic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9CQVJFX1ZBTFVFKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAneCc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1NUUklOR19PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX1NUUklOR19PVVRQVVRfSEVYKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnWCc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FWFRFTkRFRF9JTkRFWCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zIC0gMTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKdm9pZApzbm1wX291dF90b2dnbGVfb3B0aW9uc191c2FnZShjb25zdCBjaGFyICpsZWFkLCBGSUxFICogb3V0ZikKewogICAgZnByaW50ZihvdXRmLCAiJXMwOiAgcHJpbnQgbGVhZGluZyAwIGZvciBzaW5nbGUtZGlnaXQgaGV4IGNoYXJhY3RlcnNcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNhOiAgcHJpbnQgYWxsIHN0cmluZ3MgaW4gYXNjaWkgZm9ybWF0XG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzYjogIGRvIG5vdCBicmVhayBPSUQgaW5kZXhlcyBkb3duXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzZTogIHByaW50IGVudW1zIG51bWVyaWNhbGx5XG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzRTogIGVzY2FwZSBxdW90ZXMgaW4gc3RyaW5nIGluZGljZXNcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNmOiAgcHJpbnQgZnVsbCBPSURzIG9uIG91dHB1dFxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc246ICBwcmludCBPSURzIG51bWVyaWNhbGx5XG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzcTogIHF1aWNrIHByaW50IGZvciBlYXNpZXIgcGFyc2luZ1xuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc1E6ICBxdWljayBwcmludCB3aXRoIGVxdWFsLXNpZ25zXG4iLCBsZWFkKTsgICAgLyogQEBKRFcgKi8KICAgIGZwcmludGYob3V0ZiwgIiVzczogIHByaW50IG9ubHkgbGFzdCBzeW1ib2xpYyBlbGVtZW50IG9mIE9JRFxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc1M6ICBwcmludCBNSUIgbW9kdWxlLWlkIHBsdXMgbGFzdCBlbGVtZW50XG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzdDogIHByaW50IHRpbWV0aWNrcyB1bnBhcnNlZCBhcyBudW1lcmljIGludGVnZXJzXG4iLAogICAgICAgICAgICBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwKICAgICAgICAgICAgIiVzVDogIHByaW50IGh1bWFuLXJlYWRhYmxlIHRleHQgYWxvbmcgd2l0aCBoZXggc3RyaW5nc1xuIiwKICAgICAgICAgICAgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc3U6ICBwcmludCBPSURzIHVzaW5nIFVDRC1zdHlsZSBwcmVmaXggc3VwcHJlc3Npb25cbiIsCiAgICAgICAgICAgIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNVOiAgZG9uJ3QgcHJpbnQgdW5pdHNcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXN2OiAgcHJpbnQgdmFsdWVzIG9ubHkgKG5vdCBPSUQgPSB2YWx1ZSlcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXN4OiAgcHJpbnQgYWxsIHN0cmluZ3MgaW4gaGV4IGZvcm1hdFxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc1g6ICBleHRlbmRlZCBpbmRleCBmb3JtYXRcbiIsIGxlYWQpOwp9CgpjaGFyICoKc25tcF9pbl9vcHRpb25zKGNoYXIgKm9wdGFyZywgaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2KQp7CiAgICBjaGFyICpjcDsKCiAgICBmb3IgKGNwID0gb3B0YXJnOyAqY3A7IGNwKyspIHsKICAgICAgICBzd2l0Y2ggKCpjcCkgewogICAgICAgIGNhc2UgJ2InOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUkVHRVhfQUNDRVNTKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnUic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9SQU5ET01fQUNDRVNTKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9ET05UX0NIRUNLX1JBTkdFKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9OT19ESVNQTEFZX0hJTlQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd1JzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1JFQURfVUNEX1NUWUxFX09JRCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAvKiBXaGF0IGlmIGFyZ2MvYXJndiBhcmUgbnVsbCA/ICovCiAgICAgICAgICAgIGlmICghKigrK2NwKSkKICAgICAgICAgICAgICAgIGNwID0gYXJndltvcHRpbmQrK107CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9PSURTVUZGSVgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcCk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwoKICAgICAgICBjYXNlICdTJzoKICAgICAgICAgICAgLyogV2hhdCBpZiBhcmdjL2FyZ3YgYXJlIG51bGwgPyAqLwogICAgICAgICAgICBpZiAoISooKytjcCkpCiAgICAgICAgICAgICAgICBjcCA9IGFyZ3Zbb3B0aW5kKytdOwogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfT0lEUFJFRklYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ApOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAvKgogICAgICAgICAgICAqICBIZXJlPyAgT3IgaW4gc25tcF9wYXJzZV9hcmdzPwogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiVW5rbm93biBpbnB1dCBvcHRpb24gcGFzc2VkIHRvIC1JOiAlYy5cbiIsICpjcCk7CiAgICAgICAgICAgICovCiAgICAgICAgICAgIHJldHVybiBjcDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKY2hhciAgICAgICAgICAgKgpzbm1wX2luX3RvZ2dsZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMpCnsKICAgIHJldHVybiBzbm1wX2luX29wdGlvbnMoIG9wdGlvbnMsIDAsIE5VTEwgKTsKfQoKCi8qKgogKiBQcmludHMgb3V0IGEgaGVscCB1c2FnZSBmb3IgdGhlIGluKiB0b2dnbGUgb3B0aW9ucy4KICoKICogQHBhcmFtIGxlYWQgICAgICBUaGUgbGVhZCB0byBwcmludCBmb3IgZXZlcnkgbGluZS4KICogQHBhcmFtIG91dGYgICAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlIHRvLgogKiAKICovCnZvaWQKc25tcF9pbl90b2dnbGVfb3B0aW9uc191c2FnZShjb25zdCBjaGFyICpsZWFkLCBGSUxFICogb3V0ZikKewogICAgZnByaW50ZihvdXRmLCAiJXNiOiAgZG8gYmVzdC9yZWdleCBtYXRjaGluZyB0byBmaW5kIGEgTUlCIG5vZGVcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNoOiAgZG9uJ3QgYXBwbHkgRElTUExBWS1ISU5Uc1xuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc3I6ICBkbyBub3QgY2hlY2sgdmFsdWVzIGZvciByYW5nZS90eXBlIGxlZ2FsaXR5XG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzUjogIGRvIHJhbmRvbSBhY2Nlc3MgdG8gT0lEIGxhYmVsc1xuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsCiAgICAgICAgICAgICIlc3U6ICB0b3AtbGV2ZWwgT0lEcyBtdXN0IGhhdmUgJy4nIHByZWZpeCAoVUNELXN0eWxlKVxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsCiAgICAgICAgICAgICIlc3MgU1VGRklYOiAgQXBwZW5kIGFsbCB0ZXh0dWFsIE9JRHMgd2l0aCBTVUZGSVggYmVmb3JlIHBhcnNpbmdcbiIsCiAgICAgICAgICAgIGxlYWQpOwogICAgZnByaW50ZihvdXRmLAogICAgICAgICAgICAiJXNTIFBSRUZJWDogIFByZXBlbmQgYWxsIHRleHR1YWwgT0lEcyB3aXRoIFBSRUZJWCBiZWZvcmUgcGFyc2luZ1xuIiwKICAgICAgICAgICAgbGVhZCk7Cn0KCi8qKioKICoKICovIAp2b2lkCnJlZ2lzdGVyX21pYl9oYW5kbGVycyh2b2lkKQp7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICByZWdpc3Rlcl9wcmVuZXRzbm1wX21pYl9oYW5kbGVyKCJzbm1wIiwgIm1pYmRpcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfbWliZGlyc19jb25mLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW21pYi1kaXJzfCttaWItZGlyc3wtbWliLWRpcnNdIik7CiAgICByZWdpc3Rlcl9wcmVuZXRzbm1wX21pYl9oYW5kbGVyKCJzbm1wIiwgIm1pYnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfbWlic19jb25mLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW21pYi10b2tlbnN8K21pYi10b2tlbnNdIik7CiAgICByZWdpc3Rlcl9jb25maWdfaGFuZGxlcigic25tcCIsICJtaWJmaWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9taWJmaWxlX2NvbmYsIE5VTEwsICJtaWJmaWxlLXRvLXJlYWQiKTsKICAgIC8qCiAgICAgKiByZWdpc3RlciB0aGUgc25tcC5jb25mIGNvbmZpZ3VyYXRpb24gaGFuZGxlcnMgZm9yIGRlZmF1bHQKICAgICAqIHBhcnNpbmcgYmVoYXZpb3VyIAogICAgICovCgogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgInNob3dNaWJFcnJvcnMiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCX0VSUk9SUyk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAiY29tbWVudFRvRU9MIiwgICAgIC8qIERlc2NyaWJlcyBhY3R1YWwgYmVoYXZpb3VyICovCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfQ09NTUVOVF9URVJNKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJzdHJpY3RDb21tZW50VGVybSIsICAgIC8qIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQl9DT01NRU5UX1RFUk0pOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgIm1pYkFsbG93VW5kZXJsaW5lIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQl9QQVJTRV9MQUJFTCk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fSU5URUdFUiwgInNubXAiLCAibWliV2FybmluZ0xldmVsIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUyk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAibWliUmVwbGFjZVdpdGhMYXRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCX1JFUExBQ0UpOwojZW5kaWYKCiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAicHJpbnROdW1lcmljRW51bXMiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfTlVNRVJJQ19FTlVNKTsKICAgIHJlZ2lzdGVyX3ByZW5ldHNubXBfbWliX2hhbmRsZXIoInNubXAiLCAicHJpbnROdW1lcmljT2lkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3ByaW50X251bWVyaWMsIE5VTEwsICIoMXx5ZXN8dHJ1ZXwwfG5vfGZhbHNlKSIpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgImVzY2FwZVF1b3RlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FU0NBUEVfUVVPVEVTKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJkb250QnJlYWtkb3duT2lkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9ET05UX0JSRUFLRE9XTl9PSURTKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJxdWlja1ByaW50aW5nIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJudW1lcmljVGltZXRpY2tzIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX05VTUVSSUNfVElNRVRJQ0tTKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9JTlRFR0VSLCAic25tcCIsICJvaWRPdXRwdXRGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0lOVEVHRVIsICJzbm1wIiwgInN1ZmZpeFByaW50aW5nIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFUKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJleHRlbmRlZEluZGV4IiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VYVEVOREVEX0lOREVYKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJwcmludEhleFRleHQiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfSEVYX1RFWFQpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgInByaW50VmFsdWVPbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX0JBUkVfVkFMVUUpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgImRvbnRQcmludFVuaXRzIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfUFJJTlRfVU5JVFMpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0lOVEVHRVIsICJzbm1wIiwgImhleE91dHB1dExlbmd0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9IRVhfT1VUUFVUX0xFTkdUSCk7Cn0KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCi8qCiAqIGZ1bmN0aW9uIDogbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeQogKiAgICAgICAgICAgIC0gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBzdHJpbmcgb2YgdGhlIGRpcmVjdG9yaWVzCiAqICAgICAgICAgICAgICBmcm9tIHdoaWNoIHRoZSBNSUIgbW9kdWxlcyB3aWxsIGJlIHNlYXJjaGVkIG9yCiAqICAgICAgICAgICAgICBsb2FkZWQuCiAqIGFyZ3VtZW50czogY29uc3QgY2hhciAqZGlyLCB3aGljaCBhcmUgdGhlIGRpcmVjdG9yaWVzCiAqICAgICAgICAgICAgICBmcm9tIHdoaWNoIHRoZSBNSUIgbW9kdWxlcyB3aWxsIGJlIHNlYXJjaGVkIG9yCiAqICAgICAgICAgICAgICBsb2FkZWQuCiAqIHJldHVybnMgIDogLQogKi8Kdm9pZApuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KGNvbnN0IGNoYXIgKmRpcikKewogICAgY29uc3QgY2hhciAqbmV3ZGlyOwogICAgY2hhciAqb2xkZGlyLCAqdG1wZGlyID0gTlVMTDsKCiAgICBERUJVR1RSQUNFOwogICAgaWYgKE5VTEwgPT0gZGlyKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICBvbGRkaXIgPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAoJCQkJICAgTkVUU05NUF9EU19MSUJfTUlCRElSUyk7CiAgICBpZiAob2xkZGlyKSB7CiAgICAgICAgaWYgKCgqZGlyID09ICcrJykgfHwgKCpkaXIgPT0gJy0nKSkgewogICAgICAgICAgICAvKiogTmV3IGRpciBzdGFydHMgd2l0aCAnKycsIHRodXMgd2UgYWRkIGl0LiAqLwogICAgICAgICAgICB0bXBkaXIgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oZGlyKSArIHN0cmxlbihvbGRkaXIpICsgMik7CiAgICAgICAgICAgIGlmICghdG1wZGlyKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJzZXQgbWliZGlyIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCpkaXIrKyA9PSAnKycpCiAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcGRpciwgIiVzJWMlcyIsIG9sZGRpciwgRU5WX1NFUEFSQVRPUl9DSEFSLCBkaXIpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcGRpciwgIiVzJWMlcyIsIGRpciwgRU5WX1NFUEFSQVRPUl9DSEFSLCBvbGRkaXIpOwogICAgICAgICAgICBuZXdkaXIgPSB0bXBkaXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV3ZGlyID0gZGlyOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLyoqIElmIGRpciBzdGFydHMgd2l0aCAnKycgc2tpcCAnKycgaXQuICovCiAgICAgICAgbmV3ZGlyID0gKCgqZGlyID09ICcrJykgPyArK2RpciA6IGRpcik7CiAgICB9CiAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJESVJTLAogICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2Rpcik7CgogICAgLyoqIHNldF9zdHJpbmcgY2FsbHMgc3RyZHVwLCBzbyBpZiB3ZSBhbGxvY2F0ZWQgbWVtb3J5LCBmcmVlIGl0ICovCiAgICBpZiAodG1wZGlyID09IG5ld2RpcikgewogICAgICAgIFNOTVBfRlJFRSh0bXBkaXIpOwogICAgfQp9CgovKgogKiBmdW5jdGlvbiA6IG5ldHNubXBfZ2V0X21pYl9kaXJlY3RvcnkKICogICAgICAgICAgICAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZyBvZiB0aGUgZGlyZWN0b3JpZXMKICogICAgICAgICAgICAgIGZyb20gd2hpY2ggdGhlIE1JQiBtb2R1bGVzIHdpbGwgYmUgc2VhcmNoZWQgb3IKICogICAgICAgICAgICAgIGxvYWRlZC4KICogICAgICAgICAgICAgIElmIHRoZSB2YWx1ZSBzdGlsbCBkb2VzIG5vdCBleGlzdHMsIGl0IHdpbGwgYmUgbWFkZQogKiAgICAgICAgICAgICAgZnJvbSB0aGUgZXZpcm9ubWVudCB2YXJpYWJsZSAnTUlCRElSUycgYW5kL29yIHRoZQogKiAgICAgICAgICAgICAgZGVmYXVsdC4KICogYXJndW1lbnRzOiAtCiAqIHJldHVybnMgIDogY2hhciAqIG9mIHRoZSBkaXJlY3RvcmllcyBpbiB3aGljaCB0aGUgTUlCIG1vZHVsZXMKICogICAgICAgICAgICB3aWxsIGJlIHNlYXJjaGVkL2xvYWRlZC4KICovCgpjaGFyICoKbmV0c25tcF9nZXRfbWliX2RpcmVjdG9yeSh2b2lkKQp7CiAgICBjaGFyICpkaXI7CgogICAgREVCVUdUUkFDRTsKICAgIGRpciA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQkRJUlMpOwogICAgaWYgKGRpciA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm5vIG1pYiBkaXJlY3RvcmllcyBzZXRcbiIpKTsKCiAgICAgICAgLyoqIENoZWNrIGlmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQgKi8KICAgICAgICBkaXIgPSBuZXRzbm1wX2dldGVudigiTUlCRElSUyIpOwogICAgICAgIGlmIChkaXIgPT0gTlVMTCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibm8gbWliIGRpcmVjdG9yaWVzIHNldCBieSBlbnZpcm9ubWVudFxuIikpOwogICAgICAgICAgICAvKiogTm90IHNldCB1c2UgaGFyZCBjb2RlZCBwYXRoICovCiAgICAgICAgICAgIGlmIChjb25mbWliZGlyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJubyBtaWIgZGlyZWN0b3JpZXMgc2V0IGJ5IGNvbmZpZ1xuIikpOwogICAgICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShORVRTTk1QX0RFRkFVTFRfTUlCRElSUyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoKCpjb25mbWliZGlyID09ICcrJykgfHwgKCpjb25mbWliZGlyID09ICctJykpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJtaWIgZGlyZWN0b3JpZXMgc2V0IGJ5IGNvbmZpZyAoYnV0IGFkZGVkKVxuIikpOwogICAgICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShORVRTTk1QX0RFRkFVTFRfTUlCRElSUyk7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KGNvbmZtaWJkaXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm1pYiBkaXJlY3RvcmllcyBzZXQgYnkgY29uZmlnXG4iKSk7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KGNvbmZtaWJkaXIpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICgoKmRpciA9PSAnKycpIHx8ICgqZGlyID09ICctJykpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm1pYiBkaXJlY3RvcmllcyBzZXQgYnkgZW52aXJvbm1lbnQgKGJ1dCBhZGRlZClcbiIpKTsKICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShORVRTTk1QX0RFRkFVTFRfTUlCRElSUyk7CiAgICAgICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoZGlyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibWliIGRpcmVjdG9yaWVzIHNldCBieSBlbnZpcm9ubWVudFxuIikpOwogICAgICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KGRpcik7CiAgICAgICAgfQogICAgICAgIGRpciA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQkRJUlMpOwogICAgfQogICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm1pYiBkaXJlY3RvcmllcyBzZXQgJyVzJ1xuIiwgZGlyKSk7CiAgICByZXR1cm4oZGlyKTsKfQoKLyoKICogZnVuY3Rpb24gOiBuZXRzbm1wX2ZpeHVwX21pYl9kaXJlY3RvcnkKICogYXJndW1lbnRzOiAtCiAqIHJldHVybnMgIDogLQogKi8Kdm9pZApuZXRzbm1wX2ZpeHVwX21pYl9kaXJlY3Rvcnkodm9pZCkKewogICAgY2hhciAqaG9tZXBhdGggPSBuZXRzbm1wX2dldGVudigiSE9NRSIpOwogICAgY2hhciAqbWlicGF0aCA9IG5ldHNubXBfZ2V0X21pYl9kaXJlY3RvcnkoKTsKICAgIGNoYXIgKm9sZG1pYnBhdGggPSBOVUxMOwogICAgY2hhciAqcHRyX2hvbWU7CiAgICBjaGFyICpuZXdfbWlicGF0aDsKCiAgICBERUJVR1RSQUNFOwogICAgaWYgKGhvbWVwYXRoICYmIG1pYnBhdGgpIHsKICAgICAgICBERUJVR01TR1RMKCgiZml4dXBfbWliX2RpcmVjdG9yeSIsICJtaWIgZGlyZWN0b3JpZXMgJyVzJ1xuIiwgbWlicGF0aCkpOwogICAgICAgIHdoaWxlICgocHRyX2hvbWUgPSBzdHJzdHIobWlicGF0aCwgIiRIT01FIikpKSB7CiAgICAgICAgICAgIG5ld19taWJwYXRoID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKG1pYnBhdGgpIC0gc3RybGVuKCIkSE9NRSIpICsKCQkJCQkgc3RybGVuKGhvbWVwYXRoKSsxKTsKICAgICAgICAgICAgaWYgKG5ld19taWJwYXRoKSB7CiAgICAgICAgICAgICAgICAqcHRyX2hvbWUgPSAwOyAvKiBudWxsIG91dCB0aGUgc3BvdCB3aGVyZSB3ZSBzdG9wIGNvcHlpbmcgKi8KICAgICAgICAgICAgICAgIHNwcmludGYobmV3X21pYnBhdGgsICIlcyVzJXMiLCBtaWJwYXRoLCBob21lcGF0aCwKCQkJcHRyX2hvbWUgKyBzdHJsZW4oIiRIT01FIikpOwogICAgICAgICAgICAgICAgLyoqIHN3YXAgaW4gdGhlIG5ldyB2YWx1ZSBhbmQgcmVwZWF0ICovCiAgICAgICAgICAgICAgICBtaWJwYXRoID0gbmV3X21pYnBhdGg7CgkJaWYgKG9sZG1pYnBhdGggIT0gTlVMTCkgewoJCSAgICBTTk1QX0ZSRUUob2xkbWlicGF0aCk7CgkJfQoJCW9sZG1pYnBhdGggPSBuZXdfbWlicGF0aDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KG1pYnBhdGgpOwoJCgkvKiAgVGhlIGFib3ZlIGNvcGllcyB0aGUgbWlicGF0aCBmb3IgdXMsIHNvLi4uICAqLwoKCWlmIChvbGRtaWJwYXRoICE9IE5VTEwpIHsKCSAgICBTTk1QX0ZSRUUob2xkbWlicGF0aCk7Cgl9CgogICAgfQoKfQoKLyoqCiAqIEluaXRpYWxpc2VzIHRoZSBtaWIgcmVhZGVyLgogKgogKiBSZWFkcyBpbiBhbGwgc2V0dGluZ3MgZnJvbSB0aGUgZW52aXJvbm1lbnQuCiAqLwp2b2lkCm5ldHNubXBfaW5pdF9taWIodm9pZCkKewogICAgY29uc3QgY2hhciAgICAgKnByZWZpeDsKICAgIGNoYXIgICAgICAgICAgICplbnZfdmFyLCAqZW50cnk7CiAgICBQcmVmaXhMaXN0UHRyICAgcHAgPSAmbWliX3ByZWZpeGVzWzBdOwogICAgY2hhciAgICAgICAgICAgKnN0ID0gTlVMTDsKCiAgICBpZiAoTWliKQogICAgICAgIHJldHVybjsKICAgIG5ldHNubXBfaW5pdF9taWJfaW50ZXJuYWxzKCk7CgogICAgLyoKICAgICAqIEluaXRpYWxpc2UgdGhlIE1JQiBkaXJlY3RvcnkvaWVzIAogICAgICovCiAgICBuZXRzbm1wX2ZpeHVwX21pYl9kaXJlY3RvcnkoKTsKICAgIGVudl92YXIgPSBzdHJkdXAobmV0c25tcF9nZXRfbWliX2RpcmVjdG9yeSgpKTsKICAgIG5ldHNubXBfbWliaW5kZXhfbG9hZCgpOwoKICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsCiAgICAgICAgICAgICAgICAiU2VlbiBNSUJESVJTOiBMb29raW5nIGluICclcycgZm9yIG1pYiBkaXJzIC4uLlxuIiwKICAgICAgICAgICAgICAgIGVudl92YXIpKTsKCiAgICBlbnRyeSA9IHN0cnRva19yKGVudl92YXIsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICB3aGlsZSAoZW50cnkpIHsKICAgICAgICBhZGRfbWliZGlyKGVudHJ5KTsKICAgICAgICBlbnRyeSA9IHN0cnRva19yKE5VTEwsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICB9CiAgICBTTk1QX0ZSRUUoZW52X3Zhcik7CgogICAgZW52X3ZhciA9IG5ldHNubXBfZ2V0ZW52KCJNSUJGSUxFUyIpOwogICAgaWYgKGVudl92YXIgIT0gTlVMTCkgewogICAgICAgIGlmICgqZW52X3ZhciA9PSAnKycpCiAgICAgICAgICAgIGVudHJ5ID0gc3RydG9rX3IoZW52X3ZhcisxLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihlbnZfdmFyLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgICAgIHdoaWxlIChlbnRyeSkgewogICAgICAgICAgICBhZGRfbWliZmlsZShlbnRyeSwgTlVMTCwgTlVMTCk7CiAgICAgICAgICAgIGVudHJ5ID0gc3RydG9rX3IoTlVMTCwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgICAgICB9CiAgICB9CgogICAgbmV0c25tcF9pbml0X21pYl9pbnRlcm5hbHMoKTsKCiAgICAvKgogICAgICogUmVhZCBpbiBhbnkgbW9kdWxlcyBvciBtaWJzIHJlcXVlc3RlZCAKICAgICAqLwoKICAgIGVudl92YXIgPSBuZXRzbm1wX2dldGVudigiTUlCUyIpOwogICAgaWYgKGVudl92YXIgPT0gTlVMTCkgewogICAgICAgIGlmIChjb25mbWlicyAhPSBOVUxMKQogICAgICAgICAgICBlbnZfdmFyID0gc3RyZHVwKGNvbmZtaWJzKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVudl92YXIgPSBzdHJkdXAoTkVUU05NUF9ERUZBVUxUX01JQlMpOwogICAgfSBlbHNlIHsKICAgICAgICBlbnZfdmFyID0gc3RyZHVwKGVudl92YXIpOwogICAgfQogICAgaWYgKGVudl92YXIgJiYgKCgqZW52X3ZhciA9PSAnKycpIHx8ICgqZW52X3ZhciA9PSAnLScpKSkgewogICAgICAgIGVudHJ5ID0KICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHN0cmxlbihORVRTTk1QX0RFRkFVTFRfTUlCUykgKyBzdHJsZW4oZW52X3ZhcikgKyAyKTsKICAgICAgICBpZiAoIWVudHJ5KSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsICJlbnYgbWlicyBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICBTTk1QX0ZSRUUoZW52X3Zhcik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoKmVudl92YXIgPT0gJysnKQogICAgICAgICAgICAgICAgc3ByaW50ZihlbnRyeSwgIiVzJWMlcyIsIE5FVFNOTVBfREVGQVVMVF9NSUJTLCBFTlZfU0VQQVJBVE9SX0NIQVIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudl92YXIrMSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHNwcmludGYoZW50cnksICIlcyVjJXMiLCBlbnZfdmFyKzEsIEVOVl9TRVBBUkFUT1JfQ0hBUiwKICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9ERUZBVUxUX01JQlMgKTsKICAgICAgICB9CiAgICAgICAgU05NUF9GUkVFKGVudl92YXIpOwogICAgICAgIGVudl92YXIgPSBlbnRyeTsKICAgIH0KCiAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLAogICAgICAgICAgICAgICAgIlNlZW4gTUlCUzogTG9va2luZyBpbiAnJXMnIGZvciBtaWIgZmlsZXMgLi4uXG4iLAogICAgICAgICAgICAgICAgZW52X3ZhcikpOwogICAgZW50cnkgPSBzdHJ0b2tfcihlbnZfdmFyLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgd2hpbGUgKGVudHJ5KSB7CiAgICAgICAgaWYgKHN0cmNhc2VjbXAoZW50cnksIERFQlVHX0FMV0FZU19UT0tFTikgPT0gMCkgewogICAgICAgICAgICByZWFkX2FsbF9taWJzKCk7CiAgICAgICAgfSBlbHNlIGlmIChzdHJzdHIoZW50cnksICIvIikgIT0gTlVMTCkgewogICAgICAgICAgICByZWFkX21pYihlbnRyeSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV0c25tcF9yZWFkX21vZHVsZShlbnRyeSk7CiAgICAgICAgfQogICAgICAgIGVudHJ5ID0gc3RydG9rX3IoTlVMTCwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgIH0KICAgIGFkb3B0X29ycGhhbnMoKTsKICAgIFNOTVBfRlJFRShlbnZfdmFyKTsKCiAgICBlbnZfdmFyID0gbmV0c25tcF9nZXRlbnYoIk1JQkZJTEVTIik7CiAgICBpZiAoZW52X3ZhciAhPSBOVUxMKSB7CiAgICAgICAgaWYgKCgqZW52X3ZhciA9PSAnKycpIHx8ICgqZW52X3ZhciA9PSAnLScpKSB7CiNpZmRlZiBORVRTTk1QX0RFRkFVTFRfTUlCRklMRVMKICAgICAgICAgICAgZW50cnkgPQogICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHN0cmxlbihORVRTTk1QX0RFRkFVTFRfTUlCRklMRVMpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oZW52X3ZhcikgKyAyKTsKICAgICAgICAgICAgaWYgKCFlbnRyeSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoImluaXRfbWliIiwgImVudiBtaWJmaWxlcyBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCplbnZfdmFyKysgPT0gJysnKQogICAgICAgICAgICAgICAgICAgIHNwcmludGYoZW50cnksICIlcyVjJXMiLCBORVRTTk1QX0RFRkFVTFRfTUlCRklMRVMsIEVOVl9TRVBBUkFUT1JfQ0hBUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudl92YXIgKTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGVudHJ5LCAiJXMlYyVzIiwgZW52X3ZhciwgRU5WX1NFUEFSQVRPUl9DSEFSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9ERUZBVUxUX01JQkZJTEVTICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU05NUF9GUkVFKGVudl92YXIpOwogICAgICAgICAgICBlbnZfdmFyID0gZW50cnk7CiNlbHNlCiAgICAgICAgICAgIGVudl92YXIgPSBzdHJkdXAoZW52X3ZhciArIDEpOwojZW5kaWYKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlbnZfdmFyID0gc3RyZHVwKGVudl92YXIpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiNpZmRlZiBORVRTTk1QX0RFRkFVTFRfTUlCRklMRVMKICAgICAgICBlbnZfdmFyID0gc3RyZHVwKE5FVFNOTVBfREVGQVVMVF9NSUJGSUxFUyk7CiNlbmRpZgogICAgfQoKICAgIGlmIChlbnZfdmFyICE9IE5VTEwpIHsKICAgICAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLAogICAgICAgICAgICAgICAgICAgICJTZWVuIE1JQkZJTEVTOiBMb29raW5nIGluICclcycgZm9yIG1pYiBmaWxlcyAuLi5cbiIsCiAgICAgICAgICAgICAgICAgICAgZW52X3ZhcikpOwogICAgICAgIGVudHJ5ID0gc3RydG9rX3IoZW52X3ZhciwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgICAgICB3aGlsZSAoZW50cnkpIHsKICAgICAgICAgICAgcmVhZF9taWIoZW50cnkpOwogICAgICAgICAgICBlbnRyeSA9IHN0cnRva19yKE5VTEwsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICAgICAgfQogICAgICAgIFNOTVBfRlJFRShlbnZfdmFyKTsKICAgIH0KCiAgICBwcmVmaXggPSBuZXRzbm1wX2dldGVudigiUFJFRklYIik7CgogICAgaWYgKCFwcmVmaXgpCiAgICAgICAgcHJlZml4ID0gU3RhbmRhcmRfUHJlZml4OwoKICAgIFByZWZpeCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4ocHJlZml4KSArIDIpOwogICAgaWYgKCFQcmVmaXgpCiAgICAgICAgREVCVUdNU0dUTCgoImluaXRfbWliIiwgIlByZWZpeCBtYWxsb2MgZmFpbGVkIikpOwogICAgZWxzZQogICAgICAgIHN0cmNweShQcmVmaXgsIHByZWZpeCk7CgogICAgREVCVUdNU0dUTCgoImluaXRfbWliIiwKICAgICAgICAgICAgICAgICJTZWVuIFBSRUZJWDogTG9va2luZyBpbiAnJXMnIGZvciBwcmVmaXggLi4uXG4iLCBQcmVmaXgpKTsKCiAgICAvKgogICAgICogcmVtb3ZlIHRyYWlsaW5nIGRvdCAKICAgICAqLwogICAgaWYgKFByZWZpeCkgewogICAgICAgIGVudl92YXIgPSAmUHJlZml4W3N0cmxlbihQcmVmaXgpIC0gMV07CiAgICAgICAgaWYgKCplbnZfdmFyID09ICcuJykKICAgICAgICAgICAgKmVudl92YXIgPSAnXDAnOwogICAgfQoKICAgIHBwLT5zdHIgPSBQcmVmaXg7ICAgICAgICAgICAvKiBmaXh1cCBmaXJzdCBtaWJfcHJlZml4IGVudHJ5ICovCiAgICAvKgogICAgICogbm93IHRoYXQgdGhlIGxpc3Qgb2YgcHJlZml4ZXMgaXMgYnVpbHQsIHNhdmUgZWFjaCBzdHJpbmcgbGVuZ3RoLiAKICAgICAqLwogICAgd2hpbGUgKHBwLT5zdHIpIHsKICAgICAgICBwcC0+bGVuID0gc3RybGVuKHBwLT5zdHIpOwogICAgICAgIHBwKys7CiAgICB9CgogICAgTWliID0gdHJlZV9oZWFkOyAgICAgICAgICAgIC8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCiAgICB0cmVlX3RvcCA9IChzdHJ1Y3QgdHJlZSAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB0cmVlKSk7CiAgICAvKgogICAgICogWFggZXJyb3IgY2hlY2sgPyAKICAgICAqLwogICAgaWYgKHRyZWVfdG9wKSB7CiAgICAgICAgdHJlZV90b3AtPmxhYmVsID0gc3RyZHVwKCIodG9wKSIpOwogICAgICAgIHRyZWVfdG9wLT5jaGlsZF9saXN0ID0gdHJlZV9oZWFkOwogICAgfQp9CgojaWZuZGVmIE5FVFNOTVBfTk9fTEVHQUNZX0RFRklOSVRJT05TCnZvaWQKaW5pdF9taWIodm9pZCkKewogICAgbmV0c25tcF9pbml0X21pYigpOwp9CiNlbmRpZgoKCi8qCiAqIEhhbmRsZSBNSUIgaW5kZXhlcyBjZW50cmFsbHkKICovCnN0YXRpYyBpbnQgX21pYmluZGV4ICAgICA9IDA7ICAgLyogTGFzdCBpbmRleCBpbiB1c2UgKi8Kc3RhdGljIGludCBfbWliaW5kZXhfbWF4ID0gMDsgICAvKiBTaXplIG9mIGluZGV4IGFycmF5ICovCmNoYXIgICAgICoqX21pYmluZGV4ZXMgICA9IE5VTEw7CgppbnQgX21pYmluZGV4X2FkZCggY29uc3QgY2hhciAqZGlybmFtZSwgaW50IGkgKTsKdm9pZApuZXRzbm1wX21pYmluZGV4X2xvYWQoIHZvaWQgKQp7CiAgICBESVIgKmRpcjsKICAgIHN0cnVjdCBkaXJlbnQgKmZpbGU7CiAgICBGSUxFICpmcDsKICAgIGNoYXIgdG1wYnVmWyAzMDBdOwogICAgY2hhciB0bXBidWYyWzMwMF07CiAgICBpbnQgIGk7CiAgICBjaGFyICpjcDsKCiAgICAvKgogICAgICogT3BlbiB0aGUgTUlCIGluZGV4IGRpcmVjdG9yeSwgb3IgY3JlYXRlIGl0IChlbXB0eSkKICAgICAqLwogICAgc25wcmludGYoIHRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZiksICIlcy9taWJfaW5kZXhlcyIsCiAgICAgICAgICAgICAgZ2V0X3BlcnNpc3RlbnRfZGlyZWN0b3J5KCkpOwogICAgdG1wYnVmW3NpemVvZih0bXBidWYpLTFdID0gMDsKICAgIGRpciA9IG9wZW5kaXIoIHRtcGJ1ZiApOwogICAgaWYgKCBkaXIgPT0gTlVMTCApIHsKICAgICAgICBERUJVR01TR1RMKCgibWliaW5kZXgiLCAibG9hZDogKG5ldylcbiIpKTsKICAgICAgICBta2RpcmhpZXIoIHRtcGJ1ZiwgTkVUU05NUF9BR0VOVF9ESVJFQ1RPUllfTU9ERSwgMCk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qCiAgICAgKiBDcmVhdGUgYSBsaXN0IG9mIHdoaWNoIGRpcmVjdG9yeSBlYWNoIGZpbGUgcmVmZXJzIHRvCiAgICAgKi8KICAgIHdoaWxlICgoZmlsZSA9IHJlYWRkaXIoIGRpciApKSkgewogICAgICAgIGlmICggIWlzZGlnaXQoZmlsZS0+ZF9uYW1lWzBdKSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgaSA9IGF0b2koIGZpbGUtPmRfbmFtZSApOwoKICAgICAgICBzbnByaW50ZiggdG1wYnVmLCBzaXplb2YodG1wYnVmKSwgIiVzL21pYl9pbmRleGVzLyVkIiwKICAgICAgICAgICAgICBnZXRfcGVyc2lzdGVudF9kaXJlY3RvcnkoKSwgaSApOwogICAgICAgIHRtcGJ1ZltzaXplb2YodG1wYnVmKS0xXSA9IDA7CiAgICAgICAgZnAgPSBmb3BlbiggdG1wYnVmLCAiciIgKTsKICAgICAgICBpZiAoIWZwKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjcCA9IGZnZXRzKCB0bXBidWYyLCBzaXplb2YodG1wYnVmMiksIGZwICk7CiAgICAgICAgaWYgKCAhY3AgKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJFbXB0eSBNSUIgaW5kZXggKCVkKVxuIiwgaSkpOwogICAgICAgICAgICBmY2xvc2UoZnApOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdG1wYnVmMltzdHJsZW4odG1wYnVmMiktMV0gPSAwOwogICAgICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJsb2FkOiAoJWQpICVzXG4iLCBpLCB0bXBidWYyKSk7CiAgICAgICAgKHZvaWQpX21pYmluZGV4X2FkZCggdG1wYnVmMis0LCBpICk7ICAvKiBTa2lwICdESVIgJyAqLwogICAgICAgIGZjbG9zZSggZnAgKTsKICAgIH0KICAgIGNsb3NlZGlyKCBkaXIgKTsKfQoKY2hhciAqCm5ldHNubXBfbWliaW5kZXhfbG9va3VwKCBjb25zdCBjaGFyICpkaXJuYW1lICkKewogICAgaW50IGk7CiAgICBzdGF0aWMgY2hhciB0bXBidWZbMzAwXTsKCiAgICBmb3IgKGk9MDsgaTxfbWliaW5kZXg7IGkrKykgewogICAgICAgIGlmICggX21pYmluZGV4ZXNbaV0gJiYKICAgICAgICAgICAgIHN0cmNtcCggX21pYmluZGV4ZXNbaV0sIGRpcm5hbWUgKSA9PSAwKSB7CiAgICAgICAgICAgICBzbnByaW50Zih0bXBidWYsIHNpemVvZih0bXBidWYpLCAiJXMvbWliX2luZGV4ZXMvJWQiLAogICAgICAgICAgICAgICAgICAgICAgZ2V0X3BlcnNpc3RlbnRfZGlyZWN0b3J5KCksIGkpOwogICAgICAgICAgICAgdG1wYnVmW3NpemVvZih0bXBidWYpLTFdID0gMDsKICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJsb29rdXA6ICVzICglZCkgJXNcbiIsIGRpcm5hbWUsIGksIHRtcGJ1ZiApKTsKICAgICAgICAgICAgIHJldHVybiB0bXBidWY7CiAgICAgICAgfQogICAgfQogICAgREVCVUdNU0dUTCgoIm1pYmluZGV4IiwgImxvb2t1cDogKG5vbmUpXG4iKSk7CiAgICByZXR1cm4gTlVMTDsKfQoKaW50Cl9taWJpbmRleF9hZGQoIGNvbnN0IGNoYXIgKmRpcm5hbWUsIGludCBpICkKewogICAgY29uc3QgaW50IG9sZF9taWJpbmRleF9tYXggPSBfbWliaW5kZXhfbWF4OwoKICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJhZGQ6ICVzICglZClcbiIsIGRpcm5hbWUsIGkgKSk7CiAgICBpZiAoIGkgPT0gLTEgKQogICAgICAgIGkgPSBfbWliaW5kZXgrKzsKICAgIGlmICggaSA+PSBfbWliaW5kZXhfbWF4ICkgewogICAgICAgIC8qCiAgICAgICAgICogSWYgdGhlIGluZGV4IGFycmF5IGlzIGZ1bGwgKG9yIG5vbi1leGlzdGVudCkKICAgICAgICAgKiAgIHRoZW4gZXhwYW5kIChvciBjcmVhdGUpIGl0CiAgICAgICAgICovCiAgICAgICAgX21pYmluZGV4X21heCA9IGkgKyAxMDsKICAgICAgICBfbWliaW5kZXhlcyA9IHJlYWxsb2MoX21pYmluZGV4ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9taWJpbmRleF9tYXggKiBzaXplb2YoX21pYmluZGV4ZXNbMF0pKTsKICAgICAgICBuZXRzbm1wX2Fzc2VydChfbWliaW5kZXhlcyk7CiAgICAgICAgbWVtc2V0KF9taWJpbmRleGVzICsgb2xkX21pYmluZGV4X21heCwgMCwKICAgICAgICAgICAgICAgKF9taWJpbmRleF9tYXggLSBvbGRfbWliaW5kZXhfbWF4KSAqIHNpemVvZihfbWliaW5kZXhlc1swXSkpOwogICAgfQoKICAgIF9taWJpbmRleGVzWyBpIF0gPSBzdHJkdXAoIGRpcm5hbWUgKTsKICAgIGlmICggaSA+PSBfbWliaW5kZXggKQogICAgICAgIF9taWJpbmRleCA9IGkrMTsKCiAgICBERUJVR01TR1RMKCgibWliaW5kZXgiLCAiYWRkOiAlZC8lZC8lZFxuIiwgaSwgX21pYmluZGV4LCBfbWliaW5kZXhfbWF4ICkpOwogICAgcmV0dXJuIGk7Cn0KICAgIApGSUxFICoKbmV0c25tcF9taWJpbmRleF9uZXcoIGNvbnN0IGNoYXIgKmRpcm5hbWUgKQp7CiAgICBGSUxFICpmcDsKICAgIGNoYXIgIHRtcGJ1ZlszMDBdOwogICAgY2hhciAqY3A7CiAgICBpbnQgICBpOwoKICAgIGNwID0gbmV0c25tcF9taWJpbmRleF9sb29rdXAoIGRpcm5hbWUgKTsKICAgIGlmICghY3ApIHsKICAgICAgICBpICA9IF9taWJpbmRleF9hZGQoIGRpcm5hbWUsIC0xICk7CiAgICAgICAgc25wcmludGYoIHRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZiksICIlcy9taWJfaW5kZXhlcy8lZCIsCiAgICAgICAgICAgICAgICAgIGdldF9wZXJzaXN0ZW50X2RpcmVjdG9yeSgpLCBpICk7CiAgICAgICAgdG1wYnVmW3NpemVvZih0bXBidWYpLTFdID0gMDsKICAgICAgICBjcCA9IHRtcGJ1ZjsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJuZXc6ICVzICglcylcbiIsIGRpcm5hbWUsIGNwICkpOwogICAgZnAgPSBmb3BlbiggY3AsICJ3IiApOwogICAgaWYgKGZwKQogICAgICAgIGZwcmludGYoIGZwLCAiRElSICVzXG4iLCBkaXJuYW1lICk7CiAgICByZXR1cm4gZnA7Cn0KCgovKioKICogVW5sb2FkcyBhbGwgbWlicy4KICovCnZvaWQKc2h1dGRvd25fbWliKHZvaWQpCnsKICAgIHVubG9hZF9hbGxfbWlicygpOwogICAgaWYgKHRyZWVfdG9wKSB7CiAgICAgICAgaWYgKHRyZWVfdG9wLT5sYWJlbCkKICAgICAgICAgICAgU05NUF9GUkVFKHRyZWVfdG9wLT5sYWJlbCk7CiAgICAgICAgU05NUF9GUkVFKHRyZWVfdG9wKTsKICAgICAgICB0cmVlX3RvcCA9IE5VTEw7CiAgICB9CiAgICB0cmVlX2hlYWQgPSBOVUxMOwogICAgTWliID0gTlVMTDsKICAgIGlmIChfbWliaW5kZXhlcykgewogICAgICAgIGludCBpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBfbWliaW5kZXg7ICsraSkKICAgICAgICAgICAgU05NUF9GUkVFKF9taWJpbmRleGVzW2ldKTsKICAgICAgICBmcmVlKF9taWJpbmRleGVzKTsKICAgICAgICBfbWliaW5kZXggPSAwOwogICAgICAgIF9taWJpbmRleF9tYXggPSAwOwogICAgICAgIF9taWJpbmRleGVzID0gTlVMTDsKICAgIH0KICAgIGlmIChQcmVmaXggIT0gTlVMTCAmJiBQcmVmaXggIT0gJlN0YW5kYXJkX1ByZWZpeFswXSkKICAgICAgICBTTk1QX0ZSRUUoUHJlZml4KTsKICAgIGlmIChQcmVmaXgpCiAgICAgICAgUHJlZml4ID0gTlVMTDsKICAgIFNOTVBfRlJFRShjb25mbWlicyk7CiAgICBTTk1QX0ZSRUUoY29uZm1pYmRpcik7Cn0KCi8qKgogKiBQcmludHMgdGhlIE1JQnMgdG8gdGhlIGZpbGUgZnAuCiAqCiAqIEBwYXJhbSBmcCAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gcHJpbnQgdG8uCiAqLwp2b2lkCnByaW50X21pYihGSUxFICogZnApCnsKICAgIHByaW50X3N1YnRyZWUoZnAsIHRyZWVfaGVhZCwgMCk7Cn0KCnZvaWQKcHJpbnRfYXNjaWlfZHVtcChGSUxFICogZnApCnsKICAgIGZwcmludGYoZnAsICJkdW1wIERFRklOSVRJT05TIDo6PSBCRUdJTlxuIik7CiAgICBwcmludF9hc2NpaV9kdW1wX3RyZWUoZnAsIHRyZWVfaGVhZCwgMCk7CiAgICBmcHJpbnRmKGZwLCAiRU5EXG4iKTsKfQoKCi8qKgogKiBTZXQncyB0aGUgcHJpbnRpbmcgZnVuY3Rpb24gcHJpbnRvbWF0IGluIGEgc3VidHJlZSBhY2NvcmRpbmcKICogaXQncyB0eXBlCiAqCiAqIEBwYXJhbSBzdWJ0cmVlICAgIFRoZSBzdWJ0cmVlIHRvIHNldC4KICovCnZvaWQKc2V0X2Z1bmN0aW9uKHN0cnVjdCB0cmVlICpzdWJ0cmVlKQp7CiAgICBzdWJ0cmVlLT5wcmludGVyID0gTlVMTDsKICAgIHN3aXRjaCAoc3VidHJlZS0+dHlwZSkgewogICAgY2FzZSBUWVBFX09CSklEOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX29iamVjdF9pZGVudGlmaWVyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX29jdGV0X3N0cmluZzsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9JTlRFR0VSOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2ludGVnZXI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2ludGVnZXI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfTkVUQUREUjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19uZXR3b3JrYWRkcmVzczsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9JUEFERFI6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfaXBhZGRyZXNzOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX0NPVU5URVI6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfY291bnRlcjsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9HQVVHRToKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19nYXVnZTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9USU1FVElDS1M6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfdGltZXRpY2tzOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX09QQVFVRToKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19vcGFxdWU7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfTlVMTDoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19udWxsOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX0JJVFNUUklORzoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19iaXRzdHJpbmc7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfTlNBUEFERFJFU1M6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfbnNhcGFkZHJlc3M7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfQ09VTlRFUjY0OgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2NvdW50ZXI2NDsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY191aW50ZWdlcjsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9VTlNJR05FRDMyOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2dhdWdlOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX09USEVSOgogICAgZGVmYXVsdDoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19ieV90eXBlOwogICAgICAgIGJyZWFrOwogICAgfQp9CgojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgovKioKICogUmVhZHMgYW4gb2JqZWN0IGlkZW50aWZpZXIgZnJvbSBhbiBpbnB1dCBzdHJpbmcgaW50byBpbnRlcm5hbCBPSUQgZm9ybS4KICogCiAqIFdoZW4gY2FsbGVkLCBvdXRfbGVuIG11c3QgaG9sZCB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIG91dHB1dCBhcnJheS4KICoKICogQHBhcmFtIGlucHV0ICAgICB0aGUgaW5wdXQgc3RyaW5nLgogKiBAcGFyYW0gb3V0cHV0ICAgIHRoZSBvaWQgd2lydGUuCiAqIEBwYXJhbSBvdXRfbGVuICAgbnVtYmVyIG9mIHN1YmlkJ3MgaW4gb3V0cHV0LgogKiAKICogQHJldHVybiAxIGlmIHN1Y2Nlc3NmdWwuCiAqIAogKiBJZiBhbiBlcnJvciBvY2N1cnMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAwIGFuZCBNQVkgc2V0IHNubXBfZXJybm8uCiAqIHNubXBfZXJybm8gaXMgTk9UIHNldCBpZiBTRVRfU05NUF9FUlJPUiBldmFsdWF0ZXMgdG8gbm90aGluZy4KICogVGhpcyBjYW4gbWFrZSBtdWx0aS10aHJlYWRlZCB1c2UgYSB0aW55IGJpdCBtb3JlIHJvYnVzdC4KICovCmludApyZWFkX29iamlkKGNvbnN0IGNoYXIgKmlucHV0LCBvaWQgKiBvdXRwdXQsIHNpemVfdCAqIG91dF9sZW4pCnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN1YmlkJ3MgaW4gIm91dHB1dCIgKi8KI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIHN0cnVjdCB0cmVlICAgICpyb290ID0gdHJlZV90b3A7CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIGNoYXIgICAgICAgICAgICBidWZbU1BSSU5UX01BWF9MRU5dOwogICAgaW50ICAgICAgICAgICAgIHJldCwgbWF4X291dF9sZW47CiAgICBjaGFyICAgICAgICAgICAqbmFtZSwgY2g7CiAgICBjb25zdCBjaGFyICAgICAqY3A7CgogICAgY3AgPSBpbnB1dDsKICAgIHdoaWxlICgoY2ggPSAqY3ApKSB7CiAgICAgICAgaWYgKCgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKQogICAgICAgICAgICB8fCAoJ2EnIDw9IGNoICYmIGNoIDw9ICd6JykKICAgICAgICAgICAgfHwgKCdBJyA8PSBjaCAmJiBjaCA8PSAnWicpCiAgICAgICAgICAgIHx8IGNoID09ICctJykKICAgICAgICAgICAgY3ArKzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGJyZWFrOwogICAgfQojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgaWYgKGNoID09ICc6JykKICAgICAgICByZXR1cm4gZ2V0X25vZGUoaW5wdXQsIG91dHB1dCwgb3V0X2xlbik7CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCiAgICBpZiAoKmlucHV0ID09ICcuJykKICAgICAgICBpbnB1dCsrOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgZWxzZSBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1JFQURfVUNEX1NUWUxFX09JRCkpIHsKICAgICAgICAvKgogICAgICAgICAqIGdldCBwYXN0IGxlYWRpbmcgJy4nLCBhcHBlbmQgJy4nIHRvIFByZWZpeC4gCiAgICAgICAgICovCiAgICAgICAgaWYgKCpQcmVmaXggPT0gJy4nKQogICAgICAgICAgICBzdHJsY3B5KGJ1ZiwgUHJlZml4ICsgMSwgc2l6ZW9mKGJ1ZikpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgc3RybGNweShidWYsIFByZWZpeCwgc2l6ZW9mKGJ1ZikpOwogICAgICAgIHN0cmxjYXQoYnVmLCAiLiIsIHNpemVvZihidWYpKTsKICAgICAgICBzdHJsY2F0KGJ1ZiwgaW5wdXQsIHNpemVvZihidWYpKTsKICAgICAgICBpbnB1dCA9IGJ1ZjsKICAgIH0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIGlmICgocm9vdCA9PSBOVUxMKSAmJiAodHJlZV9oZWFkICE9IE5VTEwpKSB7CiAgICAgICAgcm9vdCA9IHRyZWVfaGVhZDsKICAgIH0KICAgIGVsc2UgaWYgKHJvb3QgPT0gTlVMTCkgewogICAgICAgIFNFVF9TTk1QX0VSUk9SKFNOTVBFUlJfTk9NSUIpOwogICAgICAgICpvdXRfbGVuID0gMDsKICAgICAgICByZXR1cm4gMDsKICAgIH0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgbmFtZSA9IHN0cmR1cChpbnB1dCk7CiAgICBtYXhfb3V0X2xlbiA9ICpvdXRfbGVuOwogICAgKm91dF9sZW4gPSAwOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgaWYgKChyZXQgPQogICAgICAgICBfYWRkX3N0cmluZ3NfdG9fb2lkKHJvb3QsIG5hbWUsIG91dHB1dCwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfb3V0X2xlbikpIDw9IDApCiNlbHNlCiAgICBpZiAoKHJldCA9CiAgICAgICAgIF9hZGRfc3RyaW5nc190b19vaWQoTlVMTCwgbmFtZSwgb3V0cHV0LCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9vdXRfbGVuKSkgPD0gMCkKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgewogICAgICAgIGlmIChyZXQgPT0gMCkKICAgICAgICAgICAgcmV0ID0gU05NUEVSUl9VTktOT1dOX09CSklEOwogICAgICAgIFNFVF9TTk1QX0VSUk9SKHJldCk7CiAgICAgICAgU05NUF9GUkVFKG5hbWUpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgU05NUF9GUkVFKG5hbWUpOwoKICAgIHJldHVybiAxOwp9CgovKioKICogCiAqLwp2b2lkCm5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWQodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7CiAgICB1X2NoYXIgICAgICAgICAqdGJ1ZiA9IE5VTEwsICpjcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgdGJ1Zl9sZW4gPSAyNTYsIHRvdXRfbGVuID0gMDsKICAgIGludCAgICAgICAgICAgICB0YnVmX292ZXJmbG93ID0gMDsKICAgIGludCAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0OwoKICAgIGlmICgodGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKHRidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIHRidWZfb3ZlcmZsb3cgPSAxOwogICAgfSBlbHNlIHsKICAgICAgICAqdGJ1ZiA9ICcuJzsKICAgICAgICB0b3V0X2xlbiA9IDE7CiAgICB9CgogICAgX29pZF9maW5pc2hfcHJpbnRpbmcob2JqaWQsIG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgJnRidWYsICZ0YnVmX2xlbiwgJnRvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJnRidWZfb3ZlcmZsb3cpOwoKICAgIGlmICh0YnVmX292ZXJmbG93KSB7CiAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93KSB7CiAgICAgICAgICAgIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdGJ1Zik7CiAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgIH0KICAgICAgICBTTk1QX0ZSRUUodGJ1Zik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG91dHB1dF9mb3JtYXQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCk7CiAgICBpZiAoMCA9PSBvdXRwdXRfZm9ybWF0KSB7CiAgICAgICAgb3V0cHV0X2Zvcm1hdCA9IE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDOwogICAgfQogICAgc3dpdGNoIChvdXRwdXRfZm9ybWF0KSB7CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9GVUxMOgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQzoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX1NVRkZJWDoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX01PRFVMRToKICAgICAgICBjcCA9IHRidWY7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTk9ORToKICAgIGRlZmF1bHQ6CiAgICAgICAgY3AgPSBOVUxMOwogICAgfQoKICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJgogICAgICAgICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSkgewogICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgfQogICAgU05NUF9GUkVFKHRidWYpOwp9CgovKioKICogCiAqLwojaWZkZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCnZvaWQKbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKewogICAgbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdywgb2JqaWQsIG9iamlkbGVuKTsKfQojZWxzZQpzdHJ1Y3QgdHJlZSAgICAqCm5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4pCnsKICAgIHVfY2hhciAgICAgICAgICp0YnVmID0gTlVMTCwgKmNwID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICB0YnVmX2xlbiA9IDUxMiwgdG91dF9sZW4gPSAwOwogICAgc3RydWN0IHRyZWUgICAgKnN1YnRyZWUgPSB0cmVlX2hlYWQ7CiAgICBzaXplX3QgICAgICAgICAgbWlkcG9pbnRfb2Zmc2V0ID0gMDsKICAgIGludCAgICAgICAgICAgICB0YnVmX292ZXJmbG93ID0gMDsKICAgIGludCAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0OwoKICAgIGlmICgodGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKHRidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIHRidWZfb3ZlcmZsb3cgPSAxOwogICAgfSBlbHNlIHsKICAgICAgICAqdGJ1ZiA9ICcuJzsKICAgICAgICB0b3V0X2xlbiA9IDE7CiAgICB9CgogICAgc3VidHJlZSA9IF9nZXRfcmVhbGxvY19zeW1ib2wob2JqaWQsIG9iamlkbGVuLCBzdWJ0cmVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRidWYsICZ0YnVmX2xlbiwgJnRvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJnRidWZfb3ZlcmZsb3csIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlkcG9pbnRfb2Zmc2V0KTsKCiAgICBpZiAodGJ1Zl9vdmVyZmxvdykgewogICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRidWYpOwogICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICB9CiAgICAgICAgU05NUF9GUkVFKHRidWYpOwogICAgICAgIHJldHVybiBzdWJ0cmVlOwogICAgfQoKICAgIG91dHB1dF9mb3JtYXQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCk7CiAgICBpZiAoMCA9PSBvdXRwdXRfZm9ybWF0KSB7CiAgICAgICAgb3V0cHV0X2Zvcm1hdCA9IE5FVFNOTVBfT0lEX09VVFBVVF9NT0RVTEU7CiAgICB9CiAgICBzd2l0Y2ggKG91dHB1dF9mb3JtYXQpIHsKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX0ZVTEw6CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDOgogICAgICAgIGNwID0gdGJ1ZjsKICAgICAgICBicmVhazsKCiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9TVUZGSVg6CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9NT0RVTEU6CiAgICAgICAgZm9yIChjcCA9IHRidWY7ICpjcDsgY3ArKyk7CgogICAgICAgIGlmIChtaWRwb2ludF9vZmZzZXQgIT0gMCkgewogICAgICAgICAgICBjcCA9IHRidWYgKyBtaWRwb2ludF9vZmZzZXQgLSAyOyAgICAvKiAgYmV5b25kIHRoZSAnLicgICovCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgd2hpbGUgKGNwID49IHRidWYpIHsKICAgICAgICAgICAgICAgIGlmIChpc2FscGhhKCpjcCkpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNwLS07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHdoaWxlIChjcCA+PSB0YnVmKSB7CiAgICAgICAgICAgIGlmICgqY3AgPT0gJy4nKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjcC0tOwogICAgICAgIH0KCiAgICAgICAgY3ArKzsKCiAgICAgICAgaWYgKChORVRTTk1QX09JRF9PVVRQVVRfTU9EVUxFID09IG91dHB1dF9mb3JtYXQpCiAgICAgICAgICAgICYmIGNwID4gdGJ1ZikgewogICAgICAgICAgICBjaGFyICAgICAgICAgICAgbW9kYnVmWzI1Nl0gPSB7IDAgfSwgKm1vZCA9CiAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZShzdWJ0cmVlLT5tb2RpZCwgbW9kYnVmKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIERvbid0IGFkZCB0aGUgbW9kdWxlIElEIGlmIGl0J3MganVzdCBudW1lcmljIChpLmUuIHdlIGNvdWxkbid0IGxvb2sKICAgICAgICAgICAgICogaXQgdXAgcHJvcGVybHkuICAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgbW9kYnVmWzBdICE9ICcjJykgewogICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgbW9kKQogICAgICAgICAgICAgICAgICAgIHx8ICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIjo6IikpIHsKICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9VQ0Q6CiAgICB7CiAgICAgICAgUHJlZml4TGlzdFB0ciAgIHBwID0gJm1pYl9wcmVmaXhlc1swXTsKICAgICAgICBzaXplX3QgICAgICAgICAgaWxlbiwgdGxlbjsKICAgICAgICBjb25zdCBjaGFyICAgICAqdGVzdGNwOwoKICAgICAgICBjcCA9IHRidWY7CiAgICAgICAgdGxlbiA9IHN0cmxlbigoY2hhciAqKSB0YnVmKTsKCiAgICAgICAgd2hpbGUgKHBwLT5zdHIpIHsKICAgICAgICAgICAgaWxlbiA9IHBwLT5sZW47CiAgICAgICAgICAgIHRlc3RjcCA9IHBwLT5zdHI7CgogICAgICAgICAgICBpZiAoKHRsZW4gPiBpbGVuKSAmJiBtZW1jbXAodGJ1ZiwgdGVzdGNwLCBpbGVuKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBjcCArPSAoaWxlbiArIDEpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHArKzsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTk9ORToKICAgIGRlZmF1bHQ6CiAgICAgICAgY3AgPSBOVUxMOwogICAgfQoKICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJgogICAgICAgICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSkgewogICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgfQogICAgU05NUF9GUkVFKHRidWYpOwogICAgcmV0dXJuIHN1YnRyZWU7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKaW50CnNwcmludF9yZWFsbG9jX29iamlkKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgYnVmX292ZXJmbG93ID0gMDsKCiAgICBuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZfb3ZlcmZsb3csIG9iamlkLCBvYmppZGxlbik7CiAgICByZXR1cm4gIWJ1Zl9vdmVyZmxvdzsKfQoKaW50CnNucHJpbnRfb2JqaWQoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CgogICAgaWYgKHNwcmludF9yZWFsbG9jX29iamlkKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuKSkgewogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9Cn0KCi8qKgogKiBQcmludHMgYW4gb2lkIHRvIHN0ZG91dC4KICoKICogQHBhcmFtIG9iamlkICAgICAgVGhlIG9pZCB0byBwcmludAogKiBAcGFyYW0gb2JqaWRsZW4gICBUaGUgbGVuZ3RoIG9mIG9pZGlkLgogKi8Kdm9pZApwcmludF9vYmppZChjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdWJpZGVudGlmaWVycyAqLwogICAgZnByaW50X29iamlkKHN0ZG91dCwgb2JqaWQsIG9iamlkbGVuKTsKfQoKCi8qKgogKiBQcmludHMgYW4gb2lkIHRvIGEgZmlsZSBkZXNjcmlwdG9yLgogKgogKiBAcGFyYW0gZiAgICAgICAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHByaW50IHRvLgogKiBAcGFyYW0gb2JqaWQgICAgICBUaGUgb2lkIHRvIHByaW50CiAqIEBwYXJhbSBvYmppZGxlbiAgIFRoZSBsZW5ndGggb2Ygb2lkaWQuCiAqLwp2b2lkCmZwcmludF9vYmppZChGSUxFICogZiwgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3ViaWRlbnRpZmllcnMgKi8KICAgIHVfY2hhciAgICAgICAgICpidWYgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIGJ1Zl9sZW4gPSAyNTYsIG91dF9sZW4gPSAwOwogICAgaW50ICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdyA9IDA7CgogICAgaWYgKChidWYgPSAodV9jaGFyICopIGNhbGxvYyhidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoZiwgIltUUlVOQ0FURURdXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICAgIG5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZSgmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZfb3ZlcmZsb3csIG9iamlkLCBvYmppZGxlbik7CiAgICAgICAgaWYgKGJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlcyBbVFJVTkNBVEVEXVxuIiwgYnVmKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlc1xuIiwgYnVmKTsKICAgICAgICB9CiAgICB9CgogICAgU05NUF9GUkVFKGJ1Zik7Cn0KCmludApzcHJpbnRfcmVhbGxvY192YXJpYWJsZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyaWFibGUpCnsKICAgIGludCAgICAgICAgICAgICBidWZfb3ZlcmZsb3cgPSAwOwoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIHN0cnVjdCB0cmVlICAgICpzdWJ0cmVlID0gdHJlZV9oZWFkOwoKICAgIHN1YnRyZWUgPQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICAgICAgbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuKTsKCiAgICBpZiAoYnVmX292ZXJmbG93KSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9CQVJFX1ZBTFVFKSkgewogICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiA9ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiID0gIikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBlbmQgaWYtZWxzZSBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCAqLwogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBpZi1lbHNlIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCAqLwogICAgfSBlbHNlIHsKICAgICAgICAqb3V0X2xlbiA9IDA7CiAgICB9CgogICAgaWYgKHZhcmlhYmxlLT50eXBlID09IFNOTVBfTk9TVUNIT0JKRUNUKSB7CiAgICAgICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gU3VjaCBPYmplY3QgYXZhaWxhYmxlIG9uIHRoaXMgYWdlbnQgYXQgdGhpcyBPSUQiKTsKICAgIH0gZWxzZSBpZiAodmFyaWFibGUtPnR5cGUgPT0gU05NUF9OT1NVQ0hJTlNUQU5DRSkgewogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIFN1Y2ggSW5zdGFuY2UgY3VycmVudGx5IGV4aXN0cyBhdCB0aGlzIE9JRCIpOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZS0+dHlwZSA9PSBTTk1QX0VORE9GTUlCVklFVykgewogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1vcmUgdmFyaWFibGVzIGxlZnQgaW4gdGhpcyBNSUIgVmlldyAoSXQgaXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBNSUIgdHJlZSkiKTsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIH0gZWxzZSBpZiAoc3VidHJlZSkgewogICAgICAgIGNvbnN0IGNoYXIgKnVuaXRzID0gTlVMTDsKICAgICAgICBjb25zdCBjaGFyICpoaW50ID0gTlVMTDsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9ET05UX1BSSU5UX1VOSVRTKSkgewogICAgICAgICAgICB1bml0cyA9IHN1YnRyZWUtPnVuaXRzOwogICAgICAgIH0KCgkJaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfTk9fRElTUExBWV9ISU5UKSkgewoJCQloaW50ID0gc3VidHJlZS0+aGludDsKICAgICAgICB9CgogICAgICAgIGlmIChzdWJ0cmVlLT5wcmludG9tYXQpIHsKICAgICAgICAgICAgcmV0dXJuICgqc3VidHJlZS0+cHJpbnRvbWF0KSAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXJpYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJlZS0+ZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhcmlhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlLT5lbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgICAgIH0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIEhhbmRsZSByYXJlIGNhc2Ugd2hlcmUgdHJlZSBpcyBlbXB0eS4gIAogICAgICAgICAqLwogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICB9Cn0KCmludApzbnByaW50X3ZhcmlhYmxlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwoKICAgIGlmIChzcHJpbnRfcmVhbGxvY192YXJpYWJsZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgdmFyaWFibGUpKSB7CiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KfQoKLyoqCiAqIFByaW50cyBhIHZhcmlhYmxlIHRvIHN0ZG91dC4KICoKICogQHBhcmFtIG9iamlkICAgICBUaGUgb2JqZWN0IGlkLgogKiBAcGFyYW0gb2JqaWRsZW4gIFRoZSBsZW5ndGggb2YgdGVoIG9iamVjdCBpZC4KICogQHBhcmFtIHZhcmlhYmxlICBUaGUgdmFyaWFibGUgdG8gcHJpbnQuCiAqLwp2b2lkCnByaW50X3ZhcmlhYmxlKGNvbnN0IG9pZCAqIG9iamlkLAogICAgICAgICAgICAgICBzaXplX3Qgb2JqaWRsZW4sIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICBmcHJpbnRfdmFyaWFibGUoc3Rkb3V0LCBvYmppZCwgb2JqaWRsZW4sIHZhcmlhYmxlKTsKfQoKCi8qKgogKiBQcmludHMgYSB2YXJpYWJsZSB0byBhIGZpbGUgZGVzY3JpcHRvci4KICoKICogQHBhcmFtIGYgICAgICAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHByaW50IHRvLgogKiBAcGFyYW0gb2JqaWQgICAgIFRoZSBvYmplY3QgaWQuCiAqIEBwYXJhbSBvYmppZGxlbiAgVGhlIGxlbmd0aCBvZiB0ZWggb2JqZWN0IGlkLgogKiBAcGFyYW0gdmFyaWFibGUgIFRoZSB2YXJpYWJsZSB0byBwcmludC4KICovCnZvaWQKZnByaW50X3ZhcmlhYmxlKEZJTEUgKiBmLAogICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsCiAgICAgICAgICAgICAgICBzaXplX3Qgb2JqaWRsZW4sIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICB1X2NoYXIgICAgICAgICAqYnVmID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMjU2LCBvdXRfbGVuID0gMDsKCiAgICBpZiAoKGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKGJ1Zl9sZW4sIDEpKSA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihmLCAiW1RSVU5DQVRFRF1cbiIpOwogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHNwcmludF9yZWFsbG9jX3ZhcmlhYmxlKCZidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuLCB2YXJpYWJsZSkpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXNcbiIsIGJ1Zik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgW1RSVU5DQVRFRF1cbiIsIGJ1Zik7CiAgICAgICAgfQogICAgfQoKICAgIFNOTVBfRlJFRShidWYpOwp9CgppbnQKc3ByaW50X3JlYWxsb2NfdmFsdWUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICBpZiAodmFyaWFibGUtPnR5cGUgPT0gU05NUF9OT1NVQ0hPQkpFQ1QpIHsKICAgICAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBTdWNoIE9iamVjdCBhdmFpbGFibGUgb24gdGhpcyBhZ2VudCBhdCB0aGlzIE9JRCIpOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZS0+dHlwZSA9PSBTTk1QX05PU1VDSElOU1RBTkNFKSB7CiAgICAgICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gU3VjaCBJbnN0YW5jZSBjdXJyZW50bHkgZXhpc3RzIGF0IHRoaXMgT0lEIik7CiAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLT50eXBlID09IFNOTVBfRU5ET0ZNSUJWSUVXKSB7CiAgICAgICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gbW9yZSB2YXJpYWJsZXMgbGVmdCBpbiB0aGlzIE1JQiBWaWV3IChJdCBpcyBwYXN0IHRoZSBlbmQgb2YgdGhlIE1JQiB0cmVlKSIpOwogICAgfSBlbHNlIHsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgICAgICBjb25zdCBjaGFyICp1bml0cyA9IE5VTEw7CiAgICAgICAgc3RydWN0IHRyZWUgKnN1YnRyZWUgPSB0cmVlX2hlYWQ7CglzdWJ0cmVlID0gZ2V0X3RyZWUob2JqaWQsIG9iamlkbGVuLCBzdWJ0cmVlKTsKICAgICAgICBpZiAoc3VidHJlZSAmJiAhbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfRE9OVF9QUklOVF9VTklUUykpIHsKICAgICAgICAgICAgdW5pdHMgPSBzdWJ0cmVlLT51bml0czsKICAgICAgICB9CiAgICAgICAgaWYgKHN1YnRyZWUpIHsKCSAgICBpZihzdWJ0cmVlLT5wcmludG9tYXQpIHsKCQlyZXR1cm4gKCpzdWJ0cmVlLT5wcmludG9tYXQpIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCgkJCQkJICAgICAgYWxsb3dfcmVhbGxvYywgdmFyaWFibGUsCgkJCQkJICAgICAgc3VidHJlZS0+ZW51bXMsIHN1YnRyZWUtPmhpbnQsCgkJCQkJICAgICAgdW5pdHMpOwoJICAgIH0gZWxzZSB7CgkJcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAoJCQkJCSAgICAgIGFsbG93X3JlYWxsb2MsIHZhcmlhYmxlLAoJCQkJCSAgICAgIHN1YnRyZWUtPmVudW1zLCBzdWJ0cmVlLT5oaW50LAoJCQkJCSAgICAgIHVuaXRzKTsKCSAgICB9Cgl9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyaWFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICB9Cn0KCmludApzbnByaW50X3ZhbHVlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwoKICAgIGlmIChzcHJpbnRfcmVhbGxvY192YWx1ZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgdmFyaWFibGUpKSB7CiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KfQoKdm9pZApwcmludF92YWx1ZShjb25zdCBvaWQgKiBvYmppZCwKICAgICAgICAgICAgc2l6ZV90IG9iamlkbGVuLCBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgZnByaW50X3ZhbHVlKHN0ZG91dCwgb2JqaWQsIG9iamlkbGVuLCB2YXJpYWJsZSk7Cn0KCnZvaWQKZnByaW50X3ZhbHVlKEZJTEUgKiBmLAogICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsCiAgICAgICAgICAgICBzaXplX3Qgb2JqaWRsZW4sIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICB1X2NoYXIgICAgICAgICAqYnVmID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMjU2LCBvdXRfbGVuID0gMDsKCiAgICBpZiAoKGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKGJ1Zl9sZW4sIDEpKSA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihmLCAiW1RSVU5DQVRFRF1cbiIpOwogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHNwcmludF9yZWFsbG9jX3ZhbHVlKCZidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuLCB2YXJpYWJsZSkpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXNcbiIsIGJ1Zik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgW1RSVU5DQVRFRF1cbiIsIGJ1Zik7CiAgICAgICAgfQogICAgfQoKICAgIFNOTVBfRlJFRShidWYpOwp9CgoKLyoqCiAqIFRha2VzIHRoZSB2YWx1ZSBpbiBWQVIgYW5kIHR1cm5zIGl0IGludG8gYW4gT0lEIHNlZ21lbnQgaW4gdmFyLT5uYW1lLgogKiAgCiAqIEBwYXJhbSB2YXIgICAgVGhlIHZhcmlhYmxlLgogKgogKiBAcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUyBvciBTTk1QRVJSX0dFTkVSUiAKICovCmludApidWlsZF9vaWRfc2VnbWVudChuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIpCnsKICAgIGludCAgICAgICAgICAgICBpOwogICAgdWludDMyX3QgICAgICAgIGlwYWRkcjsKCiAgICBpZiAodmFyLT5uYW1lICYmIHZhci0+bmFtZSAhPSB2YXItPm5hbWVfbG9jKQogICAgICAgIFNOTVBfRlJFRSh2YXItPm5hbWUpOwogICAgc3dpdGNoICh2YXItPnR5cGUpIHsKICAgIGNhc2UgQVNOX0lOVEVHRVI6CiAgICBjYXNlIEFTTl9DT1VOVEVSOgogICAgY2FzZSBBU05fR0FVR0U6CiAgICBjYXNlIEFTTl9USU1FVElDS1M6CiAgICAgICAgdmFyLT5uYW1lX2xlbmd0aCA9IDE7CiAgICAgICAgdmFyLT5uYW1lID0gdmFyLT5uYW1lX2xvYzsKICAgICAgICB2YXItPm5hbWVbMF0gPSAqKHZhci0+dmFsLmludGVnZXIpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX0lQQUREUkVTUzoKICAgICAgICB2YXItPm5hbWVfbGVuZ3RoID0gNDsKICAgICAgICB2YXItPm5hbWUgPSB2YXItPm5hbWVfbG9jOwogICAgICAgIG1lbWNweSgmaXBhZGRyLCB2YXItPnZhbC5zdHJpbmcsIHNpemVvZihpcGFkZHIpKTsKICAgICAgICB2YXItPm5hbWVbMF0gPSAoaXBhZGRyID4+IDI0KSAmIDB4ZmY7CiAgICAgICAgdmFyLT5uYW1lWzFdID0gKGlwYWRkciA+PiAxNikgJiAweGZmOwogICAgICAgIHZhci0+bmFtZVsyXSA9IChpcGFkZHIgPj4gIDgpICYgMHhmZjsKICAgICAgICB2YXItPm5hbWVbM10gPSAoaXBhZGRyID4+ICAwKSAmIDB4ZmY7CiAgICAgICAgYnJlYWs7CiAgICAgICAgCiAgICBjYXNlIEFTTl9QUklWX0lNUExJRURfT0JKRUNUX0lEOgogICAgICAgIHZhci0+bmFtZV9sZW5ndGggPSB2YXItPnZhbF9sZW4gLyBzaXplb2Yob2lkKTsKICAgICAgICBpZiAodmFyLT5uYW1lX2xlbmd0aCA+IChzaXplb2YodmFyLT5uYW1lX2xvYykgLyBzaXplb2Yob2lkKSkpCiAgICAgICAgICAgIHZhci0+bmFtZSA9IChvaWQgKikgbWFsbG9jKHNpemVvZihvaWQpICogKHZhci0+bmFtZV9sZW5ndGgpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHZhci0+bmFtZSA9IHZhci0+bmFtZV9sb2M7CiAgICAgICAgaWYgKHZhci0+bmFtZSA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSB2YXItPm5hbWVfbGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHZhci0+bmFtZVtpXSA9IHZhci0+dmFsLm9iamlkW2ldOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX09CSkVDVF9JRDoKICAgICAgICB2YXItPm5hbWVfbGVuZ3RoID0gdmFyLT52YWxfbGVuIC8gc2l6ZW9mKG9pZCkgKyAxOwogICAgICAgIGlmICh2YXItPm5hbWVfbGVuZ3RoID4gKHNpemVvZih2YXItPm5hbWVfbG9jKSAvIHNpemVvZihvaWQpKSkKICAgICAgICAgICAgdmFyLT5uYW1lID0gKG9pZCAqKSBtYWxsb2Moc2l6ZW9mKG9pZCkgKiAodmFyLT5uYW1lX2xlbmd0aCkpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFyLT5uYW1lID0gdmFyLT5uYW1lX2xvYzsKICAgICAgICBpZiAodmFyLT5uYW1lID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICAgICAgdmFyLT5uYW1lWzBdID0gdmFyLT5uYW1lX2xlbmd0aCAtIDE7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIHZhci0+bmFtZV9sZW5ndGggLSAxOyBpKyspCiAgICAgICAgICAgIHZhci0+bmFtZVtpICsgMV0gPSB2YXItPnZhbC5vYmppZFtpXTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9QUklWX0lNUExJRURfT0NURVRfU1RSOgogICAgICAgIHZhci0+bmFtZV9sZW5ndGggPSB2YXItPnZhbF9sZW47CiAgICAgICAgaWYgKHZhci0+bmFtZV9sZW5ndGggPiAoc2l6ZW9mKHZhci0+bmFtZV9sb2MpIC8gc2l6ZW9mKG9pZCkpKQogICAgICAgICAgICB2YXItPm5hbWUgPSAob2lkICopIG1hbGxvYyhzaXplb2Yob2lkKSAqICh2YXItPm5hbWVfbGVuZ3RoKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICB2YXItPm5hbWUgPSB2YXItPm5hbWVfbG9jOwogICAgICAgIGlmICh2YXItPm5hbWUgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgdmFyLT52YWxfbGVuOyBpKyspCiAgICAgICAgICAgIHZhci0+bmFtZVtpXSA9IChvaWQpIHZhci0+dmFsLnN0cmluZ1tpXTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PUEFRVUU6CiAgICBjYXNlIEFTTl9PQ1RFVF9TVFI6CiAgICAgICAgdmFyLT5uYW1lX2xlbmd0aCA9IHZhci0+dmFsX2xlbiArIDE7CiAgICAgICAgaWYgKHZhci0+bmFtZV9sZW5ndGggPiAoc2l6ZW9mKHZhci0+bmFtZV9sb2MpIC8gc2l6ZW9mKG9pZCkpKQogICAgICAgICAgICB2YXItPm5hbWUgPSAob2lkICopIG1hbGxvYyhzaXplb2Yob2lkKSAqICh2YXItPm5hbWVfbGVuZ3RoKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICB2YXItPm5hbWUgPSB2YXItPm5hbWVfbG9jOwogICAgICAgIGlmICh2YXItPm5hbWUgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgICAgICB2YXItPm5hbWVbMF0gPSAob2lkKSB2YXItPnZhbF9sZW47CiAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIHZhci0+dmFsX2xlbjsgaSsrKQogICAgICAgICAgICB2YXItPm5hbWVbaSArIDFdID0gKG9pZCkgdmFyLT52YWwuc3RyaW5nW2ldOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoImJ1aWxkX29pZF9zZWdtZW50IiwKICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBhc24gdHlwZTogJWRcbiIsIHZhci0+dHlwZSkpOwogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIH0KCiAgICBpZiAodmFyLT5uYW1lX2xlbmd0aCA+IE1BWF9PSURfTEVOKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImJ1aWxkX29pZF9zZWdtZW50IiwKICAgICAgICAgICAgICAgICAgICAiU29tZXRoaW5nIHRlcnJpYmx5IHdyb25nLCBuYW1lbGVuID0gJWx1XG4iLAogICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXZhci0+bmFtZV9sZW5ndGgpKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICB9CgogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKCmludApidWlsZF9vaWRfbm9hbGxvYyhvaWQgKiBpbiwgc2l6ZV90IGluX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgb2lkICogcHJlZml4LCBzaXplX3QgcHJlZml4X2xlbiwKICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICogaW5kZXhlcykKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXI7CgogICAgaWYgKHByZWZpeCkgewogICAgICAgIGlmIChpbl9sZW4gPCBwcmVmaXhfbGVuKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgbWVtY3B5KGluLCBwcmVmaXgsIHByZWZpeF9sZW4gKiBzaXplb2Yob2lkKSk7CiAgICAgICAgKm91dF9sZW4gPSBwcmVmaXhfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICAqb3V0X2xlbiA9IDA7CiAgICB9CgogICAgZm9yICh2YXIgPSBpbmRleGVzOyB2YXIgIT0gTlVMTDsgdmFyID0gdmFyLT5uZXh0X3ZhcmlhYmxlKSB7CiAgICAgICAgaWYgKGJ1aWxkX29pZF9zZWdtZW50KHZhcikgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgaWYgKHZhci0+bmFtZV9sZW5ndGggKyAqb3V0X2xlbiA8PSBpbl9sZW4pIHsKICAgICAgICAgICAgbWVtY3B5KCYoaW5bKm91dF9sZW5dKSwgdmFyLT5uYW1lLAogICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKiB2YXItPm5hbWVfbGVuZ3RoKTsKICAgICAgICAgICAgKm91dF9sZW4gKz0gdmFyLT5uYW1lX2xlbmd0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgfQogICAgfQoKICAgIERFQlVHTVNHVEwoKCJidWlsZF9vaWRfbm9hbGxvYyIsICJnZW5lcmF0ZWQ6ICIpKTsKICAgIERFQlVHTVNHT0lEKCgiYnVpbGRfb2lkX25vYWxsb2MiLCBpbiwgKm91dF9sZW4pKTsKICAgIERFQlVHTVNHKCgiYnVpbGRfb2lkX25vYWxsb2MiLCAiXG4iKSk7CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgppbnQKYnVpbGRfb2lkKG9pZCAqKiBvdXQsIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICBvaWQgKiBwcmVmaXgsIHNpemVfdCBwcmVmaXhfbGVuLCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiBpbmRleGVzKQp7CiAgICBvaWQgICAgICAgICAgICAgdG1wb3V0W01BWF9PSURfTEVOXTsKCiAgICAvKgogICAgICogeHh4LXJrczogaW5lZmZpY2VudC4gdHJ5IG9ubHkgYnVpbGRpbmcgc2VnbWVudHMgdG8gZmluZCBpbmRleCBsZW46CiAgICAgKiAgIGZvciAodmFyID0gaW5kZXhlczsgdmFyICE9IE5VTEw7IHZhciA9IHZhci0+bmV4dF92YXJpYWJsZSkgewogICAgICogICAgICBpZiAoYnVpbGRfb2lkX3NlZ21lbnQodmFyKSAhPSBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgKiAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAqICAgICAgKm91dF9sZW4gKz0gdmFyLT5uYW1lX2xlbmd0aDsKICAgICAqCiAgICAgKiB0aGVuIHNlZSBpZiBpdCBmaXRzIGluIGV4aXN0aW5nIGJ1ZmZlciwgb3IgcmVhbGxvYyBidWZmZXIuCiAgICAgKi8KICAgIGlmIChidWlsZF9vaWRfbm9hbGxvYyh0bXBvdXQsIHNpemVvZih0bXBvdXQpLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwgcHJlZml4X2xlbiwgaW5kZXhlcykgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICAvKiogeHh4LXJrczogc2hvdWxkIGZyZWUgcHJldmlvdXMgdmFsdWU/ICovCiAgICBzbm1wX2Nsb25lX21lbSgodm9pZCAqKikgb3V0LCAodm9pZCAqKSB0bXBvdXQsICpvdXRfbGVuICogc2l6ZW9mKG9pZCkpOwoKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCi8qCiAqIHZibGlzdF9vdXQgbXVzdCBjb250YWluIGEgcHJlLWFsbG9jYXRlZCBzdHJpbmcgb2YgdmFyaWFibGVzIGludG8KICogd2hpY2ggaW5kZXhlcyBjYW4gYmUgZXh0cmFjdGVkIGJhc2VkIG9uIHRoZSBwcmV2aW91c2x5IGV4aXN0aW5nCiAqIHR5cGVzIGluIHRoZSB2YXJpYWJsZSBjaGFpbgogKiByZXR1cm5zOgogKiBTTk1QRVJSX0dFTkVSUiAgb24gZXJyb3IKICogU05NUEVSUl9TVUNDRVNTIG9uIHN1Y2Nlc3MKICovCgppbnQKcGFyc2Vfb2lkX2luZGV4ZXMob2lkICogb2lkSW5kZXgsIHNpemVfdCBvaWRMZW4sCiAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIGRhdGEpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyID0gZGF0YTsKCiAgICB3aGlsZSAodmFyICYmIG9pZExlbiA+IDApIHsKCiAgICAgICAgaWYgKHBhcnNlX29uZV9vaWRfaW5kZXgoJm9pZEluZGV4LCAmb2lkTGVuLCB2YXIsIDApICE9CiAgICAgICAgICAgIFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIHZhciA9IHZhci0+bmV4dF92YXJpYWJsZTsKICAgIH0KCiAgICBpZiAodmFyICE9IE5VTEwgfHwgb2lkTGVuICE9IDApCiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKCmludApwYXJzZV9vbmVfb2lkX2luZGV4KG9pZCAqKiBvaWRTdGFydCwgc2l6ZV90ICogb2lkTGVuLAogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIGRhdGEsIGludCBjb21wbGV0ZSkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXIgPSBkYXRhOwogICAgb2lkICAgICAgICAgICAgIHRtcG91dFtNQVhfT0lEX0xFTl07CiAgICB1bnNpZ25lZCBpbnQgICAgaTsKICAgIHVuc2lnbmVkIGludCAgICB1aXRtcCA9IDA7CgogICAgb2lkICAgICAgICAgICAgKm9pZEluZGV4ID0gKm9pZFN0YXJ0OwoKICAgIGlmICh2YXIgPT0gTlVMTCB8fCAoKCpvaWRMZW4gPT0gMCkgJiYgKGNvbXBsZXRlID09IDApKSkKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICBlbHNlIHsKICAgICAgICBzd2l0Y2ggKHZhci0+dHlwZSkgewogICAgICAgIGNhc2UgQVNOX0lOVEVHRVI6CiAgICAgICAgY2FzZSBBU05fQ09VTlRFUjoKICAgICAgICBjYXNlIEFTTl9HQVVHRToKICAgICAgICBjYXNlIEFTTl9USU1FVElDS1M6CiAgICAgICAgICAgIGlmICgqb2lkTGVuKSB7CiAgICAgICAgICAgICAgICBzbm1wX3NldF92YXJfdmFsdWUodmFyLCAodV9jaGFyICopIG9pZEluZGV4KyssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxvbmcpKTsKICAgICAgICAgICAgICAgIC0tKCpvaWRMZW4pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc25tcF9zZXRfdmFyX3ZhbHVlKHZhciwgKHVfY2hhciAqKSBvaWRMZW4sIHNpemVvZihsb25nKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnNlZCBpbnQoJWQpOiAlbGRcbiIsIHZhci0+dHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgKnZhci0+dmFsLmludGVnZXIpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgQVNOX0lQQUREUkVTUzoKICAgICAgICAgICAgaWYgKCg0ID4gKm9pZExlbikgJiYgKGNvbXBsZXRlID09IDApKQogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgICAgICAKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQgJiYgaSA8ICpvaWRMZW47ICsraSkgewogICAgICAgICAgICAgICAgaWYgKG9pZEluZGV4W2ldID4gMjU1KSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCBvaWQgaW4gaW5kZXg6ICVsZFxuIiwgb2lkSW5kZXhbMF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOyAgLyogc3ViLWlkZW50aWZpZXIgdG9vIGxhcmdlICovCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gdWl0bXAgKyAob2lkSW5kZXhbaV0gPDwgKDgqKDMtaSkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKDQgPiAoaW50KSAoKm9pZExlbikpIHsKICAgICAgICAgICAgICAgIG9pZEluZGV4ICs9ICpvaWRMZW47CiAgICAgICAgICAgICAgICAoKm9pZExlbikgPSAwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2lkSW5kZXggKz0gNDsKICAgICAgICAgICAgICAgICgqb2lkTGVuKSAtPSA0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVpdG1wID0gaHRvbmwodWl0bXApOyAvKiBwdXQgaXQgaW4gcHJvcGVyIG9yZGVyIGZvciBieXRlIGNvcGllcyAqLwogICAgICAgICAgICB1aXRtcCA9IAogICAgICAgICAgICAgICAgc25tcF9zZXRfdmFyX3ZhbHVlKHZhciwgKHVfY2hhciAqKSAmdWl0bXAsIDQpOwogICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiUGFyc2VkIGlwYWRkciglZCk6ICVkLiVkLiVkLiVkXG4iLCB2YXItPnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZ1swXSwgdmFyLT52YWwuc3RyaW5nWzFdLAogICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmdbMl0sIHZhci0+dmFsLnN0cmluZ1szXSkpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBBU05fT0JKRUNUX0lEOgogICAgICAgIGNhc2UgQVNOX1BSSVZfSU1QTElFRF9PQkpFQ1RfSUQ6CiAgICAgICAgICAgIGlmICh2YXItPnR5cGUgPT0gQVNOX1BSSVZfSU1QTElFRF9PQkpFQ1RfSUQpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBtaWdodCBub3QgYmUgaW1wbGllZCwgbWlnaHQgYmUgZml4ZWQgbGVuLiBjaGVjayBpZgogICAgICAgICAgICAgICAgICogY2FsbGVyIHNldCB1cCB2YWwgbGVuLCBhbmQgdXNlIGl0IGlmIHRoZXkgZGlkLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoMCA9PSB2YXItPnZhbF9sZW4pCiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSAqb2lkTGVuOwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzOmZpeCIsICJmaXhlZCBsZW4gb2lkXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSB2YXItPnZhbF9sZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoKm9pZExlbikgewogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gKm9pZEluZGV4Kys7CiAgICAgICAgICAgICAgICAgICAgLS0oKm9pZExlbik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgodWl0bXAgPiAqb2lkTGVuKSAmJiAoY29tcGxldGUgPT0gMCkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodWl0bXAgPiBNQVhfT0lEX0xFTikKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsgIC8qIHRvbyBiaWcgYW5kIGlsbGVnYWwgKi8KCiAgICAgICAgICAgIGlmICh1aXRtcCA+ICpvaWRMZW4pIHsKICAgICAgICAgICAgICAgIG1lbWNweSh0bXBvdXQsIG9pZEluZGV4LCBzaXplb2Yob2lkKSAqICgqb2lkTGVuKSk7CiAgICAgICAgICAgICAgICBtZW1zZXQoJnRtcG91dFsqb2lkTGVuXSwgMHgwMCwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSAqICh1aXRtcCAtICpvaWRMZW4pKTsKICAgICAgICAgICAgICAgIHNubXBfc2V0X3Zhcl92YWx1ZSh2YXIsICh1X2NoYXIgKikgdG1wb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICogdWl0bXApOwogICAgICAgICAgICAgICAgb2lkSW5kZXggKz0gKm9pZExlbjsKICAgICAgICAgICAgICAgICgqb2lkTGVuKSA9IDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzbm1wX3NldF92YXJfdmFsdWUodmFyLCAodV9jaGFyICopIG9pZEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICogdWl0bXApOwogICAgICAgICAgICAgICAgb2lkSW5kZXggKz0gdWl0bXA7CiAgICAgICAgICAgICAgICAoKm9pZExlbikgLT0gdWl0bXA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlcyIsICJQYXJzZWQgb2lkOiAiKSk7CiAgICAgICAgICAgIERFQlVHTVNHT0lEKCgicGFyc2Vfb2lkX2luZGV4ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwub2JqaWQsIHZhci0+dmFsX2xlbiAvIHNpemVvZihvaWQpKSk7CiAgICAgICAgICAgIERFQlVHTVNHKCgicGFyc2Vfb2lkX2luZGV4ZXMiLCAiXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEFTTl9PUEFRVUU6CiAgICAgICAgY2FzZSBBU05fT0NURVRfU1RSOgogICAgICAgIGNhc2UgQVNOX1BSSVZfSU1QTElFRF9PQ1RFVF9TVFI6CiAgICAgICAgICAgIGlmICh2YXItPnR5cGUgPT0gQVNOX1BSSVZfSU1QTElFRF9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBtaWdodCBub3QgYmUgaW1wbGllZCwgbWlnaHQgYmUgZml4ZWQgbGVuLiBjaGVjayBpZgogICAgICAgICAgICAgICAgICogY2FsbGVyIHNldCB1cCB2YWwgbGVuLCBhbmQgdXNlIGl0IGlmIHRoZXkgZGlkLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoMCA9PSB2YXItPnZhbF9sZW4pCiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSAqb2lkTGVuOwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzOmZpeCIsICJmaXhlZCBsZW4gc3RyXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSB2YXItPnZhbF9sZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoKm9pZExlbikgewogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gKm9pZEluZGV4Kys7CiAgICAgICAgICAgICAgICAgICAgLS0oKm9pZExlbik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgodWl0bXAgPiAqb2lkTGVuKSAmJiAoY29tcGxldGUgPT0gMCkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiB3ZSBoYW5kbGUgdGhpcyBvbmUgb3Vyc2VsdmVzIHNpbmNlIHdlIGRvbid0IGhhdmUKICAgICAgICAgICAgICogcHJlLWFsbG9jYXRlZCBtZW1vcnkgdG8gY29weSBmcm9tIHVzaW5nCiAgICAgICAgICAgICAqIHNubXBfc2V0X3Zhcl92YWx1ZSgpIAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIGlmICh1aXRtcCA9PSAwKQogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIHplcm8gbGVuZ3RoIHN0cmluZ3Mgc2hvdWxkbid0IG1hbGxvYyAqLwoKICAgICAgICAgICAgaWYgKHVpdG1wID4gTUFYX09JRF9MRU4pCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7ICAvKiB0b28gYmlnIGFuZCBpbGxlZ2FsICovCgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBtYWxsb2MgYnkgc2l6ZSsxIHRvIGFsbG93IGEgbnVsbCB0byBiZSBhcHBlbmRlZC4gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB2YXItPnZhbF9sZW4gPSB1aXRtcDsKICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nID0gKHVfY2hhciAqKSBjYWxsb2MoMSwgdWl0bXAgKyAxKTsKICAgICAgICAgICAgaWYgKHZhci0+dmFsLnN0cmluZyA9PSBOVUxMKQogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgICAgICAgICAgaWYgKChzaXplX3QpdWl0bXAgPiAoKm9pZExlbikpIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAqb2lkTGVuOyArK2kpCiAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nW2ldID0gKHVfY2hhcikgKiBvaWRJbmRleCsrOwogICAgICAgICAgICAgICAgZm9yIChpID0gKm9pZExlbjsgaSA8IHVpdG1wOyArK2kpCiAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nW2ldID0gJ1wwJzsKICAgICAgICAgICAgICAgICgqb2lkTGVuKSA9IDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdWl0bXA7ICsraSkKICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmdbaV0gPSAodV9jaGFyKSAqIG9pZEluZGV4Kys7CiAgICAgICAgICAgICAgICAoKm9pZExlbikgLT0gdWl0bXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nW3VpdG1wXSA9ICdcMCc7CgogICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiUGFyc2VkIHN0ciglZCk6ICVzXG4iLCB2YXItPnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZykpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgYXNuIHR5cGU6ICVkXG4iLCB2YXItPnR5cGUpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgIH0KICAgIH0KICAgICgqb2lkU3RhcnQpID0gb2lkSW5kZXg7CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgovKgogKiBkdW1wX3JlYWxsb2Nfb2lkX3RvX2luZXRhZGRyZXNzOgogKiAgIHJldHVybiAwIGZvciBmYWlsdXJlLAogKiAgIHJldHVybiAxIGZvciBzdWNjZXNzLAogKiAgIHJldHVybiAyIGZvciBub3QgaGFuZGxlZAogKi8KCmludCAKZHVtcF9yZWFsbG9jX29pZF90b19pbmV0YWRkcmVzcyhjb25zdCBpbnQgYWRkcl90eXBlLCBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHF1b3RlY2hhcikKewogICAgaWYgKGJ1ZikgewogICAgICAgIGludCAgICAgICAgICAgICBpLCBsZW47CiAgICAgICAgY2hhciAgICAgICAgICAgIGludGJ1Zls2NF0sICogcDsKICAgICAgICB1bnNpZ25lZCBjaGFyICAqemM7CiAgICAgICAgdW5zaWduZWQgbG9uZyAgIHpvbmU7CgogICAgICAgIG1lbXNldChpbnRidWYsIDAsIDY0KTsKCiAgICAgICAgcCA9IGludGJ1ZjsKICAgICAgICAqcCA9IHF1b3RlY2hhcjsKICAgICAgICBwKys7CiAgICAgICAgc3dpdGNoIChhZGRyX3R5cGUpIHsKICAgICAgICAgICAgY2FzZSBJUFY0OgogICAgICAgICAgICBjYXNlIElQVjRaOgogICAgICAgICAgICAgICAgaWYgKChhZGRyX3R5cGUgPT0gSVBWNCAgJiYgb2JqaWRsZW4gIT0gNCkgfHwKICAgICAgICAgICAgICAgICAgICAoYWRkcl90eXBlID09IElQVjRaICYmIG9iamlkbGVuICE9IDgpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAyOwoKICAgICAgICAgICAgICAgIGxlbiA9IHNwcmludGYocCwgIiVsdS4lbHUuJWx1LiVsdSIsIG9iamlkWzBdLCBvYmppZFsxXSwgb2JqaWRbMl0sIG9iamlkWzNdKTsKICAgICAgICAgICAgICAgIHAgKz0gbGVuOwogICAgICAgICAgICAgICAgaWYgKGFkZHJfdHlwZSA9PSBJUFY0WikgewogICAgICAgICAgICAgICAgICAgIHpjID0gKHVuc2lnbmVkIGNoYXIqKSZ6b25lOwogICAgICAgICAgICAgICAgICAgIHpjWzBdID0gKHVfY2hhcikob2JqaWRbNF0pOwogICAgICAgICAgICAgICAgICAgIHpjWzFdID0gKHVfY2hhcikob2JqaWRbNV0pOwogICAgICAgICAgICAgICAgICAgIHpjWzJdID0gKHVfY2hhcikob2JqaWRbNl0pOwogICAgICAgICAgICAgICAgICAgIHpjWzNdID0gKHVfY2hhcikob2JqaWRbN10pOwogICAgICAgICAgICAgICAgICAgIHpvbmUgPSBudG9obCh6b25lKTsKICAgICAgICAgICAgICAgICAgICBsZW4gPSBzcHJpbnRmKHAsICIlJSVsdSIsIHpvbmUpOwogICAgICAgICAgICAgICAgICAgIHAgKz0gbGVuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBJUFY2OgogICAgICAgICAgICBjYXNlIElQVjZaOgogICAgICAgICAgICAgICAgaWYgKChhZGRyX3R5cGUgPT0gSVBWNiAmJiBvYmppZGxlbiAhPSAxNikgfHwKICAgICAgICAgICAgICAgICAgICAoYWRkcl90eXBlID09IElQVjZaICYmIG9iamlkbGVuICE9IDIwKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsKCiAgICAgICAgICAgICAgICBsZW4gPSAwOwogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICsrKSB7CiAgICAgICAgICAgICAgICAgICAgbGVuID0gc25wcmludGYocCwgNCwgIiUwMmx4OiIsIG9iamlkW2ldKTsKICAgICAgICAgICAgICAgICAgICBwICs9IGxlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHAtLSA7IC8qIGRvIG5vdCBpbmNsdWRlIHRoZSBsYXN0ICc6JyAqLwoKICAgICAgICAgICAgICAgIGlmIChhZGRyX3R5cGUgPT0gSVBWNlopIHsKICAgICAgICAgICAgICAgICAgICB6YyA9ICh1bnNpZ25lZCBjaGFyKikmem9uZTsKICAgICAgICAgICAgICAgICAgICB6Y1swXSA9ICh1X2NoYXIpKG9iamlkWzE2XSk7CiAgICAgICAgICAgICAgICAgICAgemNbMV0gPSAodV9jaGFyKShvYmppZFsxN10pOwogICAgICAgICAgICAgICAgICAgIHpjWzJdID0gKHVfY2hhcikob2JqaWRbMThdKTsKICAgICAgICAgICAgICAgICAgICB6Y1szXSA9ICh1X2NoYXIpKG9iamlkWzE5XSk7CiAgICAgICAgICAgICAgICAgICAgem9uZSA9IG50b2hsKHpvbmUpOwogICAgICAgICAgICAgICAgICAgIGxlbiA9IHNwcmludGYocCwgIiUlJWx1Iiwgem9uZSk7CiAgICAgICAgICAgICAgICAgICAgcCArPSBsZW47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIEROUzoKICAgICAgICAgICAgZGVmYXVsdDogCiAgICAgICAgICAgICAgICAvKiBETlMgY2FuIGp1c3QgYmUgaGFuZGxlZCBieSBkdW1wX3JlYWxsb2Nfb2lkX3RvX3N0cmluZygpICovCiAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICB9CgogICAgICAgICpwID0gcXVvdGVjaGFyOwoKICAgICAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGludGJ1Zik7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKaW50CmR1bXBfcmVhbGxvY19vaWRfdG9fc3RyaW5nKGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHF1b3RlY2hhcikKewogICAgaWYgKGJ1ZikgewogICAgICAgIGludCAgICAgICAgICAgICBpLCBhbGVuOwoKICAgICAgICBmb3IgKGkgPSAwLCBhbGVuID0gMDsgaSA8IChpbnQpIG9iamlkbGVuOyBpKyspIHsKICAgICAgICAgICAgb2lkICAgICAgICAgICAgIHRzdCA9IG9iamlkW2ldOwogICAgICAgICAgICBpZiAoKHRzdCA+IDI1NCkgfHwgKCFpc3ByaW50KHRzdCkpKSB7CiAgICAgICAgICAgICAgICB0c3QgPSAob2lkKSAnLic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChhbGVuID09IDApIHsKICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVNDQVBFX1FVT1RFUykpIHsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcXCc7CiAgICAgICAgICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDIpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gcXVvdGVjaGFyOwogICAgICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gKGNoYXIpIHRzdDsKICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICAgICBhbGVuKys7CiAgICAgICAgfQoKICAgICAgICBpZiAoYWxlbikgewogICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VTQ0FQRV9RVU9URVMpKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnXFwnOwogICAgICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSBxdW90ZWNoYXI7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICB9CgogICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcMCc7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnZvaWQKX29pZF9maW5pc2hfcHJpbnRpbmcoY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsIGludCAqYnVmX292ZXJmbG93KSB7CiAgICBjaGFyICAgICAgICAgICAgaW50YnVmWzY0XTsKICAgIGlmICgqYnVmICE9IE5VTEwgJiYgKigqYnVmICsgKm91dF9sZW4gLSAxKSAhPSAnLicpIHsKICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIuIikpIHsKICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIHdoaWxlIChvYmppZGxlbi0tID4gMCkgeyAgICAvKiBvdXRwdXQgcmVzdCBvZiBuYW1lLCB1bmludGVycHJldGVkICovCiAgICAgICAgc3ByaW50ZihpbnRidWYsICIlbHUuIiwgKm9iamlkKyspOwogICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgaW50YnVmKSkgewogICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCpidWYgIT0gTlVMTCkgewogICAgICAgICooKmJ1ZiArICpvdXRfbGVuIC0gMSkgPSAnXDAnOyAgLyogcmVtb3ZlIHRyYWlsaW5nIGRvdCAqLwogICAgICAgICpvdXRfbGVuID0gKm91dF9sZW4gLSAxOwogICAgfQp9CgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwpzdGF0aWMgc3RydWN0IHRyZWUgKgpfZ2V0X3JlYWxsb2Nfc3ltYm9sKGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgKnN1YnRyZWUsCiAgICAgICAgICAgICAgICAgICAgdV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywgaW50ICpidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGluZGV4X2xpc3QgKmluX2RpY2VzLCBzaXplX3QgKiBlbmRfb2Zfa25vd24pCnsKICAgIHN0cnVjdCB0cmVlICAgICpyZXR1cm5fdHJlZSA9IE5VTEw7CiAgICBpbnQgICAgICAgICAgICAgZXh0ZW5kZWRfaW5kZXggPQogICAgICAgIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FWFRFTkRFRF9JTkRFWCk7CiAgICBpbnQgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdCA9CiAgICAgICAgbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQpOwogICAgY2hhciAgICAgICAgICAgIGludGJ1Zls2NF07CgogICAgaWYgKCFvYmppZCB8fCAhYnVmKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgZm9yICg7IHN1YnRyZWU7IHN1YnRyZWUgPSBzdWJ0cmVlLT5uZXh0X3BlZXIpIHsKICAgICAgICBpZiAoKm9iamlkID09IHN1YnRyZWUtPnN1YmlkKSB7CgkgICAgd2hpbGUgKHN1YnRyZWUtPm5leHRfcGVlciAmJiBzdWJ0cmVlLT5uZXh0X3BlZXItPnN1YmlkID09ICpvYmppZCkKCQlzdWJ0cmVlID0gc3VidHJlZS0+bmV4dF9wZWVyOwogICAgICAgICAgICBpZiAoc3VidHJlZS0+aW5kZXhlcykgewogICAgICAgICAgICAgICAgaW5fZGljZXMgPSBzdWJ0cmVlLT5pbmRleGVzOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN1YnRyZWUtPmF1Z21lbnRzKSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJlZSAgICAqdHAyID0KICAgICAgICAgICAgICAgICAgICBmaW5kX3RyZWVfbm9kZShzdWJ0cmVlLT5hdWdtZW50cywgLTEpOwogICAgICAgICAgICAgICAgaWYgKHRwMikgewogICAgICAgICAgICAgICAgICAgIGluX2RpY2VzID0gdHAyLT5pbmRleGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXN0cm5jbXAoc3VidHJlZS0+bGFiZWwsIEFOT04sIEFOT05fTEVOKSB8fAogICAgICAgICAgICAgICAgKE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDID09IG91dHB1dF9mb3JtYXQpKSB7CiAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiVsdSIsIHN1YnRyZWUtPnN1YmlkKTsKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWUtPmxhYmVsKSkgewogICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAob2JqaWRsZW4gPiAxKSB7CiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiLiIpKSB7CiAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuX3RyZWUgPSBfZ2V0X3JlYWxsb2Nfc3ltYm9sKG9iamlkICsgMSwgb2JqaWRsZW4gLSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWUtPmNoaWxkX2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX292ZXJmbG93LCBpbl9kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfb2Zfa25vd24pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocmV0dXJuX3RyZWUgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybl90cmVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHN1YnRyZWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIGlmIChlbmRfb2Zfa25vd24pIHsKICAgICAgICAqZW5kX29mX2tub3duID0gKm91dF9sZW47CiAgICB9CgogICAgLyoKICAgICAqIFN1YnRyZWUgbm90IGZvdW5kLiAgCiAgICAgKi8KCiAgICB3aGlsZSAoaW5fZGljZXMgJiYgKG9iamlkbGVuID4gMCkgJiYKICAgICAgICAgICAoTkVUU05NUF9PSURfT1VUUFVUX05VTUVSSUMgIT0gb3V0cHV0X2Zvcm1hdCkgJiYKICAgICAgICAgICAhbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfQlJFQUtET1dOX09JRFMpKSB7CiAgICAgICAgc2l6ZV90ICAgICAgICAgIG51bWlkczsKICAgICAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CgogICAgICAgIHRwID0gZmluZF90cmVlX25vZGUoaW5fZGljZXMtPmlsYWJlbCwgLTEpOwoKICAgICAgICBpZiAoIXRwKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIENhbid0IGZpbmQgYW4gaW5kZXggaW4gdGhlIG1pYiB0cmVlLiAgQmFpbC4gIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoZXh0ZW5kZWRfaW5kZXgpIHsKICAgICAgICAgICAgaWYgKCpidWYgIT0gTlVMTCAmJiAqKCpidWYgKyAqb3V0X2xlbiAtIDEpID09ICcuJykgewogICAgICAgICAgICAgICAgKCpvdXRfbGVuKS0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiWyIpKSB7CiAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICh0cC0+dHlwZSkgewogICAgICAgIGNhc2UgVFlQRV9PQ1RFVFNUUjoKICAgICAgICAgICAgaWYgKGV4dGVuZGVkX2luZGV4ICYmIHRwLT5oaW50KSB7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgdmFyOwogICAgICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIGJ1ZmZlclsxMDI0XTsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBpOwoKICAgICAgICAgICAgICAgIG1lbXNldCgmdmFyLCAwLCBzaXplb2YgdmFyKTsKICAgICAgICAgICAgICAgIGlmIChpbl9kaWNlcy0+aXNpbXBsaWVkKSB7CiAgICAgICAgICAgICAgICAgICAgbnVtaWRzID0gb2JqaWRsZW47CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bWlkcyA+IG9iamlkbGVuKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHAtPnJhbmdlcyAmJiAhdHAtPnJhbmdlcy0+bmV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0cC0+cmFuZ2VzLT5sb3cgPT0gdHAtPnJhbmdlcy0+aGlnaCkgewogICAgICAgICAgICAgICAgICAgIG51bWlkcyA9IHRwLT5yYW5nZXMtPmxvdzsKICAgICAgICAgICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBudW1pZHMgPSAqb2JqaWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bWlkcyA+PSBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgICAgICAgICAgb2JqaWQrKzsKICAgICAgICAgICAgICAgICAgICBvYmppZGxlbi0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG51bWlkcyA+IG9iamlkbGVuKQogICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIG51bWlkczsgaSsrKQogICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9ICh1X2NoYXIpIG9iamlkW2ldOwogICAgICAgICAgICAgICAgdmFyLnR5cGUgPSBBU05fT0NURVRfU1RSOwogICAgICAgICAgICAgICAgdmFyLnZhbC5zdHJpbmcgPSBidWZmZXI7CiAgICAgICAgICAgICAgICB2YXIudmFsX2xlbiA9IG51bWlkczsKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICAgICAgICAgIGlmICghc3ByaW50X3JlYWxsb2Nfb2N0ZXRfc3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAmdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHRwLT5oaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChpbl9kaWNlcy0+aXNpbXBsaWVkKSB7CiAgICAgICAgICAgICAgICBudW1pZHMgPSBvYmppZGxlbjsKICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKCiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWR1bXBfcmVhbGxvY19vaWRfdG9fc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIChvYmppZCwgbnVtaWRzLCBidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAnXCcnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHAtPnJhbmdlcyAmJiAhdHAtPnJhbmdlcy0+bmV4dAogICAgICAgICAgICAgICAgICAgICAgICYmIHRwLT5yYW5nZXMtPmxvdyA9PSB0cC0+cmFuZ2VzLT5oaWdoKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogYSBmaXhlZC1sZW5ndGggb2N0ZXQgc3RyaW5nIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBudW1pZHMgPSB0cC0+cmFuZ2VzLT5sb3c7CiAgICAgICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CgogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFkdW1wX3JlYWxsb2Nfb2lkX3RvX3N0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAob2JqaWQsIG51bWlkcywgYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJ1wnJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbnVtaWRzID0gKHNpemVfdCkgKiBvYmppZCArIDE7CiAgICAgICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgICAgICBpZiAobnVtaWRzID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbgogICAgICAgICAgICAgICAgICAgICAgICAoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FU0NBUEVfUVVPVEVTKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJcXCIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJcIiIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbgogICAgICAgICAgICAgICAgICAgICAgICAoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FU0NBUEVfUVVPVEVTKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJcXCIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJcIiIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmVlICogbmV4dF9wZWVyOwogICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9ybWFsX2hhbmRsaW5nID0gMTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cC0+bmV4dF9wZWVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3BlZXIgPSB0cC0+bmV4dF9wZWVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgaGFuZGxpbmcgdGhlIEluZXRBZGRyZXNzIGluIHRoZSBPSUQsIGluIGNhc2Ugb2YgZmFpbHVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICogdXNlIHRoZSBub3JtYWxfaGFuZGxpbmcuIAogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRwLT5uZXh0X3BlZXIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT50Y19pbmRleCAhPSAtMSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9wZWVyLT50Y19pbmRleCAhPSAtMSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKGdldF90Y19kZXNjcmlwdG9yKHRwLT50Y19pbmRleCksICJJbmV0QWRkcmVzcyIpID09IDAgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcChnZXRfdGNfZGVzY3JpcHRvcihuZXh0X3BlZXItPnRjX2luZGV4KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmV0QWRkcmVzc1R5cGUiKSA9PSAwICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWRkcl90eXBlID0gKihvYmppZCAtIDEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGR1bXBfcmVhbGxvY19vaWRfdG9faW5ldGFkZHJlc3MoYWRkcl90eXBlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkICsgMSwgbnVtaWRzIC0gMSwgYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJyInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbF9oYW5kbGluZyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxfaGFuZGxpbmcgJiYgIWR1bXBfcmVhbGxvY19vaWRfdG9fc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2JqaWQgKyAxLCBudW1pZHMgLSAxLCBidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJyInKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2JqaWQgKz0gbnVtaWRzOwogICAgICAgICAgICBvYmppZGxlbiAtPSBudW1pZHM7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgICAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICBjYXNlIFRZUEVfR0FVR0U6CiAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVI6CiAgICAgICAgICAgIGlmICh0cC0+ZW51bXMpIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBlbnVtX2xpc3QgKmVwID0gdHAtPmVudW1zOwogICAgICAgICAgICAgICAgd2hpbGUgKGVwICYmIGVwLT52YWx1ZSAhPSAoaW50KSAoKm9iamlkKSkgewogICAgICAgICAgICAgICAgICAgIGVwID0gZXAtPm5leHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZXApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGVwLT5sYWJlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiVsdSIsICpvYmppZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJWx1IiwgKm9iamlkKTsKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvYmppZCsrOwogICAgICAgICAgICBvYmppZGxlbi0tOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBUWVBFX1RJTUVUSUNLUzoKICAgICAgICAgICAgLyogSW4gYW4gaW5kZXgsIHRoaXMgaXMgcHJvYmFibHkgYSB0aW1lZmlsdGVyICovCiAgICAgICAgICAgIGlmIChleHRlbmRlZF9pbmRleCkgewogICAgICAgICAgICAgICAgdXB0aW1lU3RyaW5nKCAqb2JqaWQsIGludGJ1Ziwgc2l6ZW9mKCBpbnRidWYgKSApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlIiBORVRTTk1QX1BSSW8gInUiLCAqb2JqaWQpOwogICAgICAgICAgICB9ICAgCiAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9iamlkKys7CiAgICAgICAgICAgIG9iamlkbGVuLS07CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFRZUEVfT0JKSUQ6CiAgICAgICAgICAgIGlmIChpbl9kaWNlcy0+aXNpbXBsaWVkKSB7CiAgICAgICAgICAgICAgICBudW1pZHMgPSBvYmppZGxlbjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG51bWlkcyA9IChzaXplX3QpICogb2JqaWQgKyAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICBpZiAoZXh0ZW5kZWRfaW5kZXgpIHsKICAgICAgICAgICAgICAgIGlmIChpbl9kaWNlcy0+aXNpbXBsaWVkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICYmICFuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUoYnVmLCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtaWRzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKGJ1ZiwgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1pZHMgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIF9nZXRfcmVhbGxvY19zeW1ib2wob2JqaWQsIG51bWlkcywgTlVMTCwgYnVmLCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9iamlkICs9IChudW1pZHMpOwogICAgICAgICAgICBvYmppZGxlbiAtPSAobnVtaWRzKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVFlQRV9JUEFERFI6CiAgICAgICAgICAgIGlmIChvYmppZGxlbiA8IDQpCiAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlbHUuJWx1LiVsdS4lbHUiLAogICAgICAgICAgICAgICAgICAgIG9iamlkWzBdLCBvYmppZFsxXSwgb2JqaWRbMl0sIG9iamlkWzNdKTsKICAgICAgICAgICAgb2JqaWQgKz0gNDsKICAgICAgICAgICAgb2JqaWRsZW4gLT0gNDsKICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFRZUEVfTkVUQUREUjp7CiAgICAgICAgICAgICAgICBvaWQgICAgICAgICAgICAgbnR5cGUgPSAqb2JqaWQrKzsKCiAgICAgICAgICAgICAgICBvYmppZGxlbi0tOwogICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlbHUuIiwgbnR5cGUpOwogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChudHlwZSA9PSAxICYmIG9iamlkbGVuID49IDQpIHsKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiVsdS4lbHUuJWx1LiVsdSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZFswXSwgb2JqaWRbMV0sIG9iamlkWzJdLCBvYmppZFszXSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvYmppZCArPSA0OwogICAgICAgICAgICAgICAgICAgIG9iamlkbGVuIC09IDQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFRZUEVfTlNBUEFERFJFU1M6CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKGV4dGVuZGVkX2luZGV4KSB7CiAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiXSIpKSB7CiAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiLiIpKSB7CiAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpbl9kaWNlcyA9IGluX2RpY2VzLT5uZXh0OwogICAgfQoKICBmaW5pc2hfaXQ6CiAgICBfb2lkX2ZpbmlzaF9wcmludGluZyhvYmppZCwgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCBidWZfb3ZlcmZsb3cpOwogICAgcmV0dXJuIE5VTEw7Cn0KCnN0cnVjdCB0cmVlICAgICoKZ2V0X3RyZWUoY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwgc3RydWN0IHRyZWUgKnN1YnRyZWUpCnsKICAgIHN0cnVjdCB0cmVlICAgICpyZXR1cm5fdHJlZSA9IE5VTEw7CgogICAgZm9yICg7IHN1YnRyZWU7IHN1YnRyZWUgPSBzdWJ0cmVlLT5uZXh0X3BlZXIpIHsKICAgICAgICBpZiAoKm9iamlkID09IHN1YnRyZWUtPnN1YmlkKQogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgfQoKICAgIHJldHVybiBOVUxMOwoKICBmb3VuZDoKICAgIHdoaWxlIChzdWJ0cmVlLT5uZXh0X3BlZXIgJiYgc3VidHJlZS0+bmV4dF9wZWVyLT5zdWJpZCA9PSAqb2JqaWQpCglzdWJ0cmVlID0gc3VidHJlZS0+bmV4dF9wZWVyOwogICAgaWYgKG9iamlkbGVuID4gMSkKICAgICAgICByZXR1cm5fdHJlZSA9CiAgICAgICAgICAgIGdldF90cmVlKG9iamlkICsgMSwgb2JqaWRsZW4gLSAxLCBzdWJ0cmVlLT5jaGlsZF9saXN0KTsKICAgIGlmIChyZXR1cm5fdHJlZSAhPSBOVUxMKQogICAgICAgIHJldHVybiByZXR1cm5fdHJlZTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gc3VidHJlZTsKfQoKLyoqCiAqIFByaW50cyBvbiBvaWQgZGVzY3JpcHRpb24gb24gc3Rkb3V0LgogKgogKiBAc2VlIGZwcmludF9kZXNjcmlwdGlvbgogKi8Kdm9pZApwcmludF9kZXNjcmlwdGlvbihvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLCAvKiBudW1iZXIgb2Ygc3ViaWRlbnRpZmllcnMgKi8KICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQp7CiAgICBmcHJpbnRfZGVzY3JpcHRpb24oc3Rkb3V0LCBvYmppZCwgb2JqaWRsZW4sIHdpZHRoKTsKfQoKCi8qKgogKiBQcmludHMgb24gb2lkIGRlc2NyaXB0aW9uIGludG8gYSBmaWxlIGRlc2NyaXB0b3IuCiAqIAogKiBAcGFyYW0gZiAgICAgICAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBvYmppZCAgICAgVGhlIG9iamVjdCBpZGVudGlmaWVyLgogKiBAcGFyYW0gb2JqaWRsZW4gIFRoZSBvYmplY3QgaWQgbGVuZ3RoLgogKiBAcGFyYW0gd2lkdGggICAgIE51bWJlciBvZiBzdWJpZGVudGlmaWVycy4KICovCnZvaWQKZnByaW50X2Rlc2NyaXB0aW9uKEZJTEUgKiBmLCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQp7CiAgICB1X2NoYXIgICAgICAgICAqYnVmID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMjU2LCBvdXRfbGVuID0gMDsKCiAgICBpZiAoKGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKGJ1Zl9sZW4sIDEpKSA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihmLCAiW1RSVU5DQVRFRF1cbiIpOwogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19kZXNjcmlwdGlvbigmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuLCB3aWR0aCkpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgW1RSVU5DQVRFRF1cbiIsIGJ1Zik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXNcbiIsIGJ1Zik7CiAgICAgICAgfQogICAgfQoKICAgIFNOTVBfRlJFRShidWYpOwp9CgppbnQKc25wcmludF9kZXNjcmlwdGlvbihjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgIG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sIGludCB3aWR0aCkKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwoKICAgIGlmIChzcHJpbnRfcmVhbGxvY19kZXNjcmlwdGlvbigodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwgb2JqaWRsZW4sIHdpZHRoKSkgewogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9Cn0KCmludApzcHJpbnRfcmVhbGxvY19kZXNjcmlwdGlvbih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwgaW50IHdpZHRoKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHAgPSBnZXRfdHJlZShvYmppZCwgb2JqaWRsZW4sIHRyZWVfaGVhZCk7CiAgICBzdHJ1Y3QgdHJlZSAgICAqc3VidHJlZSA9IHRyZWVfaGVhZDsKICAgIGludCAgICAgICAgICAgICBwb3MsIGxlbjsKICAgIGNoYXIgICAgICAgICAgICB0bXBidWZbMTI4XTsKICAgIGNvbnN0IGNoYXIgICAgICpjcDsKCiAgICBpZiAoTlVMTCA9PSB0cCkKICAgICAgICByZXR1cm4gMDsKCiAgICBpZiAodHAtPnR5cGUgPD0gVFlQRV9TSU1QTEVfTEFTVCkKICAgICAgICBjcCA9ICIgT0JKRUNULVRZUEUiOwogICAgZWxzZQogICAgICAgIHN3aXRjaCAodHAtPnR5cGUpIHsKICAgICAgICBjYXNlIFRZUEVfVFJBUFRZUEU6CiAgICAgICAgICAgIGNwID0gIiBUUkFQLVRZUEUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTk9USUZUWVBFOgogICAgICAgICAgICBjcCA9ICIgTk9USUZJQ0FUSU9OLVRZUEUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfT0JKR1JPVVA6CiAgICAgICAgICAgIGNwID0gIiBPQkpFQ1QtR1JPVVAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfQUdFTlRDQVA6CiAgICAgICAgICAgIGNwID0gIiBBR0VOVC1DQVBBQklMSVRJRVMiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTU9ESUQ6CiAgICAgICAgICAgIGNwID0gIiBNT0RVTEUtSURFTlRJVFkiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfT0JKSURFTlRJVFk6CiAgICAgICAgICAgIGNwID0gIiBPQkpFQ1QtSURFTlRJVFkiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTU9EQ09NUDoKICAgICAgICAgICAgY3AgPSAiIE1PRFVMRS1DT01QTElBTkNFIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgc3ByaW50Zih0bXBidWYsICIgdHlwZV8lZCIsIHRwLT50eXBlKTsKICAgICAgICAgICAgY3AgPSB0bXBidWY7CiAgICAgICAgfQoKICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAtPmxhYmVsKSB8fAogICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCkgfHwKICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuIikpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmICghcHJpbnRfdHJlZV9ub2RlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAsIHdpZHRoKSkKICAgICAgICByZXR1cm4gMDsKICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIjo6PSB7IikpCiAgICAgICAgcmV0dXJuIDA7CiAgICBwb3MgPSA1OwogICAgd2hpbGUgKG9iamlkbGVuID4gMSkgewogICAgICAgIGZvciAoOyBzdWJ0cmVlOyBzdWJ0cmVlID0gc3VidHJlZS0+bmV4dF9wZWVyKSB7CiAgICAgICAgICAgIGlmICgqb2JqaWQgPT0gc3VidHJlZS0+c3ViaWQpIHsKICAgICAgICAgICAgICAgIHdoaWxlIChzdWJ0cmVlLT5uZXh0X3BlZXIgJiYgc3VidHJlZS0+bmV4dF9wZWVyLT5zdWJpZCA9PSAqb2JqaWQpCiAgICAgICAgICAgICAgICAgICAgc3VidHJlZSA9IHN1YnRyZWUtPm5leHRfcGVlcjsKICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKHN1YnRyZWUtPmxhYmVsLCBBTk9OLCBBTk9OX0xFTikpIHsKICAgICAgICAgICAgICAgICAgICBzbnByaW50Zih0bXBidWYsIHNpemVvZih0bXBidWYpLCAiICVzKCVsdSkiLCBzdWJ0cmVlLT5sYWJlbCwgc3VidHJlZS0+c3ViaWQpOwogICAgICAgICAgICAgICAgICAgIHRtcGJ1Zlsgc2l6ZW9mKHRtcGJ1ZiktMSBdID0gMDsKICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgIHNwcmludGYodG1wYnVmLCAiICVsdSIsIHN1YnRyZWUtPnN1YmlkKTsKICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbih0bXBidWYpOwogICAgICAgICAgICAgICAgaWYgKHBvcyArIGxlbiArIDIgPiB3aWR0aCkgewogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICJcbiAgICAgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIHBvcyA9IDU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRtcGJ1ZikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuOwogICAgICAgICAgICAgICAgb2JqaWQrKzsKICAgICAgICAgICAgICAgIG9iamlkbGVuLS07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc3VidHJlZSkKICAgICAgICAgICAgc3VidHJlZSA9IHN1YnRyZWUtPmNoaWxkX2xpc3Q7CiAgICAgICAgZWxzZQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHdoaWxlIChvYmppZGxlbiA+IDEpIHsKICAgICAgICBzcHJpbnRmKHRtcGJ1ZiwgIiAlbHUiLCAqb2JqaWQpOwogICAgICAgIGxlbiA9IHN0cmxlbih0bXBidWYpOwogICAgICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4gICAgICIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIHBvcyA9IDU7CiAgICAgICAgfQogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdG1wYnVmKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgcG9zICs9IGxlbjsKICAgICAgICBvYmppZCsrOwogICAgICAgIG9iamlkbGVuLS07CiAgICB9CiAgICBzcHJpbnRmKHRtcGJ1ZiwgIiAlbHUgfSIsICpvYmppZCk7CiAgICBsZW4gPSBzdHJsZW4odG1wYnVmKTsKICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiAgICAgIikpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHBvcyA9IDU7CiAgICB9CiAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRtcGJ1ZikpCiAgICAgICAgcmV0dXJuIDA7CiAgICByZXR1cm4gMTsKfQoKc3RhdGljIGludApwcmludF90cmVlX25vZGUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmVlICp0cCwgaW50IHdpZHRoKQp7CiAgICBjb25zdCBjaGFyICAgICAqY3A7CiAgICBjaGFyICAgICAgICAgICAgc3RyW01BWFRPS0VOXTsKICAgIGludCAgICAgICAgICAgICBpLCBwcmV2bW9kLCBwb3MsIGxlbjsKCiAgICBpZiAodHApIHsKICAgICAgICBtb2R1bGVfbmFtZSh0cC0+bW9kaWQsIHN0cik7CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICAtLSBGUk9NXHQiKSB8fAogICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgcG9zID0gMTYrc3RybGVuKHN0cik7CiAgICAgICAgZm9yIChpID0gMSwgcHJldm1vZCA9IHRwLT5tb2RpZDsgaSA8IHRwLT5udW1iZXJfbW9kdWxlczsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwcmV2bW9kICE9IHRwLT5tb2R1bGVfbGlzdFtpXSkgewogICAgICAgICAgICAgICAgbW9kdWxlX25hbWUodHAtPm1vZHVsZV9saXN0W2ldLCBzdHIpOwogICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHN0cik7CiAgICAgICAgICAgICAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixcbiAgLS1cdFx0IikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIHBvcyA9IDE2OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiLCAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgcG9zICs9IDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByZXZtb2QgPSB0cC0+bW9kdWxlX2xpc3RbaV07CiAgICAgICAgfQogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuIikpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+dGNfaW5kZXggIT0gLTEpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAtLSBURVhUVUFMIENPTlZFTlRJT04gIikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdGNfZGVzY3JpcHRvcih0cC0+dGNfaW5kZXgpKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAodHAtPnR5cGUpIHsKICAgICAgICBjYXNlIFRZUEVfT0JKSUQ6CiAgICAgICAgICAgIGNwID0gIk9CSkVDVCBJREVOVElGSUVSIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgICAgICBjcCA9ICJPQ1RFVCBTVFJJTkciOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICAgICAgY3AgPSAiSU5URUdFUiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9ORVRBRERSOgogICAgICAgICAgICBjcCA9ICJOZXR3b3JrQWRkcmVzcyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9JUEFERFI6CiAgICAgICAgICAgIGNwID0gIklwQWRkcmVzcyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9DT1VOVEVSOgogICAgICAgICAgICBjcCA9ICJDb3VudGVyMzIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfR0FVR0U6CiAgICAgICAgICAgIGNwID0gIkdhdWdlMzIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfVElNRVRJQ0tTOgogICAgICAgICAgICBjcCA9ICJUaW1lVGlja3MiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfT1BBUVVFOgogICAgICAgICAgICBjcCA9ICJPcGFxdWUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTlVMTDoKICAgICAgICAgICAgY3AgPSAiTlVMTCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9DT1VOVEVSNjQ6CiAgICAgICAgICAgIGNwID0gIkNvdW50ZXI2NCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9CSVRTVFJJTkc6CiAgICAgICAgICAgIGNwID0gIkJJVFMiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTlNBUEFERFJFU1M6CiAgICAgICAgICAgIGNwID0gIk5zYXBBZGRyZXNzIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX1VJTlRFR0VSOgogICAgICAgICAgICBjcCA9ICJVSW50ZWdlcjMyIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX1VOU0lHTkVEMzI6CiAgICAgICAgICAgIGNwID0gIlVuc2lnbmVkMzIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgICAgICAgICBjcCA9ICJJbnRlZ2VyMzIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjcCA9IE5VTEw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KI2lmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQogICAgICAgIGlmICghY3AgJiYgKHRwLT5yYW5nZXMgfHwgdHAtPmVudW1zKSkgeyAvKiByYW5nZXMgd2l0aG91dCB0eXBlID8gKi8KICAgICAgICAgICAgc3ByaW50ZihzdHIsICI/MCB3aXRoICVzICVzID8iLAogICAgICAgICAgICAgICAgICAgIHRwLT5yYW5nZXMgPyAiUmFuZ2UiIDogIiIsIHRwLT5lbnVtcyA/ICJFbnVtIiA6ICIiKTsKICAgICAgICAgICAgY3AgPSBzdHI7CiAgICAgICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERSAqLwogICAgICAgIGlmIChjcCkKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFNZTlRBWFx0IikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCkpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAodHAtPnJhbmdlcykgewogICAgICAgICAgICBzdHJ1Y3QgcmFuZ2VfbGlzdCAqcnAgPSB0cC0+cmFuZ2VzOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmlyc3QgPSAxOwogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgKCIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIHdoaWxlIChycCkgewogICAgICAgICAgICAgICAgc3dpdGNoICh0cC0+dHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVI6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgICAgICAgICAgICAgICAgIGlmIChycC0+bG93ID09IHJwLT5oaWdoKQogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVzJWQiLCAoZmlyc3QgPyAiIiA6ICIgfCAiKSwgcnAtPmxvdyApOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlcyVkLi4lZCIsIChmaXJzdCA/ICIiIDogIiB8ICIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwLT5sb3csIHJwLT5oaWdoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9VTlNJR05FRDMyOgogICAgICAgICAgICAgICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgICAgICAgICAgY2FzZSBUWVBFX0dBVUdFOgogICAgICAgICAgICAgICAgY2FzZSBUWVBFX1VJTlRFR0VSOgogICAgICAgICAgICAgICAgICAgIGlmIChycC0+bG93ID09IHJwLT5oaWdoKQogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVzJXUiLCAoZmlyc3QgPyAiIiA6ICIgfCAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcnAtPmxvdyApOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlcyV1Li4ldSIsIChmaXJzdCA/ICIiIDogIiB8ICIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClycC0+bG93LCAodW5zaWduZWQpcnAtPmhpZ2gpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAvKiBObyBvdGhlciByYW5nZSB0eXBlcyBhbGxvd2VkICovCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwOwogICAgICAgICAgICAgICAgcnAgPSBycC0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIpICIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICh0cC0+ZW51bXMpIHsKICAgICAgICAgICAgc3RydWN0IGVudW1fbGlzdCAqZXAgPSB0cC0+ZW51bXM7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBmaXJzdCA9IDE7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiB7IikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgcG9zID0gMTYgKyBzdHJsZW4oY3ApICsgMjsKICAgICAgICAgICAgd2hpbGUgKGVwKSB7CiAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiwgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgIiVzKCVkKSIsIGVwLT5sYWJlbCwgZXAtPnZhbHVlKTsKICAgICAgICAgICAgICAgIHN0clsgc2l6ZW9mKHN0ciktMSBdID0gMDsKICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihzdHIpOwogICAgICAgICAgICAgICAgaWYgKHBvcyArIGxlbiArIDIgPiB3aWR0aCkgewogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICJcblx0XHQgICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBwb3MgPSAxODsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHBvcyArPSBsZW4gKyAyOwogICAgICAgICAgICAgICAgZXAgPSBlcC0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJ9ICIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmIChjcCkKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+aGludCkKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIERJU1BMQVktSElOVFx0XCIiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRwLT5oaW50KSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAodHAtPnVuaXRzKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgVU5JVFNcdFx0XCIiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRwLT51bml0cykgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCJcbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgc3dpdGNoICh0cC0+YWNjZXNzKSB7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX1JFQURPTkxZOgogICAgICAgICAgICBjcCA9ICJyZWFkLW9ubHkiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfUkVBRFdSSVRFOgogICAgICAgICAgICBjcCA9ICJyZWFkLXdyaXRlIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX1dSSVRFT05MWToKICAgICAgICAgICAgY3AgPSAid3JpdGUtb25seSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19OT0FDQ0VTUzoKICAgICAgICAgICAgY3AgPSAibm90LWFjY2Vzc2libGUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfTk9USUZZOgogICAgICAgICAgICBjcCA9ICJhY2Nlc3NpYmxlLWZvci1ub3RpZnkiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfQ1JFQVRFOgogICAgICAgICAgICBjcCA9ICJyZWFkLWNyZWF0ZSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgY3AgPSBOVUxMOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBzcHJpbnRmKHN0ciwgImFjY2Vzc18lZCIsIHRwLT5hY2Nlc3MpOwogICAgICAgICAgICBjcCA9IHN0cjsKICAgICAgICB9CiAgICAgICAgaWYgKGNwKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgTUFYLUFDQ0VTU1x0IikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCkgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHN3aXRjaCAodHAtPnN0YXR1cykgewogICAgICAgIGNhc2UgTUlCX1NUQVRVU19NQU5EQVRPUlk6CiAgICAgICAgICAgIGNwID0gIm1hbmRhdG9yeSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX1NUQVRVU19PUFRJT05BTDoKICAgICAgICAgICAgY3AgPSAib3B0aW9uYWwiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9TVEFUVVNfT0JTT0xFVEU6CiAgICAgICAgICAgIGNwID0gIm9ic29sZXRlIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfU1RBVFVTX0RFUFJFQ0FURUQ6CiAgICAgICAgICAgIGNwID0gImRlcHJlY2F0ZWQiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9TVEFUVVNfQ1VSUkVOVDoKICAgICAgICAgICAgY3AgPSAiY3VycmVudCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgY3AgPSBOVUxMOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBzcHJpbnRmKHN0ciwgInN0YXR1c18lZCIsIHRwLT5zdGF0dXMpOwogICAgICAgICAgICBjcCA9IHN0cjsKICAgICAgICB9CiNpZiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUKICAgICAgICBpZiAoIWNwICYmICh0cC0+aW5kZXhlcykpIHsgICAgIC8qIGluZGV4IHdpdGhvdXQgc3RhdHVzID8gKi8KICAgICAgICAgICAgc3ByaW50ZihzdHIsICI/MCB3aXRoICVzID8iLCB0cC0+aW5kZXhlcyA/ICJJbmRleCIgOiAiIik7CiAgICAgICAgICAgIGNwID0gc3RyOwogICAgICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUgKi8KICAgICAgICBpZiAoY3ApCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBTVEFUVVNcdCIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgY3ApIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAodHAtPmF1Z21lbnRzKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQVVHTUVOVFNcdHsgIikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cC0+YXVnbWVudHMpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiB9XG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+aW5kZXhlcykgewogICAgICAgICAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqaXAgPSB0cC0+aW5kZXhlczsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZpcnN0ID0gMTsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIElOREVYXHRcdHsgIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgcG9zID0gMTYgKyAyOwogICAgICAgICAgICB3aGlsZSAoaXApIHsKICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiLCAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiJXMlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlwLT5pc2ltcGxpZWQgPyAiSU1QTElFRCAiIDogIiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlwLT5pbGFiZWwpOwogICAgICAgICAgICAgICAgc3RyWyBzaXplb2Yoc3RyKS0xIF0gPSAwOwogICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHN0cik7CiAgICAgICAgICAgICAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG5cdFx0ICAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgcG9zID0gMTYgKyAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgcG9zICs9IGxlbiArIDI7CiAgICAgICAgICAgICAgICBpcCA9IGlwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiB9XG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAodHAtPnZhcmJpbmRzKSB7CiAgICAgICAgICAgIHN0cnVjdCB2YXJiaW5kX2xpc3QgKnZwID0gdHAtPnZhcmJpbmRzOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmlyc3QgPSAxOwoKICAgICAgICAgICAgaWYgKHRwLT50eXBlID09IFRZUEVfVFJBUFRZUEUpIHsKICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAiICBWQVJJQUJMRVNcdHsgIikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIiAgT0JKRUNUU1x0eyAiKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBwb3MgPSAxNiArIDI7CiAgICAgICAgICAgIHdoaWxlICh2cCkgewogICAgICAgICAgICAgICAgaWYgKGZpcnN0KQogICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gMDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIsICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHN0cmxjcHkoc3RyLCB2cC0+dmJsYWJlbCwgc2l6ZW9mKHN0cikpOwogICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHN0cik7CiAgICAgICAgICAgICAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5cdFx0ICAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgcG9zID0gMTYgKyAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgcG9zICs9IGxlbiArIDI7CiAgICAgICAgICAgICAgICB2cCA9IHZwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiB9XG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAodHAtPmRlc2NyaXB0aW9uKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIERFU0NSSVBUSU9OXHRcIiIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAtPmRlc2NyaXB0aW9uKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAodHAtPmRlZmF1bHRWYWx1ZSkKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBERUZWQUxcdHsgIikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cC0+ZGVmYXVsdFZhbHVlKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgfVxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgIH0gZWxzZQogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIk5vIGRlc2NyaXB0aW9uXG4iKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICByZXR1cm4gMTsKfQoKaW50CmdldF9tb2R1bGVfbm9kZShjb25zdCBjaGFyICpmbmFtZSwKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZHVsZSwgb2lkICogb2JqaWQsIHNpemVfdCAqIG9iamlkbGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgbW9kaWQsIHJjID0gMDsKICAgIHN0cnVjdCB0cmVlICAgICp0cDsKICAgIGNoYXIgICAgICAgICAgICpuYW1lLCAqY3A7CgogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAiQU5ZIikpCiAgICAgICAgbW9kaWQgPSAtMTsKICAgIGVsc2UgewogICAgICAgIG5ldHNubXBfcmVhZF9tb2R1bGUobW9kdWxlKTsKICAgICAgICBtb2RpZCA9IHdoaWNoX21vZHVsZShtb2R1bGUpOwogICAgICAgIGlmIChtb2RpZCA9PSAtMSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyoKICAgICAqIElzb2xhdGUgdGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgbmFtZSAuLi4gCiAgICAgKi8KICAgIG5hbWUgPSBzdHJkdXAoZm5hbWUpOwogICAgY3AgPSBzdHJjaHIobmFtZSwgJy4nKTsKICAgIGlmIChjcCAhPSBOVUxMKSB7CiAgICAgICAgKmNwID0gJ1wwJzsKICAgICAgICBjcCsrOwogICAgfQogICAgLyoKICAgICAqIC4uLiBhbmQgbG9jYXRlIGl0IGluIHRoZSB0cmVlLiAKICAgICAqLwogICAgdHAgPSBmaW5kX3RyZWVfbm9kZShuYW1lLCBtb2RpZCk7CiAgICBpZiAodHApIHsKICAgICAgICBzaXplX3QgICAgICAgICAgbWF4bGVuID0gKm9iamlkbGVuOwoKICAgICAgICAvKgogICAgICAgICAqIFNldCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgb2JqZWN0IElEIAogICAgICAgICAqLwogICAgICAgIGlmIChub2RlX3RvX29pZCh0cCwgb2JqaWQsIG9iamlkbGVuKSkgewogICAgICAgICAgICByYyA9IDE7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBJZiB0aGUgbmFtZSByZXF1ZXN0ZWQgd2FzIG1vcmUgdGhhbiBvbmUgZWxlbWVudCwKICAgICAgICAgICAgICogdGFnIG9uIHRoZSByZXN0IG9mIHRoZSBjb21wb25lbnRzIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKGNwICE9IE5VTEwpCiAgICAgICAgICAgICAgICByYyA9IF9hZGRfc3RyaW5nc190b19vaWQodHAsIGNwLCBvYmppZCwgb2JqaWRsZW4sIG1heGxlbik7CiAgICAgICAgfQogICAgfQoKICAgIFNOTVBfRlJFRShuYW1lKTsKICAgIHJldHVybiAocmMpOwp9CgoKLyoqCiAqIEBpbnRlcm5hbAogKgogKiBQb3B1bGF0ZXMgdGhlIG9iamVjdCBpZGVudGlmaWVyIGZyb20gYSBub2RlIGluIHRoZSBNSUIgaGllcmFyY2h5LgogKiBCdWlsZHMgdXAgdGhlIG9iamVjdCBJRCwgd29ya2luZyBiYWNrd2FyZHMsCiAqIHN0YXJ0aW5nIGZyb20gdGhlIGVuZCBvZiB0aGUgb2JqaWQgYnVmZmVyLgogKiBXaGVuIHRoZSB0b3Agb2YgdGhlIE1JQiB0cmVlIGlzIHJlYWNoZWQsIHRoZSBidWZmZXIgaXMgYWRqdXN0ZWQuCiAqCiAqIFRoZSBidWZmZXIgbGVuZ3RoIGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIHN1YmlkZW50aWZpZXJzCiAqIGZvciB0aGUgb2JqZWN0IGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBNSUIgbm9kZS4KICogCiAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzdWJpZGVudGlmaWVycyBjb3BpZWQuCiAqCiAqIElmIDAgaXMgcmV0dXJuZWQsIHRoZSBvYmppZCBidWZmZXIgaXMgdG9vIHNtYWxsLAogKiBhbmQgdGhlIGJ1ZmZlciBjb250ZW50cyBhcmUgaW5kZXRlcm1pbmF0ZS4KICogVGhlIGJ1ZmZlciBsZW5ndGggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgbGFyZ2VyIGJ1ZmZlci4KICovCnN0YXRpYyBpbnQKbm9kZV90b19vaWQoc3RydWN0IHRyZWUgKnRwLCBvaWQgKiBvYmppZCwgc2l6ZV90ICogb2JqaWRsZW4pCnsKICAgIGludCAgICAgICAgICAgICBudW1pZHMsIGxlbmlkczsKICAgIG9pZCAgICAgICAgICAgICpvcDsKCiAgICBpZiAoIXRwIHx8ICFvYmppZCB8fCAhb2JqaWRsZW4pCiAgICAgICAgcmV0dXJuIDA7CgogICAgbGVuaWRzID0gKGludCkgKm9iamlkbGVuOwogICAgb3AgPSBvYmppZCArIGxlbmlkczsgICAgICAgIC8qIHBvaW50cyBhZnRlciB0aGUgbGFzdCBlbGVtZW50ICovCgogICAgZm9yIChudW1pZHMgPSAwOyB0cDsgdHAgPSB0cC0+cGFyZW50LCBudW1pZHMrKykgewogICAgICAgIGlmIChudW1pZHMgPj0gbGVuaWRzKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAtLW9wOwogICAgICAgICpvcCA9IHRwLT5zdWJpZDsKICAgIH0KCiAgICAqb2JqaWRsZW4gPSAoc2l6ZV90KSBudW1pZHM7CiAgICBpZiAobnVtaWRzID4gbGVuaWRzKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKG51bWlkcyA8IGxlbmlkcykKICAgICAgICBtZW1tb3ZlKG9iamlkLCBvcCwgbnVtaWRzICogc2l6ZW9mKG9pZCkpOwoKICAgIHJldHVybiAobnVtaWRzKTsKfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgovKgogKiBSZXBsYWNlIFx4IHdpdGggeCBzdG9wIGF0IGVvc19tYXJrZXIKICogcmV0dXJuIE5VTEwgaWYgZW9zX21hcmtlciBub3QgZm91bmQKICovCnN0YXRpYyBjaGFyICpfYXBwbHlfZXNjYXBlcyhjaGFyICpzcmMsIGNoYXIgZW9zX21hcmtlcikKewogICAgY2hhciAqZHN0OwogICAgaW50IGJhY2tzbGFzaCA9IDA7CiAgICAKICAgIGRzdCA9IHNyYzsKICAgIHdoaWxlICgqc3JjKSB7CglpZiAoYmFja3NsYXNoKSB7CgkgICAgYmFja3NsYXNoID0gMDsKCSAgICAqZHN0KysgPSAqc3JjOwoJfSBlbHNlIHsKCSAgICBpZiAoZW9zX21hcmtlciA9PSAqc3JjKSBicmVhazsKCSAgICBpZiAoJ1xcJyA9PSAqc3JjKSB7CgkJYmFja3NsYXNoID0gMTsKCSAgICB9IGVsc2UgewoJCSpkc3QrKyA9ICpzcmM7CgkgICAgfQoJfQoJc3JjKys7CiAgICB9CiAgICBpZiAoISpzcmMpIHsKCS8qIG5ldmVyIGZvdW5kIGVvc19tYXJrZXIgKi8KCXJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKCSpkc3QgPSAwOwoJcmV0dXJuIHNyYzsKICAgIH0KfQoKc3RhdGljIGludAojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwpfYWRkX3N0cmluZ3NfdG9fb2lkKHN0cnVjdCB0cmVlICp0cCwgY2hhciAqY3AsCiAgICAgICAgICAgICAgICAgICAgb2lkICogb2JqaWQsIHNpemVfdCAqIG9iamlkbGVuLCBzaXplX3QgbWF4bGVuKQojZWxzZQpfYWRkX3N0cmluZ3NfdG9fb2lkKHZvaWQgKnRwLCBjaGFyICpjcCwKICAgICAgICAgICAgICAgICAgICBvaWQgKiBvYmppZCwgc2l6ZV90ICogb2JqaWRsZW4sIHNpemVfdCBtYXhsZW4pCiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KewogICAgb2lkICAgICAgICAgICAgIHN1YmlkOwogICAgaW50ICAgICAgICAgICAgIGxlbl9pbmRleCA9IDEwMDAwMDA7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBzdHJ1Y3QgdHJlZSAgICAqdHAyID0gTlVMTDsKICAgIHN0cnVjdCBpbmRleF9saXN0ICppbl9kaWNlcyA9IE5VTEw7CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIGNoYXIgICAgICAgICAgICpmY3AsICplY3AsICpjcDIgPSBOVUxMOwogICAgY2hhciAgICAgICAgICAgIGRvaW5ncXVvdGU7CiAgICBpbnQgICAgICAgICAgICAgbGVuID0gLTEsIHBvcyA9IC0xOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgaW50ICAgICAgICAgICAgIGNoZWNrID0KICAgICAgICAhbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfQ0hFQ0tfUkFOR0UpOwogICAgaW50ICAgICAgICAgICAgIGRvX2hpbnQgPSAhbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX05PX0RJU1BMQVlfSElOVCk7CgogICAgd2hpbGUgKGNwICYmIHRwICYmIHRwLT5jaGlsZF9saXN0KSB7CiAgICAgICAgZmNwID0gY3A7CiAgICAgICAgdHAyID0gdHAtPmNoaWxkX2xpc3Q7CiAgICAgICAgLyoKICAgICAgICAgKiBJc29sYXRlIHRoZSBuZXh0IGVudHJ5IAogICAgICAgICAqLwogICAgICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKICAgICAgICBpZiAoY3AyKQogICAgICAgICAgICAqY3AyKysgPSAnXDAnOwoKICAgICAgICAvKgogICAgICAgICAqIFNlYXJjaCBmb3IgdGhlIGFwcHJvcHJpYXRlIGNoaWxkIAogICAgICAgICAqLwogICAgICAgIGlmIChpc2RpZ2l0KCpjcCkpIHsKICAgICAgICAgICAgc3ViaWQgPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKICAgICAgICAgICAgaWYgKCplY3ApCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgd2hpbGUgKHRwMiAmJiB0cDItPnN1YmlkICE9IHN1YmlkKQogICAgICAgICAgICAgICAgdHAyID0gdHAyLT5uZXh0X3BlZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgd2hpbGUgKHRwMiAmJiBzdHJjbXAodHAyLT5sYWJlbCwgZmNwKSkKICAgICAgICAgICAgICAgIHRwMiA9IHRwMi0+bmV4dF9wZWVyOwogICAgICAgICAgICBpZiAoIXRwMikKICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICBzdWJpZCA9IHRwMi0+c3ViaWQ7CiAgICAgICAgfQogICAgICAgIGlmICgqb2JqaWRsZW4gPj0gbWF4bGVuKQogICAgICAgICAgICBnb3RvIGJhZF9pZDsKCXdoaWxlICh0cDIgJiYgdHAyLT5uZXh0X3BlZXIgJiYgdHAyLT5uZXh0X3BlZXItPnN1YmlkID09IHN1YmlkKQoJICAgIHRwMiA9IHRwMi0+bmV4dF9wZWVyOwogICAgICAgIG9iamlkWypvYmppZGxlbl0gPSBzdWJpZDsKICAgICAgICAoKm9iamlkbGVuKSsrOwoKICAgICAgICBjcCA9IGNwMjsKICAgICAgICBpZiAoIXRwMikKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgdHAgPSB0cDI7CiAgICB9CgogICAgaWYgKHRwICYmICF0cC0+Y2hpbGRfbGlzdCkgewogICAgICAgIGlmICgodHAyID0gdHAtPnBhcmVudCkpIHsKICAgICAgICAgICAgaWYgKHRwMi0+aW5kZXhlcykKICAgICAgICAgICAgICAgIGluX2RpY2VzID0gdHAyLT5pbmRleGVzOwogICAgICAgICAgICBlbHNlIGlmICh0cDItPmF1Z21lbnRzKSB7CiAgICAgICAgICAgICAgICB0cDIgPSBmaW5kX3RyZWVfbm9kZSh0cDItPmF1Z21lbnRzLCAtMSk7CiAgICAgICAgICAgICAgICBpZiAodHAyKQogICAgICAgICAgICAgICAgICAgIGluX2RpY2VzID0gdHAyLT5pbmRleGVzOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRwID0gTlVMTDsKICAgIH0KCiAgICB3aGlsZSAoY3AgJiYgaW5fZGljZXMpIHsKICAgICAgICBmY3AgPSBjcDsKCiAgICAgICAgdHAgPSBmaW5kX3RyZWVfbm9kZShpbl9kaWNlcy0+aWxhYmVsLCAtMSk7CiAgICAgICAgaWYgKCF0cCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgc3dpdGNoICh0cC0+dHlwZSkgewogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSOgogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICAgICAgY2FzZSBUWVBFX1VJTlRFR0VSOgogICAgICAgIGNhc2UgVFlQRV9VTlNJR05FRDMyOgogICAgICAgIGNhc2UgVFlQRV9USU1FVElDS1M6CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIElzb2xhdGUgdGhlIG5leHQgZW50cnkgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjcDIgPSBzdHJjaHIoY3AsICcuJyk7CiAgICAgICAgICAgIGlmIChjcDIpCiAgICAgICAgICAgICAgICAqY3AyKysgPSAnXDAnOwogICAgICAgICAgICBpZiAoaXNkaWdpdCgqY3ApKSB7CiAgICAgICAgICAgICAgICBzdWJpZCA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwogICAgICAgICAgICAgICAgaWYgKCplY3ApCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAodHAtPmVudW1zKSB7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGVudW1fbGlzdCAqZXAgPSB0cC0+ZW51bXM7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGVwICYmIHN0cmNtcChlcC0+bGFiZWwsIGNwKSkKICAgICAgICAgICAgICAgICAgICAgICAgZXAgPSBlcC0+bmV4dDsKICAgICAgICAgICAgICAgICAgICBpZiAoIWVwKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICAgICBzdWJpZCA9IGVwLT52YWx1ZTsKICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjaGVjayAmJiB0cC0+cmFuZ2VzKSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFuZ2VfbGlzdCAqcnAgPSB0cC0+cmFuZ2VzOwogICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG9rID0gMDsKICAgICAgICAgICAgICAgIGlmICh0cC0+dHlwZSA9PSBUWVBFX0lOVEVHRVIgfHwKICAgICAgICAgICAgICAgICAgICB0cC0+dHlwZSA9PSBUWVBFX0lOVEVHRVIzMikgewogICAgICAgICAgICAgICAgICB3aGlsZSAoIW9rICYmIHJwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKChycC0+bG93IDw9IChpbnQpIHN1YmlkKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAoKGludCkgc3ViaWQgPD0gcnAtPmhpZ2gpKQogICAgICAgICAgICAgICAgICAgICAgICBvayA9IDE7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBycCA9IHJwLT5uZXh0OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgeyAvKiBjaGVjayB1bnNpZ25lZCByYW5nZSAqLwogICAgICAgICAgICAgICAgICB3aGlsZSAoIW9rICYmIHJwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCgodW5zaWduZWQgaW50KXJwLT5sb3cgPD0gc3ViaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICYmIChzdWJpZCA8PSAodW5zaWduZWQgaW50KXJwLT5oaWdoKSkKICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSAxOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcnAgPSBycC0+bmV4dDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFvaykKICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikKICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gc3ViaWQ7CiAgICAgICAgICAgICgqb2JqaWRsZW4pKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9JUEFERFI6CiAgICAgICAgICAgIGlmICgqb2JqaWRsZW4gKyA0ID4gbWF4bGVuKQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIGZvciAoc3ViaWQgPSAwOyBjcCAmJiBzdWJpZCA8IDQ7IHN1YmlkKyspIHsKICAgICAgICAgICAgICAgIGZjcCA9IGNwOwogICAgICAgICAgICAgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwogICAgICAgICAgICAgICAgaWYgKGNwMikKICAgICAgICAgICAgICAgICAgICAqY3AyKysgPSAwOwogICAgICAgICAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwogICAgICAgICAgICAgICAgaWYgKCplY3ApCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICBpZiAoY2hlY2sgJiYgb2JqaWRbKm9iamlkbGVuXSA+IDI1NSkKICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICgqb2JqaWRsZW4pKys7CiAgICAgICAgICAgICAgICBjcCA9IGNwMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfT0NURVRTVFI6CiAgICAgICAgICAgIGlmICh0cC0+cmFuZ2VzICYmICF0cC0+cmFuZ2VzLT5uZXh0CiAgICAgICAgICAgICAgICAmJiB0cC0+cmFuZ2VzLT5sb3cgPT0gdHAtPnJhbmdlcy0+aGlnaCkKICAgICAgICAgICAgICAgIGxlbiA9IHRwLT5yYW5nZXMtPmxvdzsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgbGVuID0gLTE7CiAgICAgICAgICAgIHBvcyA9IDA7CiAgICAgICAgICAgIGlmICgqY3AgPT0gJyInIHx8ICpjcCA9PSAnXCcnKSB7CiAgICAgICAgICAgICAgICBkb2luZ3F1b3RlID0gKmNwKys7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogaW5zZXJ0IGxlbmd0aCBpZiByZXF1ZXN0ZWQgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmICghaW5fZGljZXMtPmlzaW1wbGllZCAmJiBsZW4gPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZG9pbmdxdW90ZSA9PSAnXCcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNubXBfc2V0X2RldGFpbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCInLXF1b3RlIGlzIGZvciBmaXhlZCBsZW5ndGggc3RyaW5ncyIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgICAgIGxlbl9pbmRleCA9ICpvYmppZGxlbjsKICAgICAgICAgICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkb2luZ3F1b3RlID09ICciJykgewogICAgICAgICAgICAgICAgICAgIHNubXBfc2V0X2RldGFpbAogICAgICAgICAgICAgICAgICAgICAgICAoIlwiLXF1b3RlIGlzIGZvciB2YXJpYWJsZSBsZW5ndGggc3RyaW5ncyIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQoKCQljcDIgPSBfYXBwbHlfZXNjYXBlcyhjcCwgZG9pbmdxdW90ZSk7CgkJaWYgKCFjcDIpIGdvdG8gYmFkX2lkOwoJCWVsc2UgewoJCSAgICB1bnNpZ25lZCBjaGFyICpuZXdfdmFsOwoJCSAgICBpbnQgbmV3X3ZhbF9sZW47CgkJICAgIGludCBwYXJzZWRfaGludCA9IDA7CgkJICAgIGNvbnN0IGNoYXIgKnBhcnNlZF92YWx1ZTsKCgkJICAgIGlmIChkb19oaW50ICYmIHRwLT5oaW50KSB7CgkJCXBhcnNlZF92YWx1ZSA9IHBhcnNlX29jdGV0X2hpbnQodHAtPmhpbnQsIGNwLAoJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfdmFsLCAmbmV3X3ZhbF9sZW4pOwoJCQlwYXJzZWRfaGludCA9IHBhcnNlZF92YWx1ZSA9PSBOVUxMOwoJCSAgICB9CgkJICAgIGlmIChwYXJzZWRfaGludCkgewoJCQlpbnQgaTsKCQkJZm9yIChpID0gMDsgaSA8IG5ld192YWxfbGVuOyBpKyspIHsKCQkJICAgIGlmICgqb2JqaWRsZW4gPj0gbWF4bGVuKSBnb3RvIGJhZF9pZDsKCQkJICAgIG9iamlkWyAqb2JqaWRsZW4gXSA9IG5ld192YWxbaV07CgkJCSAgICAoKm9iamlkbGVuKSsrOwoJCQkgICAgcG9zKys7CgkJCX0KCQkJU05NUF9GUkVFKG5ld192YWwpOwoJCSAgICB9IGVsc2UgewoJCQl3aGlsZSgqY3ApIHsKCQkJICAgIGlmICgqb2JqaWRsZW4gPj0gbWF4bGVuKSBnb3RvIGJhZF9pZDsKCQkJICAgIG9iamlkWyAqb2JqaWRsZW4gXSA9ICpjcCsrOwoJCQkgICAgKCpvYmppZGxlbikrKzsKCQkJICAgIHBvcysrOwoJCQl9CgkJICAgIH0KCQl9CgkJCgkJY3AyKys7CiAgICAgICAgICAgICAgICBpZiAoISpjcDIpCiAgICAgICAgICAgICAgICAgICAgY3AyID0gTlVMTDsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKCpjcDIgIT0gJy4nKQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGNwMisrOwoJCWlmIChjaGVjaykgewogICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJhbmdlX2xpc3QgKnJwID0gdHAtPnJhbmdlczsKICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG9rID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJwICYmICFvaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChycC0+bG93IDw9IHBvcyAmJiBwb3MgPD0gcnAtPmhpZ2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwID0gcnAtPm5leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbl9kaWNlcy0+aXNpbXBsaWVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWRbbGVuX2luZGV4XSA9IHBvczsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvcyAhPSBsZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwoJCX0KCQllbHNlIGlmIChsZW4gPT0gLTEgJiYgIWluX2RpY2VzLT5pc2ltcGxpZWQpCgkJICAgIG9iamlkW2xlbl9pbmRleF0gPSBwb3M7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIWluX2RpY2VzLT5pc2ltcGxpZWQgJiYgbGVuID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgZmNwID0gY3A7CiAgICAgICAgICAgICAgICAgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwogICAgICAgICAgICAgICAgICAgIGlmIChjcDIpCiAgICAgICAgICAgICAgICAgICAgICAgICpjcDIrKyA9IDA7CiAgICAgICAgICAgICAgICAgICAgbGVuID0gc3RydG91bChjcCwgJmVjcCwgMCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCplY3ApCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgICAgIGlmICgqb2JqaWRsZW4gKyBsZW4gKyAxID49IG1heGxlbikKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9IGxlbjsKICAgICAgICAgICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICAgICAgICAgIGNwID0gY3AyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKGxlbiAmJiBjcCkgewogICAgICAgICAgICAgICAgICAgIGZjcCA9IGNwOwogICAgICAgICAgICAgICAgICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY3AyKQogICAgICAgICAgICAgICAgICAgICAgICAqY3AyKysgPSAwOwogICAgICAgICAgICAgICAgICAgIG9iamlkWypvYmppZGxlbl0gPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKmVjcCkKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrICYmIG9iamlkWypvYmppZGxlbl0gPiAyNTUpCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgICAgICgqb2JqaWRsZW4pKys7CiAgICAgICAgICAgICAgICAgICAgbGVuLS07CiAgICAgICAgICAgICAgICAgICAgY3AgPSBjcDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX09CSklEOgogICAgICAgICAgICBpbl9kaWNlcyA9IE5VTEw7CiAgICAgICAgICAgIGNwMiA9IGNwOwogICAgICAgICAgICBicmVhazsKCWNhc2UgVFlQRV9ORVRBRERSOgoJICAgIGZjcCA9IGNwOwoJICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKCSAgICBpZiAoY3AyKQoJCSpjcDIrKyA9IDA7CgkgICAgc3ViaWQgPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKCSAgICBpZiAoKmVjcCkKCQlnb3RvIGJhZF9pZDsKCSAgICBpZiAoKm9iamlkbGVuICsgMSA+PSBtYXhsZW4pCgkJZ290byBiYWRfaWQ7CgkgICAgb2JqaWRbKm9iamlkbGVuXSA9IHN1YmlkOwoJICAgICgqb2JqaWRsZW4pKys7CgkgICAgY3AgPSBjcDI7CgkgICAgaWYgKHN1YmlkID09IDEpIHsKCQlmb3IgKGxlbiA9IDA7IGNwICYmIGxlbiA8IDQ7IGxlbisrKSB7CgkJICAgIGZjcCA9IGNwOwoJCSAgICBjcDIgPSBzdHJjaHIoY3AsICcuJyk7CgkJICAgIGlmIChjcDIpCgkJCSpjcDIrKyA9IDA7CgkJICAgIHN1YmlkID0gc3RydG91bChjcCwgJmVjcCwgMCk7CgkJICAgIGlmICgqZWNwKQoJCQlnb3RvIGJhZF9pZDsKCQkgICAgaWYgKCpvYmppZGxlbiArIDEgPj0gbWF4bGVuKQoJCQlnb3RvIGJhZF9pZDsKCQkgICAgaWYgKGNoZWNrICYmIHN1YmlkID4gMjU1KQoJCQlnb3RvIGJhZF9pZDsKCQkgICAgb2JqaWRbKm9iamlkbGVuXSA9IHN1YmlkOwoJCSAgICAoKm9iamlkbGVuKSsrOwoJCSAgICBjcCA9IGNwMjsKCQl9CgkgICAgfQoJICAgIGVsc2UgewoJCWluX2RpY2VzID0gTlVMTDsKCSAgICB9CgkgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIlVuZXhwZWN0ZWQgaW5kZXggdHlwZTogJWQgJXMgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgIHRwLT50eXBlLCBpbl9kaWNlcy0+aWxhYmVsLCBjcCk7CiAgICAgICAgICAgIGluX2RpY2VzID0gTlVMTDsKICAgICAgICAgICAgY3AyID0gY3A7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjcCA9IGNwMjsKICAgICAgICBpZiAoaW5fZGljZXMpCiAgICAgICAgICAgIGluX2RpY2VzID0gaW5fZGljZXMtPm5leHQ7CiAgICB9CgojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICB3aGlsZSAoY3ApIHsKICAgICAgICBmY3AgPSBjcDsKICAgICAgICBzd2l0Y2ggKCpjcCkgewogICAgICAgIGNhc2UgJzAnOgogICAgICAgIGNhc2UgJzEnOgogICAgICAgIGNhc2UgJzInOgogICAgICAgIGNhc2UgJzMnOgogICAgICAgIGNhc2UgJzQnOgogICAgICAgIGNhc2UgJzUnOgogICAgICAgIGNhc2UgJzYnOgogICAgICAgIGNhc2UgJzcnOgogICAgICAgIGNhc2UgJzgnOgogICAgICAgIGNhc2UgJzknOgogICAgICAgICAgICBjcDIgPSBzdHJjaHIoY3AsICcuJyk7CiAgICAgICAgICAgIGlmIChjcDIpCiAgICAgICAgICAgICAgICAqY3AyKysgPSAwOwogICAgICAgICAgICBzdWJpZCA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwogICAgICAgICAgICBpZiAoKmVjcCkKICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikKICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gc3ViaWQ7CiAgICAgICAgICAgICgqb2JqaWRsZW4pKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJyInOgogICAgICAgIGNhc2UgJ1wnJzoKICAgICAgICAgICAgZG9pbmdxdW90ZSA9ICpjcCsrOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBpbnNlcnQgbGVuZ3RoIGlmIHJlcXVlc3RlZCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChkb2luZ3F1b3RlID09ICciJykgewogICAgICAgICAgICAgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gbGVuID0gc3RyY2hyKGNwLCBkb2luZ3F1b3RlKSAtIGNwOwogICAgICAgICAgICAgICAgKCpvYmppZGxlbikrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFjcCkKICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICB3aGlsZSAoKmNwICYmICpjcCAhPSBkb2luZ3F1b3RlKSB7CiAgICAgICAgICAgICAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikKICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgIG9iamlkWypvYmppZGxlbl0gPSAqY3ArKzsKICAgICAgICAgICAgICAgICgqb2JqaWRsZW4pKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3AyID0gY3AgKyAxOwogICAgICAgICAgICBpZiAoISpjcDIpCiAgICAgICAgICAgICAgICBjcDIgPSBOVUxMOwogICAgICAgICAgICBlbHNlIGlmICgqY3AyID09ICcuJykKICAgICAgICAgICAgICAgIGNwMisrOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgfQogICAgICAgIGNwID0gY3AyOwogICAgfQogICAgcmV0dXJuIDE7CgogIGJhZF9pZDoKICAgIHsKICAgICAgICBjaGFyICAgICAgICAgICAgYnVmWzI1Nl07CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICAgICAgaWYgKGluX2RpY2VzKQogICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiSW5kZXggb3V0IG9mIHJhbmdlOiAlcyAoJXMpIiwKICAgICAgICAgICAgICAgICAgICBmY3AsIGluX2RpY2VzLT5pbGFiZWwpOwogICAgICAgIGVsc2UgaWYgKHRwKQogICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiU3ViLWlkIG5vdCBmb3VuZDogJXMgLT4gJXMiLCB0cC0+bGFiZWwsIGZjcCk7CiAgICAgICAgZWxzZQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyIsIGZjcCk7CiAgICAgICAgYnVmWyBzaXplb2YoYnVmKS0xIF0gPSAwOwoKICAgICAgICBzbm1wX3NldF9kZXRhaWwoYnVmKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKLyoqCiAqIEBzZWUgY29tbWVudHMgb24gZmluZF9iZXN0X3RyZWVfbm9kZSBmb3IgdXNhZ2UgYWZ0ZXIgZmlyc3QgdGltZS4KICovCmludApnZXRfd2lsZF9ub2RlKGNvbnN0IGNoYXIgKm5hbWUsIG9pZCAqIG9iamlkLCBzaXplX3QgKiBvYmppZGxlbikKewogICAgc3RydWN0IHRyZWUgICAgKnRwID0gZmluZF9iZXN0X3RyZWVfbm9kZShuYW1lLCB0cmVlX2hlYWQsIE5VTEwpOwogICAgaWYgKCF0cCkKICAgICAgICByZXR1cm4gMDsKICAgIHJldHVybiBnZXRfbm9kZSh0cC0+bGFiZWwsIG9iamlkLCBvYmppZGxlbik7Cn0KCmludApnZXRfbm9kZShjb25zdCBjaGFyICpuYW1lLCBvaWQgKiBvYmppZCwgc2l6ZV90ICogb2JqaWRsZW4pCnsKICAgIGNvbnN0IGNoYXIgICAgICpjcDsKICAgIGNoYXIgICAgICAgICAgICBjaDsKICAgIGludCAgICAgICAgICAgICByZXM7CgogICAgY3AgPSBuYW1lOwogICAgd2hpbGUgKChjaCA9ICpjcCkpCiAgICAgICAgaWYgKCgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKQogICAgICAgICAgICB8fCAoJ2EnIDw9IGNoICYmIGNoIDw9ICd6JykKICAgICAgICAgICAgfHwgKCdBJyA8PSBjaCAmJiBjaCA8PSAnWicpCiAgICAgICAgICAgIHx8IGNoID09ICctJykKICAgICAgICAgICAgY3ArKzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGJyZWFrOwogICAgaWYgKGNoICE9ICc6JykKICAgICAgICBpZiAoKm5hbWUgPT0gJy4nKQogICAgICAgICAgICByZXMgPSBnZXRfbW9kdWxlX25vZGUobmFtZSArIDEsICJBTlkiLCBvYmppZCwgb2JqaWRsZW4pOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmVzID0gZ2V0X21vZHVsZV9ub2RlKG5hbWUsICJBTlkiLCBvYmppZCwgb2JqaWRsZW4pOwogICAgZWxzZSB7CiAgICAgICAgY2hhciAgICAgICAgICAgKm1vZHVsZTsKICAgICAgICAvKgogICAgICAgICAqICByZXF1ZXN0ZWQgbmFtZSBpcyBvZiB0aGUgZm9ybQogICAgICAgICAqICAgICAgIm1vZHVsZTpzdWJpZGVudGlmaWVyIgogICAgICAgICAqLwogICAgICAgIG1vZHVsZSA9IChjaGFyICopIG1hbGxvYygoc2l6ZV90KSAoY3AgLSBuYW1lICsgMSkpOwogICAgICAgIGlmICghbW9kdWxlKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgc3ByaW50Zihtb2R1bGUsICIlLipzIiwgKGludCkgKGNwIC0gbmFtZSksIG5hbWUpOwogICAgICAgIGNwKys7ICAgICAgICAgICAgICAgICAgIC8qIGNwIG5vdyBwb2ludCB0byB0aGUgc3ViaWRlbnRpZmllciAqLwogICAgICAgIGlmICgqY3AgPT0gJzonKQogICAgICAgICAgICBjcCsrOwoKICAgICAgICAvKgogICAgICAgICAqICdjcCcgYW5kICduYW1lJyAqZG8qIGdvIHRoYXQgd2F5IHJvdW5kISAKICAgICAgICAgKi8KICAgICAgICByZXMgPSBnZXRfbW9kdWxlX25vZGUoY3AsIG1vZHVsZSwgb2JqaWQsIG9iamlkbGVuKTsKICAgICAgICBTTk1QX0ZSRUUobW9kdWxlKTsKICAgIH0KICAgIGlmIChyZXMgPT0gMCkgewogICAgICAgIFNFVF9TTk1QX0VSUk9SKFNOTVBFUlJfVU5LTk9XTl9PQkpJRCk7CiAgICB9CgogICAgcmV0dXJuIHJlczsKfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgojaWZkZWYgdGVzdGluZwoKbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CiAgICBvaWQgICAgICAgICAgICAgb2JqaWRbTUFYX09JRF9MRU5dOwogICAgaW50ICAgICAgICAgICAgIG9iamlkbGVuID0gTUFYX09JRF9MRU47CiAgICBpbnQgICAgICAgICAgICAgY291bnQ7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgdmFyaWFibGU7CgogICAgbmV0c25tcF9pbml0X21pYigpOwogICAgaWYgKGFyZ2MgPCAyKQogICAgICAgIHByaW50X3N1YnRyZWUoc3Rkb3V0LCB0cmVlX2hlYWQsIDApOwogICAgdmFyaWFibGUudHlwZSA9IEFTTl9JTlRFR0VSOwogICAgdmFyaWFibGUudmFsLmludGVnZXIgPSAzOwogICAgdmFyaWFibGUudmFsX2xlbiA9IDQ7CiAgICBmb3IgKGFyZ2MtLTsgYXJnYzsgYXJnYy0tLCBhcmd2KyspIHsKICAgICAgICBvYmppZGxlbiA9IE1BWF9PSURfTEVOOwogICAgICAgIHByaW50ZigicmVhZF9vYmppZCglcykgPSAlZFxuIiwKICAgICAgICAgICAgICAgYXJndlsxXSwgcmVhZF9vYmppZChhcmd2WzFdLCBvYmppZCwgJm9iamlkbGVuKSk7CiAgICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgb2JqaWRsZW47IGNvdW50KyspCiAgICAgICAgICAgIHByaW50ZigiJWQuIiwgb2JqaWRbY291bnRdKTsKICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgcHJpbnRfdmFyaWFibGUob2JqaWQsIG9iamlkbGVuLCAmdmFyaWFibGUpOwogICAgfQp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlc3RpbmcgKi8KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCi8qCiAqIGluaXRpYWxpemU6IG5vIHBlZXJzIGluY2x1ZGVkIGluIHRoZSByZXBvcnQuIAogKi8Kdm9pZApjbGVhcl90cmVlX2ZsYWdzKHJlZ2lzdGVyIHN0cnVjdCB0cmVlICp0cCkKewogICAgZm9yICg7IHRwOyB0cCA9IHRwLT5uZXh0X3BlZXIpIHsKICAgICAgICB0cC0+cmVwb3J0ZWQgPSAwOwogICAgICAgIGlmICh0cC0+Y2hpbGRfbGlzdCkKICAgICAgICAgICAgY2xlYXJfdHJlZV9mbGFncyh0cC0+Y2hpbGRfbGlzdCk7CiAgICAgLypSRUNVUlNFKi99Cn0KCi8qCiAqIFVwZGF0ZTogMTk5OC0wNy0xNyA8amh5QGdzdS5lZHU+CiAqIEFkZGVkIHByaW50X29pZF9yZXBvcnQqIGZ1bmN0aW9ucy4KICovCnN0YXRpYyBpbnQgICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfbGFiZWxlZG9pZCA9IDA7CnN0YXRpYyBpbnQgICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfb2lkID0gMDsKc3RhdGljIGludCAgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9zeW1ib2xpYyA9IDA7CnN0YXRpYyBpbnQgICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfbWliY2hpbGRvaWQgPSAwOwpzdGF0aWMgaW50ICAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X3N1ZmZpeCA9IDA7CgovKgogKiBUaGVzZSBtZXRob2RzIHJlY3Vyc2UuIAogKi8Kc3RhdGljIHZvaWQgICAgIHByaW50X3BhcmVudF9sYWJlbGVkb2lkKEZJTEUgKiwgc3RydWN0IHRyZWUgKik7CnN0YXRpYyB2b2lkICAgICBwcmludF9wYXJlbnRfb2lkKEZJTEUgKiwgc3RydWN0IHRyZWUgKik7CnN0YXRpYyB2b2lkICAgICBwcmludF9wYXJlbnRfbWliY2hpbGRvaWQoRklMRSAqLCBzdHJ1Y3QgdHJlZSAqKTsKc3RhdGljIHZvaWQgICAgIHByaW50X3BhcmVudF9sYWJlbChGSUxFICosIHN0cnVjdCB0cmVlICopOwpzdGF0aWMgdm9pZCAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0KEZJTEUgKiwgc3RydWN0IHRyZWUgKiwgaW50KTsKCgp2b2lkCnByaW50X29pZF9yZXBvcnQoRklMRSAqIGZwKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CiAgICBjbGVhcl90cmVlX2ZsYWdzKHRyZWVfaGVhZCk7CiAgICBmb3IgKHRwID0gdHJlZV9oZWFkOyB0cDsgdHAgPSB0cC0+bmV4dF9wZWVyKQogICAgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydChmcCwgdHAsIDApOwp9Cgp2b2lkCnByaW50X29pZF9yZXBvcnRfZW5hYmxlX2xhYmVsZWRvaWQodm9pZCkKewogICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X2xhYmVsZWRvaWQgPSAxOwp9Cgp2b2lkCnByaW50X29pZF9yZXBvcnRfZW5hYmxlX29pZCh2b2lkKQp7CiAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfb2lkID0gMTsKfQoKdm9pZApwcmludF9vaWRfcmVwb3J0X2VuYWJsZV9zdWZmaXgodm9pZCkKewogICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X3N1ZmZpeCA9IDE7Cn0KCnZvaWQKcHJpbnRfb2lkX3JlcG9ydF9lbmFibGVfc3ltYm9saWModm9pZCkKewogICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X3N5bWJvbGljID0gMTsKfQoKdm9pZApwcmludF9vaWRfcmVwb3J0X2VuYWJsZV9taWJjaGlsZG9pZCh2b2lkKQp7CiAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfbWliY2hpbGRvaWQgPSAxOwp9CgovKgogKiBoZWxwZXIgbWV0aG9kcyBmb3IgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0KCkKICogZWFjaCBvbmUgdHJhdmVyc2VzIGJhY2sgdXAgdGhlIG5vZGUgdHJlZQogKiB1bnRpbCB0aGVyZSBpcyBubyBwYXJlbnQuICBUaGVuLCB0aGUgbGFiZWwgY29tYmluYXRpb24KICogaXMgb3V0cHV0LCBzdWNoIHRoYXQgdGhlIHBhcmVudCBpcyBkaXNwbGF5ZWQgZmlyc3QuCiAqCiAqIFdhcm5pbmc6IHRoZXNlIG1ldGhvZHMgYXJlIGFsbCByZWN1cnNpdmUuCiAqLwoKc3RhdGljIHZvaWQKcHJpbnRfcGFyZW50X2xhYmVsZWRvaWQoRklMRSAqIGYsIHN0cnVjdCB0cmVlICp0cCkKewogICAgaWYgKHRwKSB7CiAgICAgICAgaWYgKHRwLT5wYXJlbnQpIHsKICAgICAgICAgICAgcHJpbnRfcGFyZW50X2xhYmVsZWRvaWQoZiwgdHAtPnBhcmVudCk7CiAgICAgICAgIC8qUkVDVVJTRSovfQogICAgICAgIGZwcmludGYoZiwgIi4lcyglbHUpIiwgdHAtPmxhYmVsLCB0cC0+c3ViaWQpOwogICAgfQp9CgpzdGF0aWMgdm9pZApwcmludF9wYXJlbnRfb2lkKEZJTEUgKiBmLCBzdHJ1Y3QgdHJlZSAqdHApCnsKICAgIGlmICh0cCkgewogICAgICAgIGlmICh0cC0+cGFyZW50KSB7CiAgICAgICAgICAgIHByaW50X3BhcmVudF9vaWQoZiwgdHAtPnBhcmVudCk7CiAgICAgICAgIC8qUkVDVVJTRSovfQogICAgICAgIGZwcmludGYoZiwgIi4lbHUiLCB0cC0+c3ViaWQpOwogICAgfQp9CgoKc3RhdGljIHZvaWQgcHJpbnRfcGFyZW50X21pYmNoaWxkb2lkKEZJTEUgKiBmLCBzdHJ1Y3QgdHJlZSAqdHApCnsKICAgIHN0YXRpYyBzdHJ1Y3QgdHJlZSAqdGVtcDsKICAgIHVuc2lnbmVkIGxvbmcgZWxlbXNbMTAwXTsKICAgIGludCBlbGVtX2NudCA9IDA7CiAgICBpbnQgaSA9IDA7CiAgICB0ZW1wID0gdHA7CiAgICBpZiAodGVtcCkgewogICAgICAgIHdoaWxlICh0ZW1wLT5wYXJlbnQpIHsKICAgICAgICAgICAgICAgIGVsZW1zW2VsZW1fY250KytdID0gdGVtcC0+c3ViaWQ7CiAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcC0+cGFyZW50OwogICAgICAgIH0KICAgICAgICBlbGVtc1tlbGVtX2NudCsrXSA9IHRlbXAtPnN1YmlkOwogICAgfQogICAgZm9yIChpID0gZWxlbV9jbnQgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgIGlmIChpID09IGVsZW1fY250IC0gMSkgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlbHUiLCBlbGVtc1tpXSk7ICAgICAgICAgICAKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiLiVsdSIsIGVsZW1zW2ldKTsgICAgICAgICAgCiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZApwcmludF9wYXJlbnRfbGFiZWwoRklMRSAqIGYsIHN0cnVjdCB0cmVlICp0cCkKewogICAgaWYgKHRwKSB7CiAgICAgICAgaWYgKHRwLT5wYXJlbnQpIHsKICAgICAgICAgICAgcHJpbnRfcGFyZW50X2xhYmVsKGYsIHRwLT5wYXJlbnQpOwogICAgICAgICAvKlJFQ1VSU0UqL30KICAgICAgICBmcHJpbnRmKGYsICIuJXMiLCB0cC0+bGFiZWwpOwogICAgfQp9CgovKioKICogQGludGVybmFsCiAqIFRoaXMgbWV0aG9kcyBnZW5lcmF0ZXMgdmFyaWF0aW9ucyBvbiB0aGUgb3JpZ2luYWwgcHJpbnRfc3VidHJlZSgpIHJlcG9ydC4KICogVHJhdmVyc2UgdGhlIHRyZWUgZGVwdGggZmlyc3QsIGZyb20gbGVhc3QgdG8gZ3JlYXRlc3Qgc3ViLWlkZW50aWZpZXIuCiAqIFdhcm5pbmc6IHRoaXMgbWV0aG9kcyByZWN1cnNlcyBhbmQgY2FsbHMgbWV0aG9kcyB0aGF0IHJlY3Vyc2UuCiAqCiAqIEBwYXJhbSBmICAgICAgIEZpbGUgZGVzY3JpcHRvciB0byBwcmludCB0by4KICogQHBhcmFtIHRyZWUgICAgPz8/CiAqIEBwYXJhbSBjb3VudCAgID8/PwogKi8KCnN0YXRpYyB2b2lkCnByaW50X3N1YnRyZWVfb2lkX3JlcG9ydChGSUxFICogZiwgc3RydWN0IHRyZWUgKnRyZWUsIGludCBjb3VudCkKewogICAgc3RydWN0IHRyZWUgICAgKnRwOwoKICAgIGNvdW50Kys7CgogICAgLyoKICAgICAqIHNhbml0eSBjaGVjayAKICAgICAqLwogICAgaWYgKCF0cmVlKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qCiAgICAgKiBmaW5kIHRoZSBub3QgcmVwb3J0ZWQgcGVlciB3aXRoIHRoZSBsb3dlc3Qgc3ViLWlkZW50aWZpZXIuCiAgICAgKiBpZiBubyBtb3JlLCBicmVhayB0aGUgbG9vcCBhbmQgY2xlYW51cC4KICAgICAqIHNldCAicmVwb3J0ZWQiIGZsYWcsIGFuZCBjcmVhdGUgcmVwb3J0IGZvciB0aGlzIHBlZXIuCiAgICAgKiByZWN1cnNlIHVzaW5nIHRoZSBjaGlsZHJlbiBvZiB0aGlzIHBlZXIsIGlmIGFueS4KICAgICAqLwogICAgd2hpbGUgKDEpIHsKICAgICAgICByZWdpc3RlciBzdHJ1Y3QgdHJlZSAqbnRwOwoKICAgICAgICB0cCA9IE5VTEw7CiAgICAgICAgZm9yIChudHAgPSB0cmVlLT5jaGlsZF9saXN0OyBudHA7IG50cCA9IG50cC0+bmV4dF9wZWVyKSB7CiAgICAgICAgICAgIGlmIChudHAtPnJlcG9ydGVkKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBpZiAoIXRwIHx8ICh0cC0+c3ViaWQgPiBudHAtPnN1YmlkKSkKICAgICAgICAgICAgICAgIHRwID0gbnRwOwogICAgICAgIH0KICAgICAgICBpZiAoIXRwKQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgdHAtPnJlcG9ydGVkID0gMTsKCiAgICAgICAgaWYgKHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9sYWJlbGVkb2lkKSB7CiAgICAgICAgICAgIHByaW50X3BhcmVudF9sYWJlbGVkb2lkKGYsIHRwKTsKICAgICAgICAgICAgZnByaW50ZihmLCAiXG4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9vaWQpIHsKICAgICAgICAgICAgcHJpbnRfcGFyZW50X29pZChmLCB0cCk7CiAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICAgICAgfQogICAgICAgIGlmIChwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfc3ltYm9saWMpIHsKICAgICAgICAgICAgcHJpbnRfcGFyZW50X2xhYmVsKGYsIHRwKTsKICAgICAgICAgICAgZnByaW50ZihmLCAiXG4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9taWJjaGlsZG9pZCkgewoJICAgIGZwcmludGYoZiwgIlwiJXNcIlx0IiwgdHAtPmxhYmVsKTsKICAgICAgICAgICAgZnByaW50ZihmLCAiXHRcdFwiIik7CiAgICAgICAgICAgIHByaW50X3BhcmVudF9taWJjaGlsZG9pZChmLCB0cCk7CiAgICAgICAgICAgIGZwcmludGYoZiwgIlwiXG4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9zdWZmaXgpIHsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGk7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQogICAgICAgICAgICAgICAgZnByaW50ZihmLCAiICAiKTsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMoJWxkKSB0eXBlPSVkIiwgdHAtPmxhYmVsLCB0cC0+c3ViaWQsIHRwLT50eXBlKTsKICAgICAgICAgICAgaWYgKHRwLT50Y19pbmRleCAhPSAtMSkKICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiB0Yz0lZCIsIHRwLT50Y19pbmRleCk7CiAgICAgICAgICAgIGlmICh0cC0+aGludCkKICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiBoaW50PSVzIiwgdHAtPmhpbnQpOwogICAgICAgICAgICBpZiAodHAtPnVuaXRzKQogICAgICAgICAgICAgICAgZnByaW50ZihmLCAiIHVuaXRzPSVzIiwgdHAtPnVuaXRzKTsKCiAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICAgICAgfQogICAgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydChmLCB0cCwgY291bnQpOwogICAgIC8qUkVDVVJTRSovfQp9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCgovKioKICogQ29udmVydHMgdGltZXRpY2tzIHRvIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzIHN0cmluZy4KICogQ01VIGNvbXBhdGlibGUgZG9lcyBub3Qgc2hvdyBjZW50aXNlY29uZHMuCiAqCiAqIEBwYXJhbSB0aW1ldGlja3MgICAgVGhlIHRpbWV0aWNrcyB0byBjb252ZXJ0LgogKiBAcGFyYW0gYnVmICAgICAgICAgIEJ1ZmZlciB0byB3cml0ZSB0bywgaGFzIHRvIGJlIGF0IAogKiAgICAgICAgICAgICAgICAgICAgIGxlYXN0IDQwIEJ5dGVzIGxhcmdlLgogKiAgICAgICAKICogQHJldHVybiBUaGUgYnVmZmVyCiAqCiAqIEBzZWUgdXB0aW1lU3RyaW5nCiAqLwpjaGFyICAgICAgICAgICAqCnVwdGltZV9zdHJpbmcodV9sb25nIHRpbWV0aWNrcywgY2hhciAqYnVmKQp7CiAgICByZXR1cm4gdXB0aW1lX3N0cmluZ19uKCB0aW1ldGlja3MsIGJ1ZiwgNDApOwp9CgpjaGFyICAgICAgICAgICAqCnVwdGltZV9zdHJpbmdfbih1X2xvbmcgdGltZXRpY2tzLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCnsKICAgIHVwdGltZVN0cmluZyh0aW1ldGlja3MsIGJ1ZiwgYnVmbGVuKTsKI2lmZGVmIENNVV9DT01QQVRJQkxFCiAgICB7CiAgICBjaGFyICpjcCA9IHN0cnJjaHIoYnVmLCAnLicpOwogICAgaWYgKGNwKQogICAgICAgICpjcCA9ICdcMCc7CiAgICB9CiNlbmRpZgogICAgcmV0dXJuIGJ1ZjsKfQoKLyoqCiAqIEdpdmVuIGEgc3RyaW5nLCBwYXJzZXMgYW4gb2lkIG91dCBvZiBpdCAoaWYgcG9zc2libGUpLgogKiBJdCB3aWxsIHRyeSB0byBwYXJzZSBpdCBiYXNlZCBvbiBwcmVkZXRlcm1pbmVkIGNvbmZpZ3VyYXRpb24gaWYKICogcHJlc2VudCBvciBieSBldmVyeSBtZXRob2QgcG9zc2libGUgb3RoZXJ3aXNlLgogKiBJZiBhIHN1ZmZpeCBoYXMgYmVlbiByZWdpc3RlcmVkIHVzaW5nIE5FVFNOTVBfRFNfTElCX09JRFNVRkZJWCwgaXQKICogd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgaW5wdXQgc3RyaW5nIGJlZm9yZSBwcm9jZXNzaW5nLgogKgogKiBAcGFyYW0gYXJndiAgICBUaGUgT0lEIHRvIHN0cmluZyBwYXJzZQogKiBAcGFyYW0gcm9vdCAgICBBbiBPSUQgYXJyYXkgd2hlcmUgdGhlIHJlc3VsdHMgYXJlIHN0b3JlZC4KICogQHBhcmFtIHJvb3RsZW4gVGhlIG1heCBsZW5ndGggb2YgdGhlIGFycmF5IGdvaW5nIGluIGFuZCB0aGUgZGF0YQogKiAgICAgICAgICAgICAgICBsZW5ndGggY29taW5nIG91dC4KICoKICogQHJldHVybiAgICAgICAgVGhlIHJvb3Qgb2lkIHBvaW50ZXIgaWYgc3VjY2Vzc2Z1bCwgb3IgTlVMTCBvdGhlcndpc2UuCiAqLwogCm9pZCAgICAgICAgICAgICoKc25tcF9wYXJzZV9vaWQoY29uc3QgY2hhciAqYXJndiwgb2lkICogcm9vdCwgc2l6ZV90ICogcm9vdGxlbikKewogICAgc2l6ZV90ICAgICAgICAgIHNhdmxlbiA9ICpyb290bGVuOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGJ1Zl9sZW4gPSAwOwogICAgc3RhdGljIGNoYXIgICAgKnRtcGJ1ZjsKICAgIGNvbnN0IGNoYXIgICAgICpzdWZmaXgsICpwcmVmaXg7CgogICAgc3VmZml4ID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9PSURTVUZGSVgpOwogICAgcHJlZml4ID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9PSURQUkVGSVgpOwogICAgaWYgKChzdWZmaXggJiYgc3VmZml4WzBdKSB8fCAocHJlZml4ICYmIHByZWZpeFswXSkpIHsKICAgICAgICBpZiAoIXN1ZmZpeCkKICAgICAgICAgICAgc3VmZml4ID0gIiI7CiAgICAgICAgaWYgKCFwcmVmaXgpCiAgICAgICAgICAgIHByZWZpeCA9ICIiOwogICAgICAgIGlmICgoc3RybGVuKHN1ZmZpeCkgKyBzdHJsZW4ocHJlZml4KSArIHN0cmxlbihhcmd2KSArIDIpID4gdG1wYnVmX2xlbikgewogICAgICAgICAgICB0bXBidWZfbGVuID0gc3RybGVuKHN1ZmZpeCkgKyBzdHJsZW4oYXJndikgKyBzdHJsZW4ocHJlZml4KSArIDI7CiAgICAgICAgICAgIHRtcGJ1ZiA9IChjaGFyICopcmVhbGxvYyh0bXBidWYsIHRtcGJ1Zl9sZW4pOwogICAgICAgIH0KICAgICAgICBzbnByaW50Zih0bXBidWYsIHRtcGJ1Zl9sZW4sICIlcyVzJXMlcyIsIHByZWZpeCwgYXJndiwKICAgICAgICAgICAgICAgICAoKHN1ZmZpeFswXSA9PSAnLicgfHwgc3VmZml4WzBdID09ICdcMCcpID8gIiIgOiAiLiIpLAogICAgICAgICAgICAgICAgIHN1ZmZpeCk7CiAgICAgICAgYXJndiA9IHRtcGJ1ZjsKICAgICAgICBERUJVR01TR1RMKCgic25tcF9wYXJzZV9vaWQiLCJQYXJzaW5nOiAlc1xuIixhcmd2KSk7CiAgICB9CgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9SQU5ET01fQUNDRVNTKQogICAgICAgIHx8IHN0cmNocihhcmd2LCAnOicpKSB7CiAgICAgICAgaWYgKGdldF9ub2RlKGFyZ3YsIHJvb3QsIHJvb3RsZW4pKSB7CiAgICAgICAgICAgIHJldHVybiByb290OwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1JFR0VYX0FDQ0VTUykpIHsKCWNsZWFyX3RyZWVfZmxhZ3ModHJlZV9oZWFkKTsKICAgICAgICBpZiAoZ2V0X3dpbGRfbm9kZShhcmd2LCByb290LCByb290bGVuKSkgewogICAgICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICB9CiAgICB9IGVsc2UgewojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICAgICAgaWYgKHJlYWRfb2JqaWQoYXJndiwgcm9vdCwgcm9vdGxlbikpIHsKICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgICAgfQojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgICAgICpyb290bGVuID0gc2F2bGVuOwogICAgICAgIGlmIChnZXRfbm9kZShhcmd2LCByb290LCByb290bGVuKSkgewogICAgICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICB9CiAgICAgICAgKnJvb3RsZW4gPSBzYXZsZW47CiAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZCIsICJ3aWxkbHkgcGFyc2luZ1xuIikpOwoJY2xlYXJfdHJlZV9mbGFncyh0cmVlX2hlYWQpOwogICAgICAgIGlmIChnZXRfd2lsZF9ub2RlKGFyZ3YsIHJvb3QsIHJvb3RsZW4pKSB7CiAgICAgICAgICAgIHJldHVybiByb290OwogICAgICAgIH0KICAgIH0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgcmV0dXJuIE5VTEw7Cn0KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCi8qCiAqIFVzZSBESVNQTEFZLUhJTlQgdG8gcGFyc2UgYSB2YWx1ZSBpbnRvIGFuIG9jdGV0IHN0cmluZy4KICoKICogbm90ZSB0aGF0ICIxZDFkIiwgIjExIiBjb3VsZCBoYXZlIGNvbWUgZnJvbSBhbiBvY3RldCBzdHJpbmcgdGhhdAogKiBsb29rZWQgbGlrZSB7IDEsIDEgfSBvciBhbiBvY3RldCBzdHJpbmcgdGhhdCBsb29rZWQgbGlrZSB7IDExIH0KICogYmVjYXVzZSBvZiB0aGlzLCBpdCdzIGRvdWJ0ZnVsIHRoYXQgYW55b25lIHdvdWxkIHVzZSBzdWNoIGEgZGlzcGxheQogKiBzdHJpbmcuIFRoZXJlZm9yZSwgdGhlIHBhcnNlciBpZ25vcmVzIHRoaXMgY2FzZS4KICovCgpzdHJ1Y3QgcGFyc2VfaGludHMgewogICAgaW50IGxlbmd0aDsKICAgIGludCByZXBlYXQ7CiAgICBpbnQgZm9ybWF0OwogICAgaW50IHNlcGFyYXRvcjsKICAgIGludCB0ZXJtaW5hdG9yOwogICAgdW5zaWduZWQgY2hhciAqcmVzdWx0OwogICAgaW50IHJlc3VsdF9tYXg7CiAgICBpbnQgcmVzdWx0X2xlbjsKfTsKCnN0YXRpYyB2b2lkIHBhcnNlX2hpbnRzX3Jlc2V0KHN0cnVjdCBwYXJzZV9oaW50cyAqcGgpCnsKICAgIHBoLT5sZW5ndGggPSAwOwogICAgcGgtPnJlcGVhdCA9IDA7CiAgICBwaC0+Zm9ybWF0ID0gMDsKICAgIHBoLT5zZXBhcmF0b3IgPSAwOwogICAgcGgtPnRlcm1pbmF0b3IgPSAwOwp9CgpzdGF0aWMgdm9pZCBwYXJzZV9oaW50c19jdG9yKHN0cnVjdCBwYXJzZV9oaW50cyAqcGgpCnsKICAgIHBhcnNlX2hpbnRzX3Jlc2V0KHBoKTsKICAgIHBoLT5yZXN1bHQgPSBOVUxMOwogICAgcGgtPnJlc3VsdF9tYXggPSAwOwogICAgcGgtPnJlc3VsdF9sZW4gPSAwOwp9CgpzdGF0aWMgaW50IHBhcnNlX2hpbnRzX2FkZF9yZXN1bHRfb2N0ZXQoc3RydWN0IHBhcnNlX2hpbnRzICpwaCwgdW5zaWduZWQgY2hhciBvY3RldCkKewogICAgaWYgKCEocGgtPnJlc3VsdF9sZW4gPCBwaC0+cmVzdWx0X21heCkpIHsKCXBoLT5yZXN1bHRfbWF4ID0gcGgtPnJlc3VsdF9sZW4gKyAzMjsKCWlmICghcGgtPnJlc3VsdCkgewoJICAgIHBoLT5yZXN1bHQgPSAodW5zaWduZWQgY2hhciAqKW1hbGxvYyhwaC0+cmVzdWx0X21heCk7Cgl9IGVsc2UgewoJICAgIHBoLT5yZXN1bHQgPSAodW5zaWduZWQgY2hhciAqKXJlYWxsb2MocGgtPnJlc3VsdCwgcGgtPnJlc3VsdF9tYXgpOwoJfQogICAgfQogICAgCiAgICBpZiAoIXBoLT5yZXN1bHQpIHsKCXJldHVybiAwOwkJLyogZmFpbGVkICovCiAgICB9CgogICAgcGgtPnJlc3VsdFtwaC0+cmVzdWx0X2xlbisrXSA9IG9jdGV0OwogICAgcmV0dXJuIDE7CQkJLyogc3VjY2VzcyAqLwp9CgpzdGF0aWMgaW50IHBhcnNlX2hpbnRzX3BhcnNlKHN0cnVjdCBwYXJzZV9oaW50cyAqcGgsIGNvbnN0IGNoYXIgKip2X2luX291dCkKewogICAgY29uc3QgY2hhciAqdiA9ICp2X2luX291dDsKICAgIGNoYXIgKm52OwogICAgaW50IGJhc2U7CiAgICBpbnQgcmVwZWF0cyA9IDA7CiAgICBpbnQgcmVwZWF0X2ZpeHVwID0gcGgtPnJlc3VsdF9sZW47CiAgICAKICAgIGlmIChwaC0+cmVwZWF0KSB7CglpZiAoIXBhcnNlX2hpbnRzX2FkZF9yZXN1bHRfb2N0ZXQocGgsIDApKSB7CgkgICAgcmV0dXJuIDA7Cgl9CiAgICB9CiAgICBkbyB7CgliYXNlID0gMDsKCXN3aXRjaCAocGgtPmZvcm1hdCkgewoJY2FzZSAneCc6IGJhc2UgKz0gNjsJLyogZmFsbCB0aHJvdWdoICovCgljYXNlICdkJzogYmFzZSArPSAyOwkvKiBmYWxsIHRocm91Z2ggKi8KCWNhc2UgJ28nOiBiYXNlICs9IDg7CS8qIGZhbGwgdGhyb3VnaCAqLwoJICAgIHsKCQlpbnQgaTsKCQl1bnNpZ25lZCBsb25nIG51bWJlciA9IHN0cnRvbCh2LCAmbnYsIGJhc2UpOwoJCWlmIChudiA9PSB2KSByZXR1cm4gMDsKCQl2ID0gbnY7CgkJZm9yIChpID0gMDsgaSA8IHBoLT5sZW5ndGg7IGkrKykgewoJCSAgICBpbnQgc2hpZnQgPSA4ICogKHBoLT5sZW5ndGggLSAxIC0gaSk7CgkJICAgIGlmICghcGFyc2VfaGludHNfYWRkX3Jlc3VsdF9vY3RldChwaCwgKHVfY2hhcikobnVtYmVyID4+IHNoaWZ0KSApKSB7CgkJCXJldHVybiAwOyAvKiBmYWlsZWQgKi8KCQkgICAgfQoJCX0KCSAgICB9CgkgICAgYnJlYWs7CgoJY2FzZSAnYSc6CgkgICAgewoJCWludCBpOwoJCSAgICAKCQlmb3IgKGkgPSAwOyBpIDwgcGgtPmxlbmd0aCAmJiAqdjsgaSsrKSB7CgkJICAgIGlmICghcGFyc2VfaGludHNfYWRkX3Jlc3VsdF9vY3RldChwaCwgKnYrKykpIHsKCQkJcmV0dXJuIDA7CS8qIGZhaWxlZCAqLwoJCSAgICB9CgkJfQoJICAgIH0KCSAgICBicmVhazsKCX0KCglyZXBlYXRzKys7CgoJaWYgKHBoLT5zZXBhcmF0b3IgJiYgKnYpIHsKCSAgICBpZiAoKnYgPT0gcGgtPnNlcGFyYXRvcikgewoJCXYrKzsKCSAgICB9IGVsc2UgewoJCXJldHVybiAwOwkJLyogZmFpbGVkICovCgkgICAgfQoJfQoKCWlmIChwaC0+dGVybWluYXRvcikgewoJICAgIGlmICgqdiA9PSBwaC0+dGVybWluYXRvcikgewoJCXYrKzsKCQlicmVhazsKCSAgICB9Cgl9CiAgICB9IHdoaWxlIChwaC0+cmVwZWF0ICYmICp2KTsKICAgIGlmIChwaC0+cmVwZWF0KSB7CglwaC0+cmVzdWx0W3JlcGVhdF9maXh1cF0gPSByZXBlYXRzOwogICAgfQoKICAgICp2X2luX291dCA9IHY7CiAgICByZXR1cm4gMTsKfQoKc3RhdGljIHZvaWQgcGFyc2VfaGludHNfbGVuZ3RoX2FkZF9kaWdpdChzdHJ1Y3QgcGFyc2VfaGludHMgKnBoLCBpbnQgZGlnaXQpCnsKICAgIHBoLT5sZW5ndGggKj0gMTA7CiAgICBwaC0+bGVuZ3RoICs9IGRpZ2l0IC0gJzAnOwp9Cgpjb25zdCBjaGFyICpwYXJzZV9vY3RldF9oaW50KGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnZhbHVlLCB1bnNpZ25lZCBjaGFyICoqbmV3X3ZhbCwgaW50ICpuZXdfdmFsX2xlbikKewogICAgY29uc3QgY2hhciAqaCA9IGhpbnQ7CiAgICBjb25zdCBjaGFyICp2ID0gdmFsdWU7CiAgICBzdHJ1Y3QgcGFyc2VfaGludHMgcGg7CiAgICBpbnQgcmV0dmFsID0gMTsKICAgIC8qIFNlZSBSRkMgMTQ0MyAqLwogICAgZW51bSB7CglISU5UXzFfMiwKCUhJTlRfMl8zLAoJSElOVF8xXzJfNCwKCUhJTlRfMV8yXzUKICAgIH0gc3RhdGUgPSBISU5UXzFfMjsKCiAgICBwYXJzZV9oaW50c19jdG9yKCZwaCk7CiAgICB3aGlsZSAoKmggJiYgKnYgJiYgcmV0dmFsKSB7Cglzd2l0Y2ggKHN0YXRlKSB7CgljYXNlIEhJTlRfMV8yOgoJICAgIGlmICgnKicgPT0gKmgpIHsKCQlwaC5yZXBlYXQgPSAxOwoJCXN0YXRlID0gSElOVF8yXzM7CgkgICAgfSBlbHNlIGlmIChpc2RpZ2l0KCpoKSkgewoJCXBhcnNlX2hpbnRzX2xlbmd0aF9hZGRfZGlnaXQoJnBoLCAqaCk7CgkJc3RhdGUgPSBISU5UXzJfMzsKCSAgICB9IGVsc2UgewoJCXJldHVybiB2OwkvKiBmYWlsZWQgKi8KCSAgICB9CgkgICAgYnJlYWs7CgoJY2FzZSBISU5UXzJfMzoKCSAgICBpZiAoaXNkaWdpdCgqaCkpIHsKCQlwYXJzZV9oaW50c19sZW5ndGhfYWRkX2RpZ2l0KCZwaCwgKmgpOwoJCS8qIHN0YXRlID0gSElOVF8yXzMgKi8KCSAgICB9IGVsc2UgaWYgKCd4JyA9PSAqaCB8fCAnZCcgPT0gKmggfHwgJ28nID09ICpoIHx8ICdhJyA9PSAqaCkgewoJCXBoLmZvcm1hdCA9ICpoOwoJCXN0YXRlID0gSElOVF8xXzJfNDsKCSAgICB9IGVsc2UgewoJCXJldHVybiB2OwkvKiBmYWlsZWQgKi8KCSAgICB9CgkgICAgYnJlYWs7CgoJY2FzZSBISU5UXzFfMl80OgoJICAgIGlmICgnKicgPT0gKmgpIHsKCQlyZXR2YWwgPSBwYXJzZV9oaW50c19wYXJzZSgmcGgsICZ2KTsKCQlwYXJzZV9oaW50c19yZXNldCgmcGgpOwoJCQoJCXBoLnJlcGVhdCA9IDE7CgkJc3RhdGUgPSBISU5UXzJfMzsKCSAgICB9IGVsc2UgaWYgKGlzZGlnaXQoKmgpKSB7CgkJcmV0dmFsID0gcGFyc2VfaGludHNfcGFyc2UoJnBoLCAmdik7CgkJcGFyc2VfaGludHNfcmVzZXQoJnBoKTsKCQkKCQlwYXJzZV9oaW50c19sZW5ndGhfYWRkX2RpZ2l0KCZwaCwgKmgpOwoJCXN0YXRlID0gSElOVF8yXzM7CgkgICAgfSBlbHNlIHsKCQlwaC5zZXBhcmF0b3IgPSAqaDsKCQlzdGF0ZSA9IEhJTlRfMV8yXzU7CgkgICAgfQoJICAgIGJyZWFrOwoKCWNhc2UgSElOVF8xXzJfNToKCSAgICBpZiAoJyonID09ICpoKSB7CgkJcmV0dmFsID0gcGFyc2VfaGludHNfcGFyc2UoJnBoLCAmdik7CgkJcGFyc2VfaGludHNfcmVzZXQoJnBoKTsKCQkKCQlwaC5yZXBlYXQgPSAxOwoJCXN0YXRlID0gSElOVF8yXzM7CgkgICAgfSBlbHNlIGlmIChpc2RpZ2l0KCpoKSkgewoJCXJldHZhbCA9IHBhcnNlX2hpbnRzX3BhcnNlKCZwaCwgJnYpOwoJCXBhcnNlX2hpbnRzX3Jlc2V0KCZwaCk7CgkJCgkJcGFyc2VfaGludHNfbGVuZ3RoX2FkZF9kaWdpdCgmcGgsICpoKTsKCQlzdGF0ZSA9IEhJTlRfMl8zOwoJICAgIH0gZWxzZSB7CgkJcGgudGVybWluYXRvciA9ICpoOwoKCQlyZXR2YWwgPSBwYXJzZV9oaW50c19wYXJzZSgmcGgsICZ2KTsKCQlwYXJzZV9oaW50c19yZXNldCgmcGgpOwoKCQlzdGF0ZSA9IEhJTlRfMV8yOwoJICAgIH0KCSAgICBicmVhazsKCX0KCWgrKzsKICAgIH0KICAgIHdoaWxlICgqdiAmJiByZXR2YWwpIHsKCXJldHZhbCA9IHBhcnNlX2hpbnRzX3BhcnNlKCZwaCwgJnYpOwogICAgfQogICAgaWYgKHJldHZhbCkgewoJKm5ld192YWwgPSBwaC5yZXN1bHQ7CgkqbmV3X3ZhbF9sZW4gPSBwaC5yZXN1bHRfbGVuOwogICAgfSBlbHNlIHsKCWlmIChwaC5yZXN1bHQpIHsKCSAgICBTTk1QX0ZSRUUocGgucmVzdWx0KTsKCX0KCSpuZXdfdmFsID0gTlVMTDsKCSpuZXdfdmFsX2xlbiA9IDA7CiAgICB9CiAgICByZXR1cm4gcmV0dmFsID8gTlVMTCA6IHY7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKI2lmZGVmIHRlc3RfZGlzcGxheV9oaW50CgppbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCnsKICAgIGNvbnN0IGNoYXIgKmhpbnQ7CiAgICBjb25zdCBjaGFyICp2YWx1ZTsKICAgIHVuc2lnbmVkIGNoYXIgKm5ld192YWw7CiAgICBpbnQgbmV3X3ZhbF9sZW47CiAgICBjaGFyICpyOwogICAgCiAgICBpZiAoYXJnYyA8IDMpIHsKCWZwcmludGYoc3RkZXJyLCAidXNhZ2U6IGRoIDxoaW50PiA8dmFsdWU+XG4iKTsKCWV4aXQoMik7CiAgICB9CiAgICBoaW50ID0gYXJndlsxXTsKICAgIHZhbHVlID0gYXJndlsyXTsKICAgIHIgPSBwYXJzZV9vY3RldF9oaW50KGhpbnQsIHZhbHVlLCAmbmV3X3ZhbCwgJm5ld192YWxfbGVuKTsKICAgIHByaW50Zigie1wiJXNcIiwgXCIlc1wifTogXG5cdCIsIGhpbnQsIHZhbHVlKTsKICAgIGlmIChyKSB7CiAgICAgICAgKnIgPSAwOwogICAgCXByaW50ZigicmV0dXJuZWQgZmFpbGVkXG4iKTsKCXByaW50ZigidmFsdWUgc3ludGF4IGVycm9yIGF0OiAlc1xuIiwgdmFsdWUpOwogICAgfQogICAgZWxzZSB7CglpbnQgaTsKCXByaW50ZigicmV0dXJuZWQgc3VjY2Vzc1xuIik7Cglmb3IgKGkgPSAwOyBpIDwgbmV3X3ZhbF9sZW47IGkrKykgewoJICAgIGludCBjID0gbmV3X3ZhbFtpXSAmIDB4RkY7CgkgICAgcHJpbnRmKCIlMDJYKCVjKSAiLCBjLCBpc3ByaW50KGMpID8gYyA6ICcgJyk7Cgl9CglTTk1QX0ZSRUUobmV3X3ZhbCk7CiAgICB9CiAgICBwcmludGYoIlxuIik7CiAgICBleGl0KDApOwp9CgojZW5kaWYgLyogdGVzdF9kaXNwbGF5X2hpbnQgKi8KCnVfY2hhcgptaWJfdG9fYXNuX3R5cGUoaW50IG1pYl90eXBlKQp7CiAgICBzd2l0Y2ggKG1pYl90eXBlKSB7CiAgICBjYXNlIFRZUEVfT0JKSUQ6CiAgICAgICAgcmV0dXJuIEFTTl9PQkpFQ1RfSUQ7CgogICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgIHJldHVybiBBU05fT0NURVRfU1RSOwoKICAgIGNhc2UgVFlQRV9ORVRBRERSOgogICAgY2FzZSBUWVBFX0lQQUREUjoKICAgICAgICByZXR1cm4gQVNOX0lQQUREUkVTUzsKCiAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgY2FzZSBUWVBFX0lOVEVHRVI6CiAgICAgICAgcmV0dXJuIEFTTl9JTlRFR0VSOwoKICAgIGNhc2UgVFlQRV9DT1VOVEVSOgogICAgICAgIHJldHVybiBBU05fQ09VTlRFUjsKCiAgICBjYXNlIFRZUEVfR0FVR0U6CiAgICAgICAgcmV0dXJuIEFTTl9HQVVHRTsKCiAgICBjYXNlIFRZUEVfVElNRVRJQ0tTOgogICAgICAgIHJldHVybiBBU05fVElNRVRJQ0tTOwoKICAgIGNhc2UgVFlQRV9PUEFRVUU6CiAgICAgICAgcmV0dXJuIEFTTl9PUEFRVUU7CgogICAgY2FzZSBUWVBFX05VTEw6CiAgICAgICAgcmV0dXJuIEFTTl9OVUxMOwoKICAgIGNhc2UgVFlQRV9DT1VOVEVSNjQ6CiAgICAgICAgcmV0dXJuIEFTTl9DT1VOVEVSNjQ7CgogICAgY2FzZSBUWVBFX0JJVFNUUklORzoKICAgICAgICByZXR1cm4gQVNOX0JJVF9TVFI7CgogICAgY2FzZSBUWVBFX1VJTlRFR0VSOgogICAgY2FzZSBUWVBFX1VOU0lHTkVEMzI6CiAgICAgICAgcmV0dXJuIEFTTl9VTlNJR05FRDsKCiAgICBjYXNlIFRZUEVfTlNBUEFERFJFU1M6CiAgICAgICAgcmV0dXJuIEFTTl9OU0FQOwoKICAgIH0KICAgIHJldHVybiAtMTsKfQoKLyoqCiAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGl0cyBPSUQgZm9ybS4KICogaW4gZXhhbXBsZSAgImhlbGxvIiA9IDUgLiAnaCcgLiAnZScgLiAnbCcgLiAnbCcgLiAnbycKICoKICogQHBhcmFtIFMgICBUaGUgc3RyaW5nLgogKiBAcGFyYW0gTyAgIFRoZSBvaWQuCiAqIEBwYXJhbSBMICAgVGhlIGxlbmd0aCBvZiB0aGUgb2lkLgogKgogKiBAcmV0dXJuIDAgb24gU3VjZXNzLCAxIG9uIGZhaWx1cmUuCiAqLwppbnQKbmV0c25tcF9zdHIyb2lkKGNvbnN0IGNoYXIgKlMsIG9pZCAqIE8sIGludCBMKQp7CiAgICBjb25zdCBjaGFyICAgICAqYyA9IFM7CiAgICBvaWQgICAgICAgICAgICAqbyA9ICZPWzFdOwoKICAgIC0tTDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZWF2ZSByb29tIGZvciBsZW5ndGggcHJlZml4ICovCgogICAgZm9yICg7ICpjICYmIEw7IC0tTCwgKytvLCArK2MpCiAgICAgICAgKm8gPSAqYzsKCiAgICAvKgogICAgICogbWFrZSBzdXJlIHdlIGdvdCB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgCiAgICAgKi8KICAgIGlmICgqYyAhPSAwKQogICAgICAgIHJldHVybiAxOwoKICAgIC8qCiAgICAgKiBzZXQgdGhlIGxlbmd0aCBvZiB0aGUgb2lkIAogICAgICovCiAgICAqTyA9IGMgLSBTOwoKICAgIHJldHVybiAwOwp9CgovKioKICogQ29udmVydHMgYW4gT0lEIHRvIGl0cyBjaGFyYWN0ZXIgZm9ybS4KICogaW4gZXhhbXBsZSAgNSAuIDEgLiAyIC4gMyAuIDQgLiA1ID0gMTIzNDUKICoKICogQHBhcmFtIEMgICBUaGUgY2hhcmFjdGVyIGJ1ZmZlci4KICogQHBhcmFtIEwgICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIuCiAqIEBwYXJhbSBPICAgVGhlIG9pZC4KICoKICogQHJldHVybiAwIG9uIFN1Y2VzcywgMSBvbiBmYWlsdXJlLgogKi8KaW50Cm5ldHNubXBfb2lkMmNoYXJzKGNoYXIgKkMsIGludCBMLCBjb25zdCBvaWQgKiBPKQp7CiAgICBjaGFyICAgICAgICAgICAqYyA9IEM7CiAgICBjb25zdCBvaWQgICAgICAqbyA9ICZPWzFdOwoKICAgIGlmIChMIDwgKGludCkqTykKICAgICAgICByZXR1cm4gMTsKCiAgICBMID0gKk87IC8qKiBsZW5ndGggKi8KICAgIGZvciAoOyBMOyAtLUwsICsrbywgKytjKSB7CiAgICAgICAgaWYgKCpvID4gMHhGRikKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgKmMgPSAoY2hhcikqbzsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioKICogQ29udmVydHMgYW4gT0lEIHRvIGl0cyBzdHJpbmcgZm9ybS4KICogaW4gZXhhbXBsZSAgNSAuICdoJyAuICdlJyAuICdsJyAuICdsJyAuICdvJyA9ICJoZWxsb1wwIiAobnVsbCB0ZXJtaW5hdGVkKQogKgogKiBAcGFyYW0gUyAgIFRoZSBjaGFyYWN0ZXIgc3RyaW5nIGJ1ZmZlci4KICogQHBhcmFtIEwgICBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgYnVmZmVyLgogKiBAcGFyYW0gTyAgIFRoZSBvaWQuCiAqCiAqIEByZXR1cm4gMCBvbiBTdWNlc3MsIDEgb24gZmFpbHVyZS4KICovCmludApuZXRzbm1wX29pZDJzdHIoY2hhciAqUywgaW50IEwsIG9pZCAqIE8pCnsKICAgIGludCAgICAgICAgICAgIHJjOwoKICAgIGlmIChMIDw9IChpbnQpKk8pCiAgICAgICAgcmV0dXJuIDE7CgogICAgcmMgPSBuZXRzbm1wX29pZDJjaGFycyhTLCBMLCBPKTsKICAgIGlmIChyYykKICAgICAgICByZXR1cm4gMTsKCiAgICBTWyAqTyBdID0gMDsKCiAgICByZXR1cm4gMDsKfQoKaW50CnNucHJpbnRfYnlfdHlwZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2J5X3R5cGUoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2hleHN0cmluZyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLCBjb25zdCB1X2NoYXIgKiBjcCwgc2l6ZV90IGxlbikKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2hleHN0cmluZygodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcCwgbGVuKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2FzY2lpc3RyaW5nKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdV9jaGFyICogY3AsIHNpemVfdCBsZW4pCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19hc2NpaXN0cmluZwogICAgICAgICgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLCBjcCwgbGVuKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X29jdGV0X3N0cmluZyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX29jdGV0X3N0cmluZwogICAgICAgICgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9vcGFxdWUoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19vcGFxdWUoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfb2JqZWN0X2lkZW50aWZpZXIoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsIGNvbnN0IGNoYXIgKmhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19vYmplY3RfaWRlbnRpZmllcgogICAgICAgICgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF90aW1ldGlja3MoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY190aW1ldGlja3MoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfaGludGVkX2ludGVnZXIoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBsb25nIHZhbCwgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19oaW50ZWRfaW50ZWdlcgogICAgICAgICgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLCB2YWwsICdkJywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfaW50ZWdlcihjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfaW50ZWdlcigodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfdWludGVnZXIoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfdWludGVnZXIoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9nYXVnZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19nYXVnZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2NvdW50ZXIoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2NvdW50ZXIoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X25ldHdvcmthZGRyZXNzKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLCBjb25zdCBjaGFyICpoaW50LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfbmV0d29ya2FkZHJlc3MKICAgICAgICAoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfaXBhZGRyZXNzKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfaXBhZGRyZXNzKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X251bGwoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX251bGwoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2JpdHN0cmluZyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2JpdHN0cmluZygodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9uc2FwYWRkcmVzcyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19uc2FwYWRkcmVzcwogICAgICAgICgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9jb3VudGVyNjQoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19jb3VudGVyNjQoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfYmFkdHlwZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfYmFkdHlwZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwppbnQKc25wcmludF9mbG9hdChjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19mbG9hdCgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2RvdWJsZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2RvdWJsZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CiNlbmRpZgovKiogQH0gKi8KCg==