ZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmFzaWMvZG9jcHJvYy5jIGIvc2NyaXB0cy9iYXNpYy9kb2Nwcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhN2VjZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvYmFzaWMvZG9jcHJvYy5jCkBAIC0wLDAgKzEsMzk4IEBACisvKgorICoJZG9jcHJvYyBpcyBhIHNpbXBsZSBwcmVwcm9jZXNzb3IgZm9yIHRoZSB0ZW1wbGF0ZSBmaWxlcworICogICAgICB1c2VkIGFzIHBsYWNlaG9sZGVycyBmb3IgdGhlIGtlcm5lbCBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLgorICoJZG9jcHJvYyBpcyB1c2VkIGZvciBkb2N1bWVudGF0aW9uLWZyb250ZW5kIGFuZAorICogICAgICBkZXBlbmRlbmN5LWdlbmVyYXRvci4KKyAqCVRoZSB0d28gdXNhZ2VzIGhhdmUgaW4gY29tbW9uIHRoYXQgdGhleSByZXF1aXJlCisgKglzb21lIGtub3dsZWRnZSBvZiB0aGUgLnRtcGwgc3ludGF4LCB0aGVyZWZvcmUgdGhleQorICoJYXJlIGtlcHQgdG9nZXRoZXIuCisgKgorICoJZG9jdW1lbnRhdGlvbi1mcm9udGVuZAorICoJCVNjYW5zIHRoZSB0ZW1wbGF0ZSBmaWxlIGFuZCBjYWxsIGtlcm5lbC1kb2MgZm9yCisgKgkJYWxsIG9jY3VycmVuY2VzIG9mICFbRUlGXWZpbGUKKyAqCQlCZWZvcmVoYW5kIGVhY2ggcmVmZXJlbmNlZCBmaWxlIGFyZSBzY2FubmVkIGZvcgorICoJCWFueSBleHBvcnRlZCBzeW1wb2xzICJFWFBPUlRfU1lNQk9MKCkiIHN0YXRlbWVudHMuCisgKgkJVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBwcm9wZXIgLWZ1bmN0aW9uIGFuZAorICoJCS1ub2Z1bmN0aW9uIGFyZ3VtZW50cyBpbiBjYWxscyB0byBrZXJuZWwtZG9jLgorICoJCVVzYWdlOiBkb2Nwcm9jIGRvYyBmaWxlLnRtcGwKKyAqCisgKglkZXBlbmRlbmN5LWdlbmVyYXRvcjoKKyAqCQlTY2FucyB0aGUgdGVtcGxhdGUgZmlsZSBhbmQgbGlzdCBhbGwgZmlsZXMKKyAqCQlyZWZlcmVuY2VkIGluIGEgZm9ybWF0IHJlY29nbml6ZWQgYnkgbWFrZS4KKyAqCQlVc2FnZToJZG9jcHJvYyBkZXBlbmQgZmlsZS50bXBsCisgKgkJV3JpdGVzIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gdG8gc3Rkb3V0CisgKgkJaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgKgkJZmlsZS50bXBsIHNyYy5jCXNyYzIuYworICoJCVRoZSBmaWxlbmFtZXMgYXJlIG9idGFpbmVkIGZyb20gdGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzOgorICoJCSFFZmlsZW5hbWUKKyAqCQkhSWZpbGVuYW1lCisgKgkJIURmaWxlbmFtZQorICoJCSFGZmlsZW5hbWUKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisvKiBleGl0c3RhdHVzIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBhbnkgZmFpbGluZyBjYWxscyB0byBrZXJuZWwtZG9jLAorICogYnV0IGV4ZWN1dGlvbiBjb250aW51ZXMuICovCitpbnQgZXhpdHN0YXR1cyA9IDA7CisKK3R5cGVkZWYgdm9pZCBERkwoY2hhciAqKTsKK0RGTCAqZGVmYXVsdGxpbmU7CisKK3R5cGVkZWYgdm9pZCBGSUxFT05MWShjaGFyICogZmlsZSk7CitGSUxFT05MWSAqaW50ZXJuYWxmdW5jdGlvbnM7CitGSUxFT05MWSAqZXh0ZXJuYWxmdW5jdGlvbnM7CitGSUxFT05MWSAqc3ltYm9sc29ubHk7CisKK3R5cGVkZWYgdm9pZCBGSUxFTElORShjaGFyICogZmlsZSwgc2lnbmVkIGNoYXIgKiBsaW5lKTsKK0ZJTEVMSU5FICogc2luZ2xlZnVuY3Rpb25zOworRklMRUxJTkUgKiBlbnRpdHlfc3lzdGVtOworCisjZGVmaW5lIE1BWExJTkVTWiAgICAgMjA0OAorI2RlZmluZSBNQVhGSUxFUyAgICAgIDI1MAorI2RlZmluZSBLRVJORUxET0NQQVRIICJzY3JpcHRzLyIKKyNkZWZpbmUgS0VSTkVMRE9DICAgICAia2VybmVsLWRvYyIKKyNkZWZpbmUgRE9DQk9PSyAgICAgICAiLWRvY2Jvb2siCisjZGVmaW5lIEZVTkNUSU9OICAgICAgIi1mdW5jdGlvbiIKKyNkZWZpbmUgTk9GVU5DVElPTiAgICAiLW5vZnVuY3Rpb24iCisKK3ZvaWQgdXNhZ2UgKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogZG9jcHJvYyB7ZG9jfGRlcGVuZH0gZmlsZVxuIik7CisJZnByaW50ZihzdGRlcnIsICJJbnB1dCBpcyByZWFkIGZyb20gZmlsZS50bXBsLiBPdXRwdXQgaXMgc2VudCB0byBzdGRvdXRcbiIpOworCWZwcmludGYoc3RkZXJyLCAiZG9jOiBmcm9udGVuZCB3aGVuIGdlbmVyYXRpbmcga2VybmVsIGRvY3VtZW50YXRpb25cbiIpOworCWZwcmludGYoc3RkZXJyLCAiZGVwZW5kOiBnZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHJlZmVyZW5jZWQgd2l0aGluIGZpbGVcbiIpOworfQorCisvKgorICogRXhlY3V0ZSBrZXJuZWwtZG9jIHdpdGggcGFyYW1ldGVycyBnaXZpbiBpbiBzdmVjCisgKi8KK3ZvaWQgZXhlY19rZXJuZWxfZG9jKGNoYXIgKipzdmVjKQoreworCXBpZF90IHBpZDsKKwlpbnQgcmV0OworCWNoYXIgcmVhbF9maWxlbmFtZVtQQVRIX01BWCArIDFdOworCS8qIE1ha2Ugc3VyZSBvdXRwdXQgZ2VuZXJhdGVkIHNvIGZhciBhcmUgZmx1c2hlZCAqLworCWZmbHVzaChzdGRvdXQpOworCXN3aXRjaChwaWQ9Zm9yaygpKSB7CisJCWNhc2UgLTE6CisJCQlwZXJyb3IoImZvcmsiKTsKKwkJCWV4aXQoMSk7CisJCWNhc2UgIDA6CisJCQltZW1zZXQocmVhbF9maWxlbmFtZSwgMCwgc2l6ZW9mKHJlYWxfZmlsZW5hbWUpKTsKKwkJCXN0cm5jYXQocmVhbF9maWxlbmFtZSwgZ2V0ZW52KCJTUkNUUkVFIiksIFBBVEhfTUFYKTsKKwkJCXN0cm5jYXQocmVhbF9maWxlbmFtZSwgS0VSTkVMRE9DUEFUSCBLRVJORUxET0MsCisJCQkJCVBBVEhfTUFYIC0gc3RybGVuKHJlYWxfZmlsZW5hbWUpKTsKKwkJCWV4ZWN2cChyZWFsX2ZpbGVuYW1lLCBzdmVjKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiZXhlYyAiKTsKKwkJCXBlcnJvcihyZWFsX2ZpbGVuYW1lKTsKKwkJCWV4aXQoMSk7CisJCWRlZmF1bHQ6CisJCQl3YWl0cGlkKHBpZCwgJnJldCAsMCk7CisJfQorCWlmIChXSUZFWElURUQocmV0KSkKKwkJZXhpdHN0YXR1cyB8PSBXRVhJVFNUQVRVUyhyZXQpOworCWVsc2UKKwkJZXhpdHN0YXR1cyA9IDB4ZmY7Cit9CisKKy8qIFR5cGVzIHVzZWQgdG8gY3JlYXRlIGxpc3Qgb2YgYWxsIGV4cG9ydGVkIHN5bWJvbHMgaW4gYSBudW1iZXIgb2YgZmlsZXMgKi8KK3N0cnVjdCBzeW1ib2xzCit7CisJY2hhciAqbmFtZTsKK307CisKK3N0cnVjdCBzeW1maWxlCit7CisJY2hhciAqZmlsZW5hbWU7CisJc3RydWN0IHN5bWJvbHMgKnN5bWJvbGxpc3Q7CisJaW50IHN5bWJvbGNudDsKK307CisKK3N0cnVjdCBzeW1maWxlIHN5bWZpbGVsaXN0W01BWEZJTEVTXTsKK2ludCBzeW1maWxlY250ID0gMDsKKwordm9pZCBhZGRfbmV3X3N5bWJvbChzdHJ1Y3Qgc3ltZmlsZSAqc3ltLCBjaGFyICogc3ltbmFtZSkKK3sKKwlzeW0tPnN5bWJvbGxpc3QgPQorICAgICAgICAgIHJlYWxsb2Moc3ltLT5zeW1ib2xsaXN0LCAoc3ltLT5zeW1ib2xjbnQgKyAxKSAqIHNpemVvZihjaGFyICopKTsKKwlzeW0tPnN5bWJvbGxpc3Rbc3ltLT5zeW1ib2xjbnQrK10ubmFtZSA9IHN0cmR1cChzeW1uYW1lKTsKK30KKworLyogQWRkIGEgZmlsZW5hbWUgdG8gdGhlIGxpc3QgKi8KK3N0cnVjdCBzeW1maWxlICogYWRkX25ld19maWxlKGNoYXIgKiBmaWxlbmFtZSkKK3sKKwlzeW1maWxlbGlzdFtzeW1maWxlY250KytdLmZpbGVuYW1lID0gc3RyZHVwKGZpbGVuYW1lKTsKKwlyZXR1cm4gJnN5bWZpbGVsaXN0W3N5bWZpbGVjbnQgLSAxXTsKK30KKy8qIENoZWNrIGlmIGZpbGUgYWxyZWFkeSBhcmUgcHJlc2VudCBpbiB0aGUgbGlzdCAqLworc3RydWN0IHN5bWZpbGUgKiBmaWxlbmFtZV9leGlzdChjaGFyICogZmlsZW5hbWUpCit7CisJaW50IGk7CisJZm9yIChpPTA7IGkgPCBzeW1maWxlY250OyBpKyspCisJCWlmIChzdHJjbXAoc3ltZmlsZWxpc3RbaV0uZmlsZW5hbWUsIGZpbGVuYW1lKSA9PSAwKQorCQkJcmV0dXJuICZzeW1maWxlbGlzdFtpXTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIExpc3QgYWxsIGZpbGVzIHJlZmVyZW5jZWQgd2l0aGluIHRoZSB0ZW1wbGF0ZSBmaWxlLgorICogRmlsZXMgYXJlIHNlcGFyYXRlZCBieSB0YWJzLgorICovCit2b2lkIGFkZGRlcChjaGFyICogZmlsZSkJCSAgIHsgcHJpbnRmKCJcdCVzIiwgZmlsZSk7IH0KK3ZvaWQgYWRkZGVwMihjaGFyICogZmlsZSwgc2lnbmVkIGNoYXIgKiBsaW5lKSAgICAgeyBsaW5lID0gbGluZTsgYWRkZGVwKGZpbGUpOyB9Cit2b2lkIG5vYWN0aW9uKGNoYXIgKiBsaW5lKQkJICAgeyBsaW5lID0gbGluZTsgfQordm9pZCBub2FjdGlvbjIoY2hhciAqIGZpbGUsIHNpZ25lZCBjaGFyICogbGluZSkgICB7IGZpbGUgPSBmaWxlOyBsaW5lID0gbGluZTsgfQorCisvKiBFY2hvIHRoZSBsaW5lIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gKi8KK3ZvaWQgcHJpbnRsaW5lKGNoYXIgKiBsaW5lKSAgICAgICAgICAgICAgIHsgcHJpbnRmKCIlcyIsIGxpbmUpOyB9CisKKy8qCisgKiBGaW5kIGFsbCBzeW1ib2xzIGV4cG9ydGVkIHdpdGggRVhQT1JUX1NZTUJPTCBhbmQgRVhQT1JUX1NZTUJPTF9HUEwKKyAqIGluIGZpbGVuYW1lLgorICogQWxsIHN5bWJvbHMgbG9jYXRlZCBhcmUgc3RvcmVkIGluIHN5bWZpbGVsaXN0LgorICovCit2b2lkIGZpbmRfZXhwb3J0X3N5bWJvbHMoY2hhciAqIGZpbGVuYW1lKQoreworCUZJTEUgKiBmcDsKKwlzdHJ1Y3Qgc3ltZmlsZSAqc3ltOworCWNoYXIgbGluZVtNQVhMSU5FU1pdOworCWlmIChmaWxlbmFtZV9leGlzdChmaWxlbmFtZSkgPT0gTlVMTCkgeworCQljaGFyIHJlYWxfZmlsZW5hbWVbUEFUSF9NQVggKyAxXTsKKwkJbWVtc2V0KHJlYWxfZmlsZW5hbWUsIDAsIHNpemVvZihyZWFsX2ZpbGVuYW1lKSk7CisJCXN0cm5jYXQocmVhbF9maWxlbmFtZSwgZ2V0ZW52KCJTUkNUUkVFIiksIFBBVEhfTUFYKTsKKwkJc3RybmNhdChyZWFsX2ZpbGVuYW1lLCBmaWxlbmFtZSwKKwkJCQlQQVRIX01BWCAtIHN0cmxlbihyZWFsX2ZpbGVuYW1lKSk7CisJCXN5bSA9IGFkZF9uZXdfZmlsZShmaWxlbmFtZSk7CisJCWZwID0gZm9wZW4ocmVhbF9maWxlbmFtZSwgInIiKTsKKwkJaWYgKGZwID09IE5VTEwpCisJCXsKKwkJCWZwcmludGYoc3RkZXJyLCAiZG9jcHJvYzogIik7CisJCQlwZXJyb3IocmVhbF9maWxlbmFtZSk7CisJCX0KKwkJd2hpbGUoZmdldHMobGluZSwgTUFYTElORVNaLCBmcCkpIHsKKwkJCXNpZ25lZCBjaGFyICpwOworCQkJc2lnbmVkIGNoYXIgKmU7CisJCQlpZiAoKChwID0gc3Ryc3RyKGxpbmUsICJFWFBPUlRfU1lNQk9MX0dQTCIpKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocCA9IHN0cnN0cihsaW5lLCAiRVhQT1JUX1NZTUJPTCIpKSAhPSAwKSkgeworCQkJCS8qIFNraXAgRVhQT1JUX1NZTUJPTHtfR1BMfSAqLworCQkJCXdoaWxlIChpc2FsbnVtKCpwKSB8fCAqcCA9PSAnXycpCisJCQkJCXArKzsKKwkJCQkvKiBSZW1vdmUgcGFyYW50ZXNlcyBhbmQgYWRkaXRpb25hbCB3cyAqLworCQkJCXdoaWxlIChpc3NwYWNlKCpwKSkKKwkJCQkJcCsrOworCQkJCWlmICgqcCAhPSAnKCcpCisJCQkJCWNvbnRpbnVlOyAvKiBTeW50YXggZXJyb3I/ICovCisJCQkJZWxzZQorCQkJCQlwKys7CisJCQkJd2hpbGUgKGlzc3BhY2UoKnApKQorCQkJCQlwKys7CisJCQkJZSA9IHA7CisJCQkJd2hpbGUgKGlzYWxudW0oKmUpIHx8ICplID09ICdfJykKKwkJCQkJZSsrOworCQkJCSplID0gJ1wwJzsKKwkJCQlhZGRfbmV3X3N5bWJvbChzeW0sIHApOworCQkJfQorCQl9CisJCWZjbG9zZShmcCk7CisJfQorfQorCisvKgorICogRG9jdW1lbnQgYWxsIGV4dGVybmFsIG9yIGludGVybmFsIGZ1bmN0aW9ucyBpbiBhIGZpbGUuCisgKiBDYWxsIGtlcm5lbC1kb2Mgd2l0aCBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKyAqIGtlcm5lbC1kb2MgLWRvY2Jvb2sgLW5vZnVuY3Rpb24gZnVuY3Rpb25fbmFtZTEgZmlsZW5hbWUKKyAqIGZ1bmN0aW9uIG5hbWVzIGFyZSBvYnRhaW5lZCBmcm9tIGFsbCB0aGUgdGhlIHNyYyBmaWxlcworICogYnkgZmluZF9leHBvcnRfc3ltYm9scy4KKyAqIGludGZ1bmMgdXNlcyAtbm9mdW5jdGlvbgorICogZXh0ZnVuYyB1c2VzIC1mdW5jdGlvbgorICovCit2b2lkIGRvY2Z1bmN0aW9ucyhjaGFyICogZmlsZW5hbWUsIGNoYXIgKiB0eXBlKQoreworCWludCBpLGo7CisJaW50IHN5bWNudCA9IDA7CisJaW50IGlkeCA9IDA7CisJY2hhciAqKnZlYzsKKworCWZvciAoaT0wOyBpIDw9IHN5bWZpbGVjbnQ7IGkrKykKKwkJc3ltY250ICs9IHN5bWZpbGVsaXN0W2ldLnN5bWJvbGNudDsKKwl2ZWMgPSBtYWxsb2MoKDIgKyAyICogc3ltY250ICsgMikgKiBzaXplb2YoY2hhciopKTsKKwlpZiAodmVjID09IE5VTEwpIHsKKwkJcGVycm9yKCJkb2Nwcm9jOiAiKTsKKwkJZXhpdCgxKTsKKwl9CisJdmVjW2lkeCsrXSA9IEtFUk5FTERPQzsKKwl2ZWNbaWR4KytdID0gRE9DQk9PSzsKKwlmb3IgKGk9MDsgaSA8IHN5bWZpbGVjbnQ7IGkrKykgeworCQlzdHJ1Y3Qgc3ltZmlsZSAqIHN5bSA9ICZzeW1maWxlbGlzdFtpXTsKKwkJZm9yIChqPTA7IGogPCBzeW0tPnN5bWJvbGNudDsgaisrKSB7CisJCQl2ZWNbaWR4KytdICAgICA9IHR5cGU7CisJCQl2ZWNbaWR4KytdID0gc3ltLT5zeW1ib2xsaXN0W2pdLm5hbWU7CisJCX0KKwl9CisJdmVjW2lkeCsrXSAgICAgPSBmaWxlbmFtZTsKKwl2ZWNbaWR4XSA9IE5VTEw7CisJcHJpbnRmKCI8IS0tICVzIC0tPlxuIiwgZmlsZW5hbWUpOworCWV4ZWNfa2VybmVsX2RvYyh2ZWMpOworCWZmbHVzaChzdGRvdXQpOworCWZyZWUodmVjKTsKK30KK3ZvaWQgaW50ZnVuYyhjaGFyICogZmlsZW5hbWUpIHsJZG9jZnVuY3Rpb25zKGZpbGVuYW1lLCBOT0ZVTkNUSU9OKTsgfQordm9pZCBleHRmdW5jKGNoYXIgKiBmaWxlbmFtZSkgeyBkb2NmdW5jdGlvbnMoZmlsZW5hbWUsIEZVTkNUSU9OKTsgICB9CisKKy8qCisgKiBEb2N1bWVudCBzcOVlY2lmaWMgZnVuY3Rpb24ocykgaW4gYSBmaWxlLgorICogQ2FsbCBrZXJuZWwtZG9jIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICoga2VybmVsLWRvYyAtZG9jYm9vayAtZnVuY3Rpb24gZnVuY3Rpb24xIFstZnVuY3Rpb24gZnVuY3Rpb24yXQorICovCit2b2lkIHNpbmdmdW5jKGNoYXIgKiBmaWxlbmFtZSwgc2lnbmVkIGNoYXIgKiBsaW5lKQoreworCWNoYXIgKnZlY1syMDBdOyAvKiBFbm91Z2ggZm9yIHNwZWNpZmljIGZ1bmN0aW9ucyAqLworICAgICAgICBpbnQgaSwgaWR4ID0gMDsKKyAgICAgICAgaW50IHN0YXJ0b2ZzeW0gPSAxOworCXZlY1tpZHgrK10gPSBLRVJORUxET0M7CisJdmVjW2lkeCsrXSA9IERPQ0JPT0s7CisKKyAgICAgICAgLyogU3BsaXQgbGluZSB1cCBpbiBpbmRpdmlkdWFsIHBhcmFtZXRlcnMgcHJlY2VlZGVkIGJ5IEZVTkNUSU9OICovCisgICAgICAgIGZvciAoaT0wOyBsaW5lW2ldOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNzcGFjZShsaW5lW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZVtpXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydG9mc3ltID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRvZnN5bSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRvZnN5bSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZWNbaWR4KytdID0gRlVOQ1RJT047CisgICAgICAgICAgICAgICAgICAgICAgICB2ZWNbaWR4KytdID0gJmxpbmVbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJdmVjW2lkeCsrXSA9IGZpbGVuYW1lOworCXZlY1tpZHhdID0gTlVMTDsKKwlleGVjX2tlcm5lbF9kb2ModmVjKTsKK30KKworLyoKKyAqIFBhcnNlIGZpbGUsIGNhbGxpbmcgYWN0aW9uIHNwZWNpZmljIGZ1bmN0aW9ucyBmb3I6CisgKiAxKSBMaW5lcyBjb250YWluaW5nICFFCisgKiAyKSBMaW5lcyBjb250YWluaW5nICFJCisgKiAzKSBMaW5lcyBjb250YWluaW5nICFECisgKiA0KSBMaW5lcyBjb250YWluaW5nICFGCisgKiA1KSBEZWZhdWx0IGxpbmVzIC0gbGluZXMgbm90IG1hdGNoaW5nIHRoZSBhYm92ZQorICovCit2b2lkIHBhcnNlX2ZpbGUoRklMRSAqaW5maWxlKQoreworCWNoYXIgbGluZVtNQVhMSU5FU1pdOworCXNpZ25lZCBjaGFyICogczsKKwl3aGlsZShmZ2V0cyhsaW5lLCBNQVhMSU5FU1osIGluZmlsZSkpIHsKKwkJaWYgKGxpbmVbMF0gPT0gJyEnKSB7CisJCQlzID0gbGluZSArIDI7CisJCQlzd2l0Y2ggKGxpbmVbMV0pIHsKKwkJCQljYXNlICdFJzoKKwkJCQkJd2hpbGUgKCpzICYmICFpc3NwYWNlKCpzKSkgcysrOworCQkJCQkqcyA9ICdcMCc7CisJCQkJCWV4dGVybmFsZnVuY3Rpb25zKGxpbmUrMik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0knOgorCQkJCQl3aGlsZSAoKnMgJiYgIWlzc3BhY2UoKnMpKSBzKys7CisJCQkJCSpzID0gJ1wwJzsKKwkJCQkJaW50ZXJuYWxmdW5jdGlvbnMobGluZSsyKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnRCc6CisJCQkJCXdoaWxlICgqcyAmJiAhaXNzcGFjZSgqcykpIHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcyA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sc29ubHkobGluZSsyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQljYXNlICdGJzoKKwkJCQkJLyogZmlsZW5hbWUgKi8KKwkJCQkJd2hpbGUgKCpzICYmICFpc3NwYWNlKCpzKSkgcysrOworCQkJCQkqcysrID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdW5jdGlvbiBuYW1lcyAqLworCQkJCQl3aGlsZSAoaXNzcGFjZSgqcykpCisJCQkJCQlzKys7CisJCQkJCXNpbmdsZWZ1bmN0aW9ucyhsaW5lICsyLCBzKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJZGVmYXVsdGxpbmUobGluZSk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlkZWZhdWx0bGluZShsaW5lKTsKKwkJfQorCX0KKwlmZmx1c2goc3Rkb3V0KTsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCUZJTEUgKiBpbmZpbGU7CisJaWYgKGFyZ2MgIT0gMykgeworCQl1c2FnZSgpOworCQlleGl0KDEpOworCX0KKwkvKiBPcGVuIGZpbGUsIGV4aXQgb24gZXJyb3IgKi8KKwlpbmZpbGUgPSBmb3Blbihhcmd2WzJdLCAiciIpOworICAgICAgICBpZiAoaW5maWxlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRvY3Byb2M6ICIpOworICAgICAgICAgICAgICAgIHBlcnJvcihhcmd2WzJdKTsKKyAgICAgICAgICAgICAgICBleGl0KDIpOworICAgICAgICB9CisKKwlpZiAoc3RyY21wKCJkb2MiLCBhcmd2WzFdKSA9PSAwKQorCXsKKwkJLyogTmVlZCB0byBkbyB0aGlzIGluIHR3byBwYXNzZXMuCisJCSAqIEZpcnN0IHBhc3MgaXMgdXNlZCB0byBjb2xsZWN0IGFsbCBzeW1ib2xzIGV4cG9ydGVkCisJCSAqIGluIHRoZSB2YXJpb3VzIGZpbGVzLgorCQkgKiBTZWNvbmQgcGFzcyBnZW5lcmF0ZSB0aGUgZG9jdW1lbnRhdGlvbi4KKwkJICogVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIGZ1bmN0aW9uIGFyZSBkZWNsYXJlZAorCQkgKiBhbmQgZXhwb3J0ZWQgaW4gZGlmZmVyZW50IGZpbGVzIDotKCgKKwkJICovCisJCS8qIENvbGxlY3Qgc3ltYm9scyAqLworCQlkZWZhdWx0bGluZSAgICAgICA9IG5vYWN0aW9uOworCQlpbnRlcm5hbGZ1bmN0aW9ucyA9IGZpbmRfZXhwb3J0X3N5bWJvbHM7CisJCWV4dGVybmFsZnVuY3Rpb25zID0gZmluZF9leHBvcnRfc3ltYm9sczsKKwkJc3ltYm9sc29ubHkgICAgICAgPSBmaW5kX2V4cG9ydF9zeW1ib2xzOworCQlzaW5nbGVmdW5jdGlvbnMgICA9IG5vYWN0aW9uMjsKKwkJcGFyc2VfZmlsZShpbmZpbGUpOworCisJCS8qIFJld2luZCB0byBzdGFydCBmcm9tIGJlZ2lubmluZyBvZiBmaWxlIGFnYWluICovCisJCWZzZWVrKGluZmlsZSwgMCwgU0VFS19TRVQpOworCQlkZWZhdWx0bGluZSAgICAgICA9IHByaW50bGluZTsKKwkJaW50ZXJuYWxmdW5jdGlvbnMgPSBpbnRmdW5jOworCQlleHRlcm5hbGZ1bmN0aW9ucyA9IGV4dGZ1bmM7CisJCXN5bWJvbHNvbmx5ICAgICAgID0gcHJpbnRsaW5lOworCQlzaW5nbGVmdW5jdGlvbnMgICA9IHNpbmdmdW5jOworCisJCXBhcnNlX2ZpbGUoaW5maWxlKTsKKwl9CisJZWxzZSBpZiAoc3RyY21wKCJkZXBlbmQiLCBhcmd2WzFdKSA9PSAwKQorCXsKKwkJLyogQ3JlYXRlIGZpcnN0IHBhcnQgb2YgZGVwZW5kZW5jeSBjaGFpbgorCQkgKiBmaWxlLnRtcGwgKi8KKwkJcHJpbnRmKCIlc1x0IiwgYXJndlsyXSk7CisJCWRlZmF1bHRsaW5lICAgICAgID0gbm9hY3Rpb247CisJCWludGVybmFsZnVuY3Rpb25zID0gYWRkZGVwOworCQlleHRlcm5hbGZ1bmN0aW9ucyA9IGFkZGRlcDsKKwkJc3ltYm9sc29ubHkgICAgICAgPSBhZGRkZXA7CisJCXNpbmdsZWZ1bmN0aW9ucyAgID0gYWRkZGVwMjsKKwkJcGFyc2VfZmlsZShpbmZpbGUpOworCQlwcmludGYoIlxuIik7CisJfQorCWVsc2UKKwl7CisJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBvcHRpb246ICVzXG4iLCBhcmd2WzFdKTsKKwkJZXhpdCgxKTsKKwl9CisJZmNsb3NlKGluZmlsZSk7CisJZmZsdXNoKHN0ZG91dCk7CisJcmV0dXJuIGV4aXRzdGF0dXM7Cit9CisK