LyoKICogJFhGcmVlODY6ICQKICoKICogQ29weXJpZ2h0IKkgMjAwMCBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CiAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCiAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2lmbmRlZiBfRkNJTlRfSF8KI2RlZmluZSBfRkNJTlRfSF8KCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxsaWJ4bWwvcGFyc2VySW50ZXJuYWxzLmg+CiNpbmNsdWRlIDxmb250Y29uZmlnL2ZvbnRjb25maWcuaD4KI2luY2x1ZGUgPGZvbnRjb25maWcvZmNwcml2YXRlLmg+CiNpbmNsdWRlIDxmb250Y29uZmlnL2ZjeG1sLmg+CiNpZmRlZiBIQVZFX0NPTkZJR19ICiNpbmNsdWRlIDxjb25maWcuaD4KI2VuZGlmCgp0eXBlZGVmIHN0cnVjdCBfRmNNYXRjaGVyIHsKICAgIGNoYXIgICAgKm9iamVjdDsKICAgIGRvdWJsZSAgKCpjb21wYXJlKSAoY2hhciAqb2JqZWN0LCBGY1ZhbHVlIHZhbHVlMSwgRmNWYWx1ZSB2YWx1ZTIpOwp9IEZjTWF0Y2hlcjsKCnR5cGVkZWYgc3RydWN0IF9GY1N5bWJvbGljIHsKICAgIGNvbnN0IGNoYXIJKm5hbWU7CiAgICBpbnQJCXZhbHVlOwp9IEZjU3ltYm9saWM7CgojaWZuZGVmIEZDX0NPTkZJR19QQVRICiNkZWZpbmUgRkNfQ09ORklHX1BBVEggImZvbnRzLmNvbmYiCiNlbmRpZgoKI2RlZmluZSBGQ19EQkdfTUFUQ0gJMQojZGVmaW5lIEZDX0RCR19NQVRDSFYJMgojZGVmaW5lIEZDX0RCR19FRElUCTQKI2RlZmluZSBGQ19EQkdfRk9OVFNFVAk4CiNkZWZpbmUgRkNfREJHX0NBQ0hFCTE2CiNkZWZpbmUgRkNfREJHX0NBQ0hFVgkzMgojZGVmaW5lIEZDX0RCR19QQVJTRQk2NAojZGVmaW5lIEZDX0RCR19TQ0FOCTEyOAojZGVmaW5lIEZDX0RCR19NRU1PUlkJNTEyCgojZGVmaW5lIEZDX01FTV9DSEFSU0VUCSAgICAwCiNkZWZpbmUgRkNfTUVNX0NIQVJOT0RFCSAgICAxCiNkZWZpbmUgRkNfTUVNX0ZPTlRTRVQJICAgIDIKI2RlZmluZSBGQ19NRU1fRk9OVFBUUgkgICAgMwojZGVmaW5lIEZDX01FTV9PQkpFQ1RTRVQgICAgNAojZGVmaW5lIEZDX01FTV9PQkpFQ1RQVFIgICAgNQojZGVmaW5lIEZDX01FTV9NQVRSSVgJICAgIDYKI2RlZmluZSBGQ19NRU1fUEFUVEVSTgkgICAgNwojZGVmaW5lIEZDX01FTV9QQVRFTFQJICAgIDgKI2RlZmluZSBGQ19NRU1fVkFMTElTVAkgICAgOQojZGVmaW5lIEZDX01FTV9TVUJTVEFURQkgICAgMTAKI2RlZmluZSBGQ19NRU1fU1RSSU5HCSAgICAxMQojZGVmaW5lIEZDX01FTV9MSVNUQlVDSwkgICAgMTIKI2RlZmluZSBGQ19NRU1fTlVNCSAgICAxMwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjVmFsdWVMaXN0IHsKICAgIHN0cnVjdCBfRmNWYWx1ZUxpc3QgICAgKm5leHQ7CiAgICBGY1ZhbHVlCQkgICAgdmFsdWU7Cn0gRmNWYWx1ZUxpc3Q7Cgp0eXBlZGVmIHN0cnVjdCBfRmNQYXR0ZXJuRWx0IHsKICAgIGNvbnN0IGNoYXIJICAgICpvYmplY3Q7CiAgICBGY1ZhbHVlTGlzdCAgICAqdmFsdWVzOwp9IEZjUGF0dGVybkVsdDsKCnN0cnVjdCBfRmNQYXR0ZXJuIHsKICAgIGludAkJICAgIG51bTsKICAgIGludAkJICAgIHNpemU7CiAgICBGY1BhdHRlcm5FbHQgICAqZWx0czsKfTsKCnR5cGVkZWYgZW51bSBfRmNPcCB7CiAgICBGY09wSW50ZWdlciwgRmNPcERvdWJsZSwgRmNPcFN0cmluZywgRmNPcE1hdHJpeCwgRmNPcEJvb2wsIEZjT3BDaGFyU2V0LCAKICAgIEZjT3BOaWwsCiAgICBGY09wRmllbGQsIEZjT3BDb25zdCwKICAgIEZjT3BBc3NpZ24sIEZjT3BBc3NpZ25SZXBsYWNlLCAKICAgIEZjT3BQcmVwZW5kRmlyc3QsIEZjT3BQcmVwZW5kLCBGY09wQXBwZW5kLCBGY09wQXBwZW5kTGFzdCwKICAgIEZjT3BRdWVzdCwKICAgIEZjT3BPciwgRmNPcEFuZCwgRmNPcEVxdWFsLCBGY09wTm90RXF1YWwsIEZjT3BDb250YWlucywKICAgIEZjT3BMZXNzLCBGY09wTGVzc0VxdWFsLCBGY09wTW9yZSwgRmNPcE1vcmVFcXVhbCwKICAgIEZjT3BQbHVzLCBGY09wTWludXMsIEZjT3BUaW1lcywgRmNPcERpdmlkZSwKICAgIEZjT3BOb3QsIEZjT3BDb21tYSwgRmNPcEludmFsaWQKfSBGY09wOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjRXhwciB7CiAgICBGY09wICAgb3A7CiAgICB1bmlvbiB7CglpbnQJICAgIGl2YWw7Cglkb3VibGUJICAgIGR2YWw7CgljaGFyCSAgICAqc3ZhbDsKCUZjTWF0cml4ICAgICptdmFsOwoJRmNCb29sCSAgICBidmFsOwoJRmNDaGFyU2V0ICAgKmN2YWw7CgljaGFyCSAgICAqZmllbGQ7CgljaGFyCSAgICAqY29uc3RhbnQ7CglzdHJ1Y3QgewoJICAgIHN0cnVjdCBfRmNFeHByICpsZWZ0LCAqcmlnaHQ7Cgl9IHRyZWU7CiAgICB9IHU7Cn0gRmNFeHByOwoKdHlwZWRlZiBlbnVtIF9GY1F1YWwgewogICAgRmNRdWFsQW55LCBGY1F1YWxBbGwKfSBGY1F1YWw7Cgp0eXBlZGVmIHN0cnVjdCBfRmNUZXN0IHsKICAgIHN0cnVjdCBfRmNUZXN0CSpuZXh0OwogICAgRmNRdWFsCQlxdWFsOwogICAgY29uc3QgY2hhcgkJKmZpZWxkOwogICAgRmNPcAkJb3A7CiAgICBGY0V4cHIJCSpleHByOwp9IEZjVGVzdDsKCnR5cGVkZWYgc3RydWN0IF9GY0VkaXQgewogICAgc3RydWN0IF9GY0VkaXQgKm5leHQ7CiAgICBjb25zdCBjaGFyCSAgICAqZmllbGQ7CiAgICBGY09wCSAgICBvcDsKICAgIEZjRXhwcgkgICAgKmV4cHI7Cn0gRmNFZGl0OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjU3Vic3QgewogICAgc3RydWN0IF9GY1N1YnN0CSpuZXh0OwogICAgRmNUZXN0CQkqdGVzdDsKICAgIEZjRWRpdAkJKmVkaXQ7Cn0gRmNTdWJzdDsKCnR5cGVkZWYgc3RydWN0IF9GY0NoYXJMZWFmIEZjQ2hhckxlYWY7CnR5cGVkZWYgc3RydWN0IF9GY0NoYXJCcmFuY2ggRmNDaGFyQnJhbmNoOwp0eXBlZGVmIHVuaW9uICBfRmNDaGFyTm9kZSBGY0NoYXJOb2RlOwoKc3RydWN0IF9GY0NoYXJMZWFmIHsKICAgIEZjQ2hhcjMyCW1hcFsyNTYvMzJdOwp9OwoKdW5pb24gX0ZjQ2hhck5vZGUgewogICAgRmNDaGFyQnJhbmNoICAgICpicmFuY2g7CiAgICBGY0NoYXJMZWFmCSAgICAqbGVhZjsKfTsKCnN0cnVjdCBfRmNDaGFyQnJhbmNoIHsKICAgIEZjQ2hhck5vZGUJICAgIG5vZGVzWzI1Nl07Cn07CgpzdHJ1Y3QgX0ZjQ2hhclNldCB7CiAgICBpbnQJCSAgICBsZXZlbHM7CiAgICBpbnQJCSAgICByZWY7CS8qIHJlZmVyZW5jZSBjb3VudCAqLwogICAgRmNCb29sCSAgICBjb25zdGFudDsJLyogc2hhcmVkIGNvbnN0YW50ICovCiAgICBGY0NoYXJOb2RlCSAgICBub2RlOwp9OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjTmFtZUJ1ZiB7CiAgICBGY0NoYXI4ICpidWY7CiAgICBGY0Jvb2wgIGFsbG9jYXRlZDsKICAgIEZjQm9vbCAgZmFpbGVkOwogICAgaW50CSAgICBsZW47CiAgICBpbnQJICAgIHNpemU7Cn0gRmNOYW1lQnVmOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjRmlsZUNhY2hlRW50IHsKICAgIHN0cnVjdCBfRmNGaWxlQ2FjaGVFbnQgKm5leHQ7CiAgICB1bnNpZ25lZCBpbnQJICAgIGhhc2g7CiAgICBjaGFyCQkgICAgKmZpbGU7CiAgICBpbnQJCQkgICAgaWQ7CiAgICB0aW1lX3QJCSAgICB0aW1lOwogICAgY2hhcgkJICAgICpuYW1lOwogICAgRmNCb29sCQkgICAgcmVmZXJlbmNlZDsKfSBGY0ZpbGVDYWNoZUVudDsKCiNkZWZpbmUgRkNfRklMRV9DQUNIRV9IQVNIX1NJWkUgICA1MDkKCnN0cnVjdCBfRmNGaWxlQ2FjaGUgewogICAgRmNGaWxlQ2FjaGVFbnQJKmVudHNbRkNfRklMRV9DQUNIRV9IQVNIX1NJWkVdOwogICAgRmNCb29sCQl1cGRhdGVkOwogICAgaW50CQkJZW50cmllczsKICAgIGludAkJCXJlZmVyZW5jZWQ7Cn07CgpzdHJ1Y3QgX0ZjQmxhbmtzIHsKICAgIGludAkJbmJsYW5rOwogICAgaW50CQlzYmxhbms7CiAgICBGY0NoYXIzMgkqYmxhbmtzOwp9OwoKc3RydWN0IF9GY0NvbmZpZyB7CiAgICAvKgogICAgICogRmlsZSBuYW1lcyBsb2FkZWQgZnJvbSB0aGUgY29uZmlndXJhdGlvbiAtLSBzYXZlZCBoZXJlIGFzIHRoZQogICAgICogY2FjaGUgZmlsZSBtdXN0IGJlIGNvbnN1bHRlZCBiZWZvcmUgdGhlIGRpcmVjdG9yaWVzIGFyZSBzY2FubmVkLAogICAgICogYW5kIHRob3NlIGRpcmVjdGl2ZXMgbWF5IG9jY3VyIGluIGFueSBvcmRlcgogICAgICovCiAgICBjaGFyCSoqZGlyczsJCSAgICAvKiBkaXJlY3RvcmllcyBjb250YWluaW5nIGZvbnRzICovCiAgICBjaGFyCSpjYWNoZTsJCSAgICAvKiBuYW1lIG9mIHBlci11c2VyIGNhY2hlIGZpbGUgKi8KICAgIC8qCiAgICAgKiBTZXQgb2YgYWxsb3dlZCBibGFuayBjaGFycyAtLSB1c2VkIHRvCiAgICAgKiB0cmltIGZvbnRzIG9mIGJvZ3VzIGdseXBocwogICAgICovCiAgICBGY0JsYW5rcwkqYmxhbmtzOwogICAgLyoKICAgICAqIE5hbWVzIG9mIGFsbCBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyB1c2VkCiAgICAgKiB0byBjcmVhdGUgdGhpcyBjb25maWd1cmF0aW9uCiAgICAgKi8KICAgIGNoYXIJKipjb25maWdGaWxlczsJICAgIC8qIGNvbmZpZyBmaWxlcyBsb2FkZWQgKi8KICAgIC8qCiAgICAgKiBTdWJzdGl0dXRpb24gaW5zdHJ1Y3Rpb25zIGZvciBwYXR0ZXJucyBhbmQgZm9udHM7CiAgICAgKiBtYXhPYmplY3RzIGlzIHVzZWQgdG8gYWxsb2NhdGUgYXBwcm9wcmlhdGUgaW50ZXJtZWRpYXRlIHN0b3JhZ2UKICAgICAqIHdoaWxlIHBlcmZvcm1pbmcgYSB3aG9sZSBzZXQgb2Ygc3Vic3RpdHV0aW9ucwogICAgICovCiAgICBGY1N1YnN0CSpzdWJzdFBhdHRlcm47CSAgICAvKiBzdWJzdGl0dXRpb25zIGZvciBwYXR0ZXJucyAqLwogICAgRmNTdWJzdAkqc3Vic3RGb250OwkgICAgLyogc3Vic3RpdHV0aW9ucyBmb3IgZm9udHMgKi8KICAgIGludAkJbWF4T2JqZWN0czsJICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIHRlc3RzIGluIGFsbCBzdWJzdHMgKi8KICAgIC8qCiAgICAgKiBUaGUgc2V0IG9mIGZvbnRzIGxvYWRlZCBmcm9tIHRoZSBsaXN0ZWQgZGlyZWN0b3JpZXM7IHRoZQogICAgICogb3JkZXIgd2l0aGluIHRoZSBzZXQgZG9lcyBub3QgZGV0ZXJtaW5lIHRoZSBmb250IHNlbGVjdGlvbiwKICAgICAqIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBpZGVudGljYWwgbWF0Y2hlcyBpbiB3aGljaCBjYXNlIGVhcmxpZXIgZm9udHMKICAgICAqIG1hdGNoIHByZWZlcnJlbnRpYWxseQogICAgICovCiAgICBGY0ZvbnRTZXQJKmZvbnRzW0ZjU2V0QXBwbGljYXRpb24gKyAxXTsKfTsKIAovKiBmY2JsYW5rcy5jICovCgovKiBmY2NhY2hlLmMgKi8KCkZjRmlsZUNhY2hlICoKRmNGaWxlQ2FjaGVDcmVhdGUgKHZvaWQpOwoKY2hhciAqCkZjRmlsZUNhY2hlRmluZCAoRmNGaWxlQ2FjaGUJKmNhY2hlLAoJCSBjb25zdCBjaGFyCSpmaWxlLAoJCSBpbnQJCWlkLAoJCSBpbnQJCSpjb3VudCk7Cgp2b2lkCkZjRmlsZUNhY2hlRGVzdHJveSAoRmNGaWxlQ2FjaGUJKmNhY2hlKTsKCnZvaWQKRmNGaWxlQ2FjaGVMb2FkIChGY0ZpbGVDYWNoZQkqY2FjaGUsCgkJIGNvbnN0IGNoYXIJKmNhY2hlX2ZpbGUpOwoKRmNCb29sCkZjRmlsZUNhY2hlVXBkYXRlIChGY0ZpbGVDYWNoZQkqY2FjaGUsCgkJICAgY29uc3QgY2hhcgkqZmlsZSwKCQkgICBpbnQJCWlkLAoJCSAgIGNvbnN0IGNoYXIJKm5hbWUpOwoKRmNCb29sCkZjRmlsZUNhY2hlU2F2ZSAoRmNGaWxlQ2FjaGUJKmNhY2hlLAoJCSBjb25zdCBjaGFyCSpjYWNoZV9maWxlKTsKCkZjQm9vbApGY0ZpbGVDYWNoZVJlYWREaXIgKEZjRm9udFNldCAqc2V0LCBjb25zdCBjaGFyICpjYWNoZV9maWxlKTsKCkZjQm9vbApGY0ZpbGVDYWNoZVdyaXRlRGlyIChGY0ZvbnRTZXQgKnNldCwgY29uc3QgY2hhciAqY2FjaGVfZmlsZSk7CiAgICAKLyogZmNjZmcuYyAqLwoKRmNCb29sCkZjQ29uZmlnQWRkRGlyIChGY0NvbmZpZyAgICAqY29uZmlnLAoJCWNvbnN0IGNoYXIgICpkKTsKCkZjQm9vbApGY0NvbmZpZ0FkZENvbmZpZ0ZpbGUgKEZjQ29uZmlnCSAgICAqY29uZmlnLAoJCSAgICAgICBjb25zdCBjaGFyICAgKmYpOwoKRmNCb29sCkZjQ29uZmlnU2V0Q2FjaGUgKEZjQ29uZmlnCSpjb25maWcsCgkJICBjb25zdCBjaGFyCSpjKTsKCkZjQm9vbApGY0NvbmZpZ0FkZEJsYW5rIChGY0NvbmZpZwkqY29uZmlnLAoJCSAgRmNDaGFyMzIgICAgCWJsYW5rKTsKCkZjQm9vbApGY0NvbmZpZ0FkZEVkaXQgKEZjQ29uZmlnCSpjb25maWcsCgkJIEZjVGVzdAkJKnRlc3QsCgkJIEZjRWRpdAkJKmVkaXQsCgkJIEZjTWF0Y2hLaW5kCWtpbmQpOwoKdm9pZApGY0NvbmZpZ1NldEZvbnRzIChGY0NvbmZpZwkqY29uZmlnLAoJCSAgRmNGb250U2V0CSpmb250cywKCQkgIEZjU2V0TmFtZQlzZXQpOwoKRmNCb29sCkZjQ29uZmlnQ29tcGFyZVZhbHVlIChjb25zdCBGY1ZhbHVlIG0sCgkJICAgICAgRmNPcAkgICAgb3AsCgkJICAgICAgY29uc3QgRmNWYWx1ZSB2KTsKCi8qIGZjY2hhcnNldC5jICovCkZjQm9vbApGY05hbWVVbnBhcnNlQ2hhclNldCAoRmNOYW1lQnVmICpidWYsIGNvbnN0IEZjQ2hhclNldCAqYyk7CgpGY0NoYXJTZXQgKgpGY05hbWVQYXJzZUNoYXJTZXQgKEZjQ2hhcjggKnN0cmluZyk7CgovKiBmY2RiZy5jICovCnZvaWQKRmNWYWx1ZVByaW50IChGY1ZhbHVlIHYpOwoKdm9pZApGY1ZhbHVlTGlzdFByaW50IChGY1ZhbHVlTGlzdCAqbCk7Cgp2b2lkCkZjUGF0dGVyblByaW50IChGY1BhdHRlcm4gKnApOwoKdm9pZApGY09wUHJpbnQgKEZjT3Agb3ApOwoKdm9pZApGY1Rlc3RQcmludCAoRmNUZXN0ICp0ZXN0KTsKCnZvaWQKRmNFeHByUHJpbnQgKEZjRXhwciAqZXhwcik7Cgp2b2lkCkZjRWRpdFByaW50IChGY0VkaXQgKmVkaXQpOwoKdm9pZApGY1N1YnN0UHJpbnQgKEZjU3Vic3QgKnN1YnN0KTsKCnZvaWQKRmNGb250U2V0UHJpbnQgKEZjRm9udFNldCAqcyk7CgppbnQKRmNEZWJ1ZyAodm9pZCk7CgovKiBmY2Rpci5jICovCkZjQm9vbApGY0ZpbGVTY2FuIChGY0ZvbnRTZXQJKnNldCwKCSAgICBGY0ZpbGVDYWNoZQkqY2FjaGUsCgkgICAgRmNCbGFua3MJKmJsYW5rcywKCSAgICBjb25zdCBjaGFyCSpmaWxlLAoJICAgIEZjQm9vbAlmb3JjZSk7CgpGY0Jvb2wKRmNEaXJTY2FuIChGY0ZvbnRTZXQJKnNldCwKCSAgIEZjRmlsZUNhY2hlCSpjYWNoZSwKCSAgIEZjQmxhbmtzCSpibGFua3MsCgkgICBjb25zdCBjaGFyCSpkaXIsCgkgICBGY0Jvb2wJZm9yY2UpOwoKRmNCb29sCkZjRGlyU2F2ZSAoRmNGb250U2V0ICpzZXQsIGNvbnN0IGNoYXIgKmRpcik7CgovKiBmY2ZvbnQuYyAqLwppbnQKRmNGb250RGVidWcgKHZvaWQpOwogICAgCi8qIGZjZnMuYyAqLwovKiBmY2dyYW0ueSAqLwppbnQKRmNDb25maWdwYXJzZSAodm9pZCk7CgppbnQKRmNDb25maWd3cmFwICh2b2lkKTsKICAgIAp2b2lkCkZjQ29uZmlnZXJyb3IgKGNoYXIgKmZtdCwgLi4uKTsKICAgIApjaGFyICoKRmNDb25maWdTYXZlRmllbGQgKGNvbnN0IGNoYXIgKmZpZWxkKTsKCkZjVGVzdCAqCkZjVGVzdENyZWF0ZSAoRmNRdWFsIHF1YWwsIGNvbnN0IGNoYXIgKmZpZWxkLCBGY09wIGNvbXBhcmUsIEZjRXhwciAqZXhwcik7Cgp2b2lkCkZjVGVzdERlc3Ryb3kgKEZjVGVzdCAqdGVzdCk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVJbnRlZ2VyIChpbnQgaSk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVEb3VibGUgKGRvdWJsZSBkKTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZVN0cmluZyAoY29uc3QgY2hhciAqcyk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVNYXRyaXggKGNvbnN0IEZjTWF0cml4ICptKTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZUJvb2wgKEZjQm9vbCBiKTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZU5pbCAodm9pZCk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVGaWVsZCAoY29uc3QgY2hhciAqZmllbGQpOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlQ29uc3QgKGNvbnN0IGNoYXIgKmNvbnN0YW50KTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZU9wIChGY0V4cHIgKmxlZnQsIEZjT3Agb3AsIEZjRXhwciAqcmlnaHQpOwoKdm9pZApGY0V4cHJEZXN0cm95IChGY0V4cHIgKmUpOwoKRmNFZGl0ICoKRmNFZGl0Q3JlYXRlIChjb25zdCBjaGFyICpmaWVsZCwgRmNPcCBvcCwgRmNFeHByICpleHByKTsKCnZvaWQKRmNFZGl0RGVzdHJveSAoRmNFZGl0ICplKTsKCi8qIGZjaW5pdC5jICovCgp2b2lkCkZjTWVtUmVwb3J0ICh2b2lkKTsKCnZvaWQKRmNNZW1BbGxvYyAoaW50IGtpbmQsIGludCBzaXplKTsKCnZvaWQKRmNNZW1GcmVlIChpbnQga2luZCwgaW50IHNpemUpOwoKLyogZmNsaXN0LmMgKi8KCi8qIGZjbWF0Y2guYyAqLwoKLyogZmNuYW1lLmMgKi8KRmNCb29sCkZjTmFtZUNvbnN0YW50IChjaGFyICpzdHJpbmcsIGludCAqcmVzdWx0KTsKCkZjQm9vbApGY05hbWVCb29sIChjaGFyICp2LCBGY0Jvb2wgKnJlc3VsdCk7CgpGY0Jvb2wKRmNOYW1lQnVmQ2hhciAoRmNOYW1lQnVmICpidWYsIEZjQ2hhcjggYyk7CgpGY0Jvb2wKRmNOYW1lQnVmU3RyaW5nIChGY05hbWVCdWYgKmJ1ZiwgY29uc3QgRmNDaGFyOCAqcyk7CgovKiBmY3BhdC5jICovCnZvaWQKRmNWYWx1ZUxpc3REZXN0cm95IChGY1ZhbHVlTGlzdCAqbCk7CiAgICAKRmNQYXR0ZXJuRWx0ICoKRmNQYXR0ZXJuRmluZCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIEZjQm9vbCBpbnNlcnQpOwoKLyogZmNyZW5kZXIuYyAqLwoKLyogZmNtYXRyaXguYyAqLwp2b2lkCkZjTWF0cml4RnJlZSAoRmNNYXRyaXggKm1hdCk7CgovKiBmY3N0ci5jICovCmNoYXIgKgpGY1N0clBsdXMgKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CiAgICAKdm9pZApGY1N0ckZyZWUgKGNoYXIgKnMpOwoKI2VuZGlmIC8qIF9GQ19JTlRfSF8gKi8K