LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIGZ0c3lzdGVtLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgQW1pZ2Etc3BlY2lmaWMgRnJlZVR5cGUgbG93LWxldmVsIHN5c3RlbSBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMTAgYnkgICAgICAgICAgICAgICAgICAgKi8KLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIFdlcm5lciBMZW1iZXJnIGFuZCBEZXRsZWYgV/xya25lci4gICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBBbWlnYSBpbnRlcmZhY2UgdXNlZCBieSBGcmVlVHlwZSB0byBhY2Nlc3MgICAgICovCiAgLyogbG93LWxldmVsLCBpLmUuIG1lbW9yeSBtYW5hZ2VtZW50LCBpL28gYWNjZXNzIGFzIHdlbGwgYXMgdGhyZWFkICAgICAgICovCiAgLyogc3luY2hyb25pc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBNYWludGFpbmVkIGJ5IERldGxlZiBX/HJrbmVyIDxUZXRpU29mdEBhcGcubGFobi5kZT4gICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBCYXNlZCBvbiB0aGUgb3JpZ2luYWwgZnRzeXN0ZW0uYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBtb2RpZmllZCB0byBhdm9pZCBmb3BlbigpLCBmY2xvc2UoKSwgZnJlYWQoKSwgZnNlZWsoKSwgZnRlbGwoKSwgICAgICAgKi8KICAvKiBtYWxsb2MoKSwgcmVhbGxvYygpLCBhbmQgZnJlZSgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBUaG9zZSBDIGxpYnJhcnkgZnVuY3Rpb25zIGFyZSBvZnRlbiBub3QgdGhyZWFkLXNhZmUgb3IgY2FudCBiZSAgICAgICAgKi8KICAvKiB1c2VkIGluIGEgc2hhcmVkIEFtaWdhIGxpYnJhcnkuIElmIHRoYXQncyBub3QgYSBwcm9ibGVtIGZvciB5b3UsICAgICAgICovCiAgLyogeW91IGNhbiBvZiBjb3Vyc2UgdXNlIHRoZSBkZWZhdWx0IGZ0c3lzdGVtLmMgd2l0aCBDIGxpYnJhcnkgY2FsbHMgICAgICovCiAgLyogaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBuZWVkcyBleGVjIFYzOSsgYmVjYXVzZSBpdCB1c2VzIEFsbG9jUG9vbGVkKCkgZXRjICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lIF9fTk9MSUJCQVNFX18KI2RlZmluZSBfX05PR0xPQkFMSUZBQ0VfXwojZGVmaW5lIF9fVVNFX0lOTElORV9fCiNpbmNsdWRlIDxwcm90by9leGVjLmg+CiNpbmNsdWRlIDxkb3Mvc3RkaW8uaD4KI2luY2x1ZGUgPHByb3RvL2Rvcy5oPgojaWZkZWYgX19hbWlnYW9zNF9fCmV4dGVybiBzdHJ1Y3QgRXhlY0lGYWNlICpJRXhlYzsKZXh0ZXJuIHN0cnVjdCBET1NJRmFjZSAgKklET1M7CiNlbHNlCmV4dGVybiBzdHJ1Y3QgTGlicmFyeSAgICpTeXNCYXNlOwpleHRlcm4gc3RydWN0IExpYnJhcnkgICAqRE9TQmFzZTsKI2VuZGlmCgojZGVmaW5lIElPQlVGX1NJWkUgNTEyCgovKiBzdHJ1Y3R1cmUgdGhhdCBoZWxwcyB1cyB0byBhdm9pZAogKiB1c2VsZXNzIGNhbGxzIG9mIFNlZWsoKSBhbmQgUmVhZCgpCiAqLwpzdHJ1Y3QgU3lzRmlsZQp7CiAgQlBUUiAgZmlsZTsKICBVTE9ORyBpb2J1Zl9zdGFydDsKICBVTE9ORyBpb2J1Zl9lbmQ7CiAgVUJZVEUgaW9idWZbSU9CVUZfU0laRV07Cn07CgojaWZuZGVmIF9fYW1pZ2FvczRfXwovKiBDIGltcGxlbWVudGF0aW9uIG9mIEFsbG9jVmVjUG9vbGVkIChzZWUgYXV0b2RvYyBleGVjL0FsbG9jUG9vbGVkKSAqLwpBUFRSCkFsbG9jX1ZlY1Bvb2xlZCggQVBUUiAgIHBvb2xIZWFkZXIsCiAgICAgICAgICAgICAgICAgVUxPTkcgIG1lbVNpemUgKQp7CiAgVUxPTkcgIG5ld1NpemUgPSBtZW1TaXplICsgc2l6ZW9mICggVUxPTkcgKTsKICBVTE9ORyAgKm1lbSA9IEFsbG9jUG9vbGVkKCBwb29sSGVhZGVyLCBuZXdTaXplICk7CgogIGlmICggIW1lbSApCiAgICByZXR1cm4gTlVMTDsKICAqbWVtID0gbmV3U2l6ZTsKICByZXR1cm4gbWVtICsgMTsKfQoKLyogQyBpbXBsZW1lbnRhdGlvbiBvZiBGcmVlVmVjUG9vbGVkIChzZWUgYXV0b2RvYyBleGVjL0FsbG9jUG9vbGVkKSAqLwp2b2lkCkZyZWVfVmVjUG9vbGVkKCBBUFRSICBwb29sSGVhZGVyLAogICAgICAgICAgICAgICAgQVBUUiAgbWVtb3J5ICkKewogIFVMT05HICAqcmVhbG1lbSA9IChVTE9ORyAqKW1lbW9yeSAtIDE7CgogIEZyZWVQb29sZWQoIHBvb2xIZWFkZXIsIHJlYWxtZW0sICpyZWFsbWVtICk7Cn0KI2VuZGlmCgojaW5jbHVkZSA8ZnQyYnVpbGQuaD4KI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICiNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKI2luY2x1ZGUgRlRfU1lTVEVNX0gKI2luY2x1ZGUgRlRfRVJST1JTX0gKI2luY2x1ZGUgRlRfVFlQRVNfSAoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgIE1FTU9SWSBNQU5BR0VNRU5UIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZG8gYW55IGVycm9yIGNoZWNraW5nIGZvciB0aGUgICAgICAgICAgICAgICAgICAqLwogIC8qIGFsbG9jYXRpb24tcmVsYXRlZCBmdW5jdGlvbnMuICBUaGlzIGlzIGRvbmUgYnkgdGhlIGhpZ2hlciBsZXZlbCAgICAgICAqLwogIC8qIHJvdXRpbmVzIGxpa2UgZnRfbWVtX2FsbG9jKCkgb3IgZnRfbWVtX3JlYWxsb2MoKS4gICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgZnRfYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgVGhlIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgbWVtb3J5IDo6IEEgcG9pbnRlciB0byB0aGUgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgc2l6ZSAgIDo6IFRoZSByZXF1ZXN0ZWQgc2l6ZSBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgVGhlIGFkZHJlc3Mgb2YgbmV3bHkgYWxsb2NhdGVkIGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkKiApCiAgZnRfYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAogICAgICAgICAgICBsb25nICAgICAgIHNpemUgKQogIHsKI2lmZGVmIF9fYW1pZ2FvczRfXwogICAgcmV0dXJuIEFsbG9jVmVjUG9vbGVkKCBtZW1vcnktPnVzZXIsIHNpemUgKTsKI2Vsc2UKICAgIHJldHVybiBBbGxvY19WZWNQb29sZWQoIG1lbW9yeS0+dXNlciwgc2l6ZSApOwojZW5kaWYKICB9CgoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBmdF9yZWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBUaGUgbWVtb3J5IHJlYWxsb2NhdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBtZW1vcnkgICA6OiBBIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBjdXJfc2l6ZSA6OiBUaGUgY3VycmVudCBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrLiAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBuZXdfc2l6ZSA6OiBUaGUgbmV3bHkgcmVxdWVzdGVkIHNpemUgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBibG9jayAgICA6OiBUaGUgY3VycmVudCBhZGRyZXNzIG9mIHRoZSBibG9jayBpbiBtZW1vcnkuICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBUaGUgYWRkcmVzcyBvZiB0aGUgcmVhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBGVF9DQUxMQkFDS19ERUYoIHZvaWQqICkKICBmdF9yZWFsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKICAgICAgICAgICAgICBsb25nICAgICAgIGN1cl9zaXplLAogICAgICAgICAgICAgIGxvbmcgICAgICAgbmV3X3NpemUsCiAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jayApCiAgewogICAgdm9pZCogbmV3X2Jsb2NrOwoKI2lmZGVmIF9fYW1pZ2FvczRfXwogICAgbmV3X2Jsb2NrID0gQWxsb2NWZWNQb29sZWQgKCBtZW1vcnktPnVzZXIsIG5ld19zaXplICk7CiNlbHNlCiAgICBuZXdfYmxvY2sgPSBBbGxvY19WZWNQb29sZWQgKCBtZW1vcnktPnVzZXIsIG5ld19zaXplICk7CiNlbmRpZgogICAgaWYgKCBuZXdfYmxvY2sgIT0gTlVMTCApCiAgICB7CiAgICAgIENvcHlNZW0gKCBibG9jaywgbmV3X2Jsb2NrLAogICAgICAgICAgICAgICAgKCBuZXdfc2l6ZSA+IGN1cl9zaXplICkgPyBjdXJfc2l6ZSA6IG5ld19zaXplICk7CiNpZmRlZiBfX2FtaWdhb3M0X18KICAgICAgRnJlZVZlY1Bvb2xlZCAoIG1lbW9yeS0+dXNlciwgYmxvY2sgKTsKI2Vsc2UKICAgICAgRnJlZV9WZWNQb29sZWQgKCBtZW1vcnktPnVzZXIsIGJsb2NrICk7CiNlbmRpZgogICAgfQogICAgcmV0dXJuIG5ld19ibG9jazsKICB9CgoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBmdF9mcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBUaGUgbWVtb3J5IHJlbGVhc2UgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBtZW1vcnkgIDo6IEEgcG9pbnRlciB0byB0aGUgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBibG9jayAgIDo6IFRoZSBhZGRyZXNzIG9mIGJsb2NrIGluIG1lbW9yeSB0byBiZSBmcmVlZC4gICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQogIGZ0X2ZyZWUoIEZUX01lbW9yeSAgbWVtb3J5LAogICAgICAgICAgIHZvaWQqICAgICAgYmxvY2sgKQogIHsKI2lmZGVmIF9fYW1pZ2FvczRfXwogICAgRnJlZVZlY1Bvb2xlZCggbWVtb3J5LT51c2VyLCBibG9jayApOwojZWxzZQogICAgRnJlZV9WZWNQb29sZWQoIG1lbW9yeS0+dXNlciwgYmxvY2sgKTsKI2VuZGlmCiAgfQoKCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICBSRVNPVVJDRSBNQU5BR0VNRU5UIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI3VuZGVmICBGVF9DT01QT05FTlQKI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2lvCgogIC8qIFdlIHVzZSB0aGUgbWFjcm8gU1RSRUFNX0ZJTEUgZm9yIGNvbnZlbmllbmNlIHRvIGV4dHJhY3QgdGhlICAgICAgICovCiAgLyogc3lzdGVtLXNwZWNpZmljIHN0cmVhbSBoYW5kbGUgZnJvbSBhIGdpdmVuIEZyZWVUeXBlIHN0cmVhbSBvYmplY3QgKi8KI2RlZmluZSBTVFJFQU1fRklMRSggc3RyZWFtICkgICggKHN0cnVjdCBTeXNGaWxlICopc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgKQoKCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgZnRfYW1pZ2Ffc3RyZWFtX2Nsb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgVGhlIGZ1bmN0aW9uIHRvIGNsb3NlIGEgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgc3RyZWFtIDo6IEEgcG9pbnRlciB0byB0aGUgc3RyZWFtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKICBmdF9hbWlnYV9zdHJlYW1fY2xvc2UoIEZUX1N0cmVhbSAgc3RyZWFtICkKICB7CiAgICBzdHJ1Y3QgU3lzRmlsZSogc3lzZmlsZTsKCiAgICBzeXNmaWxlID0gU1RSRUFNX0ZJTEUoIHN0cmVhbSApOwogICAgQ2xvc2UgKCBzeXNmaWxlLT5maWxlICk7CiAgICBGcmVlTWVtICggc3lzZmlsZSwgc2l6ZW9mICggc3RydWN0IFN5c0ZpbGUgKSk7CgogICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSBOVUxMOwogICAgc3RyZWFtLT5zaXplICAgICAgICAgICAgICAgPSAwOwogICAgc3RyZWFtLT5iYXNlICAgICAgICAgICAgICAgPSAwOwogIH0KCgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIGZ0X2FtaWdhX3N0cmVhbV9pbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIFRoZSBmdW5jdGlvbiB0byBvcGVuIGEgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIHN0cmVhbSA6OiBBIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIG9mZnNldCA6OiBUaGUgcG9zaXRpb24gaW4gdGhlIGRhdGEgc3RyZWFtIHRvIHN0YXJ0IHJlYWRpbmcuICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIGJ1ZmZlciA6OiBUaGUgYWRkcmVzcyBvZiBidWZmZXIgdG8gc3RvcmUgdGhlIHJlYWQgZGF0YS4gICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIGNvdW50ICA6OiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgc3RyZWFtLiAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIEZUX0NBTExCQUNLX0RFRiggdW5zaWduZWQgbG9uZyApCiAgZnRfYW1pZ2Ffc3RyZWFtX2lvKCBGVF9TdHJlYW0gICAgICAgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqICBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgY291bnQgKQogIHsKICAgIHN0cnVjdCBTeXNGaWxlKiBzeXNmaWxlOwogICAgdW5zaWduZWQgbG9uZyAgIHJlYWRfYnl0ZXM7CgogICAgaWYgKCBjb3VudCAhPSAwICkKICAgIHsKICAgICAgc3lzZmlsZSA9IFNUUkVBTV9GSUxFKCBzdHJlYW0gKTsKCiAgICAgIC8qIGhhbmRsZSB0aGUgc2VlayAqLwogICAgICBpZiAoIChvZmZzZXQgPCBzeXNmaWxlLT5pb2J1Zl9zdGFydCkgfHwgKG9mZnNldCArIGNvdW50ID4gc3lzZmlsZS0+aW9idWZfZW5kKSApCiAgICAgIHsKICAgICAgICAvKiByZXF1ZXN0ZWQgb2Zmc2V0IGltcGxpZXMgd2UgbmVlZCBhIGJ1ZmZlciByZWZpbGwgKi8KICAgICAgICBpZiAoICFzeXNmaWxlLT5pb2J1Zl9lbmQgfHwgb2Zmc2V0ICE9IHN5c2ZpbGUtPmlvYnVmX2VuZCApCiAgICAgICAgewogICAgICAgICAgLyogYSBwaHlzaWNhbCBzZWVrIGlzIG5lY2Vzc2FyeSAqLwogICAgICAgICAgU2Vlayggc3lzZmlsZS0+ZmlsZSwgb2Zmc2V0LCBPRkZTRVRfQkVHSU5OSU5HICk7CiAgICAgICAgfQogICAgICAgIHN5c2ZpbGUtPmlvYnVmX3N0YXJ0ID0gb2Zmc2V0OwogICAgICAgIHN5c2ZpbGUtPmlvYnVmX2VuZCA9IDA7IC8qIHRyaWdnZXIgYSBidWZmZXIgcmVmaWxsICovCiAgICAgIH0KCiAgICAgIC8qIGhhbmRsZSB0aGUgcmVhZCAqLwogICAgICBpZiAoIG9mZnNldCArIGNvdW50IDw9IHN5c2ZpbGUtPmlvYnVmX2VuZCApCiAgICAgIHsKICAgICAgICAvKiB3ZSBoYXZlIGJ1ZmZlciBhbmQgcmVxdWVzdGVkIGJ5dGVzIGFyZSBhbGwgaW5zaWRlIG91ciBidWZmZXIgKi8KICAgICAgICBDb3B5TWVtKCAmc3lzZmlsZS0+aW9idWZbb2Zmc2V0IC0gc3lzZmlsZS0+aW9idWZfc3RhcnRdLCBidWZmZXIsIGNvdW50ICk7CiAgICAgICAgcmVhZF9ieXRlcyA9IGNvdW50OwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIC8qIChyZSlmaWxsIGJ1ZmZlciAqLwogICAgICAgIGlmICggY291bnQgPD0gSU9CVUZfU0laRSApCiAgICAgICAgewogICAgICAgICAgLyogcmVxdWVzdGVkIGJ5dGVzIGlzIGEgc3Vic2V0IG9mIHRoZSBidWZmZXIgKi8KICAgICAgICAgIHJlYWRfYnl0ZXMgPSBSZWFkKCBzeXNmaWxlLT5maWxlLCBzeXNmaWxlLT5pb2J1ZiwgSU9CVUZfU0laRSApOwogICAgICAgICAgaWYgKCByZWFkX2J5dGVzID09IC0xVUwgKQogICAgICAgICAgewogICAgICAgICAgICAvKiBlcnJvciAqLwogICAgICAgICAgICByZWFkX2J5dGVzID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgc3lzZmlsZS0+aW9idWZfZW5kID0gb2Zmc2V0ICsgcmVhZF9ieXRlczsKICAgICAgICAgICAgQ29weU1lbSggc3lzZmlsZS0+aW9idWYsIGJ1ZmZlciwgY291bnQgKTsKICAgICAgICAgICAgaWYgKCByZWFkX2J5dGVzID4gY291bnQgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgcmVhZF9ieXRlcyA9IGNvdW50OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAvKiB3ZSBhY3R1YWxseSBuZWVkIG1vcmUgdGhhbiBvdXIgYnVmZmVyIGNhbiBob2xkLCBzbyB3ZSBkZWNpZGUKICAgICAgICAgICoqIHRvIGRvIGEgc2luZ2xlIGJpZyByZWFkLCBhbmQgdGhlbiBjb3B5IHRoZSBsYXN0IElPQlVGX1NJWkUKICAgICAgICAgICoqIGJ5dGVzIG9mIHRoYXQgdG8gb3VyIGludGVybmFsIGJ1ZmZlciBmb3IgbGF0ZXIgdXNlICovCiAgICAgICAgICByZWFkX2J5dGVzID0gUmVhZCggc3lzZmlsZS0+ZmlsZSwgYnVmZmVyLCBjb3VudCApOwogICAgICAgICAgaWYgKCByZWFkX2J5dGVzID09IC0xVUwgKQogICAgICAgICAgewogICAgICAgICAgICAvKiBlcnJvciAqLwogICAgICAgICAgICByZWFkX2J5dGVzID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgVUxPTkcgYnVmc2l6ZTsKCiAgICAgICAgICAgIGJ1ZnNpemUgPSAoIHJlYWRfYnl0ZXMgPiBJT0JVRl9TSVpFICkgPyBJT0JVRl9TSVpFIDogcmVhZF9ieXRlczsKICAgICAgICAgICAgc3lzZmlsZS0+aW9idWZfZW5kID0gb2Zmc2V0ICsgcmVhZF9ieXRlczsKICAgICAgICAgICAgc3lzZmlsZS0+aW9idWZfc3RhcnQgPSBzeXNmaWxlLT5pb2J1Zl9lbmQgLSBidWZzaXplOwogICAgICAgICAgICBDb3B5TWVtKCAmYnVmZmVyW3JlYWRfYnl0ZXMgLSBidWZzaXplXSAsIHN5c2ZpbGUtPmlvYnVmLCBidWZzaXplICk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIHJlYWRfYnl0ZXMgPSAwOwogICAgfQoKICAgIHJldHVybiByZWFkX2J5dGVzOwogIH0KCgogIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KCiAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKICBGVF9TdHJlYW1fT3BlbiggRlRfU3RyZWFtICAgIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIGZpbGVwYXRobmFtZSApCiAgewogICAgc3RydWN0IEZpbGVJbmZvQmxvY2sqICBmaWI7CiAgICBzdHJ1Y3QgU3lzRmlsZSogICAgICAgIHN5c2ZpbGU7CgoKICAgIGlmICggIXN0cmVhbSApCiAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9TdHJlYW1fSGFuZGxlOwoKI2lmZGVmIF9fYW1pZ2FvczRfXwogICAgc3lzZmlsZSA9IEFsbG9jTWVtICggc2l6ZW9mIChzdHJ1Y3QgU3lzRmlsZSApLCBNRU1GX1NIQVJFRCApOwojZWxzZQogICAgc3lzZmlsZSA9IEFsbG9jTWVtICggc2l6ZW9mIChzdHJ1Y3QgU3lzRmlsZSApLCBNRU1GX1BVQkxJQyApOwojZW5kaWYKICAgIGlmICggIXN5c2ZpbGUgKQogICAgewogICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fT3BlbjoiICkpOwogICAgICBGVF9FUlJPUigoICIgY291bGQgbm90IG9wZW4gYCVzJ1xuIiwgZmlsZXBhdGhuYW1lICkpOwoKICAgICAgcmV0dXJuIEZUX0Vycl9DYW5ub3RfT3Blbl9SZXNvdXJjZTsKICAgIH0KICAgIHN5c2ZpbGUtPmZpbGUgPSBPcGVuKCAoU1RSUFRSKWZpbGVwYXRobmFtZSwgTU9ERV9PTERGSUxFICk7CiAgICBpZiAoICFzeXNmaWxlLT5maWxlICkKICAgIHsKICAgICAgRnJlZU1lbSAoIHN5c2ZpbGUsIHNpemVvZiAoIHN0cnVjdCBTeXNGaWxlICkpOwogICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fT3BlbjoiICkpOwogICAgICBGVF9FUlJPUigoICIgY291bGQgbm90IG9wZW4gYCVzJ1xuIiwgZmlsZXBhdGhuYW1lICkpOwoKICAgICAgcmV0dXJuIEZUX0Vycl9DYW5ub3RfT3Blbl9SZXNvdXJjZTsKICAgIH0KCiAgICBmaWIgPSBBbGxvY0Rvc09iamVjdCggRE9TX0ZJQiwgTlVMTCApOwogICAgaWYgKCAhZmliICkKICAgIHsKICAgICAgQ2xvc2UgKCBzeXNmaWxlLT5maWxlICk7CiAgICAgIEZyZWVNZW0gKCBzeXNmaWxlLCBzaXplb2YgKCBzdHJ1Y3QgU3lzRmlsZSApKTsKICAgICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX09wZW46IiApKTsKICAgICAgRlRfRVJST1IoKCAiIGNvdWxkIG5vdCBvcGVuIGAlcydcbiIsIGZpbGVwYXRobmFtZSApKTsKCiAgICAgIHJldHVybiBGVF9FcnJfQ2Fubm90X09wZW5fUmVzb3VyY2U7CiAgICB9CiAgICBpZiAoICEoIEV4YW1pbmVGSCggc3lzZmlsZS0+ZmlsZSwgZmliICkgKSApCiAgICB7CiAgICAgIEZyZWVEb3NPYmplY3QoIERPU19GSUIsIGZpYiApOwogICAgICBDbG9zZSAoIHN5c2ZpbGUtPmZpbGUgKTsKICAgICAgRnJlZU1lbSAoIHN5c2ZpbGUsIHNpemVvZiAoIHN0cnVjdCBTeXNGaWxlICkpOwogICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fT3BlbjoiICkpOwogICAgICBGVF9FUlJPUigoICIgY291bGQgbm90IG9wZW4gYCVzJ1xuIiwgZmlsZXBhdGhuYW1lICkpOwoKICAgICAgcmV0dXJuIEZUX0Vycl9DYW5ub3RfT3Blbl9SZXNvdXJjZTsKICAgIH0KICAgIHN0cmVhbS0+c2l6ZSA9IGZpYi0+ZmliX1NpemU7CiAgICBGcmVlRG9zT2JqZWN0KCBET1NfRklCLCBmaWIgKTsKCiAgICBzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlciA9ICh2b2lkICopc3lzZmlsZTsKICAgIHN0cmVhbS0+cGF0aG5hbWUucG9pbnRlciAgID0gKGNoYXIqKWZpbGVwYXRobmFtZTsKICAgIHN5c2ZpbGUtPmlvYnVmX3N0YXJ0ICAgICAgID0gMDsKICAgIHN5c2ZpbGUtPmlvYnVmX2VuZCAgICAgICAgID0gMDsKICAgIHN0cmVhbS0+cG9zICAgICAgICAgICAgICAgID0gMDsKCiAgICBzdHJlYW0tPnJlYWQgID0gZnRfYW1pZ2Ffc3RyZWFtX2lvOwogICAgc3RyZWFtLT5jbG9zZSA9IGZ0X2FtaWdhX3N0cmVhbV9jbG9zZTsKCiAgICBpZiAoICFzdHJlYW0tPnNpemUgKQogICAgewogICAgICBmdF9hbWlnYV9zdHJlYW1fY2xvc2UoIHN0cmVhbSApOwogICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fT3BlbjoiICkpOwogICAgICBGVF9FUlJPUigoICIgb3BlbmVkIGAlcycgYnV0IHplcm8tc2l6ZWRcbiIsIGZpbGVwYXRobmFtZSApKTsKICAgICAgcmV0dXJuIEZUX0Vycl9DYW5ub3RfT3Blbl9TdHJlYW07OwogICAgfQoKICAgIEZUX1RSQUNFMSgoICJGVF9TdHJlYW1fT3BlbjoiICkpOwogICAgRlRfVFJBQ0UxKCggIiBvcGVuZWQgYCVzJyAoJWxkIGJ5dGVzKSBzdWNjZXNzZnVsbHlcbiIsCiAgICAgICAgICAgICAgICBmaWxlcGF0aG5hbWUsIHN0cmVhbS0+c2l6ZSApKTsKCiAgICByZXR1cm4gRlRfRXJyX09rOwogIH0KCgojaWZkZWYgRlRfREVCVUdfTUVNT1JZCgogIGV4dGVybiBGVF9JbnQKICBmdF9tZW1fZGVidWdfaW5pdCggRlRfTWVtb3J5ICBtZW1vcnkgKTsKCiAgZXh0ZXJuIHZvaWQKICBmdF9tZW1fZGVidWdfZG9uZSggRlRfTWVtb3J5ICBtZW1vcnkgKTsKCiNlbmRpZgoKCiAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG9ianMuaCAqLwoKICBGVF9CQVNFX0RFRiggRlRfTWVtb3J5ICkKICBGVF9OZXdfTWVtb3J5KCB2b2lkICkKICB7CiAgICBGVF9NZW1vcnkgIG1lbW9yeTsKCgojaWZkZWYgX19hbWlnYW9zNF9fCiAgICBtZW1vcnkgPSAoRlRfTWVtb3J5KUFsbG9jVmVjKCBzaXplb2YgKCAqbWVtb3J5ICksIE1FTUZfU0hBUkVEICk7CiNlbHNlCiAgICBtZW1vcnkgPSAoRlRfTWVtb3J5KUFsbG9jVmVjKCBzaXplb2YgKCAqbWVtb3J5ICksIE1FTUZfUFVCTElDICk7CiNlbmRpZgogICAgaWYgKCBtZW1vcnkgKQogICAgewojaWZkZWYgX19hbWlnYW9zNF9fCiAgICAgIG1lbW9yeS0+dXNlciA9IENyZWF0ZVBvb2woIE1FTUZfU0hBUkVELCAxNjM4NCwgMTYzODQgKTsKI2Vsc2UKICAgICAgbWVtb3J5LT51c2VyID0gQ3JlYXRlUG9vbCggTUVNRl9QVUJMSUMsIDE2Mzg0LCAxNjM4NCApOwojZW5kaWYKICAgICAgaWYgKCBtZW1vcnktPnVzZXIgPT0gTlVMTCApCiAgICAgIHsKICAgICAgICBGcmVlVmVjKCBtZW1vcnkgKTsKICAgICAgICBtZW1vcnkgPSBOVUxMOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIG1lbW9yeS0+YWxsb2MgICA9IGZ0X2FsbG9jOwogICAgICAgIG1lbW9yeS0+cmVhbGxvYyA9IGZ0X3JlYWxsb2M7CiAgICAgICAgbWVtb3J5LT5mcmVlICAgID0gZnRfZnJlZTsKI2lmZGVmIEZUX0RFQlVHX01FTU9SWQogICAgICAgIGZ0X21lbV9kZWJ1Z19pbml0KCBtZW1vcnkgKTsKI2VuZGlmCiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbWVtb3J5OwogIH0KCgogIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KCiAgRlRfQkFTRV9ERUYoIHZvaWQgKQogIEZUX0RvbmVfTWVtb3J5KCBGVF9NZW1vcnkgIG1lbW9yeSApCiAgewojaWZkZWYgRlRfREVCVUdfTUVNT1JZCiAgICBmdF9tZW1fZGVidWdfZG9uZSggbWVtb3J5ICk7CiNlbmRpZgoKICAgIERlbGV0ZVBvb2woIG1lbW9yeS0+dXNlciApOwogICAgRnJlZVZlYyggbWVtb3J5ICk7CiAgfQoKLyoKTG9jYWwgVmFyaWFibGVzOgpjb2Rpbmc6IGxhdGluLTEKRW5kOgoqLwovKiBFTkQgKi8K