LyoKICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogKgogKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAogKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KICoKICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgogKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCiAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KICoKICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQogKiBxdWVzdGlvbnMuCiAqLwoKLy8gVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwovLyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLy8gSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcwovLyBmaWxlOgovLwovLwovLyAgTGl0dGxlIGNtcwovLyAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDcgTWFydGkgTWFyaWEKLy8KLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgovLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLy8gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlCi8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci8vCi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgovLwovLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCi8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgovLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgoKI2luY2x1ZGUgImxjbXMuaCIKCgovKgp0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgIGRvdWJsZSBKOwogICAgICAgICAgICAgICBkb3VibGUgQzsKICAgICAgICAgICAgICAgZG91YmxlIGg7CgogICAgICAgICAgICAgICB9IGNtc0pDaCwgRkFSKiBMUGNtc0pDaDsKCgojZGVmaW5lIEFWR19TVVJST1VORF80ICAgICAwCiNkZWZpbmUgQVZHX1NVUlJPVU5EICAgICAgIDEKI2RlZmluZSBESU1fU1VSUk9VTkQgICAgICAgMgojZGVmaW5lIERBUktfU1VSUk9VTkQgICAgICAzCiNkZWZpbmUgQ1VUU0hFRVRfU1VSUk9VTkQgIDQKCgp0eXBlZGVmIHN0cnVjdCB7CgogICAgICAgICAgICAgIGNtc0NJRVhZWiB3aGl0ZVBvaW50OwogICAgICAgICAgICAgIGRvdWJsZSAgICBZYjsKICAgICAgICAgICAgICBkb3VibGUgICAgTGE7CiAgICAgICAgICAgICAgaW50ICAgICAgIHN1cnJvdW5kOwogICAgICAgICAgICAgIGRvdWJsZSAgICBEX3ZhbHVlOwoKICAgICAgICAgICAgICB9IGNtc1ZpZXdpbmdDb25kaXRpb25zLCBGQVIqIExQY21zVmlld2luZ0NvbmRpdGlvbnM7CgoKCkxDTVNBUEkgTENNU0hBTkRMRSBMQ01TRVhQT1JUIGNtc0NJRUNBTTk3c0luaXQoTFBjbXNWaWV3aW5nQ29uZGl0aW9ucyBwVkMpOwpMQ01TQVBJIHZvaWQgICBMQ01TRVhQT1JUIGNtc0NJRUNBTTk3c0RvbmUoTENNU0hBTkRMRSBoTW9kZWwpOwpMQ01TQVBJIHZvaWQgICBMQ01TRVhQT1JUIGNtc0NJRUNBTTk3c0ZvcndhcmQoTENNU0hBTkRMRSBoTW9kZWwsIExQY21zQ0lFWFlaIHBJbiwgTFBjbXNKQ2ggcE91dCk7CkxDTVNBUEkgdm9pZCAgIExDTVNFWFBPUlQgY21zQ0lFQ0FNOTdzUmV2ZXJzZShMQ01TSEFORExFIGhNb2RlbCwgTFBjbXNKQ2ggcEluLCAgICBMUGNtc0NJRVhZWiBwT3V0KTsKCiovCgovLyAtLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyAjZGVmaW5lIFVTRV9DSUVDQU05N3MyICAxCgojaWZkZWYgVVNFX0NJRUNBTTk3czIKCiMgICAgICAgZGVmaW5lIE5PSVNFX0NPTlNUQU5UICAgMy4wNQojZWxzZQojICAgICAgIGRlZmluZSBOT0lTRV9DT05TVEFOVCAgIDIuMDUKI2VuZGlmCgoKLyoKICBUaGUgbW9kZWwgaW5wdXQgZGF0YSBhcmUgdGhlIGFkYXB0aW5nIGZpZWxkIGx1bWluYW5jZSBpbiBjZC9tMgogIChub3JtYWxseSB0YWtlbiB0byBiZSAyMCUgb2YgdGhlIGx1bWluYW5jZSBvZiB3aGl0ZSBpbiB0aGUgYWRhcHRpbmcgZmllbGQpLAogIExBICwgdGhlIHJlbGF0aXZlIHRyaXN0aW11bHVzIHZhbHVlcyBvZiB0aGUgc3RpbXVsdXMsIFhZWiwgdGhlIHJlbGF0aXZlCiAgdHJpc3RpbXVsdXMgdmFsdWVzIG9mIHdoaXRlIGluIHRoZSBzYW1lIHZpZXdpbmcgY29uZGl0aW9ucywgWHcgWXcgWncgLAogIGFuZCB0aGUgcmVsYXRpdmUgbHVtaW5hbmNlIG9mIHRoZSBiYWNrZ3JvdW5kLCBZYiAuIFJlbGF0aXZlIHRyaXN0aW11bHVzCiAgdmFsdWVzIHNob3VsZCBiZSBleHByZXNzZWQgb24gYSBzY2FsZSBmcm9tIFkgPSAwIGZvciBhIHBlcmZlY3QgYmxhY2sKICB0byBZID0gMTAwIGZvciBhIHBlcmZlY3QgcmVmbGVjdGluZyBkaWZmdXNlci4gQWRkaXRpb25hbGx5LCB0aGUKICBwYXJhbWV0ZXJzIGMsIGZvciB0aGUgaW1wYWN0IG9mIHN1cnJvdW5kLCBOYyAsIGEgY2hyb21hdGljIGluZHVjdGlvbiBmYWN0b3IsCiAgYW5kIEYsIGEgZmFjdG9yIGZvciBkZWdyZWUgb2YgYWRhcHRhdGlvbiwgbXVzdCBiZSBzZWxlY3RlZCBhY2NvcmRpbmcgdG8gdGhlCiAgZ3VpZGVsaW5lcyBpbiB0YWJsZQoKICBBbGwgQ0lFIHRyaXN0aW11bHVzIHZhbHVlcyBhcmUgb2J0YWluZWQgdXNpbmcgdGhlIENJRSAxOTMxCiAgU3RhbmRhcmQgQ29sb3JpbWV0cmljIE9ic2VydmVyICgysCkuCgoqLwoKdHlwZWRlZiBzdHJ1Y3QgewoKICAgIGNtc0NJRVhZWiBXUDsKICAgIGludCBzdXJyb3VuZDsKICAgIGludCBjYWxjdWxhdGVfRDsKCiAgICBkb3VibGUgIFliOyAgICAgICAgIC8vIHJlbC4gbHVtaW5hbmNlIG9mIGJhY2tncm91bmQKCiAgICBjbXNDSUVYWVogUmVmV2hpdGU7CgogICAgZG91YmxlIExhOyAgICAvLyBUaGUgYWRhcHRpbmcgZmllbGQgbHVtaW5hbmNlIGluIGNkL20yCgogICAgZG91YmxlIGM7ICAgICAvLyBJbXBhY3Qgb2Ygc3Vycm91bmQKICAgIGRvdWJsZSBOYzsgICAgLy8gQ2hyb21hdGljIGluZHVjdGlvbiBmYWN0b3IKICAgIGRvdWJsZSBGbGw7ICAgLy8gTGlnaHRuZXNzIGNvbnRyYXN0IGZhY3RvciAoUmVtb3ZlZCBvbiByZXYgMikKICAgIGRvdWJsZSBGOyAgICAgLy8gRGVncmVlIG9mIGFkYXB0YXRpb24KCgogICAgZG91YmxlIGs7CiAgICBkb3VibGUgRmw7CgogICAgZG91YmxlIE5iYjsgIC8vIFRoZSBiYWNrZ3JvdW5kIGFuZCBjaHJvbWF0aWMgYnJpZ2h0bmVzcyBpbmR1Y3Rpb24gZmFjdG9ycy4KICAgIGRvdWJsZSBOY2I7CiAgICBkb3VibGUgejsgICAgLy8gYmFzZSBleHBvbmVudGlhbCBub25saW5lYXJpdHkKICAgIGRvdWJsZSBuOyAgICAvLyBiYWNrZ3JvdW5kIGluZHVjdGlvbiBmYWN0b3IKICAgIGRvdWJsZSBEOwoKICAgIE1BVDMgTWxhbVJpZ2c7CiAgICBNQVQzIE1sYW1SaWdnXzE7CgogICAgTUFUMyBNaHVudDsKICAgIE1BVDMgTWh1bnRfMTsKCiAgICBNQVQzIE1odW50X3hfTWxhbVJpZ2dfMTsKICAgIE1BVDMgTWxhbVJpZ2dfeF9NaHVudF8xOwoKCiAgICBWRUMzIFJHQl9zdWJ3OwogICAgVkVDMyBSR0Jfc3Vid19wcmltZTsKCiAgICBkb3VibGUgcDsKCiAgICBWRUMzIFJHQl9zdWJ3YzsKCiAgICBWRUMzIFJHQl9zdWJhd19wcmltZTsKICAgIGRvdWJsZSBBX3N1Ync7CiAgICBkb3VibGUgUV9zdWJ3OwoKICAgIH0gY21zQ0lFQ0FNOTdzLEZBUiAqTFBjbXNDSUVDQU05N3M7CgoKCi8vIEZyZWUgbW9kZWwgc3RydWN0dXJlCgpMQ01TQVBJIHZvaWQgTENNU0VYUE9SVCBjbXNDSUVDQU05N3NEb25lKExDTVNIQU5ETEUgaE1vZGVsKQp7CiAgICBMUGNtc0NJRUNBTTk3cyBscE1vZCA9IChMUGNtc0NJRUNBTTk3cykgKExQU1RSKSBoTW9kZWw7CiAgICBpZiAobHBNb2QpIF9jbXNGcmVlKGxwTW9kKTsKfQoKLy8gUGFydGlhbCBkaXNjb3VudGluZyBmb3IgYWRhcHRhdGlvbiBkZWdyZWUgY29tcHV0YXRpb24KCnN0YXRpYwpkb3VibGUgZGlzY291bnQoZG91YmxlIGQsIGRvdWJsZSBjaGFuKQp7CiAgICByZXR1cm4gKGQgKiBjaGFuICsgMSAtIGQpOwp9CgoKLy8gVGhpcyByb3V0aW5lIGRvZXMgbW9kZWwgZXhwb25lbnRpYWwgbm9ubGluZWFyaXR5IG9uIHRoZSBzaG9ydCB3YXZlbGVuZ2h0Ci8vIHNlbnNpdGl2ZSBjaGFubmVsLiBPbiBDSUVDQU05N3MgcmV2IDIgdGhpcyBoYXMgYmVlbiByZXZlcnRlZCB0byBsaW5lYXIuCgpzdGF0aWMKdm9pZCBGd0FkYXB0YXRpb25EZWdyZWUoTFBjbXNDSUVDQU05N3MgbHBNb2QsIExQVkVDMyBSR0JjLCBMUFZFQzMgUkdCKQp7CgoKI2lmZGVmIFVTRV9DSUVDQU05N3MyCiAgICBSR0JjLT5uWzBdID0gUkdCLT5uWzBdKiBkaXNjb3VudChscE1vZC0+RCwgMTAwLjAvbHBNb2QtPlJHQl9zdWJ3Lm5bMF0pOwogICAgUkdCYy0+blsxXSA9IFJHQi0+blsxXSogZGlzY291bnQobHBNb2QtPkQsIDEwMC4wL2xwTW9kLT5SR0Jfc3Vidy5uWzFdKTsKICAgIFJHQmMtPm5bMl0gPSBSR0ItPm5bMl0qIGRpc2NvdW50KGxwTW9kLT5ELCAxMDAuMC9scE1vZC0+UkdCX3N1YncublsyXSk7CiNlbHNlCgogICAgUkdCYy0+blswXSA9IFJHQi0+blswXSogZGlzY291bnQobHBNb2QtPkQsIDEuMC9scE1vZC0+UkdCX3N1YncublswXSk7CiAgICBSR0JjLT5uWzFdID0gUkdCLT5uWzFdKiBkaXNjb3VudChscE1vZC0+RCwgMS4wL2xwTW9kLT5SR0Jfc3Vidy5uWzFdKTsKCiAgICBSR0JjLT5uWzJdID0gcG93KGZhYnMoUkdCLT5uWzJdKSwgbHBNb2QgLT5wKSAqIGRpc2NvdW50KGxwTW9kLT5ELCAoMS4wL3BvdyhscE1vZC0+UkdCX3N1YncublsyXSwgbHBNb2QtPnApKSk7CgogICAgLy8gSWYgQiBoYXBwZW5zIHRvIGJlIG5lZ2F0aXZlLCBUaGVuIEJjIGlzIGFsc28gc2V0IHRvIGJlIG5lZ2F0aXZlCgogICAgaWYgKFJHQi0+blsyXSA8IDApCiAgICAgICAgICAgUkdCYy0+blsyXSA9IC1SR0JjLT5uWzJdOwojZW5kaWYKfQoKCnN0YXRpYwp2b2lkIFJ2QWRhcHRhdGlvbkRlZ3JlZShMUGNtc0NJRUNBTTk3cyBscE1vZCwgTFBWRUMzIFJHQmMsIExQVkVDMyBSR0IpCnsKCgojaWZkZWYgVVNFX0NJRUNBTTk3czIKICAgIFJHQmMtPm5bMF0gPSBSR0ItPm5bMF0vZGlzY291bnQobHBNb2QtPkQsIDEwMC4wL2xwTW9kLT5SR0Jfc3Vidy5uWzBdKTsKICAgIFJHQmMtPm5bMV0gPSBSR0ItPm5bMV0vZGlzY291bnQobHBNb2QtPkQsIDEwMC4wL2xwTW9kLT5SR0Jfc3Vidy5uWzFdKTsKICAgIFJHQmMtPm5bMl0gPSBSR0ItPm5bMl0vZGlzY291bnQobHBNb2QtPkQsIDEwMC4wL2xwTW9kLT5SR0Jfc3Vidy5uWzJdKTsKI2Vsc2UKCiAgICBSR0JjLT5uWzBdID0gUkdCLT5uWzBdL2Rpc2NvdW50KGxwTW9kLT5ELCAxLjAvbHBNb2QtPlJHQl9zdWJ3Lm5bMF0pOwogICAgUkdCYy0+blsxXSA9IFJHQi0+blsxXS9kaXNjb3VudChscE1vZC0+RCwgMS4wL2xwTW9kLT5SR0Jfc3Vidy5uWzFdKTsKICAgIFJHQmMtPm5bMl0gPSBwb3coZmFicyhSR0ItPm5bMl0pLCAxLjAvbHBNb2QtPnApL3BvdyhkaXNjb3VudChscE1vZC0+RCwgMS4wL3BvdyhscE1vZC0+UkdCX3N1YncublsyXSwgbHBNb2QtPnApKSwgMS4wL2xwTW9kLT5wKTsKICAgIGlmIChSR0ItPm5bMl0gPCAwKQogICAgICAgICAgIFJHQmMtPm5bMl0gPSAtUkdCYy0+blsyXTsKI2VuZGlmCn0KCgoKc3RhdGljCnZvaWQgUG9zdEFkYXB0YXRpb25Db25lUmVzcG9uc2VzKExQY21zQ0lFQ0FNOTdzIGxwTW9kLCBMUFZFQzMgUkdCYV9wcmltZSwgTFBWRUMzIFJHQnByaW1lKQp7CiAgICAgaWYgKFJHQnByaW1lLT5uWzBdPj0wLjApIHsKCiAgICAgICAgICAgIFJHQmFfcHJpbWUtPm5bMF09KCg0MC4wKnBvdyhscE1vZCAtPiBGbCAqIFJHQnByaW1lLT5uWzBdLzEwMC4wLCAwLjczKSkvKHBvdyhscE1vZCAtPiBGbCAqIFJHQnByaW1lLT5uWzBdLzEwMC4wLCAwLjczKSsyKSkrMTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgICAgUkdCYV9wcmltZS0+blswXT0oKC00MC4wKnBvdygoLWxwTW9kIC0+IEZsICogUkdCcHJpbWUtPm5bMF0pLzEwMC4wLCAwLjczKSkvKHBvdygoLWxwTW9kIC0+IEZsICogUkdCcHJpbWUtPm5bMF0pLzEwMC4wLCAwLjczKSsyKSkrMTsKICAgICB9CgogICAgIGlmIChSR0JwcmltZS0+blsxXT49MC4wKQogICAgIHsKICAgICAgICAgICAgUkdCYV9wcmltZS0+blsxXT0oKDQwLjAqcG93KGxwTW9kIC0+IEZsICogUkdCcHJpbWUtPm5bMV0vMTAwLjAsIDAuNzMpKS8ocG93KGxwTW9kIC0+IEZsICogUkdCcHJpbWUtPm5bMV0vMTAwLjAsIDAuNzMpKzIpKSsxOwogICAgIH0KICAgICBlbHNlCiAgICAgewogICAgICAgICAgICBSR0JhX3ByaW1lLT5uWzFdPSgoLTQwLjAqcG93KCgtbHBNb2QgLT4gRmwgKiBSR0JwcmltZS0+blsxXSkvMTAwLjAsIDAuNzMpKS8ocG93KCgtbHBNb2QgLT4gRmwgKiBSR0JwcmltZS0+blsxXSkvMTAwLjAsIDAuNzMpKzIpKSsxOwogICAgIH0KCiAgICAgaWYgKFJHQnByaW1lLT5uWzJdPj0wLjApCiAgICAgewogICAgICAgICAgICBSR0JhX3ByaW1lLT5uWzJdPSgoNDAuMCpwb3cobHBNb2QgLT4gRmwgKiBSR0JwcmltZS0+blsyXS8xMDAuMCwgMC43MykpLyhwb3cobHBNb2QgLT4gRmwgKiBSR0JwcmltZS0+blsyXS8xMDAuMCwgMC43MykrMikpKzE7CiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAgICAgIFJHQmFfcHJpbWUtPm5bMl09KCgtNDAuMCpwb3coKC1scE1vZCAtPiBGbCAqIFJHQnByaW1lLT5uWzJdKS8xMDAuMCwgMC43MykpLyhwb3coKC1scE1vZCAtPiBGbCAqIFJHQnByaW1lLT5uWzJdKS8xMDAuMCwgMC43MykrMikpKzE7CiAgICAgfQp9CgoKLy8gQ29tcHV0ZSBodWUgcXVhZHJhdHVyZSwgZWNjZW50cmljaXR5IGZhY3RvciwgZQoKc3RhdGljCnZvaWQgQ29tcHV0ZUh1ZVF1YWRyYXR1cmUoZG91YmxlIGgsIGRvdWJsZSogSCwgZG91YmxlKiBlKQp7CgoKI2RlZmluZSBJUkVEICAgIDAKI2RlZmluZSBJWUVMTE9XIDEKI2RlZmluZSBJR1JFRU4gIDIKI2RlZmluZSBJQkxVRSAgIDMKCiAgICAgIGRvdWJsZSBlX3RhYltdID0gezAuOCwgMC43LCAxLjAsIDEuMn07CiAgICAgIGRvdWJsZSBIX3RhYltdID0geyAgMCwgMTAwLCAyMDAsIDMwMH07CiAgICAgIGludCBwMSwgcDI7CiAgICAgIGRvdWJsZSBlMSwgZTIsIGgxLCBoMjsKCgogICAgICAgaWYgKGggPj0gMjAuMTQgJiYgaCA8IDkwLjApIHsgLy8gUmVkCgogICAgICAgICAgICAgICAgICAgICAgICBwMSA9IElSRUQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHAyID0gSVlFTExPVzsKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIGlmIChoID49IDkwLjAgJiYgaCA8IDE2NC4yNSkgeyAvLyBZZWxsb3cKCiAgICAgICAgICAgICAgICAgICAgICAgIHAxID0gSVlFTExPVzsKICAgICAgICAgICAgICAgICAgICAgICAgcDIgPSBJR1JFRU47CiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICBpZiAoaCA+PSAxNjQuMjUgJiYgaCA8IDIzNy41MykgeyAvLyBHcmVlbgoKICAgICAgICAgICAgICAgICAgICAgICAgcDEgPSBJR1JFRU47CiAgICAgICAgICAgICAgICAgICAgICAgIHAyID0gSUJMVUU7ICAgICAgIH0KICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCbHVlCgogICAgICAgICAgICAgICAgICAgICAgICBwMSA9IElCTFVFOwogICAgICAgICAgICAgICAgICAgICAgICBwMiA9IElSRUQ7CiAgICAgICB9CgogICAgICAgZTEgPSBlX3RhYltwMV07IGUyID0gZV90YWJbcDJdOwogICAgICAgaDEgPSBIX3RhYltwMV07IGgyID0gSF90YWJbcDJdOwoKCgogICAgICAgKmUgPSBlMSArICgoZTItZTEpKihoLWgxKS8oaDIgLSBoMSkpOwogICAgICAgKkggPSBoMSArICgxMDAuICogKGggLSBoMSkgLyBlMSkgLyAoKGggLSBoMSkvZTEgKyAoaDIgLSBoKSAvIGUyKTsKCiN1bmRlZiBJUkVECiN1bmRlZiBJWUVMTE9XCiN1bmRlZiBJR1JFRU4KI3VuZGVmIElCTFVFCgp9CgoKCgoKCkxDTVNBUEkgTENNU0hBTkRMRSBMQ01TRVhQT1JUIGNtc0NJRUNBTTk3c0luaXQoTFBjbXNWaWV3aW5nQ29uZGl0aW9ucyBwVkMpCnsKICAgIExQY21zQ0lFQ0FNOTdzIGxwTW9kOwogICAgVkVDMyB0bXA7CgogICAgaWYoKGxwTW9kID0gKExQY21zQ0lFQ0FNOTdzKSBfY21zTWFsbG9jKHNpemVvZihjbXNDSUVDQU05N3MpKSkgPT0gTlVMTCkgewogICAgICAgIHJldHVybiAoTENNU0hBTkRMRSkgTlVMTDsKICAgIH0KCgogICAgbHBNb2QtPldQLlggPSBwVkMtPndoaXRlUG9pbnQuWDsKICAgIGxwTW9kLT5XUC5ZID0gcFZDLT53aGl0ZVBvaW50Llk7CiAgICBscE1vZC0+V1AuWiA9IHBWQy0+d2hpdGVQb2ludC5aOwoKICAgIGxwTW9kLT5ZYiAgID0gcFZDLT5ZYjsKICAgIGxwTW9kLT5MYSAgID0gcFZDLT5MYTsKCiAgICBscE1vZC0+c3Vycm91bmQgPSBwVkMtPnN1cnJvdW5kOwoKICAgIGxwTW9kLT5SZWZXaGl0ZS5YID0gMTAwLjA7CiAgICBscE1vZC0+UmVmV2hpdGUuWSA9IDEwMC4wOwogICAgbHBNb2QtPlJlZldoaXRlLlogPSAxMDAuMDsKCiNpZmRlZiBVU0VfQ0lFQ0FNOTdzMgoKICAgIFZFQzNpbml0KCZscE1vZC0+TWxhbVJpZ2cudlswXSwgIDAuODU2MiwgMC4zMzcyLCAtMC4xOTM0KTsKICAgIFZFQzNpbml0KCZscE1vZC0+TWxhbVJpZ2cudlsxXSwgLTAuODM2MCwgMS44MzI3LCAgMC4wMDMzKTsKICAgIFZFQzNpbml0KCZscE1vZC0+TWxhbVJpZ2cudlsyXSwgIDAuMDM1NywtMC4wNDY5LCAgMS4wMTEyKTsKCiAgICBWRUMzaW5pdCgmbHBNb2QtPk1sYW1SaWdnXzEudlswXSwgMC45ODc0LCAtMC4xNzY4LCAwLjE4OTQpOwogICAgVkVDM2luaXQoJmxwTW9kLT5NbGFtUmlnZ18xLnZbMV0sIDAuNDUwNCwgIDAuNDY0OSwgMC4wODQ2KTsKICAgIFZFQzNpbml0KCZscE1vZC0+TWxhbVJpZ2dfMS52WzJdLC0wLjAxMzksICAwLjAyNzgsIDAuOTg2MSk7CgojZWxzZQogICAgLy8gQnJhZGZvcmQgdHJhbnNmb3JtOiBMYW0tUmlnZyBjb25lIHJlc3BvbnNlcwogICAgVkVDM2luaXQoJmxwTW9kLT5NbGFtUmlnZy52WzBdLCAgMC44OTUxLCAgMC4yNjY0LCAtMC4xNjE0KTsKICAgIFZFQzNpbml0KCZscE1vZC0+TWxhbVJpZ2cudlsxXSwgLTAuNzUwMiwgIDEuNzEzNSwgIDAuMDM2Nyk7CiAgICBWRUMzaW5pdCgmbHBNb2QtPk1sYW1SaWdnLnZbMl0sICAwLjAzODksIC0wLjA2ODUsICAxLjAyOTYpOwoKCiAgICAvLyBJbnZlcnNlIG9mIExhbS1SaWdnCiAgICBWRUMzaW5pdCgmbHBNb2QtPk1sYW1SaWdnXzEudlswXSwgIDAuOTg2OTksIC0wLjE0NzA1LCAgMC4xNTk5Nik7CiAgICBWRUMzaW5pdCgmbHBNb2QtPk1sYW1SaWdnXzEudlsxXSwgIDAuNDMyMzEsICAwLjUxODM2LCAgMC4wNDkyOSk7CiAgICBWRUMzaW5pdCgmbHBNb2QtPk1sYW1SaWdnXzEudlsyXSwgLTAuMDA4NTMsICAwLjA0MDA0LCAgMC45Njg0OSk7CgojZW5kaWYKCiAgICAvLyBIdW50LVBvaW50ZXItRXN0ZXZleiBjb25lIHJlc3BvbnNlcwogICAgVkVDM2luaXQoJmxwTW9kLT5NaHVudC52WzBdLCAgIDAuMzg5NzEsICAwLjY4ODk4LCAtMC4wNzg2OCk7CiAgICBWRUMzaW5pdCgmbHBNb2QtPk1odW50LnZbMV0sICAtMC4yMjk4MSwgIDEuMTgzNDAsICAwLjA0NjQxKTsKICAgIFZFQzNpbml0KCZscE1vZC0+TWh1bnQudlsyXSwgICAwLjAsICAgICAgMC4wLCAgICAgIDEuMCk7CgogICAgLy8gSW52ZXJzZSBvZiBIdW50LVBvaW50ZXItRXN0ZXZlegogICAgVkVDM2luaXQoJmxwTW9kLT5NaHVudF8xLnZbMF0sICAgICAxLjkxMDE5LCAtMS4xMTIxNCwgMC4yMDE5NSk7CiAgICBWRUMzaW5pdCgmbHBNb2QtPk1odW50XzEudlsxXSwgICAgIDAuMzcwOTUsICAwLjYyOTA1LCAwLjApOwogICAgVkVDM2luaXQoJmxwTW9kLT5NaHVudF8xLnZbMl0sICAgICAwLjAsICAgICAgMC4wLCAgICAgMS4wKTsKCgogICAgaWYgKHBWQy0+RF92YWx1ZSA9PSAtMS4wKQogICAgICAgICAgbHBNb2QtPmNhbGN1bGF0ZV9EID0gMTsKICAgIGVsc2UKICAgIGlmIChwVkMtPkRfdmFsdWUgPT0gLTIuMCkKICAgICAgICAgICBscE1vZC0+Y2FsY3VsYXRlX0QgPSAyOwogICAgZWxzZSB7CiAgICAgICAgbHBNb2QtPmNhbGN1bGF0ZV9EID0gMDsKICAgICAgICBscE1vZC0+RCA9IHBWQy0+RF92YWx1ZTsKICAgIH0KCiAgIC8vIFRhYmxlIEkgKHJldmlzZWQpCgogICBzd2l0Y2ggKGxwTW9kLT5zdXJyb3VuZCkgewoKICAgIGNhc2UgQVZHX1NVUlJPVU5EXzQ6CiAgICAgICBscE1vZC0+RiA9IDEuMDsKICAgICAgIGxwTW9kLT5jID0gMC42OTsKICAgICAgIGxwTW9kLT5GbGwgPSAwLjA7ICAgIC8vIE5vdCBpbmNsdWRlZCBvbiBSZXYgMgogICAgICAgbHBNb2QtPk5jID0gMS4wOwogICAgICAgYnJlYWs7CiAgICBjYXNlIEFWR19TVVJST1VORDoKICAgICAgIGxwTW9kLT5GID0gMS4wOwogICAgICAgbHBNb2QtPmMgPSAwLjY5OwogICAgICAgbHBNb2QtPkZsbCA9IDEuMDsKICAgICAgIGxwTW9kLT5OYyA9IDEuMDsKICAgICAgIGJyZWFrOwogICAgY2FzZSBESU1fU1VSUk9VTkQ6CiAgICAgICBscE1vZC0+RiA9IDAuOTk7CiAgICAgICBscE1vZC0+YyA9IDAuNTk7CiAgICAgICBscE1vZC0+RmxsID0gMS4wOwogICAgICAgbHBNb2QtPk5jID0gMC45NTsKICAgICAgIGJyZWFrOwogICAgY2FzZSBEQVJLX1NVUlJPVU5EOgogICAgICAgbHBNb2QtPkYgPSAwLjk7CiAgICAgICBscE1vZC0+YyA9IDAuNTI1OwogICAgICAgbHBNb2QtPkZsbCA9IDEuMDsKICAgICAgIGxwTW9kLT5OYyA9IDAuODsKICAgICAgIGJyZWFrOwogICAgY2FzZSBDVVRTSEVFVF9TVVJST1VORDoKICAgICAgIGxwTW9kLT5GID0gMC45OwogICAgICAgbHBNb2QtPmMgPSAwLjQxOwogICAgICAgbHBNb2QtPkZsbCA9IDEuMDsKICAgICAgIGxwTW9kLT5OYyA9IDAuODsKICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgIGxwTW9kLT5GID0gMS4wOwogICAgICAgbHBNb2QtPmMgPSAwLjY5OwogICAgICAgbHBNb2QtPkZsbCA9IDEuMDsKICAgICAgIGxwTW9kLT5OYyA9IDEuMDsKICAgICAgIGJyZWFrOwogICAgfQoKICAgIGxwTW9kLT5rID0gMSAvICg1ICogbHBNb2QtPkxhICArIDEpOwogICAgbHBNb2QtPkZsID0gbHBNb2QtPkxhICogcG93KGxwTW9kLT5rLCA0KSArIDAuMSpwb3coMSAtIHBvdyhscE1vZC0+aywgNCksIDIuMCkgKiBwb3coNSpscE1vZC0+TGEsIDEuMC8zLjApOwoKICAgIGlmIChscE1vZC0+Y2FsY3VsYXRlX0QgPiAwKSB7CgogICAgICAgbHBNb2QtPkQgPSBscE1vZC0+RiAqICgxIC0gMSAvICgxICsgMipwb3cobHBNb2QtPkxhLCAwLjI1KSArIHBvdyhscE1vZC0+TGEsIDIpLzMwMC4wKSk7CiAgICAgICBpZiAobHBNb2QtPmNhbGN1bGF0ZV9EID4gMSkKICAgICAgICAgICBscE1vZC0+RCA9IChscE1vZC0+RCArIDEuMCkgLyAyOwogICAgfQoKCiAgICAvLyBSR0Jfc3VidyA9IFtNbGFtUmlnZ11bV1AvWVdwXQojaWZkZWYgVVNFX0NJRUNBTTk3czIKICAgIE1BVDNldmFsKCZscE1vZCAtPiBSR0Jfc3VidywgJmxwTW9kIC0+IE1sYW1SaWdnLCAmbHBNb2QgLT4gV1ApOwojZWxzZQogICAgVkVDM2RpdksoJnRtcCwgKExQVkVDMykgJmxwTW9kIC0+IFdQLCBscE1vZC0+V1AuWSk7CiAgICBNQVQzZXZhbCgmbHBNb2QgLT4gUkdCX3N1YncsICZscE1vZCAtPiBNbGFtUmlnZywgJnRtcCk7CiNlbmRpZgoKCgogICAgTUFUM3BlcigmbHBNb2QgLT4gTWh1bnRfeF9NbGFtUmlnZ18xLCAgICZscE1vZCAtPiBNaHVudCwgICAmbHBNb2QtPk1sYW1SaWdnXzEgICk7CiAgICBNQVQzcGVyKCZscE1vZCAtPiBNbGFtUmlnZ194X01odW50XzEsICAgJmxwTW9kIC0+IE1sYW1SaWdnLCAmbHBNb2QgLT4gTWh1bnRfMSAgKTsKCiAgICAvLyBwIGlzIHVzZWQgb24gZm9yd2FyZCBtb2RlbAogICAgbHBNb2QtPnAgPSBwb3cobHBNb2QtPlJHQl9zdWJ3Lm5bMl0sIDAuMDgzNCk7CgogICAgRndBZGFwdGF0aW9uRGVncmVlKGxwTW9kLCAmbHBNb2QtPlJHQl9zdWJ3YywgJmxwTW9kLT5SR0Jfc3Vidyk7CgojaWYgVVNFX0NJRUNBTTk3czIKICAgIE1BVDNldmFsKCZscE1vZC0+UkdCX3N1YndfcHJpbWUsICZscE1vZC0+TWh1bnRfeF9NbGFtUmlnZ18xLCAmbHBNb2QgLT4gUkdCX3N1YndjKTsKI2Vsc2UKICAgIFZFQzNwZXJLKCZ0bXAsICZscE1vZCAtPiBSR0Jfc3Vid2MsIGxwTW9kLT5XUC5ZKTsKICAgIE1BVDNldmFsKCZscE1vZC0+UkdCX3N1YndfcHJpbWUsICZscE1vZC0+TWh1bnRfeF9NbGFtUmlnZ18xLCAmdG1wKTsKI2VuZGlmCgogICAgbHBNb2QtPm4gPSBscE1vZC0+IFliIC8gbHBNb2QtPiBXUC5ZOwoKICAgIGxwTW9kLT56ID0gMSArIGxwTW9kLT5GbGwgKiBzcXJ0KGxwTW9kLT5uKTsKICAgIGxwTW9kLT5OYmIgPSBscE1vZC0+TmNiID0gMC43MjUgLyBwb3cobHBNb2QtPm4sIDAuMik7CgogICAgUG9zdEFkYXB0YXRpb25Db25lUmVzcG9uc2VzKGxwTW9kLCAmbHBNb2QtPlJHQl9zdWJhd19wcmltZSwgJmxwTW9kLT5SR0Jfc3Vid19wcmltZSk7CgogICAgbHBNb2QtPkFfc3Vidz1scE1vZC0+TmJiKigyLjAqbHBNb2QtPlJHQl9zdWJhd19wcmltZS5uWzBdK2xwTW9kLT5SR0Jfc3ViYXdfcHJpbWUublsxXStscE1vZC0+UkdCX3N1YmF3X3ByaW1lLm5bMl0vMjAuMC1OT0lTRV9DT05TVEFOVCk7CgogICAgcmV0dXJuIChMQ01TSEFORExFKSBscE1vZDsKfQoKCgoKLy8KLy8gVGhlIGZvcndhcmQgbW9kZWw6IFhZWiAtPiBKQ2gKLy8KCkxDTVNBUEkgdm9pZCBMQ01TRVhQT1JUIGNtc0NJRUNBTTk3c0ZvcndhcmQoTENNU0hBTkRMRSBoTW9kZWwsIExQY21zQ0lFWFlaIGluUHRyLCBMUGNtc0pDaCBvdXRQdHIpCnsKCiAgICAgICAgTFBjbXNDSUVDQU05N3MgbHBNb2QgPSAoTFBjbXNDSUVDQU05N3MpIChMUFNUUikgaE1vZGVsOwogICAgICAgIGRvdWJsZSBhLCBiLCBoLCBzLCBIMXZhbCwgZXMsIEE7CiAgICAgICAgVkVDMyBJbiwgUkdCLCBSR0JjLCBSR0JwcmltZSwgUkdCYV9wcmltZTsKCiAgICAgICAgaWYgKGluUHRyIC0+IFkgPD0gMC4wKSB7CgogICAgICBvdXRQdHIgLT4gSiA9IG91dFB0ciAtPiBDID0gb3V0UHRyIC0+IGggPSAwLjA7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgIC8vIEFuIGluaXRpYWwgY2hyb21hdGljIGFkYXB0YXRpb24gdHJhbnNmb3JtIGlzIHVzZWQgdG8gZ28gZnJvbSB0aGUgc291cmNlCiAgICAgICAvLyB2aWV3aW5nIGNvbmRpdGlvbnMgdG8gY29ycmVzcG9uZGluZyBjb2xvdXJzIHVuZGVyIHRoZSBlcXVhbC1lbmVyZ3ktaWxsdW1pbmFudAogICAgICAgLy8gcmVmZXJlbmNlIHZpZXdpbmcgY29uZGl0aW9ucy4gVGhpcyBpcyBoYW5kbGVkIGRpZmZlcmVudGx5IG9uIHJldiAyCgogICAgICAgVkVDM2luaXQoJkluLCBpblB0ciAtPiBYLCBpblB0ciAtPiBZLCBpblB0ciAtPiBaKTsgICAgLy8gMi4xCgojaWZkZWYgVVNFX0NJRUNBTTk3czIKICAgICAgIC8vIFNpbmNlIHRoZSBjaHJvbWF0aWMgYWRhcHRhdGlvbiB0cmFuc2Zvcm0gaGFzIGJlZW4gbGluZWFyaXplZCwgaXQKICAgICAgIC8vIGlzIG5vIGxvbmdlciByZXF1aXJlZCB0byBkaXZpZGUgdGhlIHN0aW11bHVzIHRyaXN0aW11bHVzIHZhbHVlcwogICAgICAgLy8gYnkgdGhlaXIgb3duIFkgdHJpc3RpbXVsdXMgdmFsdWUgcHJpb3IgdG8gdGhlIGNocm9tYXRpYyBhZGFwdGF0aW9uLgojZWxzZQogICAgICAgVkVDM2RpdksoJkluLCAmSW4sIGluUHRyIC0+IFkpOwojZW5kaWYKCiAgICAgICBNQVQzZXZhbCgmUkdCLCAmbHBNb2QgLT4gTWxhbVJpZ2csICZJbik7ICAgICAgICAgICAgICAvLyAyLjIKCiAgICAgICBGd0FkYXB0YXRpb25EZWdyZWUobHBNb2QsICZSR0JjLCAmUkdCKTsKCiAgICAgICAvLyBUaGUgcG9zdC1hZGFwdGF0aW9uIHNpZ25hbHMgZm9yIGJvdGggdGhlIHNhbXBsZSBhbmQgdGhlIHdoaXRlIGFyZSB0aGVuCiAgICAgICAvLyB0cmFuc2Zvcm1lZCBmcm9tIHRoZSBzaGFycGVuZWQgY29uZSByZXNwb25zZXMgdG8gdGhlIEh1bnQtUG9pbnRlci1Fc3RldmV6CiAgICAgICAvLyBjb25lIHJlc3BvbnNlcy4KI2lmZGVmIFVTRV9DSUVDQU05N3MyCiNlbHNlCiAgICAgICBWRUMzcGVySygmUkdCYywgJlJHQmMsIGluUHRyLT5ZKTsKI2VuZGlmCgogICAgICAgTUFUM2V2YWwoJlJHQnByaW1lLCAmbHBNb2QtPk1odW50X3hfTWxhbVJpZ2dfMSwgJlJHQmMpOwoKICAgICAgIC8vIFRoZSBwb3N0LWFkYXB0YXRpb24gY29uZSByZXNwb25zZXMgKGZvciBib3RoIHRoZSBzdGltdWx1cyBhbmQgdGhlIHdoaXRlKQogICAgICAgLy8gYXJlIHRoZW4gY2FsY3VsYXRlZC4KCiAgICAgICBQb3N0QWRhcHRhdGlvbkNvbmVSZXNwb25zZXMobHBNb2QsICZSR0JhX3ByaW1lLCAmUkdCcHJpbWUpOwoKICAgICAgIC8vIFByZWxpbWluYXJ5IHJlZC1ncmVlbiBhbmQgeWVsbG93LWJsdWUgb3Bwb25lbnQgZGltZW5zaW9ucyBhcmUgY2FsY3VsYXRlZAoKICAgICAgIGEgPSBSR0JhX3ByaW1lLm5bMF0gLSAoMTIuMCAqIFJHQmFfcHJpbWUublsxXSAvIDExLjApICsgUkdCYV9wcmltZS5uWzJdLzExLjA7CiAgICAgICBiID0gKFJHQmFfcHJpbWUublswXSArIFJHQmFfcHJpbWUublsxXSAtIDIuMCAqIFJHQmFfcHJpbWUublsyXSkgLyA5LjA7CgoKICAgICAgIC8vIFRoZSBDSUVDQU05N3MgaHVlIGFuZ2xlLCBoLCBpcyB0aGVuIGNhbGN1bGF0ZWQKICAgICAgIGggPSAoMTgwLjAvTV9QSSkqKGF0YW4yKGIsIGEpKTsKCgogICAgICAgd2hpbGUgKGggPCAwKQogICAgICAgICAgICAgIGggKz0gMzYwLjA7CgogICAgICAgb3V0UHRyLT5oID0gaDsKCiAgICAgICAvLyBodWUgcXVhZHJhdHVyZSBhbmQgZWNjZW50cmljaXR5IGZhY3RvcnMsIGUsIGFyZSBjYWxjdWxhdGVkCgogICAgICAgQ29tcHV0ZUh1ZVF1YWRyYXR1cmUoaCwgJkgxdmFsLCAmZXMpOwoKICAgICAgIC8vIENvbXB1dGVIdWVRdWFkcmF0dXJlKGgsICZIMXZhbCwgJmgxLCAmZTEsICZoMiwgJmUyLCAmZXMpOwoKCiAgICAgIC8vIFRoZSBhY2hyb21hdGljIHJlc3BvbnNlIEEKICAgICAgQSA9IGxwTW9kLT5OYmIgKiAoMi4wICogUkdCYV9wcmltZS5uWzBdICsgUkdCYV9wcmltZS5uWzFdICsgUkdCYV9wcmltZS5uWzJdLzIwLjAgLSBOT0lTRV9DT05TVEFOVCk7CgogICAgICAvLyBDSUVDQU05N3MgTGlnaHRuZXNzIEoKICAgICAgb3V0UHRyIC0+IEogPSAxMDAuMCAqIHBvdyhBIC8gbHBNb2QtPkFfc3VidywgbHBNb2QtPmMgKiBscE1vZC0+eik7CgogICAgICAvLyBDSUVDQU05N3Mgc2F0dXJhdGlvbiBzCiAgICAgIHMgPSAgKDUwICogaHlwb3QgKGEsIGIpICogMTAwICogZXMgKiAoMTAuMC8xMy4wKSAqIGxwTW9kLT4gTmMgKiBscE1vZC0+TmNiKSAvIChSR0JhX3ByaW1lLm5bMF0gKyBSR0JhX3ByaW1lLm5bMV0gKyAxLjA1ICogUkdCYV9wcmltZS5uWzJdKTsKCiAgICAgIC8vIENJRUNBTTk3cyBDaHJvbWEgQwoKI2lmZGVmIFVTRV9DSUVDQU05N3MyCiAgICAgIC8vIEVxLiAyNiBoYXMgYmVlbiBtb2RpZmllZCB0byBhbGxvdyBhY2N1cmF0ZSBwcmVkaWN0aW9uIG9mIHRoZSBNdW5zZWxsIGNocm9tYSBzY2FsZXMuCiAgICAgIG91dFB0ci0+QyA9IDAuNzQ4NyAqIHBvdyhzLCAwLjk3MykgKiBwb3cob3V0UHRyLT5KLzEwMC4wLCAwLjk0NSAqIGxwTW9kLT5uKSAqICgxLjY0IC0gcG93KDAuMjksIGxwTW9kLT5uKSk7CgojZWxzZQogICAgICBvdXRQdHItPkMgPSAyLjQ0ICogcG93KHMsIDAuNjkpICogcG93KG91dFB0ci0+Si8xMDAuMCwgMC42NyAqIGxwTW9kLT5uKSAqICgxLjY0IC0gcG93KDAuMjksIGxwTW9kLT5uKSk7CiNlbmRpZgp9CgoKLy8KLy8gVGhlIHJldmVyc2UgbW9kZWwgSkNoIC0+IFhZWgovLwoKCkxDTVNBUEkgdm9pZCBMQ01TRVhQT1JUIGNtc0NJRUNBTTk3c1JldmVyc2UoTENNU0hBTkRMRSBoTW9kZWwsIExQY21zSkNoIGluUHRyLCBMUGNtc0NJRVhZWiBvdXRQdHIpCnsKICAgIExQY21zQ0lFQ0FNOTdzIGxwTW9kID0gKExQY21zQ0lFQ0FNOTdzKSAoTFBTVFIpIGhNb2RlbDsKICAgIGRvdWJsZSBKLCBDLCBoLCBBLCBIMXZhbCwgZXMsIHMsIGEsIGI7CiAgICBkb3VibGUgdGFuX2gsIHNlY19oOwogICAgZG91YmxlIFJfc3ViYV9wcmltZSwgR19zdWJhX3ByaW1lLCBCX3N1YmFfcHJpbWU7CiAgICBkb3VibGUgUl9wcmltZSwgR19wcmltZSwgQl9wcmltZTsKICAgIGRvdWJsZSBZX3N1YmMsIFlfcHJpbWUsIEJfdGVybTsKICAgIFZFQzMgdG1wOwogICAgVkVDMyBSR0JfcHJpbWUsIFJHQl9zdWJjX1k7CiAgICBWRUMzIFlfb3Zlcl9ZX3N1YmNfUkdCOwogICAgVkVDMyBYWVpfcHJpbWVwcmltZV9vdmVyX1lfc3ViYzsKI2lmZGVmIFVTRV9DSUVDQU05MnMyCiAgICBWRUMzIFJHQlk7CiAgICBWRUMzIE91dDsKI2VuZGlmCgogICAgSiA9IGluUHRyLT5KOwogICAgaCA9IGluUHRyLT5oOwogICAgQyA9IGluUHRyLT5DOwoKICAgIGlmIChKIDw9IDApIHsKCiAgICAgICAgb3V0UHRyLT5YID0gIDAuMDsKICAgICAgICBvdXRQdHItPlkgPSAgMC4wOwogICAgICAgIG91dFB0ci0+WiA9ICAwLjA7CiAgICAgICAgcmV0dXJuOwogICAgfQoKCgogICAgLy8gKDIpIEZyb20gSiBPYnRhaW4gQQoKICAgIEEgPSAgcG93KEovMTAwLjAsIDEvKGxwTW9kLT5jICogbHBNb2QtPnopKSAqIGxwTW9kLT5BX3N1Ync7CgoKICAgIC8vICgzKSwgKDQpLCAoNSkgVXNpbmcgSCBEZXRlcm1pbmUgaDEsIGgyLCBlMSwgZTIKICAgIC8vIGUxIGFuZCBoMSBhcmUgdGhlIHZhbHVlcyAgb2YgZSBhbmQgaCBmb3IgdGhlIHVuaXF1ZSBodWUgaGF2aW5nIHRoZQogICAgLy8gbmVhcmVzdCBsb3dlciB2YWx1ciBvZiBoIGFuZCBlMiBhbmQgaDIgYXJlIHRoZSB2YWx1ZXMgb2YgZSBhbmQgaCBmb3IKICAgIC8vIHRoZSB1bmlxdWUgaHVlIGhhdmluZyB0aGUgbmVhcmVzdCBoaWdoZXIgdmFsdWUgb2YgaC4KCgogICAgQ29tcHV0ZUh1ZVF1YWRyYXR1cmUoaCwgJkgxdmFsLCAmZXMpOwoKICAgIC8vICg3KSBDYWxjdWxhdGUgcwoKICAgIHMgPSBwb3coQyAvICgyLjQ0ICogcG93KEovMTAwLjAsIDAuNjcqbHBNb2QtPm4pICogKDEuNjQgLSBwb3coMC4yOSwgbHBNb2QtPm4pKSkgLCAoMS4vMC42OSkpOwoKCiAgICAvLyAoOCkgQ2FsY3VsYXRlIGEgYW5kIGIuCiAgICAvLyBOT1RFOiBzcXJ0KDEgKyB0YW5eMikgPT0gc2VjKGgpCgogICAgdGFuX2ggPSB0YW4gKChNX1BJLzE4MC4pKihoKSk7CiAgICBzZWNfaCA9IHNxcnQoMSArIHRhbl9oICogdGFuX2gpOwoKICAgIGlmICgoaCA+IDkwKSAmJiAoaCA8IDI3MCkpCiAgICAgICAgICAgIHNlY19oID0gLXNlY19oOwoKICAgIGEgPSBzICogKCBBL2xwTW9kLT5OYmIgKyBOT0lTRV9DT05TVEFOVCkgLyAoIHNlY19oICogNTAwMDAuMCAqIGVzICogbHBNb2QtPk5jICogbHBNb2QtPk5jYi8gMTMuMCArCiAgICAgICAgICAgcyAqICgxMS4wIC8gMjMuMCArICgxMDguMC8yMy4wKSAqIHRhbl9oKSk7CgogICAgYiA9IGEgKiB0YW5faDsKCiAgICAvLyg5KSBDYWxjdWxhdGUgUidhIEcnYSBhbmQgQidhCgogICAgUl9zdWJhX3ByaW1lID0gKDIwLjAvNjEuMCkgKiAoQS9scE1vZC0+TmJiICsgTk9JU0VfQ09OU1RBTlQpICsgKDQxLjAvNjEuMCkgKiAoMTEuMC8yMy4wKSAqIGEgKyAoMjg4LjAvNjEuMCkgLyAyMy4wICogYjsKICAgIEdfc3ViYV9wcmltZSA9ICgyMC4wLzYxLjApICogKEEvbHBNb2QtPk5iYiArIE5PSVNFX0NPTlNUQU5UKSAtICg4MS4wLzYxLjApICogKDExLjAvMjMuMCkgKiBhIC0gKDI2MS4wLzYxLjApIC8gMjMuMCAqIGI7CiAgICBCX3N1YmFfcHJpbWUgPSAoMjAuMC82MS4wKSAqIChBL2xwTW9kLT5OYmIgKyBOT0lTRV9DT05TVEFOVCkgLSAoMjAuMC82MS4wKSAqICgxMS4wLzIzLjApICogYSAtICgyMC4wLzYxLjApICogKDMxNS4wLzIzLjApICogYjsKCiAgICAvLyAoMTApIENhbGN1bGF0ZSBSJywgRycgYW5kIEInCgogICAgaWYgKChSX3N1YmFfcHJpbWUgLSAxKSA8IDApIHsKCiAgICAgICAgIFJfcHJpbWUgPSAtMTAwLjAgKiBwb3coKDIuMCAtIDIuMCAqIFJfc3ViYV9wcmltZSkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKDM5LjAgKyBSX3N1YmFfcHJpbWUpLCAxLjAvMC43Myk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgIFJfcHJpbWUgPSAxMDAuMCAqIHBvdygoMi4wICogUl9zdWJhX3ByaW1lIC0gMi4wKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNDEuMCAtIFJfc3ViYV9wcmltZSksIDEuMC8wLjczKTsKICAgIH0KCiAgICBpZiAoKEdfc3ViYV9wcmltZSAtIDEpIDwgMCkKICAgIHsKICAgICAgICAgR19wcmltZSA9IC0xMDAuMCAqIHBvdygoMi4wIC0gMi4wICogR19zdWJhX3ByaW1lKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzkuMCArIEdfc3ViYV9wcmltZSksIDEuMC8wLjczKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAgR19wcmltZSA9IDEwMC4wICogcG93KCgyLjAgKiBHX3N1YmFfcHJpbWUgLSAyLjApIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0MS4wIC0gR19zdWJhX3ByaW1lKSwgMS4wLzAuNzMpOwogICAgfQoKICAgIGlmICgoQl9zdWJhX3ByaW1lIC0gMSkgPCAwKQogICAgewogICAgICAgICBCX3ByaW1lID0gLTEwMC4wICogcG93KCgyLjAgLSAyLjAgKiBCX3N1YmFfcHJpbWUpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzOS4wICsgQl9zdWJhX3ByaW1lKSwgMS4wLzAuNzMpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgICBCX3ByaW1lID0gMTAwLjAgKiBwb3coKDIuMCAqIEJfc3ViYV9wcmltZSAtIDIuMCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKDQxLjAgLSBCX3N1YmFfcHJpbWUpLCAxLjAvMC43Myk7CiAgICB9CgoKICAgIC8vICgxMSkgQ2FsY3VsYXRlIFJjWSwgR2NZIGFuZCBCY1kKCiAgICBWRUMzaW5pdCgmUkdCX3ByaW1lLCBSX3ByaW1lLCBHX3ByaW1lLCBCX3ByaW1lKTsKICAgIFZFQzNkaXZLKCZ0bXAsICZSR0JfcHJpbWUsIGxwTW9kIC0+IEZsKTsKCiAgICBNQVQzZXZhbCgmUkdCX3N1YmNfWSwgJmxwTW9kLT5NbGFtUmlnZ194X01odW50XzEsICZ0bXApOwoKCgoKI2lmZGVmIFVTRV9DSUVDQU05N3MyCgogICAgICAgLy8gKDEyKQoKCiAgICAgICAgICAgUnZBZGFwdGF0aW9uRGVncmVlKGxwTW9kLCAmUkdCWSwgJlJHQl9zdWJjX1kpOwogICAgICAgICAgIE1BVDNldmFsKCZPdXQsICZscE1vZC0+TWxhbVJpZ2dfMSwgJlJHQlkpOwoKICAgICAgICAgICBvdXRQdHIgLT4gWCA9IE91dC5uWzBdOwogICAgICAgICAgIG91dFB0ciAtPiBZID0gT3V0Lm5bMV07CiAgICAgICAgICAgb3V0UHRyIC0+IFogPSBPdXQublsyXTsKCiNlbHNlCgogICAgICAgICAgIC8vICgxMikgQ2FsY3VsYXRlIFljCgogICAgICAgWV9zdWJjID0gMC40MzIzMSpSR0Jfc3ViY19ZLm5bMF0rMC41MTgzNipSR0Jfc3ViY19ZLm5bMV0rMC4wNDkyOSpSR0Jfc3ViY19ZLm5bMl07CgogICAgICAgICAgIC8vICgxMykgQ2FsY3VsYXRlIChZL1ljKVIsIChZL1ljKUcgYW5kIChZL1ljKUIKCiAgICAgICAgICAgVkVDM2RpdksoJlJHQl9zdWJjX1ksICZSR0Jfc3ViY19ZLCBZX3N1YmMpOwogICAgICAgICAgIFJ2QWRhcHRhdGlvbkRlZ3JlZShscE1vZCwgJllfb3Zlcl9ZX3N1YmNfUkdCLCAmUkdCX3N1YmNfWSk7CgogICAgICAgICAgIC8vICgxNCkgQ2FsY3VsYXRlIFknCiAgICAgICBZX3ByaW1lID0gMC40MzIzMSooWV9vdmVyX1lfc3ViY19SR0IublswXSpZX3N1YmMpICsgMC41MTgzNiooWV9vdmVyX1lfc3ViY19SR0IublsxXSpZX3N1YmMpICsgMC4wNDkyOSAqIChZX292ZXJfWV9zdWJjX1JHQi5uWzJdKllfc3ViYyk7CgogICAgICAgICAgIGlmIChZX3ByaW1lIDwgMCB8fCBZX3N1YmMgPCAwKQogICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIERpc2NhcmQgdG8gbmVhciBibGFjayBwb2ludAoKICAgICAgICAgICAgICAgIG91dFB0ciAtPiBYID0gMDsKICAgICAgICAgICAgICAgIG91dFB0ciAtPiBZID0gMDsKICAgICAgICAgICAgICAgIG91dFB0ciAtPiBaID0gMDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICB9CgogICAgICAgQl90ZXJtID0gcG93KFlfcHJpbWUgLyBZX3N1YmMsICgxLjAgLyBscE1vZC0+cCkgLSAxKTsKCiAgICAgICAgICAvLyAoMTUpIENhbGN1bGF0ZSBYJycsIFknJyBhbmQgWicnCiAgICAgICAgICAgWV9vdmVyX1lfc3ViY19SR0IublsyXSAvPSBCX3Rlcm07CiAgICAgICAgICAgTUFUM2V2YWwoJlhZWl9wcmltZXByaW1lX292ZXJfWV9zdWJjLCAmbHBNb2QtPk1sYW1SaWdnXzEsICZZX292ZXJfWV9zdWJjX1JHQik7CgogICAgICAgICAgIG91dFB0ci0+WCA9ICBYWVpfcHJpbWVwcmltZV9vdmVyX1lfc3ViYy5uWzBdICogWV9zdWJjOwogICAgICAgICAgIG91dFB0ci0+WSA9ICBYWVpfcHJpbWVwcmltZV9vdmVyX1lfc3ViYy5uWzFdICogWV9zdWJjOwogICAgICAgICAgIG91dFB0ci0+WiA9ICBYWVpfcHJpbWVwcmltZV9vdmVyX1lfc3ViYy5uWzJdICogWV9zdWJjOwojZW5kaWYKCn0K