LyoKICogTW9zdCBvZiB0aGlzIHRha2VuIGZyb20gUmVkYm9vdCBoYWxfcGxhdGZvcm1fc2V0dXAuaCB3aXRoIGNsZWFudXAKICoKICogTk9URTogSSBoYXZlbid0IGNsZWFuIHRoaXMgdXAgY29uc2lkZXJhYmx5LCBqdXN0IGVub3VnaCB0byBnZXQgaXQKICogcnVubmluZy4gU2VlIGhhbF9wbGF0Zm9ybV9zZXR1cC5oIGZvciB0aGUgc291cmNlLiBTZWUKICogYm9hcmQvY3JhZGxlL2xvd2xldmVsX2luaXQuUyBmb3IgYW5vdGhlciBQWEEyNTAgc2V0dXAgdGhhdCBpcwogKiBtdWNoIGNsZWFuZXIuCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8dmVyc2lvbi5oPgojaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KCkRSQU1fU0laRTogIC5sb25nICAgQ0ZHX0RSQU1fU0laRQoKLyogd2FpdCBmb3IgY29wcm9jZXNzb3Igd3JpdGUgY29tcGxldGUgKi8KICAgLm1hY3JvIENQV0FJVCByZWcKICAgbXJjICBwMTUsMCxccmVnLGMyLGMwLDAKICAgbW92ICBccmVnLFxyZWcKICAgc3ViICBwYyxwYywjNAogICAuZW5kbQoKCi8qCiAqIAlNZW1vcnkgc2V0dXAKICovCgouZ2xvYmwgbG93bGV2ZWxfaW5pdApsb3dsZXZlbF9pbml0OgoKCS8qIFNldCB1cCBHUElPIHBpbnMgZmlyc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCglsZHIJCXIwLAk9R1BTUjAKCWxkcgkJcjEsCT1DRkdfR1BTUjBfVkFMCglzdHIJCXIxLAlbcjBdCgoJbGRyCQlyMCwJPUdQU1IxCglsZHIJCXIxLAk9Q0ZHX0dQU1IxX1ZBTAoJc3RyCQlyMSwgIFtyMF0KCglsZHIJCXIwLAk9R1BTUjIKCWxkcgkJcjEsCT1DRkdfR1BTUjJfVkFMCglzdHIJCXIxLAlbcjBdCgoJbGRyCQlyMCwJPUdQQ1IwCglsZHIJCXIxLAk9Q0ZHX0dQQ1IwX1ZBTAoJc3RyCQlyMSwJW3IwXQoKCWxkcgkJcjAsCT1HUENSMQoJbGRyCQlyMSwJPUNGR19HUENSMV9WQUwKCXN0cgkJcjEsCVtyMF0KCglsZHIJCXIwLAk9R1BDUjIKCWxkcgkJcjEsCT1DRkdfR1BDUjJfVkFMCglzdHIJCXIxLAlbcjBdCgoJbGRyCQlyMCwJPUdQRFIwCglsZHIJCXIxLAk9Q0ZHX0dQRFIwX1ZBTAoJc3RyCQlyMSwJW3IwXQoKCWxkcgkJcjAsCT1HUERSMQoJbGRyCQlyMSwJPUNGR19HUERSMV9WQUwKCXN0cgkJcjEsCVtyMF0KCglsZHIJCXIwLAk9R1BEUjIKCWxkcgkJcjEsCT1DRkdfR1BEUjJfVkFMCglzdHIJCXIxLAlbcjBdCgoJbGRyCQlyMCwJPUdBRlIwX0wKCWxkcgkJcjEsCT1DRkdfR0FGUjBfTF9WQUwKCXN0cgkJcjEsCVtyMF0KCglsZHIJCXIwLAk9R0FGUjBfVQoJbGRyCQlyMSwJPUNGR19HQUZSMF9VX1ZBTAoJc3RyCQlyMSwJW3IwXQoKCWxkcgkJcjAsCT1HQUZSMV9MCglsZHIJCXIxLAk9Q0ZHX0dBRlIxX0xfVkFMCglzdHIJCXIxLAlbcjBdCgoJbGRyCQlyMCwJPUdBRlIxX1UKCWxkcgkJcjEsCT1DRkdfR0FGUjFfVV9WQUwKCXN0cgkJcjEsCVtyMF0KCglsZHIJCXIwLAk9R0FGUjJfTAoJbGRyCQlyMSwJPUNGR19HQUZSMl9MX1ZBTAoJc3RyCQlyMSwJW3IwXQoKCWxkcgkJcjAsCT1HQUZSMl9VCglsZHIJCXIxLAk9Q0ZHX0dBRlIyX1VfVkFMCglzdHIJCXIxLAlbcjBdCgoJbGRyCQlyMCwJPVBTU1IJCQkJLyogZW5hYmxlIEdQSU8gcGlucyAqLwoJbGRyCQlyMSwJPUNGR19QU1NSX1ZBTAoJc3RyCQlyMSwJW3IwXQoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIEVuYWJsZSBtZW1vcnkgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIFRoZSBzZXF1ZW5jZSBiZWxvdyBpcyBiYXNlZCBvbiB0aGUgcmVjb21tZW5kZWQgaW5pdCBzdGVwcyAgICAgICAgKi8KCS8qIGRldGFpbGVkIGluIHRoZSBJbnRlbCBQWEEyNTAgT3BlcmF0aW5nIFN5c3RlbXMgRGV2ZWxvcGVycyBHdWlkZSwgKi8KCS8qIENoYXB0ZXIgMTAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDE6IFdhaXQgZm9yIGF0IGxlYXN0IDIwMCBtaWNyb3NlZG9uZHMgdG8gYWxsb3cgaW50ZXJuYWwgICAgICovCgkvKiAgICAgICAgIGNsb2NrcyB0byBzZXR0bGUuIE9ubHkgbmVjZXNzYXJ5IGFmdGVyIGhhcmQgcmVzZXQuLi4gICAgICovCgkvKiAgICAgICAgIEZJWE1FOiBjYW4gYmUgb3B0aW1pemVkIGxhdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJbGRyCQlyMywJPU9TQ1IJCQkvKiByZXNldCB0aGUgT1MgVGltZXIgQ291bnQgdG8gemVybyAqLwoJbW92IAlyMiwJIzAKCXN0ciAJcjIsCVtyM10KCWxkciAJcjQsCT0weDMwMAkJCQkvKiByZWFsbHkgMHgyRTEgaXMgYWJvdXQgMjAwdXNlYywgICAqLwoJCQkJCQkJLyogc28gMHgzMDAgc2hvdWxkIGJlIHBsZW50eSAgICAgICAgKi8KMToKCWxkciAJcjIsCVtyM10KCWNtcCAJcjQsCXIyCgliZ3QgCTFiCgptZW1faW5pdDoKCglsZHIgIAlyMSwJPU1FTUNfQkFTRQkJLyogZ2V0IG1lbW9yeSBjb250cm9sbGVyIGJhc2UgYWRkci4gKi8KCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDJhOiBJbml0aWFsaXplIEFzeW5jaHJvbm91cyBzdGF0aWMgbWVtb3J5IGNvbnRyb2xsZXIgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogTVNDIHJlZ2lzdGVyczogdGltaW5nLCBidXMgd2lkdGgsIG1lbSB0eXBlICAgICAgICAgICAgICAgICAgICAgICAqLwoKCS8qIE1TQzA6IG5DUygwLDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgCXIyLAk9Q0ZHX01TQzBfVkFMCglzdHIgIAlyMiwJW3IxLCAjTVNDMF9PRkZTRVRdCglsZHIgIAlyMiwJW3IxLCAjTVNDMF9PRkZTRVRdCS8qIHJlYWQgYmFjayB0byBlbnN1cmUgICAgICAqLwoJCQkJCQkvKiB0aGF0IGRhdGEgbGF0Y2hlcyAgICAgICAgKi8KCS8qIE1TQzE6IG5DUygyLDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgCXIyLAk9Q0ZHX01TQzFfVkFMCglzdHIgIAlyMiwJW3IxLCAjTVNDMV9PRkZTRVRdCglsZHIgIAlyMiwJW3IxLCAjTVNDMV9PRkZTRVRdCgoJLyogTVNDMjogbkNTKDQsNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJbGRyICAJcjIsCT1DRkdfTVNDMl9WQUwKCXN0ciAgCXIyLAlbcjEsICNNU0MyX09GRlNFVF0KCWxkciAgCXIyLAlbcjEsICNNU0MyX09GRlNFVF0KCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDJiOiBJbml0aWFsaXplIENhcmQgSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogTUVDUjogTWVtb3J5IEV4cGFuc2lvbiBDYXJkIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJbGRyICAJcjIsCT1DRkdfTUVDUl9WQUwKCXN0ciAgCXIyLAlbcjEsICNNRUNSX09GRlNFVF0KCWxkcgkgCXIyLAlbcjEsICNNRUNSX09GRlNFVF0KCgkvKiBNQ01FTTA6IENhcmQgSW50ZXJmYWNlIHNsb3QgMCB0aW1pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglsZHIgIAlyMiwJPUNGR19NQ01FTTBfVkFMCglzdHIgIAlyMiwJW3IxLCAjTUNNRU0wX09GRlNFVF0KCWxkcgkgCXIyLAlbcjEsICNNQ01FTTBfT0ZGU0VUXQoKCS8qIE1DTUVNMTogQ2FyZCBJbnRlcmZhY2Ugc2xvdCAxIHRpbWluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgCXIyLAk9Q0ZHX01DTUVNMV9WQUwKCXN0ciAgCXIyLAlbcjEsICNNQ01FTTFfT0ZGU0VUXQoJbGRyCSAJcjIsCVtyMSwgI01DTUVNMV9PRkZTRVRdCgoJLyogTUNBVFQwOiBDYXJkIEludGVyZmFjZSBBdHRyaWJ1dGUgU3BhY2UgVGltaW5nLCBzbG90IDAgICAgICAgICAgICAqLwoJbGRyICAJcjIsCT1DRkdfTUNBVFQwX1ZBTAoJc3RyICAJcjIsCVtyMSwgI01DQVRUMF9PRkZTRVRdCglsZHIJIAlyMiwJW3IxLCAjTUNBVFQwX09GRlNFVF0KCgkvKiBNQ0FUVDE6IENhcmQgSW50ZXJmYWNlIEF0dHJpYnV0ZSBTcGFjZSBUaW1pbmcsIHNsb3QgMSAgICAgICAgICAgICovCglsZHIgIAlyMiwgPUNGR19NQ0FUVDFfVkFMCglzdHIgIAlyMiwgW3IxLCAjTUNBVFQxX09GRlNFVF0KCWxkcgkgCXIyLAlbcjEsICNNQ0FUVDFfT0ZGU0VUXQoKCS8qIE1DSU8wOiBDYXJkIEludGVyZmFjZSBJL08gU3BhY2UgVGltaW5nLCBzbG90IDAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgCXIyLCA9Q0ZHX01DSU8wX1ZBTAoJc3RyICAJcjIsIFtyMSwgI01DSU8wX09GRlNFVF0KCWxkcgkgCXIyLAlbcjEsICNNQ0lPMF9PRkZTRVRdCgoJLyogTUNJTzE6IENhcmQgSW50ZXJmYWNlIEkvTyBTcGFjZSBUaW1pbmcsIHNsb3QgMSAgICAgICAgICAgICAgICAgICAqLwoJbGRyICAJcjIsID1DRkdfTUNJTzFfVkFMCglzdHIgIAlyMiwgW3IxLCAjTUNJTzFfT0ZGU0VUXQoJbGRyCSAJcjIsCVtyMSwgI01DSU8xX09GRlNFVF0KCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDJjOiBXcml0ZSBGTFlDTkZHICBGSVhNRTogd2hhdCdzIHRoYXQ/Pz8gICAgICAgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMmQ6IEluaXRpYWxpemUgVGltaW5nIGZvciBTeW5jIE1lbW9yeSAoU0RDTEswKSAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiBCZWZvcmUgYWNjZXNzaW5nIE1EUkVGUiB3ZSBuZWVkIGEgdmFsaWQgRFJJIGZpZWxkLCBzbyB3ZSBzZXQgICAgICovCgkvKiB0aGlzIHRvIHBvd2VyIG9uIGRlZmF1bHRzICsgRFJJIGZpZWxkLCBzZXQgU0RSQU0gY2xvY2tzIGZyZWUgcnVubmluZyAqLwoKCWxkciAgCXIzLCA9Q0ZHX01EUkVGUl9WQUwKCWxkciAgCXIyLCA9MHhGRkYKCWFuZCAgCXIzLCByMywgIHIyCgoJbGRyCSAJcjAsCVtyMSwgI01EUkVGUl9PRkZTRVRdCgliaWMJIAlyMCwgcjAsIHIyCgliaWMJIAlyMCwgcjAsICMoTURSRUZSX0swRlJFRXxNRFJFRlJfSzFGUkVFfE1EUkVGUl9LMkZSRUUpCglvcnIJIAlyMCwgcjAsIHIzCgoJc3RyCQlyMCwJW3IxLCAjTURSRUZSX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCgoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMzogSW5pdGlhbGl6ZSBTeW5jaHJvbm91cyBTdGF0aWMgTWVtb3J5IChGbGFzaC9QZXJpcGhlcmFscykgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiBJbml0aWFsaXplIFNYQ05GRyByZWdpc3Rlci4gQXNzZXJ0IHRoZSBlbmFibGUgYml0cyAgICAgICAgICAgICAgICovCgoJLyogV3JpdGUgU1hNUlMgdG8gY2F1c2UgYW4gTVJTIGNvbW1hbmQgdG8gYWxsIGVuYWJsZWQgYmFua3Mgb2YgICAgICAqLwoJLyogc3luY2hyb25vdXMgc3RhdGljIG1lbW9yeS4gTm90ZSB0aGF0IFNYTENSIG5lZWQgbm90IGJlIHdyaXR0ZW4gICAqLwoJLyogYXQgdGhpcyB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCS8qIEZJWE1FOiB3ZSB1c2UgYXN5bmMgbW9kZSBmb3Igbm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCA0OiBJbml0aWFsaXplIFNEUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIHNldCBNRFJFRlIgYWNjb3JkaW5nIHRvIHVzZXIgZGVmaW5lIHdpdGggZXhjZXB0aW9uIG9mIGEgZmV3IGJpdHMgKi8KCglsZHIgICAgIHI0LCA9Q0ZHX01EUkVGUl9WQUwKCWxkcgkJcjIsID0oTURSRUZSX0swUlVOfE1EUkVGUl9LMERCMnxNRFJFRlJfSzFSVU58TURSRUZSX0sxREIyfFwKCQkJCQlNRFJFRlJfSzJSVU4gfE1EUkVGUl9LMkRCMikKCWFuZAkJcjQsIHI0LCByMgoJYmljCQlyMCwJcjAsCXIyCglvcnIJCXIwLCByMCwgcjQKCglzdHIgICAgIHIwLCBbcjEsICNNRFJFRlJfT0ZGU0VUXSAgICAvKiB3cml0ZSBiYWNrIE1EUkVGUiAgICAgICAgKi8KCWxkciAgICAgcjAsIFtyMSwgI01EUkVGUl9PRkZTRVRdCgoJLyogU3RlcCA0YjogZGUtYXNzZXJ0IE1EUkVGUjpTTEZSU0guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCWJpYwkJcjAsIHIwLAkjKE1EUkVGUl9TTEZSU0gpCglzdHIgICAgIHIwLCBbcjEsICNNRFJFRlJfT0ZGU0VUXSAgICAvKiB3cml0ZSBiYWNrIE1EUkVGUiAgICAgICAgKi8KCWxkciAgICAgcjAsIFtyMSwgI01EUkVGUl9PRkZTRVRdCgoKCS8qIFN0ZXAgNGM6IGFzc2VydCBNRFJFRlI6RTFQSU4gYW5kIEUwUElPIGFzIGRlc2lyZWQsIHNldCBLWEZSRUUgICovCgoJbGRyICAgICByNCwgPUNGR19NRFJFRlJfVkFMCglsZHIJCXIyLCA9KE1EUkVGUl9FMFBJTnxNRFJFRlJfRTFQSU58TURSRUZSX0swRlJFRXwgXAoJCQkJCU1EUkVGUl9LMUZSRUUgfCBNRFJFRlJfSzJGUkVFKQoJYW5kCQlyNCwgcjQsIHIyCglvcnIJCXIwLCByMCwgcjQKCXN0ciAgICAgcjAsIFtyMSwgI01EUkVGUl9PRkZTRVRdICAgIC8qIHdyaXRlIGJhY2sgTURSRUZSICAgICAgICAqLwoJbGRyICAgICByMCwgW3IxLCAjTURSRUZSX09GRlNFVF0KCgoJLyogU3RlcCA0ZDogd3JpdGUgTURDTkZHIHdpdGggTURDTkZHOkRFeCBkZWFzc2VydGVkIChzZXQgdG8gMCksIHRvICAqLwoJLyogICAgICAgICAgY29uZmlndXJlIGJ1dCBub3QgZW5hYmxlIGVhY2ggU0RSQU0gcGFydGl0aW9uIHBhaXIuICAgICAqLwoKCWxkcgkJcjQsCT1DRkdfTURDTkZHX1ZBTAoJYmljCQlyNCwJcjQsCSMoTURDTkZHX0RFMHxNRENORkdfREUxKQoJYmljCQlyNCwgcjQsCSMoTURDTkZHX0RFMnxNRENORkdfREUzKQoJc3RyICAgICByNCwgW3IxLCAjTURDTkZHX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRENORkcgICAgICAgICovCglsZHIgICAgIHI0LCBbcjEsICNNRENORkdfT0ZGU0VUXQoKCgkvKiBTdGVwIDRlOiBXYWl0IGZvciB0aGUgY2xvY2sgdG8gdGhlIFNEUkFNcyB0byBzdGFiaWxpemUsICAgICAgICAgICovCgkvKiAgICAgICAgICAxMDAuLjIwMCC1c2VjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoJbGRyIAlyMywgPU9TQ1IJCQkvKiByZXNldCB0aGUgT1MgVGltZXIgQ291bnQgdG8gemVybyAqLwoJbW92IAlyMiwgIzAKCXN0ciAJcjIsIFtyM10KCWxkciAJcjQsID0weDMwMAkJCS8qIHJlYWxseSAweDJFMSBpcyBhYm91dCAyMDB1c2VjLCAgICovCgkJCQkJCS8qIHNvIDB4MzAwIHNob3VsZCBiZSBwbGVudHkgICAgICAgICovCjE6CglsZHIgCXIyLCBbcjNdCgljbXAgCXI0LCByMgoJYmd0IAkxYgoKCgkvKiBTdGVwIDRmOiBUcmlnZ2VyIGEgbnVtYmVyICh1c3VhbGx5IDgpIHJlZnJlc2ggY3ljbGVzIGJ5ICAgICAgICAgICovCgkvKiAgICAgICAgICBhdHRlbXB0aW5nIG5vbi1idXJzdCByZWFkIG9yIHdyaXRlIGFjY2Vzc2VzIHRvIGRpc2FibGVkICovCgkvKiAgICAgICAgICBTRFJBTSwgYXMgY29tbW9ubHkgc3BlY2lmaWVkIGluIHRoZSBwb3dlciB1cCBzZXF1ZW5jZSAgICovCgkvKiAgICAgICAgICBkb2N1bWVudGVkIGluIFNEUkFNIGRhdGEgc2hlZXRzLiBUaGUgYWRkcmVzcyhlcykgdXNlZCAgICovCgkvKiAgICAgICAgICBmb3IgdGhpcyBwdXJwb3NlIG11c3Qgbm90IGJlIGNhY2hlYWJsZS4gICAgICAgICAgICAgICAgICovCgoJbGRyCQlyMywJPUNGR19EUkFNX0JBU0UKLnJlcHQgOAoJc3RyCQlyMiwJW3IzXQouZW5kcgoKCS8qIFN0ZXAgNGc6IFdyaXRlIE1EQ05GRyB3aXRoIGVuYWJsZSBiaXRzIGFzc2VydGVkICAgICAgICAgICAgICAgICAgKi8KCS8qICAgICAgICAgIChNRENORkc6REV4IHNldCB0byAxKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCglsZHIgICAgIHIzLCBbcjEsICNNRENORkdfT0ZGU0VUXQoJb3JyCXIzLAlyMywJIyhNRENORkdfREUwfE1EQ05GR19ERTEpCglzdHIgICAgIHIzLCBbcjEsICNNRENORkdfT0ZGU0VUXQoKCS8qIFN0ZXAgNGg6IFdyaXRlIE1ETVJTLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCglsZHIgICAgIHIyLCA9Q0ZHX01ETVJTX1ZBTAoJc3RyICAgICByMiwgW3IxLCAjTURNUlNfT0ZGU0VUXQoKCgkvKiBXZSBhcmUgZmluaXNoZWQgd2l0aCBJbnRlbCdzIG1lbW9yeSBjb250cm9sbGVyIGluaXRpYWxpc2F0aW9uICAgICovCgoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIERpc2FibGUgKG1hc2spIGFsbCBpbnRlcnJ1cHRzIGF0IGludGVycnVwdCBjb250cm9sbGVyICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmluaXRpcnFzOgoKCW1vdiAgICAgcjEsICMwCQkvKiBjbGVhciBpbnQuIGxldmVsIHJlZ2lzdGVyIChJUlEsIG5vdCBGSVEpICovCglsZHIgICAgIHIyLCA9SUNMUgoJc3RyICAgICByMSwgW3IyXQoKCWxkciAgICAgcjIsID1JQ01SCS8qIG1hc2sgYWxsIGludGVycnVwdHMgYXQgdGhlIGNvbnRyb2xsZXIgICAgKi8KCXN0ciAgICAgcjEsIFtyMl0KCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogQ2xvY2sgaW5pdGlhbGlzYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKaW5pdGNsa3M6CgoJLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCBjbG9ja3MsIGFuZCBzZXQgdGhlIGNvcmUgY2xvY2sgZnJlcXVlbmN5ICAqLwoKCS8qIFR1cm4gT2ZmIEFMTCBvbi1jaGlwIHBlcmlwaGVyYWwgY2xvY2tzIGZvciByZS1jb25maWd1cmF0aW9uICAgICAgKi8KCS8qIE5vdGU6IFNlZSBsYWJlbCAnRU5BQkxFQ0xLUycgZm9yIHRoZSByZS1lbmFibGluZyAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjEsID1DS0VOCgltb3YgICAgIHIyLCAjMAoJc3RyICAgICByMiwgW3IxXQoKCgkvKiBkZWZhdWx0IHZhbHVlIGluIGNhc2Ugbm8gdmFsaWQgcm90YXJ5IHN3aXRjaCBzZXR0aW5nIGlzIGZvdW5kICAgICovCglsZHIgICAgIHIyLCA9KENDQ1JfTDI3fENDQ1JfTTJ8Q0NDUl9OMTApICAvKiBERUZBVUxUOiB7MjAwLzIwMC8xMDB9ICovCgoJLyogLi4uIGFuZCB3cml0ZSB0aGUgY29yZSBjbG9jayBjb25maWcgcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLwoJbGRyICAgICByMSwgPUNDQ1IKCXN0ciAgICAgcjIsIFtyMV0KCiNpZmRlZiBSVEMKCS8qIGVuYWJsZSB0aGUgMzJLaHogb3NjaWxsYXRvciBmb3IgUlRDIGFuZCBQb3dlck1hbmFnZXIgICAgICAgICAgICAgKi8KCglsZHIgICAgIHIxLCA9T1NDQwoJbW92ICAgICByMiwgI09TQ0NfT09OCglzdHIgICAgIHIyLCBbcjFdCgoJLyogTk9URTogIHNwaW4gaGVyZSB1bnRpbCBPU0NDLk9PSyBnZXQgc2V0LCBtZWFuaW5nIHRoZSBQTEwgICAgICAgICAqLwoJLyogaGFzIHNldHRsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwo2MDoKCWxkciAgICAgcjIsIFtyMV0KCWFuZHMgICAgcjIsIHIyLCAjMQoJYmVxICAgICA2MGIKI2VuZGlmCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIFNhdmUgU0RSQU0gc2l6ZSAqLwogICAgbGRyICAgICByMSwgPURSQU1fU0laRQoJc3RyICAgCXI4LCBbcjFdCgoJLyogSW50ZXJydXB0IGluaXQ6IE1hc2sgYWxsIGludGVycnVwdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgbGRyCQlyMCwJPUlDTVIgLyogZW5hYmxlIG5vIHNvdXJjZXMgKi8KCW1vdiAJcjEsCSMwCiAgICBzdHIgCXIxLAlbcjBdCgoJLyogRklYTUUgKi8KCiNkZWZpbmUgTk9ERUJVRwojaWZkZWYgTk9ERUJVRwoJLypEaXNhYmxlIHNvZnR3YXJlIGFuZCBkYXRhIGJyZWFrcG9pbnRzICovCgltb3YJCXIwLCMwCgltY3IJCXAxNSwwLHIwLGMxNCxjOCwwICAvKiBpYmNyMCAqLwoJbWNyCQlwMTUsMCxyMCxjMTQsYzksMCAgLyogaWJjcjEgKi8KCW1jcgkJcDE1LDAscjAsYzE0LGM0LDAgIC8qIGRiY29uICovCgoJLypFbmFibGUgYWxsIGRlYnVnIGZ1bmN0aW9uYWxpdHkgKi8KCW1vdgkJcjAsIzB4ODAwMDAwMDAKCW1jcgkJcDE0LDAscjAsYzEwLGMwLDAgIC8qIGRjc3IgKi8KCiNlbmRpZgoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIEVuZCBsb3dsZXZlbF9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKZW5kbG93bGV2ZWxfaW5pdDoKCiAgICBtb3YgICAgIHBjLAlscgo=