LyoKICB2bXNpZnkuYwoKICBNb2R1bGUgZm9yIHZtcyA8LT4gdW5peCBmaWxlIG5hbWUgY29udmVyc2lvbgoKICBXcml0dGVuIGJ5IEtsYXVzIEvkbXBmIChra2FlbXBmQHByb2dpcy5kZSkKICBvZiBwcm9HSVMgU29mdHdhcmUsIEFhY2hlbiwgR2VybWFueQoKKi8KCiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgojaWYgVk1TCiNpbmNsdWRlIDx1bml4bGliLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGpwaWRlZi5oPgojaW5jbHVkZSA8ZGVzY3JpcC5oPgojaW5jbHVkZSA8dWFpZGVmLmg+CiNpbmNsdWRlIDxzc2RlZi5oPgojaW5jbHVkZSA8c3RhcmxldC5oPgojaW5jbHVkZSA8bGliJHJvdXRpbmVzLmg+Ci8qIEluaXRpYWxpemUgYSBzdHJpbmcgZGVzY3JpcHRvciAoc3RydWN0IGRzYyRkZXNjcmlwdG9yX3MpIGZvciBhbgogICBhcmJpdHJhcnkgc3RyaW5nLiAgIEFERFIgaXMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIKICAgb2YgdGhlIHN0cmluZywgYW5kIExFTiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuICovCgojZGVmaW5lIElOSVRfRFNDX1MoZHNjLCBhZGRyLCBsZW4pIGRvIHsgXAogIChkc2MpLmRzYyRiX2R0eXBlID0gRFNDJEtfRFRZUEVfVDsgICAgXAogIChkc2MpLmRzYyRiX2NsYXNzID0gRFNDJEtfQ0xBU1NfUzsgICAgXAogIChkc2MpLmRzYyR3X2xlbmd0aCA9IChsZW4pOyAgICAgICAgICAgXAogIChkc2MpLmRzYyRhX3BvaW50ZXIgPSAoYWRkcik7ICAgICAgICAgXAp9IHdoaWxlICgwKQoKLyogSW5pdGlhbGl6ZSBhIHN0cmluZyBkZXNjcmlwdG9yIChzdHJ1Y3QgZHNjJGRlc2NyaXB0b3JfcykgZm9yIGEKICAgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nLiAgUyBpcyBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZzsgdGhlIGxlbmd0aAogICBpcyBkZXRlcm1pbmVkIGJ5IGNhbGxpbmcgc3RybGVuKCkuICovCgojZGVmaW5lIElOSVRfRFNDX0NTVFJJTkcoZHNjLCBzKSBJTklUX0RTQ19TKGRzYywgcywgc3RybGVuKHMpKQojZW5kaWYKCi8qCiAgY29weSAnZnJvbScgdG8gJ3RvJyB1cCB0byBidXQgbm90IGluY2x1ZGluZyAndXB0bycKICByZXR1cm4gMCBpZiBlb3Mgb24gZnJvbQogIHJldHVybiAxIGlmIHVwdG8gZm91bmQKCiAgcmV0dXJuICd0bycgYXQgbGFzdCBjaGFyICsgMQogIHJldHVybiAnZnJvbScgYXQgbWF0Y2ggKyAxIG9yIGVvcyBpZiBubyBtYXRjaAoKICBpZiBhc19kaXIgPT0gMSwgY2hhbmdlIGFsbCAnLicgdG8gJ18nCiAgZWxzZSBjaGFuZ2UgYWxsICcuJyBidXQgdGhlIGxhc3QgdG8gJ18nCiovCgpzdGF0aWMgaW50CmNvcHl0byAoY2hhciAqKnRvLCBjaGFyICoqZnJvbSwgY2hhciB1cHRvLCBpbnQgYXNfZGlyKQp7CiAgY2hhciAqczsKCiAgcyA9IHN0cnJjaHIgKCpmcm9tLCAnLicpOwoKICB3aGlsZSAoKipmcm9tKQogICAgewogICAgICBpZiAoKipmcm9tID09IHVwdG8pCgl7CgkgIGRvCgkgICAgewoJICAgICAgKCpmcm9tKSsrOwoJICAgIH0KCSAgd2hpbGUgKCoqZnJvbSA9PSB1cHRvKTsKCSAgcmV0dXJuIDE7Cgl9CiAgICAgIGlmICgqKmZyb20gPT0gJy4nKQoJewoJICBpZiAoKGFzX2RpciA9PSAxKQoJICAgICAgfHwgKCpmcm9tICE9IHMpKQoJICAgICoqdG8gPSAnXyc7CgkgIGVsc2UKCSAgICAqKnRvID0gJy4nOwoJfQogICAgICBlbHNlCgl7CgkgIGlmIChpc2xvd2VyICgqKmZyb20pKQoJICAgICoqdG8gPSB0b3VwcGVyICgqKmZyb20pOwoJICBlbHNlCgkgICAgKip0byA9ICoqZnJvbTsKCX0KICAgICAgKCp0bykrKzsKICAgICAgKCpmcm9tKSsrOwogICAgfQoKICByZXR1cm4gMDsKfQoKCi8qCiAgZ2V0IHRyYW5zbGF0aW9uIG9mIGxvZ2ljYWwgbmFtZQoKKi8KCnN0YXRpYyBjaGFyICoKdHJubG9nIChjaGFyICpuYW1lKQp7CiAgaW50IHN0YXQ7CiAgc3RhdGljIGNoYXIgcmVzbHRbMTAyNF07CiAgJERFU0NSSVBUT1IgKHJlc2x0X2RzYywgcmVzbHQpOwogIHNob3J0IHJlc2x0bGVuOwogIHN0cnVjdCBkc2MkZGVzY3JpcHRvcl9zIG5hbWVfZHNjOwogIGNoYXIgKnM7CgogIElOSVRfRFNDX0NTVFJJTkcgKG5hbWVfZHNjLCBuYW1lKTsKCiAgc3RhdCA9IGxpYiRzeXNfdHJubG9nICgmbmFtZV9kc2MsICZyZXNsdGxlbiwgJnJlc2x0X2RzYyk7CgogIGlmICgoc3RhdCYxKSA9PSAwKQogICAgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgaWYgKHN0YXQgPT0gU1MkX05PVFJBTikKICAgIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogIHJlc2x0W3Jlc2x0bGVuXSA9ICdcMCc7CgogIHMgPSAoY2hhciAqKW1hbGxvYyAocmVzbHRsZW4rMSk7CiAgaWYgKHMgPT0gMCkKICAgIHJldHVybiAiIjsKICBzdHJjcHkgKHMsIHJlc2x0KTsKICByZXR1cm4gczsKfQoKZW51bSBuYW1lc3RhdGUgeyBOX1NUQVJULCBOX0RFVklDRSwgTl9PUEVOLCBOX0RPVCwgTl9DTE9TRUQsIE5fRE9ORSB9OwoKLyoKICBjb252ZXJ0IHVuaXggc3R5bGUgbmFtZSB0byB2bXMgc3R5bGUKICB0eXBlID0gMCAtPiBuYW1lIGlzIGEgZnVsbCBuYW1lIChkaXJlY3RvcnkgYW5kIGZpbGVuYW1lIHBhcnQpCiAgdHlwZSA9IDEgLT4gbmFtZSBpcyBhIGRpcmVjdG9yeQogIHR5cGUgPSAyIC0+IG5hbWUgaXMgYSBmaWxlbmFtZSB3aXRob3V0IGRpcmVjdG9yeQoKICBUaGUgZm9sbG93aW5nIGNvbnZlcnNpb25zIGFyZSBhcHBsaWVkCgkJCSgwKQkJKDEpCQkJKDIpCglpbnB1dAkJZnVsbCBuYW1lCWRpciBuYW1lCQlmaWxlIG5hbWUKCjEJLi8JCTxjd2Q+CQlbXQkJCTxjdXJyZW50IGRpcmVjdG9yeT4uZGlyCjIJLi4vCQk8aG9tZSBvZiBjd2Q+CTxob21lIG9mIGN3ZD4JCTxob21lIG9mIGN3ZD4uZGlyCgozCS8vCQk8ZGV2IG9mIGN3ZD46CTxkZXYgb2YgY3dkPjpbMDAwMDAwXQk8ZGV2IG9mIGN3ZD46MDAwMDAwLmRpcgo0CS8vYQkJYToJCWE6CQkJYToKNQkvL2EvCQlhOgkJYToJCQlhOjAwMDAwMC5kaXIKCjkJLwkJWzAwMDAwMF0JWzAwMDAwMF0JCTAwMDAwMC5kaXIKMTAJL2EJCVswMDAwMDBdYQlbYV0JCQlbMDAwMDAwXWEKMTEJL2EvCQlbYV0JCVthXQkJCVswMDAwMDBdYS5kaXIKMTIJL2EvYgkJW2FdYgkJW2EuYl0JCQlbYV1iCjEzCS9hL2IvCQlbYS5iXQkJW2EuYl0JCQlbYV1iLmRpcgoxNAkvYS9iL2MJCVthLmJdYwkJW2EuYi5jXQkJCVthLmJdYwoxNQkvYS9iL2MvCQlbYS5iLmNdCQlbYS5iLmNdCQkJW2EuYl1jLmRpcgoKMTYJYQkJYQkJWy5hXQkJCWEKMTcJYS8JCVsuYV0JCVsuYV0JCQlhLmRpcgoxOAlhL2IJCVsuYV1iCQlbLmEuYl0JCQlbLmFdYgoxOQlhL2IvCQlbLmEuYl0JCVsuYS5iXQkJCVsuYV1iLmRpcgoyMAlhL2IvYwkJWy5hLmJdYwkJWy5hLmIuY10JCVsuYS5iXWMKMjEJYS9iL2MvCQlbLmEuYi5jXQlbLmEuYi5jXQkJWy5hLmJdYy5kaXIKCjIyCWEuYi5jCQlhX2IuYwkJWy5hX2JfY10JCWFfYl9jLmRpcgoKMjMJW3hdW3ldegkJW3gueV16CQlbeC55XXoJCQlbeC55XXoKMjQJW3hdWy55XXoJW3gueV16CQlbeC55XXoJCQlbeC55XXoKCjI1ICBmaWxlbmFtZXMgd2l0aCAnJCcgIGFyZSBsZWZ0IHVuY2hhbmdlZCBpZiB0aGV5IGNvbnRhaW4gbm8gJy8nCjI1ICBmaWxlbmFtZXMgd2l0aCAnOicgYXJlIGxlZnQgdW5jaGFuZ2VkCjI2ICBmaWxlbmFtZXMgd2l0aCBhIHNpbmdsZSBwYWlyIG9mICdbJyAnXScgYXJlIGxlZnQgdW5jaGFuZ2VkCgogIHRoZSBpbnB1dCBzdHJpbmcgaXMgbm90IHdyaXR0ZW4gdG8KKi8KCmNoYXIgKgp2bXNpZnkgKG5hbWUsIHR5cGUpCiAgICBjaGFyICpuYW1lOwogICAgaW50IHR5cGU7CnsKLyogbWF4IDI1NSBkZXZpY2UKICAgbWF4IDM5IGRpcmVjdG9yeQogICBtYXggMzkgZmlsZW5hbWUKICAgbWF4IDM5IGZpbGV0eXBlCiAgIG1heCA1IHZlcnNpb24KKi8KI2RlZmluZSBNQVhQQVRITEVOIDUxMgoKICBlbnVtIG5hbWVzdGF0ZSBuc3RhdGU7CiAgc3RhdGljIGNoYXIgdm1zbmFtZVtNQVhQQVRITEVOKzFdOwogIGNoYXIgKmZwdHI7CiAgY2hhciAqdnB0cjsKICBjaGFyICpzLCpzMTsKICBpbnQgYXNfZGlyOwogIGludCBjb3VudDsKCiAgaWYgKG5hbWUgPT0gMCkKICAgIHJldHVybiAwOwogIGZwdHIgPSBuYW1lOwogIHZwdHIgPSB2bXNuYW1lOwogIG5zdGF0ZSA9IE5fU1RBUlQ7CgogIC8qIGNhc2UgMjVhICovCgogIHMgPSBzdHJwYnJrIChuYW1lLCAiJDoiKTsKICBpZiAocyAhPSAwKQogICAgewogICAgICBpZiAoKnMgPT0gJyQnKQoJewoJICBpZiAoc3RyY2hyIChuYW1lLCAnLycpID09IDApCgkgICAgewoJICAgICAgcmV0dXJuIG5hbWU7CgkgICAgfQoJfQogICAgICBlbHNlCgl7CgkgIHJldHVybiBuYW1lOwoJfQogICAgfQoKICAvKiBjYXNlIDI2ICovCgogIHMgPSBzdHJjaHIgKG5hbWUsICdbJyk7CgogIGlmIChzICE9IDApCiAgICB7CiAgICAgIHMxID0gc3RyY2hyIChzKzEsICdbJyk7CiAgICAgIGlmIChzMSA9PSAwKQoJewoJICByZXR1cm4gbmFtZTsJCQkvKiBzaW5nbGUgWywga2VlcCB1bmNoYW5nZWQgKi8KCX0KICAgICAgczEtLTsKICAgICAgaWYgKCpzMSAhPSAnXScpCgl7CgkgIHJldHVybiBuYW1lOwkJCS8qIG5vdCBdWywga2VlcCB1bmNoYW5nZWQgKi8KCX0KCiAgICAgIC8qIHdlIGhhdmUgXVsgKi8KCiAgICAgIHMgPSBuYW1lOwoKICAgICAgLyogcyAgLT4gc3RhcnRpbmcgY2hhcgoJIHMxIC0+IGVuZGluZyAnXScgICovCgogICAgICBkbwoJewoJICBzdHJuY3B5ICh2cHRyLCBzLCBzMS1zKTsJLyogY29weSB1cCB0byBidXQgbm90IGluY2x1ZGluZyAnXScgKi8KCSAgdnB0ciArPSBzMS1zOwoJICBpZiAoKnMxID09IDApCgkgICAgYnJlYWs7CgkgIHMgPSBzMSArIDE7CQkJLyogcyAtPiBjaGFyIGJlaGluZCAnXScgKi8KCSAgaWYgKCpzICE9ICdbJykJCS8qIHdhcyAnXVsnID8gKi8KCSAgICBicmVhazsJCQkvKiBubywgbGFzdCBdIGZvdW5kLCBleGl0ICovCgkgIHMrKzsKCSAgaWYgKCpzICE9ICcuJykKCSAgICAqdnB0cisrID0gJy4nOwoJICBzMSA9IHN0cmNociAocywgJ10nKTsKCSAgaWYgKHMxID09IDApCQkJLyogbm8gY2xvc2luZyBdICovCgkgICAgczEgPSBzICsgc3RybGVuIChzKTsKCX0KICAgICAgd2hpbGUgKDEpOwoKICAgICAgKnZwdHIrKyA9ICddJzsKCiAgICAgIGZwdHIgPSBzOwoKICAgIH0KCiAgZWxzZQkJLyogbm8gWyBpbiBuYW1lICovCgogICAgewoKICAgICAgaW50IHN0YXRlOwogICAgICBpbnQgcm9vdGVkID0gMTsJLyogZmxhZyBpZiBsb2dpY2FsIGlzIHJvb3RlZCwgZWxzZSBpbnNlcnQgWzAwMDAwMF0gKi8KCiAgICAgIHN0YXRlID0gMDsKCiAgICAgIGRvCgl7CgogICAgICBzd2l0Y2ggKHN0YXRlKQoJewoJICBjYXNlIDA6CQkJCS8qIHN0YXJ0IG9mIGxvb3AgKi8KCSAgICBpZiAoKmZwdHIgPT0gJy8nKQoJICAgICAgewoJCWZwdHIrKzsKCQlzdGF0ZSA9IDE7CgkgICAgICB9CgkgICAgZWxzZSBpZiAoKmZwdHIgPT0gJy4nKQoJICAgICAgewoJCWZwdHIrKzsKCQlzdGF0ZSA9IDEwOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHN0YXRlID0gMjsKCSAgICBicmVhazsKCgkgIGNhc2UgMToJCQkJLyogJy8nIGF0IHN0YXJ0ICovCgkgICAgaWYgKCpmcHRyID09ICcvJykKCSAgICAgIHsKCQlmcHRyKys7CgkJc3RhdGUgPSAzOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHN0YXRlID0gNDsKCSAgICBicmVhazsKCgkgIGNhc2UgMjoJCQkJLyogbm8gJy8nIGF0IHN0YXJ0ICovCgkgICAgcyA9IHN0cmNociAoZnB0ciwgJy8nKTsKCSAgICBpZiAocyA9PSAwKQkJCS8qIG5vICcvJyAoMTYpICovCgkgICAgICB7CgkJaWYgKHR5cGUgPT0gMSkKCQkgIHsKCQkgICAgc3RyY3B5ICh2cHRyLCAiWy4iKTsKCQkgICAgdnB0ciArPSAyOwoJCSAgfQoJCWNvcHl0byAoJnZwdHIsICZmcHRyLCAwLCAodHlwZT09MSkpOwoJCWlmICh0eXBlID09IDEpCgkJICAqdnB0cisrID0gJ10nOwoJCXN0YXRlID0gLTE7CgkgICAgICB9CgkgICAgZWxzZQkJCS8qIGZvdW5kICcvJyAoMTcuLjIxKSAqLwoJICAgICAgewoJCWlmICgodHlwZSA9PSAyKQoJCSAgICAmJiAoKihzKzEpID09IDApKQkvKiAxNygyKSAqLwoJCSAgewoJCSAgICBjb3B5dG8gKCZ2cHRyLCAmZnB0ciwgJy8nLCAxKTsKCQkgICAgc3RhdGUgPSA3OwoJCSAgfQoJCWVsc2UKCQkgIHsKCQkgICAgc3RyY3B5ICh2cHRyLCAiWy4iKTsKCQkgICAgdnB0ciArPSAyOwoJCSAgICBjb3B5dG8gKCZ2cHRyLCAmZnB0ciwgJy8nLCAxKTsKCQkgICAgbnN0YXRlID0gTl9PUEVOOwoJCSAgICBzdGF0ZSA9IDk7CgkJICB9CgkgICAgICB9CgkgICAgYnJlYWs7CgoJICBjYXNlIDM6CQkJCS8qICcvLycgYXQgc3RhcnQgKi8KCSAgICB3aGlsZSAoKmZwdHIgPT0gJy8nKQkvKiBjb2xsYXBzZSBhbGwgJy8nICovCgkgICAgICBmcHRyKys7CgkgICAgaWYgKCpmcHRyID09IDApCQkvKiBqdXN0IC8vICovCgkgICAgICB7CgkJY2hhciBjd2RidWZbTUFYUEFUSExFTisxXTsKCgkJczEgPSBnZXRjd2QoY3dkYnVmLCBNQVhQQVRITEVOKTsKCQlpZiAoczEgPT0gMCkKCQkgIHsKCQkgICAgcmV0dXJuICIiOwkJLyogRklYTUUsIGVyciBnZXRjd2QgKi8KCQkgIH0KCQlzID0gc3RyY2hyIChzMSwgJzonKTsKCQlpZiAocyA9PSAwKQoJCSAgewoJCSAgICByZXR1cm4gIiI7CQkvKiBGSVhNRSwgZXJyIG5vIGRldmljZSAqLwoJCSAgfQoJCXN0cm5jcHkgKHZwdHIsIHMxLCBzLXMxKzEpOwoJCXZwdHIgKz0gcy1zMSsxOwoJCXN0YXRlID0gLTE7CgkJYnJlYWs7CgkgICAgICB9CgoJICAgIHMgPSB2cHRyOwoKCSAgICBpZiAoY29weXRvICgmdnB0ciwgJmZwdHIsICcvJywgMSkgPT0gMCkJLyogY29weSBkZXZpY2UgcGFydCAqLwoJICAgICAgewoJCSp2cHRyKysgPSAnOic7CgkJc3RhdGUgPSAtMTsKCQlicmVhazsKCSAgICAgIH0KCSAgICAqdnB0ciA9ICc6JzsKCSAgICBuc3RhdGUgPSBOX0RFVklDRTsKCSAgICBpZiAoKmZwdHIgPT0gMCkJLyoganVzdCAnLy9hLycgKi8KCSAgICAgIHsKCQlzdHJjcHkgKHZwdHIrMSwgIlswMDAwMDBdIik7CgkJdnB0ciArPSA5OwoJCXN0YXRlID0gLTE7CgkJYnJlYWs7CgkgICAgICB9CgkgICAgKnZwdHIgPSAwOwoJCQkJLyogY2hlY2sgbG9naWNhbCBmb3IgWzAwMDAwMF0gaW5zZXJ0aW9uICovCgkgICAgczEgPSB0cm5sb2cgKHMpOwoJICAgIGlmICgqczEgIT0gMCkKCSAgICAgIHsJCQkvKiBmb3VuZCB0cmFuc2xhdGlvbiAqLwoJCWNoYXIgKnMyOwoJCWZvciAoOzspCS8qIGxvb3Agb3ZlciBhbGwgbmVzdGVkIGxvZ2ljYWxzICovCgkJICB7CgkJICAgIHMyID0gczEgKyBzdHJsZW4gKHMxKSAtIDE7CgkJICAgIGlmICgqczIgPT0gJzonKQkvKiB0cmFuc2xhdGlvbiBlbmRzIGluICc6JyAqLwoJCSAgICAgIHsKCQkJczIgPSB0cm5sb2cgKHMxKTsKCQkJZnJlZSAoczEpOwoJCQlpZiAoKnMyID09IDApCgkJCSAgewoJCQkgICAgcm9vdGVkID0gMDsKCQkJICAgIGJyZWFrOwoJCQkgIH0KCQkJczEgPSBzMjsKCQkJY29udGludWU7CS8qIG5leHQgaXRlcmF0aW9uICovCgkJICAgICAgfQoJCSAgICBpZiAoKnMyID09ICddJykJLyogdHJhbnNsYXRpb24gZW5kcyBpbiAnXScgKi8KCQkgICAgICB7CgkJCWlmICgqKHMyLTEpID09ICcuJykJLyogZW5kcyBpbiAnLl0nICovCgkJCSAgewoJCQkgICAgaWYgKCFzdHJuZXEgKGZwdHIsICIwMDAwMDAiLCA2KSkKCQkJICAgICAgcm9vdGVkID0gMDsKCQkJICB9CgkJCWVsc2UKCQkJICB7CgkJCSAgICBzdHJjcHkgKHZtc25hbWUsIHMxKTsKCQkJICAgIHMgPSBzdHJjaHIgKHZtc25hbWUsICddJyk7CgkJCSAgICAqcyA9ICcuJzsKCQkJICAgIG5zdGF0ZSA9IE5fRE9UOwoJCQkgICAgdnB0ciA9IHM7CgkJCSAgfQoJCSAgICAgIH0KCQkgICAgYnJlYWs7CgkJICB9CgkJZnJlZSAoczEpOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHJvb3RlZCA9IDA7CgoJICAgIGlmICgqdnB0ciA9PSAwKQoJICAgICAgewoJCW5zdGF0ZSA9IE5fREVWSUNFOwoJICAgICAgICAqdnB0cisrID0gJzonOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHZwdHIrKzsKCgkgICAgaWYgKHJvb3RlZCA9PSAwKQoJICAgICAgewoJICAgICAgICBzdHJjcHkgKHZwdHIsICJbMDAwMDAwLiIpOwoJCXZwdHIgKz0gODsKCQlzMSA9IHZwdHItMTsKCQluc3RhdGUgPSBOX0RPVDsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICBzMSA9IDA7CgoJLyogczEtPiAnLicgYWZ0ZXIgMDAwMDAwIG9yIE5VTEwgKi8KCgkgICAgcyA9IHN0cmNociAoZnB0ciwgJy8nKTsKCSAgICBpZiAocyA9PSAwKQoJICAgICAgewkJCQkvKiBubyBuZXh0ICcvJyAqLwoJCWlmICgqKHZwdHItMSkgPT0gJy4nKQoJCSAgKih2cHRyLTEpID0gJ10nOwoJCWVsc2UgaWYgKHJvb3RlZCA9PSAwKQoJCSAgKnZwdHIrKyA9ICddJzsKCQljb3B5dG8gKCZ2cHRyLCAmZnB0ciwgMCwgKHR5cGUgPT0gMSkpOwoJCXN0YXRlID0gLTE7CgkJYnJlYWs7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgewoJCXdoaWxlICgqKHMrMSkgPT0gJy8nKQkvKiBza2lwIG11bHRpcGxlICcvJyAqLwoJCSAgcysrOwoJICAgICAgfQoKCSAgICBpZiAoKHJvb3RlZCAhPSAwKQoJICAgICAgICAmJiAoKih2cHRyLTEpICE9ICcuJykpCgkgICAgICB7CgkJKnZwdHIrKyA9ICdbJzsKCQluc3RhdGUgPSBOX0RPVDsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICBpZiAoKG5zdGF0ZSA9PSBOX0RPVCkKCQkgJiYgKHMxICE9IDApCgkJICYmICgqKHMrMSkgPT0gMCkpCgkJewoJCSAgaWYgKHR5cGUgPT0gMikKCQkgICAgewoJCSAgICAgICpzMSA9ICddJzsKCQkgICAgICBuc3RhdGUgPSBOX0NMT1NFRDsKCQkgICAgfQoJCX0KCSAgICBzdGF0ZSA9IDk7CgkgICAgYnJlYWs7CgoJICBjYXNlIDQ6CQkJCS8qIHNpbmdsZSAnLycgYXQgc3RhcnQgKDkuLjE1KSAqLwoJICAgIGlmICgqZnB0ciA9PSAwKQoJICAgICAgc3RhdGUgPSA1OwoJICAgIGVsc2UKCSAgICAgIHN0YXRlID0gNjsKCSAgICBicmVhazsKCgkgIGNhc2UgNToJCQkJLyoganVzdCAnLycgYXQgc3RhcnQgKDkpICovCgkgICAgaWYgKHR5cGUgIT0gMikKCSAgICAgIHsKCSAgICAgICAgKnZwdHIrKyA9ICdbJzsKCQluc3RhdGUgPSBOX09QRU47CgkgICAgICB9CgkgICAgc3RyY3B5ICh2cHRyLCAiMDAwMDAwIik7CgkgICAgdnB0ciArPSA2OwoJICAgIGlmICh0eXBlID09IDIpCgkgICAgICBzdGF0ZSA9IDc7CgkgICAgZWxzZQoJICAgICAgc3RhdGUgPSA4OwoJICAgIGJyZWFrOwoKCSAgY2FzZSA2OgkJCQkvKiBjaGFycyBmb2xsb3dpbmcgJy8nIGF0IHN0YXJ0IDEwLi4xNSAqLwoJICAgICp2cHRyKysgPSAnWyc7CgkgICAgbnN0YXRlID0gTl9PUEVOOwoJICAgIHMgPSBzdHJjaHIgKGZwdHIsICcvJyk7CgkgICAgaWYgKHMgPT0gMCkJCQkvKiAxMCAqLwoJICAgICAgewoJCWlmICh0eXBlICE9IDEpCgkJICB7CgkJICAgIHN0cmNweSAodnB0ciwgIjAwMDAwMF0iKTsKCQkgICAgdnB0ciArPSA3OwoJCSAgfQoJCWNvcHl0byAoJnZwdHIsICZmcHRyLCAwLCAodHlwZSA9PSAxKSk7CgkJaWYgKHR5cGUgPT0gMSkKCQkgIHsKCQkgICAgKnZwdHIrKyA9ICddJzsKCQkgIH0KCQlzdGF0ZSA9IC0xOwoJICAgICAgfQoJICAgIGVsc2UJCQkvKiAxMS4uMTUgKi8KCSAgICAgIHsKCQlpZiAoICh0eXBlID09IDIpCgkJICAgJiYgKCoocysxKSA9PSAwKSkJLyogMTEoMikgKi8KCQkgIHsKCQkgICAgc3RyY3B5ICh2cHRyLCAiMDAwMDAwXSIpOwoJCSAgICBuc3RhdGUgPSBOX0NMT1NFRDsKCQkgICAgdnB0ciArPSA3OwoJCSAgfQoJCWNvcHl0byAoJnZwdHIsICZmcHRyLCAnLycsICgqKHZwdHItMSkgIT0gJ10nKSk7CgkJc3RhdGUgPSA5OwoJICAgICAgfQoJICAgIGJyZWFrOwoKCSAgY2FzZSA3OgkJCQkvKiBhZGQgJy5kaXInIGFuZCBleGl0ICovCgkgICAgaWYgKChuc3RhdGUgPT0gTl9PUEVOKQoJCXx8IChuc3RhdGUgPT0gTl9ET1QpKQoJICAgICAgewoJCXMgPSB2cHRyLTE7CgkJd2hpbGUgKHMgPiB2bXNuYW1lKQoJCSAgewoJCSAgICBpZiAoKnMgPT0gJ10nKQoJCSAgICAgIHsKCQkJYnJlYWs7CgkJICAgICAgfQoJCSAgICBpZiAoKnMgPT0gJy4nKQoJCSAgICAgIHsKCQkJKnMgPSAnXSc7CgkJCWJyZWFrOwoJCSAgICAgIH0KCQkgICAgcy0tOwoJCSAgfQoJICAgICAgfQoJICAgIHN0cmNweSAodnB0ciwgIi5kaXIiKTsKCSAgICB2cHRyICs9IDQ7CgkgICAgc3RhdGUgPSAtMTsKCSAgICBicmVhazsKCgkgIGNhc2UgODoJCQkJLyogYWRkICddJyBhbmQgZXhpdCAqLwoJICAgICp2cHRyKysgPSAnXSc7CgkgICAgc3RhdGUgPSAtMTsKCSAgICBicmVhazsKCgkgIGNhc2UgOToJCQkJLyogMTcuLjIxLCBmcHRyIC0+IDFzdCAnLycgKyAxICovCgkgICAgaWYgKCpmcHRyID09IDApCgkgICAgICB7CgkJaWYgKHR5cGUgPT0gMikKCQkgIHsKCQkgICAgc3RhdGUgPSA3OwoJCSAgfQoJCWVsc2UKCQkgIHN0YXRlID0gODsKCQlicmVhazsKCSAgICAgIH0KCSAgICBzID0gc3RyY2hyIChmcHRyLCAnLycpOwoJICAgIGlmIChzID09IDApCgkgICAgICB7CgkJaWYgKHR5cGUgIT0gMSkKCQkgIHsKCQkgICAgaWYgKG5zdGF0ZSA9PSBOX09QRU4pCgkJICAgICAgewoJCQkqdnB0cisrID0gJ10nOwoJCQluc3RhdGUgPSBOX0NMT1NFRDsKCQkgICAgICB9CgkJICAgIGFzX2RpciA9IDA7CgkJICB9CgkJZWxzZQoJCSAgewoJCSAgICBpZiAobnN0YXRlID09IE5fT1BFTikKCQkgICAgICB7CgkJCSp2cHRyKysgPSAnLic7CgkJCW5zdGF0ZSA9IE5fRE9UOwoJCSAgICAgIH0KCQkgICAgYXNfZGlyID0gMTsKCQkgIH0KCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB7CgkJd2hpbGUgKCoocysxKSA9PSAnLycpCgkJICBzKys7CgkJaWYgKCAodHlwZSA9PSAyKQoJCSAgICAmJiAoKihzKzEpID09IDApKQkJLyogMTkoMiksIDIxKDIpKi8KCQkgIHsKCQkgICAgaWYgKG5zdGF0ZSAhPSBOX0NMT1NFRCkKCQkgICAgICB7CgkJCSp2cHRyKysgPSAnXSc7CgkJCW5zdGF0ZSA9IE5fQ0xPU0VEOwoJCSAgICAgIH0KCQkgICAgYXNfZGlyID0gMTsKCQkgIH0KCQllbHNlCgkJICB7CgkJICAgIGlmIChuc3RhdGUgPT0gTl9PUEVOKQoJCSAgICAgIHsKCQkJKnZwdHIrKyA9ICcuJzsKCQkJbnN0YXRlID0gTl9ET1Q7CgkJICAgICAgfQoJCSAgICBhc19kaXIgPSAxOwoJCSAgfQoJICAgICAgfQoJICAgIGlmICggKCpmcHRyID09ICcuJykJCQkvKiBjaGVjayBmb3IgJy4uJyBvciAnLi4vJyAqLwoJCSYmICgqKGZwdHIrMSkgPT0gJy4nKQoJCSYmICgoKihmcHRyKzIpID09ICcvJykKCQkgICAgfHwgKCooZnB0cisyKSA9PSAwKSkgKQoJICAgICAgewoJCWZwdHIgKz0gMjsKCQlpZiAoKmZwdHIgPT0gJy8nKQoJCSAgewoJCSAgICBkbwoJCSAgICAgIHsKCQkJZnB0cisrOwoJCSAgICAgIH0KCQkgICAgd2hpbGUgKCpmcHRyID09ICcvJyk7CgkJICB9CgkJZWxzZSBpZiAoKmZwdHIgPT0gMCkKCQkgIHR5cGUgPSAxOwoJCXZwdHItLTsJCQkJLyogdnB0ciAtPiAnLicgb3IgJ10nICovCgkJczEgPSB2cHRyOwoJCWZvciAoOzspCgkJICB7CgkJICAgIHMxLS07CgkJICAgIGlmICgqczEgPT0gJy4nKQkJLyogb25lIGJhY2sgKi8KCQkgICAgICB7CgkJCXZwdHIgPSBzMTsKCQkJbnN0YXRlID0gTl9PUEVOOwoJCQlicmVhazsKCQkgICAgICB9CgkJICAgIGlmICgqczEgPT0gJ1snKQkJLyogdG9wIGxldmVsIHJlYWNoZWQgKi8KCQkgICAgICB7CgkJCWlmICgqZnB0ciA9PSAwKQoJCQkgIHsKCQkJICAgIHN0cmNweSAoczEsICJbMDAwMDAwXSIpOwoJCQkgICAgdnB0ciA9IHMxICsgODsKCQkJICAgIG5zdGF0ZSA9IE5fQ0xPU0VEOwoJCQkgICAgcyA9IDA7CgkJCSAgICBicmVhazsKCQkJICB9CgkJCWVsc2UKCQkJICB7CgkJCSAgICB2cHRyID0gczErMTsKCQkJICAgIG5zdGF0ZSA9IE5fT1BFTjsKCQkJICAgIGJyZWFrOwoJCQkgIH0KCQkgICAgICB9CgkJICB9CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgewoJCWNvcHl0byAoJnZwdHIsICZmcHRyLCAnLycsIGFzX2Rpcik7CgkJaWYgKG5zdGF0ZSA9PSBOX0RPVCkKCQkgIG5zdGF0ZSA9IE5fT1BFTjsKCSAgICAgIH0KCSAgICBpZiAocyA9PSAwKQoJICAgICAgewkJCQkJLyogMTgsMjAgKi8KCQlpZiAodHlwZSA9PSAxKQoJCSAgKnZwdHIrKyA9ICddJzsKCQlzdGF0ZSA9IC0xOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHsKCQlpZiAoKihzKzEpID09IDApCgkJICB7CgkJICAgIGlmICh0eXBlID09IDIpCQkvKiAxOSwyMSAqLwoJCSAgICAgIHsKCQkgICAgICAgIHN0YXRlID0gNzsKCQkgICAgICB9CgkJICAgIGVsc2UKCQkgICAgICB7CgkJCSp2cHRyKysgPSAnXSc7CgkJCXN0YXRlID0gLTE7CgkJICAgICAgfQoJCSAgfQoJICAgICAgfQoJICAgIGJyZWFrOwoKCSAgY2FzZSAxMDoJCQkJLyogMSwyIGZpcnN0IGlzICcuJyAqLwoJICAgIGlmICgqZnB0ciA9PSAnLicpCgkgICAgICB7CgkJZnB0cisrOwoJCXN0YXRlID0gMTE7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgc3RhdGUgPSAxMjsKCSAgICBicmVhazsKCgkgIGNhc2UgMTE6CQkJCS8qIDIsICcuLicgYXQgc3RhcnQgKi8KCSAgICBjb3VudCA9IDE7CgkgICAgaWYgKCpmcHRyICE9IDApCgkgICAgICB7CgkJaWYgKCpmcHRyICE9ICcvJykJCS8qIGdvdCAuLnh4eCAqLwoJCSAgewoJCSAgICByZXR1cm4gbmFtZTsKCQkgIH0KCQlkbwkJCQkvKiBnb3QgLi4vICovCgkJICB7CgkJICAgIGZwdHIrKzsKCQkgICAgd2hpbGUgKCpmcHRyID09ICcvJykgZnB0cisrOwoJCSAgICBpZiAoKmZwdHIgIT0gJy4nKQoJCSAgICAgIGJyZWFrOwoJCSAgICBpZiAoKihmcHRyKzEpICE9ICcuJykKCQkgICAgICBicmVhazsKCQkgICAgZnB0ciArPSAyOwoJCSAgICBpZiAoKCpmcHRyID09IDApCgkJCXx8ICgqZnB0ciA9PSAnLycpKQoJCSAgICAgIGNvdW50Kys7CgkJICB9CgkJd2hpbGUgKCpmcHRyID09ICcvJyk7CgkgICAgICB9CgkgICAgewkJCQkJLyogZ290ICcuLicgb3IgJy4uLycgKi8KCSAgICAgIG5zdGF0ZSA9IE5fT1BFTjsKCSAgICAgICp2cHRyKysgPSAnWyc7CgkgICAgICB3aGlsZSAoY291bnQtLSkKCQkqdnB0cisrID0gJy0nOwoKCSAgICAgIGlmICgqZnB0ciA9PSAwKQkvKiBoYWQgJy4uJyBvciAnLi4vJyAqLwoJCXsKCQkgICp2cHRyKysgPSAnXSc7CgkJICBzdGF0ZSA9IC0xOwoJCX0KCSAgICAgIGVsc2UJCQkvKiBoYWQgJy4uL3h4eCcgKi8KCQl7CgkJICBzdGF0ZSA9IDk7CgkJfQoJICAgICAgKnZwdHIgPSAwOwoJICAgIH0KCSAgICBicmVhazsKCgkgIGNhc2UgMTI6CQkJCS8qIDEsICcuJyBhdCBzdGFydCAqLwoJICAgIGlmICgqZnB0ciAhPSAwKQoJICAgICAgewoJCWlmICgqZnB0ciAhPSAnLycpCgkJICB7CgkJICAgIHJldHVybiBuYW1lOwoJCSAgfQoJCWZwdHIrKzsKCSAgICAgIH0KCgkgICAgaWYgKCpmcHRyKQoJICAgICAgewoJCXN0YXRlID0gOTsKCgkJc3dpdGNoICh0eXBlKQoJCSAgewoJCSAgY2FzZSAwOgoJCSAgICBuc3RhdGUgPSBOX0NMT1NFRDsKCQkgICAgKnZwdHIrKyA9ICdbJzsKCQkgICAgKnZwdHIrKyA9ICddJzsKCQkgICAgYnJlYWs7CgoJCSAgY2FzZSAxOgoJCSAgICBuc3RhdGUgPSBOX09QRU47CgkJICAgICp2cHRyKysgPSAnWyc7CgkJICAgIGJyZWFrOwoKCQkgIGNhc2UgMjoKCQkgICAgbnN0YXRlID0gTl9DTE9TRUQ7CgkJICAgIGJyZWFrOwoJCSAgfQoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHsKCQlpZiAodHlwZSA9PSAxKQoJCSAgewoJCSAgICAqdnB0cisrID0gJ1snOwoJCSAgICAqdnB0cisrID0gJ10nOwoJCSAgICBzdGF0ZSA9IC0xOwoJCSAgfQoJCWVsc2UKCQkgIHsKCQkgICAgY2hhciBjd2RidWZbTUFYUEFUSExFTisxXTsKCgkJICAgIHMxID0gZ2V0Y3dkKGN3ZGJ1ZiwgTUFYUEFUSExFTik7CgkJICAgIGlmIChzMSA9PSAwKQoJCSAgICAgIHsKCQkJcmV0dXJuICJmb28iOwkgICAgLypGSVhNRSwgZXJyIGdldGN3ZCAqLwoJCSAgICAgIH0KCQkgICAgc3RyY3B5ICh2cHRyLCBzMSk7CgkJICAgIHZwdHIgKz0gc3RybGVuICh2cHRyKTsKCgkJICAgIGlmICh0eXBlID09IDIpCgkJICAgICAgewoJCQlzID0gdnB0cjsKCQkJd2hpbGUgKHMgPiB2bXNuYW1lKQoJCQkgIHsKCQkJICAgIGlmICgqcyA9PSAnLicpCgkJCSAgICAgIHsKCQkJCSpzID0gJ10nOwoJCQkJdnB0ci0tOwoJCQkJYnJlYWs7CgkJCSAgICAgIH0KCgkJCSAgICBpZiAoKnMgPT0gJ1snKQoJCQkgICAgICB7CgkJCQlpbnQgaTsKCQkJCWNoYXIgKnQgPSB2cHRyIC0gMjsKCQkJCXdoaWxlICh0ID4gcykKCQkJCSAgewoJCQkJICAgICoodCs3KSA9ICp0OwoJCQkJICAgIHQtLTsKCQkJCSAgfQoJCQkJcysrOwoJCQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKCQkJCSAgKnMrKyA9ICcwJzsKCQkJCSpzID0gJ10nOwoJCQkJdnB0ciArPSA2OwoJCQkJYnJlYWs7CgkJCSAgICAgIH0KCQkJICAgIHMtLTsKCQkJICB9CgoJCQlzdHJjcHkgKHZwdHIsICIuZGlyIik7CgkJCXZwdHIgKz0gNDsKCQkgICAgICB9CgoJCSAgICBzdGF0ZSA9IC0xOwoJCSAgfQoJICAgICAgfQoJICAgIGJyZWFrOwoJfQoKCX0KICAgICAgd2hpbGUgKHN0YXRlID4gMCk7CgoKICAgIH0KCgogIC8qIGRpcmVjdG9yeSBjb252ZXJzaW9uIGRvbmUKICAgICBmcHRyIC0+IGZpbGVuYW1lIHBhcnQgb2YgaW5wdXQgc3RyaW5nCiAgICAgdnB0ciAtPiBmcmVlIHNwYWNlIGluIHZtc25hbWUKICAqLwoKICAqdnB0cisrID0gMDsKCiAgcmV0dXJuIHZtc25hbWU7Cn0KCgoKLyoKICBjb252ZXJ0IGZyb20gdm1zLXN0eWxlIHRvIHVuaXgtc3R5bGUKCiAgZGV2OltkaXIxLmRpcjJdCS8vZGV2L2RpcjEvZGlyMi8KKi8KCmNoYXIgKgp1bml4aWZ5IChjaGFyICpuYW1lKQp7CiAgc3RhdGljIGNoYXIgcGllY2VbNTEyXTsKICBjaGFyICpzLCAqcDsKCiAgaWYgKHN0cmNociAobmFtZSwgJy8nKSAhPSAwKQkJLyogYWxyZWFkeSBpbiB1bml4IHN0eWxlICovCiAgICByZXR1cm4gbmFtZTsKCiAgcCA9IHBpZWNlOwogICpwID0gMDsKCiAgLyogZGV2aWNlIHBhcnQgKi8KCiAgcyA9IHN0cmNociAobmFtZSwgJzonKTsKCiAgaWYgKHMgIT0gMCkKICAgIHsKICAgICAgKnMgPSAwOwogICAgICAqcCsrID0gJy8nOwogICAgICAqcCsrID0gJy8nOwogICAgICBzdHJjcHkgKHAsIG5hbWUpOwogICAgICBwICs9IHN0cmxlbiAocCk7CiAgICAgICpzID0gJzonOwogICAgfQoKICAvKiBkaXJlY3RvcnkgcGFydCAqLwoKICAqcCsrID0gJy8nOwogIHMgPSBzdHJjaHIgKG5hbWUsICdbJyk7CgogIGlmIChzICE9IDApCiAgICB7CiAgICAgIHMrKzsKICAgICAgc3dpdGNoICgqcykKICAgICAgICB7CgkgIGNhc2UgJ10nOgkJLyogW10gKi8KCSAgICBzdHJjYXQgKHAsICIuLyIpOwoJICAgIGJyZWFrOwoJICBjYXNlICctJzoJCS8qIFstICovCgkgICAgc3RyY2F0IChwLCAiLi4vIik7CgkgICAgYnJlYWs7CgkgIGNhc2UgJy4nOgoJICAgIHN0cmNhdCAocCwgIi4vIik7CS8qIFsuICovCgkgICAgYnJlYWs7CgkgIGRlZmF1bHQ6CgkgICAgcy0tOwoJICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgcysrOwogICAgICB3aGlsZSAoKnMpCiAgICAgICAgewoJICBpZiAoKnMgPT0gJy4nKQoJICAgICpwKysgPSAnLyc7CgkgIGVsc2UKCSAgICAqcCsrID0gKnM7CgkgIHMrKzsKCSAgaWYgKCpzID09ICddJykKCSAgICB7CgkgICAgICBzKys7CgkgICAgICBicmVhazsKCSAgICB9CiAgICAgICAgfQogICAgICBpZiAoKnMgIT0gMCkJCS8qIG1vcmUgYWZ0ZXIgJ10nID8/ICovCiAgICAgICAgewoJICBpZiAoKihwLTEpICE9ICcvJykKCSAgICAqcCsrID0gJy8nOwoJICBzdHJjcHkgKHAsIHMpOwkJLyogY29weSBpdCBhbnl3YXkgKi8KICAgICAgICB9CiAgICB9CgogIGVsc2UJCS8qIG5vICdbJyBhbnl3aGVyZSAqLwoKICAgIHsKICAgICAgKnArKyA9IDA7CiAgICB9CgogIC8qIGZvcmNlIGVuZCB3aXRoICcvJyAqLwoKICBpZiAoKihwLTEpICE9ICcvJykKICAgICpwKysgPSAnLyc7CiAgKnAgPSAwOwoKICByZXR1cm4gcGllY2U7Cn0KCi8qIEVPRiAqLwo=