LyotCiAqIENvcHlyaWdodCAoYykgMTk4NywgMTk5MiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgogKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCiAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgogKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCiAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICoKICogTW9kaWZpZWQgZm9yIExpbnV4IGJ5IENoYXJsZXMgSGFubnVtIChteWNyb2Z0QGdudS5haS5taXQuZWR1KQogKiAgICAgICAgICAgICAgICAgICBhbmQgQnJpYW4gS29laG1zdGVkdCAoYnBrQGdudS5haS5taXQuZWR1KQogKgogKiBXZWQgU2VwIDE0IDIyOjI2OjAwIDE5OTQ6IFBhdGNoIGZyb20gYmpkb3VtYSA8Ympkb3VtYUB4czRhbGwubmw+IHRvIGhhbmRsZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgbGluZSB0aGF0IGhhcyBubyBuZXdsaW5lIGNvcnJlY3RseS4KICogMy1KdW4tMTk5ODogUGF0Y2hlZCBieSBOaWNvbGFpIExhbmdmZWxkdCB0byB3b3JrIGJldHRlciBvbiBMaW51eDoKICogCUhhbmRsZSBhbnktbGVuZ3RoLWxpbmVzLiAgQ29kZSBjb3BpZWQgZnJvbSB1dGlsLWxpbnV4JyBzZXRwd25hbS5jCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BwbGQuT1JHLlBMPgogKiAJYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICogMTk5OS0wOS0xOSBCcnVubyBIYWlibGUgPGhhaWJsZUBjbGlzcC5jb25zLm9yZz4KICogCW1vZGlmaWVkIHRvIHdvcmsgY29ycmVjdGx5IGluIG11bHRpLWJ5dGUgbG9jYWxlcwogKgogKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxlcnIuaD4KCiNpbmNsdWRlICJubHMuaCIKI2luY2x1ZGUgIndpZGVjaGFyLmgiCgp2b2lkIHVzYWdlKHZvaWQpOwoKaW50Cm1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogIHJlZ2lzdGVyIGNoYXIgKmZpbGVuYW1lOwogIHJlZ2lzdGVyIHdjaGFyX3QgKnQ7CiAgc2l6ZV90IGJ1ZmxlbiA9IDUxMjsKICB3Y2hhcl90ICpwID0gbWFsbG9jKGJ1ZmxlbipzaXplb2Yod2NoYXJfdCkpOwogIHNpemVfdCBsZW47CiAgRklMRSAqZnA7CiAgaW50IGNoLCBydmFsOwoKICBzZXRsb2NhbGUoTENfQUxMLCAiIik7CiAgYmluZHRleHRkb21haW4oUEFDS0FHRSwgTE9DQUxFRElSKTsKICB0ZXh0ZG9tYWluKFBBQ0tBR0UpOwoKICB3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICIiKSkgIT0gLTEpCiAgICBzd2l0Y2goY2gpIHsKICAgIGNhc2UgJz8nOgogICAgZGVmYXVsdDoKICAgICAgdXNhZ2UoKTsKICAgIH0KCiAgYXJnYyAtPSBvcHRpbmQ7CiAgYXJndiArPSBvcHRpbmQ7CgogIGZwID0gc3RkaW47CiAgZmlsZW5hbWUgPSAic3RkaW4iOwogIHJ2YWwgPSAwOwogIGRvIHsKICAgIGlmICgqYXJndikgewogICAgICBpZiAoKGZwID0gZm9wZW4oKmFyZ3YsICJyIikpID09IE5VTEwpIHsKCXdhcm4oImNhbm5vdCBvcGVuICVzIiwgKmFyZ3YgKTsKCXJ2YWwgPSAxOwoJKythcmd2OwoJY29udGludWU7CiAgICAgIH0KICAgICAgZmlsZW5hbWUgPSAqYXJndisrOwogICAgfQoKICAgIHdoaWxlIChmZ2V0d3MocCwgYnVmbGVuLCBmcCkpIHsKCiAgICAgIGxlbiA9IHdjc2xlbihwKTsKCiAgICAgIC8qIFRoaXMgaXMgbXkgaGFjayBmcm9tIHNldHB3bmFtLmMgLWphbmwgKi8KICAgICAgd2hpbGUgKHBbbGVuLTFdICE9ICdcbicgJiYgIWZlb2YoZnApKSB7CgkvKiBFeHRlbmQgaW5wdXQgYnVmZmVyIGlmIGl0IGZhaWxlZCBnZXR0aW5nIHRoZSB3aG9sZSBsaW5lICovCgoJLyogU28gbm93IHdlIGRvdWJsZSB0aGUgYnVmZmVyIHNpemUgKi8KCWJ1ZmxlbiAqPSAyOwoKCXAgPSByZWFsbG9jKHAsIGJ1ZmxlbipzaXplb2Yod2NoYXJfdCkpOwoJaWYgKHAgPT0gTlVMTCkKCSAgZXJyKDEsIF8oInVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXJzcGFjZSIpKTsKCgkvKiBBbmQgZmlsbCB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyICovCglpZiAoZmdldHdzKCZwW2xlbl0sIGJ1Zmxlbi8yLCBmcCkgPT0gTlVMTCkgYnJlYWs7CgoJbGVuID0gd2NzbGVuKHApOwoKCS8qIFRoYXQgd2FzIGEgbG90IG9mIHdvcmsgZm9yIG5vdGhpbmcuICBHaW1tZSBwZXJsISAqLwogICAgICB9CgogICAgICB0ID0gcCArIGxlbiAtIDEgLSAoKihwK2xlbi0xKT09J1xyJyB8fCAqKHArbGVuLTEpPT0nXG4nKTsKICAgICAgZm9yICggOyB0ID49IHA7IC0tdCkKCWlmICgqdCAhPSAwKQoJICBwdXR3Y2hhcigqdCk7CiAgICAgIHB1dHdjaGFyKCdcbicpOwogICAgfQogICAgZmZsdXNoKGZwKTsKICAgIGlmIChmZXJyb3IoZnApKSB7CiAgICAgIHdhcm4oIiVzIiwgZmlsZW5hbWUpOwogICAgICBydmFsID0gMTsKICAgIH0KICAgIGlmIChmY2xvc2UoZnApKQogICAgICBydmFsID0gMTsKICB9IHdoaWxlKCphcmd2KTsKICBleGl0KHJ2YWwpOwp9Cgp2b2lkCnVzYWdlKHZvaWQpCnsKCSh2b2lkKWZwcmludGYoc3RkZXJyLCBfKCJ1c2FnZTogcmV2IFtmaWxlIC4uLl1cbiIpKTsKCWV4aXQoMSk7Cn0K