LyoKICogVGhpcyB3YXMgb3JpZ2luYWxseSBmcm9tIHRoZSBMdWJib2NrIHUtYm9vdCBwb3J0LgogKgogKiBNb3N0IG9mIHRoaXMgdGFrZW4gZnJvbSBSZWRib290IGhhbF9wbGF0Zm9ybV9zZXR1cC5oIHdpdGggY2xlYW51cAogKgogKiBOT1RFOiBJIGhhdmVuJ3QgY2xlYW4gdGhpcyB1cCBjb25zaWRlcmFibHksIGp1c3QgZW5vdWdoIHRvIGdldCBpdAogKiBydW5uaW5nLiBTZWUgaGFsX3BsYXRmb3JtX3NldHVwLmggZm9yIHRoZSBzb3VyY2UuIFNlZQogKiBib2FyZC9jcmFkbGUvbG93bGV2ZWxfaW5pdC5TIGZvciBhbm90aGVyIFBYQTI1MCBzZXR1cCB0aGF0IGlzCiAqIG11Y2ggY2xlYW5lci4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29uZmlnLmg+CiNpbmNsdWRlIDx2ZXJzaW9uLmg+CiNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgoKLyogd2FpdCBmb3IgY29wcm9jZXNzb3Igd3JpdGUgY29tcGxldGUgKi8KICAgLm1hY3JvIENQV0FJVCByZWcKICAgbXJjCXAxNSwwLFxyZWcsYzIsYzAsMAogICBtb3YJXHJlZyxccmVnCiAgIHN1YglwYyxwYywjNAogICAuZW5kbQoKCi8qCiAqCU1lbW9yeSBzZXR1cAogKi8KCi5nbG9ibCBsb3dsZXZlbF9pbml0Cmxvd2xldmVsX2luaXQ6CgoJLyogU2V0IHVwIEdQSU8gcGlucyBmaXJzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCWxkcgkJcjAsCT1HUFNSMAoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR1BTUjBfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BTUjEKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dQU1IxX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQU1IyCglsZHIJCXIxLAk9Q09ORklHX1NZU19HUFNSMl9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUFNSMwoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR1BTUjNfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BDUjAKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dQQ1IwX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQQ1IxCglsZHIJCXIxLAk9Q09ORklHX1NZU19HUENSMV9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUENSMgoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR1BDUjJfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BDUjMKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dQQ1IzX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdSRVIwCglsZHIJCXIxLAk9Q09ORklHX1NZU19HUkVSMF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUkVSMQoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR1JFUjFfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1JFUjIKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dSRVIyX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdSRVIzCglsZHIJCXIxLAk9Q09ORklHX1NZU19HUkVSM19WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HRkVSMAoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR0ZFUjBfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0ZFUjEKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dGRVIxX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdGRVIyCglsZHIJCXIxLAk9Q09ORklHX1NZU19HRkVSMl9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HRkVSMwoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR0ZFUjNfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BEUjAKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dQRFIwX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQRFIxCglsZHIJCXIxLAk9Q09ORklHX1NZU19HUERSMV9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUERSMgoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR1BEUjJfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BEUjMKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dQRFIzX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIwX0wKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dBRlIwX0xfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjBfVQoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR0FGUjBfVV9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSMV9MCglsZHIJCXIxLAk9Q09ORklHX1NZU19HQUZSMV9MX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIxX1UKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dBRlIxX1VfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjJfTAoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR0FGUjJfTF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSMl9VCglsZHIJCXIxLAk9Q09ORklHX1NZU19HQUZSMl9VX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIzX0wKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dBRlIzX0xfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjNfVQoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR0FGUjNfVV9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1QU1NSCQkvKiBlbmFibGUgR1BJTyBwaW5zICovCglsZHIJCXIxLAk9Q09ORklHX1NZU19QU1NSX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogRW5hYmxlIG1lbW9yeSBpbnRlcmZhY2UJCQkJCSAgICAqLwoJLyoJCQkJCQkJCSAgICAqLwoJLyogVGhlIHNlcXVlbmNlIGJlbG93IGlzIGJhc2VkIG9uIHRoZSByZWNvbW1lbmRlZCBpbml0IHN0ZXBzCSAgICAqLwoJLyogZGV0YWlsZWQgaW4gdGhlIEludGVsIFBYQTI1MCBPcGVyYXRpbmcgU3lzdGVtcyBEZXZlbG9wZXJzIEd1aWRlLCAqLwoJLyogQ2hhcHRlciAxMC4JCQkJCQkJICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCAxOiBXYWl0IGZvciBhdCBsZWFzdCAyMDAgbWljcm9zZWRvbmRzIHRvIGFsbG93IGludGVybmFsCSAgICAqLwoJLyoJICAgY2xvY2tzIHRvIHNldHRsZS4gT25seSBuZWNlc3NhcnkgYWZ0ZXIgaGFyZCByZXNldC4uLgkgICAgKi8KCS8qCSAgIEZJWE1FOiBjYW4gYmUgb3B0aW1pemVkIGxhdGVyCQkJICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJbGRyIHIzLCA9T1NDUgkJCS8qIHJlc2V0IHRoZSBPUyBUaW1lciBDb3VudCB0byB6ZXJvICovCgltb3YgcjIsICMwCglzdHIgcjIsIFtyM10KCWxkciByNCwgPTB4MzAwCQkJLyogcmVhbGx5IDB4MkUxIGlzIGFib3V0IDIwMHVzZWMsICAgKi8KCQkJCQkvKiBzbyAweDMwMCBzaG91bGQgYmUgcGxlbnR5CSAgICAqLwoxOgoJbGRyIHIyLCBbcjNdCgljbXAgcjQsIHIyCgliZ3QgMWIKCm1lbV9pbml0OgoKCWxkcglyMSwgID1NRU1DX0JBU0UJCS8qIGdldCBtZW1vcnkgY29udHJvbGxlciBiYXNlIGFkZHIuICovCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCAyYTogSW5pdGlhbGl6ZSBBc3luY2hyb25vdXMgc3RhdGljIG1lbW9yeSBjb250cm9sbGVyCSAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIE1TQyByZWdpc3RlcnM6IHRpbWluZywgYnVzIHdpZHRoLCBtZW0gdHlwZQkJCSAgICAqLwoKCS8qIE1TQzA6IG5DUygwLDEpCQkJCQkJICAgICovCglsZHIJcjIsICAgPUNPTkZJR19TWVNfTVNDMF9WQUwKCXN0cglyMiwgICBbcjEsICNNU0MwX09GRlNFVF0KCWxkcglyMiwgICBbcjEsICNNU0MwX09GRlNFVF0JLyogcmVhZCBiYWNrIHRvIGVuc3VyZQkgICAgKi8KCQkJCQkJLyogdGhhdCBkYXRhIGxhdGNoZXMJICAgICovCgkvKiBNU0MxOiBuQ1MoMiwzKQkJCQkJCSAgICAqLwoJbGRyCXIyLCAgPUNPTkZJR19TWVNfTVNDMV9WQUwKCXN0cglyMiwgIFtyMSwgI01TQzFfT0ZGU0VUXQoJbGRyCXIyLCAgW3IxLCAjTVNDMV9PRkZTRVRdCgoJLyogTVNDMjogbkNTKDQsNSkJCQkJCQkgICAgKi8KCWxkcglyMiwgID1DT05GSUdfU1lTX01TQzJfVkFMCglzdHIJcjIsICBbcjEsICNNU0MyX09GRlNFVF0KCWxkcglyMiwgIFtyMSwgI01TQzJfT0ZGU0VUXQoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMmI6IEluaXRpYWxpemUgQ2FyZCBJbnRlcmZhY2UJCQkJICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogTUVDUjogTWVtb3J5IEV4cGFuc2lvbiBDYXJkIFJlZ2lzdGVyCQkJCSAgICAqLwoJbGRyCXIyLCAgPUNPTkZJR19TWVNfTUVDUl9WQUwKCXN0cglyMiwgIFtyMSwgI01FQ1JfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNRUNSX09GRlNFVF0KCgkvKiBNQ01FTTA6IENhcmQgSW50ZXJmYWNlIHNsb3QgMCB0aW1pbmcJCQkJICAgICovCglsZHIJcjIsICA9Q09ORklHX1NZU19NQ01FTTBfVkFMCglzdHIJcjIsICBbcjEsICNNQ01FTTBfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ01FTTBfT0ZGU0VUXQoKCS8qIE1DTUVNMTogQ2FyZCBJbnRlcmZhY2Ugc2xvdCAxIHRpbWluZwkJCQkgICAgKi8KCWxkcglyMiwgID1DT05GSUdfU1lTX01DTUVNMV9WQUwKCXN0cglyMiwgIFtyMSwgI01DTUVNMV9PRkZTRVRdCglsZHIJcjIsCVtyMSwgI01DTUVNMV9PRkZTRVRdCgoJLyogTUNBVFQwOiBDYXJkIEludGVyZmFjZSBBdHRyaWJ1dGUgU3BhY2UgVGltaW5nLCBzbG90IDAJICAgICovCglsZHIJcjIsICA9Q09ORklHX1NZU19NQ0FUVDBfVkFMCglzdHIJcjIsICBbcjEsICNNQ0FUVDBfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ0FUVDBfT0ZGU0VUXQoKCS8qIE1DQVRUMTogQ2FyZCBJbnRlcmZhY2UgQXR0cmlidXRlIFNwYWNlIFRpbWluZywgc2xvdCAxCSAgICAqLwoJbGRyCXIyLCAgPUNPTkZJR19TWVNfTUNBVFQxX1ZBTAoJc3RyCXIyLCAgW3IxLCAjTUNBVFQxX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNBVFQxX09GRlNFVF0KCgkvKiBNQ0lPMDogQ2FyZCBJbnRlcmZhY2UgSS9PIFNwYWNlIFRpbWluZywgc2xvdCAwCQkgICAgKi8KCWxkcglyMiwgID1DT05GSUdfU1lTX01DSU8wX1ZBTAoJc3RyCXIyLCAgW3IxLCAjTUNJTzBfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ0lPMF9PRkZTRVRdCgoJLyogTUNJTzE6IENhcmQgSW50ZXJmYWNlIEkvTyBTcGFjZSBUaW1pbmcsIHNsb3QgMQkJICAgICovCglsZHIJcjIsICA9Q09ORklHX1NZU19NQ0lPMV9WQUwKCXN0cglyMiwgIFtyMSwgI01DSU8xX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNJTzFfT0ZGU0VUXQoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMmM6IFdyaXRlIEZMWUNORkcgIEZJWE1FOiB3aGF0J3MgdGhhdD8/PwkJICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglsZHIJcjIsICA9Q09ORklHX1NZU19GTFlDTkZHX1ZBTAoJc3RyCXIyLCAgW3IxLCAjRkxZQ05GR19PRkZTRVRdCglzdHIJcjIsCVtyMSwgI0ZMWUNORkdfT0ZGU0VUXQoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMmQ6IEluaXRpYWxpemUgVGltaW5nIGZvciBTeW5jIE1lbW9yeSAoU0RDTEswKQkJICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogQmVmb3JlIGFjY2Vzc2luZyBNRFJFRlIgd2UgbmVlZCBhIHZhbGlkIERSSSBmaWVsZCwgc28gd2Ugc2V0CSAgICAqLwoJLyogdGhpcyB0byBwb3dlciBvbiBkZWZhdWx0cyArIERSSSBmaWVsZC4JCQkgICAgKi8KCglsZHIJcjQsCVtyMSwgI01EUkVGUl9PRkZTRVRdCglsZHIJcjIsCT0weEZGRgoJYmljCXI0LAlyNCwgcjIKCglsZHIJcjMsCT1DT05GSUdfU1lTX01EUkVGUl9WQUwKCWFuZAlyMywJcjMsICByMgoKCW9ycglyNCwJcjQsIHIzCglzdHIJcjQsCVtyMSwgI01EUkVGUl9PRkZTRVRdCS8qIHdyaXRlIGJhY2sgTURSRUZSCSAgICAqLwoKCW9ycglyNCwgIHI0LCAjTURSRUZSX0swUlVOCglvcnIJcjQsICByNCwgI01EUkVGUl9LMERCNAoJb3JyCXI0LCAgcjQsICNNRFJFRlJfSzBGUkVFCglvcnIJcjQsICByNCwgI01EUkVGUl9LMERCMgoJb3JyCXI0LCAgcjQsICNNRFJFRlJfSzFEQjIKCWJpYwlyNCwgIHI0LCAjTURSRUZSX0sxRlJFRQoJYmljCXI0LCAgcjQsICNNRFJFRlJfSzJGUkVFCgoJc3RyCXI0LAlbcjEsICNNRFJFRlJfT0ZGU0VUXQkvKiB3cml0ZSBiYWNrIE1EUkVGUgkgICAgKi8KCWxkcglyNCwgIFtyMSwgI01EUkVGUl9PRkZTRVRdCgoJLyogTm90ZTogcHJlc2VydmUgdGhlIG1kcmVmciB2YWx1ZSBpbiByNAkJCSAgICAqLwoKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDM6IEluaXRpYWxpemUgU3luY2hyb25vdXMgU3RhdGljIE1lbW9yeSAoRmxhc2gvUGVyaXBoZXJhbHMpICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogSW5pdGlhbGl6ZSBTWENORkcgcmVnaXN0ZXIuIEFzc2VydCB0aGUgZW5hYmxlIGJpdHMJCSAgICAqLwoKCS8qIFdyaXRlIFNYTVJTIHRvIGNhdXNlIGFuIE1SUyBjb21tYW5kIHRvIGFsbCBlbmFibGVkIGJhbmtzIG9mCSAgICAqLwoJLyogc3luY2hyb25vdXMgc3RhdGljIG1lbW9yeS4gTm90ZSB0aGF0IFNYTENSIG5lZWQgbm90IGJlIHdyaXR0ZW4gICAqLwoJLyogYXQgdGhpcyB0aW1lLgkJCQkJCSAgICAqLwoKCWxkcglyMiwgID1DT05GSUdfU1lTX1NYQ05GR19WQUwKCXN0cglyMiwgIFtyMSwgI1NYQ05GR19PRkZTRVRdCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCA0OiBJbml0aWFsaXplIFNEUkFNCQkJCQkgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgliaWMJcjQsIHI0LCAjKE1EUkVGUl9LMkZSRUUgfE1EUkVGUl9LMUZSRUUgfCBNRFJFRlJfSzBGUkVFKQoKCW9ycglyNCwgcjQsICNNRFJFRlJfSzFSVU4KCWJpYwlyNCwgcjQsICNNRFJFRlJfSzJEQjIKCXN0cglyNCwgW3IxLCAjTURSRUZSX09GRlNFVF0KCWxkcglyNCwgW3IxLCAjTURSRUZSX09GRlNFVF0KCgliaWMJcjQsIHI0LCAjTURSRUZSX1NMRlJTSAoJc3RyCXI0LCBbcjEsICNNRFJFRlJfT0ZGU0VUXQoJbGRyCXI0LCBbcjEsICNNRFJFRlJfT0ZGU0VUXQoKCW9ycglyNCwgcjQsICNNRFJFRlJfRTFQSU4KCXN0cglyNCwgW3IxLCAjTURSRUZSX09GRlNFVF0KCWxkcglyNCwgW3IxLCAjTURSRUZSX09GRlNFVF0KCglub3AKCW5vcAoKCgkvKiBTdGVwIDRkOiB3cml0ZSBNRENORkcgd2l0aCBNRENORkc6REV4IGRlYXNzZXJ0ZWQgKHNldCB0byAwKSwgdG8gICovCgkvKgkgICAgY29uZmlndXJlIGJ1dCBub3QgZW5hYmxlIGVhY2ggU0RSQU0gcGFydGl0aW9uIHBhaXIuCSAgICAqLwoKCWxkcglyNCwJPUNPTkZJR19TWVNfTURDTkZHX1ZBTAoJYmljCXI0LAlyNCwJIyhNRENORkdfREUwfE1EQ05GR19ERTEpCgliaWMJcjQsCXI0LAkjKE1EQ05GR19ERTJ8TURDTkZHX0RFMykKCglzdHIJcjQsCVtyMSwgI01EQ05GR19PRkZTRVRdCS8qIHdyaXRlIGJhY2sgTURDTkZHCSAgICAqLwoJbGRyCXI0LAlbcjEsICNNRENORkdfT0ZGU0VUXQoKCgkvKiBTdGVwIDRlOiBXYWl0IGZvciB0aGUgY2xvY2sgdG8gdGhlIFNEUkFNcyB0byBzdGFiaWxpemUsCSAgICAqLwoJLyoJICAgIDEwMC4uMjAwILVzZWMuCQkJCQkgICAgKi8KCglsZHIgcjMsID1PU0NSCQkJLyogcmVzZXQgdGhlIE9TIFRpbWVyIENvdW50IHRvIHplcm8gKi8KCW1vdiByMiwgIzAKCXN0ciByMiwgW3IzXQoJbGRyIHI0LCA9MHgzMDAJCQkvKiByZWFsbHkgMHgyRTEgaXMgYWJvdXQgMjAwdXNlYywgICAqLwoJCQkJCS8qIHNvIDB4MzAwIHNob3VsZCBiZSBwbGVudHkJICAgICovCjE6CgkgICAgbGRyIHIyLCBbcjNdCgkgICAgY21wIHI0LCByMgoJICAgIGJndCAxYgoKCgkvKiBTdGVwIDRmOiBUcmlnZ2VyIGEgbnVtYmVyICh1c3VhbGx5IDgpIHJlZnJlc2ggY3ljbGVzIGJ5CSAgICAqLwoJLyoJICAgIGF0dGVtcHRpbmcgbm9uLWJ1cnN0IHJlYWQgb3Igd3JpdGUgYWNjZXNzZXMgdG8gZGlzYWJsZWQgKi8KCS8qCSAgICBTRFJBTSwgYXMgY29tbW9ubHkgc3BlY2lmaWVkIGluIHRoZSBwb3dlciB1cCBzZXF1ZW5jZSAgICovCgkvKgkgICAgZG9jdW1lbnRlZCBpbiBTRFJBTSBkYXRhIHNoZWV0cy4gVGhlIGFkZHJlc3MoZXMpIHVzZWQgICAqLwoJLyoJICAgIGZvciB0aGlzIHB1cnBvc2UgbXVzdCBub3QgYmUgY2FjaGVhYmxlLgkJICAgICovCgoJbGRyCXIzLAk9Q09ORklHX1NZU19EUkFNX0JBU0UKCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCgoKCS8qIFN0ZXAgNGc6IFdyaXRlIE1EQ05GRyB3aXRoIGVuYWJsZSBiaXRzIGFzc2VydGVkCQkgICAgKi8KCS8qCSAgICAoTURDTkZHOkRFeCBzZXQgdG8gMSkuCQkJCSAgICAqLwoKCWxkcglyMywJW3IxLCAjTURDTkZHX09GRlNFVF0KCW1vdglyNCwgcjMKCW9ycglyMywJcjMsCSNNRENORkdfREUwCglzdHIJcjMsCVtyMSwgI01EQ05GR19PRkZTRVRdCgltb3YJcjAsIHIzCgoJLyogU3RlcCA0aDogV3JpdGUgTURNUlMuCQkJCQkgICAgKi8KCglsZHIJcjIsICA9Q09ORklHX1NZU19NRE1SU19WQUwKCXN0cglyMiwgIFtyMSwgI01ETVJTX09GRlNFVF0KCgkvKiBlbmFibGUgQVBEICovCglsZHIJcjMsICBbcjEsICNNRFJFRlJfT0ZGU0VUXQoJb3JyCXIzLCAgcjMsICAjTURSRUZSX0FQRAoJc3RyCXIzLCAgW3IxLCAjTURSRUZSX09GRlNFVF0KCgkvKiBXZSBhcmUgZmluaXNoZWQgd2l0aCBJbnRlbCdzIG1lbW9yeSBjb250cm9sbGVyIGluaXRpYWxpc2F0aW9uICAgICovCgoKc2V0dm9sdGFnZToKCgltb3YJcjEwLAlscgoJYmwJaW5pdFBYQXZvbHRhZ2UJLyogSW4gY2FzZSB0aGUgYm9hcmQgaXMgcmVib290aW5nIHdpdGggYSAgICAqLwoJbW92CWxyLAlyMTAJLyogbG93IHZvbHRhZ2UgcmFpc2UgaXQgdXAgdG8gYSBnb29kIG9uZS4gICAqLwoKI2lmIDEKCWIgaW5pdGlycXMKI2VuZGlmCgp3YWtldXA6CgkvKiBBcmUgd2Ugd2FraW5nIGZyb20gc2xlZXA/ICovCglsZHIJcjAsCT1SQ1NSCglsZHIJcjEsCVtyMF0KCWFuZAlyMSwJcjEsICMoUkNTUl9HUFIgfCBSQ1NSX1NNUiB8IFJDU1JfV0RSIHwgUkNTUl9IV1IpCglzdHIJcjEsCVtyMF0KCXRlcQlyMSwJI1JDU1JfU01SCgoJYm5lCWluaXRpcnFzCgoJbGRyCXIwLAk9UFNTUgoJbW92CXIxLAkjUFNTUl9QSAoJc3RyCXIxLAlbcjBdCgoJLyogaWYgc28sIHJlc3VtZSBhdCBQU1BSICovCglsZHIJcjAsCT1QU1BSCglsZHIJcjEsCVtyMF0KCW1vdglwYywJcjEKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBEaXNhYmxlIChtYXNrKSBhbGwgaW50ZXJydXB0cyBhdCBpbnRlcnJ1cHQgY29udHJvbGxlcgkgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmluaXRpcnFzOgoKCW1vdglyMSwgICMwCQkvKiBjbGVhciBpbnQuIGxldmVsIHJlZ2lzdGVyIChJUlEsIG5vdCBGSVEpICovCglsZHIJcjIsICA9SUNMUgoJc3RyCXIxLCAgW3IyXQoKCWxkcglyMiwgID1JQ01SCS8qIG1hc2sgYWxsIGludGVycnVwdHMgYXQgdGhlIGNvbnRyb2xsZXIgICAgKi8KCXN0cglyMSwgIFtyMl0KCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBDbG9jayBpbml0aWFsaXNhdGlvbgkJCQkJCSAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKaW5pdGNsa3M6CgoJLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCBjbG9ja3MsIGFuZCBzZXQgdGhlIGNvcmUgY2xvY2sgZnJlcXVlbmN5ICAqLwoKCS8qIFR1cm4gT2ZmIG9uLWNoaXAgcGVyaXBoZXJhbCBjbG9ja3MgKGV4Y2VwdCBmb3IgbWVtb3J5KQkgICAgKi8KCS8qIGZvciByZS1jb25maWd1cmF0aW9uLgkJCQkJICAgICovCglsZHIJcjEsICA9Q0tFTgoJbGRyCXIyLCAgPUNPTkZJR19TWVNfQ0tFTgoJc3RyCXIyLCAgW3IxXQoKCS8qIC4uLiBhbmQgd3JpdGUgdGhlIGNvcmUgY2xvY2sgY29uZmlnIHJlZ2lzdGVyCQkJICAgICovCglsZHIJcjIsICA9Q09ORklHX1NZU19DQ0NSCglsZHIJcjEsICA9Q0NDUgoJc3RyCXIyLCAgW3IxXQoKCS8qIFR1cm4gb24gdHVyYm8gbW9kZSAqLwoJbXJjCXAxNCwgMCwgcjIsIGM2LCBjMCwgMAoJb3JyCXIyLCByMiwgIzB4QgkJLyogVHVyYm8sIEZhc3QtQnVzLCBGcmVxIGNoYW5nZSoqLwoJbWNyCXAxNCwgMCwgcjIsIGM2LCBjMCwgMAoKCS8qIFJlLXdyaXRlIE1EUkVGUiAqLwoJbGRyCXIxLCA9TUVNQ19CQVNFCglsZHIJcjIsIFtyMSwgI01EUkVGUl9PRkZTRVRdCglzdHIJcjIsIFtyMSwgI01EUkVGUl9PRkZTRVRdCiNpZmRlZiBSVEMKCS8qIGVuYWJsZSB0aGUgMzJLaHogb3NjaWxsYXRvciBmb3IgUlRDIGFuZCBQb3dlck1hbmFnZXIJCSAgICAqLwoJbGRyCXIxLCAgPU9TQ0MKCW1vdglyMiwgICNPU0NDX09PTgoJc3RyCXIyLCAgW3IxXQoKCS8qIE5PVEU6ICBzcGluIGhlcmUgdW50aWwgT1NDQy5PT0sgZ2V0IHNldCwgbWVhbmluZyB0aGUgUExMCSAgICAqLwoJLyogaGFzIHNldHRsZWQuCQkJCQkJCSAgICAqLwo2MDoKCWxkcglyMiwgW3IxXQoJYW5kcwlyMiwgcjIsICMxCgliZXEJNjBiCiNlbHNlCiNlcnJvciAiUlRDIG5vdCBkZWZpbmVkIgojZW5kaWYKCgkvKiBJbnRlcnJ1cHQgaW5pdDogTWFzayBhbGwgaW50ZXJydXB0cwkJCQkgICAgKi8KICAgIGxkciByMCwgPUlDTVIgLyogZW5hYmxlIG5vIHNvdXJjZXMgKi8KCW1vdiByMSwgIzAKICAgIHN0ciByMSwgW3IwXQoJLyogRklYTUUgKi8KCiNpZmRlZiBOT0RFQlVHCgkvKkRpc2FibGUgc29mdHdhcmUgYW5kIGRhdGEgYnJlYWtwb2ludHMgKi8KCW1vdglyMCwjMAoJbWNyCXAxNSwwLHIwLGMxNCxjOCwwICAvKiBpYmNyMCAqLwoJbWNyCXAxNSwwLHIwLGMxNCxjOSwwICAvKiBpYmNyMSAqLwoJbWNyCXAxNSwwLHIwLGMxNCxjNCwwICAvKiBkYmNvbiAqLwoKCS8qRW5hYmxlIGFsbCBkZWJ1ZyBmdW5jdGlvbmFsaXR5ICovCgltb3YJcjAsIzB4ODAwMDAwMDAKCW1jcglwMTQsMCxyMCxjMTAsYzAsMCAgLyogZGNzciAqLwojZW5kaWYKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBFbmQgbG93bGV2ZWxfaW5pdAkJCQkJCQkgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmVuZGxvd2xldmVsX2luaXQ6CgoJbW92CXBjLCBscgo=