LyoKICogTW9zdCBvZiB0aGlzIHRha2VuIGZyb20gUmVkYm9vdCBoYWxfcGxhdGZvcm1fc2V0dXAuaCB3aXRoIGNsZWFudXAKICoKICogTk9URTogSSBoYXZlbid0IGNsZWFuIHRoaXMgdXAgY29uc2lkZXJhYmx5LCBqdXN0IGVub3VnaCB0byBnZXQgaXQKICogcnVubmluZy4gU2VlIGhhbF9wbGF0Zm9ybV9zZXR1cC5oIGZvciB0aGUgc291cmNlLiBTZWUKICogYm9hcmQvY3JhZGxlL21lbXNldHVwLlMgZm9yIGFub3RoZXIgUFhBMjUwIHNldHVwIHRoYXQgaXMKICogbXVjaCBjbGVhbmVyLgogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb25maWcuaD4KI2luY2x1ZGUgPHZlcnNpb24uaD4KI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CgpEUkFNX1NJWkU6ICAubG9uZyAgIENGR19EUkFNX1NJWkUKCi8qIHdhaXQgZm9yIGNvcHJvY2Vzc29yIHdyaXRlIGNvbXBsZXRlICovCiAgIC5tYWNybyBDUFdBSVQgcmVnCiAgIG1yYyAgcDE1LDAsXHJlZyxjMixjMCwwCiAgIG1vdiAgXHJlZyxccmVnCiAgIHN1YiAgcGMscGMsIzQKICAgLmVuZG0KCgovKgogKiAJTWVtb3J5IHNldHVwCiAqLwoKLmdsb2JsIG1lbXNldHVwCm1lbXNldHVwOgoKICAgIG1vdiAgICAgIHIxMCwgbHIKCgkvKiBTZXQgdXAgR1BJTyBwaW5zIGZpcnN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJbGRyCQlyMCwJPUdQU1IwCglsZHIJCXIxLAk9Q0ZHX0dQU1IwX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQU1IxCglsZHIJCXIxLAk9Q0ZHX0dQU1IxX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQU1IyCglsZHIJCXIxLAk9Q0ZHX0dQU1IyX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQQ1IwCglsZHIJCXIxLAk9Q0ZHX0dQQ1IwX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQQ1IxCglsZHIJCXIxLAk9Q0ZHX0dQQ1IxX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQQ1IyCglsZHIJCXIxLAk9Q0ZHX0dQQ1IyX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQRFIwCglsZHIJCXIxLAk9Q0ZHX0dQRFIwX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQRFIxCglsZHIJCXIxLAk9Q0ZHX0dQRFIxX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQRFIyCglsZHIJCXIxLAk9Q0ZHX0dQRFIyX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIwX0wKCWxkcgkJcjEsCT1DRkdfR0FGUjBfTF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSMF9VCglsZHIJCXIxLAk9Q0ZHX0dBRlIwX1VfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjFfTAoJbGRyCQlyMSwJPUNGR19HQUZSMV9MX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIxX1UKCWxkcgkJcjEsCT1DRkdfR0FGUjFfVV9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSMl9MCglsZHIJCXIxLAk9Q0ZHX0dBRlIyX0xfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjJfVQoJbGRyCQlyMSwJPUNGR19HQUZSMl9VX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCXIwLAk9UFNTUgkJLyogZW5hYmxlIEdQSU8gcGlucyAqLwoJbGRyCQlyMSwJPUNGR19QU1NSX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogRW5hYmxlIG1lbW9yeSBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogVGhlIHNlcXVlbmNlIGJlbG93IGlzIGJhc2VkIG9uIHRoZSByZWNvbW1lbmRlZCBpbml0IHN0ZXBzICAgICAgICAqLwoJLyogZGV0YWlsZWQgaW4gdGhlIEludGVsIFBYQTI1MCBPcGVyYXRpbmcgU3lzdGVtcyBEZXZlbG9wZXJzIEd1aWRlLCAqLwoJLyogQ2hhcHRlciAxMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMTogV2FpdCBmb3IgYXQgbGVhc3QgMjAwIG1pY3Jvc2Vkb25kcyB0byBhbGxvdyBpbnRlcm5hbCAgICAgKi8KCS8qICAgICAgICAgY2xvY2tzIHRvIHNldHRsZS4gT25seSBuZWNlc3NhcnkgYWZ0ZXIgaGFyZCByZXNldC4uLiAgICAgKi8KCS8qICAgICAgICAgRklYTUU6IGNhbiBiZSBvcHRpbWl6ZWQgbGF0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCglsZHIgcjMsID1PU0NSCQkJLyogcmVzZXQgdGhlIE9TIFRpbWVyIENvdW50IHRvIHplcm8gKi8KCW1vdiByMiwgIzAKCXN0ciByMiwgW3IzXQoJbGRyIHI0LCA9MHgzMDAJCQkvKiByZWFsbHkgMHgyRTEgaXMgYWJvdXQgMjAwdXNlYywgICAqLwoJCQkJCS8qIHNvIDB4MzAwIHNob3VsZCBiZSBwbGVudHkgICAgICAgICovCjE6CglsZHIgcjIsIFtyM10KCWNtcCByNCwgcjIKCWJndCAxYgoKbWVtX2luaXQ6CgogICAgICAgIGxkciAgICAgcjEsICA9TUVNQ19CQVNFCQkvKiBnZXQgbWVtb3J5IGNvbnRyb2xsZXIgYmFzZSBhZGRyLiAqLwoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMmE6IEluaXRpYWxpemUgQXN5bmNocm9ub3VzIHN0YXRpYyBtZW1vcnkgY29udHJvbGxlciAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiBNU0MgcmVnaXN0ZXJzOiB0aW1pbmcsIGJ1cyB3aWR0aCwgbWVtIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICovCgogICAgICAgIC8qIE1TQzA6IG5DUygwLDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICBsZHIgICAgIHIyLCAgID1DRkdfTVNDMF9WQUwKICAgICAgICBzdHIgICAgIHIyLCAgIFtyMSwgI01TQzBfT0ZGU0VUXQogICAgICAgIGxkciAgICAgcjIsICAgW3IxLCAjTVNDMF9PRkZTRVRdCS8qIHJlYWQgYmFjayB0byBlbnN1cmUgICAgICAqLwoJCQkJCQkvKiB0aGF0IGRhdGEgbGF0Y2hlcyAgICAgICAgKi8KICAgICAgICAvKiBNU0MxOiBuQ1MoMiwzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgbGRyICAgICByMiwgID1DRkdfTVNDMV9WQUwKICAgICAgICBzdHIgICAgIHIyLCAgW3IxLCAjTVNDMV9PRkZTRVRdCiAgICAgICAgbGRyICAgICByMiwgIFtyMSwgI01TQzFfT0ZGU0VUXQoKCS8qIE1TQzI6IG5DUyg0LDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICBsZHIgICAgIHIyLCAgPUNGR19NU0MyX1ZBTAogICAgICAgIHN0ciAgICAgcjIsICBbcjEsICNNU0MyX09GRlNFVF0KICAgICAgICBsZHIgICAgIHIyLCAgW3IxLCAjTVNDMl9PRkZTRVRdCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCAyYjogSW5pdGlhbGl6ZSBDYXJkIEludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIE1FQ1I6IE1lbW9yeSBFeHBhbnNpb24gQ2FyZCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICBsZHIgICAgIHIyLCAgPUNGR19NRUNSX1ZBTAogICAgICAgIHN0ciAgICAgcjIsICBbcjEsICNNRUNSX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUVDUl9PRkZTRVRdCgoJLyogTUNNRU0wOiBDYXJkIEludGVyZmFjZSBzbG90IDAgdGltaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIGxkciAgICAgcjIsICA9Q0ZHX01DTUVNMF9WQUwKICAgICAgICBzdHIgICAgIHIyLCAgW3IxLCAjTUNNRU0wX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNNRU0wX09GRlNFVF0KCiAgICAgICAgLyogTUNNRU0xOiBDYXJkIEludGVyZmFjZSBzbG90IDEgdGltaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIGxkciAgICAgcjIsICA9Q0ZHX01DTUVNMV9WQUwKICAgICAgICBzdHIgICAgIHIyLCAgW3IxLCAjTUNNRU0xX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNNRU0xX09GRlNFVF0KCgkvKiBNQ0FUVDA6IENhcmQgSW50ZXJmYWNlIEF0dHJpYnV0ZSBTcGFjZSBUaW1pbmcsIHNsb3QgMCAgICAgICAgICAgICovCiAgICAgICAgbGRyICAgICByMiwgID1DRkdfTUNBVFQwX1ZBTAogICAgICAgIHN0ciAgICAgcjIsICBbcjEsICNNQ0FUVDBfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ0FUVDBfT0ZGU0VUXQoKCS8qIE1DQVRUMTogQ2FyZCBJbnRlcmZhY2UgQXR0cmlidXRlIFNwYWNlIFRpbWluZywgc2xvdCAxICAgICAgICAgICAgKi8KICAgICAgICBsZHIgICAgIHIyLCAgPUNGR19NQ0FUVDFfVkFMCiAgICAgICAgc3RyICAgICByMiwgIFtyMSwgI01DQVRUMV9PRkZTRVRdCglsZHIJcjIsCVtyMSwgI01DQVRUMV9PRkZTRVRdCgoJLyogTUNJTzA6IENhcmQgSW50ZXJmYWNlIEkvTyBTcGFjZSBUaW1pbmcsIHNsb3QgMCAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIGxkciAgICAgcjIsICA9Q0ZHX01DSU8wX1ZBTAogICAgICAgIHN0ciAgICAgcjIsICBbcjEsICNNQ0lPMF9PRkZTRVRdCglsZHIJcjIsCVtyMSwgI01DSU8wX09GRlNFVF0KCgkvKiBNQ0lPMTogQ2FyZCBJbnRlcmZhY2UgSS9PIFNwYWNlIFRpbWluZywgc2xvdCAxICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgbGRyICAgICByMiwgID1DRkdfTUNJTzFfVkFMCiAgICAgICAgc3RyICAgICByMiwgIFtyMSwgI01DSU8xX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNJTzFfT0ZGU0VUXQoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAvKiBTdGVwIDJjOiBXcml0ZSBGTFlDTkZHICBGSVhNRTogd2hhdCdzIHRoYXQ/Pz8gICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgLyogU3RlcCAyZDogSW5pdGlhbGl6ZSBUaW1pbmcgZm9yIFN5bmMgTWVtb3J5IChTRENMSzApICAgICAgICAgICAgICAqLwogICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiBCZWZvcmUgYWNjZXNzaW5nIE1EUkVGUiB3ZSBuZWVkIGEgdmFsaWQgRFJJIGZpZWxkLCBzbyB3ZSBzZXQgICAgICovCgkvKiB0aGlzIHRvIHBvd2VyIG9uIGRlZmF1bHRzICsgRFJJIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgogICAgICAgIGxkciAgICAgcjMsICAgICA9Q0ZHX01EUkVGUl9WQUwKICAgICAgICBsZHIgICAgIHIyLCAgICAgPTB4RkZGCiAgICAgICAgYW5kICAgICByMywgICAgIHIzLCAgcjIKCWxkcglyNCwJPTB4MDNjYTQwMDAKICAgICAgICBvcnIgICAgIHI0LCAgICAgcjQsICByMwoJc3RyCXI0LAlbcjEsICNNRFJFRlJfT0ZGU0VUXQkvKiB3cml0ZSBiYWNrIE1EUkVGUiAgICAgICAgKi8KICAgICAgICBsZHIgICAgIHI0LCAgW3IxLCAjTURSRUZSX09GRlNFVF0KCiAgICAgICAgLyogTm90ZTogcHJlc2VydmUgdGhlIG1kcmVmciB2YWx1ZSBpbiByNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDM6IEluaXRpYWxpemUgU3luY2hyb25vdXMgU3RhdGljIE1lbW9yeSAoRmxhc2gvUGVyaXBoZXJhbHMpICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogSW5pdGlhbGl6ZSBTWENORkcgcmVnaXN0ZXIuIEFzc2VydCB0aGUgZW5hYmxlIGJpdHMgICAgICAgICAgICAgICAqLwoKCS8qIFdyaXRlIFNYTVJTIHRvIGNhdXNlIGFuIE1SUyBjb21tYW5kIHRvIGFsbCBlbmFibGVkIGJhbmtzIG9mICAgICAgKi8KCS8qIHN5bmNocm9ub3VzIHN0YXRpYyBtZW1vcnkuIE5vdGUgdGhhdCBTWExDUiBuZWVkIG5vdCBiZSB3cml0dGVuICAgKi8KCS8qIGF0IHRoaXMgdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCgkvKiBGSVhNRTogd2UgdXNlIGFzeW5jIG1vZGUgZm9yIG5vdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoKICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgLyogU3RlcCA0OiBJbml0aWFsaXplIFNEUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiAgICAgICAgLyogc2V0IE1EUkVGUiBhY2NvcmRpbmcgdG8gdXNlciBkZWZpbmUgd2l0aCBleGNlcHRpb24gb2YgYSBmZXcgYml0cyAqLwoKICAgICAgICBsZHIgICAgIHI0LCAgICAgPUNGR19NRFJFRlJfVkFMCglvcnIJcjQsCXI0LAkjKE1EUkVGUl9TTEZSU0gpCgliaWMJcjQsCXI0LAkjKE1EUkVGUl9FMVBJTnxNRFJFRlJfRTBQSU4pCglzdHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0gICAgLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCiAgICAgICAgbGRyICAgICByNCwgIFtyMSwgI01EUkVGUl9PRkZTRVRdCgoJLyogU3RlcCA0YjogZGUtYXNzZXJ0IE1EUkVGUjpTTEZSU0guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCWJpYwlyNCwJcjQsCSMoTURSRUZSX1NMRlJTSCkKICAgICAgICBzdHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0gICAgLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCiAgICAgICAgbGRyICAgICByNCwgIFtyMSwgI01EUkVGUl9PRkZTRVRdCgoKCS8qIFN0ZXAgNGM6IGFzc2VydCBNRFJFRlI6RTFQSU4gYW5kIEUwUElPIGFzIGRlc2lyZWQgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgbGRyICAgICByNCwgICAgID1DRkdfTURSRUZSX1ZBTAogICAgICAgIHN0ciAgICAgcjQsICAgICBbcjEsICNNRFJFRlJfT0ZGU0VUXSAgICAvKiB3cml0ZSBiYWNrIE1EUkVGUiAgICAgICAgKi8KICAgICAgICBsZHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0KCgoJLyogU3RlcCA0ZDogd3JpdGUgTURDTkZHIHdpdGggTURDTkZHOkRFeCBkZWFzc2VydGVkIChzZXQgdG8gMCksIHRvICAqLwoJLyogICAgICAgICAgY29uZmlndXJlIGJ1dCBub3QgZW5hYmxlIGVhY2ggU0RSQU0gcGFydGl0aW9uIHBhaXIuICAgICAqLwoKCWxkcglyNCwJPUNGR19NRENORkdfVkFMCgliaWMJcjQsCXI0LAkjKE1EQ05GR19ERTB8TURDTkZHX0RFMSkKCiAgICAgICAgc3RyICAgICByNCwgICAgIFtyMSwgI01EQ05GR19PRkZTRVRdCS8qIHdyaXRlIGJhY2sgTURDTkZHICAgICAgICAqLwogICAgICAgIGxkciAgICAgcjQsICAgICBbcjEsICNNRENORkdfT0ZGU0VUXQoKCgkvKiBTdGVwIDRlOiBXYWl0IGZvciB0aGUgY2xvY2sgdG8gdGhlIFNEUkFNcyB0byBzdGFiaWxpemUsICAgICAgICAgICovCgkvKiAgICAgICAgICAxMDAuLjIwMCC1c2VjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoJbGRyIHIzLCA9T1NDUgkJCS8qIHJlc2V0IHRoZSBPUyBUaW1lciBDb3VudCB0byB6ZXJvICovCiAgICAJbW92IHIyLCAjMAoJICAgIHN0ciByMiwgW3IzXQoJbGRyIHI0LCA9MHgzMDAJCQkvKiByZWFsbHkgMHgyRTEgaXMgYWJvdXQgMjAwdXNlYywgICAqLwoJCQkJCS8qIHNvIDB4MzAwIHNob3VsZCBiZSBwbGVudHkgICAgICAgICovCjE6CgkgICAgbGRyIHIyLCBbcjNdCgkgICAgY21wIHI0LCByMgoJICAgIGJndCAxYgoKCgkvKiBTdGVwIDRmOiBUcmlnZ2VyIGEgbnVtYmVyICh1c3VhbGx5IDgpIHJlZnJlc2ggY3ljbGVzIGJ5ICAgICAgICAgICovCgkvKiAgICAgICAgICBhdHRlbXB0aW5nIG5vbi1idXJzdCByZWFkIG9yIHdyaXRlIGFjY2Vzc2VzIHRvIGRpc2FibGVkICovCgkvKiAgICAgICAgICBTRFJBTSwgYXMgY29tbW9ubHkgc3BlY2lmaWVkIGluIHRoZSBwb3dlciB1cCBzZXF1ZW5jZSAgICovCgkvKiAgICAgICAgICBkb2N1bWVudGVkIGluIFNEUkFNIGRhdGEgc2hlZXRzLiBUaGUgYWRkcmVzcyhlcykgdXNlZCAgICovCgkvKiAgICAgICAgICBmb3IgdGhpcyBwdXJwb3NlIG11c3Qgbm90IGJlIGNhY2hlYWJsZS4gICAgICAgICAgICAgICAgICovCgoJbGRyCXIzLAk9Q0ZHX0RSQU1fQkFTRQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCgoJLyogU3RlcCA0ZzogV3JpdGUgTURDTkZHIHdpdGggZW5hYmxlIGJpdHMgYXNzZXJ0ZWQgICAgICAgICAgICAgICAgICAqLwoJLyogICAgICAgICAgKE1EQ05GRzpERXggc2V0IHRvIDEpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICBsZHIgICAgIHIzLCAgW3IxLCAjTURDTkZHX09GRlNFVF0KCW9ycglyMywJcjMsCSMoTURDTkZHX0RFMHxNRENORkdfREUxKQogICAgICAgIHN0ciAgICAgcjMsICBbcjEsICNNRENORkdfT0ZGU0VUXQoKCS8qIFN0ZXAgNGg6IFdyaXRlIE1ETVJTLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgbGRyICAgICByMiwgID1DRkdfTURNUlNfVkFMCiAgICAgICAgc3RyICAgICByMiwgIFtyMSwgI01ETVJTX09GRlNFVF0KCgoJLyogV2UgYXJlIGZpbmlzaGVkIHdpdGggSW50ZWwncyBtZW1vcnkgY29udHJvbGxlciBpbml0aWFsaXNhdGlvbiAgICAqLwoKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBEaXNhYmxlIChtYXNrKSBhbGwgaW50ZXJydXB0cyBhdCBpbnRlcnJ1cHQgY29udHJvbGxlciAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgppbml0aXJxczoKCiAgICAgICAgbW92ICAgICByMSwgIzAJCS8qIGNsZWFyIGludC4gbGV2ZWwgcmVnaXN0ZXIgKElSUSwgbm90IEZJUSkgKi8KICAgICAgICBsZHIgICAgIHIyLCAgPUlDTFIKICAgICAgICBzdHIgICAgIHIxLCAgW3IyXQoKICAgICAgICBsZHIgICAgIHIyLCAgPUlDTVIJLyogbWFzayBhbGwgaW50ZXJydXB0cyBhdCB0aGUgY29udHJvbGxlciAgICAqLwogICAgICAgIHN0ciAgICAgcjEsICBbcjJdCgoKICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBDbG9jayBpbml0aWFsaXNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKaW5pdGNsa3M6CgoJLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCBjbG9ja3MsIGFuZCBzZXQgdGhlIGNvcmUgY2xvY2sgZnJlcXVlbmN5ICAqLwoJLyogKGhhcmQtY29kaW5nIGF0IDM5OC4xMk1IeiBmb3Igbm93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCS8qIFR1cm4gT2ZmIEFMTCBvbi1jaGlwIHBlcmlwaGVyYWwgY2xvY2tzIGZvciByZS1jb25maWd1cmF0aW9uICAgICAgKi8KCS8qIE5vdGU6IFNlZSBsYWJlbCAnRU5BQkxFQ0xLUycgZm9yIHRoZSByZS1lbmFibGluZyAgICAgICAgICAgICAgICAgKi8KICAgICAgICBsZHIgICAgIHIxLCAgPUNLRU4KICAgICAgICBtb3YgICAgIHIyLCAgIzAKICAgICAgICBzdHIgICAgIHIyLCAgW3IxXQoKCiAgICAgICAgLyogZGVmYXVsdCB2YWx1ZSBpbiBjYXNlIG5vIHZhbGlkIHJvdGFyeSBzd2l0Y2ggc2V0dGluZyBpcyBmb3VuZCAgICAqLwogICAgICAgIGxkciAgICAgcjIsID0oQ0NDUl9MMjd8Q0NDUl9NMnxDQ0NSX04xMCkgIC8qIERFRkFVTFQ6IHsyMDAvMjAwLzEwMH0gKi8KCiAgICAgICAgLyogLi4uIGFuZCB3cml0ZSB0aGUgY29yZSBjbG9jayBjb25maWcgcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIGxkciAgICAgcjEsICA9Q0NDUgogICAgICAgIHN0ciAgICAgcjIsICBbcjFdCgojaWZkZWYgUlRDCgkvKiBlbmFibGUgdGhlIDMyS2h6IG9zY2lsbGF0b3IgZm9yIFJUQyBhbmQgUG93ZXJNYW5hZ2VyICAgICAgICAgICAgICovCgogICAgICAgIGxkciAgICAgcjEsICA9T1NDQwogICAgICAgIG1vdiAgICAgcjIsICAjT1NDQ19PT04KICAgICAgICBzdHIgICAgIHIyLCAgW3IxXQoKCS8qIE5PVEU6ICBzcGluIGhlcmUgdW50aWwgT1NDQy5PT0sgZ2V0IHNldCwgbWVhbmluZyB0aGUgUExMICAgICAgICAgKi8KCS8qIGhhcyBzZXR0bGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KNjA6CiAgICAgICAgbGRyICAgICByMiwgW3IxXQogICAgICAgIGFuZHMgICAgcjIsIHIyLCAjMQogICAgICAgIGJlcSAgICAgNjBiCiNlbmRpZgoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogU2F2ZSBTRFJBTSBzaXplICovCiAgICBsZHIgICAgIHIxLCA9RFJBTV9TSVpFCgkgc3RyCSAgIHI4LCBbcjFdCgoJLyogSW50ZXJydXB0IGluaXQ6IE1hc2sgYWxsIGludGVycnVwdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgbGRyCXIwLCA9SUNNUiAvKiBlbmFibGUgbm8gc291cmNlcyAqLwoJbW92IHIxLCAjMAogICAgc3RyIHIxLCBbcjBdCgoJLyogRklYTUUgKi8KCiNkZWZpbmUgTk9ERUJVRwojaWZkZWYgTk9ERUJVRwoJLypEaXNhYmxlIHNvZnR3YXJlIGFuZCBkYXRhIGJyZWFrcG9pbnRzICovCgltb3YJcjAsIzAKCW1jcglwMTUsMCxyMCxjMTQsYzgsMCAgLyogaWJjcjAgKi8KCW1jcglwMTUsMCxyMCxjMTQsYzksMCAgLyogaWJjcjEgKi8KCW1jcglwMTUsMCxyMCxjMTQsYzQsMCAgLyogZGJjb24gKi8KCgkvKkVuYWJsZSBhbGwgZGVidWcgZnVuY3Rpb25hbGl0eSAqLwoJbW92CXIwLCMweDgwMDAwMDAwCgltY3IJcDE0LDAscjAsYzEwLGMwLDAgIC8qIGRjc3IgKi8KCiNlbmRpZgoKICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBFbmQgbWVtc2V0dXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKZW5kbWVtc2V0dXA6CgogICAgbW92ICAgICBwYywgbHIKCg==