LyoKICogbWliLmMKICoKICogJElkJAogKgogKiBVcGRhdGU6IDE5OTgtMDctMTcgPGpoeUBnc3UuZWR1PgogKiBBZGRlZCBwcmludF9vaWRfcmVwb3J0KiBmdW5jdGlvbnMuCiAqCiAqLwovKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHRzLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCUNvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkxLCAxOTkyIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CgogICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgbm90IGJlCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQpzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwpBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKQ01VIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgpBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwpTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtZmVhdHVyZXMuaD4KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoKI2lmIEhBVkVfRElSRU5UX0gKIyBpbmNsdWRlIDxkaXJlbnQuaD4KIyBkZWZpbmUgTkFNTEVOKGRpcmVudCkgc3RybGVuKChkaXJlbnQpLT5kX25hbWUpCiNlbHNlCiMgZGVmaW5lIGRpcmVudCBkaXJlY3QKIyBkZWZpbmUgTkFNTEVOKGRpcmVudCkgKGRpcmVudCktPmRfbmFtbGVuCiMgaWYgSEFWRV9TWVNfTkRJUl9ICiMgIGluY2x1ZGUgPHN5cy9uZGlyLmg+CiMgZW5kaWYKIyBpZiBIQVZFX1NZU19ESVJfSAojICBpbmNsdWRlIDxzeXMvZGlyLmg+CiMgZW5kaWYKIyBpZiBIQVZFX05ESVJfSAojICBpbmNsdWRlIDxuZGlyLmg+CiMgZW5kaWYKI2VuZGlmCgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyBpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHRpbWUuaD4KIyBlbmRpZgojZW5kaWYKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NFTEVDVF9ICiNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CiNlbmRpZgoKI2lmIEhBVkVfVU5JU1REX0gKI2luY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2lmIEhBVkVfRE1BTExPQ19ICiNpbmNsdWRlIDxkbWFsbG9jLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL3R5cGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9vdXRwdXRfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9jb25maWdfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC91dGlsaXRpZXMuaD4KCiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2FzbjEuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvbWliLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3BhcnNlLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2ludDY0Lmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NubXBfY2xpZW50Lmg+CgpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YobWliX2FwaSwgbGlibmV0c25tcCkKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKG1pYl9zdHJpbmdzX2FsbCwgbWliX2FwaSkKCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihtaWJfc25wcmludCwgbWliX3N0cmluZ3NfYWxsKQpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YobWliX3NucHJpbnRfZGVzY3JpcHRpb24sIG1pYl9zdHJpbmdzX2FsbCkKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKG1pYl9zbnByaW50X3ZhcmlhYmxlLCBtaWJfc3RyaW5nc19hbGwpCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihtaWJfc3RyaW5nX2NvbnZlcnNpb25zLCBtaWJfc3RyaW5nc19hbGwpCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihwcmludF9taWIsIG1pYl9zdHJpbmdzX2FsbCkKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKHNucHJpbnRfb2JqaWQsIG1pYl9zdHJpbmdzX2FsbCkKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKHNucHJpbnRfdmFsdWUsIG1pYl9zdHJpbmdzX2FsbCkKCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihtaWJfdG9fYXNuX3R5cGUsIG1pYl9hcGkpCgovKiogQGRlZmdyb3VwIG1pYl91dGlsaXRpZXMgbWliIHBhcnNpbmcgYW5kIGRhdGF0eXBlIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4KICogIEBpbmdyb3VwIGxpYnJhcnkKICoKICogIEB7CiAqLwoKc3RhdGljIGNoYXIgICAgKnVwdGltZVN0cmluZyh1X2xvbmcsIGNoYXIgKiwgc2l6ZV90KTsKCnN0YXRpYyBzdHJ1Y3QgdHJlZSAqX2dldF9yZWFsbG9jX3N5bWJvbChjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgKnN1YnRyZWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqaW5fZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBlbmRfb2Zfa25vd24pOwoKc3RhdGljIGludCAgICAgIHByaW50X3RyZWVfbm9kZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmVlICp0cCwgaW50IHdpZHRoKTsKc3RhdGljIHZvaWQgICAgIGhhbmRsZV9taWJkaXJzX2NvbmYoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpOwpzdGF0aWMgdm9pZCAgICAgaGFuZGxlX21pYnNfY29uZihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSk7CnN0YXRpYyB2b2lkICAgICBoYW5kbGVfbWliZmlsZV9jb25mKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKTsKCnN0YXRpYyB2b2lkICAgICBfb2lkX2ZpbmlzaF9wcmludGluZyhjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywgaW50ICpidWZfb3ZlcmZsb3cpOwoKLyoKICogaGVscGVyIGZ1bmN0aW9ucyBmb3IgZ2V0X21vZHVsZV9ub2RlIAogKi8Kc3RhdGljIGludCAgICAgIG5vZGVfdG9fb2lkKHN0cnVjdCB0cmVlICosIG9pZCAqLCBzaXplX3QgKik7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCnN0YXRpYyBpbnQgICAgICBfYWRkX3N0cmluZ3NfdG9fb2lkKHN0cnVjdCB0cmVlICosIGNoYXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICosIHNpemVfdCAqLCBzaXplX3QpOwojZWxzZQpzdGF0aWMgaW50ICAgICAgX2FkZF9zdHJpbmdzX3RvX29pZCh2b2lkICosIGNoYXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICosIHNpemVfdCAqLCBzaXplX3QpOwojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwpORVRTTk1QX0lNUE9SVCBzdHJ1Y3QgdHJlZSAqdHJlZV9oZWFkOwpzdGF0aWMgc3RydWN0IHRyZWUgKnRyZWVfdG9wOwoKTkVUU05NUF9JTVBPUlQgc3RydWN0IHRyZWUgKk1pYjsKc3RydWN0IHRyZWUgICAgKk1pYjsgICAgICAgICAgICAvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgpvaWQgICAgICAgICAgICAgUkZDMTIxM19NSUJbXSA9IHsgMSwgMywgNiwgMSwgMiwgMSB9OwpzdGF0aWMgY2hhciAgICAgU3RhbmRhcmRfUHJlZml4W10gPSAiLjEuMy42LjEuMi4xIjsKCi8qCiAqIFNldCBkZWZhdWx0IGhlcmUgYXMgc29tZSB1c2VzIG9mIHJlYWRfb2JqaWQgcmVxdWlyZSB2YWxpZCBwb2ludGVyLiAKICovCnN0YXRpYyBjaGFyICAgICpQcmVmaXggPSAmU3RhbmRhcmRfUHJlZml4WzBdOwp0eXBlZGVmIHN0cnVjdCBfUHJlZml4TGlzdCB7CiAgICBjb25zdCBjaGFyICAgICAqc3RyOwogICAgaW50ICAgICAgICAgICAgIGxlbjsKfSAgICAgICAgICAgICAgKlByZWZpeExpc3RQdHIsIFByZWZpeExpc3Q7CgovKgogKiBIZXJlIGFyZSB0aGUgcHJlZml4IHN0cmluZ3MuCiAqIE5vdGUgdGhhdCB0aGUgZmlyc3Qgb25lIGZpbmRzIHRoZSB2YWx1ZSBvZiBQcmVmaXggb3IgU3RhbmRhcmRfUHJlZml4LgogKiBBbnkgb2YgdGhlc2UgTUFZIHN0YXJ0IHdpdGggcGVyaW9kOyBhbGwgd2lsbCBOT1QgZW5kIHdpdGggcGVyaW9kLgogKiBQZXJpb2QgaXMgYWRkZWQgd2hlcmUgbmVlZGVkLiAgU2VlIHVzZSBvZiBQcmVmaXggaW4gdGhpcyBtb2R1bGUuCiAqLwpQcmVmaXhMaXN0ICAgICAgbWliX3ByZWZpeGVzW10gPSB7CiAgICB7JlN0YW5kYXJkX1ByZWZpeFswXX0sICAgICAgLyogcGxhY2Vob2xkZXIgZm9yIFByZWZpeCBkYXRhICovCiAgICB7Ii5pc28ub3JnLmRvZC5pbnRlcm5ldC5tZ210Lm1pYi0yIn0sCiAgICB7Ii5pc28ub3JnLmRvZC5pbnRlcm5ldC5leHBlcmltZW50YWwifSwKICAgIHsiLmlzby5vcmcuZG9kLmludGVybmV0LnByaXZhdGUifSwKICAgIHsiLmlzby5vcmcuZG9kLmludGVybmV0LnNubXBQYXJ0aWVzIn0sCiAgICB7Ii5pc28ub3JnLmRvZC5pbnRlcm5ldC5zbm1wU2VjcmV0cyJ9LAogICAge05VTEwsIDB9ICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBsaXN0ICovCn07CgplbnVtIGluZXRfYWRkcmVzc190eXBlIHsKICAgIElQVjQgPSAxLAogICAgSVBWNiA9IDIsCiAgICBJUFY0WiA9IDMsCiAgICBJUFY2WiA9IDQsCiAgICBETlMgPSAxNgp9OwoKCi8qKgogKiBAaW50ZXJuYWwKICogQ29udmVydHMgdGltZXRpY2tzIHRvIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzIHN0cmluZy4KICoKICogQHBhcmFtIHRpbWV0aWNrcyAgICBUaGUgdGltZXRpY2tzIHRvIGNvbnZlcnQuCiAqIEBwYXJhbSBidWYgICAgICAgICAgQnVmZmVyIHRvIHdyaXRlIHRvLCBoYXMgdG8gYmUgYXQgCiAqICAgICAgICAgICAgICAgICAgICAgbGVhc3QgNDAgQnl0ZXMgbGFyZ2UuCiAqICAgICAgIAogKiBAcmV0dXJuIFRoZSBidWZmZXIuCiAqLwpzdGF0aWMgY2hhciAgICAqCnVwdGltZVN0cmluZyh1X2xvbmcgdGltZXRpY2tzLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCnsKICAgIGludCAgICAgICAgICAgICBjZW50aXNlY3MsIHNlY29uZHMsIG1pbnV0ZXMsIGhvdXJzLCBkYXlzOwoKICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTlVNRVJJQ19USU1FVElDS1MpKSB7CiAgICAgICAgc25wcmludGYoYnVmLCBidWZsZW4sICIlbHUiLCB0aW1ldGlja3MpOwogICAgICAgIHJldHVybiBidWY7CiAgICB9CgoKICAgIGNlbnRpc2VjcyA9IHRpbWV0aWNrcyAlIDEwMDsKICAgIHRpbWV0aWNrcyAvPSAxMDA7CiAgICBkYXlzID0gdGltZXRpY2tzIC8gKDYwICogNjAgKiAyNCk7CiAgICB0aW1ldGlja3MgJT0gKDYwICogNjAgKiAyNCk7CgogICAgaG91cnMgPSB0aW1ldGlja3MgLyAoNjAgKiA2MCk7CiAgICB0aW1ldGlja3MgJT0gKDYwICogNjApOwoKICAgIG1pbnV0ZXMgPSB0aW1ldGlja3MgLyA2MDsKICAgIHNlY29uZHMgPSB0aW1ldGlja3MgJSA2MDsKCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkKICAgICAgICBzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVkOiVkOiUwMmQ6JTAyZC4lMDJkIiwKICAgICAgICAgICAgICAgIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBjZW50aXNlY3MpOwogICAgZWxzZSB7CiAgICAgICAgaWYgKGRheXMgPT0gMCkgewogICAgICAgICAgICBzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVkOiUwMmQ6JTAyZC4lMDJkIiwKICAgICAgICAgICAgICAgICAgICBob3VycywgbWludXRlcywgc2Vjb25kcywgY2VudGlzZWNzKTsKICAgICAgICB9IGVsc2UgaWYgKGRheXMgPT0gMSkgewogICAgICAgICAgICBzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVkIGRheSwgJWQ6JTAyZDolMDJkLiUwMmQiLAogICAgICAgICAgICAgICAgICAgIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBjZW50aXNlY3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJWQgZGF5cywgJWQ6JTAyZDolMDJkLiUwMmQiLAogICAgICAgICAgICAgICAgICAgIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBjZW50aXNlY3MpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBidWY7Cn0KCgoKLyoqCiAqIEBpbnRlcm5hbAogKiBQcmludHMgdGhlIGNoYXJhY3RlciBwb2ludGVkIHRvIGlmIGluIGh1bWFuLXJlYWRhYmxlIEFTQ0lJIHJhbmdlLAogKiBvdGhlcndpc2UgcHJpbnRzIGEgZG90LgogKgogKiBAcGFyYW0gYnVmIEJ1ZmZlciB0byBwcmludCB0aGUgY2hhcmFjdGVyIHRvLgogKiBAcGFyYW0gY2ggIENoYXJhY3RlciB0byBwcmludC4KICovCnN0YXRpYyB2b2lkCnNwcmludF9jaGFyKGNoYXIgKmJ1ZiwgY29uc3QgdV9jaGFyIGNoKQp7CiAgICBpZiAoaXNwcmludChjaCkgfHwgaXNzcGFjZShjaCkpIHsKICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVjIiwgKGludCkgY2gpOwogICAgfSBlbHNlIHsKICAgICAgICBzcHJpbnRmKGJ1ZiwgIi4iKTsKICAgIH0KfQoKCgovKioKICogUHJpbnRzIGEgaGV4YWRlY2ltYWwgc3RyaW5nIGludG8gYSBidWZmZXIuCiAqCiAqIFRoZSBjaGFyYWN0ZXJzIHBvaW50ZWQgYnkgKmNwIGFyZSBlbmNvZGVkIGFzIGhleGFkZWNpbWFsIHN0cmluZy4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBhZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBhZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBpbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gY3AgICAgICAgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMgdG8gZW5jb2RlLgogKiBAcGFyYW0gbGluZV9sZW4gdGhlIGFycmF5IGxlbmd0aCBvZiBjcC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKX3NwcmludF9oZXhzdHJpbmdfbGluZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLCBjb25zdCB1X2NoYXIgKiBjcCwgc2l6ZV90IGxpbmVfbGVuKQp7CiAgICBjb25zdCB1X2NoYXIgICAqdHA7CiAgICBjb25zdCB1X2NoYXIgICAqY3AyID0gY3A7CiAgICBzaXplX3QgICAgICAgICAgbGVubGVmdCA9IGxpbmVfbGVuOwoKICAgIC8qCiAgICAgKiBNYWtlIHN1cmUgdGhlcmUncyBlbm91Z2ggcm9vbSBmb3IgdGhlIGhleCBvdXRwdXQuLi4uCiAgICAgKi8KICAgIHdoaWxlICgoKm91dF9sZW4gKyBsaW5lX2xlbiozKzEpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiAuLi4uIGFuZCBkaXNwbGF5IHRoZSBoZXggdmFsdWVzIHRoZW1zZWx2ZXMuLi4uCiAgICAgKi8KICAgIGZvciAoOyBsZW5sZWZ0ID49IDg7IGxlbmxlZnQtPTgpIHsKICAgICAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLAogICAgICAgICAgICAgICAgIiUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAiLCBjcFswXSwgY3BbMV0sCiAgICAgICAgICAgICAgICBjcFsyXSwgY3BbM10sIGNwWzRdLCBjcFs1XSwgY3BbNl0sIGNwWzddKTsKICAgICAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwogICAgICAgIGNwICAgICAgICs9IDg7CiAgICB9CiAgICBmb3IgKDsgbGVubGVmdCA+IDA7IGxlbmxlZnQtLSkgewogICAgICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICIlMDJYICIsICpjcCsrKTsKICAgICAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwogICAgfQoKICAgIC8qCiAgICAgKiAuLi4uIHBsdXMgKG9wdGlvbmFsbHkpIGRvIHRoZSBzYW1lIGZvciB0aGUgQVNDSUkgZXF1aXZhbGVudC4KICAgICAqLwogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9IRVhfVEVYVCkpIHsKICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgbGluZV9sZW4rNSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICIgIFsiKTsKICAgICAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwogICAgICAgIGZvciAodHAgPSBjcDI7IHRwIDwgY3A7IHRwKyspIHsKICAgICAgICAgICAgc3ByaW50X2NoYXIoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICp0cCk7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICB9CiAgICAgICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgIl0iKTsKICAgICAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCmludApzcHJpbnRfcmVhbGxvY19oZXhzdHJpbmcodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLCBjb25zdCB1X2NoYXIgKiBjcCwgc2l6ZV90IGxlbikKewogICAgaW50IGxpbmVfbGVuID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9IRVhfT1VUUFVUX0xFTkdUSCk7CiAgICBpZiAoIWxpbmVfbGVuKQogICAgICAgIGxpbmVfbGVuPWxlbjsKCiAgICBmb3IgKDsgKGludClsZW4gPiBsaW5lX2xlbjsgbGVuIC09IGxpbmVfbGVuKSB7CiAgICAgICAgaWYoIV9zcHJpbnRfaGV4c3RyaW5nX2xpbmUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCwgbGluZV9sZW4pKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAqKCpidWYgKyAoKm91dF9sZW4pKyspID0gJ1xuJzsKICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAwOwogICAgICAgIGNwICs9IGxpbmVfbGVuOwogICAgfQogICAgaWYoIV9zcHJpbnRfaGV4c3RyaW5nX2xpbmUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCwgbGVuKSkKICAgICAgICByZXR1cm4gMDsKICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IDA7CiAgICByZXR1cm4gMTsKfQoKCgovKioKICogUHJpbnRzIGFuIGFzY2lpIHN0cmluZyBpbnRvIGEgYnVmZmVyLgogKgogKiBUaGUgY2hhcmFjdGVycyBwb2ludGVkIGJ5ICpjcCBhcmUgZW5jb2RlZCBhcyBhbiBhc2NpaSBzdHJpbmcuCiAqIAogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIGFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIGluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSBjcCAgICAgICB0aGUgYXJyYXkgb2YgY2hhcmFjdGVycyB0byBlbmNvZGUuCiAqIEBwYXJhbSBsZW4gICAgICB0aGUgYXJyYXkgbGVuZ3RoIG9mIGNwLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19hc2NpaXN0cmluZyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdV9jaGFyICogY3AsIHNpemVfdCBsZW4pCnsKICAgIGludCAgICAgICAgICAgICBpOwoKICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSBsZW47IGkrKykgewogICAgICAgIGlmIChpc3ByaW50KCpjcCkgfHwgaXNzcGFjZSgqY3ApKSB7CiAgICAgICAgICAgIGlmICgqY3AgPT0gJ1xcJyB8fCAqY3AgPT0gJyInKSB7CiAgICAgICAgICAgICAgICBpZiAoKCpvdXRfbGVuID49ICpidWZfbGVuKSAmJgogICAgICAgICAgICAgICAgICAgICEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICooKmJ1ZiArICgqb3V0X2xlbikrKykgPSAnXFwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoKm91dF9sZW4gPj0gKmJ1Zl9sZW4pICYmCiAgICAgICAgICAgICAgICAhKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAqKCpidWYgKyAoKm91dF9sZW4pKyspID0gKmNwKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCgqb3V0X2xlbiA+PSAqYnVmX2xlbikgJiYKICAgICAgICAgICAgICAgICEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICooKmJ1ZiArICgqb3V0X2xlbikrKykgPSAnLic7CiAgICAgICAgICAgIGNwKys7CiAgICAgICAgfQogICAgfQogICAgaWYgKCgqb3V0X2xlbiA+PSAqYnVmX2xlbikgJiYKICAgICAgICAhKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnXDAnOwogICAgcmV0dXJuIDE7Cn0KCi8qKgogKiBQcmludHMgYW4gb2N0ZXQgc3RyaW5nIGludG8gYSBidWZmZXIuCiAqCiAqIFRoZSB2YXJpYWJsZSB2YXIgaXMgZW5jb2RlZCBhcyBvY3RldCBzdHJpbmcuCiAqIAogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX29jdGV0X3N0cmluZyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywgY29uc3QgY2hhciAqaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgc2F2ZWRfb3V0X2xlbiA9ICpvdXRfbGVuOwogICAgY29uc3QgY2hhciAgICAgKnNhdmVkX2hpbnQgPSBoaW50OwogICAgaW50ICAgICAgICAgICAgIGhleCA9IDAsIHggPSAwOwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgaW50ICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQsIGNudDsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgT0NURVQgU1RSSU5HKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCgogICAgaWYgKGhpbnQpIHsKICAgICAgICBpbnQgICAgICAgICAgICAgcmVwZWF0LCB3aWR0aCA9IDE7CiAgICAgICAgbG9uZyAgICAgICAgICAgIHZhbHVlOwogICAgICAgIGNoYXIgICAgICAgICAgICBjb2RlID0gJ2QnLCBzZXBhciA9IDAsIHRlcm0gPSAwLCBjaCwgaW50YnVmWzMyXTsKI2RlZmluZSBIRVgyRElHSVRfTkVFRF9JTklUIDMKICAgICAgICBjaGFyICAgICAgICAgICAgaGV4MmRpZ2l0ID0gSEVYMkRJR0lUX05FRURfSU5JVDsKICAgICAgICB1X2NoYXIgICAgICAgICAqZWNwOwoKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiU1RSSU5HOiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY3AgPSB2YXItPnZhbC5zdHJpbmc7CiAgICAgICAgZWNwID0gY3AgKyB2YXItPnZhbF9sZW47CgogICAgICAgIHdoaWxlIChjcCA8IGVjcCkgewogICAgICAgICAgICByZXBlYXQgPSAxOwogICAgICAgICAgICBpZiAoKmhpbnQpIHsKICAgICAgICAgICAgICAgIGlmICgqaGludCA9PSAnKicpIHsKICAgICAgICAgICAgICAgICAgICByZXBlYXQgPSAqY3ArKzsKICAgICAgICAgICAgICAgICAgICBoaW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aWR0aCA9IDA7CiAgICAgICAgICAgICAgICB3aGlsZSAoJzAnIDw9ICpoaW50ICYmICpoaW50IDw9ICc5JykKICAgICAgICAgICAgICAgICAgICB3aWR0aCA9ICh3aWR0aCAqIDEwKSArICgqaGludCsrIC0gJzAnKTsKICAgICAgICAgICAgICAgIGNvZGUgPSAqaGludCsrOwogICAgICAgICAgICAgICAgaWYgKChjaCA9ICpoaW50KSAmJiBjaCAhPSAnKicgJiYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQogICAgICAgICAgICAgICAgICAgICYmICh3aWR0aCAhPSAwCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaCAhPSAneCcgJiYgY2ggIT0gJ2QnICYmIGNoICE9ICdvJykpKQogICAgICAgICAgICAgICAgICAgIHNlcGFyID0gKmhpbnQrKzsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBzZXBhciA9IDA7CiAgICAgICAgICAgICAgICBpZiAoKGNoID0gKmhpbnQpICYmIGNoICE9ICcqJyAmJiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCiAgICAgICAgICAgICAgICAgICAgJiYgKHdpZHRoICE9IDAKICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGNoICE9ICd4JyAmJiBjaCAhPSAnZCcgJiYgY2ggIT0gJ28nKSkpCiAgICAgICAgICAgICAgICAgICAgdGVybSA9ICpoaW50Kys7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgdGVybSA9IDA7CiAgICAgICAgICAgICAgICBpZiAod2lkdGggPT0gMCkgIC8qIEhhbmRsZSBtYWxmb3JtZWQgaGludCBzdHJpbmdzICovCiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICB3aGlsZSAocmVwZWF0ICYmIGNwIDwgZWNwKSB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IDA7CiAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSAnYScgJiYgY29kZSAhPSAndCcpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICogMjU2ICsgKmNwKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgICAgICAgICAgICBjYXNlICd4JzoKICAgICAgICAgICAgICAgICAgICBpZiAoSEVYMkRJR0lUX05FRURfSU5JVCA9PSBoZXgyZGlnaXQpCiAgICAgICAgICAgICAgICAgICAgICAgIGhleDJkaWdpdCA9IG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCXzJESUdJVF9IRVhfT1VUUFVUKTsKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIGlmIHZhbHVlIGlzIDwgMTYsIGl0IHdpbGwgYmUgYSBzaW5nbGUgaGV4IGRpZ2l0LiBJZiB0aGUKICAgICAgICAgICAgICAgICAgICAgKiB3aWR0aCBpcyAxICh3ZSBhcmUgb3V0cHV0dGluZyBhIGJ5dGUgYXQgYSB0aW1lKSwgcGF0IGl0CiAgICAgICAgICAgICAgICAgICAgICogdG8gMiBkaWdpdHMgaWYgTkVUU05NUF9EU19MSUJfMkRJR0lUX0hFWF9PVVRQVVQgaXMgc2V0CiAgICAgICAgICAgICAgICAgICAgICogb3IgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWU6CiAgICAgICAgICAgICAgICAgICAgICogIC0gd2UgZG8gbm90IGhhdmUgYSBzZXBhcmF0aW9uIGNoYXJhY3RlcgogICAgICAgICAgICAgICAgICAgICAqICAtIHRoZXJlIGlzIG5vIGhpbnQgbGVmdCAob3IgdGhlcmUgbmV2ZXIgd2FzIGEgaGludCkKICAgICAgICAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICAgICAgICAqIGUuZy4gZm9yIHRoZSBkYXRhIDB4QUEwMUJCLCB3b3VsZCBhbnlvbmUgcmVhbGx5IGV2ZXIKICAgICAgICAgICAgICAgICAgICAgKiB3YW50IHRoZSBzdHJpbmcgIkFBMUJCIj8/CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgaWYgKCgodmFsdWUgPCAxNikgJiYgKDEgPT0gd2lkdGgpKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAoaGV4MmRpZ2l0IHx8ICgoMCA9PSBzZXBhcikgJiYgKDAgPT0gKmhpbnQpKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIwJWx4IiwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJWx4IiwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJWxkIiwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnbyc6CiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlbG8iLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICd0JzogLyogbmV3IGluIHJmYyAzNDExICovCiAgICAgICAgICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgICAgICAgICBjbnQgPSBTTk1QX01JTih3aWR0aCwgZWNwIC0gY3ApOwogICAgICAgICAgICAgICAgICAgIGlmICghc3ByaW50X3JlYWxsb2NfYXNjaWlzdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgY3AsIGNudCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIGNwICs9IGNudDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgKm91dF9sZW4gPSBzYXZlZF9vdXRfbGVuOwogICAgICAgICAgICAgICAgICAgIGlmIChzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihCYWQgaGludCBpZ25vcmVkOiAiKQogICAgICAgICAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCBzYXZlZF9oaW50KQogICAgICAgICAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAiKSAiKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2Nfb2N0ZXRfc3RyaW5nKGJ1ZiwgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGNwIDwgZWNwICYmIHNlcGFyKSB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDEpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSBzZXBhcjsKICAgICAgICAgICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1wwJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcGVhdC0tOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGVybSAmJiBjcCA8IGVjcCkgewogICAgICAgICAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDEpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gdGVybTsKICAgICAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcMCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICh1bml0cykgewogICAgICAgICAgICByZXR1cm4gKHNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgIikKICAgICAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB1bml0cykpOwogICAgICAgIH0KICAgICAgICBpZiAoKCpvdXRfbGVuID49ICpidWZfbGVuKSAmJgogICAgICAgICAgICAhKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnXDAnOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBvdXRwdXRfZm9ybWF0ID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfU1RSSU5HX09VVFBVVF9GT1JNQVQpOwogICAgaWYgKDAgPT0gb3V0cHV0X2Zvcm1hdCkgewogICAgICAgIG91dHB1dF9mb3JtYXQgPSBORVRTTk1QX1NUUklOR19PVVRQVVRfR1VFU1M7CiAgICB9CiAgICBzd2l0Y2ggKG91dHB1dF9mb3JtYXQpIHsKICAgIGNhc2UgTkVUU05NUF9TVFJJTkdfT1VUUFVUX0dVRVNTOgogICAgICAgIGhleCA9IDA7CiAgICAgICAgZm9yIChjcCA9IHZhci0+dmFsLnN0cmluZywgeCA9IDA7IHggPCAoaW50KSB2YXItPnZhbF9sZW47IHgrKywgY3ArKykgewogICAgICAgICAgICBpZiAoIWlzcHJpbnQoKmNwKSAmJiAhaXNzcGFjZSgqY3ApKSB7CiAgICAgICAgICAgICAgICBoZXggPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgTkVUU05NUF9TVFJJTkdfT1VUUFVUX0FTQ0lJOgogICAgICAgIGhleCA9IDA7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBORVRTTk1QX1NUUklOR19PVVRQVVRfSEVYOgogICAgICAgIGhleCA9IDE7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKHZhci0+dmFsX2xlbiA9PSAwKSB7CiAgICAgICAgcmV0dXJuIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIlwiIik7CiAgICB9CgogICAgaWYgKGhleCkgewogICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJIZXgtU1RSSU5HOiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmcsIHZhci0+dmFsX2xlbikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQoKICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIiIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1RSSU5HOiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiIikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICghc3ByaW50X3JlYWxsb2NfYXNjaWlzdHJpbmcKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdmFyLT52YWwuc3RyaW5nLAogICAgICAgICAgICAgdmFyLT52YWxfbGVuKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCIiKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKCi8qKgogKiBQcmludHMgYSBmbG9hdCBpbnRvIGEgYnVmZmVyLgogKgogKiBUaGUgdmFyaWFibGUgdmFyIGlzIGVuY29kZWQgYXMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZS4KICogCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfZmxvYXQodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9PUEFRVUVfRkxPQVQpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBGbG9hdCk6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiT3BhcXVlOiBGbG9hdDogIikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKCiAgICAvKgogICAgICogSG93IG11Y2ggc3BhY2UgbmVlZGVkIGZvciBtYXguIGxlbmd0aCBmbG9hdD8gIDEyOCBpcyBvdmVya2lsbC4gIAogICAgICovCgogICAgd2hpbGUgKCgqb3V0X2xlbiArIDEyOCArIDEpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICIlZiIsICp2YXItPnZhbC5mbG9hdFZhbCk7CiAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwoKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhIGRvdWJsZSBpbnRvIGEgYnVmZmVyLgogKgogKiBUaGUgdmFyaWFibGUgdmFyIGlzIGVuY29kZWQgYXMgYSBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlLgogKiAKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19kb3VibGUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgaWYgKHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0RPVUJMRSkgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIERvdWJsZSk6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiT3BhcXVlOiBGbG9hdDogIikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiBIb3cgbXVjaCBzcGFjZSBuZWVkZWQgZm9yIG1heC4gbGVuZ3RoIGRvdWJsZT8gIDEyOCBpcyBvdmVya2lsbC4gIAogICAgICovCgogICAgd2hpbGUgKCgqb3V0X2xlbiArIDEyOCArIDEpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICIlZiIsICp2YXItPnZhbC5kb3VibGVWYWwpOwogICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUyAqLwoKCi8qKgogKiBQcmludHMgYSBjb3VudGVyIGludG8gYSBidWZmZXIuCiAqCiAqIFRoZSB2YXJpYWJsZSB2YXIgaXMgZW5jb2RlZCBhcyBhIGNvdW50ZXIgdmFsdWUuCiAqIAogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2NvdW50ZXI2NCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAgYTY0YnVmW0k2NENIQVJTWiArIDFdOwoKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX0NPVU5URVI2NAojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfQ09VTlRFUjY0CiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfSTY0ICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX1U2NAojZW5kaWYKICAgICAgICApIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBDb3VudGVyNjQpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgICAgICBpZiAodmFyLT50eXBlICE9IEFTTl9DT1VOVEVSNjQpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJPcGFxdWU6ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KI2VuZGlmCiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgICAgICBzd2l0Y2ggKHZhci0+dHlwZSkgewogICAgICAgIGNhc2UgQVNOX09QQVFVRV9VNjQ6CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiVUludDY0OiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBU05fT1BBUVVFX0k2NDoKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJJbnQ2NDogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQVNOX0NPVU5URVI2NDoKICAgICAgICBjYXNlIEFTTl9PUEFRVUVfQ09VTlRFUjY0OgojZW5kaWYKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJDb3VudGVyNjQ6ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICAgICAgfQojZW5kaWYKICAgIH0KI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgaWYgKHZhci0+dHlwZSA9PSBBU05fT1BBUVVFX0k2NCkgewogICAgICAgIHByaW50STY0KGE2NGJ1ZiwgdmFyLT52YWwuY291bnRlcjY0KTsKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGE2NGJ1ZikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKI2VuZGlmCiAgICAgICAgcHJpbnRVNjQoYTY0YnVmLCB2YXItPnZhbC5jb3VudGVyNjQpOwogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgYTY0YnVmKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIH0KI2VuZGlmCgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGFuIG9iamVjdCBpZGVudGlmaWVyIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2Nfb3BhcXVlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX09QQVFVRQojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfQ09VTlRFUjY0CiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfVTY0CiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfSTY0CiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfRkxPQVQgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfRE9VQkxFCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTICovCiAgICAgICAgKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgT3BhcXVlKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgc3dpdGNoICh2YXItPnR5cGUpIHsKICAgIGNhc2UgQVNOX09QQVFVRV9DT1VOVEVSNjQ6CiAgICBjYXNlIEFTTl9PUEFRVUVfVTY0OgogICAgY2FzZSBBU05fT1BBUVVFX0k2NDoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfY291bnRlcjY0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT1BBUVVFX0ZMT0FUOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19mbG9hdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PUEFRVUVfRE9VQkxFOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19kb3VibGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX09QQVFVRToKI2VuZGlmCiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJPUEFRVUU6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX2hleHN0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nLCB2YXItPnZhbF9sZW4pKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgfQojZW5kaWYKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYW4gb2JqZWN0IGlkZW50aWZpZXIgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19vYmplY3RfaWRlbnRpZmllcih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGludCAgICAgICAgICAgICBidWZfb3ZlcmZsb3cgPSAwOwoKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX09CSkVDVF9JRCkgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE9CSkVDVCBJREVOVElGSUVSKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJPSUQ6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIG5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2lkICopICh2YXItPnZhbC5vYmppZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWxfbGVuIC8gc2l6ZW9mKG9pZCkpOwoKICAgIGlmIChidWZfb3ZlcmZsb3cpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgoKLyoqCiAqIFByaW50cyBhIHRpbWV0aWNrIHZhcmlhYmxlIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfdGltZXRpY2tzKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICB0aW1lYnVmWzQwXTsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9USU1FVElDS1MpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBUaW1ldGlja3MpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9OVU1FUklDX1RJTUVUSUNLUykpIHsKICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICBzcHJpbnRmKHN0ciwgIiVsdSIsICoodV9sb25nICopIHZhci0+dmFsLmludGVnZXIpOwogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgIHNwcmludGYoc3RyLCAiVGltZXRpY2tzOiAoJWx1KSAiLCAqKHVfbG9uZyAqKSB2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICB1cHRpbWVTdHJpbmcoKih1X2xvbmcgKikgKHZhci0+dmFsLmludGVnZXIpLCB0aW1lYnVmLCBzaXplb2YodGltZWJ1ZikpOwogICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgdGltZWJ1ZikpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYW4gaW50ZWdlciBhY2NvcmRpbmcgdG8gdGhlIGhpbnQgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFsICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGRlY2ltYWx0eXBlICdkJyBvciAndScgZGVwZW5kaW5nIG9uIGludGVnZXIgdHlwZQogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IF9OT1RfIGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19oaW50ZWRfaW50ZWdlcih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB2YWwsIGNvbnN0IGNoYXIgZGVjaW1hbHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAgZm10WzEwXSA9ICIlbEAiLCB0bXBbMjU2XTsKICAgIGludCAgICAgICAgICAgICBzaGlmdCA9IDAsIGxlbiwgbmVnYXRpdmUgPSAwOwoKICAgIGlmIChoaW50WzBdID09ICdkJykgewogICAgICAgIC8qCiAgICAgICAgICogV2UgbWlnaHQgKmFjdHVhbGx5KiB3YW50IGEgJ3UnIGhlcmUuICAKICAgICAgICAgKi8KICAgICAgICBpZiAoaGludFsxXSA9PSAnLScpCiAgICAgICAgICAgIHNoaWZ0ID0gYXRvaShoaW50ICsgMik7CiAgICAgICAgZm10WzJdID0gZGVjaW1hbHR5cGU7CiAgICAgICAgaWYgKHZhbCA8IDApIHsKICAgICAgICAgICAgbmVnYXRpdmUgPSAxOwogICAgICAgICAgICB2YWwgPSAtdmFsOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAgICAgICAgKiBESVNQTEFZLUhJTlQgY2hhcmFjdGVyIGlzICdiJywgJ28nLCBvciAneCcuICAKICAgICAgICAgKi8KICAgICAgICBmbXRbMl0gPSBoaW50WzBdOwogICAgfQoKICAgIGlmIChoaW50WzBdID09ICdiJykgewoJdW5zaWduZWQgbG9uZyBpbnQgYml0ID0gMHg4MDAwMDAwMExVOwoJY2hhciAqYnAgPSB0bXA7Cgl3aGlsZSAoYml0KSB7CgkgICAgKmJwKysgPSB2YWwgJiBiaXQgPyAnMScgOiAnMCc7CgkgICAgYml0ID4+PSAxOwoJfQoJKmJwID0gMDsKICAgIH0KICAgIGVsc2UKCXNwcmludGYodG1wLCBmbXQsIHZhbCk7CgogICAgaWYgKHNoaWZ0ICE9IDApIHsKICAgICAgICBsZW4gPSBzdHJsZW4odG1wKTsKICAgICAgICBpZiAoc2hpZnQgPD0gbGVuKSB7CiAgICAgICAgICAgIHRtcFtsZW4gKyAxXSA9IDA7CiAgICAgICAgICAgIHdoaWxlIChzaGlmdC0tKSB7CiAgICAgICAgICAgICAgICB0bXBbbGVuXSA9IHRtcFtsZW4gLSAxXTsKICAgICAgICAgICAgICAgIGxlbi0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRtcFtsZW5dID0gJy4nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRtcFtzaGlmdCArIDFdID0gMDsKICAgICAgICAgICAgd2hpbGUgKHNoaWZ0KSB7CiAgICAgICAgICAgICAgICBpZiAobGVuLS0gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdG1wW3NoaWZ0XSA9IHRtcFtsZW5dOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0bXBbc2hpZnRdID0gJzAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2hpZnQtLTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0bXBbMF0gPSAnLic7CiAgICAgICAgfQogICAgfQogICAgaWYgKG5lZ2F0aXZlKSB7CiAgICAgICAgbGVuID0gc3RybGVuKHRtcCkrMTsKICAgICAgICB3aGlsZSAobGVuKSB7CiAgICAgICAgICAgIHRtcFtsZW5dID0gdG1wW2xlbi0xXTsKICAgICAgICAgICAgbGVuLS07CiAgICAgICAgfQogICAgICAgIHRtcFswXSA9ICctJzsKICAgIH0KICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICh1X2NoYXIgKil0bXApOwp9CgoKLyoqCiAqIFByaW50cyBhbiBpbnRlZ2VyIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfaW50ZWdlcih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgY2hhciAgICAgICAgICAgKmVudW1fc3RyaW5nID0gTlVMTDsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgSU5URUdFUik6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBmb3IgKDsgZW51bXM7IGVudW1zID0gZW51bXMtPm5leHQpIHsKICAgICAgICBpZiAoZW51bXMtPnZhbHVlID09ICp2YXItPnZhbC5pbnRlZ2VyKSB7CiAgICAgICAgICAgIGVudW1fc3RyaW5nID0gZW51bXMtPmxhYmVsOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJJTlRFR0VSOiAiKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGVudW1fc3RyaW5nID09IE5VTEwgfHwKICAgICAgICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfTlVNRVJJQ19FTlVNKSkgewogICAgICAgIGlmIChoaW50KSB7CiAgICAgICAgICAgIGlmICghKHNwcmludF9yZWFsbG9jX2hpbnRlZF9pbnRlZ2VyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhci0+dmFsLmludGVnZXIsICdkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludCwgdW5pdHMpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlbGQiLCAqdmFyLT52YWwuaW50ZWdlcik7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgZW51bV9zdHJpbmcpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgc3ByaW50ZihzdHIsICIoJWxkKSIsICp2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGVudW1fc3RyaW5nKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYW4gdW5zaWduZWQgaW50ZWdlciBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX3VpbnRlZ2VyKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgY2hhciAgICAgICAgICAgKmVudW1fc3RyaW5nID0gTlVMTDsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9VSU5URUdFUikgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIFVJbnRlZ2VyMzIpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgogICAgZm9yICg7IGVudW1zOyBlbnVtcyA9IGVudW1zLT5uZXh0KSB7CiAgICAgICAgaWYgKGVudW1zLT52YWx1ZSA9PSAqdmFyLT52YWwuaW50ZWdlcikgewogICAgICAgICAgICBlbnVtX3N0cmluZyA9IGVudW1zLT5sYWJlbDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChlbnVtX3N0cmluZyA9PSBOVUxMIHx8CiAgICAgICAgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX05VTUVSSUNfRU5VTSkpIHsKICAgICAgICBpZiAoaGludCkgewogICAgICAgICAgICBpZiAoIShzcHJpbnRfcmVhbGxvY19oaW50ZWRfaW50ZWdlcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YXItPnZhbC5pbnRlZ2VyLCAndScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQsIHVuaXRzKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJWx1IiwgKnZhci0+dmFsLmludGVnZXIpOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGVudW1fc3RyaW5nKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgIHNwcmludGYoc3RyLCAiKCVsdSkiLCAqdmFyLT52YWwuaW50ZWdlcik7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBlbnVtX3N0cmluZykpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGEgZ2F1Z2UgdmFsdWUgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19nYXVnZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICB0bXBbMzJdOwoKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX0dBVUdFKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgR2F1Z2UzMiBvciBVbnNpZ25lZDMyKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJHYXVnZTMyOiAiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIGlmIChoaW50KSB7CiAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19oaW50ZWRfaW50ZWdlcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhci0+dmFsLmludGVnZXIsICd1JywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIHNwcmludGYodG1wLCAiJXUiLCAodW5zaWduZWQgaW50KSgqdmFyLT52YWwuaW50ZWdlciAmIDB4ZmZmZmZmZmYpKTsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgdG1wKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGEgY291bnRlciB2YWx1ZSBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2NvdW50ZXIodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICB0bXBbMzJdOwoKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX0NPVU5URVIpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBDb3VudGVyMzIpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIkNvdW50ZXIzMjogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBzcHJpbnRmKHRtcCwgIiV1IiwgKHVuc2lnbmVkIGludCkoKnZhci0+dmFsLmludGVnZXIgJiAweGZmZmZmZmZmKSk7CiAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSB0bXApKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGEgbmV0d29yayBhZGRyZXNzIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfbmV0d29ya2FkZHJlc3ModV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsIGNvbnN0IGNoYXIgKmhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgaTsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9JUEFERFJFU1MpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBOZXR3b3JrQWRkcmVzcyk6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiTmV0d29yayBBZGRyZXNzOiAiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgKHZhci0+dmFsX2xlbiAqIDMpICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8IHZhci0+dmFsX2xlbjsgaSsrKSB7CiAgICAgICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgIiUwMlgiLCB2YXItPnZhbC5zdHJpbmdbaV0pOwogICAgICAgICpvdXRfbGVuICs9IDI7CiAgICAgICAgaWYgKGkgPCB2YXItPnZhbF9sZW4gLSAxKSB7CiAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICc6JzsKICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhbiBpcC1hZGRyZXNzIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfaXBhZGRyZXNzKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHVfY2hhciAgICAgICAgICppcCA9IHZhci0+dmFsLnN0cmluZzsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9JUEFERFJFU1MpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBJcEFkZHJlc3MpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIklwQWRkcmVzczogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICB3aGlsZSAoKCpvdXRfbGVuICsgMTcpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgaWYgKGlwKQogICAgICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICIlZC4lZC4lZC4lZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBbMF0sIGlwWzFdLCBpcFsyXSwgaXBbM10pOwogICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhIG51bGwgdmFsdWUgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19udWxsKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiTlVMTCI7CgogICAgaWYgKHZhci0+dHlwZSAhPSBBU05fTlVMTCkgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE5VTEwpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgogICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKTsKfQoKCi8qKgogKiBQcmludHMgYSBiaXQgc3RyaW5nIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfYml0c3RyaW5nKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGludCAgICAgICAgICAgICBsZW4sIGJpdDsKICAgIHVfY2hhciAgICAgICAgICpjcDsKICAgIGNoYXIgICAgICAgICAgICplbnVtX3N0cmluZzsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9CSVRfU1RSICYmIHZhci0+dHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgQklUUyk6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJcIiI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiQklUUzogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBpZiAoIXNwcmludF9yZWFsbG9jX2hleHN0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5iaXRzdHJpbmcsIHZhci0+dmFsX2xlbikpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJcIiI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBjcCA9IHZhci0+dmFsLmJpdHN0cmluZzsKICAgICAgICBmb3IgKGxlbiA9IDA7IGxlbiA8IChpbnQpIHZhci0+dmFsX2xlbjsgbGVuKyspIHsKICAgICAgICAgICAgZm9yIChiaXQgPSAwOyBiaXQgPCA4OyBiaXQrKykgewogICAgICAgICAgICAgICAgaWYgKCpjcCAmICgweDgwID4+IGJpdCkpIHsKICAgICAgICAgICAgICAgICAgICBlbnVtX3N0cmluZyA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgZm9yICg7IGVudW1zOyBlbnVtcyA9IGVudW1zLT5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnVtcy0+dmFsdWUgPT0gKGxlbiAqIDgpICsgYml0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtX3N0cmluZyA9IGVudW1zLT5sYWJlbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChlbnVtX3N0cmluZyA9PSBOVUxMIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9QUklOVF9OVU1FUklDX0VOVU0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVkICIsIChsZW4gKiA4KSArIGJpdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiglZCkgIiwgKGxlbiAqIDgpICsgYml0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGVudW1fc3RyaW5nKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNwKys7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCmludApzcHJpbnRfcmVhbGxvY19uc2FwYWRkcmVzcyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywgY29uc3QgY2hhciAqaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX05TQVApIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBOc2FwQWRkcmVzcyk6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiTnNhcEFkZHJlc3M6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19oZXhzdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmcsIHZhci0+dmFsX2xlbik7Cn0KCgovKioKICogRmFsbGJhY2sgcm91dGluZSBmb3IgYSBiYWQgdHlwZSwgcHJpbnRzICJWYXJpYWJsZSBoYXMgYmFkIHR5cGUiIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfYmFkdHlwZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIlZhcmlhYmxlIGhhcyBiYWQgdHlwZSI7CgogICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKTsKfQoKCgovKioKICogVW5pdmVyc2FsIHByaW50IHJvdXRpbmUsIHByaW50cyBhIHZhcmlhYmxlIGludG8gYSBidWZmZXIgYWNjb3JkaW5nIHRvIHRoZSB2YXJpYWJsZSAKICogdHlwZS4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19ieV90eXBlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBERUJVR01TR1RMKCgib3V0cHV0IiwgInNwcmludF9ieV90eXBlLCB0eXBlICVkXG4iLCB2YXItPnR5cGUpKTsKCiAgICBzd2l0Y2ggKHZhci0+dHlwZSkgewogICAgY2FzZSBBU05fSU5URUdFUjoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfaW50ZWdlcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fT0NURVRfU1RSOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19vY3RldF9zdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgIGNhc2UgQVNOX0JJVF9TVFI6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2JpdHN0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgY2FzZSBBU05fT1BBUVVFOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19vcGFxdWUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fT0JKRUNUX0lEOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19vYmplY3RfaWRlbnRpZmllcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQsIHVuaXRzKTsKICAgIGNhc2UgQVNOX1RJTUVUSUNLUzoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfdGltZXRpY2tzKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICBjYXNlIEFTTl9HQVVHRToKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfZ2F1Z2UoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9DT1VOVEVSOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19jb3VudGVyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9JUEFERFJFU1M6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2lwYWRkcmVzcyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgY2FzZSBBU05fTlVMTDoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfbnVsbChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fVUlOVEVHRVI6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX3VpbnRlZ2VyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgY2FzZSBBU05fQ09VTlRFUjY0OgojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICBjYXNlIEFTTl9PUEFRVUVfVTY0OgogICAgY2FzZSBBU05fT1BBUVVFX0k2NDoKICAgIGNhc2UgQVNOX09QQVFVRV9DT1VOVEVSNjQ6CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTICovCiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2NvdW50ZXI2NChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICBjYXNlIEFTTl9PUEFRVUVfRkxPQVQ6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2Zsb2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fT1BBUVVFX0RPVUJMRToKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfZG91YmxlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMgKi8KICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNwcmludF9ieV90eXBlIiwgImJhZCB0eXBlOiAlZFxuIiwgdmFyLT50eXBlKSk7CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2JhZHR5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgIH0KfQoKCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCi8qKgogKiBSZXRyaWV2ZXMgdGhlIHRyZWUgaGVhZC4KICoKICogQHJldHVybiB0aGUgdHJlZSBoZWFkLgogKi8Kc3RydWN0IHRyZWUgICAgKgpnZXRfdHJlZV9oZWFkKHZvaWQpCnsKICAgIHJldHVybiAodHJlZV9oZWFkKTsKfQoKc3RhdGljIGNoYXIgICAgKmNvbmZtaWJkaXIgPSBOVUxMOwpzdGF0aWMgY2hhciAgICAqY29uZm1pYnMgPSBOVUxMOwoKc3RhdGljIHZvaWQKaGFuZGxlX21pYmRpcnNfY29uZihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSkKewogICAgY2hhciAgICAgICAgICAgKmN0bXA7CgogICAgaWYgKGNvbmZtaWJkaXIpIHsKICAgICAgICBpZiAoKCpsaW5lID09ICcrJykgfHwgKCpsaW5lID09ICctJykpIHsKICAgICAgICAgICAgY3RtcCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oY29uZm1pYmRpcikgKyBzdHJsZW4obGluZSkgKyAyKTsKICAgICAgICAgICAgaWYgKCFjdG1wKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWliZGlyIGNvbmYgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZigqbGluZSsrID09ICcrJykKICAgICAgICAgICAgICAgIHNwcmludGYoY3RtcCwgIiVzJWMlcyIsIGNvbmZtaWJkaXIsIEVOVl9TRVBBUkFUT1JfQ0hBUiwgbGluZSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHNwcmludGYoY3RtcCwgIiVzJWMlcyIsIGxpbmUsIEVOVl9TRVBBUkFUT1JfQ0hBUiwgY29uZm1pYmRpcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY3RtcCA9IHN0cmR1cChsaW5lKTsKICAgICAgICAgICAgaWYgKCFjdG1wKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJtaWJzIGNvbmYgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBTTk1QX0ZSRUUoY29uZm1pYmRpcik7CiAgICB9IGVsc2UgewogICAgICAgIGN0bXAgPSBzdHJkdXAobGluZSk7CiAgICAgICAgaWYgKCFjdG1wKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgIm1pYnMgY29uZiBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgY29uZm1pYmRpciA9IGN0bXA7CiAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJ1c2luZyBtaWJkaXJzOiAlc1xuIiwgY29uZm1pYmRpcikpOwp9CgpzdGF0aWMgdm9pZApoYW5kbGVfbWlic19jb25mKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKQp7CiAgICBjaGFyICAgICAgICAgICAqY3RtcDsKCiAgICBpZiAoY29uZm1pYnMpIHsKICAgICAgICBpZiAoKCpsaW5lID09ICcrJykgfHwgKCpsaW5lID09ICctJykpIHsKICAgICAgICAgICAgY3RtcCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oY29uZm1pYnMpICsgc3RybGVuKGxpbmUpICsgMik7CiAgICAgICAgICAgIGlmICghY3RtcCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAibWlicyBjb25mIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoKmxpbmUrKyA9PSAnKycpCiAgICAgICAgICAgICAgICBzcHJpbnRmKGN0bXAsICIlcyVjJXMiLCBjb25mbWlicywgRU5WX1NFUEFSQVRPUl9DSEFSLCBsaW5lKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc3ByaW50ZihjdG1wLCAiJXMlYyVzIiwgbGluZSwgRU5WX1NFUEFSQVRPUl9DSEFSLCBjb25mbWliZGlyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjdG1wID0gc3RyZHVwKGxpbmUpOwogICAgICAgICAgICBpZiAoIWN0bXApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgIm1pYnMgY29uZiBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIFNOTVBfRlJFRShjb25mbWlicyk7CiAgICB9IGVsc2UgewogICAgICAgIGN0bXAgPSBzdHJkdXAobGluZSk7CiAgICAgICAgaWYgKCFjdG1wKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgIm1pYnMgY29uZiBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgY29uZm1pYnMgPSBjdG1wOwogICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAidXNpbmcgbWliczogJXNcbiIsIGNvbmZtaWJzKSk7Cn0KCgpzdGF0aWMgdm9pZApoYW5kbGVfbWliZmlsZV9jb25mKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKQp7CiAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJyZWFkaW5nIG1pYmZpbGU6ICVzXG4iLCBsaW5lKSk7CiAgICByZWFkX21pYihsaW5lKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkCmhhbmRsZV9wcmludF9udW1lcmljKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKQp7CiAgICBjb25zdCBjaGFyICp2YWx1ZTsKICAgIGNoYXIgICAgICAgKnN0OwoKICAgIHZhbHVlID0gc3RydG9rX3IobGluZSwgIiBcdFxuIiwgJnN0KTsKICAgIGlmICh2YWx1ZSAmJiAoCgkgICAgKHN0cmNhc2VjbXAodmFsdWUsICJ5ZXMiKSAgPT0gMCkgfHwgCgkgICAgKHN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikgPT0gMCkgfHwKCSAgICAoKnZhbHVlID09ICcxJykgKSkgewoKICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQyk7CiAgICB9Cn0KCmNoYXIgICAgICAgICAgICoKc25tcF9vdXRfdG9nZ2xlX29wdGlvbnMoY2hhciAqb3B0aW9ucykKewogICAgd2hpbGUgKCpvcHRpb25zKSB7CiAgICAgICAgc3dpdGNoICgqb3B0aW9ucysrKSB7CiAgICAgICAgY2FzZSAnMCc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCXzJESUdJVF9IRVhfT1VUUFVUKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1NUUklOR19PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX1NUUklOR19PVVRQVVRfQVNDSUkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdiJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfQlJFQUtET1dOX09JRFMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX05VTUVSSUNfRU5VTSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ0UnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVNDQVBFX1FVT1RFUyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2YnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9PSURfT1VUUFVUX0ZVTEwpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICduJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1EnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5ULCAxKTsKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX09JRF9PVVRQVVRfU1VGRklYKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnUyc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX09JRF9PVVRQVVRfTU9EVUxFKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAndCc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9OVU1FUklDX1RJTUVUSUNLUyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1QnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfSEVYX1RFWFQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd1JzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfT0lEX09VVFBVVF9VQ0QpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdVJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfUFJJTlRfVU5JVFMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd2JzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX0JBUkVfVkFMVUUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd4JzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfU1RSSU5HX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfU1RSSU5HX09VVFBVVF9IRVgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdYJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VYVEVOREVEX0lOREVYKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMgLSAxOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBOVUxMOwp9Cgp2b2lkCnNubXBfb3V0X3RvZ2dsZV9vcHRpb25zX3VzYWdlKGNvbnN0IGNoYXIgKmxlYWQsIEZJTEUgKiBvdXRmKQp7CiAgICBmcHJpbnRmKG91dGYsICIlczA6ICBwcmludCBsZWFkaW5nIDAgZm9yIHNpbmdsZS1kaWdpdCBoZXggY2hhcmFjdGVyc1xuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc2E6ICBwcmludCBhbGwgc3RyaW5ncyBpbiBhc2NpaSBmb3JtYXRcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNiOiAgZG8gbm90IGJyZWFrIE9JRCBpbmRleGVzIGRvd25cbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNlOiAgcHJpbnQgZW51bXMgbnVtZXJpY2FsbHlcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNFOiAgZXNjYXBlIHF1b3RlcyBpbiBzdHJpbmcgaW5kaWNlc1xuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc2Y6ICBwcmludCBmdWxsIE9JRHMgb24gb3V0cHV0XG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzbjogIHByaW50IE9JRHMgbnVtZXJpY2FsbHlcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNxOiAgcXVpY2sgcHJpbnQgZm9yIGVhc2llciBwYXJzaW5nXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzUTogIHF1aWNrIHByaW50IHdpdGggZXF1YWwtc2lnbnNcbiIsIGxlYWQpOyAgICAvKiBAQEpEVyAqLwogICAgZnByaW50ZihvdXRmLCAiJXNzOiAgcHJpbnQgb25seSBsYXN0IHN5bWJvbGljIGVsZW1lbnQgb2YgT0lEXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzUzogIHByaW50IE1JQiBtb2R1bGUtaWQgcGx1cyBsYXN0IGVsZW1lbnRcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXN0OiAgcHJpbnQgdGltZXRpY2tzIHVucGFyc2VkIGFzIG51bWVyaWMgaW50ZWdlcnNcbiIsCiAgICAgICAgICAgIGxlYWQpOwogICAgZnByaW50ZihvdXRmLAogICAgICAgICAgICAiJXNUOiAgcHJpbnQgaHVtYW4tcmVhZGFibGUgdGV4dCBhbG9uZyB3aXRoIGhleCBzdHJpbmdzXG4iLAogICAgICAgICAgICBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzdTogIHByaW50IE9JRHMgdXNpbmcgVUNELXN0eWxlIHByZWZpeCBzdXBwcmVzc2lvblxuIiwKICAgICAgICAgICAgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc1U6ICBkb24ndCBwcmludCB1bml0c1xuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc3Y6ICBwcmludCB2YWx1ZXMgb25seSAobm90IE9JRCA9IHZhbHVlKVxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc3g6ICBwcmludCBhbGwgc3RyaW5ncyBpbiBoZXggZm9ybWF0XG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzWDogIGV4dGVuZGVkIGluZGV4IGZvcm1hdFxuIiwgbGVhZCk7Cn0KCmNoYXIgKgpzbm1wX2luX29wdGlvbnMoY2hhciAqb3B0YXJnLCBpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YpCnsKICAgIGNoYXIgKmNwOwoKICAgIGZvciAoY3AgPSBvcHRhcmc7ICpjcDsgY3ArKykgewogICAgICAgIHN3aXRjaCAoKmNwKSB7CiAgICAgICAgY2FzZSAnYic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9SRUdFWF9BQ0NFU1MpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdSJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1JBTkRPTV9BQ0NFU1MpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdyJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfQ0hFQ0tfUkFOR0UpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX05PX0RJU1BMQVlfSElOVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3UnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUkVBRF9VQ0RfU1RZTEVfT0lEKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgIC8qIFdoYXQgaWYgYXJnYy9hcmd2IGFyZSBudWxsID8gKi8KICAgICAgICAgICAgaWYgKCEqKCsrY3ApKQogICAgICAgICAgICAgICAgY3AgPSBhcmd2W29wdGluZCsrXTsKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX09JRFNVRkZJWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgICAgIGNhc2UgJ1MnOgogICAgICAgICAgICAvKiBXaGF0IGlmIGFyZ2MvYXJndiBhcmUgbnVsbCA/ICovCiAgICAgICAgICAgIGlmICghKigrK2NwKSkKICAgICAgICAgICAgICAgIGNwID0gYXJndltvcHRpbmQrK107CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9PSURQUkVGSVgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcCk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIC8qCiAgICAgICAgICAgICogIEhlcmU/ICBPciBpbiBzbm1wX3BhcnNlX2FyZ3M/CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJVbmtub3duIGlucHV0IG9wdGlvbiBwYXNzZWQgdG8gLUk6ICVjLlxuIiwgKmNwKTsKICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmV0dXJuIGNwOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgpjaGFyICAgICAgICAgICAqCnNubXBfaW5fdG9nZ2xlX29wdGlvbnMoY2hhciAqb3B0aW9ucykKewogICAgcmV0dXJuIHNubXBfaW5fb3B0aW9ucyggb3B0aW9ucywgMCwgTlVMTCApOwp9CgoKLyoqCiAqIFByaW50cyBvdXQgYSBoZWxwIHVzYWdlIGZvciB0aGUgaW4qIHRvZ2dsZSBvcHRpb25zLgogKgogKiBAcGFyYW0gbGVhZCAgICAgIFRoZSBsZWFkIHRvIHByaW50IGZvciBldmVyeSBsaW5lLgogKiBAcGFyYW0gb3V0ZiAgICAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gd3JpdGUgdG8uCiAqIAogKi8Kdm9pZApzbm1wX2luX3RvZ2dsZV9vcHRpb25zX3VzYWdlKGNvbnN0IGNoYXIgKmxlYWQsIEZJTEUgKiBvdXRmKQp7CiAgICBmcHJpbnRmKG91dGYsICIlc2I6ICBkbyBiZXN0L3JlZ2V4IG1hdGNoaW5nIHRvIGZpbmQgYSBNSUIgbm9kZVxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc2g6ICBkb24ndCBhcHBseSBESVNQTEFZLUhJTlRzXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzcjogIGRvIG5vdCBjaGVjayB2YWx1ZXMgZm9yIHJhbmdlL3R5cGUgbGVnYWxpdHlcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNSOiAgZG8gcmFuZG9tIGFjY2VzcyB0byBPSUQgbGFiZWxzXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwKICAgICAgICAgICAgIiVzdTogIHRvcC1sZXZlbCBPSURzIG11c3QgaGF2ZSAnLicgcHJlZml4IChVQ0Qtc3R5bGUpXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwKICAgICAgICAgICAgIiVzcyBTVUZGSVg6ICBBcHBlbmQgYWxsIHRleHR1YWwgT0lEcyB3aXRoIFNVRkZJWCBiZWZvcmUgcGFyc2luZ1xuIiwKICAgICAgICAgICAgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsCiAgICAgICAgICAgICIlc1MgUFJFRklYOiAgUHJlcGVuZCBhbGwgdGV4dHVhbCBPSURzIHdpdGggUFJFRklYIGJlZm9yZSBwYXJzaW5nXG4iLAogICAgICAgICAgICBsZWFkKTsKfQoKLyoqKgogKgogKi8gCnZvaWQKcmVnaXN0ZXJfbWliX2hhbmRsZXJzKHZvaWQpCnsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIHJlZ2lzdGVyX3ByZW5ldHNubXBfbWliX2hhbmRsZXIoInNubXAiLCAibWliZGlycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9taWJkaXJzX2NvbmYsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbbWliLWRpcnN8K21pYi1kaXJzfC1taWItZGlyc10iKTsKICAgIHJlZ2lzdGVyX3ByZW5ldHNubXBfbWliX2hhbmRsZXIoInNubXAiLCAibWlicyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9taWJzX2NvbmYsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbbWliLXRva2Vuc3wrbWliLXRva2Vuc10iKTsKICAgIHJlZ2lzdGVyX2NvbmZpZ19oYW5kbGVyKCJzbm1wIiwgIm1pYmZpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX21pYmZpbGVfY29uZiwgTlVMTCwgIm1pYmZpbGUtdG8tcmVhZCIpOwogICAgLyoKICAgICAqIHJlZ2lzdGVyIHRoZSBzbm1wLmNvbmYgY29uZmlndXJhdGlvbiBoYW5kbGVycyBmb3IgZGVmYXVsdAogICAgICogcGFyc2luZyBiZWhhdmlvdXIgCiAgICAgKi8KCiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAic2hvd01pYkVycm9ycyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfRVJST1JTKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJjb21tZW50VG9FT0wiLCAgICAgLyogRGVzY3JpYmVzIGFjdHVhbCBiZWhhdmlvdXIgKi8KICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQl9DT01NRU5UX1RFUk0pOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgInN0cmljdENvbW1lbnRUZXJtIiwgICAgLyogQmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCX0NPTU1FTlRfVEVSTSk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAibWliQWxsb3dVbmRlcmxpbmUiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCX1BBUlNFX0xBQkVMKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9JTlRFR0VSLCAic25tcCIsICJtaWJXYXJuaW5nTGV2ZWwiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJtaWJSZXBsYWNlV2l0aExhdGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfUkVQTEFDRSk7CiNlbmRpZgoKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJwcmludE51bWVyaWNFbnVtcyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9OVU1FUklDX0VOVU0pOwogICAgcmVnaXN0ZXJfcHJlbmV0c25tcF9taWJfaGFuZGxlcigic25tcCIsICJwcmludE51bWVyaWNPaWRzIiwKICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfcHJpbnRfbnVtZXJpYywgTlVMTCwgIigxfHllc3x0cnVlfDB8bm98ZmFsc2UpIik7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAiZXNjYXBlUXVvdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VTQ0FQRV9RVU9URVMpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgImRvbnRCcmVha2Rvd25PaWRzIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfQlJFQUtET1dOX09JRFMpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgInF1aWNrUHJpbnRpbmciLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgIm51bWVyaWNUaW1ldGlja3MiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTlVNRVJJQ19USU1FVElDS1MpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0lOVEVHRVIsICJzbm1wIiwgIm9pZE91dHB1dEZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fSU5URUdFUiwgInNubXAiLCAic3VmZml4UHJpbnRpbmciLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgImV4dGVuZGVkSW5kZXgiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVhURU5ERURfSU5ERVgpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgInByaW50SGV4VGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9IRVhfVEVYVCk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAicHJpbnRWYWx1ZU9ubHkiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfQkFSRV9WQUxVRSk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAiZG9udFByaW50VW5pdHMiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9QUklOVF9VTklUUyk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fSU5URUdFUiwgInNubXAiLCAiaGV4T3V0cHV0TGVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0hFWF9PVVRQVVRfTEVOR1RIKTsKfQoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKLyoKICogZnVuY3Rpb24gOiBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5CiAqICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHN0cmluZyBvZiB0aGUgZGlyZWN0b3JpZXMKICogICAgICAgICAgICAgIGZyb20gd2hpY2ggdGhlIE1JQiBtb2R1bGVzIHdpbGwgYmUgc2VhcmNoZWQgb3IKICogICAgICAgICAgICAgIGxvYWRlZC4KICogYXJndW1lbnRzOiBjb25zdCBjaGFyICpkaXIsIHdoaWNoIGFyZSB0aGUgZGlyZWN0b3JpZXMKICogICAgICAgICAgICAgIGZyb20gd2hpY2ggdGhlIE1JQiBtb2R1bGVzIHdpbGwgYmUgc2VhcmNoZWQgb3IKICogICAgICAgICAgICAgIGxvYWRlZC4KICogcmV0dXJucyAgOiAtCiAqLwp2b2lkCm5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoY29uc3QgY2hhciAqZGlyKQp7CiAgICBjb25zdCBjaGFyICpuZXdkaXI7CiAgICBjaGFyICpvbGRkaXIsICp0bXBkaXIgPSBOVUxMOwoKICAgIERFQlVHVFJBQ0U7CiAgICBpZiAoTlVMTCA9PSBkaXIpIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAKICAgIG9sZGRpciA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCgkJCQkgICBORVRTTk1QX0RTX0xJQl9NSUJESVJTKTsKICAgIGlmIChvbGRkaXIpIHsKICAgICAgICBpZiAoKCpkaXIgPT0gJysnKSB8fCAoKmRpciA9PSAnLScpKSB7CiAgICAgICAgICAgIC8qKiBOZXcgZGlyIHN0YXJ0cyB3aXRoICcrJywgdGh1cyB3ZSBhZGQgaXQuICovCiAgICAgICAgICAgIHRtcGRpciA9IChjaGFyICopbWFsbG9jKHN0cmxlbihkaXIpICsgc3RybGVuKG9sZGRpcikgKyAyKTsKICAgICAgICAgICAgaWYgKCF0bXBkaXIpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgInNldCBtaWJkaXIgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKmRpcisrID09ICcrJykKICAgICAgICAgICAgICAgIHNwcmludGYodG1wZGlyLCAiJXMlYyVzIiwgb2xkZGlyLCBFTlZfU0VQQVJBVE9SX0NIQVIsIGRpcik7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHNwcmludGYodG1wZGlyLCAiJXMlYyVzIiwgZGlyLCBFTlZfU0VQQVJBVE9SX0NIQVIsIG9sZGRpcik7CiAgICAgICAgICAgIG5ld2RpciA9IHRtcGRpcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXdkaXIgPSBkaXI7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvKiogSWYgZGlyIHN0YXJ0cyB3aXRoICcrJyBza2lwICcrJyBpdC4gKi8KICAgICAgICBuZXdkaXIgPSAoKCpkaXIgPT0gJysnKSA/ICsrZGlyIDogZGlyKTsKICAgIH0KICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQkRJUlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3ZGlyKTsKCiAgICAvKiogc2V0X3N0cmluZyBjYWxscyBzdHJkdXAsIHNvIGlmIHdlIGFsbG9jYXRlZCBtZW1vcnksIGZyZWUgaXQgKi8KICAgIGlmICh0bXBkaXIgPT0gbmV3ZGlyKSB7CiAgICAgICAgU05NUF9GUkVFKHRtcGRpcik7CiAgICB9Cn0KCi8qCiAqIGZ1bmN0aW9uIDogbmV0c25tcF9nZXRfbWliX2RpcmVjdG9yeQogKiAgICAgICAgICAgIC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nIG9mIHRoZSBkaXJlY3RvcmllcwogKiAgICAgICAgICAgICAgZnJvbSB3aGljaCB0aGUgTUlCIG1vZHVsZXMgd2lsbCBiZSBzZWFyY2hlZCBvcgogKiAgICAgICAgICAgICAgbG9hZGVkLgogKiAgICAgICAgICAgICAgSWYgdGhlIHZhbHVlIHN0aWxsIGRvZXMgbm90IGV4aXN0cywgaXQgd2lsbCBiZSBtYWRlCiAqICAgICAgICAgICAgICBmcm9tIHRoZSBldmlyb25tZW50IHZhcmlhYmxlICdNSUJESVJTJyBhbmQvb3IgdGhlCiAqICAgICAgICAgICAgICBkZWZhdWx0LgogKiBhcmd1bWVudHM6IC0KICogcmV0dXJucyAgOiBjaGFyICogb2YgdGhlIGRpcmVjdG9yaWVzIGluIHdoaWNoIHRoZSBNSUIgbW9kdWxlcwogKiAgICAgICAgICAgIHdpbGwgYmUgc2VhcmNoZWQvbG9hZGVkLgogKi8KCmNoYXIgKgpuZXRzbm1wX2dldF9taWJfZGlyZWN0b3J5KHZvaWQpCnsKICAgIGNoYXIgKmRpcjsKCiAgICBERUJVR1RSQUNFOwogICAgZGlyID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCRElSUyk7CiAgICBpZiAoZGlyID09IE5VTEwpIHsKICAgICAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibm8gbWliIGRpcmVjdG9yaWVzIHNldFxuIikpOwoKICAgICAgICAvKiogQ2hlY2sgaWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCAqLwogICAgICAgIGRpciA9IG5ldHNubXBfZ2V0ZW52KCJNSUJESVJTIik7CiAgICAgICAgaWYgKGRpciA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJubyBtaWIgZGlyZWN0b3JpZXMgc2V0IGJ5IGVudmlyb25tZW50XG4iKSk7CiAgICAgICAgICAgIC8qKiBOb3Qgc2V0IHVzZSBoYXJkIGNvZGVkIHBhdGggKi8KICAgICAgICAgICAgaWYgKGNvbmZtaWJkaXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm5vIG1pYiBkaXJlY3RvcmllcyBzZXQgYnkgY29uZmlnXG4iKSk7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KE5FVFNOTVBfREVGQVVMVF9NSUJESVJTKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgoKmNvbmZtaWJkaXIgPT0gJysnKSB8fCAoKmNvbmZtaWJkaXIgPT0gJy0nKSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm1pYiBkaXJlY3RvcmllcyBzZXQgYnkgY29uZmlnIChidXQgYWRkZWQpXG4iKSk7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KE5FVFNOTVBfREVGQVVMVF9NSUJESVJTKTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoY29uZm1pYmRpcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibWliIGRpcmVjdG9yaWVzIHNldCBieSBjb25maWdcbiIpKTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoY29uZm1pYmRpcik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCgqZGlyID09ICcrJykgfHwgKCpkaXIgPT0gJy0nKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibWliIGRpcmVjdG9yaWVzIHNldCBieSBlbnZpcm9ubWVudCAoYnV0IGFkZGVkKVxuIikpOwogICAgICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KE5FVFNOTVBfREVGQVVMVF9NSUJESVJTKTsKICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShkaXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJtaWIgZGlyZWN0b3JpZXMgc2V0IGJ5IGVudmlyb25tZW50XG4iKSk7CiAgICAgICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoZGlyKTsKICAgICAgICB9CiAgICAgICAgZGlyID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCRElSUyk7CiAgICB9CiAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibWliIGRpcmVjdG9yaWVzIHNldCAnJXMnXG4iLCBkaXIpKTsKICAgIHJldHVybihkaXIpOwp9CgovKgogKiBmdW5jdGlvbiA6IG5ldHNubXBfZml4dXBfbWliX2RpcmVjdG9yeQogKiBhcmd1bWVudHM6IC0KICogcmV0dXJucyAgOiAtCiAqLwp2b2lkCm5ldHNubXBfZml4dXBfbWliX2RpcmVjdG9yeSh2b2lkKQp7CiAgICBjaGFyICpob21lcGF0aCA9IG5ldHNubXBfZ2V0ZW52KCJIT01FIik7CiAgICBjaGFyICptaWJwYXRoID0gbmV0c25tcF9nZXRfbWliX2RpcmVjdG9yeSgpOwogICAgY2hhciAqb2xkbWlicGF0aCA9IE5VTEw7CiAgICBjaGFyICpwdHJfaG9tZTsKICAgIGNoYXIgKm5ld19taWJwYXRoOwoKICAgIERFQlVHVFJBQ0U7CiAgICBpZiAoaG9tZXBhdGggJiYgbWlicGF0aCkgewogICAgICAgIERFQlVHTVNHVEwoKCJmaXh1cF9taWJfZGlyZWN0b3J5IiwgIm1pYiBkaXJlY3RvcmllcyAnJXMnXG4iLCBtaWJwYXRoKSk7CiAgICAgICAgd2hpbGUgKChwdHJfaG9tZSA9IHN0cnN0cihtaWJwYXRoLCAiJEhPTUUiKSkpIHsKICAgICAgICAgICAgbmV3X21pYnBhdGggPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4obWlicGF0aCkgLSBzdHJsZW4oIiRIT01FIikgKwoJCQkJCSBzdHJsZW4oaG9tZXBhdGgpKzEpOwogICAgICAgICAgICBpZiAobmV3X21pYnBhdGgpIHsKICAgICAgICAgICAgICAgICpwdHJfaG9tZSA9IDA7IC8qIG51bGwgb3V0IHRoZSBzcG90IHdoZXJlIHdlIHN0b3AgY29weWluZyAqLwogICAgICAgICAgICAgICAgc3ByaW50ZihuZXdfbWlicGF0aCwgIiVzJXMlcyIsIG1pYnBhdGgsIGhvbWVwYXRoLAoJCQlwdHJfaG9tZSArIHN0cmxlbigiJEhPTUUiKSk7CiAgICAgICAgICAgICAgICAvKiogc3dhcCBpbiB0aGUgbmV3IHZhbHVlIGFuZCByZXBlYXQgKi8KICAgICAgICAgICAgICAgIG1pYnBhdGggPSBuZXdfbWlicGF0aDsKCQlpZiAob2xkbWlicGF0aCAhPSBOVUxMKSB7CgkJICAgIFNOTVBfRlJFRShvbGRtaWJwYXRoKTsKCQl9CgkJb2xkbWlicGF0aCA9IG5ld19taWJwYXRoOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkobWlicGF0aCk7CgkKCS8qICBUaGUgYWJvdmUgY29waWVzIHRoZSBtaWJwYXRoIGZvciB1cywgc28uLi4gICovCgoJaWYgKG9sZG1pYnBhdGggIT0gTlVMTCkgewoJICAgIFNOTVBfRlJFRShvbGRtaWJwYXRoKTsKCX0KCiAgICB9Cgp9CgovKioKICogSW5pdGlhbGlzZXMgdGhlIG1pYiByZWFkZXIuCiAqCiAqIFJlYWRzIGluIGFsbCBzZXR0aW5ncyBmcm9tIHRoZSBlbnZpcm9ubWVudC4KICovCnZvaWQKbmV0c25tcF9pbml0X21pYih2b2lkKQp7CiAgICBjb25zdCBjaGFyICAgICAqcHJlZml4OwogICAgY2hhciAgICAgICAgICAgKmVudl92YXIsICplbnRyeTsKICAgIFByZWZpeExpc3RQdHIgICBwcCA9ICZtaWJfcHJlZml4ZXNbMF07CiAgICBjaGFyICAgICAgICAgICAqc3QgPSBOVUxMOwoKICAgIGlmIChNaWIpCiAgICAgICAgcmV0dXJuOwogICAgbmV0c25tcF9pbml0X21pYl9pbnRlcm5hbHMoKTsKCiAgICAvKgogICAgICogSW5pdGlhbGlzZSB0aGUgTUlCIGRpcmVjdG9yeS9pZXMgCiAgICAgKi8KICAgIG5ldHNubXBfZml4dXBfbWliX2RpcmVjdG9yeSgpOwogICAgZW52X3ZhciA9IHN0cmR1cChuZXRzbm1wX2dldF9taWJfZGlyZWN0b3J5KCkpOwogICAgbmV0c25tcF9taWJpbmRleF9sb2FkKCk7CgogICAgREVCVUdNU0dUTCgoImluaXRfbWliIiwKICAgICAgICAgICAgICAgICJTZWVuIE1JQkRJUlM6IExvb2tpbmcgaW4gJyVzJyBmb3IgbWliIGRpcnMgLi4uXG4iLAogICAgICAgICAgICAgICAgZW52X3ZhcikpOwoKICAgIGVudHJ5ID0gc3RydG9rX3IoZW52X3ZhciwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgIHdoaWxlIChlbnRyeSkgewogICAgICAgIGFkZF9taWJkaXIoZW50cnkpOwogICAgICAgIGVudHJ5ID0gc3RydG9rX3IoTlVMTCwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgIH0KICAgIFNOTVBfRlJFRShlbnZfdmFyKTsKCiAgICBlbnZfdmFyID0gbmV0c25tcF9nZXRlbnYoIk1JQkZJTEVTIik7CiAgICBpZiAoZW52X3ZhciAhPSBOVUxMKSB7CiAgICAgICAgaWYgKCplbnZfdmFyID09ICcrJykKICAgICAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihlbnZfdmFyKzEsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBlbnRyeSA9IHN0cnRva19yKGVudl92YXIsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICAgICAgd2hpbGUgKGVudHJ5KSB7CiAgICAgICAgICAgIGFkZF9taWJmaWxlKGVudHJ5LCBOVUxMLCBOVUxMKTsKICAgICAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihOVUxMLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgICAgIH0KICAgIH0KCiAgICBuZXRzbm1wX2luaXRfbWliX2ludGVybmFscygpOwoKICAgIC8qCiAgICAgKiBSZWFkIGluIGFueSBtb2R1bGVzIG9yIG1pYnMgcmVxdWVzdGVkIAogICAgICovCgogICAgZW52X3ZhciA9IG5ldHNubXBfZ2V0ZW52KCJNSUJTIik7CiAgICBpZiAoZW52X3ZhciA9PSBOVUxMKSB7CiAgICAgICAgaWYgKGNvbmZtaWJzICE9IE5VTEwpCiAgICAgICAgICAgIGVudl92YXIgPSBzdHJkdXAoY29uZm1pYnMpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgZW52X3ZhciA9IHN0cmR1cChORVRTTk1QX0RFRkFVTFRfTUlCUyk7CiAgICB9IGVsc2UgewogICAgICAgIGVudl92YXIgPSBzdHJkdXAoZW52X3Zhcik7CiAgICB9CiAgICBpZiAoZW52X3ZhciAmJiAoKCplbnZfdmFyID09ICcrJykgfHwgKCplbnZfdmFyID09ICctJykpKSB7CiAgICAgICAgZW50cnkgPQogICAgICAgICAgICAoY2hhciAqKSBtYWxsb2Moc3RybGVuKE5FVFNOTVBfREVGQVVMVF9NSUJTKSArIHN0cmxlbihlbnZfdmFyKSArIDIpOwogICAgICAgIGlmICghZW50cnkpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImluaXRfbWliIiwgImVudiBtaWJzIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgIFNOTVBfRlJFRShlbnZfdmFyKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgqZW52X3ZhciA9PSAnKycpCiAgICAgICAgICAgICAgICBzcHJpbnRmKGVudHJ5LCAiJXMlYyVzIiwgTkVUU05NUF9ERUZBVUxUX01JQlMsIEVOVl9TRVBBUkFUT1JfQ0hBUiwKICAgICAgICAgICAgICAgICAgICAgICAgZW52X3ZhcisxKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc3ByaW50ZihlbnRyeSwgIiVzJWMlcyIsIGVudl92YXIrMSwgRU5WX1NFUEFSQVRPUl9DSEFSLAogICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RFRkFVTFRfTUlCUyApOwogICAgICAgIH0KICAgICAgICBTTk1QX0ZSRUUoZW52X3Zhcik7CiAgICAgICAgZW52X3ZhciA9IGVudHJ5OwogICAgfQoKICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsCiAgICAgICAgICAgICAgICAiU2VlbiBNSUJTOiBMb29raW5nIGluICclcycgZm9yIG1pYiBmaWxlcyAuLi5cbiIsCiAgICAgICAgICAgICAgICBlbnZfdmFyKSk7CiAgICBlbnRyeSA9IHN0cnRva19yKGVudl92YXIsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICB3aGlsZSAoZW50cnkpIHsKICAgICAgICBpZiAoc3RyY2FzZWNtcChlbnRyeSwgREVCVUdfQUxXQVlTX1RPS0VOKSA9PSAwKSB7CiAgICAgICAgICAgIHJlYWRfYWxsX21pYnMoKTsKICAgICAgICB9IGVsc2UgaWYgKHN0cnN0cihlbnRyeSwgIi8iKSAhPSBOVUxMKSB7CiAgICAgICAgICAgIHJlYWRfbWliKGVudHJ5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXRzbm1wX3JlYWRfbW9kdWxlKGVudHJ5KTsKICAgICAgICB9CiAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihOVUxMLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgfQogICAgYWRvcHRfb3JwaGFucygpOwogICAgU05NUF9GUkVFKGVudl92YXIpOwoKICAgIGVudl92YXIgPSBuZXRzbm1wX2dldGVudigiTUlCRklMRVMiKTsKICAgIGlmIChlbnZfdmFyICE9IE5VTEwpIHsKICAgICAgICBpZiAoKCplbnZfdmFyID09ICcrJykgfHwgKCplbnZfdmFyID09ICctJykpIHsKI2lmZGVmIE5FVFNOTVBfREVGQVVMVF9NSUJGSUxFUwogICAgICAgICAgICBlbnRyeSA9CiAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2Moc3RybGVuKE5FVFNOTVBfREVGQVVMVF9NSUJGSUxFUykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihlbnZfdmFyKSArIDIpOwogICAgICAgICAgICBpZiAoIWVudHJ5KSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLCAiZW52IG1pYmZpbGVzIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoKmVudl92YXIrKyA9PSAnKycpCiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihlbnRyeSwgIiVzJWMlcyIsIE5FVFNOTVBfREVGQVVMVF9NSUJGSUxFUywgRU5WX1NFUEFSQVRPUl9DSEFSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52X3ZhciApOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHNwcmludGYoZW50cnksICIlcyVjJXMiLCBlbnZfdmFyLCBFTlZfU0VQQVJBVE9SX0NIQVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RFRkFVTFRfTUlCRklMRVMgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBTTk1QX0ZSRUUoZW52X3Zhcik7CiAgICAgICAgICAgIGVudl92YXIgPSBlbnRyeTsKI2Vsc2UKICAgICAgICAgICAgZW52X3ZhciA9IHN0cmR1cChlbnZfdmFyICsgMSk7CiNlbmRpZgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVudl92YXIgPSBzdHJkdXAoZW52X3Zhcik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKI2lmZGVmIE5FVFNOTVBfREVGQVVMVF9NSUJGSUxFUwogICAgICAgIGVudl92YXIgPSBzdHJkdXAoTkVUU05NUF9ERUZBVUxUX01JQkZJTEVTKTsKI2VuZGlmCiAgICB9CgogICAgaWYgKGVudl92YXIgIT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsCiAgICAgICAgICAgICAgICAgICAgIlNlZW4gTUlCRklMRVM6IExvb2tpbmcgaW4gJyVzJyBmb3IgbWliIGZpbGVzIC4uLlxuIiwKICAgICAgICAgICAgICAgICAgICBlbnZfdmFyKSk7CiAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihlbnZfdmFyLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgICAgIHdoaWxlIChlbnRyeSkgewogICAgICAgICAgICByZWFkX21pYihlbnRyeSk7CiAgICAgICAgICAgIGVudHJ5ID0gc3RydG9rX3IoTlVMTCwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgICAgICB9CiAgICAgICAgU05NUF9GUkVFKGVudl92YXIpOwogICAgfQoKICAgIHByZWZpeCA9IG5ldHNubXBfZ2V0ZW52KCJQUkVGSVgiKTsKCiAgICBpZiAoIXByZWZpeCkKICAgICAgICBwcmVmaXggPSBTdGFuZGFyZF9QcmVmaXg7CgogICAgUHJlZml4ID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihwcmVmaXgpICsgMik7CiAgICBpZiAoIVByZWZpeCkKICAgICAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLCAiUHJlZml4IG1hbGxvYyBmYWlsZWQiKSk7CiAgICBlbHNlCiAgICAgICAgc3RyY3B5KFByZWZpeCwgcHJlZml4KTsKCiAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLAogICAgICAgICAgICAgICAgIlNlZW4gUFJFRklYOiBMb29raW5nIGluICclcycgZm9yIHByZWZpeCAuLi5cbiIsIFByZWZpeCkpOwoKICAgIC8qCiAgICAgKiByZW1vdmUgdHJhaWxpbmcgZG90IAogICAgICovCiAgICBpZiAoUHJlZml4KSB7CiAgICAgICAgZW52X3ZhciA9ICZQcmVmaXhbc3RybGVuKFByZWZpeCkgLSAxXTsKICAgICAgICBpZiAoKmVudl92YXIgPT0gJy4nKQogICAgICAgICAgICAqZW52X3ZhciA9ICdcMCc7CiAgICB9CgogICAgcHAtPnN0ciA9IFByZWZpeDsgICAgICAgICAgIC8qIGZpeHVwIGZpcnN0IG1pYl9wcmVmaXggZW50cnkgKi8KICAgIC8qCiAgICAgKiBub3cgdGhhdCB0aGUgbGlzdCBvZiBwcmVmaXhlcyBpcyBidWlsdCwgc2F2ZSBlYWNoIHN0cmluZyBsZW5ndGguIAogICAgICovCiAgICB3aGlsZSAocHAtPnN0cikgewogICAgICAgIHBwLT5sZW4gPSBzdHJsZW4ocHAtPnN0cik7CiAgICAgICAgcHArKzsKICAgIH0KCiAgICBNaWIgPSB0cmVlX2hlYWQ7ICAgICAgICAgICAgLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KICAgIHRyZWVfdG9wID0gKHN0cnVjdCB0cmVlICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRyZWUpKTsKICAgIC8qCiAgICAgKiBYWCBlcnJvciBjaGVjayA/IAogICAgICovCiAgICBpZiAodHJlZV90b3ApIHsKICAgICAgICB0cmVlX3RvcC0+bGFiZWwgPSBzdHJkdXAoIih0b3ApIik7CiAgICAgICAgdHJlZV90b3AtPmNoaWxkX2xpc3QgPSB0cmVlX2hlYWQ7CiAgICB9Cn0KCiNpZm5kZWYgTkVUU05NUF9OT19MRUdBQ1lfREVGSU5JVElPTlMKdm9pZAppbml0X21pYih2b2lkKQp7CiAgICBuZXRzbm1wX2luaXRfbWliKCk7Cn0KI2VuZGlmCgoKLyoKICogSGFuZGxlIE1JQiBpbmRleGVzIGNlbnRyYWxseQogKi8Kc3RhdGljIGludCBfbWliaW5kZXggICAgID0gMDsgICAvKiBMYXN0IGluZGV4IGluIHVzZSAqLwpzdGF0aWMgaW50IF9taWJpbmRleF9tYXggPSAwOyAgIC8qIFNpemUgb2YgaW5kZXggYXJyYXkgKi8KY2hhciAgICAgKipfbWliaW5kZXhlcyAgID0gTlVMTDsKCmludCBfbWliaW5kZXhfYWRkKCBjb25zdCBjaGFyICpkaXJuYW1lLCBpbnQgaSApOwp2b2lkCm5ldHNubXBfbWliaW5kZXhfbG9hZCggdm9pZCApCnsKICAgIERJUiAqZGlyOwogICAgc3RydWN0IGRpcmVudCAqZmlsZTsKICAgIEZJTEUgKmZwOwogICAgY2hhciB0bXBidWZbIDMwMF07CiAgICBjaGFyIHRtcGJ1ZjJbMzAwXTsKICAgIGludCAgaTsKICAgIGNoYXIgKmNwOwoKICAgIC8qCiAgICAgKiBPcGVuIHRoZSBNSUIgaW5kZXggZGlyZWN0b3J5LCBvciBjcmVhdGUgaXQgKGVtcHR5KQogICAgICovCiAgICBzbnByaW50ZiggdG1wYnVmLCBzaXplb2YodG1wYnVmKSwgIiVzL21pYl9pbmRleGVzIiwKICAgICAgICAgICAgICBnZXRfcGVyc2lzdGVudF9kaXJlY3RvcnkoKSk7CiAgICB0bXBidWZbc2l6ZW9mKHRtcGJ1ZiktMV0gPSAwOwogICAgZGlyID0gb3BlbmRpciggdG1wYnVmICk7CiAgICBpZiAoIGRpciA9PSBOVUxMICkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJsb2FkOiAobmV3KVxuIikpOwogICAgICAgIG1rZGlyaGllciggdG1wYnVmLCBORVRTTk1QX0FHRU5UX0RJUkVDVE9SWV9NT0RFLCAwKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyoKICAgICAqIENyZWF0ZSBhIGxpc3Qgb2Ygd2hpY2ggZGlyZWN0b3J5IGVhY2ggZmlsZSByZWZlcnMgdG8KICAgICAqLwogICAgd2hpbGUgKChmaWxlID0gcmVhZGRpciggZGlyICkpKSB7CiAgICAgICAgaWYgKCAhaXNkaWdpdCgodW5zaWduZWQgY2hhcikoZmlsZS0+ZF9uYW1lWzBdKSkpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGkgPSBhdG9pKCBmaWxlLT5kX25hbWUgKTsKCiAgICAgICAgc25wcmludGYoIHRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZiksICIlcy9taWJfaW5kZXhlcy8lZCIsCiAgICAgICAgICAgICAgZ2V0X3BlcnNpc3RlbnRfZGlyZWN0b3J5KCksIGkgKTsKICAgICAgICB0bXBidWZbc2l6ZW9mKHRtcGJ1ZiktMV0gPSAwOwogICAgICAgIGZwID0gZm9wZW4oIHRtcGJ1ZiwgInIiICk7CiAgICAgICAgaWYgKCFmcCkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgY3AgPSBmZ2V0cyggdG1wYnVmMiwgc2l6ZW9mKHRtcGJ1ZjIpLCBmcCApOwogICAgICAgIGlmICggIWNwICkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliaW5kZXgiLCAiRW1wdHkgTUlCIGluZGV4ICglZClcbiIsIGkpKTsKICAgICAgICAgICAgZmNsb3NlKGZwKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHRtcGJ1ZjJbc3RybGVuKHRtcGJ1ZjIpLTFdID0gMDsKICAgICAgICBERUJVR01TR1RMKCgibWliaW5kZXgiLCAibG9hZDogKCVkKSAlc1xuIiwgaSwgdG1wYnVmMikpOwogICAgICAgICh2b2lkKV9taWJpbmRleF9hZGQoIHRtcGJ1ZjIrNCwgaSApOyAgLyogU2tpcCAnRElSICcgKi8KICAgICAgICBmY2xvc2UoIGZwICk7CiAgICB9CiAgICBjbG9zZWRpciggZGlyICk7Cn0KCmNoYXIgKgpuZXRzbm1wX21pYmluZGV4X2xvb2t1cCggY29uc3QgY2hhciAqZGlybmFtZSApCnsKICAgIGludCBpOwogICAgc3RhdGljIGNoYXIgdG1wYnVmWzMwMF07CgogICAgZm9yIChpPTA7IGk8X21pYmluZGV4OyBpKyspIHsKICAgICAgICBpZiAoIF9taWJpbmRleGVzW2ldICYmCiAgICAgICAgICAgICBzdHJjbXAoIF9taWJpbmRleGVzW2ldLCBkaXJuYW1lICkgPT0gMCkgewogICAgICAgICAgICAgc25wcmludGYodG1wYnVmLCBzaXplb2YodG1wYnVmKSwgIiVzL21pYl9pbmRleGVzLyVkIiwKICAgICAgICAgICAgICAgICAgICAgIGdldF9wZXJzaXN0ZW50X2RpcmVjdG9yeSgpLCBpKTsKICAgICAgICAgICAgIHRtcGJ1ZltzaXplb2YodG1wYnVmKS0xXSA9IDA7CiAgICAgICAgICAgICBERUJVR01TR1RMKCgibWliaW5kZXgiLCAibG9va3VwOiAlcyAoJWQpICVzXG4iLCBkaXJuYW1lLCBpLCB0bXBidWYgKSk7CiAgICAgICAgICAgICByZXR1cm4gdG1wYnVmOwogICAgICAgIH0KICAgIH0KICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJsb29rdXA6IChub25lKVxuIikpOwogICAgcmV0dXJuIE5VTEw7Cn0KCmludApfbWliaW5kZXhfYWRkKCBjb25zdCBjaGFyICpkaXJuYW1lLCBpbnQgaSApCnsKICAgIGNvbnN0IGludCBvbGRfbWliaW5kZXhfbWF4ID0gX21pYmluZGV4X21heDsKCiAgICBERUJVR01TR1RMKCgibWliaW5kZXgiLCAiYWRkOiAlcyAoJWQpXG4iLCBkaXJuYW1lLCBpICkpOwogICAgaWYgKCBpID09IC0xICkKICAgICAgICBpID0gX21pYmluZGV4Kys7CiAgICBpZiAoIGkgPj0gX21pYmluZGV4X21heCApIHsKICAgICAgICAvKgogICAgICAgICAqIElmIHRoZSBpbmRleCBhcnJheSBpcyBmdWxsIChvciBub24tZXhpc3RlbnQpCiAgICAgICAgICogICB0aGVuIGV4cGFuZCAob3IgY3JlYXRlKSBpdAogICAgICAgICAqLwogICAgICAgIF9taWJpbmRleF9tYXggPSBpICsgMTA7CiAgICAgICAgX21pYmluZGV4ZXMgPSByZWFsbG9jKF9taWJpbmRleGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbWliaW5kZXhfbWF4ICogc2l6ZW9mKF9taWJpbmRleGVzWzBdKSk7CiAgICAgICAgbmV0c25tcF9hc3NlcnQoX21pYmluZGV4ZXMpOwogICAgICAgIG1lbXNldChfbWliaW5kZXhlcyArIG9sZF9taWJpbmRleF9tYXgsIDAsCiAgICAgICAgICAgICAgIChfbWliaW5kZXhfbWF4IC0gb2xkX21pYmluZGV4X21heCkgKiBzaXplb2YoX21pYmluZGV4ZXNbMF0pKTsKICAgIH0KCiAgICBfbWliaW5kZXhlc1sgaSBdID0gc3RyZHVwKCBkaXJuYW1lICk7CiAgICBpZiAoIGkgPj0gX21pYmluZGV4ICkKICAgICAgICBfbWliaW5kZXggPSBpKzE7CgogICAgREVCVUdNU0dUTCgoIm1pYmluZGV4IiwgImFkZDogJWQvJWQvJWRcbiIsIGksIF9taWJpbmRleCwgX21pYmluZGV4X21heCApKTsKICAgIHJldHVybiBpOwp9CiAgICAKRklMRSAqCm5ldHNubXBfbWliaW5kZXhfbmV3KCBjb25zdCBjaGFyICpkaXJuYW1lICkKewogICAgRklMRSAqZnA7CiAgICBjaGFyICB0bXBidWZbMzAwXTsKICAgIGNoYXIgKmNwOwogICAgaW50ICAgaTsKCiAgICBjcCA9IG5ldHNubXBfbWliaW5kZXhfbG9va3VwKCBkaXJuYW1lICk7CiAgICBpZiAoIWNwKSB7CiAgICAgICAgaSAgPSBfbWliaW5kZXhfYWRkKCBkaXJuYW1lLCAtMSApOwogICAgICAgIHNucHJpbnRmKCB0bXBidWYsIHNpemVvZih0bXBidWYpLCAiJXMvbWliX2luZGV4ZXMvJWQiLAogICAgICAgICAgICAgICAgICBnZXRfcGVyc2lzdGVudF9kaXJlY3RvcnkoKSwgaSApOwogICAgICAgIHRtcGJ1ZltzaXplb2YodG1wYnVmKS0xXSA9IDA7CiAgICAgICAgY3AgPSB0bXBidWY7CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliaW5kZXgiLCAibmV3OiAlcyAoJXMpXG4iLCBkaXJuYW1lLCBjcCApKTsKICAgIGZwID0gZm9wZW4oIGNwLCAidyIgKTsKICAgIGlmIChmcCkKICAgICAgICBmcHJpbnRmKCBmcCwgIkRJUiAlc1xuIiwgZGlybmFtZSApOwogICAgcmV0dXJuIGZwOwp9CgoKLyoqCiAqIFVubG9hZHMgYWxsIG1pYnMuCiAqLwp2b2lkCnNodXRkb3duX21pYih2b2lkKQp7CiAgICB1bmxvYWRfYWxsX21pYnMoKTsKICAgIGlmICh0cmVlX3RvcCkgewogICAgICAgIGlmICh0cmVlX3RvcC0+bGFiZWwpCiAgICAgICAgICAgIFNOTVBfRlJFRSh0cmVlX3RvcC0+bGFiZWwpOwogICAgICAgIFNOTVBfRlJFRSh0cmVlX3RvcCk7CiAgICB9CiAgICB0cmVlX2hlYWQgPSBOVUxMOwogICAgTWliID0gTlVMTDsKICAgIGlmIChfbWliaW5kZXhlcykgewogICAgICAgIGludCBpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBfbWliaW5kZXg7ICsraSkKICAgICAgICAgICAgU05NUF9GUkVFKF9taWJpbmRleGVzW2ldKTsKICAgICAgICBmcmVlKF9taWJpbmRleGVzKTsKICAgICAgICBfbWliaW5kZXggPSAwOwogICAgICAgIF9taWJpbmRleF9tYXggPSAwOwogICAgICAgIF9taWJpbmRleGVzID0gTlVMTDsKICAgIH0KICAgIGlmIChQcmVmaXggIT0gTlVMTCAmJiBQcmVmaXggIT0gJlN0YW5kYXJkX1ByZWZpeFswXSkKICAgICAgICBTTk1QX0ZSRUUoUHJlZml4KTsKICAgIGlmIChQcmVmaXgpCiAgICAgICAgUHJlZml4ID0gTlVMTDsKICAgIFNOTVBfRlJFRShjb25mbWlicyk7CiAgICBTTk1QX0ZSRUUoY29uZm1pYmRpcik7Cn0KCi8qKgogKiBQcmludHMgdGhlIE1JQnMgdG8gdGhlIGZpbGUgZnAuCiAqCiAqIEBwYXJhbSBmcCAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gcHJpbnQgdG8uCiAqLwojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfUFJJTlRfTUlCCnZvaWQKcHJpbnRfbWliKEZJTEUgKiBmcCkKewogICAgcHJpbnRfc3VidHJlZShmcCwgdHJlZV9oZWFkLCAwKTsKfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9QUklOVF9NSUIgKi8KCnZvaWQKcHJpbnRfYXNjaWlfZHVtcChGSUxFICogZnApCnsKICAgIGZwcmludGYoZnAsICJkdW1wIERFRklOSVRJT05TIDo6PSBCRUdJTlxuIik7CiAgICBwcmludF9hc2NpaV9kdW1wX3RyZWUoZnAsIHRyZWVfaGVhZCwgMCk7CiAgICBmcHJpbnRmKGZwLCAiRU5EXG4iKTsKfQoKCi8qKgogKiBTZXQncyB0aGUgcHJpbnRpbmcgZnVuY3Rpb24gcHJpbnRvbWF0IGluIGEgc3VidHJlZSBhY2NvcmRpbmcKICogaXQncyB0eXBlCiAqCiAqIEBwYXJhbSBzdWJ0cmVlICAgIFRoZSBzdWJ0cmVlIHRvIHNldC4KICovCnZvaWQKc2V0X2Z1bmN0aW9uKHN0cnVjdCB0cmVlICpzdWJ0cmVlKQp7CiAgICBzdWJ0cmVlLT5wcmludGVyID0gTlVMTDsKICAgIHN3aXRjaCAoc3VidHJlZS0+dHlwZSkgewogICAgY2FzZSBUWVBFX09CSklEOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX29iamVjdF9pZGVudGlmaWVyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX29jdGV0X3N0cmluZzsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9JTlRFR0VSOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2ludGVnZXI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2ludGVnZXI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfTkVUQUREUjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19uZXR3b3JrYWRkcmVzczsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9JUEFERFI6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfaXBhZGRyZXNzOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX0NPVU5URVI6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfY291bnRlcjsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9HQVVHRToKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19nYXVnZTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9USU1FVElDS1M6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfdGltZXRpY2tzOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX09QQVFVRToKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19vcGFxdWU7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfTlVMTDoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19udWxsOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX0JJVFNUUklORzoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19iaXRzdHJpbmc7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfTlNBUEFERFJFU1M6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfbnNhcGFkZHJlc3M7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfQ09VTlRFUjY0OgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2NvdW50ZXI2NDsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY191aW50ZWdlcjsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9VTlNJR05FRDMyOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2dhdWdlOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX09USEVSOgogICAgZGVmYXVsdDoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19ieV90eXBlOwogICAgICAgIGJyZWFrOwogICAgfQp9CgojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgovKioKICogUmVhZHMgYW4gb2JqZWN0IGlkZW50aWZpZXIgZnJvbSBhbiBpbnB1dCBzdHJpbmcgaW50byBpbnRlcm5hbCBPSUQgZm9ybS4KICogCiAqIFdoZW4gY2FsbGVkLCBvdXRfbGVuIG11c3QgaG9sZCB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIG91dHB1dCBhcnJheS4KICoKICogQHBhcmFtIGlucHV0ICAgICB0aGUgaW5wdXQgc3RyaW5nLgogKiBAcGFyYW0gb3V0cHV0ICAgIHRoZSBvaWQgd2lydGUuCiAqIEBwYXJhbSBvdXRfbGVuICAgbnVtYmVyIG9mIHN1YmlkJ3MgaW4gb3V0cHV0LgogKiAKICogQHJldHVybiAxIGlmIHN1Y2Nlc3NmdWwuCiAqIAogKiBJZiBhbiBlcnJvciBvY2N1cnMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAwIGFuZCBNQVkgc2V0IHNubXBfZXJybm8uCiAqIHNubXBfZXJybm8gaXMgTk9UIHNldCBpZiBTRVRfU05NUF9FUlJPUiBldmFsdWF0ZXMgdG8gbm90aGluZy4KICogVGhpcyBjYW4gbWFrZSBtdWx0aS10aHJlYWRlZCB1c2UgYSB0aW55IGJpdCBtb3JlIHJvYnVzdC4KICovCmludApyZWFkX29iamlkKGNvbnN0IGNoYXIgKmlucHV0LCBvaWQgKiBvdXRwdXQsIHNpemVfdCAqIG91dF9sZW4pCnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN1YmlkJ3MgaW4gIm91dHB1dCIgKi8KI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIHN0cnVjdCB0cmVlICAgICpyb290ID0gdHJlZV90b3A7CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIGNoYXIgICAgICAgICAgICBidWZbU1BSSU5UX01BWF9MRU5dOwogICAgaW50ICAgICAgICAgICAgIHJldCwgbWF4X291dF9sZW47CiAgICBjaGFyICAgICAgICAgICAqbmFtZSwgY2g7CiAgICBjb25zdCBjaGFyICAgICAqY3A7CgogICAgY3AgPSBpbnB1dDsKICAgIHdoaWxlICgoY2ggPSAqY3ApKSB7CiAgICAgICAgaWYgKCgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKQogICAgICAgICAgICB8fCAoJ2EnIDw9IGNoICYmIGNoIDw9ICd6JykKICAgICAgICAgICAgfHwgKCdBJyA8PSBjaCAmJiBjaCA8PSAnWicpCiAgICAgICAgICAgIHx8IGNoID09ICctJykKICAgICAgICAgICAgY3ArKzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGJyZWFrOwogICAgfQojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgaWYgKGNoID09ICc6JykKICAgICAgICByZXR1cm4gZ2V0X25vZGUoaW5wdXQsIG91dHB1dCwgb3V0X2xlbik7CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCiAgICBpZiAoKmlucHV0ID09ICcuJykKICAgICAgICBpbnB1dCsrOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgZWxzZSBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1JFQURfVUNEX1NUWUxFX09JRCkpIHsKICAgICAgICAvKgogICAgICAgICAqIGdldCBwYXN0IGxlYWRpbmcgJy4nLCBhcHBlbmQgJy4nIHRvIFByZWZpeC4gCiAgICAgICAgICovCiAgICAgICAgaWYgKCpQcmVmaXggPT0gJy4nKQogICAgICAgICAgICBzdHJsY3B5KGJ1ZiwgUHJlZml4ICsgMSwgc2l6ZW9mKGJ1ZikpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgc3RybGNweShidWYsIFByZWZpeCwgc2l6ZW9mKGJ1ZikpOwogICAgICAgIHN0cmxjYXQoYnVmLCAiLiIsIHNpemVvZihidWYpKTsKICAgICAgICBzdHJsY2F0KGJ1ZiwgaW5wdXQsIHNpemVvZihidWYpKTsKICAgICAgICBpbnB1dCA9IGJ1ZjsKICAgIH0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIGlmICgocm9vdCA9PSBOVUxMKSAmJiAodHJlZV9oZWFkICE9IE5VTEwpKSB7CiAgICAgICAgcm9vdCA9IHRyZWVfaGVhZDsKICAgIH0KICAgIGVsc2UgaWYgKHJvb3QgPT0gTlVMTCkgewogICAgICAgIFNFVF9TTk1QX0VSUk9SKFNOTVBFUlJfTk9NSUIpOwogICAgICAgICpvdXRfbGVuID0gMDsKICAgICAgICByZXR1cm4gMDsKICAgIH0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgbmFtZSA9IHN0cmR1cChpbnB1dCk7CiAgICBtYXhfb3V0X2xlbiA9ICpvdXRfbGVuOwogICAgKm91dF9sZW4gPSAwOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgaWYgKChyZXQgPQogICAgICAgICBfYWRkX3N0cmluZ3NfdG9fb2lkKHJvb3QsIG5hbWUsIG91dHB1dCwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfb3V0X2xlbikpIDw9IDApCiNlbHNlCiAgICBpZiAoKHJldCA9CiAgICAgICAgIF9hZGRfc3RyaW5nc190b19vaWQoTlVMTCwgbmFtZSwgb3V0cHV0LCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9vdXRfbGVuKSkgPD0gMCkKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgewogICAgICAgIGlmIChyZXQgPT0gMCkKICAgICAgICAgICAgcmV0ID0gU05NUEVSUl9VTktOT1dOX09CSklEOwogICAgICAgIFNFVF9TTk1QX0VSUk9SKHJldCk7CiAgICAgICAgU05NUF9GUkVFKG5hbWUpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgU05NUF9GUkVFKG5hbWUpOwoKICAgIHJldHVybiAxOwp9CgovKioKICogCiAqLwp2b2lkCm5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWQodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7CiAgICB1X2NoYXIgICAgICAgICAqdGJ1ZiA9IE5VTEwsICpjcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgdGJ1Zl9sZW4gPSAyNTYsIHRvdXRfbGVuID0gMDsKICAgIGludCAgICAgICAgICAgICB0YnVmX292ZXJmbG93ID0gMDsKICAgIGludCAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0OwoKICAgIGlmICgodGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKHRidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIHRidWZfb3ZlcmZsb3cgPSAxOwogICAgfSBlbHNlIHsKICAgICAgICAqdGJ1ZiA9ICcuJzsKICAgICAgICB0b3V0X2xlbiA9IDE7CiAgICB9CgogICAgX29pZF9maW5pc2hfcHJpbnRpbmcob2JqaWQsIG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgJnRidWYsICZ0YnVmX2xlbiwgJnRvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJnRidWZfb3ZlcmZsb3cpOwoKICAgIGlmICh0YnVmX292ZXJmbG93KSB7CiAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93KSB7CiAgICAgICAgICAgIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdGJ1Zik7CiAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgIH0KICAgICAgICBTTk1QX0ZSRUUodGJ1Zik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG91dHB1dF9mb3JtYXQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCk7CiAgICBpZiAoMCA9PSBvdXRwdXRfZm9ybWF0KSB7CiAgICAgICAgb3V0cHV0X2Zvcm1hdCA9IE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDOwogICAgfQogICAgc3dpdGNoIChvdXRwdXRfZm9ybWF0KSB7CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9GVUxMOgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQzoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX1NVRkZJWDoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX01PRFVMRToKICAgICAgICBjcCA9IHRidWY7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTk9ORToKICAgIGRlZmF1bHQ6CiAgICAgICAgY3AgPSBOVUxMOwogICAgfQoKICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJgogICAgICAgICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSkgewogICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgfQogICAgU05NUF9GUkVFKHRidWYpOwp9CgovKioKICogCiAqLwojaWZkZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCnZvaWQKbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKewogICAgbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdywgb2JqaWQsIG9iamlkbGVuKTsKfQojZWxzZQpzdHJ1Y3QgdHJlZSAgICAqCm5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4pCnsKICAgIHVfY2hhciAgICAgICAgICp0YnVmID0gTlVMTCwgKmNwID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICB0YnVmX2xlbiA9IDUxMiwgdG91dF9sZW4gPSAwOwogICAgc3RydWN0IHRyZWUgICAgKnN1YnRyZWUgPSB0cmVlX2hlYWQ7CiAgICBzaXplX3QgICAgICAgICAgbWlkcG9pbnRfb2Zmc2V0ID0gMDsKICAgIGludCAgICAgICAgICAgICB0YnVmX292ZXJmbG93ID0gMDsKICAgIGludCAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0OwoKICAgIGlmICgodGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKHRidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIHRidWZfb3ZlcmZsb3cgPSAxOwogICAgfSBlbHNlIHsKICAgICAgICAqdGJ1ZiA9ICcuJzsKICAgICAgICB0b3V0X2xlbiA9IDE7CiAgICB9CgogICAgc3VidHJlZSA9IF9nZXRfcmVhbGxvY19zeW1ib2wob2JqaWQsIG9iamlkbGVuLCBzdWJ0cmVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRidWYsICZ0YnVmX2xlbiwgJnRvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJnRidWZfb3ZlcmZsb3csIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlkcG9pbnRfb2Zmc2V0KTsKCiAgICBpZiAodGJ1Zl9vdmVyZmxvdykgewogICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRidWYpOwogICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICB9CiAgICAgICAgU05NUF9GUkVFKHRidWYpOwogICAgICAgIHJldHVybiBzdWJ0cmVlOwogICAgfQoKICAgIG91dHB1dF9mb3JtYXQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCk7CiAgICBpZiAoMCA9PSBvdXRwdXRfZm9ybWF0KSB7CiAgICAgICAgb3V0cHV0X2Zvcm1hdCA9IE5FVFNOTVBfT0lEX09VVFBVVF9NT0RVTEU7CiAgICB9CiAgICBzd2l0Y2ggKG91dHB1dF9mb3JtYXQpIHsKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX0ZVTEw6CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDOgogICAgICAgIGNwID0gdGJ1ZjsKICAgICAgICBicmVhazsKCiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9TVUZGSVg6CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9NT0RVTEU6CiAgICAgICAgZm9yIChjcCA9IHRidWY7ICpjcDsgY3ArKyk7CgogICAgICAgIGlmIChtaWRwb2ludF9vZmZzZXQgIT0gMCkgewogICAgICAgICAgICBjcCA9IHRidWYgKyBtaWRwb2ludF9vZmZzZXQgLSAyOyAgICAvKiAgYmV5b25kIHRoZSAnLicgICovCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgd2hpbGUgKGNwID49IHRidWYpIHsKICAgICAgICAgICAgICAgIGlmIChpc2FscGhhKCpjcCkpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNwLS07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHdoaWxlIChjcCA+PSB0YnVmKSB7CiAgICAgICAgICAgIGlmICgqY3AgPT0gJy4nKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjcC0tOwogICAgICAgIH0KCiAgICAgICAgY3ArKzsKCiAgICAgICAgaWYgKChORVRTTk1QX09JRF9PVVRQVVRfTU9EVUxFID09IG91dHB1dF9mb3JtYXQpCiAgICAgICAgICAgICYmIGNwID4gdGJ1ZikgewogICAgICAgICAgICBjaGFyICAgICAgICAgICAgbW9kYnVmWzI1Nl0gPSB7IDAgfSwgKm1vZCA9CiAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZShzdWJ0cmVlLT5tb2RpZCwgbW9kYnVmKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIERvbid0IGFkZCB0aGUgbW9kdWxlIElEIGlmIGl0J3MganVzdCBudW1lcmljIChpLmUuIHdlIGNvdWxkbid0IGxvb2sKICAgICAgICAgICAgICogaXQgdXAgcHJvcGVybHkuICAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgbW9kYnVmWzBdICE9ICcjJykgewogICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgbW9kKQogICAgICAgICAgICAgICAgICAgIHx8ICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIjo6IikpIHsKICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9VQ0Q6CiAgICB7CiAgICAgICAgUHJlZml4TGlzdFB0ciAgIHBwID0gJm1pYl9wcmVmaXhlc1swXTsKICAgICAgICBzaXplX3QgICAgICAgICAgaWxlbiwgdGxlbjsKICAgICAgICBjb25zdCBjaGFyICAgICAqdGVzdGNwOwoKICAgICAgICBjcCA9IHRidWY7CiAgICAgICAgdGxlbiA9IHN0cmxlbigoY2hhciAqKSB0YnVmKTsKCiAgICAgICAgd2hpbGUgKHBwLT5zdHIpIHsKICAgICAgICAgICAgaWxlbiA9IHBwLT5sZW47CiAgICAgICAgICAgIHRlc3RjcCA9IHBwLT5zdHI7CgogICAgICAgICAgICBpZiAoKHRsZW4gPiBpbGVuKSAmJiBtZW1jbXAodGJ1ZiwgdGVzdGNwLCBpbGVuKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBjcCArPSAoaWxlbiArIDEpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHArKzsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTk9ORToKICAgIGRlZmF1bHQ6CiAgICAgICAgY3AgPSBOVUxMOwogICAgfQoKICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJgogICAgICAgICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSkgewogICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgfQogICAgU05NUF9GUkVFKHRidWYpOwogICAgcmV0dXJuIHN1YnRyZWU7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKaW50CnNwcmludF9yZWFsbG9jX29iamlkKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgYnVmX292ZXJmbG93ID0gMDsKCiAgICBuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZfb3ZlcmZsb3csIG9iamlkLCBvYmppZGxlbik7CiAgICByZXR1cm4gIWJ1Zl9vdmVyZmxvdzsKfQoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX1NQUklOVF9PQkpJRAppbnQKc25wcmludF9vYmppZChjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4pCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKCiAgICBpZiAoc3ByaW50X3JlYWxsb2Nfb2JqaWQoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwgb2JqaWRsZW4pKSB7CiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9TUFJJTlRfT0JKSUQgKi8KCi8qKgogKiBQcmludHMgYW4gb2lkIHRvIHN0ZG91dC4KICoKICogQHBhcmFtIG9iamlkICAgICAgVGhlIG9pZCB0byBwcmludAogKiBAcGFyYW0gb2JqaWRsZW4gICBUaGUgbGVuZ3RoIG9mIG9pZGlkLgogKi8Kdm9pZApwcmludF9vYmppZChjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdWJpZGVudGlmaWVycyAqLwogICAgZnByaW50X29iamlkKHN0ZG91dCwgb2JqaWQsIG9iamlkbGVuKTsKfQoKCi8qKgogKiBQcmludHMgYW4gb2lkIHRvIGEgZmlsZSBkZXNjcmlwdG9yLgogKgogKiBAcGFyYW0gZiAgICAgICAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHByaW50IHRvLgogKiBAcGFyYW0gb2JqaWQgICAgICBUaGUgb2lkIHRvIHByaW50CiAqIEBwYXJhbSBvYmppZGxlbiAgIFRoZSBsZW5ndGggb2Ygb2lkaWQuCiAqLwp2b2lkCmZwcmludF9vYmppZChGSUxFICogZiwgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3ViaWRlbnRpZmllcnMgKi8KICAgIHVfY2hhciAgICAgICAgICpidWYgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIGJ1Zl9sZW4gPSAyNTYsIG91dF9sZW4gPSAwOwogICAgaW50ICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdyA9IDA7CgogICAgaWYgKChidWYgPSAodV9jaGFyICopIGNhbGxvYyhidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoZiwgIltUUlVOQ0FURURdXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICAgIG5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZSgmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZfb3ZlcmZsb3csIG9iamlkLCBvYmppZGxlbik7CiAgICAgICAgaWYgKGJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlcyBbVFJVTkNBVEVEXVxuIiwgYnVmKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlc1xuIiwgYnVmKTsKICAgICAgICB9CiAgICB9CgogICAgU05NUF9GUkVFKGJ1Zik7Cn0KCmludApzcHJpbnRfcmVhbGxvY192YXJpYWJsZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyaWFibGUpCnsKICAgIGludCAgICAgICAgICAgICBidWZfb3ZlcmZsb3cgPSAwOwoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIHN0cnVjdCB0cmVlICAgICpzdWJ0cmVlID0gdHJlZV9oZWFkOwoKICAgIHN1YnRyZWUgPQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICAgICAgbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuKTsKCiAgICBpZiAoYnVmX292ZXJmbG93KSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9CQVJFX1ZBTFVFKSkgewogICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiA9ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiID0gIikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBlbmQgaWYtZWxzZSBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCAqLwogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBpZi1lbHNlIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCAqLwogICAgfSBlbHNlIHsKICAgICAgICAqb3V0X2xlbiA9IDA7CiAgICB9CgogICAgaWYgKHZhcmlhYmxlLT50eXBlID09IFNOTVBfTk9TVUNIT0JKRUNUKSB7CiAgICAgICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gU3VjaCBPYmplY3QgYXZhaWxhYmxlIG9uIHRoaXMgYWdlbnQgYXQgdGhpcyBPSUQiKTsKICAgIH0gZWxzZSBpZiAodmFyaWFibGUtPnR5cGUgPT0gU05NUF9OT1NVQ0hJTlNUQU5DRSkgewogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIFN1Y2ggSW5zdGFuY2UgY3VycmVudGx5IGV4aXN0cyBhdCB0aGlzIE9JRCIpOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZS0+dHlwZSA9PSBTTk1QX0VORE9GTUlCVklFVykgewogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1vcmUgdmFyaWFibGVzIGxlZnQgaW4gdGhpcyBNSUIgVmlldyAoSXQgaXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBNSUIgdHJlZSkiKTsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIH0gZWxzZSBpZiAoc3VidHJlZSkgewogICAgICAgIGNvbnN0IGNoYXIgKnVuaXRzID0gTlVMTDsKICAgICAgICBjb25zdCBjaGFyICpoaW50ID0gTlVMTDsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9ET05UX1BSSU5UX1VOSVRTKSkgewogICAgICAgICAgICB1bml0cyA9IHN1YnRyZWUtPnVuaXRzOwogICAgICAgIH0KCgkJaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfTk9fRElTUExBWV9ISU5UKSkgewoJCQloaW50ID0gc3VidHJlZS0+aGludDsKICAgICAgICB9CgogICAgICAgIGlmIChzdWJ0cmVlLT5wcmludG9tYXQpIHsKICAgICAgICAgICAgcmV0dXJuICgqc3VidHJlZS0+cHJpbnRvbWF0KSAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXJpYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJlZS0+ZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhcmlhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlLT5lbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgICAgIH0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIEhhbmRsZSByYXJlIGNhc2Ugd2hlcmUgdHJlZSBpcyBlbXB0eS4gIAogICAgICAgICAqLwogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICB9Cn0KCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9TTlBSSU5UX1ZBUkFCTEUKaW50CnNucHJpbnRfdmFyaWFibGUoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CgogICAgaWYgKHNwcmludF9yZWFsbG9jX3ZhcmlhYmxlKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuLCB2YXJpYWJsZSkpIHsKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQp9CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX1NOUFJJTlRfVkFSQUJMRSAqLwoKLyoqCiAqIFByaW50cyBhIHZhcmlhYmxlIHRvIHN0ZG91dC4KICoKICogQHBhcmFtIG9iamlkICAgICBUaGUgb2JqZWN0IGlkLgogKiBAcGFyYW0gb2JqaWRsZW4gIFRoZSBsZW5ndGggb2YgdGVoIG9iamVjdCBpZC4KICogQHBhcmFtIHZhcmlhYmxlICBUaGUgdmFyaWFibGUgdG8gcHJpbnQuCiAqLwp2b2lkCnByaW50X3ZhcmlhYmxlKGNvbnN0IG9pZCAqIG9iamlkLAogICAgICAgICAgICAgICBzaXplX3Qgb2JqaWRsZW4sIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICBmcHJpbnRfdmFyaWFibGUoc3Rkb3V0LCBvYmppZCwgb2JqaWRsZW4sIHZhcmlhYmxlKTsKfQoKCi8qKgogKiBQcmludHMgYSB2YXJpYWJsZSB0byBhIGZpbGUgZGVzY3JpcHRvci4KICoKICogQHBhcmFtIGYgICAgICAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHByaW50IHRvLgogKiBAcGFyYW0gb2JqaWQgICAgIFRoZSBvYmplY3QgaWQuCiAqIEBwYXJhbSBvYmppZGxlbiAgVGhlIGxlbmd0aCBvZiB0ZWggb2JqZWN0IGlkLgogKiBAcGFyYW0gdmFyaWFibGUgIFRoZSB2YXJpYWJsZSB0byBwcmludC4KICovCnZvaWQKZnByaW50X3ZhcmlhYmxlKEZJTEUgKiBmLAogICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsCiAgICAgICAgICAgICAgICBzaXplX3Qgb2JqaWRsZW4sIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICB1X2NoYXIgICAgICAgICAqYnVmID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMjU2LCBvdXRfbGVuID0gMDsKCiAgICBpZiAoKGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKGJ1Zl9sZW4sIDEpKSA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihmLCAiW1RSVU5DQVRFRF1cbiIpOwogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHNwcmludF9yZWFsbG9jX3ZhcmlhYmxlKCZidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuLCB2YXJpYWJsZSkpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXNcbiIsIGJ1Zik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgW1RSVU5DQVRFRF1cbiIsIGJ1Zik7CiAgICAgICAgfQogICAgfQoKICAgIFNOTVBfRlJFRShidWYpOwp9CgppbnQKc3ByaW50X3JlYWxsb2NfdmFsdWUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICBpZiAodmFyaWFibGUtPnR5cGUgPT0gU05NUF9OT1NVQ0hPQkpFQ1QpIHsKICAgICAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBTdWNoIE9iamVjdCBhdmFpbGFibGUgb24gdGhpcyBhZ2VudCBhdCB0aGlzIE9JRCIpOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZS0+dHlwZSA9PSBTTk1QX05PU1VDSElOU1RBTkNFKSB7CiAgICAgICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gU3VjaCBJbnN0YW5jZSBjdXJyZW50bHkgZXhpc3RzIGF0IHRoaXMgT0lEIik7CiAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLT50eXBlID09IFNOTVBfRU5ET0ZNSUJWSUVXKSB7CiAgICAgICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gbW9yZSB2YXJpYWJsZXMgbGVmdCBpbiB0aGlzIE1JQiBWaWV3IChJdCBpcyBwYXN0IHRoZSBlbmQgb2YgdGhlIE1JQiB0cmVlKSIpOwogICAgfSBlbHNlIHsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgICAgICBjb25zdCBjaGFyICp1bml0cyA9IE5VTEw7CiAgICAgICAgc3RydWN0IHRyZWUgKnN1YnRyZWUgPSB0cmVlX2hlYWQ7CglzdWJ0cmVlID0gZ2V0X3RyZWUob2JqaWQsIG9iamlkbGVuLCBzdWJ0cmVlKTsKICAgICAgICBpZiAoc3VidHJlZSAmJiAhbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfRE9OVF9QUklOVF9VTklUUykpIHsKICAgICAgICAgICAgdW5pdHMgPSBzdWJ0cmVlLT51bml0czsKICAgICAgICB9CiAgICAgICAgaWYgKHN1YnRyZWUpIHsKCSAgICBpZihzdWJ0cmVlLT5wcmludG9tYXQpIHsKCQlyZXR1cm4gKCpzdWJ0cmVlLT5wcmludG9tYXQpIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCgkJCQkJICAgICAgYWxsb3dfcmVhbGxvYywgdmFyaWFibGUsCgkJCQkJICAgICAgc3VidHJlZS0+ZW51bXMsIHN1YnRyZWUtPmhpbnQsCgkJCQkJICAgICAgdW5pdHMpOwoJICAgIH0gZWxzZSB7CgkJcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAoJCQkJCSAgICAgIGFsbG93X3JlYWxsb2MsIHZhcmlhYmxlLAoJCQkJCSAgICAgIHN1YnRyZWUtPmVudW1zLCBzdWJ0cmVlLT5oaW50LAoJCQkJCSAgICAgIHVuaXRzKTsKCSAgICB9Cgl9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyaWFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICB9Cn0KCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9TTlBSSU5UX1ZBTFVFCi8qIHVzZWQgaW4gdGhlIHBlcmwgbW9kdWxlICovCmludApzbnByaW50X3ZhbHVlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwoKICAgIGlmIChzcHJpbnRfcmVhbGxvY192YWx1ZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgdmFyaWFibGUpKSB7CiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9TTlBSSU5UX1ZBTFVFICovCgp2b2lkCnByaW50X3ZhbHVlKGNvbnN0IG9pZCAqIG9iamlkLAogICAgICAgICAgICBzaXplX3Qgb2JqaWRsZW4sIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICBmcHJpbnRfdmFsdWUoc3Rkb3V0LCBvYmppZCwgb2JqaWRsZW4sIHZhcmlhYmxlKTsKfQoKdm9pZApmcHJpbnRfdmFsdWUoRklMRSAqIGYsCiAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwKICAgICAgICAgICAgIHNpemVfdCBvYmppZGxlbiwgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyaWFibGUpCnsKICAgIHVfY2hhciAgICAgICAgICpidWYgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIGJ1Zl9sZW4gPSAyNTYsIG91dF9sZW4gPSAwOwoKICAgIGlmICgoYnVmID0gKHVfY2hhciAqKSBjYWxsb2MoYnVmX2xlbiwgMSkpID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKGYsICJbVFJVTkNBVEVEXVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAoc3ByaW50X3JlYWxsb2NfdmFsdWUoJmJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwgb2JqaWRsZW4sIHZhcmlhYmxlKSkgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlc1xuIiwgYnVmKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlcyBbVFJVTkNBVEVEXVxuIiwgYnVmKTsKICAgICAgICB9CiAgICB9CgogICAgU05NUF9GUkVFKGJ1Zik7Cn0KCgovKioKICogVGFrZXMgdGhlIHZhbHVlIGluIFZBUiBhbmQgdHVybnMgaXQgaW50byBhbiBPSUQgc2VnbWVudCBpbiB2YXItPm5hbWUuCiAqICAKICogQHBhcmFtIHZhciAgICBUaGUgdmFyaWFibGUuCiAqCiAqIEByZXR1cm4gU05NUEVSUl9TVUNDRVNTIG9yIFNOTVBFUlJfR0VORVJSIAogKi8KaW50CmJ1aWxkX29pZF9zZWdtZW50KG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcikKewogICAgaW50ICAgICAgICAgICAgIGk7CiAgICB1aW50MzJfdCAgICAgICAgaXBhZGRyOwoKICAgIGlmICh2YXItPm5hbWUgJiYgdmFyLT5uYW1lICE9IHZhci0+bmFtZV9sb2MpCiAgICAgICAgU05NUF9GUkVFKHZhci0+bmFtZSk7CiAgICBzd2l0Y2ggKHZhci0+dHlwZSkgewogICAgY2FzZSBBU05fSU5URUdFUjoKICAgIGNhc2UgQVNOX0NPVU5URVI6CiAgICBjYXNlIEFTTl9HQVVHRToKICAgIGNhc2UgQVNOX1RJTUVUSUNLUzoKICAgICAgICB2YXItPm5hbWVfbGVuZ3RoID0gMTsKICAgICAgICB2YXItPm5hbWUgPSB2YXItPm5hbWVfbG9jOwogICAgICAgIHZhci0+bmFtZVswXSA9ICoodmFyLT52YWwuaW50ZWdlcik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fSVBBRERSRVNTOgogICAgICAgIHZhci0+bmFtZV9sZW5ndGggPSA0OwogICAgICAgIHZhci0+bmFtZSA9IHZhci0+bmFtZV9sb2M7CiAgICAgICAgbWVtY3B5KCZpcGFkZHIsIHZhci0+dmFsLnN0cmluZywgc2l6ZW9mKGlwYWRkcikpOwogICAgICAgIHZhci0+bmFtZVswXSA9IChpcGFkZHIgPj4gMjQpICYgMHhmZjsKICAgICAgICB2YXItPm5hbWVbMV0gPSAoaXBhZGRyID4+IDE2KSAmIDB4ZmY7CiAgICAgICAgdmFyLT5uYW1lWzJdID0gKGlwYWRkciA+PiAgOCkgJiAweGZmOwogICAgICAgIHZhci0+bmFtZVszXSA9IChpcGFkZHIgPj4gIDApICYgMHhmZjsKICAgICAgICBicmVhazsKICAgICAgICAKICAgIGNhc2UgQVNOX1BSSVZfSU1QTElFRF9PQkpFQ1RfSUQ6CiAgICAgICAgdmFyLT5uYW1lX2xlbmd0aCA9IHZhci0+dmFsX2xlbiAvIHNpemVvZihvaWQpOwogICAgICAgIGlmICh2YXItPm5hbWVfbGVuZ3RoID4gKHNpemVvZih2YXItPm5hbWVfbG9jKSAvIHNpemVvZihvaWQpKSkKICAgICAgICAgICAgdmFyLT5uYW1lID0gKG9pZCAqKSBtYWxsb2Moc2l6ZW9mKG9pZCkgKiAodmFyLT5uYW1lX2xlbmd0aCkpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFyLT5uYW1lID0gdmFyLT5uYW1lX2xvYzsKICAgICAgICBpZiAodmFyLT5uYW1lID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIHZhci0+bmFtZV9sZW5ndGg7IGkrKykKICAgICAgICAgICAgdmFyLT5uYW1lW2ldID0gdmFyLT52YWwub2JqaWRbaV07CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT0JKRUNUX0lEOgogICAgICAgIHZhci0+bmFtZV9sZW5ndGggPSB2YXItPnZhbF9sZW4gLyBzaXplb2Yob2lkKSArIDE7CiAgICAgICAgaWYgKHZhci0+bmFtZV9sZW5ndGggPiAoc2l6ZW9mKHZhci0+bmFtZV9sb2MpIC8gc2l6ZW9mKG9pZCkpKQogICAgICAgICAgICB2YXItPm5hbWUgPSAob2lkICopIG1hbGxvYyhzaXplb2Yob2lkKSAqICh2YXItPm5hbWVfbGVuZ3RoKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICB2YXItPm5hbWUgPSB2YXItPm5hbWVfbG9jOwogICAgICAgIGlmICh2YXItPm5hbWUgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgICAgICB2YXItPm5hbWVbMF0gPSB2YXItPm5hbWVfbGVuZ3RoIC0gMTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgdmFyLT5uYW1lX2xlbmd0aCAtIDE7IGkrKykKICAgICAgICAgICAgdmFyLT5uYW1lW2kgKyAxXSA9IHZhci0+dmFsLm9iamlkW2ldOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX1BSSVZfSU1QTElFRF9PQ1RFVF9TVFI6CiAgICAgICAgdmFyLT5uYW1lX2xlbmd0aCA9IHZhci0+dmFsX2xlbjsKICAgICAgICBpZiAodmFyLT5uYW1lX2xlbmd0aCA+IChzaXplb2YodmFyLT5uYW1lX2xvYykgLyBzaXplb2Yob2lkKSkpCiAgICAgICAgICAgIHZhci0+bmFtZSA9IChvaWQgKikgbWFsbG9jKHNpemVvZihvaWQpICogKHZhci0+bmFtZV9sZW5ndGgpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHZhci0+bmFtZSA9IHZhci0+bmFtZV9sb2M7CiAgICAgICAgaWYgKHZhci0+bmFtZSA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSB2YXItPnZhbF9sZW47IGkrKykKICAgICAgICAgICAgdmFyLT5uYW1lW2ldID0gKG9pZCkgdmFyLT52YWwuc3RyaW5nW2ldOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX09QQVFVRToKICAgIGNhc2UgQVNOX09DVEVUX1NUUjoKICAgICAgICB2YXItPm5hbWVfbGVuZ3RoID0gdmFyLT52YWxfbGVuICsgMTsKICAgICAgICBpZiAodmFyLT5uYW1lX2xlbmd0aCA+IChzaXplb2YodmFyLT5uYW1lX2xvYykgLyBzaXplb2Yob2lkKSkpCiAgICAgICAgICAgIHZhci0+bmFtZSA9IChvaWQgKikgbWFsbG9jKHNpemVvZihvaWQpICogKHZhci0+bmFtZV9sZW5ndGgpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHZhci0+bmFtZSA9IHZhci0+bmFtZV9sb2M7CiAgICAgICAgaWYgKHZhci0+bmFtZSA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CgogICAgICAgIHZhci0+bmFtZVswXSA9IChvaWQpIHZhci0+dmFsX2xlbjsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgdmFyLT52YWxfbGVuOyBpKyspCiAgICAgICAgICAgIHZhci0+bmFtZVtpICsgMV0gPSAob2lkKSB2YXItPnZhbC5zdHJpbmdbaV07CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgiYnVpbGRfb2lkX3NlZ21lbnQiLAogICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGFzbiB0eXBlOiAlZFxuIiwgdmFyLT50eXBlKSk7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgfQoKICAgIGlmICh2YXItPm5hbWVfbGVuZ3RoID4gTUFYX09JRF9MRU4pIHsKICAgICAgICBERUJVR01TR1RMKCgiYnVpbGRfb2lkX3NlZ21lbnQiLAogICAgICAgICAgICAgICAgICAgICJTb21ldGhpbmcgdGVycmlibHkgd3JvbmcsIG5hbWVsZW4gPSAlbHVcbiIsCiAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpdmFyLT5uYW1lX2xlbmd0aCkpOwogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIH0KCiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgoKaW50CmJ1aWxkX29pZF9ub2FsbG9jKG9pZCAqIGluLCBzaXplX3QgaW5fbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICBvaWQgKiBwcmVmaXgsIHNpemVfdCBwcmVmaXhfbGVuLAogICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiBpbmRleGVzKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcjsKCiAgICBpZiAocHJlZml4KSB7CiAgICAgICAgaWYgKGluX2xlbiA8IHByZWZpeF9sZW4pCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICBtZW1jcHkoaW4sIHByZWZpeCwgcHJlZml4X2xlbiAqIHNpemVvZihvaWQpKTsKICAgICAgICAqb3V0X2xlbiA9IHByZWZpeF9sZW47CiAgICB9IGVsc2UgewogICAgICAgICpvdXRfbGVuID0gMDsKICAgIH0KCiAgICBmb3IgKHZhciA9IGluZGV4ZXM7IHZhciAhPSBOVUxMOyB2YXIgPSB2YXItPm5leHRfdmFyaWFibGUpIHsKICAgICAgICBpZiAoYnVpbGRfb2lkX3NlZ21lbnQodmFyKSAhPSBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICBpZiAodmFyLT5uYW1lX2xlbmd0aCArICpvdXRfbGVuIDw9IGluX2xlbikgewogICAgICAgICAgICBtZW1jcHkoJihpblsqb3V0X2xlbl0pLCB2YXItPm5hbWUsCiAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSAqIHZhci0+bmFtZV9sZW5ndGgpOwogICAgICAgICAgICAqb3V0X2xlbiArPSB2YXItPm5hbWVfbGVuZ3RoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICB9CiAgICB9CgogICAgREVCVUdNU0dUTCgoImJ1aWxkX29pZF9ub2FsbG9jIiwgImdlbmVyYXRlZDogIikpOwogICAgREVCVUdNU0dPSUQoKCJidWlsZF9vaWRfbm9hbGxvYyIsIGluLCAqb3V0X2xlbikpOwogICAgREVCVUdNU0coKCJidWlsZF9vaWRfbm9hbGxvYyIsICJcbiIpKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCmludApidWlsZF9vaWQob2lkICoqIG91dCwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgIG9pZCAqIHByZWZpeCwgc2l6ZV90IHByZWZpeF9sZW4sIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIGluZGV4ZXMpCnsKICAgIG9pZCAgICAgICAgICAgICB0bXBvdXRbTUFYX09JRF9MRU5dOwoKICAgIC8qCiAgICAgKiB4eHgtcmtzOiBpbmVmZmljZW50LiB0cnkgb25seSBidWlsZGluZyBzZWdtZW50cyB0byBmaW5kIGluZGV4IGxlbjoKICAgICAqICAgZm9yICh2YXIgPSBpbmRleGVzOyB2YXIgIT0gTlVMTDsgdmFyID0gdmFyLT5uZXh0X3ZhcmlhYmxlKSB7CiAgICAgKiAgICAgIGlmIChidWlsZF9vaWRfc2VnbWVudCh2YXIpICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAqICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICogICAgICAqb3V0X2xlbiArPSB2YXItPm5hbWVfbGVuZ3RoOwogICAgICoKICAgICAqIHRoZW4gc2VlIGlmIGl0IGZpdHMgaW4gZXhpc3RpbmcgYnVmZmVyLCBvciByZWFsbG9jIGJ1ZmZlci4KICAgICAqLwogICAgaWYgKGJ1aWxkX29pZF9ub2FsbG9jKHRtcG91dCwgc2l6ZW9mKHRtcG91dCksIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LCBwcmVmaXhfbGVuLCBpbmRleGVzKSAhPSBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgIC8qKiB4eHgtcmtzOiBzaG91bGQgZnJlZSBwcmV2aW91cyB2YWx1ZT8gKi8KICAgIHNubXBfY2xvbmVfbWVtKCh2b2lkICoqKSBvdXQsICh2b2lkICopIHRtcG91dCwgKm91dF9sZW4gKiBzaXplb2Yob2lkKSk7CgogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKLyoKICogdmJsaXN0X291dCBtdXN0IGNvbnRhaW4gYSBwcmUtYWxsb2NhdGVkIHN0cmluZyBvZiB2YXJpYWJsZXMgaW50bwogKiB3aGljaCBpbmRleGVzIGNhbiBiZSBleHRyYWN0ZWQgYmFzZWQgb24gdGhlIHByZXZpb3VzbHkgZXhpc3RpbmcKICogdHlwZXMgaW4gdGhlIHZhcmlhYmxlIGNoYWluCiAqIHJldHVybnM6CiAqIFNOTVBFUlJfR0VORVJSICBvbiBlcnJvcgogKiBTTk1QRVJSX1NVQ0NFU1Mgb24gc3VjY2VzcwogKi8KCmludApwYXJzZV9vaWRfaW5kZXhlcyhvaWQgKiBvaWRJbmRleCwgc2l6ZV90IG9pZExlbiwKICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICogZGF0YSkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXIgPSBkYXRhOwoKICAgIHdoaWxlICh2YXIgJiYgb2lkTGVuID4gMCkgewoKICAgICAgICBpZiAocGFyc2Vfb25lX29pZF9pbmRleCgmb2lkSW5kZXgsICZvaWRMZW4sIHZhciwgMCkgIT0KICAgICAgICAgICAgU05NUEVSUl9TVUNDRVNTKQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgdmFyID0gdmFyLT5uZXh0X3ZhcmlhYmxlOwogICAgfQoKICAgIGlmICh2YXIgIT0gTlVMTCB8fCBvaWRMZW4gIT0gMCkKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgoKaW50CnBhcnNlX29uZV9vaWRfaW5kZXgob2lkICoqIG9pZFN0YXJ0LCBzaXplX3QgKiBvaWRMZW4sCiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICogZGF0YSwgaW50IGNvbXBsZXRlKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhciA9IGRhdGE7CiAgICBvaWQgICAgICAgICAgICAgdG1wb3V0W01BWF9PSURfTEVOXTsKICAgIHVuc2lnbmVkIGludCAgICBpOwogICAgdW5zaWduZWQgaW50ICAgIHVpdG1wID0gMDsKCiAgICBvaWQgICAgICAgICAgICAqb2lkSW5kZXggPSAqb2lkU3RhcnQ7CgogICAgaWYgKHZhciA9PSBOVUxMIHx8ICgoKm9pZExlbiA9PSAwKSAmJiAoY29tcGxldGUgPT0gMCkpKQogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIGVsc2UgewogICAgICAgIHN3aXRjaCAodmFyLT50eXBlKSB7CiAgICAgICAgY2FzZSBBU05fSU5URUdFUjoKICAgICAgICBjYXNlIEFTTl9DT1VOVEVSOgogICAgICAgIGNhc2UgQVNOX0dBVUdFOgogICAgICAgIGNhc2UgQVNOX1RJTUVUSUNLUzoKICAgICAgICAgICAgaWYgKCpvaWRMZW4pIHsKICAgICAgICAgICAgICAgIHNubXBfc2V0X3Zhcl92YWx1ZSh2YXIsICh1X2NoYXIgKikgb2lkSW5kZXgrKywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICAtLSgqb2lkTGVuKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNubXBfc2V0X3Zhcl92YWx1ZSh2YXIsICh1X2NoYXIgKikgb2lkTGVuLCBzaXplb2YobG9uZykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJQYXJzZWQgaW50KCVkKTogJWxkXG4iLCB2YXItPnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICp2YXItPnZhbC5pbnRlZ2VyKSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEFTTl9JUEFERFJFU1M6CiAgICAgICAgICAgIGlmICgoNCA+ICpvaWRMZW4pICYmIChjb21wbGV0ZSA9PSAwKSkKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0ICYmIGkgPCAqb2lkTGVuOyArK2kpIHsKICAgICAgICAgICAgICAgIGlmIChvaWRJbmRleFtpXSA+IDI1NSkgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgb2lkIGluIGluZGV4OiAlIiBORVRTTk1QX1BSSW8gImRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkSW5kZXhbMF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOyAgLyogc3ViLWlkZW50aWZpZXIgdG9vIGxhcmdlICovCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gdWl0bXAgKyAob2lkSW5kZXhbaV0gPDwgKDgqKDMtaSkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKDQgPiAoaW50KSAoKm9pZExlbikpIHsKICAgICAgICAgICAgICAgIG9pZEluZGV4ICs9ICpvaWRMZW47CiAgICAgICAgICAgICAgICAoKm9pZExlbikgPSAwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2lkSW5kZXggKz0gNDsKICAgICAgICAgICAgICAgICgqb2lkTGVuKSAtPSA0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVpdG1wID0gaHRvbmwodWl0bXApOyAvKiBwdXQgaXQgaW4gcHJvcGVyIG9yZGVyIGZvciBieXRlIGNvcGllcyAqLwogICAgICAgICAgICB1aXRtcCA9IAogICAgICAgICAgICAgICAgc25tcF9zZXRfdmFyX3ZhbHVlKHZhciwgKHVfY2hhciAqKSAmdWl0bXAsIDQpOwogICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiUGFyc2VkIGlwYWRkciglZCk6ICVkLiVkLiVkLiVkXG4iLCB2YXItPnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZ1swXSwgdmFyLT52YWwuc3RyaW5nWzFdLAogICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmdbMl0sIHZhci0+dmFsLnN0cmluZ1szXSkpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBBU05fT0JKRUNUX0lEOgogICAgICAgIGNhc2UgQVNOX1BSSVZfSU1QTElFRF9PQkpFQ1RfSUQ6CiAgICAgICAgICAgIGlmICh2YXItPnR5cGUgPT0gQVNOX1BSSVZfSU1QTElFRF9PQkpFQ1RfSUQpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBtaWdodCBub3QgYmUgaW1wbGllZCwgbWlnaHQgYmUgZml4ZWQgbGVuLiBjaGVjayBpZgogICAgICAgICAgICAgICAgICogY2FsbGVyIHNldCB1cCB2YWwgbGVuLCBhbmQgdXNlIGl0IGlmIHRoZXkgZGlkLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoMCA9PSB2YXItPnZhbF9sZW4pCiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSAqb2lkTGVuOwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzOmZpeCIsICJmaXhlZCBsZW4gb2lkXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSB2YXItPnZhbF9sZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoKm9pZExlbikgewogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gKm9pZEluZGV4Kys7CiAgICAgICAgICAgICAgICAgICAgLS0oKm9pZExlbik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgodWl0bXAgPiAqb2lkTGVuKSAmJiAoY29tcGxldGUgPT0gMCkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodWl0bXAgPiBNQVhfT0lEX0xFTikKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsgIC8qIHRvbyBiaWcgYW5kIGlsbGVnYWwgKi8KCiAgICAgICAgICAgIGlmICh1aXRtcCA+ICpvaWRMZW4pIHsKICAgICAgICAgICAgICAgIG1lbWNweSh0bXBvdXQsIG9pZEluZGV4LCBzaXplb2Yob2lkKSAqICgqb2lkTGVuKSk7CiAgICAgICAgICAgICAgICBtZW1zZXQoJnRtcG91dFsqb2lkTGVuXSwgMHgwMCwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSAqICh1aXRtcCAtICpvaWRMZW4pKTsKICAgICAgICAgICAgICAgIHNubXBfc2V0X3Zhcl92YWx1ZSh2YXIsICh1X2NoYXIgKikgdG1wb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICogdWl0bXApOwogICAgICAgICAgICAgICAgb2lkSW5kZXggKz0gKm9pZExlbjsKICAgICAgICAgICAgICAgICgqb2lkTGVuKSA9IDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzbm1wX3NldF92YXJfdmFsdWUodmFyLCAodV9jaGFyICopIG9pZEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICogdWl0bXApOwogICAgICAgICAgICAgICAgb2lkSW5kZXggKz0gdWl0bXA7CiAgICAgICAgICAgICAgICAoKm9pZExlbikgLT0gdWl0bXA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlcyIsICJQYXJzZWQgb2lkOiAiKSk7CiAgICAgICAgICAgIERFQlVHTVNHT0lEKCgicGFyc2Vfb2lkX2luZGV4ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwub2JqaWQsIHZhci0+dmFsX2xlbiAvIHNpemVvZihvaWQpKSk7CiAgICAgICAgICAgIERFQlVHTVNHKCgicGFyc2Vfb2lkX2luZGV4ZXMiLCAiXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEFTTl9PUEFRVUU6CiAgICAgICAgY2FzZSBBU05fT0NURVRfU1RSOgogICAgICAgIGNhc2UgQVNOX1BSSVZfSU1QTElFRF9PQ1RFVF9TVFI6CiAgICAgICAgICAgIGlmICh2YXItPnR5cGUgPT0gQVNOX1BSSVZfSU1QTElFRF9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBtaWdodCBub3QgYmUgaW1wbGllZCwgbWlnaHQgYmUgZml4ZWQgbGVuLiBjaGVjayBpZgogICAgICAgICAgICAgICAgICogY2FsbGVyIHNldCB1cCB2YWwgbGVuLCBhbmQgdXNlIGl0IGlmIHRoZXkgZGlkLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoMCA9PSB2YXItPnZhbF9sZW4pCiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSAqb2lkTGVuOwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzOmZpeCIsICJmaXhlZCBsZW4gc3RyXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSB2YXItPnZhbF9sZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoKm9pZExlbikgewogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gKm9pZEluZGV4Kys7CiAgICAgICAgICAgICAgICAgICAgLS0oKm9pZExlbik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgodWl0bXAgPiAqb2lkTGVuKSAmJiAoY29tcGxldGUgPT0gMCkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiB3ZSBoYW5kbGUgdGhpcyBvbmUgb3Vyc2VsdmVzIHNpbmNlIHdlIGRvbid0IGhhdmUKICAgICAgICAgICAgICogcHJlLWFsbG9jYXRlZCBtZW1vcnkgdG8gY29weSBmcm9tIHVzaW5nCiAgICAgICAgICAgICAqIHNubXBfc2V0X3Zhcl92YWx1ZSgpIAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIGlmICh1aXRtcCA9PSAwKQogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIHplcm8gbGVuZ3RoIHN0cmluZ3Mgc2hvdWxkbid0IG1hbGxvYyAqLwoKICAgICAgICAgICAgaWYgKHVpdG1wID4gTUFYX09JRF9MRU4pCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7ICAvKiB0b28gYmlnIGFuZCBpbGxlZ2FsICovCgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBtYWxsb2MgYnkgc2l6ZSsxIHRvIGFsbG93IGEgbnVsbCB0byBiZSBhcHBlbmRlZC4gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB2YXItPnZhbF9sZW4gPSB1aXRtcDsKICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nID0gKHVfY2hhciAqKSBjYWxsb2MoMSwgdWl0bXAgKyAxKTsKICAgICAgICAgICAgaWYgKHZhci0+dmFsLnN0cmluZyA9PSBOVUxMKQogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgICAgICAgICAgaWYgKChzaXplX3QpdWl0bXAgPiAoKm9pZExlbikpIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAqb2lkTGVuOyArK2kpCiAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nW2ldID0gKHVfY2hhcikgKiBvaWRJbmRleCsrOwogICAgICAgICAgICAgICAgZm9yIChpID0gKm9pZExlbjsgaSA8IHVpdG1wOyArK2kpCiAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nW2ldID0gJ1wwJzsKICAgICAgICAgICAgICAgICgqb2lkTGVuKSA9IDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdWl0bXA7ICsraSkKICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmdbaV0gPSAodV9jaGFyKSAqIG9pZEluZGV4Kys7CiAgICAgICAgICAgICAgICAoKm9pZExlbikgLT0gdWl0bXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nW3VpdG1wXSA9ICdcMCc7CgogICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiUGFyc2VkIHN0ciglZCk6ICVzXG4iLCB2YXItPnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZykpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgYXNuIHR5cGU6ICVkXG4iLCB2YXItPnR5cGUpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgIH0KICAgIH0KICAgICgqb2lkU3RhcnQpID0gb2lkSW5kZXg7CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgovKgogKiBkdW1wX3JlYWxsb2Nfb2lkX3RvX2luZXRhZGRyZXNzOgogKiAgIHJldHVybiAwIGZvciBmYWlsdXJlLAogKiAgIHJldHVybiAxIGZvciBzdWNjZXNzLAogKiAgIHJldHVybiAyIGZvciBub3QgaGFuZGxlZAogKi8KCmludCAKZHVtcF9yZWFsbG9jX29pZF90b19pbmV0YWRkcmVzcyhjb25zdCBpbnQgYWRkcl90eXBlLCBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHF1b3RlY2hhcikKewogICAgaW50ICAgICAgICAgICAgIGksIGxlbjsKICAgIGNoYXIgICAgICAgICAgICBpbnRidWZbNjRdLCAqcDsKICAgIGNoYXIgKmNvbnN0ICAgICBlbmQgPSBpbnRidWYgKyBzaXplb2YoaW50YnVmKTsKICAgIHVuc2lnbmVkIGNoYXIgICp6YzsKICAgIHVuc2lnbmVkIGxvbmcgICB6b25lOwoKICAgIGlmICghYnVmKQogICAgICAgIHJldHVybiAxOwoKICAgIGZvciAoaSA9IDA7IGkgPCBvYmppZGxlbjsgaSsrKQogICAgICAgIGlmIChvYmppZFtpXSA8IDAgfHwgb2JqaWRbaV0gPiAyNTUpCiAgICAgICAgICAgIHJldHVybiAyOwoKICAgIHAgPSBpbnRidWY7CiAgICAqcCsrID0gcXVvdGVjaGFyOwoKICAgIHN3aXRjaCAoYWRkcl90eXBlKSB7CiAgICBjYXNlIElQVjQ6CiAgICBjYXNlIElQVjRaOgogICAgICAgIGlmICgoYWRkcl90eXBlID09IElQVjQgICYmIG9iamlkbGVuICE9IDQpIHx8CiAgICAgICAgICAgIChhZGRyX3R5cGUgPT0gSVBWNFogJiYgb2JqaWRsZW4gIT0gOCkpCiAgICAgICAgICAgIHJldHVybiAyOwoKICAgICAgICBsZW4gPSBzbnByaW50ZihwLCBlbmQgLSBwLCAiJSIgTkVUU05NUF9QUklvICJ1LiUiIE5FVFNOTVBfUFJJbyAidS4iCiAgICAgICAgICAgICAgICAgICAgICAiJSIgTkVUU05NUF9QUklvICJ1LiUiIE5FVFNOTVBfUFJJbyAidSIsCiAgICAgICAgICAgICAgICAgICAgICBvYmppZFswXSwgb2JqaWRbMV0sIG9iamlkWzJdLCBvYmppZFszXSk7CiAgICAgICAgcCArPSBsZW47CiAgICAgICAgaWYgKHAgPj0gZW5kKQogICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICBpZiAoYWRkcl90eXBlID09IElQVjRaKSB7CiAgICAgICAgICAgIHpjID0gKHVuc2lnbmVkIGNoYXIqKSZ6b25lOwogICAgICAgICAgICB6Y1swXSA9IG9iamlkWzRdOwogICAgICAgICAgICB6Y1sxXSA9IG9iamlkWzVdOwogICAgICAgICAgICB6Y1syXSA9IG9iamlkWzZdOwogICAgICAgICAgICB6Y1szXSA9IG9iamlkWzddOwogICAgICAgICAgICB6b25lID0gbnRvaGwoem9uZSk7CiAgICAgICAgICAgIGxlbiA9IHNucHJpbnRmKHAsIGVuZCAtIHAsICIlJSVsdSIsIHpvbmUpOwogICAgICAgICAgICBwICs9IGxlbjsKICAgICAgICAgICAgaWYgKHAgPj0gZW5kKQogICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgfQoKICAgICAgICBicmVhazsKCiAgICBjYXNlIElQVjY6CiAgICBjYXNlIElQVjZaOgogICAgICAgIGlmICgoYWRkcl90eXBlID09IElQVjYgJiYgb2JqaWRsZW4gIT0gMTYpIHx8CiAgICAgICAgICAgIChhZGRyX3R5cGUgPT0gSVBWNlogJiYgb2JqaWRsZW4gIT0gMjApKQogICAgICAgICAgICByZXR1cm4gMjsKCiAgICAgICAgbGVuID0gMDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKyspIHsKICAgICAgICAgICAgbGVuID0gc25wcmludGYocCwgZW5kIC0gcCwgIiVzJTAyIiBORVRTTk1QX1BSSW8gIngiLCBpID8gIjoiIDogIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkW2ldKTsKICAgICAgICAgICAgcCArPSBsZW47CiAgICAgICAgICAgIGlmIChwID49IGVuZCkKICAgICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgIH0KCiAgICAgICAgaWYgKGFkZHJfdHlwZSA9PSBJUFY2WikgewogICAgICAgICAgICB6YyA9ICh1bnNpZ25lZCBjaGFyKikmem9uZTsKICAgICAgICAgICAgemNbMF0gPSBvYmppZFsxNl07CiAgICAgICAgICAgIHpjWzFdID0gb2JqaWRbMTddOwogICAgICAgICAgICB6Y1syXSA9IG9iamlkWzE4XTsKICAgICAgICAgICAgemNbM10gPSBvYmppZFsxOV07CiAgICAgICAgICAgIHpvbmUgPSBudG9obCh6b25lKTsKICAgICAgICAgICAgbGVuID0gc25wcmludGYocCwgZW5kIC0gcCwgIiUlJWx1Iiwgem9uZSk7CiAgICAgICAgICAgIHAgKz0gbGVuOwogICAgICAgICAgICBpZiAocCA+PSBlbmQpCiAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICB9CgogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgRE5TOgogICAgZGVmYXVsdDogCiAgICAgICAgLyogRE5TIGNhbiBqdXN0IGJlIGhhbmRsZWQgYnkgZHVtcF9yZWFsbG9jX29pZF90b19zdHJpbmcoKSAqLwogICAgICAgIHJldHVybiAyOwogICAgfQoKICAgICpwKysgPSBxdW90ZWNoYXI7CiAgICBpZiAocCA+PSBlbmQpCiAgICAgICAgcmV0dXJuIDI7CgogICAgKnArKyA9ICdcMCc7CiAgICBpZiAocCA+PSBlbmQpCiAgICAgICAgcmV0dXJuIDI7CgogICAgcmV0dXJuIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGludGJ1Zik7Cn0KCmludApkdW1wX3JlYWxsb2Nfb2lkX3RvX3N0cmluZyhjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBxdW90ZWNoYXIpCnsKICAgIGlmIChidWYpIHsKICAgICAgICBpbnQgICAgICAgICAgICAgaSwgYWxlbjsKCiAgICAgICAgZm9yIChpID0gMCwgYWxlbiA9IDA7IGkgPCAoaW50KSBvYmppZGxlbjsgaSsrKSB7CiAgICAgICAgICAgIG9pZCAgICAgICAgICAgICB0c3QgPSBvYmppZFtpXTsKICAgICAgICAgICAgaWYgKCh0c3QgPiAyNTQpIHx8ICghaXNwcmludCh0c3QpKSkgewogICAgICAgICAgICAgICAgdHN0ID0gKG9pZCkgJy4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoYWxlbiA9PSAwKSB7CiAgICAgICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VTQ0FQRV9RVU9URVMpKSB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDIpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnXFwnOwogICAgICAgICAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IHF1b3RlY2hhcjsKICAgICAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDIpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IChjaGFyKSB0c3Q7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAgICAgYWxlbisrOwogICAgICAgIH0KCiAgICAgICAgaWYgKGFsZW4pIHsKICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FU0NBUEVfUVVPVEVTKSkgewogICAgICAgICAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDIpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1xcJzsKICAgICAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gcXVvdGVjaGFyOwogICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgfQoKICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnXDAnOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgp2b2lkCl9vaWRfZmluaXNoX3ByaW50aW5nKGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLCBpbnQgKmJ1Zl9vdmVyZmxvdykgewogICAgY2hhciAgICAgICAgICAgIGludGJ1Zls2NF07CiAgICBpZiAoKmJ1ZiAhPSBOVUxMICYmICooKmJ1ZiArICpvdXRfbGVuIC0gMSkgIT0gJy4nKSB7CiAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiLiIpKSB7CiAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICB3aGlsZSAob2JqaWRsZW4tLSA+IDApIHsgICAgLyogb3V0cHV0IHJlc3Qgb2YgbmFtZSwgdW5pbnRlcnByZXRlZCAqLwogICAgICAgIHNwcmludGYoaW50YnVmLCAiJSIgTkVUU05NUF9QUklvICJ1LiIsICpvYmppZCsrKTsKICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGludGJ1ZikpIHsKICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIGlmICgqYnVmICE9IE5VTEwpIHsKICAgICAgICAqKCpidWYgKyAqb3V0X2xlbiAtIDEpID0gJ1wwJzsgIC8qIHJlbW92ZSB0cmFpbGluZyBkb3QgKi8KICAgICAgICAqb3V0X2xlbiA9ICpvdXRfbGVuIC0gMTsKICAgIH0KfQoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKc3RhdGljIHN0cnVjdCB0cmVlICoKX2dldF9yZWFsbG9jX3N5bWJvbChjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmVlICpzdWJ0cmVlLAogICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsIGludCAqYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbmRleF9saXN0ICppbl9kaWNlcywgc2l6ZV90ICogZW5kX29mX2tub3duKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqcmV0dXJuX3RyZWUgPSBOVUxMOwogICAgaW50ICAgICAgICAgICAgIGV4dGVuZGVkX2luZGV4ID0KICAgICAgICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVhURU5ERURfSU5ERVgpOwogICAgaW50ICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQgPQogICAgICAgIG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFUKTsKICAgIGNoYXIgICAgICAgICAgICBpbnRidWZbNjRdOwoKICAgIGlmICghb2JqaWQgfHwgIWJ1ZikgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGZvciAoOyBzdWJ0cmVlOyBzdWJ0cmVlID0gc3VidHJlZS0+bmV4dF9wZWVyKSB7CiAgICAgICAgaWYgKCpvYmppZCA9PSBzdWJ0cmVlLT5zdWJpZCkgewoJICAgIHdoaWxlIChzdWJ0cmVlLT5uZXh0X3BlZXIgJiYgc3VidHJlZS0+bmV4dF9wZWVyLT5zdWJpZCA9PSAqb2JqaWQpCgkJc3VidHJlZSA9IHN1YnRyZWUtPm5leHRfcGVlcjsKICAgICAgICAgICAgaWYgKHN1YnRyZWUtPmluZGV4ZXMpIHsKICAgICAgICAgICAgICAgIGluX2RpY2VzID0gc3VidHJlZS0+aW5kZXhlczsKICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJ0cmVlLT5hdWdtZW50cykgewogICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgICAgKnRwMiA9CiAgICAgICAgICAgICAgICAgICAgZmluZF90cmVlX25vZGUoc3VidHJlZS0+YXVnbWVudHMsIC0xKTsKICAgICAgICAgICAgICAgIGlmICh0cDIpIHsKICAgICAgICAgICAgICAgICAgICBpbl9kaWNlcyA9IHRwMi0+aW5kZXhlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzdHJuY21wKHN1YnRyZWUtPmxhYmVsLCBBTk9OLCBBTk9OX0xFTikgfHwKICAgICAgICAgICAgICAgIChORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQyA9PSBvdXRwdXRfZm9ybWF0KSkgewogICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlbHUiLCBzdWJ0cmVlLT5zdWJpZCk7CiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlLT5sYWJlbCkpIHsKICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKG9iamlkbGVuID4gMSkgewogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIi4iKSkgewogICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybl90cmVlID0gX2dldF9yZWFsbG9jX3N5bWJvbChvYmppZCArIDEsIG9iamlkbGVuIC0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlLT5jaGlsZF9saXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdywgaW5fZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX29mX2tub3duKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHJldHVybl90cmVlICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5fdHJlZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBzdWJ0cmVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKCiAgICBpZiAoZW5kX29mX2tub3duKSB7CiAgICAgICAgKmVuZF9vZl9rbm93biA9ICpvdXRfbGVuOwogICAgfQoKICAgIC8qCiAgICAgKiBTdWJ0cmVlIG5vdCBmb3VuZC4gIAogICAgICovCgogICAgd2hpbGUgKGluX2RpY2VzICYmIChvYmppZGxlbiA+IDApICYmCiAgICAgICAgICAgKE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDICE9IG91dHB1dF9mb3JtYXQpICYmCiAgICAgICAgICAgIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9ET05UX0JSRUFLRE9XTl9PSURTKSkgewogICAgICAgIHNpemVfdCAgICAgICAgICBudW1pZHM7CiAgICAgICAgc3RydWN0IHRyZWUgICAgKnRwOwoKICAgICAgICB0cCA9IGZpbmRfdHJlZV9ub2RlKGluX2RpY2VzLT5pbGFiZWwsIC0xKTsKCiAgICAgICAgaWYgKCF0cCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBDYW4ndCBmaW5kIGFuIGluZGV4IGluIHRoZSBtaWIgdHJlZS4gIEJhaWwuICAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgIH0KCiAgICAgICAgaWYgKGV4dGVuZGVkX2luZGV4KSB7CiAgICAgICAgICAgIGlmICgqYnVmICE9IE5VTEwgJiYgKigqYnVmICsgKm91dF9sZW4gLSAxKSA9PSAnLicpIHsKICAgICAgICAgICAgICAgICgqb3V0X2xlbiktLTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIlsiKSkgewogICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHN3aXRjaCAodHAtPnR5cGUpIHsKICAgICAgICBjYXNlIFRZUEVfT0NURVRTVFI6CiAgICAgICAgICAgIGlmIChleHRlbmRlZF9pbmRleCAmJiB0cC0+aGludCkgewogICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0IHZhcjsKICAgICAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBidWZmZXJbMTAyNF07CiAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgaTsKCiAgICAgICAgICAgICAgICBtZW1zZXQoJnZhciwgMCwgc2l6ZW9mIHZhcik7CiAgICAgICAgICAgICAgICBpZiAoaW5fZGljZXMtPmlzaW1wbGllZCkgewogICAgICAgICAgICAgICAgICAgIG51bWlkcyA9IG9iamlkbGVuOwogICAgICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRwLT5yYW5nZXMgJiYgIXRwLT5yYW5nZXMtPm5leHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHAtPnJhbmdlcy0+bG93ID09IHRwLT5yYW5nZXMtPmhpZ2gpIHsKICAgICAgICAgICAgICAgICAgICBudW1pZHMgPSB0cC0+cmFuZ2VzLT5sb3c7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bWlkcyA+IG9iamlkbGVuKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbnVtaWRzID0gKm9iamlkOwogICAgICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPj0gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICAgICAgICAgIG9iamlkKys7CiAgICAgICAgICAgICAgICAgICAgb2JqaWRsZW4tLTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSBudW1pZHM7IGkrKykKICAgICAgICAgICAgICAgICAgICBidWZmZXJbaV0gPSAodV9jaGFyKSBvYmppZFtpXTsKICAgICAgICAgICAgICAgIHZhci50eXBlID0gQVNOX09DVEVUX1NUUjsKICAgICAgICAgICAgICAgIHZhci52YWwuc3RyaW5nID0gYnVmZmVyOwogICAgICAgICAgICAgICAgdmFyLnZhbF9sZW4gPSBudW1pZHM7CiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX29jdGV0X3N0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJnZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCB0cC0+aGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5fZGljZXMtPmlzaW1wbGllZCkgewogICAgICAgICAgICAgICAgbnVtaWRzID0gb2JqaWRsZW47CiAgICAgICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CgogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFkdW1wX3JlYWxsb2Nfb2lkX3RvX3N0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAob2JqaWQsIG51bWlkcywgYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJ1wnJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKHRwLT5yYW5nZXMgJiYgIXRwLT5yYW5nZXMtPm5leHQKICAgICAgICAgICAgICAgICAgICAgICAmJiB0cC0+cmFuZ2VzLT5sb3cgPT0gdHAtPnJhbmdlcy0+aGlnaCkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGEgZml4ZWQtbGVuZ3RoIG9jdGV0IHN0cmluZyAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbnVtaWRzID0gdHAtPnJhbmdlcy0+bG93OwogICAgICAgICAgICAgICAgaWYgKG51bWlkcyA+IG9iamlkbGVuKQogICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwoKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICAgICAgICAgIGlmICghZHVtcF9yZWFsbG9jX29pZF90b19zdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgKG9iamlkLCBudW1pZHMsIGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICdcJycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG51bWlkcyA9IChzaXplX3QpICogb2JqaWQgKyAxOwogICAgICAgICAgICAgICAgaWYgKG51bWlkcyA+IG9iamlkbGVuKQogICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICAgICAgaWYgKG51bWlkcyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4KICAgICAgICAgICAgICAgICAgICAgICAgKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVNDQVBFX1FVT1RFUykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiXFwiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiXCIiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4KICAgICAgICAgICAgICAgICAgICAgICAgKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVNDQVBFX1FVT1RFUykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiXFwiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiXCIiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJlZSAqIG5leHRfcGVlcjsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vcm1hbF9oYW5kbGluZyA9IDE7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHAtPm5leHRfcGVlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9wZWVyID0gdHAtPm5leHRfcGVlcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJ5IGhhbmRsaW5nIHRoZSBJbmV0QWRkcmVzcyBpbiB0aGUgT0lELCBpbiBjYXNlIG9mIGZhaWx1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAqIHVzZSB0aGUgbm9ybWFsX2hhbmRsaW5nLiAKICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cC0+bmV4dF9wZWVyICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dGNfaW5kZXggIT0gLTEgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfcGVlci0+dGNfaW5kZXggIT0gLTEgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcChnZXRfdGNfZGVzY3JpcHRvcih0cC0+dGNfaW5kZXgpLCAiSW5ldEFkZHJlc3MiKSA9PSAwICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoZ2V0X3RjX2Rlc2NyaXB0b3IobmV4dF9wZWVyLT50Y19pbmRleCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5ldEFkZHJlc3NUeXBlIikgPT0gMCApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFkZHJfdHlwZSA9ICoob2JqaWQgLSAxKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBkdW1wX3JlYWxsb2Nfb2lkX3RvX2luZXRhZGRyZXNzKGFkZHJfdHlwZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCArIDEsIG51bWlkcyAtIDEsIGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICciJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxfaGFuZGxpbmcgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsX2hhbmRsaW5nICYmICFkdW1wX3JlYWxsb2Nfb2lkX3RvX3N0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9iamlkICsgMSwgbnVtaWRzIC0gMSwgYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICciJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG9iamlkICs9IG51bWlkczsKICAgICAgICAgICAgb2JqaWRsZW4gLT0gbnVtaWRzOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVIzMjoKICAgICAgICBjYXNlIFRZUEVfVUlOVEVHRVI6CiAgICAgICAgY2FzZSBUWVBFX1VOU0lHTkVEMzI6CiAgICAgICAgY2FzZSBUWVBFX0dBVUdFOgogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSOgogICAgICAgICAgICBpZiAodHAtPmVudW1zKSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgZW51bV9saXN0ICplcCA9IHRwLT5lbnVtczsKICAgICAgICAgICAgICAgIHdoaWxlIChlcCAmJiBlcC0+dmFsdWUgIT0gKGludCkgKCpvYmppZCkpIHsKICAgICAgICAgICAgICAgICAgICBlcCA9IGVwLT5uZXh0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGVwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBlcC0+bGFiZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlIiBORVRTTk1QX1BSSW8gInUiLCAqb2JqaWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiUiIE5FVFNOTVBfUFJJbyAidSIsICpvYmppZCk7CiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2JqaWQrKzsKICAgICAgICAgICAgb2JqaWRsZW4tLTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVFlQRV9USU1FVElDS1M6CiAgICAgICAgICAgIC8qIEluIGFuIGluZGV4LCB0aGlzIGlzIHByb2JhYmx5IGEgdGltZWZpbHRlciAqLwogICAgICAgICAgICBpZiAoZXh0ZW5kZWRfaW5kZXgpIHsKICAgICAgICAgICAgICAgIHVwdGltZVN0cmluZyggKm9iamlkLCBpbnRidWYsIHNpemVvZiggaW50YnVmICkgKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJSIgTkVUU05NUF9QUklvICJ1IiwgKm9iamlkKTsKICAgICAgICAgICAgfSAgIAogICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvYmppZCsrOwogICAgICAgICAgICBvYmppZGxlbi0tOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBUWVBFX09CSklEOgogICAgICAgICAgICBpZiAoaW5fZGljZXMtPmlzaW1wbGllZCkgewogICAgICAgICAgICAgICAgbnVtaWRzID0gb2JqaWRsZW47CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBudW1pZHMgPSAoc2l6ZV90KSAqIG9iamlkICsgMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgaWYgKGV4dGVuZGVkX2luZGV4KSB7CiAgICAgICAgICAgICAgICBpZiAoaW5fZGljZXMtPmlzaW1wbGllZCkgewogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKGJ1ZiwgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWlkcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZShidWYsIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtaWRzIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBfZ2V0X3JlYWxsb2Nfc3ltYm9sKG9iamlkLCBudW1pZHMsIE5VTEwsIGJ1ZiwgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvYmppZCArPSAobnVtaWRzKTsKICAgICAgICAgICAgb2JqaWRsZW4gLT0gKG51bWlkcyk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFRZUEVfSVBBRERSOgogICAgICAgICAgICBpZiAob2JqaWRsZW4gPCA0KQogICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJSIgTkVUU05NUF9QUklvICJ1LiUiIE5FVFNOTVBfUFJJbyAidS4iCiAgICAgICAgICAgICAgICAgICAgIiUiIE5FVFNOTVBfUFJJbyAidS4lIiBORVRTTk1QX1BSSW8gInUiLAogICAgICAgICAgICAgICAgICAgIG9iamlkWzBdLCBvYmppZFsxXSwgb2JqaWRbMl0sIG9iamlkWzNdKTsKICAgICAgICAgICAgb2JqaWQgKz0gNDsKICAgICAgICAgICAgb2JqaWRsZW4gLT0gNDsKICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFRZUEVfTkVUQUREUjp7CiAgICAgICAgICAgICAgICBvaWQgICAgICAgICAgICAgbnR5cGUgPSAqb2JqaWQrKzsKCiAgICAgICAgICAgICAgICBvYmppZGxlbi0tOwogICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlIiBORVRTTk1QX1BSSW8gInUuIiwgbnR5cGUpOwogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChudHlwZSA9PSAxICYmIG9iamlkbGVuID49IDQpIHsKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiUiIE5FVFNOTVBfUFJJbyAidS4lIiBORVRTTk1QX1BSSW8gInUuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiIE5FVFNOTVBfUFJJbyAidS4lIiBORVRTTk1QX1BSSW8gInUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWRbMF0sIG9iamlkWzFdLCBvYmppZFsyXSwgb2JqaWRbM10pOwogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb2JqaWQgKz0gNDsKICAgICAgICAgICAgICAgICAgICBvYmppZGxlbiAtPSA0OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBUWVBFX05TQVBBRERSRVNTOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmIChleHRlbmRlZF9pbmRleCkgewogICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIl0iKSkgewogICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIi4iKSkgewogICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaW5fZGljZXMgPSBpbl9kaWNlcy0+bmV4dDsKICAgIH0KCiAgZmluaXNoX2l0OgogICAgX29pZF9maW5pc2hfcHJpbnRpbmcob2JqaWQsIG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgYnVmX292ZXJmbG93KTsKICAgIHJldHVybiBOVUxMOwp9CgpzdHJ1Y3QgdHJlZSAgICAqCmdldF90cmVlKGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sIHN0cnVjdCB0cmVlICpzdWJ0cmVlKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqcmV0dXJuX3RyZWUgPSBOVUxMOwoKICAgIGZvciAoOyBzdWJ0cmVlOyBzdWJ0cmVlID0gc3VidHJlZS0+bmV4dF9wZWVyKSB7CiAgICAgICAgaWYgKCpvYmppZCA9PSBzdWJ0cmVlLT5zdWJpZCkKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgIH0KCiAgICByZXR1cm4gTlVMTDsKCiAgZm91bmQ6CiAgICB3aGlsZSAoc3VidHJlZS0+bmV4dF9wZWVyICYmIHN1YnRyZWUtPm5leHRfcGVlci0+c3ViaWQgPT0gKm9iamlkKQoJc3VidHJlZSA9IHN1YnRyZWUtPm5leHRfcGVlcjsKICAgIGlmIChvYmppZGxlbiA+IDEpCiAgICAgICAgcmV0dXJuX3RyZWUgPQogICAgICAgICAgICBnZXRfdHJlZShvYmppZCArIDEsIG9iamlkbGVuIC0gMSwgc3VidHJlZS0+Y2hpbGRfbGlzdCk7CiAgICBpZiAocmV0dXJuX3RyZWUgIT0gTlVMTCkKICAgICAgICByZXR1cm4gcmV0dXJuX3RyZWU7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIHN1YnRyZWU7Cn0KCi8qKgogKiBQcmludHMgb24gb2lkIGRlc2NyaXB0aW9uIG9uIHN0ZG91dC4KICoKICogQHNlZSBmcHJpbnRfZGVzY3JpcHRpb24KICovCnZvaWQKcHJpbnRfZGVzY3JpcHRpb24ob2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwgLyogbnVtYmVyIG9mIHN1YmlkZW50aWZpZXJzICovCiAgICAgICAgICAgICAgICAgIGludCB3aWR0aCkKewogICAgZnByaW50X2Rlc2NyaXB0aW9uKHN0ZG91dCwgb2JqaWQsIG9iamlkbGVuLCB3aWR0aCk7Cn0KCgovKioKICogUHJpbnRzIG9uIG9pZCBkZXNjcmlwdGlvbiBpbnRvIGEgZmlsZSBkZXNjcmlwdG9yLgogKiAKICogQHBhcmFtIGYgICAgICAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHByaW50IHRvLgogKiBAcGFyYW0gb2JqaWQgICAgIFRoZSBvYmplY3QgaWRlbnRpZmllci4KICogQHBhcmFtIG9iamlkbGVuICBUaGUgb2JqZWN0IGlkIGxlbmd0aC4KICogQHBhcmFtIHdpZHRoICAgICBOdW1iZXIgb2Ygc3ViaWRlbnRpZmllcnMuCiAqLwp2b2lkCmZwcmludF9kZXNjcmlwdGlvbihGSUxFICogZiwgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCkKewogICAgdV9jaGFyICAgICAgICAgKmJ1ZiA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgYnVmX2xlbiA9IDI1Niwgb3V0X2xlbiA9IDA7CgogICAgaWYgKChidWYgPSAodV9jaGFyICopIGNhbGxvYyhidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoZiwgIltUUlVOQ0FURURdXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICAgIGlmICghc3ByaW50X3JlYWxsb2NfZGVzY3JpcHRpb24oJmJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgd2lkdGgpKSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzIFtUUlVOQ0FURURdXG4iLCBidWYpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzXG4iLCBidWYpOwogICAgICAgIH0KICAgIH0KCiAgICBTTk1QX0ZSRUUoYnVmKTsKfQoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX01JQl9TTlBSSU5UX0RFU0NSSVBUSU9OCmludApzbnByaW50X2Rlc2NyaXB0aW9uKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwgaW50IHdpZHRoKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CgogICAgaWYgKHNwcmludF9yZWFsbG9jX2Rlc2NyaXB0aW9uKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgd2lkdGgpKSB7CiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9NSUJfU05QUklOVF9ERVNDUklQVElPTiAqLwoKaW50CnNwcmludF9yZWFsbG9jX2Rlc2NyaXB0aW9uKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLCBpbnQgd2lkdGgpCnsKICAgIHN0cnVjdCB0cmVlICAgICp0cCA9IGdldF90cmVlKG9iamlkLCBvYmppZGxlbiwgdHJlZV9oZWFkKTsKICAgIHN0cnVjdCB0cmVlICAgICpzdWJ0cmVlID0gdHJlZV9oZWFkOwogICAgaW50ICAgICAgICAgICAgIHBvcywgbGVuOwogICAgY2hhciAgICAgICAgICAgIHRtcGJ1ZlsxMjhdOwogICAgY29uc3QgY2hhciAgICAgKmNwOwoKICAgIGlmIChOVUxMID09IHRwKQogICAgICAgIHJldHVybiAwOwoKICAgIGlmICh0cC0+dHlwZSA8PSBUWVBFX1NJTVBMRV9MQVNUKQogICAgICAgIGNwID0gIiBPQkpFQ1QtVFlQRSI7CiAgICBlbHNlCiAgICAgICAgc3dpdGNoICh0cC0+dHlwZSkgewogICAgICAgIGNhc2UgVFlQRV9UUkFQVFlQRToKICAgICAgICAgICAgY3AgPSAiIFRSQVAtVFlQRSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9OT1RJRlRZUEU6CiAgICAgICAgICAgIGNwID0gIiBOT1RJRklDQVRJT04tVFlQRSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9PQkpHUk9VUDoKICAgICAgICAgICAgY3AgPSAiIE9CSkVDVC1HUk9VUCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9BR0VOVENBUDoKICAgICAgICAgICAgY3AgPSAiIEFHRU5ULUNBUEFCSUxJVElFUyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9NT0RJRDoKICAgICAgICAgICAgY3AgPSAiIE1PRFVMRS1JREVOVElUWSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9PQkpJREVOVElUWToKICAgICAgICAgICAgY3AgPSAiIE9CSkVDVC1JREVOVElUWSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9NT0RDT01QOgogICAgICAgICAgICBjcCA9ICIgTU9EVUxFLUNPTVBMSUFOQ0UiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBzcHJpbnRmKHRtcGJ1ZiwgIiB0eXBlXyVkIiwgdHAtPnR5cGUpOwogICAgICAgICAgICBjcCA9IHRtcGJ1ZjsKICAgICAgICB9CgogICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cC0+bGFiZWwpIHx8CiAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSB8fAogICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4iKSkgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKCFwcmludF90cmVlX25vZGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cCwgd2lkdGgpKQogICAgICAgIHJldHVybiAwOwogICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiOjo9IHsiKSkKICAgICAgICByZXR1cm4gMDsKICAgIHBvcyA9IDU7CiAgICB3aGlsZSAob2JqaWRsZW4gPiAxKSB7CiAgICAgICAgZm9yICg7IHN1YnRyZWU7IHN1YnRyZWUgPSBzdWJ0cmVlLT5uZXh0X3BlZXIpIHsKICAgICAgICAgICAgaWYgKCpvYmppZCA9PSBzdWJ0cmVlLT5zdWJpZCkgewogICAgICAgICAgICAgICAgd2hpbGUgKHN1YnRyZWUtPm5leHRfcGVlciAmJiBzdWJ0cmVlLT5uZXh0X3BlZXItPnN1YmlkID09ICpvYmppZCkKICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlID0gc3VidHJlZS0+bmV4dF9wZWVyOwogICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAoc3VidHJlZS0+bGFiZWwsIEFOT04sIEFOT05fTEVOKSkgewogICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKHRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZiksICIgJXMoJWx1KSIsIHN1YnRyZWUtPmxhYmVsLCBzdWJ0cmVlLT5zdWJpZCk7CiAgICAgICAgICAgICAgICAgICAgdG1wYnVmWyBzaXplb2YodG1wYnVmKS0xIF0gPSAwOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXBidWYsICIgJWx1Iiwgc3VidHJlZS0+c3ViaWQpOwogICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHRtcGJ1Zik7CiAgICAgICAgICAgICAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgIlxuICAgICAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgcG9zID0gNTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdG1wYnVmKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHBvcyArPSBsZW47CiAgICAgICAgICAgICAgICBvYmppZCsrOwogICAgICAgICAgICAgICAgb2JqaWRsZW4tLTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzdWJ0cmVlKQogICAgICAgICAgICBzdWJ0cmVlID0gc3VidHJlZS0+Y2hpbGRfbGlzdDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgd2hpbGUgKG9iamlkbGVuID4gMSkgewogICAgICAgIHNwcmludGYodG1wYnVmLCAiICUiIE5FVFNOTVBfUFJJbyAidSIsICpvYmppZCk7CiAgICAgICAgbGVuID0gc3RybGVuKHRtcGJ1Zik7CiAgICAgICAgaWYgKHBvcyArIGxlbiArIDIgPiB3aWR0aCkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiAgICAgIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgcG9zID0gNTsKICAgICAgICB9CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0bXBidWYpKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBwb3MgKz0gbGVuOwogICAgICAgIG9iamlkKys7CiAgICAgICAgb2JqaWRsZW4tLTsKICAgIH0KICAgIHNwcmludGYodG1wYnVmLCAiICUiIE5FVFNOTVBfUFJJbyAidSB9IiwgKm9iamlkKTsKICAgIGxlbiA9IHN0cmxlbih0bXBidWYpOwogICAgaWYgKHBvcyArIGxlbiArIDIgPiB3aWR0aCkgewogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuICAgICAiKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgcG9zID0gNTsKICAgIH0KICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdG1wYnVmKSkKICAgICAgICByZXR1cm4gMDsKICAgIHJldHVybiAxOwp9CgpzdGF0aWMgaW50CnByaW50X3RyZWVfbm9kZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgKnRwLCBpbnQgd2lkdGgpCnsKICAgIGNvbnN0IGNoYXIgICAgICpjcDsKICAgIGNoYXIgICAgICAgICAgICBzdHJbTUFYVE9LRU5dOwogICAgaW50ICAgICAgICAgICAgIGksIHByZXZtb2QsIHBvcywgbGVuOwoKICAgIGlmICh0cCkgewogICAgICAgIG1vZHVsZV9uYW1lKHRwLT5tb2RpZCwgc3RyKTsKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgIC0tIEZST01cdCIpIHx8CiAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBwb3MgPSAxNitzdHJsZW4oc3RyKTsKICAgICAgICBmb3IgKGkgPSAxLCBwcmV2bW9kID0gdHAtPm1vZGlkOyBpIDwgdHAtPm51bWJlcl9tb2R1bGVzOyBpKyspIHsKICAgICAgICAgICAgaWYgKHByZXZtb2QgIT0gdHAtPm1vZHVsZV9saXN0W2ldKSB7CiAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSh0cC0+bW9kdWxlX2xpc3RbaV0sIHN0cik7CiAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oc3RyKTsKICAgICAgICAgICAgICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLFxuICAtLVx0XHQiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgcG9zID0gMTY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIsICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHBvcyArPSBsZW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJldm1vZCA9IHRwLT5tb2R1bGVfbGlzdFtpXTsKICAgICAgICB9CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4iKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKHRwLT50Y19pbmRleCAhPSAtMSkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIC0tIFRFWFRVQUwgQ09OVkVOVElPTiAiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF90Y19kZXNjcmlwdG9yKHRwLT50Y19pbmRleCkpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgc3dpdGNoICh0cC0+dHlwZSkgewogICAgICAgIGNhc2UgVFlQRV9PQkpJRDoKICAgICAgICAgICAgY3AgPSAiT0JKRUNUIElERU5USUZJRVIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfT0NURVRTVFI6CiAgICAgICAgICAgIGNwID0gIk9DVEVUIFNUUklORyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSOgogICAgICAgICAgICBjcCA9ICJJTlRFR0VSIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX05FVEFERFI6CiAgICAgICAgICAgIGNwID0gIk5ldHdvcmtBZGRyZXNzIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0lQQUREUjoKICAgICAgICAgICAgY3AgPSAiSXBBZGRyZXNzIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0NPVU5URVI6CiAgICAgICAgICAgIGNwID0gIkNvdW50ZXIzMiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9HQVVHRToKICAgICAgICAgICAgY3AgPSAiR2F1Z2UzMiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9USU1FVElDS1M6CiAgICAgICAgICAgIGNwID0gIlRpbWVUaWNrcyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9PUEFRVUU6CiAgICAgICAgICAgIGNwID0gIk9wYXF1ZSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9OVUxMOgogICAgICAgICAgICBjcCA9ICJOVUxMIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0NPVU5URVI2NDoKICAgICAgICAgICAgY3AgPSAiQ291bnRlcjY0IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0JJVFNUUklORzoKICAgICAgICAgICAgY3AgPSAiQklUUyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9OU0FQQUREUkVTUzoKICAgICAgICAgICAgY3AgPSAiTnNhcEFkZHJlc3MiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfVUlOVEVHRVI6CiAgICAgICAgICAgIGNwID0gIlVJbnRlZ2VyMzIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICAgICAgY3AgPSAiVW5zaWduZWQzMiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICAgICAgICAgIGNwID0gIkludGVnZXIzMiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNwID0gTlVMTDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQojaWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICAgICAgaWYgKCFjcCAmJiAodHAtPnJhbmdlcyB8fCB0cC0+ZW51bXMpKSB7IC8qIHJhbmdlcyB3aXRob3V0IHR5cGUgPyAqLwogICAgICAgICAgICBzcHJpbnRmKHN0ciwgIj8wIHdpdGggJXMgJXMgPyIsCiAgICAgICAgICAgICAgICAgICAgdHAtPnJhbmdlcyA/ICJSYW5nZSIgOiAiIiwgdHAtPmVudW1zID8gIkVudW0iIDogIiIpOwogICAgICAgICAgICBjcCA9IHN0cjsKICAgICAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFICovCiAgICAgICAgaWYgKGNwKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgU1lOVEFYXHQiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+cmFuZ2VzKSB7CiAgICAgICAgICAgIHN0cnVjdCByYW5nZV9saXN0ICpycCA9IHRwLT5yYW5nZXM7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBmaXJzdCA9IDE7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiAoIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgd2hpbGUgKHJwKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRwLT50eXBlKSB7CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICAgICAgICAgICAgICAgICAgaWYgKHJwLT5sb3cgPT0gcnAtPmhpZ2gpCiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJXMlZCIsIChmaXJzdCA/ICIiIDogIiB8ICIpLCBycC0+bG93ICk7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVzJWQuLiVkIiwgKGZpcnN0ID8gIiIgOiAiIHwgIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnAtPmxvdywgcnAtPmhpZ2gpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBUWVBFX1VOU0lHTkVEMzI6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVfT0NURVRTVFI6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVfR0FVR0U6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVfVUlOVEVHRVI6CiAgICAgICAgICAgICAgICAgICAgaWYgKHJwLT5sb3cgPT0gcnAtPmhpZ2gpCiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJXMldSIsIChmaXJzdCA/ICIiIDogIiB8ICIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClycC0+bG93ICk7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVzJXUuLiV1IiwgKGZpcnN0ID8gIiIgOiAiIHwgIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXJwLT5sb3csICh1bnNpZ25lZClycC0+aGlnaCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIC8qIE5vIG90aGVyIHJhbmdlIHR5cGVzIGFsbG93ZWQgKi8KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgICAgICAgICBycCA9IHJwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIikgIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKHRwLT5lbnVtcykgewogICAgICAgICAgICBzdHJ1Y3QgZW51bV9saXN0ICplcCA9IHRwLT5lbnVtczsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZpcnN0ID0gMTsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiIHsiKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICBwb3MgPSAxNiArIHN0cmxlbihjcCkgKyAyOwogICAgICAgICAgICB3aGlsZSAoZXApIHsKICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiLCAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiJXMoJWQpIiwgZXAtPmxhYmVsLCBlcC0+dmFsdWUpOwogICAgICAgICAgICAgICAgc3RyWyBzaXplb2Yoc3RyKS0xIF0gPSAwOwogICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHN0cik7CiAgICAgICAgICAgICAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgIlxuXHRcdCAgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIHBvcyA9IDE4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgcG9zICs9IGxlbiArIDI7CiAgICAgICAgICAgICAgICBlcCA9IGVwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIn0gIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKGNwKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKHRwLT5oaW50KQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgRElTUExBWS1ISU5UXHRcIiIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAtPmhpbnQpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+dW5pdHMpCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBVTklUU1x0XHRcIiIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAtPnVuaXRzKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBzd2l0Y2ggKHRwLT5hY2Nlc3MpIHsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfUkVBRE9OTFk6CiAgICAgICAgICAgIGNwID0gInJlYWQtb25seSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19SRUFEV1JJVEU6CiAgICAgICAgICAgIGNwID0gInJlYWQtd3JpdGUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfV1JJVEVPTkxZOgogICAgICAgICAgICBjcCA9ICJ3cml0ZS1vbmx5IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX05PQUNDRVNTOgogICAgICAgICAgICBjcCA9ICJub3QtYWNjZXNzaWJsZSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19OT1RJRlk6CiAgICAgICAgICAgIGNwID0gImFjY2Vzc2libGUtZm9yLW5vdGlmeSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19DUkVBVEU6CiAgICAgICAgICAgIGNwID0gInJlYWQtY3JlYXRlIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBjcCA9IE5VTEw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHNwcmludGYoc3RyLCAiYWNjZXNzXyVkIiwgdHAtPmFjY2Vzcyk7CiAgICAgICAgICAgIGNwID0gc3RyOwogICAgICAgIH0KICAgICAgICBpZiAoY3ApCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBNQVgtQUNDRVNTXHQiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgc3dpdGNoICh0cC0+c3RhdHVzKSB7CiAgICAgICAgY2FzZSBNSUJfU1RBVFVTX01BTkRBVE9SWToKICAgICAgICAgICAgY3AgPSAibWFuZGF0b3J5IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfU1RBVFVTX09QVElPTkFMOgogICAgICAgICAgICBjcCA9ICJvcHRpb25hbCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX1NUQVRVU19PQlNPTEVURToKICAgICAgICAgICAgY3AgPSAib2Jzb2xldGUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9TVEFUVVNfREVQUkVDQVRFRDoKICAgICAgICAgICAgY3AgPSAiZGVwcmVjYXRlZCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX1NUQVRVU19DVVJSRU5UOgogICAgICAgICAgICBjcCA9ICJjdXJyZW50IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBjcCA9IE5VTEw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHNwcmludGYoc3RyLCAic3RhdHVzXyVkIiwgdHAtPnN0YXR1cyk7CiAgICAgICAgICAgIGNwID0gc3RyOwogICAgICAgIH0KI2lmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQogICAgICAgIGlmICghY3AgJiYgKHRwLT5pbmRleGVzKSkgeyAgICAgLyogaW5kZXggd2l0aG91dCBzdGF0dXMgPyAqLwogICAgICAgICAgICBzcHJpbnRmKHN0ciwgIj8wIHdpdGggJXMgPyIsIHRwLT5pbmRleGVzID8gIkluZGV4IiA6ICIiKTsKICAgICAgICAgICAgY3AgPSBzdHI7CiAgICAgICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERSAqLwogICAgICAgIGlmIChjcCkKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFNUQVRVU1x0IikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCkgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+YXVnbWVudHMpCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBBVUdNRU5UU1x0eyAiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRwLT5hdWdtZW50cykgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiIH1cbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKHRwLT5pbmRleGVzKSB7CiAgICAgICAgICAgIHN0cnVjdCBpbmRleF9saXN0ICppcCA9IHRwLT5pbmRleGVzOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmlyc3QgPSAxOwogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgSU5ERVhcdFx0eyAiKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICBwb3MgPSAxNiArIDI7CiAgICAgICAgICAgIHdoaWxlIChpcCkgewogICAgICAgICAgICAgICAgaWYgKGZpcnN0KQogICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gMDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIsICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICIlcyVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgaXAtPmlzaW1wbGllZCA/ICJJTVBMSUVEICIgOiAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgaXAtPmlsYWJlbCk7CiAgICAgICAgICAgICAgICBzdHJbIHNpemVvZihzdHIpLTEgXSA9IDA7CiAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oc3RyKTsKICAgICAgICAgICAgICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcblx0XHQgICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBwb3MgPSAxNiArIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuICsgMjsKICAgICAgICAgICAgICAgIGlwID0gaXAtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiIH1cbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICh0cC0+dmFyYmluZHMpIHsKICAgICAgICAgICAgc3RydWN0IHZhcmJpbmRfbGlzdCAqdnAgPSB0cC0+dmFyYmluZHM7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBmaXJzdCA9IDE7CgogICAgICAgICAgICBpZiAodHAtPnR5cGUgPT0gVFlQRV9UUkFQVFlQRSkgewogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICIgIFZBUklBQkxFU1x0eyAiKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAiICBPQkpFQ1RTXHR7ICIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBvcyA9IDE2ICsgMjsKICAgICAgICAgICAgd2hpbGUgKHZwKSB7CiAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiwgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgc3RybGNweShzdHIsIHZwLT52YmxhYmVsLCBzaXplb2Yoc3RyKSk7CiAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oc3RyKTsKICAgICAgICAgICAgICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcblx0XHQgICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBwb3MgPSAxNiArIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuICsgMjsKICAgICAgICAgICAgICAgIHZwID0gdnAtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiIH1cbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICh0cC0+ZGVzY3JpcHRpb24pCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgREVTQ1JJUFRJT05cdFwiIikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cC0+ZGVzY3JpcHRpb24pIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+ZGVmYXVsdFZhbHVlKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIERFRlZBTFx0eyAiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRwLT5kZWZhdWx0VmFsdWUpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiB9XG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgfSBlbHNlCiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiTm8gZGVzY3JpcHRpb25cbiIpKQogICAgICAgICAgICByZXR1cm4gMDsKICAgIHJldHVybiAxOwp9CgppbnQKZ2V0X21vZHVsZV9ub2RlKGNvbnN0IGNoYXIgKmZuYW1lLAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kdWxlLCBvaWQgKiBvYmppZCwgc2l6ZV90ICogb2JqaWRsZW4pCnsKICAgIGludCAgICAgICAgICAgICBtb2RpZCwgcmMgPSAwOwogICAgc3RydWN0IHRyZWUgICAgKnRwOwogICAgY2hhciAgICAgICAgICAgKm5hbWUsICpjcDsKCiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJBTlkiKSkKICAgICAgICBtb2RpZCA9IC0xOwogICAgZWxzZSB7CiAgICAgICAgbmV0c25tcF9yZWFkX21vZHVsZShtb2R1bGUpOwogICAgICAgIG1vZGlkID0gd2hpY2hfbW9kdWxlKG1vZHVsZSk7CiAgICAgICAgaWYgKG1vZGlkID09IC0xKQogICAgICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKgogICAgICogSXNvbGF0ZSB0aGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSBuYW1lIC4uLiAKICAgICAqLwogICAgbmFtZSA9IHN0cmR1cChmbmFtZSk7CiAgICBjcCA9IHN0cmNocihuYW1lLCAnLicpOwogICAgaWYgKGNwICE9IE5VTEwpIHsKICAgICAgICAqY3AgPSAnXDAnOwogICAgICAgIGNwKys7CiAgICB9CiAgICAvKgogICAgICogLi4uIGFuZCBsb2NhdGUgaXQgaW4gdGhlIHRyZWUuIAogICAgICovCiAgICB0cCA9IGZpbmRfdHJlZV9ub2RlKG5hbWUsIG1vZGlkKTsKICAgIGlmICh0cCkgewogICAgICAgIHNpemVfdCAgICAgICAgICBtYXhsZW4gPSAqb2JqaWRsZW47CgogICAgICAgIC8qCiAgICAgICAgICogU2V0IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBvYmplY3QgSUQgCiAgICAgICAgICovCiAgICAgICAgaWYgKG5vZGVfdG9fb2lkKHRwLCBvYmppZCwgb2JqaWRsZW4pKSB7CiAgICAgICAgICAgIHJjID0gMTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIElmIHRoZSBuYW1lIHJlcXVlc3RlZCB3YXMgbW9yZSB0aGFuIG9uZSBlbGVtZW50LAogICAgICAgICAgICAgKiB0YWcgb24gdGhlIHJlc3Qgb2YgdGhlIGNvbXBvbmVudHMgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoY3AgIT0gTlVMTCkKICAgICAgICAgICAgICAgIHJjID0gX2FkZF9zdHJpbmdzX3RvX29pZCh0cCwgY3AsIG9iamlkLCBvYmppZGxlbiwgbWF4bGVuKTsKICAgICAgICB9CiAgICB9CgogICAgU05NUF9GUkVFKG5hbWUpOwogICAgcmV0dXJuIChyYyk7Cn0KCgovKioKICogQGludGVybmFsCiAqCiAqIFBvcHVsYXRlcyB0aGUgb2JqZWN0IGlkZW50aWZpZXIgZnJvbSBhIG5vZGUgaW4gdGhlIE1JQiBoaWVyYXJjaHkuCiAqIEJ1aWxkcyB1cCB0aGUgb2JqZWN0IElELCB3b3JraW5nIGJhY2t3YXJkcywKICogc3RhcnRpbmcgZnJvbSB0aGUgZW5kIG9mIHRoZSBvYmppZCBidWZmZXIuCiAqIFdoZW4gdGhlIHRvcCBvZiB0aGUgTUlCIHRyZWUgaXMgcmVhY2hlZCwgdGhlIGJ1ZmZlciBpcyBhZGp1c3RlZC4KICoKICogVGhlIGJ1ZmZlciBsZW5ndGggaXMgc2V0IHRvIHRoZSBudW1iZXIgb2Ygc3ViaWRlbnRpZmllcnMKICogZm9yIHRoZSBvYmplY3QgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIE1JQiBub2RlLgogKiAKICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHN1YmlkZW50aWZpZXJzIGNvcGllZC4KICoKICogSWYgMCBpcyByZXR1cm5lZCwgdGhlIG9iamlkIGJ1ZmZlciBpcyB0b28gc21hbGwsCiAqIGFuZCB0aGUgYnVmZmVyIGNvbnRlbnRzIGFyZSBpbmRldGVybWluYXRlLgogKiBUaGUgYnVmZmVyIGxlbmd0aCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBsYXJnZXIgYnVmZmVyLgogKi8Kc3RhdGljIGludApub2RlX3RvX29pZChzdHJ1Y3QgdHJlZSAqdHAsIG9pZCAqIG9iamlkLCBzaXplX3QgKiBvYmppZGxlbikKewogICAgaW50ICAgICAgICAgICAgIG51bWlkcywgbGVuaWRzOwogICAgb2lkICAgICAgICAgICAgKm9wOwoKICAgIGlmICghdHAgfHwgIW9iamlkIHx8ICFvYmppZGxlbikKICAgICAgICByZXR1cm4gMDsKCiAgICBsZW5pZHMgPSAoaW50KSAqb2JqaWRsZW47CiAgICBvcCA9IG9iamlkICsgbGVuaWRzOyAgICAgICAgLyogcG9pbnRzIGFmdGVyIHRoZSBsYXN0IGVsZW1lbnQgKi8KCiAgICBmb3IgKG51bWlkcyA9IDA7IHRwOyB0cCA9IHRwLT5wYXJlbnQsIG51bWlkcysrKSB7CiAgICAgICAgaWYgKG51bWlkcyA+PSBsZW5pZHMpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIC0tb3A7CiAgICAgICAgKm9wID0gdHAtPnN1YmlkOwogICAgfQoKICAgICpvYmppZGxlbiA9IChzaXplX3QpIG51bWlkczsKICAgIGlmIChudW1pZHMgPiBsZW5pZHMpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAobnVtaWRzIDwgbGVuaWRzKQogICAgICAgIG1lbW1vdmUob2JqaWQsIG9wLCBudW1pZHMgKiBzaXplb2Yob2lkKSk7CgogICAgcmV0dXJuIChudW1pZHMpOwp9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCi8qCiAqIFJlcGxhY2UgXHggd2l0aCB4IHN0b3AgYXQgZW9zX21hcmtlcgogKiByZXR1cm4gTlVMTCBpZiBlb3NfbWFya2VyIG5vdCBmb3VuZAogKi8Kc3RhdGljIGNoYXIgKl9hcHBseV9lc2NhcGVzKGNoYXIgKnNyYywgY2hhciBlb3NfbWFya2VyKQp7CiAgICBjaGFyICpkc3Q7CiAgICBpbnQgYmFja3NsYXNoID0gMDsKICAgIAogICAgZHN0ID0gc3JjOwogICAgd2hpbGUgKCpzcmMpIHsKCWlmIChiYWNrc2xhc2gpIHsKCSAgICBiYWNrc2xhc2ggPSAwOwoJICAgICpkc3QrKyA9ICpzcmM7Cgl9IGVsc2UgewoJICAgIGlmIChlb3NfbWFya2VyID09ICpzcmMpIGJyZWFrOwoJICAgIGlmICgnXFwnID09ICpzcmMpIHsKCQliYWNrc2xhc2ggPSAxOwoJICAgIH0gZWxzZSB7CgkJKmRzdCsrID0gKnNyYzsKCSAgICB9Cgl9CglzcmMrKzsKICAgIH0KICAgIGlmICghKnNyYykgewoJLyogbmV2ZXIgZm91bmQgZW9zX21hcmtlciAqLwoJcmV0dXJuIE5VTEw7CiAgICB9IGVsc2UgewoJKmRzdCA9IDA7CglyZXR1cm4gc3JjOwogICAgfQp9CgpzdGF0aWMgaW50CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCl9hZGRfc3RyaW5nc190b19vaWQoc3RydWN0IHRyZWUgKnRwLCBjaGFyICpjcCwKICAgICAgICAgICAgICAgICAgICBvaWQgKiBvYmppZCwgc2l6ZV90ICogb2JqaWRsZW4sIHNpemVfdCBtYXhsZW4pCiNlbHNlCl9hZGRfc3RyaW5nc190b19vaWQodm9pZCAqdHAsIGNoYXIgKmNwLAogICAgICAgICAgICAgICAgICAgIG9pZCAqIG9iamlkLCBzaXplX3QgKiBvYmppZGxlbiwgc2l6ZV90IG1heGxlbikKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwp7CiAgICBvaWQgICAgICAgICAgICAgc3ViaWQ7CiAgICBpbnQgICAgICAgICAgICAgbGVuX2luZGV4ID0gMTAwMDAwMDsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIHN0cnVjdCB0cmVlICAgICp0cDIgPSBOVUxMOwogICAgc3RydWN0IGluZGV4X2xpc3QgKmluX2RpY2VzID0gTlVMTDsKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgY2hhciAgICAgICAgICAgKmZjcCwgKmVjcCwgKmNwMiA9IE5VTEw7CiAgICBjaGFyICAgICAgICAgICAgZG9pbmdxdW90ZTsKICAgIGludCAgICAgICAgICAgICBsZW4gPSAtMSwgcG9zID0gLTE7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBpbnQgICAgICAgICAgICAgY2hlY2sgPQogICAgICAgICFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9DSEVDS19SQU5HRSk7CiAgICBpbnQgICAgICAgICAgICAgZG9faGludCA9ICFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTk9fRElTUExBWV9ISU5UKTsKCiAgICB3aGlsZSAoY3AgJiYgdHAgJiYgdHAtPmNoaWxkX2xpc3QpIHsKICAgICAgICBmY3AgPSBjcDsKICAgICAgICB0cDIgPSB0cC0+Y2hpbGRfbGlzdDsKICAgICAgICAvKgogICAgICAgICAqIElzb2xhdGUgdGhlIG5leHQgZW50cnkgCiAgICAgICAgICovCiAgICAgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwogICAgICAgIGlmIChjcDIpCiAgICAgICAgICAgICpjcDIrKyA9ICdcMCc7CgogICAgICAgIC8qCiAgICAgICAgICogU2VhcmNoIGZvciB0aGUgYXBwcm9wcmlhdGUgY2hpbGQgCiAgICAgICAgICovCiAgICAgICAgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKCpjcCkpKSB7CiAgICAgICAgICAgIHN1YmlkID0gc3RydG91bChjcCwgJmVjcCwgMCk7CiAgICAgICAgICAgIGlmICgqZWNwKQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIHdoaWxlICh0cDIgJiYgdHAyLT5zdWJpZCAhPSBzdWJpZCkKICAgICAgICAgICAgICAgIHRwMiA9IHRwMi0+bmV4dF9wZWVyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHdoaWxlICh0cDIgJiYgc3RyY21wKHRwMi0+bGFiZWwsIGZjcCkpCiAgICAgICAgICAgICAgICB0cDIgPSB0cDItPm5leHRfcGVlcjsKICAgICAgICAgICAgaWYgKCF0cDIpCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgc3ViaWQgPSB0cDItPnN1YmlkOwogICAgICAgIH0KICAgICAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikKICAgICAgICAgICAgZ290byBiYWRfaWQ7Cgl3aGlsZSAodHAyICYmIHRwMi0+bmV4dF9wZWVyICYmIHRwMi0+bmV4dF9wZWVyLT5zdWJpZCA9PSBzdWJpZCkKCSAgICB0cDIgPSB0cDItPm5leHRfcGVlcjsKICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gc3ViaWQ7CiAgICAgICAgKCpvYmppZGxlbikrKzsKCiAgICAgICAgY3AgPSBjcDI7CiAgICAgICAgaWYgKCF0cDIpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIHRwID0gdHAyOwogICAgfQoKICAgIGlmICh0cCAmJiAhdHAtPmNoaWxkX2xpc3QpIHsKICAgICAgICBpZiAoKHRwMiA9IHRwLT5wYXJlbnQpKSB7CiAgICAgICAgICAgIGlmICh0cDItPmluZGV4ZXMpCiAgICAgICAgICAgICAgICBpbl9kaWNlcyA9IHRwMi0+aW5kZXhlczsKICAgICAgICAgICAgZWxzZSBpZiAodHAyLT5hdWdtZW50cykgewogICAgICAgICAgICAgICAgdHAyID0gZmluZF90cmVlX25vZGUodHAyLT5hdWdtZW50cywgLTEpOwogICAgICAgICAgICAgICAgaWYgKHRwMikKICAgICAgICAgICAgICAgICAgICBpbl9kaWNlcyA9IHRwMi0+aW5kZXhlczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0cCA9IE5VTEw7CiAgICB9CgogICAgd2hpbGUgKGNwICYmIGluX2RpY2VzKSB7CiAgICAgICAgZmNwID0gY3A7CgogICAgICAgIHRwID0gZmluZF90cmVlX25vZGUoaW5fZGljZXMtPmlsYWJlbCwgLTEpOwogICAgICAgIGlmICghdHApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIHN3aXRjaCAodHAtPnR5cGUpIHsKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgICAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICBjYXNlIFRZUEVfVElNRVRJQ0tTOgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBJc29sYXRlIHRoZSBuZXh0IGVudHJ5IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwogICAgICAgICAgICBpZiAoY3AyKQogICAgICAgICAgICAgICAgKmNwMisrID0gJ1wwJzsKICAgICAgICAgICAgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKCpjcCkpKSB7CiAgICAgICAgICAgICAgICBzdWJpZCA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwogICAgICAgICAgICAgICAgaWYgKCplY3ApCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAodHAtPmVudW1zKSB7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGVudW1fbGlzdCAqZXAgPSB0cC0+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+aGludCkKICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiBoaW50PSVzIiwgdHAtPmhpbnQpOwogICAgICAgICAgICBpZiAodHAtPnVuaXRzKQogICAgICAgICAgICAgICAgZnByaW50ZihmLCAiIHVuaXRzPSVzIiwgdHAtPnVuaXRzKTsKCiAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICAgICAgfQogICAgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydChmLCB0cCwgY291bnQpOwogICAgIC8qUkVDVVJTRSovfQp9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCgovKioKICogQ29udmVydHMgdGltZXRpY2tzIHRvIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzIHN0cmluZy4KICoKICogQHBhcmFtIHRpbWV0aWNrcyAgICBUaGUgdGltZXRpY2tzIHRvIGNvbnZlcnQuCiAqIEBwYXJhbSBidWYgICAgICAgICAgQnVmZmVyIHRvIHdyaXRlIHRvLCBoYXMgdG8gYmUgYXQgCiAqICAgICAgICAgICAgICAgICAgICAgbGVhc3QgNDAgQnl0ZXMgbGFyZ2UuCiAqICAgICAgIAogKiBAcmV0dXJuIFRoZSBidWZmZXIKICoKICogQHNlZSB1cHRpbWVTdHJpbmcKICovCmNoYXIgICAgICAgICAgICoKdXB0aW1lX3N0cmluZyh1X2xvbmcgdGltZXRpY2tzLCBjaGFyICpidWYpCnsKICAgIHJldHVybiB1cHRpbWVfc3RyaW5nX24oIHRpbWV0aWNrcywgYnVmLCA0MCk7Cn0KCmNoYXIgICAgICAgICAgICoKdXB0aW1lX3N0cmluZ19uKHVfbG9uZyB0aW1ldGlja3MsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKewogICAgdXB0aW1lU3RyaW5nKHRpbWV0aWNrcywgYnVmLCBidWZsZW4pOwogICAgcmV0dXJuIGJ1ZjsKfQoKLyoqCiAqIEdpdmVuIGEgc3RyaW5nLCBwYXJzZXMgYW4gb2lkIG91dCBvZiBpdCAoaWYgcG9zc2libGUpLgogKiBJdCB3aWxsIHRyeSB0byBwYXJzZSBpdCBiYXNlZCBvbiBwcmVkZXRlcm1pbmVkIGNvbmZpZ3VyYXRpb24gaWYKICogcHJlc2VudCBvciBieSBldmVyeSBtZXRob2QgcG9zc2libGUgb3RoZXJ3aXNlLgogKiBJZiBhIHN1ZmZpeCBoYXMgYmVlbiByZWdpc3RlcmVkIHVzaW5nIE5FVFNOTVBfRFNfTElCX09JRFNVRkZJWCwgaXQKICogd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgaW5wdXQgc3RyaW5nIGJlZm9yZSBwcm9jZXNzaW5nLgogKgogKiBAcGFyYW0gYXJndiAgICBUaGUgT0lEIHRvIHN0cmluZyBwYXJzZQogKiBAcGFyYW0gcm9vdCAgICBBbiBPSUQgYXJyYXkgd2hlcmUgdGhlIHJlc3VsdHMgYXJlIHN0b3JlZC4KICogQHBhcmFtIHJvb3RsZW4gVGhlIG1heCBsZW5ndGggb2YgdGhlIGFycmF5IGdvaW5nIGluIGFuZCB0aGUgZGF0YQogKiAgICAgICAgICAgICAgICBsZW5ndGggY29taW5nIG91dC4KICoKICogQHJldHVybiAgICAgICAgVGhlIHJvb3Qgb2lkIHBvaW50ZXIgaWYgc3VjY2Vzc2Z1bCwgb3IgTlVMTCBvdGhlcndpc2UuCiAqLwogCm9pZCAgICAgICAgICAgICoKc25tcF9wYXJzZV9vaWQoY29uc3QgY2hhciAqYXJndiwgb2lkICogcm9vdCwgc2l6ZV90ICogcm9vdGxlbikKewogICAgc2l6ZV90ICAgICAgICAgIHNhdmxlbiA9ICpyb290bGVuOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGJ1Zl9sZW4gPSAwOwogICAgc3RhdGljIGNoYXIgICAgKnRtcGJ1ZjsKICAgIGNvbnN0IGNoYXIgICAgICpzdWZmaXgsICpwcmVmaXg7CgogICAgc3VmZml4ID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9PSURTVUZGSVgpOwogICAgcHJlZml4ID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9PSURQUkVGSVgpOwogICAgaWYgKChzdWZmaXggJiYgc3VmZml4WzBdKSB8fCAocHJlZml4ICYmIHByZWZpeFswXSkpIHsKICAgICAgICBpZiAoIXN1ZmZpeCkKICAgICAgICAgICAgc3VmZml4ID0gIiI7CiAgICAgICAgaWYgKCFwcmVmaXgpCiAgICAgICAgICAgIHByZWZpeCA9ICIiOwogICAgICAgIGlmICgoc3RybGVuKHN1ZmZpeCkgKyBzdHJsZW4ocHJlZml4KSArIHN0cmxlbihhcmd2KSArIDIpID4gdG1wYnVmX2xlbikgewogICAgICAgICAgICB0bXBidWZfbGVuID0gc3RybGVuKHN1ZmZpeCkgKyBzdHJsZW4oYXJndikgKyBzdHJsZW4ocHJlZml4KSArIDI7CiAgICAgICAgICAgIHRtcGJ1ZiA9IChjaGFyICopcmVhbGxvYyh0bXBidWYsIHRtcGJ1Zl9sZW4pOwogICAgICAgIH0KICAgICAgICBzbnByaW50Zih0bXBidWYsIHRtcGJ1Zl9sZW4sICIlcyVzJXMlcyIsIHByZWZpeCwgYXJndiwKICAgICAgICAgICAgICAgICAoKHN1ZmZpeFswXSA9PSAnLicgfHwgc3VmZml4WzBdID09ICdcMCcpID8gIiIgOiAiLiIpLAogICAgICAgICAgICAgICAgIHN1ZmZpeCk7CiAgICAgICAgYXJndiA9IHRtcGJ1ZjsKICAgICAgICBERUJVR01TR1RMKCgic25tcF9wYXJzZV9vaWQiLCJQYXJzaW5nOiAlc1xuIixhcmd2KSk7CiAgICB9CgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9SQU5ET01fQUNDRVNTKQogICAgICAgIHx8IHN0cmNocihhcmd2LCAnOicpKSB7CiAgICAgICAgaWYgKGdldF9ub2RlKGFyZ3YsIHJvb3QsIHJvb3RsZW4pKSB7CiAgICAgICAgICAgIHJldHVybiByb290OwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1JFR0VYX0FDQ0VTUykpIHsKCWNsZWFyX3RyZWVfZmxhZ3ModHJlZV9oZWFkKTsKICAgICAgICBpZiAoZ2V0X3dpbGRfbm9kZShhcmd2LCByb290LCByb290bGVuKSkgewogICAgICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICB9CiAgICB9IGVsc2UgewojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICAgICAgaWYgKHJlYWRfb2JqaWQoYXJndiwgcm9vdCwgcm9vdGxlbikpIHsKICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgICAgfQojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgICAgICpyb290bGVuID0gc2F2bGVuOwogICAgICAgIGlmIChnZXRfbm9kZShhcmd2LCByb290LCByb290bGVuKSkgewogICAgICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICB9CiAgICAgICAgKnJvb3RsZW4gPSBzYXZsZW47CiAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZCIsICJ3aWxkbHkgcGFyc2luZ1xuIikpOwoJY2xlYXJfdHJlZV9mbGFncyh0cmVlX2hlYWQpOwogICAgICAgIGlmIChnZXRfd2lsZF9ub2RlKGFyZ3YsIHJvb3QsIHJvb3RsZW4pKSB7CiAgICAgICAgICAgIHJldHVybiByb290OwogICAgICAgIH0KICAgIH0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgcmV0dXJuIE5VTEw7Cn0KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCi8qCiAqIFVzZSBESVNQTEFZLUhJTlQgdG8gcGFyc2UgYSB2YWx1ZSBpbnRvIGFuIG9jdGV0IHN0cmluZy4KICoKICogbm90ZSB0aGF0ICIxZDFkIiwgIjExIiBjb3VsZCBoYXZlIGNvbWUgZnJvbSBhbiBvY3RldCBzdHJpbmcgdGhhdAogKiBsb29rZWQgbGlrZSB7IDEsIDEgfSBvciBhbiBvY3RldCBzdHJpbmcgdGhhdCBsb29rZWQgbGlrZSB7IDExIH0KICogYmVjYXVzZSBvZiB0aGlzLCBpdCdzIGRvdWJ0ZnVsIHRoYXQgYW55b25lIHdvdWxkIHVzZSBzdWNoIGEgZGlzcGxheQogKiBzdHJpbmcuIFRoZXJlZm9yZSwgdGhlIHBhcnNlciBpZ25vcmVzIHRoaXMgY2FzZS4KICovCgpzdHJ1Y3QgcGFyc2VfaGludHMgewogICAgaW50IGxlbmd0aDsKICAgIGludCByZXBlYXQ7CiAgICBpbnQgZm9ybWF0OwogICAgaW50IHNlcGFyYXRvcjsKICAgIGludCB0ZXJtaW5hdG9yOwogICAgdW5zaWduZWQgY2hhciAqcmVzdWx0OwogICAgaW50IHJlc3VsdF9tYXg7CiAgICBpbnQgcmVzdWx0X2xlbjsKfTsKCnN0YXRpYyB2b2lkIHBhcnNlX2hpbnRzX3Jlc2V0KHN0cnVjdCBwYXJzZV9oaW50cyAqcGgpCnsKICAgIHBoLT5sZW5ndGggPSAwOwogICAgcGgtPnJlcGVhdCA9IDA7CiAgICBwaC0+Zm9ybWF0ID0gMDsKICAgIHBoLT5zZXBhcmF0b3IgPSAwOwogICAgcGgtPnRlcm1pbmF0b3IgPSAwOwp9CgpzdGF0aWMgdm9pZCBwYXJzZV9oaW50c19jdG9yKHN0cnVjdCBwYXJzZV9oaW50cyAqcGgpCnsKICAgIHBhcnNlX2hpbnRzX3Jlc2V0KHBoKTsKICAgIHBoLT5yZXN1bHQgPSBOVUxMOwogICAgcGgtPnJlc3VsdF9tYXggPSAwOwogICAgcGgtPnJlc3VsdF9sZW4gPSAwOwp9CgpzdGF0aWMgaW50IHBhcnNlX2hpbnRzX2FkZF9yZXN1bHRfb2N0ZXQoc3RydWN0IHBhcnNlX2hpbnRzICpwaCwgdW5zaWduZWQgY2hhciBvY3RldCkKewogICAgaWYgKCEocGgtPnJlc3VsdF9sZW4gPCBwaC0+cmVzdWx0X21heCkpIHsKCXBoLT5yZXN1bHRfbWF4ID0gcGgtPnJlc3VsdF9sZW4gKyAzMjsKCWlmICghcGgtPnJlc3VsdCkgewoJICAgIHBoLT5yZXN1bHQgPSAodW5zaWduZWQgY2hhciAqKW1hbGxvYyhwaC0+cmVzdWx0X21heCk7Cgl9IGVsc2UgewoJICAgIHBoLT5yZXN1bHQgPSAodW5zaWduZWQgY2hhciAqKXJlYWxsb2MocGgtPnJlc3VsdCwgcGgtPnJlc3VsdF9tYXgpOwoJfQogICAgfQogICAgCiAgICBpZiAoIXBoLT5yZXN1bHQpIHsKCXJldHVybiAwOwkJLyogZmFpbGVkICovCiAgICB9CgogICAgcGgtPnJlc3VsdFtwaC0+cmVzdWx0X2xlbisrXSA9IG9jdGV0OwogICAgcmV0dXJuIDE7CQkJLyogc3VjY2VzcyAqLwp9CgpzdGF0aWMgaW50IHBhcnNlX2hpbnRzX3BhcnNlKHN0cnVjdCBwYXJzZV9oaW50cyAqcGgsIGNvbnN0IGNoYXIgKip2X2luX291dCkKewogICAgY29uc3QgY2hhciAqdiA9ICp2X2luX291dDsKICAgIGNoYXIgKm52OwogICAgaW50IGJhc2U7CiAgICBpbnQgcmVwZWF0cyA9IDA7CiAgICBpbnQgcmVwZWF0X2ZpeHVwID0gcGgtPnJlc3VsdF9sZW47CiAgICAKICAgIGlmIChwaC0+cmVwZWF0KSB7CglpZiAoIXBhcnNlX2hpbnRzX2FkZF9yZXN1bHRfb2N0ZXQocGgsIDApKSB7CgkgICAgcmV0dXJuIDA7Cgl9CiAgICB9CiAgICBkbyB7CgliYXNlID0gMDsKCXN3aXRjaCAocGgtPmZvcm1hdCkgewoJY2FzZSAneCc6IGJhc2UgKz0gNjsJLyogZmFsbCB0aHJvdWdoICovCgljYXNlICdkJzogYmFzZSArPSAyOwkvKiBmYWxsIHRocm91Z2ggKi8KCWNhc2UgJ28nOiBiYXNlICs9IDg7CS8qIGZhbGwgdGhyb3VnaCAqLwoJICAgIHsKCQlpbnQgaTsKCQl1bnNpZ25lZCBsb25nIG51bWJlciA9IHN0cnRvbCh2LCAmbnYsIGJhc2UpOwoJCWlmIChudiA9PSB2KSByZXR1cm4gMDsKCQl2ID0gbnY7CgkJZm9yIChpID0gMDsgaSA8IHBoLT5sZW5ndGg7IGkrKykgewoJCSAgICBpbnQgc2hpZnQgPSA4ICogKHBoLT5sZW5ndGggLSAxIC0gaSk7CgkJICAgIGlmICghcGFyc2VfaGludHNfYWRkX3Jlc3VsdF9vY3RldChwaCwgKHVfY2hhcikobnVtYmVyID4+IHNoaWZ0KSApKSB7CgkJCXJldHVybiAwOyAvKiBmYWlsZWQgKi8KCQkgICAgfQoJCX0KCSAgICB9CgkgICAgYnJlYWs7CgoJY2FzZSAnYSc6CgkgICAgewoJCWludCBpOwoJCSAgICAKCQlmb3IgKGkgPSAwOyBpIDwgcGgtPmxlbmd0aCAmJiAqdjsgaSsrKSB7CgkJICAgIGlmICghcGFyc2VfaGludHNfYWRkX3Jlc3VsdF9vY3RldChwaCwgKnYrKykpIHsKCQkJcmV0dXJuIDA7CS8qIGZhaWxlZCAqLwoJCSAgICB9CgkJfQoJICAgIH0KCSAgICBicmVhazsKCX0KCglyZXBlYXRzKys7CgoJaWYgKHBoLT5zZXBhcmF0b3IgJiYgKnYpIHsKCSAgICBpZiAoKnYgPT0gcGgtPnNlcGFyYXRvcikgewoJCXYrKzsKCSAgICB9IGVsc2UgewoJCXJldHVybiAwOwkJLyogZmFpbGVkICovCgkgICAgfQoJfQoKCWlmIChwaC0+dGVybWluYXRvcikgewoJICAgIGlmICgqdiA9PSBwaC0+dGVybWluYXRvcikgewoJCXYrKzsKCQlicmVhazsKCSAgICB9Cgl9CiAgICB9IHdoaWxlIChwaC0+cmVwZWF0ICYmICp2KTsKICAgIGlmIChwaC0+cmVwZWF0KSB7CglwaC0+cmVzdWx0W3JlcGVhdF9maXh1cF0gPSByZXBlYXRzOwogICAgfQoKICAgICp2X2luX291dCA9IHY7CiAgICByZXR1cm4gMTsKfQoKc3RhdGljIHZvaWQgcGFyc2VfaGludHNfbGVuZ3RoX2FkZF9kaWdpdChzdHJ1Y3QgcGFyc2VfaGludHMgKnBoLCBpbnQgZGlnaXQpCnsKICAgIHBoLT5sZW5ndGggKj0gMTA7CiAgICBwaC0+bGVuZ3RoICs9IGRpZ2l0IC0gJzAnOwp9Cgpjb25zdCBjaGFyICpwYXJzZV9vY3RldF9oaW50KGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnZhbHVlLCB1bnNpZ25lZCBjaGFyICoqbmV3X3ZhbCwgaW50ICpuZXdfdmFsX2xlbikKewogICAgY29uc3QgY2hhciAqaCA9IGhpbnQ7CiAgICBjb25zdCBjaGFyICp2ID0gdmFsdWU7CiAgICBzdHJ1Y3QgcGFyc2VfaGludHMgcGg7CiAgICBpbnQgcmV0dmFsID0gMTsKICAgIC8qIFNlZSBSRkMgMTQ0MyAqLwogICAgZW51bSB7CglISU5UXzFfMiwKCUhJTlRfMl8zLAoJSElOVF8xXzJfNCwKCUhJTlRfMV8yXzUKICAgIH0gc3RhdGUgPSBISU5UXzFfMjsKCiAgICBwYXJzZV9oaW50c19jdG9yKCZwaCk7CiAgICB3aGlsZSAoKmggJiYgKnYgJiYgcmV0dmFsKSB7Cglzd2l0Y2ggKHN0YXRlKSB7CgljYXNlIEhJTlRfMV8yOgoJICAgIGlmICgnKicgPT0gKmgpIHsKCQlwaC5yZXBlYXQgPSAxOwoJCXN0YXRlID0gSElOVF8yXzM7CgkgICAgfSBlbHNlIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSgqaCkpKSB7CgkJcGFyc2VfaGludHNfbGVuZ3RoX2FkZF9kaWdpdCgmcGgsICpoKTsKCQlzdGF0ZSA9IEhJTlRfMl8zOwoJICAgIH0gZWxzZSB7CgkJcmV0dXJuIHY7CS8qIGZhaWxlZCAqLwoJICAgIH0KCSAgICBicmVhazsKCgljYXNlIEhJTlRfMl8zOgoJICAgIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSgqaCkpKSB7CgkJcGFyc2VfaGludHNfbGVuZ3RoX2FkZF9kaWdpdCgmcGgsICpoKTsKCQkvKiBzdGF0ZSA9IEhJTlRfMl8zICovCgkgICAgfSBlbHNlIGlmICgneCcgPT0gKmggfHwgJ2QnID09ICpoIHx8ICdvJyA9PSAqaCB8fCAnYScgPT0gKmgpIHsKCQlwaC5mb3JtYXQgPSAqaDsKCQlzdGF0ZSA9IEhJTlRfMV8yXzQ7CgkgICAgfSBlbHNlIHsKCQlyZXR1cm4gdjsJLyogZmFpbGVkICovCgkgICAgfQoJICAgIGJyZWFrOwoKCWNhc2UgSElOVF8xXzJfNDoKCSAgICBpZiAoJyonID09ICpoKSB7CgkJcmV0dmFsID0gcGFyc2VfaGludHNfcGFyc2UoJnBoLCAmdik7CgkJcGFyc2VfaGludHNfcmVzZXQoJnBoKTsKCQkKCQlwaC5yZXBlYXQgPSAxOwoJCXN0YXRlID0gSElOVF8yXzM7CgkgICAgfSBlbHNlIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSgqaCkpKSB7CgkJcmV0dmFsID0gcGFyc2VfaGludHNfcGFyc2UoJnBoLCAmdik7CgkJcGFyc2VfaGludHNfcmVzZXQoJnBoKTsKCQkKCQlwYXJzZV9oaW50c19sZW5ndGhfYWRkX2RpZ2l0KCZwaCwgKmgpOwoJCXN0YXRlID0gSElOVF8yXzM7CgkgICAgfSBlbHNlIHsKCQlwaC5zZXBhcmF0b3IgPSAqaDsKCQlzdGF0ZSA9IEhJTlRfMV8yXzU7CgkgICAgfQoJICAgIGJyZWFrOwoKCWNhc2UgSElOVF8xXzJfNToKCSAgICBpZiAoJyonID09ICpoKSB7CgkJcmV0dmFsID0gcGFyc2VfaGludHNfcGFyc2UoJnBoLCAmdik7CgkJcGFyc2VfaGludHNfcmVzZXQoJnBoKTsKCQkKCQlwaC5yZXBlYXQgPSAxOwoJCXN0YXRlID0gSElOVF8yXzM7CgkgICAgfSBlbHNlIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSgqaCkpKSB7CgkJcmV0dmFsID0gcGFyc2VfaGludHNfcGFyc2UoJnBoLCAmdik7CgkJcGFyc2VfaGludHNfcmVzZXQoJnBoKTsKCQkKCQlwYXJzZV9oaW50c19sZW5ndGhfYWRkX2RpZ2l0KCZwaCwgKmgpOwoJCXN0YXRlID0gSElOVF8yXzM7CgkgICAgfSBlbHNlIHsKCQlwaC50ZXJtaW5hdG9yID0gKmg7CgoJCXJldHZhbCA9IHBhcnNlX2hpbnRzX3BhcnNlKCZwaCwgJnYpOwoJCXBhcnNlX2hpbnRzX3Jlc2V0KCZwaCk7CgoJCXN0YXRlID0gSElOVF8xXzI7CgkgICAgfQoJICAgIGJyZWFrOwoJfQoJaCsrOwogICAgfQogICAgd2hpbGUgKCp2ICYmIHJldHZhbCkgewoJcmV0dmFsID0gcGFyc2VfaGludHNfcGFyc2UoJnBoLCAmdik7CiAgICB9CiAgICBpZiAocmV0dmFsKSB7CgkqbmV3X3ZhbCA9IHBoLnJlc3VsdDsKCSpuZXdfdmFsX2xlbiA9IHBoLnJlc3VsdF9sZW47CiAgICB9IGVsc2UgewoJaWYgKHBoLnJlc3VsdCkgewoJICAgIFNOTVBfRlJFRShwaC5yZXN1bHQpOwoJfQoJKm5ld192YWwgPSBOVUxMOwoJKm5ld192YWxfbGVuID0gMDsKICAgIH0KICAgIHJldHVybiByZXR2YWwgPyBOVUxMIDogdjsKfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgojaWZkZWYgdGVzdF9kaXNwbGF5X2hpbnQKCmludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKewogICAgY29uc3QgY2hhciAqaGludDsKICAgIGNvbnN0IGNoYXIgKnZhbHVlOwogICAgdW5zaWduZWQgY2hhciAqbmV3X3ZhbDsKICAgIGludCBuZXdfdmFsX2xlbjsKICAgIGNoYXIgKnI7CiAgICAKICAgIGlmIChhcmdjIDwgMykgewoJZnByaW50ZihzdGRlcnIsICJ1c2FnZTogZGggPGhpbnQ+IDx2YWx1ZT5cbiIpOwoJZXhpdCgyKTsKICAgIH0KICAgIGhpbnQgPSBhcmd2WzFdOwogICAgdmFsdWUgPSBhcmd2WzJdOwogICAgciA9IHBhcnNlX29jdGV0X2hpbnQoaGludCwgdmFsdWUsICZuZXdfdmFsLCAmbmV3X3ZhbF9sZW4pOwogICAgcHJpbnRmKCJ7XCIlc1wiLCBcIiVzXCJ9OiBcblx0IiwgaGludCwgdmFsdWUpOwogICAgaWYgKHIpIHsKICAgICAgICAqciA9IDA7CiAgICAJcHJpbnRmKCJyZXR1cm5lZCBmYWlsZWRcbiIpOwoJcHJpbnRmKCJ2YWx1ZSBzeW50YXggZXJyb3IgYXQ6ICVzXG4iLCB2YWx1ZSk7CiAgICB9CiAgICBlbHNlIHsKCWludCBpOwoJcHJpbnRmKCJyZXR1cm5lZCBzdWNjZXNzXG4iKTsKCWZvciAoaSA9IDA7IGkgPCBuZXdfdmFsX2xlbjsgaSsrKSB7CgkgICAgaW50IGMgPSBuZXdfdmFsW2ldICYgMHhGRjsKCSAgICBwcmludGYoIiUwMlgoJWMpICIsIGMsIGlzcHJpbnQoYykgPyBjIDogJyAnKTsKCX0KCVNOTVBfRlJFRShuZXdfdmFsKTsKICAgIH0KICAgIHByaW50ZigiXG4iKTsKICAgIGV4aXQoMCk7Cn0KCiNlbmRpZiAvKiB0ZXN0X2Rpc3BsYXlfaGludCAqLwoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX01JQl9UT19BU05fVFlQRQp1X2NoYXIKbWliX3RvX2Fzbl90eXBlKGludCBtaWJfdHlwZSkKewogICAgc3dpdGNoIChtaWJfdHlwZSkgewogICAgY2FzZSBUWVBFX09CSklEOgogICAgICAgIHJldHVybiBBU05fT0JKRUNUX0lEOwoKICAgIGNhc2UgVFlQRV9PQ1RFVFNUUjoKICAgICAgICByZXR1cm4gQVNOX09DVEVUX1NUUjsKCiAgICBjYXNlIFRZUEVfTkVUQUREUjoKICAgIGNhc2UgVFlQRV9JUEFERFI6CiAgICAgICAgcmV0dXJuIEFTTl9JUEFERFJFU1M7CgogICAgY2FzZSBUWVBFX0lOVEVHRVIzMjoKICAgIGNhc2UgVFlQRV9JTlRFR0VSOgogICAgICAgIHJldHVybiBBU05fSU5URUdFUjsKCiAgICBjYXNlIFRZUEVfQ09VTlRFUjoKICAgICAgICByZXR1cm4gQVNOX0NPVU5URVI7CgogICAgY2FzZSBUWVBFX0dBVUdFOgogICAgICAgIHJldHVybiBBU05fR0FVR0U7CgogICAgY2FzZSBUWVBFX1RJTUVUSUNLUzoKICAgICAgICByZXR1cm4gQVNOX1RJTUVUSUNLUzsKCiAgICBjYXNlIFRZUEVfT1BBUVVFOgogICAgICAgIHJldHVybiBBU05fT1BBUVVFOwoKICAgIGNhc2UgVFlQRV9OVUxMOgogICAgICAgIHJldHVybiBBU05fTlVMTDsKCiAgICBjYXNlIFRZUEVfQ09VTlRFUjY0OgogICAgICAgIHJldHVybiBBU05fQ09VTlRFUjY0OwoKICAgIGNhc2UgVFlQRV9CSVRTVFJJTkc6CiAgICAgICAgcmV0dXJuIEFTTl9CSVRfU1RSOwoKICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgIGNhc2UgVFlQRV9VTlNJR05FRDMyOgogICAgICAgIHJldHVybiBBU05fVU5TSUdORUQ7CgogICAgY2FzZSBUWVBFX05TQVBBRERSRVNTOgogICAgICAgIHJldHVybiBBU05fTlNBUDsKCiAgICB9CiAgICByZXR1cm4gLTE7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTUlCX1RPX0FTTl9UWVBFICovCgovKioKICogQ29udmVydHMgYSBzdHJpbmcgdG8gaXRzIE9JRCBmb3JtLgogKiBpbiBleGFtcGxlICAiaGVsbG8iID0gNSAuICdoJyAuICdlJyAuICdsJyAuICdsJyAuICdvJwogKgogKiBAcGFyYW0gUyAgIFRoZSBzdHJpbmcuCiAqIEBwYXJhbSBPICAgVGhlIG9pZC4KICogQHBhcmFtIEwgICBUaGUgbGVuZ3RoIG9mIHRoZSBvaWQuCiAqCiAqIEByZXR1cm4gMCBvbiBTdWNlc3MsIDEgb24gZmFpbHVyZS4KICovCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9NSUJfU1RSSU5HX0NPTlZFUlNJT05TCmludApuZXRzbm1wX3N0cjJvaWQoY29uc3QgY2hhciAqUywgb2lkICogTywgaW50IEwpCnsKICAgIGNvbnN0IGNoYXIgICAgICpjID0gUzsKICAgIG9pZCAgICAgICAgICAgICpvID0gJk9bMV07CgogICAgLS1MOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlYXZlIHJvb20gZm9yIGxlbmd0aCBwcmVmaXggKi8KCiAgICBmb3IgKDsgKmMgJiYgTDsgLS1MLCArK28sICsrYykKICAgICAgICAqbyA9ICpjOwoKICAgIC8qCiAgICAgKiBtYWtlIHN1cmUgd2UgZ290IHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyAKICAgICAqLwogICAgaWYgKCpjICE9IDApCiAgICAgICAgcmV0dXJuIDE7CgogICAgLyoKICAgICAqIHNldCB0aGUgbGVuZ3RoIG9mIHRoZSBvaWQgCiAgICAgKi8KICAgICpPID0gYyAtIFM7CgogICAgcmV0dXJuIDA7Cn0KCi8qKgogKiBDb252ZXJ0cyBhbiBPSUQgdG8gaXRzIGNoYXJhY3RlciBmb3JtLgogKiBpbiBleGFtcGxlICA1IC4gMSAuIDIgLiAzIC4gNCAuIDUgPSAxMjM0NQogKgogKiBAcGFyYW0gQyAgIFRoZSBjaGFyYWN0ZXIgYnVmZmVyLgogKiBAcGFyYW0gTCAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlci4KICogQHBhcmFtIE8gICBUaGUgb2lkLgogKgogKiBAcmV0dXJuIDAgb24gU3VjZXNzLCAxIG9uIGZhaWx1cmUuCiAqLwppbnQKbmV0c25tcF9vaWQyY2hhcnMoY2hhciAqQywgaW50IEwsIGNvbnN0IG9pZCAqIE8pCnsKICAgIGNoYXIgICAgICAgICAgICpjID0gQzsKICAgIGNvbnN0IG9pZCAgICAgICpvID0gJk9bMV07CgogICAgaWYgKEwgPCAoaW50KSpPKQogICAgICAgIHJldHVybiAxOwoKICAgIEwgPSAqTzsgLyoqIGxlbmd0aCAqLwogICAgZm9yICg7IEw7IC0tTCwgKytvLCArK2MpIHsKICAgICAgICBpZiAoKm8gPiAweEZGKQogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAqYyA9IChjaGFyKSpvOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKgogKiBDb252ZXJ0cyBhbiBPSUQgdG8gaXRzIHN0cmluZyBmb3JtLgogKiBpbiBleGFtcGxlICA1IC4gJ2gnIC4gJ2UnIC4gJ2wnIC4gJ2wnIC4gJ28nID0gImhlbGxvXDAiIChudWxsIHRlcm1pbmF0ZWQpCiAqCiAqIEBwYXJhbSBTICAgVGhlIGNoYXJhY3RlciBzdHJpbmcgYnVmZmVyLgogKiBAcGFyYW0gTCAgIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBidWZmZXIuCiAqIEBwYXJhbSBPICAgVGhlIG9pZC4KICoKICogQHJldHVybiAwIG9uIFN1Y2VzcywgMSBvbiBmYWlsdXJlLgogKi8KaW50Cm5ldHNubXBfb2lkMnN0cihjaGFyICpTLCBpbnQgTCwgb2lkICogTykKewogICAgaW50ICAgICAgICAgICAgcmM7CgogICAgaWYgKEwgPD0gKGludCkqTykKICAgICAgICByZXR1cm4gMTsKCiAgICByYyA9IG5ldHNubXBfb2lkMmNoYXJzKFMsIEwsIE8pOwogICAgaWYgKHJjKQogICAgICAgIHJldHVybiAxOwoKICAgIFNbICpPIF0gPSAwOwoKICAgIHJldHVybiAwOwp9CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX01JQl9TVFJJTkdfQ09OVkVSU0lPTlMgKi8KCgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTUlCX1NOUFJJTlQKaW50CnNucHJpbnRfYnlfdHlwZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2J5X3R5cGUoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2hleHN0cmluZyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLCBjb25zdCB1X2NoYXIgKiBjcCwgc2l6ZV90IGxlbikKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2hleHN0cmluZygodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcCwgbGVuKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2FzY2lpc3RyaW5nKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdV9jaGFyICogY3AsIHNpemVfdCBsZW4pCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19hc2NpaXN0cmluZwogICAgICAgICgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLCBjcCwgbGVuKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X29jdGV0X3N0cmluZyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX29jdGV0X3N0cmluZwogICAgICAgICgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9vcGFxdWUoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19vcGFxdWUoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfb2JqZWN0X2lkZW50aWZpZXIoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsIGNvbnN0IGNoYXIgKmhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19vYmplY3RfaWRlbnRpZmllcgogICAgICAgICgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF90aW1ldGlja3MoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY190aW1ldGlja3MoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfaGludGVkX2ludGVnZXIoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBsb25nIHZhbCwgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19oaW50ZWRfaW50ZWdlcgogICAgICAgICgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLCB2YWwsICdkJywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfaW50ZWdlcihjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfaW50ZWdlcigodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfdWludGVnZXIoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfdWludGVnZXIoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9nYXVnZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19nYXVnZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2NvdW50ZXIoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2NvdW50ZXIoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X25ldHdvcmthZGRyZXNzKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLCBjb25zdCBjaGFyICpoaW50LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfbmV0d29ya2FkZHJlc3MKICAgICAgICAoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfaXBhZGRyZXNzKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfaXBhZGRyZXNzKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X251bGwoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX251bGwoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2JpdHN0cmluZyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2JpdHN0cmluZygodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9uc2FwYWRkcmVzcyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19uc2FwYWRkcmVzcwogICAgICAgICgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9jb3VudGVyNjQoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19jb3VudGVyNjQoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfYmFkdHlwZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfYmFkdHlwZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwppbnQKc25wcmludF9mbG9hdChjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19mbG9hdCgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2RvdWJsZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2RvdWJsZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CiNlbmRpZgojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9NSUJfU05QUklOVCAqLwovKiogQH0gKi8KCg==