Lyogc2ltcGxlaW5pdC5jIC0gcG9lQGRhaW1pLmFhdS5kayAqLwovKiBWZXJzaW9uIDIuMC4yICovCgovKiAxOTk5LTAyLTIyIEFya2FkaXVzeiBNabZraWV3aWN6IDxtaXNpZWtAcGxkLk9SRy5QTD4KICogLSBhZGRlZCBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAogKiAyMDAxLTAxLTI1IFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgogKiAtIGZpeGVkIGJ1ZyB3aXRoIGZhaWxlZCBzZXJ2aWNlcyBzbyB0aGV5IG1heSBiZSBsYXRlciAicmVjbGFpbWVkIgogKiAyMDAxLTAyLTAyIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgogKiAtIGZpeGVkIHJhY2Ugd2hlbiByZWFkaW5nIGZyb20gcGlwZSBhbmQgcmVhcGluZyBjaGlsZHJlbgogKiAyMDAxLTAyLTE4IHNhbUBxdXV4LmRyb3BiZWFyLmlkLmF1CiAqIC0gZml4ZWQgYnVnIGluIDxnZXRfcGF0aD46IG11bHRpcGxlIElOSVRfUEFUSCBjb21wb25lbnRzIGRpZCBub3Qgd29yawogKiAyMDAxLTAyLTIxIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgogKiAtIGJsb2NrIHNpZ25hbHMgaW4gaGFuZGxlcnMsIHNvIHRoYXQgbG9uZ2ptcCgpIGRvZXNuJ3Qga2lsbCBjb250ZXh0CiAqIDIwMDEtMDItMjUgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CiAqIC0gbWFrZSBkZWZhdWx0IElOSVRfUEFUSCB0aGUgYm9vdF9wcm9nIChpZiBpdCBpcyBhIGRpcmVjdG9yeSkgLSBZRUNDSAogKiAyMDAyLTExLTIwIHBhdGNoIGZyb20gU3VTRQogKiAtIHJlZnVzZSBpbml0Y3RsX2ZkIGlmIHNldHRpbmcgRkRfQ0xPRVhFQyBmYWlscwogKi8KCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPHB3ZC5oPgojaW5jbHVkZSA8c3lzL2ZpbGUuaD4KI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojaW5jbHVkZSA8ZGlyZW50Lmg+CiNpbmNsdWRlIDx0ZXJtaW9zLmg+CiNpbmNsdWRlIDx1dG1wLmg+CiNpbmNsdWRlIDxzZXRqbXAuaD4KI2luY2x1ZGUgPHNjaGVkLmg+CiNpZmRlZiBTSEFET1dfUFdECiMgIGluY2x1ZGUgPHNoYWRvdy5oPgojZW5kaWYKI2luY2x1ZGUgIm15X2NyeXB0LmgiCiNpbmNsdWRlICJwYXRobmFtZXMuaCIKI2luY2x1ZGUgImxpbnV4X3JlYm9vdC5oIgojaW5jbHVkZSAieHN0cm5jcHkuaCIKI2luY2x1ZGUgIm5scy5oIgojaW5jbHVkZSAic2ltcGxlaW5pdC5oIgoKI2RlZmluZSBDTURTSVogICAgIDE1MAkvKiBtYXggc2l6ZSBvZiBhIGxpbmUgaW4gaW5pdHRhYiAqLwojZGVmaW5lIE5VTUNNRCAgICAgMzAJLyogbWF4IG51bWJlciBvZiBsaW5lcyBpbiBpbml0dGFiICovCiNkZWZpbmUgTlVNVE9LICAgICAyMAkvKiBtYXggbnVtYmVyIG9mIHRva2VucyBpbiBpbml0dGFiIGNvbW1hbmQgKi8KI2RlZmluZSBQQVRIX1NJWkUgIChDTURTSVorQ01EU0laKzEpCgojZGVmaW5lIE1BWF9SRVNQQVdOX1JBVEUgIDUgIC8qICBudW1iZXIgb2YgcmVzcGF3bnMgcGVyIDEwMCBzZWNvbmRzICAqLwoKI2RlZmluZSBUWkZJTEUgIi9ldGMvVFoiCmNoYXIgdHpvbmVbQ01EU0laXTsKLyogI2RlZmluZSBERUJVR0dJTkcgKi8KCi8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IGluaXQgdG8gaWdub3JlIHRoZSB0ZXJtY2FwIGZpZWxkIGluIGluaXR0YWIgZm9yCiAgIGNvbnNvbGUgdHR5cy4gKi8KLyogI2RlZmluZSBTUEVDSUFMX0NPTlNPTEVfVEVSTSAqLwoKI2RlZmluZSBldmVyICg7OykKCnN0cnVjdCBpbml0bGluZSB7CglwaWRfdAkJcGlkOwoJY2hhcgkJdHR5WzEwXTsKCWNoYXIJCXRlcm1jYXBbMzBdOwoJY2hhcgkJKnRva3NbTlVNVE9LXTsKCWNoYXIJCWxpbmVbQ01EU0laXTsKCXN0cnVjdCB0aW1ldmFsCWxhc3Rfc3RhcnQ7CglzaWduZWQgbG9uZwlyYXRlOwp9OwoKc3RydWN0IGluaXRsaW5lIGluaXR0YWJbTlVNQ01EXTsKaW50IG51bWNtZDsKaW50IHN0b3BwZWQgPSAwOwkvKiBhcmUgd2Ugc3RvcHBlZCAqLwpzdGF0aWMgY2hhciBib290X3Byb2dbUEFUSF9TSVpFXSA9IF9QQVRIX1JDOwpzdGF0aWMgY2hhciBzY3JpcHRfcHJlZml4W1BBVEhfU0laRV0gPSAiXDAiOwpzdGF0aWMgY2hhciBmaW5hbF9wcm9nW1BBVEhfU0laRV0gPSAiXDAiOwpzdGF0aWMgY2hhciBpbml0X3BhdGhbUEFUSF9TSVpFXSA9ICJcMCI7CnN0YXRpYyBpbnQgY2F1Z2h0X3NpZ2ludCA9IDA7CnN0YXRpYyBpbnQgbm9fcmVib290ID0gMDsKc3RhdGljIHBpZF90IHJjX2NoaWxkID0gLTE7CnN0YXRpYyBjb25zdCBjaGFyICppbml0Y3RsX25hbWUgPSAiL2Rldi9pbml0Y3RsIjsKc3RhdGljIGludCBpbml0Y3RsX2ZkID0gLTE7CnN0YXRpYyB2b2xhdGlsZSBpbnQgZG9fbG9uZ2ptcCA9IDA7CnN0YXRpYyBzaWdqbXBfYnVmIGptcF9lbnY7CgoKc3RhdGljIHZvaWQgZG9fc2luZ2xlICh2b2lkKTsKc3RhdGljIGludCBkb19yY190dHkgKGNvbnN0IGNoYXIgKnBhdGgpOwpzdGF0aWMgaW50IHByb2Nlc3NfcGF0aCAoY29uc3QgY2hhciAqcGF0aCwgaW50ICgqZnVuYykgKGNvbnN0IGNoYXIgKnBhdGgpLAoJCQkgaW50IGlnbm9yZV9kYW5nbGluZ19zeW1saW5rKTsKc3RhdGljIGludCBwcmVsb2FkX2ZpbGUgKGNvbnN0IGNoYXIgKnBhdGgpOwpzdGF0aWMgaW50IHJ1bl9maWxlIChjb25zdCBjaGFyICpwYXRoKTsKc3RhdGljIHZvaWQgc3Bhd24gKGludCBpKSwgcmVhZF9pbml0dGFiICh2b2lkKTsKc3RhdGljIHZvaWQgc2lnaHVwX2hhbmRsZXIgKGludCBzaWcpOwpzdGF0aWMgdm9pZCBzaWd0c3RwX2hhbmRsZXIgKGludCBzaWcpOwpzdGF0aWMgdm9pZCBzaWdpbnRfaGFuZGxlciAoaW50IHNpZyk7CnN0YXRpYyB2b2lkIHNpZ2NoaWxkX2hhbmRsZXIgKGludCBzaWcpOwpzdGF0aWMgdm9pZCBzaWdxdWl0X2hhbmRsZXIgKGludCBzaWcpOwpzdGF0aWMgdm9pZCBzaWd0ZXJtX2hhbmRsZXIgKGludCBzaWcpOwojaWZkZWYgU0VUX1RaCnN0YXRpYyB2b2lkIHNldF90eiAodm9pZCk7CiNlbmRpZgpzdGF0aWMgdm9pZCB3cml0ZV93dG1wICh2b2lkKTsKc3RhdGljIHBpZF90IG15d2FpdCAoaW50ICpzdGF0dXMpOwpzdGF0aWMgaW50IHJ1bl9jb21tYW5kIChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpuYW1lLCBwaWRfdCBwaWQpOwoKCnN0YXRpYyB2b2lkIGVyciAoY2hhciAqcykKewoJaW50IGZkOwoJCglpZigoZmQgPSBvcGVuKCIvZGV2L2NvbnNvbGUiLCBPX1dST05MWSkpIDwgMCkgcmV0dXJuOwoKCXdyaXRlKGZkLCAiaW5pdDogIiwgNik7CQoJd3JpdGUoZmQsIHMsIHN0cmxlbihzKSk7CgljbG9zZShmZCk7Cn0KCnN0YXRpYyB2b2lkIGVudGVyX3NpbmdsZSAodm9pZCkKewogICAgcGlkX3QgcGlkOwogICAgaW50IGk7CgogICAgZXJyKF8oIkJvb3RpbmcgdG8gc2luZ2xlIHVzZXIgbW9kZS5cbiIpKTsKICAgIGlmKChwaWQgPSBmb3JrKCkpID09IDApIHsKCS8qIHRoZSBjaGlsZCAqLwoJZXhlY2woX1BBVEhfQlNIRUxMLCBfUEFUSF9CU0hFTEwsIE5VTEwpOwoJZXJyKF8oImV4ZWMgb2Ygc2luZ2xlIHVzZXIgc2hlbGwgZmFpbGVkXG4iKSk7CiAgICB9IGVsc2UgaWYocGlkID4gMCkgewoJd2hpbGUgKHdhaXRwaWQgKHBpZCwgJmksIDApICE9IHBpZCkgIC8qICBOb3RoaW5nICAqLzsKICAgIH0gZWxzZSBpZihwaWQgPCAwKSB7CgllcnIoXygiZm9yayBvZiBzaW5nbGUgdXNlciBzaGVsbCBmYWlsZWRcbiIpKTsKICAgIH0KICAgIHVubGluayhfUEFUSF9TSU5HTEUpOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CglpbnQJCQl2ZWMsIGk7CglpbnQJCQl3YW50X3NpbmdsZSA9IDA7CglwaWRfdAkJCXBpZDsKCXN0cnVjdCBzaWdhY3Rpb24Jc2E7CgoKI2lmZGVmIFNFVF9UWgoJc2V0X3R6KCk7CiNlbmRpZgoJc2lnZmlsbHNldCAoJnNhLnNhX21hc2spOyAgLyogIGxvbmdqbXAgYW5kIG5lc3RlZCBzaWduYWxzIGRvbid0IG1peCAgKi8KCXNhLnNhX2ZsYWdzID0gU0FfT05FU0hPVDsKCXNhLnNhX2hhbmRsZXIgPSBzaWdpbnRfaGFuZGxlcjsKCXNpZ2FjdGlvbiAoU0lHSU5ULCAmc2EsIE5VTEwpOwoJc2Euc2FfZmxhZ3MgPSAwOwoJc2Euc2FfaGFuZGxlciA9IHNpZ3RzdHBfaGFuZGxlcjsKCXNpZ2FjdGlvbiAoU0lHVFNUUCwgJnNhLCBOVUxMKTsKCXNhLnNhX2hhbmRsZXIgPSBzaWd0ZXJtX2hhbmRsZXI7CglzaWdhY3Rpb24gKFNJR1RFUk0sICZzYSwgTlVMTCk7CglzYS5zYV9oYW5kbGVyID0gc2lnY2hpbGRfaGFuZGxlcjsKCXNpZ2FjdGlvbiAoU0lHQ0hMRCwgJnNhLCBOVUxMKTsKCXNhLnNhX2hhbmRsZXIgPSBzaWdxdWl0X2hhbmRsZXI7CglzaWdhY3Rpb24gKFNJR1FVSVQsICZzYSwgTlVMTCk7CgoJc2V0bG9jYWxlKExDX0FMTCwgIiIpOwoJYmluZHRleHRkb21haW4oUEFDS0FHRSwgTE9DQUxFRElSKTsKCXRleHRkb21haW4oUEFDS0FHRSk7CgoJbXlfcmVib290IChMSU5VWF9SRUJPT1RfQ01EX0NBRF9PRkYpOwoJLyogIEZpbmQgc2NyaXB0IHRvIHJ1bi4gQ29tbWFuZC1saW5lIG92ZXJyaWRlcyBjb25maWcgZmlsZSBvdmVycmlkZXMKCSAgICBidWlsdC1pbiBkZWZhdWx0ICAqLwoJZm9yIChpID0gMDsgaSA8IE5VTUNNRDsgaSsrKSBpbml0dGFiW2ldLnBpZCA9IC0xOwoJcmVhZF9pbml0dGFiICgpOwoJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgewoJCWlmIChzdHJjbXAgKGFyZ3ZbaV0sICJzaW5nbGUiKSA9PSAwKQoJCQl3YW50X3NpbmdsZSA9IDE7CgkJZWxzZSBpZiAoc3RyY21wIChhcmd2W2ldLCAiLW5vcmVib290IikgPT0gMCkKCQkJbm9fcmVib290ID0gMTsKCQllbHNlIGlmIChzdHJsZW4oc2NyaXB0X3ByZWZpeCkgKyBzdHJsZW4oYXJndltpXSkgPCBQQVRIX1NJWkUpIHsKCQkJY2hhciBwYXRoW1BBVEhfU0laRV07CgoJCQlzdHJjcHkgKHBhdGgsIHNjcmlwdF9wcmVmaXgpOwoJCQlzdHJjYXQgKHBhdGgsIGFyZ3ZbaV0pOwoJCQlpZiAoYWNjZXNzIChwYXRoLCBSX09LIHwgWF9PSykgPT0gMCkKCQkJCXN0cmNweSAoYm9vdF9wcm9nLCBwYXRoKTsKCQl9Cgl9CglpZiAoaW5pdF9wYXRoWzBdID09ICdcMCcpCgl7CgkgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKCgkgICAgaWYgKCAoc3RhdCAoYm9vdF9wcm9nLCAmc3RhdGJ1ZikgPT0gMCkgJiYgU19JU0RJUiAoc3RhdGJ1Zi5zdF9tb2RlKSApCgkgICAgewoJCXN0cmNweSAoaW5pdF9wYXRoLCBib290X3Byb2cpOwoJCWkgPSBzdHJsZW4gKGluaXRfcGF0aCk7CgkJaWYgKGluaXRfcGF0aFtpIC0gMV0gPT0gJy8nKSBpbml0X3BhdGhbaSAtIDFdID0gJ1wwJzsKCSAgICB9Cgl9CgoJaWYgKCAoIGluaXRjdGxfZmQgPSBvcGVuIChpbml0Y3RsX25hbWUsIE9fUkRXUiwgMCkgKSA8IDAgKSB7CgkJbWtmaWZvIChpbml0Y3RsX25hbWUsIFNfSVJVU1IgfCBTX0lXVVNSKTsKCQlpZiAoICggaW5pdGN0bF9mZCA9IG9wZW4gKGluaXRjdGxfbmFtZSwgT19SRFdSLCAwKSApIDwgMCApCgkJCWVyciAoIF8oImVycm9yIG9wZW5pbmcgZmlmb1xuIikgKTsKCX0KCglpZiAoaW5pdGN0bF9mZCA+PSAwICYmIGZjbnRsKGluaXRjdGxfZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpICE9IDApIHsKCQllcnIgKCBfKCJlcnJvciBzZXR0aW5nIGNsb3NlLW9uLWV4ZWMgb24gL2Rldi9pbml0Y3RsIikgKTsKCgkJLyogQ2FuIHRoZSBmY250bCBldmVyIGZhaWw/ICBJZiBpdCBkb2VzLCBhbmQgd2UgbGVhdmUKCQkgICB0aGUgZGVzY3JpcHRvciBvcGVuIGluIGNoaWxkIHByb2Nlc3NlcywgdGhlbiBhbnkKCQkgICBwcm9jZXNzIG9uIHRoZSBzeXN0ZW0gd2lsbCBiZSBhYmxlIHRvIHdyaXRlIHRvCgkJICAgL2Rldi9pbml0Y3RsIGFuZCBoYXZlIHVzIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvbW1hbmRzCgkJICAgYXMgcm9vdC4gU28gbGV0J3MgcmVmdXNlIHRvIHVzZSB0aGUgZmlmbyBpbiB0aGlzIGNhc2UuICovCgoJCWNsb3NlKGluaXRjdGxfZmQpOwoJCWluaXRjdGxfZmQgPSAtMTsKCX0KCglpZiAoIHdhbnRfc2luZ2xlIHx8IChhY2Nlc3MgKF9QQVRIX1NJTkdMRSwgUl9PSykgPT0gMCkgKSBkb19zaW5nbGUgKCk7CgoJLypJZiB3ZSBnZXQgYSBTSUdUU1RQIGJlZm9yZSBtdWx0aS11c2VyIG1vZGUsIGRvIG5vdGhpbmcqLwoJd2hpbGUgKHN0b3BwZWQpCgkJcGF1c2UoKTsKCglpZiAoIGRvX3JjX3R0eSAoYm9vdF9wcm9nKSApIGRvX3NpbmdsZSAoKTsKCgl3aGlsZSAoc3RvcHBlZCkgIC8qICBBbHNvIGlmIC9ldGMvcmMgZmFpbHMgJiB3ZSBnZXQgU0lHVFNUUCAgKi8KCQlwYXVzZSgpOwoKCXdyaXRlX3d0bXAoKTsJLyogd3JpdGUgYm9vdHRpbWUgcmVjb3JkICovCiNpZmRlZiBERUJVR0dJTkcKCWZvcihpID0gMDsgaSA8IG51bWNtZDsgaSsrKSB7CgkJY2hhciAqKnA7CgkJcCA9IGluaXR0YWJbaV0udG9rczsKCQlwcmludGYoInRva3M9ICVzICVzICVzICVzXG4iLHBbMF0sIHBbMV0sIHBbMl0sIHBbM10pOwoJCXByaW50ZigidHR5PSAlc1xuIiwgaW5pdHRhYltpXS50dHkpOwoJCXByaW50ZigidGVybWNhcD0gJXNcbiIsIGluaXR0YWJbaV0udGVybWNhcCk7Cgl9CglleGl0KDApOwojZW5kaWYKCXNpZ25hbCAoU0lHSFVQLCBzaWdodXBfaGFuZGxlcik7ICAvKiBCZXR0ZXIgc2VtYW50aWNzIHdpdGggc2lnbmFsKDIpICovCgoJZm9yIChpID0gMDsgaSA8IGdldGR0YWJsZXNpemUgKCk7IGkrKykKCQlpZiAoaSAhPSBpbml0Y3RsX2ZkKSBjbG9zZSAoaSk7CgoJZm9yKGkgPSAwOyBpIDwgbnVtY21kOyBpKyspCgkJc3Bhd24oaSk7CgoJaWYgKGZpbmFsX3Byb2dbMF0gIT0gJ1wwJykgewoJCXN3aXRjaCAoIGZvcmsgKCkgKQoJCXsKCQkgIGNhc2UgMDogICAvKiAgQ2hpbGQgICAqLwoJCSAgICBleGVjbCAoZmluYWxfcHJvZywgZmluYWxfcHJvZywgInN0YXJ0IiwgTlVMTCk7CgkJICAgIGVyciAoIF8oImVycm9yIHJ1bm5pbmcgZmluYWxwcm9nXG4iKSApOwoJCSAgICBfZXhpdCAoMSk7CgkJICAgIGJyZWFrOwoJCSAgY2FzZSAtMTogIC8qICBFcnJvciAgICovCgkJICAgIGVyciAoIF8oImVycm9yIGZvcmtpbmcgZmluYWxwcm9nXG4iKSApOwoJCSAgICBicmVhazsKCQkgIGRlZmF1bHQ6ICAvKiAgUGFyZW50ICAqLwoJCSAgICBicmVhazsKCQl9Cgl9CgoJZm9yIGV2ZXIgewoJCXBpZCA9IG15d2FpdCAoJnZlYyk7CgkJaWYgKHBpZCA8IDEpIGNvbnRpbnVlOwoKCQkvKiBjbGVhciB1dG1wIGVudHJ5LCBhbmQgYXBwZW5kIHRvIHd0bXAgaWYgcG9zc2libGUgKi8KCQl7CgkJICAgIHN0cnVjdCB1dG1wICp1dDsKCQkgICAgaW50IHV0X2ZkLCBsZjsKCgkJICAgIHV0bXBuYW1lKF9QQVRIX1VUTVApOwoJCSAgICBzZXR1dGVudCgpOwoJCSAgICB3aGlsZSgodXQgPSBnZXR1dGVudCgpKSkgewoJCQlpZih1dC0+dXRfcGlkID09IHBpZCkgewoJCQkgICAgdGltZSgmdXQtPnV0X3RpbWUpOwoJCQkgICAgbWVtc2V0KCZ1dC0+dXRfdXNlciwgMCwgVVRfTkFNRVNJWkUpOwoJCQkgICAgbWVtc2V0KCZ1dC0+dXRfaG9zdCwgMCwgc2l6ZW9mKHV0LT51dF9ob3N0KSk7CgkJCSAgICB1dC0+dXRfdHlwZSA9IERFQURfUFJPQ0VTUzsKCQkJICAgIHV0LT51dF9waWQgPSAwOwoJCQkgICAgdXQtPnV0X2FkZHIgPSAwOwoJCQkgICAgLyplbmR1dGVudCgpOyovCgkJCSAgICBwdXR1dGxpbmUodXQpOwoKCQkJICAgIGlmICgobGYgPSBvcGVuKF9QQVRIX1dUTVBMT0NLLCBPX0NSRUFUfE9fV1JPTkxZLCAwNjYwKSkgPj0gMCkgewoJCQkJZmxvY2sobGYsIExPQ0tfRVh8TE9DS19OQik7CgkJCQlpZigodXRfZmQgPSBvcGVuKF9QQVRIX1dUTVAsIE9fQVBQRU5EfE9fV1JPTkxZKSkgPj0gMCkgewoJCQkJICAgIHdyaXRlKHV0X2ZkLCB1dCwgc2l6ZW9mKHN0cnVjdCB1dG1wKSk7CgkJCQkgICAgY2xvc2UodXRfZmQpOwoJCQkJfQoJCQkJZmxvY2sobGYsIExPQ0tfVU58TE9DS19OQik7CgkJCQljbG9zZShsZik7CgkJCSAgICB9CgkJCSAgICBicmVhazsKCQkJfQoJCSAgICB9CgkJICAgIGVuZHV0ZW50KCk7CgkJfQoKCQlmb3IoaSA9IDA7IGkgPCBudW1jbWQ7IGkrKykgewoJCQlpZihwaWQgPT0gaW5pdHRhYltpXS5waWQgfHwgaW5pdHRhYltpXS5waWQgPCAwKSB7CgkJCQlpZiAoc3RvcHBlZCkKCQkJCQlpbml0dGFiW2ldLnBpZCA9IC0xOwoJCQkJZWxzZQoJCQkJCXNwYXduKGkpOwoJCQkJaWYgKHBpZCA9PSBpbml0dGFiW2ldLnBpZCkKCQkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQkKCiNkZWZpbmUgTUFYVFJJRVMgMyAvKiBudW1iZXIgb2YgdHJpZXMgYWxsb3dlZCB3aGVuIGdpdmluZyB0aGUgcGFzc3dvcmQgKi8KCi8qCiAqIHJldHVybiB0cnVlIGlmIHNpbmdsZXVzZXIgbW9kZSBpcyBhbGxvd2VkLgogKiBJZiAvZXRjL3NlY3VyZXNpbmdsZSBleGlzdHMgYXNrIGZvciByb290IHBhc3N3b3JkLCBvdGhlcndpc2UgYWx3YXlzIE9LLgogKi8Kc3RhdGljIGludCBjaGVja19zaW5nbGVfb2sgKHZvaWQpCnsKICAgIGNoYXIgKnBhc3MsICpyb290cGFzcyA9IE5VTEw7CiAgICBzdHJ1Y3QgcGFzc3dkICpwd2Q7CiAgICBpbnQgaTsKCiAgICBpZiAoYWNjZXNzIChfUEFUSF9TRUNVUkUsIFJfT0spICE9IDApIHJldHVybiAxOwogICAgaWYgKCAoIHB3ZCA9IGdldHB3bmFtICgicm9vdCIpICkgfHwgKCBwd2QgPSBnZXRwd3VpZCAoMCkgKSApCglyb290cGFzcyA9IHB3ZC0+cHdfcGFzc3dkOwogICAgZWxzZQoJcmV0dXJuIDE7IC8qIGEgYmFkIC9ldGMvcGFzc3dkIHNob3VsZCBub3QgbG9jayBvdXQgKi8KCiAgICBmb3IgKGkgPSAwOyBpIDwgTUFYVFJJRVM7IGkrKykKICAgIHsKCXBhc3MgPSBnZXRwYXNzIChfKCJQYXNzd29yZDogIikpOwoJaWYgKHBhc3MgPT0gTlVMTCkgY29udGludWU7CgoJaWYgKCAhc3RyY21wIChjcnlwdCAocGFzcywgcm9vdHBhc3MpLCByb290cGFzcykgKSByZXR1cm4gMTsKCglwdXRzIChfKCJcbldyb25nIHBhc3N3b3JkLlxuIikpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIGRvX3NpbmdsZSAodm9pZCkKewogICAgY2hhciBwYXRoW1BBVEhfU0laRV07CgogICAgaWYgKGNhdWdodF9zaWdpbnQpIHJldHVybjsKICAgIHN0cmNweSAocGF0aCwgc2NyaXB0X3ByZWZpeCk7CiAgICBzdHJjYXQgKHBhdGgsICJzaW5nbGUiKTsKICAgIGlmIChhY2Nlc3MgKHBhdGgsIFJfT0sgfCBYX09LKSA9PSAwKQoJaWYgKGRvX3JjX3R0eSAocGF0aCkgPT0gMCkgcmV0dXJuOwogICAgaWYgKCBjaGVja19zaW5nbGVfb2sgKCkgKSBlbnRlcl9zaW5nbGUgKCk7Cn0gICAvKiAgRW5kIEZ1bmN0aW9uIGRvX3NpbmdsZSAgKi8KCi8qCiAqIHJ1biBib290IHNjcmlwdChzKS4gVGhlIGVudmlyb25tZW50IGlzIHBhc3NlZCB0byB0aGUgc2NyaXB0KHMpLCBzbyB0aGUgUkMKICogZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHVzZWQgdG8gZGVjaWRlIHdoYXQgdG8gZG8uCiAqIFJDIG1heSBiZSBzZXQgZnJvbSBMSUxPLgogKiBbUkVUVVJOU10gMCBvbiBzdWNjZXNzIChleGl0IHN0YXR1cyBjb252ZW50aW9uKSwgb3RoZXJ3aXNlIGVycm9yLgogKi8Kc3RhdGljIGludCBkb19yY190dHkgKGNvbnN0IGNoYXIgKnBhdGgpCnsKICAgIGludCBzdGF0dXM7CiAgICBwaWRfdCBwaWQ7CiAgICBzaWdzZXRfdCBzczsKCiAgICBpZiAoY2F1Z2h0X3NpZ2ludCkgcmV0dXJuIDA7CiAgICBwcm9jZXNzX3BhdGggKHBhdGgsIHByZWxvYWRfZmlsZSwgMCk7CiAgICAvKiAgTGF1bmNoIG9mZiBhIHN1YnByb2Nlc3MgdG8gc3RhcnQgYSBuZXcgc2Vzc2lvbiAocmVxdWlyZWQgZm9yIGZyb2JiaW5nCgl0aGUgVFRZKSBhbmQgY2FwdHVyZSBjb250cm9sLUMgICovCiAgICBzd2l0Y2ggKCByY19jaGlsZCA9IGZvcmsgKCkgKQogICAgewogICAgICBjYXNlIDA6ICAgLyogIENoaWxkICAqLwoJZm9yIChzdGF0dXMgPSAxOyBzdGF0dXMgPCBOU0lHOyBzdGF0dXMrKykgc2lnbmFsIChzdGF0dXMsIFNJR19ERkwpOwoJc2lnZmlsbHNldCAoJnNzKTsKCXNpZ3Byb2NtYXNrIChTSUdfVU5CTE9DSywgJnNzLCBOVUxMKTsKCXNpZ2RlbHNldCAoJnNzLCBTSUdJTlQpOwoJc2lnZGVsc2V0ICgmc3MsIFNJR1FVSVQpOwoJc2V0c2lkICgpOwoJaW9jdGwgKDAsIFRJT0NTQ1RUWSwgMCk7ICAvKiAgSSB3YW50IG15IGNvbnRyb2wtQyAgKi8KCXNpZ3N1c3BlbmQgKCZzcyk7ICAvKiAgU2hvdWxkIG5ldmVyIHJldHVybiwgc2hvdWxkIGp1c3QgYmUga2lsbGVkICAqLwoJYnJlYWs7ICAgICAgICAgICAgIC8qICBOby1vbmUgZWxzZSBpcyBjb250cm9sbGVkIGJ5IHRoaXMgVFRZIG5vdyAgICovCiAgICAgIGNhc2UgLTE6ICAvKiAgRXJyb3IgICovCglyZXR1cm4gKDEpOwoJLypicmVhazsqLwogICAgICBkZWZhdWx0OiAgLyogIFBhcmVudCAgKi8KCWJyZWFrOwogICAgfQogICAgLyogIFBhcmVudCAgKi8KICAgIHByb2Nlc3NfcGF0aCAocGF0aCwgcnVuX2ZpbGUsIDApOwogICAgd2hpbGUgKDEpCiAgICB7CglpZiAoICggcGlkID0gbXl3YWl0ICgmc3RhdHVzKSApID09IHJjX2NoaWxkICkKCSAgICByZXR1cm4gKFdURVJNU0lHIChzdGF0dXMpID09IFNJR0lOVCkgPyAwIDogMTsKCWlmIChwaWQgPCAwKSBicmVhazsKICAgIH0KICAgIGtpbGwgKHJjX2NoaWxkLCBTSUdLSUxMKTsKICAgIHdoaWxlICh3YWl0cGlkIChyY19jaGlsZCwgTlVMTCwgMCkgIT0gcmNfY2hpbGQpICAvKiAgTm90aGluZyAgKi87CiAgICByZXR1cm4gMDsKfSAgIC8qICBFbmQgRnVuY3Rpb24gZG9fcmNfdHR5ICAqLwoKc3RhdGljIGludCBwcm9jZXNzX3BhdGggKGNvbnN0IGNoYXIgKnBhdGgsIGludCAoKmZ1bmMpIChjb25zdCBjaGFyICpwYXRoKSwKCQkJIGludCBpZ25vcmVfZGFuZ2xpbmdfc3ltbGluaykKewogICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKICAgIERJUiAqZHA7CiAgICBzdHJ1Y3QgZGlyZW50ICpkZTsKCiAgICBpZiAobHN0YXQgKHBhdGgsICZzdGF0YnVmKSAhPSAwKQogICAgewoJZXJyIChfKCJsc3RhdCBvZiBwYXRoIGZhaWxlZFxuIikgKTsKCXJldHVybiAxOwogICAgfQogICAgaWYgKCBTX0lTTE5LIChzdGF0YnVmLnN0X21vZGUpICkKICAgIHsKCWlmIChzdGF0IChwYXRoLCAmc3RhdGJ1ZikgIT0gMCkKCXsKCSAgICBpZiAoIChlcnJubyA9PSBFTk9FTlQpICYmIGlnbm9yZV9kYW5nbGluZ19zeW1saW5rICkgcmV0dXJuIDA7CgkgICAgZXJyIChfKCJzdGF0IG9mIHBhdGggZmFpbGVkXG4iKSApOwoJICAgIHJldHVybiAxOwoJfQogICAgfQogICAgaWYgKCAhKCBzdGF0YnVmLnN0X21vZGUgJiAoU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RIKSApICkgcmV0dXJuIDA7CiAgICBpZiAoICFTX0lTRElSIChzdGF0YnVmLnN0X21vZGUpICkgcmV0dXJuICgqZnVuYykgKHBhdGgpOwogICAgaWYgKCAoIGRwID0gb3BlbmRpciAocGF0aCkgKSA9PSBOVUxMICkKICAgIHsKCWVyciAoXygib3BlbiBvZiBkaXJlY3RvcnkgZmFpbGVkXG4iKSApOwoJcmV0dXJuIDE7CiAgICB9CiAgICB3aGlsZSAoICggZGUgPSByZWFkZGlyIChkcCkgKSAhPSBOVUxMICkKICAgIHsKCWludCByZXR2YWw7CgljaGFyIG5ld3BhdGhbUEFUSF9TSVpFXTsKCglpZiAoZGUtPmRfbmFtZVswXSA9PSAnLicpIGNvbnRpbnVlOwoJcmV0dmFsID0gc25wcmludGYgKG5ld3BhdGgsIHNpemVvZihuZXdwYXRoKSwgIiVzLyVzIiwgcGF0aCwgZGUtPmRfbmFtZSk7CglpZiAobmV3cGF0aFtyZXR2YWwgLSAxXSA9PSAnficpIGNvbnRpbnVlOyAgLyogIENvbW1vbiBtaXN0YWtlICAqLwoJaWYgKCAoIHJldHZhbCA9IHByb2Nlc3NfcGF0aCAobmV3cGF0aCwgZnVuYywgMSkgKSApIHJldHVybiByZXR2YWw7CiAgICB9CiAgICBjbG9zZWRpciAoZHApOwogICAgcmV0dXJuIDA7Cn0gICAvKiAgRW5kIEZ1bmN0aW9uIHByb2Nlc3NfcGF0aCAgKi8KCnN0YXRpYyBpbnQgcHJlbG9hZF9maWxlIChjb25zdCBjaGFyICpwYXRoKQp7CiAgICBpbnQgZmQ7CiAgICBjaGFyIGNoOwoKICAgIGlmICggKCBmZCA9IG9wZW4gKHBhdGgsIE9fUkRPTkxZLCAwKSApIDwgMCkgcmV0dXJuIDA7CiAgICB3aGlsZSAocmVhZCAoZmQsICZjaCwgMSkgPT0gMSkgbHNlZWsgKGZkLCAxMDI0LCBTRUVLX0NVUik7CiAgICBjbG9zZSAoZmQpOwogICAgcmV0dXJuIDA7Cn0gICAvKiAgRW5kIEZ1bmN0aW9uIHByZWxvYWRfZmlsZSAgKi8KCnN0YXRpYyBpbnQgcnVuX2ZpbGUgKGNvbnN0IGNoYXIgKnBhdGgpCnsKICAgIGNvbnN0IGNoYXIgKnB0cjsKCiAgICBpZiAoICggcHRyID0gc3RycmNociAoIChjaGFyICopIHBhdGgsICcvJyApICkgPT0gTlVMTCApIHB0ciA9IHBhdGg7CiAgICBlbHNlICsrcHRyOwogICAgcmV0dXJuIChydW5fY29tbWFuZCAocGF0aCwgcHRyLCAwKSA9PSBTSUdfRkFJTEVEKSA/IDEgOiAwOwp9ICAgLyogIEVuZCBGdW5jdGlvbiBydW5fZmlsZSAgKi8KCnN0YXRpYyB2b2lkIHNwYXduIChpbnQgaSkKewoJcGlkX3QgcGlkOwoJaW50IGo7CglzaWduZWQgbG9uZyBkc190YWtlbjsKCXN0cnVjdCB0aW1ldmFsIGN0OwoKCWlmIChpbml0dGFiW2ldLnRva3NbMF0gPT0gTlVMTCkgcmV0dXJuOwoKCS8qICBDaGVjayBpZiByZXNwYXduaW5nIHRvbyBmYXN0ICAqLwoJZ2V0dGltZW9mZGF5ICgmY3QsIE5VTEwpOwoJZHNfdGFrZW4gPSBjdC50dl9zZWMgLSBpbml0dGFiW2ldLmxhc3Rfc3RhcnQudHZfc2VjOwoKCS8qIE9uIHRoZSBmaXJzdCBpdGVyYXRpb24gbGFzdF9zdGFydD09MCBhbmQgZHNfdGFrZW4KCSAgIG1heSBiZSB2ZXJ5IGxhcmdlLiBBdm9pZCBvdmVyZmxvdy4gLS0gRGVuaXMgVmxhc2Vua28gKi8KCWlmIChkc190YWtlbiA+IDEwMDAwKQoJCWRzX3Rha2VuID0gMTAwMDA7CgoJZHNfdGFrZW4gKj0gMTA7Cglkc190YWtlbiArPSAoY3QudHZfdXNlYyAtIGluaXR0YWJbaV0ubGFzdF9zdGFydC50dl91c2VjKSAvIDEwMDAwMDsKCWlmIChkc190YWtlbiA8IDEpCgkJZHNfdGFrZW4gPSAxOwoJaW5pdHRhYltpXS5yYXRlID0gKDkgKiBpbml0dGFiW2ldLnJhdGUgKyAxMDAwIC8gZHNfdGFrZW4pIC8gMTA7CglpZiAoaW5pdHRhYltpXS5yYXRlID4gTUFYX1JFU1BBV05fUkFURSkgewoJCWNoYXIgdHh0WzI1Nl07CgoJCWluaXR0YWJbaV0udG9rc1swXSA9IE5VTEw7CgkJaW5pdHRhYltpXS5waWQgPSAtMTsKCQlpbml0dGFiW2ldLnJhdGUgPSAwOwoJCXNucHJpbnRmICh0eHQsIHNpemVvZih0eHQpLAoJCQlfKCJyZXNwYXduaW5nOiBcIiVzXCIgdG9vIGZhc3Q6IHF1ZW5jaGluZyBlbnRyeVxuIiksCgkJCSBpbml0dGFiW2ldLnR0eSk7CgkJZXJyICh0eHQpOwoJCXJldHVybjsKCX0KCglpZigocGlkID0gZm9yaygpKSA8IDApIHsKCQlpbml0dGFiW2ldLnBpZCA9IC0xOwoJCWVycihfKCJmb3JrIGZhaWxlZFxuIikpOwoJCXJldHVybjsKCX0KCWlmKHBpZCkgewoJCS8qIHRoaXMgaXMgdGhlIHBhcmVudCAqLwoJCWluaXR0YWJbaV0ucGlkID0gcGlkOwoJCWluaXR0YWJbaV0ubGFzdF9zdGFydCA9IGN0OwoJCXNjaGVkX3lpZWxkICgpOwoJCXJldHVybjsKCX0gZWxzZSB7CgkJLyogdGhpcyBpcyB0aGUgY2hpbGQgKi8KCQljaGFyIHRlcm1bNDBdOwojaWZkZWYgU0VUX1RaCgkJY2hhciB0eltDTURTSVpdOwojZW5kaWYKCQljaGFyICplbnZbM107CgkJCgkJc2V0c2lkKCk7CgkJZm9yKGogPSAwOyBqIDwgZ2V0ZHRhYmxlc2l6ZSgpOyBqKyspCgkJCSh2b2lkKSBjbG9zZShqKTsKCgkJc25wcmludGYodGVybSwgc2l6ZW9mKHRlcm0pLCAiVEVSTT0lcyIsIGluaXR0YWJbaV0udGVybWNhcCk7CgkJZW52WzBdID0gdGVybTsKCQllbnZbMV0gPSAoY2hhciAqKTA7CiNpZmRlZiBTRVRfVFoKCQlzbnByaW50Zih0eiwgc2l6ZW9mKHR6KSwgIlRaPSVzIiwgdHpvbmUpOwoJCWVudlsxXSA9IHR6OwojZW5kaWYKCQllbnZbMl0gPSAoY2hhciAqKTA7CgoJCWV4ZWN2ZShpbml0dGFiW2ldLnRva3NbMF0sIGluaXR0YWJbaV0udG9rcywgZW52KTsKCQllcnIoXygiZXhlYyBmYWlsZWRcbiIpKTsKCQlzbGVlcCg1KTsKCQlfZXhpdCgxKTsKCX0KfQoKc3RhdGljIHZvaWQgcmVhZF9pbml0dGFiICh2b2lkKQp7CglGSUxFICpmOwoJY2hhciBidWZbQ01EU0laXTsKCWludCBpLGosazsKCWludCBoYXNfcHJvZyA9IDA7CgljaGFyICpwdHIsICpnZXR0eTsKCWNoYXIgcHJvZ1tQQVRIX1NJWkVdOwojaWZkZWYgU1BFQ0lBTF9DT05TT0xFX1RFUk0KCWNoYXIgdHR5WzUwXTsKCXN0cnVjdCBzdGF0IHN0YjsKI2VuZGlmCgljaGFyICp0ZXJtZW52OwoJCgl0ZXJtZW52ID0gZ2V0ZW52KCJURVJNIik7CS8qIHNldCBieSBrZXJuZWwgKi8KCS8qIHRlcm1lbnYgPSAidnQxMDAiOyAqLwoJCQkKCWlmKCEoZiA9IGZvcGVuKF9QQVRIX0lOSVRUQUIsICJyIikpKSB7CgkJZXJyKF8oImNhbm5vdCBvcGVuIGluaXR0YWJcbiIpKTsKCQlyZXR1cm47Cgl9CgoJcHJvZ1swXSA9ICdcMCc7CglpID0gMDsKCXdoaWxlKCFmZW9mKGYpICYmIGkgPCBOVU1DTUQgLSAyKSB7CgkJaWYoZmdldHMoYnVmLCBDTURTSVogLSAxLCBmKSA9PSAwKSBicmVhazsKCQlidWZbQ01EU0laLTFdID0gMDsKCgkJZm9yKGsgPSAwOyBrIDwgQ01EU0laICYmIGJ1ZltrXTsgaysrKSB7CgkJCWlmICgoYnVmW2tdID09ICcjJykgfHwgKGJ1ZltrXSA9PSAnXG4nKSkgeyAKCQkJCWJ1ZltrXSA9IDA7IGJyZWFrOyAKCQkJfQoJCX0KCgkJaWYoYnVmWzBdID09IDAgfHwgYnVmWzBdID09ICdcbicpIGNvbnRpbnVlOwoJCXB0ciA9IHN0cmNociAoYnVmLCAnPScpOwoJCWlmIChwdHIpIHsKCQkJcHRyKys7CgkJCWlmICggIXN0cm5jbXAgKGJ1ZiwgImJvb3Rwcm9nIiwgOCkgKSB7CgkJCQl3aGlsZSAoIGlzc3BhY2UgKCpwdHIpICkgKytwdHI7CgkJCQlzdHJjcHkgKHByb2csIHB0cik7CgkJCQloYXNfcHJvZyA9IDE7CgkJCQljb250aW51ZTsKCQkJfQoJCQlpZiAoICFzdHJuY21wIChidWYsICJmaWxlcHJlZml4IiwgMTApICkgewoJCQkJd2hpbGUgKCBpc3NwYWNlICgqcHRyKSApICsrcHRyOwoJCQkJc3RyY3B5IChzY3JpcHRfcHJlZml4LCBwdHIpOwoJCQkJY29udGludWU7CgkJCX0KCQkJaWYgKCAhc3RybmNtcCAoYnVmLCAiUEFUSCIsIDQpICkgewoJCQkJd2hpbGUgKCBpc3NwYWNlICgqcHRyKSApICsrcHRyOwoJCQkJc2V0ZW52ICgiUEFUSCIsIHB0ciwgMSk7CgkJCQljb250aW51ZTsKCQkJfQoJCQlpZiAoICFzdHJuY21wIChidWYsICJJTklUX1BBVEgiLCA5KSApIHsKCQkJCXdoaWxlICggaXNzcGFjZSAoKnB0cikgKSArK3B0cjsKCQkJCXN0cmNweSAoaW5pdF9wYXRoLCBwdHIpOwoJCQkJY29udGludWU7CgkJCX0KCQkJaWYgKCAhc3RybmNtcCAoYnVmLCAiZmluYWxwcm9nIiwgOCkgKSB7CgkJCQl3aGlsZSAoIGlzc3BhY2UgKCpwdHIpICkgKytwdHI7CgkJCQlzdHJjcHkgKGZpbmFsX3Byb2csIHB0cik7CgkJCQljb250aW51ZTsKCQkJfQoJCX0KCQkJCgoJCSh2b2lkKSBzdHJjcHkoaW5pdHRhYltpXS5saW5lLCBidWYpOwoKCQkodm9pZCkgc3RydG9rKGluaXR0YWJbaV0ubGluZSwgIjoiKTsKCQl4c3RybmNweShpbml0dGFiW2ldLnR0eSwgaW5pdHRhYltpXS5saW5lLCAxMCk7CgkJeHN0cm5jcHkoaW5pdHRhYltpXS50ZXJtY2FwLCBzdHJ0b2soKGNoYXIgKikwLCAiOiIpLCAzMCk7CgoJCWdldHR5ID0gc3RydG9rKChjaGFyICopMCwgIjoiKTsKCQkodm9pZCkgc3RydG9rKGdldHR5LCAiIFx0XG4iKTsKCQlpbml0dGFiW2ldLnRva3NbMF0gPSBnZXR0eTsKCQlqID0gMTsKCQl3aGlsZSgocHRyID0gc3RydG9rKChjaGFyICopMCwgIiBcdFxuIikpKQoJCQlpbml0dGFiW2ldLnRva3NbaisrXSA9IHB0cjsKCQlpbml0dGFiW2ldLnRva3Nbal0gPSAoY2hhciAqKTA7CgojaWZkZWYgU1BFQ0lBTF9DT05TT0xFX1RFUk0KCQkvKiBzcGVjaWFsLWNhc2UgdGVybWNhcCBmb3IgdGhlIGNvbnNvbGUgdHR5cyAqLwoJCXNucHJpbnRmKHR0eSwgc2l6ZW9mKHR0eSksICIvZGV2LyVzIiwgaW5pdHRhYltpXS50dHkpOwoJCWlmKCF0ZXJtZW52IHx8IHN0YXQodHR5LCAmc3RiKSA8IDApIHsKCQkJZXJyKF8oIm5vIFRFUk0gb3IgY2Fubm90IHN0YXQgdHR5XG4iKSk7CgkJfSBlbHNlIHsKCQkJLyogaXMgaXQgYSBjb25zb2xlIHR0eT8gKi8KCQkJaWYobWFqb3Ioc3RiLnN0X3JkZXYpID09IDQgJiYgbWlub3Ioc3RiLnN0X3JkZXYpIDwgNjQpCgkJCQl4c3RybmNweShpbml0dGFiW2ldLnRlcm1jYXAsIHRlcm1lbnYsIDMwKTsKCQl9CiNlbmRpZgoKCQlpKys7Cgl9CglmY2xvc2UoZik7CgludW1jbWQgPSBpOwoJaWYgKGhhc19wcm9nKSB7CgkJaW50IGxlbjsKCQljaGFyIHBhdGhbUEFUSF9TSVpFXTsKCgkJc3RyY3B5IChwYXRoLCBzY3JpcHRfcHJlZml4KTsKCQlzdHJjYXQgKHBhdGgsIHByb2cpOwoJCWxlbiA9IHN0cmxlbiAocGF0aCk7CgkJaWYgKHBhdGhbbGVuIC0gMV0gPT0gJy8nKSBwYXRoW2xlbiAtIDFdID0gJ1wwJzsKCQlpZiAoYWNjZXNzIChwYXRoLCBSX09LIHwgWF9PSykgPT0gMCkKCQkJc3RyY3B5IChib290X3Byb2csIHBhdGgpOwoJfQp9ICAgLyogIEVuZCBGdW5jdGlvbiByZWFkX2luaXR0YWIgICovCgpzdGF0aWMgdm9pZCBzaWdodXBfaGFuZGxlciAoaW50IHNpZykKewoJaW50IGksajsKCWludCBvbGRudW07CglzdHJ1Y3QgaW5pdGxpbmUJc2F2ZXRhYltOVU1DTURdOwoJaW50IGhhZF9hbHJlYWR5OwoKCXNpZ25hbCAoU0lHSFVQLCBTSUdfSUdOKTsKCW1lbWNweShzYXZldGFiLCBpbml0dGFiLCBOVU1DTUQgKiBzaXplb2Yoc3RydWN0IGluaXRsaW5lKSk7CglvbGRudW0gPSBudW1jbWQ7CQkKCXJlYWRfaW5pdHRhYiAoKTsKCQoJZm9yKGkgPSAwOyBpIDwgbnVtY21kOyBpKyspIHsKCQloYWRfYWxyZWFkeSA9IDA7CgkJZm9yKGogPSAwOyBqIDwgb2xkbnVtOyBqKyspIHsKCQkJaWYoIXN0cmNtcChzYXZldGFiW2pdLnR0eSwgaW5pdHRhYltpXS50dHkpKSB7CgkJCQloYWRfYWxyZWFkeSA9IDE7CgkJCQlpZigoaW5pdHRhYltpXS5waWQgPSBzYXZldGFiW2pdLnBpZCkgPCAwKQoJCQkJCXNwYXduKGkpOwoJCQl9CgkJfQoJCWlmICghaGFkX2FscmVhZHkpIHNwYXduIChpKTsKCX0KCXNpZ25hbCAoU0lHSFVQLCBzaWdodXBfaGFuZGxlcik7Cn0gICAvKiAgRW5kIEZ1bmN0aW9uIHNpZ2h1cF9oYW5kbGVyICAqLwoKc3RhdGljIHZvaWQgc2lndHN0cF9oYW5kbGVyIChpbnQgc2lnKQp7CiAgICBzdG9wcGVkID0gfnN0b3BwZWQ7CiAgICBpZiAoIXN0b3BwZWQpIHNpZ2h1cF9oYW5kbGVyIChzaWcpOwp9ICAgLyogIEVuZCBGdW5jdGlvbiBzaWd0c3RwX2hhbmRsZXIgICovCgpzdGF0aWMgdm9pZCBzaWd0ZXJtX2hhbmRsZXIgKGludCBzaWcpCnsKICAgIGludCBpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBudW1jbWQ7IGkrKykKCWlmIChpbml0dGFiW2ldLnBpZCA+IDApIGtpbGwgKGluaXR0YWJbaV0ucGlkLCBTSUdURVJNKTsKfSAgIC8qICBFbmQgRnVuY3Rpb24gc2lndGVybV9oYW5kbGVyICAqLwoKc3RhdGljIHZvaWQgc2lnaW50X2hhbmRsZXIgKGludCBzaWcpCnsKICAgIHBpZF90IHBpZDsKCiAgICBjYXVnaHRfc2lnaW50ID0gMTsKICAgIGtpbGwgKHJjX2NoaWxkLCBTSUdLSUxMKTsKICAgIGlmIChub19yZWJvb3QpIF9leGl0ICgxKSAvKmtpbGwgKDAsIFNJR0tJTEwpKi87CiAgICBzeW5jICgpOwogICAgc3luYyAoKTsKICAgIHBpZCA9IGZvcmsgKCk7CiAgICBpZiAocGlkID4gMCkgcmV0dXJuOyAgLyogIFBhcmVudCAgICAgICAgICAgICAgICAgICAgICovCiAgICBpZiAocGlkID09IDApIAkgIC8qICBDaGlsZDogcmVib290IHByb3Blcmx5Li4uICAqLwoJZXhlY2wgKF9QQVRIX1JFQk9PVCwgX1BBVEhfUkVCT09ULCAoY2hhciAqKSAwKTsKCiAgICAvKiBmb3JrIG9yIGV4ZWMgZmFpbGVkLCB0cnkgdGhlIGhhcmQgd2F5Li4uICovCiAgICBteV9yZWJvb3QgKExJTlVYX1JFQk9PVF9DTURfUkVTVEFSVCk7Cn0gICAvKiAgRW5kIEZ1bmN0aW9uIHNpZ2ludF9oYW5kbGVyICAqLwoKc3RhdGljIHZvaWQgc2lnY2hpbGRfaGFuZGxlciAoaW50IHNpZykKewogICAgaWYgKCFkb19sb25nam1wKSByZXR1cm47CiAgICBzaWdsb25nam1wIChqbXBfZW52LCAxKTsKfQoKc3RhdGljIHZvaWQgc2lncXVpdF9oYW5kbGVyIChpbnQgc2lnKQp7CiAgICBleGVjbCAoX1BBVEhfUkVCT09ULCBfUEFUSF9SRUJPT1QsIE5VTEwpOyAvKiAgSXQga25vd3MgcGlkPTEgbXVzdCBzbGVlcCAgKi8KfQoKI2lmZGVmIFNFVF9UWgpzdGF0aWMgdm9pZCBzZXRfdHogKHZvaWQpCnsKCUZJTEUgKmY7CglpbnQgbGVuOwoKCWlmKChmPWZvcGVuKFRaRklMRSwgInIiKSkgPT0gKEZJTEUgKilOVUxMKSByZXR1cm47CglmZ2V0cyh0em9uZSwgQ01EU0laLTIsIGYpOwoJZmNsb3NlKGYpOwoJaWYoKGxlbj1zdHJsZW4odHpvbmUpKSA8IDIpIHJldHVybjsKCXR6b25lW2xlbi0xXSA9IDA7IC8qIGdldCByaWQgb2YgdGhlICdcbicgKi8KCXNldGVudigiVFoiLCB0em9uZSwgMCk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCB3cml0ZV93dG1wICh2b2lkKQp7CiAgICBpbnQgZmQsIGxmOwogICAgc3RydWN0IHV0bXAgdXQ7CiAgICAKICAgIG1lbXNldCgoY2hhciAqKSZ1dCwgMCwgc2l6ZW9mKHV0KSk7CiAgICBzdHJjcHkodXQudXRfbGluZSwgIn4iKTsKICAgIG1lbXNldCh1dC51dF9uYW1lLCAwLCBzaXplb2YodXQudXRfbmFtZSkpOwogICAgdGltZSgmdXQudXRfdGltZSk7CiAgICB1dC51dF90eXBlID0gQk9PVF9USU1FOwoKICAgIGlmICgobGYgPSBvcGVuKF9QQVRIX1dUTVBMT0NLLCBPX0NSRUFUfE9fV1JPTkxZLCAwNjYwKSkgPj0gMCkgewoJZmxvY2sobGYsIExPQ0tfRVh8TE9DS19OQik7IC8qIG1ha2Ugc3VyZSBpbml0IHdvbid0IGhhbmcgKi8KCWlmKChmZCA9IG9wZW4oX1BBVEhfV1RNUCwgT19XUk9OTFl8T19BUFBFTkQpKSA+PSAwKSB7CgkgICAgd3JpdGUoZmQsIChjaGFyICopJnV0LCBzaXplb2YodXQpKTsKCSAgICBjbG9zZShmZCk7Cgl9CglmbG9jayhsZiwgTE9DS19VTnxMT0NLX05CKTsKCWNsb3NlKGxmKTsKICAgIH0KfSAgIC8qICBFbmQgRnVuY3Rpb24gd3JpdGVfd3RtcCAgKi8KCgpzdHJ1Y3QgbmVlZGVyX3N0cnVjdAp7CiAgICBzdHJ1Y3QgbmVlZGVyX3N0cnVjdCAqbmV4dDsKICAgIHBpZF90IHBpZDsKfTsKCnN0cnVjdCBzZXJ2aWNlX3N0cnVjdAp7CiAgICBzdHJ1Y3Qgc2VydmljZV9zdHJ1Y3QgKnByZXYsICpuZXh0OyAgICAvKiAgU2NyaXB0IHNlcnZpY2VzIGNoYWluICAgICAgICAgKi8KICAgIHN0cnVjdCBuZWVkZXJfc3RydWN0ICpuZWVkZXJzOyAgICAgICAgIC8qICBOZWVkZXJzIHdhaXRpbmcgZm9yIHNlcnZpY2UgICAqLwogICAgc3RydWN0IHNjcmlwdF9zdHJ1Y3QgKmF0dGVtcHRpbmdfcHJvdmlkZXJzOwogICAgaW50IGZhaWxlZDsgICAgICAgICAgICAgICAgLyogIFRSVUUgaWYgYXR0ZW1wdGluZyBwcm92aWRlciBmYWlsZWQgYmFkbHkgICovCiAgICBjaGFyIG5hbWVbMV07Cn07CgpzdHJ1Y3Qgc2NyaXB0X3N0cnVjdAp7CiAgICBwaWRfdCBwaWQ7CiAgICBzdHJ1Y3Qgc2NyaXB0X3N0cnVjdCAqcHJldiwgKm5leHQ7ICAgICAgICAgICAgICAvKiAgRm9yIHRoZSBsaXN0ICAgICAgICAgKi8KICAgIHN0cnVjdCBzZXJ2aWNlX3N0cnVjdCAqZmlyc3Rfc2VydmljZSwgKmxhc3Rfc2VydmljZTsgLypGaXJzdCBpcyB0cnVlIG5hbWUqLwogICAgc3RydWN0IHNjcmlwdF9zdHJ1Y3QgKm5leHRfYXR0ZW1wdGluZ19wcm92aWRlcjsgLyogIFByb3ZpZGVyIGNoYWluICAgICAgICovCn07CgpzdHJ1Y3QgbGlzdF9oZWFkCnsKICAgIHN0cnVjdCBzY3JpcHRfc3RydWN0ICpmaXJzdCwgKmxhc3Q7CiAgICB1bnNpZ25lZCBpbnQgbnVtX2VudHJpZXM7Cn07CgoKc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgYXZhaWxhYmxlX2xpc3QgPSB7TlVMTCwgTlVMTCwgMH07CnN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHN0YXJ0aW5nX2xpc3QgPSB7TlVMTCwgTlVMTCwgMH07CnN0YXRpYyBzdHJ1Y3Qgc2VydmljZV9zdHJ1Y3QgKnVuYXZhaWxhYmxlX3NlcnZpY2VzID0gTlVMTDsgIC8qICBGb3IgbmVlZGVycyAgKi8Kc3RhdGljIGludCBudW1fbmVlZGVycyA9IDA7CgoKc3RhdGljIGludCBwcm9jZXNzX3BpZHN0YXQgKHBpZF90IHBpZCwgaW50IHN0YXR1cyk7CnN0YXRpYyB2b2lkIHByb2Nlc3NfY29tbWFuZCAoY29uc3Qgc3RydWN0IGNvbW1hbmRfc3RydWN0ICpjb21tYW5kKTsKc3RhdGljIHN0cnVjdCBzZXJ2aWNlX3N0cnVjdCAqZmluZF9zZXJ2aWNlX2luX2xpc3QgKGNvbnN0IGNoYXIgKm5hbWUsCgkJCQkJCSAgICBzdHJ1Y3Qgc2VydmljZV9zdHJ1Y3QgKnN2KTsKc3RhdGljIHN0cnVjdCBzY3JpcHRfc3RydWN0ICpmaW5kX3NjcmlwdF9ieW5hbWUKICAgIChjb25zdCBjaGFyICpuYW1lLHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBzZXJ2aWNlX3N0cnVjdCAqKnNlcnZpY2UpOwpzdGF0aWMgc3RydWN0IHNjcmlwdF9zdHJ1Y3QgKmZpbmRfc2NyaXB0X2J5cGlkIChwaWRfdCBwaWQsCgkJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwpzdGF0aWMgdm9pZCBpbnNlcnRfZW50cnkgKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBzY3JpcHRfc3RydWN0ICplbnRyeSk7CnN0YXRpYyB2b2lkIHJlbW92ZV9lbnRyeSAoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgc3RydWN0IHNjcmlwdF9zdHJ1Y3QgKmVudHJ5KTsKc3RhdGljIHZvaWQgc2lnbmFsX25lZWRlcnMgKHN0cnVjdCBzZXJ2aWNlX3N0cnVjdCAqc2VydmljZSwgaW50IHNpZyk7CnN0YXRpYyB2b2lkIGhhbmRsZV9ub253b3JraW5nIChzdHJ1Y3Qgc2NyaXB0X3N0cnVjdCAqc2NyaXB0KTsKc3RhdGljIGludCBmb3JjZV9wcm9ncmVzcyAodm9pZCk7CnN0YXRpYyB2b2lkIHNob3dfc2NyaXB0cyAoRklMRSAqZnAsIGNvbnN0IHN0cnVjdCBzY3JpcHRfc3RydWN0ICpzY3JpcHQsCgkJCSAgY29uc3QgY2hhciAqdHlwZSk7CnN0YXRpYyBjb25zdCBjaGFyICpnZXRfcGF0aCAoY29uc3QgY2hhciAqZmlsZSk7CgoKc3RhdGljIHBpZF90IG15d2FpdCAoaW50ICpzdGF0dXMpCi8qICBbUkVUVVJOU10gVGhlIHBpZCBmb3IgYSBwcm9jZXNzIHRvIGJlIHJlYXBlZCwgMCBpZiBubyBwcm9jZXNzIGlzIHRvIGJlCiAgICByZWFwZWQsIGFuZCBsZXNzIHRoYW4gMCBpZiB0aGUgYm9vdCBzY3JpcHRzIGFwcGVhciB0byBoYXZlIGZpbmlzaGVkLgoqLwp7CiAgICBwaWRfdCBwaWQ7CiAgICBzaWdzZXRfdCBzczsKICAgIGxvbmcgYnVmZmVyW0NPTU1BTkRfU0laRSAvIHNpemVvZiAobG9uZyldOwogICAgc3RydWN0IGNvbW1hbmRfc3RydWN0ICpjb21tYW5kID0gKHN0cnVjdCBjb21tYW5kX3N0cnVjdCAqKSBidWZmZXI7CgogICAgaWYgKGluaXRjdGxfZmQgPCAwKSByZXR1cm4gd2FpdCAoc3RhdHVzKTsKICAgIC8qICBTb21lIG1hZ2ljIHRvIGF2b2lkIHJhY2VzIHdoaWNoIGNhbiByZXN1bHQgaW4gbG9zdCBzaWduYWxzICAgKi8KICAgIGNvbW1hbmQtPmNvbW1hbmQgPSAtMTsKICAgIGlmICggc2lnc2V0am1wIChqbXBfZW52LCAxKSApCiAgICB7ICAgLyogIEp1bXAgZnJvbSBzaWduYWwgaGFuZGxlciAgKi8KCWRvX2xvbmdqbXAgPSAwOwoJcHJvY2Vzc19jb21tYW5kIChjb21tYW5kKTsKCXJldHVybiAwOwogICAgfQogICAgc2lnZW1wdHlzZXQgKCZzcyk7ICAvKiAgQmxvY2sgU0lHQ0hMRCBzbyB3YWl0IHN0YXR1cyBjYW5ub3QgYmUgbG9zdCAgKi8KICAgIHNpZ2FkZHNldCAoJnNzLCBTSUdDSExEKTsKICAgIHNpZ3Byb2NtYXNrIChTSUdfQkxPQ0ssICZzcywgTlVMTCk7CiAgICBpZiAoICggcGlkID0gd2FpdHBpZCAoLTEsIHN0YXR1cywgV05PSEFORykgKSA+IDAgKQogICAgewoJc2lncHJvY21hc2sgKFNJR19VTkJMT0NLLCAmc3MsIE5VTEwpOwoJcmV0dXJuIHByb2Nlc3NfcGlkc3RhdCAocGlkLCAqc3RhdHVzKTsKICAgIH0KICAgIGRvX2xvbmdqbXAgPSAxOyAgLyogIEFmdGVyIHRoaXMsIFNJR0NITEQgd2lsbCBjYXVzZSBhIGp1bXAgYmFja3dhcmRzICAqLwogICAgc2lncHJvY21hc2sgKFNJR19VTkJMT0NLLCAmc3MsIE5VTEwpOwogICAgcmVhZCAoaW5pdGN0bF9mZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CiAgICBkb19sb25nam1wID0gMDsKICAgIHByb2Nlc3NfY29tbWFuZCAoY29tbWFuZCk7CiAgICByZXR1cm4gMDsKfSAgIC8qICBFbmQgRnVuY3Rpb24gbXl3YWl0ICAqLwoKc3RhdGljIHBpZF90IHByb2Nlc3NfcGlkc3RhdCAocGlkX3QgcGlkLCBpbnQgc3RhdHVzKQovKiAgW1JFVFVSTlNdIFRoZSBwaWQgZm9yIGEgcHJvY2VzcyB0byBiZSByZWFwZWQsIDAgaWYgbm8gcHJvY2VzcyBpcyB0byBiZQogICAgcmVhcGVkLCBhbmQgbGVzcyB0aGFuIDAgaWYgdGhlIGJvb3Qgc2NyaXB0cyBhcHBlYXIgdG8gaGF2ZSBmaW5pc2hlZC4KKi8KewogICAgaW50IGZhaWxlZDsKICAgIHN0cnVjdCBzY3JpcHRfc3RydWN0ICpzY3JpcHQ7CiAgICBzdHJ1Y3Qgc2VydmljZV9zdHJ1Y3QgKnNlcnZpY2U7CgogICAgaWYgKCAoIHNjcmlwdCA9IGZpbmRfc2NyaXB0X2J5cGlkIChwaWQsICZzdGFydGluZ19saXN0KSApID09IE5VTEwgKQoJcmV0dXJuIHBpZDsKICAgIHJlbW92ZV9lbnRyeSAoJnN0YXJ0aW5nX2xpc3QsIHNjcmlwdCk7CiAgICBpZiAoIFdJRkVYSVRFRCAoc3RhdHVzKSAmJiAoV0VYSVRTVEFUVVMgKHN0YXR1cykgPT0gMCkgKQogICAgewoJc3RydWN0IHNjcmlwdF9zdHJ1Y3QgKnByb3ZpZGVyOwoKCS8qICBOb3RpZnkgbmVlZGVycyBhbmQgb3RoZXIgcHJvdmlkZXJzICAqLwoJZm9yIChzZXJ2aWNlID0gc2NyaXB0LT5maXJzdF9zZXJ2aWNlOyBzZXJ2aWNlICE9IE5VTEw7CgkgICAgIHNlcnZpY2UgPSBzZXJ2aWNlLT5uZXh0KQoJewoJICAgIHNpZ25hbF9uZWVkZXJzIChzZXJ2aWNlLCBTSUdfUFJFU0VOVCk7CgkgICAgZm9yIChwcm92aWRlciA9IHNlcnZpY2UtPmF0dGVtcHRpbmdfcHJvdmlkZXJzOyBwcm92aWRlciAhPSBOVUxMOwoJCSBwcm92aWRlciA9IHByb3ZpZGVyLT5uZXh0X2F0dGVtcHRpbmdfcHJvdmlkZXIpCgkJa2lsbCAocHJvdmlkZXItPnBpZCwgU0lHX1BSRVNFTlQpOwoJICAgIHNlcnZpY2UtPmF0dGVtcHRpbmdfcHJvdmlkZXJzID0gTlVMTDsKCX0KCWluc2VydF9lbnRyeSAoJmF2YWlsYWJsZV9saXN0LCBzY3JpcHQpOwoJcmV0dXJuIGZvcmNlX3Byb2dyZXNzICgpOwogICAgfQogICAgZmFpbGVkID0gKCBXSUZFWElURUQgKHN0YXR1cykgJiYgKFdFWElUU1RBVFVTIChzdGF0dXMpID09IDIpICkgPyAwIDogMTsKICAgIGZvciAoc2VydmljZSA9IHNjcmlwdC0+Zmlyc3Rfc2VydmljZTsgc2VydmljZSAhPSBOVUxMOwoJIHNlcnZpY2UgPSBzZXJ2aWNlLT5uZXh0KQoJc2VydmljZS0+ZmFpbGVkID0gZmFpbGVkOwogICAgaGFuZGxlX25vbndvcmtpbmcgKHNjcmlwdCk7CiAgICByZXR1cm4gZm9yY2VfcHJvZ3Jlc3MgKCk7Cn0gICAvKiAgRW5kIEZ1bmN0aW9uIHByb2Nlc3NfcGlkc3RhdCAgKi8KCnN0YXRpYyB2b2lkIHByb2Nlc3NfY29tbWFuZCAoY29uc3Qgc3RydWN0IGNvbW1hbmRfc3RydWN0ICpjb21tYW5kKQp7CiAgICBpbnQgaXZhbDsKICAgIHN0cnVjdCBzY3JpcHRfc3RydWN0ICpzY3JpcHQ7CiAgICBzdHJ1Y3Qgc2VydmljZV9zdHJ1Y3QgKnNlcnZpY2U7CgogICAgc3dpdGNoIChjb21tYW5kLT5jb21tYW5kKQogICAgewogICAgICBjYXNlIENPTU1BTkRfVEVTVDoKCWtpbGwgKGNvbW1hbmQtPnBpZCwKCSAgICAgIChmaW5kX3NjcmlwdF9ieW5hbWUgKGNvbW1hbmQtPm5hbWUsICZhdmFpbGFibGVfbGlzdCwKCQkJCSAgIE5VTEwpID09IE5VTEwpID8KCSAgICAgIFNJR19OT1RfUFJFU0VOVCA6IFNJR19QUkVTRU5UKTsKCWJyZWFrOwogICAgICBjYXNlIENPTU1BTkRfTkVFRDoKCWl2YWwgPSBydW5fY29tbWFuZCAoY29tbWFuZC0+bmFtZSwgY29tbWFuZC0+bmFtZSwgY29tbWFuZC0+cGlkKTsKCWlmIChpdmFsID09IDApCgl7CgkgICAgKytudW1fbmVlZGVyczsKCSAgICBmb3JjZV9wcm9ncmVzcyAoKTsKCX0KCWVsc2Uga2lsbCAoY29tbWFuZC0+cGlkLCBpdmFsKTsKCWJyZWFrOwogICAgICBjYXNlIENPTU1BTkRfUk9MTEJBQ0s6CglpZiAoY29tbWFuZC0+bmFtZVswXSA9PSAnXDAnKSBzY3JpcHQgPSBOVUxMOwoJZWxzZQoJewoJICAgIGlmICggKCBzY3JpcHQgPSBmaW5kX3NjcmlwdF9ieW5hbWUgKGNvbW1hbmQtPm5hbWUsICZhdmFpbGFibGVfbGlzdCwKCQkJCQkJTlVMTCkgKSA9PSBOVUxMICkKCSAgICB7CgkJa2lsbCAoY29tbWFuZC0+cGlkLCBTSUdfTk9UX1BSRVNFTlQpOwoJCWJyZWFrOwoJICAgIH0KCX0KCXdoaWxlIChzY3JpcHQgIT0gYXZhaWxhYmxlX2xpc3QuZmlyc3QpCgl7CgkgICAgcGlkX3QgcGlkOwoJICAgIHN0cnVjdCBzY3JpcHRfc3RydWN0ICp2aWN0aW0gPSBhdmFpbGFibGVfbGlzdC5maXJzdDsKCSAgICBjaGFyIHR4dFsyNTZdOwoKCSAgICBpZiAoICggcGlkID0gZm9yayAoKSApID09IDAgKSAgIC8qICBDaGlsZCAgICovCgkgICAgewoJCWZvciAoaXZhbCA9IDE7IGl2YWwgPCBOU0lHOyBpdmFsKyspIHNpZ25hbCAoaXZhbCwgU0lHX0RGTCk7CgkJb3BlbiAoIi9kZXYvY29uc29sZSIsIE9fUkRPTkxZLCAwKTsKCQlvcGVuICgiL2Rldi9jb25zb2xlIiwgT19SRFdSLCAwKTsKCQlkdXAyICgxLCAyKTsKCQlleGVjbHAgKGdldF9wYXRoICh2aWN0aW0tPmZpcnN0X3NlcnZpY2UtPm5hbWUpLAoJCQl2aWN0aW0tPmZpcnN0X3NlcnZpY2UtPm5hbWUsICJzdG9wIiwgTlVMTCk7CgkJc25wcmludGYgKHR4dCwgc2l6ZW9mKHR4dCksCgkJCV8oImVycm9yIHN0b3BwaW5nIHNlcnZpY2U6IFwiJXNcIlxuIiksCgkJCSB2aWN0aW0tPmZpcnN0X3NlcnZpY2UtPm5hbWUpOwoJCWVyciAodHh0KTsKCQlfZXhpdCAoU0lHX05PVF9TVE9QUEVEKTsKCSAgICB9CgkgICAgZWxzZSBpZiAocGlkID09IC0xKSBicmVhazsgICAgICAvKiAgRXJyb3IgICAqLwoJICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIFBhcmVudCAgKi8KCSAgICB7CgkJd2hpbGUgKHdhaXRwaWQgKHBpZCwgJml2YWwsIDApICE9IHBpZCkgLyogIE5vdGhpbmcgICovOwoJCWlmICggV0lGRVhJVEVEIChpdmFsKSAmJiAoV0VYSVRTVEFUVVMgKGl2YWwpID09IDApICkKCQl7CgkJICAgIHNucHJpbnRmICh0eHQsIHNpemVvZih0eHQpLAoJCQkgICAgIF8oIlN0b3BwZWQgc2VydmljZTogJXNcbiIpLAoJCQkgICAgIHZpY3RpbS0+Zmlyc3Rfc2VydmljZS0+bmFtZSk7CgkJICAgIHJlbW92ZV9lbnRyeSAoJmF2YWlsYWJsZV9saXN0LCB2aWN0aW0pOwoJCSAgICBmcmVlICh2aWN0aW0pOwoJCSAgICBlcnIgKHR4dCk7CgkJfQoJCWVsc2UgYnJlYWs7CgkgICAgfQoJfQoJa2lsbCAoY29tbWFuZC0+cGlkLAoJICAgICAgKHNjcmlwdCA9PWF2YWlsYWJsZV9saXN0LmZpcnN0KSA/IFNJR19TVE9QUEVEIDogU0lHX05PVF9TVE9QUEVEKTsKCWJyZWFrOwogICAgICBjYXNlIENPTU1BTkRfRFVNUF9MSVNUOgoJaWYgKGZvcmsgKCkgPT0gMCkgLyogRG8gaXQgaW4gYSBjaGlsZCBwcm9jZXNzIHNvIHBpZD0xIGRvZXNuJ3QgYmxvY2sgKi8KCXsKCSAgICBGSUxFICpmcDsKCgkgICAgaWYgKCAoIGZwID0gZm9wZW4gKGNvbW1hbmQtPm5hbWUsICJ3IikgKSA9PSBOVUxMICkgX2V4aXQgKDEpOwoJICAgIHNob3dfc2NyaXB0cyAoZnAsIGF2YWlsYWJsZV9saXN0LmZpcnN0LCAiQVZBSUxBQkxFIik7CgkgICAgc2hvd19zY3JpcHRzIChmcCwgc3RhcnRpbmdfbGlzdC5maXJzdCwgIlNUQVJUSU5HIik7CgkgICAgZnB1dHMgKCJVTkFWQUlMQUJMRSBTRVJWSUNFUzpcbiIsIGZwKTsKCSAgICBmb3IgKHNlcnZpY2UgPSB1bmF2YWlsYWJsZV9zZXJ2aWNlczsgc2VydmljZSAhPSBOVUxMOwoJCSBzZXJ2aWNlID0gc2VydmljZS0+bmV4dCkKCQlmcHJpbnRmIChmcCwgIiVzICglcylcbiIsIHNlcnZpY2UtPm5hbWUsCgkJCSBzZXJ2aWNlLT5mYWlsZWQgPyAiRkFJTEVEIiA6ICJub3QgY29uZmlndXJlZCIpOwoJICAgIGZjbG9zZSAoZnApOwoJICAgIF9leGl0ICgwKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIENPTU1BTkRfUFJPVklERToKCS8qICBTYW5pdHkgY2hlY2sgICovCglpZiAoICggc2NyaXB0ID0gZmluZF9zY3JpcHRfYnlwaWQgKGNvbW1hbmQtPnBwaWQsICZzdGFydGluZ19saXN0KSApCgkgICAgID09IE5VTEwgKQoJewoJICAgIGtpbGwgKGNvbW1hbmQtPnBpZCwgU0lHX05PVF9DSElMRCk7CgkgICAgYnJlYWs7Cgl9CglpZiAoZmluZF9zY3JpcHRfYnluYW1lIChjb21tYW5kLT5uYW1lLCAmYXZhaWxhYmxlX2xpc3QsIE5VTEwpICE9IE5VTEwpCgl7CgkgICAga2lsbCAoY29tbWFuZC0+cGlkLCBTSUdfUFJFU0VOVCk7CgkgICAgYnJlYWs7Cgl9CglpZiAoZmluZF9zY3JpcHRfYnluYW1lIChjb21tYW5kLT5uYW1lLCAmc3RhcnRpbmdfbGlzdCwgJnNlcnZpY2UpCgkgICAgIT0gTlVMTCkKCXsgICAvKiAgU29tZW9uZSBlbHNlIGlzIHRyeWluZyB0byBwcm92aWRlICAqLwoJICAgIHNjcmlwdC0+bmV4dF9hdHRlbXB0aW5nX3Byb3ZpZGVyID0gc2VydmljZS0+YXR0ZW1wdGluZ19wcm92aWRlcnM7CgkgICAgc2VydmljZS0+YXR0ZW1wdGluZ19wcm92aWRlcnMgPSBzY3JpcHQ7CgkgICAgYnJlYWs7Cgl9CglpZiAoICggc2VydmljZSA9IGZpbmRfc2VydmljZV9pbl9saXN0IChjb21tYW5kLT5uYW1lLAoJCQkJCSAgICAgICB1bmF2YWlsYWJsZV9zZXJ2aWNlcykgKQoJICAgICA9PSBOVUxMICkKCXsgICAvKiAgV2UncmUgdGhlIGZpcnN0IHRvIHRyeSBhbmQgcHJvdmlkZTogY3JlYXRlIGl0ICAqLwoJICAgIGlmICggKCBzZXJ2aWNlID0KCQkgICBjYWxsb2MgKDEsIHN0cmxlbiAoY29tbWFuZC0+bmFtZSkgKyBzaXplb2YgKnNlcnZpY2UpICkKCQkgPT0gTlVMTCApCgkgICAgewoJCWtpbGwgKGNvbW1hbmQtPnBpZCwgU0lHX05PVF9DSElMRCk7CgkJYnJlYWs7CgkgICAgfQoJICAgIHN0cmNweSAoc2VydmljZS0+bmFtZSwgY29tbWFuZC0+bmFtZSk7Cgl9CgllbHNlCgl7ICAgLyogIE9ycGhhbmVkIHNlcnZpY2U6IHVuaG9vayBhbmQgZ3JhYiBpdCAgKi8KCSAgICBpZiAoc2VydmljZS0+cHJldiA9PSBOVUxMKSB1bmF2YWlsYWJsZV9zZXJ2aWNlcyA9IHNlcnZpY2UtPm5leHQ7CgkgICAgZWxzZSBzZXJ2aWNlLT5wcmV2LT5uZXh0ID0gc2VydmljZS0+bmV4dDsKCSAgICBpZiAoc2VydmljZS0+bmV4dCAhPSBOVUxMKSBzZXJ2aWNlLT5uZXh0LT5wcmV2ID0gc2VydmljZS0+cHJldjsKCSAgICBzZXJ2aWNlLT5uZXh0ID0gTlVMTDsKCX0KCXNlcnZpY2UtPnByZXYgPSBzY3JpcHQtPmxhc3Rfc2VydmljZTsKCXNjcmlwdC0+bGFzdF9zZXJ2aWNlLT5uZXh0ID0gc2VydmljZTsKCXNjcmlwdC0+bGFzdF9zZXJ2aWNlID0gc2VydmljZTsKCWtpbGwgKGNvbW1hbmQtPnBpZCwgU0lHX05PVF9QUkVTRU5UKTsKCWJyZWFrOwogICAgICBjYXNlIC0xOgogICAgICBkZWZhdWx0OgoJYnJlYWs7CiAgICB9Cn0gICAvKiAgRW5kIEZ1bmN0aW9uIHByb2Nlc3NfY29tbWFuZCAgKi8KCnN0YXRpYyBpbnQgcnVuX2NvbW1hbmQgKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm5hbWUsIHBpZF90IHBpZCkKewogICAgc3RydWN0IHNjcmlwdF9zdHJ1Y3QgKnNjcmlwdDsKICAgIHN0cnVjdCBuZWVkZXJfc3RydWN0ICpuZWVkZXIgPSBOVUxMOwogICAgc3RydWN0IHNlcnZpY2Vfc3RydWN0ICpzZXJ2aWNlOwoKICAgIGlmIChmaW5kX3NjcmlwdF9ieW5hbWUgKG5hbWUsICZhdmFpbGFibGVfbGlzdCwgTlVMTCkgIT0gTlVMTCkKCXJldHVybiBTSUdfUFJFU0VOVDsKICAgIGlmIChwaWQgIT0gMCkKICAgIHsKCW5lZWRlciA9IGNhbGxvYyAoMSwgc2l6ZW9mICpuZWVkZXIpOwoJaWYgKG5lZWRlciA9PSBOVUxMKSByZXR1cm4gU0lHX0ZBSUxFRDsKCW5lZWRlci0+cGlkID0gcGlkOwogICAgfQogICAgc2NyaXB0ID0gZmluZF9zY3JpcHRfYnluYW1lIChuYW1lLCAmc3RhcnRpbmdfbGlzdCwgJnNlcnZpY2UpOwogICAgaWYgKHNjcmlwdCA9PSBOVUxMKQoJc2VydmljZSA9IGZpbmRfc2VydmljZV9pbl9saXN0IChuYW1lLCB1bmF2YWlsYWJsZV9zZXJ2aWNlcyk7CiAgICBpZiAoc2VydmljZSA9PSBOVUxMKQogICAgewoJaW50IGk7CgljaGFyIHR4dFsxMDI0XTsKCglpZiAoICggc2NyaXB0ID0gY2FsbG9jICgxLCBzaXplb2YgKnNjcmlwdCkgKSA9PSBOVUxMICkKCXsKCSAgICBmcmVlIChuZWVkZXIpOwoJICAgIHJldHVybiBTSUdfRkFJTEVEOwoJfQoJc2VydmljZSA9IGNhbGxvYyAoMSwgc3RybGVuIChuYW1lKSArIHNpemVvZiAqc2VydmljZSk7CglpZiAoc2VydmljZSA9PSBOVUxMKQoJewoJICAgIGZyZWUgKHNjcmlwdCk7CgkgICAgcmV0dXJuIFNJR19GQUlMRUQ7Cgl9CglzdHJjcHkgKHNlcnZpY2UtPm5hbWUsIG5hbWUpOwoJc3dpdGNoICggc2NyaXB0LT5waWQgPSBmb3JrICgpICkKCXsKCSAgY2FzZSAwOiAgIC8qICBDaGlsZCAgICovCgkgICAgZm9yIChpID0gMTsgaSA8IE5TSUc7IGkrKykgc2lnbmFsIChpLCBTSUdfREZMKTsKCSAgICBleGVjbHAgKGdldF9wYXRoIChmaWxlKSwgc2VydmljZS0+bmFtZSwgInN0YXJ0IiwgTlVMTCk7CgkgICAgc25wcmludGYgKHR4dCwgc2l6ZW9mKHR4dCksCgkJXygiZXJyb3IgcnVubmluZyBwcm9ncmFtbWU6IFwiJXNcIlxuIiksIHNlcnZpY2UtPm5hbWUpOwoJICAgIGVyciAodHh0KTsKCSAgICBfZXhpdCAoU0lHX0ZBSUxFRCk7CgkgICAgYnJlYWs7CgkgIGNhc2UgLTE6ICAvKiAgRXJyb3IgICAqLwoJICAgIHNlcnZpY2UtPm5leHQgPSB1bmF2YWlsYWJsZV9zZXJ2aWNlczsKCSAgICBpZiAodW5hdmFpbGFibGVfc2VydmljZXMgIT0gTlVMTCkKCQl1bmF2YWlsYWJsZV9zZXJ2aWNlcy0+cHJldiA9IHNlcnZpY2U7CgkgICAgdW5hdmFpbGFibGVfc2VydmljZXMgPSBzZXJ2aWNlOwoJICAgIGZyZWUgKHNjcmlwdCk7CgkgICAgZnJlZSAobmVlZGVyKTsKCSAgICByZXR1cm4gU0lHX0ZBSUxFRDsKCSAgICAvKmJyZWFrOyovCgkgIGRlZmF1bHQ6ICAvKiAgUGFyZW50ICAqLwoJICAgIHNjcmlwdC0+Zmlyc3Rfc2VydmljZSA9IHNlcnZpY2U7CgkgICAgc2NyaXB0LT5sYXN0X3NlcnZpY2UgPSBzZXJ2aWNlOwoJICAgIGluc2VydF9lbnRyeSAoJnN0YXJ0aW5nX2xpc3QsIHNjcmlwdCk7CgkgICAgc2NoZWRfeWllbGQgKCk7CgkgICAgYnJlYWs7Cgl9CiAgICB9CiAgICBpZiAobmVlZGVyID09IE5VTEwpIHJldHVybiAwOwogICAgbmVlZGVyLT5uZXh0ID0gc2VydmljZS0+bmVlZGVyczsKICAgIHNlcnZpY2UtPm5lZWRlcnMgPSBuZWVkZXI7CiAgICByZXR1cm4gMDsKfSAgIC8qICBFbmQgRnVuY3Rpb24gcnVuX2NvbW1hbmQgICovCgpzdGF0aWMgc3RydWN0IHNlcnZpY2Vfc3RydWN0ICpmaW5kX3NlcnZpY2VfaW5fbGlzdCAoY29uc3QgY2hhciAqbmFtZSwKCQkJCQkJICAgIHN0cnVjdCBzZXJ2aWNlX3N0cnVjdCAqc3YpCnsKICAgIGZvciAoOyBzdiAhPSBOVUxMOyBzdiA9IHN2LT5uZXh0KQoJaWYgKHN0cmNtcCAoc3YtPm5hbWUsIG5hbWUpID09IDApIHJldHVybiAoc3YpOwogICAgcmV0dXJuIE5VTEw7Cn0gICAvKiAgRW5kIEZ1bmN0aW9uIGZpbmRfc2VydmljZV9pbl9saXN0ICAqLwoKc3RhdGljIHN0cnVjdCBzY3JpcHRfc3RydWN0ICpmaW5kX3NjcmlwdF9ieW5hbWUgKGNvbnN0IGNoYXIgKm5hbWUsCgkJCQkJCSBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAoJCQkJCQkgc3RydWN0IHNlcnZpY2Vfc3RydWN0ICoqc2VydmljZSkKewogICAgc3RydWN0IHNjcmlwdF9zdHJ1Y3QgKnNjcmlwdDsKCiAgICBmb3IgKHNjcmlwdCA9IGhlYWQtPmZpcnN0OyBzY3JpcHQgIT0gTlVMTDsgc2NyaXB0ID0gc2NyaXB0LT5uZXh0KQogICAgewoJc3RydWN0IHNlcnZpY2Vfc3RydWN0ICpzdjsKCglpZiAoICggc3YgPSBmaW5kX3NlcnZpY2VfaW5fbGlzdCAobmFtZSwgc2NyaXB0LT5maXJzdF9zZXJ2aWNlKSApCgkgICAgICE9IE5VTEwgKQoJewoJICAgIGlmIChzZXJ2aWNlICE9IE5VTEwpICpzZXJ2aWNlID0gc3Y7CgkgICAgcmV0dXJuIChzY3JpcHQpOwoJfQogICAgfQogICAgaWYgKHNlcnZpY2UgIT0gTlVMTCkgKnNlcnZpY2UgPSBOVUxMOwogICAgcmV0dXJuIE5VTEw7Cn0gICAvKiAgRW5kIEZ1bmN0aW9uIGZpbmRfc2NyaXB0X2J5bmFtZSAgKi8KCnN0YXRpYyBzdHJ1Y3Qgc2NyaXB0X3N0cnVjdCAqZmluZF9zY3JpcHRfYnlwaWQgKHBpZF90IHBpZCwKCQkJCQkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKewogICAgc3RydWN0IHNjcmlwdF9zdHJ1Y3QgKnNjcmlwdDsKCiAgICBmb3IgKHNjcmlwdCA9IGhlYWQtPmZpcnN0OyBzY3JpcHQgIT0gTlVMTDsgc2NyaXB0ID0gc2NyaXB0LT5uZXh0KQoJaWYgKHNjcmlwdC0+cGlkID09IHBpZCkgcmV0dXJuIChzY3JpcHQpOwogICAgcmV0dXJuIE5VTEw7Cn0gICAvKiAgRW5kIEZ1bmN0aW9uIGZpbmRfc2NyaXB0X2J5cGlkICAqLwoKc3RhdGljIHZvaWQgaW5zZXJ0X2VudHJ5IChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBzdHJ1Y3Qgc2NyaXB0X3N0cnVjdCAqZW50cnkpCnsKICAgIGlmIChlbnRyeSA9PSBOVUxMKSByZXR1cm47CiAgICBlbnRyeS0+cHJldiA9IE5VTEw7CiAgICBlbnRyeS0+bmV4dCA9IGhlYWQtPmZpcnN0OwogICAgaWYgKGhlYWQtPmZpcnN0ICE9IE5VTEwpIGhlYWQtPmZpcnN0LT5wcmV2ID0gZW50cnk7CiAgICBoZWFkLT5maXJzdCA9IGVudHJ5OwogICAgaWYgKGhlYWQtPmxhc3QgPT0gTlVMTCkgaGVhZC0+bGFzdCA9IGVudHJ5OwogICAgKytoZWFkLT5udW1fZW50cmllczsKfSAgIC8qICBFbmQgRnVuY3Rpb24gaW5zZXJ0X2VudHJ5ICAqLwoKc3RhdGljIHZvaWQgcmVtb3ZlX2VudHJ5IChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBzdHJ1Y3Qgc2NyaXB0X3N0cnVjdCAqZW50cnkpCnsKICAgIGlmIChlbnRyeS0+cHJldiA9PSBOVUxMKSBoZWFkLT5maXJzdCA9IGVudHJ5LT5uZXh0OwogICAgZWxzZSBlbnRyeS0+cHJldi0+bmV4dCA9IGVudHJ5LT5uZXh0OwogICAgaWYgKGVudHJ5LT5uZXh0ID09IE5VTEwpIGhlYWQtPmxhc3QgPSBlbnRyeS0+cHJldjsKICAgIGVsc2UgZW50cnktPm5leHQtPnByZXYgPSBlbnRyeS0+cHJldjsKICAgIC0taGVhZC0+bnVtX2VudHJpZXM7Cn0gICAvKiAgRW5kIEZ1bmN0aW9uIHJlbW92ZV9lbnRyeSAgKi8KCnN0YXRpYyB2b2lkIHNpZ25hbF9uZWVkZXJzIChzdHJ1Y3Qgc2VydmljZV9zdHJ1Y3QgKnNlcnZpY2UsIGludCBzaWcpCnsKICAgIHN0cnVjdCBuZWVkZXJfc3RydWN0ICpuZWVkZXIsICpuZXh0X25lZWRlcjsKCiAgICBmb3IgKG5lZWRlciA9IHNlcnZpY2UtPm5lZWRlcnM7IG5lZWRlciAhPSBOVUxMOyBuZWVkZXIgPSBuZXh0X25lZWRlcikKICAgIHsKCWtpbGwgKG5lZWRlci0+cGlkLCBzaWcpOwoJbmV4dF9uZWVkZXIgPSBuZWVkZXItPm5leHQ7CglmcmVlIChuZWVkZXIpOwoJLS1udW1fbmVlZGVyczsKICAgIH0KICAgIHNlcnZpY2UtPm5lZWRlcnMgPSBOVUxMOwp9ICAgLyogIEVuZCBGdW5jdGlvbiBzaWduYWxfbmVlZGVycyAgKi8KCnN0YXRpYyB2b2lkIGhhbmRsZV9ub253b3JraW5nIChzdHJ1Y3Qgc2NyaXB0X3N0cnVjdCAqc2NyaXB0KQp7CiAgICBzdHJ1Y3Qgc2VydmljZV9zdHJ1Y3QgKnNlcnZpY2UsICpuZXh0OwoKICAgIGZvciAoc2VydmljZSA9IHNjcmlwdC0+Zmlyc3Rfc2VydmljZTsgc2VydmljZSAhPSBOVUxMOyBzZXJ2aWNlID0gbmV4dCkKICAgIHsKCXN0cnVjdCBzY3JpcHRfc3RydWN0ICpwcm92aWRlciA9IHNlcnZpY2UtPmF0dGVtcHRpbmdfcHJvdmlkZXJzOwoKCW5leHQgPSBzZXJ2aWNlLT5uZXh0OwoJaWYgKHByb3ZpZGVyID09IE5VTEwpCgl7CgkgICAgc2VydmljZS0+cHJldiA9IE5VTEw7CgkgICAgc2VydmljZS0+bmV4dCA9IHVuYXZhaWxhYmxlX3NlcnZpY2VzOwoJICAgIGlmICh1bmF2YWlsYWJsZV9zZXJ2aWNlcyAhPSBOVUxMKQoJCXVuYXZhaWxhYmxlX3NlcnZpY2VzLT5wcmV2ID0gc2VydmljZTsKCSAgICB1bmF2YWlsYWJsZV9zZXJ2aWNlcyA9IHNlcnZpY2U7CgkgICAgY29udGludWU7Cgl9CglzZXJ2aWNlLT5hdHRlbXB0aW5nX3Byb3ZpZGVycyA9IHByb3ZpZGVyLT5uZXh0X2F0dGVtcHRpbmdfcHJvdmlkZXI7Cglwcm92aWRlci0+bGFzdF9zZXJ2aWNlLT5uZXh0ID0gc2VydmljZTsKCXNlcnZpY2UtPnByZXYgPSBwcm92aWRlci0+bGFzdF9zZXJ2aWNlOwoJcHJvdmlkZXItPmxhc3Rfc2VydmljZSA9IHNlcnZpY2U7CglzZXJ2aWNlLT5uZXh0ID0gTlVMTDsKCWtpbGwgKHByb3ZpZGVyLT5waWQsIFNJR19OT1RfUFJFU0VOVCk7CiAgICB9CiAgICBmcmVlIChzY3JpcHQpOwp9ICAgLyogIEVuZCBGdW5jdGlvbiBoYW5kbGVfbm9ud29ya2luZyAgKi8KCnN0YXRpYyBpbnQgZm9yY2VfcHJvZ3Jlc3MgKHZvaWQpCi8qICBbUkVUVVJOU10gMCBpZiBib290IHNjcmlwdHMgYXJlIHN0aWxsIHJ1bm5pbmcsIGVsc2UgLTEuCiovCnsKICAgIHN0cnVjdCBzZXJ2aWNlX3N0cnVjdCAqc2VydmljZTsKCiAgICBpZiAoc3RhcnRpbmdfbGlzdC5udW1fZW50cmllcyA+IG51bV9uZWVkZXJzKSByZXR1cm4gMDsKICAgIC8qICBObyBwcm9ncmVzcyBjYW4gYmUgbWFkZTogc2lnbmFsIG5lZWRlcnMgICovCiAgICBmb3IgKHNlcnZpY2UgPSB1bmF2YWlsYWJsZV9zZXJ2aWNlczsgc2VydmljZSAhPSBOVUxMOwoJIHNlcnZpY2UgPSBzZXJ2aWNlLT5uZXh0KQoJc2lnbmFsX25lZWRlcnMgKHNlcnZpY2UsCgkJCXNlcnZpY2UtPmZhaWxlZCA/IFNJR19GQUlMRUQgOiBTSUdfTk9UX1BSRVNFTlQpOwogICAgcmV0dXJuIChzdGFydGluZ19saXN0Lm51bV9lbnRyaWVzIDwgMSkgPyAtMSA6IDA7Cn0gICAvKiAgRW5kIEZ1bmN0aW9uIGZvcmNlX3Byb2dyZXNzICAqLwoKc3RhdGljIHZvaWQgc2hvd19zY3JpcHRzIChGSUxFICpmcCwgY29uc3Qgc3RydWN0IHNjcmlwdF9zdHJ1Y3QgKnNjcmlwdCwKCQkJICBjb25zdCBjaGFyICp0eXBlKQp7CiAgICBmcHJpbnRmIChmcCwgIiVzIFNFUlZJQ0VTOlxuIiwgdHlwZSk7CiAgICBmb3IgKDsgc2NyaXB0ICE9IE5VTEw7IHNjcmlwdCA9IHNjcmlwdC0+bmV4dCkKICAgIHsKCXN0cnVjdCBzZXJ2aWNlX3N0cnVjdCAqc2VydmljZSA9IHNjcmlwdC0+Zmlyc3Rfc2VydmljZTsKCglmcHV0cyAoc2VydmljZS0+bmFtZSwgZnApOwoJZm9yIChzZXJ2aWNlID0gc2VydmljZS0+bmV4dDsgc2VydmljZSAhPSBOVUxMOyBzZXJ2aWNlID0gc2VydmljZS0+bmV4dCkKCSAgICBmcHJpbnRmIChmcCwgIiAgKCVzKSIsIHNlcnZpY2UtPm5hbWUpOwoJcHV0YyAoJ1xuJywgZnApOwogICAgfQp9ICAgLyogIEVuZCBGdW5jdGlvbiBzaG93X3NjcmlwdHMgICovCgpzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3BhdGggKGNvbnN0IGNoYXIgKmZpbGUpCnsKICAgIGNoYXIgKnAxLCAqcDI7CiAgICBzdGF0aWMgY2hhciBwYXRoW1BBVEhfU0laRV07CgogICAgaWYgKGZpbGVbMF0gPT0gJy8nKSByZXR1cm4gZmlsZTsKICAgIGlmIChpbml0X3BhdGhbMF0gPT0gJ1wwJykgcmV0dXJuIGZpbGU7CiAgICBmb3IgKHAxID0gaW5pdF9wYXRoOyAqcDEgIT0gJ1wwJzsgcDEgPSBwMikKICAgIHsKCWlmICggKCBwMiA9IHN0cmNociAocDEsICc6JykgKSA9PSBOVUxMICkKCSAgICBwMiA9IHAxICsgc3RybGVuIChwMSk7CglzdHJuY3B5IChwYXRoLCBwMSwgcDIgLSBwMSk7CglwYXRoW3AyIC0gcDFdID0gJy8nOwoJc3RyY3B5IChwYXRoICsgKHAyIC0gcDEpICsgMSwgZmlsZSk7CglpZiAoKnAyID09ICc6JykgKytwMjsKCWlmIChhY2Nlc3MgKHBhdGgsIFhfT0spID09IDApIHJldHVybiBwYXRoOwogICAgfQogICAgcmV0dXJuIGZpbGU7Cn0gICAvKiAgRW5kIEZ1bmN0aW9uIGdldF9wYXRoICAqLwo=