LyoKICoJdzgzNjI3aGYvdGhmIFdEVCBkcml2ZXIKICoKICoJKGMpIENvcHlyaWdodCAyMDA3IFZsYWQgRHJ1a2tlciA8dmxhZEBzdG9yZXdpei5jb20+CiAqCQlhZGRlZCBzdXBwb3J0IGZvciBXODM2MjdUSEYuCiAqCiAqCShjKSBDb3B5cmlnaHQgMjAwMywyMDA3IFDhZHJhaWcgQnJhZHkgPFBAZHJhaWdCcmFkeS5jb20+CiAqCiAqCUJhc2VkIG9uIGFkdmFudGVjaHdkdC5jIHdoaWNoIGlzIGJhc2VkIG9uIHdkdC5jLgogKglPcmlnaW5hbCBjb3B5cmlnaHQgbWVzc2FnZXM6CiAqCiAqCShjKSBDb3B5cmlnaHQgMjAwMC0yMDAxIE1hcmVrIE1pY2hhbGtpZXdpY3ogPG1hcmVrbUBsaW51eC5vcmcucGw+CiAqCiAqCShjKSBDb3B5cmlnaHQgMTk5NiBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPiwKICoJCQkJCQlBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKglOZWl0aGVyIEFsYW4gQ294IG5vciBDeW1ydU5ldCBMdGQuIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZQogKgl3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQKICoJIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgogKgogKgkoYykgQ29weXJpZ2h0IDE5OTUgICAgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CiNpbmNsdWRlIDxsaW51eC9mcy5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgojaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgojaW5jbHVkZSA8bGludXgvaW8uaD4KI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KCiNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CgojZGVmaW5lIFdBVENIRE9HX05BTUUgInc4MzYyN2hmL3RoZi9oZy9kaGcgV0RUIgojZGVmaW5lIFBGWCBXQVRDSERPR19OQU1FICI6ICIKI2RlZmluZSBXQVRDSERPR19USU1FT1VUIDYwCQkvKiA2MCBzZWMgZGVmYXVsdCB0aW1lb3V0ICovCgpzdGF0aWMgdW5zaWduZWQgbG9uZyB3ZHRfaXNfb3BlbjsKc3RhdGljIGNoYXIgZXhwZWN0X2Nsb3NlOwpzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlvX2xvY2spOwoKLyogWW91IG11c3Qgc2V0IHRoaXMgLSB0aGVyZSBpcyBubyBzYW5lIHdheSB0byBwcm9iZSBmb3IgdGhpcyBib2FyZC4gKi8Kc3RhdGljIGludCB3ZHRfaW8gPSAweDJFOwptb2R1bGVfcGFyYW0od2R0X2lvLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKHdkdF9pbywgInc4MzYyN2hmL3RoZiBXRFQgaW8gcG9ydCAoZGVmYXVsdCAweDJFKSIpOwoKc3RhdGljIGludCB0aW1lb3V0ID0gV0FUQ0hET0dfVElNRU9VVDsJLyogaW4gc2Vjb25kcyAqLwptb2R1bGVfcGFyYW0odGltZW91dCwgaW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LAoJCSJXYXRjaGRvZyB0aW1lb3V0IGluIHNlY29uZHMuIDEgPD0gdGltZW91dCA8PSAyNTUsIGRlZmF1bHQ9IgoJCQkJX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX1RJTUVPVVQpICIuIik7CgpzdGF0aWMgaW50IG5vd2F5b3V0ID0gV0FUQ0hET0dfTk9XQVlPVVQ7Cm1vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwKCQkiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PSIKCQkJCV9fTU9EVUxFX1NUUklORyhXQVRDSERPR19OT1dBWU9VVCkgIikiKTsKCi8qCiAqCUtlcm5lbCBtZXRob2RzLgogKi8KCiNkZWZpbmUgV0RUX0VGRVIgKHdkdF9pbyswKSAgIC8qIEV4dGVuZGVkIEZ1bmN0aW9uIEVuYWJsZSBSZWdpc3RlcnMgKi8KI2RlZmluZSBXRFRfRUZJUiAod2R0X2lvKzApICAgLyogRXh0ZW5kZWQgRnVuY3Rpb24gSW5kZXggUmVnaXN0ZXIKCQkJCQkJCShzYW1lIGFzIEVGRVIpICovCiNkZWZpbmUgV0RUX0VGRFIgKFdEVF9FRklSKzEpIC8qIEV4dGVuZGVkIEZ1bmN0aW9uIERhdGEgUmVnaXN0ZXIgKi8KCnN0YXRpYyB2b2lkIHc4MzYyN2hmX3NlbGVjdF93ZF9yZWdpc3Rlcih2b2lkKQp7Cgl1bnNpZ25lZCBjaGFyIGM7CglvdXRiX3AoMHg4NywgV0RUX0VGRVIpOyAvKiBFbnRlciBleHRlbmRlZCBmdW5jdGlvbiBtb2RlICovCglvdXRiX3AoMHg4NywgV0RUX0VGRVIpOyAvKiBBZ2FpbiBhY2NvcmRpbmcgdG8gbWFudWFsICovCgoJb3V0YigweDIwLCBXRFRfRUZFUik7CS8qIGNoZWNrIGNoaXAgdmVyc2lvbgkqLwoJYyA9IGluYihXRFRfRUZEUik7CglpZiAoYyA9PSAweDgyKSB7CS8qIFc4MzYyN1RIRgkJKi8KCQlvdXRiX3AoMHgyYiwgV0RUX0VGRVIpOyAvKiBzZWxlY3QgR1BJTzMgKi8KCQljID0gKChpbmJfcChXRFRfRUZEUikgJiAweGY3KSB8IDB4MDQpOyAvKiBzZWxlY3QgV0RUMCAqLwoJCW91dGJfcCgweDJiLCBXRFRfRUZFUik7CgkJb3V0Yl9wKGMsIFdEVF9FRkRSKTsJLyogc2V0IEdQSU8zIHRvIFdEVDAgKi8KCX0gZWxzZSBpZiAoYyA9PSAweDg4IHx8IGMgPT0gMHhhMCkgewkvKiBXODM2MjdFSEYgLyBXODM2MjdESEcgKi8KCQlvdXRiX3AoMHgyZCwgV0RUX0VGRVIpOyAvKiBzZWxlY3QgR1BJTzUgKi8KCQljID0gaW5iX3AoV0RUX0VGRFIpICYgfjB4MDE7IC8qIFBJTjc3IC0+IFdEVDAjICovCgkJb3V0Yl9wKDB4MmQsIFdEVF9FRkVSKTsKCQlvdXRiX3AoYywgV0RUX0VGRFIpOyAvKiBzZXQgR1BJTzUgdG8gV0RUMCAqLwoJfQoKCW91dGJfcCgweDA3LCBXRFRfRUZFUik7IC8qIHBvaW50IHRvIGxvZ2ljYWwgZGV2aWNlIG51bWJlciByZWcgKi8KCW91dGJfcCgweDA4LCBXRFRfRUZEUik7IC8qIHNlbGVjdCBsb2dpY2FsIGRldmljZSA4IChHUElPMikgKi8KCW91dGJfcCgweDMwLCBXRFRfRUZFUik7IC8qIHNlbGVjdCBDUjMwICovCglvdXRiX3AoMHgwMSwgV0RUX0VGRFIpOyAvKiBzZXQgYml0IDAgdG8gYWN0aXZhdGUgR1BJTzIgKi8KfQoKc3RhdGljIHZvaWQgdzgzNjI3aGZfdW5zZWxlY3Rfd2RfcmVnaXN0ZXIodm9pZCkKewoJb3V0Yl9wKDB4QUEsIFdEVF9FRkVSKTsgLyogTGVhdmUgZXh0ZW5kZWQgZnVuY3Rpb24gbW9kZSAqLwp9CgovKiB0eWFuIG1vdGhlcmJvYXJkcyBzZWVtIHRvIHNldCBGNSB0byAweDRDID8KICogU28gZXhwbGljaXRseSBpbml0IHRvIGFwcHJvcHJpYXRlIHZhbHVlLiAqLwoKc3RhdGljIHZvaWQgdzgzNjI3aGZfaW5pdCh2b2lkKQp7Cgl1bnNpZ25lZCBjaGFyIHQ7CgoJdzgzNjI3aGZfc2VsZWN0X3dkX3JlZ2lzdGVyKCk7CgoJb3V0Yl9wKDB4RjYsIFdEVF9FRkVSKTsgLyogU2VsZWN0IENSRjYgKi8KCXQgPSBpbmJfcChXRFRfRUZEUik7ICAgICAgLyogcmVhZCBDUkY2ICovCglpZiAodCAhPSAwKSB7CgkJcHJpbnRrKEtFUk5fSU5GTyBQRlgKCQkgICAgICJXYXRjaGRvZyBhbHJlYWR5IHJ1bm5pbmcuIFJlc2V0dGluZyB0aW1lb3V0IHRvICVkIHNlY1xuIiwKCQkJCQkJCQl0aW1lb3V0KTsKCQlvdXRiX3AodGltZW91dCwgV0RUX0VGRFIpOyAgICAvKiBXcml0ZSBiYWNrIHRvIENSRjYgKi8KCX0KCglvdXRiX3AoMHhGNSwgV0RUX0VGRVIpOyAvKiBTZWxlY3QgQ1JGNSAqLwoJdCA9IGluYl9wKFdEVF9FRkRSKTsgICAgICAvKiByZWFkIENSRjUgKi8KCXQgJj0gfjB4MEM7ICAgICAgICAgICAgICAgLyogc2V0IHNlY29uZCBtb2RlICYgZGlzYWJsZSBrZXlib2FyZAoJCQkJICAgIHR1cm5pbmcgb2ZmIHdhdGNoZG9nICovCgl0IHw9IDB4MDI7CQkgIC8qIGVuYWJsZSB0aGUgV0RUTyMgb3V0cHV0IGxvdyBwdWxzZQoJCQkJICAgIHRvIHRoZSBLQlJTVCMgcGluIChQSU42MCkgKi8KCW91dGJfcCh0LCBXRFRfRUZEUik7ICAgIC8qIFdyaXRlIGJhY2sgdG8gQ1JGNSAqLwoKCW91dGJfcCgweEY3LCBXRFRfRUZFUik7IC8qIFNlbGVjdCBDUkY3ICovCgl0ID0gaW5iX3AoV0RUX0VGRFIpOyAgICAgIC8qIHJlYWQgQ1JGNyAqLwoJdCAmPSB+MHhDMDsgICAgICAgICAgICAgICAvKiBkaXNhYmxlIGtleWJvYXJkICYgbW91c2UgdHVybmluZyBvZmYKCQkJCSAgICB3YXRjaGRvZyAqLwoJb3V0Yl9wKHQsIFdEVF9FRkRSKTsgICAgLyogV3JpdGUgYmFjayB0byBDUkY3ICovCgoJdzgzNjI3aGZfdW5zZWxlY3Rfd2RfcmVnaXN0ZXIoKTsKfQoKc3RhdGljIHZvaWQgd2R0X3NldF90aW1lKGludCB0aW1lb3V0KQp7CglzcGluX2xvY2soJmlvX2xvY2spOwoKCXc4MzYyN2hmX3NlbGVjdF93ZF9yZWdpc3RlcigpOwoKCW91dGJfcCgweEY2LCBXRFRfRUZFUik7ICAgIC8qIFNlbGVjdCBDUkY2ICovCglvdXRiX3AodGltZW91dCwgV0RUX0VGRFIpOyAvKiBXcml0ZSBUaW1lb3V0IGNvdW50ZXIgdG8gQ1JGNiAqLwoKCXc4MzYyN2hmX3Vuc2VsZWN0X3dkX3JlZ2lzdGVyKCk7CgoJc3Bpbl91bmxvY2soJmlvX2xvY2spOwp9CgpzdGF0aWMgaW50IHdkdF9waW5nKHZvaWQpCnsKCXdkdF9zZXRfdGltZSh0aW1lb3V0KTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdkdF9kaXNhYmxlKHZvaWQpCnsKCXdkdF9zZXRfdGltZSgwKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdkdF9zZXRfaGVhcnRiZWF0KGludCB0KQp7CglpZiAodCA8IDEgfHwgdCA+IDI1NSkKCQlyZXR1cm4gLUVJTlZBTDsKCXRpbWVvdXQgPSB0OwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2R0X2dldF90aW1lKHZvaWQpCnsKCWludCB0aW1lbGVmdDsKCglzcGluX2xvY2soJmlvX2xvY2spOwoKCXc4MzYyN2hmX3NlbGVjdF93ZF9yZWdpc3RlcigpOwoKCW91dGJfcCgweEY2LCBXRFRfRUZFUik7ICAgIC8qIFNlbGVjdCBDUkY2ICovCgl0aW1lbGVmdCA9IGluYl9wKFdEVF9FRkRSKTsgLyogUmVhZCBUaW1lb3V0IGNvdW50ZXIgdG8gQ1JGNiAqLwoKCXc4MzYyN2hmX3Vuc2VsZWN0X3dkX3JlZ2lzdGVyKCk7CgoJc3Bpbl91bmxvY2soJmlvX2xvY2spOwoKCXJldHVybiB0aW1lbGVmdDsKfQoKc3RhdGljIHNzaXplX3Qgd2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAoJCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKewoJaWYgKGNvdW50KSB7CgkJaWYgKCFub3dheW91dCkgewoJCQlzaXplX3QgaTsKCgkJCWV4cGVjdF9jbG9zZSA9IDA7CgoJCQlmb3IgKGkgPSAwOyBpICE9IGNvdW50OyBpKyspIHsKCQkJCWNoYXIgYzsKCQkJCWlmIChnZXRfdXNlcihjLCBidWYgKyBpKSkKCQkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJCWlmIChjID09ICdWJykKCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKCQkJfQoJCX0KCQl3ZHRfcGluZygpOwoJfQoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgbG9uZyB3ZHRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQp7Cgl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKCWludCBfX3VzZXIgKnAgPSBhcmdwOwoJaW50IHRpbWV2YWw7CglzdGF0aWMgY29uc3Qgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CgkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8CgkJCQkJCQlXRElPRl9NQUdJQ0NMT1NFLAoJCS5maXJtd2FyZV92ZXJzaW9uID0gMSwKCQkuaWRlbnRpdHkgPSAiVzgzNjI3SEYgV0RUIiwKCX07CgoJc3dpdGNoIChjbWQpIHsKCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpZGVudCwgc2l6ZW9mKGlkZW50KSkpCgkJCXJldHVybiAtRUZBVUxUOwoJCWJyZWFrOwoJY2FzZSBXRElPQ19HRVRTVEFUVVM6CgljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CgkJcmV0dXJuIHB1dF91c2VyKDAsIHApOwoJY2FzZSBXRElPQ19TRVRPUFRJT05TOgoJewoJCWludCBvcHRpb25zLCByZXR2YWwgPSAtRUlOVkFMOwoKCQlpZiAoZ2V0X3VzZXIob3B0aW9ucywgcCkpCgkJCXJldHVybiAtRUZBVUxUOwoJCWlmIChvcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKCQkJd2R0X2Rpc2FibGUoKTsKCQkJcmV0dmFsID0gMDsKCQl9CgkJaWYgKG9wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CgkJCXdkdF9waW5nKCk7CgkJCXJldHZhbCA9IDA7CgkJfQoJCXJldHVybiByZXR2YWw7Cgl9CgljYXNlIFdESU9DX0tFRVBBTElWRToKCQl3ZHRfcGluZygpOwoJCWJyZWFrOwoJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgoJCWlmIChnZXRfdXNlcih0aW1ldmFsLCBwKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJaWYgKHdkdF9zZXRfaGVhcnRiZWF0KHRpbWV2YWwpKQoJCQlyZXR1cm4gLUVJTlZBTDsKCQl3ZHRfcGluZygpOwoJCS8qIEZhbGwgKi8KCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKCQlyZXR1cm4gcHV0X3VzZXIodGltZW91dCwgcCk7CgljYXNlIFdESU9DX0dFVFRJTUVMRUZUOgoJCXRpbWV2YWwgPSB3ZHRfZ2V0X3RpbWUoKTsKCQlyZXR1cm4gcHV0X3VzZXIodGltZXZhbCwgcCk7CglkZWZhdWx0OgoJCXJldHVybiAtRU5PVFRZOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZ3ZHRfaXNfb3BlbikpCgkJcmV0dXJuIC1FQlVTWTsKCS8qCgkgKglBY3RpdmF0ZQoJICovCgoJd2R0X3BpbmcoKTsKCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKfQoKc3RhdGljIGludCB3ZHRfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpCgkJd2R0X2Rpc2FibGUoKTsKCWVsc2UgewoJCXByaW50ayhLRVJOX0NSSVQgUEZYCgkJCSJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgd2F0Y2hkb2chXG4iKTsKCQl3ZHRfcGluZygpOwoJfQoJZXhwZWN0X2Nsb3NlID0gMDsKCWNsZWFyX2JpdCgwLCAmd2R0X2lzX29wZW4pOwoJcmV0dXJuIDA7Cn0KCi8qCiAqCU5vdGlmaWVyIGZvciBzeXN0ZW0gZG93bgogKi8KCnN0YXRpYyBpbnQgd2R0X25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsCgl2b2lkICp1bnVzZWQpCnsKCWlmIChjb2RlID09IFNZU19ET1dOIHx8IGNvZGUgPT0gU1lTX0hBTFQpCgkJd2R0X2Rpc2FibGUoKTsJLyogVHVybiB0aGUgV0RUIG9mZiAqLwoKCXJldHVybiBOT1RJRllfRE9ORTsKfQoKLyoKICoJS2VybmVsIEludGVyZmFjZXMKICovCgpzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3ZHRfZm9wcyA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAoJLndyaXRlCQk9IHdkdF93cml0ZSwKCS51bmxvY2tlZF9pb2N0bAk9IHdkdF9pb2N0bCwKCS5vcGVuCQk9IHdkdF9vcGVuLAoJLnJlbGVhc2UJPSB3ZHRfY2xvc2UsCn07CgpzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugd2R0X21pc2NkZXYgPSB7CgkubWlub3IgPSBXQVRDSERPR19NSU5PUiwKCS5uYW1lID0gIndhdGNoZG9nIiwKCS5mb3BzID0gJndkdF9mb3BzLAp9OwoKLyoKICoJVGhlIFdEVCBuZWVkcyB0byBsZWFybiBhYm91dCBzb2Z0IHNodXRkb3ducyBpbiBvcmRlciB0bwogKgl0dXJuIHRoZSB0aW1lYm9tYiByZWdpc3RlcnMgb2ZmLgogKi8KCnN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgd2R0X25vdGlmaWVyID0gewoJLm5vdGlmaWVyX2NhbGwgPSB3ZHRfbm90aWZ5X3N5cywKfTsKCnN0YXRpYyBpbnQgX19pbml0IHdkdF9pbml0KHZvaWQpCnsKCWludCByZXQ7CgoJcHJpbnRrKEtFUk5fSU5GTyAiV0RUIGRyaXZlciBmb3IgdGhlIFdpbmJvbmQoVE0pIFc4MzYyN0hGL1RIRi9IRy9ESEcgU3VwZXIgSS9PIGNoaXAgaW5pdGlhbGlzaW5nLlxuIik7CgoJaWYgKHdkdF9zZXRfaGVhcnRiZWF0KHRpbWVvdXQpKSB7CgkJd2R0X3NldF9oZWFydGJlYXQoV0FUQ0hET0dfVElNRU9VVCk7CgkJcHJpbnRrKEtFUk5fSU5GTyBQRlgKCQkgICAgICJ0aW1lb3V0IHZhbHVlIG11c3QgYmUgMSA8PSB0aW1lb3V0IDw9IDI1NSwgdXNpbmcgJWRcbiIsCgkJCQlXQVRDSERPR19USU1FT1VUKTsKCX0KCglpZiAoIXJlcXVlc3RfcmVnaW9uKHdkdF9pbywgMSwgV0FUQ0hET0dfTkFNRSkpIHsKCQlwcmludGsoS0VSTl9FUlIgUEZYICJJL08gYWRkcmVzcyAweCUwNHggYWxyZWFkeSBpbiB1c2VcbiIsCgkJCXdkdF9pbyk7CgkJcmV0ID0gLUVJTzsKCQlnb3RvIG91dDsKCX0KCgl3ODM2MjdoZl9pbml0KCk7CgoJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOwoJaWYgKHJldCAhPSAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSIFBGWAoJCQkiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwgcmV0KTsKCQlnb3RvIHVucmVnX3JlZ2lvbnM7Cgl9CgoJcmV0ID0gbWlzY19yZWdpc3Rlcigmd2R0X21pc2NkZXYpOwoJaWYgKHJldCAhPSAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSIFBGWAoJCQkiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCgkJCQkJCQlXQVRDSERPR19NSU5PUiwgcmV0KTsKCQlnb3RvIHVucmVnX3JlYm9vdDsKCX0KCglwcmludGsoS0VSTl9JTkZPIFBGWAoJCQkiaW5pdGlhbGl6ZWQuIHRpbWVvdXQ9JWQgc2VjIChub3dheW91dD0lZClcbiIsCgkJCQkJCQl0aW1lb3V0LCBub3dheW91dCk7CgpvdXQ6CglyZXR1cm4gcmV0Owp1bnJlZ19yZWJvb3Q6Cgl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKdW5yZWdfcmVnaW9uczoKCXJlbGVhc2VfcmVnaW9uKHdkdF9pbywgMSk7Cglnb3RvIG91dDsKfQoKc3RhdGljIHZvaWQgX19leGl0IHdkdF9leGl0KHZvaWQpCnsKCW1pc2NfZGVyZWdpc3Rlcigmd2R0X21pc2NkZXYpOwoJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CglyZWxlYXNlX3JlZ2lvbih3ZHRfaW8sIDEpOwp9Cgptb2R1bGVfaW5pdCh3ZHRfaW5pdCk7Cm1vZHVsZV9leGl0KHdkdF9leGl0KTsKCk1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX0FVVEhPUigiUOFkcmFpZyBCcmFkeSA8UEBkcmFpZ0JyYWR5LmNvbT4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJ3ODM2MjdoZi90aGYgV0RUIGRyaXZlciIpOwpNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7Cg==