LyoKICoJdzgzNjI3aGYvdGhmIFdEVCBkcml2ZXIKICoKICoJKGMpIENvcHlyaWdodCAyMDA3IFZsYWQgRHJ1a2tlciA8dmxhZEBzdG9yZXdpei5jb20+CiAqCQlhZGRlZCBzdXBwb3J0IGZvciBXODM2MjdUSEYuCiAqCiAqCShjKSBDb3B5cmlnaHQgMjAwMywyMDA3IFDhZHJhaWcgQnJhZHkgPFBAZHJhaWdCcmFkeS5jb20+CiAqCiAqCUJhc2VkIG9uIGFkdmFudGVjaHdkdC5jIHdoaWNoIGlzIGJhc2VkIG9uIHdkdC5jLgogKglPcmlnaW5hbCBjb3B5cmlnaHQgbWVzc2FnZXM6CiAqCiAqCShjKSBDb3B5cmlnaHQgMjAwMC0yMDAxIE1hcmVrIE1pY2hhbGtpZXdpY3ogPG1hcmVrbUBsaW51eC5vcmcucGw+CiAqCiAqCShjKSBDb3B5cmlnaHQgMTk5NiBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPiwKICoJCQkJCQlBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKglOZWl0aGVyIEFsYW4gQ294IG5vciBDeW1ydU5ldCBMdGQuIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZQogKgl3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQKICoJIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgogKgogKgkoYykgQ29weXJpZ2h0IDE5OTUgICAgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CiNpbmNsdWRlIDxsaW51eC9mcy5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgojaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgojaW5jbHVkZSA8bGludXgvaW8uaD4KI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KCiNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CgojZGVmaW5lIFdBVENIRE9HX05BTUUgInc4MzYyN2hmL3RoZi9oZyBXRFQiCiNkZWZpbmUgUEZYIFdBVENIRE9HX05BTUUgIjogIgojZGVmaW5lIFdBVENIRE9HX1RJTUVPVVQgNjAJCS8qIDYwIHNlYyBkZWZhdWx0IHRpbWVvdXQgKi8KCnN0YXRpYyB1bnNpZ25lZCBsb25nIHdkdF9pc19vcGVuOwpzdGF0aWMgY2hhciBleHBlY3RfY2xvc2U7CnN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW9fbG9jayk7CgovKiBZb3UgbXVzdCBzZXQgdGhpcyAtIHRoZXJlIGlzIG5vIHNhbmUgd2F5IHRvIHByb2JlIGZvciB0aGlzIGJvYXJkLiAqLwpzdGF0aWMgaW50IHdkdF9pbyA9IDB4MkU7Cm1vZHVsZV9wYXJhbSh3ZHRfaW8sIGludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0Mod2R0X2lvLCAidzgzNjI3aGYvdGhmIFdEVCBpbyBwb3J0IChkZWZhdWx0IDB4MkUpIik7CgpzdGF0aWMgaW50IHRpbWVvdXQgPSBXQVRDSERPR19USU1FT1VUOwkvKiBpbiBzZWNvbmRzICovCm1vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsCgkJIldhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcy4gMSA8PSB0aW1lb3V0IDw9IDI1NSwgZGVmYXVsdD0iCgkJCQlfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfVElNRU9VVCkgIi4iKTsKCnN0YXRpYyBpbnQgbm93YXlvdXQgPSBXQVRDSERPR19OT1dBWU9VVDsKbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LAoJCSJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9IgoJCQkJX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX05PV0FZT1VUKSAiKSIpOwoKLyoKICoJS2VybmVsIG1ldGhvZHMuCiAqLwoKI2RlZmluZSBXRFRfRUZFUiAod2R0X2lvKzApICAgLyogRXh0ZW5kZWQgRnVuY3Rpb24gRW5hYmxlIFJlZ2lzdGVycyAqLwojZGVmaW5lIFdEVF9FRklSICh3ZHRfaW8rMCkgICAvKiBFeHRlbmRlZCBGdW5jdGlvbiBJbmRleCBSZWdpc3RlcgoJCQkJCQkJKHNhbWUgYXMgRUZFUikgKi8KI2RlZmluZSBXRFRfRUZEUiAoV0RUX0VGSVIrMSkgLyogRXh0ZW5kZWQgRnVuY3Rpb24gRGF0YSBSZWdpc3RlciAqLwoKc3RhdGljIHZvaWQgdzgzNjI3aGZfc2VsZWN0X3dkX3JlZ2lzdGVyKHZvaWQpCnsKCXVuc2lnbmVkIGNoYXIgYzsKCW91dGJfcCgweDg3LCBXRFRfRUZFUik7IC8qIEVudGVyIGV4dGVuZGVkIGZ1bmN0aW9uIG1vZGUgKi8KCW91dGJfcCgweDg3LCBXRFRfRUZFUik7IC8qIEFnYWluIGFjY29yZGluZyB0byBtYW51YWwgKi8KCglvdXRiKDB4MjAsIFdEVF9FRkVSKTsJLyogY2hlY2sgY2hpcCB2ZXJzaW9uCSovCgljID0gaW5iKFdEVF9FRkRSKTsKCWlmIChjID09IDB4ODIpIHsJLyogVzgzNjI3VEhGCQkqLwoJCW91dGJfcCgweDJiLCBXRFRfRUZFUik7IC8qIHNlbGVjdCBHUElPMyAqLwoJCWMgPSAoKGluYl9wKFdEVF9FRkRSKSAmIDB4ZjcpIHwgMHgwNCk7IC8qIHNlbGVjdCBXRFQwICovCgkJb3V0Yl9wKDB4MmIsIFdEVF9FRkVSKTsKCQlvdXRiX3AoYywgV0RUX0VGRFIpOwkvKiBzZXQgR1BJTzMgdG8gV0RUMCAqLwoJfQoKCW91dGJfcCgweDA3LCBXRFRfRUZFUik7IC8qIHBvaW50IHRvIGxvZ2ljYWwgZGV2aWNlIG51bWJlciByZWcgKi8KCW91dGJfcCgweDA4LCBXRFRfRUZEUik7IC8qIHNlbGVjdCBsb2dpY2FsIGRldmljZSA4IChHUElPMikgKi8KCW91dGJfcCgweDMwLCBXRFRfRUZFUik7IC8qIHNlbGVjdCBDUjMwICovCglvdXRiX3AoMHgwMSwgV0RUX0VGRFIpOyAvKiBzZXQgYml0IDAgdG8gYWN0aXZhdGUgR1BJTzIgKi8KfQoKc3RhdGljIHZvaWQgdzgzNjI3aGZfdW5zZWxlY3Rfd2RfcmVnaXN0ZXIodm9pZCkKewoJb3V0Yl9wKDB4QUEsIFdEVF9FRkVSKTsgLyogTGVhdmUgZXh0ZW5kZWQgZnVuY3Rpb24gbW9kZSAqLwp9CgovKiB0eWFuIG1vdGhlcmJvYXJkcyBzZWVtIHRvIHNldCBGNSB0byAweDRDID8KICogU28gZXhwbGljaXRseSBpbml0IHRvIGFwcHJvcHJpYXRlIHZhbHVlLiAqLwoKc3RhdGljIHZvaWQgdzgzNjI3aGZfaW5pdCh2b2lkKQp7Cgl1bnNpZ25lZCBjaGFyIHQ7CgoJdzgzNjI3aGZfc2VsZWN0X3dkX3JlZ2lzdGVyKCk7CgoJb3V0Yl9wKDB4RjYsIFdEVF9FRkVSKTsgLyogU2VsZWN0IENSRjYgKi8KCXQgPSBpbmJfcChXRFRfRUZEUik7ICAgICAgLyogcmVhZCBDUkY2ICovCglpZiAodCAhPSAwKSB7CgkJcHJpbnRrKEtFUk5fSU5GTyBQRlgKCQkgICAgICJXYXRjaGRvZyBhbHJlYWR5IHJ1bm5pbmcuIFJlc2V0dGluZyB0aW1lb3V0IHRvICVkIHNlY1xuIiwKCQkJCQkJCQl0aW1lb3V0KTsKCQlvdXRiX3AodGltZW91dCwgV0RUX0VGRFIpOyAgICAvKiBXcml0ZSBiYWNrIHRvIENSRjYgKi8KCX0KCglvdXRiX3AoMHhGNSwgV0RUX0VGRVIpOyAvKiBTZWxlY3QgQ1JGNSAqLwoJdCA9IGluYl9wKFdEVF9FRkRSKTsgICAgICAvKiByZWFkIENSRjUgKi8KCXQgJj0gfjB4MEM7ICAgICAgICAgICAgICAgLyogc2V0IHNlY29uZCBtb2RlICYgZGlzYWJsZSBrZXlib2FyZAoJCQkJICAgIHR1cm5pbmcgb2ZmIHdhdGNoZG9nICovCglvdXRiX3AodCwgV0RUX0VGRFIpOyAgICAvKiBXcml0ZSBiYWNrIHRvIENSRjUgKi8KCglvdXRiX3AoMHhGNywgV0RUX0VGRVIpOyAvKiBTZWxlY3QgQ1JGNyAqLwoJdCA9IGluYl9wKFdEVF9FRkRSKTsgICAgICAvKiByZWFkIENSRjcgKi8KCXQgJj0gfjB4QzA7ICAgICAgICAgICAgICAgLyogZGlzYWJsZSBrZXlib2FyZCAmIG1vdXNlIHR1cm5pbmcgb2ZmCgkJCQkgICAgd2F0Y2hkb2cgKi8KCW91dGJfcCh0LCBXRFRfRUZEUik7ICAgIC8qIFdyaXRlIGJhY2sgdG8gQ1JGNyAqLwoKCXc4MzYyN2hmX3Vuc2VsZWN0X3dkX3JlZ2lzdGVyKCk7Cn0KCnN0YXRpYyB2b2lkIHdkdF9jdHJsKGludCB0aW1lb3V0KQp7CglzcGluX2xvY2soJmlvX2xvY2spOwoKCXc4MzYyN2hmX3NlbGVjdF93ZF9yZWdpc3RlcigpOwoKCW91dGJfcCgweEY2LCBXRFRfRUZFUik7ICAgIC8qIFNlbGVjdCBDUkY2ICovCglvdXRiX3AodGltZW91dCwgV0RUX0VGRFIpOyAvKiBXcml0ZSBUaW1lb3V0IGNvdW50ZXIgdG8gQ1JGNiAqLwoKCXc4MzYyN2hmX3Vuc2VsZWN0X3dkX3JlZ2lzdGVyKCk7CgoJc3Bpbl91bmxvY2soJmlvX2xvY2spOwp9CgpzdGF0aWMgaW50IHdkdF9waW5nKHZvaWQpCnsKCXdkdF9jdHJsKHRpbWVvdXQpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2R0X2Rpc2FibGUodm9pZCkKewoJd2R0X2N0cmwoMCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCB3ZHRfc2V0X2hlYXJ0YmVhdChpbnQgdCkKewoJaWYgKHQgPCAxIHx8IHQgPiAyNTUpCgkJcmV0dXJuIC1FSU5WQUw7Cgl0aW1lb3V0ID0gdDsKCXJldHVybiAwOwp9CgpzdGF0aWMgc3NpemVfdCB3ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCgkJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQp7CglpZiAoY291bnQpIHsKCQlpZiAoIW5vd2F5b3V0KSB7CgkJCXNpemVfdCBpOwoKCQkJZXhwZWN0X2Nsb3NlID0gMDsKCgkJCWZvciAoaSA9IDA7IGkgIT0gY291bnQ7IGkrKykgewoJCQkJY2hhciBjOwoJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZiArIGkpKQoJCQkJCXJldHVybiAtRUZBVUxUOwoJCQkJaWYgKGMgPT0gJ1YnKQoJCQkJCWV4cGVjdF9jbG9zZSA9IDQyOwoJCQl9CgkJfQoJCXdkdF9waW5nKCk7Cgl9CglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBsb25nIHdkdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCnsKCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwoJaW50IF9fdXNlciAqcCA9IGFyZ3A7CglpbnQgbmV3X3RpbWVvdXQ7CglzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CgkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8CgkJCQkJCQlXRElPRl9NQUdJQ0NMT1NFLAoJCS5maXJtd2FyZV92ZXJzaW9uID0gMSwKCQkuaWRlbnRpdHkgPSAiVzgzNjI3SEYgV0RUIiwKCX07CgoJc3dpdGNoIChjbWQpIHsKCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpZGVudCwgc2l6ZW9mKGlkZW50KSkpCgkJCXJldHVybiAtRUZBVUxUOwoJCWJyZWFrOwoJY2FzZSBXRElPQ19HRVRTVEFUVVM6CgljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CgkJcmV0dXJuIHB1dF91c2VyKDAsIHApOwoJY2FzZSBXRElPQ19TRVRPUFRJT05TOgoJewoJCWludCBvcHRpb25zLCByZXR2YWwgPSAtRUlOVkFMOwoKCQlpZiAoZ2V0X3VzZXIob3B0aW9ucywgcCkpCgkJCXJldHVybiAtRUZBVUxUOwoJCWlmIChvcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKCQkJd2R0X2Rpc2FibGUoKTsKCQkJcmV0dmFsID0gMDsKCQl9CgkJaWYgKG9wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CgkJCXdkdF9waW5nKCk7CgkJCXJldHZhbCA9IDA7CgkJfQoJCXJldHVybiByZXR2YWw7Cgl9CgljYXNlIFdESU9DX0tFRVBBTElWRToKCQl3ZHRfcGluZygpOwoJCWJyZWFrOwoJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgoJCWlmIChnZXRfdXNlcihuZXdfdGltZW91dCwgcCkpCgkJCXJldHVybiAtRUZBVUxUOwoJCWlmICh3ZHRfc2V0X2hlYXJ0YmVhdChuZXdfdGltZW91dCkpCgkJCXJldHVybiAtRUlOVkFMOwoJCXdkdF9waW5nKCk7CgkJLyogRmFsbCAqLwoJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgoJCXJldHVybiBwdXRfdXNlcih0aW1lb3V0LCBwKTsKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FTk9UVFk7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCB3ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJndkdF9pc19vcGVuKSkKCQlyZXR1cm4gLUVCVVNZOwoJLyoKCSAqCUFjdGl2YXRlCgkgKi8KCgl3ZHRfcGluZygpOwoJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwp9CgpzdGF0aWMgaW50IHdkdF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJaWYgKGV4cGVjdF9jbG9zZSA9PSA0MikKCQl3ZHRfZGlzYWJsZSgpOwoJZWxzZSB7CgkJcHJpbnRrKEtFUk5fQ1JJVCBQRlgKCQkJIlVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyB3YXRjaGRvZyFcbiIpOwoJCXdkdF9waW5nKCk7Cgl9CglleHBlY3RfY2xvc2UgPSAwOwoJY2xlYXJfYml0KDAsICZ3ZHRfaXNfb3Blbik7CglyZXR1cm4gMDsKfQoKLyoKICoJTm90aWZpZXIgZm9yIHN5c3RlbSBkb3duCiAqLwoKc3RhdGljIGludCB3ZHRfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwKCXZvaWQgKnVudXNlZCkKewoJaWYgKGNvZGUgPT0gU1lTX0RPV04gfHwgY29kZSA9PSBTWVNfSEFMVCkKCQl3ZHRfZGlzYWJsZSgpOwkvKiBUdXJuIHRoZSBXRFQgb2ZmICovCgoJcmV0dXJuIE5PVElGWV9ET05FOwp9CgovKgogKglLZXJuZWwgSW50ZXJmYWNlcwogKi8KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdkdF9mb3BzID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLmxsc2VlawkJPSBub19sbHNlZWssCgkud3JpdGUJCT0gd2R0X3dyaXRlLAoJLnVubG9ja2VkX2lvY3RsCT0gd2R0X2lvY3RsLAoJLm9wZW4JCT0gd2R0X29wZW4sCgkucmVsZWFzZQk9IHdkdF9jbG9zZSwKfTsKCnN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3ZHRfbWlzY2RldiA9IHsKCS5taW5vciA9IFdBVENIRE9HX01JTk9SLAoJLm5hbWUgPSAid2F0Y2hkb2ciLAoJLmZvcHMgPSAmd2R0X2ZvcHMsCn07CgovKgogKglUaGUgV0RUIG5lZWRzIHRvIGxlYXJuIGFib3V0IHNvZnQgc2h1dGRvd25zIGluIG9yZGVyIHRvCiAqCXR1cm4gdGhlIHRpbWVib21iIHJlZ2lzdGVycyBvZmYuCiAqLwoKc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB3ZHRfbm90aWZpZXIgPSB7Cgkubm90aWZpZXJfY2FsbCA9IHdkdF9ub3RpZnlfc3lzLAp9OwoKc3RhdGljIGludCBfX2luaXQgd2R0X2luaXQodm9pZCkKewoJaW50IHJldDsKCglwcmludGsoS0VSTl9JTkZPICJXRFQgZHJpdmVyIGZvciB0aGUgV2luYm9uZChUTSkgVzgzNjI3SEYvVEhGL0hHIFN1cGVyIEkvTyBjaGlwIGluaXRpYWxpc2luZy5cbiIpOwoKCWlmICh3ZHRfc2V0X2hlYXJ0YmVhdCh0aW1lb3V0KSkgewoJCXdkdF9zZXRfaGVhcnRiZWF0KFdBVENIRE9HX1RJTUVPVVQpOwoJCXByaW50ayhLRVJOX0lORk8gUEZYCgkJICAgICAidGltZW91dCB2YWx1ZSBtdXN0IGJlIDEgPD0gdGltZW91dCA8PSAyNTUsIHVzaW5nICVkXG4iLAoJCQkJV0FUQ0hET0dfVElNRU9VVCk7Cgl9CgoJaWYgKCFyZXF1ZXN0X3JlZ2lvbih3ZHRfaW8sIDEsIFdBVENIRE9HX05BTUUpKSB7CgkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSS9PIGFkZHJlc3MgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLAoJCQl3ZHRfaW8pOwoJCXJldCA9IC1FSU87CgkJZ290byBvdXQ7Cgl9CgoJdzgzNjI3aGZfaW5pdCgpOwoKCXJldCA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKCWlmIChyZXQgIT0gMCkgewoJCXByaW50ayhLRVJOX0VSUiBQRlgKCQkJImNhbm5vdCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsIHJldCk7CgkJZ290byB1bnJlZ19yZWdpb25zOwoJfQoKCXJldCA9IG1pc2NfcmVnaXN0ZXIoJndkdF9taXNjZGV2KTsKCWlmIChyZXQgIT0gMCkgewoJCXByaW50ayhLRVJOX0VSUiBQRlgKCQkJImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAoJCQkJCQkJV0FUQ0hET0dfTUlOT1IsIHJldCk7CgkJZ290byB1bnJlZ19yZWJvb3Q7Cgl9CgoJcHJpbnRrKEtFUk5fSU5GTyBQRlgKCQkJImluaXRpYWxpemVkLiB0aW1lb3V0PSVkIHNlYyAobm93YXlvdXQ9JWQpXG4iLAoJCQkJCQkJdGltZW91dCwgbm93YXlvdXQpOwoKb3V0OgoJcmV0dXJuIHJldDsKdW5yZWdfcmVib290OgoJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CnVucmVnX3JlZ2lvbnM6CglyZWxlYXNlX3JlZ2lvbih3ZHRfaW8sIDEpOwoJZ290byBvdXQ7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCB3ZHRfZXhpdCh2b2lkKQp7CgltaXNjX2RlcmVnaXN0ZXIoJndkdF9taXNjZGV2KTsKCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOwoJcmVsZWFzZV9yZWdpb24od2R0X2lvLCAxKTsKfQoKbW9kdWxlX2luaXQod2R0X2luaXQpOwptb2R1bGVfZXhpdCh3ZHRfZXhpdCk7CgpNT0RVTEVfTElDRU5TRSgiR1BMIik7Ck1PRFVMRV9BVVRIT1IoIlDhZHJhaWcgQnJhZHkgPFBAZHJhaWdCcmFkeS5jb20+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigidzgzNjI3aGYvdGhmIFdEVCBkcml2ZXIiKTsKTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwo=