LyoKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBpMmMtYWRhcC1pdGUuYyBpMmMtaHcgYWNjZXNzIGZvciB0aGUgSUlDIHBlcmlwaGVyYWwgb24gdGhlIElURSBNSVBTIHN5c3RlbQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEhhaS1QYW8gRmFuLCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCiAgIGhwZmFuQG12aXN0YS5jb20gb3Igc291cmNlQG12aXN0YS5jb20KCiAgIENvcHlyaWdodCAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgoKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBUaGlzIGZpbGUgd2FzIGhpZ2hseSBsZXZlcmFnZWQgZnJvbSBpMmMtZWxla3Rvci5jLCB3aGljaCB3YXMgY3JlYXRlZAogICBieSBTaW1vbiBHLiBWb2dsIGFuZCBIYW5zIEJlcmdsdW5kOgoKIAogICAgIENvcHlyaWdodCAoQykgMTk5NS05NyBTaW1vbiBHLiBWb2dsCiAgICAgICAgICAgICAgICAgICAxOTk4LTk5IEhhbnMgQmVyZ2x1bmQKCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4JCSAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogV2l0aCBzb21lIGNoYW5nZXMgZnJvbSBLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4gYW5kIGV2ZW4KICAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiAqLwoKI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGFzbS9pcnEuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgoKI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgojaW5jbHVkZSA8bGludXgvaTJjLWFsZ28taXRlLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMtYWRhcC1pdGUuaD4KI2luY2x1ZGUgIi4uL2kyYy1pdGUuaCIKCiNkZWZpbmUgREVGQVVMVF9CQVNFICAweDE0MDE0MDMwCiNkZWZpbmUgSVRFX0lJQ19JT19TSVpFCTB4NDAKI2RlZmluZSBERUZBVUxUX0lSUSAgIDAKI2RlZmluZSBERUZBVUxUX0NMT0NLIDB4MWIwZQkvKiBkZWZhdWx0IDE2TUh6LygyNysxNCkgPSA0MDBLSHogKi8KI2RlZmluZSBERUZBVUxUX09XTiAgIDB4NTUKCnN0YXRpYyBpbnQgYmFzZTsKc3RhdGljIGludCBpcnE7CnN0YXRpYyBpbnQgY2xvY2s7CnN0YXRpYyBpbnQgb3duOwoKc3RhdGljIHN0cnVjdCBpaWNfaXRlIGdwaTsKc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IGlpY193YWl0OwpzdGF0aWMgaW50IGlpY19wZW5kaW5nOwpzdGF0aWMgc3BpbmxvY2tfdCBsb2NrOwoKLyogLS0tLS0gbG9jYWwgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KCnN0YXRpYyB2b2lkIGlpY19pdGVfc2V0aWljKHZvaWQgKmRhdGEsIGludCBjdGwsIHNob3J0IHZhbCkKewogICAgICAgIHVuc2lnbmVkIGxvbmcgaiA9IGppZmZpZXMgKyAxMDsKCglwcl9kZWJ1ZygiIFdyaXRlIDB4JTAyeCB0byAweCV4XG4iLCh1bnNpZ25lZCBzaG9ydCl2YWwsIGN0bCYweGZmKTsKI2lmZGVmIERFQlVHCgl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgaikpCgkJc2NoZWR1bGUoKTsKI2VuZGlmCglvdXR3KHZhbCxjdGwpOwp9CgpzdGF0aWMgc2hvcnQgaWljX2l0ZV9nZXRpaWModm9pZCAqZGF0YSwgaW50IGN0bCkKewoJc2hvcnQgdmFsOwoKCXZhbCA9IGludyhjdGwpOwoJcHJfZGVidWcoIlJlYWQgMHglMDJ4IGZyb20gMHgleFxuIiwodW5zaWduZWQgc2hvcnQpdmFsLCBjdGwmMHhmZik7CglyZXR1cm4gKHZhbCk7Cn0KCi8qIFJldHVybiBvdXIgc2xhdmUgYWRkcmVzcy4gIFRoaXMgaXMgdGhlIGFkZHJlc3MKICogcHV0IG9uIHRoZSBJMkMgYnVzIHdoZW4gYW5vdGhlciBtYXN0ZXIgb24gdGhlIGJ1cyB3YW50cyB0byBhZGRyZXNzIHVzCiAqIGFzIGEgc2xhdmUKICovCnN0YXRpYyBpbnQgaWljX2l0ZV9nZXRvd24odm9pZCAqZGF0YSkKewoJcmV0dXJuIChncGkuaWljX293bik7Cn0KCgpzdGF0aWMgaW50IGlpY19pdGVfZ2V0Y2xvY2sodm9pZCAqZGF0YSkKewoJcmV0dXJuIChncGkuaWljX2Nsb2NrKTsKfQoKCi8qIFB1dCB0aGlzIHByb2Nlc3MgdG8gc2xlZXAuICBXZSB3aWxsIHdha2UgdXAgd2hlbiB0aGUKICogSUlDIGNvbnRyb2xsZXIgaW50ZXJydXB0cy4KICovCnN0YXRpYyB2b2lkIGlpY19pdGVfd2FpdGZvcnBpbih2b2lkKSB7CgogICBpbnQgdGltZW91dCA9IDI7CiAgIGxvbmcgZmxhZ3M7CgogICAvKiBJZiBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkICh3aGljaCB0aGV5IGFyZSksIHRoZW4gcHV0IHRoZSBwcm9jZXNzIHRvCiAgICAqIHNsZWVwLiAgVGhpcyBwcm9jZXNzIHdpbGwgYmUgYXdha2VuZWQgYnkgdHdvIGV2ZW50cyAtLSBlaXRoZXIgdGhlCiAgICAqIHRoZSBJSUMgcGVyaXBoZXJhbCBpbnRlcnJ1cHRzIG9yIHRoZSB0aW1lb3V0IGV4cGlyZXMuIAogICAgKiBJZiBpbnRlcnJ1cHRzIGFyZSBub3QgZW5hYmxlZCB0aGVuIGRlbGF5IGZvciBhIHJlYXNvbmFibGUgYW1vdW50IAogICAgKiBvZiB0aW1lIGFuZCByZXR1cm4uCiAgICAqLwogICBpZiAoZ3BpLmlpY19pcnEgPiAwKSB7CglzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOwoJaWYgKGlpY19wZW5kaW5nID09IDApIHsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CgkJaWYgKGludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmaWljX3dhaXQsIHRpbWVvdXQqSFopKSB7CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CgkJCWlmIChpaWNfcGVuZGluZyA9PSAxKSB7CgkJCQlpaWNfcGVuZGluZyA9IDA7CgkJCX0KCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOwoJCX0KCX0gZWxzZSB7CgkJaWljX3BlbmRpbmcgPSAwOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKCX0KICAgfSBlbHNlIHsKICAgICAgdWRlbGF5KDEwMCk7CiAgIH0KfQoKCnN0YXRpYyBpcnFyZXR1cm5fdCBpaWNfaXRlX2hhbmRsZXIoaW50IHRoaXNfaXJxLCB2b2lkICpkZXZfaWQsCgkJCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKewoJc3Bpbl9sb2NrKCZsb2NrKTsKCWlpY19wZW5kaW5nID0gMTsKCXNwaW5fdW5sb2NrKCZsb2NrKTsKCgl3YWtlX3VwX2ludGVycnVwdGlibGUoJmlpY193YWl0KTsKCglyZXR1cm4gSVJRX0hBTkRMRUQ7Cn0KCgovKiBMb2NrIHRoZSByZWdpb24gb2YgbWVtb3J5IHdoZXJlIEkvTyByZWdpc3RlcnMgZXhpc3QuICBSZXF1ZXN0IG91cgogKiBpbnRlcnJ1cHQgbGluZSBhbmQgcmVnaXN0ZXIgaXRzIGFzc29jaWF0ZWQgaGFuZGxlci4KICovCnN0YXRpYyBpbnQgaWljX2h3X3Jlc3JjX2luaXQodm9pZCkKewoJaWYgKCFyZXF1ZXN0X3JlZ2lvbihncGkuaWljX2Jhc2UsIElURV9JSUNfSU9fU0laRSwgImkyYyIpKQoJCXJldHVybiAtRU5PREVWOwogIAoJaWYgKGdwaS5paWNfaXJxIDw9IDApCgkJcmV0dXJuIDA7CgoJaWYgKHJlcXVlc3RfaXJxKGdwaS5paWNfaXJxLCBpaWNfaXRlX2hhbmRsZXIsIDAsICJJVEUgSUlDIiwgMCkgPCAwKQoJCWdwaS5paWNfaXJxID0gMDsKCWVsc2UKCQllbmFibGVfaXJxKGdwaS5paWNfaXJxKTsKCglyZXR1cm4gMDsKfQoKCnN0YXRpYyB2b2lkIGlpY19pdGVfcmVsZWFzZSh2b2lkKQp7CglpZiAoZ3BpLmlpY19pcnEgPiAwKSB7CgkJZGlzYWJsZV9pcnEoZ3BpLmlpY19pcnEpOwoJCWZyZWVfaXJxKGdwaS5paWNfaXJxLCAwKTsKCX0KCXJlbGVhc2VfcmVnaW9uKGdwaS5paWNfYmFzZSAsIDIpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRW5jYXBzdWxhdGUgdGhlIGFib3ZlIGZ1bmN0aW9ucyBpbiB0aGUgY29ycmVjdCBvcGVyYXRpb25zIHN0cnVjdHVyZS4KICogVGhpcyBpcyBvbmx5IGRvbmUgd2hlbiBtb3JlIHRoYW4gb25lIGhhcmR3YXJlIGFkYXB0ZXIgaXMgc3VwcG9ydGVkLgogKi8Kc3RhdGljIHN0cnVjdCBpMmNfYWxnb19paWNfZGF0YSBpaWNfaXRlX2RhdGEgPSB7CglOVUxMLAoJaWljX2l0ZV9zZXRpaWMsCglpaWNfaXRlX2dldGlpYywKCWlpY19pdGVfZ2V0b3duLAoJaWljX2l0ZV9nZXRjbG9jaywKCWlpY19pdGVfd2FpdGZvcnBpbiwKCTgwLCA4MCwgMTAwLAkJLyoJd2FpdHMsIHRpbWVvdXQgKi8KfTsKCnN0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgaWljX2l0ZV9vcHMgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkuaWQJCT0gSTJDX0hXX0lfSUlDLAoJLmFsZ29fZGF0YQk9ICZpaWNfaXRlX2RhdGEsCgkuZGV2CQk9IHsKCQkubmFtZQk9ICJJVEUgSUlDIGFkYXB0ZXIiLAoJfSwKfTsKCi8qIENhbGxlZCB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkLiAgVGhpcyBmdW5jdGlvbiBzdGFydHMgdGhlCiAqIGNhc2NhZGUgb2YgY2FsbHMgdXAgdGhyb3VnaCB0aGUgaGllcmFyY2h5IG9mIGkyYyBtb2R1bGVzIChpLmUuIHVwIHRvIHRoZQogKiAgYWxnb3JpdGhtIGxheWVyIGFuZCBpbnRvIHRvIHRoZSBjb3JlIGxheWVyKQogKi8Kc3RhdGljIGludCBfX2luaXQgaWljX2l0ZV9pbml0KHZvaWQpIAp7CgoJc3RydWN0IGlpY19pdGUgKnBpaWMgPSAmZ3BpOwoKCXByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpemUgSVRFIElJQyBhZGFwdGVyIG1vZHVsZVxuIik7CglpZiAoYmFzZSA9PSAwKQoJCXBpaWMtPmlpY19iYXNlID0gREVGQVVMVF9CQVNFOwoJZWxzZQoJCXBpaWMtPmlpY19iYXNlID0gYmFzZTsKCglpZiAoaXJxID09IDApCgkJcGlpYy0+aWljX2lycSA9IERFRkFVTFRfSVJROwoJZWxzZQoJCXBpaWMtPmlpY19pcnEgPSBpcnE7CgoJaWYgKGNsb2NrID09IDApCgkJcGlpYy0+aWljX2Nsb2NrID0gREVGQVVMVF9DTE9DSzsKCWVsc2UKCQlwaWljLT5paWNfY2xvY2sgPSBjbG9jazsKCglpZiAob3duID09IDApCgkJcGlpYy0+aWljX293biA9IERFRkFVTFRfT1dOOwoJZWxzZQoJCXBpaWMtPmlpY19vd24gPSBvd247CgoJaWljX2l0ZV9kYXRhLmRhdGEgPSAodm9pZCAqKXBpaWM7Cglpbml0X3dhaXRxdWV1ZV9oZWFkKCZpaWNfd2FpdCk7CglzcGluX2xvY2tfaW5pdCgmbG9jayk7CglpZiAoaWljX2h3X3Jlc3JjX2luaXQoKSA9PSAwKSB7CgkJaWYgKGkyY19paWNfYWRkX2J1cygmaWljX2l0ZV9vcHMpIDwgMCkKCQkJcmV0dXJuIC1FTk9ERVY7Cgl9IGVsc2UgewoJCXJldHVybiAtRU5PREVWOwoJfQoJcHJpbnRrKEtFUk5fSU5GTyAiIGZvdW5kIGRldmljZSBhdCAlI3ggaXJxICVkLlxuIiwgCgkJcGlpYy0+aWljX2Jhc2UsIHBpaWMtPmlpY19pcnEpOwoJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgdm9pZCBpaWNfaXRlX2V4aXQodm9pZCkKewoJaTJjX2lpY19kZWxfYnVzKCZpaWNfaXRlX29wcyk7CiAgICAgICAgaWljX2l0ZV9yZWxlYXNlKCk7Cn0KCi8qIElmIG1vZHVsZXMgaXMgTk9UIGRlZmluZWQgd2hlbiB0aGlzIGZpbGUgaXMgY29tcGlsZWQsIHRoZW4gdGhlIE1PRFVMRV8qCiAqIG1hY3JvcyB3aWxsIHJlc29sdmUgdG8gbm90aGluZwogKi8KTU9EVUxFX0FVVEhPUigiTW9udGFWaXN0YSBTb2Z0d2FyZSA8d3d3Lm12aXN0YS5jb20+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiSTJDLUJ1cyBhZGFwdGVyIHJvdXRpbmVzIGZvciBJVEUgSUlDIGJ1cyBhZGFwdGVyIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCm1vZHVsZV9wYXJhbShiYXNlLCBpbnQsIDApOwptb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOwptb2R1bGVfcGFyYW0oY2xvY2ssIGludCwgMCk7Cm1vZHVsZV9wYXJhbShvd24sIGludCwgMCk7CgoKLyogQ2FsbGVkIHdoZW4gbW9kdWxlIGlzIGxvYWRlZCBvciB3aGVuIGtlcm5lbCBpcyBpbml0aWFsaXplZC4KICogSWYgTU9EVUxFUyBpcyBkZWZpbmVkIHdoZW4gdGhpcyBmaWxlIGlzIGNvbXBpbGVkLCB0aGVuIHRoaXMgZnVuY3Rpb24gd2lsbAogKiByZXNvbHZlIHRvIGluaXRfbW9kdWxlICh0aGUgZnVuY3Rpb24gY2FsbGVkIHdoZW4gaW5zbW9kIGlzIGludm9rZWQgZm9yIGEKICogbW9kdWxlKS4gIE90aGVyd2lzZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZWFybHkgaW4gdGhlIGJvb3QsIHdoZW4gdGhlCiAqIGtlcm5lbCBpcyBpbnRpYWxpemVkLiAgQ2hlY2sgb3V0IC9pbmNsdWRlL2luaXQuaCB0byBzZWUgaG93IHRoaXMgd29ya3MuCiAqLwptb2R1bGVfaW5pdChpaWNfaXRlX2luaXQpOwoKLyogUmVzb2x2ZXMgdG8gbW9kdWxlX2NsZWFudXAgd2hlbiBNT0RVTEVTIGlzIGRlZmluZWQuICovCm1vZHVsZV9leGl0KGlpY19pdGVfZXhpdCk7IAo=