LyoKICogJFJDU0lkOiB4Yy9saWIvZm9udGNvbmZpZy9mYy1sYW5nL2ZjLWxhbmcuYyx2IDEuMyAyMDAyLzA4LzIyIDA3OjM2OjQzIGtlaXRocCBFeHAgJAogKgogKiBDb3B5cmlnaHQgqSAyMDAyIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlICJmY2ludC5oIgojaW5jbHVkZSAiZmNjaGFyc2V0LmMiCiNpbmNsdWRlICJmY3N0ci5jIgoKLyoKICogZmMtbGFuZwogKgogKiBSZWFkIGEgc2V0IG9mIGxhbmd1YWdlIG9ydGhvZ3JhcGhpZXMgYW5kIGJ1aWxkIEMgZGVjbGFyYXRpb25zIGZvcgogKiBjaGFyc2V0cyB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHdoaWNoIGxhbmd1YWdlcyBhcmUKICogc3VwcG9ydGVkIGJ5IGEgZ2l2ZW4gZm9udC4gIE5vdGUgdGhhdCB0aGlzIHVzZXMgc29tZSB1dGlsaXRpZXMKICogZnJvbSB0aGUgZm9udGNvbmZpZyBsaWJyYXJ5LCBzbyB0aGUgbmVjZXNzYXJ5IGZpbGUgaXMgc2ltcGx5CiAqIGluY2x1ZGVkIGluIHRoaXMgY29tcGlsYXRpb24uICBBIGNvdXBsZSBvZiBleHRyYSB1dGlsaXR5CiAqIGZ1bmN0aW9ucyBhcmUgYWxzbyBuZWVkZWQgaW4gc2xpZ2h0bHkgbW9kaWZpZWQgZm9ybQogKi8KCnZvaWQKRmNNZW1BbGxvYyAoaW50IGtpbmQsIGludCBzaXplKQp7Cn0KCnZvaWQKRmNNZW1GcmVlIChpbnQga2luZCwgaW50IHNpemUpCnsKfQoKRmNDaGFyOCAqCkZjQ29uZmlnSG9tZSAodm9pZCkKewogICAgcmV0dXJuIGdldGVudiAoIkhPTUUiKTsKfQoKc3RhdGljIHZvaWQgCmZhdGFsIChjaGFyICpmaWxlLCBpbnQgbGluZW5vLCBjaGFyICptc2cpCnsKICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVkOiAlc1xuIiwgZmlsZSwgbGluZW5vLCBtc2cpOwogICAgZXhpdCAoMSk7Cn0KCnN0YXRpYyBjaGFyICoKZ2V0X2xpbmUgKEZJTEUgKmYsIGNoYXIgKmxpbmUsIGludCAqbGluZW5vKQp7CiAgICBjaGFyICAgICpoYXNoOwogICAgaWYgKCFmZ2V0cyAobGluZSwgMTAyNCwgZikpCglyZXR1cm4gMDsKICAgICsrKCpsaW5lbm8pOwogICAgaGFzaCA9IHN0cmNociAobGluZSwgJyMnKTsKICAgIGlmIChoYXNoKQoJKmhhc2ggPSAnXDAnOwogICAgaWYgKGxpbmVbMF0gPT0gJ1wwJyB8fCBsaW5lWzBdID09ICdcbicgfHwgbGluZVswXSA9PSAnXDAzMicgfHwgbGluZVswXSA9PSAnXHInKQoJcmV0dXJuIGdldF9saW5lIChmLCBsaW5lLCBsaW5lbm8pOwogICAgcmV0dXJuIGxpbmU7Cn0KCmNoYXIJKmRpciA9IDA7CgpzdGF0aWMgRklMRSAqCnNjYW5vcGVuIChjaGFyICpmaWxlKQp7CiAgICBGSUxFICAgICpmOwoKICAgIGYgPSBmb3BlbiAoZmlsZSwgInIiKTsKICAgIGlmICghZiAmJiBkaXIpCiAgICB7CgljaGFyCXBhdGhbMTAyNF07CgkKCXN0cmNweSAocGF0aCwgZGlyKTsKCXN0cmNhdCAocGF0aCwgIi8iKTsKCXN0cmNhdCAocGF0aCwgZmlsZSk7CglmID0gZm9wZW4gKHBhdGgsICJyIik7CiAgICB9CiAgICByZXR1cm4gZjsKfQoKLyoKICogYnVpbGQgYSBzaW5nbGUgY2hhcnNldCBmcm9tIGEgc291cmNlIGZpbGUKICoKICogVGhlIGZpbGUgZm9ybWF0IGlzIHF1aXRlIHNpbXBsZSwgZWl0aGVyCiAqIGEgc2luZ2xlIGhleCB2YWx1ZSBvciBhIHBhaXIgc2VwYXJhdGVkIHdpdGggYSBkYXNoCiAqCiAqIENvbW1lbnRzIGJlZ2luIHdpdGggJyMnCiAqLwoKc3RhdGljIEZjQ2hhclNldCAqCnNjYW4gKEZJTEUgKmYsIGNoYXIgKmZpbGUpCnsKICAgIEZjQ2hhclNldAkqYyA9IDA7CiAgICBGY0NoYXJTZXQJKm47CiAgICBpbnQJCXN0YXJ0LCBlbmQsIHVjczQ7CiAgICBjaGFyCWxpbmVbMTAyNF07CiAgICBpbnQJCWxpbmVubyA9IDA7CgogICAgd2hpbGUgKGdldF9saW5lIChmLCBsaW5lLCAmbGluZW5vKSkKICAgIHsKCWlmICghc3RybmNtcCAobGluZSwgImluY2x1ZGUiLCA3KSkKCXsKCSAgICBmaWxlID0gc3RyY2hyIChsaW5lLCAnICcpOwoJICAgIHdoaWxlICgqZmlsZSA9PSAnICcpCgkJZmlsZSsrOwoJICAgIGVuZCA9IHN0cmxlbiAoZmlsZSk7CgkgICAgaWYgKGZpbGVbZW5kLTFdID09ICdcbicpCgkJZmlsZVtlbmQtMV0gPSAnXDAnOwoJICAgIGYgPSBzY2Fub3BlbiAoZmlsZSk7CgkgICAgaWYgKCFmKQoJCWZhdGFsIChmaWxlLCAwLCAiY2FuJ3Qgb3BlbiIpOwoJICAgIGMgPSBzY2FuIChmLCBmaWxlKTsKCSAgICBmY2xvc2UgKGYpOwoJICAgIHJldHVybiBjOwoJfQoJaWYgKHN0cmNociAobGluZSwgJy0nKSkKCXsKCSAgICBpZiAoc3NjYW5mIChsaW5lLCAiJXgtJXgiLCAmc3RhcnQsICZlbmQpICE9IDIpCgkJZmF0YWwgKGZpbGUsIGxpbmVubywgInBhcnNlIGVycm9yIik7Cgl9CgllbHNlCgl7CgkgICAgaWYgKHNzY2FuZiAobGluZSwgIiV4IiwgJnN0YXJ0KSAhPSAxKQoJCWZhdGFsIChmaWxlLCBsaW5lbm8sICJwYXJzZSBlcnJvciIpOwoJICAgIGVuZCA9IHN0YXJ0OwoJfQoJaWYgKCFjKQoJICAgIGMgPSBGY0NoYXJTZXRDcmVhdGUgKCk7Cglmb3IgKHVjczQgPSBzdGFydDsgdWNzNCA8PSBlbmQ7IHVjczQrKykKCXsKCSAgICBpZiAoIUZjQ2hhclNldEFkZENoYXIgKGMsIHVjczQpKQoJCWZhdGFsIChmaWxlLCBsaW5lbm8sICJvdXQgb2YgbWVtb3J5Iik7Cgl9CiAgICB9CiAgICBuID0gRmNDaGFyU2V0RnJlZXplIChjKTsKICAgIEZjQ2hhclNldERlc3Ryb3kgKGMpOwogICAgcmV0dXJuIG47Cn0KCi8qCiAqIENvbnZlcnQgYSBmaWxlIG5hbWUgaW50byBhIG5hbWUgc3VpdGFibGUgZm9yIEMgZGVjbGFyYXRpb25zCiAqLwpzdGF0aWMgY2hhciAqCmdldF9uYW1lIChjaGFyICpmaWxlKQp7CiAgICBjaGFyICAgICpuYW1lOwogICAgY2hhciAgICAqZG90OwoKICAgIGRvdCA9IHN0cmNociAoZmlsZSwgJy4nKTsKICAgIGlmICghZG90KQoJZG90ID0gZmlsZSArIHN0cmxlbihmaWxlKTsKICAgIG5hbWUgPSBtYWxsb2MgKGRvdCAtIGZpbGUgKyAxKTsKICAgIHN0cm5jcHkgKG5hbWUsIGZpbGUsIGRvdCAtIGZpbGUpOwogICAgbmFtZVtkb3QtZmlsZV0gPSAnXDAnOwogICAgcmV0dXJuIG5hbWU7Cn0KCi8qCiAqIENvbnZlcnQgYSBDIG5hbWUgaW50byBhIGxhbmd1YWdlIG5hbWUKICovCnN0YXRpYyBjaGFyICoKZ2V0X2xhbmcgKGNoYXIgKm5hbWUpCnsKICAgIGNoYXIgICAgKmxhbmcgPSBtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKICAgIGNoYXIgICAgKmwgPSBsYW5nOwogICAgY2hhciAgICBjOwoKICAgIHdoaWxlICgoYyA9ICpuYW1lKyspKQogICAgewoJaWYgKGlzdXBwZXIgKChpbnQpICh1bnNpZ25lZCBjaGFyKSBjKSkKCSAgICBjID0gdG9sb3dlciAoKGludCkgKHVuc2lnbmVkIGNoYXIpIGMpOwoJaWYgKGMgPT0gJ18nKQoJICAgIGMgPSAnLSc7CglpZiAoYyA9PSAnICcpCgkgICAgY29udGludWU7CgkqbCsrID0gYzsKICAgIH0KICAgICpsKysgPSAnXDAnOwogICAgcmV0dXJuIGxhbmc7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZSAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKewogICAgY29uc3QgRmNDaGFyOCAgICAqY29uc3QgKmFzID0gYSwgKmNvbnN0ICpicyA9IGI7CiAgICByZXR1cm4gRmNTdHJDbXBJZ25vcmVDYXNlICgqYXMsICpicyk7Cn0KCiNkZWZpbmUgTUFYX0xBTkcJICAgIDEwMjQKI2RlZmluZSBNQVhfTEFOR19TRVRfTUFQICAgICgoTUFYX0xBTkcgKyAzMSkgLyAzMikKCiNkZWZpbmUgQml0U2V0KG1hcCwgaWQpICAgKChtYXApWyhpZCk+PjVdIHw9ICgoRmNDaGFyMzIpIDEgPDwgKChpZCkgJiAweDFmKSkpCiNkZWZpbmUgQml0R2V0KG1hcCwgaWQpICAgKChtYXApWyhpZCk+PjVdID4+ICgoaWQpICYgMHgxZikpICYgMSkKCmludAptYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIGNoYXIJKmZpbGVzW01BWF9MQU5HXTsKICAgIEZjQ2hhclNldAkqc2V0c1tNQVhfTEFOR107CiAgICBpbnQJCWR1cGxpY2F0ZVtNQVhfTEFOR107CiAgICBpbnQJCWNvdW50cnlbTUFYX0xBTkddOwogICAgY2hhcgkqbmFtZXNbTUFYX0xBTkddOwogICAgY2hhcgkqbGFuZ3NbTUFYX0xBTkddOwogICAgRklMRQkqZjsKICAgIGludAkJbmNvdW50cnkgPSAwOwogICAgaW50CQlpID0gMDsKICAgIEZjQ2hhckxlYWYJKipsZWF2ZXMsICoqc2xlYXZlczsKICAgIGludAkJdG90YWxfbGVhdmVzID0gMDsKICAgIGludAkJbCwgc2wsIHRsOwogICAgaW50CQljOwogICAgY2hhcglsaW5lWzEwMjRdOwogICAgRmNDaGFyMzIJbWFwW01BWF9MQU5HX1NFVF9NQVBdOwogICAgaW50CQludW1fbGFuZ19zZXRfbWFwOwogICAgaW50CQlzZXRSYW5nZVN0YXJ0WzI2XTsKICAgIGludAkJc2V0UmFuZ2VFbmRbMjZdOwogICAgRmNDaGFyOAlzZXRSYW5nZUNoYXI7CiAgICAKICAgIHdoaWxlICgqKythcmd2KQogICAgewoJaWYgKCFzdHJjbXAgKCphcmd2LCAiLWQiKSkKCXsKCSAgICBkaXIgPSAqKythcmd2OwoJICAgIGNvbnRpbnVlOwoJfQoJaWYgKGkgPT0gTUFYX0xBTkcpCgkgICAgZmF0YWwgKCphcmd2LCAwLCAiVG9vIG1hbnkgbGFuZ3VhZ2VzIik7CglmaWxlc1tpKytdID0gKmFyZ3Y7CiAgICB9CiAgICBmaWxlc1tpXSA9IDA7CiAgICBxc29ydCAoZmlsZXMsIGksIHNpemVvZiAoY2hhciAqKSwgY29tcGFyZSk7CiAgICBpID0gMDsKICAgIHdoaWxlIChmaWxlc1tpXSkKICAgIHsKCWYgPSBzY2Fub3BlbiAoZmlsZXNbaV0pOwoJaWYgKCFmKQoJICAgIGZhdGFsIChmaWxlc1tpXSwgMCwgc3RyZXJyb3IgKGVycm5vKSk7CglzZXRzW2ldID0gc2NhbiAoZiwgZmlsZXNbaV0pOwoJbmFtZXNbaV0gPSBnZXRfbmFtZSAoZmlsZXNbaV0pOwoJbGFuZ3NbaV0gPSBnZXRfbGFuZyhuYW1lc1tpXSk7CglpZiAoc3RyY2hyIChsYW5nc1tpXSwgJy0nKSkKCSAgICBjb3VudHJ5W25jb3VudHJ5KytdID0gaTsKCgl0b3RhbF9sZWF2ZXMgKz0gc2V0c1tpXS0+bnVtOwoJaSsrOwoJZmNsb3NlIChmKTsKICAgIH0KICAgIHNldHNbaV0gPSAwOwogICAgbGVhdmVzID0gbWFsbG9jICh0b3RhbF9sZWF2ZXMgKiBzaXplb2YgKEZjQ2hhckxlYWYgKikpOwogICAgdGwgPSAwOwogICAgLyoKICAgICAqIEZpbmQgdW5pcXVlIGxlYXZlcwogICAgICovCiAgICBmb3IgKGkgPSAwOyBzZXRzW2ldOyBpKyspCiAgICB7CglzbGVhdmVzID0gc2V0c1tpXS0+bGVhdmVzOwoJZm9yIChzbCA9IDA7IHNsIDwgc2V0c1tpXS0+bnVtOyBzbCsrKQoJewoJICAgIGZvciAobCA9IDA7IGwgPCB0bDsgbCsrKQoJCWlmIChsZWF2ZXNbbF0gPT0gc2xlYXZlc1tzbF0pCgkJICAgIGJyZWFrOwoJICAgIGlmIChsID09IHRsKQoJCWxlYXZlc1t0bCsrXSA9IHNsZWF2ZXNbc2xdOwoJfQogICAgfQoKICAgIC8qCiAgICAgKiBTY2FuIHRoZSBpbnB1dCB1bnRpbCB0aGUgbWFya2VyIGlzIGZvdW5kCiAgICAgKi8KICAgIAogICAgd2hpbGUgKGZnZXRzIChsaW5lLCBzaXplb2YgKGxpbmUpLCBzdGRpbikpCiAgICB7CglpZiAoIXN0cm5jbXAgKGxpbmUsICJAQEAiLCAzKSkKCSAgICBicmVhazsKCWZwdXRzIChsaW5lLCBzdGRvdXQpOwogICAgfQogICAgCiAgICBwcmludGYgKCIvKiB0b3RhbCBzaXplOiAlZCB1bmlxdWUgbGVhdmVzOiAlZCAqL1xuXG4iLAoJICAgIHRvdGFsX2xlYXZlcywgdGwpOwogICAgLyoKICAgICAqIER1bXAgbGVhdmVzCiAgICAgKi8KICAgIHByaW50ZiAoInN0YXRpYyBjb25zdCBGY0NoYXJMZWFmCWxlYXZlc1slZF0gPSB7XG4iLCB0bCk7CiAgICBmb3IgKGwgPSAwOyBsIDwgdGw7IGwrKykKICAgIHsKCXByaW50ZiAoIiAgICB7IHsgLyogJWQgKi8iLCBsKTsKCWZvciAoaSA9IDA7IGkgPCAyNTYvMzI7IGkrKykKCXsKCSAgICBpZiAoaSAlIDQgPT0gMCkKCQlwcmludGYgKCJcbiAgICIpOwoJICAgIHByaW50ZiAoIiAweCUwOHgsIiwgbGVhdmVzW2xdLT5tYXBbaV0pOwoJfQoJcHJpbnRmICgiXG4gICAgfSB9LFxuIik7CiAgICB9CiAgICBwcmludGYgKCJ9O1xuXG4iKTsKICAgIHByaW50ZiAoIiNkZWZpbmUgTChuKSAoKEZjQ2hhckxlYWYgKikgJmxlYXZlc1tuXSlcblxuIik7CgogICAgLyoKICAgICAqIEZpbmQgZHVwbGljYXRlIGNoYXJzZXRzCiAgICAgKi8KICAgIGR1cGxpY2F0ZVswXSA9IC0xOwogICAgZm9yIChpID0gMTsgc2V0c1tpXTsgaSsrKQogICAgewoJaW50IGo7CgoJZHVwbGljYXRlW2ldID0gLTE7Cglmb3IgKGogPSAwOyBqIDwgaTsgaisrKQoJICAgIGlmIChzZXRzW2pdID09IHNldHNbaV0pCgkgICAgewoJCWR1cGxpY2F0ZVtpXSA9IGo7CgkJYnJlYWs7CgkgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiBGaW5kIHJhbmdlcyBmb3IgZWFjaCBsZXR0ZXIgZm9yIGZhc3RlciBzZWFyY2hpbmcKICAgICAqLwogICAgc2V0UmFuZ2VDaGFyID0gJ2EnOwogICAgZm9yIChpID0gMDsgc2V0c1tpXTsgaSsrKQogICAgewoJY2hhcgljID0gbmFtZXNbaV1bMF07CgkKCXdoaWxlIChzZXRSYW5nZUNoYXIgPD0gYyAmJiBjIDw9ICd6JykKCSAgICBzZXRSYW5nZVN0YXJ0W3NldFJhbmdlQ2hhcisrIC0gJ2EnXSA9IGk7CiAgICB9CiAgICBmb3IgKHNldFJhbmdlQ2hhciA9ICdhJzsgc2V0UmFuZ2VDaGFyIDwgJ3onOyBzZXRSYW5nZUNoYXIrKykKCXNldFJhbmdlRW5kW3NldFJhbmdlQ2hhciAtICdhJ10gPSBzZXRSYW5nZVN0YXJ0W3NldFJhbmdlQ2hhcisxLSdhJ10gLSAxOwogICAgc2V0UmFuZ2VFbmRbc2V0UmFuZ2VDaGFyIC0gJ2EnXSA9IGkgLSAxOwogICAgCiAgICAvKgogICAgICogRHVtcCBhcnJheXMKICAgICAqLwogICAgZm9yIChpID0gMDsgc2V0c1tpXTsgaSsrKQogICAgewoJaW50IG47CgkKCWlmIChkdXBsaWNhdGVbaV0gPj0gMCkKCSAgICBjb250aW51ZTsKCXByaW50ZiAoInN0YXRpYyBjb25zdCBGY0NoYXJMZWFmICpsZWF2ZXNfJXNbJWRdID0ge1xuIiwKCQluYW1lc1tpXSwgc2V0c1tpXS0+bnVtKTsKCWZvciAobiA9IDA7IG4gPCBzZXRzW2ldLT5udW07IG4rKykKCXsKCSAgICBpZiAobiAlIDggPT0gMCkKCQlwcmludGYgKCIgICAiKTsKCSAgICBmb3IgKGwgPSAwOyBsIDwgdGw7IGwrKykKCQlpZiAobGVhdmVzW2xdID09IHNldHNbaV0tPmxlYXZlc1tuXSkKCQkgICAgYnJlYWs7CgkgICAgaWYgKGwgPT0gdGwpCgkJZmF0YWwgKG5hbWVzW2ldLCAwLCAiY2FuJ3QgZmluZCBsZWFmIik7CgkgICAgcHJpbnRmICgiIEwoJTNkKSwiLCBsKTsKCSAgICBpZiAobiAlIDggPT0gNykKCQlwcmludGYgKCJcbiIpOwoJfQoJaWYgKG4gJSA4ICE9IDApCgkgICAgcHJpbnRmICgiXG4iKTsKCXByaW50ZiAoIn07XG5cbiIpOwoJCgoJcHJpbnRmICgic3RhdGljIGNvbnN0IEZjQ2hhcjE2IG51bWJlcnNfJXNbJWRdID0ge1xuIiwKCQluYW1lc1tpXSwgc2V0c1tpXS0+bnVtKTsKCWZvciAobiA9IDA7IG4gPCBzZXRzW2ldLT5udW07IG4rKykKCXsKCSAgICBpZiAobiAlIDggPT0gMCkKCQlwcmludGYgKCIgICAiKTsKCSAgICBwcmludGYgKCIgMHglMDR4LCIsIHNldHNbaV0tPm51bWJlcnNbbl0pOwoJICAgIGlmIChuICUgOCA9PSA3KQoJCXByaW50ZiAoIlxuIik7Cgl9CglpZiAobiAlIDggIT0gMCkKCSAgICBwcmludGYgKCJcbiIpOwoJcHJpbnRmICgifTtcblxuIik7CiAgICB9CiAgICBwcmludGYgKCIjdW5kZWYgTFxuXG4iKTsKICAgIAogICAgLyoKICAgICAqIER1bXAgc2V0cwogICAgICovCgogICAgcHJpbnRmICgic3RhdGljIGNvbnN0IEZjTGFuZ0NoYXJTZXQgIGZjTGFuZ0NoYXJTZXRzW10gPSB7XG4iKTsKICAgIGZvciAoaSA9IDA7IHNldHNbaV07IGkrKykKICAgIHsKCWludAlqID0gZHVwbGljYXRlW2ldOwoKCWlmIChqIDwgMCkKCSAgICBqID0gaTsKCXByaW50ZiAoIiAgICB7IChGY0NoYXI4ICopIFwiJXNcIixcbiIKCQkiICAgICAgeyBGQ19SRUZfQ09OU1RBTlQsICVkLCAiCgkJIihGY0NoYXJMZWFmICoqKSBsZWF2ZXNfJXMsICIKCQkiKEZjQ2hhcjE2ICopIG51bWJlcnNfJXMgfSB9LFxuIiwKCQlsYW5nc1tpXSwKCQlzZXRzW2pdLT5udW0sIG5hbWVzW2pdLCBuYW1lc1tqXSk7CiAgICB9CiAgICBwcmludGYgKCJ9O1xuXG4iKTsKICAgIHByaW50ZiAoIiNkZWZpbmUgTlVNX0xBTkdfQ0hBUl9TRVQJJWRcbiIsIGkpOwogICAgbnVtX2xhbmdfc2V0X21hcCA9IChpICsgMzEpIC8gMzI7CiAgICBwcmludGYgKCIjZGVmaW5lIE5VTV9MQU5HX1NFVF9NQVAJJWRcbiIsIG51bV9sYW5nX3NldF9tYXApOwogICAgLyoKICAgICAqIER1bXAgaW5kaWNlcyB3aXRoIGNvdW50cnkgY29kZXMKICAgICAqLwogICAgaWYgKG5jb3VudHJ5KQogICAgewoJaW50CW5jb3VudHJ5X2VudCA9IDA7CglwcmludGYgKCJcbiIpOwoJcHJpbnRmICgic3RhdGljIGNvbnN0IEZjQ2hhcjMyIGZjTGFuZ0NvdW50cnlTZXRzW11bTlVNX0xBTkdfU0VUX01BUF0gPSB7XG4iKTsKCWZvciAoYyA9IDA7IGMgPCBuY291bnRyeTsgYysrKQoJewoJICAgIGkgPSBjb3VudHJ5W2NdOwoJICAgIGlmIChpID49IDApCgkgICAgewoJCWludCBsID0gc3RyY2hyIChsYW5nc1tpXSwgJy0nKSAtIGxhbmdzW2ldOwoJCWludCBkLCBrOwoKCQlmb3IgKGsgPSAwOyBrIDwgbnVtX2xhbmdfc2V0X21hcDsgaysrKQoJCSAgICBtYXBba10gPSAwOwoKCQlCaXRTZXQgKG1hcCwgaSk7CgkJZm9yIChkID0gYyArIDE7IGQgPCBuY291bnRyeTsgZCsrKQoJCXsKCQkgICAgaW50IGogPSBjb3VudHJ5W2RdOwoJCSAgICBpZiAoaiA+PSAwICYmICFzdHJuY21wIChsYW5nc1tqXSwgbGFuZ3NbaV0sIGwpKQoJCSAgICB7CgkJCUJpdFNldChtYXAsIGopOwoJCQljb3VudHJ5W2RdID0gLTE7CgkJICAgIH0KCQl9CgkJcHJpbnRmICgiICAgIHsiKTsKCQlmb3IgKGsgPSAwOyBrIDwgbnVtX2xhbmdfc2V0X21hcDsgaysrKQoJCSAgICBwcmludGYgKCIgMHglMDh4LCIsIG1hcFtrXSk7CgkJcHJpbnRmICgiIH0sIC8qICUqLipzICovXG4iLAoJCQlsLCBsLCBsYW5nc1tpXSk7CgkJKytuY291bnRyeV9lbnQ7CgkgICAgfQoJfQoJcHJpbnRmICgifTtcblxuIik7CglwcmludGYgKCIjZGVmaW5lIE5VTV9DT1VOVFJZX1NFVCAlZFxuIiwgbmNvdW50cnlfZW50KTsKICAgIH0KICAgIAoKICAgIC8qCiAgICAgKiBEdW1wIHNldHMgc3RhcnQvZmluaXNoIGZvciB0aGUgZmFzdHBhdGgKICAgICAqLwogICAgcHJpbnRmICgic3RhdGljIGNvbnN0IEZjTGFuZ0NoYXJTZXRSYW5nZSAgZmNMYW5nQ2hhclNldFJhbmdlc1tdID0ge1xuIik7CiAgICBmb3IgKHNldFJhbmdlQ2hhciA9ICdhJzsgc2V0UmFuZ2VDaGFyIDw9ICd6JyA7IHNldFJhbmdlQ2hhcisrKQogICAgewoJcHJpbnRmICgiICAgIHsgJWQsICVkIH0sIC8qICVjICovXG4iLAoJCXNldFJhbmdlU3RhcnRbc2V0UmFuZ2VDaGFyIC0gJ2EnXSwKCQlzZXRSYW5nZUVuZFtzZXRSYW5nZUNoYXIgLSAnYSddLCBzZXRSYW5nZUNoYXIpOwogICAgfQogICAgcHJpbnRmICgifTtcblxuIik7CiAKICAgIHdoaWxlIChmZ2V0cyAobGluZSwgc2l6ZW9mIChsaW5lKSwgc3RkaW4pKQoJZnB1dHMgKGxpbmUsIHN0ZG91dCk7CiAgICAKICAgIGZmbHVzaCAoc3Rkb3V0KTsKICAgIGV4aXQgKGZlcnJvciAoc3Rkb3V0KSk7Cn0K