LyoKICogTUlETCBwcm94eS9zdHViIHN0dWZmCiAqCiAqIENvcHlyaWdodCAyMDAyIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKgogKiBUT0RPOgogKiAgLSBmaWd1cmUgb3V0IHdoZXRoZXIgd2UgKnJlYWxseSogZ290IHRoaXMgcmlnaHQKICogIC0gY2hlY2sgZm9yIGVycm9ycyBhbmQgdGhyb3cgZXhjZXB0aW9ucwogKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgoKI2RlZmluZSBDT0JKTUFDUk9TCgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgoKI2luY2x1ZGUgIm9iamJhc2UuaCIKCiNpbmNsdWRlICJycGNwcm94eS5oIgoKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCiNpbmNsdWRlICJuZHJfbWlzYy5oIgojaW5jbHVkZSAicnBjbmRyLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChycGMpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBOZHJDbGllbnRJbml0aWFsaXplTmV3IFtSUENSVDQuQF0KICovCnZvaWQgV0lOQVBJIE5kckNsaWVudEluaXRpYWxpemVOZXcoIFBSUENfTUVTU0FHRSBwUnBjTWVzc2FnZSwgUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1JRExfU1RVQl9ERVNDIHBTdHViRGVzYywgdW5zaWduZWQgaW50IFByb2NOdW0gKQp7CiAgVFJBQ0UoIihwUnBjTWVzc2FnZSA9PSBeJXAsIHBTdHViTXNnID09IF4lcCwgcFN0dWJEZXNjID09IF4lcCwgUHJvY051bSA9PSAlZClcbiIsCiAgICBwUnBjTWVzc2FnZSwgcFN0dWJNc2csIHBTdHViRGVzYywgUHJvY051bSk7CgogIGFzc2VydCggcFJwY01lc3NhZ2UgJiYgcFN0dWJNc2cgJiYgcFN0dWJEZXNjICk7CgogIHBScGNNZXNzYWdlLT5IYW5kbGUgPSBOVUxMOwogIHBScGNNZXNzYWdlLT5Qcm9jTnVtID0gUHJvY051bTsKICBwUnBjTWVzc2FnZS0+UnBjSW50ZXJmYWNlSW5mb3JtYXRpb24gPSBwU3R1YkRlc2MtPlJwY0ludGVyZmFjZUluZm9ybWF0aW9uOwogIHBScGNNZXNzYWdlLT5ScGNGbGFncyA9IDA7CiAgcFJwY01lc3NhZ2UtPkRhdGFSZXByZXNlbnRhdGlvbiA9IE5EUl9MT0NBTF9EQVRBX1JFUFJFU0VOVEFUSU9OOwoKICBwU3R1Yk1zZy0+UnBjTXNnID0gcFJwY01lc3NhZ2U7CiAgcFN0dWJNc2ctPkJ1ZmZlclN0YXJ0ID0gTlVMTDsKICBwU3R1Yk1zZy0+QnVmZmVyRW5kID0gTlVMTDsKICBwU3R1Yk1zZy0+QnVmZmVyTGVuZ3RoID0gMDsKICBwU3R1Yk1zZy0+SXNDbGllbnQgPSBUUlVFOwogIHBTdHViTXNnLT5SZXVzZUJ1ZmZlciA9IEZBTFNFOwogIHBTdHViTXNnLT5wQWxsb2NBbGxOb2Rlc0NvbnRleHQgPSBOVUxMOwogIHBTdHViTXNnLT5wUG9pbnRlclF1ZXVlU3RhdGUgPSBOVUxMOwogIHBTdHViTXNnLT5JZ25vcmVFbWJlZGRlZFBvaW50ZXJzID0gMDsKICBwU3R1Yk1zZy0+UG9pbnRlckJ1ZmZlck1hcmsgPSBOVUxMOwogIHBTdHViTXNnLT5mQnVmZmVyVmFsaWQgPSAwOwogIHBTdHViTXNnLT51RmxhZ3MgPSAwOwogIHBTdHViTXNnLT5wZm5BbGxvY2F0ZSA9IHBTdHViRGVzYy0+cGZuQWxsb2NhdGU7CiAgcFN0dWJNc2ctPnBmbkZyZWUgPSBwU3R1YkRlc2MtPnBmbkZyZWU7CiAgcFN0dWJNc2ctPlN0YWNrVG9wID0gTlVMTDsKICBwU3R1Yk1zZy0+U3R1YkRlc2MgPSBwU3R1YkRlc2M7CiAgcFN0dWJNc2ctPkZ1bGxQdHJSZWZJZCA9IDA7CiAgcFN0dWJNc2ctPlBvaW50ZXJMZW5ndGggPSAwOwogIHBTdHViTXNnLT5mSW5Eb250RnJlZSA9IDA7CiAgcFN0dWJNc2ctPmZEb250Q2FsbEZyZWVJbnN0ID0gMDsKICBwU3R1Yk1zZy0+ZkluT25seVBhcmFtID0gMDsKICBwU3R1Yk1zZy0+Zkhhc1JldHVybiA9IDA7CiAgcFN0dWJNc2ctPmZIYXNFeHRlbnNpb25zID0gMDsKICBwU3R1Yk1zZy0+Zkhhc05ld0NvcnJEZXNjID0gMDsKICBwU3R1Yk1zZy0+ZlVudXNlZCA9IDA7CiAgcFN0dWJNc2ctPmR3RGVzdENvbnRleHQgPSBNU0hDVFhfRElGRkVSRU5UTUFDSElORTsKICBwU3R1Yk1zZy0+cHZEZXN0Q29udGV4dCA9IE5VTEw7CiAgcFN0dWJNc2ctPnBScGNDaGFubmVsQnVmZmVyID0gTlVMTDsKICBwU3R1Yk1zZy0+cEFycmF5SW5mbyA9IE5VTEw7CiAgcFN0dWJNc2ctPmR3U3R1YlBoYXNlID0gMDsKICAvKiBGSVhNRTogTG93U3RhY2tNYXJrICovCiAgcFN0dWJNc2ctPnBBc3luY01zZyA9IE5VTEw7CiAgcFN0dWJNc2ctPnBDb3JySW5mbyA9IE5VTEw7CiAgcFN0dWJNc2ctPnBDb3JyTWVtb3J5ID0gTlVMTDsKICBwU3R1Yk1zZy0+cE1lbW9yeUxpc3QgPSBOVUxMOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgTmRyU2VydmVySW5pdGlhbGl6ZU5ldyBbUlBDUlQ0LkBdCiAqLwp1bnNpZ25lZCBjaGFyKiBXSU5BUEkgTmRyU2VydmVySW5pdGlhbGl6ZU5ldyggUFJQQ19NRVNTQUdFIHBScGNNc2csIFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNSURMX1NUVUJfREVTQyBwU3R1YkRlc2MgKQp7CiAgVFJBQ0UoIihwUnBjTXNnID09IF4lcCwgcFN0dWJNc2cgPT0gXiVwLCBwU3R1YkRlc2MgPT0gXiVwKVxuIiwgcFJwY01zZywgcFN0dWJNc2csIHBTdHViRGVzYyk7CgogIGFzc2VydCggcFJwY01zZyAmJiBwU3R1Yk1zZyAmJiBwU3R1YkRlc2MgKTsKCiAgLyogbm90IGV2ZXJ5b25lIGFsbG9jYXRlcyBzdGFjayBzcGFjZSBmb3IgdzJrUmVzZXJ2ZWQgKi8KICBtZW1zZXQocFN0dWJNc2csIDAsIEZJRUxEX09GRlNFVChNSURMX1NUVUJfTUVTU0FHRSxwQ1NJbmZvKSk7CgogIHBTdHViTXNnLT5SZXVzZUJ1ZmZlciA9IFRSVUU7CiAgcFN0dWJNc2ctPklzQ2xpZW50ID0gRkFMU0U7CiAgcFN0dWJNc2ctPlN0dWJEZXNjID0gcFN0dWJEZXNjOwogIHBTdHViTXNnLT5wZm5BbGxvY2F0ZSA9IHBTdHViRGVzYy0+cGZuQWxsb2NhdGU7CiAgcFN0dWJNc2ctPnBmbkZyZWUgPSBwU3R1YkRlc2MtPnBmbkZyZWU7CiAgcFN0dWJNc2ctPlJwY01zZyA9IHBScGNNc2c7CiAgcFN0dWJNc2ctPkJ1ZmZlciA9IHBTdHViTXNnLT5CdWZmZXJTdGFydCA9IHBScGNNc2ctPkJ1ZmZlcjsKICBwU3R1Yk1zZy0+QnVmZmVyTGVuZ3RoID0gcFJwY01zZy0+QnVmZmVyTGVuZ3RoOwogIHBTdHViTXNnLT5CdWZmZXJFbmQgPSBwU3R1Yk1zZy0+QnVmZmVyICsgcFN0dWJNc2ctPkJ1ZmZlckxlbmd0aDsKCiAgLyogRklYTUU6IGRldGVybWluZSB0aGUgcHJvcGVyIHJldHVybiB2YWx1ZSAqLwogIHJldHVybiBOVUxMOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kckdldEJ1ZmZlciBbUlBDUlQ0LkBdCiAqLwp1bnNpZ25lZCBjaGFyICpXSU5BUEkgTmRyR2V0QnVmZmVyKFBNSURMX1NUVUJfTUVTU0FHRSBzdHVibXNnLCBVTE9ORyBidWZsZW4sIFJQQ19CSU5ESU5HX0hBTkRMRSBoYW5kbGUpCnsKICBUUkFDRSgiKHN0dWJtc2cgPT0gXiVwLCBidWZsZW4gPT0gJXUsIGhhbmRsZSA9PSAlcCk6IHdpbGQgZ3Vlc3MuXG4iLCBzdHVibXNnLCBidWZsZW4sIGhhbmRsZSk7CiAgCiAgYXNzZXJ0KCBzdHVibXNnICYmIHN0dWJtc2ctPlJwY01zZyApOwoKICAvKiBJIGd1ZXNzIHRoaXMgaXMgb3VyIGNoYW5jZSB0byBwdXQgdGhlIGJpbmRpbmcgaGFuZGxlIGludG8gdGhlIFJQQ19NRVNTQUdFICovCiAgc3R1Ym1zZy0+UnBjTXNnLT5IYW5kbGUgPSBoYW5kbGU7CiAgCiAgc3R1Ym1zZy0+UnBjTXNnLT5CdWZmZXJMZW5ndGggPSBidWZsZW47CiAgaWYgKElfUnBjR2V0QnVmZmVyKHN0dWJtc2ctPlJwY01zZykgIT0gU19PSykKICAgIHJldHVybiBOVUxMOwoKICBzdHVibXNnLT5CdWZmZXIgPSBzdHVibXNnLT5CdWZmZXJTdGFydCA9IHN0dWJtc2ctPlJwY01zZy0+QnVmZmVyOwogIHN0dWJtc2ctPkJ1ZmZlckxlbmd0aCA9IHN0dWJtc2ctPlJwY01zZy0+QnVmZmVyTGVuZ3RoOwogIHN0dWJtc2ctPkJ1ZmZlckVuZCA9IHN0dWJtc2ctPkJ1ZmZlciArIHN0dWJtc2ctPkJ1ZmZlckxlbmd0aDsKICByZXR1cm4gKHN0dWJtc2ctPkJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopc3R1Ym1zZy0+UnBjTXNnLT5CdWZmZXIpOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyRnJlZUJ1ZmZlciBbUlBDUlQ0LkBdCiAqLwp2b2lkIFdJTkFQSSBOZHJGcmVlQnVmZmVyKFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZykKewogIFRSQUNFKCIocFN0dWJNc2cgPT0gXiVwKTogd2lsZCBndWVzcy5cbiIsIHBTdHViTXNnKTsKICBJX1JwY0ZyZWVCdWZmZXIocFN0dWJNc2ctPlJwY01zZyk7CiAgcFN0dWJNc2ctPkJ1ZmZlckxlbmd0aCA9IDA7CiAgcFN0dWJNc2ctPkJ1ZmZlciA9IHBTdHViTXNnLT5CdWZmZXJFbmQgPSAodW5zaWduZWQgY2hhciAqKShwU3R1Yk1zZy0+UnBjTXNnLT5CdWZmZXIgPSBOVUxMKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyU2VuZFJlY2VpdmUgW1JQQ1JUNC5AXQogKi8KdW5zaWduZWQgY2hhciAqV0lOQVBJIE5kclNlbmRSZWNlaXZlKCBQTUlETF9TVFVCX01FU1NBR0Ugc3R1Ym1zZywgdW5zaWduZWQgY2hhciAqYnVmZmVyICApCnsKICBSUENfU1RBVFVTIHN0YXR1czsKCiAgVFJBQ0UoIihzdHVibXNnID09IF4lcCwgYnVmZmVyID09IF4lcClcbiIsIHN0dWJtc2csIGJ1ZmZlcik7CgogIC8qIEZJWE1FOiBob3cgdG8gaGFuZGxlIGVycm9ycz8gKHJhaXNlIGV4Y2VwdGlvbj8pICovCiAgaWYgKCFzdHVibXNnKSB7CiAgICBFUlIoIk5VTEwgc3R1YiBtZXNzYWdlLiAgTm8gYWN0aW9uIHRha2VuLlxuIik7CiAgICByZXR1cm4gTlVMTDsKICB9CiAgaWYgKCFzdHVibXNnLT5ScGNNc2cpIHsKICAgIEVSUigiUlBDIE1lc3NhZ2Ugbm90IHByZXNlbnQgaW4gc3R1YiBtZXNzYWdlLiAgTm8gYWN0aW9uIHRha2VuLlxuIik7CiAgICByZXR1cm4gTlVMTDsKICB9CgogIHN0dWJtc2ctPlJwY01zZy0+QnVmZmVyTGVuZ3RoID0gYnVmZmVyIC0gKHVuc2lnbmVkIGNoYXIgKilzdHVibXNnLT5ScGNNc2ctPkJ1ZmZlcjsKICBzdGF0dXMgPSBJX1JwY1NlbmRSZWNlaXZlKHN0dWJtc2ctPlJwY01zZyk7CiAgaWYgKHN0YXR1cyAhPSBSUENfU19PSykKICAgIFJwY1JhaXNlRXhjZXB0aW9uKHN0YXR1cyk7CgogIHN0dWJtc2ctPkJ1ZmZlckxlbmd0aCA9IHN0dWJtc2ctPlJwY01zZy0+QnVmZmVyTGVuZ3RoOwogIHN0dWJtc2ctPkJ1ZmZlclN0YXJ0ID0gc3R1Ym1zZy0+UnBjTXNnLT5CdWZmZXI7CiAgc3R1Ym1zZy0+QnVmZmVyRW5kID0gc3R1Ym1zZy0+QnVmZmVyU3RhcnQgKyBzdHVibXNnLT5CdWZmZXJMZW5ndGg7CiAgc3R1Ym1zZy0+QnVmZmVyID0gc3R1Ym1zZy0+QnVmZmVyU3RhcnQ7CgogIC8qIEZJWE1FOiBpcyB0aGlzIHRoZSByaWdodCByZXR1cm4gdmFsdWU/ICovCiAgcmV0dXJuIE5VTEw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kck1hcENvbW1BbmRGYXVsdFN0YXR1cyBbUlBDUlQ0LkBdCiAqLwpSUENfU1RBVFVTIFJQQ19FTlRSWSBOZHJNYXBDb21tQW5kRmF1bHRTdGF0dXMoIFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAqcENvbW1TdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgKnBGYXVsdFN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUENfU1RBVFVTIFN0YXR1cyApCnsKICAgIEZJWE1FKCIoJXAsICVwLCAlcCwgJWxkKTogc3R1YlxuIiwgcFN0dWJNc2csIHBDb21tU3RhdHVzLCBwRmF1bHRTdGF0dXMsIFN0YXR1cyk7CgogICAgKnBDb21tU3RhdHVzID0gMDsKICAgICpwRmF1bHRTdGF0dXMgPSAwOwoKICAgIHJldHVybiBSUENfU19PSzsKfQo=