LyogU2hhcmVkIGxpYnJhcnkgYWRkLW9uIHRvIGlwdGFibGVzIHRvIGFkZCBsaW1pdCBzdXBwb3J0LgogKgogKiBK6XL0bWUgZGUgVml2aWUgICA8ZGV2aXZpZUBpbmZvLmVuc2VyYi51LWJvcmRlYXV4LmZyPgogKiBIZXJ26SBFeWNoZW5uZSAgIDxleWNoZW5uZUBpbmZvLmVuc2VyYi51LWJvcmRlYXV4LmZyPgogKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8Z2V0b3B0Lmg+CiNpbmNsdWRlIDxpcHRhYmxlcy5oPgojaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CiNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbGltaXQuaD4KCiNkZWZpbmUgSVBUX0xJTUlUX0FWRwkiMy9ob3VyIgojZGVmaW5lIElQVF9MSU1JVF9CVVJTVAk1CgovKiBGdW5jdGlvbiB3aGljaCBwcmludHMgb3V0IHVzYWdlIG1lc3NhZ2UuICovCnN0YXRpYyB2b2lkCmhlbHAodm9pZCkKewoJcHJpbnRmKAoibGltaXQgdiVzIG9wdGlvbnM6XG4iCiItLWxpbWl0IGF2ZwkJCW1heCBhdmVyYWdlIG1hdGNoIHJhdGU6IGRlZmF1bHQgIklQVF9MSU1JVF9BVkciXG4iCiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQYWNrZXRzIHBlciBzZWNvbmQgdW5sZXNzIGZvbGxvd2VkIGJ5IFxuIgoiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvc2VjIC9taW51dGUgL2hvdXIgL2RheSBwb3N0Zml4ZXNdXG4iCiItLWxpbWl0LWJ1cnN0IG51bWJlcgkJbnVtYmVyIHRvIG1hdGNoIGluIGEgYnVyc3QsIGRlZmF1bHQgJXVcbiIKIlxuIiwgTkVURklMVEVSX1ZFUlNJT04sIElQVF9MSU1JVF9CVVJTVCk7Cn0KCnN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKCXsgImxpbWl0IiwgMSwgMCwgJyUnIH0sCgl7ICJsaW1pdC1idXJzdCIsIDEsIDAsICckJyB9LAoJeyAwIH0KfTsKCnN0YXRpYwppbnQgcGFyc2VfcmF0ZShjb25zdCBjaGFyICpyYXRlLCB1X2ludDMyX3QgKnZhbCkKewoJY29uc3QgY2hhciAqZGVsaW07Cgl1X2ludDMyX3QgcjsKCXVfaW50MzJfdCBtdWx0ID0gMTsgIC8qIFNlY29uZHMgYnkgZGVmYXVsdC4gKi8KCglkZWxpbSA9IHN0cmNocihyYXRlLCAnLycpOwoJaWYgKGRlbGltKSB7CgkJaWYgKHN0cmxlbihkZWxpbSsxKSA9PSAwKQoJCQlyZXR1cm4gMDsKCgkJaWYgKHN0cm5jYXNlY21wKGRlbGltKzEsICJzZWNvbmQiLCBzdHJsZW4oZGVsaW0rMSkpID09IDApCgkJCW11bHQgPSAxOwoJCWVsc2UgaWYgKHN0cm5jYXNlY21wKGRlbGltKzEsICJtaW51dGUiLCBzdHJsZW4oZGVsaW0rMSkpID09IDApCgkJCW11bHQgPSA2MDsKCQllbHNlIGlmIChzdHJuY2FzZWNtcChkZWxpbSsxLCAiaG91ciIsIHN0cmxlbihkZWxpbSsxKSkgPT0gMCkKCQkJbXVsdCA9IDYwKjYwOwoJCWVsc2UgaWYgKHN0cm5jYXNlY21wKGRlbGltKzEsICJkYXkiLCBzdHJsZW4oZGVsaW0rMSkpID09IDApCgkJCW11bHQgPSAyNCo2MCo2MDsKCQllbHNlCgkJCXJldHVybiAwOwoJfQoJciA9IGF0b2kocmF0ZSk7CglpZiAoIXIpCgkJcmV0dXJuIDA7CgoJLyogVGhpcyB3b3VsZCBnZXQgbWFwcGVkIHRvIGluZmluaXRlICgxL2RheSBpcyBtaW5pbXVtIHRoZXkKICAgICAgICAgICBjYW4gc3BlY2lmeSwgc28gd2UncmUgb2sgYXQgdGhhdCBlbmQpLiAqLwoJaWYgKHIgLyBtdWx0ID4gSVBUX0xJTUlUX1NDQUxFKQoJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sICJSYXRlIHRvbyBmYXN0IGAlcydcbiIsIHJhdGUpOwoKCSp2YWwgPSBJUFRfTElNSVRfU0NBTEUgKiBtdWx0IC8gcjsKCXJldHVybiAxOwp9CgovKiBJbml0aWFsaXplIHRoZSBtYXRjaC4gKi8Kc3RhdGljIHZvaWQKaW5pdChzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptLCB1bnNpZ25lZCBpbnQgKm5mY2FjaGUpCnsKCXN0cnVjdCBpcHRfcmF0ZWluZm8gKnIgPSAoc3RydWN0IGlwdF9yYXRlaW5mbyAqKW0tPmRhdGE7CgoJcGFyc2VfcmF0ZShJUFRfTElNSVRfQVZHLCAmci0+YXZnKTsKCXItPmJ1cnN0ID0gSVBUX0xJTUlUX0JVUlNUOwoKCS8qIENhbid0IGNhY2hlIHRoaXMgKi8KCSpuZmNhY2hlIHw9IE5GQ19VTktOT1dOOwp9CgovKiBGSVhNRTogaGFuZGxlIG92ZXJmbG93OgoJaWYgKHItPmF2ZypyLT5idXJzdC9yLT5idXJzdCAhPSByLT5hdmcpCgkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKCQkJICAgIlNvcnJ5OiBidXJzdCB0b28gbGFyZ2UgZm9yIHRoYXQgYXZnIHJhdGUuXG4iKTsKKi8KCi8qIEZ1bmN0aW9uIHdoaWNoIHBhcnNlcyBjb21tYW5kIG9wdGlvbnM7IHJldHVybnMgdHJ1ZSBpZiBpdAogICBhdGUgYW4gb3B0aW9uICovCnN0YXRpYyBpbnQKcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgaW52ZXJ0LCB1bnNpZ25lZCBpbnQgKmZsYWdzLAogICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplbnRyeSwKICAgICAgdW5zaWduZWQgaW50ICpuZmNhY2hlLAogICAgICBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICoqbWF0Y2gpCnsKCXN0cnVjdCBpcHRfcmF0ZWluZm8gKnIgPSAoc3RydWN0IGlwdF9yYXRlaW5mbyAqKSgqbWF0Y2gpLT5kYXRhOwoJaW50IG51bTsKCglzd2l0Y2goYykgewoJY2FzZSAnJSc6CgkJaWYgKGNoZWNrX2ludmVyc2Uob3B0YXJnLCAmaW52ZXJ0KSkKCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKCQkJCSAgICJVbmV4cGVjdGVkIGAhJyBhZnRlciAtLWxpbWl0Iik7CgkJaWYgKCFwYXJzZV9yYXRlKG9wdGFyZywgJnItPmF2ZykpCgkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCgkJCQkgICAiYmFkIHJhdGUgYCVzJyIsIG9wdGFyZyk7CgkJYnJlYWs7CQoKCWNhc2UgJyQnOgoJCWlmIChjaGVja19pbnZlcnNlKG9wdGFyZywgJmludmVydCkpCgkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCgkJCQkgICAiVW5leHBlY3RlZCBgIScgYWZ0ZXIgLS1saW1pdC1idXJzdCIpOwoKCQludW0gPSBzdHJpbmdfdG9fbnVtYmVyKG9wdGFyZywgMCwgMTAwMDApOwoJCWlmIChudW0gPD0gMCkKCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKCQkJCSAgICJiYWQgLS1saW1pdC1idXJzdCBgJXMnIiwgb3B0YXJnKTsKCQlyLT5idXJzdCA9IG51bTsKCQlicmVhazsKCglkZWZhdWx0OgoJCXJldHVybiAwOwoJfQoKCXJldHVybiAxOwp9CgovKiBGaW5hbCBjaGVjazsgbm90aGluZy4gKi8Kc3RhdGljIHZvaWQgZmluYWxfY2hlY2sodW5zaWduZWQgaW50IGZsYWdzKQp7Cn0KCnN0YXRpYyBzdHJ1Y3QgcmF0ZXMKewoJY29uc3QgY2hhciAqbmFtZTsKCXVfaW50MzJfdCBtdWx0Owp9IHJhdGVzW10gPSB7IHsgImRheSIsIElQVF9MSU1JVF9TQ0FMRSoyNCo2MCo2MCB9LAoJICAgICAgeyAiaG91ciIsIElQVF9MSU1JVF9TQ0FMRSo2MCo2MCB9LAoJICAgICAgeyAibWluIiwgSVBUX0xJTUlUX1NDQUxFKjYwIH0sCgkgICAgICB7ICJzZWMiLCBJUFRfTElNSVRfU0NBTEUgfSB9OwoKc3RhdGljIHZvaWQgcHJpbnRfcmF0ZSh1X2ludDMyX3QgcGVyaW9kKQp7Cgl1bnNpZ25lZCBpbnQgaTsKCglmb3IgKGkgPSAxOyBpIDwgc2l6ZW9mKHJhdGVzKS9zaXplb2Yoc3RydWN0IHJhdGVzKTsgaSsrKSB7CgkJaWYgKHBlcmlvZCA+IHJhdGVzW2ldLm11bHQKCQkgICAgfHwgcmF0ZXNbaV0ubXVsdCAlIHBlcmlvZCAhPSAwKQoJCQlicmVhazsKCX0KCglwcmludGYoIiV1LyVzICIsIHJhdGVzW2ktMV0ubXVsdCAvIHBlcmlvZCwgcmF0ZXNbaS0xXS5uYW1lKTsKfQoKLyogUHJpbnRzIG91dCB0aGUgbWF0Y2hpbmZvLiAqLwpzdGF0aWMgdm9pZApwcmludChjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbWF0Y2gsCiAgICAgIGludCBudW1lcmljKQp7CglzdHJ1Y3QgaXB0X3JhdGVpbmZvICpyID0gKHN0cnVjdCBpcHRfcmF0ZWluZm8gKiltYXRjaC0+ZGF0YTsKCXByaW50ZigibGltaXQ6IGF2ZyAiKTsgcHJpbnRfcmF0ZShyLT5hdmcpOwoJcHJpbnRmKCJidXJzdCAldSAiLCByLT5idXJzdCk7Cn0KCi8qIEZJWE1FOiBNYWtlIG1pbmltYWxpc3Q6IG9ubHkgcHJpbnQgcmF0ZSBpZiBub3QgZGVmYXVsdCAtLVJSICovCnN0YXRpYyB2b2lkIHNhdmUoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsIGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm1hdGNoKQp7CglzdHJ1Y3QgaXB0X3JhdGVpbmZvICpyID0gKHN0cnVjdCBpcHRfcmF0ZWluZm8gKiltYXRjaC0+ZGF0YTsKCglwcmludGYoIi0tbGltaXQgIik7IHByaW50X3JhdGUoci0+YXZnKTsKCWlmIChyLT5idXJzdCAhPSBJUFRfTElNSVRfQlVSU1QpCgkJcHJpbnRmKCItLWxpbWl0LWJ1cnN0ICV1ICIsIHItPmJ1cnN0KTsKfQoKc3RydWN0IGlwdGFibGVzX21hdGNoIGxpbWl0Cj0geyBOVUxMLAogICAgImxpbWl0IiwKICAgIE5FVEZJTFRFUl9WRVJTSU9OLAogICAgc2l6ZW9mKHN0cnVjdCBpcHRfcmF0ZWluZm8pLAogICAgJmhlbHAsCiAgICAmaW5pdCwKICAgICZwYXJzZSwKICAgICZmaW5hbF9jaGVjaywKICAgICZwcmludCwKICAgICZzYXZlLAogICAgb3B0cwp9OwoKdm9pZCBfaW5pdCh2b2lkKQp7CglyZWdpc3Rlcl9tYXRjaCgmbGltaXQpOwp9Cg==