LyoKICogJFJDU0lkOiB4Yy9saWIvZm9udGNvbmZpZy9zcmMvZmNjaGFyc2V0LmMsdiAxLjE4IDIwMDIvMDgvMjIgMDc6MzY6NDQga2VpdGhwIEV4cCAkCiAqCiAqIENvcHlyaWdodCCpIDIwMDEgS2VpdGggUGFja2FyZAogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CiAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCiAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAiZmNpbnQuaCIKCi8qICNkZWZpbmUgQ0hFQ0sgKi8KCi8qICNkZWZpbmUgQ0hBVFRZICovCgpGY0NoYXJTZXQgKgpGY0NoYXJTZXRDcmVhdGUgKHZvaWQpCnsKICAgIEZjQ2hhclNldAkqZmNzOwoKICAgIGZjcyA9IChGY0NoYXJTZXQgKikgbWFsbG9jIChzaXplb2YgKEZjQ2hhclNldCkpOwogICAgaWYgKCFmY3MpCglyZXR1cm4gMDsKICAgIEZjTWVtQWxsb2MgKEZDX01FTV9DSEFSU0VULCBzaXplb2YgKEZjQ2hhclNldCkpOwogICAgZmNzLT5yZWYgPSAxOwogICAgZmNzLT5udW0gPSAwOwogICAgZmNzLT5sZWF2ZXMgPSAwOwogICAgZmNzLT5udW1iZXJzID0gMDsKICAgIHJldHVybiBmY3M7Cn0KCkZjQ2hhclNldCAqCkZjQ2hhclNldE5ldyAodm9pZCk7CiAgICAKRmNDaGFyU2V0ICoKRmNDaGFyU2V0TmV3ICh2b2lkKQp7CiAgICByZXR1cm4gRmNDaGFyU2V0Q3JlYXRlICgpOwp9CgoKdm9pZApGY0NoYXJTZXREZXN0cm95IChGY0NoYXJTZXQgKmZjcykKewogICAgaW50IGk7CiAgICBpZiAoZmNzLT5yZWYgPT0gRkNfUkVGX0NPTlNUQU5UKQoJcmV0dXJuOwogICAgaWYgKC0tZmNzLT5yZWYgPiAwKQoJcmV0dXJuOwogICAgZm9yIChpID0gMDsgaSA8IGZjcy0+bnVtOyBpKyspCiAgICB7CglGY01lbUZyZWUgKEZDX01FTV9DSEFSTEVBRiwgc2l6ZW9mIChGY0NoYXJMZWFmKSk7CglmcmVlIChmY3MtPmxlYXZlc1tpXSk7CiAgICB9CiAgICBpZiAoZmNzLT5sZWF2ZXMpCiAgICB7CglGY01lbUZyZWUgKEZDX01FTV9DSEFSU0VULCBmY3MtPm51bSAqIHNpemVvZiAoRmNDaGFyTGVhZiAqKSk7CglmcmVlIChmY3MtPmxlYXZlcyk7CiAgICB9CiAgICBpZiAoZmNzLT5udW1iZXJzKQogICAgewoJRmNNZW1GcmVlIChGQ19NRU1fQ0hBUlNFVCwgZmNzLT5udW0gKiBzaXplb2YgKEZjQ2hhcjE2KSk7CglmcmVlIChmY3MtPm51bWJlcnMpOwogICAgfQogICAgRmNNZW1GcmVlIChGQ19NRU1fQ0hBUlNFVCwgc2l6ZW9mIChGY0NoYXJTZXQpKTsKICAgIGZyZWUgKGZjcyk7Cn0KCi8qCiAqIExvY2F0ZSB0aGUgbGVhZiBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgY2hhciwgcmV0dXJuCiAqIGl0cyBpbmRleCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSByZXR1cm4gbmVnYXRpdmUgb2YKICogdGhlIChwb3NpdGlvbiArIDEpIHdoZXJlIGl0IHNob3VsZCBiZSBpbnNlcnRlZAogKi8KCnN0YXRpYyBpbnQKRmNDaGFyU2V0RmluZExlYWZQb3MgKGNvbnN0IEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KQp7CiAgICBGY0NoYXIxNgkJKm51bWJlcnMgPSBmY3MtPm51bWJlcnM7CiAgICBGY0NoYXIxNgkJcGFnZTsKICAgIGludAkJCWxvdyA9IDA7CiAgICBpbnQJCQloaWdoID0gZmNzLT5udW0gLSAxOwoKICAgIGlmICghbnVtYmVycykKCXJldHVybiAtMTsKICAgIHVjczQgPj49IDg7CiAgICB3aGlsZSAobG93IDw9IGhpZ2gpCiAgICB7CglpbnQgbWlkID0gKGxvdyArIGhpZ2gpID4+IDE7CglwYWdlID0gbnVtYmVyc1ttaWRdOwoJaWYgKHBhZ2UgPT0gdWNzNCkKCSAgICByZXR1cm4gbWlkOwoJaWYgKHBhZ2UgPCB1Y3M0KQoJICAgIGxvdyA9IG1pZCArIDE7CgllbHNlCgkgICAgaGlnaCA9IG1pZCAtIDE7CiAgICB9CiAgICBpZiAoaGlnaCA8IDAgfHwgKGhpZ2ggPCBmY3MtPm51bSAmJiBudW1iZXJzW2hpZ2hdIDwgdWNzNCkpCgloaWdoKys7CiAgICByZXR1cm4gLShoaWdoICsgMSk7Cn0KCnN0YXRpYyBGY0NoYXJMZWFmICoKRmNDaGFyU2V0RmluZExlYWYgKGNvbnN0IEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KQp7CiAgICBpbnQJcG9zID0gRmNDaGFyU2V0RmluZExlYWZQb3MgKGZjcywgdWNzNCk7CiAgICBpZiAocG9zID49IDApCglyZXR1cm4gZmNzLT5sZWF2ZXNbcG9zXTsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgRmNCb29sCkZjQ2hhclNldFB1dExlYWYgKEZjQ2hhclNldAkqZmNzLCAKCQkgIEZjQ2hhcjMyCXVjczQsCgkJICBGY0NoYXJMZWFmCSpsZWFmLCAKCQkgIGludAkJcG9zKQp7CiAgICBGY0NoYXJMZWFmCSoqbGVhdmVzOwogICAgRmNDaGFyMTYJKm51bWJlcnM7CgogICAgdWNzNCA+Pj0gODsKICAgIGlmICh1Y3M0ID49IDB4MTAwMDApCglyZXR1cm4gRmNGYWxzZTsKICAgIGlmICghZmNzLT5sZWF2ZXMpCglsZWF2ZXMgPSBtYWxsb2MgKHNpemVvZiAoRmNDaGFyTGVhZiAqKSk7CiAgICBlbHNlCglsZWF2ZXMgPSByZWFsbG9jIChmY3MtPmxlYXZlcywgKGZjcy0+bnVtICsgMSkgKiBzaXplb2YgKEZjQ2hhckxlYWYgKikpOwogICAgaWYgKCFsZWF2ZXMpCglyZXR1cm4gRmNGYWxzZTsKICAgIGlmIChmY3MtPm51bSkKCUZjTWVtRnJlZSAoRkNfTUVNX0NIQVJTRVQsIGZjcy0+bnVtICogc2l6ZW9mIChGY0NoYXJMZWFmICopKTsKICAgIEZjTWVtQWxsb2MgKEZDX01FTV9DSEFSU0VULCAoZmNzLT5udW0gKyAxKSAqIHNpemVvZiAoRmNDaGFyTGVhZiAqKSk7CiAgICBmY3MtPmxlYXZlcyA9IGxlYXZlczsKICAgIGlmICghZmNzLT5udW1iZXJzKQoJbnVtYmVycyA9IG1hbGxvYyAoc2l6ZW9mIChGY0NoYXIxNikpOwogICAgZWxzZQoJbnVtYmVycyA9IHJlYWxsb2MgKGZjcy0+bnVtYmVycywgKGZjcy0+bnVtICsgMSkgKiBzaXplb2YgKEZjQ2hhcjE2KSk7CiAgICBpZiAoIW51bWJlcnMpCglyZXR1cm4gRmNGYWxzZTsKICAgIGlmIChmY3MtPm51bSkKCUZjTWVtRnJlZSAoRkNfTUVNX0NIQVJTRVQsIGZjcy0+bnVtICogc2l6ZW9mIChGY0NoYXIxNikpOwogICAgRmNNZW1BbGxvYyAoRkNfTUVNX0NIQVJTRVQsIChmY3MtPm51bSArIDEpICogc2l6ZW9mIChGY0NoYXIxNikpOwogICAgZmNzLT5udW1iZXJzID0gbnVtYmVyczsKICAgIAogICAgbWVtbW92ZSAoZmNzLT5sZWF2ZXMgKyBwb3MgKyAxLCBmY3MtPmxlYXZlcyArIHBvcywgCgkgICAgIChmY3MtPm51bSAtIHBvcykgKiBzaXplb2YgKEZjQ2hhckxlYWYgKikpOwogICAgbWVtbW92ZSAoZmNzLT5udW1iZXJzICsgcG9zICsgMSwgZmNzLT5udW1iZXJzICsgcG9zLAoJICAgICAoZmNzLT5udW0gLSBwb3MpICogc2l6ZW9mIChGY0NoYXIxNikpOwogICAgZmNzLT5udW1iZXJzW3Bvc10gPSAoRmNDaGFyMTYpIHVjczQ7CiAgICBmY3MtPmxlYXZlc1twb3NdID0gbGVhZjsKICAgIGZjcy0+bnVtKys7CiAgICByZXR1cm4gRmNUcnVlOwp9CgovKgogKiBMb2NhdGUgdGhlIGxlYWYgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGNoYXIsIGNyZWF0aW5nIGl0CiAqIGlmIGRlc2lyZWQKICovCgpGY0NoYXJMZWFmICoKRmNDaGFyU2V0RmluZExlYWZDcmVhdGUgKEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KQp7CiAgICBpbnQJCQlwb3M7CiAgICBGY0NoYXJMZWFmCQkqbGVhZjsKCiAgICBwb3MgPSBGY0NoYXJTZXRGaW5kTGVhZlBvcyAoZmNzLCB1Y3M0KTsKICAgIGlmIChwb3MgPj0gMCkKCXJldHVybiBmY3MtPmxlYXZlc1twb3NdOwogICAgCiAgICBsZWFmID0gY2FsbG9jICgxLCBzaXplb2YgKEZjQ2hhckxlYWYpKTsKICAgIGlmICghbGVhZikKCXJldHVybiAwOwogICAgCiAgICBwb3MgPSAtcG9zIC0gMTsKICAgIGlmICghRmNDaGFyU2V0UHV0TGVhZiAoZmNzLCB1Y3M0LCBsZWFmLCBwb3MpKQogICAgewoJZnJlZSAobGVhZik7CglyZXR1cm4gMDsKICAgIH0KICAgIEZjTWVtQWxsb2MgKEZDX01FTV9DSEFSTEVBRiwgc2l6ZW9mIChGY0NoYXJMZWFmKSk7CiAgICByZXR1cm4gbGVhZjsKfQoKc3RhdGljIEZjQm9vbApGY0NoYXJTZXRJbnNlcnRMZWFmIChGY0NoYXJTZXQgKmZjcywgRmNDaGFyMzIgdWNzNCwgRmNDaGFyTGVhZiAqbGVhZikKewogICAgaW50CQkgICAgcG9zOwoKICAgIHBvcyA9IEZjQ2hhclNldEZpbmRMZWFmUG9zIChmY3MsIHVjczQpOwogICAgaWYgKHBvcyA+PSAwKQogICAgewoJRmNNZW1GcmVlIChGQ19NRU1fQ0hBUkxFQUYsIHNpemVvZiAoRmNDaGFyTGVhZikpOwoJZnJlZSAoZmNzLT5sZWF2ZXNbcG9zXSk7CglmY3MtPmxlYXZlc1twb3NdID0gbGVhZjsKCXJldHVybiBGY1RydWU7CiAgICB9CiAgICBwb3MgPSAtcG9zIC0gMTsKICAgIHJldHVybiBGY0NoYXJTZXRQdXRMZWFmIChmY3MsIHVjczQsIGxlYWYsIHBvcyk7Cn0KCkZjQm9vbApGY0NoYXJTZXRBZGRDaGFyIChGY0NoYXJTZXQgKmZjcywgRmNDaGFyMzIgdWNzNCkKewogICAgRmNDaGFyTGVhZgkqbGVhZjsKICAgIEZjQ2hhcjMyCSpiOwogICAgCiAgICBpZiAoZmNzLT5yZWYgPT0gRkNfUkVGX0NPTlNUQU5UKQoJcmV0dXJuIEZjRmFsc2U7CiAgICBsZWFmID0gRmNDaGFyU2V0RmluZExlYWZDcmVhdGUgKGZjcywgdWNzNCk7CiAgICBpZiAoIWxlYWYpCglyZXR1cm4gRmNGYWxzZTsKICAgIGIgPSAmbGVhZi0+bWFwWyh1Y3M0ICYgMHhmZikgPj4gNV07CiAgICAqYiB8PSAoMSA8PCAodWNzNCAmIDB4MWYpKTsKICAgIHJldHVybiBGY1RydWU7Cn0KCi8qCiAqIEFuIGl0ZXJhdG9yIGZvciB0aGUgbGVhdmVzIG9mIGEgY2hhcnNldAogKi8KCnR5cGVkZWYgc3RydWN0IF9mY0NoYXJTZXRJdGVyIHsKICAgIEZjQ2hhckxlYWYJICAgICpsZWFmOwogICAgRmNDaGFyMzIJICAgIHVjczQ7CiAgICBpbnQJCSAgICBwb3M7Cn0gRmNDaGFyU2V0SXRlcjsKCi8qCiAqIFNldCBpdGVyLT5sZWFmIHRvIHRoZSBsZWFmIGNvbnRhaW5pbmcgaXRlci0+dWNzNCBvciBoaWdoZXIKICovCgpzdGF0aWMgdm9pZApGY0NoYXJTZXRJdGVyU2V0IChjb25zdCBGY0NoYXJTZXQgKmZjcywgRmNDaGFyU2V0SXRlciAqaXRlcikKewogICAgaW50CQkgICAgcG9zID0gRmNDaGFyU2V0RmluZExlYWZQb3MgKGZjcywgaXRlci0+dWNzNCk7CgogICAgaWYgKHBvcyA8IDApCiAgICB7Cglwb3MgPSAtcG9zIC0gMTsKCWlmIChwb3MgPT0gZmNzLT5udW0pCgl7CgkgICAgaXRlci0+dWNzNCA9IH4wOwoJICAgIGl0ZXItPmxlYWYgPSAwOwoJICAgIHJldHVybjsKCX0KICAgICAgICBpdGVyLT51Y3M0ID0gKEZjQ2hhcjMyKSBmY3MtPm51bWJlcnNbcG9zXSA8PCA4OwogICAgfQogICAgaXRlci0+bGVhZiA9IGZjcy0+bGVhdmVzW3Bvc107CiAgICBpdGVyLT5wb3MgPSBwb3M7CiNpZmRlZiBDSEFUVFkKICAgIHByaW50ZiAoInNldCAlMDh4OiAlMDh4XG4iLCBpdGVyLT51Y3M0LCAoRmNDaGFyMzIpIGl0ZXItPmxlYWYpOwojZW5kaWYKfQoKc3RhdGljIHZvaWQKRmNDaGFyU2V0SXRlck5leHQgKGNvbnN0IEZjQ2hhclNldCAqZmNzLCBGY0NoYXJTZXRJdGVyICppdGVyKQp7CiAgICBpbnQJcG9zID0gaXRlci0+cG9zICsgMTsKICAgIGlmIChwb3MgPj0gZmNzLT5udW0pCiAgICB7CglpdGVyLT51Y3M0ID0gfjA7CglpdGVyLT5sZWFmID0gMDsKICAgIH0KICAgIGVsc2UKICAgIHsKCWl0ZXItPnVjczQgPSAoRmNDaGFyMzIpIGZjcy0+bnVtYmVyc1twb3NdIDw8IDg7CglpdGVyLT5sZWFmID0gZmNzLT5sZWF2ZXNbcG9zXTsKCWl0ZXItPnBvcyA9IHBvczsKICAgIH0KfQoKI2lmZGVmIENIQVRUWQpzdGF0aWMgdm9pZApGY0NoYXJTZXREdW1wIChjb25zdCBGY0NoYXJTZXQgKmZjcykKewogICAgaW50CQlwb3M7CgogICAgcHJpbnRmICgiZmNzICUwOHg6XG4iLCAoRmNDaGFyMzIpIGZjcyk7CiAgICBmb3IgKHBvcyA9IDA7IHBvcyA8IGZjcy0+bnVtOyBwb3MrKykKICAgIHsKCUZjQ2hhckxlYWYJKmxlYWYgPSBmY3MtPmxlYXZlc1twb3NdOwoJRmNDaGFyMzIJdWNzNCA9IChGY0NoYXIzMikgZmNzLT5udW1iZXJzW3Bvc10gPDwgODsKCQoJcHJpbnRmICgiICAgICUwOHg6ICUwOHhcbiIsIHVjczQsIChGY0NoYXIzMikgbGVhZik7CiAgICB9Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZApGY0NoYXJTZXRJdGVyU3RhcnQgKGNvbnN0IEZjQ2hhclNldCAqZmNzLCBGY0NoYXJTZXRJdGVyICppdGVyKQp7CiNpZmRlZiBDSEFUVFkKICAgIEZjQ2hhclNldER1bXAgKGZjcyk7CiNlbmRpZgogICAgaXRlci0+dWNzNCA9IDA7CiAgICBGY0NoYXJTZXRJdGVyU2V0IChmY3MsIGl0ZXIpOwp9CgpGY0NoYXJTZXQgKgpGY0NoYXJTZXRDb3B5IChGY0NoYXJTZXQgKnNyYykKewogICAgaWYgKHNyYy0+cmVmICE9IEZDX1JFRl9DT05TVEFOVCkKCXNyYy0+cmVmKys7CiAgICByZXR1cm4gc3JjOwp9CgpGY0Jvb2wKRmNDaGFyU2V0RXF1YWwgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKQp7CiAgICBGY0NoYXJTZXRJdGVyICAgYWksIGJpOwogICAgaW50CQkgICAgaTsKICAgIAogICAgaWYgKGEgPT0gYikKCXJldHVybiBGY1RydWU7CiAgICBmb3IgKEZjQ2hhclNldEl0ZXJTdGFydCAoYSwgJmFpKSwgRmNDaGFyU2V0SXRlclN0YXJ0IChiLCAmYmkpOwoJIGFpLmxlYWYgJiYgYmkubGVhZjsKCSBGY0NoYXJTZXRJdGVyTmV4dCAoYSwgJmFpKSwgRmNDaGFyU2V0SXRlck5leHQgKGIsICZiaSkpCiAgICB7CglpZiAoYWkudWNzNCAhPSBiaS51Y3M0KQoJICAgIHJldHVybiBGY0ZhbHNlOwoJZm9yIChpID0gMDsgaSA8IDI1Ni8zMjsgaSsrKQoJICAgIGlmIChhaS5sZWFmLT5tYXBbaV0gIT0gYmkubGVhZi0+bWFwW2ldKQoJCXJldHVybiBGY0ZhbHNlOwogICAgfQogICAgcmV0dXJuIGFpLmxlYWYgPT0gYmkubGVhZjsKfQoKc3RhdGljIEZjQm9vbApGY0NoYXJTZXRBZGRMZWFmIChGY0NoYXJTZXQJKmZjcywKCQkgIEZjQ2hhcjMyCXVjczQsCgkJICBGY0NoYXJMZWFmCSpsZWFmKQp7CiAgICBGY0NoYXJMZWFmICAgKm5ldyA9IEZjQ2hhclNldEZpbmRMZWFmQ3JlYXRlIChmY3MsIHVjczQpOwogICAgaWYgKCFuZXcpCglyZXR1cm4gRmNGYWxzZTsKICAgICpuZXcgPSAqbGVhZjsKICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyBGY0NoYXJTZXQgKgpGY0NoYXJTZXRPcGVyYXRlIChjb25zdCBGY0NoYXJTZXQgICAqYSwKCQkgIGNvbnN0IEZjQ2hhclNldCAgICpiLAoJCSAgRmNCb29sCSAgICAoKm92ZXJsYXApIChGY0NoYXJMZWFmCSAgICAqcmVzdWx0LAoJCQkJCQljb25zdCBGY0NoYXJMZWFmICAgICphbCwKCQkJCQkJY29uc3QgRmNDaGFyTGVhZiAgICAqYmwpLAoJCSAgRmNCb29sCWFvbmx5LAoJCSAgRmNCb29sCWJvbmx5KQp7CiAgICBGY0NoYXJTZXQJICAgICpmY3M7CiAgICBGY0NoYXJTZXRJdGVyICAgYWksIGJpOwoKICAgIGZjcyA9IEZjQ2hhclNldENyZWF0ZSAoKTsKICAgIGlmICghZmNzKQoJZ290byBiYWlsMDsKICAgIEZjQ2hhclNldEl0ZXJTdGFydCAoYSwgJmFpKTsKICAgIEZjQ2hhclNldEl0ZXJTdGFydCAoYiwgJmJpKTsKICAgIHdoaWxlICgoYWkubGVhZiB8fCAoYm9ubHkgJiYgYmkubGVhZikpICYmIChiaS5sZWFmIHx8IChhb25seSAmJiBhaS5sZWFmKSkpCiAgICB7CglpZiAoYWkudWNzNCA8IGJpLnVjczQpCgl7CgkgICAgaWYgKGFvbmx5KQoJICAgIHsKCQlpZiAoIUZjQ2hhclNldEFkZExlYWYgKGZjcywgYWkudWNzNCwgYWkubGVhZikpCgkJICAgIGdvdG8gYmFpbDE7CgkJRmNDaGFyU2V0SXRlck5leHQgKGEsICZhaSk7CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJYWkudWNzNCA9IGJpLnVjczQ7CgkJRmNDaGFyU2V0SXRlclNldCAoYSwgJmFpKTsKCSAgICB9Cgl9CgllbHNlIGlmIChiaS51Y3M0IDwgYWkudWNzNCApCgl7CgkgICAgaWYgKGJvbmx5KQoJICAgIHsKCQlpZiAoIUZjQ2hhclNldEFkZExlYWYgKGZjcywgYmkudWNzNCwgYmkubGVhZikpCgkJICAgIGdvdG8gYmFpbDE7CgkJRmNDaGFyU2V0SXRlck5leHQgKGIsICZiaSk7CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJYmkudWNzNCA9IGFpLnVjczQ7CgkJRmNDaGFyU2V0SXRlclNldCAoYiwgJmJpKTsKCSAgICB9Cgl9CgllbHNlCgl7CgkgICAgRmNDaGFyTGVhZiAgbGVhZjsKCgkgICAgaWYgKCgqb3ZlcmxhcCkgKCZsZWFmLCBhaS5sZWFmLCBiaS5sZWFmKSkKCSAgICB7CgkJaWYgKCFGY0NoYXJTZXRBZGRMZWFmIChmY3MsIGFpLnVjczQsICZsZWFmKSkKCQkgICAgZ290byBiYWlsMTsKCSAgICB9CgkgICAgRmNDaGFyU2V0SXRlck5leHQgKGEsICZhaSk7CgkgICAgRmNDaGFyU2V0SXRlck5leHQgKGIsICZiaSk7Cgl9CiAgICB9CiAgICByZXR1cm4gZmNzOwpiYWlsMToKICAgIEZjQ2hhclNldERlc3Ryb3kgKGZjcyk7CmJhaWwwOgogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNDaGFyU2V0SW50ZXJzZWN0TGVhZiAoRmNDaGFyTGVhZiAqcmVzdWx0LAoJCQljb25zdCBGY0NoYXJMZWFmICphbCwKCQkJY29uc3QgRmNDaGFyTGVhZiAqYmwpCnsKICAgIGludAkgICAgaTsKICAgIEZjQm9vbCAgbm9uZW1wdHkgPSBGY0ZhbHNlOwoKICAgIGZvciAoaSA9IDA7IGkgPCAyNTYvMzI7IGkrKykKCWlmICgocmVzdWx0LT5tYXBbaV0gPSBhbC0+bWFwW2ldICYgYmwtPm1hcFtpXSkpCgkgICAgbm9uZW1wdHkgPSBGY1RydWU7CiAgICByZXR1cm4gbm9uZW1wdHk7Cn0KCkZjQ2hhclNldCAqCkZjQ2hhclNldEludGVyc2VjdCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpCnsKICAgIHJldHVybiBGY0NoYXJTZXRPcGVyYXRlIChhLCBiLCBGY0NoYXJTZXRJbnRlcnNlY3RMZWFmLCBGY0ZhbHNlLCBGY0ZhbHNlKTsKfQoKc3RhdGljIEZjQm9vbApGY0NoYXJTZXRVbmlvbkxlYWYgKEZjQ2hhckxlYWYgKnJlc3VsdCwKCQkgICAgY29uc3QgRmNDaGFyTGVhZiAqYWwsCgkJICAgIGNvbnN0IEZjQ2hhckxlYWYgKmJsKQp7CiAgICBpbnQJaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgMjU2LzMyOyBpKyspCglyZXN1bHQtPm1hcFtpXSA9IGFsLT5tYXBbaV0gfCBibC0+bWFwW2ldOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKRmNDaGFyU2V0ICoKRmNDaGFyU2V0VW5pb24gKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKQp7CiAgICByZXR1cm4gRmNDaGFyU2V0T3BlcmF0ZSAoYSwgYiwgRmNDaGFyU2V0VW5pb25MZWFmLCBGY1RydWUsIEZjVHJ1ZSk7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNDaGFyU2V0U3VidHJhY3RMZWFmIChGY0NoYXJMZWFmICpyZXN1bHQsCgkJICAgICAgIGNvbnN0IEZjQ2hhckxlYWYgKmFsLAoJCSAgICAgICBjb25zdCBGY0NoYXJMZWFmICpibCkKewogICAgaW50CSAgICBpOwogICAgRmNCb29sICBub25lbXB0eSA9IEZjRmFsc2U7CgogICAgZm9yIChpID0gMDsgaSA8IDI1Ni8zMjsgaSsrKQoJaWYgKChyZXN1bHQtPm1hcFtpXSA9IGFsLT5tYXBbaV0gJiB+YmwtPm1hcFtpXSkpCgkgICAgbm9uZW1wdHkgPSBGY1RydWU7CiAgICByZXR1cm4gbm9uZW1wdHk7Cn0KCkZjQ2hhclNldCAqCkZjQ2hhclNldFN1YnRyYWN0IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKewogICAgcmV0dXJuIEZjQ2hhclNldE9wZXJhdGUgKGEsIGIsIEZjQ2hhclNldFN1YnRyYWN0TGVhZiwgRmNUcnVlLCBGY0ZhbHNlKTsKfQoKRmNCb29sCkZjQ2hhclNldEhhc0NoYXIgKGNvbnN0IEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KQp7CiAgICBGY0NoYXJMZWFmCSpsZWFmID0gRmNDaGFyU2V0RmluZExlYWYgKGZjcywgdWNzNCk7CiAgICBpZiAoIWxlYWYpCglyZXR1cm4gRmNGYWxzZTsKICAgIHJldHVybiAobGVhZi0+bWFwWyh1Y3M0ICYgMHhmZikgPj4gNV0gJiAoMSA8PCAodWNzNCAmIDB4MWYpKSkgIT0gMDsKfQoKc3RhdGljIEZjQ2hhcjMyCkZjQ2hhclNldFBvcENvdW50IChGY0NoYXIzMiBjMSkKewogICAgLyogaGFja21lbSAxNjkgKi8KICAgIEZjQ2hhcjMyCWMyID0gKGMxID4+IDEpICYgMDMzMzMzMzMzMzMzOwogICAgYzIgPSBjMSAtIGMyIC0gKChjMiA+PiAxKSAmIDAzMzMzMzMzMzMzMyk7CiAgICByZXR1cm4gKCgoYzIgKyAoYzIgPj4gMykpICYgMDMwNzA3MDcwNzA3KSAlIDA3Nyk7Cn0KCkZjQ2hhcjMyCkZjQ2hhclNldEludGVyc2VjdENvdW50IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKewogICAgRmNDaGFyU2V0SXRlciAgIGFpLCBiaTsKICAgIEZjQ2hhcjMyCSAgICBjb3VudCA9IDA7CiAgICAKICAgIEZjQ2hhclNldEl0ZXJTdGFydCAoYSwgJmFpKTsKICAgIEZjQ2hhclNldEl0ZXJTdGFydCAoYiwgJmJpKTsKICAgIHdoaWxlIChhaS5sZWFmICYmIGJpLmxlYWYpCiAgICB7CglpZiAoYWkudWNzNCA9PSBiaS51Y3M0KQoJewoJICAgIEZjQ2hhcjMyCSphbSA9IGFpLmxlYWYtPm1hcDsKCSAgICBGY0NoYXIzMgkqYm0gPSBiaS5sZWFmLT5tYXA7CgkgICAgaW50CQlpID0gMjU2LzMyOwoJICAgIHdoaWxlIChpLS0pCgkJY291bnQgKz0gRmNDaGFyU2V0UG9wQ291bnQgKCphbSsrICYgKmJtKyspOwoJICAgIEZjQ2hhclNldEl0ZXJOZXh0IChhLCAmYWkpOwoJfSAKCWVsc2UgaWYgKGFpLnVjczQgPCBiaS51Y3M0KQoJewoJICAgIGFpLnVjczQgPSBiaS51Y3M0OwoJICAgIEZjQ2hhclNldEl0ZXJTZXQgKGEsICZhaSk7Cgl9CglpZiAoYmkudWNzNCA8IGFpLnVjczQpCgl7CgkgICAgYmkudWNzNCA9IGFpLnVjczQ7CgkgICAgRmNDaGFyU2V0SXRlclNldCAoYiwgJmJpKTsKCX0KICAgIH0KICAgIHJldHVybiBjb3VudDsKfQoKRmNDaGFyMzIKRmNDaGFyU2V0Q291bnQgKGNvbnN0IEZjQ2hhclNldCAqYSkKewogICAgRmNDaGFyU2V0SXRlciAgIGFpOwogICAgRmNDaGFyMzIJICAgIGNvdW50ID0gMDsKICAgIAogICAgZm9yIChGY0NoYXJTZXRJdGVyU3RhcnQgKGEsICZhaSk7IGFpLmxlYWY7IEZjQ2hhclNldEl0ZXJOZXh0IChhLCAmYWkpKQogICAgewoJaW50CQkgICAgaSA9IDI1Ni8zMjsKCUZjQ2hhcjMyCSAgICAqYW0gPSBhaS5sZWFmLT5tYXA7CgoJd2hpbGUgKGktLSkKCSAgICBjb3VudCArPSBGY0NoYXJTZXRQb3BDb3VudCAoKmFtKyspOwogICAgfQogICAgcmV0dXJuIGNvdW50Owp9CgpGY0NoYXIzMgpGY0NoYXJTZXRTdWJ0cmFjdENvdW50IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKewogICAgRmNDaGFyU2V0SXRlciAgIGFpLCBiaTsKICAgIEZjQ2hhcjMyCSAgICBjb3VudCA9IDA7CiAgICAKICAgIEZjQ2hhclNldEl0ZXJTdGFydCAoYSwgJmFpKTsKICAgIEZjQ2hhclNldEl0ZXJTdGFydCAoYiwgJmJpKTsKICAgIHdoaWxlIChhaS5sZWFmKQogICAgewoJaWYgKGFpLnVjczQgPD0gYmkudWNzNCkKCXsKCSAgICBGY0NoYXIzMgkqYW0gPSBhaS5sZWFmLT5tYXA7CgkgICAgaW50CQlpID0gMjU2LzMyOwoJICAgIGlmIChhaS51Y3M0ID09IGJpLnVjczQpCgkgICAgewoJCUZjQ2hhcjMyCSpibSA9IGJpLmxlYWYtPm1hcDs7CgkJd2hpbGUgKGktLSkKCQkgICAgY291bnQgKz0gRmNDaGFyU2V0UG9wQ291bnQgKCphbSsrICYgfipibSsrKTsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQl3aGlsZSAoaS0tKQoJCSAgICBjb3VudCArPSBGY0NoYXJTZXRQb3BDb3VudCAoKmFtKyspOwoJICAgIH0KCSAgICBGY0NoYXJTZXRJdGVyTmV4dCAoYSwgJmFpKTsKCX0KCWVsc2UgaWYgKGJpLmxlYWYpCgl7CgkgICAgYmkudWNzNCA9IGFpLnVjczQ7CgkgICAgRmNDaGFyU2V0SXRlclNldCAoYiwgJmJpKTsKCX0KICAgIH0KICAgIHJldHVybiBjb3VudDsKfQoKLyoKICogcmV0dXJuIEZjVHJ1ZSBpZmYgYSBpcyBhIHN1YnNldCBvZiBiCiAqLwpGY0Jvb2wKRmNDaGFyU2V0SXNTdWJzZXQgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKQp7CiAgICBpbnQJCWFpLCBiaTsKICAgIEZjQ2hhcjE2CWFuLCBibjsKICAgIAogICAgaWYgKGEgPT0gYikgcmV0dXJuIEZjVHJ1ZTsKICAgIGJpID0gMDsKICAgIGFpID0gMDsKICAgIHdoaWxlIChhaSA8IGEtPm51bSAmJiBiaSA8IGItPm51bSkKICAgIHsKCWFuID0gYS0+bnVtYmVyc1thaV07CglibiA9IGItPm51bWJlcnNbYmldOwoJLyoKCSAqIENoZWNrIG1hdGNoaW5nIHBhZ2VzCgkgKi8KCWlmIChhbiA9PSBibikKCXsKCSAgICBGY0NoYXIzMgkqYW0gPSBhLT5sZWF2ZXNbYWldLT5tYXA7CgkgICAgRmNDaGFyMzIJKmJtID0gYi0+bGVhdmVzW2JpXS0+bWFwOwoJICAgIAoJICAgIGlmIChhbSAhPSBibSkKCSAgICB7CgkJaW50CWkgPSAyNTYvMzI7CgkJLyoKCQkgKiBEb2VzIGFtIGhhdmUgYW55IGJpdHMgbm90IGluIGJtPwoJCSAqLwoJCXdoaWxlIChpLS0pCgkJICAgIGlmICgqYW0rKyAmIH4qYm0rKykKCQkJcmV0dXJuIEZjRmFsc2U7CgkgICAgfQoJICAgIGFpKys7CgkgICAgYmkrKzsKCX0KCS8qCgkgKiBEb2VzIGEgaGF2ZSBhbnkgcGFnZXMgbm90IGluIGI/CgkgKi8KCWVsc2UgaWYgKGFuIDwgYm4pCgkgICAgcmV0dXJuIEZjRmFsc2U7CgllbHNlCgl7CgkgICAgaW50CSAgICBsb3cgPSBiaSArIDE7CgkgICAgaW50CSAgICBoaWdoID0gYi0+bnVtIC0gMTsKCgkgICAgLyoKCSAgICAgKiBTZWFyY2ggZm9yIHBhZ2UgJ2FuJyBpbiAnYicKCSAgICAgKi8KCSAgICB3aGlsZSAobG93IDw9IGhpZ2gpCgkgICAgewoJCWludCBtaWQgPSAobG93ICsgaGlnaCkgPj4gMTsKCQlibiA9IGItPm51bWJlcnNbbWlkXTsKCQlpZiAoYm4gPT0gYW4pCgkJewoJCSAgICBoaWdoID0gbWlkOwoJCSAgICBicmVhazsKCQl9CgkJaWYgKGJuIDwgYW4pCgkJICAgIGxvdyA9IG1pZCArIDE7CgkJZWxzZQoJCSAgICBoaWdoID0gbWlkIC0gMTsKCSAgICB9CgkgICAgYmkgPSBoaWdoOwoJICAgIHdoaWxlIChiaSA8IGItPm51bSAmJiBiLT5udW1iZXJzW2JpXSA8IGFuKQoJCWJpKys7Cgl9CiAgICB9CiAgICAvKgogICAgICogZGlkIHdlIGxvb2sgYXQgZXZlcnkgcGFnZT8KICAgICAqLwogICAgcmV0dXJuIGFpID49IGEtPm51bTsKfQoKLyoKICogVGhlc2UgdHdvIGZ1bmN0aW9ucyBlZmZpY2llbnRseSB3YWxrIHRoZSBlbnRpcmUgY2hhcm1hcCBmb3IKICogb3RoZXIgc29mdHdhcmUgKGxpa2UgcGFuZ28pIHRoYXQgd2FudCB0aGVpciBvd24gY29weQogKi8KCkZjQ2hhcjMyCkZjQ2hhclNldE5leHRQYWdlIChjb25zdCBGY0NoYXJTZXQgICphLCAKCQkgICBGY0NoYXIzMgkgICAgbWFwW0ZDX0NIQVJTRVRfTUFQX1NJWkVdLAoJCSAgIEZjQ2hhcjMyCSAgICAqbmV4dCkKewogICAgRmNDaGFyU2V0SXRlciAgIGFpOwogICAgRmNDaGFyMzIJICAgIHBhZ2U7CgogICAgYWkudWNzNCA9ICpuZXh0OwogICAgRmNDaGFyU2V0SXRlclNldCAoYSwgJmFpKTsKICAgIGlmICghYWkubGVhZikKCXJldHVybiBGQ19DSEFSU0VUX0RPTkU7CiAgICAKICAgIC8qCiAgICAgKiBTYXZlIGN1cnJlbnQgaW5mb3JtYXRpb24KICAgICAqLwogICAgcGFnZSA9IGFpLnVjczQ7CiAgICBtZW1jcHkgKG1hcCwgYWkubGVhZi0+bWFwLCBzaXplb2YgKGFpLmxlYWYtPm1hcCkpOwogICAgLyoKICAgICAqIFN0ZXAgdG8gbmV4dCBwYWdlCiAgICAgKi8KICAgIEZjQ2hhclNldEl0ZXJOZXh0IChhLCAmYWkpOwogICAgKm5leHQgPSBhaS51Y3M0OwoKICAgIHJldHVybiBwYWdlOwp9CgpGY0NoYXIzMgpGY0NoYXJTZXRGaXJzdFBhZ2UgKGNvbnN0IEZjQ2hhclNldCAqYSwgCgkJICAgIEZjQ2hhcjMyCSAgICBtYXBbRkNfQ0hBUlNFVF9NQVBfU0laRV0sCgkJICAgIEZjQ2hhcjMyCSAgICAqbmV4dCkKewogICAgKm5leHQgPSAwOwogICAgcmV0dXJuIEZjQ2hhclNldE5leHRQYWdlIChhLCBtYXAsIG5leHQpOwp9CgovKgogKiBvbGQgY292ZXJhZ2UgQVBJLCByYXRoZXIgaGFyZCB0byB1c2UgY29ycmVjdGx5CiAqLwpGY0NoYXIzMgpGY0NoYXJTZXRDb3ZlcmFnZSAoY29uc3QgRmNDaGFyU2V0ICphLCBGY0NoYXIzMiBwYWdlLCBGY0NoYXIzMiAqcmVzdWx0KTsKICAgIApGY0NoYXIzMgpGY0NoYXJTZXRDb3ZlcmFnZSAoY29uc3QgRmNDaGFyU2V0ICphLCBGY0NoYXIzMiBwYWdlLCBGY0NoYXIzMiAqcmVzdWx0KQp7CiAgICBGY0NoYXJTZXRJdGVyICAgYWk7CgogICAgYWkudWNzNCA9IHBhZ2U7CiAgICBGY0NoYXJTZXRJdGVyU2V0IChhLCAmYWkpOwogICAgaWYgKCFhaS5sZWFmKQogICAgewoJbWVtc2V0IChyZXN1bHQsICdcMCcsIDI1NiAvIDgpOwoJcGFnZSA9IDA7CiAgICB9CiAgICBlbHNlCiAgICB7CgltZW1jcHkgKHJlc3VsdCwgYWkubGVhZi0+bWFwLCBzaXplb2YgKGFpLmxlYWYtPm1hcCkpOwoJRmNDaGFyU2V0SXRlck5leHQgKGEsICZhaSk7CglwYWdlID0gYWkudWNzNDsKICAgIH0KICAgIHJldHVybiBwYWdlOwp9CgovKgogKiBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiBjaGFyc2V0cy4KICogCiAqIEVhY2ggbGVhZiBpcyByZXByZXNlbnRlZCBhcyA5IDMyLWJpdCB2YWx1ZXMsIHRoZSBjb2RlIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZm9sbG93ZWQKICogYnkgOCAzMiBiaXQgdmFsdWVzIGZvciB0aGUgbGVhZiBpdHNlbGYuICBFYWNoIHZhbHVlIGlzIGVuY29kZWQgYXMgNSBBU0NJSSBjaGFyYWN0ZXJzLAogKiBvbmx5IDg1IGRpZmZlcmVudCB2YWx1ZXMgYXJlIHVzZWQgdG8gYXZvaWQgY29udHJvbCBjaGFyYWN0ZXJzIGFzIHdlbGwgYXMgdGhlIG90aGVyCiAqIGNoYXJhY3RlcnMgdXNlZCB0byBlbmNvZGUgZm9udCBuYW1lcy4gIDg1Kio1ID4gMl4zMiBzbyB0aGluZ3Mgd29yayBvdXQsIGJ1dAogKiBpdCdzIG5vdCBleGFjdGx5IGh1bWFuIHJlYWRhYmxlIG91dHB1dC4gIEFzIGEgc3BlY2lhbCBjYXNlLCAwIGlzIGVuY29kZWQgYXMgYSBzcGFjZQogKi8KCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyCWNoYXJUb1ZhbHVlWzI1Nl0gPSB7CiAgICAvKiAgICAgIiIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogICAiXGIiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMDIwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDAzMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogICAgIiAiICovIDB4ZmYsICAweDAwLCAgMHhmZiwgIDB4MDEsICAweDAyLCAgMHgwMywgIDB4MDQsICAweGZmLCAKICAgIC8qICAgICIoIiAqLyAweDA1LCAgMHgwNiwgIDB4MDcsICAweDA4LCAgMHhmZiwgIDB4ZmYsICAweDA5LCAgMHgwYSwgCiAgICAvKiAgICAiMCIgKi8gMHgwYiwgIDB4MGMsICAweDBkLCAgMHgwZSwgIDB4MGYsICAweDEwLCAgMHgxMSwgIDB4MTIsIAogICAgLyogICAgIjgiICovIDB4MTMsICAweDE0LCAgMHhmZiwgIDB4MTUsICAweDE2LCAgMHhmZiwgIDB4MTcsICAweDE4LCAKICAgIC8qICAgICJAIiAqLyAweDE5LCAgMHgxYSwgIDB4MWIsICAweDFjLCAgMHgxZCwgIDB4MWUsICAweDFmLCAgMHgyMCwgCiAgICAvKiAgICAiSCIgKi8gMHgyMSwgIDB4MjIsICAweDIzLCAgMHgyNCwgIDB4MjUsICAweDI2LCAgMHgyNywgIDB4MjgsIAogICAgLyogICAgIlAiICovIDB4MjksICAweDJhLCAgMHgyYiwgIDB4MmMsICAweDJkLCAgMHgyZSwgIDB4MmYsICAweDMwLCAKICAgIC8qICAgICJYIiAqLyAweDMxLCAgMHgzMiwgIDB4MzMsICAweDM0LCAgMHhmZiwgIDB4MzUsICAweDM2LCAgMHhmZiwgCiAgICAvKiAgICAiYCIgKi8gMHhmZiwgIDB4MzcsICAweDM4LCAgMHgzOSwgIDB4M2EsICAweDNiLCAgMHgzYywgIDB4M2QsIAogICAgLyogICAgImgiICovIDB4M2UsICAweDNmLCAgMHg0MCwgIDB4NDEsICAweDQyLCAgMHg0MywgIDB4NDQsICAweDQ1LCAKICAgIC8qICAgICJwIiAqLyAweDQ2LCAgMHg0NywgIDB4NDgsICAweDQ5LCAgMHg0YSwgIDB4NGIsICAweDRjLCAgMHg0ZCwgCiAgICAvKiAgICAieCIgKi8gMHg0ZSwgIDB4NGYsICAweDUwLCAgMHg1MSwgIDB4NTIsICAweDUzLCAgMHg1NCwgIDB4ZmYsIAogICAgLyogIlwyMDAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMjEwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDIyMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwyMzAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMjQwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDI1MCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwyNjAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMjcwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDMwMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwzMTAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMzIwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDMzMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwzNDAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMzUwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDM2MCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwzNzAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKfTsKCnN0YXRpYyBjb25zdCBGY0NoYXI4IHZhbHVlVG9DaGFyWzB4NTVdID0gewogICAgLyogMHgwMCAqLyAnIScsICcjJywgJyQnLCAnJScsICcmJywgJygnLCAnKScsICcqJywKICAgIC8qIDB4MDggKi8gJysnLCAnLicsICcvJywgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsCiAgICAvKiAweDEwICovICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnOycsICc8JywgJz4nLAogICAgLyogMHgxOCAqLyAnPycsICdAJywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywKICAgIC8qIDB4MjAgKi8gJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsCiAgICAvKiAweDI4ICovICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLAogICAgLyogMHgzMCAqLyAnVycsICdYJywgJ1knLCAnWicsICdbJywgJ10nLCAnXicsICdhJywKICAgIC8qIDB4MzggKi8gJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsCiAgICAvKiAweDQwICovICdqJywgJ2snLCAnbCcsICdtJywgJ24nLCAnbycsICdwJywgJ3EnLAogICAgLyogMHg0OCAqLyAncicsICdzJywgJ3QnLCAndScsICd2JywgJ3cnLCAneCcsICd5JywKICAgIC8qIDB4NTAgKi8gJ3onLCAneycsICd8JywgJ30nLCAnficsCn07CgpzdGF0aWMgRmNDaGFyOCAqCkZjQ2hhclNldFBhcnNlVmFsdWUgKEZjQ2hhcjggKnN0cmluZywgRmNDaGFyMzIgKnZhbHVlKQp7CiAgICBpbnQJCWk7CiAgICBGY0NoYXIzMgl2OwogICAgRmNDaGFyMzIJYzsKICAgIAogICAgaWYgKCpzdHJpbmcgPT0gJyAnKQogICAgewoJdiA9IDA7CglzdHJpbmcrKzsKICAgIH0KICAgIGVsc2UKICAgIHsKCXYgPSAwOwoJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKCXsKCSAgICBpZiAoIShjID0gKEZjQ2hhcjMyKSAodW5zaWduZWQgY2hhcikgKnN0cmluZysrKSkKCQlyZXR1cm4gMDsKCSAgICBjID0gY2hhclRvVmFsdWVbY107CgkgICAgaWYgKGMgPT0gMHhmZikKCQlyZXR1cm4gMDsKCSAgICB2ID0gdiAqIDg1ICsgYzsKCX0KICAgIH0KICAgICp2YWx1ZSA9IHY7CiAgICByZXR1cm4gc3RyaW5nOwp9CgpzdGF0aWMgRmNCb29sCkZjQ2hhclNldFVucGFyc2VWYWx1ZSAoRmNTdHJCdWYgKmJ1ZiwgRmNDaGFyMzIgdmFsdWUpCnsKICAgIGludAkgICAgaTsKICAgIGlmICh2YWx1ZSA9PSAwKQogICAgewoJcmV0dXJuIEZjU3RyQnVmQ2hhciAoYnVmLCAnICcpOwogICAgfQogICAgZWxzZQogICAgewoJRmNDaGFyOAlzdHJpbmdbNl07CglGY0NoYXI4CSpzID0gc3RyaW5nICsgNTsKCXN0cmluZ1s1XSA9ICdcMCc7Cglmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQoJewoJICAgICotLXMgPSB2YWx1ZVRvQ2hhclt2YWx1ZSAlIDg1XTsKCSAgICB2YWx1ZSAvPSA4NTsKCX0KCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCgkgICAgaWYgKCFGY1N0ckJ1ZkNoYXIgKGJ1ZiwgKnMrKykpCgkJcmV0dXJuIEZjRmFsc2U7CiAgICB9CiAgICByZXR1cm4gRmNUcnVlOwp9Cgp0eXBlZGVmIHN0cnVjdCBfRmNDaGFyTGVhZkVudCBGY0NoYXJMZWFmRW50OwoKc3RydWN0IF9GY0NoYXJMZWFmRW50IHsKICAgIEZjQ2hhckxlYWZFbnQgICAqbmV4dDsKICAgIEZjQ2hhcjMyCSAgICBoYXNoOwogICAgRmNDaGFyTGVhZgkgICAgbGVhZjsKfTsKCiNkZWZpbmUgRkNfQ0hBUl9MRUFGX0JMT0NLCSg0MDk2IC8gc2l6ZW9mIChGY0NoYXJMZWFmRW50KSkKc3RhdGljIEZjQ2hhckxlYWZFbnQgKipGY0NoYXJMZWFmQmxvY2tzOwpzdGF0aWMgaW50IEZjQ2hhckxlYWZCbG9ja0NvdW50OwoKc3RhdGljIEZjQ2hhckxlYWZFbnQgKgpGY0NoYXJMZWFmRW50Q3JlYXRlICh2b2lkKQp7CiAgICBzdGF0aWMgRmNDaGFyTGVhZkVudCAgICAqYmxvY2s7CiAgICBzdGF0aWMgaW50CQkgICAgcmVtYWluOwoKICAgIGlmICghcmVtYWluKQogICAgewoJRmNDaGFyTGVhZkVudCAqKm5ld0Jsb2NrczsKCglGY0NoYXJMZWFmQmxvY2tDb3VudCsrOwoJbmV3QmxvY2tzID0gcmVhbGxvYyAoRmNDaGFyTGVhZkJsb2NrcywgRmNDaGFyTGVhZkJsb2NrQ291bnQgKiBzaXplb2YgKEZjQ2hhckxlYWZFbnQgKikpOwoJaWYgKCFuZXdCbG9ja3MpCgkgICAgcmV0dXJuIDA7CglGY0NoYXJMZWFmQmxvY2tzID0gbmV3QmxvY2tzOwoJYmxvY2sgPSBGY0NoYXJMZWFmQmxvY2tzW0ZjQ2hhckxlYWZCbG9ja0NvdW50LTFdID0gbWFsbG9jIChGQ19DSEFSX0xFQUZfQkxPQ0sgKiBzaXplb2YgKEZjQ2hhckxlYWZFbnQpKTsKCWlmICghYmxvY2spCgkgICAgcmV0dXJuIDA7CglGY01lbUFsbG9jIChGQ19NRU1fQ0hBUkxFQUYsIEZDX0NIQVJfTEVBRl9CTE9DSyAqIHNpemVvZiAoRmNDaGFyTGVhZkVudCkpOwoJcmVtYWluID0gRkNfQ0hBUl9MRUFGX0JMT0NLOwogICAgfQogICAgcmVtYWluLS07CiAgICByZXR1cm4gYmxvY2srKzsKfQoKI2RlZmluZSBGQ19DSEFSX0xFQUZfSEFTSF9TSVpFCTI1NwoKc3RhdGljIEZjQ2hhcjMyCkZjQ2hhckxlYWZIYXNoIChGY0NoYXJMZWFmICpsZWFmKQp7CiAgICBGY0NoYXIzMgloYXNoID0gMDsKICAgIGludAkJaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgMjU2LzMyOyBpKyspCgloYXNoID0gKChoYXNoIDw8IDEpIHwgKGhhc2ggPj4gMzEpKSBeIGxlYWYtPm1hcFtpXTsKICAgIHJldHVybiBoYXNoOwp9CgpzdGF0aWMgaW50CUZjQ2hhckxlYWZUb3RhbDsKc3RhdGljIGludAlGY0NoYXJMZWFmVXNlZDsKCnN0YXRpYyBGY0NoYXJMZWFmRW50CSpGY0NoYXJMZWFmSGFzaFRhYmxlW0ZDX0NIQVJfTEVBRl9IQVNIX1NJWkVdOwoKc3RhdGljIEZjQ2hhckxlYWYgKgpGY0NoYXJTZXRGcmVlemVMZWFmIChGY0NoYXJMZWFmICpsZWFmKQp7CiAgICBGY0NoYXIzMgkJCWhhc2ggPSBGY0NoYXJMZWFmSGFzaCAobGVhZik7CiAgICBGY0NoYXJMZWFmRW50CQkqKmJ1Y2tldCA9ICZGY0NoYXJMZWFmSGFzaFRhYmxlW2hhc2ggJSBGQ19DSEFSX0xFQUZfSEFTSF9TSVpFXTsKICAgIEZjQ2hhckxlYWZFbnQJCSplbnQ7CiAgICAKICAgIEZjQ2hhckxlYWZUb3RhbCsrOwogICAgZm9yIChlbnQgPSAqYnVja2V0OyBlbnQ7IGVudCA9IGVudC0+bmV4dCkKICAgIHsKCWlmIChlbnQtPmhhc2ggPT0gaGFzaCAmJiAhbWVtY21wICgmZW50LT5sZWFmLCBsZWFmLCBzaXplb2YgKEZjQ2hhckxlYWYpKSkKCSAgICByZXR1cm4gJmVudC0+bGVhZjsKICAgIH0KCiAgICBlbnQgPSBGY0NoYXJMZWFmRW50Q3JlYXRlKCk7CiAgICBpZiAoIWVudCkKCXJldHVybiAwOwogICAgRmNDaGFyTGVhZlVzZWQrKzsKICAgIGVudC0+bGVhZiA9ICpsZWFmOwogICAgZW50LT5oYXNoID0gaGFzaDsKICAgIGVudC0+bmV4dCA9ICpidWNrZXQ7CiAgICAqYnVja2V0ID0gZW50OwogICAgcmV0dXJuICZlbnQtPmxlYWY7Cn0KCnN0YXRpYyB2b2lkCkZjQ2hhclNldFRoYXdBbGxMZWFmICh2b2lkKQp7CiAgICBpbnQgaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgRkNfQ0hBUl9MRUFGX0hBU0hfU0laRTsgaSsrKQoJRmNDaGFyTGVhZkhhc2hUYWJsZVtpXSA9IDA7CgogICAgRmNDaGFyTGVhZlRvdGFsID0gMDsKICAgIEZjQ2hhckxlYWZVc2VkID0gMDsKCiAgICBmb3IgKGkgPSAwOyBpIDwgRmNDaGFyTGVhZkJsb2NrQ291bnQ7IGkrKykKCWZyZWUgKEZjQ2hhckxlYWZCbG9ja3NbaV0pOwoKICAgIGZyZWUgKEZjQ2hhckxlYWZCbG9ja3MpOwogICAgRmNDaGFyTGVhZkJsb2NrcyA9IDA7CiAgICBGY0NoYXJMZWFmQmxvY2tDb3VudCA9IDA7Cn0KCnR5cGVkZWYgc3RydWN0IF9GY0NoYXJTZXRFbnQgRmNDaGFyU2V0RW50OwoKc3RydWN0IF9GY0NoYXJTZXRFbnQgewogICAgRmNDaGFyU2V0RW50CSpuZXh0OwogICAgRmNDaGFyMzIJCWhhc2g7CiAgICBGY0NoYXJTZXQJCXNldDsKfTsKCiNkZWZpbmUgRkNfQ0hBUl9TRVRfSEFTSF9TSVpFICAgIDY3CgpzdGF0aWMgRmNDaGFyMzIKRmNDaGFyU2V0SGFzaCAoRmNDaGFyU2V0ICpmY3MpCnsKICAgIEZjQ2hhcjMyCWhhc2ggPSAwOwogICAgRmNDaGFyMzIJKnA7CiAgICBpbnQJCWk7CgogICAgLyogaGFzaCBpbiBsZWF2ZXMgKi8KICAgIHAgPSAoRmNDaGFyMzIgKikgZmNzLT5sZWF2ZXM7CiAgICBmb3IgKGkgPSAwOyBpIDwgZmNzLT5udW0gKiBzaXplb2YgKEZjQ2hhckxlYWYgKikgLyBzaXplb2YgKEZjQ2hhcjMyKTsgaSsrKQoJaGFzaCA9ICgoaGFzaCA8PCAxKSB8IChoYXNoID4+IDMxKSkgXiAqcCsrOwogICAgLyogaGFzaCBpbiBudW1iZXJzICovCiAgICBmb3IgKGkgPSAwOyBpIDwgZmNzLT5udW07IGkrKykKCWhhc2ggPSAoKGhhc2ggPDwgMSkgfCAoaGFzaCA+PiAzMSkpIF4gZmNzLT5udW1iZXJzW2ldOwogICAgcmV0dXJuIGhhc2g7Cn0KCnN0YXRpYyBpbnQJRmNDaGFyU2V0VG90YWw7CnN0YXRpYyBpbnQJRmNDaGFyU2V0VXNlZDsKc3RhdGljIGludAlGY0NoYXJTZXRUb3RhbEVudHMsIEZjQ2hhclNldFVzZWRFbnRzOwoKc3RhdGljIEZjQ2hhclNldEVudAkqRmNDaGFyU2V0SGFzaFRhYmxlW0ZDX0NIQVJfU0VUX0hBU0hfU0laRV07CgpzdGF0aWMgRmNDaGFyU2V0ICoKRmNDaGFyU2V0RnJlZXplQmFzZSAoRmNDaGFyU2V0ICpmY3MpCnsKICAgIEZjQ2hhcjMyCQloYXNoID0gRmNDaGFyU2V0SGFzaCAoZmNzKTsKICAgIEZjQ2hhclNldEVudAkqKmJ1Y2tldCA9ICZGY0NoYXJTZXRIYXNoVGFibGVbaGFzaCAlIEZDX0NIQVJfU0VUX0hBU0hfU0laRV07CiAgICBGY0NoYXJTZXRFbnQJKmVudDsKICAgIGludAkJCXNpemU7CgogICAgRmNDaGFyU2V0VG90YWwrKzsKICAgIEZjQ2hhclNldFRvdGFsRW50cyArPSBmY3MtPm51bTsKICAgIGZvciAoZW50ID0gKmJ1Y2tldDsgZW50OyBlbnQgPSBlbnQtPm5leHQpCiAgICB7CglpZiAoZW50LT5oYXNoID09IGhhc2ggJiYKCSAgICBlbnQtPnNldC5udW0gPT0gZmNzLT5udW0gJiYKCSAgICAhbWVtY21wIChlbnQtPnNldC5sZWF2ZXMsIGZjcy0+bGVhdmVzLAoJCSAgICAgZmNzLT5udW0gKiBzaXplb2YgKEZjQ2hhckxlYWYgKikpICYmCgkgICAgIW1lbWNtcCAoZW50LT5zZXQubnVtYmVycywgZmNzLT5udW1iZXJzLAoJCSAgICAgZmNzLT5udW0gKiBzaXplb2YgKEZjQ2hhcjE2KSkpCgl7CgkgICAgcmV0dXJuICZlbnQtPnNldDsKCX0KICAgIH0KCiAgICBzaXplID0gKHNpemVvZiAoRmNDaGFyU2V0RW50KSArCgkgICAgZmNzLT5udW0gKiBzaXplb2YgKEZjQ2hhckxlYWYgKikgKwoJICAgIGZjcy0+bnVtICogc2l6ZW9mIChGY0NoYXIxNikpOwogICAgZW50ID0gbWFsbG9jIChzaXplKTsKICAgIGlmICghZW50KQoJcmV0dXJuIDA7CiAgICBGY01lbUFsbG9jIChGQ19NRU1fQ0hBUlNFVCwgc2l6ZSk7CiAgICBGY0NoYXJTZXRVc2VkKys7CiAgICBGY0NoYXJTZXRVc2VkRW50cyArPSBmY3MtPm51bTsKICAgIAogICAgZW50LT5zZXQucmVmID0gRkNfUkVGX0NPTlNUQU5UOwogICAgZW50LT5zZXQubnVtID0gZmNzLT5udW07CiAgICBpZiAoZmNzLT5udW0pCiAgICB7CgllbnQtPnNldC5sZWF2ZXMgPSAoRmNDaGFyTGVhZiAqKikgKGVudCArIDEpOwoJZW50LT5zZXQubnVtYmVycyA9IChGY0NoYXIxNiAqKSAoZW50LT5zZXQubGVhdmVzICsgZmNzLT5udW0pOwoJbWVtY3B5IChlbnQtPnNldC5sZWF2ZXMsIGZjcy0+bGVhdmVzLCBmY3MtPm51bSAqIHNpemVvZiAoRmNDaGFyTGVhZiAqKSk7CgltZW1jcHkgKGVudC0+c2V0Lm51bWJlcnMsIGZjcy0+bnVtYmVycywgZmNzLT5udW0gKiBzaXplb2YgKEZjQ2hhcjE2KSk7CiAgICB9CiAgICBlbHNlCiAgICB7CgllbnQtPnNldC5sZWF2ZXMgPSAwOwoJZW50LT5zZXQubnVtYmVycyA9IDA7CiAgICB9CgogICAgZW50LT5oYXNoID0gaGFzaDsKICAgIGVudC0+bmV4dCA9ICpidWNrZXQ7CiAgICAqYnVja2V0ID0gZW50OwogICAgcmV0dXJuICZlbnQtPnNldDsKfQoKdm9pZApGY0NoYXJTZXRUaGF3QWxsICh2b2lkKQp7CiAgICBpbnQgaTsKICAgIEZjQ2hhclNldEVudAkqZW50LCAqbmV4dDsKCiAgICBmb3IgKGkgPSAwOyBpIDwgRkNfQ0hBUl9TRVRfSEFTSF9TSVpFOyBpKyspCiAgICB7Cglmb3IgKGVudCA9IEZjQ2hhclNldEhhc2hUYWJsZVtpXTsgZW50OyBlbnQgPSBuZXh0KQoJewoJICAgIG5leHQgPSBlbnQtPm5leHQ7CgkgICAgZnJlZSAoZW50KTsKCX0KCUZjQ2hhclNldEhhc2hUYWJsZVtpXSA9IDA7CiAgICB9CgogICAgRmNDaGFyU2V0VG90YWwgPSAwOwogICAgRmNDaGFyU2V0VG90YWxFbnRzID0gMDsKICAgIEZjQ2hhclNldFVzZWQgPSAwOwogICAgRmNDaGFyU2V0VXNlZEVudHMgPSAwOwoKICAgIEZjQ2hhclNldFRoYXdBbGxMZWFmICgpOwp9CgpGY0NoYXJTZXQgKgpGY0NoYXJTZXRGcmVlemUgKEZjQ2hhclNldCAqZmNzKQp7CiAgICBGY0NoYXJTZXQJKmI7CiAgICBGY0NoYXJTZXQJKm4gPSAwOwogICAgRmNDaGFyTGVhZgkqbDsKICAgIGludAkJaTsKCiAgICBiID0gRmNDaGFyU2V0Q3JlYXRlICgpOwogICAgaWYgKCFiKQoJZ290byBiYWlsMDsKICAgIGZvciAoaSA9IDA7IGkgPCBmY3MtPm51bTsgaSsrKQogICAgewoJbCA9IEZjQ2hhclNldEZyZWV6ZUxlYWYgKGZjcy0+bGVhdmVzW2ldKTsKCWlmICghbCkKCSAgICBnb3RvIGJhaWwxOwoJaWYgKCFGY0NoYXJTZXRJbnNlcnRMZWFmIChiLCBmY3MtPm51bWJlcnNbaV0gPDwgOCwgbCkpCgkgICAgZ290byBiYWlsMTsKICAgIH0KICAgIG4gPSBGY0NoYXJTZXRGcmVlemVCYXNlIChiKTsKYmFpbDE6CiAgICBpZiAoYi0+bGVhdmVzKQogICAgewoJRmNNZW1GcmVlIChGQ19NRU1fQ0hBUlNFVCwgYi0+bnVtICogc2l6ZW9mIChGY0NoYXJMZWFmICopKTsKCWZyZWUgKGItPmxlYXZlcyk7CiAgICB9CiAgICBpZiAoYi0+bnVtYmVycykKICAgIHsKCUZjTWVtRnJlZSAoRkNfTUVNX0NIQVJTRVQsIGItPm51bSAqIHNpemVvZiAoRmNDaGFyMTYpKTsKCWZyZWUgKGItPm51bWJlcnMpOwogICAgfQogICAgRmNNZW1GcmVlIChGQ19NRU1fQ0hBUlNFVCwgc2l6ZW9mIChGY0NoYXJTZXQpKTsKICAgIGZyZWUgKGIpOwpiYWlsMDoKICAgIHJldHVybiBuOwp9CgpGY0NoYXJTZXQgKgpGY05hbWVQYXJzZUNoYXJTZXQgKEZjQ2hhcjggKnN0cmluZykKewogICAgRmNDaGFyU2V0CSpjLCAqbiA9IDA7CiAgICBGY0NoYXIzMgl1Y3M0OwogICAgRmNDaGFyTGVhZgkqbGVhZjsKICAgIEZjQ2hhckxlYWYJdGVtcDsKICAgIEZjQ2hhcjMyCWJpdHM7CiAgICBpbnQJCWk7CgogICAgYyA9IEZjQ2hhclNldENyZWF0ZSAoKTsKICAgIGlmICghYykKCWdvdG8gYmFpbDA7CiAgICB3aGlsZSAoKnN0cmluZykKICAgIHsKCXN0cmluZyA9IEZjQ2hhclNldFBhcnNlVmFsdWUgKHN0cmluZywgJnVjczQpOwoJaWYgKCFzdHJpbmcpCgkgICAgZ290byBiYWlsMTsKCWJpdHMgPSAwOwoJZm9yIChpID0gMDsgaSA8IDI1Ni8zMjsgaSsrKQoJewoJICAgIHN0cmluZyA9IEZjQ2hhclNldFBhcnNlVmFsdWUgKHN0cmluZywgJnRlbXAubWFwW2ldKTsKCSAgICBpZiAoIXN0cmluZykKCQlnb3RvIGJhaWwxOwoJICAgIGJpdHMgfD0gdGVtcC5tYXBbaV07Cgl9CglpZiAoYml0cykKCXsKCSAgICBsZWFmID0gRmNDaGFyU2V0RnJlZXplTGVhZiAoJnRlbXApOwoJICAgIGlmICghbGVhZikKCQlnb3RvIGJhaWwxOwoJICAgIGlmICghRmNDaGFyU2V0SW5zZXJ0TGVhZiAoYywgdWNzNCwgbGVhZikpCgkJZ290byBiYWlsMTsKCX0KICAgIH0KI2lmZGVmIENIQVRUWQogICAgcHJpbnRmICgiICAgICAgICAgICU4cyAlOHMgJThzICU4c1xuIiwgInRvdGFsIiwgInRvdGFsbWVtIiwgIm5ldyIsICJuZXdtZW0iKTsKICAgIHByaW50ZiAoIkxlYXZlczogICAlOGQgJThkICU4ZCAlOGRcbiIsCgkgICAgRmNDaGFyTGVhZlRvdGFsLCBzaXplb2YgKEZjQ2hhckxlYWYpICogRmNDaGFyTGVhZlRvdGFsLAoJICAgIEZjQ2hhckxlYWZVc2VkLCBzaXplb2YgKEZjQ2hhckxlYWYpICogRmNDaGFyTGVhZlVzZWQpOwogICAgcHJpbnRmICgiQ2hhcnNldHM6ICU4ZCAlOGQgJThkICU4ZFxuIiwKCSAgICBGY0NoYXJTZXRUb3RhbCwgc2l6ZW9mIChGY0NoYXJTZXQpICogRmNDaGFyU2V0VG90YWwsCgkgICAgRmNDaGFyU2V0VXNlZCwgc2l6ZW9mIChGY0NoYXJTZXQpICogRmNDaGFyU2V0VXNlZCk7CiAgICBwcmludGYgKCJUYWJsZXM6ICAgJThkICU4ZCAlOGQgJThkXG4iLAoJICAgIEZjQ2hhclNldFRvdGFsRW50cywgRmNDaGFyU2V0VG90YWxFbnRzICogKHNpemVvZiAoRmNDaGFyTGVhZiAqKSArIHNpemVvZiAoRmNDaGFyMTYpKSwKCSAgICBGY0NoYXJTZXRVc2VkRW50cywgRmNDaGFyU2V0VXNlZEVudHMgKiAoc2l6ZW9mIChGY0NoYXJMZWFmICopICsgc2l6ZW9mIChGY0NoYXIxNikpKTsKICAgIHByaW50ZiAoIlRvdGFsOiAgICAlOHMgJThkICU4cyAlOGRcbiIsIAoJICAgICIiLCAKCSAgICBzaXplb2YgKEZjQ2hhckxlYWYpICogRmNDaGFyTGVhZlRvdGFsICsKCSAgICBzaXplb2YgKEZjQ2hhclNldCkgKiBGY0NoYXJTZXRUb3RhbCArCgkgICAgRmNDaGFyU2V0VG90YWxFbnRzICogKHNpemVvZiAoRmNDaGFyTGVhZiAqKSArIHNpemVvZiAoRmNDaGFyMTYpKSwKCSAgICAiIiwKCSAgICBzaXplb2YgKEZjQ2hhckxlYWYpICogRmNDaGFyTGVhZlVzZWQgKwoJICAgIHNpemVvZiAoRmNDaGFyU2V0KSAqIEZjQ2hhclNldFVzZWQgKwoJICAgIEZjQ2hhclNldFVzZWRFbnRzICogKHNpemVvZiAoRmNDaGFyTGVhZiAqKSArIHNpemVvZiAoRmNDaGFyMTYpKSk7CiNlbmRpZgogICAgbiA9IEZjQ2hhclNldEZyZWV6ZUJhc2UgKGMpOwpiYWlsMToKICAgIGlmIChjLT5sZWF2ZXMpCiAgICB7CglGY01lbUZyZWUgKEZDX01FTV9DSEFSU0VULCBjLT5udW0gKiBzaXplb2YgKEZjQ2hhckxlYWYgKikpOwoJZnJlZSAoYy0+bGVhdmVzKTsKICAgIH0KICAgIGlmIChjLT5udW1iZXJzKQogICAgewoJRmNNZW1GcmVlIChGQ19NRU1fQ0hBUlNFVCwgYy0+bnVtICogc2l6ZW9mIChGY0NoYXIxNikpOwoJZnJlZSAoYy0+bnVtYmVycyk7CiAgICB9CiAgICBGY01lbUZyZWUgKEZDX01FTV9DSEFSU0VULCBzaXplb2YgKEZjQ2hhclNldCkpOwogICAgZnJlZSAoYyk7CmJhaWwwOgogICAgcmV0dXJuIG47Cn0KCkZjQm9vbApGY05hbWVVbnBhcnNlQ2hhclNldCAoRmNTdHJCdWYgKmJ1ZiwgY29uc3QgRmNDaGFyU2V0ICpjKQp7CiAgICBGY0NoYXJTZXRJdGVyICAgY2k7CiAgICBpbnQJCSAgICBpOwojaWZkZWYgQ0hFQ0sKICAgIGludAkJICAgIGxlbiA9IGJ1Zi0+bGVuOwojZW5kaWYKCiAgICBmb3IgKEZjQ2hhclNldEl0ZXJTdGFydCAoYywgJmNpKTsKCSBjaS5sZWFmOwoJIEZjQ2hhclNldEl0ZXJOZXh0IChjLCAmY2kpKQogICAgewoJaWYgKCFGY0NoYXJTZXRVbnBhcnNlVmFsdWUgKGJ1ZiwgY2kudWNzNCkpCgkgICAgcmV0dXJuIEZjRmFsc2U7Cglmb3IgKGkgPSAwOyBpIDwgMjU2LzMyOyBpKyspCgkgICAgaWYgKCFGY0NoYXJTZXRVbnBhcnNlVmFsdWUgKGJ1ZiwgY2kubGVhZi0+bWFwW2ldKSkKCQlyZXR1cm4gRmNGYWxzZTsKICAgIH0KI2lmZGVmIENIRUNLCiAgICB7CglGY0NoYXJTZXQJKmNoZWNrOwoJRmNDaGFyMzIJbWlzc2luZzsKCUZjQ2hhclNldEl0ZXIJY2ksIGNoZWNraTsKCQoJLyogbnVsbCB0ZXJtaW5hdGUgZm9yIHBhcnNlciAqLwoJRmNTdHJCdWZDaGFyIChidWYsICdcMCcpOwoJLyogc3RlcCBiYWNrIG92ZXIgbnVsbCBmb3IgbGlmZSBhZnRlciB0ZXN0ICovCglidWYtPmxlbi0tOwoJY2hlY2sgPSBGY05hbWVQYXJzZUNoYXJTZXQgKGJ1Zi0+YnVmICsgbGVuKTsKCUZjQ2hhclNldEl0ZXJTdGFydCAoYywgJmNpKTsKCUZjQ2hhclNldEl0ZXJTdGFydCAoY2hlY2ssICZjaGVja2kpOwoJd2hpbGUgKGNpLmxlYWYgfHwgY2hlY2tpLmxlYWYpCgl7CgkgICAgaWYgKGNpLnVjczQgPCBjaGVja2kudWNzNCkKCSAgICB7CgkJcHJpbnRmICgiTWlzc2luZyBsZWFmIG5vZGUgYXQgMHgleFxuIiwgY2kudWNzNCk7CgkJRmNDaGFyU2V0SXRlck5leHQgKGMsICZjaSk7CgkgICAgfQoJICAgIGVsc2UgaWYgKGNoZWNraS51Y3M0IDwgY2kudWNzNCkKCSAgICB7CgkJcHJpbnRmICgiRXh0cmEgbGVhZiBub2RlIGF0IDB4JXhcbiIsIGNoZWNraS51Y3M0KTsKCQlGY0NoYXJTZXRJdGVyTmV4dCAoY2hlY2ssICZjaGVja2kpOwoJICAgIH0KCSAgICBlbHNlCgkgICAgewoJCWludAkgICAgaSA9IDI1Ni8zMjsKCQlGY0NoYXIzMiAgICAqY20gPSBjaS5sZWFmLT5tYXA7CgkJRmNDaGFyMzIgICAgKmNoZWNrbSA9IGNoZWNraS5sZWFmLT5tYXA7CgoJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gMzIpCgkJewoJCSAgICBpZiAoKmNtICE9ICpjaGVja20pCgkJCXByaW50ZiAoIk1pc21hdGNoaW5nIHNldHMgYXQgMHglMDh4OiAweCUwOHggIT0gMHglMDh4XG4iLAoJCQkJY2kudWNzNCArIGksICpjbSwgKmNoZWNrbSk7CgkJICAgIGNtKys7CgkJICAgIGNoZWNrbSsrOwoJCX0KCQlGY0NoYXJTZXRJdGVyTmV4dCAoYywgJmNpKTsKCQlGY0NoYXJTZXRJdGVyTmV4dCAoY2hlY2ssICZjaGVja2kpOwoJICAgIH0KCX0KCWlmICgobWlzc2luZyA9IEZjQ2hhclNldFN1YnRyYWN0Q291bnQgKGMsIGNoZWNrKSkpCgkgICAgcHJpbnRmICgiJWQgbWlzc2luZyBpbiByZXBhcnNlZCByZXN1bHRcbiIsIG1pc3NpbmcpOwoJaWYgKChtaXNzaW5nID0gRmNDaGFyU2V0U3VidHJhY3RDb3VudCAoY2hlY2ssIGMpKSkKCSAgICBwcmludGYgKCIlZCBleHRyYSBpbiByZXBhcnNlZCByZXN1bHRcbiIsIG1pc3NpbmcpOwoJRmNDaGFyU2V0RGVzdHJveSAoY2hlY2spOwogICAgfQojZW5kaWYKICAgIAogICAgcmV0dXJuIEZjVHJ1ZTsKfQo=