LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDb3B5cmlnaHQgqTIwMTIgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KDQpSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQoNCiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQoNClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRg0KTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQpTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pDQpIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsDQpFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgojaWZuZGVmIF9fQ0xfVEhSRUFEX1RSQUNFX0FNRF9ICiNkZWZpbmUgX19DTF9USFJFQURfVFJBQ0VfQU1EX0gKCiNpbmNsdWRlICJDTC9jbF9wbGF0Zm9ybS5oIgoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIgewojZW5kaWYgLypfX2NwbHVzcGx1cyovCgp0eXBlZGVmIHN0cnVjdCBfY2xfdGhyZWFkdHJhY2VfYW1kICogY2xfdGhyZWFkdHJhY2VfYW1kOwp0eXBlZGVmIGNsX3VpbnQgY2xfdGhyZWFkX3RyYWNlX3BhcmFtOwp0eXBlZGVmIGNsX3VpbnQgY2xfdGhyZWFkdHJhY2VfaW5mbzsKCi8qIGNsX2NvbW1hbmRfdHlwZSAqLwojZGVmaW5lIENMX0NPTU1BTkRfVEhSRUFEX1RSQUNFX01FTSAweDQ1MDAKI2RlZmluZSBDTF9DT01NQU5EX1RIUkVBRF9UUkFDRSAgICAgMHg0NTAxCgovKiBjbF90aHJlYWR0cmFjZV9jb21tYW5kX25hbWVfYW1kIGVudW1lcmF0aW9uICovCnR5cGVkZWYgZW51bSAgX2NsX3RocmVhZHRyYWNlX2NvbW1hbmRfbmFtZV9hbWQgewogICAgQ0xfVEhSRUFEX1RSQUNFX0JFR0lOX0NPTU1BTkQsCiAgICBDTF9USFJFQURfVFJBQ0VfRU5EX0NPTU1BTkQsCiAgICBDTF9USFJFQURfVFJBQ0VfUEFVU0VfQ09NTUFORCwKICAgIENMX1RIUkVBRF9UUkFDRV9SRVNVTUVfQ09NTUFORAp9IGNsX3RocmVhZHRyYWNlX2NvbW1hbmRfbmFtZV9hbWQ7CgovLyBUaHJlYWQgdHJhY2UgcGFyYW1ldGVycwplbnVtIFRocmVhZFRyYWNlUGFyYW1ldGVyCnsKICAgIENMX1RIUkVBRF9UUkFDRV9QQVJBTV9UT0tFTl9NQVNLLAogICAgQ0xfVEhSRUFEX1RSQUNFX1BBUkFNX1JFR19NQVNLLAogICAgQ0xfVEhSRUFEX1RSQUNFX1BBUkFNX0NPTVBVVEVfVU5JVF9UQVJHRVQsCiAgICBDTF9USFJFQURfVFJBQ0VfUEFSQU1fU0hBREVSX0FSUkFZX1RBUkdFVCwKICAgIENMX1RIUkVBRF9UUkFDRV9QQVJBTV9TSU1EX01BU0ssCiAgICBDTF9USFJFQURfVFJBQ0VfUEFSQU1fVk1fSURfTUFTSywKICAgIENMX1RIUkVBRF9UUkFDRV9QQVJBTV9SQU5ET01fU0VFRCwKICAgIENMX1RIUkVBRF9UUkFDRV9QQVJBTV9DQVBUVVJFX01PREUsCiAgICBDTF9USFJFQURfVFJBQ0VfUEFSQU1fSU5TVFJVQ1RJT05fTUFTSywKICAgIENMX1RIUkVBRF9UUkFDRV9QQVJBTV9VU0VSX0RBVEEsCiAgICBDTF9USFJFQURfVFJBQ0VfUEFSQU1fSVNfV1JBUFBFRAp9OwoKLy8gQ0xfVEhSRUFEX1RSQUNFX1BBUkFNX1RPS0VOX01BU0sgZGF0YSBzZWxlY3RzIGZvciBTSQplbnVtIENMX1RIUkVBRF9UUkFDRV9UT0tFTl9NQVNLCnsKICAgIC8vVGltZSBwYXNzZWQKICAgIENMX1RIUkVBRF9UUkFDRV9UT0tFTl9NQVNLX1RJTUVfU0kgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCiAgICAvL1Jlc3luYyB0aGUgdGltZXN0YW1wCiAgICBDTF9USFJFQURfVFJBQ0VfVE9LRU5fTUFTS19USU1FU1RBTVBfU0kgICAgICAgPSAweDAwMDAwMDAyLAogICAgLy9BIHJlZ2lzdGVyIHdyaXRlIGhhcyBvY2N1cnJlZAogICAgQ0xfVEhSRUFEX1RSQUNFX1RPS0VOX01BU0tfUkVHX1NJICAgICAgICAgICAgID0gMHgwMDAwMDAwNCwKICAgIC8vQSB3YXZlZnJvbnQgaGFzIHN0YXJ0ZWQKICAgIENMX1RIUkVBRF9UUkFDRV9UT0tFTl9NQVNLX1dBVkVfU1RBUlRfU0kgICAgICA9IDB4MDAwMDAwMDgsCiAgICAvL091dHB1dCBzcGFjZSBoYXMgYmVlbiBhbGxvY2F0ZWQgZm9yIGNvbG9yL1ogW1Nob3VsZCBiZSB1c2VkIGZvciBjbC1nbF0KICAgIENMX1RIUkVBRF9UUkFDRV9UT0tFTl9NQVNLX1dBVkVfUFNfQUxMT0NfU0kgICA9IDB4MDAwMDAwMTAsCiAgICAvL091dHB1dCBzcGFjZSBoYXMgYmVlbiBhbGxvY2F0ZWQgZm9yIHZlcnRleCBwb3NpdGlvbiBbU2hvdWxkIGJlIHVzZWQgZm9yIGNsLWdsXQogICAgQ0xfVEhSRUFEX1RSQUNFX1RPS0VOX01BU0tfV0FWRV9WU19BTExPQ19TSSAgID0gMHgwMDAwMDAyMCwKICAgIC8vV2F2ZWZyb250IGNvbXBsZXRpb24KICAgIENMX1RIUkVBRF9UUkFDRV9UT0tFTl9NQVNLX1dBVkVfRU5EX1NJICAgICAgICA9IDB4MDAwMDAwNDAsCiAgICAvL0FuIGV2ZW50IGhhcyByZWFjaGVkIHRoZSB0b3Agb2YgYSBzaGFkZXIgc3RhZ2UuIEluLW9yZGVyIHdpdGggV0FWRV9TVEFSVAogICAgQ0xfVEhSRUFEX1RSQUNFX1RPS0VOX01BU0tfRVZFTlRfU0kgICAgICAgICAgID0gMHgwMDAwMDA4MCwKICAgIC8vQW4gZXZlbnQgaGFzIHJlYWNoZWQgdGhlIHRvcCBvZiBhIGNvbXB1dGUgc2hhZGVyIHN0YWdlLiBJbi1vcmRlciB3aXRoIFdBVkVfU1RBUlQKICAgIENMX1RIUkVBRF9UUkFDRV9UT0tFTl9NQVNLX0VWRU5UX0NTX1NJICAgICAgICA9IDB4MDAwMDAxMDAsCiAgICAvL0FuIGV2ZW50IGhhcyByZWFjaGVkIHRoZSB0b3Agb2YgYSBzaGFkZXIgc3RhZ2UgZm9yIHRoZSBzZWNvbmQgR0ZYIHBpcGUuIEluLW9yZGVyIHdpdGggV0FWRV9TVEFSVC4KICAgIC8vW1Nob3VsZCBiZSB1c2VkIGZvciBjbC1nbF0KICAgIENMX1RIUkVBRF9UUkFDRV9UT0tFTl9NQVNLX0VWRU5UX0dGWF9TSSAgICAgICA9IDB4MDAwMDAyMDAsCiAgICAvL1RoZSBrZXJuZWwgaGFzIGV4ZWN1dGVkIGFuIGluc3RydWN0aW9uCiAgICBDTF9USFJFQURfVFJBQ0VfVE9LRU5fTUFTS19JTlNUX1NJICAgICAgICAgICAgPSAweDAwMDAwNDAwLAogICAgLy9UaGUga2VybmVsIGhhcyBleHBsaWNpdGx5IHdyaXR0ZW4gdGhlIFBDIHZhbHVlCiAgICBDTF9USFJFQURfVFJBQ0VfVE9LRU5fTUFTS19JTlNUX1BDX1NJICAgICAgICAgPSAweDAwMDAwODAwLAogICAgLy9UaGUga2VybmVsIGhhcyB3cml0dGVuIHVzZXIgZGF0YSBpbnRvIHRoZSB0aHJlYWQgdHJhY2UgYnVmZmVyCiAgICBDTF9USFJFQURfVFJBQ0VfVE9LRU5fTUFTS19JTlNUX1VTRVJEQVRBX1NJICAgPSAweDAwMDAxMDAwLAogICAgLy9Qcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nCiAgICBDTF9USFJFQURfVFJBQ0VfVE9LRU5fTUFTS19JU1NVRV9TSSAgICAgICAgICAgPSAweDAwMDAyMDAwLAogICAgLy9UaGUgcGVyZm9ybWFuY2UgY291bnRlciBkZWx0YSBoYXMgYmVlbiB1cGRhdGVkCiAgICBDTF9USFJFQURfVFJBQ0VfVE9LRU5fTUFTS19QRVJGX1NJICAgICAgICAgICAgPSAweDAwMDA0MDAwLAogICAgLy9BIG1pc2NlbGxhbmVvdXMgZXZlbnQgaGFzIGJlZW4gc2VudAogICAgQ0xfVEhSRUFEX1RSQUNFX1RPS0VOX01BU0tfTUlTQ19TSSAgICAgICAgICAgID0gMHgwMDAwODAwMCwKICAgIC8vQWxsIHBvc3NpYmxlIHRva2VucwogICAgQ0xfVEhSRUFEX1RSQUNFX1RPS0VOX01BU0tfQUxMX1NJICAgICAgICAgICAgID0gMHgwMDAwZmZmZiwKfTsKCi8vQ0xfVEhSRUFEX1RSQUNFX1BBUkFNX1JFR19NQVNLIGRhdGEgc2VsZWN0cwplbnVtIENMX1RIUkVBRF9UUkFDRV9SRUdfTUFTSwp7CiAgIC8vRXZlbnQgaW5pdGlhdG9yCiAgIENMX1RIUkVBRF9UUkFDRV9SRUdfTUFTS19FVkVOVF9TSSAgICAgID0gMHgwMDAwMDAwMSwKICAgLy9EcmF3IGluaXRpYXRvciBbU2hvdWxkIGJlIHVzZWQgZm9yIGNsLWdsXQogICBDTF9USFJFQURfVFJBQ0VfUkVHX01BU0tfRFJBV19TSSAgICAgICA9IDB4MDAwMDAwMDIsCiAgIC8vRGlzcGF0Y2ggaW5pdGlhdG9yCiAgIENMX1RIUkVBRF9UUkFDRV9SRUdfTUFTS19ESVNQQVRDSF9TSSAgID0gMHgwMDAwMDAwNCwKICAgLy9Vc2VyIGRhdGEgZnJvbSBob3N0CiAgIENMX1RIUkVBRF9UUkFDRV9SRUdfTUFTS19VU0VSREFUQV9TSSAgID0gMHgwMDAwMDAwOCwKICAgLy9HRlhERUMgcmVnaXN0ZXIgKDgtc3RhdGUpIFtTaG91bGQgYmUgdXNlZCBmb3IgY2wtZ2xdCiAgIENMX1RIUkVBRF9UUkFDRV9SRUdfTUFTS19HRlhERUNfU0kgICAgID0gMHgwMDAwMDAyMCwKICAgLy9TSERFQyByZWdpc3RlciAobWFueSBzdGF0ZSkKICAgQ0xfVEhSRUFEX1RSQUNFX1JFR19NQVNLX1NIREVDX1NJICAgICAgPSAweDAwMDAwMDQwLAogICAvL090aGVyIHJlZ2lzdGVycwogICBDTF9USFJFQURfVFJBQ0VfUkVHX01BU0tfT1RIRVJfU0kgICAgICA9IDB4MDAwMDAwODAsCiAgIC8vQWxsIHBvc3NpYmxlIHJlZ2lzdGVycyB0eXBlcwogICBDTF9USFJFQURfVFJBQ0VfUkVHX01BU0tfQUxMX1NJICAgICAgICA9IDB4MDAwMDAwZmYsCn07CgovL0NMX1RIUkVBRF9UUkFDRV9QQVJBTV9WTV9JRF9NQVNLIGRhdGEgc2VsZWN0cwplbnVtIENMX1RIUkVBRF9UUkFDRV9WTV9JRF9NQVNLCnsKICAgLy9DYXB0dXJlIG9ubHkgZGF0YSBmcm9tIHRoZSBWTV9JRCB1c2VkIHRvIHdyaXRlIHtTUVRUfV9CQVNFCiAgIENMX1RIUkVBRF9UUkFDRV9WTV9JRF9NQVNLX1NJTkdMRSAgICAgICAgICAgICAgPSAwLAogICAvL0NhcHR1cmUgYWxsIGRhdGEgZnJvbSBhbGwgVk1fSURzCiAgIENMX1RIUkVBRF9UUkFDRV9WTV9JRF9NQVNLX0FMTCAgICAgICAgICAgICAgICAgPSAxLAogICAvL0NhcHR1cmUgYWxsIGRhdGEgYnV0IG9ubHkgZ2V0IHRhcmdldCAoYS5rLmEuIGRldGFpbCkgZGF0YSBmcm9tIFZNX0lEIHVzZWQgdG8gd3JpdGUge1NRVFR9X0JBU0UKICAgQ0xfVEhSRUFEX1RSQUNFX1ZNX0lEX01BU0tfU0lOR0xFX0RFVEFJTCAgICAgICA9IDIKfTsKCi8vQ0xfVEhSRUFEX1RSQUNFX1BBUkFNX0NBUFRVUkVfTU9ERSBkYXRhCmVudW0gQ0xfVEhSRUFEX1RSQUNFX0NBUFRVUkVfTU9ERQp7CiAgICAvL0NhcHR1cmUgYWxsIGRhdGEgaW4gdGhlIHRocmVhZCB0cmFjZSBidWZmZXIKICAgIENMX1RIUkVBRF9UUkFDRV9DQVBUVVJFX0FMTCAgICAgICAgICAgICAgICAgICAgPSAwLAogICAgLy9DYXB0dXJlIG9ubHkgZGF0YSBiZXR3ZWVuIFRIUkVBRF9UUkFDRV9TVEFSVCBhbmQgVEhSRUFEX1RSQUNFX1NUT1AgZXZlbnRzCiAgICBDTF9USFJFQURfVFJBQ0VfQ0FQVFVSRV9TRUxFQ1QgICAgICAgICAgICAgICAgID0gMSwKICAgIC8vQ2FwdHVyZSBkYXRhIGJldHdlZW4gVEhSRUFEX1RSQUNFX1NUQVJUIGFuZCBUSFJFQURfVFJBQ0VfL1NUT1AgZXZlbnRzLAogICAgLy9hbmQgZ2xvYmFsL3JlZmVyZW5jZSBkYXRhIGF0IGFsbCB0aW1lcwogICAgQ0xfVEhSRUFEX1RSQUNFX0NBUFRVUkVfU0VMRUNUX0RFVEFJTCAgICAgICAgICA9IDIKfTsKCi8vQ0xfVEhSRUFEX1RSQUNFX1BBUkFNX0lOU1RSVUNUSU9OX01BU0sgZGF0YSBzZWxlY3RzCmVudW0gQ0xfVEhSRUFEX1RSQUNFX0lOU1RSVUNUSU9OX01BU0sKewogICAgLy9HZW5lcmF0ZSB7U1FUVH1fVE9LRU5fSU5TVCB0b2tlbnMgZm9yIGFsbCBpbnN0cnVjdGlvbnMKICAgIENMX1RIUkVBRF9UUkFDRV9JTlNUX01BU0tfQUxMLAogICAgLy9HZW5lcmF0ZSB7U1FUVH1fVE9LRU5fSU5TVCB0b2tlbnMgZm9yIHN0YWxsZWQgaW5zdHJ1Y3Rpb25zIG9ubHkKICAgIENMX1RIUkVBRF9UUkFDRV9JTlNUX01BU0tfU1RBTExFRCwKICAgIC8vR2VuZXJhdGUge1NRVFR9X1RPS0VOX0lOU1QgbWVzc2FnZXMgZm9yIHN0YWxsZWQgYW5kIG90aGVyIChubyBvcC93YWl0L3NldCBwcmlvL2V0YykgaW5zdHJ1Y3Rpb25zCiAgICBDTF9USFJFQURfVFJBQ0VfSU5TVF9NQVNLX1NUQUxMRURfQU5EX0lNTUVESUFURSwKICAgIC8vR2VuZXJhdGUge1NRVFR9X1RPS0VOX0lOU1QgbWVzc2FnZXMgZm9yIGltbWVkaWF0ZSBpbnN0cnVjdGlvbnMgb25seSBvbmx5IFsgU2hvdWxkIGJlIHVzZWQgb25seSBmb3IgQ0ldCiAgICBDTF9USFJFQURfVFJBQ0VfSU5TVF9NQVNLX0lNTUVESUFURV9DSSwKfTsKCmVudW0gVGhyZWFkVHJhY2VJbmZvCnsKICAgIENMX1RIUkVBRF9UUkFDRV9TRSwKICAgIENMX1RIUkVBRF9UUkFDRV9CVUZGRVJTX0ZJTExFRCwKICAgIENMX1RIUkVBRF9UUkFDRV9CVUZGRVJTX1NJWkUKfTsKCgovKiEgXGJyaWVmIENyZWF0ZXMgYSBuZXcgY2xfdGhyZWFkdHJhY2VfYW1kIG9iamVjdAogKgogKiAgXHBhcmFtIGRldmljZSBtdXN0IGJlIGEgdmFsaWQgT3BlbkNMIGRldmljZS4KICoKICogIFxwYXJhbSBlcnJjb2RlX3JldCAgQSBub24gemVybyB2YWx1ZSBpZiBPcGVuQ0wgZmFpbGVkIHRvIGNyZWF0ZSB0aHJlYWRUcmFjZQogKiAgLUNMX0lOVkFMSURfREVWSUNFIGlmIGRldmljZXMgY29udGFpbnMgYW4gaW52YWxpZCBkZXZpY2UuCiAqICAtQ0xfREVWSUNFX05PVF9BVkFJTEFCTEUgaWYgYSBkZXZpY2UgaXMgY3VycmVudGx5IG5vdCBhdmFpbGFibGUgZXZlbgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aG91Z2ggdGhlIGRldmljZSB3YXMgcmV0dXJuZWQgYnkgY2xHZXREZXZpY2VJRHMuCiAqICAtQ0xfT1VUX09GX1JFU09VUkNFUyBpZiB0aGVyZSBpcyBhIGZhaWx1cmUgdG8gYWxsb2NhdGUgcmVzb3VyY2VzIHJlcXVpcmVkIGJ5IHRoZQogKiAgICAgICAgICAgICAgICAgICAgICAgT3BlbkNMICBpbXBsZW1lbnRhdGlvbiBvbiB0aGUgZGV2aWNlLgogKiAgLUNMX09VVF9PRl9IT1NUX01FTU9SWSBpZiB0aGVyZSBpcyBhIGZhaWx1cmUgdG8gYWxsb2NhdGUgcmVzb3VyY2VzIHJlcXVpcmVkIGJ5IHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5DTCBpbXBsZW1lbnRhdGlvbiBvbiB0aGUgaG9zdC4KICoKICogIFxyZXR1cm4gdGhlIGNyZWF0ZWQgdGhyZWFkVHJhY2Ugb2JqZWN0CiAqLwpleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX3RocmVhZHRyYWNlX2FtZCBDTF9BUElfQ0FMTApjbENyZWF0ZVRocmVhZFRyYWNlQU1EKAogICAgY2xfZGV2aWNlX2lkICAgICAgICAgICAgICAgIC8qIGRldmljZSAqLywKICAgIGNsX2ludCogICAgICAgICAgICAgICAgICAgICAvKiBlcnJjb2RlX3JldCAqLwopIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOwoKLyohIFxicmllZiBEZXN0cm95cyBhIGNsX3RocmVhZHRyYWNlX2FtZCBvYmplY3QuCiAqCiAqICBccGFyYW0gdGhyZWFkVHJhY2UgdGhlIGNsX3RocmVhZHRyYWNlX2FtZCBvYmplY3QgZm9yIHJlbGVhc2UKICoKICogIFxyZXR1cm4gQSBub24gemVybyB2YWx1ZSBpZiBPcGVuQ0wgZmFpbGVkIHRvIHJlbGVhc2UgdGhyZWFkVHJhY2UKICogIC1DTF9JTlZBTElEX1ZBTFVFIGlmIHRoZSB0aHJlYWRfdHJhY2UgaXMgbm90IGEgdmFsaWQgIE9wZW5DTCB0aHJlYWQgdHJhY2Ugb2JqZWN0IChjbF90aHJlYWR0cmFjZV9hbWQpIC4KICogIC1DTF9PVVRfT0ZfUkVTT1VSQ0VTIGlmIHRoZXJlIGlzIGEgZmFpbHVyZSB0byBhbGxvY2F0ZSByZXNvdXJjZXMgcmVxdWlyZWQgYnkgdGhlCiAqICAgICAgICAgICAgICAgICAgICAgICBPcGVuQ0wgIGltcGxlbWVudGF0aW9uIG9uIHRoZSBkZXZpY2UuCiAqICAtQ0xfT1VUX09GX0hPU1RfTUVNT1JZIGlmIHRoZXJlIGlzIGEgZmFpbHVyZSB0byBhbGxvY2F0ZSByZXNvdXJjZXMgcmVxdWlyZWQgYnkgdGhlCiAgICAgICAgICAgICAgICAgICAgICBPcGVuQ0wgIGltcGxlbWVudGF0aW9uIG9uIHRoZSBob3N0LgogKi8KZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKY2xSZWxlYXNlVGhyZWFkVHJhY2VBTUQoCiAgICBjbF90aHJlYWR0cmFjZV9hbWQgIC8qIHRocmVhZFRyYWNlICovCikgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CgovKiEgXGJyaWVmIEluY3JlbWVudHMgdGhlIGNsX3RocmVhZHRyYWNlX2FtZCBvYmplY3QgcmVmZXJlbmNlIGNvdW50LgogKgogKiAgXHBhcmFtIHRocmVhZFRyYWNlIHRoZSBjbF90aHJlYWR0cmFjZV9hbWQgb2JqZWN0IGZvciByZXRhaW4KICoKICogIFxyZXR1cm4gQSBub24gemVybyB2YWx1ZSBpZiBPcGVuQ0wgZmFpbGVkIHRvIHJldGFpbiB0aHJlYWRUcmFjZQogKiAgLUNMX0lOVkFMSURfVkFMVUUgaWYgdGhlIHRocmVhZF90cmFjZSBpcyBub3QgYSB2YWxpZCB0aHJlYWQgdHJhY2Ugb2JqZWN0IChjbF90aHJlYWR0cmFjZV9hbWQpIC4KICogIC1DTF9PVVRfT0ZfUkVTT1VSQ0VTIGlmIHRoZXJlIGlzIGEgZmFpbHVyZSB0byBhbGxvY2F0ZSByZXNvdXJjZXMgcmVxdWlyZWQgYnkgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuQ0wgaW1wbGVtZW50YXRpb24gb24gdGhlIGRldmljZS4KICogIC1DTF9PVVRfT0ZfSE9TVF9NRU1PUlkgaWYgdGhlcmUgaXMgYSBmYWlsdXJlIHRvIGFsbG9jYXRlIHJlc291cmNlcyByZXF1aXJlZCBieSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlbkNMIGltcGxlbWVudGF0aW9uIG9uIHRoZSBob3N0LgogKi8KZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKY2xSZXRhaW5UaHJlYWRUcmFjZUFNRCgKICAgIGNsX3RocmVhZHRyYWNlX2FtZCAgLyogdGhyZWFkVHJhY2UgKi8KKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKCi8qISBcYnJpZWYgU2V0cyB0aGUgY2xfdGhyZWFkdHJhY2VfYW1kIG9iamVjdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4KICoKICogIFxwYXJhbSB0aHJlYWRfdHJhY2UgdGhlIGNsX3RocmVhZHRyYWNlX2FtZCBvYmplY3QgdG8gc2V0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyCiAqCiAqICBccGFyYW0gY29uZmlnX3BhcmFtIHRoZSBjbF90aHJlYWRfdHJhY2VfcGFyYW0KICoKICogIFxwYXJhbSBwYXJhbV92YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGNvbmZpZ1BhcmFtCiAqCiAqICBccmV0dXJuIEEgbm9uIHplcm8gdmFsdWUgaWYgT3BlbkNMIGZhaWxlZCB0byBzZXQgdGhyZWFkVHJhY2UgYnVmZmVyIHBhcmFtZXRlcgogKiAgLSBDTF9JTlZBTElEX1ZBTFVFIGlmIHRoZSB0aHJlYWRfdHJhY2UgIGlzIGludmFsaWQgdGhyZWFkIHRyYWNlIG9iamVjdC4KICogIC0gQ0xfSU5WQUxJRF9WQUxVRSBpZiB0aGUgaW52YWxpZCBjb25maWdfcGFyYW0gb3IgcGFyYW1fdmFsdWUgZW51bSB2YWx1ZXMgLCBhcmUgdXNlZC4KICogIC0gQ0xfSU5WQUxJRF9FVkVOVF9XQUlUX0xJU1QgaWYgZXZlbnRfd2FpdF9saXN0IGlzIE5VTEwgYW5kIG51bV9ldmVudHNfaW5fd2FpdF9saXN0ID4gMCwgb3IgZXZlbnRfd2FpdF9saXN0IGlzIG5vdCBOVUxMIGFuZCBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCBpcyAwLAogKiAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiBldmVudCBvYmplY3RzIGluIGV2ZW50X3dhaXRfbGlzdCBhcmUgbm90IHZhbGlkIGV2ZW50cy4KICogIC0gQ0xfT1VUX09GX1JFU09VUkNFUyBpZiB0aGVyZSBpcyBhIGZhaWx1cmUgdG8gYWxsb2NhdGUgcmVzb3VyY2VzIHJlcXVpcmVkIGJ5IHRoZSBPcGVuQ0wgaW1wbGVtZW50YXRpb24gb24gdGhlIGRldmljZS4KICogIC0gQ0xfT1VUX09GX0hPU1RfTUVNT1JZIGlmIHRoZXJlIGlzIGEgZmFpbHVyZSB0byBhbGxvY2F0ZSByZXNvdXJjZXMgcmVxdWlyZWQgYnkgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5DTCBpbXBsZW1lbnRhdGlvbiBvbiB0aGUgaG9zdC4KICovCgpleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTApjbFNldFRocmVhZFRyYWNlUGFyYW1BTUQoY2xfdGhyZWFkdHJhY2VfYW1kICAgIC8qdGhyZWFkX3RyYWNlKi8gLAogICAgICAgICAgICAgICAgICAgICAgICAgY2xfdGhyZWFkX3RyYWNlX3BhcmFtIC8qY29uZmlnX3BhcmFtKi8gLAogICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgICAgICAvKnBhcmFtX3ZhbHVlKi8KKUNMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOwoKLyogXGJyaWVmIEVucXVldWVzIHRoZSBiaW5kaW5nIGNvbW1hbmQgdG8gYmluZCBjbF90aHJlYWR0cmFjZV9hbWQgdG8gY2xfbWVtIG9iamVjdCBmb3IgdHJhY2UgcmVjb3JkaW5nLi4KICoKICogIFxwYXJhbSBjb21tYW5kX3F1ZXVlIG11c3QgYmUgYSB2YWxpZCBPcGVuQ0wgY29tbWFuZCBxdWV1ZS4KICoKICogIFxwYXJhbSB0aHJlYWRfdHJhY2Ugc3BlY2lmaWVzIHRoZSBjbF90aHJlYWR0cmFjZV9hbWQgb2JqZWN0LgogKgogKiAgXHBhcmFtIG1lbV9vYmplY3RzIHRoZSBjbF9tZW0gb2JqZWN0cyBmb3IgdHJhY2UgcmVjb3JkaW5nCiAqCiAqICBccGFyYW0gbWVtX29iamVjdHNfbnVtIHRoZSBudW1iZXIgb2YgY2xfbWVtIG9iamVjdHMgaW4gdGhlIG1lbV9vYmplY3RzCiAqCiAqICBccGFyYW0gYnVmZmVyX3NpemUgdGhlIHNpemUgb2YgZWFjaCBjbF9tZW0gb2JqZWN0IGZyb20gbWVtX29iamVjdHMKICoKICogIFxwYXJhbSBldmVudF93YWl0X2xpc3Qgc3BlY2lmeSBbaXMgYSBwb2ludGVyIHRvXSBldmVudHMgdGhhdCBuZWVkIHRvCiAqICBjb21wbGV0ZSBiZWZvcmUgdGhpcyBwYXJ0aWN1bGFyIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkLgogKiAgSWYgXGEgZXZlbnRfd2FpdF9saXN0IGlzIE5VTEwsIHRoZW4gdGhpcyBwYXJ0aWN1bGFyIGNvbW1hbmQgZG9lcyBub3Qgd2FpdAogKiAgb24gYW55IGV2ZW50IHRvIGNvbXBsZXRlLiBJZiBcYSBldmVudF93YWl0X2xpc3QgaXMgTlVMTCwKICogIFxhIG51bV9ldmVudHNfaW5fd2FpdF9saXN0IG11c3QgYmUgMC4gSWYgXGEgZXZlbnRfd2FpdF9saXN0IGlzIG5vdCBOVUxMLAogKiAgdGhlIGxpc3Qgb2YgZXZlbnRzIHBvaW50ZWQgdG8gYnkgXGEgZXZlbnRfd2FpdF9saXN0IG11c3QgYmUgdmFsaWQgYW5kCiAqICBcYSBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLiBUaGUgZXZlbnRzIHNwZWNpZmllZCBpbgogKiAgXGEgZXZlbnRfd2FpdF9saXN0IGFjdCBhcyBzeW5jaHJvbml6YXRpb24gcG9pbnRzLgogKgogKiAgXHBhcmFtIG51bV9ldmVudHNfaW5fd2FpdF9saXN0IHNwZWNpZnkgdGhlIG51bWJlciBvZiBldmVudHMgaW4KICogIFxhIGV2ZW50X3dhaXRfbGlzdC4gSXQgbXVzdCBiZSAwIGlmIFxhIGV2ZW50X3dhaXRfbGlzdCBpcyBOVUxMLiBJdCAgbXVzdCBiZQogKiAgZ3JlYXRlciB0aGFuIDAgaWYgXGEgZXZlbnRfd2FpdF9saXN0IGlzIG5vdCBOVUxMLgogKgogKiAgXHBhcmFtIGV2ZW50IHJldHVybnMgYW4gZXZlbnQgb2JqZWN0IHRoYXQgaWRlbnRpZmllcyB0aGlzIHBhcnRpY3VsYXIKICogIGNvbW1hbmQgYW5kIGNhbiBiZSB1c2VkIHRvIHF1ZXJ5IG9yIHF1ZXVlIGEgd2FpdCBmb3IgdGhpcyBwYXJ0aWN1bGFyCiAqICBjb21tYW5kIHRvIGNvbXBsZXRlLiBcYSBldmVudCBjYW4gYmUgTlVMTCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgbm90IGJlCiAqICBwb3NzaWJsZSBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHF1ZXJ5IHRoZSBzdGF0dXMgb2YgdGhpcyBjb21tYW5kIG9yIHF1ZXVlIGEKICogIHdhaXQgZm9yIHRoaXMgY29tbWFuZCB0byBjb21wbGV0ZS4KICogIFxyZXR1cm4gQSBub24gemVybyB2YWx1ZSBpZiBPcGVuQ0wgZmFpbGVkIHRvIHNldCB0aHJlYWRUcmFjZSBidWZmZXIgcGFyYW1ldGVyCiAqICAtIENMX0lOVkFMSURfQ09NTUFORF9RVUVVRSBpZiBjb21tYW5kX3F1ZXVlIGlzIG5vdCBhIHZhbGlkIGNvbW1hbmQtcXVldWUuCiAqICAtIENMX0lOVkFMSURfQ09OVEVYVCBpZiB0aGUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggY29tbWFuZF9xdWV1ZSBhbmQgIGV2ZW50cyBpbiBldmVudF93YWl0X2xpc3QgYXJlIG5vdCB0aGUgc2FtZS4KICogIC0gQ0xfSU5WQUxJRF9WQUxVRSBpZiB0aGUgdGhyZWFkX3RyYWNlICBpcyBpbnZhbGlkIHRocmVhZCB0cmFjZSBvYmplY3QuCiAqICAtIENMX0lOVkFMSURfVkFMVUUgaWYgdGhlIGJ1ZmZlcl9zaXplIGlzIG5lZ2F0aXZlIG9yIHplcm8uCiAqICAtIENMX0lOVkFMSURfVkFMVUUgaWYgdGhlICBzdWJfYnVmZmVyc19udW0gSSBsZXNzIHRoYW4gMS4KICogIC0gQ0xfSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIG1lbV9vYmplY3RzX251bSBpcyBub3QgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBTaGFkZXIgRW5naW5lcyBvZiB0aGUgW0dQVV0gZGV2aWNlLgogKiAgLSBDTF9JTlZBTElEX01FTV9PQkpFQ1QgaWYgb25lIG9uIG1lbW9yeSBvYmplY3RzIGluIHRoZSBtZW1fb2JqZWN0cyBhcnJheSBpcyBub3QgYSB2YWxpZCBtZW1vcnkgb2JqZWN0IG9yIG1lbW9yeV9vYmplY3RzIGlzIE5VTEwuCiAqICAtIENMX01FTV9PQkpFQ1RfQUxMT0NBVElPTl9GQUlMVVJFIGlmIHRoZXJlIGlzIGEgZmFpbHVyZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBkYXRhIHN0b3JlIGFzc29jaWF0ZWQgZnJvbSB0aGUgbWVtb3J5IG9iamVjdHMgb2YgdGhlIG1lbV9vYmplY3RzIGFycmF5LgogKiAgLSBDTF9JTlZBTElEX0VWRU5UX1dBSVRfTElTVCBpZiBldmVudF93YWl0X2xpc3QgaXMgTlVMTCBhbmQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QgPiAwLCBvciBldmVudF93YWl0X2xpc3QgaXMgbm90IE5VTEwgYW5kIG51bV9ldmVudHNfaW5fd2FpdF9saXN0IGlzIDAsIG9yIGlmIGV2ZW50IG9iamVjdHMgaW4gZXZlbnRfd2FpdF9saXN0IGFyZSBub3QgdmFsaWQgZXZlbnRzLgogKiAgLSBDTF9PVVRfT0ZfUkVTT1VSQ0VTIGlmIHRoZXJlIGlzIGEgZmFpbHVyZSB0byBhbGxvY2F0ZSByZXNvdXJjZXMgcmVxdWlyZWQgYnkgdGhlIE9wZW5DTCBpbXBsZW1lbnRhdGlvbiBvbiB0aGUgZGV2aWNlLgogKiAgLSBDTF9PVVRfT0ZfSE9TVF9NRU1PUlkgaWYgdGhlcmUgaXMgYSBmYWlsdXJlIHRvIGFsbG9jYXRlIHJlc291cmNlcyByZXF1aXJlZCBieSB0aGUKICogICAgIE9wZW5DTCBpbXBsZW1lbnRhdGlvbiBvbiB0aGUgaG9zdC4KICovCmV4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCmNsRW5xdWV1ZUJpbmRUaHJlYWRUcmFjZUJ1ZmZlckFNRChjbF9jb21tYW5kX3F1ZXVlICAgIGNvbW1hbmRfcXVldWUgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF90aHJlYWR0cmFjZV9hbWQgIC8qdGhyZWFkX3RyYWNlKi8gLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9tZW0qICAgICAgICAgICAgIC8qbWVtX29iamVjdHMqLyAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgICAgLyptZW1fb2JqZWN0c19udW0qLyAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgICAgLypidWZmZXJfc2l6ZSovICwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgICAvKm51bV9ldmVudHNfaW5fd2FpdF9saXN0Ki8gLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbF9ldmVudCogICAgIC8qZXZlbnRfd2FpdF9saXN0Ki8gLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9ldmVudCogICAgICAgICAgIC8qZXZlbnQqLwopIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOwoKLyohIFxicmllZiBHZXQgc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE9wZW5DTCBUaHJlYWQgVHJhY2UuCiAqCiAqICBccGFyYW0gdGhyZWFkX3RyYWNlX2luZm9fcGFyYW0gaXMgYW4gZW51bSB0aGF0IGlkZW50aWZpZXMgdGhlIFRocmVhZCBUcmFjZSBpbmZvcm1hdGlvbiBiZWluZwogKiAgcXVlcmllZC4KICoKICogIFxwYXJhbSBwYXJhbV92YWx1ZSBpcyBhIHBvaW50ZXIgdG8gbWVtb3J5IGxvY2F0aW9uIHdoZXJlIGFwcHJvcHJpYXRlIHZhbHVlcwogKiAgZm9yIGEgZ2l2ZW4gXGEgdGhyZWFkVHJhY2VfaW5mb19wYXJhbSB3aWxsIGJlIHJldHVybmVkLiBJZiBcYSBwYXJhbV92YWx1ZSBpcyBOVUxMLAogKiAgaXQgaXMgaWdub3JlZC4KICoKICogIFxwYXJhbSBwYXJhbV92YWx1ZV9zaXplIHNwZWNpZmllcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiBtZW1vcnkgcG9pbnRlZCB0byBieQogKiAgXGEgcGFyYW1fdmFsdWUuIFRoaXMgc2l6ZSBpbiBieXRlcyBtdXN0IGJlID49IHNpemUgb2YgcmV0dXJuIHR5cGUuCiAqCiAqICBccGFyYW0gcGFyYW1fdmFsdWVfc2l6ZV9yZXQgcmV0dXJucyB0aGUgYWN0dWFsIHNpemUgaW4gYnl0ZXMgb2YgZGF0YSBiZWluZwogKiAgcXVlcmllZCBieSBwYXJhbV92YWx1ZS4gSWYgXGEgcGFyYW1fdmFsdWVfc2l6ZV9yZXQgaXMgTlVMTCwgaXQgaXMgaWdub3JlZC4KICoKICogIFxyZXR1cm4gT25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogKiAgICAgIENMX0lOVkFMSURfT1BFUkFUSU9OIGlmIGNsX3RocmVhZHRyYWNlX2FtZCBvYmplY3QgaXMgbm90IHZhbGlkCiAqICAgIC0gQ0xfSU5WQUxJRF9WQUxVRSBpZiBcYSBwYXJhbV9uYW1lIGlzIG5vdCBvbmUgb2YgdGhlIHN1cHBvcnRlZAogKiAgICAgIHZhbHVlcyBvciBpZiBzaXplIGluIGJ5dGVzIHNwZWNpZmllZCBieSBcYSBwYXJhbV92YWx1ZV9zaXplIGlzIDwgc2l6ZSBvZgogKiAgICAgIHJldHVybiB0eXBlIGFuZCBcYSBwYXJhbV92YWx1ZSBpcyBub3QgYSBOVUxMIHZhbHVlLgogKiAgICAgIENMX09VVF9PRl9IT1NUX01FTU9SWSBpZiB0aGVyZSBpcyBhIGZhaWx1cmUgdG8gYWxsb2NhdGUgcmVzb3VyY2VzIHJlcXVpcmVkIGJ5IHRoZQogKiAgICAgIE9wZW5DTCBpbXBsZW1lbnRhdGlvbiBvbiB0aGUgaG9zdC4KICogICAgICBDTF9TVUNDRVNTIGlmIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZCBzdWNjZXNzZnVsbHkuCiAqLwpleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTApjbEdldFRocmVhZFRyYWNlSW5mb0FNRCgKICAgIGNsX3RocmVhZHRyYWNlX2FtZCAgICAvKiB0aHJlYWRfdHJhY2UgKi8sCiAgICBjbF90aHJlYWR0cmFjZV9pbmZvICAgLyp0aHJlYWRfdHJhY2VfaW5mb19wYXJhbSovLAogICAgc2l6ZV90ICAgICAgICAgICAgICAgIC8qcGFyYW1fdmFsdWVfc2l6ZSovLAogICAgdm9pZCogICAgICAgICAgICAgICAgIC8qcGFyYW1fdmFsdWUqLywKICAgIHNpemVfdCogICAgICAgICAgICAgICAvKnBhcmFtX3ZhbHVlX3NpemVfcmV0Ki8KKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKCi8qISBcYnJpZWYgRW5xdWV1ZXMgdGhlIHRocmVhZCB0cmFjZSBjb21tYW5kIGZvciB0aGUgc3BlY2lmaWVkIHRocmVhZCB0cmFjZSBvYmplY3QuCiAqCiAqICBccGFyYW0gY29tbWFuZF9xdWV1ZSBtdXN0IGJlIGEgdmFsaWQgT3BlbkNMIGNvbW1hbmQgcXVldWUuCiAqCiAqICBccGFyYW0gdGhyZWFkVHJhY2VzIHNwZWNpZmllcyBhbiBhcnJheSBvZiBjbF90aHJlYWR0cmFjZV9hbWQgb2JqZWN0cy4KICoKICogIFxyZXR1cm4gQSBub24gemVybyB2YWx1ZSBpZiBPcGVuQ0wgZmFpbGVkIHRvIHJlbGVhc2UgdGhyZWFkVHJhY2UKICogIC0gQ0xfSU5WQUxJRF9DT01NQU5EX1FVRVVFIGlmIGNvbW1hbmRfcXVldWUgaXMgbm90IGEgdmFsaWQgY29tbWFuZC1xdWV1ZS4KICogIC0gQ0xfSU5WQUxJRF9DT05URVhUIGlmIHRoZSBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCBjb21tYW5kX3F1ZXVlIGFuZCAgZXZlbnRzIGluIGV2ZW50X3dhaXRfbGlzdCBhcmUgbm90IHRoZSBzYW1lLgogKiAgLSBDTF9JTlZBTElEX1ZBTFVFIGlmIHRoZSB0aHJlYWRfdHJhY2UgaXMgaW52YWxpZCB0aHJlYWQgdHJhY2Ugb2JqZWN0IC4KICogIC0gQ0xfSU5WQUxJRF9WQUxVRSBpZiB0aGUgaW52YWxpZCBjb21tYW5kIG5hbWUgZW51bSB2YWx1ZSAsIG5vdCAgZGVzY3JpYmVkIGluIHRoZSBjbF90aHJlYWR0cmFjZV9jb21tYW5kX25hbWVfYW1kLCBpcyB1c2VkLgogKiAgLSBDTF9JTlZBTElEX09QRVJBVElPTiBpZiB0aGUgY29tbWFuZCBlbnF1ZXVlIGZhaWxlZC4gSXQgY2FuIGhhcHBlbiBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgogKiAgICAgICAgICBvIEJFR0lOX0NPTU1BTkQgaXMgcXVldWVkIGZvciB0aHJlYWQgdHJhY2Ugb2JqZWN0IGZvciB3aGljaCBtZW1vcnkgb2JqZWN0L3Mgd2FzL3dlcmUgbm90IGJvdW5kLi4KICogICAgICAgICAgbyBFTkRfQ09NTUFORCBpcyBxdWV1ZWQgZm9yIHRocmVhZCB0cmFjZSBvYmplY3QsIGZvciB3aGljaCBCRUdJTl9DT01NQU5EIHdhcyBub3QgcXVldWVkLgogKiAgICAgICAgICBvIFBBVVNFX0NPTU1BTkQgaXMgcXVldWVkIGZvciB0aHJlYWQgdHJhY2Ugb2JqZWN0LCBmb3Igd2hpY2ggQkVHSU5fQ09NTUFORCB3YXMgbm90IHF1ZXVlZC4KICogICAgICAgICAgbyBSRVNVTUVfQ09NTUFORCBpcyBxdWV1ZWQgZm9yIHRocmVhZCB0cmFjZSBvYmplY3QsIGZvciB3aGljaCAgUEFVU0VfQ09NTUFORCB3YXMgbm90IHF1ZXVlZC4KICogIC0gQ0xfSU5WQUxJRF9FVkVOVF9XQUlUX0xJU1QgaWYgZXZlbnRfd2FpdF9saXN0IGlzIE5VTEwgYW5kIG51bV9ldmVudHNfaW5fd2FpdF9saXN0ID4gMCwgb3IgZXZlbnRfd2FpdF9saXN0IGlzIG5vdCBOVUxMIGFuZCBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCBpcyAwLCBvciBpZiBldmVudCBvYmplY3RzIGluIGV2ZW50X3dhaXRfbGlzdCBhcmUgbm90IHZhbGlkIGV2ZW50cy4KICogIC0gQ0xfT1VUX09GX1JFU09VUkNFUyBpZiB0aGVyZSBpcyBhIGZhaWx1cmUgdG8gYWxsb2NhdGUgcmVzb3VyY2VzIHJlcXVpcmVkIGJ5IHRoZSBPcGVuQ0wgaW1wbGVtZW50YXRpb24gb24gdGhlIGRldmljZS4KICogIC0gQ0xfT1VUX09GX0hPU1RfTUVNT1JZIGlmIHRoZXJlIGlzIGEgZmFpbHVyZSB0byBhbGxvY2F0ZSByZXNvdXJjZXMgcmVxdWlyZWQgYnkgdGhlIE9wZW5DTCBpbXBsZW1lbnRhdGlvbiBvbiB0aGUgaG9zdC4KICovCmV4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCmNsRW5xdWV1ZVRocmVhZFRyYWNlQ29tbWFuZEFNRCgKICAgIGNsX2NvbW1hbmRfcXVldWUgICAgIC8qY29tbWFuZF9xdWV1ZSovICwKICAgIGNsX3RocmVhZHRyYWNlX2FtZCAgIC8qdGhyZWFkX3RyYWNlKi8gLAogICAgY2xfdGhyZWFkdHJhY2VfY29tbWFuZF9uYW1lX2FtZCAvKmNvbW1hbmRfbmFtZSovICwKICAgIGNsX3VpbnQgICAgICAgICAgICAgIC8qbnVtX2V2ZW50c19pbl93YWl0X2xpc3QqLyAsCiAgICBjb25zdCBjbF9ldmVudCogICAgICAvKmV2ZW50X3dhaXRfbGlzdCovLAogICAgY2xfZXZlbnQqICAgICAgICAgICAgLypldmVudCovCilDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKCgojaWZkZWYgX19jcGx1c3BsdXMKfSAvKmV4dGVybiAiQyIqLwojZW5kaWYgLypfX2NwbHVzcGx1cyovCgojZW5kaWYgIC8qX19DTF9USFJFQURfVFJBQ0VfQU1EX0gqLwo=