LyoKICogJFJDU0lkOiB4Yy9saWIvZm9udGNvbmZpZy9zcmMvZmNpbnQuaCx2IDEuMjcgMjAwMi8wOC8zMSAyMjoxNzozMiBrZWl0aHAgRXhwICQKICoKICogQ29weXJpZ2h0IKkgMjAwMCBLZWl0aCBQYWNrYXJkCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAogKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwogKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCiAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAogKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwogKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAogKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgojaWZuZGVmIF9GQ0lOVF9IXwojZGVmaW5lIF9GQ0lOVF9IXwoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZpZy5oPgojaW5jbHVkZSA8Zm9udGNvbmZpZy9mY3ByaXZhdGUuaD4KI2luY2x1ZGUgPGZvbnRjb25maWcvZmNmcmVldHlwZS5oPgojaWZkZWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSA8Y29uZmlnLmg+CiNlbmRpZgoKdHlwZWRlZiBzdHJ1Y3QgX0ZjU3ltYm9saWMgewogICAgY29uc3QgY2hhcgkqbmFtZTsKICAgIGludAkJdmFsdWU7Cn0gRmNTeW1ib2xpYzsKCiNpZm5kZWYgRkNfQ09ORklHX1BBVEgKI2RlZmluZSBGQ19DT05GSUdfUEFUSCAiZm9udHMuY29uZiIKI2VuZGlmCgojZGVmaW5lIEZDX0ZPTlRfRklMRV9JTlZBTElECSgoRmNDaGFyOCAqKSAiLiIpCiNkZWZpbmUgRkNfRk9OVF9GSUxFX0RJUgkoKEZjQ2hhcjggKikgIi5kaXIiKQoKI2lmZGVmIF9XSU4zMgojZGVmaW5lIEZDX1NFQVJDSF9QQVRIX1NFUEFSQVRPUiAnOycKI2Vsc2UKI2RlZmluZSBGQ19TRUFSQ0hfUEFUSF9TRVBBUkFUT1IgJzonCiNlbmRpZgoKI2RlZmluZSBGQ19EQkdfTUFUQ0gJMQojZGVmaW5lIEZDX0RCR19NQVRDSFYJMgojZGVmaW5lIEZDX0RCR19FRElUCTQKI2RlZmluZSBGQ19EQkdfRk9OVFNFVAk4CiNkZWZpbmUgRkNfREJHX0NBQ0hFCTE2CiNkZWZpbmUgRkNfREJHX0NBQ0hFVgkzMgojZGVmaW5lIEZDX0RCR19QQVJTRQk2NAojZGVmaW5lIEZDX0RCR19TQ0FOCTEyOAojZGVmaW5lIEZDX0RCR19TQ0FOVgkyNTYKI2RlZmluZSBGQ19EQkdfTUVNT1JZCTUxMgoKI2RlZmluZSBGQ19NRU1fQ0hBUlNFVAkgICAgMAojZGVmaW5lIEZDX01FTV9DSEFSTEVBRgkgICAgMQojZGVmaW5lIEZDX01FTV9GT05UU0VUCSAgICAyCiNkZWZpbmUgRkNfTUVNX0ZPTlRQVFIJICAgIDMKI2RlZmluZSBGQ19NRU1fT0JKRUNUU0VUICAgIDQKI2RlZmluZSBGQ19NRU1fT0JKRUNUUFRSICAgIDUKI2RlZmluZSBGQ19NRU1fTUFUUklYCSAgICA2CiNkZWZpbmUgRkNfTUVNX1BBVFRFUk4JICAgIDcKI2RlZmluZSBGQ19NRU1fUEFURUxUCSAgICA4CiNkZWZpbmUgRkNfTUVNX1ZBTExJU1QJICAgIDkKI2RlZmluZSBGQ19NRU1fU1VCU1RBVEUJICAgIDEwCiNkZWZpbmUgRkNfTUVNX1NUUklORwkgICAgMTEKI2RlZmluZSBGQ19NRU1fTElTVEJVQ0sJICAgIDEyCiNkZWZpbmUgRkNfTUVNX1NUUlNFVAkgICAgMTMKI2RlZmluZSBGQ19NRU1fU1RSTElTVAkgICAgMTQKI2RlZmluZSBGQ19NRU1fQ09ORklHCSAgICAxNQojZGVmaW5lIEZDX01FTV9MQU5HU0VUCSAgICAxNgojZGVmaW5lIEZDX01FTV9BVE9NSUMJICAgIDE3CiNkZWZpbmUgRkNfTUVNX0JMQU5LUwkgICAgMTgKI2RlZmluZSBGQ19NRU1fQ0FDSEUJICAgIDE5CiNkZWZpbmUgRkNfTUVNX1NUUkJVRgkgICAgMjAKI2RlZmluZSBGQ19NRU1fU1VCU1QJICAgIDIxCiNkZWZpbmUgRkNfTUVNX09CSkVDVFRZUEUgICAyMgojZGVmaW5lIEZDX01FTV9DT05TVEFOVAkgICAgMjMKI2RlZmluZSBGQ19NRU1fVEVTVAkgICAgMjQKI2RlZmluZSBGQ19NRU1fRVhQUgkgICAgMjUKI2RlZmluZSBGQ19NRU1fVlNUQUNLCSAgICAyNgojZGVmaW5lIEZDX01FTV9BVFRSCSAgICAyNwojZGVmaW5lIEZDX01FTV9QU1RBQ0sJICAgIDI4CgojZGVmaW5lIEZDX01FTV9OVU0JICAgIDI5Cgp0eXBlZGVmIGVudW0gX0ZjVmFsdWVCaW5kaW5nIHsKICAgIEZjVmFsdWVCaW5kaW5nV2VhaywgRmNWYWx1ZUJpbmRpbmdTdHJvbmcsIEZjVmFsdWVCaW5kaW5nU2FtZQp9IEZjVmFsdWVCaW5kaW5nOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjVmFsdWVMaXN0IHsKICAgIHN0cnVjdCBfRmNWYWx1ZUxpc3QgICAgKm5leHQ7CiAgICBGY1ZhbHVlCQkgICAgdmFsdWU7CiAgICBGY1ZhbHVlQmluZGluZwkgICAgYmluZGluZzsKfSBGY1ZhbHVlTGlzdDsKCnR5cGVkZWYgc3RydWN0IF9GY1BhdHRlcm5FbHQgewogICAgY29uc3QgY2hhcgkgICAgKm9iamVjdDsKICAgIEZjVmFsdWVMaXN0CSAgICAqdmFsdWVzOwp9IEZjUGF0dGVybkVsdDsKCgpzdHJ1Y3QgX0ZjUGF0dGVybiB7CiAgICBpbnQJCSAgICBudW07CiAgICBpbnQJCSAgICBzaXplOwogICAgRmNQYXR0ZXJuRWx0ICAgICplbHRzOwogICAgaW50CQkgICAgcmVmOwp9OwoKdHlwZWRlZiBlbnVtIF9GY09wIHsKICAgIEZjT3BJbnRlZ2VyLCBGY09wRG91YmxlLCBGY09wU3RyaW5nLCBGY09wTWF0cml4LCBGY09wQm9vbCwgRmNPcENoYXJTZXQsIAogICAgRmNPcE5pbCwKICAgIEZjT3BGaWVsZCwgRmNPcENvbnN0LAogICAgRmNPcEFzc2lnbiwgRmNPcEFzc2lnblJlcGxhY2UsIAogICAgRmNPcFByZXBlbmRGaXJzdCwgRmNPcFByZXBlbmQsIEZjT3BBcHBlbmQsIEZjT3BBcHBlbmRMYXN0LAogICAgRmNPcFF1ZXN0LAogICAgRmNPcE9yLCBGY09wQW5kLCBGY09wRXF1YWwsIEZjT3BOb3RFcXVhbCwgRmNPcENvbnRhaW5zLCBGY09wTm90Q29udGFpbnMsCiAgICBGY09wTGVzcywgRmNPcExlc3NFcXVhbCwgRmNPcE1vcmUsIEZjT3BNb3JlRXF1YWwsCiAgICBGY09wUGx1cywgRmNPcE1pbnVzLCBGY09wVGltZXMsIEZjT3BEaXZpZGUsCiAgICBGY09wTm90LCBGY09wQ29tbWEsIEZjT3BGbG9vciwgRmNPcENlaWwsIEZjT3BSb3VuZCwgRmNPcFRydW5jLAogICAgRmNPcEludmFsaWQKfSBGY09wOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjRXhwciB7CiAgICBGY09wICAgb3A7CiAgICB1bmlvbiB7CglpbnQJICAgIGl2YWw7Cglkb3VibGUJICAgIGR2YWw7CglGY0NoYXI4CSAgICAqc3ZhbDsKCUZjTWF0cml4ICAgICptdmFsOwoJRmNCb29sCSAgICBidmFsOwoJRmNDaGFyU2V0ICAgKmN2YWw7CgljaGFyCSAgICAqZmllbGQ7CglGY0NoYXI4CSAgICAqY29uc3RhbnQ7CglzdHJ1Y3QgewoJICAgIHN0cnVjdCBfRmNFeHByICpsZWZ0LCAqcmlnaHQ7Cgl9IHRyZWU7CiAgICB9IHU7Cn0gRmNFeHByOwoKdHlwZWRlZiBlbnVtIF9GY1F1YWwgewogICAgRmNRdWFsQW55LCBGY1F1YWxBbGwsIEZjUXVhbEZpcnN0LCBGY1F1YWxOb3RGaXJzdAp9IEZjUXVhbDsKCiNkZWZpbmUgRmNNYXRjaERlZmF1bHQJKChGY01hdGNoS2luZCkgLTEpCgp0eXBlZGVmIHN0cnVjdCBfRmNUZXN0IHsKICAgIHN0cnVjdCBfRmNUZXN0CSpuZXh0OwogICAgRmNNYXRjaEtpbmQJCWtpbmQ7CiAgICBGY1F1YWwJCXF1YWw7CiAgICBjb25zdCBjaGFyCQkqZmllbGQ7CiAgICBGY09wCQlvcDsKICAgIEZjRXhwcgkJKmV4cHI7Cn0gRmNUZXN0OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjRWRpdCB7CiAgICBzdHJ1Y3QgX0ZjRWRpdCAqbmV4dDsKICAgIGNvbnN0IGNoYXIJICAgICpmaWVsZDsKICAgIEZjT3AJICAgIG9wOwogICAgRmNFeHByCSAgICAqZXhwcjsKICAgIEZjVmFsdWVCaW5kaW5nICBiaW5kaW5nOwp9IEZjRWRpdDsKCnR5cGVkZWYgc3RydWN0IF9GY1N1YnN0IHsKICAgIHN0cnVjdCBfRmNTdWJzdAkqbmV4dDsKICAgIEZjVGVzdAkJKnRlc3Q7CiAgICBGY0VkaXQJCSplZGl0Owp9IEZjU3Vic3Q7Cgp0eXBlZGVmIHN0cnVjdCBfRmNDaGFyTGVhZiB7CiAgICBGY0NoYXIzMgltYXBbMjU2LzMyXTsKfSBGY0NoYXJMZWFmOwoKI2RlZmluZSBGQ19SRUZfQ09OU1RBTlQJICAgIC0xCgpzdHJ1Y3QgX0ZjQ2hhclNldCB7CiAgICBpbnQJCSAgICByZWY7CS8qIHJlZmVyZW5jZSBjb3VudCAqLwogICAgaW50CQkgICAgbnVtOwkvKiBzaXplIG9mIGxlYXZlcyBhbmQgbnVtYmVycyBhcnJheXMgKi8KICAgIEZjQ2hhckxlYWYJICAgICoqbGVhdmVzOwogICAgRmNDaGFyMTYJICAgICpudW1iZXJzOwp9OwoKc3RydWN0IF9GY1N0clNldCB7CiAgICBpbnQJCSAgICByZWY7CS8qIHJlZmVyZW5jZSBjb3VudCAqLwogICAgaW50CQkgICAgbnVtOwogICAgaW50CQkgICAgc2l6ZTsKICAgIEZjQ2hhcjgJICAgICoqc3RyczsKfTsKCnN0cnVjdCBfRmNTdHJMaXN0IHsKICAgIEZjU3RyU2V0CSAgICAqc2V0OwogICAgaW50CQkgICAgbjsKfTsKCnR5cGVkZWYgc3RydWN0IF9GY1N0ckJ1ZiB7CiAgICBGY0NoYXI4ICpidWY7CiAgICBGY0Jvb2wgIGFsbG9jYXRlZDsKICAgIEZjQm9vbCAgZmFpbGVkOwogICAgaW50CSAgICBsZW47CiAgICBpbnQJICAgIHNpemU7Cn0gRmNTdHJCdWY7CgovKgogKiBUaGUgcGVyLXVzZXIgfi8uZm9udHMuY2FjaGUtPHZlcnNpb24+IGZpbGUgaXMgbG9hZGVkIGludG8KICogdGhpcyBkYXRhIHN0cnVjdHVyZS4gIEVhY2ggZGlyZWN0b3J5IGdldHMgYSBzdWJzdHJ1Y3R1cmUKICogd2hpY2ggaXMgdmFsaWRhdGVkIGJ5IGNvbXBhcmluZyB0aGUgZGlyZWN0b3J5IHRpbWVzdGFtcCB3aXRoCiAqIHRoYXQgc2F2ZWQgaW4gdGhlIGNhY2hlLiAgV2hlbiB2YWxpZCwgdGhlIGVudGlyZSBkaXJlY3RvcnkgY2FjaGUKICogY2FuIGJlIGltbWVkaWF0ZWx5IGxvYWRlZCB3aXRob3V0IHJlYWRpbmcgdGhlIGRpcmVjdG9yeS4gIE90aGVyd2lzZSwKICogdGhlIGZpbGVzIGFyZSBjaGVja2VkIGluZGl2aWR1YWxseTsgdXBkYXRlZCBmaWxlcyBhcmUgbG9hZGVkIGludG8gdGhlCiAqIGNhY2hlIHdoaWNoIGlzIHRoZW4gcmV3cml0dGVuIHRvIHRoZSB1c2VycyBob21lIGRpcmVjdG9yeQogKi8KCiNkZWZpbmUgRkNfR0xPQkFMX0NBQ0hFX0RJUl9IQVNIX1NJWkUJICAgIDM3CiNkZWZpbmUgRkNfR0xPQkFMX0NBQ0hFX0ZJTEVfSEFTSF9TSVpFCSAgICA2NwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjR2xvYmFsQ2FjaGVJbmZvIHsKICAgIHVuc2lnbmVkIGludAkJaGFzaDsKICAgIEZjQ2hhcjgJCQkqZmlsZTsKICAgIHRpbWVfdAkJCXRpbWU7CiAgICBGY0Jvb2wJCQlyZWZlcmVuY2VkOwp9IEZjR2xvYmFsQ2FjaGVJbmZvOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjR2xvYmFsQ2FjaGVGaWxlIHsKICAgIHN0cnVjdCBfRmNHbG9iYWxDYWNoZUZpbGUJKm5leHQ7CiAgICBGY0dsb2JhbENhY2hlSW5mbwkJaW5mbzsKICAgIGludAkJCQlpZDsKICAgIEZjQ2hhcjgJCQkqbmFtZTsKfSBGY0dsb2JhbENhY2hlRmlsZTsKCnR5cGVkZWYgc3RydWN0IF9GY0dsb2JhbENhY2hlRGlyIEZjR2xvYmFsQ2FjaGVEaXI7Cgp0eXBlZGVmIHN0cnVjdCBfRmNHbG9iYWxDYWNoZVN1YmRpciB7CiAgICBzdHJ1Y3QgX0ZjR2xvYmFsQ2FjaGVTdWJkaXIJKm5leHQ7CiAgICBGY0dsb2JhbENhY2hlRGlyCQkqZW50Owp9IEZjR2xvYmFsQ2FjaGVTdWJkaXI7CgpzdHJ1Y3QgX0ZjR2xvYmFsQ2FjaGVEaXIgewogICAgc3RydWN0IF9GY0dsb2JhbENhY2hlRGlyCSpuZXh0OwogICAgRmNHbG9iYWxDYWNoZUluZm8gICAgCWluZm87CiAgICBpbnQJCQkJbGVuOwogICAgRmNHbG9iYWxDYWNoZUZpbGUJCSplbnRzW0ZDX0dMT0JBTF9DQUNIRV9GSUxFX0hBU0hfU0laRV07CiAgICBGY0dsb2JhbENhY2hlU3ViZGlyCQkqc3ViZGlyczsKfTsKCnR5cGVkZWYgc3RydWN0IF9GY0dsb2JhbENhY2hlIHsKICAgIEZjR2xvYmFsQ2FjaGVEaXIJCSplbnRzW0ZDX0dMT0JBTF9DQUNIRV9ESVJfSEFTSF9TSVpFXTsKICAgIEZjQm9vbAkJCXVwZGF0ZWQ7CiAgICBGY0Jvb2wJCQlicm9rZW47CiAgICBpbnQJCQkJZW50cmllczsKICAgIGludAkJCQlyZWZlcmVuY2VkOwp9IEZjR2xvYmFsQ2FjaGU7CgpzdHJ1Y3QgX0ZjQXRvbWljIHsKICAgIEZjQ2hhcjgJKmZpbGU7CQkvKiBvcmlnaW5hbCBmaWxlIG5hbWUgKi8KICAgIEZjQ2hhcjgJKm5ldzsJCS8qIHRlbXAgZmlsZSBuYW1lIC0tIHdyaXRlIGRhdGEgaGVyZSAqLwogICAgRmNDaGFyOAkqbGNrOwkJLyogbG9ja2ZpbGUgbmFtZSAodXNlZCBmb3IgbG9ja2luZykgKi8KICAgIEZjQ2hhcjgJKnRtcDsJCS8qIHRtcGZpbGUgbmFtZSAodXNlZCBmb3IgbG9ja2luZykgKi8KfTsKCnN0cnVjdCBfRmNCbGFua3MgewogICAgaW50CQluYmxhbms7CiAgICBpbnQJCXNibGFuazsKICAgIEZjQ2hhcjMyCSpibGFua3M7Cn07CgpzdHJ1Y3QgX0ZjQ29uZmlnIHsKICAgIC8qCiAgICAgKiBGaWxlIG5hbWVzIGxvYWRlZCBmcm9tIHRoZSBjb25maWd1cmF0aW9uIC0tIHNhdmVkIGhlcmUgYXMgdGhlCiAgICAgKiBjYWNoZSBmaWxlIG11c3QgYmUgY29uc3VsdGVkIGJlZm9yZSB0aGUgZGlyZWN0b3JpZXMgYXJlIHNjYW5uZWQsCiAgICAgKiBhbmQgdGhvc2UgZGlyZWN0aXZlcyBtYXkgb2NjdXIgaW4gYW55IG9yZGVyCiAgICAgKi8KICAgIEZjU3RyU2V0CSpjb25maWdEaXJzOwkgICAgLyogZGlyZWN0b3JpZXMgdG8gc2NhbiBmb3IgZm9udHMgKi8KICAgIEZjQ2hhcjgJKmNhY2hlOwkJICAgIC8qIG5hbWUgb2YgcGVyLXVzZXIgY2FjaGUgZmlsZSAqLwogICAgLyoKICAgICAqIFNldCBvZiBhbGxvd2VkIGJsYW5rIGNoYXJzIC0tIHVzZWQgdG8KICAgICAqIHRyaW0gZm9udHMgb2YgYm9ndXMgZ2x5cGhzCiAgICAgKi8KICAgIEZjQmxhbmtzCSpibGFua3M7CiAgICAvKgogICAgICogTGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGZvbnRzLAogICAgICogYnVpbHQgYnkgcmVjdXJzaXZlbHkgc2Nhbm5pbmcgdGhlIHNldCAKICAgICAqIG9mIGNvbmZpZ3VyZWQgZGlyZWN0b3JpZXMKICAgICAqLwogICAgRmNTdHJTZXQJKmZvbnREaXJzOwogICAgLyoKICAgICAqIE5hbWVzIG9mIGFsbCBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyB1c2VkCiAgICAgKiB0byBjcmVhdGUgdGhpcyBjb25maWd1cmF0aW9uCiAgICAgKi8KICAgIEZjU3RyU2V0CSpjb25maWdGaWxlczsJICAgIC8qIGNvbmZpZyBmaWxlcyBsb2FkZWQgKi8KICAgIC8qCiAgICAgKiBTdWJzdGl0dXRpb24gaW5zdHJ1Y3Rpb25zIGZvciBwYXR0ZXJucyBhbmQgZm9udHM7CiAgICAgKiBtYXhPYmplY3RzIGlzIHVzZWQgdG8gYWxsb2NhdGUgYXBwcm9wcmlhdGUgaW50ZXJtZWRpYXRlIHN0b3JhZ2UKICAgICAqIHdoaWxlIHBlcmZvcm1pbmcgYSB3aG9sZSBzZXQgb2Ygc3Vic3RpdHV0aW9ucwogICAgICovCiAgICBGY1N1YnN0CSpzdWJzdFBhdHRlcm47CSAgICAvKiBzdWJzdGl0dXRpb25zIGZvciBwYXR0ZXJucyAqLwogICAgRmNTdWJzdAkqc3Vic3RGb250OwkgICAgLyogc3Vic3RpdHV0aW9ucyBmb3IgZm9udHMgKi8KICAgIGludAkJbWF4T2JqZWN0czsJICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIHRlc3RzIGluIGFsbCBzdWJzdHMgKi8KICAgIC8qCiAgICAgKiBUaGUgc2V0IG9mIGZvbnRzIGxvYWRlZCBmcm9tIHRoZSBsaXN0ZWQgZGlyZWN0b3JpZXM7IHRoZQogICAgICogb3JkZXIgd2l0aGluIHRoZSBzZXQgZG9lcyBub3QgZGV0ZXJtaW5lIHRoZSBmb250IHNlbGVjdGlvbiwKICAgICAqIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBpZGVudGljYWwgbWF0Y2hlcyBpbiB3aGljaCBjYXNlIGVhcmxpZXIgZm9udHMKICAgICAqIG1hdGNoIHByZWZlcnJlbnRpYWxseQogICAgICovCiAgICBGY0ZvbnRTZXQJKmZvbnRzW0ZjU2V0QXBwbGljYXRpb24gKyAxXTsKICAgIC8qCiAgICAgKiBGb250Y29uZmlnIGNhbiBwZXJpb2RpY2FsbHkgcmVzY2FuIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbgogICAgICogYW5kIGZvbnQgZGlyZWN0b3JpZXMuICBUaGlzIHJlc2Nhbm5pbmcgb2NjdXJzIHdoZW4gZm9udAogICAgICogbGlzdGluZyByZXF1ZXN0cyBhcmUgbWFkZSwgYnV0IG5vIG1vcmUgb2Z0ZW4gdGhhbiByZXNjYW5JbnRlcnZhbAogICAgICogc2Vjb25kcyBhcGFydC4KICAgICAqLwogICAgdGltZV90CXJlc2NhblRpbWU7CSAgICAvKiBsYXN0IHRpbWUgaW5mb3JtYXRpb24gd2FzIHNjYW5uZWQgKi8KICAgIGludAkJcmVzY2FuSW50ZXJ2YWw7CSAgICAvKiBpbnRlcnZhbCBiZXR3ZWVuIHNjYW5zICovCn07CiAKZXh0ZXJuIEZjQ29uZmlnCSpfZmNDb25maWc7Cgp0eXBlZGVmIHN0cnVjdCBfRmNDaGFyTWFwIEZjQ2hhck1hcDsKCi8qIGZjYmxhbmtzLmMgKi8KCi8qIGZjY2FjaGUuYyAqLwoKRmNHbG9iYWxDYWNoZSAqCkZjR2xvYmFsQ2FjaGVDcmVhdGUgKHZvaWQpOwoKdm9pZApGY0dsb2JhbENhY2hlRGVzdHJveSAoRmNHbG9iYWxDYWNoZSAqY2FjaGUpOwoKRmNCb29sCkZjR2xvYmFsQ2FjaGVDaGVja1RpbWUgKGNvbnN0IEZjQ2hhcjgqZmlsZSwgRmNHbG9iYWxDYWNoZUluZm8gKmluZm8pOwoKdm9pZApGY0dsb2JhbENhY2hlUmVmZXJlbmNlZCAoRmNHbG9iYWxDYWNoZQkgICAgKmNhY2hlLAoJCQkgRmNHbG9iYWxDYWNoZUluZm8gICppbmZvKTsKCnZvaWQKRmNHbG9iYWxDYWNoZVJlZmVyZW5jZVN1YmRpciAoRmNHbG9iYWxDYWNoZSAqY2FjaGUsCgkJCSAgICAgIGNvbnN0IEZjQ2hhcjggKmRpcik7CgpGY0dsb2JhbENhY2hlRGlyICoKRmNHbG9iYWxDYWNoZURpckdldCAoRmNHbG9iYWxDYWNoZSAgKmNhY2hlLAoJCSAgICAgY29uc3QgRmNDaGFyOCAgKmRpciwKCQkgICAgIGludAkgICAgbGVuLAoJCSAgICAgRmNCb29sCSAgICBjcmVhdGVfbWlzc2luZyk7CgpGY0Jvb2wKRmNHbG9iYWxDYWNoZVNjYW5EaXIgKEZjRm9udFNldAkJKnNldCwKCQkgICAgICBGY1N0clNldAkJKmRpcnMsCgkJICAgICAgRmNHbG9iYWxDYWNoZQkqY2FjaGUsCgkJICAgICAgY29uc3QgRmNDaGFyOAkqZGlyKTsKCkZjR2xvYmFsQ2FjaGVGaWxlICoKRmNHbG9iYWxDYWNoZUZpbGVHZXQgKEZjR2xvYmFsQ2FjaGUgKmNhY2hlLAoJCSAgICAgIGNvbnN0IEZjQ2hhcjggKmZpbGUsCgkJICAgICAgaW50CSAgICBpZCwKCQkgICAgICBpbnQJICAgICpjb3VudCk7CgoKdm9pZApGY0dsb2JhbENhY2hlTG9hZCAoRmNHbG9iYWxDYWNoZSAgICAqY2FjaGUsCgkJICAgY29uc3QgRmNDaGFyOCAgICAqY2FjaGVfZmlsZSk7CgpGY0Jvb2wKRmNHbG9iYWxDYWNoZVVwZGF0ZSAoRmNHbG9iYWxDYWNoZSAgKmNhY2hlLAoJCSAgICAgY29uc3QgRmNDaGFyOCAgKmZpbGUsCgkJICAgICBpbnQJICAgIGlkLAoJCSAgICAgY29uc3QgRmNDaGFyOCAgKm5hbWUpOwoKRmNCb29sCkZjR2xvYmFsQ2FjaGVTYXZlIChGY0dsb2JhbENhY2hlICAgICpjYWNoZSwKCQkgICBjb25zdCBGY0NoYXI4ICAgICpjYWNoZV9maWxlKTsKCkZjQm9vbApGY0RpckNhY2hlUmVhZERpciAoRmNGb250U2V0ICpzZXQsIEZjU3RyU2V0ICpkaXJzLCBjb25zdCBGY0NoYXI4ICpkaXIpOwoKRmNCb29sCkZjRGlyQ2FjaGVXcml0ZURpciAoRmNGb250U2V0ICpzZXQsIEZjU3RyU2V0ICpkaXJzLCBjb25zdCBGY0NoYXI4ICpkaXIpOwogICAgCi8qIGZjY2ZnLmMgKi8KCkZjQm9vbApGY0NvbmZpZ0FkZENvbmZpZ0RpciAoRmNDb25maWcJICAgICpjb25maWcsCgkJICAgICAgY29uc3QgRmNDaGFyOCAqZCk7CgpGY0Jvb2wKRmNDb25maWdBZGRGb250RGlyIChGY0NvbmZpZwkgICAgKmNvbmZpZywKCQkgICAgY29uc3QgRmNDaGFyOCAgICpkKTsKCkZjQm9vbApGY0NvbmZpZ0FkZERpciAoRmNDb25maWcJKmNvbmZpZywKCQljb25zdCBGY0NoYXI4CSpkKTsKCkZjQm9vbApGY0NvbmZpZ0FkZENvbmZpZ0ZpbGUgKEZjQ29uZmlnCQkqY29uZmlnLAoJCSAgICAgICBjb25zdCBGY0NoYXI4CSpmKTsKCkZjQm9vbApGY0NvbmZpZ1NldENhY2hlIChGY0NvbmZpZwkqY29uZmlnLAoJCSAgY29uc3QgRmNDaGFyOAkqYyk7CgpGY0Jvb2wKRmNDb25maWdBZGRCbGFuayAoRmNDb25maWcJKmNvbmZpZywKCQkgIEZjQ2hhcjMyICAgIAlibGFuayk7CgpGY0Jvb2wKRmNDb25maWdBZGRFZGl0IChGY0NvbmZpZwkqY29uZmlnLAoJCSBGY1Rlc3QJCSp0ZXN0LAoJCSBGY0VkaXQJCSplZGl0LAoJCSBGY01hdGNoS2luZAlraW5kKTsKCnZvaWQKRmNDb25maWdTZXRGb250cyAoRmNDb25maWcJKmNvbmZpZywKCQkgIEZjRm9udFNldAkqZm9udHMsCgkJICBGY1NldE5hbWUJc2V0KTsKCkZjQm9vbApGY0NvbmZpZ0NvbXBhcmVWYWx1ZSAoY29uc3QgRmNWYWx1ZSBtLAoJCSAgICAgIEZjT3AJICAgIG9wLAoJCSAgICAgIGNvbnN0IEZjVmFsdWUgdik7CgovKiBmY2NoYXJzZXQuYyAqLwpGY0NoYXJTZXQgKgpGY0NoYXJTZXRGcmVlemUgKEZjQ2hhclNldCAqY3MpOwoKRmNCb29sCkZjTmFtZVVucGFyc2VDaGFyU2V0IChGY1N0ckJ1ZiAqYnVmLCBjb25zdCBGY0NoYXJTZXQgKmMpOwoKRmNDaGFyU2V0ICoKRmNOYW1lUGFyc2VDaGFyU2V0IChGY0NoYXI4ICpzdHJpbmcpOwoKRmNDaGFyTGVhZiAqCkZjQ2hhclNldEZpbmRMZWFmQ3JlYXRlIChGY0NoYXJTZXQgKmZjcywgRmNDaGFyMzIgdWNzNCk7CgovKiBmY2RiZy5jICovCnZvaWQKRmNWYWx1ZUxpc3RQcmludCAoY29uc3QgRmNWYWx1ZUxpc3QgKmwpOwoKdm9pZApGY0xhbmdTZXRQcmludCAoY29uc3QgRmNMYW5nU2V0ICpscyk7Cgp2b2lkCkZjT3BQcmludCAoRmNPcCBvcCk7Cgp2b2lkCkZjVGVzdFByaW50IChjb25zdCBGY1Rlc3QgKnRlc3QpOwoKdm9pZApGY0V4cHJQcmludCAoY29uc3QgRmNFeHByICpleHByKTsKCnZvaWQKRmNFZGl0UHJpbnQgKGNvbnN0IEZjRWRpdCAqZWRpdCk7Cgp2b2lkCkZjU3Vic3RQcmludCAoY29uc3QgRmNTdWJzdCAqc3Vic3QpOwoKaW50CkZjRGVidWcgKHZvaWQpOwoKLyogZmNkaXIuYyAqLwoKLyogZmNmb250LmMgKi8KaW50CkZjRm9udERlYnVnICh2b2lkKTsKICAgIAovKiBmY2ZyZWV0eXBlLmMgKi8KRmNCb29sCkZjRnJlZVR5cGVJc0V4Y2x1c2l2ZUxhbmcgKGNvbnN0IEZjQ2hhcjggICpsYW5nKTsKCkZjQm9vbApGY0ZyZWVUeXBlSGFzTGFuZyAoRmNQYXR0ZXJuICpwYXR0ZXJuLCBjb25zdCBGY0NoYXI4ICpsYW5nKTsKCkZjQ2hhcjMyCkZjRnJlZVR5cGVVY3M0VG9Qcml2YXRlIChGY0NoYXIzMiB1Y3M0LCBjb25zdCBGY0NoYXJNYXAgKm1hcCk7CgpGY0NoYXIzMgpGY0ZyZWVUeXBlUHJpdmF0ZVRvVWNzNCAoRmNDaGFyMzIgcHJpdmF0ZSwgY29uc3QgRmNDaGFyTWFwICptYXApOwoKY29uc3QgRmNDaGFyTWFwICoKRmNGcmVlVHlwZUdldFByaXZhdGVNYXAgKEZUX0VuY29kaW5nIGVuY29kaW5nKTsKICAgIAovKiBmY2ZzLmMgKi8KLyogZmNncmFtLnkgKi8KaW50CkZjQ29uZmlncGFyc2UgKHZvaWQpOwoKaW50CkZjQ29uZmlnd3JhcCAodm9pZCk7CiAgICAKdm9pZApGY0NvbmZpZ2Vycm9yIChjaGFyICpmbXQsIC4uLik7CiAgICAKY2hhciAqCkZjQ29uZmlnU2F2ZUZpZWxkIChjb25zdCBjaGFyICpmaWVsZCk7CgpGY1Rlc3QgKgpGY1Rlc3RDcmVhdGUgKEZjTWF0Y2hLaW5kICAga2luZCwKCSAgICAgIEZjUXVhbAkgICAgcXVhbCwKCSAgICAgIGNvbnN0IEZjQ2hhcjggKmZpZWxkLAoJICAgICAgRmNPcAkgICAgY29tcGFyZSwKCSAgICAgIEZjRXhwcgkgICAgKmV4cHIpOwoKdm9pZApGY1Rlc3REZXN0cm95IChGY1Rlc3QgKnRlc3QpOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlSW50ZWdlciAoaW50IGkpOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlRG91YmxlIChkb3VibGUgZCk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVTdHJpbmcgKGNvbnN0IEZjQ2hhcjggKnMpOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlTWF0cml4IChjb25zdCBGY01hdHJpeCAqbSk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVCb29sIChGY0Jvb2wgYik7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVOaWwgKHZvaWQpOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlRmllbGQgKGNvbnN0IGNoYXIgKmZpZWxkKTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZUNvbnN0IChjb25zdCBGY0NoYXI4ICpjb25zdGFudCk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVPcCAoRmNFeHByICpsZWZ0LCBGY09wIG9wLCBGY0V4cHIgKnJpZ2h0KTsKCnZvaWQKRmNFeHByRGVzdHJveSAoRmNFeHByICplKTsKCkZjRWRpdCAqCkZjRWRpdENyZWF0ZSAoY29uc3QgY2hhciAqZmllbGQsIEZjT3Agb3AsIEZjRXhwciAqZXhwciwgRmNWYWx1ZUJpbmRpbmcgYmluZGluZyk7Cgp2b2lkCkZjRWRpdERlc3Ryb3kgKEZjRWRpdCAqZSk7CgovKiBmY2luaXQuYyAqLwoKdm9pZApGY01lbVJlcG9ydCAodm9pZCk7Cgp2b2lkCkZjTWVtQWxsb2MgKGludCBraW5kLCBpbnQgc2l6ZSk7Cgp2b2lkCkZjTWVtRnJlZSAoaW50IGtpbmQsIGludCBzaXplKTsKCi8qIGZjbGFuZy5jICovCkZjTGFuZ1NldCAqCkZjRnJlZVR5cGVMYW5nU2V0IChjb25zdCBGY0NoYXJTZXQgICpjaGFyc2V0LCAKCQkgICBjb25zdCBGY0NoYXI4ICAgICpleGNsdXNpdmVMYW5nKTsKCkZjTGFuZ1Jlc3VsdApGY0xhbmdDb21wYXJlIChjb25zdCBGY0NoYXI4ICpzMSwgY29uc3QgRmNDaGFyOCAqczIpOwogICAgCmNvbnN0IEZjQ2hhclNldCAqCkZjQ2hhclNldEZvckxhbmcgKGNvbnN0IEZjQ2hhcjggKmxhbmcpOwoKRmNMYW5nU2V0ICoKRmNMYW5nU2V0UHJvbW90ZSAoY29uc3QgRmNDaGFyOCAqbGFuZyk7CgpGY0xhbmdTZXQgKgpGY05hbWVQYXJzZUxhbmdTZXQgKGNvbnN0IEZjQ2hhcjggKnN0cmluZyk7CgpGY0Jvb2wKRmNOYW1lVW5wYXJzZUxhbmdTZXQgKEZjU3RyQnVmICpidWYsIGNvbnN0IEZjTGFuZ1NldCAqbHMpOwoKLyogZmNsaXN0LmMgKi8KCi8qIGZjbWF0Y2guYyAqLwoKLyogZmNuYW1lLmMgKi8KCkZjQm9vbApGY05hbWVCb29sIChGY0NoYXI4ICp2LCBGY0Jvb2wgKnJlc3VsdCk7CgovKiBmY3BhdC5jICovCnZvaWQKRmNWYWx1ZUxpc3REZXN0cm95IChGY1ZhbHVlTGlzdCAqbCk7CiAgICAKRmNQYXR0ZXJuRWx0ICoKRmNQYXR0ZXJuRmluZEVsdCAoY29uc3QgRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QpOwoKRmNQYXR0ZXJuRWx0ICoKRmNQYXR0ZXJuSW5zZXJ0RWx0IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCk7CgpGY0Jvb2wKRmNQYXR0ZXJuQWRkV2l0aEJpbmRpbmcgIChGY1BhdHRlcm4JICAgICpwLAoJCQkgIGNvbnN0IGNoYXIJICAgICpvYmplY3QsCgkJCSAgRmNWYWx1ZQkgICAgdmFsdWUsCgkJCSAgRmNWYWx1ZUJpbmRpbmcgICAgYmluZGluZywKCQkJICBGY0Jvb2wJICAgIGFwcGVuZCk7CgpGY1BhdHRlcm4gKgpGY1BhdHRlcm5GcmVlemUgKEZjUGF0dGVybiAqcCk7CgovKiBmY3JlbmRlci5jICovCgovKiBmY21hdHJpeC5jICovCgpleHRlcm4gY29uc3QgRmNNYXRyaXggICAgRmNJZGVudGl0eU1hdHJpeDsKCnZvaWQKRmNNYXRyaXhGcmVlIChGY01hdHJpeCAqbWF0KTsKCi8qIGZjc3RyLmMgKi8KRmNDaGFyOCAqCkZjU3RyUGx1cyAoY29uc3QgRmNDaGFyOCAqczEsIGNvbnN0IEZjQ2hhcjggKnMyKTsKICAgIAp2b2lkCkZjU3RyRnJlZSAoRmNDaGFyOCAqcyk7Cgp2b2lkCkZjU3RyQnVmSW5pdCAoRmNTdHJCdWYgKmJ1ZiwgRmNDaGFyOCAqaW5pdCwgaW50IHNpemUpOwoKdm9pZApGY1N0ckJ1ZkRlc3Ryb3kgKEZjU3RyQnVmICpidWYpOwoKRmNDaGFyOCAqCkZjU3RyQnVmRG9uZSAoRmNTdHJCdWYgKmJ1Zik7CgpGY0Jvb2wKRmNTdHJCdWZDaGFyIChGY1N0ckJ1ZiAqYnVmLCBGY0NoYXI4IGMpOwoKRmNCb29sCkZjU3RyQnVmU3RyaW5nIChGY1N0ckJ1ZiAqYnVmLCBjb25zdCBGY0NoYXI4ICpzKTsKCkZjQm9vbApGY1N0ckJ1ZkRhdGEgKEZjU3RyQnVmICpidWYsIGNvbnN0IEZjQ2hhcjggKnMsIGludCBsZW4pOwoKaW50CkZjU3RyQ21wSWdub3JlQmxhbmtzQW5kQ2FzZSAoY29uc3QgRmNDaGFyOCAqczEsIGNvbnN0IEZjQ2hhcjggKnMyKTsKCkZjQm9vbApGY1N0clVzZXNIb21lIChjb25zdCBGY0NoYXI4ICpzKTsKCkZjQ2hhcjggKgpGY1N0ckxhc3RTbGFzaCAoY29uc3QgRmNDaGFyOCAgKnBhdGgpOwoKI2VuZGlmIC8qIF9GQ19JTlRfSF8gKi8K