LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDb3B5cmlnaHQgqTIwMTIgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KDQpSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQoNCiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQoNClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRg0KTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQpTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pDQpIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsDQpFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgojaWZuZGVmIF9fT1BFTkNMX0NMX0FHRU5UX0FNRF9ICiNkZWZpbmUgX19PUEVOQ0xfQ0xfQUdFTlRfQU1EX0gKCiNpbmNsdWRlIDxDTC9jbC5oPgojaW5jbHVkZSAiY2xfaWNkX2FtZC5oIgoKI2RlZmluZSBjbF9hbWRfYWdlbnQgMQoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIgewojZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KCnR5cGVkZWYgY29uc3Qgc3RydWN0IF9jbF9hZ2VudCBjbF9hZ2VudDsKCiNkZWZpbmUgQ0xfQUdFTlRfVkVSU0lPTl8xXzAgMTAwCgovKiBDb250ZXh0IENhbGxiYWNrcyAqLwoKdHlwZWRlZiB2b2lkIChDTF9DQUxMQkFDSyAqIGFjQ29udGV4dENyZWF0ZV9mbikoCiAgICBjbF9hZ2VudCAqIC8qIGFnZW50ICovLAogICAgY2xfY29udGV4dCAvKiBjb250ZXh0ICovKTsKCnR5cGVkZWYgdm9pZCAoQ0xfQ0FMTEJBQ0sgKiBhY0NvbnRleHRGcmVlX2ZuKSgKICAgIGNsX2FnZW50ICogLyogYWdlbnQgKi8sCiAgICBjbF9jb250ZXh0IC8qIGNvbnRleHQgKi8pOwoKLyogQ29tbWFuZCBRdWV1ZSBDYWxsYmFja3MgKi8KCnR5cGVkZWYgdm9pZCAoQ0xfQ0FMTEJBQ0sgKiBhY0NvbW1hbmRRdWV1ZUNyZWF0ZV9mbikoCiAgICBjbF9hZ2VudCAqICAgICAgIC8qIGFnZW50ICovLAogICAgY2xfY29tbWFuZF9xdWV1ZSAvKiBxdWV1ZSAqLyk7Cgp0eXBlZGVmIHZvaWQgKENMX0NBTExCQUNLICogYWNDb21tYW5kUXVldWVGcmVlX2ZuKSgKICAgIGNsX2FnZW50ICogICAgICAgLyogYWdlbnQgKi8sCiAgICBjbF9jb21tYW5kX3F1ZXVlIC8qIHF1ZXVlICovKTsKCi8qIEV2ZW50IENhbGxiYWNrcyAqLwoKdHlwZWRlZiB2b2lkIChDTF9DQUxMQkFDSyAqIGFjRXZlbnRDcmVhdGVfZm4pKAogICAgY2xfYWdlbnQgKiAgICAgIC8qIGFnZW50ICovLAogICAgY2xfZXZlbnQgICAgICAgIC8qIGV2ZW50ICovLAogICAgY2xfY29tbWFuZF90eXBlIC8qIHR5cGUgKi8pOwoKdHlwZWRlZiB2b2lkIChDTF9DQUxMQkFDSyAqIGFjRXZlbnRGcmVlX2ZuKSgKICAgIGNsX2FnZW50ICogLyogYWdlbnQgKi8sCiAgICBjbF9ldmVudCAgIC8qIGV2ZW50ICovKTsKCnR5cGVkZWYgdm9pZCAoQ0xfQ0FMTEJBQ0sgKiBhY0V2ZW50U3RhdHVzQ2hhbmdlZF9mbikoCiAgICBjbF9hZ2VudCAqIC8qIGFnZW50ICovLAogICAgY2xfZXZlbnQgICAvKiBldmVudCAqLywKICAgIGNsX2ludCAgICAgLyogZXhlY3V0aW9uX3N0YXR1cyAqLywKICAgIGNsX2xvbmcgICAgLyogZXBvY2hfdGltZV9zdGFtcCAqLyk7CgovKiBNZW1vcnkgT2JqZWN0IENhbGxiYWNrcyAqLwoKdHlwZWRlZiB2b2lkIChDTF9DQUxMQkFDSyAqIGFjTWVtT2JqZWN0Q3JlYXRlX2ZuKSgKICAgIGNsX2FnZW50ICogLyogYWdlbnQgKi8sCiAgICBjbF9tZW0gICAgIC8qIG1lbW9iaiAqLyk7Cgp0eXBlZGVmIHZvaWQgKENMX0NBTExCQUNLICogYWNNZW1PYmplY3RGcmVlX2ZuKSgKICAgIGNsX2FnZW50ICogLyogYWdlbnQgKi8sCiAgICBjbF9tZW0gICAgIC8qIG1lbW9iaiAqLyk7Cgp0eXBlZGVmIHZvaWQgKENMX0NBTExCQUNLICogYWNNZW1PYmplY3RBY3F1aXJlZF9mbikoCiAgICBjbF9hZ2VudCAqICAgLyogYWdlbnQgKi8sCiAgICBjbF9tZW0gICAgICAgLyogbWVtb2JqICovLAogICAgY2xfZGV2aWNlX2lkIC8qIGRldmljZSAqLywKICAgIGNsX2xvbmcgICAgICAvKiBlbGFwc2VkX3RpbWUgKi8pOwoKLyogU2FtcGxlciBDYWxsYmFja3MgKi8KCnR5cGVkZWYgdm9pZCAoQ0xfQ0FMTEJBQ0sgKiBhY1NhbXBsZXJDcmVhdGVfZm4pKAogICAgY2xfYWdlbnQgKiAvKiBhZ2VudCAqLywKICAgIGNsX3NhbXBsZXIgLyogc2FtcGxlciAqLyk7Cgp0eXBlZGVmIHZvaWQgKENMX0NBTExCQUNLICogYWNTYW1wbGVyRnJlZV9mbikoCiAgICBjbF9hZ2VudCAqIC8qIGFnZW50ICovLAogICAgY2xfc2FtcGxlciAvKiBzYW1wbGVyICovKTsKCi8qIFByb2dyYW0gQ2FsbGJhY2tzICovCgp0eXBlZGVmIHZvaWQgKENMX0NBTExCQUNLICogYWNQcm9ncmFtQ3JlYXRlX2ZuKSgKICAgIGNsX2FnZW50ICogLyogYWdlbnQgKi8sCiAgICBjbF9wcm9ncmFtIC8qIHByb2dyYW0gKi8pOwoKdHlwZWRlZiB2b2lkIChDTF9DQUxMQkFDSyAqIGFjUHJvZ3JhbUZyZWVfZm4pKAogICAgY2xfYWdlbnQgKiAvKiBhZ2VudCAqLywKICAgIGNsX3Byb2dyYW0gLyogcHJvZ3JhbSAqLyk7Cgp0eXBlZGVmIHZvaWQgKENMX0NBTExCQUNLICogYWNQcm9ncmFtQnVpbGRfZm4pKAogICAgY2xfYWdlbnQgKiAvKiBhZ2VudCAqLywKICAgIGNsX3Byb2dyYW0gLyogcHJvZ3JhbSAqLyk7CgovKiBLZXJuZWwgQ2FsbGJhY2tzICovCgp0eXBlZGVmIHZvaWQgKENMX0NBTExCQUNLICogYWNLZXJuZWxDcmVhdGVfZm4pKAogICAgY2xfYWdlbnQgKiAvKiBhZ2VudCAqLywKICAgIGNsX2tlcm5lbCAgLyoga2VybmVsICovKTsKCnR5cGVkZWYgdm9pZCAoQ0xfQ0FMTEJBQ0sgKiBhY0tlcm5lbEZyZWVfZm4pKAogICAgY2xfYWdlbnQgKiAvKiBhZ2VudCAqLywKICAgIGNsX2tlcm5lbCAgLyoga2VybmVsICovKTsKCnR5cGVkZWYgdm9pZCAoQ0xfQ0FMTEJBQ0sgKiBhY0tlcm5lbFNldEFyZ19mbikoCiAgICBjbF9hZ2VudCAqICAgLyogYWdlbnQgKi8sCiAgICBjbF9rZXJuZWwgICAgLyoga2VybmVsICovLAogICAgY2xfaW50ICAgICAgIC8qIGFyZ19pbmRleCAqLywKICAgIHNpemVfdCAgICAgICAvKiBzaXplICovLAogICAgY29uc3Qgdm9pZCAqIC8qIHZhbHVlX3B0ciAqLyk7Cgp0eXBlZGVmIHN0cnVjdCBfY2xfYWdlbnRfY2FsbGJhY2tzCnsKICAgIC8qIENvbnRleHQgQ2FsbGJhY2tzICovCiAgICBhY0NvbnRleHRDcmVhdGVfZm4gICAgIENvbnRleHRDcmVhdGU7CiAgICBhY0NvbnRleHRGcmVlX2ZuICAgICAgIENvbnRleHRGcmVlOwoKICAgLyogQ29tbWFuZCBRdWV1ZSBDYWxsYmFja3MgKi8KICAgYWNDb21tYW5kUXVldWVDcmVhdGVfZm4gQ29tbWFuZFF1ZXVlQ3JlYXRlOwogICBhY0NvbW1hbmRRdWV1ZUZyZWVfZm4gICBDb21tYW5kUXVldWVGcmVlOwoKICAgLyogRXZlbnQgQ2FsbGJhY2tzICovCiAgIGFjRXZlbnRDcmVhdGVfZm4gICAgICAgIEV2ZW50Q3JlYXRlOwogICBhY0V2ZW50RnJlZV9mbiAgICAgICAgICBFdmVudEZyZWU7CiAgIGFjRXZlbnRTdGF0dXNDaGFuZ2VkX2ZuIEV2ZW50U3RhdHVzQ2hhbmdlZDsKCiAgIC8qIE1lbW9yeSBPYmplY3QgQ2FsbGJhY2tzICovCiAgIGFjTWVtT2JqZWN0Q3JlYXRlX2ZuICAgIE1lbU9iamVjdENyZWF0ZTsKICAgYWNNZW1PYmplY3RGcmVlX2ZuICAgICAgTWVtT2JqZWN0RnJlZTsKICAgYWNNZW1PYmplY3RBY3F1aXJlZF9mbiAgTWVtT2JqZWN0QWNxdWlyZWQ7CgogICAvKiBTYW1wbGVyIENhbGxiYWNrcyAqLwogICBhY1NhbXBsZXJDcmVhdGVfZm4gICAgICBTYW1wbGVyQ3JlYXRlOwogICBhY1NhbXBsZXJGcmVlX2ZuICAgICAgICBTYW1wbGVyRnJlZTsKCiAgIC8qIFByb2dyYW0gQ2FsbGJhY2tzICovCiAgIGFjUHJvZ3JhbUNyZWF0ZV9mbiAgICAgIFByb2dyYW1DcmVhdGU7CiAgIGFjUHJvZ3JhbUZyZWVfZm4gICAgICAgIFByb2dyYW1GcmVlOwogICBhY1Byb2dyYW1CdWlsZF9mbiAgICAgICBQcm9ncmFtQnVpbGQ7CgogICAvKiBLZXJuZWwgQ2FsbGJhY2tzICovCiAgIGFjS2VybmVsQ3JlYXRlX2ZuICAgICAgIEtlcm5lbENyZWF0ZTsKICAgYWNLZXJuZWxGcmVlX2ZuICAgICAgICAgS2VybmVsRnJlZTsKICAgYWNLZXJuZWxTZXRBcmdfZm4gICAgICAgS2VybmVsU2V0QXJnOwoKfSBjbF9hZ2VudF9jYWxsYmFja3M7Cgp0eXBlZGVmIGNsX3VpbnQgY2xfYWdlbnRfY2FwYWJpbGl0eV9hY3Rpb247CgojZGVmaW5lIENMX0FHRU5UX0FERF9DQVBBQklMSVRJRVMgICAgICAgIDB4MAojZGVmaW5lIENMX0FHRU5UX1JFTElOUVVJU0hfQ0FQQUJJTElUSUVTIDB4MQoKdHlwZWRlZiBzdHJ1Y3QgX2NsX2FnZW50X2NhcGFiaWxpdGllcwp7CiAgICBjbF9iaXRmaWVsZCBjYW5HZW5lcmF0ZUNvbnRleHRFdmVudHMgICAgICA6IDE7CiAgICBjbF9iaXRmaWVsZCBjYW5HZW5lcmF0ZUNvbW1hbmRRdWV1ZUV2ZW50cyA6IDE7CiAgICBjbF9iaXRmaWVsZCBjYW5HZW5lcmF0ZUV2ZW50RXZlbnRzICAgICAgICA6IDE7CiAgICBjbF9iaXRmaWVsZCBjYW5HZW5lcmF0ZU1lbU9iamVjdEV2ZW50cyAgICA6IDE7CiAgICBjbF9iaXRmaWVsZCBjYW5HZW5lcmF0ZVNhbXBsZXJFdmVudHMgICAgICA6IDE7CiAgICBjbF9iaXRmaWVsZCBjYW5HZW5lcmF0ZVByb2dyYW1FdmVudHMgICAgICA6IDE7CiAgICBjbF9iaXRmaWVsZCBjYW5HZW5lcmF0ZUtlcm5lbEV2ZW50cyAgICAgICA6IDE7Cgp9IGNsX2FnZW50X2NhcGFiaWxpdGllczsKCnN0cnVjdCBfY2xfYWdlbnQKewogICAgY2xfaW50IChDTF9BUElfQ0FMTCAqIEdldFZlcnNpb25OdW1iZXIpKAogICAgICAgIGNsX2FnZW50ICogLyogYWdlbnQgKi8sCiAgICAgICAgY2xfaW50ICogICAvKiB2ZXJzaW9uX3JldCAqLyk7CgogICAgY2xfaW50IChDTF9BUElfQ0FMTCAqIEdldFBsYXRmb3JtKSgKICAgICAgICBjbF9hZ2VudCAqICAgICAgIC8qIGFnZW50ICovLAogICAgICAgIGNsX3BsYXRmb3JtX2lkICogLyogcGxhdGZvcm1faWRfcmV0ICovKTsKCiAgICBjbF9pbnQgKENMX0FQSV9DQUxMICogR2V0VGltZSkgKAogICAgICAgIGNsX2FnZW50ICogLyogYWdlbnQgKi8sCiAgICAgICAgY2xfbG9uZyAqICAvKiB0aW1lX25hbm9zICovKTsKCiAgICBjbF9pbnQgKENMX0FQSV9DQUxMICogU2V0Q2FsbGJhY2tzKSgKICAgICAgICBjbF9hZ2VudCAqICAgICAgICAgICAgICAgICAvKiBhZ2VudCAqLywKICAgICAgICBjb25zdCBjbF9hZ2VudF9jYWxsYmFja3MgKiAvKiBjYWxsYmFja3MgKi8sCiAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAqLyk7CgoKICAgIGNsX2ludCAoQ0xfQVBJX0NBTEwgKiBHZXRQb3RlbnRpYWxDYXBhYmlsaXRpZXMpKAogICAgICAgIGNsX2FnZW50ICogICAgICAgICAgICAgIC8qIGFnZW50ICovLAogICAgICAgIGNsX2FnZW50X2NhcGFiaWxpdGllcyAqIC8qIGNhcGFiaWxpdGllcyAqLyk7CgogICAgY2xfaW50IChDTF9BUElfQ0FMTCAqIEdldENhcGFiaWxpdGllcykoCiAgICAgICAgY2xfYWdlbnQgKiAgICAgICAgICAgICAgLyogYWdlbnQgKi8sCiAgICAgICAgY2xfYWdlbnRfY2FwYWJpbGl0aWVzICogLyogY2FwYWJpbGl0aWVzICovKTsKCiAgICBjbF9pbnQgKENMX0FQSV9DQUxMICogU2V0Q2FwYWJpbGl0aWVzKSgKICAgICAgICBjbF9hZ2VudCAqICAgICAgICAgICAgICAgICAgICAvKiBhZ2VudCAqLywKICAgICAgICBjb25zdCBjbF9hZ2VudF9jYXBhYmlsaXRpZXMgKiAvKiBjYXBhYmlsaXRpZXMgKi8sCiAgICAgICAgY2xfYWdlbnRfY2FwYWJpbGl0eV9hY3Rpb24gICAgLyogYWN0aW9uICovKTsKCgogICAgY2xfaW50IChDTF9BUElfQ0FMTCAqIEdldElDRERpc3BhdGNoVGFibGUpKAogICAgICAgIGNsX2FnZW50ICogICAgICAgICAgICAgIC8qIGFnZW50ICovLAogICAgICAgIGNsX2ljZF9kaXNwYXRjaF90YWJsZSAqIC8qIHRhYmxlICovLAogICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIC8qIHNpemUgKi8pOwoKICAgIGNsX2ludCAoQ0xfQVBJX0NBTEwgKiBTZXRJQ0REaXNwYXRjaFRhYmxlKSgKICAgICAgICBjbF9hZ2VudCAqICAgICAgICAgICAgICAgICAgICAvKiBhZ2VudCAqLywKICAgICAgICBjb25zdCBjbF9pY2RfZGlzcGF0Y2hfdGFibGUgKiAvKiB0YWJsZSAqLywKICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICovKTsKCiAgICAvKiBhZGQgS2VybmVsL1Byb2dyYW0gaGVscGVyIGZ1bmN0aW9ucywgZXRjLi4uICovCn07CgpleHRlcm4gY2xfaW50IENMX0NBTExCQUNLCmNsQWdlbnRfT25Mb2FkKGNsX2FnZW50ICogLyogYWdlbnQgKi8pOwoKZXh0ZXJuIHZvaWQgQ0xfQ0FMTEJBQ0sKY2xBZ2VudF9PblVubG9hZChjbF9hZ2VudCAqIC8qIGFnZW50ICovKTsKCiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwoKI2VuZGlmIC8qIF9fT1BFTkNMX0NMX0FHRU5UX0FNRF9IICovCg==