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+bnVtYmVyc1thaV07CglibiA9IGItPm51bWJlcnNbYmldOwoJaWYgKGFuID09IGJuKQoJewoJICAgIEZjQ2hhcjMyCSphbSA9IGEtPmxlYXZlc1thaV0tPm1hcDsKCSAgICBGY0NoYXIzMgkqYm0gPSBiLT5sZWF2ZXNbYmldLT5tYXA7CgkgICAgCgkgICAgaWYgKGFtICE9IGJtKQoJICAgIHsKCQlpbnQJaSA9IDI1Ni8zMjsKCQl3aGlsZSAoaS0tKQoJCSAgICBpZiAoKmFtKysgJiB+KmJtKyspCgkJCXJldHVybiBGY0ZhbHNlOwoJICAgIH0KCSAgICBhaSsrOwoJICAgIGJpKys7Cgl9CgllbHNlIGlmIChhbiA8IGJuKQoJICAgIHJldHVybiBGY0ZhbHNlOwoJZWxzZQoJewoJICAgIGludAkgICAgbG93ID0gYmkgKyAxOwoJICAgIGludAkgICAgaGlnaCA9IGItPm51bSAtIDE7CgoJICAgIHdoaWxlIChsb3cgPD0gaGlnaCkKCSAgICB7CgkJaW50IG1pZCA9IChsb3cgKyBoaWdoKSA+PiAxOwoJCWJuID0gYi0+bnVtYmVyc1ttaWRdOwoJCWlmIChibiA9PSBhbikKCQl7CgkJICAgIGhpZ2ggPSBtaWQ7CgkJICAgIGJyZWFrOwoJCX0KCQlpZiAoYm4gPCBhbikKCQkgICAgbG93ID0gbWlkICsgMTsKCQllbHNlCgkJICAgIGhpZ2ggPSBtaWQgLSAxOwoJICAgIH0KCSAgICBiaSA9IGhpZ2g7CgkgICAgd2hpbGUgKGJpIDwgYi0+bnVtICYmIGItPm51bWJlcnNbYmldIDwgYW4pCgkJYmkrKzsKCX0KICAgIH0KICAgIHJldHVybiBhaSA+PSBhLT5udW07Cn0KCi8qCiAqIFRoZXNlIHR3byBmdW5jdGlvbnMgZWZmaWNpZW50bHkgd2FsayB0aGUgZW50aXJlIGNoYXJtYXAgZm9yCiAqIG90aGVyIHNvZnR3YXJlIChsaWtlIHBhbmdvKSB0aGF0IHdhbnQgdGhlaXIgb3duIGNvcHkKICovCgpGY0NoYXIzMgpGY0NoYXJTZXROZXh0UGFnZSAoY29uc3QgRmNDaGFyU2V0ICAqYSwgCgkJICAgRmNDaGFyMzIJICAgIG1hcFtGQ19DSEFSU0VUX01BUF9TSVpFXSwKCQkgICBGY0NoYXIzMgkgICAgKm5leHQpCnsKICAgIEZjQ2hhclNldEl0ZXIgICBhaTsKICAgIEZjQ2hhcjMyCSAgICBwYWdlOwoKICAgIGFpLnVjczQgPSAqbmV4dDsKICAgIEZjQ2hhclNldEl0ZXJTZXQgKGEsICZhaSk7CiAgICBpZiAoIWFpLmxlYWYpCglyZXR1cm4gRkNfQ0hBUlNFVF9ET05FOwogICAgCiAgICAvKgogICAgICogU2F2ZSBjdXJyZW50IGluZm9ybWF0aW9uCiAgICAgKi8KICAgIHBhZ2UgPSBhaS51Y3M0OwogICAgbWVtY3B5IChtYXAsIGFpLmxlYWYtPm1hcCwgc2l6ZW9mIChhaS5sZWFmLT5tYXApKTsKICAgIC8qCiAgICAgKiBTdGVwIHRvIG5leHQgcGFnZQogICAgICovCiAgICBGY0NoYXJTZXRJdGVyTmV4dCAoYSwgJmFpKTsKICAgICpuZXh0ID0gYWkudWNzNDsKCiAgICByZXR1cm4gcGFnZTsKfQoKRmNDaGFyMzIKRmNDaGFyU2V0Rmlyc3RQYWdlIChjb25zdCBGY0NoYXJTZXQgKmEsIAoJCSAgICBGY0NoYXIzMgkgICAgbWFwW0ZDX0NIQVJTRVRfTUFQX1NJWkVdLAoJCSAgICBGY0NoYXIzMgkgICAgKm5leHQpCnsKICAgICpuZXh0ID0gMDsKICAgIHJldHVybiBGY0NoYXJTZXROZXh0UGFnZSAoYSwgbWFwLCBuZXh0KTsKfQoKLyoKICogb2xkIGNvdmVyYWdlIEFQSSwgcmF0aGVyIGhhcmQgdG8gdXNlIGNvcnJlY3RseQogKi8KRmNDaGFyMzIKRmNDaGFyU2V0Q292ZXJhZ2UgKGNvbnN0IEZjQ2hhclNldCAqYSwgRmNDaGFyMzIgcGFnZSwgRmNDaGFyMzIgKnJlc3VsdCk7CiAgICAKRmNDaGFyMzIKRmNDaGFyU2V0Q292ZXJhZ2UgKGNvbnN0IEZjQ2hhclNldCAqYSwgRmNDaGFyMzIgcGFnZSwgRmNDaGFyMzIgKnJlc3VsdCkKewogICAgRmNDaGFyU2V0SXRlciAgIGFpOwoKICAgIGFpLnVjczQgPSBwYWdlOwogICAgRmNDaGFyU2V0SXRlclNldCAoYSwgJmFpKTsKICAgIGlmICghYWkubGVhZikKICAgIHsKCW1lbXNldCAocmVzdWx0LCAnXDAnLCAyNTYgLyA4KTsKCXBhZ2UgPSAwOwogICAgfQogICAgZWxzZQogICAgewoJbWVtY3B5IChyZXN1bHQsIGFpLmxlYWYtPm1hcCwgc2l6ZW9mIChhaS5sZWFmLT5tYXApKTsKCUZjQ2hhclNldEl0ZXJOZXh0IChhLCAmYWkpOwoJcGFnZSA9IGFpLnVjczQ7CiAgICB9CiAgICByZXR1cm4gcGFnZTsKfQoKLyoKICogQVNDSUkgcmVwcmVzZW50YXRpb24gb2YgY2hhcnNldHMuCiAqIAogKiBFYWNoIGxlYWYgaXMgcmVwcmVzZW50ZWQgYXMgOSAzMi1iaXQgdmFsdWVzLCB0aGUgY29kZSBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGZvbGxvd2VkCiAqIGJ5IDggMzIgYml0IHZhbHVlcyBmb3IgdGhlIGxlYWYgaXRzZWxmLiAgRWFjaCB2YWx1ZSBpcyBlbmNvZGVkIGFzIDUgQVNDSUkgY2hhcmFjdGVycywKICogb25seSA4NSBkaWZmZXJlbnQgdmFsdWVzIGFyZSB1c2VkIHRvIGF2b2lkIGNvbnRyb2wgY2hhcmFjdGVycyBhcyB3ZWxsIGFzIHRoZSBvdGhlcgogKiBjaGFyYWN0ZXJzIHVzZWQgdG8gZW5jb2RlIGZvbnQgbmFtZXMuICA4NSoqNSA+IDJeMzIgc28gdGhpbmdzIHdvcmsgb3V0LCBidXQKICogaXQncyBub3QgZXhhY3RseSBodW1hbiByZWFkYWJsZSBvdXRwdXQuICBBcyBhIHNwZWNpYWwgY2FzZSwgMCBpcyBlbmNvZGVkIGFzIGEgc3BhY2UKICovCgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhcgljaGFyVG9WYWx1ZVsyNTZdID0gewogICAgLyogICAgICIiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICAgIlxiIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDAyMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwwMzAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICAgICIgIiAqLyAweGZmLCAgMHgwMCwgIDB4ZmYsICAweDAxLCAgMHgwMiwgIDB4MDMsICAweDA0LCAgMHhmZiwgCiAgICAvKiAgICAiKCIgKi8gMHgwNSwgIDB4MDYsICAweDA3LCAgMHgwOCwgIDB4ZmYsICAweGZmLCAgMHgwOSwgIDB4MGEsIAogICAgLyogICAgIjAiICovIDB4MGIsICAweDBjLCAgMHgwZCwgIDB4MGUsICAweDBmLCAgMHgxMCwgIDB4MTEsICAweDEyLCAKICAgIC8qICAgICI4IiAqLyAweDEzLCAgMHgxNCwgIDB4ZmYsICAweDE1LCAgMHgxNiwgIDB4ZmYsICAweDE3LCAgMHgxOCwgCiAgICAvKiAgICAiQCIgKi8gMHgxOSwgIDB4MWEsICAweDFiLCAgMHgxYywgIDB4MWQsICAweDFlLCAgMHgxZiwgIDB4MjAsIAogICAgLyogICAgIkgiICovIDB4MjEsICAweDIyLCAgMHgyMywgIDB4MjQsICAweDI1LCAgMHgyNiwgIDB4MjcsICAweDI4LCAKICAgIC8qICAgICJQIiAqLyAweDI5LCAgMHgyYSwgIDB4MmIsICAweDJjLCAgMHgyZCwgIDB4MmUsICAweDJmLCAgMHgzMCwgCiAgICAvKiAgICAiWCIgKi8gMHgzMSwgIDB4MzIsICAweDMzLCAgMHgzNCwgIDB4ZmYsICAweDM1LCAgMHgzNiwgIDB4ZmYsIAogICAgLyogICAgImAiICovIDB4ZmYsICAweDM3LCAgMHgzOCwgIDB4MzksICAweDNhLCAgMHgzYiwgIDB4M2MsICAweDNkLCAKICAgIC8qICAgICJoIiAqLyAweDNlLCAgMHgzZiwgIDB4NDAsICAweDQxLCAgMHg0MiwgIDB4NDMsICAweDQ0LCAgMHg0NSwgCiAgICAvKiAgICAicCIgKi8gMHg0NiwgIDB4NDcsICAweDQ4LCAgMHg0OSwgIDB4NGEsICAweDRiLCAgMHg0YywgIDB4NGQsIAogICAgLyogICAgIngiICovIDB4NGUsICAweDRmLCAgMHg1MCwgIDB4NTEsICAweDUyLCAgMHg1MywgIDB4NTQsICAweGZmLCAKICAgIC8qICJcMjAwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDIxMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwyMjAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMjMwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDI0MCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwyNTAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMjYwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDI3MCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwzMDAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMzEwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDMyMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwzMzAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMzQwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDM1MCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwzNjAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMzcwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCn07CgpzdGF0aWMgY29uc3QgRmNDaGFyOCB2YWx1ZVRvQ2hhclsweDU1XSA9IHsKICAgIC8qIDB4MDAgKi8gJyEnLCAnIycsICckJywgJyUnLCAnJicsICcoJywgJyknLCAnKicsCiAgICAvKiAweDA4ICovICcrJywgJy4nLCAnLycsICcwJywgJzEnLCAnMicsICczJywgJzQnLAogICAgLyogMHgxMCAqLyAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJzsnLCAnPCcsICc+JywKICAgIC8qIDB4MTggKi8gJz8nLCAnQCcsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsCiAgICAvKiAweDIwICovICdHJywgJ0gnLCAnSScsICdKJywgJ0snLCAnTCcsICdNJywgJ04nLAogICAgLyogMHgyOCAqLyAnTycsICdQJywgJ1EnLCAnUicsICdTJywgJ1QnLCAnVScsICdWJywKICAgIC8qIDB4MzAgKi8gJ1cnLCAnWCcsICdZJywgJ1onLCAnWycsICddJywgJ14nLCAnYScsCiAgICAvKiAweDM4ICovICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLAogICAgLyogMHg0MCAqLyAnaicsICdrJywgJ2wnLCAnbScsICduJywgJ28nLCAncCcsICdxJywKICAgIC8qIDB4NDggKi8gJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsCiAgICAvKiAweDUwICovICd6JywgJ3snLCAnfCcsICd9JywgJ34nLAp9OwoKc3RhdGljIEZjQ2hhcjggKgpGY0NoYXJTZXRQYXJzZVZhbHVlIChGY0NoYXI4ICpzdHJpbmcsIEZjQ2hhcjMyICp2YWx1ZSkKewogICAgaW50CQlpOwogICAgRmNDaGFyMzIJdjsKICAgIEZjQ2hhcjMyCWM7CiAgICAKICAgIGlmICgqc3RyaW5nID09ICcgJykKICAgIHsKCXYgPSAwOwoJc3RyaW5nKys7CiAgICB9CiAgICBlbHNlCiAgICB7Cgl2ID0gMDsKCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCgl7CgkgICAgaWYgKCEoYyA9IChGY0NoYXIzMikgKHVuc2lnbmVkIGNoYXIpICpzdHJpbmcrKykpCgkJcmV0dXJuIDA7CgkgICAgYyA9IGNoYXJUb1ZhbHVlW2NdOwoJICAgIGlmIChjID09IDB4ZmYpCgkJcmV0dXJuIDA7CgkgICAgdiA9IHYgKiA4NSArIGM7Cgl9CiAgICB9CiAgICAqdmFsdWUgPSB2OwogICAgcmV0dXJuIHN0cmluZzsKfQoKc3RhdGljIEZjQm9vbApGY0NoYXJTZXRVbnBhcnNlVmFsdWUgKEZjU3RyQnVmICpidWYsIEZjQ2hhcjMyIHZhbHVlKQp7CiAgICBpbnQJICAgIGk7CiAgICBpZiAodmFsdWUgPT0gMCkKICAgIHsKCXJldHVybiBGY1N0ckJ1ZkNoYXIgKGJ1ZiwgJyAnKTsKICAgIH0KICAgIGVsc2UKICAgIHsKCUZjQ2hhcjgJc3RyaW5nWzZdOwoJRmNDaGFyOAkqcyA9IHN0cmluZyArIDU7CglzdHJpbmdbNV0gPSAnXDAnOwoJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKCXsKCSAgICAqLS1zID0gdmFsdWVUb0NoYXJbdmFsdWUgJSA4NV07CgkgICAgdmFsdWUgLz0gODU7Cgl9Cglmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQoJICAgIGlmICghRmNTdHJCdWZDaGFyIChidWYsICpzKyspKQoJCXJldHVybiBGY0ZhbHNlOwogICAgfQogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKdHlwZWRlZiBzdHJ1Y3QgX0ZjQ2hhckxlYWZFbnQgRmNDaGFyTGVhZkVudDsKCnN0cnVjdCBfRmNDaGFyTGVhZkVudCB7CiAgICBGY0NoYXJMZWFmRW50ICAgKm5leHQ7CiAgICBGY0NoYXIzMgkgICAgaGFzaDsKICAgIEZjQ2hhckxlYWYJICAgIGxlYWY7Cn07CgojZGVmaW5lIEZDX0NIQVJfTEVBRl9CTE9DSwkoNDA5NiAvIHNpemVvZiAoRmNDaGFyTGVhZkVudCkpCgpzdGF0aWMgRmNDaGFyTGVhZkVudCAqCkZjQ2hhckxlYWZFbnRDcmVhdGUgKHZvaWQpCnsKICAgIHN0YXRpYyBGY0NoYXJMZWFmRW50ICAgICpibG9jazsKICAgIHN0YXRpYyBpbnQJCSAgICByZW1haW47CgogICAgaWYgKCFyZW1haW4pCiAgICB7CglibG9jayA9IG1hbGxvYyAoRkNfQ0hBUl9MRUFGX0JMT0NLICogc2l6ZW9mIChGY0NoYXJMZWFmRW50KSk7CglpZiAoIWJsb2NrKQoJICAgIHJldHVybiAwOwoJRmNNZW1BbGxvYyAoRkNfTUVNX0NIQVJMRUFGLCBGQ19DSEFSX0xFQUZfQkxPQ0sgKiBzaXplb2YgKEZjQ2hhckxlYWZFbnQpKTsKCXJlbWFpbiA9IEZDX0NIQVJfTEVBRl9CTE9DSzsKICAgIH0KICAgIHJlbWFpbi0tOwogICAgcmV0dXJuIGJsb2NrKys7Cn0KCiNkZWZpbmUgRkNfQ0hBUl9MRUFGX0hBU0hfU0laRQkyNTcKCnN0YXRpYyBGY0NoYXIzMgpGY0NoYXJMZWFmSGFzaCAoRmNDaGFyTGVhZiAqbGVhZikKewogICAgRmNDaGFyMzIJaGFzaCA9IDA7CiAgICBpbnQJCWk7CgogICAgZm9yIChpID0gMDsgaSA8IDI1Ni8zMjsgaSsrKQoJaGFzaCA9ICgoaGFzaCA8PCAxKSB8IChoYXNoID4+IDMxKSkgXiBsZWFmLT5tYXBbaV07CiAgICByZXR1cm4gaGFzaDsKfQoKc3RhdGljIGludAlGY0NoYXJMZWFmVG90YWw7CnN0YXRpYyBpbnQJRmNDaGFyTGVhZlVzZWQ7CgpzdGF0aWMgRmNDaGFyTGVhZiAqCkZjQ2hhclNldEZyZWV6ZUxlYWYgKEZjQ2hhckxlYWYgKmxlYWYpCnsKICAgIHN0YXRpYyBGY0NoYXJMZWFmRW50CSpoYXNoVGFibGVbRkNfQ0hBUl9MRUFGX0hBU0hfU0laRV07CiAgICBGY0NoYXIzMgkJCWhhc2ggPSBGY0NoYXJMZWFmSGFzaCAobGVhZik7CiAgICBGY0NoYXJMZWFmRW50CQkqKmJ1Y2tldCA9ICZoYXNoVGFibGVbaGFzaCAlIEZDX0NIQVJfTEVBRl9IQVNIX1NJWkVdOwogICAgRmNDaGFyTGVhZkVudAkJKmVudDsKICAgIAogICAgRmNDaGFyTGVhZlRvdGFsKys7CiAgICBmb3IgKGVudCA9ICpidWNrZXQ7IGVudDsgZW50ID0gZW50LT5uZXh0KQogICAgewoJaWYgKGVudC0+aGFzaCA9PSBoYXNoICYmICFtZW1jbXAgKCZlbnQtPmxlYWYsIGxlYWYsIHNpemVvZiAoRmNDaGFyTGVhZikpKQoJICAgIHJldHVybiAmZW50LT5sZWFmOwogICAgfQoKICAgIGVudCA9IEZjQ2hhckxlYWZFbnRDcmVhdGUoKTsKICAgIGlmICghZW50KQoJcmV0dXJuIDA7CiAgICBGY0NoYXJMZWFmVXNlZCsrOwogICAgZW50LT5sZWFmID0gKmxlYWY7CiAgICBlbnQtPmhhc2ggPSBoYXNoOwogICAgZW50LT5uZXh0ID0gKmJ1Y2tldDsKICAgICpidWNrZXQgPSBlbnQ7CiAgICByZXR1cm4gJmVudC0+bGVhZjsKfQoKdHlwZWRlZiBzdHJ1Y3QgX0ZjQ2hhclNldEVudCBGY0NoYXJTZXRFbnQ7CgpzdHJ1Y3QgX0ZjQ2hhclNldEVudCB7CiAgICBGY0NoYXJTZXRFbnQJKm5leHQ7CiAgICBGY0NoYXIzMgkJaGFzaDsKICAgIEZjQ2hhclNldAkJc2V0Owp9OwoKI2RlZmluZSBGQ19DSEFSX1NFVF9IQVNIX1NJWkUgICAgNjcKCnN0YXRpYyBGY0NoYXIzMgpGY0NoYXJTZXRIYXNoIChGY0NoYXJTZXQgKmZjcykKewogICAgRmNDaGFyMzIJaGFzaCA9IDA7CiAgICBGY0NoYXIzMgkqcDsKICAgIGludAkJaTsKCiAgICAvKiBoYXNoIGluIGxlYXZlcyAqLwogICAgcCA9IChGY0NoYXIzMiAqKSBmY3MtPmxlYXZlczsKICAgIGZvciAoaSA9IDA7IGkgPCBmY3MtPm51bSAqIHNpemVvZiAoRmNDaGFyTGVhZiAqKSAvIHNpemVvZiAoRmNDaGFyMzIpOyBpKyspCgloYXNoID0gKChoYXNoIDw8IDEpIHwgKGhhc2ggPj4gMzEpKSBeICpwKys7CiAgICAvKiBoYXNoIGluIG51bWJlcnMgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBmY3MtPm51bTsgaSsrKQoJaGFzaCA9ICgoaGFzaCA8PCAxKSB8IChoYXNoID4+IDMxKSkgXiBmY3MtPm51bWJlcnNbaV07CiAgICByZXR1cm4gaGFzaDsKfQoKc3RhdGljIGludAlGY0NoYXJTZXRUb3RhbDsKc3RhdGljIGludAlGY0NoYXJTZXRVc2VkOwpzdGF0aWMgaW50CUZjQ2hhclNldFRvdGFsRW50cywgRmNDaGFyU2V0VXNlZEVudHM7CgpzdGF0aWMgRmNDaGFyU2V0ICoKRmNDaGFyU2V0RnJlZXplQmFzZSAoRmNDaGFyU2V0ICpmY3MpCnsKICAgIHN0YXRpYyBGY0NoYXJTZXRFbnQJKmhhc2hUYWJsZVtGQ19DSEFSX1NFVF9IQVNIX1NJWkVdOwogICAgRmNDaGFyMzIJCWhhc2ggPSBGY0NoYXJTZXRIYXNoIChmY3MpOwogICAgRmNDaGFyU2V0RW50CSoqYnVja2V0ID0gJmhhc2hUYWJsZVtoYXNoICUgRkNfQ0hBUl9TRVRfSEFTSF9TSVpFXTsKICAgIEZjQ2hhclNldEVudAkqZW50OwogICAgaW50CQkJc2l6ZTsKCiAgICBGY0NoYXJTZXRUb3RhbCsrOwogICAgRmNDaGFyU2V0VG90YWxFbnRzICs9IGZjcy0+bnVtOwogICAgZm9yIChlbnQgPSAqYnVja2V0OyBlbnQ7IGVudCA9IGVudC0+bmV4dCkKICAgIHsKCWlmIChlbnQtPmhhc2ggPT0gaGFzaCAmJgoJICAgIGVudC0+c2V0Lm51bSA9PSBmY3MtPm51bSAmJgoJICAgICFtZW1jbXAgKGVudC0+c2V0LmxlYXZlcywgZmNzLT5sZWF2ZXMsCgkJICAgICBmY3MtPm51bSAqIHNpemVvZiAoRmNDaGFyTGVhZiAqKSkgJiYKCSAgICAhbWVtY21wIChlbnQtPnNldC5udW1iZXJzLCBmY3MtPm51bWJlcnMsCgkJICAgICBmY3MtPm51bSAqIHNpemVvZiAoRmNDaGFyMTYpKSkKCXsKCSAgICByZXR1cm4gJmVudC0+c2V0OwoJfQogICAgfQoKICAgIHNpemUgPSAoc2l6ZW9mIChGY0NoYXJTZXRFbnQpICsKCSAgICBmY3MtPm51bSAqIHNpemVvZiAoRmNDaGFyTGVhZiAqKSArCgkgICAgZmNzLT5udW0gKiBzaXplb2YgKEZjQ2hhcjE2KSk7CiAgICBlbnQgPSBtYWxsb2MgKHNpemUpOwogICAgaWYgKCFlbnQpCglyZXR1cm4gMDsKICAgIEZjTWVtQWxsb2MgKEZDX01FTV9DSEFSU0VULCBzaXplKTsKICAgIEZjQ2hhclNldFVzZWQrKzsKICAgIEZjQ2hhclNldFVzZWRFbnRzICs9IGZjcy0+bnVtOwogICAgCiAgICBlbnQtPnNldC5yZWYgPSBGQ19SRUZfQ09OU1RBTlQ7CiAgICBlbnQtPnNldC5udW0gPSBmY3MtPm51bTsKICAgIGlmIChmY3MtPm51bSkKICAgIHsKCWVudC0+c2V0LmxlYXZlcyA9IChGY0NoYXJMZWFmICoqKSAoZW50ICsgMSk7CgllbnQtPnNldC5udW1iZXJzID0gKEZjQ2hhcjE2ICopIChlbnQtPnNldC5sZWF2ZXMgKyBmY3MtPm51bSk7CgltZW1jcHkgKGVudC0+c2V0LmxlYXZlcywgZmNzLT5sZWF2ZXMsIGZjcy0+bnVtICogc2l6ZW9mIChGY0NoYXJMZWFmICopKTsKCW1lbWNweSAoZW50LT5zZXQubnVtYmVycywgZmNzLT5udW1iZXJzLCBmY3MtPm51bSAqIHNpemVvZiAoRmNDaGFyMTYpKTsKICAgIH0KICAgIGVsc2UKICAgIHsKCWVudC0+c2V0LmxlYXZlcyA9IDA7CgllbnQtPnNldC5udW1iZXJzID0gMDsKICAgIH0KCiAgICBlbnQtPmhhc2ggPSBoYXNoOwogICAgZW50LT5uZXh0ID0gKmJ1Y2tldDsKICAgICpidWNrZXQgPSBlbnQ7CiAgICByZXR1cm4gJmVudC0+c2V0Owp9CgpGY0NoYXJTZXQgKgpGY0NoYXJTZXRGcmVlemUgKEZjQ2hhclNldCAqZmNzKQp7CiAgICBGY0NoYXJTZXQJKmI7CiAgICBGY0NoYXJTZXQJKm4gPSAwOwogICAgRmNDaGFyTGVhZgkqbDsKICAgIGludAkJaTsKCiAgICBiID0gRmNDaGFyU2V0Q3JlYXRlICgpOwogICAgaWYgKCFiKQoJZ290byBiYWlsMDsKICAgIGZvciAoaSA9IDA7IGkgPCBmY3MtPm51bTsgaSsrKQogICAgewoJbCA9IEZjQ2hhclNldEZyZWV6ZUxlYWYgKGZjcy0+bGVhdmVzW2ldKTsKCWlmICghbCkKCSAgICBnb3RvIGJhaWwxOwoJaWYgKCFGY0NoYXJTZXRJbnNlcnRMZWFmIChiLCBmY3MtPm51bWJlcnNbaV0gPDwgOCwgbCkpCgkgICAgZ290byBiYWlsMTsKICAgIH0KICAgIG4gPSBGY0NoYXJTZXRGcmVlemVCYXNlIChiKTsKYmFpbDE6CiAgICBpZiAoYi0+bGVhdmVzKQogICAgewoJRmNNZW1GcmVlIChGQ19NRU1fQ0hBUlNFVCwgYi0+bnVtICogc2l6ZW9mIChGY0NoYXJMZWFmICopKTsKCWZyZWUgKGItPmxlYXZlcyk7CiAgICB9CiAgICBpZiAoYi0+bnVtYmVycykKICAgIHsKCUZjTWVtRnJlZSAoRkNfTUVNX0NIQVJTRVQsIGItPm51bSAqIHNpemVvZiAoRmNDaGFyMTYpKTsKCWZyZWUgKGItPm51bWJlcnMpOwogICAgfQogICAgRmNNZW1GcmVlIChGQ19NRU1fQ0hBUlNFVCwgc2l6ZW9mIChGY0NoYXJTZXQpKTsKICAgIGZyZWUgKGIpOwpiYWlsMDoKICAgIHJldHVybiBuOwp9CgpGY0NoYXJTZXQgKgpGY05hbWVQYXJzZUNoYXJTZXQgKEZjQ2hhcjggKnN0cmluZykKewogICAgRmNDaGFyU2V0CSpjLCAqbiA9IDA7CiAgICBGY0NoYXIzMgl1Y3M0OwogICAgRmNDaGFyTGVhZgkqbGVhZjsKICAgIEZjQ2hhckxlYWYJdGVtcDsKICAgIEZjQ2hhcjMyCWJpdHM7CiAgICBpbnQJCWk7CgogICAgYyA9IEZjQ2hhclNldENyZWF0ZSAoKTsKICAgIGlmICghYykKCWdvdG8gYmFpbDA7CiAgICB3aGlsZSAoKnN0cmluZykKICAgIHsKCXN0cmluZyA9IEZjQ2hhclNldFBhcnNlVmFsdWUgKHN0cmluZywgJnVjczQpOwoJaWYgKCFzdHJpbmcpCgkgICAgZ290byBiYWlsMTsKCWJpdHMgPSAwOwoJZm9yIChpID0gMDsgaSA8IDI1Ni8zMjsgaSsrKQoJewoJICAgIHN0cmluZyA9IEZjQ2hhclNldFBhcnNlVmFsdWUgKHN0cmluZywgJnRlbXAubWFwW2ldKTsKCSAgICBpZiAoIXN0cmluZykKCQlnb3RvIGJhaWwxOwoJICAgIGJpdHMgfD0gdGVtcC5tYXBbaV07Cgl9CglpZiAoYml0cykKCXsKCSAgICBsZWFmID0gRmNDaGFyU2V0RnJlZXplTGVhZiAoJnRlbXApOwoJICAgIGlmICghbGVhZikKCQlnb3RvIGJhaWwxOwoJICAgIGlmICghRmNDaGFyU2V0SW5zZXJ0TGVhZiAoYywgdWNzNCwgbGVhZikpCgkJZ290byBiYWlsMTsKCX0KICAgIH0KI2lmZGVmIENIQVRUWQogICAgcHJpbnRmICgiICAgICAgICAgICU4cyAlOHMgJThzICU4c1xuIiwgInRvdGFsIiwgInRvdGFsbWVtIiwgIm5ldyIsICJuZXdtZW0iKTsKICAgIHByaW50ZiAoIkxlYXZlczogICAlOGQgJThkICU4ZCAlOGRcbiIsCgkgICAgRmNDaGFyTGVhZlRvdGFsLCBzaXplb2YgKEZjQ2hhckxlYWYpICogRmNDaGFyTGVhZlRvdGFsLAoJICAgIEZjQ2hhckxlYWZVc2VkLCBzaXplb2YgKEZjQ2hhckxlYWYpICogRmNDaGFyTGVhZlVzZWQpOwogICAgcHJpbnRmICgiQ2hhcnNldHM6ICU4ZCAlOGQgJThkICU4ZFxuIiwKCSAgICBGY0NoYXJTZXRUb3RhbCwgc2l6ZW9mIChGY0NoYXJTZXQpICogRmNDaGFyU2V0VG90YWwsCgkgICAgRmNDaGFyU2V0VXNlZCwgc2l6ZW9mIChGY0NoYXJTZXQpICogRmNDaGFyU2V0VXNlZCk7CiAgICBwcmludGYgKCJUYWJsZXM6ICAgJThkICU4ZCAlOGQgJThkXG4iLAoJICAgIEZjQ2hhclNldFRvdGFsRW50cywgRmNDaGFyU2V0VG90YWxFbnRzICogKHNpemVvZiAoRmNDaGFyTGVhZiAqKSArIHNpemVvZiAoRmNDaGFyMTYpKSwKCSAgICBGY0NoYXJTZXRVc2VkRW50cywgRmNDaGFyU2V0VXNlZEVudHMgKiAoc2l6ZW9mIChGY0NoYXJMZWFmICopICsgc2l6ZW9mIChGY0NoYXIxNikpKTsKICAgIHByaW50ZiAoIlRvdGFsOiAgICAlOHMgJThkICU4cyAlOGRcbiIsIAoJICAgICIiLCAKCSAgICBzaXplb2YgKEZjQ2hhckxlYWYpICogRmNDaGFyTGVhZlRvdGFsICsKCSAgICBzaXplb2YgKEZjQ2hhclNldCkgKiBGY0NoYXJTZXRUb3RhbCArCgkgICAgRmNDaGFyU2V0VG90YWxFbnRzICogKHNpemVvZiAoRmNDaGFyTGVhZiAqKSArIHNpemVvZiAoRmNDaGFyMTYpKSwKCSAgICAiIiwKCSAgICBzaXplb2YgKEZjQ2hhckxlYWYpICogRmNDaGFyTGVhZlVzZWQgKwoJICAgIHNpemVvZiAoRmNDaGFyU2V0KSAqIEZjQ2hhclNldFVzZWQgKwoJICAgIEZjQ2hhclNldFVzZWRFbnRzICogKHNpemVvZiAoRmNDaGFyTGVhZiAqKSArIHNpemVvZiAoRmNDaGFyMTYpKSk7CiNlbmRpZgogICAgbiA9IEZjQ2hhclNldEZyZWV6ZUJhc2UgKGMpOwpiYWlsMToKICAgIGlmIChjLT5sZWF2ZXMpCiAgICB7CglGY01lbUZyZWUgKEZDX01FTV9DSEFSU0VULCBjLT5udW0gKiBzaXplb2YgKEZjQ2hhckxlYWYgKikpOwoJZnJlZSAoYy0+bGVhdmVzKTsKICAgIH0KICAgIGlmIChjLT5udW1iZXJzKQogICAgewoJRmNNZW1GcmVlIChGQ19NRU1fQ0hBUlNFVCwgYy0+bnVtICogc2l6ZW9mIChGY0NoYXIxNikpOwoJZnJlZSAoYy0+bnVtYmVycyk7CiAgICB9CiAgICBGY01lbUZyZWUgKEZDX01FTV9DSEFSU0VULCBzaXplb2YgKEZjQ2hhclNldCkpOwogICAgZnJlZSAoYyk7CmJhaWwwOgogICAgcmV0dXJuIG47Cn0KCkZjQm9vbApGY05hbWVVbnBhcnNlQ2hhclNldCAoRmNTdHJCdWYgKmJ1ZiwgY29uc3QgRmNDaGFyU2V0ICpjKQp7CiAgICBGY0NoYXJTZXRJdGVyICAgY2k7CiAgICBpbnQJCSAgICBpOwojaWZkZWYgQ0hFQ0sKICAgIGludAkJICAgIGxlbiA9IGJ1Zi0+bGVuOwojZW5kaWYKCiAgICBmb3IgKEZjQ2hhclNldEl0ZXJTdGFydCAoYywgJmNpKTsKCSBjaS5sZWFmOwoJIEZjQ2hhclNldEl0ZXJOZXh0IChjLCAmY2kpKQogICAgewoJaWYgKCFGY0NoYXJTZXRVbnBhcnNlVmFsdWUgKGJ1ZiwgY2kudWNzNCkpCgkgICAgcmV0dXJuIEZjRmFsc2U7Cglmb3IgKGkgPSAwOyBpIDwgMjU2LzMyOyBpKyspCgkgICAgaWYgKCFGY0NoYXJTZXRVbnBhcnNlVmFsdWUgKGJ1ZiwgY2kubGVhZi0+bWFwW2ldKSkKCQlyZXR1cm4gRmNGYWxzZTsKICAgIH0KI2lmZGVmIENIRUNLCiAgICB7CglGY0NoYXJTZXQJKmNoZWNrOwoJRmNDaGFyMzIJbWlzc2luZzsKCUZjQ2hhclNldEl0ZXIJY2ksIGNoZWNraTsKCQoJLyogbnVsbCB0ZXJtaW5hdGUgZm9yIHBhcnNlciAqLwoJRmNTdHJCdWZDaGFyIChidWYsICdcMCcpOwoJLyogc3RlcCBiYWNrIG92ZXIgbnVsbCBmb3IgbGlmZSBhZnRlciB0ZXN0ICovCglidWYtPmxlbi0tOwoJY2hlY2sgPSBGY05hbWVQYXJzZUNoYXJTZXQgKGJ1Zi0+YnVmICsgbGVuKTsKCUZjQ2hhclNldEl0ZXJTdGFydCAoYywgJmNpKTsKCUZjQ2hhclNldEl0ZXJTdGFydCAoY2hlY2ssICZjaGVja2kpOwoJd2hpbGUgKGNpLmxlYWYgfHwgY2hlY2tpLmxlYWYpCgl7CgkgICAgaWYgKGNpLnVjczQgPCBjaGVja2kudWNzNCkKCSAgICB7CgkJcHJpbnRmICgiTWlzc2luZyBsZWFmIG5vZGUgYXQgMHgleFxuIiwgY2kudWNzNCk7CgkJRmNDaGFyU2V0SXRlck5leHQgKGMsICZjaSk7CgkgICAgfQoJICAgIGVsc2UgaWYgKGNoZWNraS51Y3M0IDwgY2kudWNzNCkKCSAgICB7CgkJcHJpbnRmICgiRXh0cmEgbGVhZiBub2RlIGF0IDB4JXhcbiIsIGNoZWNraS51Y3M0KTsKCQlGY0NoYXJTZXRJdGVyTmV4dCAoY2hlY2ssICZjaGVja2kpOwoJICAgIH0KCSAgICBlbHNlCgkgICAgewoJCWludAkgICAgaSA9IDI1Ni8zMjsKCQlGY0NoYXIzMiAgICAqY20gPSBjaS5sZWFmLT5tYXA7CgkJRmNDaGFyMzIgICAgKmNoZWNrbSA9IGNoZWNraS5sZWFmLT5tYXA7CgoJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gMzIpCgkJewoJCSAgICBpZiAoKmNtICE9ICpjaGVja20pCgkJCXByaW50ZiAoIk1pc21hdGNoaW5nIHNldHMgYXQgMHglMDh4OiAweCUwOHggIT0gMHglMDh4XG4iLAoJCQkJY2kudWNzNCArIGksICpjbSwgKmNoZWNrbSk7CgkJICAgIGNtKys7CgkJICAgIGNoZWNrbSsrOwoJCX0KCQlGY0NoYXJTZXRJdGVyTmV4dCAoYywgJmNpKTsKCQlGY0NoYXJTZXRJdGVyTmV4dCAoY2hlY2ssICZjaGVja2kpOwoJICAgIH0KCX0KCWlmICgobWlzc2luZyA9IEZjQ2hhclNldFN1YnRyYWN0Q291bnQgKGMsIGNoZWNrKSkpCgkgICAgcHJpbnRmICgiJWQgbWlzc2luZyBpbiByZXBhcnNlZCByZXN1bHRcbiIsIG1pc3NpbmcpOwoJaWYgKChtaXNzaW5nID0gRmNDaGFyU2V0U3VidHJhY3RDb3VudCAoY2hlY2ssIGMpKSkKCSAgICBwcmludGYgKCIlZCBleHRyYSBpbiByZXBhcnNlZCByZXN1bHRcbiIsIG1pc3NpbmcpOwoJRmNDaGFyU2V0RGVzdHJveSAoY2hlY2spOwogICAgfQojZW5kaWYKICAgIAogICAgcmV0dXJuIEZjVHJ1ZTsKfQo=