LyoKICogTW9zdCBvZiB0aGlzIHRha2VuIGZyb20gUmVkYm9vdCBoYWxfcGxhdGZvcm1fc2V0dXAuaCB3aXRoIGNsZWFudXAKICoKICogTk9URTogSSBoYXZlbid0IGNsZWFuIHRoaXMgdXAgY29uc2lkZXJhYmx5LCBqdXN0IGVub3VnaCB0byBnZXQgaXQKICogcnVubmluZy4gU2VlIGhhbF9wbGF0Zm9ybV9zZXR1cC5oIGZvciB0aGUgc291cmNlLiBTZWUKICogYm9hcmQvY3JhZGxlL2xvd2xldmVsX2luaXQuUyBmb3IgYW5vdGhlciBQWEEyNTAgc2V0dXAgdGhhdCBpcwogKiBtdWNoIGNsZWFuZXIuCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8dmVyc2lvbi5oPgojaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KCkRSQU1fU0laRTogIC5sb25nICAgQ0ZHX0RSQU1fU0laRQoKLyogd2FpdCBmb3IgY29wcm9jZXNzb3Igd3JpdGUgY29tcGxldGUgKi8KICAgLm1hY3JvIENQV0FJVCByZWcKICAgbXJjICBwMTUsMCxccmVnLGMyLGMwLDAKICAgbW92ICBccmVnLFxyZWcKICAgc3ViICBwYyxwYywjNAogICAuZW5kbQoKX1RFWFRfQkFTRToKCS53b3JkCVRFWFRfQkFTRQoKCi8qCiAqCU1lbW9yeSBzZXR1cAogKi8KCi5nbG9ibCBsb3dsZXZlbF9pbml0Cmxvd2xldmVsX2luaXQ6CgogICAgbW92ICAgICAgcjEwLCBscgoKCS8qIFNldCB1cCBHUElPIHBpbnMgZmlyc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCglsZHIJCXIwLAk9R1BTUjAKCWxkcgkJcjEsCT1DRkdfR1BTUjBfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BTUjEKCWxkcgkJcjEsCT1DRkdfR1BTUjFfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BTUjIKCWxkcgkJcjEsCT1DRkdfR1BTUjJfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BDUjAKCWxkcgkJcjEsCT1DRkdfR1BDUjBfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BDUjEKCWxkcgkJcjEsCT1DRkdfR1BDUjFfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BDUjIKCWxkcgkJcjEsCT1DRkdfR1BDUjJfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BEUjAKCWxkcgkJcjEsCT1DRkdfR1BEUjBfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BEUjEKCWxkcgkJcjEsCT1DRkdfR1BEUjFfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BEUjIKCWxkcgkJcjEsCT1DRkdfR1BEUjJfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjBfTAoJbGRyCQlyMSwJPUNGR19HQUZSMF9MX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIwX1UKCWxkcgkJcjEsCT1DRkdfR0FGUjBfVV9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSMV9MCglsZHIJCXIxLAk9Q0ZHX0dBRlIxX0xfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjFfVQoJbGRyCQlyMSwJPUNGR19HQUZSMV9VX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIyX0wKCWxkcgkJcjEsCT1DRkdfR0FGUjJfTF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSMl9VCglsZHIJCXIxLAk9Q0ZHX0dBRlIyX1VfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJcjAsCT1QU1NSCQkvKiBlbmFibGUgR1BJTyBwaW5zICovCglsZHIJCXIxLAk9Q0ZHX1BTU1JfVkFMCglzdHIJCXIxLCAgIFtyMF0KCi8qCWxkcglyMywJPU1TQzEJCS8gIGxvdyAtIGJhbmsgMiBMdWJib2NrIFJlZ2lzdGVycyAvIFNSQU0gKi8KLyoJbGRyCXIyLAk9Q0ZHX01TQzFfVkFMCS8gIGhpZ2ggLSBiYW5rIDMgRXRoZXJuZXQgQ29udHJvbGxlciAqLwovKglzdHIJcjIsCVtyM10JCS8gIG5lZWQgdG8gc2V0IE1TQzEgYmVmb3JlIHRyeWluZyB0byB3cml0ZSB0byB0aGUgSEVYIExFRHMgKi8KLyoJbGRyCXIyLAlbcjNdCQkvICBuZWVkIHRvIHJlYWQgaXQgYmFjayB0byBtYWtlIHN1cmUgdGhlIHZhbHVlIGxhdGNoZXMgKHNlZSBNU0Mgc2VjdGlvbiBvZiBtYW51YWwpICovCi8qICovCi8qCWxkcglyMSwJPUxFRF9CTEFOSyAqLwovKgltb3YJcjAsCSMweEZGICovCi8qCXN0cglyMCwJW3IxXQkJLyAgdHVybiBvbiBoZXggbGVkcyAqLwovKiAqLwovKmxvb3A6ICovCi8qICovCi8qICAgbGRyCXIwLCA9MHhCMDA3MDAwMSAqLwovKiAgIGxkcglyMSwgPV9MRUQgKi8KLyogICBzdHIJcjAsIFtyMV0JCS8gIGhleCBkaXNwbGF5ICovCgoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIEVuYWJsZSBtZW1vcnkgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIFRoZSBzZXF1ZW5jZSBiZWxvdyBpcyBiYXNlZCBvbiB0aGUgcmVjb21tZW5kZWQgaW5pdCBzdGVwcyAgICAgICAgKi8KCS8qIGRldGFpbGVkIGluIHRoZSBJbnRlbCBQWEEyNTAgT3BlcmF0aW5nIFN5c3RlbXMgRGV2ZWxvcGVycyBHdWlkZSwgKi8KCS8qIENoYXB0ZXIgMTAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDE6IFdhaXQgZm9yIGF0IGxlYXN0IDIwMCBtaWNyb3NlZG9uZHMgdG8gYWxsb3cgaW50ZXJuYWwgICAgICovCgkvKiAgICAgICAgIGNsb2NrcyB0byBzZXR0bGUuIE9ubHkgbmVjZXNzYXJ5IGFmdGVyIGhhcmQgcmVzZXQuLi4gICAgICovCgkvKiAgICAgICAgIEZJWE1FOiBjYW4gYmUgb3B0aW1pemVkIGxhdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJbGRyIHIzLCA9T1NDUgkJCS8qIHJlc2V0IHRoZSBPUyBUaW1lciBDb3VudCB0byB6ZXJvICovCgltb3YgcjIsICMwCglzdHIgcjIsIFtyM10KCWxkciByNCwgPTB4MzAwCQkJLyogcmVhbGx5IDB4MkUxIGlzIGFib3V0IDIwMHVzZWMsICAgKi8KCQkJCQkvKiBzbyAweDMwMCBzaG91bGQgYmUgcGxlbnR5ICAgICAgICAqLwoxOgoJbGRyIHIyLCBbcjNdCgljbXAgcjQsIHIyCgliZ3QgMWIKCm1lbV9pbml0OgoKCWxkciAgICAgcjEsICA9TUVNQ19CQVNFCQkvKiBnZXQgbWVtb3J5IGNvbnRyb2xsZXIgYmFzZSBhZGRyLiAqLwoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMmE6IEluaXRpYWxpemUgQXN5bmNocm9ub3VzIHN0YXRpYyBtZW1vcnkgY29udHJvbGxlciAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiBNU0MgcmVnaXN0ZXJzOiB0aW1pbmcsIGJ1cyB3aWR0aCwgbWVtIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICovCgoJLyogTVNDMDogbkNTKDAsMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJbGRyICAgICByMiwgICA9Q0ZHX01TQzBfVkFMCglzdHIgICAgIHIyLCAgIFtyMSwgI01TQzBfT0ZGU0VUXQoJbGRyICAgICByMiwgICBbcjEsICNNU0MwX09GRlNFVF0JLyogcmVhZCBiYWNrIHRvIGVuc3VyZSAgICAgICovCgkJCQkJCS8qIHRoYXQgZGF0YSBsYXRjaGVzICAgICAgICAqLwoJLyogTVNDMTogbkNTKDIsMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJbGRyICAgICByMiwgID1DRkdfTVNDMV9WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNU0MxX09GRlNFVF0KCWxkciAgICAgcjIsICBbcjEsICNNU0MxX09GRlNFVF0KCgkvKiBNU0MyOiBuQ1MoNCw1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgPUNGR19NU0MyX1ZBTAoJc3RyICAgICByMiwgIFtyMSwgI01TQzJfT0ZGU0VUXQoJbGRyICAgICByMiwgIFtyMSwgI01TQzJfT0ZGU0VUXQoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMmI6IEluaXRpYWxpemUgQ2FyZCBJbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiBNRUNSOiBNZW1vcnkgRXhwYW5zaW9uIENhcmQgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgPUNGR19NRUNSX1ZBTAoJc3RyICAgICByMiwgIFtyMSwgI01FQ1JfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNRUNSX09GRlNFVF0KCgkvKiBNQ01FTTA6IENhcmQgSW50ZXJmYWNlIHNsb3QgMCB0aW1pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgPUNGR19NQ01FTTBfVkFMCglzdHIgICAgIHIyLCAgW3IxLCAjTUNNRU0wX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNNRU0wX09GRlNFVF0KCgkvKiBNQ01FTTE6IENhcmQgSW50ZXJmYWNlIHNsb3QgMSB0aW1pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgPUNGR19NQ01FTTFfVkFMCglzdHIgICAgIHIyLCAgW3IxLCAjTUNNRU0xX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNNRU0xX09GRlNFVF0KCgkvKiBNQ0FUVDA6IENhcmQgSW50ZXJmYWNlIEF0dHJpYnV0ZSBTcGFjZSBUaW1pbmcsIHNsb3QgMCAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgPUNGR19NQ0FUVDBfVkFMCglzdHIgICAgIHIyLCAgW3IxLCAjTUNBVFQwX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNBVFQwX09GRlNFVF0KCgkvKiBNQ0FUVDE6IENhcmQgSW50ZXJmYWNlIEF0dHJpYnV0ZSBTcGFjZSBUaW1pbmcsIHNsb3QgMSAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgPUNGR19NQ0FUVDFfVkFMCglzdHIgICAgIHIyLCAgW3IxLCAjTUNBVFQxX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNBVFQxX09GRlNFVF0KCgkvKiBNQ0lPMDogQ2FyZCBJbnRlcmZhY2UgSS9PIFNwYWNlIFRpbWluZywgc2xvdCAwICAgICAgICAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgPUNGR19NQ0lPMF9WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNQ0lPMF9PRkZTRVRdCglsZHIJcjIsCVtyMSwgI01DSU8wX09GRlNFVF0KCgkvKiBNQ0lPMTogQ2FyZCBJbnRlcmZhY2UgSS9PIFNwYWNlIFRpbWluZywgc2xvdCAxICAgICAgICAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgPUNGR19NQ0lPMV9WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNQ0lPMV9PRkZTRVRdCglsZHIJcjIsCVtyMSwgI01DSU8xX09GRlNFVF0KCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDJjOiBXcml0ZSBGTFlDTkZHICBGSVhNRTogd2hhdCdzIHRoYXQ/Pz8gICAgICAgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogdGVzdCBpZiB3ZSBydW4gZnJvbSBmbGFzaCBvciBSQU0gLSBSQU0vQkRJOiBkb24ndCBzZXR1cCBSQU0gICAgICAqLwoJYWRyCXIzLCBtZW1faW5pdAkJLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2RlICAgKi8KCWxkcglyMiwgPW1lbV9pbml0CgljbXAJcjMsIHIyCQkJLyogc2tpcCBpbml0IGlmIGluIHBsYWNlICAgICAgICAgICAgKi8KCWJlcQlpbml0aXJxcwoKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDJkOiBJbml0aWFsaXplIFRpbWluZyBmb3IgU3luYyBNZW1vcnkgKFNEQ0xLMCkgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogQmVmb3JlIGFjY2Vzc2luZyBNRFJFRlIgd2UgbmVlZCBhIHZhbGlkIERSSSBmaWVsZCwgc28gd2Ugc2V0ICAgICAqLwoJLyogdGhpcyB0byBwb3dlciBvbiBkZWZhdWx0cyArIERSSSBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCWxkcglyMywJPUNGR19NRFJFRlJfVkFMCglsZHIJcjIsCT0weEZGRgoJYW5kCXIzLAlyMywgcjIKCWxkcglyNCwJPTB4MDNjYTQwMDAKCW9ycglyNCwJcjQsICByMwoKCXN0cglyNCwJW3IxLCAjTURSRUZSX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCglsZHIgICAgIHI0LAlbcjEsICNNRFJFRlJfT0ZGU0VUXQoKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDM6IEluaXRpYWxpemUgU3luY2hyb25vdXMgU3RhdGljIE1lbW9yeSAoRmxhc2gvUGVyaXBoZXJhbHMpICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogSW5pdGlhbGl6ZSBTWENORkcgcmVnaXN0ZXIuIEFzc2VydCB0aGUgZW5hYmxlIGJpdHMgICAgICAgICAgICAgICAqLwoKCS8qIFdyaXRlIFNYTVJTIHRvIGNhdXNlIGFuIE1SUyBjb21tYW5kIHRvIGFsbCBlbmFibGVkIGJhbmtzIG9mICAgICAgKi8KCS8qIHN5bmNocm9ub3VzIHN0YXRpYyBtZW1vcnkuIE5vdGUgdGhhdCBTWExDUiBuZWVkIG5vdCBiZSB3cml0dGVuICAgKi8KCS8qIGF0IHRoaXMgdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCgkvKiBGSVhNRTogd2UgdXNlIGFzeW5jIG1vZGUgZm9yIG5vdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgNDogSW5pdGlhbGl6ZSBTRFJBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiBTdGVwIDRhOiBhc3NlcnQgTURSRUZSOks/UlVOIGFuZCBjb25maWd1cmUgICAgICAgICAgICAgICAgICAgICAgICovCgkvKiAgICAgICAgICBNRFJFRlI6SzFEQjIgYW5kIE1EUkVGUjpLMkRCMiBhcyBkZXNpcmVkLiAgICAgICAgICAgICAgICovCgoJbGRyCXI0LAk9Q0ZHX01EUkVGUl9WQUwKCXN0cglyNCwJW3IxLCAjTURSRUZSX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCglsZHIJcjQsCVtyMSwgI01EUkVGUl9PRkZTRVRdCgoJLyogU3RlcCA0YjogZGUtYXNzZXJ0IE1EUkVGUjpTTEZSU0guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCWJpYwlyNCwJcjQsICMoTURSRUZSX1NMRlJTSCkKCglzdHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0gICAgLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCglsZHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0KCgoJLyogU3RlcCA0YzogYXNzZXJ0IE1EUkVGUjpFMVBJTiBhbmQgRTBQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCW9ycglyNCwJcjQsCSMoTURSRUZSX0UxUElOfE1EUkVGUl9FMFBJTikKCglzdHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0gICAgLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCglsZHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0KCgoJLyogU3RlcCA0ZDogd3JpdGUgTURDTkZHIHdpdGggTURDTkZHOkRFeCBkZWFzc2VydGVkIChzZXQgdG8gMCksIHRvICAqLwoJLyogICAgICAgICAgY29uZmlndXJlIGJ1dCBub3QgZW5hYmxlIGVhY2ggU0RSQU0gcGFydGl0aW9uIHBhaXIuICAgICAqLwoKCWxkcglyNCwJPUNGR19NRENORkdfVkFMCgliaWMJcjQsCXI0LAkjKE1EQ05GR19ERTB8TURDTkZHX0RFMSkKCglzdHIgICAgIHI0LCAgICAgW3IxLCAjTURDTkZHX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRENORkcgICAgICAgICovCglsZHIgICAgIHI0LCAgICAgW3IxLCAjTURDTkZHX09GRlNFVF0KCgoJLyogU3RlcCA0ZTogV2FpdCBmb3IgdGhlIGNsb2NrIHRvIHRoZSBTRFJBTXMgdG8gc3RhYmlsaXplLCAgICAgICAgICAqLwoJLyogICAgICAgICAgMTAwLi4yMDAgtXNlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCWxkciByMywgPU9TQ1IJCQkvKiByZXNldCB0aGUgT1MgVGltZXIgQ291bnQgdG8gemVybyAqLwoJbW92IHIyLCAjMAoJc3RyIHIyLCBbcjNdCglsZHIgcjQsID0weDMwMAkJCS8qIHJlYWxseSAweDJFMSBpcyBhYm91dCAyMDB1c2VjLCAgICovCgkJCQkJLyogc28gMHgzMDAgc2hvdWxkIGJlIHBsZW50eSAgICAgICAgKi8KMToKCWxkciByMiwgW3IzXQoJY21wIHI0LCByMgoJYmd0IDFiCgoKCS8qIFN0ZXAgNGY6IFRyaWdnZXIgYSBudW1iZXIgKHVzdWFsbHkgOCkgcmVmcmVzaCBjeWNsZXMgYnkgICAgICAgICAgKi8KCS8qICAgICAgICAgIGF0dGVtcHRpbmcgbm9uLWJ1cnN0IHJlYWQgb3Igd3JpdGUgYWNjZXNzZXMgdG8gZGlzYWJsZWQgKi8KCS8qICAgICAgICAgIFNEUkFNLCBhcyBjb21tb25seSBzcGVjaWZpZWQgaW4gdGhlIHBvd2VyIHVwIHNlcXVlbmNlICAgKi8KCS8qICAgICAgICAgIGRvY3VtZW50ZWQgaW4gU0RSQU0gZGF0YSBzaGVldHMuIFRoZSBhZGRyZXNzKGVzKSB1c2VkICAgKi8KCS8qICAgICAgICAgIGZvciB0aGlzIHB1cnBvc2UgbXVzdCBub3QgYmUgY2FjaGVhYmxlLiAgICAgICAgICAgICAgICAgKi8KCgkvKiAgICAgICAgICBUaGVyZSBzaG91bGQgOSB3cml0ZXMsIHNpbmNlIHRoZSBmaXJzdCB3cml0ZSBkb2Vzbid0ICAgICovCgkvKiAgICAgICAgICB0cmlnZ2VyIGEgcmVmcmVzaCBjeWNsZSBvbiBQWEEyNTAuIFNlZSBJbnRlbCBQWEEyNTAgYW5kICovCgkvKiAgICAgICAgICBQWEEyMTAgUHJvY2Vzc29ycyBTcGVjaWZpY2F0aW9uIFVwZGF0ZSwgICAgICAgICAgICAgICAgICovCgkvKiAgICAgICAgICBKYW4gMjAwMywgRXJyYXRhICMxMTYsIHBhZ2UgMzAuICAgICAgICAgICAgICAgICAgICAgICAgICovCgoKCWxkcglyMywJPUNGR19EUkFNX0JBU0UKCXN0cglyMiwgW3IzXQoJc3RyCXIyLCBbcjNdCglzdHIJcjIsIFtyM10KCXN0cglyMiwgW3IzXQoJc3RyCXIyLCBbcjNdCglzdHIJcjIsIFtyM10KCXN0cglyMiwgW3IzXQoJc3RyCXIyLCBbcjNdCglzdHIJcjIsIFtyM10KCgkvKiBTdGVwIDRnOiBXcml0ZSBNRENORkcgd2l0aCBlbmFibGUgYml0cyBhc3NlcnRlZCAgICAgICAgICAgICAgICAgICovCgkvKiAgICAgICAgICAoTURDTkZHOkRFeCBzZXQgdG8gMSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoJbGRyCXIzLCBbcjEsICNNRENORkdfT0ZGU0VUXQoJb3JyCXIzLAlyMywJIyhNRENORkdfREUwfE1EQ05GR19ERTEpCglzdHIJcjMsIFtyMSwgI01EQ05GR19PRkZTRVRdCgoJLyogU3RlcCA0aDogV3JpdGUgTURNUlMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCWxkciAgICAgcjIsICA9Q0ZHX01ETVJTX1ZBTAoJc3RyICAgICByMiwgIFtyMSwgI01ETVJTX09GRlNFVF0KCgoJLyogV2UgYXJlIGZpbmlzaGVkIHdpdGggSW50ZWwncyBtZW1vcnkgY29udHJvbGxlciBpbml0aWFsaXNhdGlvbiAgICAqLwoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIERpc2FibGUgKG1hc2spIGFsbCBpbnRlcnJ1cHRzIGF0IGludGVycnVwdCBjb250cm9sbGVyICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmluaXRpcnFzOgoKCW1vdiAgICAgcjEsICMwCQkvKiBjbGVhciBpbnQuIGxldmVsIHJlZ2lzdGVyIChJUlEsIG5vdCBGSVEpICovCglsZHIgICAgIHIyLCAgPUlDTFIKCXN0ciAgICAgcjEsICBbcjJdCgoJbGRyICAgICByMiwgID1JQ01SCS8qIG1hc2sgYWxsIGludGVycnVwdHMgYXQgdGhlIGNvbnRyb2xsZXIgICAgKi8KCXN0ciAgICAgcjEsICBbcjJdCgoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIENsb2NrIGluaXRpYWxpc2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmluaXRjbGtzOgoKCS8qIERpc2FibGUgdGhlIHBlcmlwaGVyYWwgY2xvY2tzLCBhbmQgc2V0IHRoZSBjb3JlIGNsb2NrIGZyZXF1ZW5jeSAgKi8KCS8qIChoYXJkLWNvZGluZyBhdCAzOTguMTJNSHogZm9yIG5vdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCgkvKiBUdXJuIE9mZiBBTEwgb24tY2hpcCBwZXJpcGhlcmFsIGNsb2NrcyBmb3IgcmUtY29uZmlndXJhdGlvbiAgICAgICovCgkvKiBOb3RlOiBTZWUgbGFiZWwgJ0VOQUJMRUNMS1MnIGZvciB0aGUgcmUtZW5hYmxpbmcgICAgICAgICAgICAgICAgICovCglsZHIgICAgIHIxLCAgPUNLRU4KCW1vdiAgICAgcjIsICAjMAoJc3RyICAgICByMiwgIFtyMV0KCgoJLyogZGVmYXVsdCB2YWx1ZSBpbiBjYXNlIG5vIHZhbGlkIHJvdGFyeSBzd2l0Y2ggc2V0dGluZyBpcyBmb3VuZCAgICAqLwoJbGRyICAgICByMiwgPShDQ0NSX0wyN3xDQ0NSX00yfENDQ1JfTjEwKSAgLyogREVGQVVMVDogezIwMC8yMDAvMTAwfSAqLwoKCS8qIC4uLiBhbmQgd3JpdGUgdGhlIGNvcmUgY2xvY2sgY29uZmlnIHJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjEsICA9Q0NDUgoJc3RyICAgICByMiwgIFtyMV0KCgkvKiBlbmFibGUgdGhlIDMyS2h6IG9zY2lsbGF0b3IgZm9yIFJUQyBhbmQgUG93ZXJNYW5hZ2VyICAgICAgICAgICAgICovCi8qCglsZHIgICAgIHIxLCAgPU9TQ0MKCW1vdiAgICAgcjIsICAjT1NDQ19PT04KCXN0ciAgICAgcjIsICBbcjFdCiovCgkvKiBOT1RFOiAgc3BpbiBoZXJlIHVudGlsIE9TQ0MuT09LIGdldCBzZXQsIG1lYW5pbmcgdGhlIFBMTCAgICAgICAgICovCgkvKiBoYXMgc2V0dGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCjYwOgoJbGRyICAgICByMiwgW3IxXQoJYW5kcyAgICByMiwgcjIsICMxCgliZXEgICAgIDYwYgoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiBTYXZlIFNEUkFNIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglsZHIJcjEsID1EUkFNX1NJWkUKCXN0cglyOCwgW3IxXQoKCS8qIEludGVycnVwdCBpbml0OiBNYXNrIGFsbCBpbnRlcnJ1cHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWxkcglyMCwgPUlDTVIJCQkvKiBlbmFibGUgbm8gc291cmNlcyAgICAgICAgKi8KCW1vdglyMSwgIzAKCXN0cglyMSwgW3IwXQoKCS8qIEZJWE1FICovCgojaWZuZGVmIERFQlVHCgkvKkRpc2FibGUgc29mdHdhcmUgYW5kIGRhdGEgYnJlYWtwb2ludHMgKi8KCW1vdglyMCwjMAoJbWNyCXAxNSwwLHIwLGMxNCxjOCwwICAvKiBpYmNyMCAqLwoJbWNyCXAxNSwwLHIwLGMxNCxjOSwwICAvKiBpYmNyMSAqLwoJbWNyCXAxNSwwLHIwLGMxNCxjNCwwICAvKiBkYmNvbiAqLwoKCS8qRW5hYmxlIGFsbCBkZWJ1ZyBmdW5jdGlvbmFsaXR5ICovCgltb3YJcjAsIzB4ODAwMDAwMDAKCW1jcglwMTQsMCxyMCxjMTAsYzAsMCAgLyogZGNzciAqLwojZW5kaWYKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBFbmQgbG93bGV2ZWxfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmVuZGxvd2xldmVsX2luaXQ6CgogICAgbW92ICAgICBwYywgbHIK