LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY2ludC5oLHYgMS4zIDIwMDIvMDIvMTggMjI6Mjk6Mjgga2VpdGhwIEV4cCAkCiAqCiAqIENvcHlyaWdodCCpIDIwMDAgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpZm5kZWYgX0ZDSU5UX0hfCiNkZWZpbmUgX0ZDSU5UX0hfCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8Zm9udGNvbmZpZy9mb250Y29uZmlnLmg+CiNpbmNsdWRlIDxmb250Y29uZmlnL2ZjcHJpdmF0ZS5oPgojaWZkZWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSA8Y29uZmlnLmg+CiNlbmRpZgoKdHlwZWRlZiBzdHJ1Y3QgX0ZjTWF0Y2hlciB7CiAgICBjaGFyICAgICpvYmplY3Q7CiAgICBkb3VibGUgICgqY29tcGFyZSkgKGNoYXIgKm9iamVjdCwgRmNWYWx1ZSB2YWx1ZTEsIEZjVmFsdWUgdmFsdWUyKTsKfSBGY01hdGNoZXI7Cgp0eXBlZGVmIHN0cnVjdCBfRmNTeW1ib2xpYyB7CiAgICBjb25zdCBjaGFyCSpuYW1lOwogICAgaW50CQl2YWx1ZTsKfSBGY1N5bWJvbGljOwoKI2lmbmRlZiBGQ19DT05GSUdfUEFUSAojZGVmaW5lIEZDX0NPTkZJR19QQVRIICJmb250cy5jb25mIgojZW5kaWYKCiNkZWZpbmUgRkNfREJHX01BVENICTEKI2RlZmluZSBGQ19EQkdfTUFUQ0hWCTIKI2RlZmluZSBGQ19EQkdfRURJVAk0CiNkZWZpbmUgRkNfREJHX0ZPTlRTRVQJOAojZGVmaW5lIEZDX0RCR19DQUNIRQkxNgojZGVmaW5lIEZDX0RCR19DQUNIRVYJMzIKI2RlZmluZSBGQ19EQkdfUEFSU0UJNjQKI2RlZmluZSBGQ19EQkdfU0NBTgkxMjgKI2RlZmluZSBGQ19EQkdfTUVNT1JZCTUxMgoKI2RlZmluZSBGQ19NRU1fQ0hBUlNFVAkgICAgMAojZGVmaW5lIEZDX01FTV9DSEFSTk9ERQkgICAgMQojZGVmaW5lIEZDX01FTV9GT05UU0VUCSAgICAyCiNkZWZpbmUgRkNfTUVNX0ZPTlRQVFIJICAgIDMKI2RlZmluZSBGQ19NRU1fT0JKRUNUU0VUICAgIDQKI2RlZmluZSBGQ19NRU1fT0JKRUNUUFRSICAgIDUKI2RlZmluZSBGQ19NRU1fTUFUUklYCSAgICA2CiNkZWZpbmUgRkNfTUVNX1BBVFRFUk4JICAgIDcKI2RlZmluZSBGQ19NRU1fUEFURUxUCSAgICA4CiNkZWZpbmUgRkNfTUVNX1ZBTExJU1QJICAgIDkKI2RlZmluZSBGQ19NRU1fU1VCU1RBVEUJICAgIDEwCiNkZWZpbmUgRkNfTUVNX1NUUklORwkgICAgMTEKI2RlZmluZSBGQ19NRU1fTElTVEJVQ0sJICAgIDEyCiNkZWZpbmUgRkNfTUVNX05VTQkgICAgMTMKCnR5cGVkZWYgc3RydWN0IF9GY1ZhbHVlTGlzdCB7CiAgICBzdHJ1Y3QgX0ZjVmFsdWVMaXN0ICAgICpuZXh0OwogICAgRmNWYWx1ZQkJICAgIHZhbHVlOwp9IEZjVmFsdWVMaXN0OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjUGF0dGVybkVsdCB7CiAgICBjb25zdCBjaGFyCSAgICAqb2JqZWN0OwogICAgRmNWYWx1ZUxpc3QgICAgKnZhbHVlczsKfSBGY1BhdHRlcm5FbHQ7CgpzdHJ1Y3QgX0ZjUGF0dGVybiB7CiAgICBpbnQJCSAgICBudW07CiAgICBpbnQJCSAgICBzaXplOwogICAgRmNQYXR0ZXJuRWx0ICAgKmVsdHM7Cn07Cgp0eXBlZGVmIGVudW0gX0ZjT3AgewogICAgRmNPcEludGVnZXIsIEZjT3BEb3VibGUsIEZjT3BTdHJpbmcsIEZjT3BNYXRyaXgsIEZjT3BCb29sLCBGY09wQ2hhclNldCwgCiAgICBGY09wTmlsLAogICAgRmNPcEZpZWxkLCBGY09wQ29uc3QsCiAgICBGY09wQXNzaWduLCBGY09wQXNzaWduUmVwbGFjZSwgCiAgICBGY09wUHJlcGVuZEZpcnN0LCBGY09wUHJlcGVuZCwgRmNPcEFwcGVuZCwgRmNPcEFwcGVuZExhc3QsCiAgICBGY09wUXVlc3QsCiAgICBGY09wT3IsIEZjT3BBbmQsIEZjT3BFcXVhbCwgRmNPcE5vdEVxdWFsLCBGY09wQ29udGFpbnMsCiAgICBGY09wTGVzcywgRmNPcExlc3NFcXVhbCwgRmNPcE1vcmUsIEZjT3BNb3JlRXF1YWwsCiAgICBGY09wUGx1cywgRmNPcE1pbnVzLCBGY09wVGltZXMsIEZjT3BEaXZpZGUsCiAgICBGY09wTm90LCBGY09wQ29tbWEsIEZjT3BJbnZhbGlkCn0gRmNPcDsKCnR5cGVkZWYgc3RydWN0IF9GY0V4cHIgewogICAgRmNPcCAgIG9wOwogICAgdW5pb24gewoJaW50CSAgICBpdmFsOwoJZG91YmxlCSAgICBkdmFsOwoJRmNDaGFyOAkgICAgKnN2YWw7CglGY01hdHJpeCAgICAqbXZhbDsKCUZjQm9vbAkgICAgYnZhbDsKCUZjQ2hhclNldCAgICpjdmFsOwoJY2hhcgkgICAgKmZpZWxkOwoJRmNDaGFyOAkgICAgKmNvbnN0YW50OwoJc3RydWN0IHsKCSAgICBzdHJ1Y3QgX0ZjRXhwciAqbGVmdCwgKnJpZ2h0OwoJfSB0cmVlOwogICAgfSB1Owp9IEZjRXhwcjsKCnR5cGVkZWYgZW51bSBfRmNRdWFsIHsKICAgIEZjUXVhbEFueSwgRmNRdWFsQWxsCn0gRmNRdWFsOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjVGVzdCB7CiAgICBzdHJ1Y3QgX0ZjVGVzdAkqbmV4dDsKICAgIEZjUXVhbAkJcXVhbDsKICAgIGNvbnN0IGNoYXIJCSpmaWVsZDsKICAgIEZjT3AJCW9wOwogICAgRmNFeHByCQkqZXhwcjsKfSBGY1Rlc3Q7Cgp0eXBlZGVmIHN0cnVjdCBfRmNFZGl0IHsKICAgIHN0cnVjdCBfRmNFZGl0ICpuZXh0OwogICAgY29uc3QgY2hhcgkgICAgKmZpZWxkOwogICAgRmNPcAkgICAgb3A7CiAgICBGY0V4cHIJICAgICpleHByOwp9IEZjRWRpdDsKCnR5cGVkZWYgc3RydWN0IF9GY1N1YnN0IHsKICAgIHN0cnVjdCBfRmNTdWJzdAkqbmV4dDsKICAgIEZjVGVzdAkJKnRlc3Q7CiAgICBGY0VkaXQJCSplZGl0Owp9IEZjU3Vic3Q7Cgp0eXBlZGVmIHN0cnVjdCBfRmNDaGFyTGVhZiBGY0NoYXJMZWFmOwp0eXBlZGVmIHN0cnVjdCBfRmNDaGFyQnJhbmNoIEZjQ2hhckJyYW5jaDsKdHlwZWRlZiB1bmlvbiAgX0ZjQ2hhck5vZGUgRmNDaGFyTm9kZTsKCnN0cnVjdCBfRmNDaGFyTGVhZiB7CiAgICBGY0NoYXIzMgltYXBbMjU2LzMyXTsKfTsKCnVuaW9uIF9GY0NoYXJOb2RlIHsKICAgIEZjQ2hhckJyYW5jaCAgICAqYnJhbmNoOwogICAgRmNDaGFyTGVhZgkgICAgKmxlYWY7Cn07CgpzdHJ1Y3QgX0ZjQ2hhckJyYW5jaCB7CiAgICBGY0NoYXJOb2RlCSAgICBub2Rlc1syNTZdOwp9OwoKc3RydWN0IF9GY0NoYXJTZXQgewogICAgaW50CQkgICAgbGV2ZWxzOwogICAgaW50CQkgICAgcmVmOwkvKiByZWZlcmVuY2UgY291bnQgKi8KICAgIEZjQm9vbAkgICAgY29uc3RhbnQ7CS8qIHNoYXJlZCBjb25zdGFudCAqLwogICAgRmNDaGFyTm9kZQkgICAgbm9kZTsKfTsKCnR5cGVkZWYgc3RydWN0IF9GY1N0ckJ1ZiB7CiAgICBGY0NoYXI4ICpidWY7CiAgICBGY0Jvb2wgIGFsbG9jYXRlZDsKICAgIEZjQm9vbCAgZmFpbGVkOwogICAgaW50CSAgICBsZW47CiAgICBpbnQJICAgIHNpemU7Cn0gRmNTdHJCdWY7Cgp0eXBlZGVmIHN0cnVjdCBfRmNGaWxlQ2FjaGVFbnQgewogICAgc3RydWN0IF9GY0ZpbGVDYWNoZUVudCAqbmV4dDsKICAgIHVuc2lnbmVkIGludAkgICAgaGFzaDsKICAgIEZjQ2hhcjgJCSAgICAqZmlsZTsKICAgIGludAkJCSAgICBpZDsKICAgIHRpbWVfdAkJICAgIHRpbWU7CiAgICBGY0NoYXI4CQkgICAgKm5hbWU7CiAgICBGY0Jvb2wJCSAgICByZWZlcmVuY2VkOwp9IEZjRmlsZUNhY2hlRW50OwoKI2RlZmluZSBGQ19GSUxFX0NBQ0hFX0hBU0hfU0laRSAgIDUwOQoKc3RydWN0IF9GY0ZpbGVDYWNoZSB7CiAgICBGY0ZpbGVDYWNoZUVudAkqZW50c1tGQ19GSUxFX0NBQ0hFX0hBU0hfU0laRV07CiAgICBGY0Jvb2wJCXVwZGF0ZWQ7CiAgICBpbnQJCQllbnRyaWVzOwogICAgaW50CQkJcmVmZXJlbmNlZDsKfTsKCnN0cnVjdCBfRmNCbGFua3MgewogICAgaW50CQluYmxhbms7CiAgICBpbnQJCXNibGFuazsKICAgIEZjQ2hhcjMyCSpibGFua3M7Cn07CgpzdHJ1Y3QgX0ZjQ29uZmlnIHsKICAgIC8qCiAgICAgKiBGaWxlIG5hbWVzIGxvYWRlZCBmcm9tIHRoZSBjb25maWd1cmF0aW9uIC0tIHNhdmVkIGhlcmUgYXMgdGhlCiAgICAgKiBjYWNoZSBmaWxlIG11c3QgYmUgY29uc3VsdGVkIGJlZm9yZSB0aGUgZGlyZWN0b3JpZXMgYXJlIHNjYW5uZWQsCiAgICAgKiBhbmQgdGhvc2UgZGlyZWN0aXZlcyBtYXkgb2NjdXIgaW4gYW55IG9yZGVyCiAgICAgKi8KICAgIEZjQ2hhcjgJKipkaXJzOwkJICAgIC8qIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgZm9udHMgKi8KICAgIEZjQ2hhcjgJKmNhY2hlOwkJICAgIC8qIG5hbWUgb2YgcGVyLXVzZXIgY2FjaGUgZmlsZSAqLwogICAgLyoKICAgICAqIFNldCBvZiBhbGxvd2VkIGJsYW5rIGNoYXJzIC0tIHVzZWQgdG8KICAgICAqIHRyaW0gZm9udHMgb2YgYm9ndXMgZ2x5cGhzCiAgICAgKi8KICAgIEZjQmxhbmtzCSpibGFua3M7CiAgICAvKgogICAgICogTmFtZXMgb2YgYWxsIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIHVzZWQKICAgICAqIHRvIGNyZWF0ZSB0aGlzIGNvbmZpZ3VyYXRpb24KICAgICAqLwogICAgRmNDaGFyOAkqKmNvbmZpZ0ZpbGVzOwkgICAgLyogY29uZmlnIGZpbGVzIGxvYWRlZCAqLwogICAgLyoKICAgICAqIFN1YnN0aXR1dGlvbiBpbnN0cnVjdGlvbnMgZm9yIHBhdHRlcm5zIGFuZCBmb250czsKICAgICAqIG1heE9iamVjdHMgaXMgdXNlZCB0byBhbGxvY2F0ZSBhcHByb3ByaWF0ZSBpbnRlcm1lZGlhdGUgc3RvcmFnZQogICAgICogd2hpbGUgcGVyZm9ybWluZyBhIHdob2xlIHNldCBvZiBzdWJzdGl0dXRpb25zCiAgICAgKi8KICAgIEZjU3Vic3QJKnN1YnN0UGF0dGVybjsJICAgIC8qIHN1YnN0aXR1dGlvbnMgZm9yIHBhdHRlcm5zICovCiAgICBGY1N1YnN0CSpzdWJzdEZvbnQ7CSAgICAvKiBzdWJzdGl0dXRpb25zIGZvciBmb250cyAqLwogICAgaW50CQltYXhPYmplY3RzOwkgICAgLyogbWF4aW11bSBudW1iZXIgb2YgdGVzdHMgaW4gYWxsIHN1YnN0cyAqLwogICAgLyoKICAgICAqIFRoZSBzZXQgb2YgZm9udHMgbG9hZGVkIGZyb20gdGhlIGxpc3RlZCBkaXJlY3RvcmllczsgdGhlCiAgICAgKiBvcmRlciB3aXRoaW4gdGhlIHNldCBkb2VzIG5vdCBkZXRlcm1pbmUgdGhlIGZvbnQgc2VsZWN0aW9uLAogICAgICogZXhjZXB0IGluIHRoZSBjYXNlIG9mIGlkZW50aWNhbCBtYXRjaGVzIGluIHdoaWNoIGNhc2UgZWFybGllciBmb250cwogICAgICogbWF0Y2ggcHJlZmVycmVudGlhbGx5CiAgICAgKi8KICAgIEZjRm9udFNldAkqZm9udHNbRmNTZXRBcHBsaWNhdGlvbiArIDFdOwp9OwogCmV4dGVybiBGY0NvbmZpZwkqX2ZjQ29uZmlnOwoKLyogZmNibGFua3MuYyAqLwoKLyogZmNjYWNoZS5jICovCgpGY0ZpbGVDYWNoZSAqCkZjRmlsZUNhY2hlQ3JlYXRlICh2b2lkKTsKCkZjQ2hhcjggKgpGY0ZpbGVDYWNoZUZpbmQgKEZjRmlsZUNhY2hlCSpjYWNoZSwKCQkgY29uc3QgRmNDaGFyOAkqZmlsZSwKCQkgaW50CQlpZCwKCQkgaW50CQkqY291bnQpOwoKdm9pZApGY0ZpbGVDYWNoZURlc3Ryb3kgKEZjRmlsZUNhY2hlCSpjYWNoZSk7Cgp2b2lkCkZjRmlsZUNhY2hlTG9hZCAoRmNGaWxlQ2FjaGUJKmNhY2hlLAoJCSBjb25zdCBGY0NoYXI4CSpjYWNoZV9maWxlKTsKCkZjQm9vbApGY0ZpbGVDYWNoZVVwZGF0ZSAoRmNGaWxlQ2FjaGUJICAgICpjYWNoZSwKCQkgICBjb25zdCBGY0NoYXI4ICAgICpmaWxlLAoJCSAgIGludAkJICAgIGlkLAoJCSAgIGNvbnN0IEZjQ2hhcjggICAgKm5hbWUpOwoKRmNCb29sCkZjRmlsZUNhY2hlU2F2ZSAoRmNGaWxlQ2FjaGUJKmNhY2hlLAoJCSBjb25zdCBGY0NoYXI4CSpjYWNoZV9maWxlKTsKCkZjQm9vbApGY0ZpbGVDYWNoZVJlYWREaXIgKEZjRm9udFNldCAqc2V0LCBjb25zdCBGY0NoYXI4ICpjYWNoZV9maWxlKTsKCkZjQm9vbApGY0ZpbGVDYWNoZVdyaXRlRGlyIChGY0ZvbnRTZXQgKnNldCwgY29uc3QgRmNDaGFyOCAqY2FjaGVfZmlsZSk7CiAgICAKLyogZmNjZmcuYyAqLwoKRmNCb29sCkZjQ29uZmlnQWRkRGlyIChGY0NvbmZpZwkqY29uZmlnLAoJCWNvbnN0IEZjQ2hhcjgJKmQpOwoKRmNCb29sCkZjQ29uZmlnQWRkQ29uZmlnRmlsZSAoRmNDb25maWcJCSpjb25maWcsCgkJICAgICAgIGNvbnN0IEZjQ2hhcjgJKmYpOwoKRmNCb29sCkZjQ29uZmlnU2V0Q2FjaGUgKEZjQ29uZmlnCSpjb25maWcsCgkJICBjb25zdCBGY0NoYXI4CSpjKTsKCkZjQm9vbApGY0NvbmZpZ0FkZEJsYW5rIChGY0NvbmZpZwkqY29uZmlnLAoJCSAgRmNDaGFyMzIgICAgCWJsYW5rKTsKCkZjQm9vbApGY0NvbmZpZ0FkZEVkaXQgKEZjQ29uZmlnCSpjb25maWcsCgkJIEZjVGVzdAkJKnRlc3QsCgkJIEZjRWRpdAkJKmVkaXQsCgkJIEZjTWF0Y2hLaW5kCWtpbmQpOwoKdm9pZApGY0NvbmZpZ1NldEZvbnRzIChGY0NvbmZpZwkqY29uZmlnLAoJCSAgRmNGb250U2V0CSpmb250cywKCQkgIEZjU2V0TmFtZQlzZXQpOwoKRmNCb29sCkZjQ29uZmlnQ29tcGFyZVZhbHVlIChjb25zdCBGY1ZhbHVlIG0sCgkJICAgICAgRmNPcAkgICAgb3AsCgkJICAgICAgY29uc3QgRmNWYWx1ZSB2KTsKCi8qIGZjY2hhcnNldC5jICovCkZjQm9vbApGY05hbWVVbnBhcnNlQ2hhclNldCAoRmNTdHJCdWYgKmJ1ZiwgY29uc3QgRmNDaGFyU2V0ICpjKTsKCkZjQ2hhclNldCAqCkZjTmFtZVBhcnNlQ2hhclNldCAoRmNDaGFyOCAqc3RyaW5nKTsKCi8qIGZjZGJnLmMgKi8Kdm9pZApGY1ZhbHVlUHJpbnQgKEZjVmFsdWUgdik7Cgp2b2lkCkZjVmFsdWVMaXN0UHJpbnQgKEZjVmFsdWVMaXN0ICpsKTsKCnZvaWQKRmNQYXR0ZXJuUHJpbnQgKEZjUGF0dGVybiAqcCk7Cgp2b2lkCkZjT3BQcmludCAoRmNPcCBvcCk7Cgp2b2lkCkZjVGVzdFByaW50IChGY1Rlc3QgKnRlc3QpOwoKdm9pZApGY0V4cHJQcmludCAoRmNFeHByICpleHByKTsKCnZvaWQKRmNFZGl0UHJpbnQgKEZjRWRpdCAqZWRpdCk7Cgp2b2lkCkZjU3Vic3RQcmludCAoRmNTdWJzdCAqc3Vic3QpOwoKdm9pZApGY0ZvbnRTZXRQcmludCAoRmNGb250U2V0ICpzKTsKCmludApGY0RlYnVnICh2b2lkKTsKCi8qIGZjZGlyLmMgKi8KCi8qIGZjZm9udC5jICovCmludApGY0ZvbnREZWJ1ZyAodm9pZCk7CiAgICAKLyogZmNmcy5jICovCi8qIGZjZ3JhbS55ICovCmludApGY0NvbmZpZ3BhcnNlICh2b2lkKTsKCmludApGY0NvbmZpZ3dyYXAgKHZvaWQpOwogICAgCnZvaWQKRmNDb25maWdlcnJvciAoY2hhciAqZm10LCAuLi4pOwogICAgCmNoYXIgKgpGY0NvbmZpZ1NhdmVGaWVsZCAoY29uc3QgY2hhciAqZmllbGQpOwoKRmNUZXN0ICoKRmNUZXN0Q3JlYXRlIChGY1F1YWwgcXVhbCwgY29uc3QgRmNDaGFyOCAqZmllbGQsIEZjT3AgY29tcGFyZSwgRmNFeHByICpleHByKTsKCnZvaWQKRmNUZXN0RGVzdHJveSAoRmNUZXN0ICp0ZXN0KTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZUludGVnZXIgKGludCBpKTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZURvdWJsZSAoZG91YmxlIGQpOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlU3RyaW5nIChjb25zdCBGY0NoYXI4ICpzKTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZU1hdHJpeCAoY29uc3QgRmNNYXRyaXggKm0pOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlQm9vbCAoRmNCb29sIGIpOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlTmlsICh2b2lkKTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZUZpZWxkIChjb25zdCBjaGFyICpmaWVsZCk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVDb25zdCAoY29uc3QgRmNDaGFyOCAqY29uc3RhbnQpOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlT3AgKEZjRXhwciAqbGVmdCwgRmNPcCBvcCwgRmNFeHByICpyaWdodCk7Cgp2b2lkCkZjRXhwckRlc3Ryb3kgKEZjRXhwciAqZSk7CgpGY0VkaXQgKgpGY0VkaXRDcmVhdGUgKGNvbnN0IGNoYXIgKmZpZWxkLCBGY09wIG9wLCBGY0V4cHIgKmV4cHIpOwoKdm9pZApGY0VkaXREZXN0cm95IChGY0VkaXQgKmUpOwoKLyogZmNpbml0LmMgKi8KCnZvaWQKRmNNZW1SZXBvcnQgKHZvaWQpOwoKdm9pZApGY01lbUFsbG9jIChpbnQga2luZCwgaW50IHNpemUpOwoKdm9pZApGY01lbUZyZWUgKGludCBraW5kLCBpbnQgc2l6ZSk7CgovKiBmY2xpc3QuYyAqLwoKLyogZmNtYXRjaC5jICovCgovKiBmY25hbWUuYyAqLwoKRmNCb29sCkZjTmFtZUJvb2wgKEZjQ2hhcjggKnYsIEZjQm9vbCAqcmVzdWx0KTsKCkZjQm9vbApGY1N0ckJ1ZkNoYXIgKEZjU3RyQnVmICpidWYsIEZjQ2hhcjggYyk7CgpGY0Jvb2wKRmNTdHJCdWZTdHJpbmcgKEZjU3RyQnVmICpidWYsIGNvbnN0IEZjQ2hhcjggKnMpOwoKLyogZmNwYXQuYyAqLwp2b2lkCkZjVmFsdWVMaXN0RGVzdHJveSAoRmNWYWx1ZUxpc3QgKmwpOwogICAgCkZjUGF0dGVybkVsdCAqCkZjUGF0dGVybkZpbmQgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBGY0Jvb2wgaW5zZXJ0KTsKCi8qIGZjcmVuZGVyLmMgKi8KCi8qIGZjbWF0cml4LmMgKi8Kdm9pZApGY01hdHJpeEZyZWUgKEZjTWF0cml4ICptYXQpOwoKLyogZmNzdHIuYyAqLwpGY0NoYXI4ICoKRmNTdHJQbHVzIChjb25zdCBGY0NoYXI4ICpzMSwgY29uc3QgRmNDaGFyOCAqczIpOwogICAgCnZvaWQKRmNTdHJGcmVlIChGY0NoYXI4ICpzKTsKCnZvaWQKRmNTdHJCdWZJbml0IChGY1N0ckJ1ZiAqYnVmLCBGY0NoYXI4ICppbml0LCBpbnQgc2l6ZSk7Cgp2b2lkCkZjU3RyQnVmRGVzdHJveSAoRmNTdHJCdWYgKmJ1Zik7CgpGY0NoYXI4ICoKRmNTdHJCdWZEb25lIChGY1N0ckJ1ZiAqYnVmKTsKCkZjQm9vbApGY1N0ckJ1ZkNoYXIgKEZjU3RyQnVmICpidWYsIEZjQ2hhcjggYyk7CgpGY0Jvb2wKRmNTdHJCdWZTdHJpbmcgKEZjU3RyQnVmICpidWYsIGNvbnN0IEZjQ2hhcjggKnMpOwoKRmNCb29sCkZjU3RyQnVmRGF0YSAoRmNTdHJCdWYgKmJ1ZiwgY29uc3QgRmNDaGFyOCAqcywgaW50IGxlbik7CgojZW5kaWYgLyogX0ZDX0lOVF9IXyAqLwo=