LyoKICogIHJlYWRwcm9maWxlLmMgLSB1c2VkIHRvIHJlYWQgL3Byb2MvcHJvZmlsZQogKgogKiAgQ29weXJpZ2h0IChDKSAxOTk0LDE5OTYgQWxlc3NhbmRybyBSdWJpbmkgKHJ1YmluaUBpcHZ2aXMudW5pcHYuaXQpCiAqCiAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICovCgovKgogKiAxOTk5LTAyLTIyIEFya2FkaXVzeiBNabZraWV3aWN6IDxtaXNpZWtAcGxkLk9SRy5QTD4KICogLSBhZGRlZCBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAogKiAxOTk5LTA5LTAxIFN0ZXBoYW5lIEVyYW5pYW4gPGVyYW5pYW5AY2VsbG8uaHBsLmhwLmNvbT4KICogLSA2NGJpdCBjbGVhbiBwYXRjaAogKiAzRmViMjAwMSBBbmRyZXcgTW9ydG9uIDxhbmRyZXdtQHVvdy5lZHUuYXU+CiAqIC0gLU0gb3B0aW9uIHRvIHdyaXRlIHByb2ZpbGUgbXVsdGlwbGllci4KICogMjAwMS0xMS0wNyBXZXJuZXIgQWxtZXNiZXJnZXIgPHdhQGFsbWVzYmVyZ2VyLm5ldD4KICogLSBieXRlIG9yZGVyIGF1dG8tZGV0ZWN0aW9uIGFuZCAtbiBvcHRpb24KICogMjAwMS0xMS0wOSBXZXJuZXIgQWxtZXNiZXJnZXIgPHdhQGFsbWVzYmVyZ2VyLm5ldD4KICogLSBza2lwIHN0ZXAgc2l6ZSAoaW5kZXggMCkKICogMjAwMi0wMy0wOSBKb2huIExldm9uIDxtb3pAY29tcHNvYy5tYW4uYWMudWs+CiAqIC0gbWFrZSBtYXBsaW5lbm8gZG8gc29tZXRoaW5nCiAqIDIwMDItMTEtMjggTWFkcyBNYXJ0aW4gSm9lcmdlbnNlbiArCiAqIC0gYWxzbyB0cnkgL2Jvb3QvU3lzdGVtLm1hcC1gdW5hbWUgLXJgCiAqIDIwMDMtMDQtMDkgV2VybmVyIEFsbWVzYmVyZ2VyIDx3YUBhbG1lc2Jlcmdlci5uZXQ+CiAqIC0gZml4ZWQgb2ZmLWJ5IGVpZ2h0IGVycm9yIGFuZCBpbXByb3ZlZCBoZXVyaXN0aWNzIGluIGJ5dGUgb3JkZXIgZGV0ZWN0aW9uCiAqIDIwMDMtMDgtMTIgTmlraXRhIERhbmlsb3YgPE5pa2l0YUBOYW1lc3lzLkNPTT4KICogLSBhZGRlZCAtcyBvcHRpb247IGV4YW1wbGUgb2YgdXNlOgogKiAicmVhZHByb2ZpbGUgLXMgLW0gL2Jvb3QvU3lzdGVtLm1hcC10ZXN0IHwgZ3JlcCBfX2RfbG9va3VwIHwgc29ydCAtbiAtazMiCiAqLwoKI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CiNpbmNsdWRlICJubHMuaCIKCiNkZWZpbmUgU19MRU4gMTI4CgpzdGF0aWMgY2hhciAqcHJnbmFtZTsKCi8qIFRoZXNlIGFyZSB0aGUgZGVmYXVsdHMgKi8Kc3RhdGljIGNoYXIgZGVmYXVsdG1hcFtdPSIvYm9vdC9TeXN0ZW0ubWFwIjsKc3RhdGljIGNoYXIgZGVmYXVsdHByb1tdPSIvcHJvYy9wcm9maWxlIjsKc3RhdGljIGNoYXIgb3B0c3RyaW5nW109Ik06bTpucDppdHZhclZicyI7CgpzdGF0aWMgdm9pZCAqCnhtYWxsb2MgKHNpemVfdCBzaXplKSB7Cgl2b2lkICp0OwoKCWlmIChzaXplID09IDApCgkJcmV0dXJuIE5VTEw7CgoJdCA9IG1hbGxvYyAoc2l6ZSk7CglpZiAodCA9PSBOVUxMKSB7CgkJZnByaW50ZihzdGRlcnIsIF8oIm91dCBvZiBtZW1vcnkiKSk7CgkJZXhpdCgxKTsKCX0KCglyZXR1cm4gdDsKfQoKc3RhdGljIEZJTEUgKgpteW9wZW4oY2hhciAqbmFtZSwgY2hhciAqbW9kZSwgaW50ICpmbGFnKSB7CglpbnQgbGVuID0gc3RybGVuKG5hbWUpOwoKCWlmICghc3RyY21wKG5hbWUrbGVuLTMsIi5neiIpKSB7CgkJRklMRSAqcmVzOwoJCWNoYXIgKmNtZGxpbmUgPSB4bWFsbG9jKGxlbis2KTsKCQlzcHJpbnRmKGNtZGxpbmUsICJ6Y2F0ICVzIiwgbmFtZSk7CgkJcmVzID0gcG9wZW4oY21kbGluZSxtb2RlKTsKCQlmcmVlKGNtZGxpbmUpOwoJCSpmbGFnID0gMTsKCQlyZXR1cm4gcmVzOwoJfQoJKmZsYWcgPSAwOwoJcmV0dXJuIGZvcGVuKG5hbWUsbW9kZSk7Cn0KCiNpZm5kZWYgQk9PVF9TWVNURU1fTUFQCiNkZWZpbmUgQk9PVF9TWVNURU1fTUFQICIvYm9vdC9TeXN0ZW0ubWFwLSIKI2VuZGlmCgpzdGF0aWMgY2hhciAqCmJvb3RfdW5hbWVfcl9zdHIodm9pZCkgewoJc3RydWN0IHV0c25hbWUgdW5hbWVfaW5mbzsKCWNoYXIgKnM7CglzaXplX3QgbGVuOwoKCWlmICh1bmFtZSgmdW5hbWVfaW5mbykpCgkJcmV0dXJuICIiOwoJbGVuID0gc3RybGVuKEJPT1RfU1lTVEVNX01BUCkgKyBzdHJsZW4odW5hbWVfaW5mby5yZWxlYXNlKSArIDE7CglzID0geG1hbGxvYyhsZW4pOwoJc3RyY3B5KHMsIEJPT1RfU1lTVEVNX01BUCk7CglzdHJjYXQocywgdW5hbWVfaW5mby5yZWxlYXNlKTsKCXJldHVybiBzOwp9CgpzdGF0aWMgdm9pZAp1c2FnZSh2b2lkKSB7CglmcHJpbnRmKHN0ZGVyciwgXygKCQkiJXM6IFVzYWdlOiBcIiVzIFtvcHRpb25zXVxuIgoJCSJcdCAtbSA8bWFwZmlsZT4gIChkZWZhdWx0czogXCIlc1wiIGFuZFxuXHRcdFx0XHQgIFwiJXNcIilcbiIKCQkiXHQgLXAgPHByby1maWxlPiAoZGVmYXVsdDogXCIlc1wiKVxuIgoJCSJcdCAtTSA8bXVsdD4gICAgIHNldCB0aGUgcHJvZmlsaW5nIG11bHRpcGxpZXIgdG8gPG11bHQ+XG4iCgkJIlx0IC1pICAgICAgICAgICAgcHJpbnQgb25seSBpbmZvIGFib3V0IHRoZSBzYW1wbGluZyBzdGVwXG4iCgkJIlx0IC12ICAgICAgICAgICAgcHJpbnQgdmVyYm9zZSBkYXRhXG4iCgkJIlx0IC1hICAgICAgICAgICAgcHJpbnQgYWxsIHN5bWJvbHMsIGV2ZW4gaWYgY291bnQgaXMgMFxuIgoJCSJcdCAtYiAgICAgICAgICAgIHByaW50IGluZGl2aWR1YWwgaGlzdG9ncmFtLWJpbiBjb3VudHNcbiIKCQkiXHQgLXMgICAgICAgICAgICBwcmludCBpbmRpdmlkdWFsIGNvdW50ZXJzIHdpdGhpbiBmdW5jdGlvbnNcbiIKCQkiXHQgLXIgICAgICAgICAgICByZXNldCBhbGwgdGhlIGNvdW50ZXJzIChyb290IG9ubHkpXG4iCgkJIlx0IC1uICAgICAgICAgICAgZGlzYWJsZSBieXRlIG9yZGVyIGF1dG8tZGV0ZWN0aW9uXG4iCgkJIlx0IC1WICAgICAgICAgICAgcHJpbnQgdmVyc2lvbiBhbmQgZXhpdFxuIiksCgkJcHJnbmFtZSwgcHJnbmFtZSwgZGVmYXVsdG1hcCwgYm9vdF91bmFtZV9yX3N0cigpLCBkZWZhdWx0cHJvKTsKCWV4aXQoMSk7Cn0KCmludAptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewoJRklMRSAqbWFwOwoJaW50IHByb0ZkOwoJY2hhciAqbWFwRmlsZSwgKnByb0ZpbGUsICptdWx0PTA7Cgl1bnNpZ25lZCBsb25nIGxlbj0wLCBpbmR4PTE7Cgl1bnNpZ25lZCBsb25nIGxvbmcgYWRkMD0wOwoJdW5zaWduZWQgaW50IHN0ZXA7Cgl1bnNpZ25lZCBpbnQgKmJ1ZiwgdG90YWwsIGZuX2xlbjsKCXVuc2lnbmVkIGxvbmcgbG9uZyBmbl9hZGQsIG5leHRfYWRkOyAgICAgICAgICAvKiBjdXJyZW50IGFuZCBuZXh0IGFkZHJlc3MgKi8KCWNoYXIgZm5fbmFtZVtTX0xFTl0sIG5leHRfbmFtZVtTX0xFTl07ICAgLyogY3VycmVudCBhbmQgbmV4dCBuYW1lICovCgljaGFyIG1vZGVbOF07CglpbnQgYzsKCWludCBvcHRBbGw9MCwgb3B0SW5mbz0wLCBvcHRSZXNldD0wLCBvcHRWZXJib3NlPTAsIG9wdE5hdGl2ZT0wOwoJaW50IG9wdEJpbnM9MCwgb3B0U3ViPTA7CgljaGFyIG1hcGxpbmVbU19MRU5dOwoJaW50IG1hcGxpbmVubz0xOwoJaW50IHBvcGVuTWFwOyAgIC8qIGZsYWcgdG8gdGVsbCBpZiBwb3BlbigpIGhhcyBiZWVuIHVzZWQgKi8KCWludCBoZWFkZXJfcHJpbnRlZDsKCiNkZWZpbmUgbmV4dCAoY3VycmVudF4xKQoKCXNldGxvY2FsZShMQ19BTEwsICIiKTsKCWJpbmR0ZXh0ZG9tYWluKFBBQ0tBR0UsIExPQ0FMRURJUik7Cgl0ZXh0ZG9tYWluKFBBQ0tBR0UpOwoKCXByZ25hbWUgPSBhcmd2WzBdOwoJcHJvRmlsZSA9IGRlZmF1bHRwcm87CgltYXBGaWxlID0gZGVmYXVsdG1hcDsKCgl3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgb3B0c3RyaW5nKSkgIT0gLTEpIHsKCQlzd2l0Y2goYykgewoJCWNhc2UgJ20nOgoJCQltYXBGaWxlID0gb3B0YXJnOwoJCQlicmVhazsKCQljYXNlICduJzoKCQkJb3B0TmF0aXZlKys7CgkJCWJyZWFrOwoJCWNhc2UgJ3AnOgoJCQlwcm9GaWxlID0gb3B0YXJnOwoJCQlicmVhazsKCQljYXNlICdhJzoKCQkJb3B0QWxsKys7CgkJCWJyZWFrOwoJCWNhc2UgJ2InOgoJCQlvcHRCaW5zKys7CgkJCWJyZWFrOwoJCWNhc2UgJ3MnOgoJCQlvcHRTdWIrKzsKCQkJYnJlYWs7CgkJY2FzZSAnaSc6CgkJCW9wdEluZm8rKzsKCQkJYnJlYWs7CgkJY2FzZSAnTSc6CgkJCW11bHQgPSBvcHRhcmc7CgkJCWJyZWFrOwoJCWNhc2UgJ3InOgoJCQlvcHRSZXNldCsrOwoJCQlicmVhazsKCQljYXNlICd2JzoKCQkJb3B0VmVyYm9zZSsrOwoJCQlicmVhazsKCQljYXNlICdWJzoKCQkJcHJpbnRmKF8oIiVzICglcylcbiIpLCBwcmduYW1lLAoJCQkgICAgICAgUEFDS0FHRV9TVFJJTkcpOwoJCQlleGl0KDApOwoJCWRlZmF1bHQ6CgkJCXVzYWdlKCk7CgkJfQoJfQoKCWlmIChvcHRSZXNldCB8fCBtdWx0KSB7CgkJaW50IG11bHRpcGxpZXIsIGZkLCB0b193cml0ZTsKCgkJLyoKCQkgKiBXaGVuIHdyaXRpbmcgdGhlIG11bHRpcGxpZXIsIGlmIHRoZSBsZW5ndGggb2YgdGhlIHdyaXRlIGlzCgkJICogbm90IHNpemVvZihpbnQpLCB0aGUgbXVsdGlwbGllciBpcyBub3QgY2hhbmdlZAoJCSAqLwoJCWlmIChtdWx0KSB7CgkJCW11bHRpcGxpZXIgPSBzdHJ0b3VsKG11bHQsIDAsIDEwKTsKCQkJdG9fd3JpdGUgPSBzaXplb2YoaW50KTsKCQl9IGVsc2UgewoJCQltdWx0aXBsaWVyID0gMDsKCQkJdG9fd3JpdGUgPSAxOwkvKiBzdGggZGlmZmVyZW50IGZyb20gc2l6ZW9mKGludCkgKi8KCQl9CgkJLyogdHJ5IHRvIGJlY29tZSByb290LCBqdXN0IGluIGNhc2UgKi8KCQlzZXR1aWQoMCk7CgkJZmQgPSBvcGVuKGRlZmF1bHRwcm8sT19XUk9OTFkpOwoJCWlmIChmZCA8IDApIHsKCQkJcGVycm9yKGRlZmF1bHRwcm8pOwoJCQlleGl0KDEpOwoJCX0KCQlpZiAod3JpdGUoZmQsICZtdWx0aXBsaWVyLCB0b193cml0ZSkgIT0gdG9fd3JpdGUpIHsKCQkJZnByaW50ZihzdGRlcnIsIF8oInJlYWRwcm9maWxlOiBlcnJvciB3cml0aW5nICVzOiAlc1xuIiksCgkJCQlkZWZhdWx0cHJvLCBzdHJlcnJvcihlcnJubykpOwoJCQlleGl0KDEpOwoJCX0KCQljbG9zZShmZCk7CgkJZXhpdCgwKTsKCX0KCgkvKgoJICogVXNlIGFuIGZkIGZvciB0aGUgcHJvZmlsaW5nIGJ1ZmZlciwgdG8gc2tpcCBzdGRpbyBvdmVyaGVhZAoJICovCglpZiAoKChwcm9GZD1vcGVuKHByb0ZpbGUsT19SRE9OTFkpKSA8IDApCgkgICAgfHwgKChpbnQpKGxlbj1sc2Vlayhwcm9GZCwwLFNFRUtfRU5EKSkgPCAwKQoJICAgIHx8IChsc2Vlayhwcm9GZCwwLFNFRUtfU0VUKSA8IDApKSB7CgkJZnByaW50ZihzdGRlcnIsIiVzOiAlczogJXNcbiIscHJnbmFtZSxwcm9GaWxlLHN0cmVycm9yKGVycm5vKSk7CgkJZXhpdCgxKTsKCX0KCglpZiAoIShidWY9bWFsbG9jKGxlbikpKSB7CgkJZnByaW50ZihzdGRlcnIsIiVzOiBtYWxsb2MoKTogJXNcbiIsIHByZ25hbWUsIHN0cmVycm9yKGVycm5vKSk7CgkJZXhpdCgxKTsKCX0KCglpZiAocmVhZChwcm9GZCxidWYsbGVuKSAhPSBsZW4pIHsKCQlmcHJpbnRmKHN0ZGVyciwiJXM6ICVzOiAlc1xuIixwcmduYW1lLHByb0ZpbGUsc3RyZXJyb3IoZXJybm8pKTsKCQlleGl0KDEpOwoJfQoJY2xvc2UocHJvRmQpOwoKCWlmICghb3B0TmF0aXZlKSB7CgkJaW50IGVudHJpZXMgPSBsZW4vc2l6ZW9mKCpidWYpOwoJCWludCBiaWcgPSAwLHNtYWxsID0gMCxpOwoJCXVuc2lnbmVkICpwOwoKCQlmb3IgKHAgPSBidWYrMTsgcCA8IGJ1ZitlbnRyaWVzOyBwKyspIHsKCQkJaWYgKCpwICYgfjBVIDw8IChzaXplb2YoKmJ1ZikqNCkpCgkJCQliaWcrKzsKCQkJaWYgKCpwICYgKCgxIDw8IChzaXplb2YoKmJ1ZikqNCkpLTEpKQoJCQkJc21hbGwrKzsKCQl9CgkJaWYgKGJpZyA+IHNtYWxsKSB7CgkJCWZwcmludGYoc3RkZXJyLF8oIkFzc3VtaW5nIHJldmVyc2VkIGJ5dGUgb3JkZXIuICIKCQkJCSJVc2UgLW4gdG8gZm9yY2UgbmF0aXZlIGJ5dGUgb3JkZXIuXG4iKSk7CgkJCWZvciAocCA9IGJ1ZjsgcCA8IGJ1ZitlbnRyaWVzOyBwKyspCgkJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKCpidWYpLzI7IGkrKykgewoJCQkJCXVuc2lnbmVkIGNoYXIgKmIgPSAodW5zaWduZWQgY2hhciAqKSBwOwoJCQkJCXVuc2lnbmVkIGNoYXIgdG1wOwoKCQkJCQl0bXAgPSBiW2ldOwoJCQkJCWJbaV0gPSBiW3NpemVvZigqYnVmKS1pLTFdOwoJCQkJCWJbc2l6ZW9mKCpidWYpLWktMV0gPSB0bXA7CgkJCQl9CgkJfQoJfQoKCXN0ZXAgPSBidWZbMF07CglpZiAob3B0SW5mbykgewoJCXByaW50ZihfKCJTYW1wbGluZ19zdGVwOiAlaVxuIiksIHN0ZXApOwoJCWV4aXQoMCk7Cgl9IAoKCXRvdGFsID0gMDsKCgltYXAgPSBteW9wZW4obWFwRmlsZSwgInIiLCAmcG9wZW5NYXApOwoJaWYgKG1hcCA9PSBOVUxMICYmIG1hcEZpbGUgPT0gZGVmYXVsdG1hcCkgewoJCW1hcEZpbGUgPSBib290X3VuYW1lX3Jfc3RyKCk7CgkJbWFwID0gbXlvcGVuKG1hcEZpbGUsICJyIiwgJnBvcGVuTWFwKTsKCX0KCWlmIChtYXAgPT0gTlVMTCkgewoJCWludCBlcnJzdiA9IGVycm5vOwoJCWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHByZ25hbWUpOwoJCWVycm5vID0gZXJyc3Y7CgkJcGVycm9yKG1hcEZpbGUpOwoJCWV4aXQoMSk7Cgl9CgoJd2hpbGUgKGZnZXRzKG1hcGxpbmUsU19MRU4sbWFwKSkgewoJCWlmIChzc2NhbmYobWFwbGluZSwiJWxseCAlcyAlcyIsJmZuX2FkZCxtb2RlLGZuX25hbWUpICE9IDMpIHsKCQkJZnByaW50ZihzdGRlcnIsXygiJXM6ICVzKCVpKTogd3JvbmcgbWFwIGxpbmVcbiIpLAoJCQkJcHJnbmFtZSwgbWFwRmlsZSwgbWFwbGluZW5vKTsKCQkJZXhpdCgxKTsKCQl9CgkJLyogb25seSBlbGYgd29ya3MgbGlrZSB0aGlzICovCgkJaWYgKCFzdHJjbXAoZm5fbmFtZSwiX3N0ZXh0IikgfHwgIXN0cmNtcChmbl9uYW1lLCJfX3N0ZXh0IikpIHsKCQkJYWRkMCA9IGZuX2FkZDsKCQkJYnJlYWs7CgkJfQoJCW1hcGxpbmVubysrOwoJfQoKCWlmICghYWRkMCkgewoJCWZwcmludGYoc3RkZXJyLF8oIiVzOiBjYW4ndCBmaW5kIFwiX3N0ZXh0XCIgaW4gJXNcbiIpLAoJCQlwcmduYW1lLCBtYXBGaWxlKTsKCQlleGl0KDEpOwoJfQoKCS8qCgkgKiBNYWluIGxvb3AuCgkgKi8KCXdoaWxlIChmZ2V0cyhtYXBsaW5lLFNfTEVOLG1hcCkpIHsKCQl1bnNpZ25lZCBpbnQgdGhpcz0wOwoJCWludCBkb25lID0gMDsKCgkJaWYgKHNzY2FuZihtYXBsaW5lLCIlbGx4ICVzICVzIiwmbmV4dF9hZGQsbW9kZSxuZXh0X25hbWUpIT0zKSB7CgkJCWZwcmludGYoc3RkZXJyLF8oIiVzOiAlcyglaSk6IHdyb25nIG1hcCBsaW5lXG4iKSwKCQkJCXByZ25hbWUsbWFwRmlsZSwgbWFwbGluZW5vKTsKCQkJZXhpdCgxKTsKCQl9CgkJaGVhZGVyX3ByaW50ZWQgPSAwOwoKCQkvKiB0aGUga2VybmVsIG9ubHkgcHJvZmlsZXMgdXAgdG8gX2V0ZXh0ICovCgkJaWYgKCFzdHJjbXAobmV4dF9uYW1lLCAiX2V0ZXh0IikgfHwKCQkgICAgIXN0cmNtcChuZXh0X25hbWUsICJfX2V0ZXh0IikpCgkJCWRvbmUgPSAxOwoJCWVsc2UgewoJCQkvKiBpZ25vcmUgYW55IExFQURJTkcgKGJlZm9yZSBhICdbdFRdJyBzeW1ib2wgaXMgZm91bmQpCgkJCSAgIEFic29sdXRlIHN5bWJvbHMgKi8KCQkJaWYgKCgqbW9kZSA9PSAnQScgfHwgKm1vZGUgPT0gJz8nKSAmJiB0b3RhbCA9PSAwKQoJCQkJY29udGludWU7CgkJCWlmICgqbW9kZSAhPSAnVCcgJiYgKm1vZGUgIT0gJ3QnICYmCgkJCSAgICAqbW9kZSAhPSAnVycgJiYgKm1vZGUgIT0gJ3cnKQoJCQkJYnJlYWs7CS8qIG9ubHkgdGV4dCBpcyBwcm9maWxlZCAqLwoJCX0KCgkJaWYgKGluZHggPj0gbGVuIC8gc2l6ZW9mKCpidWYpKSB7CgkJCWZwcmludGYoc3RkZXJyLCBfKCIlczogcHJvZmlsZSBhZGRyZXNzIG91dCBvZiByYW5nZS4gIgoJCQkJCSAgIldyb25nIG1hcCBmaWxlP1xuIiksIHByZ25hbWUpOwoJCQlleGl0KDEpOwoJCX0KCgkJd2hpbGUgKGluZHggPCAobmV4dF9hZGQtYWRkMCkvc3RlcCkgewoJCQlpZiAob3B0QmlucyAmJiAoYnVmW2luZHhdIHx8IG9wdEFsbCkpIHsKCQkJCWlmICghaGVhZGVyX3ByaW50ZWQpIHsKCQkJCQlwcmludGYgKCIlczpcbiIsIGZuX25hbWUpOwoJCQkJCWhlYWRlcl9wcmludGVkID0gMTsKCQkJCX0KCQkJCXByaW50ZiAoIlx0JWxseFx0JXVcbiIsIChpbmR4IC0gMSkqc3RlcCArIGFkZDAsIGJ1ZltpbmR4XSk7CgkJCX0KCQkJdGhpcyArPSBidWZbaW5keCsrXTsKCQl9CgkJdG90YWwgKz0gdGhpczsKCgkJaWYgKG9wdEJpbnMpIHsKCQkJaWYgKG9wdFZlcmJvc2UgfHwgdGhpcyA+IDApCgkJCQlwcmludGYgKCIgIHRvdGFsXHRcdFx0XHQldVxuIiwgdGhpcyk7CgkJfSBlbHNlIGlmICgodGhpcyB8fCBvcHRBbGwpICYmCgkJCSAgIChmbl9sZW4gPSBuZXh0X2FkZC1mbl9hZGQpICE9IDApIHsKCQkJaWYgKG9wdFZlcmJvc2UpCgkJCQlwcmludGYoIiUwMTZsbHggJS00MHMgJTZpICU4LjRmXG4iLCBmbl9hZGQsCgkJCQkgICAgICAgZm5fbmFtZSx0aGlzLHRoaXMvKGRvdWJsZSlmbl9sZW4pOwoJCQllbHNlCgkJCQlwcmludGYoIiU2aSAlLTQwcyAlOC40ZlxuIiwKCQkJCSAgICAgICB0aGlzLGZuX25hbWUsdGhpcy8oZG91YmxlKWZuX2xlbik7CgkJCWlmIChvcHRTdWIpIHsKCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBzY2FuOwoKCQkJCWZvciAoc2NhbiA9IChmbl9hZGQtYWRkMCkvc3RlcCArIDE7CgkJCQkgICAgIHNjYW4gPCAobmV4dF9hZGQtYWRkMCkvc3RlcDsgc2NhbisrKSB7CgkJCQkJdW5zaWduZWQgbG9uZyBsb25nIGFkZHI7CgoJCQkJCWFkZHIgPSAoc2NhbiAtIDEpKnN0ZXAgKyBhZGQwOwoJCQkJCXByaW50ZigiXHQlI2xseFx0JXMrJSNsbHhcdCV1XG4iLAoJCQkJCSAgICAgICBhZGRyLCBmbl9uYW1lLCBhZGRyIC0gZm5fYWRkLAoJCQkJCSAgICAgICBidWZbc2Nhbl0pOwoJCQkJfQoJCQl9CgkJfQoKCQlmbl9hZGQgPSBuZXh0X2FkZDsKCQlzdHJjcHkoZm5fbmFtZSxuZXh0X25hbWUpOwoKCQltYXBsaW5lbm8rKzsKCQlpZiAoZG9uZSkKCQkJYnJlYWs7Cgl9CgoJLyogY2xvY2sgdGlja3MsIG91dCBvZiBrZXJuZWwgdGV4dCAtIHByb2JhYmx5IG1vZHVsZXMgKi8KCXByaW50ZigiJTZpICVzXG4iLCBidWZbbGVuL3NpemVvZigqYnVmKS0xXSwgIip1bmtub3duKiIpOwoKCS8qIHRyYWlsZXIgKi8KCWlmIChvcHRWZXJib3NlKQoJCXByaW50ZigiJTAxNnggJS00MHMgJTZpICU4LjRmXG4iLAoJCSAgICAgICAwLCJ0b3RhbCIsdG90YWwsdG90YWwvKGRvdWJsZSkoZm5fYWRkLWFkZDApKTsKCWVsc2UKCQlwcmludGYoIiU2aSAlLTQwcyAlOC40ZlxuIiwKCQkgICAgICAgdG90YWwsXygidG90YWwiKSx0b3RhbC8oZG91YmxlKShmbl9hZGQtYWRkMCkpOwoJCglwb3Blbk1hcCA/IHBjbG9zZShtYXApIDogZmNsb3NlKG1hcCk7CglleGl0KDApOwp9Cg==