LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL2ZvbnRjb25maWcvZm9udGNvbmZpZy5oLHYgMS4yMSAyMDAyLzA3LzExIDAyOjQ3OjUwIGtlaXRocCBFeHAgJAogKgogKiBDb3B5cmlnaHQgqSAyMDAxIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAogKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwogKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCiAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAogKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwogKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAogKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgojaWZuZGVmIF9GT05UQ09ORklHX0hfCiNkZWZpbmUgX0ZPTlRDT05GSUdfSF8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KCnR5cGVkZWYgdW5zaWduZWQgY2hhcglGY0NoYXI4Owp0eXBlZGVmIHVuc2lnbmVkIHNob3J0CUZjQ2hhcjE2Owp0eXBlZGVmIHVuc2lnbmVkIGludAlGY0NoYXIzMjsKdHlwZWRlZiBpbnQJCUZjQm9vbDsKCi8qCiAqIEN1cnJlbnQgRm9udGNvbmZpZyB2ZXJzaW9uIG51bWJlcgogKi8KI2RlZmluZSBGQ19NQUpPUgkxCiNkZWZpbmUgRkNfTUlOT1IJMAojZGVmaW5lIEZDX1JFVklTSU9OCTEKCiNkZWZpbmUgRkNfVkVSU0lPTgkoKEZDX01BSk9SICogMTAwMDApICsgKEZDX01JTk9SICogMTAwKSArIChGQ19SRVZJU0lPTikpCgojZGVmaW5lIEZjVHJ1ZQkJMQojZGVmaW5lIEZjRmFsc2UJCTAKCiNkZWZpbmUgRkNfRkFNSUxZCSAgICAiZmFtaWx5IgkJLyogU3RyaW5nICovCiNkZWZpbmUgRkNfU1RZTEUJICAgICJzdHlsZSIJCS8qIFN0cmluZyAqLwojZGVmaW5lIEZDX1NMQU5UCSAgICAic2xhbnQiCQkvKiBJbnQgKi8KI2RlZmluZSBGQ19XRUlHSFQJICAgICJ3ZWlnaHQiCQkvKiBJbnQgKi8KI2RlZmluZSBGQ19TSVpFCQkgICAgInNpemUiCQkvKiBEb3VibGUgKi8KI2RlZmluZSBGQ19BU1BFQ1QJICAgICJhc3BlY3QiCQkvKiBEb3VibGUgKi8KI2RlZmluZSBGQ19QSVhFTF9TSVpFCSAgICAicGl4ZWxzaXplIgkJLyogRG91YmxlICovCiNkZWZpbmUgRkNfU1BBQ0lORwkgICAgInNwYWNpbmciCQkvKiBJbnQgKi8KI2RlZmluZSBGQ19GT1VORFJZCSAgICAiZm91bmRyeSIJCS8qIFN0cmluZyAqLwojZGVmaW5lIEZDX0FOVElBTElBUwkgICAgImFudGlhbGlhcyIJCS8qIEJvb2wgKGRlcGVuZHMpICovCiNkZWZpbmUgRkNfSElOVElORwkgICAgImhpbnRpbmciCQkvKiBCb29sICh0cnVlKSAqLwojZGVmaW5lIEZDX1ZFUlRJQ0FMX0xBWU9VVCAgInZlcnRpY2FsbGF5b3V0IgkvKiBCb29sIChmYWxzZSkgKi8KI2RlZmluZSBGQ19BVVRPSElOVAkgICAgImF1dG9oaW50IgkJLyogQm9vbCAoZmFsc2UpICovCiNkZWZpbmUgRkNfR0xPQkFMX0FEVkFOQ0UgICAiZ2xvYmFsYWR2YW5jZSIJLyogQm9vbCAodHJ1ZSkgKi8KI2RlZmluZSBGQ19GSUxFCQkgICAgImZpbGUiCQkvKiBTdHJpbmcgKi8KI2RlZmluZSBGQ19JTkRFWAkgICAgImluZGV4IgkJLyogSW50ICovCiNkZWZpbmUgRkNfRlRfRkFDRQkgICAgImZ0ZmFjZSIJCS8qIEZUX0ZhY2UgKi8KI2RlZmluZSBGQ19SQVNURVJJWkVSCSAgICAicmFzdGVyaXplciIJLyogU3RyaW5nICovCiNkZWZpbmUgRkNfT1VUTElORQkgICAgIm91dGxpbmUiCQkvKiBCb29sICovCiNkZWZpbmUgRkNfU0NBTEFCTEUJICAgICJzY2FsYWJsZSIJCS8qIEJvb2wgKi8KI2RlZmluZSBGQ19TQ0FMRQkgICAgInNjYWxlIgkJLyogZG91YmxlICovCiNkZWZpbmUgRkNfRFBJCQkgICAgImRwaSIJCS8qIGRvdWJsZSAqLwojZGVmaW5lIEZDX1JHQkEJCSAgICAicmdiYSIJCS8qIEludCAqLwojZGVmaW5lIEZDX01JTlNQQUNFCSAgICAibWluc3BhY2UiCQkvKiBCb29sIHVzZSBtaW5pbXVtIGxpbmUgc3BhY2luZyAqLwojZGVmaW5lIEZDX1NPVVJDRQkgICAgInNvdXJjZSIJCS8qIFN0cmluZyAoWDExLCBmcmVldHlwZSkgKi8KI2RlZmluZSBGQ19DSEFSU0VUCSAgICAiY2hhcnNldCIJCS8qIENoYXJTZXQgKi8KI2RlZmluZSBGQ19MQU5HCQkgICAgImxhbmciCQkvKiBTdHJpbmcgT1MvMiBDb2RlUGFnZVJhbmdlICovCgojZGVmaW5lIEZDX0RJUl9DQUNIRV9GSUxFCSAgICAiZm9udHMuY2FjaGUiCiNkZWZpbmUgRkNfVVNFUl9DQUNIRV9GSUxFCSAgICAiLmZvbnRzLmNhY2hlIgoKLyogQWRqdXN0IG91dGxpbmUgcmFzdGVyaXplciAqLwojZGVmaW5lIEZDX0NIQVJfV0lEVEgJICAgICJjaGFyd2lkdGgiCS8qIEludCAqLwojZGVmaW5lIEZDX0NIQVJfSEVJR0hUCSAgICAiY2hhcmhlaWdodCIvKiBJbnQgKi8KI2RlZmluZSBGQ19NQVRSSVgJICAgICJtYXRyaXgiICAgIC8qIEZjTWF0cml4ICovCgojZGVmaW5lIEZDX1dFSUdIVF9MSUdIVAkgICAgMAojZGVmaW5lIEZDX1dFSUdIVF9NRURJVU0gICAgMTAwCiNkZWZpbmUgRkNfV0VJR0hUX0RFTUlCT0xEICAxODAKI2RlZmluZSBGQ19XRUlHSFRfQk9MRAkgICAgMjAwCiNkZWZpbmUgRkNfV0VJR0hUX0JMQUNLCSAgICAyMTAKCiNkZWZpbmUgRkNfU0xBTlRfUk9NQU4JICAgIDAKI2RlZmluZSBGQ19TTEFOVF9JVEFMSUMJICAgIDEwMAojZGVmaW5lIEZDX1NMQU5UX09CTElRVUUgICAgMTEwCgojZGVmaW5lIEZDX1BST1BPUlRJT05BTAkgICAgMAojZGVmaW5lIEZDX01PTk8JCSAgICAxMDAKI2RlZmluZSBGQ19DSEFSQ0VMTAkgICAgMTEwCgovKiBzdWItcGl4ZWwgb3JkZXIgKi8KI2RlZmluZSBGQ19SR0JBX05PTkUJICAgIDAKI2RlZmluZSBGQ19SR0JBX1JHQgkgICAgMQojZGVmaW5lIEZDX1JHQkFfQkdSCSAgICAyCiNkZWZpbmUgRkNfUkdCQV9WUkdCCSAgICAzCiNkZWZpbmUgRkNfUkdCQV9WQkdSCSAgICA0Cgp0eXBlZGVmIGVudW0gX0ZjVHlwZSB7CiAgICBGY1R5cGVWb2lkLCAKICAgIEZjVHlwZUludGVnZXIsIAogICAgRmNUeXBlRG91YmxlLCAKICAgIEZjVHlwZVN0cmluZywgCiAgICBGY1R5cGVCb29sLAogICAgRmNUeXBlTWF0cml4LAogICAgRmNUeXBlQ2hhclNldCwKICAgIEZjVHlwZUZURmFjZQp9IEZjVHlwZTsKCnR5cGVkZWYgc3RydWN0IF9GY01hdHJpeCB7CiAgICBkb3VibGUgeHgsIHh5LCB5eCwgeXk7Cn0gRmNNYXRyaXg7CgojZGVmaW5lIEZjTWF0cml4SW5pdChtKQkoKG0pLT54eCA9IChtKS0+eXkgPSAxLCBcCgkJCSAobSktPnh5ID0gKG0pLT55eCA9IDApCgovKgogKiBBIGRhdGEgc3RydWN0dXJlIHRvIHJlcHJlc2VudCB0aGUgYXZhaWxhYmxlIGdseXBocyBpbiBhIGZvbnQuCiAqIFRoaXMgaXMgcmVwcmVzZW50ZWQgYXMgYSBzcGFyc2UgYm9vbGVhbiBidHJlZS4KICovCgp0eXBlZGVmIHN0cnVjdCBfRmNDaGFyU2V0IEZjQ2hhclNldDsKCnR5cGVkZWYgc3RydWN0IF9GY09iamVjdFR5cGUgewogICAgY29uc3QgY2hhcgkqb2JqZWN0OwogICAgRmNUeXBlCXR5cGU7Cn0gRmNPYmplY3RUeXBlOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjQ29uc3RhbnQgewogICAgY29uc3QgRmNDaGFyOCAgKm5hbWU7CiAgICBjb25zdCBjaGFyCSpvYmplY3Q7CiAgICBpbnQJCXZhbHVlOwp9IEZjQ29uc3RhbnQ7Cgp0eXBlZGVmIGVudW0gX0ZjUmVzdWx0IHsKICAgIEZjUmVzdWx0TWF0Y2gsIEZjUmVzdWx0Tm9NYXRjaCwgRmNSZXN1bHRUeXBlTWlzbWF0Y2gsIEZjUmVzdWx0Tm9JZAp9IEZjUmVzdWx0OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjVmFsdWUgewogICAgRmNUeXBlCXR5cGU7CiAgICB1bmlvbiB7Cgljb25zdCBGY0NoYXI4CSpzOwoJaW50CQlpOwoJRmNCb29sCQliOwoJZG91YmxlCQlkOwoJY29uc3QgRmNNYXRyaXgJKm07Cgljb25zdCBGY0NoYXJTZXQJKmM7Cgl2b2lkCQkqZjsKICAgIH0gdTsKfSBGY1ZhbHVlOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjUGF0dGVybiAgIEZjUGF0dGVybjsKCnR5cGVkZWYgc3RydWN0IF9GY0ZvbnRTZXQgewogICAgaW50CQluZm9udDsKICAgIGludAkJc2ZvbnQ7CiAgICBGY1BhdHRlcm4JKipmb250czsKfSBGY0ZvbnRTZXQ7Cgp0eXBlZGVmIHN0cnVjdCBfRmNPYmplY3RTZXQgewogICAgaW50CQlub2JqZWN0OwogICAgaW50CQlzb2JqZWN0OwogICAgY29uc3QgY2hhcgkqKm9iamVjdHM7Cn0gRmNPYmplY3RTZXQ7CiAgICAKdHlwZWRlZiBlbnVtIF9GY01hdGNoS2luZCB7CiAgICBGY01hdGNoUGF0dGVybiwgRmNNYXRjaEZvbnQgCn0gRmNNYXRjaEtpbmQ7Cgp0eXBlZGVmIGVudW0gX0ZjU2V0TmFtZSB7CiAgICBGY1NldFN5c3RlbSA9IDAsCiAgICBGY1NldEFwcGxpY2F0aW9uID0gMQp9IEZjU2V0TmFtZTsKCnR5cGVkZWYgc3RydWN0IF9GY0F0b21pYyBGY0F0b21pYzsKCiNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpIC8qIGZvciBDKysgVjIuMCAqLwojZGVmaW5lIF9GQ0ZVTkNQUk9UT0JFR0lOIGV4dGVybiAiQyIgewkvKiBkbyBub3QgbGVhdmUgb3BlbiBhY3Jvc3MgaW5jbHVkZXMgKi8KI2RlZmluZSBfRkNGVU5DUFJPVE9FTkQgfQojZWxzZQojZGVmaW5lIF9GQ0ZVTkNQUk9UT0JFR0lOCiNkZWZpbmUgX0ZDRlVOQ1BST1RPRU5ECiNlbmRpZgoKdHlwZWRlZiBlbnVtIHsgRmNFbmRpYW5CaWcsIEZjRW5kaWFuTGl0dGxlIH0gRmNFbmRpYW47Cgp0eXBlZGVmIHN0cnVjdCBfRmNDb25maWcgICAgRmNDb25maWc7Cgp0eXBlZGVmIHN0cnVjdCBfRmNHbG9iYWxDYWNoZQlGY0ZpbGVDYWNoZTsKCnR5cGVkZWYgc3RydWN0IF9GY0JsYW5rcyAgICBGY0JsYW5rczsKCnR5cGVkZWYgc3RydWN0IF9GY1N0ckxpc3QgICBGY1N0ckxpc3Q7Cgp0eXBlZGVmIHN0cnVjdCBfRmNTdHJTZXQgICAgRmNTdHJTZXQ7CgpfRkNGVU5DUFJPVE9CRUdJTgoKLyogZmNibGFua3MuYyAqLwpGY0JsYW5rcyAqCkZjQmxhbmtzQ3JlYXRlICh2b2lkKTsKCnZvaWQKRmNCbGFua3NEZXN0cm95IChGY0JsYW5rcyAqYik7CgpGY0Jvb2wKRmNCbGFua3NBZGQgKEZjQmxhbmtzICpiLCBGY0NoYXIzMiB1Y3M0KTsKCkZjQm9vbApGY0JsYW5rc0lzTWVtYmVyIChGY0JsYW5rcyAqYiwgRmNDaGFyMzIgdWNzNCk7CgovKiBmY2NmZy5jICovCkZjQ2hhcjggKgpGY0NvbmZpZ0ZpbGVuYW1lIChjb25zdCBGY0NoYXI4ICp1cmwpOwogICAgCkZjQ29uZmlnICoKRmNDb25maWdDcmVhdGUgKHZvaWQpOwoKdm9pZApGY0NvbmZpZ0Rlc3Ryb3kgKEZjQ29uZmlnICpjb25maWcpOwoKRmNCb29sCkZjQ29uZmlnU2V0Q3VycmVudCAoRmNDb25maWcgKmNvbmZpZyk7CgpGY0NvbmZpZyAqCkZjQ29uZmlnR2V0Q3VycmVudCAodm9pZCk7CgpGY0Jvb2wKRmNDb25maWdVcHRvRGF0ZSAoRmNDb25maWcgKmNvbmZpZyk7CiAgICAKRmNCb29sCkZjQ29uZmlnQnVpbGRGb250cyAoRmNDb25maWcgKmNvbmZpZyk7CgpGY1N0ckxpc3QgKgpGY0NvbmZpZ0dldEZvbnREaXJzIChGY0NvbmZpZyAgICpjb25maWcpOwoKRmNTdHJMaXN0ICoKRmNDb25maWdHZXRDb25maWdEaXJzIChGY0NvbmZpZyAgICpjb25maWcpOwoKRmNTdHJMaXN0ICoKRmNDb25maWdHZXRDb25maWdGaWxlcyAoRmNDb25maWcgICAgKmNvbmZpZyk7CgpGY0NoYXI4ICoKRmNDb25maWdHZXRDYWNoZSAoRmNDb25maWcgICpjb25maWcpOwoKRmNCbGFua3MgKgpGY0NvbmZpZ0dldEJsYW5rcyAoRmNDb25maWcgKmNvbmZpZyk7CgppbnQKRmNDb25maWdHZXRSZXNjYW5JbnZlcnZhbCAoRmNDb25maWcgKmNvbmZpZyk7CgpGY0Jvb2wKRmNDb25maWdTZXRSZXNjYW5JbnZlcnZhbCAoRmNDb25maWcgKmNvbmZpZywgaW50IHJlc2NhbkludGVydmFsKTsKCkZjRm9udFNldCAqCkZjQ29uZmlnR2V0Rm9udHMgKEZjQ29uZmlnCSpjb25maWcsCgkJICBGY1NldE5hbWUJc2V0KTsKCkZjQm9vbApGY0NvbmZpZ0FwcEZvbnRBZGRGaWxlIChGY0NvbmZpZyAgICAqY29uZmlnLAoJCQljb25zdCBGY0NoYXI4ICAqZmlsZSk7CgpGY0Jvb2wKRmNDb25maWdBcHBGb250QWRkRGlyIChGY0NvbmZpZwkgICAgKmNvbmZpZywKCQkgICAgICAgY29uc3QgRmNDaGFyOCAgICpkaXIpOwoKdm9pZApGY0NvbmZpZ0FwcEZvbnRDbGVhciAoRmNDb25maWcJICAgICpjb25maWcpOwoKRmNCb29sCkZjQ29uZmlnU3Vic3RpdHV0ZSAoRmNDb25maWcJKmNvbmZpZywKCQkgICAgRmNQYXR0ZXJuCSpwLAoJCSAgICBGY01hdGNoS2luZAlraW5kKTsKCi8qIGZjY2hhcnNldC5jICovCkZjQ2hhclNldCAqCkZjQ2hhclNldENyZWF0ZSAodm9pZCk7Cgp2b2lkCkZjQ2hhclNldERlc3Ryb3kgKEZjQ2hhclNldCAqZmNzKTsKCkZjQm9vbApGY0NoYXJTZXRBZGRDaGFyIChGY0NoYXJTZXQgKmZjcywgRmNDaGFyMzIgdWNzNCk7CgpGY0NoYXJTZXQgKgpGY0NoYXJTZXRDb3B5IChGY0NoYXJTZXQgKnNyYyk7CgpGY0Jvb2wKRmNDaGFyU2V0RXF1YWwgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKTsKCkZjQ2hhclNldCAqCkZjQ2hhclNldEludGVyc2VjdCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpOwoKRmNDaGFyU2V0ICoKRmNDaGFyU2V0VW5pb24gKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKTsKCkZjQ2hhclNldCAqCkZjQ2hhclNldFN1YnRyYWN0IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYik7CgpGY0Jvb2wKRmNDaGFyU2V0SGFzQ2hhciAoY29uc3QgRmNDaGFyU2V0ICpmY3MsIEZjQ2hhcjMyIHVjczQpOwoKRmNDaGFyMzIKRmNDaGFyU2V0Q291bnQgKGNvbnN0IEZjQ2hhclNldCAqYSk7CgpGY0NoYXIzMgpGY0NoYXJTZXRJbnRlcnNlY3RDb3VudCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpOwoKRmNDaGFyMzIKRmNDaGFyU2V0U3VidHJhY3RDb3VudCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpOwoKRmNCb29sCkZjQ2hhclNldElzU3Vic2V0IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYik7CgojZGVmaW5lIEZDX0NIQVJTRVRfTUFQX1NJWkUgKDI1Ni8zMikKI2RlZmluZSBGQ19DSEFSU0VUX0RPTkUJKChGY0NoYXIzMikgLTEpCgpGY0NoYXIzMgpGY0NoYXJTZXRGaXJzdFBhZ2UgKGNvbnN0IEZjQ2hhclNldCAqYSwgCgkJICAgIEZjQ2hhcjMyCSAgICBtYXBbRkNfQ0hBUlNFVF9NQVBfU0laRV0sCgkJICAgIEZjQ2hhcjMyCSAgICAqbmV4dCk7CgpGY0NoYXIzMgpGY0NoYXJTZXROZXh0UGFnZSAoY29uc3QgRmNDaGFyU2V0ICAqYSwgCgkJICAgRmNDaGFyMzIJICAgIG1hcFtGQ19DSEFSU0VUX01BUF9TSVpFXSwKCQkgICBGY0NoYXIzMgkgICAgKm5leHQpOwoKCi8qIGZjZGJnLmMgKi8Kdm9pZApGY1ZhbHVlUHJpbnQgKEZjVmFsdWUgdik7Cgp2b2lkCkZjUGF0dGVyblByaW50IChGY1BhdHRlcm4gKnApOwoKdm9pZApGY0ZvbnRTZXRQcmludCAoRmNGb250U2V0ICpzKTsKCi8qIGZjZGVmYXVsdC5jICovCnZvaWQKRmNEZWZhdWx0U3Vic3RpdHV0ZSAoRmNQYXR0ZXJuICpwYXR0ZXJuKTsKCi8qIGZjZGlyLmMgKi8KRmNCb29sCkZjRmlsZVNjYW4gKEZjRm9udFNldAkgICAgKnNldCwKCSAgICBGY1N0clNldAkgICAgKmRpcnMsCgkgICAgRmNGaWxlQ2FjaGUJICAgICpjYWNoZSwKCSAgICBGY0JsYW5rcwkgICAgKmJsYW5rcywKCSAgICBjb25zdCBGY0NoYXI4ICAgKmZpbGUsCgkgICAgRmNCb29sCSAgICBmb3JjZSk7CgpGY0Jvb2wKRmNEaXJTY2FuIChGY0ZvbnRTZXQJICAgICpzZXQsCgkgICBGY1N0clNldAkgICAgKmRpcnMsCgkgICBGY0ZpbGVDYWNoZQkgICAgKmNhY2hlLAoJICAgRmNCbGFua3MJICAgICpibGFua3MsCgkgICBjb25zdCBGY0NoYXI4ICAgICpkaXIsCgkgICBGY0Jvb2wJICAgIGZvcmNlKTsKCkZjQm9vbApGY0RpclNhdmUgKEZjRm9udFNldCAqc2V0LCBGY1N0clNldCAqZGlycywgY29uc3QgRmNDaGFyOCAqZGlyKTsKCi8qIGZjZnJlZXR5cGUuYyAqLwpGY1BhdHRlcm4gKgpGY0ZyZWVUeXBlUXVlcnkgKGNvbnN0IEZjQ2hhcjggKmZpbGUsIGludCBpZCwgRmNCbGFua3MgKmJsYW5rcywgaW50ICpjb3VudCk7CgovKiBmY2ZzLmMgKi8KCkZjRm9udFNldCAqCkZjRm9udFNldENyZWF0ZSAodm9pZCk7Cgp2b2lkCkZjRm9udFNldERlc3Ryb3kgKEZjRm9udFNldCAqcyk7CgpGY0Jvb2wKRmNGb250U2V0QWRkIChGY0ZvbnRTZXQgKnMsIEZjUGF0dGVybiAqZm9udCk7CgovKiBmY2luaXQuYyAqLwpGY0NvbmZpZyAqCkZjSW5pdExvYWRDb25maWcgKHZvaWQpOwoKRmNDb25maWcgKgpGY0luaXRMb2FkQ29uZmlnQW5kRm9udHMgKHZvaWQpOwoKRmNCb29sCkZjSW5pdCAodm9pZCk7CgppbnQKRmNHZXRWZXJzaW9uICh2b2lkKTsKCkZjQm9vbApGY0luaXRSZWluaXRpYWxpemUgKHZvaWQpOwoKRmNCb29sCkZjSW5pdEJyaW5nVXB0b0RhdGUgKHZvaWQpOwoKLyogZmNsaXN0LmMgKi8KRmNPYmplY3RTZXQgKgpGY09iamVjdFNldENyZWF0ZSAodm9pZCk7CgpGY0Jvb2wKRmNPYmplY3RTZXRBZGQgKEZjT2JqZWN0U2V0ICpvcywgY29uc3QgY2hhciAqb2JqZWN0KTsKCnZvaWQKRmNPYmplY3RTZXREZXN0cm95IChGY09iamVjdFNldCAqb3MpOwoKRmNPYmplY3RTZXQgKgpGY09iamVjdFNldFZhQnVpbGQgKGNvbnN0IGNoYXIgKmZpcnN0LCB2YV9saXN0IHZhKTsKCkZjT2JqZWN0U2V0ICoKRmNPYmplY3RTZXRCdWlsZCAoY29uc3QgY2hhciAqZmlyc3QsIC4uLik7CgpGY0ZvbnRTZXQgKgpGY0ZvbnRTZXRMaXN0IChGY0NvbmZpZwkgICAgKmNvbmZpZywKCSAgICAgICBGY0ZvbnRTZXQgICAgKipzZXRzLAoJICAgICAgIGludAkgICAgbnNldHMsCgkgICAgICAgRmNQYXR0ZXJuICAgICpwLAoJICAgICAgIEZjT2JqZWN0U2V0ICAqb3MpOwoKRmNGb250U2V0ICoKRmNGb250TGlzdCAoRmNDb25maWcJKmNvbmZpZywKCSAgICBGY1BhdHRlcm4JKnAsCgkgICAgRmNPYmplY3RTZXQgKm9zKTsKCi8qIGZjYXRvbWljLmMgKi8KCkZjQXRvbWljICoKRmNBdG9taWNDcmVhdGUgKGNvbnN0IEZjQ2hhcjggICAqZmlsZSk7CgpGY0Jvb2wKRmNBdG9taWNMb2NrIChGY0F0b21pYyAqYXRvbWljKTsKCkZjQ2hhcjggKgpGY0F0b21pY05ld0ZpbGUgKEZjQXRvbWljICphdG9taWMpOwoKRmNDaGFyOCAqCkZjQXRvbWljT3JpZ0ZpbGUgKEZjQXRvbWljICphdG9taWMpOwoKRmNCb29sCkZjQXRvbWljUmVwbGFjZU9yaWcgKEZjQXRvbWljICphdG9taWMpOwoKdm9pZApGY0F0b21pY0RlbGV0ZU5ldyAoRmNBdG9taWMgKmF0b21pYyk7Cgp2b2lkCkZjQXRvbWljVW5sb2NrIChGY0F0b21pYyAqYXRvbWljKTsKCnZvaWQKRmNBdG9taWNEZXN0cm95IChGY0F0b21pYyAqYXRvbWljKTsKCi8qIGZjbWF0Y2guYyAqLwpGY1BhdHRlcm4gKgpGY0ZvbnRTZXRNYXRjaCAoRmNDb25maWcgICAgKmNvbmZpZywKCQlGY0ZvbnRTZXQgICAqKnNldHMsCgkJaW50CSAgICBuc2V0cywKCQlGY1BhdHRlcm4gICAqcCwKCQlGY1Jlc3VsdCAgICAqcmVzdWx0KTsKCkZjUGF0dGVybiAqCkZjRm9udE1hdGNoIChGY0NvbmZpZwkqY29uZmlnLAoJICAgICBGY1BhdHRlcm4JKnAsIAoJICAgICBGY1Jlc3VsdAkqcmVzdWx0KTsKCkZjUGF0dGVybiAqCkZjRm9udFJlbmRlclByZXBhcmUgKEZjQ29uZmlnCSAgICAqY29uZmlnLAoJCSAgICAgRmNQYXR0ZXJuCSAgICAqcGF0LAoJCSAgICAgRmNQYXR0ZXJuCSAgICAqZm9udCk7CgpGY0ZvbnRTZXQgKgpGY0ZvbnRTZXRTb3J0IChGY0NvbmZpZwkgICAgKmNvbmZpZywKCSAgICAgICBGY0ZvbnRTZXQgICAgKipzZXRzLAoJICAgICAgIGludAkgICAgbnNldHMsCgkgICAgICAgRmNQYXR0ZXJuICAgICpwLAoJICAgICAgIEZjQm9vbAkgICAgdHJpbSwKCSAgICAgICBGY0NoYXJTZXQgICAgKipjc3AsCgkgICAgICAgRmNSZXN1bHQJICAgICpyZXN1bHQpOwoKRmNGb250U2V0ICoKRmNGb250U29ydCAoRmNDb25maWcJICpjb25maWcsCgkgICAgRmNQYXR0ZXJuICAgICpwLAoJICAgIEZjQm9vbAkgdHJpbSwKCSAgICBGY0NoYXJTZXQgICAgKipjc3AsCgkgICAgRmNSZXN1bHQJICpyZXN1bHQpOwoKdm9pZApGY0ZvbnRTZXRTb3J0RGVzdHJveSAoRmNGb250U2V0ICpmcyk7CgovKiBmY21hdHJpeC5jICovCkZjTWF0cml4ICoKRmNNYXRyaXhDb3B5IChjb25zdCBGY01hdHJpeCAqbWF0KTsKCkZjQm9vbApGY01hdHJpeEVxdWFsIChjb25zdCBGY01hdHJpeCAqbWF0MSwgY29uc3QgRmNNYXRyaXggKm1hdDIpOwoKdm9pZApGY01hdHJpeE11bHRpcGx5IChGY01hdHJpeCAqcmVzdWx0LCBjb25zdCBGY01hdHJpeCAqYSwgY29uc3QgRmNNYXRyaXggKmIpOwoKdm9pZApGY01hdHJpeFJvdGF0ZSAoRmNNYXRyaXggKm0sIGRvdWJsZSBjLCBkb3VibGUgcyk7Cgp2b2lkCkZjTWF0cml4U2NhbGUgKEZjTWF0cml4ICptLCBkb3VibGUgc3gsIGRvdWJsZSBzeSk7Cgp2b2lkCkZjTWF0cml4U2hlYXIgKEZjTWF0cml4ICptLCBkb3VibGUgc2gsIGRvdWJsZSBzdik7CgovKiBmY25hbWUuYyAqLwoKRmNCb29sCkZjTmFtZVJlZ2lzdGVyT2JqZWN0VHlwZXMgKGNvbnN0IEZjT2JqZWN0VHlwZSAqdHlwZXMsIGludCBudHlwZSk7CgpGY0Jvb2wKRmNOYW1lVW5yZWdpc3Rlck9iamVjdFR5cGVzIChjb25zdCBGY09iamVjdFR5cGUgKnR5cGVzLCBpbnQgbnR5cGUpOwogICAgCmNvbnN0IEZjT2JqZWN0VHlwZSAqCkZjTmFtZUdldE9iamVjdFR5cGUgKGNvbnN0IGNoYXIgKm9iamVjdCk7CgpGY0Jvb2wKRmNOYW1lUmVnaXN0ZXJDb25zdGFudHMgKGNvbnN0IEZjQ29uc3RhbnQgKmNvbnN0cywgaW50IG5jb25zdHMpOwoKRmNCb29sCkZjTmFtZVVucmVnaXN0ZXJDb25zdGFudHMgKGNvbnN0IEZjQ29uc3RhbnQgKmNvbnN0cywgaW50IG5jb25zdHMpOwogICAgCmNvbnN0IEZjQ29uc3RhbnQgKgpGY05hbWVHZXRDb25zdGFudCAoRmNDaGFyOCAqc3RyaW5nKTsKCkZjQm9vbApGY05hbWVDb25zdGFudCAoRmNDaGFyOCAqc3RyaW5nLCBpbnQgKnJlc3VsdCk7CgpGY1BhdHRlcm4gKgpGY05hbWVQYXJzZSAoY29uc3QgRmNDaGFyOCAqbmFtZSk7CgpGY0NoYXI4ICoKRmNOYW1lVW5wYXJzZSAoRmNQYXR0ZXJuICpwYXQpOwoKLyogZmNwYXQuYyAqLwpGY1BhdHRlcm4gKgpGY1BhdHRlcm5DcmVhdGUgKHZvaWQpOwoKRmNQYXR0ZXJuICoKRmNQYXR0ZXJuRHVwbGljYXRlIChGY1BhdHRlcm4gKnApOwoKdm9pZApGY1BhdHRlcm5SZWZlcmVuY2UgKEZjUGF0dGVybiAqcCk7Cgp2b2lkCkZjVmFsdWVEZXN0cm95IChGY1ZhbHVlIHYpOwoKRmNCb29sCkZjVmFsdWVFcXVhbCAoRmNWYWx1ZSB2YSwgRmNWYWx1ZSB2Yik7CgpGY1ZhbHVlCkZjVmFsdWVTYXZlIChGY1ZhbHVlIHYpOwoKdm9pZApGY1BhdHRlcm5EZXN0cm95IChGY1BhdHRlcm4gKnApOwoKRmNCb29sCkZjUGF0dGVybkVxdWFsIChjb25zdCBGY1BhdHRlcm4gKnBhLCBjb25zdCBGY1BhdHRlcm4gKnBiKTsKCkZjQm9vbApGY1BhdHRlcm5FcXVhbFN1YnNldCAoY29uc3QgRmNQYXR0ZXJuICpwYSwgY29uc3QgRmNQYXR0ZXJuICpwYiwgY29uc3QgRmNPYmplY3RTZXQgKm9zKTsKCkZjQ2hhcjMyCkZjUGF0dGVybkhhc2ggKGNvbnN0IEZjUGF0dGVybiAqcCk7CgpGY0Jvb2wKRmNQYXR0ZXJuQWRkIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgRmNWYWx1ZSB2YWx1ZSwgRmNCb29sIGFwcGVuZCk7CiAgICAKRmNCb29sCkZjUGF0dGVybkFkZFdlYWsgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBGY1ZhbHVlIHZhbHVlLCBGY0Jvb2wgYXBwZW5kKTsKICAgIApGY1Jlc3VsdApGY1BhdHRlcm5HZXQgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgaWQsIEZjVmFsdWUgKnYpOwogICAgCkZjQm9vbApGY1BhdHRlcm5EZWwgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0KTsKCkZjQm9vbApGY1BhdHRlcm5BZGRJbnRlZ2VyIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IGkpOwoKRmNCb29sCkZjUGF0dGVybkFkZERvdWJsZSAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGRvdWJsZSBkKTsKCkZjQm9vbApGY1BhdHRlcm5BZGRTdHJpbmcgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBjb25zdCBGY0NoYXI4ICpzKTsKCkZjQm9vbApGY1BhdHRlcm5BZGRNYXRyaXggKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBjb25zdCBGY01hdHJpeCAqcyk7CgpGY0Jvb2wKRmNQYXR0ZXJuQWRkQ2hhclNldCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGNvbnN0IEZjQ2hhclNldCAqYyk7CgpGY0Jvb2wKRmNQYXR0ZXJuQWRkQm9vbCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIEZjQm9vbCBiKTsKCkZjUmVzdWx0CkZjUGF0dGVybkdldEludGVnZXIgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgaW50ICppKTsKCkZjUmVzdWx0CkZjUGF0dGVybkdldERvdWJsZSAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBuLCBkb3VibGUgKmQpOwoKRmNSZXN1bHQKRmNQYXR0ZXJuR2V0U3RyaW5nIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIEZjQ2hhcjggKiogcyk7CgpGY1Jlc3VsdApGY1BhdHRlcm5HZXRNYXRyaXggKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgRmNNYXRyaXggKipzKTsKCkZjUmVzdWx0CkZjUGF0dGVybkdldENoYXJTZXQgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgRmNDaGFyU2V0ICoqYyk7CgpGY1Jlc3VsdApGY1BhdHRlcm5HZXRCb29sIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIEZjQm9vbCAqYik7CgpGY1BhdHRlcm4gKgpGY1BhdHRlcm5WYUJ1aWxkIChGY1BhdHRlcm4gKm9yaWcsIHZhX2xpc3QgdmEpOwogICAgCkZjUGF0dGVybiAqCkZjUGF0dGVybkJ1aWxkIChGY1BhdHRlcm4gKm9yaWcsIC4uLik7CgovKiBmY3N0ci5jICovCgpGY0NoYXI4ICoKRmNTdHJDb3B5IChjb25zdCBGY0NoYXI4ICpzKTsKCkZjQ2hhcjggKgpGY1N0ckNvcHlGaWxlbmFtZSAoY29uc3QgRmNDaGFyOCAqcyk7CiAgICAKI2RlZmluZSBGY1RvTG93ZXIoYykJKCgnQScgPD0gKGMpICYmIChjKSA8PSAnWicpID8gKGMpIC0gJ0EnICsgJ2EnIDogKGMpKQoKaW50CkZjU3RyQ21wSWdub3JlQ2FzZSAoY29uc3QgRmNDaGFyOCAqczEsIGNvbnN0IEZjQ2hhcjggKnMyKTsKCmludApGY1N0ckNtcCAoY29uc3QgRmNDaGFyOCAqczEsIGNvbnN0IEZjQ2hhcjggKnMyKTsKCmludApGY1V0ZjhUb1VjczQgKEZjQ2hhcjggICAqc3JjX29yaWcsCgkgICAgICBGY0NoYXIzMiAgKmRzdCwKCSAgICAgIGludAlsZW4pOwoKRmNCb29sCkZjVXRmOExlbiAoRmNDaGFyOAkqc3RyaW5nLAoJICAgaW50CQlsZW4sCgkgICBpbnQJCSpuY2hhciwKCSAgIGludAkJKndjaGFyKTsKCiNkZWZpbmUgRkNfVVRGOF9NQVhfTEVOCTYKCmludApGY1VjczRUb1V0ZjggKEZjQ2hhcjMyCXVjczQsCgkgICAgICBGY0NoYXI4CWRlc3RbRkNfVVRGOF9NQVhfTEVOXSk7CgppbnQKRmNVdGYxNlRvVWNzNCAoRmNDaGFyOAkqc3JjX29yaWcsCgkgICAgICAgRmNFbmRpYW4JZW5kaWFuLAoJICAgICAgIEZjQ2hhcjMyICpkc3QsCgkgICAgICAgaW50CWxlbik7CSAgICAvKiBpbiBieXRlcyAqLwoKRmNCb29sCkZjVXRmMTZMZW4gKEZjQ2hhcjgJKnN0cmluZywKCSAgICBGY0VuZGlhbgllbmRpYW4sCgkgICAgaW50CQlsZW4sCSAgICAvKiBpbiBieXRlcyAqLwoJICAgIGludAkJKm5jaGFyLAoJICAgIGludAkJKndjaGFyKTsKCkZjQ2hhcjggKgpGY1N0ckRpcm5hbWUgKGNvbnN0IEZjQ2hhcjggKmZpbGUpOwoKRmNDaGFyOCAqCkZjU3RyQmFzZW5hbWUgKGNvbnN0IEZjQ2hhcjggKmZpbGUpOwoKRmNTdHJTZXQgKgpGY1N0clNldENyZWF0ZSAodm9pZCk7CgpGY0Jvb2wKRmNTdHJTZXRNZW1iZXIgKEZjU3RyU2V0ICpzZXQsIGNvbnN0IEZjQ2hhcjggKnMpOwoKRmNCb29sCkZjU3RyU2V0QWRkIChGY1N0clNldCAqc2V0LCBjb25zdCBGY0NoYXI4ICpzKTsKCkZjQm9vbApGY1N0clNldEFkZEZpbGVuYW1lIChGY1N0clNldCAqc2V0LCBjb25zdCBGY0NoYXI4ICpzKTsKCkZjQm9vbApGY1N0clNldERlbCAoRmNTdHJTZXQgKnNldCwgY29uc3QgRmNDaGFyOCAqcyk7Cgp2b2lkCkZjU3RyU2V0RGVzdHJveSAoRmNTdHJTZXQgKnNldCk7CgpGY1N0ckxpc3QgKgpGY1N0ckxpc3RDcmVhdGUgKEZjU3RyU2V0ICpzZXQpOwoKRmNDaGFyOCAqCkZjU3RyTGlzdE5leHQgKEZjU3RyTGlzdCAqbGlzdCk7Cgp2b2lkCkZjU3RyTGlzdERvbmUgKEZjU3RyTGlzdCAqbGlzdCk7CgovKiBmY3htbC5jICovCkZjQm9vbApGY0NvbmZpZ1BhcnNlQW5kTG9hZCAoRmNDb25maWcgKmNvbmZpZywgY29uc3QgRmNDaGFyOCAqZmlsZSwgRmNCb29sIGNvbXBsYWluKTsKCl9GQ0ZVTkNQUk9UT0VORAoKI2VuZGlmIC8qIF9GT05UQ09ORklHX0hfICovCg==