ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggMDQwMzZjNC4uNWExMGY4YiAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTUgKzEsMTUgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NTA5MTggb2YgV2luZSB0aGUgTVMgV2luZG93cyBlbXVsYXRvci4gIFRoaXMgaXMgc3RpbGwgYQorVGhpcyBpcyByZWxlYXNlIDk1MTAwMyBvZiBXaW5lIHRoZSBNUyBXaW5kb3dzIGVtdWxhdG9yLiAgVGhpcyBpcyBzdGlsbCBhCiBkZXZlbG9wZXIncyBvbmx5IHJlbGVhc2UuICBUaGVyZSBhcmUgbWFueSBidWdzIGFuZCBtYW55IHVuaW1wbGVtZW50ZWQgQVBJCiBmZWF0dXJlcy4gIE1vc3QgYXBwbGljYXRpb25zIHN0aWxsIGRvIG5vdCB3b3JrLgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gIndpbmUtbmV3QGFtc2NvbnMuY29tIi4gIFBsZWFzZSBkb24ndCBmb3JnZXQKIHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuICBJJ2xsIG1ha2UgYSBuZXcgcmVsZWFzZSBldmVyeSBvdGhlciB3ZWVrLgogCi1XSEFUJ1MgTkVXIHdpdGggV2luZS05NTA5MTg6IChzZWUgQ2hhbmdlTG9nIGZvciBkZXRhaWxzKQotCS0gU3VwcG9ydCBmb3Igc2VsZi1sb2FkaW5nIG1vZHVsZXMuCi0JLSBXaW4zMiBzdXBwb3J0IHNob3VsZCBiZWdpbiB0byB3b3JrIGFnYWluLgotCS0gQ3Vyc29yIGZpeGVzLgotCS0gTmV3IGNvbmZpZ3VyZSBzY3JpcHQgc2hvdWxkIGJlIHVzZWFibGUgbm93LgorV0hBVCdTIE5FVyB3aXRoIFdpbmUtOTUxMDAzOiAoc2VlIENoYW5nZUxvZyBmb3IgZGV0YWlscykKKwktIE5ldyBjdXJzb3IgaGFuZGxpbmcuCisJLSBGcmVuY2gsIERhbmlzaCBhbmQgRmlubmlzaCBsYW5ndWFnZSBzdXBwb3J0LgorCS0gTG90cyBvZiBXaW5lbGliIGltcHJvdmVtZW50cy4KKwktIFByZWxpbWluYXJ5IFZ4RCBzdXBwb3J0LgogCS0gTG90cyBvZiBidWcgZml4ZXMuCiAKIFNlZSB0aGUgUkVBRE1FIGZpbGUgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4KQEAgLTE4LDExICsxOCwxMSBAQAogdGhlIHJlbGVhc2UgaXMgYXZhaWxhYmxlIGF0IHRoZSBmdHAgc2l0ZXMuICBUaGUgc291cmNlcyB3aWxsIGJlIGF2YWlsYWJsZQogZnJvbSB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKIAotICAgIHN1bnNpdGUudW5jLmVkdTovcHViL0xpbnV4L0FMUEhBL3dpbmUvV2luZS05NTA5MTgudGFyLmd6Ci0gICAgdHN4LTExLm1pdC5lZHU6L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTUwOTE4LnRhci5negotICAgIGZ0cC5pbmZvbWFnaWMuY29tOi9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTUwOTE4LnRhci5negotICAgIGZ0cC5mdW5ldC5maTovcHViL09TL0xpbnV4L0FMUEhBL1dpbmUvV2luZS05NTA5MTgudGFyLmd6Ci0gICAgYXJpcy5jb206L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTUwOTE4LnRhci5negorICAgIHN1bnNpdGUudW5jLmVkdTovcHViL0xpbnV4L0FMUEhBL3dpbmUvV2luZS05NTEwMDMudGFyLmd6CisgICAgdHN4LTExLm1pdC5lZHU6L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTUxMDAzLnRhci5negorICAgIGZ0cC5pbmZvbWFnaWMuY29tOi9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTUxMDAzLnRhci5negorICAgIGZ0cC5mdW5ldC5maTovcHViL09TL0xpbnV4L0FMUEhBL1dpbmUvV2luZS05NTEwMDMudGFyLmd6CisgICAgYXJpcy5jb206L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTUxMDAzLnRhci5negogCiBJdCBzaG91bGQgYWxzbyBiZSBhdmFpbGFibGUgZnJvbSBhbnkgc2l0ZSB0aGF0IG1pcnJvcnMgdHN4LTExIG9yIHN1bnNpdGUuCiAKQEAgLTM2LDcgKzM2LDcgQEAKIFdpbmUgaXMgYXZhaWxhYmxlIHRoYW5rcyB0byB0aGUgd29yayBvZiBCb2IgQW1zdGFkdCwgRGFnIEFzaGVpbSwKIE1hcnRpbiBBeW90dGUsIFJvc3MgQmlybywgRXJpayBCb3MsIEZvbnMgQm90bWFuLCBKb2huIEJyZXphaywKIEFuZHJldyBCdWxoYWssIEpvaG4gQnVydG9uLCBQYXVsIEZhbHN0YWQsIE9sYWYgRmxlYmJlLCBQZXRlciBHYWxiYXZ5LAotUmFtb24gR2FyY2lhLCBIYW5zIGRlIEdyYWFmLCBDaGFybGVzIE0uIEhhbm51bSwgQ2FtZXJvbiBIZWlkZSwKK1JhbW9uIEdhcmNpYSwgSGFucyBkZSBHcmFhZmYsIENoYXJsZXMgTS4gSGFubnVtLCBDYW1lcm9uIEhlaWRlLAogSm9jaGVuIEhvZW5pY2tlLCBKZWZmcmV5IEhzdSwgTWlndWVsIGRlIEljYXphLCBBbGV4YW5kcmUgSnVsbGlhcmQsCiBKb24gS29ucmF0aCwgU2NvdHQgQS4gTGFpcmQsIE1hcnRpbiB2b24gTG9ld2lzLCBLZW5uZXRoIE1hY0RvbmFsZCwKIFBldGVyIE1hY0RvbmFsZCwgV2lsbGlhbSBNYWdybywgTWFyY3VzIE1laXNzbmVyLCBHcmFoYW0gTWVuaGVubml0dCwKZGlmZiAtLWdpdCBhL0JVR1MgYi9CVUdTCmluZGV4IDVlYzEzZTMuLmQwZjZlNDcgMTAwNjQ0Ci0tLSBhL0JVR1MKKysrIGIvQlVHUwpAQCAtMSw0ICsxLDUgQEAKIC0gRUJQIGFuZCBFU1AgYXJlIHNvbWV0aW1lcyBjb3JydXB0ZWQgd2hpbGUgcnVubmluZyAxNi1iaXQgY29kZS4KKy0gTWVzc2FnZSBmbG93IGlzIG5vdCBjb3JyZWN0IGZvciBtdWx0aXBsZSB0YXNrcywgc29tZSBtZXNzYWdlcyBhcmUgbm90IHN1cHBvcnRlZC4KIC0gRGlhbG9nIEJveGVzIGNyZWF0ZWQgYnkgV01fQ1JFQVRFIGhhbmRsZXIgYXJlbid0IHZpc2libGUKIC0gTURJIGRvZXMgbm90IHNlbmQgV01fR0VUTUlOTUFYIG1lc3NhZ2UuCiAtIEluaXRpYWxpemVMb2FkZWRETExzKCkgY2FuJ3QgaW5pdCBMWkVYUEFORC5ETEwuIChjczppcCA9PiAwOjApCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKaW5kZXggMTNhNmU5ZS4uM2RkZGE4ZSAxMDA2NDQKLS0tIGEvQ2hhbmdlTG9nCisrKyBiL0NoYW5nZUxvZwpAQCAtMSw0ICsxLDIxOCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU3VuIE9jdCAgMSAxNTo0ODozNCAxOTk1ICBBbGV4YW5kcmUgSnVsbGlhcmQgIDxqdWxsaWFyZEBzdW5zaXRlLnVuYz4KKworCSogW2NvbnRyb2xzL21lbnUuY10KKwlGaXhlZCBHZXRNZW51U3RyaW5nKCkgZm9yIG5vbi1zdHJpbmcgaXRlbXMuCisKKwkqIFtkZWJ1Z2dlci8qLmNdCisJRmlyc3QgYXR0ZW1wdCB0byBjaGVjayB2YWxpZGl0eSBvZiBwb2ludGVycyBiZWZvcmUgbWVtb3J5CisJYWNjZXNzZXMuIEZvciBub3cgb25seSBzZWdtZW50ZWQgcG9pbnRlcnMgYXJlIGNoZWNrZWQuCisKKwkqIFtkZWJ1Z2dlci9kYmcueV0gW21lbW9yeS9sZHQuY10KKwlBZGRlZCBwb3NzaWJpbGl0eSB0byBkdW1wIG9ubHkgb25lIHNlZ21lbnQgd2l0aCAnaW5mbyBzZWdtZW50Jy4KKworCSogW2luY2x1ZGUvYml0bWFwcy9vY3JfKl0KKwlBZGRlZCBhbGwgT0VNIGN1cnNvcnMgYXMgWFBNIGJpdG1hcHMuCisKKwkqIFtpbmNsdWRlL2N1cnNvcmljb24uaF0gW29iamVjdHMvY3Vyc29yaWNvbi5jXQorCVJld3JvdGUgYWxsIGN1cnNvciBhbmQgaWNvbiBtYW5hZ2VtZW50IHRvIHVzZSB0aGUgc2FtZSBtZW1vcnkKKyAJbGF5b3V0IGFzIFdpbmRvd3MsIGFuZCB0byBmYWN0b3IgY29tbW9uIGNvZGUgYmV0d2VlbiBpY29ucyBhbmQKKwljdXJzb3JzLiBJbXBsZW1lbnRlZCBpY29uIGRpcmVjdG9yeSBsb29rdXAgdG8gZmluZCB0aGUgYmVzdAorCW1hdGNoaW5nIGljb24gKGkuZS4gdGhlIGNvbG9yIG9uZSkuCisgIAlJbXBsZW1lbnRlZCBDb3B5Q3Vyc29yKCkgYW5kIER1bXBJY29uKCkuCisKKwkqIFtsb2FkZXIvbW9kdWxlLmNdCisJRm9yIGRpc2FibGVkIGJ1aWx0LWluIG1vZHVsZXMsIHdlIG5vdyB0cnkgdG8gbG9hZCB0aGUgV2luZG93cyBETEwKKwlmaXJzdCwgYW5kIGlmIHRoaXMgZmFpbHMgd2UgZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBidWlsdC1pbiBtb2R1bGUKKwlhbnl3YXkuCisKKwkqIFttZW1vcnkvZ2xvYmFsLmNdCisJRml4ZWQgR2xvYmFsSGFuZGxlKCkgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHNlbGVjdG9yIGluIHRoZSBoaWdoCisJd29yZCBldmVuIGlmIHdlIGFyZSBwYXNzZWQgYSBoYW5kbGUgaW4gdGhlIGZpcnN0IHBsYWNlLgorCisJKiBbbWlzY2VtdS9pbnN0ci5jXQorCVRha2UgaW50byBhY2NvdW50IHRoZSBzaXplIG9mIHRoZSBvcGVyYW5kIGFuZCBvZiB0aGUgc3RhY2sgc2VnbWVudAorCXdoZW4gaW5jcmVtZW50aW5nIHRoZSBzdGFjayBwb2ludGVyLgorCUF2b2lkIHJlZmVyZW5jaW5nIEZTX3JlZyBhbmQgR1NfcmVnIG9uICpCU0QuCisKKwkqIFtvYmplY3RzL2RpYi5jXQorCUFsbCBESUIgZnVuY3Rpb25zIG5vdyBhY2NlcHQgYSBCSVRNQVBDT1JFSEVBREVSIGZvcm1hdCBiaXRtYXAuCisJTW9ub2Nocm9tZSBESUJzIGFyZSBjcmVhdGVkIGFzIG1vbm9jaHJvbWUgYml0bWFwIGlmZiB0aGV5IGFyZQorCWJsYWNrIGFuZCB3aGl0ZS4KKworCSogW29iamVjdHMvb2VtYml0bWFwLmNdCisJQWRkZWQgc3VwcG9ydCBmb3IgT0VNIGN1cnNvcnMsIGNoYW5nZWQgT0JNX0xvYWRJY29uIHRvIHVzZSB0aGUgbmV3CisJaWNvbiBtZW1vcnkgbGF5b3V0LgorCisJKiBbcmMvc3lzcmVzX0ZyLnJjXQorCUFkZGVkIEZyZW5jaCBbRnJdIGxhbmd1YWdlIHN1cHBvcnQuCisKKwkqIFt3aW4zMi9lbnZpcm9ubWVudC5jXQorCUZpeGVkIEdldENvbW1hbmRMaW5lQSgpIHRvIHVzZSBjdXJyZW50IFBEQi4KKworCSogW3dpbmRvd3MvZXZlbnQuY10gW3dpbmRvd3Mvd2lucG9zLmNdCisJU2ltdWxhdGUgYSBtb3VzZSBtb3Rpb24gZXZlbnQgdXBvbiBTZXRXaW5kb3dQb3MoKSB0byBmb3JjZSB0aGUKKwljdXJzb3IgdG8gYmUgc2V0IGNvcnJlY3RseS4KKworU2F0IFNlcCAzMCAxNzo0OTozMiAgQ2FtZXJvbiBIZWlkZSAgKGhlaWRlQGVlLnVhbGJlcnRhLmNhKQorCisJKiBbd2luMzIvKl0KKyAgICAgICAgTmV3IFdpbjMyIGtlcm5lbCBmdW5jdGlvbnM6IEdldEFDUCwgR2V0Q1BJbmZvLAorIAlHZXRFbnZpcm9ubWVudFZhcmlhYmxlQSwgR2V0RmlsZVR5cGUsIEdldExhc3RFcnJvciwgR2V0T0VNQ1AsCisgCUdldFN0YXJ0dXBJbmZvQSwgR2V0VGltZVpvbmVJbmZvcm1hdGlvbiwgU2V0RW52aXJvbm1lbnRWYXJpYWJsZSwKKyAJU2V0RmlsZVBvaW50ZXIsIFNldExhc3RFcnJvciwgVmlydHVhbEFsbG9jLCBWaXJ0dWFsRnJlZSwKKyAJV3JpdGVGaWxlLiAgQ29tcGxldGVkIGltcGxlbWVudGF0aW9ucyBvZiBHZXRDb21tYW5kTGluZUEuCisKKwkqIFtpbmNsdWRlL2tlcm5lbDMyLmhdCisgICAgICAgIE5ldyBmaWxlLgorCisJKiBbbG9hZGVyL21haW4uY10KKyAgICAgICAgQ2FsbCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgV2luMzIgZGF0YSAoZG9lc24ndCBjdXJyZW50bHkgZG8KKyAJYW55dGhpbmcpLgorCisJKiBbbWlzYy9tYWluLmNdCisJSW1wbGVtZW50ZWQgR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEsIFNldEVudmlyb25tZW50VmFyaWFibGVBLgorCitTYXQgU2VwIDMwIDAwOjI2OjU2IDE5OTUgIE5pZWxzIGRlIENhcnBlbnRpZXIgIDxuaWVsc0BjaW5keS5ldC50dWRlbGZ0Lm5sPgorCisJKiBbd2luZG93cy93aW5wb3MuY11bbWlzY2VtdS9lbXVsYXRlLmNdW2xvYWRlci9tb2R1bGUuY10KKwkgIFttaXNjL2NvbW1kbGcuY10KKwlNaXNjLiBidWcgZml4ZXMKKworRnJpIFNlcCAyOSAxNjoxNjoxMyAxOTk1ICBKaW0gUGV0ZXJzb24gPGpzcGV0ZXJAYmlyY2guZWUudnQuZWR1PgorCisJKiBbKi8qXQorCUZvciBXaW5lbGliLCBleHBsaWNpdCBjYXN0cyBoYXZlIGJlZW4gcGxhY2VkIHdoZXJlIHdhcm5pbmdzIHdlcmUKKyAJdXN1YWxseSBnZW5lcmF0ZWQuCisJcHJpbnRmIGZvcm1hdHMgd2hpY2ggZ2l2ZSB0aGUgZm9ybWF0IGZvciBwcmludGluZyBhIGhhbmRsZSBhcworIAkiJTA0eCIgb3Igc29tZXRoaW5nIHNpbWlsYXIgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gdXNlIHRoZSBOUEZNVAorIAltYWNybyBkZWZpbmVkIGluIGluY2x1ZGUvd2ludHlwZXMuaC4gIFNvbWUgdGltZXMsIGV4cGxpY2l0IGNhc3RzCisgCXdlcmUgYWxzbyBuZWNlc3NhcnkuCisgICAgIAlQYXJhbWV0ZXIsIGZpZWxkLCBhbmQgdmFyaWFibGUgZGVjbGFyYXRpb25zIGhhdmUgYmVlbiBtYWRlIG1vcmUKKyAJZXhhY3QsIHN1Y2ggYXMgY29udmVydGluZyAnV09SRCB3UGFyYW0nIHRvICdXUEFSQU0gd1BhcmFtJyBvcgorIAknV09SRCBoRm9udCcgdG8gJ0hGT05UIGhGb250Jy4KKyAgICAgCUFueSBjYWxsIG9mIHRoZSBmb3JtIEdldFdpbmRvd1dvcmQoaHduZCxHV1dfSElOU1RBTkNFKSBoYXMgYmVlbgorIAlyZXBsYWNlZCB3aXRoIGEgY2FsbCB0byBXSU5fR2V0V2luZG93SW5zdGFuY2UoaHduZCkuCisKKwkqIFtjb250cm9scy9jb21iby5jXQorCUFkZGVkIFdJTkVMSUIzMiBzdXBwb3J0IGluIENMQm94R2V0Q29tYm8oKS4KKworCSogW2luY2x1ZGUvZGlhbG9nLmhdCisJQ29tbWVudGVkIG91dCB0aGUgJyNpZm5kZWYgV0lORUxJQicgYXJvdW5kIHRoZSAnI3ByYWdtYSBwYWNrKDEpJy4KKwl3aW5lbGliIG5lZWRzIHRoZSBwYWNraW5nIGFzIHdlbGwgKGUuZy4gd2hlbiBhY2Nlc3NpbmcgcmVzb3VyY2VzCisJbGlrZSBzeXNyZXNfRElBTE9HX1NIRUxMX0FCT1VUX01TR0JPWCkuCisKKwkqIFtpbmNsdWRlL3dpbmRvd3MuaF0KKwlHb3QgcmlkIG9mIHRoZSBGW2Eta10gbWFjcm9zLCB3aGljaCB3ZXJlIGNsdXR0ZXJpbmcgdXAgdGhlIGdsb2JhbAorCW5hbWVzcGFjZS4KKworCSogW2luY2x1ZGUvd2luZG93cy5oXSBbd2luZG93cy9kZWZ3bmQuY10KKwlBZGRlZCBXaW4zMiBtZXNzYWdlcyBXTV9DVExDT0xPUiouCisKKwkqIFtpbmNsdWRlL3dpbnR5cGVzLmhdCisJUHV0IGluIHByZXByb2Nlc3NvciAnI2RlZmluZSBXSU5FTElCMzInIGlmIGFwcHJvcHJpYXRlIGFuZCBjaGFuZ2VkCisJdGhlIHR5cGVzIG9mIHNvbWUgdHlwZWRlZnMgKFdQQVJBTSwgSEFORExFKSBiYXNlZCBvbiB0aGlzLgorCQorCSogW2xvYWRlci9tb2R1bGUuY10gW3Rvb2xraXQvbWlzY3N0dWJzLmNdCisJQWRkZWQgI2lmZGVmJ2QgcG9ydGlvbiBpbiBMb2FkTW9kdWxlIHRvIGhhbmRsZSBsb2FkaW5nIGEgV0lORWxpYgorCW1vZHVsZSAoYWxyZWFkeSBsb2FkZWQsIGp1c3QgaW5pdCB2YWx1ZXMpLiAgJyNpZmRlZidlZCBvdXQgdGhlCisJZGVmaW5pdGlvbiBmb3IgR2V0V25kUHJvY0VudHJ5MTYgYW5kIGFkZGVkIGEgbmV3IHZlcnNpb24gdG8KKwl0b29sa2l0L21pc2NzdHVicy5jLgorCisJKiBbbWlzYy9zaGVsbC5jXQorCUFkanVzdGVkIHRoZSBsZW5ndGhzIG9mIEFwcE5hbWUgYW5kIEFwcE1pc2MgZnJvbSA1MTIsNTEyIHRvIDEyOCw5MDYuCisJU2FtZSBhbW91bnQgb2YgdG90YWwgc3RvcmFnZSwgYnV0IG11Y2ggbW9yZSByZWFzb25hYmxlLiAgQWxzbywgY2hhbmdlZAorCWNhbGxzIHRvIHN0cmNweSgpIGluIFNoZWxsQWJvdXQoKSB0byBjYWxscyB0byBzdHJuY3B5KCkgaW5zdGVhZC4KKwlUaGlzIHdhcyBhIGRpZmZpY3VsdCBidWcgdG8gdHJhY2sgZG93biwgYnV0IHRoZSBBcHBNaXNjIGZpZWxkIHdhcworCWJlaW5nIGluaXRpYWxpemVkIHdpdGggdGhlIGNvbnRyaWJ1dGVycyB0ZXh0LCB3aGljaCB3YXMgbXVjaCBsYXJnZXIKKwl0aGFuIDUxMiBjaGFyYWN0ZXJzLgorCisJKiBbdG9vbGtpdC9hdG9tLmNdCisJTmV3IGZpbGUgZm9yIGF0b20taGFuZGxpbmcgZnVuY3Rpb25zLiAgQ29waWVkIGZyb20gbWVtb3J5L2F0b20uYyBhbmQKKwl0aGVuIGhlYXZpbHkgbW9kaWZpZWQuICBSaWdodCBub3csIGl0J3MganVzdCBhIGxpbmtlZCBsaXN0IG9mIGF0b21zLgorCUNvbnNpZGVyIGl0IGFzIGEgaGFzaCB0YWJsZSB3aXRoIGp1c3Qgb25lIGVudHJ5LiAgSXQncyBlYXNpbHkgY2hhbmdlZAorCWxhdGVyLgorCisJKiBbdG9vbGtpdC9oZWFwLmNdCisJQ29tbWVudGVkIG91dCB0aGUgaGVhcCBmdW5jdGlvbnMgd2l0aCBhICIjaWZkZWYgV0lORUxJQjE2IiBhbmQgcHV0IGluCisJYSBXaW4zMiB2ZXJzaW9uICh3aGljaCBpcyBiYXNpY2FsbHkgYSBtb2RpZmllZCBjb3B5KS4KKworCSogW3Rvb2xraXQvc3VwLmNdIFt0b29sa2l0L21pc2NzdHVicy5jXQorCU1vdmVkIHRoZSBzdHVmZiBJIHB1dCBpbiB0b29sa2l0L3N1cC5jIGludG8gdG9vbGtpdC9taXNjc3R1YnMuYyBhbmQKKwlhZGRlZCBxdWl0ZSBhIGZldyBtb3JlIHN0dWJzLgorCisJKiBbdG9vbGtpdC93aW5tYWluLmNdCisJUmVhcnJhbmdlZCBzdGFydHVwIGNvZGUgaW4gX1dpbk1haW4uICBJIHRoaW5rIHRoaXMgd2lsbCB3b3JrLgorCisJKiBbdG9vbGtpdC9NYWtlZmlsZS5pbl0KKwlBZGRlZCB0YXJnZXRzIGZvciAnaGVsbG8nIGFuZCAnaGVsbG8yJyBpbiBjYXNlIGFueW9uZSBjYXJlcyB0byB0cnkKKwlvdXQgdGhlIHNhbXBsZSBwcm9ncmFtcy4KKworV2VkIFNlcCAyNyAyMzoxMzo0MyAxOTk1ICBBbmFuZCBLdW1yaWEgPGFrdW1yaWFAb3plbWFpbC5jb20uYXU+CisJCisJKiBbbWlzY2VtdS9pbnQyZi5jXSBbbWlzY2VtdS92eGQuY10gW2lmMTYzMi93aW5wcm9jcy5zcGVjXQorCUZpcnN0IGF0dGVtcHQgYXQgc3VwcG9ydCBmb3Igc29tZSBWeERzLiBDb21tLCBTaGVsbCBhbmQgUGFnZWZpbGUuCisKK1R1ZSBTZXAgMjYgMjE6MzQ6NDUgMTk5NSAgSGFucyBkZSBHcmFhZmYgIDxncmFhZmZAdHdpNzIudHdpLnR1ZGVsZnQubmw+CisKKwkqIFttaXNjL2Rvc19mcy5jXQorCURPU19TaW1wbGlmeVBhdGg6IEFsc28gcmVtb3ZlICIvLi8iIGZyb20gcGF0aC4gKEhhcHBlbnMgd2hlbgorIAlzdGFydGluZyBhcHBsaWNhdGlvbnMgbGlrZSAnd2luZSAuL2V4Y2VsLmV4ZScpCisKK1NhdCBTZXAgMjMgMjM6MzI6NDAgMTk5NSAgTW9ydGVuIFdlbGluZGVyICA8dGVycmFAZGlrdS5kaz4KKworCSogW2NvbmZpZ3VyZS5pbl0KKwlBdm9pZCByZWxhdGl2ZSBwYXRoIGZvciB3aW5lLmluaS4KKworCSogW3JjL3N5c3Jlc19EYS5yY10KKwlTdXBwb3J0IGZvciBEYW5pc2ggW0RhXSBsYW5ndWFnZS4KKworCSogW21pc2MvbWFpbi5jXSBbbWlzY2VtdS9jcHUuY10KKwlSZXR1cm4gdGhlIHByb2Nlc3NvciB3ZSdyZSBydW5uaW5nIG9uIGNvcnJlY3RseS4KKworCSogW21pc2NlbXUvaW50MmYuY10KKwlNaW5vciBzdHVmZiBpbiBpbnQgMHgyZiwgZnVuY3Rpb24gMHgxNi4KKworU2F0IFNlcCAyMyAxOTk1IDE3OjU4OjA0ICBNYXJjdXMgTWVpc3NuZXIgIDxtc21laXNzbkBmYXVpMDEuaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+CisKKwkqIFttaXNjL3NoZWxsLmNdIFttaXNjL21haW4uY10KKwlJbXBsZW1lbnQgc2F2aW5nIGFuZCBsb2FkaW5nIG9mIHRoZSByZWdpc3RyeSBkYXRhYmFzZSAobmVlZGVkIGZvcgorCU9MRSkuIFZlcnkgZXhwZXJpbWVudGFsLiBGaXhlZCBTaGVsbEV4ZWN1dGUoKS4KKwkKKwkqIFttaXNjZW11L2ludDIxLmNdCisJRUVYSVNUIGlzIG5vdCBhIGNyaXRpY2FsIGVycm9yIGNvbmRpdGlvbiBmb3IgbWtkaXIoKS4KKworRnJpIFNlcCAyMiAwMTozMzozNCAxOTk1ICBBbGV4IEtvcm9ia2EgIDxhbGV4QHBobTYucGhhcm0uc3VueXNiLmVkdT4KKworCSogW2luY2x1ZGUvc2hlbGwuaF0gW21pc2Mvc2hlbGwuY10KKwlJbXBsZW1lbnRlZCA0IGRyYWcvZHJvcCBmdW5jdGlvbnMgd2l0aCBkb2N1bWVudGVkIGZ1bmN0aW9uYWxpdHkuCisKKyAgICAgICAgKiBbbXVsdGltZWRpYS90aW1lLmNdCisgICAgICAgICJGaXhlZCIgTU1TeXNUaW1lQ2FsbGJhY2sga2x1ZGdlIHNvIEV4Y2VsNSBsb2FkcyB1cCB3aXRob3V0IGNyYXNoaW5nLgorCisJKiBbKi8qXSAKKyAgICAgICAgQWRkZWQgbmV3IGZpbGVzLCBtb3JlIG1lc3NhZ2UgZGVmaW5pdGlvbnMsIHN0cnVjdHVyZXMsIGRlYnVnIGluZm8sCisgCWV0Yy4gIFJld3JvdGUgbWVzc2FnZSBsb2dnaW5nIGZ1bmN0aW9ucyB0byBwcm9kdWNlIG91dHB1dCBzaW1pbGFyCisgCXRvIFdpblNpZ2h0LiAgQ2hlY2sgb3V0IC1kZWJ1Z21zZyArbWVzc2FnZSBvcHRpb24uCisKKwkqIFttaXNjL2ZpbGUuY10KKyAgICAgICAgRml4ZWQgR2V0RHJpdmVUeXBlIHJldHVybiB2YWx1ZS4gIAorCisgICAgICAgICogW3dpbmRvd3MvbWVzc2FnZS5jXSAKKyAgICAgICAgSG9va3MgYXJlIGludm9rZWQgaW4gbm9ybWFsIG9yZGVyLgorCisgICAgICAgICogW21pc2NlbXUvKl0KKyAgICAgICAgQWRkZWQgc29tZSBmdW5jdGlvbnMgYW5kIGludGVycnVwdHMuCisKKyAgICAgICAgKiBbbWlzYy9zaGVsbC5jXQorICAgICAgICBJbXBsZW1lbnRlZCBEcmFnLi4uIGZ1bmN0aW9ucy4KKworVGh1IFNlcCAyMSAyMzo1MDoxMiAxOTk1ICBKdWtrYSBJaXZvbmVuIDxpaXZvbmVuQGNjLmhlbHNpbmtpLmZpPgorCisJKiBbcmMvc3lzcmVzX0ZpLnJjXSBbcmMvc3lzcmVzLnJjXQorCUZpcnN0IGF0dGVtcHQgYXQgRmlubmlzaCBbRmldIGxhbmd1YWdlIHN1cHBvcnQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFN1biBTZXAgMTcgMTY6NDc6NDkgMTk5NSAgQWxleGFuZHJlIEp1bGxpYXJkICA8anVsbGlhcmRAc3Vuc2l0ZS51bmMuZWR1PgogCiAJKiBbY29uZmlndXJlLmluXSBbKi9NYWtlZmlsZS5pbl0gW01ha2UucnVsZXMuaW5dCmRpZmYgLS1naXQgYS9Db25maWd1cmUub2xkIGIvQ29uZmlndXJlLm9sZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3ZjRhMC4uMDAwMDAwMAotLS0gYS9Db25maWd1cmUub2xkCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLSMhIC9iaW4vc2gKLSMKLSMgQ29uZmlndXJlIHNjcmlwdCBmb3Igd2luZQotCi06ICR7RURJVE9SOj12aX0KLTogJHtQQUdFUjo9bW9yZX0KLQotV0lORUxJQj0nJwotTEFOR1VBR0U9bm90X21hdGNoaW5nCi1BTExERUZJTkVTPScnCi0KLSMgQXNrIHF1ZXN0aW9uICdzdHInIGFuZCBzZXQgJ3ZhcicgdG8gcmVwbHkgKGRlZmF1bHRpbmcgdG8gJ2RlZicgb24gQ1IpCi1wcm9tcHQgKCkKLXsKLQlzdHI9IiQxIgotCXZhcj0iJDIiCi0JZGVmPSIkMyIKLQotCWV2YWwgJHZhcj0nJGRlZicKLQllY2hvCi0JZWNobyAtbiAiJHN0ciBbJGRlZl0/ICIKLQlpbnB1dD1gaGVhZCAtMWAgICMgIFdoZW4gdXNpbmcgcmVhZCwgdXNlciBtdXN0IGRvdWJsZSBhbGwgYmFja3NsYXNoZXMKLQlpZiBbIC1uICIkaW5wdXQiIF0KLQl0aGVuCi0JCWV2YWwgJHZhcj0nJGlucHV0JwotCWZpCi19Ci0KLWVjaG8KLWVjaG8gUmVhZCB0aGUgUkVMRUFTRS1OT1RFUyBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIHZhcmlvdXMgZmxhZ3MKLWVjaG8KLQotZWNobyAtbiAnQnVpbGQgV2luZSBhcyBlbXVsYXRvciBvciBsaWJyYXJ5IChFL0wpIFtFXT8gJwotcmVhZCBpbnB1dAotaWYgWyAiJGlucHV0IiA9ICdsJyAtbyAiJGlucHV0IiA9ICdMJyBdCi10aGVuCi0JV0lORUxJQj0nI2RlZmluZSBXSU5FTElCIC1EV0lORUxJQicKLQlBTExERUZJTkVTPSIkQUxMREVGSU5FUyAtRFdJTkVMSUIiCi1maQotCi1MQU5HUz1gZWNobyBFbiByYy9zeXNyZXNfKi5yYyB8IHNlZCAtZSAncy9yY1wvc3lzcmVzXy8vZycgLWUgJ3MvXC5yYy8vZycgLWUgJ3MvIC9cLy9nOydgCi13aGlsZQlleHByICIkTEFOR1MiIDogIi4qJExBTkdVQUdFIiA9IDAgPiAvZGV2L251bGwKLWRvCi0JcHJvbXB0ICJMYW5ndWFnZSAoJExBTkdTKSIgTEFOR1VBR0UgRW4KLQlpZglleHByICIkTEFOR1MiIDogIi4qJExBTkdVQUdFIiA9IDAgPiAvZGV2L251bGwKLQl0aGVuCi0JCWVjaG8gIlwiJExBTkdVQUdFXCIgaXMgbm90IGEgc3VwcG9ydGVkIGxhbmd1YWdlLiIKLQlmaQotZG9uZQotQUxMREVGSU5FUz0iJEFMTERFRklORVMgLUFMQU5HXCgkTEFOR1VBR0VcKSIKLQotcHJvbXB0ICJJbnRlci1wcm9jZXNzIGNvbW11bmljYXRpb24iIENPTkZJR19JUEMgTgotaWYgWyBDT05GSUdfSVBDID0gJ1knIC1vICRDT05GSUdfSVBDID0gJ3knIF0KLXRoZW4KLSAgICAgICBBTExERUZJTkVTPSIkQUxMREVGSU5FUyAtRENPTkZJR19JUEMiCi1maQotCi1wcm9tcHQgIk1hbGxvYyBkZWJ1Z2dpbmciIE1BTExPQ19ERUJVR0dJTkcgTgotaWYgWyBNQUxMT0NfREVCVUdHSU5HID0gJ1knIC1vICRNQUxMT0NfREVCVUdHSU5HID0gJ3knIF0KLXRoZW4KLSAgICAgICBNQUxMT0NfREVCVUdHSU5HPSIjZGVmaW5lIE1BTExPQ19ERUJVR0dJTkciCi0gICAgICAgQUxMREVGSU5FUz0iJEFMTERFRklORVMgLURNQUxMT0NfREVCVUdHSU5HIgotZWxzZQotICAgICAgIE1BTExPQ19ERUJVR0dJTkc9JycKLWZpCi0KLXByb21wdCAiR2xvYmFsIGNvbmZpZ2ZpbGUgbmFtZSIgV0lORV9DT05GSUdGSUxFIC91c3IvbG9jYWwvZXRjL3dpbmUuY29uZgotCi1pZiBbIC1yICRXSU5FX0NPTkZJR0ZJTEUgXQotdGhlbgotCURFRkFVTFRfQU5TPU4KLWVsc2UKLQlERUZBVUxUX0FOUz1ZCi1maQotCi1lY2hvCi1lY2hvIC1uICJEbyB5b3Ugd2FudCB0byBtYWtlIGEgY29uZmlnIGZpbGUgbm93IChZL04pIFskREVGQVVMVF9BTlNdPyAiCi1yZWFkIGlucHV0Ci1pZiBbICIkaW5wdXQiID0gJycgXQotdGhlbgotCWlucHV0PSIkREVGQVVMVF9BTlMiCi1maQotaWYgWyAiJGlucHV0IiA9ICd5JyAtbyAiJGlucHV0IiA9ICdZJyBdCi10aGVuCi0JaWYgWyAtciAkV0lORV9DT05GSUdGSUxFIF0KLQl0aGVuCi0JCWVjaG8gIkJhY2tpbmcgdXAgdGhlIG9sZCBmaWxlIHRvICR7V0lORV9DT05GSUdGSUxFfS5vbGQuIgotCQlpZiBjcCAkV0lORV9DT05GSUdGSUxFICR7V0lORV9DT05GSUdGSUxFfS5vbGQKLQkJdGhlbgk6Ci0JCWVsc2UKLQkJCWVjaG8gIkVycm9yIHdoaWxlIGNyZWF0aW5nIGJhY2t1cCBmaWxlLiAgRml4IGl0IGFuZCBydW4gQ29uZmlndXJlIGFnYWluIgotCQkJZXhpdCAxCi0JCWZpCi0JZmkKLQotCUNGX0E9YG1vdW50IHwgYXdrICcvXlwvZGV2XC9mZC8ge3ByaW50ICQzO2V4aXR9IEVORCB7cHJpbnQgIi9hIn0nYAotCXByb21wdCAiV2hpY2ggZGlyZWN0b3J5IGRvIHlvdSB3YW50IHRvIHVzZSBhcyBBOiIgQ0ZfQSAkQ0ZfQQotCUNGX0M9YGF3ayAne2lmICgkMz09Im1zZG9zIikge3ByaW50ICQyO2V4aXR9fSBFTkQge3ByaW50ICIvYyJ9JyAvZXRjL2ZzdGFiYAotCXByb21wdCAiV2hpY2ggZGlyZWN0b3J5IGRvIHlvdSB3YW50IHRvIHVzZSBhcyBDOiIgQ0ZfQyAkQ0ZfQwotCXByb21wdCAiV2hlcmUgaXMgdGhlIFdpbmRvd3MgZGlyZWN0b3J5IiBDRl9XaW5kb3dzICdjOlx3aW5kb3dzJwotCXByb21wdCAiV2hlcmUgaXMgdGhlIFN5c3RlbSBkaXJlY3RvcnkiIENGX1N5c3RlbSAnYzpcd2luZG93c1xzeXN0ZW0nCi0JaWYgWyAtciAiJENGX0MvYXV0b2V4ZWMuYmF0IiBdCi0JdGhlbgotCQlDRl9UZW1wPWB0ciBBLVogYS16IDwgIiRDRl9DL2F1dG9leGVjLmJhdFgiIHwgc2VkIC1uICdzL14gKnNldCAqdGVtcD0gKlwoYzouKlthLXpdXCkuKi9cMS9wJ2AKLQlmaQotCWlmIFsgLXogIiRDRl9UZW1wIiBdCi0JdGhlbgotCQlDRl9UZW1wPSdjOlx0ZW1wJwotCWZpCi0JcHJvbXB0ICJXaGVyZSBzaG91bGQgV2luZG93cyBhcHBzIHN0b3JlIHRlbXAgZmlsZXMiIENGX1RlbXAgJENGX1RlbXAKLQlwcm9tcHQgIldoaWNoIHBhdGggc2hvdWxkIGJlIHVzZWQgdG8gZmluZCBwcm9ncy9ETEwncyIgQ0ZfUGF0aCAiJENGX1dpbmRvd3M7JENGX1N5c3RlbSIKLQlwcm9tcHQgIldoZXJlIGlzIENPTTEiIENGX0NvbTEgJy9kZXYvY3VhMCcKLQlwcm9tcHQgIldoZXJlIGlzIENPTTIiIENGX0NvbTIgJy9kZXYvY3VhMScKLQlwcm9tcHQgIldoZXJlIGlzIExQVDEiIENGX0xwdDEgJy9kZXYvbHAwJwotCi0JZWNobwotCXNlZCAtbiAtZSAncy9eICpcIlwoV01fW0EtWjAtOV0qXClcIi4qL1wxL3AnIDwgbWlzYy9zcHkuYyB8IFwKLQkJc29ydCB8IHByIC10YTR3ODMgfCBzZWQgJzEgaVwKLUhlcmUgaXMgdGhlIGxpc3Qgb2YgbWVzc2FnZXM6XAotXAotJyB8ICRQQUdFUgotCi0JcHJvbXB0ICJFeGNsdWRlIHdoaWNoIG1lc3NhZ2VzIGZyb20gdGhlIGxvZyIgQ0ZfRXhjbHVkZSAnV01fU0laRTtXTV9USU1FUicKLQotCWNhdCA+ICAkV0lORV9DT05GSUdGSUxFIDw8IEVPRgotW2RyaXZlc10KLUE9JENGX0EKLUM9JENGX0MKLQotW3dpbmVdCi1XaW5kb3dzPSRDRl9XaW5kb3dzCi1TeXN0ZW09JENGX1N5c3RlbQotVGVtcD0kQ0ZfVGVtcAotUGF0aD0kQ0ZfUGF0aAotU3lzdGVtUmVzb3VyY2VzPSRDRl9TeXN0ZW1SZXNvdXJjZXMKLQotW2ZvbnRzXQotc3lzdGVtPSotaGVsdmV0aWNhCi1tc3NhbnNzZXJpZj0qLWhlbHZldGljYQotbXNzZXJpZj0qLXRpbWVzCi1maXhlZHN5cz0qLWZpeGVkCi1hcmlhbD0qLWhlbHZldGljYQotaGVsdj0qLWhlbHZldGljYQotcm9tYW49Ki10aW1lcwotZGVmYXVsdD0qLSoKLQotW3NlcmlhbHBvcnRzXQotQ29tMT0kQ0ZfQ29tMQotQ29tMj0kQ0ZfQ29tMgotCi1bcGFyYWxsZWxwb3J0c10KLUxwdDE9JENGX0xwdDEKLQotW3NweV0KLUV4Y2x1ZGU9JENGX0V4Y2x1ZGUKLUVPRgotCi0JZWNobwotCXNlZCAnMSBpXAotVGhlIGNvbmZpZyBmaWxlICciJFdJTkVfQ09ORklHRklMRSInIG5vdyBsb29rcyBsaWtlIHRoaXM6XAotXAotJyA8ICRXSU5FX0NPTkZJR0ZJTEUgfCAkUEFHRVIKLQotCWVjaG8KLQllY2hvIC1uICJEbyB5b3Ugd2FudCB0byBlZGl0IGl0IHVzaW5nICRFRElUT1IgKFkvTikgW05dPyAiCi0JcmVhZCBpbnB1dAotCWlmIFsgIiRpbnB1dCIgPSAneScgLW8gIiRpbnB1dCIgPSAnWScgXQotCXRoZW4KLQkJJEVESVRPUiAkV0lORV9DT05GSUdGSUxFCi0JZmkKLWVsc2UKLQlpZiBbICEgLXIgJFdJTkVfQ09ORklHRklMRSBdCi0JdGhlbgotCQllY2hvICdPaywgcmVtZW1iZXIgdG8gbWFrZSBpdCB5b3Vyc2VsZiBsYXRlci4nCi0JZmkKLWZpCi0KLWNhdCA+IGF1dG9jb25mLmggPDwgRU9GCi0vKiBhdXRvY29uZi5oIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LiAgUnVuIENvbmZpZ3VyZS4gKi8KLSRXSU5FTElCCi0kTUFMTE9DX0RFQlVHR0lORwotI2RlZmluZSBXSU5FX0lOSV9HTE9CQUwgIiRXSU5FX0NPTkZJR0ZJTEUiCi0jZGVmaW5lIEF1dG9EZWZpbmVzICRBTExERUZJTkVTCi1FT0YKLQotZWNobwotZWNobyAiQ3JlYXRpbmcgTWFrZWZpbGVzLiAgVGhpcyBtYXkgdGFrZSBhIHdoaWxlLiIKLWlmIHhta21mIC1hCi10aGVuIDoKLWVsc2UJY2F0IDw8IEVPRgotCi1XQVJOSU5HOiAgVGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjb21tYW5kICd4bWttZiAtYScgaW5kaWNhdGVzIGFuIGVycm9yLgotTWF5YmUgdGhlIFdpbmUgZGlyZWN0b3J5IGlzIGluY29tcGxldGUsIG9yIEltYWtlIChzZWUgJ21hbiB4bWttZiBpbWFrZScpCi1pcyBpbmNvcnJlY3RseSBjb25maWd1cmVkPyAgSW4gdGhlIGxhdHRlciBjYXNlLCBpdCBtaWdodCBiZSBlYXNpZXN0IHRvCi1yZWluc3RhbGwgWDExIHRvIGdldCBhIG5ldyBjb3B5IG9mIEltYWtlLgotRU9GCi1maQotCi1pZiBbIDAgLWx0IGBmaW5kIC4gLW5hbWUgIioucmVqIiAtcHJpbnQgfCB3YyAtbGAgXQotdGhlbgotCWNhdCA8PCBFT0YKLQotV0FSTklORzogIFlvdSBoYXZlIHNvbWUgZmlsZXMgbmFtZWQgJyoucmVqJywgd2hpY2ggdXN1YWxseSBpbmRpY2F0ZXMKLXJlamVjdGVkIHBhdGNoIGZpbGVzLiAgTWF5YmUgeW91IHRyaWVkIHRvIHVwZ3JhZGUgV2luZSB3aXRoICdwYXRjaCcsCi1hbmQgdGhhdCBzb21lIG9mIHRoZSBwYXRjaGVzIGZhaWxlZD8gIElmIHNvbWV0aGluZyBkb2Vzbid0IHdvcmssIHRoaXMKLW1pZ2h0IGJlIHRoZSByZWFzb24uICBTZWUgJ21hbiBwYXRjaCcgKGVzcGVjaWFsbHkgdGhlICctcCcgb3B0aW9uKS4KLQotTGlzdCBvZiAiKi5yZWoiIGZpbGVzOgotCi1FT0YKLQlmaW5kIC4gLW5hbWUgIioucmVqIiAtcHJpbnQKLWZpCi0KLWlmIFsgLWYgLi9NYWtlZmlsZSBdCi10aGVuCi0JZWNobwotCWVjaG8gIkNvbmZpZ3VyZSBmaW5pc2hlZC4gIERvICdtYWtlJyB0byBjb21waWxlIFdpbmUuIgotZWxzZQotCWVjaG8KLQllY2hvICIqKiogVGhlcmUgd2FzIGEgcHJvYmxlbSB3aXRoICdpbWFrZSc6IHRoZSBtYWluIE1ha2VmaWxlIGhhcyBub3QgYmUgY3JlYXRlZC4iCi1maQpkaWZmIC0tZ2l0IGEvREVWRUxPUEVSUy1ISU5UUyBiL0RFVkVMT1BFUlMtSElOVFMKaW5kZXggOTZlMTcxMy4uYTY2MTI3NiAxMDA2NDQKLS0tIGEvREVWRUxPUEVSUy1ISU5UUworKysgYi9ERVZFTE9QRVJTLUhJTlRTCkBAIC01NywxMyArNTcsNiBAQAogY29udHJvbCB0byB0aGUgcHJvcGVyIGhhbmRsZXIuICBUaGUgZm9ybWF0IG9mIHRoZSAqLnNwZWMgZmlsZXMgaXMKIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUgInRvb2xzL2J1aWxkLXNwZWMudHh0Ii4KIAotUkVHSVNURVIgRlVOQ1RJT05TOgotCi1Tb21lIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBhcyB0eXBlICJyZWdpc3RlciIgaW4gdGhlIERMTCBzcGVjaWZpY2F0aW9uIGZpbGVzLgotSW4gb3JkZXIgdG8gcmV0dXJuIHZhbHVlcyBpbiB0aGUgcmVnaXN0ZXJzIHRvIHRoZSBXSU4xNiBwcm9ncmFtLCB0aGUgaGFuZGxlcgotZnVuY3Rpb24gbXVzdCBleGl0IGJ5IGNhbGxpbmcgUmV0dXJuRnJvbVJlZ2lzdGVyRnVuYygpLiAgTG9vayBhdCB0aGUgZnVuY3Rpb24KLURPUzNDYWxsKCkgZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRoaXMgd29ya3MuCi0KIERFQlVHIE1FU1NBR0VTOgogCiBUbyBkaXNwbGF5IGEgbWVzc2FnZSBvbmx5IGR1cmluZyBkZWJ1Z2dpbmcsIHlvdSBub3JtYWxseSB3cml0ZSBzb21ldGhpbmcKZGlmZiAtLWdpdCBhL0ltYWtlZmlsZSBiL0ltYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmZmFjNi4uMDAwMDAwMAotLS0gYS9JbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotI2luY2x1ZGUgImF1dG9jb25mLmgiCi0jaW5jbHVkZSAiV2luZS50bXBsIgotCi0jaWYgZGVmaW5lZChpMzg2RnJlZUJzZCkgfHwgZGVmaW5lZChGcmVlQlNEQXJjaGl0ZWN0dXJlKQotTUFLRSA9IGdtYWtlCi0jZW5kaWYKLQotREVGSU5FUyA9IEF1dG9EZWZpbmVzIC1EVVNFX1JFQURMSU5FCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSBzZWNvbmQgdHJ5IGF0IHVzaW5nIEltYWtlZmlsZXMuIFRoZXJlIGFyZSBwcm9iYWJseSBtYW55Ci0gKiBwcm9ibGVtcyBhbmQgdGhpbmdzIEkgaGF2ZW4ndCBldmVuIGNvbnNpZGVyZWQuIEkgZG8gbm90IGhhdmUgYSBmaXhlZAotICogTGludXggc3lzdGVtIHRvIHRlc3QgdGhlbSBvbiwgYnV0IHRoYW5rcyB0byBUaG9tYXMgTWljaGxtYXlyCi0gKiA8dG1pY2hsQGNvc3kuc2JnLmFjLmF0PiBmb3IgdXNlIG9mIG9uZSBvZiBoaXMgYm94ZXMuIAotICoKLSAqIFNFRSBCRUxPVyBBQk9VVCBERUJVR0dJTkcgQU5EIExJTlVYCi0gKgotICogUGV0ZXIgR2FsYmF2eSwgMzFzdCBKYW4gMTk5NDogcGV0ZXJAd29uZGVybGFuZC5vcmcKLSAqLwotCi0jZGVmaW5lIElIYXZlU3ViZGlycwotI2RlZmluZQlQYXNzQ0RlYnVnRmxhZ3MgJ0NERUJVR0ZMQUdTPSQoQ0RFQlVHRkxBR1MpJyAnQ0M9JChDQyknICdNQUtFPSQoTUFLRSknXAotCQkJJ0RFRklORVM9JChERUZJTkVTKScgJ0xEPSQoTEQpJyAnQVNGTEFHUz0kKEFTRkxBR1MpJwotCi1DT01NT05TVUJESVJTID0gXAotCWNvbnRyb2xzIFwKLQlyYyBcCi0JaXBjIFwKLQlsb2FkZXIgXAotCW1pc2MgXAotCW11bHRpbWVkaWEgXAotCW9iamVjdHMgXAotCXdpbmRvd3MKLQotRU1VU1VCRElSUyA9IFwKLQl0b29scyBcCi0JZGVidWdnZXIgXAotCWlmMTYzMiBcCi0JbWVtb3J5IFwKLQltaXNjZW11Ci0KLUxJQlNVQkRJUlMgPSBcCi0JdG9vbGtpdAotCi1XSU5FRElSID0gJChMSUJESVIpL3dpbmUKLQotQ09NTU9OT0JKUyA9IFwKLQljb250cm9scy9jb250cm9scy5vIFwKLQlpcGMvaXBjLm8gXAotCWxvYWRlci9sb2FkZXIubyBcCi0JbWlzYy9taXNjLm8gXAotCW11bHRpbWVkaWEvbXVsdGltZWRpYS5vIFwKLQlvYmplY3RzL29iamVjdHMubyBcCi0JcmMvcmMubyBcCi0Jd2luZG93cy93aW5kb3dzLm8KLQotRU1VT0JKUyA9IFwKLQlkZWJ1Z2dlci9kZWJ1Z2dlci5vIFwKLQlpZjE2MzIvaWYxNjMyLm8gXAotCW1lbW9yeS9tZW1vcnkubyBcCi0JbWlzY2VtdS9taXNjZW11Lm8KLQotTElCT0JKUyA9IFwKLQl0b29sa2l0L3Rvb2xraXQubwotCi0jaWZuZGVmIFdJTkVMSUIKLVNVQkRJUlMgPSAkKENPTU1PTlNVQkRJUlMpICQoRU1VU1VCRElSUykKLU9CSlMgPSAkKEVNVU9CSlMpICQoQ09NTU9OT0JKUykKLSNlbHNlCi1TVUJESVJTID0gJChDT01NT05TVUJESVJTKSAkKExJQlNVQkRJUlMpCi1PQkpTID0gJChMSUJPQkpTKSAkKENPTU1PTk9CSlMpCi0jZW5kaWYKLQotI2lmZGVmIGkzODZCc2RBcmNoaXRlY3R1cmUKLVNZU0xJQlMgPSAtbGwgLWxtIC1saTM4NiAtbGdudW1hbGxvYwotI2VuZGlmCi0jaWYgZGVmaW5lZChpMzg2RnJlZUJzZCkgfHwgZGVmaW5lZChGcmVlQlNEQXJjaGl0ZWN0dXJlKQotU1lTTElCUyA9IC1sbCAtbG0gLWxnbnVtYWxsb2MKLSNlbmRpZgotI2lmZGVmIExpbnV4QXJjaGl0ZWN0dXJlCi1TWVNMSUJTID0gLWxtIC1sZwotI2VuZGlmCi0KLS8qIFlvdSBtYXkgbmVlZCB0byBhZGQgdGhlIGZ1bGwgcGF0aCBvZiB5b3VyIGxpYlhwbSBoZXJlICovCi1YUE1fTElCID0gLWxYcG0KLQotI2lmZGVmIE1BTExPQ19ERUJVR0dJTkcKLU1BTExPQ0xJQiA9IC1sbWNoZWNrCi0jZWxzZQotTUFMTE9DTElCID0KLSNlbmRpZgotCi1NYWtlU3ViZGlycygkKFNVQkRJUlMpKQotRGVwZW5kU3ViZGlycygkKFNVQkRJUlMpKQotCi0jaWZuZGVmIFdJTkVMSUIKLU5vcm1hbFByb2dyYW1UYXJnZXQod2luZSwkKE9CSlMpLCQoREVQWExJQiksJChYUE1fTElCKSAkKFhMSUIpLCQoTUFMTE9DTElCKSAkKFNZU0xJQlMpKQotQWxsVGFyZ2V0KHdpbmUuc3ltKQotI2Vsc2UKLU5vcm1hbExpYnJhcnlUYXJnZXQod2luZSwkKE9CSlMpKQotI2VuZGlmCi0KLXdpbmUuc3ltOiB3aW5lCi0Jbm0gd2luZXxncmVwIC12IF9jb21waWxlZHxzb3J0ID53aW5lLnN5bQotCi1jbGVhbjo6Ci0JJChSTSkgd2luZS5zeW0KLQotZGVwZW5kOjoKLQotaW5zdGFsbDo6Ci0KLWV0YWdzOjoKLQlldGFncyBgZmluZCAuIC1uYW1lICcqLltjaFNdJyAtcHJpbnRgCi0KLWRpc3RjbGVhbjogY2xlYW4KLQllY2hvICIvKiBhdXRvY29uZi5oIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LiAgUnVuIENvbmZpZ3VyZSAqLyIgPmF1dG9jb25mLmgKLQllY2hvICIjZXJyb3IgWW91IG11c3QgcnVuIENvbmZpZ3VyZSBiZWZvcmUgeW91IGNhbiBidWlsZCB0aGUgbWFrZWZpbGVzLiIgPj5hdXRvY29uZi5oCi0JJChSTSkgY29uZmlnLiogYGZpbmQgLiAtbmFtZSBNYWtlZmlsZSAtcHJpbnRgCmRpZmYgLS1naXQgYS9NYWtlLnJ1bGVzLmluIGIvTWFrZS5ydWxlcy5pbgppbmRleCBjNjE4YzUwLi43ODk0ZDJiIDEwMDY0NAotLS0gYS9NYWtlLnJ1bGVzLmluCisrKyBiL01ha2UucnVsZXMuaW4KQEAgLTEwLDcgKzEwLDcgQEAKIExFWCAgICAgICA9IEBMRVhACiBMRVhMSUIgICAgPSBATEVYTElCQAogRElWSU5DTCAgID0gLUkkKFRPUFNSQykvaW5jbHVkZQotQUxMQ0ZMQUdTID0gJChDRkxBR1MpICQoREVGUykgJChMQU5HKSAkKFhfQ0ZMQUdTKSAkKERJVklOQ0wpICQoRVhUUkFfREVGUykKK0FMTENGTEFHUyA9ICQoQ0ZMQUdTKSAkKERFRlMpIC1BTEFOR1woJChMQU5HKVwpICQoWF9DRkxBR1MpICQoRElWSU5DTCkgJChFWFRSQV9ERUZTKQogTERDT01CSU5FID0gbGQgLXIKIFJNICAgICAgICA9IHJtIC1mCiBAU0VUX01BS0VACmRpZmYgLS1naXQgYS9NYWtlZmlsZS5pbiBiL01ha2VmaWxlLmluCmluZGV4IDU1NTlkZDkuLjEzMGYxMmYgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlLmluCisrKyBiL01ha2VmaWxlLmluCkBAIC0yOCwxMiArMjgsMTIgQEAKIAogTUFJTl9UQVJHRVQgPSBATUFJTl9UQVJHRVRACiAKLUNPTU1PTlNVQkRJUlMgPSByYyBjb250cm9scyBpcGMgbG9hZGVyIG1pc2MgbXVsdGltZWRpYSBvYmplY3RzIHdpbmRvd3MKK0NPTU1PTlNVQkRJUlMgPSByYyBjb250cm9scyBpcGMgbG9hZGVyIG1pc2MgbXVsdGltZWRpYSBvYmplY3RzIHdpbjMyIHdpbmRvd3MKIAogRU1VU1VCRElSUyA9IHRvb2xzIGRlYnVnZ2VyIGRlYnVnZ2VyL3JlYWRsaW5lIGlmMTYzMiBtZW1vcnkgbWlzY2VtdQogCiBMSUJTVUJESVJTID0gdG9vbGtpdAotIAorCiBBTExTVUJESVJTID0gJChDT01NT05TVUJESVJTKSAkKEVNVVNVQkRJUlMpICQoTElCU1VCRElSUykKIAogQ09NTU9OT0JKUyA9IFwKQEAgLTQ0LDYgKzQ0LDcgQEAKIAltdWx0aW1lZGlhL211bHRpbWVkaWEubyBcCiAJb2JqZWN0cy9vYmplY3RzLm8gXAogCXJjL3JjLm8gXAorCXdpbjMyL3dpbjMyLm8gXAogCXdpbmRvd3Mvd2luZG93cy5vCiAKIEVNVU9CSlMgPSBcCkBAIC05MCw1ICs5MSw1IEBACiBsYW5nY2xlYW46CiAJZm9yIGkgaW4gJChBTExTVUJESVJTKTsgZG8gKGNkICQkaTsgJChNQUtFKSBsYW5nY2xlYW4pOyBkb25lCiAJJChSTSkgd2luZSB3aW5lLnN5bSB3aW5lbGliLmEKLQkKKwogZHVtbXk6CmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggNmRjNmQ2NC4uZTAwYTE3NyAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMjIsNyArMjIsNyBAQAogYWxzbyBiZSBmb3VuZCBvbiBmdHAueC5vcmcgYW5kIGFsbCBpdHMgbWlycm9yIHNpdGVzLgogCiBUbyBidWlsZCBXaW5lLCBmaXJzdCBkbyBhICIuL2NvbmZpZ3VyZSIgYW5kIHRoZW4gYSAibWFrZSBkZXBlbmQ7IG1ha2UiLgotIFRoZSBleGVjdXRhYmxlICJ3aW5lIiB3aWxsIGJlIGJ1aWx0LiAgIndpbmUiIHdpbGwgbG9hZCBhbmQgcnVuIDE2LWJpdAorVGhlIGV4ZWN1dGFibGUgIndpbmUiIHdpbGwgYmUgYnVpbHQuICAid2luZSIgd2lsbCBsb2FkIGFuZCBydW4gMTYtYml0CiBXaW5kb3dzIGV4ZWN1dGFibGVzLgogCiBUbyB1cGdyYWRlIHRvIGEgbmV3IHJlbGVhc2UgYnkgdXNpbmcgYSBwYXRjaCBmaWxlLCBmaXJzdCBjZCB0byB0aGUKQEAgLTEwNCwyMCArMTA0LDE1IEBACiAKICogW3NweV0KIAotZm9ybWF0OiBmaWxlID0gPGZpbGVuYW1lIG9yIENPTiB3aGVuIGxvZ2dpbmcgdG8gc3Rkb3V0PgorZm9ybWF0OiBleGNsdWRlID0gPG1lc3NhZ2UgbmFtZXMgYW5kL29yIEVYQ0xVREVBTEwgc2VwYXJhdGVkIGJ5IGNvbW1hcyA+CiBkZWZhdWx0OiBub25lCiAKLXVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSB3aGljaCB3aWxsIGJlIHVzZWQgYXMgbG9nZmlsZS4KK1VzZWQgdG8gc3BlY2lmeSB3aGljaCBtZXNzYWdlcyB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIG1lc3NhZ2UgbG9nZ2luZy4KIAotZm9ybWF0OiBleGNsdWRlID0gPG1lc3NhZ2UgbmFtZXMgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnM+Citmb3JtYXQ6IGluY2x1ZGUgPSA8bWVzc2FnZSBuYW1lcyBhbmQvb3IgSU5DTFVERUFMTCBzZXBhcmF0ZWQgYnkgY29tbWFzID4KIGRlZmF1bHQ6IG5vbmUKIAotVXNlZCB0byBzcGVjaWZ5IHdoaWNoIG1lc3NhZ2VzIHdpbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgbG9nZmlsZS4KLQotZm9ybWF0OiBpbmNsdWRlID0gPG1lc3NhZ2UgbmFtZXMgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnM+Ci1kZWZhdWx0OiBub25lCi0KLVVzZWQgdG8gc3BlY2lmeSB3aGljaCBtZXNzYWdlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBsb2dmaWxlLgorVXNlZCB0byBzcGVjaWZ5IHdoaWNoIG1lc3NhZ2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG1lc3NhZ2UgbG9nZ2luZy4KIAogCiA0LiBSVU5OSU5HIFBST0dSQU1TCmRpZmYgLS1naXQgYS9XaW5lLm1hbiBiL1dpbmUubWFuCmluZGV4IGFlYjE0NjMuLjc4OWE1MDMgMTAwNjQ0Ci0tLSBhL1dpbmUubWFuCisrKyBiL1dpbmUubWFuCkBAIC0zMTksOCArMzE5LDggQEAKIENoYW5nZXMgaW4gV2luZSwgc2luY2UgdGhlIGJlZ2lubmluZyAobW9zdCByZWNlbnQgY2hhbmdlcyBmaXJzdCkKIC5UUAogLkkgY29uZmlndXJlCi1TaGVsbCBzY3JpcHQgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBNYWtlZmlsZXMuICBVc3VhbGx5IGZvbGxvd2VkIGJ5IG1ha2UgCi0ob3IgZ21ha2Ugb24gKkJTRCBzeXN0ZW1zKSB0byBjb21waWxlIHdpbmUuCitTaGVsbCBzY3JpcHQgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBNYWtlZmlsZXMuICBVc3VhbGx5IGZvbGxvd2VkIGJ5CittYWtlIHRvIGNvbXBpbGUgd2luZS4KIC5UUAogLkkgV2luZSBuZXdzZ3JvdXAKIFN1YnNjcmliZSB0byBjb21wLmVtdWxhdG9ycy5tcy13aW5kb3dzLndpbmUKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQppbmRleCBlMzc2MGM4Li43Mzk0NGJjIDEwMDc1NQotLS0gYS9jb25maWd1cmUKKysrIGIvY29uZmlndXJlCkBAIC0xNSw3ICsxNSw3IEBACiBhY19oZWxwPSIkYWNfaGVscAogICAtLXdpdGgtbGlicmFyeSAgICAgICAgICBidWlsZCBXaW5lIGFzIGEgbGlicmFyeSBpbnN0ZWFkIG9mIGFuIGVtdWxhdG9yIgogYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWxhbmd1YWdlPUxBTkcgICAgY2hhbmdlIHRoZSBkZWZhdWx0IGxhbmd1YWdlIChMQU5HPUVuL0RlL05vL0VzKSIKKyAgLS13aXRoLWxhbmd1YWdlPUxBTkcgICAgY2hhbmdlIHRoZSBsYW5ndWFnZSAoTEFORz1Fbi9EZS9Gci9Fcy9Oby9GaS9EYSkiCiBhY19oZWxwPSIkYWNfaGVscAogICAtLXdpdGgtaXBjICAgICAgICAgICAgICB1c2UgaW50ZXItcHJvY2VzcyBjb21tdW5pY2F0aW9uIGZvciBEREUiCiBhY19oZWxwPSIkYWNfaGVscApAQCAtNDMxLDkgKzQzMSw5IEBACiAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWxhbmd1YWdlIG9yIC0td2l0aG91dC1sYW5ndWFnZSB3YXMgZ2l2ZW4uCiB3aXRodmFsPSIkd2l0aF9sYW5ndWFnZSIKIGlmIHRlc3QgLW4gIiR3aXRodmFsIjsgdGhlbgotICBMQU5HPSItQUxBTkdcKCR3aXRodmFsXCkiCisgIExBTkc9IiR3aXRodmFsIgogZWxzZQotICBMQU5HPSItQUxBTkdcKEVuXCkiCisgIExBTkc9RW4KIGZpCiAKIApAQCAtMTU1Niw3ICsxNTU2LDcgQEAKIAogCiBpZiB0ZXN0IC16ICIke3RvcF9zcmNkaXJ9IjsgdGhlbgotVE9QX1NSQ0RJUj0iLiIKK1RPUF9TUkNESVI9YHB3ZGAKIGVsc2UKIFRPUF9TUkNESVI9IiR7dG9wX3NyY2Rpcn0iCiBmaQpAQCAtMTY4OSw3ICsxNjg5LDcgQEAKIAogYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKIAotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlLnJ1bGVzIGNvbnRyb2xzL01ha2VmaWxlIGlwYy9NYWtlZmlsZSBsb2FkZXIvTWFrZWZpbGUgbWVtb3J5L01ha2VmaWxlIG1pc2MvTWFrZWZpbGUgbWlzY2VtdS9NYWtlZmlsZSBtdWx0aW1lZGlhL01ha2VmaWxlIG9iamVjdHMvTWFrZWZpbGUgd2luZG93cy9NYWtlZmlsZSByYy9NYWtlZmlsZSBkZWJ1Z2dlci9NYWtlZmlsZSBkZWJ1Z2dlci9yZWFkbGluZS9NYWtlZmlsZSB0b29scy9NYWtlZmlsZSBpZjE2MzIvTWFrZWZpbGUgdG9vbGtpdC9NYWtlZmlsZSBNYWtlZmlsZSIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlLnJ1bGVzIGNvbnRyb2xzL01ha2VmaWxlIGlwYy9NYWtlZmlsZSBsb2FkZXIvTWFrZWZpbGUgbWVtb3J5L01ha2VmaWxlIG1pc2MvTWFrZWZpbGUgbWlzY2VtdS9NYWtlZmlsZSBtdWx0aW1lZGlhL01ha2VmaWxlIG9iamVjdHMvTWFrZWZpbGUgd2luMzIvTWFrZWZpbGUgd2luZG93cy9NYWtlZmlsZSByYy9NYWtlZmlsZSBkZWJ1Z2dlci9NYWtlZmlsZSBkZWJ1Z2dlci9yZWFkbGluZS9NYWtlZmlsZSB0b29scy9NYWtlZmlsZSBpZjE2MzIvTWFrZWZpbGUgdG9vbGtpdC9NYWtlZmlsZSBNYWtlZmlsZSIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQogCiAjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLiAKIHNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnJC9AZy87IC9AZyQvcy9bXFxcXCYlXS9cXFxcJi9nOyAKQEAgLTE3MjYsNyArMTcyNiw3IEBACiBFT0YKIGNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgogCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlLnJ1bGVzIGNvbnRyb2xzL01ha2VmaWxlIGlwYy9NYWtlZmlsZSBsb2FkZXIvTWFrZWZpbGUgbWVtb3J5L01ha2VmaWxlIG1pc2MvTWFrZWZpbGUgbWlzY2VtdS9NYWtlZmlsZSBtdWx0aW1lZGlhL01ha2VmaWxlIG9iamVjdHMvTWFrZWZpbGUgd2luZG93cy9NYWtlZmlsZSByYy9NYWtlZmlsZSBkZWJ1Z2dlci9NYWtlZmlsZSBkZWJ1Z2dlci9yZWFkbGluZS9NYWtlZmlsZSB0b29scy9NYWtlZmlsZSBpZjE2MzIvTWFrZWZpbGUgdG9vbGtpdC9NYWtlZmlsZSBNYWtlZmlsZSJ9CitDT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlLnJ1bGVzIGNvbnRyb2xzL01ha2VmaWxlIGlwYy9NYWtlZmlsZSBsb2FkZXIvTWFrZWZpbGUgbWVtb3J5L01ha2VmaWxlIG1pc2MvTWFrZWZpbGUgbWlzY2VtdS9NYWtlZmlsZSBtdWx0aW1lZGlhL01ha2VmaWxlIG9iamVjdHMvTWFrZWZpbGUgd2luMzIvTWFrZWZpbGUgd2luZG93cy9NYWtlZmlsZSByYy9NYWtlZmlsZSBkZWJ1Z2dlci9NYWtlZmlsZSBkZWJ1Z2dlci9yZWFkbGluZS9NYWtlZmlsZSB0b29scy9NYWtlZmlsZSBpZjE2MzIvTWFrZWZpbGUgdG9vbGtpdC9NYWtlZmlsZSBNYWtlZmlsZSJ9CiBFT0YKIGNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKIGZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9jb25maWd1cmUuaW4KaW5kZXggNTE1NGNkNy4uODQ2MGQxZCAxMDA2NDQKLS0tIGEvY29uZmlndXJlLmluCisrKyBiL2NvbmZpZ3VyZS5pbgpAQCAtMTYsOSArMTYsOSBAQAogQUNfU1VCU1QoTUFJTl9UQVJHRVQpCiAKIEFDX0FSR19XSVRIKGxhbmd1YWdlLAotWyAgLS13aXRoLWxhbmd1YWdlPUxBTkcgICAgY2hhbmdlIHRoZSBkZWZhdWx0IGxhbmd1YWdlIChMQU5HPUVuL0RlL05vL0VzKV0sCi1bTEFORz0iLUFMQU5HXCgkd2l0aHZhbFwpIl0sCi1bTEFORz0iLUFMQU5HXChFblwpIl0sKQorWyAgLS13aXRoLWxhbmd1YWdlPUxBTkcgICAgY2hhbmdlIHRoZSBsYW5ndWFnZSAoTEFORz1Fbi9EZS9Gci9Fcy9Oby9GaS9EYSldLAorW0xBTkc9IiR3aXRodmFsIl0sCitbTEFORz1Fbl0sKQogQUNfU1VCU1QoTEFORykKIAogQUNfQVJHX1dJVEgoaXBjLApAQCAtNDUsNyArNDUsNyBAQAogQUNfVFlQRV9TSVpFX1QoKQogCiBpZiB0ZXN0IC16ICIke3RvcF9zcmNkaXJ9IjsgdGhlbgotVE9QX1NSQ0RJUj0iLiIKK1RPUF9TUkNESVI9YHB3ZGAKIGVsc2UKIFRPUF9TUkNESVI9IiR7dG9wX3NyY2Rpcn0iCiBmaQpAQCAtNzcsNyArNzcsNyBAQAogTUFLRV9SVUxFUz0kVE9QX1NSQ0RJUi9NYWtlLnJ1bGVzCiBBQ19TVUJTVF9GSUxFKE1BS0VfUlVMRVMpCiAKLUFDX09VVFBVVChNYWtlLnJ1bGVzIGNvbnRyb2xzL01ha2VmaWxlIGlwYy9NYWtlZmlsZSBsb2FkZXIvTWFrZWZpbGUgbWVtb3J5L01ha2VmaWxlIG1pc2MvTWFrZWZpbGUgbWlzY2VtdS9NYWtlZmlsZSBtdWx0aW1lZGlhL01ha2VmaWxlIG9iamVjdHMvTWFrZWZpbGUgd2luZG93cy9NYWtlZmlsZSByYy9NYWtlZmlsZSBkZWJ1Z2dlci9NYWtlZmlsZSBkZWJ1Z2dlci9yZWFkbGluZS9NYWtlZmlsZSB0b29scy9NYWtlZmlsZSBpZjE2MzIvTWFrZWZpbGUgdG9vbGtpdC9NYWtlZmlsZSBNYWtlZmlsZSkKK0FDX09VVFBVVChNYWtlLnJ1bGVzIGNvbnRyb2xzL01ha2VmaWxlIGlwYy9NYWtlZmlsZSBsb2FkZXIvTWFrZWZpbGUgbWVtb3J5L01ha2VmaWxlIG1pc2MvTWFrZWZpbGUgbWlzY2VtdS9NYWtlZmlsZSBtdWx0aW1lZGlhL01ha2VmaWxlIG9iamVjdHMvTWFrZWZpbGUgd2luMzIvTWFrZWZpbGUgd2luZG93cy9NYWtlZmlsZSByYy9NYWtlZmlsZSBkZWJ1Z2dlci9NYWtlZmlsZSBkZWJ1Z2dlci9yZWFkbGluZS9NYWtlZmlsZSB0b29scy9NYWtlZmlsZSBpZjE2MzIvTWFrZWZpbGUgdG9vbGtpdC9NYWtlZmlsZSBNYWtlZmlsZSkKIAogZWNobwogZWNobyAiQ29uZmlndXJlIGZpbmlzaGVkLiAgRG8gJ21ha2UgZGVwZW5kOyBtYWtlJyB0byBjb21waWxlIFdpbmUuIgpkaWZmIC0tZ2l0IGEvY29udHJvbHMvSW1ha2VmaWxlIGIvY29udHJvbHMvSW1ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODI5NjViLi4wMDAwMDAwCi0tLSBhL2NvbnRyb2xzL0ltYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNpbmNsdWRlICIuLi9XaW5lLnRtcGwiCi0KLU1PRFVMRSA9IGNvbnRyb2xzCi0KLVNSQ1MgPSBcCi0JYnV0dG9uLmMgXAotCWNvbWJvLmMgXAotCWRlc2t0b3AuYyBcCi0JZWRpdC5jIFwKLQlsaXN0Ym94LmMgXAotCW1lbnUuYyBcCi0Jc2Nyb2xsLmMgXAotCXN0YXRpYy5jIFwKLQl3aWRnZXRzLmMKLQotT0JKUyA9ICQoU1JDUzouYz0ubykKLQotV2luZVJlbG9jYXRhYmxlVGFyZ2V0KCQoTU9EVUxFKSwsJChPQkpTKSkKLURlcGVuZFRhcmdldCgpCi0KLWluY2x1ZGVzOjoKLQotaW5zdGFsbDo6CmRpZmYgLS1naXQgYS9jb250cm9scy9idXR0b24uYyBiL2NvbnRyb2xzL2J1dHRvbi5jCmluZGV4IGIzMzkwMGEuLjA4N2E3ZDcgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2J1dHRvbi5jCisrKyBiL2NvbnRyb2xzL2J1dHRvbi5jCkBAIC02OCw3ICs2OCw3IEBACiBzdGF0aWMgV09SRCBjaGVja0JveFdpZHRoID0gMCwgY2hlY2tCb3hIZWlnaHQgPSAwOwogCiAKLUxPTkcgQnV0dG9uV25kUHJvYyhIV05EIGhXbmQsIFdPUkQgdU1zZywgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorTFJFU1VMVCBCdXR0b25XbmRQcm9jKEhXTkQgaFduZCwgVUlOVCB1TXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgICAgICBSRUNUIHJlY3Q7CiAJTE9ORyBsUmVzdWx0ID0gMDsKQEAgLTE1Niw4ICsxNTYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGluZm9QdHItPnN0YXRlICYgMykgKyAxKSwgMCApOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBXSU5FTElCMzIKKyAgICAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIEdldFBhcmVudChoV25kKSwgV01fQ09NTUFORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VXUEFSQU0od25kUHRyLT53SURtZW51LEJOX0NMSUNLRUQpLAorCQkJCSAoTFBBUkFNKSBoV25kICk7CisjZWxzZQogICAgICAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZSggR2V0UGFyZW50KGhXbmQpLCBXTV9DT01NQU5ELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kUHRyLT53SURtZW51LCBNQUtFTFBBUkFNKGhXbmQsQk5fQ0xJQ0tFRCkpOworI2VuZGlmCiAgICAgICAgICAgICAgICAgfQogCQlicmVhazsKIApAQCAtMTgyLDEzICsxODgsMTMgQEAKIAkJcmV0dXJuIDA7CiAKICAgICAgICAgY2FzZSBXTV9TRVRGT05UOgotICAgICAgICAgICAgICAgIGluZm9QdHItPmhGb250ID0gd1BhcmFtOworICAgICAgICAgICAgICAgIGluZm9QdHItPmhGb250ID0gKEhGT05UKSB3UGFyYW07CiAgICAgICAgICAgICAgICAgaWYgKGxQYXJhbSkKICAgICAgICAgICAgICAgICAgICAgUEFJTlRfQlVUVE9OKCBoV25kLCBzdHlsZSwgT0RBX0RSQVdFTlRJUkUgKTsKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIFdNX0dFVEZPTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluZm9QdHItPmhGb250OworICAgICAgICAgICAgICAgIHJldHVybiAoTE9ORykgaW5mb1B0ci0+aEZvbnQ7CiAKIAljYXNlIFdNX1NFVEZPQ1VTOgogICAgICAgICAgICAgICAgIGluZm9QdHItPnN0YXRlIHw9IEJVVFRPTl9IQVNGT0NVUzsKQEAgLTI2OSw4ICsyNzUsMTMgQEAKIAogICAgICAgLyogU2VuZCBXTV9DVExDT0xPUiB0byBhbGxvdyBjaGFuZ2luZyB0aGUgZm9udCAodGhlIGNvbG9ycyBhcmUgZml4ZWQpICovCiAgICAgaWYgKGluZm9QdHItPmhGb250KSBTZWxlY3RPYmplY3QoIGhEQywgaW5mb1B0ci0+aEZvbnQgKTsKKyNpZmRlZiBXSU5FTElCMzIKKyAgICBTZW5kTWVzc2FnZSggR2V0UGFyZW50KGhCdXR0b24pLCBXTV9DVExDT0xPUkJUTiwKKwkJIChXUEFSQU0paERDLCAoTFBBUkFNKWhCdXR0b24gKTsKKyNlbHNlCiAgICAgU2VuZE1lc3NhZ2UoIEdldFBhcmVudChoQnV0dG9uKSwgV01fQ1RMQ09MT1IsIChXT1JEKWhEQywKICAgICAgICAgICAgICAgICAgTUFLRUxQQVJBTShoQnV0dG9uLCBDVExDT0xPUl9CVE4pICk7CisjZW5kaWYKICAgICBoT2xkUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KGhEQywgc3lzQ29sb3JPYmplY3RzLmhwZW5XaW5kb3dGcmFtZSk7CiAgICAgaE9sZEJydXNoID0gKEhCUlVTSClTZWxlY3RPYmplY3QoaERDLCBzeXNDb2xvck9iamVjdHMuaGJydXNoQnRuRmFjZSk7CiAgICAgU2V0QmtNb2RlKGhEQywgVFJBTlNQQVJFTlQpOwpAQCAtMzAyLDcgKzMxMyw3IEBACiAgICAgZWxzZSBHUkFQSF9EcmF3UmVsaWVmUmVjdCggaERDLCAmcmMsIDIsIDIsIEZBTFNFICk7CiAgICAgCiAgICAgLyogZHJhdyBidXR0b24gbGFiZWwsIGlmIGFueTogKi8KLSAgICB0ZXh0ID0gVVNFUl9IRUFQX0xJTl9BRERSKCB3bmRQdHItPmhUZXh0ICk7CisgICAgdGV4dCA9IChjaGFyKikgVVNFUl9IRUFQX0xJTl9BRERSKCB3bmRQdHItPmhUZXh0ICk7CiAgICAgaWYgKHRleHRbMF0pCiAgICAgewogICAgICAgICBTZXRUZXh0Q29sb3IoIGhEQywgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0RJU0FCTEVEKSA/CkBAIC0zNDcsMTMgKzM1OCwxOCBAQAogICAgIEdldENsaWVudFJlY3QoaFduZCwgJnJjKTsKIAogICAgIGlmIChpbmZvUHRyLT5oRm9udCkgU2VsZWN0T2JqZWN0KCBoREMsIGluZm9QdHItPmhGb250ICk7CisjaWZkZWYgV0lORUxJQjMyIC8qIEpCUDogRGlmZmVyZW50IGluIFdpbjMyICovCisgICAgaEJydXNoID0gKEhCUlVTSCkgU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGhXbmQpLCBXTV9DVExDT0xPUkJUTiwgKFdQQVJBTSloREMsCisJCQkJICAoTFBBUkFNKWhXbmQpOworI2Vsc2UKICAgICBoQnJ1c2ggPSBTZW5kTWVzc2FnZShHZXRQYXJlbnQoaFduZCksIFdNX0NUTENPTE9SLCAoV09SRCloREMsCiAJCQkgTUFLRUxQQVJBTShoV25kLCBDVExDT0xPUl9CVE4pKTsKKyNlbmRpZgogICAgIGlmIChhY3Rpb24gPT0gT0RBX0RSQVdFTlRJUkUpIEZpbGxSZWN0KGhEQywgJnJjLCBoQnJ1c2gpOwogCiAgICAgR2V0VGV4dE1ldHJpY3MoaERDLCAmdG0pOwogICAgIGRlbHRhID0gKHJjLmJvdHRvbSAtIHJjLnRvcCAtIHRtLnRtSGVpZ2h0KSA+PiAxOwotICAgIHRleHQgPSBVU0VSX0hFQVBfTElOX0FERFIoIHduZFB0ci0+aFRleHQgKTsKKyAgICB0ZXh0ID0gKGNoYXIqKSBVU0VSX0hFQVBfTElOX0FERFIoIHduZFB0ci0+aFRleHQgKTsKICAgICB0ZXh0bGVuID0gc3RybGVuKCB0ZXh0ICk7CiAKICAgICAgIC8qIERyYXcgdGhlIGNoZWNrLWJveCBiaXRtYXAgKi8KQEAgLTQyMSw4ICs0MzcsMTIgQEAKICAgICBpZiAoYWN0aW9uICE9IE9EQV9EUkFXRU5USVJFKSByZXR1cm47CiAKICAgICBpZiAoaW5mb1B0ci0+aEZvbnQpIFNlbGVjdE9iamVjdCggaERDLCBpbmZvUHRyLT5oRm9udCApOworI2lmZGVmIFdJTkVMSUIzMgorICAgIFNlbmRNZXNzYWdlKCBHZXRQYXJlbnQoaFduZCksIFdNX0NUTENPTE9SQlROLCAoV1BBUkFNKWhEQywgKExQQVJBTSloV25kICk7CisjZWxzZQogICAgIFNlbmRNZXNzYWdlKCBHZXRQYXJlbnQoaFduZCksIFdNX0NUTENPTE9SLCAoV09SRCloREMsCiAJCSBNQUtFTFBBUkFNKGhXbmQsIENUTENPTE9SX0JUTikpOworI2VuZGlmCiAgICAgU2VsZWN0T2JqZWN0KCBoREMsIHN5c0NvbG9yT2JqZWN0cy5ocGVuV2luZG93RnJhbWUgKTsKIAogICAgIEdldENsaWVudFJlY3QoaFduZCwgJnJjKTsKQEAgLTQzMyw3ICs0NTMsNyBAQAogICAgIExpbmVUbyggaERDLCByYy5sZWZ0LCByYy5ib3R0b20tMSApOwogICAgIExpbmVUbyggaERDLCByYy5sZWZ0LCByYy50b3ArMiApOwogCi0gICAgdGV4dCA9IFVTRVJfSEVBUF9MSU5fQUREUiggd25kUHRyLT5oVGV4dCApOworICAgIHRleHQgPSAoY2hhciopIFVTRVJfSEVBUF9MSU5fQUREUiggd25kUHRyLT5oVGV4dCApOwogICAgIEdldFRleHRFeHRlbnRQb2ludChoREMsIHRleHQsIHN0cmxlbih0ZXh0KSwgJnNpemUpOwogICAgIHJjLmxlZnQgICs9IDEwOwogICAgIHJjLnJpZ2h0ICA9IHJjLmxlZnQgKyBzaXplLmN4ICsgMTsKQEAgLTQ2MCw4ICs0ODAsMTMgQEAKICAgICBHZXRDbGllbnRSZWN0KGhXbmQsICZyYyk7CiAKICAgICBpZiAoaW5mb1B0ci0+aEZvbnQpIFNlbGVjdE9iamVjdCggaERDLCBpbmZvUHRyLT5oRm9udCApOworI2lmZGVmIFdJTkVMSUIzMgorICAgIGhCcnVzaCA9IChIQlJVU0gpIFNlbmRNZXNzYWdlKEdldFBhcmVudChoV25kKSwgV01fQ1RMQ09MT1JCVE4sIChXUEFSQU0paERDLAorCQkJCSAgKExQQVJBTSloV25kKTsKKyNlbHNlCiAgICAgaEJydXNoID0gU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGhXbmQpLCBXTV9DVExDT0xPUiwgKFdPUkQpaERDLAogCQkJIE1BS0VMUEFSQU0oaFduZCwgQ1RMQ09MT1JfQlROKSk7CisjZW5kaWYKICAgICBGaWxsUmVjdChoREMsICZyYywgaEJydXNoKTsKIAogICAgIGlmICgoYWN0aW9uID09IE9EQV9GT0NVUykgfHwKQEAgLTQ5MSw1ICs1MTYsNSBAQAogICAgIGRpcy5oREMgICAgICAgID0gaERDOwogICAgIEdldENsaWVudFJlY3QoIGhXbmQsICZkaXMucmNJdGVtICk7CiAgICAgZGlzLml0ZW1EYXRhICAgPSAwOwotICAgIFNlbmRNZXNzYWdlKEdldFBhcmVudChoV25kKSwgV01fRFJBV0lURU0sIDEsIE1BS0VfU0VHUFRSKCZkaXMpICk7CisgICAgU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGhXbmQpLCBXTV9EUkFXSVRFTSwgMSwgKExQQVJBTSkgTUFLRV9TRUdQVFIoJmRpcykgKTsKIH0KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2NvbWJvLmMgYi9jb250cm9scy9jb21iby5jCmluZGV4IDc3Mzc0Y2QuLmFhYjk3ZjUgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2NvbWJvLmMKKysrIGIvY29udHJvbHMvY29tYm8uYwpAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgbHBoYy0+aFduZEVkaXQgPSBDcmVhdGVXaW5kb3coTUFLRV9TRUdQVFIoZWRpdE5hbWUpLCAoU0VHUFRSKTAsIAogCQkJCSAgV1NfQ0hJTEQgfCBXU19DTElQQ0hJTERSRU4gfCBXU19WSVNJQkxFIHwgU1NfTEVGVCwKIAkJCQkgIDAsIDAsIHJlY3QucmlnaHQsIGxwaGwtPlN0ZEl0ZW1IZWlnaHQsCi0JCQkJICBod25kLCAxLCBHZXRXaW5kb3dXb3JkKGh3bmQsR1dXX0hJTlNUQU5DRSksIDBMKTsKKwkJCQkgIGh3bmQsIChITUVOVSkxLCBXSU5fR2V0V2luZG93SW5zdGFuY2UoaHduZCksIDBMKTsKICAgICBicmVhazsKICAgIGNhc2UgQ0JTX0RST1BET1dOOiAgICAgICAgICAvKiBlZGl0IGNvbnRyb2wsIGRyb3Bkb3duIGxpc3Rib3ggICAgICovCiAgICAgZHByaW50Zl9jb21ibyhzdGRkZWIsIkNCU19EUk9QRE9XTlxuIik7CkBAIC0xNDUsNyArMTQ1LDcgQEAKICAgICBscGhjLT5oV25kRWRpdCA9IENyZWF0ZVdpbmRvdyhNQUtFX1NFR1BUUihlZGl0TmFtZSksIChTRUdQVFIpMCwKIAkJCQkgIFdTX0NISUxEIHwgV1NfQ0xJUENISUxEUkVOIHwgV1NfVklTSUJMRSB8IFNTX0xFRlQsCiAJCQkJICAwLCAwLCBscGhjLT5SZWN0QnV0dG9uLmxlZnQsIGxwaGwtPlN0ZEl0ZW1IZWlnaHQsCi0JCQkJICBod25kLCAxLCBHZXRXaW5kb3dXb3JkKGh3bmQsR1dXX0hJTlNUQU5DRSksIDBMKTsKKwkJCQkgIGh3bmQsIChITUVOVSkxLCBXSU5fR2V0V2luZG93SW5zdGFuY2UoaHduZCksIDBMKTsKICAgICBicmVhazsKICAgIGNhc2UgQ0JTX0RST1BET1dOTElTVDogICAgICAvKiBzdGF0aWMgY29udHJvbCwgZG93bmRvd24gbGlzdGJveCAgICovCiAgICAgZHByaW50Zl9jb21ibyhzdGRkZWIsIkNCU19EUk9QRE9XTkxJU1RcbiIpOwpAQCAtMTY3LDEwICsxNjcsMTAgQEAKIAkJCQlsYm94cmVjdC5sZWZ0LCBsYm94cmVjdC50b3AsCiAJCQkJbGJveHJlY3QucmlnaHQgLSBsYm94cmVjdC5sZWZ0LCAKIAkJCQlsYm94cmVjdC5ib3R0b20gLSBsYm94cmVjdC50b3AsCi0JCQkJMCwgMCwgR2V0V2luZG93V29yZChod25kLEdXV19ISU5TVEFOQ0UpLAotCQkJCShTRUdQVFIpTUFLRUxPTkcoaHduZCwgaHduZCkpOworCQkJCTAsIDAsIFdJTl9HZXRXaW5kb3dJbnN0YW5jZShod25kKSwKKwkJCQkoU0VHUFRSKWh3bmQgKTsKICAgU2hvd1dpbmRvdyhscGhjLT5oV25kTEJveCwgU1dfSElERSk7Ci0gIGRwcmludGZfY29tYm8oc3RkZGViLCJDb21ibyBDcmVhdGlvbiBMQm94PSVYIVxuIiwgbHBoYy0+aFduZExCb3gpOworICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm8gQ3JlYXRpb24gTEJveD0iTlBGTVQiIVxuIiwgbHBoYy0+aFduZExCb3gpOwogICByZXR1cm4gMDsKIH0KIApAQCAtMjIwLDggKzIyMCwxMyBAQAogCiAgIGhPbGRGb250ID0gU2VsZWN0T2JqZWN0KGhkYywgbHBobC0+aEZvbnQpOwogCisjaWZkZWYgV0lORUxJQjMyCisgIGhCcnVzaCA9IChIQlJVU0gpIFNlbmRNZXNzYWdlKGxwaGwtPmhQYXJlbnQsIFdNX0NUTENPTE9STElTVEJPWCwgKFdQQVJBTSloZGMsCisJCQkJKExQQVJBTSlod25kKTsKKyNlbHNlCiAgIGhCcnVzaCA9IFNlbmRNZXNzYWdlKGxwaGwtPmhQYXJlbnQsIFdNX0NUTENPTE9SLCBoZGMsCiAJCSAgICAgICBNQUtFTE9ORyhod25kLCBDVExDT0xPUl9MSVNUQk9YKSk7CisjZW5kaWYKICAgaWYgKGhCcnVzaCA9PSAwKSBoQnJ1c2ggPSBHZXRTdG9ja09iamVjdChXSElURV9CUlVTSCk7CiAKICAgR2V0Q2xpZW50UmVjdChod25kLCAmcmVjdCk7CkBAIC01MTIsMTQgKzUxNywxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0JTZXRGb250CiAgKi8KLXN0YXRpYyBMT05HIENCU2V0Rm9udChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIENCU2V0Rm9udChIV05EIGh3bmQsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CiAKICAgaWYgKHdQYXJhbSA9PSAwKQogICAgIGxwaGwtPmhGb250ID0gR2V0U3RvY2tPYmplY3QoU1lTVEVNX0ZPTlQpOwogICBlbHNlCi0gICAgbHBobC0+aEZvbnQgPSB3UGFyYW07CisgICAgbHBobC0+aEZvbnQgPSAoSEZPTlQpd1BhcmFtOwogCiAgIHJldHVybiAwOwogfQpAQCAtNTg4LDcgKzU5Myw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDb21ib1duZFByb2MKICAqLwotTE9ORyBDb21ib0JveFduZFByb2MoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK0xSRVNVTFQgQ29tYm9Cb3hXbmRQcm9jKEhXTkQgaHduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgIHN3aXRjaChtZXNzYWdlKSB7CQogICAgICBjYXNlIFdNX05DQ1JFQVRFOiByZXR1cm4gQ0JOQ0NyZWF0ZShod25kLCB3UGFyYW0sIGxQYXJhbSk7CkBAIC02MjksNyArNjM0LDExIEBACiAKIEhXTkQgQ0xCb3hHZXRDb21ibyhIV05EIGh3bmQpCiB7Ci0gIHJldHVybiBHZXRXaW5kb3dXb3JkKGh3bmQsMCk7CisjaWZkZWYgV0lORUxJQjMyCisgIHJldHVybiAoSFdORClHZXRXaW5kb3dMb25nKGh3bmQsMCk7CisjZWxzZQorICByZXR1cm4gKEhXTkQpR2V0V2luZG93V29yZChod25kLDApOworI2VuZGlmCiB9CiAKIExQSEVBRExJU1QgQ0xCb3hHZXRMaXN0SGVhZGVyKEhXTkQgaHduZCkKQEAgLTczNSw4ICs3NDQsMTMgQEAKICAgfQogCiAgIGhPbGRGb250ID0gU2VsZWN0T2JqZWN0KGhkYywgbHBobC0+aEZvbnQpOworI2lmZGVmIFdJTkVMSUIzMgorICBoQnJ1c2ggPSAoSEJSVVNIKSBTZW5kTWVzc2FnZShscGhsLT5oUGFyZW50LCBXTV9DVExDT0xPUkxJU1RCT1gsIChXUEFSQU0paGRjLAorCQkJCShMUEFSQU0paHduZCk7CisjZWxzZQogICBoQnJ1c2ggPSBTZW5kTWVzc2FnZShscGhsLT5oUGFyZW50LCBXTV9DVExDT0xPUiwgaGRjLAogCQkgICAgICAgTUFLRUxPTkcoaHduZCwgQ1RMQ09MT1JfTElTVEJPWCkpOworI2VuZGlmCiAKICAgaWYgKGhCcnVzaCA9PSAwKSBoQnJ1c2ggPSBHZXRTdG9ja09iamVjdChXSElURV9CUlVTSCk7CiAKQEAgLTgzNSwxMCArODQ5LDE2IEBACiAKICAgaWYgKEdldENhcHR1cmUoKSA9PSBod25kKSBSZWxlYXNlQ2FwdHVyZSgpOwogCi0gIGlmIChscGhsLT5QcmV2Rm9jdXNlZCAhPSBscGhsLT5JdGVtRm9jdXNlZCkgewotICAgIFNlbmRNZXNzYWdlKENMQm94R2V0Q29tYm8oaHduZCksQ0JfU0VUQ1VSU0VMLGxwaGwtPkl0ZW1Gb2N1c2VkLDApOwotICAgIExpc3RCb3hTZW5kTm90aWZpY2F0aW9uKGxwaGwsIENMQm94R2V0Q29tYm8oaHduZCksIENCTl9TRUxDSEFOR0UpOwotICB9CisgIGlmKCFscGhsKQorICAgICB7CisgICAgICBmcHJpbnRmKHN0ZG5pbXAsIkNCTExCdXR0b25VcDogQ0xCb3hHZXRMaXN0SGVhZGVyIHJldHVybmVkIE5VTEwhXG4iKTsKKyAgICAgfQorICBlbHNlIGlmIChscGhsLT5QcmV2Rm9jdXNlZCAhPSBscGhsLT5JdGVtRm9jdXNlZCkgCisgICAgICAgICAgeworICAgICAgCQlTZW5kTWVzc2FnZShDTEJveEdldENvbWJvKGh3bmQpLENCX1NFVENVUlNFTCxscGhsLT5JdGVtRm9jdXNlZCwwKTsKKyAgICAgIAkJTGlzdEJveFNlbmROb3RpZmljYXRpb24obHBobCwgQ0xCb3hHZXRDb21ibyhod25kKSwgQ0JOX1NFTENIQU5HRSk7CisgICAgIAkgIH0KKwogICBTZW5kTWVzc2FnZShDTEJveEdldENvbWJvKGh3bmQpLENCX1NIT1dEUk9QRE9XTiwwLDApOwogCiAgIHJldHVybiAwOwpAQCAtOTM4LDcgKzk1OCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDb21ib0xCb3hXbmRQcm9jCiAgKi8KLUxPTkcgQ29tYm9MQm94V25kUHJvYyhIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorTFJFU1VMVCBDb21ib0xCb3hXbmRQcm9jKEhXTkQgaHduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgIHN3aXRjaChtZXNzYWdlKSB7CQogICAgICBjYXNlIFdNX0NSRUFURTogcmV0dXJuIENCTENyZWF0ZShod25kLCB3UGFyYW0sIGxQYXJhbSk7CkBAIC05NjEsNyArOTgxLDcgQEAKICAqLwogQk9PTCBEbGdEaXJTZWxlY3RDb21ib0JveChIV05EIGhEbGcsIExQU1RSIGxwU3RyLCBpbnQgbklETEJveCkKIHsKLQlmcHJpbnRmKHN0ZG5pbXAsIkRsZ0RpclNlbGVjdENvbWJvQm94KCUwNFgsICclcycsICVkKSBcbiIsCQorCWZwcmludGYoc3RkbmltcCwiRGxnRGlyU2VsZWN0Q29tYm9Cb3goIk5QRk1UIiwgJyVzJywgJWQpIFxuIiwKIAkJCQloRGxnLCBscFN0ciwgbklETEJveCk7CiAJcmV0dXJuIFRSVUU7CiB9CkBAIC05NzYsOCArOTk2LDggQEAKICAgSFdORAloV25kOwogICBpbnQgcmV0OwogICBMUFNUUiBscFBhdGhTcGVjID0gUFRSX1NFR19UT19MSU4oUGF0aFNwZWMpOwotICAKLSAgZHByaW50Zl9jb21ibyhzdGRkZWIsIkRsZ0Rpckxpc3RDb21ib0JveCglMDRYLCAnJXMnLCAlZCwgJWQsICUwNFgpIFxuIiwKKworICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiRGxnRGlyTGlzdENvbWJvQm94KCJOUEZNVCIsICclcycsICVkLCAlZCwgJTA0WCkgXG4iLAogCQkgIGhEbGcsIGxwUGF0aFNwZWMsIG5JRExCb3gsIG5JRFN0YXQsIHdUeXBlKTsKICAgaWYgKG5JRExCb3gpIHsKICAgICBMUEhFQURMSVNUIGxwaGw7CkBAIC0xMDAzLDEzICsxMDIzLDEzIEBACiAJdGVtcFsxXSA9ICdBJytkcml2ZTsKIAl0ZW1wWzJdID0gJzonOwogCVNlbmREbGdJdGVtTWVzc2FnZSggaERsZywgbklEU3RhdCwgV01fU0VUVEVYVCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VSX0hFQVBfU0VHX0FERFIoaFRlbXApICsgMSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pKFVTRVJfSEVBUF9TRUdfQUREUihoVGVtcCkgKyAxKSApOwogICAgICAgfSBlbHNlIHsKIAl0ZW1wWzBdID0gJ0EnK2RyaXZlOwogCXRlbXBbMV0gPSAnOic7CiAJdGVtcFsyXSA9ICdcXCc7CiAJU2VuZERsZ0l0ZW1NZXNzYWdlKCBoRGxnLCBuSURTdGF0LCBXTV9TRVRURVhULCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRVJfSEVBUF9TRUdfQUREUihoVGVtcCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKVVTRVJfSEVBUF9TRUdfQUREUihoVGVtcCkgKTsKICAgICAgIH0KICAgICAgIFVTRVJfSEVBUF9GUkVFKCBoVGVtcCApOwogICB9IApkaWZmIC0tZ2l0IGEvY29udHJvbHMvZGVza3RvcC5jIGIvY29udHJvbHMvZGVza3RvcC5jCmluZGV4IDA5NjA5MmUuLmVmOTM3N2IgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2Rlc2t0b3AuYworKysgYi9jb250cm9scy9kZXNrdG9wLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogICoKICAqIFdpbmRvdyBwcm9jZWR1cmUgZm9yIHRoZSBkZXNrdG9wIHdpbmRvdy4KICAqLwotTE9ORyBEZXNrdG9wV25kUHJvYyAoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQorTFJFU1VMVCBEZXNrdG9wV25kUHJvYyAoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKIHsKICAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAgICAgREVTS1RPUElORk8gKmluZm9QdHIgPSAoREVTS1RPUElORk8gKil3bmRQdHItPndFeHRyYTsKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2VkaXQuYyBiL2NvbnRyb2xzL2VkaXQuYwppbmRleCA5NDMzMjFmLi45NTdjODcwIDEwMDY0NAotLS0gYS9jb250cm9scy9lZGl0LmMKKysrIGIvY29udHJvbHMvZWRpdC5jCkBAIC0yMCw5ICsyMCwxNiBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAKIAorI2lmZGVmIFdJTkVMSUIzMgorI2RlZmluZSBOT1RJRllfUEFSRU5UKGhXbmRDbnRybCwgd05vdGlmeUNvZGUpIFwKKwlTZW5kTWVzc2FnZShHZXRQYXJlbnQoaFduZENudHJsKSwgV01fQ09NTUFORCwgXAorCQkgICAgTUFLRVdQQVJBTShHZXREbGdDdHJsSUQoaFduZENudHJsKSx3Tm90aWZ5Q29kZSksIFwKKwkJICAgIChMUEFSQU0paFduZENudHJsICk7CisjZWxzZQogI2RlZmluZSBOT1RJRllfUEFSRU5UKGhXbmRDbnRybCwgd05vdGlmeUNvZGUpIFwKIAlTZW5kTWVzc2FnZShHZXRQYXJlbnQoaFduZENudHJsKSwgV01fQ09NTUFORCwgXAogCQkgR2V0RGxnQ3RybElEKGhXbmRDbnRybCksIE1BS0VMUEFSQU0oaFduZENudHJsLCB3Tm90aWZ5Q29kZSkpOworI2VuZGlmCiAKICNkZWZpbmUgTUFYVEVYVExFTiAzMDAwMCAgIC8qIG1heGltdW0gdGV4dCBidWZmZXIgbGVuZ3RoICovCiAjZGVmaW5lIEVESVRMRU4gICAgIDEwMjQgICAvKiBzdGFydGluZyBsZW5ndGggZm9yIG11bHRpLWxpbmUgY29udHJvbCAqLwpAQCAtOTUsMTIgKzEwMiwxMiBAQAogICoKICAqICBBbGxvY2F0ZSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBvbiB0aGUgc3BlY2lmaWVkIGxvY2FsIGhlYXAuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgRURJVF9IZWFwQWxsb2MoSFdORCBod25kLCBpbnQgYnl0ZXMsIFdPUkQgZmxhZ3MpCitzdGF0aWMgSExPQ0FMIEVESVRfSGVhcEFsbG9jKEhXTkQgaHduZCwgaW50IGJ5dGVzLCBXT1JEIGZsYWdzKQogewotICAgIHVuc2lnbmVkIGludCByZXQ7CisgICAgSExPQ0FMIHJldDsKIAotICAgIHJldCA9IExPQ0FMX0FsbG9jKCBHZXRXaW5kb3dXb3JkKGh3bmQsR1dXX0hJTlNUQU5DRSksIGZsYWdzLCBieXRlcyApOwotICAgIGlmIChyZXQgPT0gMCkKKyAgICByZXQgPSBMT0NBTF9BbGxvYyggV0lOX0dldFdpbmRvd0luc3RhbmNlKGh3bmQpLCBmbGFncywgYnl0ZXMgKTsKKyAgICBpZiAoIXJldCkKICAgICAgICAgcHJpbnRmKCJFRElUX0hlYXBBbGxvYzogT3V0IG9mIGhlYXAtbWVtb3J5XG4iKTsKICAgICByZXR1cm4gcmV0OwogfQpAQCAtMTEwLDEwICsxMTcsMTAgQEAKICAqCiAgKiAgUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSB0aGUgaGFuZGxlLgogICovCi1zdGF0aWMgdm9pZCAqRURJVF9IZWFwTG9jayhIV05EIGh3bmQsIHVuc2lnbmVkIGludCBoYW5kbGUpCitzdGF0aWMgdm9pZCAqRURJVF9IZWFwTG9jayhIV05EIGh3bmQsIEhBTkRMRSBoYW5kbGUpCiB7Ci0gICAgV09SRCBoaW5zdGFuY2UgPSBHZXRXaW5kb3dXb3JkKCBod25kLCBHV1dfSElOU1RBTkNFICk7Ci0gICAgV09SRCBvZmZzOworICAgIEhJTlNUQU5DRSBoaW5zdGFuY2UgPSBXSU5fR2V0V2luZG93SW5zdGFuY2UoIGh3bmQgKTsKKyAgICBIQU5ETEUgb2ZmczsKICAgICAKICAgICBpZiAoaGFuZGxlID09IDApIHJldHVybiAwOwogICAgIG9mZnMgPSBMT0NBTF9Mb2NrKCBoaW5zdGFuY2UsIGhhbmRsZSApOwpAQCAtMTIzLDEwICsxMzAsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBFRElUX0hlYXBVbmxvY2sKICAqLwotc3RhdGljIHZvaWQgRURJVF9IZWFwVW5sb2NrKEhXTkQgaHduZCwgdW5zaWduZWQgaW50IGhhbmRsZSkKK3N0YXRpYyB2b2lkIEVESVRfSGVhcFVubG9jayhIV05EIGh3bmQsIEhBTkRMRSBoYW5kbGUpCiB7CiAgICAgaWYgKGhhbmRsZSA9PSAwKSByZXR1cm47Ci0gICAgTE9DQUxfVW5sb2NrKCBHZXRXaW5kb3dXb3JkKCBod25kLCBHV1dfSElOU1RBTkNFICksIGhhbmRsZSApOworICAgIExPQ0FMX1VubG9jayggV0lOX0dldFdpbmRvd0luc3RhbmNlKCBod25kICksIGhhbmRsZSApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMzQsOSArMTQxLDkgQEAKICAqCiAgKiAgUmVhbGxvY2F0ZSB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgdGhlIGhhbmRsZS4KICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBFRElUX0hlYXBSZUFsbG9jKEhXTkQgaHduZCwgdW5zaWduZWQgaW50IGhhbmRsZSwgaW50IGJ5dGVzKQorc3RhdGljIEhMT0NBTCBFRElUX0hlYXBSZUFsbG9jKEhXTkQgaHduZCwgSEFORExFIGhhbmRsZSwgaW50IGJ5dGVzKQogewotICAgIHJldHVybiBMT0NBTF9SZUFsbG9jKCBHZXRXaW5kb3dXb3JkKGh3bmQsR1dXX0hJTlNUQU5DRSksIGhhbmRsZSwgYnl0ZXMsIAorICAgIHJldHVybiBMT0NBTF9SZUFsbG9jKCBXSU5fR2V0V2luZG93SW5zdGFuY2UoaHduZCksIGhhbmRsZSwgYnl0ZXMsIAogCQkJICBMTUVNX0ZJWEVEICk7CiB9CiAKQEAgLTE0Niw5ICsxNTMsOSBAQAogICoKICAqICBGcmVlcyB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgdGhlIGhhbmRsZS4KICAqLwotc3RhdGljIHZvaWQgRURJVF9IZWFwRnJlZShIV05EIGh3bmQsIHVuc2lnbmVkIGludCBoYW5kbGUpCitzdGF0aWMgdm9pZCBFRElUX0hlYXBGcmVlKEhXTkQgaHduZCwgSEFORExFIGhhbmRsZSkKIHsKLSAgICBMT0NBTF9GcmVlKCBHZXRXaW5kb3dXb3JkKGh3bmQsR1dXX0hJTlNUQU5DRSksIGhhbmRsZSApOworICAgIExPQ0FMX0ZyZWUoIFdJTl9HZXRXaW5kb3dJbnN0YW5jZShod25kKSwgaGFuZGxlICk7CiB9CiAKIApAQCAtMTU3LDkgKzE2NCw5IEBACiAgKgogICogIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0IG9uIHRoZSBsb2NhbCBoZWFwLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IEVESVRfSGVhcFNpemUoSFdORCBod25kLCB1bnNpZ25lZCBpbnQgaGFuZGxlKQorc3RhdGljIHVuc2lnbmVkIGludCBFRElUX0hlYXBTaXplKEhXTkQgaHduZCwgSEFORExFIGhhbmRsZSkKIHsKLSAgICByZXR1cm4gTE9DQUxfU2l6ZSggR2V0V2luZG93V29yZChod25kLEdXV19ISU5TVEFOQ0UpLCBoYW5kbGUgKTsKKyAgICByZXR1cm4gTE9DQUxfU2l6ZSggV0lOX0dldFdpbmRvd0luc3RhbmNlKGh3bmQpLCBoYW5kbGUgKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00NzAsOCArNDc3LDEyIEBACiAgICAgZWxzZQogICAgICAgICBvbGRmb250ID0gMDsJCS8qIC1XYWxsIGRvZXMgbm90IHNlZSB0aGUgdXNlIG9mIGlmICovCiAKLSAgICBTZW5kTWVzc2FnZShHZXRQYXJlbnQoaHduZCksIFdNX0NUTENPTE9SLCAoV09SRCloZGMsCisjaWZkZWYgV0lORUxJQjMyCisgICAgU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGh3bmQpLCBXTV9DVExDT0xPUkVESVQsIChXUEFSQU0paGRjLCAoTFBBUkFNKWh3bmQpOworI2Vsc2UKKyAgICBTZW5kTWVzc2FnZShHZXRQYXJlbnQoaHduZCksIFdNX0NUTENPTE9SLCAoV1BBUkFNKWhkYywKIAkJTUFLRUxQQVJBTShod25kLCBDVExDT0xPUl9FRElUKSk7CisjZW5kaWYKIAogICAgIGlmIChyZXZlcnNlKQogICAgIHsKQEAgLTE4NDAsMTMgKzE4NTEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBFTV9TRVRIQU5ETEUgbWVzc2FnZSBmdW5jdGlvbgogICovCi1zdGF0aWMgdm9pZCBFRElUX1NldEhhbmRsZU1zZyhIV05EIGh3bmQsIFdPUkQgd1BhcmFtKQorc3RhdGljIHZvaWQgRURJVF9TZXRIYW5kbGVNc2coSFdORCBod25kLCBXUEFSQU0gd1BhcmFtKQogewogICAgIEVESVRTVEFURSAqZXMgPSBFRElUX0dldEVkaXRTdGF0ZShod25kKTsKIAogICAgIGlmIChJc011bHRpTGluZShod25kKSkKICAgICB7Ci0JZXMtPmhUZXh0ID0gd1BhcmFtOworCWVzLT5oVGV4dCA9IChIQU5ETEUpd1BhcmFtOwogCWVzLT50ZXh0bGVuID0gRURJVF9IZWFwU2l6ZShod25kLCBlcy0+aFRleHQpOwogCWVzLT53bGluZXMgPSAwOwogCWVzLT53dG9wID0gZXMtPndsZWZ0ID0gMDsKQEAgLTE4NTYsOCArMTg2Nyw4IEBACiAJZXMtPnRleHR3aWR0aCA9IDA7CiAJZXMtPlNlbEJlZ0xpbmUgPSBlcy0+U2VsQmVnQ29sID0gMDsKIAllcy0+U2VsRW5kTGluZSA9IGVzLT5TZWxFbmRDb2wgPSAwOwotCWRwcmludGZfZWRpdChzdGRkZWIsICJFRElUX1NldEhhbmRsZU1zZzogaGFuZGxlICUwNHgsIHRleHRsZW49JWRcbiIsCi0JCSAgICAgd1BhcmFtLCBlcy0+dGV4dGxlbik7CisJZHByaW50Zl9lZGl0KHN0ZGRlYiwgIkVESVRfU2V0SGFuZGxlTXNnOiBoYW5kbGUgJTA0bHgsIHRleHRsZW49JWRcbiIsCisJCSAgICAgKERXT1JEKXdQYXJhbSwgZXMtPnRleHRsZW4pOwogCiAJRURJVF9CdWlsZFRleHRQb2ludGVycyhod25kKTsKIAllcy0+UGFpbnRCa2dkID0gVFJVRTsKQEAgLTIxMDcsMTQgKzIxMTgsMTQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBXTV9TRVRGT05UCiAgKi8KLXN0YXRpYyB2b2lkIEVESVRfV01fU2V0Rm9udChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyB2b2lkIEVESVRfV01fU2V0Rm9udChIV05EIGh3bmQsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgICAgSERDIGhkYzsKICAgICBURVhUTUVUUklDIHRtOwogICAgIEhGT05UIG9sZGZvbnQ7CiAgICAgRURJVFNUQVRFICplcyA9IEVESVRfR2V0RWRpdFN0YXRlKGh3bmQpOwogCi0gICAgZXMtPmhGb250ID0gd1BhcmFtOworICAgIGVzLT5oRm9udCA9IChIQU5ETEUpd1BhcmFtOwogICAgIGhkYyA9IEdldERDKGh3bmQpOwogICAgIG9sZGZvbnQgPSAoSEZPTlQpU2VsZWN0T2JqZWN0KGhkYywgKEhBTkRMRSllcy0+aEZvbnQpOwogICAgIEdldENoYXJXaWR0aChoZGMsIDAsIDI1NSwgZXMtPkNoYXJXaWR0aHMpOwpAQCAtMjE3NCw3ICsyMTg1LDcgQEAKIAkgICByYy5yaWdodCwgcmMuYm90dG9tKTsKIAogICAgIGlmIChlcy0+UGFpbnRCa2dkKQotCUZpbGxXaW5kb3coR2V0UGFyZW50KGh3bmQpLCBod25kLCBoZGMsIENUTENPTE9SX0VESVQpOworCUZpbGxXaW5kb3coR2V0UGFyZW50KGh3bmQpLCBod25kLCBoZGMsIChIQlJVU0gpQ1RMQ09MT1JfRURJVCk7CiAKICAgICBmb3IgKHkgPSAocmMudG9wIC8gZXMtPnR4dGh0KTsgeSA8PSAocmMuYm90dG9tIC8gZXMtPnR4dGh0KTsgeSsrKQogICAgIHsKQEAgLTI2MDcsNyArMjYxOCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFZGl0V25kUHJvYygpCiAgKi8KLUxPTkcgRWRpdFduZFByb2MoSFdORCBod25kLCBXT1JEIHVNc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK0xSRVNVTFQgRWRpdFduZFByb2MoSFdORCBod25kLCBVSU5UIHVNc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgICAgTE9ORyBsUmVzdWx0ID0gMDsKICAgICBjaGFyICp0ZXh0UHRyOwpAQCAtMjYxNiw3ICsyNjI3LDcgQEAKIAogICAgIHN3aXRjaCAodU1zZykgewogICAgIGNhc2UgRU1fQ0FOVU5ETzoKLQlsUmVzdWx0ID0gZXMtPmhEZWxldGVkVGV4dDsKKwlsUmVzdWx0ID0gKExPTkcpZXMtPmhEZWxldGVkVGV4dDsKIAlicmVhazsKIAkKICAgICBjYXNlIEVNX0VNUFRZVU5ET0JVRkZFUjoKQEAgLTI2MzYsNyArMjY0Nyw3IEBACiAJYnJlYWs7CiAKICAgICBjYXNlIEVNX0dFVEhBTkRMRToKLQlsUmVzdWx0ID0gZXMtPmhUZXh0OworCWxSZXN1bHQgPSAoTE9ORyllcy0+aFRleHQ7CiAJYnJlYWs7CiAKICAgICBjYXNlIEVNX0dFVExJTkU6CmRpZmYgLS1naXQgYS9jb250cm9scy9saXN0Ym94LmMgYi9jb250cm9scy9saXN0Ym94LmMKaW5kZXggMWEwODFmMC4uMzkzZjQ5NyAxMDA2NDQKLS0tIGEvY29udHJvbHMvbGlzdGJveC5jCisrKyBiL2NvbnRyb2xzL2xpc3Rib3guYwpAQCAtMTE4LDggKzExOCwxMyBAQAogdm9pZCBMaXN0Qm94U2VuZE5vdGlmaWNhdGlvbihMUEhFQURMSVNUIGxwaGwsIEhXTkQgaHduZCwgV09SRCBjb2RlKQogewogICBpZiAobHBobC0+ZHdTdHlsZSAmIExCU19OT1RJRlkpCisjaWZkZWYgV0lORUxJQjMyCisgICAgU2VuZE1lc3NhZ2UobHBobC0+aFBhcmVudCwgV01fQ09NTUFORCwKKwkJTUFLRVdQQVJBTShscGhsLT5DdGxJRCxjb2RlKSwgKExQQVJBTSlod25kKTsKKyNlbHNlCiAgICAgU2VuZE1lc3NhZ2UobHBobC0+aFBhcmVudCwgV01fQ09NTUFORCwKIAkJbHBobC0+Q3RsSUQsIE1BS0VMT05HKGh3bmQsIGNvZGUpKTsKKyNlbmRpZgogfQogCiAKQEAgLTI3NCw3ICsyNzksNyBAQAogIAogICAqbHBtZWFzdXJlID0gbHBscy0+bWlzOwogICBscG1lYXN1cmUtPml0ZW1IZWlnaHQgPSBscGhsLT5TdGRJdGVtSGVpZ2h0OwotICBTZW5kTWVzc2FnZShscGhsLT5oUGFyZW50LCBXTV9NRUFTVVJFSVRFTSwgMCwgVVNFUl9IRUFQX1NFR19BRERSKGhUZW1wKSk7CisgIFNlbmRNZXNzYWdlKGxwaGwtPmhQYXJlbnQsIFdNX01FQVNVUkVJVEVNLCAwLCAoTFBBUkFNKVVTRVJfSEVBUF9TRUdfQUREUihoVGVtcCkpOwogCiAgIGlmIChscGhsLT5kd1N0eWxlICYgTEJTX09XTkVSRFJBV0ZJWEVEKSB7CiAgICAgbHBobC0+U3RkSXRlbUhlaWdodCA9IGxwbWVhc3VyZS0+aXRlbUhlaWdodDsKQEAgLTg5OCw4ICs5MDMsMTQgQEAKIHsKICAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAKKyNpZmRlZiBXSU5FTElCMzIKKyAgU2VuZE1lc3NhZ2UobHBobC0+aFBhcmVudCwgV01fQ09NTUFORCwgCisJICAgICAgTUFLRVdQQVJBTShHZXRXaW5kb3dXb3JkKGh3bmQsR1dXX0lEKSxMQk5fREJMQ0xLKSwKKwkgICAgICAoTFBBUkFNKWh3bmQpOworI2Vsc2UKICAgU2VuZE1lc3NhZ2UobHBobC0+aFBhcmVudCwgV01fQ09NTUFORCwgR2V0V2luZG93V29yZChod25kLEdXV19JRCksCiAJCU1BS0VMT05HKGh3bmQsIExCTl9EQkxDTEspKTsKKyNlbmRpZgogCiAgIHJldHVybiAwOwogfQpAQCAtMTA2MCw3ICsxMDcxLDggQEAKIHsKICAgTFBIRUFETElTVCAgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogCi0gIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3ggV01fU0VUUkVEUkFXIGhXbmQ9JTA0WCB3PSUwNFggIVxuIiwgaHduZCwgd1BhcmFtKTsKKyAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveCBXTV9TRVRSRURSQVcgaFduZD0iTlBGTVQiIHc9JTA0WCAhXG4iLAorCQkgIGh3bmQsIHdQYXJhbSk7CiAgIGxwaGwtPmJSZWRyYXdGbGFnID0gd1BhcmFtOwogCiAgIHJldHVybiAwOwpAQCAtMTA2OSwxNCArMTA4MSwxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJTZXRGb250CiAgKi8KLXN0YXRpYyBMT05HIExCU2V0Rm9udChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCU2V0Rm9udChIV05EIGh3bmQsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKIAogICBpZiAod1BhcmFtID09IDApCiAgICAgbHBobC0+aEZvbnQgPSBHZXRTdG9ja09iamVjdChTWVNURU1fRk9OVCk7CiAgIGVsc2UKLSAgICBscGhsLT5oRm9udCA9IHdQYXJhbTsKKyAgICBscGhsLT5oRm9udCA9IChIRk9OVCkgd1BhcmFtOwogCiAgIHJldHVybiAwOwogfQpAQCAtMTEwNSw4ICsxMTE3LDEzIEBACiAKICAgaE9sZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBscGhsLT5oRm9udCk7CiAKKyNpZmRlZiBXSU5FTElCMzIKKyAgaEJydXNoID0gKEhCUlVTSCkgU2VuZE1lc3NhZ2UobHBobC0+aFBhcmVudCwgV01fQ1RMQ09MT1JMSVNUQk9YLCAoV1BBUkFNKWhkYywKKwkJCQkoTFBBUkFNKWh3bmQpOworI2Vsc2UKICAgaEJydXNoID0gU2VuZE1lc3NhZ2UobHBobC0+aFBhcmVudCwgV01fQ1RMQ09MT1IsIGhkYywKIAkJICAgICAgIE1BS0VMT05HKGh3bmQsIENUTENPTE9SX0xJU1RCT1gpKTsKKyNlbmRpZgogCiAgIGlmIChoQnJ1c2ggPT0gMCkgaEJydXNoID0gR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpOwogCkBAIC0xNjM4LDcgKzE2NTUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTGlzdEJveFduZFByb2MgCiAgKi8KLUxPTkcgTGlzdEJveFduZFByb2MoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK0xSRVNVTFQgTGlzdEJveFduZFByb2MoSFdORCBod25kLCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7IAogICAgIHN3aXRjaCAobWVzc2FnZSkgewogICAgICBjYXNlIFdNX0NSRUFURTogcmV0dXJuIExCQ3JlYXRlKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKQEAgLTE3MDIsNyArMTcxOSw3IEBACiAgIExQSEVBRExJU1QgbHBobDsKICAgY2hhciBzWzEzMF07CiAKLSAgZHByaW50Zl9saXN0Ym94KCBzdGRkZWIsICJEbGdEaXJTZWxlY3QoJTA0WCwgJyVzJywgJWQpIFxuIiwgaERsZywgbHBTdHIsIAorICBkcHJpbnRmX2xpc3Rib3goIHN0ZGRlYiwgIkRsZ0RpclNlbGVjdCgiTlBGTVQiLCAnJXMnLCAlZCkgXG4iLCBoRGxnLCBscFN0ciwgCiAJCSAgbklETEJveCApOwogCiAgIGh3bmQgPSBHZXREbGdJdGVtKGhEbGcsIG5JRExCb3gpOwpAQCAtMTc0Myw3ICsxNzYwLDcgQEAKICAgSFdORAloV25kOwogICBpbnQgcmV0OwogICAKLSAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiRGxnRGlyTGlzdCglMDRYLCAnJXMnLCAlZCwgJWQsICUwNFgpIFxuIiwKKyAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiRGxnRGlyTGlzdCgiTlBGTVQiLCAnJXMnLCAlZCwgJWQsICUwNFgpIFxuIiwKIAkJICBoRGxnLCBscFBhdGhTcGVjLCBuSURMQm94LCBuSURTdGF0LCB3VHlwZSk7CiAgIGlmIChuSURMQm94KSAgewogICAgIExQSEVBRExJU1QgbHBobDsKQEAgLTE3NjcsMTMgKzE3ODQsMTMgQEAKIAl0ZW1wWzFdID0gJ0EnK2RyaXZlOwogCXRlbXBbMl0gPSAnOic7CiAJU2VuZERsZ0l0ZW1NZXNzYWdlKCBoRGxnLCBuSURTdGF0LCBXTV9TRVRURVhULCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRVJfSEVBUF9TRUdfQUREUihoVGVtcCkgKyAxICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSkoVVNFUl9IRUFQX1NFR19BRERSKGhUZW1wKSArIDEpICk7CiAgICAgICB9IGVsc2UgewogCXRlbXBbMF0gPSAnQScrZHJpdmU7CiAJdGVtcFsxXSA9ICc6JzsKIAl0ZW1wWzJdID0gJ1xcJzsKIAlTZW5kRGxnSXRlbU1lc3NhZ2UoIGhEbGcsIG5JRFN0YXQsIFdNX1NFVFRFWFQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFUl9IRUFQX1NFR19BRERSKGhUZW1wKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pVVNFUl9IRUFQX1NFR19BRERSKGhUZW1wKSApOwogICAgICAgfQogICAgICAgVVNFUl9IRUFQX0ZSRUUoIGhUZW1wICk7CiAgIH0gCmRpZmYgLS1naXQgYS9jb250cm9scy9tZW51LmMgYi9jb250cm9scy9tZW51LmMKaW5kZXggMjUwZjQyNC4uOTBkYjk5YyAxMDA2NDQKLS0tIGEvY29udHJvbHMvbWVudS5jCisrKyBiL2NvbnRyb2xzL21lbnUuYwpAQCAtMjI1LDggKzIyNSwxMyBAQAogCSAgICBpZiAocCAmJiAocFsxXSAhPSAnJicpICYmICh0b3VwcGVyKHBbMV0pID09IGtleSkpIHJldHVybiBpOwogCX0KICAgICB9CisjaWZkZWYgV0lORUxJQjMyCisgICAgbWVudWNoYXIgPSBTZW5kTWVzc2FnZSggaHduZE93bmVyLCBXTV9NRU5VQ0hBUiwgCisJCQkgICAgTUFLRVdQQVJBTShrZXksbWVudS0+d0ZsYWdzKSwgKExQQVJBTSlobWVudSApOworI2Vsc2UKICAgICBtZW51Y2hhciA9IFNlbmRNZXNzYWdlKCBod25kT3duZXIsIFdNX01FTlVDSEFSLCBrZXksCiAJCQkgICAgTUFLRUxPTkcoIG1lbnUtPndGbGFncywgaG1lbnUgKSApOworI2VuZGlmCiAgICAgaWYgKEhJV09SRChtZW51Y2hhcikgPT0gMikgcmV0dXJuIExPV09SRChtZW51Y2hhcik7CiAgICAgaWYgKEhJV09SRChtZW51Y2hhcikgPT0gMSkgcmV0dXJuIC0yOwogICAgIHJldHVybiAtMTsKQEAgLTI1Miw3ICsyNTcsNyBAQAogICAgICAgc3RhdGljIExQTUVBU1VSRUlURU1TVFJVQ1QgbWlzdHJ1Y3Q9TlVMTDsKICAgICAgIGlmIChtaXN0cnVjdCA9PSBOVUxMKSAgewogCW1pc3RyaCA9IEdsb2JhbEFsbG9jKDAsc2l6ZW9mKE1FQVNVUkVJVEVNU1RSVUNUKSk7Ci0JbWlzdHJzZWdwID0gV0lOMTZfR2xvYmFsTG9jayhtaXN0cmgpOworCW1pc3Ryc2VncCA9IChTRUdQVFIpV0lOMTZfR2xvYmFsTG9jayhtaXN0cmgpOwogCW1pc3RydWN0ID0gUFRSX1NFR19UT19MSU4obWlzdHJzZWdwKTsKICAgICAgIH0KICAgICAgIG1pc3RydWN0LT5DdGxUeXBlID0gT0RUX01FTlU7CkBAIC00NTUsNyArNDYwLDcgQEAKICAgICAgIHN0YXRpYyBMUERSQVdJVEVNU1RSVUNUIGRpc3RydWN0PU5VTEw7CiAgICAgICBpZiAoZGlzdHJ1Y3QgPT0gTlVMTCkgIHsKIAlkaXN0cmggPSBHbG9iYWxBbGxvYygwLHNpemVvZihEUkFXSVRFTVNUUlVDVCkpOwotCWRpc3Ryc2VncCA9IFdJTjE2X0dsb2JhbExvY2soZGlzdHJoKTsKKwlkaXN0cnNlZ3AgPSAoU0VHUFRSKVdJTjE2X0dsb2JhbExvY2soZGlzdHJoKTsKIAlkaXN0cnVjdCA9IFBUUl9TRUdfVE9fTElOKGRpc3Ryc2VncCk7CiAgICAgICB9CiAgICAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJEcmF3TWVudUl0ZW06IE93bmVyZHJhdyFcbiIpOwpAQCAtNjMwLDcgKzYzNSw3IEBACiAgICAgCiAgICAgbHBwb3AgPSAoTFBQT1BVUE1FTlUpIFVTRVJfSEVBUF9MSU5fQUREUiggd25kUHRyLT53SURtZW51ICk7CiAgICAgaWYgKGxwcG9wID09IE5VTEwgfHwgbHByZWN0ID09IE5VTEwpIHJldHVybiBTWVNNRVRSSUNTX0NZTUVOVTsKLSAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJNRU5VX0RyYXdNZW51QmFyKCUwNFgsICVwLCAlcCk7ICFcbiIsIAorICAgIGRwcmludGZfbWVudShzdGRkZWIsIk1FTlVfRHJhd01lbnVCYXIoIk5QRk1UIiwgJXAsICVwKTsgIVxuIiwgCiAJCSBoREMsIGxwcmVjdCwgbHBwb3ApOwogICAgIGlmIChscHBvcC0+SGVpZ2h0ID09IDApIE1FTlVfTWVudUJhckNhbGNTaXplKGhEQywgbHByZWN0LCBscHBvcCwgaHduZCk7CiAgICAgbHByZWN0LT5ib3R0b20gPSBscHJlY3QtPnRvcCArIGxwcG9wLT5IZWlnaHQ7CkBAIC02NjcsNyArNjcyLDcgQEAKIAlpdGVtW21lbnUtPkZvY3VzZWRJdGVtXS5pdGVtX2ZsYWdzICY9IH4oTUZfSElMSVRFIHwgTUZfTU9VU0VTRUxFQ1QpOwogCW1lbnUtPkZvY3VzZWRJdGVtID0gTk9fU0VMRUNURURfSVRFTTsKICAgICB9Ci0gICAgU2VuZE1lc3NhZ2UoIGh3bmRPd25lciwgV01fSU5JVE1FTlVQT1BVUCwgaG1lbnUsCisgICAgU2VuZE1lc3NhZ2UoIGh3bmRPd25lciwgV01fSU5JVE1FTlVQT1BVUCwgKFdQQVJBTSlobWVudSwKIAkJIE1BS0VMT05HKCBpZCwgKG1lbnUtPndGbGFncyAmIE1GX1NZU01FTlUpID8gMSA6IDAgKSk7CiAgICAgTUVOVV9Qb3B1cE1lbnVDYWxjU2l6ZSggbWVudSwgaHduZE93bmVyICk7CiAgICAgaWYgKCFtZW51LT5oV25kKQpAQCAtNzM1LDIyICs3NDAsNDMgQEAKIAlpZiAobHBwb3AtPkZvY3VzZWRJdGVtID09IFNZU01FTlVfU0VMRUNURUQpCiAgICAgICAgIHsKIAkgICAgTkNfRHJhd1N5c0J1dHRvbiggbHBwb3AtPmhXbmQsIGhkYywgVFJVRSApOworI2lmZGVmIFdJTkVMSUIzMgorICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIGh3bmRPd25lciwgV01fTUVOVVNFTEVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFV1BBUkFNKCBHZXRTeXN0ZW1NZW51KCBscHBvcC0+aFduZCwgRkFMU0UgKSwKKwkJCQkgICAgIGxwcG9wLT53RmxhZ3MgfCBNRl9NT1VTRVNFTEVDVCApLAorCQkJIChMUEFSQU0paG1lbnUgKTsKKyNlbHNlCiAgICAgICAgICAgICBTZW5kTWVzc2FnZSggaHduZE93bmVyLCBXTV9NRU5VU0VMRUNULAogICAgICAgICAgICAgICAgICAgICAgICAgIEdldFN5c3RlbU1lbnUoIGxwcG9wLT5oV25kLCBGQUxTRSApLAogICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKCBscHBvcC0+d0ZsYWdzIHwgTUZfTU9VU0VTRUxFQ1QsIGhtZW51ICkgKTsKKyNlbmRpZgogICAgICAgICB9CiAJZWxzZQogCXsKIAkgICAgaXRlbXNbbHBwb3AtPkZvY3VzZWRJdGVtXS5pdGVtX2ZsYWdzIHw9IE1GX0hJTElURTsKIAkgICAgTUVOVV9EcmF3TWVudUl0ZW0oIGxwcG9wLT5oV25kLCBoZGMsICZpdGVtc1tscHBvcC0+Rm9jdXNlZEl0ZW1dLCBscHBvcC0+SGVpZ2h0LAogCQkJICAgICAgICEobHBwb3AtPndGbGFncyAmIE1GX1BPUFVQKSApOworI2lmZGVmIFdJTkVMSUIzMgorCSAgICBTZW5kTWVzc2FnZSggaHduZE93bmVyLCBXTV9NRU5VU0VMRUNULAorICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VXUEFSQU0oIGl0ZW1zW2xwcG9wLT5Gb2N1c2VkSXRlbV0uaXRlbV9pZCwKKwkJCQkgICAgIGl0ZW1zW2xwcG9wLT5Gb2N1c2VkSXRlbV0uaXRlbV9mbGFncyB8IAorCQkJCSAgICAgTUZfTU9VU0VTRUxFQ1QgKSwKKwkJCSAoTFBBUkFNKSBobWVudSApOworI2Vsc2UKIAkgICAgU2VuZE1lc3NhZ2UoIGh3bmRPd25lciwgV01fTUVOVVNFTEVDVCwKICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1tscHBvcC0+Rm9jdXNlZEl0ZW1dLml0ZW1faWQsCiAJCSAgICAgICAgIE1BS0VMT05HKCBpdGVtc1tscHBvcC0+Rm9jdXNlZEl0ZW1dLml0ZW1fZmxhZ3MgfCBNRl9NT1VTRVNFTEVDVCwgaG1lbnUpKTsKKyNlbmRpZgogCX0KICAgICB9CisjaWZkZWYgV0lORUxJQjMyCisgICAgZWxzZSBTZW5kTWVzc2FnZSggaHduZE93bmVyLCBXTV9NRU5VU0VMRUNULCAKKwkJICAgICAgTUFLRVdQQVJBTSggaG1lbnUsIGxwcG9wLT53RmxhZ3MgfCBNRl9NT1VTRVNFTEVDVCksCisJCSAgICAgIChMUEFSQU0paG1lbnUgKTsKKyNlbHNlCiAgICAgZWxzZSBTZW5kTWVzc2FnZSggaHduZE93bmVyLCBXTV9NRU5VU0VMRUNULCBobWVudSwKICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyggbHBwb3AtPndGbGFncyB8IE1GX01PVVNFU0VMRUNULCBobWVudSApICk7CisjZW5kaWYKIAogICAgIFJlbGVhc2VEQyggbHBwb3AtPmhXbmQsIGhkYyApOwogfQpAQCAtODU4LDcgKzg4NCw3IEBACiAgICAgaXRlbSA9ICgoTUVOVUlURU0gKilVU0VSX0hFQVBfTElOX0FERFIobWVudS0+aEl0ZW1zKSkgKyBtZW51LT5Gb2N1c2VkSXRlbTsKICAgICBpZiAoIShpdGVtLT5pdGVtX2ZsYWdzICYgTUZfUE9QVVApIHx8ICEoaXRlbS0+aXRlbV9mbGFncyAmIE1GX01PVVNFU0VMRUNUKSkKIAlyZXR1cm4gMDsKLSAgICByZXR1cm4gaXRlbS0+aXRlbV9pZDsKKyAgICByZXR1cm4gKEhNRU5VKWl0ZW0tPml0ZW1faWQ7CiB9CiAKIApAQCAtODg1LDcgKzkxMSw3IEBACiAJaWYgKCEoaXRlbS0+aXRlbV9mbGFncyAmIE1GX1BPUFVQKSB8fAogCSAgICAhKGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9NT1VTRVNFTEVDVCkpIHJldHVybjsKIAlpdGVtLT5pdGVtX2ZsYWdzICY9IH5NRl9NT1VTRVNFTEVDVDsKLQloc3VibWVudSA9IGl0ZW0tPml0ZW1faWQ7CisJaHN1Ym1lbnUgPSAoSE1FTlUpaXRlbS0+aXRlbV9pZDsKICAgICB9CiAgICAgc3VibWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBoc3VibWVudSApOwogICAgIE1FTlVfSGlkZVN1YlBvcHVwcyggaHduZE93bmVyLCBoc3VibWVudSApOwpAQCAtMTA4OSw3ICsxMTE1LDcgQEAKIAl7CiAJICAgIHJldHVybiBNRU5VX0V4ZWNGb2N1c2VkSXRlbSggaHduZE93bmVyLCBobWVudSwgaG1lbnVDdXJyZW50ICk7CiAJfQotCWhzdWJtZW51ID0gaXRlbS0+aXRlbV9pZDsKKwloc3VibWVudSA9IChITUVOVSlpdGVtLT5pdGVtX2lkOwogICAgIH0KICAgICAgIC8qIFNlbGVjdCBmaXJzdCBpdGVtIG9mIHN1Yi1wb3B1cCAqLwogICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZE93bmVyLCBoc3VibWVudSwgTk9fU0VMRUNURURfSVRFTSApOwpAQCAtMTQ0OCwxNSArMTQ3NCwyMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgUG9wdXBNZW51V25kUHJvYwogICovCi1MT05HIFBvcHVwTWVudVduZFByb2MoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQorTFJFU1VMVCBQb3B1cE1lbnVXbmRQcm9jKEhXTkQgaHduZCxVSU5UIG1lc3NhZ2UsV1BBUkFNIHdQYXJhbSxMUEFSQU0gbFBhcmFtKQogeyAgICAKICAgICBzd2l0Y2gobWVzc2FnZSkKICAgICB7CiAgICAgY2FzZSBXTV9DUkVBVEU6CiAJewogCSAgICBDUkVBVEVTVFJVQ1QgKmNyZWF0ZVN0cnVjdCA9IChDUkVBVEVTVFJVQ1QqKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CisjaWZkZWYgV0lORUxJQjMyCisJICAgIEhNRU5VIGhtZW51ID0gKEhNRU5VKSAoY3JlYXRlU3RydWN0LT5scENyZWF0ZVBhcmFtcyk7CisJICAgIFNldFdpbmRvd0xvbmcoIGh3bmQsIDAsIGhtZW51ICk7CisjZWxzZQogCSAgICBITUVOVSBobWVudSA9IChITUVOVSkgKChpbnQpY3JlYXRlU3RydWN0LT5scENyZWF0ZVBhcmFtcyAmIDB4ZmZmZik7CiAJICAgIFNldFdpbmRvd1dvcmQoIGh3bmQsIDAsIGhtZW51ICk7CisjZW5kaWYKIAkgICAgcmV0dXJuIDA7CiAJfQogCkBAIC0xNDY4LDcgKzE0OTksMTIgQEAKIAkgICAgUEFJTlRTVFJVQ1QgcHM7CiAJICAgIEJlZ2luUGFpbnQoIGh3bmQsICZwcyApOwogCSAgICBNRU5VX0RyYXdQb3B1cE1lbnUoIGh3bmQsIHBzLmhkYywKLQkJCSAgICAgICAgKEhNRU5VKUdldFdpbmRvd1dvcmQoIGh3bmQsIDAgKSApOworI2lmZGVmIFdJTkVMSUIzMgorCQkJICAgICAgICAoSE1FTlUpR2V0V2luZG93TG9uZyggaHduZCwgMCApCisjZWxzZQorCQkJICAgICAgICAoSE1FTlUpR2V0V2luZG93V29yZCggaHduZCwgMCApCisjZW5kaWYKKyAJCQkgICAgICAgKTsKIAkgICAgRW5kUGFpbnQoIGh3bmQsICZwcyApOwogCSAgICByZXR1cm4gMDsKIAl9CkBAIC0xNTA4LDcgKzE1NDQsNyBAQAogQk9PTCBDaGFuZ2VNZW51KEhNRU5VIGhNZW51LCBXT1JEIG5Qb3MsIExQU1RSIGxwTmV3SXRlbSwgCiAJCQlXT1JEIHdJdGVtSUQsIFdPUkQgd0ZsYWdzKQogewotICBkcHJpbnRmX21lbnUoc3RkZGViLCJDaGFuZ2VNZW51KCUwNFgsICVYLCAnJXMnLCAlWCwgJVgpXG4iLAorICBkcHJpbnRmX21lbnUoc3RkZGViLCJDaGFuZ2VNZW51OiBtZW51PSJOUEZNVCIgcG9zPSVkIHB0cj0lcCBpdGVtPSUwNHggZmxhZ3M9JTA0eFxuIiwKIAkgICAgICAgaE1lbnUsIG5Qb3MsIGxwTmV3SXRlbSwgd0l0ZW1JRCwgd0ZsYWdzKTsKICAgaWYgKHdGbGFncyAmIE1GX0FQUEVORCkgIHsKICAgICByZXR1cm4gQXBwZW5kTWVudShoTWVudSwgd0ZsYWdzICYgfk1GX0FQUEVORCwgd0l0ZW1JRCwgbHBOZXdJdGVtKTsKQEAgLTE1MzUsNyArMTU3MSw3IEBACiBCT09MIENoZWNrTWVudUl0ZW0oSE1FTlUgaE1lbnUsIFdPUkQgd0l0ZW1JRCwgV09SRCB3RmxhZ3MpCiB7CiAJTFBNRU5VSVRFTSAJbHBpdGVtOwotCWRwcmludGZfbWVudShzdGRkZWIsIkNoZWNrTWVudUl0ZW0gKCUwNFgsICUwNFgsICUwNFgpICFcbiIsIAorCWRwcmludGZfbWVudShzdGRkZWIsIkNoZWNrTWVudUl0ZW0gKCJOUEZNVCIsICUwNFgsICUwNFgpICFcbiIsIAogCQkgICAgIGhNZW51LCB3SXRlbUlELCB3RmxhZ3MpOwogCWlmICghKGxwaXRlbSA9IE1FTlVfRmluZEl0ZW0oJmhNZW51LCAmd0l0ZW1JRCwgd0ZsYWdzKSkpIHJldHVybiBGQUxTRTsKIAlpZiAod0ZsYWdzICYgTUZfQ0hFQ0tFRCkgbHBpdGVtLT5pdGVtX2ZsYWdzIHw9IE1GX0NIRUNLRUQ7CkBAIC0xNTUwLDcgKzE1ODYsNyBAQAogQk9PTCBFbmFibGVNZW51SXRlbShITUVOVSBoTWVudSwgV09SRCB3SXRlbUlELCBXT1JEIHdGbGFncykKIHsKICAgICBMUE1FTlVJVEVNIAlscGl0ZW07Ci0gICAgZHByaW50Zl9tZW51KHN0ZGRlYiwiRW5hYmxlTWVudUl0ZW0gKCUwNFgsICUwNFgsICUwNFgpICFcbiIsIAorICAgIGRwcmludGZfbWVudShzdGRkZWIsIkVuYWJsZU1lbnVJdGVtICgiTlBGTVQiLCAlMDRYLCAlMDRYKSAhXG4iLCAKIAkJIGhNZW51LCB3SXRlbUlELCB3RmxhZ3MpOwogICAgIGlmICghKGxwaXRlbSA9IE1FTlVfRmluZEl0ZW0oICZoTWVudSwgJndJdGVtSUQsIHdGbGFncyApKSkgcmV0dXJuIEZBTFNFOwogCkBAIC0xNTcxLDI5ICsxNjA3LDI1IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJR2V0TWVudVN0cmluZwkJW1VTRVIuMTYxXQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgR2V0TWVudVN0cmluZyAgICAoVVNFUi4xNjEpCiAgKi8KLWludCBHZXRNZW51U3RyaW5nKEhNRU5VIGhNZW51LCBXT1JEIHdJdGVtSUQsIAotCQkgIExQU1RSIHN0ciwgc2hvcnQgbk1heFNpeiwgV09SRCB3RmxhZ3MpCitpbnQgR2V0TWVudVN0cmluZyggSE1FTlUgaE1lbnUsIFdPUkQgd0l0ZW1JRCwKKyAgICAgICAgICAgICAgICAgICBMUFNUUiBzdHIsIHNob3J0IG5NYXhTaXosIFdPUkQgd0ZsYWdzICkKIHsKLQlMUE1FTlVJVEVNIAlscGl0ZW07Ci0JaW50CQltYXhzaXo7Ci0JZHByaW50Zl9tZW51KHN0ZGRlYiwiR2V0TWVudVN0cmluZyglMDRYLCAlMDRYLCAlcCwgJWQsICUwNFgpO1xuIiwKLQkJCQkJaE1lbnUsIHdJdGVtSUQsIHN0ciwgbk1heFNpeiwgd0ZsYWdzKTsKLQlpZiAoc3RyID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQlscGl0ZW0gPSBNRU5VX0ZpbmRJdGVtKCAmaE1lbnUsICZ3SXRlbUlELCB3RmxhZ3MgKTsKLQlpZiAobHBpdGVtICE9IE5VTEwpIHsKLQkJaWYgKGxwaXRlbS0+aXRlbV90ZXh0ICE9IE5VTEwpIHsKLQkJCW1heHNpeiA9IG1pbihuTWF4U2l6IC0gMSwgc3RybGVuKGxwaXRlbS0+aXRlbV90ZXh0KSk7Ci0JCQlzdHJuY3B5KHN0ciwgbHBpdGVtLT5pdGVtX3RleHQsIG1heHNpeiArIDEpOwotCQkJfQotCQllbHNlCi0JCQltYXhzaXogPSAwOwotCQlkcHJpbnRmX21lbnUoc3RkZGViLCJHZXRNZW51U3RyaW5nIC8vIEZvdW5kICFcbiIpOwotCQlyZXR1cm4gbWF4c2l6OwotCQl9Ci0JcmV0dXJuIDA7CisgICAgTFBNRU5VSVRFTSBscGl0ZW07CisKKyAgICBkcHJpbnRmX21lbnUoIHN0ZGRlYiwgIkdldE1lbnVTdHJpbmc6IG1lbnU9Ik5QRk1UIiBpdGVtPSUwNHggcHRyPSVwIGxlbj0lZCBmbGFncz0lMDR4XG4iLAorICAgICAgICAgICAgICAgICBoTWVudSwgd0l0ZW1JRCwgc3RyLCBuTWF4U2l6LCB3RmxhZ3MgKTsKKyAgICBpZiAoIXN0ciB8fCAhbk1heFNpeikgcmV0dXJuIDA7CisgICAgc3RyWzBdID0gJ1wwJzsKKyAgICBpZiAoIShscGl0ZW0gPSBNRU5VX0ZpbmRJdGVtKCAmaE1lbnUsICZ3SXRlbUlELCB3RmxhZ3MgKSkpIHJldHVybiAwOworICAgIGlmICghbHBpdGVtLT5pdGVtX3RleHQgfHwgIUlTX1NUUklOR19JVEVNKGxwaXRlbS0+aXRlbV9mbGFncykpIHJldHVybiAwOworICAgIG5NYXhTaXogPSBtaW4oIG5NYXhTaXotMSwgc3RybGVuKGxwaXRlbS0+aXRlbV90ZXh0KSApOworICAgIHN0cm5jcHkoIHN0ciwgbHBpdGVtLT5pdGVtX3RleHQsIG5NYXhTaXogKTsKKyAgICBzdHJbbk1heFNpel0gPSAnXDAnOworICAgIGRwcmludGZfbWVudSggc3RkZGViLCAiR2V0TWVudVN0cmluZzogcmV0dXJuaW5nICclcydcbiIsIHN0ciApOworICAgIHJldHVybiBuTWF4U2l6OwogfQogCiAKQEAgLTE2MDQsNyArMTYzNiw3IEBACiB7CiAgICAgTFBQT1BVUE1FTlUgbWVudTsKICAgICBMUE1FTlVJVEVNICBscGl0ZW07Ci0gICAgZHByaW50Zl9tZW51KHN0ZGRlYiwiSGlsaXRlTWVudUl0ZW0oJTA0WCwgJTA0WCwgJTA0WCwgJTA0WCk7XG4iLCAKKyAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJIaWxpdGVNZW51SXRlbSgiTlBGTVQiLCAiTlBGTVQiLCAlMDRYLCAlMDRYKTtcbiIsIAogCQkJCQkJaFduZCwgaE1lbnUsIHdJdGVtSUQsIHdIaWxpdGUpOwogICAgIGlmICghKGxwaXRlbSA9IE1FTlVfRmluZEl0ZW0oICZoTWVudSwgJndJdGVtSUQsIHdIaWxpdGUgKSkpIHJldHVybiBGQUxTRTsKICAgICBpZiAoIShtZW51ID0gKExQUE9QVVBNRU5VKSBVU0VSX0hFQVBfTElOX0FERFIoaE1lbnUpKSkgcmV0dXJuIEZBTFNFOwpAQCAtMTYyMSw3ICsxNjUzLDcgQEAKIFdPUkQgR2V0TWVudVN0YXRlKEhNRU5VIGhNZW51LCBXT1JEIHdJdGVtSUQsIFdPUkQgd0ZsYWdzKQogewogICAgIExQTUVOVUlURU0gbHBpdGVtOwotICAgIGRwcmludGZfbWVudShzdGRkZWIsIkdldE1lbnVTdGF0ZSglMDRYLCAlMDRYLCAlMDRYKTtcbiIsIAorICAgIGRwcmludGZfbWVudShzdGRkZWIsIkdldE1lbnVTdGF0ZSgiTlBGTVQiLCAlMDRYLCAlMDRYKTtcbiIsIAogCQkgaE1lbnUsIHdJdGVtSUQsIHdGbGFncyk7CiAgICAgaWYgKCEobHBpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmd0l0ZW1JRCwgd0ZsYWdzICkpKSByZXR1cm4gLTE7CiAgICAgaWYgKGxwaXRlbS0+aXRlbV9mbGFncyAmIE1GX1BPUFVQKQpAQCAtMTY0MCwxMCArMTY3MiwxMCBAQAogV09SRCBHZXRNZW51SXRlbUNvdW50KEhNRU5VIGhNZW51KQogewogCUxQUE9QVVBNRU5VCW1lbnU7Ci0JZHByaW50Zl9tZW51KHN0ZGRlYiwiR2V0TWVudUl0ZW1Db3VudCglMDRYKTtcbiIsIGhNZW51KTsKKwlkcHJpbnRmX21lbnUoc3RkZGViLCJHZXRNZW51SXRlbUNvdW50KCJOUEZNVCIpO1xuIiwgaE1lbnUpOwogCW1lbnUgPSAoTFBQT1BVUE1FTlUpIFVTRVJfSEVBUF9MSU5fQUREUihoTWVudSk7CiAJaWYgKG1lbnUgPT0gTlVMTCkgcmV0dXJuIChXT1JEKS0xOwotCWRwcmludGZfbWVudShzdGRkZWIsIkdldE1lbnVJdGVtQ291bnQoJTA0WCkgcmV0dXJuICVkIFxuIiwgCisJZHByaW50Zl9tZW51KHN0ZGRlYiwiR2V0TWVudUl0ZW1Db3VudCgiTlBGTVQiKSByZXR1cm4gJWQgXG4iLCAKIAkJICAgICBoTWVudSwgbWVudS0+bkl0ZW1zKTsKIAlyZXR1cm4gbWVudS0+bkl0ZW1zOwogfQpAQCAtMTY1Nyw3ICsxNjg5LDcgQEAKICAgICBMUFBPUFVQTUVOVQltZW51OwogICAgIE1FTlVJVEVNICppdGVtOwogCi0gICAgZHByaW50Zl9tZW51KHN0ZGRlYiwiR2V0TWVudUl0ZW1JRCglMDRYLCAlZCk7XG4iLCBoTWVudSwgblBvcyk7CisgICAgZHByaW50Zl9tZW51KHN0ZGRlYiwiR2V0TWVudUl0ZW1JRCgiTlBGTVQiLCAlZCk7XG4iLCBoTWVudSwgblBvcyk7CiAgICAgaWYgKCEobWVudSA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKGhNZW51KSkpIHJldHVybiAtMTsKICAgICBpZiAoKG5Qb3MgPCAwKSB8fCAoblBvcyA+PSBtZW51LT5uSXRlbXMpKSByZXR1cm4gLTE7CiAgICAgaXRlbSA9IChNRU5VSVRFTSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIG1lbnUtPmhJdGVtcyApOwpAQCAtMTY3NywxMyArMTcwOSwxMyBAQAogCiAgICAgaWYgKElTX1NUUklOR19JVEVNKHdGbGFncykpCiAgICAgewotICAgICAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJJbnNlcnRNZW51ICglMDRYLCAlMDRYLCAlMDRYLCAlMDRYLCAnJXMnKSAhXG4iLAorICAgICAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJJbnNlcnRNZW51ICgiTlBGTVQiLCAlMDRYLCAlMDRYLCAlMDRYLCAnJXMnKSAhXG4iLAogICAgICAgICAgICAgICAgICAgICAgaE1lbnUsIG5Qb3MsIHdGbGFncywgd0l0ZW1JRCwKICAgICAgICAgICAgICAgICAgICAgIGxwTmV3SXRlbSA/IGxwTmV3SXRlbSA6ICIobnVsbCkiKTsKICAgICAgICAgaWYgKCFscE5ld0l0ZW0pIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgZWxzZQotICAgICAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJJbnNlcnRNZW51ICglMDRYLCAlMDRYLCAlMDRYLCAlMDRYLCAlcCkgIVxuIiwKKyAgICAgICAgZHByaW50Zl9tZW51KHN0ZGRlYiwiSW5zZXJ0TWVudSAoIk5QRk1UIiwgJTA0WCwgJTA0WCwgJTA0WCwgJXApICFcbiIsCiAgICAgICAgICAgICAgICAgICAgICBoTWVudSwgblBvcywgd0ZsYWdzLCB3SXRlbUlELCBscE5ld0l0ZW0pOwogCiAgICAgICAvKiBGaW5kIHdoZXJlIHRvIGluc2VydCBuZXcgaXRlbSAqLwpAQCAtMTY5NSw3ICsxNzI3LDcgQEAKICAgICAgICAgICAgICBTb21lIHByb2dyYW1zIHNwZWNpZnkgdGhlIG1lbnUgbGVuZ3RoIHRvIGRvIHRoYXQgKi8KICAgICAgICAgaWYgKCEobWVudSA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKGhNZW51KSkpIAogICAgICAgICB7Ci0gICAgICAgICAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJJbnNlcnRNZW51OiAlMDRYIG5vdCBhIG1lbnUgaGFuZGxlXG4iLCBoTWVudSk7CisgICAgICAgICAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJJbnNlcnRNZW51OiAiTlBGTVQiIG5vdCBhIG1lbnUgaGFuZGxlXG4iLCBoTWVudSk7CiAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgblBvcyA9IG1lbnUtPm5JdGVtczsKQEAgLTE3MDksNyArMTc0MSw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKCEobWVudSA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKGhNZW51KSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGRwcmludGZfbWVudShzdGRkZWIsIkluc2VydE1lbnU6ICUwNFggbm90IGEgbWVudSBoYW5kbGVcbiIsIGhNZW51KTsKKyAgICAgICAgICAgIGRwcmludGZfbWVudShzdGRkZWIsIkluc2VydE1lbnU6ICJOUEZNVCIgbm90IGEgbWVudSBoYW5kbGVcbiIsIGhNZW51KTsKICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0KQEAgLTE3ODMsNyArMTgxNSw3IEBACiB7CiAgICAgTFBQT1BVUE1FTlUJbWVudTsKICAgICBMUE1FTlVJVEVNIAlscGl0ZW07Ci0JZHByaW50Zl9tZW51KHN0ZGRlYiwiUmVtb3ZlTWVudSAoJTA0WCwgJTA0WCwgJTA0WCkgIVxuIiwgCisJZHByaW50Zl9tZW51KHN0ZGRlYiwiUmVtb3ZlTWVudSAoIk5QRk1UIiwgJTA0WCwgJTA0WCkgIVxuIiwgCiAJCSAgICAgaE1lbnUsIG5Qb3MsIHdGbGFncyk7CiAgICAgaWYgKCEobHBpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmblBvcywgd0ZsYWdzICkpKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKCEobWVudSA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKGhNZW51KSkpIHJldHVybiBGQUxTRTsKQEAgLTE4MzMsMTIgKzE4NjUsMTIgQEAKICAgICBMUE1FTlVJVEVNIAlscGl0ZW07CiAgICAgaWYgKElTX1NUUklOR19JVEVNKHdGbGFncykpCiAgICAgewotCWRwcmludGZfbWVudShzdGRkZWIsIk1vZGlmeU1lbnUgKCUwNFgsICUwNFgsICUwNFgsICUwNFgsICclcycpICFcbiIsCisJZHByaW50Zl9tZW51KHN0ZGRlYiwiTW9kaWZ5TWVudSAoIk5QRk1UIiwgJTA0WCwgJTA0WCwgJTA0WCwgJyVzJykgIVxuIiwKIAkgICAgICAgaE1lbnUsIG5Qb3MsIHdGbGFncywgd0l0ZW1JRCwgbHBOZXdJdGVtID8gbHBOZXdJdGVtIDogIihudWxsKSIpOwogICAgICAgICBpZiAoIWxwTmV3SXRlbSkgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBlbHNlCi0JZHByaW50Zl9tZW51KHN0ZGRlYiwiTW9kaWZ5TWVudSAoJTA0WCwgJTA0WCwgJTA0WCwgJTA0WCwgJXApICFcbiIsCisJZHByaW50Zl9tZW51KHN0ZGRlYiwiTW9kaWZ5TWVudSAoIk5QRk1UIiwgJTA0WCwgJTA0WCwgJTA0WCwgJXApICFcbiIsCiAJICAgICAgIGhNZW51LCBuUG9zLCB3RmxhZ3MsIHdJdGVtSUQsIGxwTmV3SXRlbSk7CiAgICAgaWYgKCEobHBpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmblBvcywgd0ZsYWdzICkpKSByZXR1cm4gRkFMU0U7CiAgICAgCkBAIC0xODkwLDggKzE5MjIsOCBAQAogCQlIQklUTUFQIGhOZXdDaGVjaywgSEJJVE1BUCBoTmV3VW5DaGVjaykKIHsKICAgICBMUE1FTlVJVEVNIGxwaXRlbTsKLSAgIGRwcmludGZfbWVudShzdGRkZWIsIlNldE1lbnVJdGVtQml0bWFwcyAoJTA0WCwgJTA0WCwgJTA0WCwgJTA0WCwgJTA4WCkgIVxuIiwKLQkgICAgaE1lbnUsIG5Qb3MsIHdGbGFncywgaE5ld0NoZWNrLCBoTmV3VW5DaGVjayk7CisgICBkcHJpbnRmX21lbnUoc3RkZGViLCJTZXRNZW51SXRlbUJpdG1hcHMgKCJOUEZNVCIsICUwNFgsICUwNFgsICJOUEZNVCIsICUwOGxYKSAhXG4iLAorCSAgICBoTWVudSwgblBvcywgd0ZsYWdzLCBoTmV3Q2hlY2ssIChEV09SRCloTmV3VW5DaGVjayk7CiAgICAgaWYgKCEobHBpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmblBvcywgd0ZsYWdzICkpKSByZXR1cm4gRkFMU0U7CiAKICAgICBpZiAoIWhOZXdDaGVjayAmJiAhaE5ld1VuQ2hlY2spCkBAIC0xOTMyLDcgKzE5NjQsNyBAQAogICAgIG1lbnUtPmhXbmQgICA9IDA7CiAgICAgbWVudS0+aEl0ZW1zID0gMDsKICAgICBtZW51LT5Gb2N1c2VkSXRlbSA9IE5PX1NFTEVDVEVEX0lURU07Ci0gICAgZHByaW50Zl9tZW51KHN0ZGRlYiwiQ3JlYXRlTWVudSAvLyByZXR1cm4gJTA0WFxuIiwgaE1lbnUpOworICAgIGRwcmludGZfbWVudShzdGRkZWIsIkNyZWF0ZU1lbnUgLy8gcmV0dXJuICJOUEZNVCJcbiIsIGhNZW51KTsKICAgICByZXR1cm4gaE1lbnU7CiB9CiAKQEAgLTE5NDMsNyArMTk3NSw3IEBACiBCT09MIERlc3Ryb3lNZW51KEhNRU5VIGhNZW51KQogewogICAgIExQUE9QVVBNRU5VIGxwcG9wOwotICAgIGRwcmludGZfbWVudShzdGRkZWIsIkRlc3Ryb3lNZW51ICglMDRYKSAhXG4iLCBoTWVudSk7CisgICAgZHByaW50Zl9tZW51KHN0ZGRlYiwiRGVzdHJveU1lbnUgKCJOUEZNVCIpICFcbiIsIGhNZW51KTsKICAgICBpZiAoaE1lbnUgPT0gMCkgcmV0dXJuIEZBTFNFOwogICAgIGxwcG9wID0gKExQUE9QVVBNRU5VKSBVU0VSX0hFQVBfTElOX0FERFIoaE1lbnUpOwogICAgIGlmICghbHBwb3AgfHwgKGxwcG9wLT53TWFnaWMgIT0gTUVOVV9NQUdJQykpIHJldHVybiBGQUxTRTsKQEAgLTE5NjMsNyArMTk5NSw3IEBACiAgICAgICAgIFVTRVJfSEVBUF9GUkVFKCBscHBvcC0+aEl0ZW1zICk7CiAgICAgfQogICAgIFVTRVJfSEVBUF9GUkVFKCBoTWVudSApOwotICAgIGRwcmludGZfbWVudShzdGRkZWIsIkRlc3Ryb3lNZW51ICglMDRYKSAvLyBFbmQgIVxuIiwgaE1lbnUpOworICAgIGRwcmludGZfbWVudShzdGRkZWIsIkRlc3Ryb3lNZW51ICgiTlBGTVQiKSAvLyBFbmQgIVxuIiwgaE1lbnUpOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC0yMDEyLDE4ICsyMDQ0LDE4IEBACiAJTFBQT1BVUE1FTlUgbHBtZW51OwogCVdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOwogCWlmICh3bmRQdHIgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwiU2V0TWVudSglMDRYLCAlMDRYKSAvLyBCYWQgd2luZG93IGhhbmRsZSAhXG4iLAorCQlmcHJpbnRmKHN0ZGVyciwiU2V0TWVudSgiTlBGTVQiLCAiTlBGTVQiKSAvLyBCYWQgd2luZG93IGhhbmRsZSAhXG4iLAogCQkJaFduZCwgaE1lbnUpOwogCQlyZXR1cm4gRkFMU0U7CiAJCX0KLQlkcHJpbnRmX21lbnUoc3RkZGViLCJTZXRNZW51KCUwNFgsICUwNFgpO1xuIiwgaFduZCwgaE1lbnUpOworCWRwcmludGZfbWVudShzdGRkZWIsIlNldE1lbnUoIk5QRk1UIiwgIk5QRk1UIik7XG4iLCBoV25kLCBoTWVudSk7CiAJaWYgKEdldENhcHR1cmUoKSA9PSBoV25kKSBSZWxlYXNlQ2FwdHVyZSgpOwogCXduZFB0ci0+d0lEbWVudSA9IGhNZW51OwogCWlmIChoTWVudSAhPSAwKQogCXsKIAkgICAgbHBtZW51ID0gKExQUE9QVVBNRU5VKSBVU0VSX0hFQVBfTElOX0FERFIoaE1lbnUpOwogCSAgICBpZiAobHBtZW51ID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsIlNldE1lbnUoJTA0WCwgJTA0WCkgLy8gQmFkIG1lbnUgaGFuZGxlICFcbiIsIAorCQlmcHJpbnRmKHN0ZGVyciwiU2V0TWVudSgiTlBGTVQiLCAiTlBGTVQiKSAvLyBCYWQgbWVudSBoYW5kbGUgIVxuIiwgCiAJCQloV25kLCBoTWVudSk7CiAJCXJldHVybiBGQUxTRTsKIAkJfQpAQCAtMjA0NSw3ICsyMDc3LDcgQEAKIHsKICAgICBMUFBPUFVQTUVOVSBscHBvcDsKICAgICBMUE1FTlVJVEVNIAlscGl0ZW07Ci0gICAgZHByaW50Zl9tZW51KHN0ZGRlYiwiR2V0U3ViTWVudSAoJTA0WCwgJTA0WCkgIVxuIiwgaE1lbnUsIG5Qb3MpOworICAgIGRwcmludGZfbWVudShzdGRkZWIsIkdldFN1Yk1lbnUgKCJOUEZNVCIsICUwNFgpICFcbiIsIGhNZW51LCBuUG9zKTsKICAgICBpZiAoIShscHBvcCA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKGhNZW51KSkpIHJldHVybiAwOwogICAgIGlmICgoV09SRCluUG9zID49IGxwcG9wLT5uSXRlbXMpIHJldHVybiAwOwogICAgIGxwaXRlbSA9IChNRU5VSVRFTSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGxwcG9wLT5oSXRlbXMgKTsKQEAgLTIwNjEsNyArMjA5Myw3IEBACiB7CiAJV05ECQkqd25kUHRyOwogCUxQUE9QVVBNRU5VIGxwcG9wOwotCWRwcmludGZfbWVudShzdGRkZWIsIkRyYXdNZW51QmFyICglMDRYKVxuIiwgaFduZCk7CisJZHByaW50Zl9tZW51KHN0ZGRlYiwiRHJhd01lbnVCYXIgKCJOUEZNVCIpXG4iLCBoV25kKTsKIAl3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKIAlpZiAod25kUHRyICE9IE5VTEwgJiYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKSA9PSAwICYmIAogCQl3bmRQdHItPndJRG1lbnUgIT0gMCkgewpAQCAtMjEwOSwxMSArMjE0MSwxMSBAQAogICAgIGlmIChISVdPUkQobmFtZSkpCiAgICAgewogICAgICAgICBjaGFyICpzdHIgPSAoY2hhciAqKVBUUl9TRUdfVE9fTElOKCBuYW1lICk7Ci0gICAgICAgIGRwcmludGZfbWVudSggc3RkZGViLCAiTG9hZE1lbnUoJTA0eCwnJXMnKVxuIiwgaW5zdGFuY2UsIHN0ciApOworICAgICAgICBkcHJpbnRmX21lbnUoIHN0ZGRlYiwgIkxvYWRNZW51KCJOUEZNVCIsJyVzJylcbiIsIGluc3RhbmNlLCBzdHIgKTsKICAgICAgICAgaWYgKHN0clswXSA9PSAnIycpIG5hbWUgPSAoU0VHUFRSKWF0b2koIHN0ciArIDEgKTsKICAgICB9CiAgICAgZWxzZQotICAgICAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwiTG9hZE1lbnUoJTA0eCwlMDR4KVxuIixpbnN0YW5jZSxMT1dPUkQobmFtZSkpOworICAgICAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwiTG9hZE1lbnUoIk5QRk1UIiwlMDR4KVxuIixpbnN0YW5jZSxMT1dPUkQobmFtZSkpOwogCiAgICAgaWYgKCFuYW1lKSByZXR1cm4gMDsKIApAQCAtMjE1Nyw3ICsyMTg5LDcgQEAKICAgICB9CiAgICAgbWVudSA9IChQT1BVUE1FTlUqKSBVU0VSX0hFQVBfTElOX0FERFIoaE1lbnUpOwogICAgIG1lbnUtPndGbGFncyB8PSBNRl9TWVNNRU5VfE1GX1BPUFVQOwotICAgIGRwcmludGZfbWVudShzdGRkZWIsIkNvcHlTeXNNZW51IGhNZW51PSUwNFggIVxuIiwgaE1lbnUpOworICAgIGRwcmludGZfbWVudShzdGRkZWIsIkNvcHlTeXNNZW51IGhNZW51PSJOUEZNVCIgIVxuIiwgaE1lbnUpOwogICAgIHJldHVybiBoTWVudTsKIH0KIApkaWZmIC0tZ2l0IGEvY29udHJvbHMvc2Nyb2xsLmMgYi9jb250cm9scy9zY3JvbGwuYwppbmRleCAyMzBiN2I0Li41MDdjODk3IDEwMDY0NAotLS0gYS9jb250cm9scy9zY3JvbGwuYworKysgYi9jb250cm9scy9zY3JvbGwuYwpAQCAtMzUzLDggKzM1MywxNCBAQAogICAgIHsKICAgICAgICAgaWYgKG5CYXIgPT0gU0JfQ1RMKSAgLyogT25seSBzY3JvbGxiYXIgY29udHJvbHMgc2VuZCBXTV9DVExDT0xPUiAqLwogICAgICAgICB7CisjaWZkZWYgV0lORUxJQjMyCisgICAgICAgICAgICBIQlJVU0ggaGJydXNoID0gKEhCUlVTSClTZW5kTWVzc2FnZSggR2V0UGFyZW50KGh3bmQpLCAKKwkJCQkJCSBXTV9DVExDT0xPUlNDUk9MTEJBUiwKKwkJCQkJCSAoV1BBUkFNKWhkYywgKExQQVJBTSlod25kICk7CisjZWxzZQogICAgICAgICAgICAgSEJSVVNIIGhicnVzaCA9IFNlbmRNZXNzYWdlKCBHZXRQYXJlbnQoaHduZCksIFdNX0NUTENPTE9SLCBoZGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKGh3bmQsIENUTENPTE9SX1NDUk9MTEJBUikgKTsKKyNlbmRpZgogICAgICAgICAgICAgU2VsZWN0T2JqZWN0KCBoZGMsIGhicnVzaCApOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgU2VsZWN0T2JqZWN0KCBoZGMsIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hTY3JvbGxiYXIgKTsKQEAgLTUwNiw5ICs1MTIsMTUgQEAKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm47CiAgICAgfQorI2lmZGVmIFdJTkVMSUIzMgorICAgIFNlbmRNZXNzYWdlKCBHZXRQYXJlbnQoaHduZCksCisgICAgICAgICAgICAgICAgICh3bmRQdHItPmR3U3R5bGUgJiBTQlNfVkVSVCkgPyBXTV9WU0NST0xMIDogV01fSFNDUk9MTCwKKyAgICAgICAgICAgICAgICAgKFdQQVJBTSltc2csIChMUEFSQU0paHduZCApOworI2Vsc2UKICAgICBTZW5kTWVzc2FnZSggR2V0UGFyZW50KGh3bmQpLAogICAgICAgICAgICAgICAgICAod25kUHRyLT5kd1N0eWxlICYgU0JTX1ZFUlQpID8gV01fVlNDUk9MTCA6IFdNX0hTQ1JPTEwsCiAgICAgICAgICAgICAgICAgIG1zZywgTUFLRUxPTkcoIDAsIGh3bmQgKSk7CisjZW5kaWYKIH0KIAogCkBAIC01ODAsNyArNTkyLDcgQEAKICAgICAgICAgICByZXR1cm47ICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCiAgICAgfQogCi0gICAgZHByaW50Zl9zY3JvbGwoIHN0ZGRlYiwgIlNjcm9sbEJhciBFdmVudDogaHduZD0leCBiYXI9JWQgbXNnPSV4IHB0PSVkLCVkIGhpdD0lZFxuIiwKKyAgICBkcHJpbnRmX3Njcm9sbCggc3RkZGViLCAiU2Nyb2xsQmFyIEV2ZW50OiBod25kPSJOUEZNVCIgYmFyPSVkIG1zZz0leCBwdD0lZCwlZCBoaXQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIGh3bmQsIG5CYXIsIG1zZywgcHQueCwgcHQueSwgaGl0dGVzdCApOwogCiAgICAgc3dpdGNoKHRyYWNrSGl0VGVzdCkKQEAgLTU5OCw4ICs2MTAsMTMgQEAKICAgICAgICAgICAgICAgICBTZXRTeXN0ZW1UaW1lciggaHduZCwgU0NST0xMX1RJTUVSLCAobXNnID09IFdNX0xCVVRUT05ET1dOKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDUk9MTF9GSVJTVF9ERUxBWSA6IFNDUk9MTF9SRVBFQVRfREVMQVksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGQVJQUk9DKTAgKTsKKyNpZmRlZiBXSU5FTElCMzIKKyAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZSggaHduZE93bmVyLCB2ZXJ0aWNhbCA/IFdNX1ZTQ1JPTEwgOiBXTV9IU0NST0xMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNKVNCX0xJTkVVUCwgKExQQVJBTSlod25kQ3RsICk7CisjZWxzZQogICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlKCBod25kT3duZXIsIHZlcnRpY2FsID8gV01fVlNDUk9MTCA6IFdNX0hTQ1JPTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCX0xJTkVVUCwgTUFLRUxPTkcoIDAsIGh3bmRDdGwgKSk7CisjZW5kaWYKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlIEtpbGxTeXN0ZW1UaW1lciggaHduZCwgU0NST0xMX1RJTUVSICk7CkBAIC02MTYsOCArNjMzLDEzIEBACiAgICAgICAgICAgICAgICAgU2V0U3lzdGVtVGltZXIoIGh3bmQsIFNDUk9MTF9USU1FUiwgKG1zZyA9PSBXTV9MQlVUVE9ORE9XTikgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ1JPTExfRklSU1RfREVMQVkgOiBTQ1JPTExfUkVQRUFUX0RFTEFZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRkFSUFJPQykwICk7CisjaWZkZWYgV0lORUxJQjMyCisgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIGh3bmRPd25lciwgdmVydGljYWwgPyBXTV9WU0NST0xMIDogV01fSFNDUk9MTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTSlTQl9QQUdFVVAsIChMUEFSQU0paHduZEN0bCApOworI2Vsc2UKICAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZSggaHduZE93bmVyLCB2ZXJ0aWNhbCA/IFdNX1ZTQ1JPTEwgOiBXTV9IU0NST0xMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQl9QQUdFVVAsIE1BS0VMT05HKCAwLCBod25kQ3RsICkpOworI2VuZGlmCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBLaWxsU3lzdGVtVGltZXIoIGh3bmQsIFNDUk9MTF9USU1FUiApOwpAQCAtNjQ1LDggKzY2NywxMyBAQAogICAgICAgICAgICAgICAgIGxhc3RNb3VzZVBvcyA9IHBvczsKICAgICAgICAgICAgICAgICB2YWwgPSBTQ1JPTExfR2V0VGh1bWJWYWwoIGluZm9QdHIsICZyZWN0LCB2ZXJ0aWNhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrVGh1bWJQb3MgKyBsYXN0TW91c2VQb3MgLSBsYXN0Q2xpY2tQb3MgKTsKKyNpZmRlZiBXSU5FTElCMzIKKyAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZSggaHduZE93bmVyLCB2ZXJ0aWNhbCA/IFdNX1ZTQ1JPTEwgOiBXTV9IU0NST0xMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFV1BBUkFNKFNCX1RIVU1CVFJBQ0ssdmFsKSwgKExQQVJBTSlod25kQ3RsICk7CisjZWxzZQogICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlKCBod25kT3duZXIsIHZlcnRpY2FsID8gV01fVlNDUk9MTCA6IFdNX0hTQ1JPTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCX1RIVU1CVFJBQ0ssIE1BS0VMT05HKCB2YWwsIGh3bmRDdGwgKSk7CisjZW5kaWYKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBicmVhazsKQEAgLTY2Miw4ICs2ODksMTMgQEAKICAgICAgICAgICAgICAgICBTZXRTeXN0ZW1UaW1lciggaHduZCwgU0NST0xMX1RJTUVSLCAobXNnID09IFdNX0xCVVRUT05ET1dOKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDUk9MTF9GSVJTVF9ERUxBWSA6IFNDUk9MTF9SRVBFQVRfREVMQVksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGQVJQUk9DKTAgKTsKKyNpZmRlZiBXSU5FTElCMzIKKyAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZSggaHduZE93bmVyLCB2ZXJ0aWNhbCA/IFdNX1ZTQ1JPTEwgOiBXTV9IU0NST0xMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNKVNCX1BBR0VET1dOLCAoTFBBUkFNKWh3bmRDdGwgKTsKKyNlbHNlCiAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIGh3bmRPd25lciwgdmVydGljYWwgPyBXTV9WU0NST0xMIDogV01fSFNDUk9MTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JfUEFHRURPV04sIE1BS0VMT05HKCAwLCBod25kQ3RsICkpOworI2VuZGlmCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBLaWxsU3lzdGVtVGltZXIoIGh3bmQsIFNDUk9MTF9USU1FUiApOwpAQCAtNjc5LDggKzcxMSwxMyBAQAogICAgICAgICAgICAgICAgIFNldFN5c3RlbVRpbWVyKCBod25kLCBTQ1JPTExfVElNRVIsIChtc2cgPT0gV01fTEJVVFRPTkRPV04pID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NST0xMX0ZJUlNUX0RFTEFZIDogU0NST0xMX1JFUEVBVF9ERUxBWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZBUlBST0MpMCApOworI2lmZGVmIFdJTkVMSUIzMgorICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlKCBod25kT3duZXIsIHZlcnRpY2FsID8gV01fVlNDUk9MTCA6IFdNX0hTQ1JPTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXUEFSQU0pU0JfTElORURPV04sIChMUEFSQU0paHduZEN0bCApOworI2Vsc2UKICAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZSggaHduZE93bmVyLCB2ZXJ0aWNhbCA/IFdNX1ZTQ1JPTEwgOiBXTV9IU0NST0xMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQl9MSU5FRE9XTiwgTUFLRUxPTkcoIDAsIGh3bmRDdGwgKSk7CisjZW5kaWYKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlIEtpbGxTeXN0ZW1UaW1lciggaHduZCwgU0NST0xMX1RJTUVSICk7CkBAIC02OTMsMTIgKzczMCwyMiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBVSU5UIHZhbCA9IFNDUk9MTF9HZXRUaHVtYlZhbCggaW5mb1B0ciwgJnJlY3QsIHZlcnRpY2FsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tUaHVtYlBvcyArIGxhc3RNb3VzZVBvcyAtIGxhc3RDbGlja1BvcyApOworI2lmZGVmIFdJTkVMSUIzMgorICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIGh3bmRPd25lciwgdmVydGljYWwgPyBXTV9WU0NST0xMIDogV01fSFNDUk9MTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFV1BBUkFNKFNCX1RIVU1CUE9TSVRJT04sdmFsKSwgKExQQVJBTSlod25kQ3RsICk7CisjZWxzZQogICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIGh3bmRPd25lciwgdmVydGljYWwgPyBXTV9WU0NST0xMIDogV01fSFNDUk9MTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBTQl9USFVNQlBPU0lUSU9OLCBNQUtFTE9ORyggdmFsLCBod25kQ3RsICkgKTsKKyNlbmRpZgogICAgICAgICB9CiAgICAgICAgIGVsc2UKKyNpZmRlZiBXSU5FTElCMzIKKyAgICAgICAgICAgIFNlbmRNZXNzYWdlKCBod25kT3duZXIsIHZlcnRpY2FsID8gV01fVlNDUk9MTCA6IFdNX0hTQ1JPTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTSlTQl9FTkRTQ1JPTEwsIChMUEFSQU0paHduZEN0bCApOworI2Vsc2UKICAgICAgICAgICAgIFNlbmRNZXNzYWdlKCBod25kT3duZXIsIHZlcnRpY2FsID8gV01fVlNDUk9MTCA6IFdNX0hTQ1JPTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgU0JfRU5EU0NST0xMLCBNQUtFTE9ORyggMCwgaHduZEN0bCApICk7CisjZW5kaWYKICAgICAgICAgdHJhY2tIaXRUZXN0ID0gU0NST0xMX05PV0hFUkU7ICAvKiBUZXJtaW5hdGUgdHJhY2tpbmcgKi8KICAgICB9CiAKQEAgLTc0Niw3ICs3OTMsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmICghaFVwQXJyb3cpIFNDUk9MTF9Mb2FkQml0bWFwcygpOwotICAgICAgICBkcHJpbnRmX3Njcm9sbCggc3RkZGViLCAiU2Nyb2xsQmFyIGNyZWF0aW9uLCBod25kPSVkXG4iLCBod25kICk7CisgICAgICAgIGRwcmludGZfc2Nyb2xsKCBzdGRkZWIsICJTY3JvbGxCYXIgY3JlYXRpb24sIGh3bmQ9Ik5QRk1UIlxuIiwgaHduZCApOwogICAgICAgICByZXR1cm4gMDsKIAkKICAgICBjYXNlIFdNX0xCVVRUT05ET1dOOgpAQCAtODIyLDcgKzg2OSw3IEBACiAKICAgICBpZiAoIShpbmZvUHRyID0gU0NST0xMX0dldFNjcm9sbEluZm8oIGh3bmQsIG5CYXIgKSkpIHJldHVybjsKIAotICAgIGRwcmludGZfc2Nyb2xsKCBzdGRkZWIsIlNldFNjcm9sbFJhbmdlIGh3bmQ9JXggYmFyPSVkIG1pbj0lZCBtYXg9JWRcbiIsCisgICAgZHByaW50Zl9zY3JvbGwoIHN0ZGRlYiwiU2V0U2Nyb2xsUmFuZ2UgaHduZD0iTlBGTVQiIGJhcj0lZCBtaW49JWQgbWF4PSVkXG4iLAogICAgICAgICAgICAgICAgICAgICBod25kLCBuQmFyLCBNaW5WYWwsIE1heFZhbCApOwogCiAgICAgICAvKiBJbnZhbGlkIHJhbmdlIC0+IHJhbmdlIGlzIHNldCB0byAoMCwwKSAqLwpAQCAtODYwLDcgKzkwNyw3IEBACiAgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogCiAgICAgaWYgKCF3bmRQdHIpIHJldHVybjsKLSAgICBkcHJpbnRmX3Njcm9sbCggc3RkZGViLCAiU2hvd1Njcm9sbEJhcjogaHduZD0leCBiYXI9JWQgb249JWRcbiIsIGh3bmQsIHdCYXIsIGZTaG93ICk7CisgICAgZHByaW50Zl9zY3JvbGwoIHN0ZGRlYiwgIlNob3dTY3JvbGxCYXI6IGh3bmQ9Ik5QRk1UIiBiYXI9JWQgb249JWRcbiIsIGh3bmQsIHdCYXIsIGZTaG93ICk7CiAKICAgICBzd2l0Y2god0JhcikKICAgICB7CkBAIC05MjYsNyArOTczLDcgQEAKICAgICBIREMgaGRjOwogCiAgICAgaWYgKCEoaW5mb1B0ciA9IFNDUk9MTF9HZXRTY3JvbGxJbmZvKCBod25kLCBuQmFyICkpKSByZXR1cm4gRkFMU0U7Ci0gICAgZHByaW50Zl9zY3JvbGwoIHN0ZGRlYiwgIkVuYWJsZVNjcm9sbEJhcjogJXggJWQgJWRcbiIsIGh3bmQsIG5CYXIsIGZsYWdzICk7CisgICAgZHByaW50Zl9zY3JvbGwoIHN0ZGRlYiwgIkVuYWJsZVNjcm9sbEJhcjogIk5QRk1UIiAlZCAlZFxuIiwgaHduZCwgbkJhciwgZmxhZ3MgKTsKICAgICBmbGFncyAmPSBFU0JfRElTQUJMRV9CT1RIOwogICAgIGlmIChpbmZvUHRyLT5mbGFncyA9PSBmbGFncykgcmV0dXJuIEZBTFNFOwogICAgIGluZm9QdHItPmZsYWdzID0gZmxhZ3M7CmRpZmYgLS1naXQgYS9jb250cm9scy9zdGF0aWMuYyBiL2NvbnRyb2xzL3N0YXRpYy5jCmluZGV4IGIwYzM3ZWMuLmI4OGRkMmYgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3N0YXRpYy5jCisrKyBiL2NvbnRyb2xzL3N0YXRpYy5jCkBAIC0xMSw3ICsxMSw2IEBACiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgInN0YXRpYy5oIgotI2luY2x1ZGUgImljb24uaCIKIAogZXh0ZXJuIHZvaWQgREVGV05EX1NldFRleHQoIEhXTkQgaHduZCwgTFBTVFIgdGV4dCApOyAgLyogd2luZG93cy9kZWZ3bmQuYyAqLwogCkBAIC02MCw5ICs1OSw4IEBACiAgICAgaW5mb1B0ci0+aEljb24gPSBoaWNvbjsKICAgICBpZiAoaGljb24pCiAgICAgewotICAgICAgICBJQ09OQUxMT0MgKmljb24gPSAoSUNPTkFMTE9DICopIEdsb2JhbExvY2soIGhpY29uICk7Ci0gICAgICAgIFNldFdpbmRvd1BvcyggaHduZCwgMCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgIGljb24tPmRlc2NyaXB0b3IuV2lkdGgsIGljb24tPmRlc2NyaXB0b3IuSGVpZ2h0LAorICAgICAgICBDVVJTT1JJQ09OSU5GTyAqaW5mbyA9IChDVVJTT1JJQ09OSU5GTyAqKSBHbG9iYWxMb2NrKCBoaWNvbiApOworICAgICAgICBTZXRXaW5kb3dQb3MoIGh3bmQsIDAsIDAsIDAsIGluZm8tPm5XaWR0aCwgaW5mby0+bkhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgIFNXUF9OT0FDVElWQVRFIHwgU1dQX05PTU9WRSB8IFNXUF9OT1pPUkRFUiApOwogICAgICAgICBHbG9iYWxVbmxvY2soIGhpY29uICk7CiAgICAgfQpAQCAtNzIsNyArNzAsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU3RhdGljV25kUHJvYwogICovCi1MT05HIFN0YXRpY1duZFByb2MoSFdORCBoV25kLCBXT1JEIHVNc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK0xPTkcgU3RhdGljV25kUHJvYyhIV05EIGhXbmQsIFVJTlQgdU1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKIAlMT05HIGxSZXN1bHQgPSAwOwogCVdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7CkBAIC0xNDQsNyArMTQyLDcgQEAKIAogICAgICAgICBjYXNlIFdNX1NFVEZPTlQ6CiAgICAgICAgICAgICBpZiAoc3R5bGUgPT0gU1NfSUNPTikgcmV0dXJuIDA7Ci0gICAgICAgICAgICBpbmZvUHRyLT5oRm9udCA9IHdQYXJhbTsKKyAgICAgICAgICAgIGluZm9QdHItPmhGb250ID0gKEhGT05UKXdQYXJhbTsKICAgICAgICAgICAgIGlmIChMT1dPUkQobFBhcmFtKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBJbnZhbGlkYXRlUmVjdCggaFduZCwgTlVMTCwgRkFMU0UgKTsKQEAgLTE1Myw3ICsxNTEsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBXTV9HRVRGT05UOgotICAgICAgICAgICAgcmV0dXJuIGluZm9QdHItPmhGb250OworICAgICAgICAgICAgcmV0dXJuIChMT05HKWluZm9QdHItPmhGb250OwogCiAJY2FzZSBXTV9OQ0hJVFRFU1Q6CiAJICAgIHJldHVybiBIVFRSQU5TUEFSRU5UOwpAQCAtMTYyLDEwICsxNjAsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBETEdDX1NUQVRJQzsKIAogCWNhc2UgU1RNX0dFVElDT046Ci0JICAgIHJldHVybiBpbmZvUHRyLT5oSWNvbjsKKwkgICAgcmV0dXJuIChMT05HKWluZm9QdHItPmhJY29uOwogCiAJY2FzZSBTVE1fU0VUSUNPTjoKLSAgICAgICAgICAgIFNUQVRJQ19TZXRJY29uKCBoV25kLCB3UGFyYW0gKTsKKyAgICAgICAgICAgIFNUQVRJQ19TZXRJY29uKCBoV25kLCAoSElDT04pd1BhcmFtICk7CiAgICAgICAgICAgICBJbnZhbGlkYXRlUmVjdCggaFduZCwgTlVMTCwgRkFMU0UgKTsKICAgICAgICAgICAgIFVwZGF0ZVdpbmRvdyggaFduZCApOwogCSAgICByZXR1cm4gMDsKQEAgLTIyMyw4ICsyMjEsMTMgQEAKIAl3Rm9ybWF0IHw9IERUX05PUFJFRklYOwogCiAgICAgaWYgKGluZm9QdHItPmhGb250KSBTZWxlY3RPYmplY3QoIGhkYywgaW5mb1B0ci0+aEZvbnQgKTsKKyNpZmRlZiBXSU5FTElCMzIKKyAgICBoQnJ1c2ggPSAoSEJSVVNIKVNlbmRNZXNzYWdlKCB3bmRQdHItPmh3bmRQYXJlbnQsIFdNX0NUTENPTE9SU1RBVElDLAorCQkJCSAgKFdQQVJBTSloZGMsIChMUEFSQU0paHduZCApOworI2Vsc2UKICAgICBoQnJ1c2ggPSBTZW5kTWVzc2FnZSggd25kUHRyLT5od25kUGFyZW50LCBXTV9DVExDT0xPUiwgKFdPUkQpaGRjLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyhod25kLCBDVExDT0xPUl9TVEFUSUMpKTsKKyNlbmRpZgogICAgIGlmIChoQnJ1c2ggPT0gKEhCUlVTSClOVUxMKSBoQnJ1c2ggPSBHZXRTdG9ja09iamVjdChXSElURV9CUlVTSCk7CiAgICAgRmlsbFJlY3QoaGRjLCAmcmMsIGhCcnVzaCk7CiAgICAgaWYgKHRleHQpCkBAIC0yODEsOCArMjg0LDEzIEBACiAgICAgU1RBVElDSU5GTyAqaW5mb1B0ciA9IChTVEFUSUNJTkZPICopd25kUHRyLT53RXh0cmE7CiAKICAgICBHZXRDbGllbnRSZWN0KGh3bmQsICZyYyk7CisjaWZkZWYgV0lORUxJQjMyCisgICAgaGJydXNoID0gKEhCUlVTSClTZW5kTWVzc2FnZSggd25kUHRyLT5od25kUGFyZW50LCBXTV9DVExDT0xPUlNUQVRJQywgCisJCQkJICAoV1BBUkFNKWhkYywgKExQQVJBTSlod25kICk7CisjZWxzZQogICAgIGhicnVzaCA9IFNlbmRNZXNzYWdlKCB3bmRQdHItPmh3bmRQYXJlbnQsIFdNX0NUTENPTE9SLCBoZGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKGh3bmQsIENUTENPTE9SX1NUQVRJQykpOworI2VuZGlmCiAgICAgRmlsbFJlY3QoIGhkYywgJnJjLCBoYnJ1c2ggKTsKICAgICBpZiAoaW5mb1B0ci0+aEljb24pIERyYXdJY29uKCBoZGMsIHJjLmxlZnQsIHJjLnRvcCwgaW5mb1B0ci0+aEljb24gKTsKIH0KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3dpZGdldHMuYyBiL2NvbnRyb2xzL3dpZGdldHMuYwppbmRleCAzNGQ2NzhhLi41NTU5ZGQxIDEwMDY0NAotLS0gYS9jb250cm9scy93aWRnZXRzLmMKKysrIGIvY29udHJvbHMvd2lkZ2V0cy5jCkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgIERXT1JEIFdpbmVQcm9jLFdpbjE2UHJvYyxXaW4zMlByb2M7CiAgICAgICAgIC8qIGN1cnJlbnRseSwgdGhlcmUgaXMgbm8gd2F5IHRvIGdldCB0aGUgJ3JlYWwnIHBvaW50ZXIgYXQgcnVuIHRpbWUgKi8KICAgICAgICAgV2luZVByb2M9MDsKLSAgICAgICAgV2luMTZQcm9jID0gR2V0V25kUHJvY0VudHJ5MTYoIChjaGFyICopY2xhc3MtPmxwZm5XbmRQcm9jICk7CisgICAgICAgIFdpbjE2UHJvYyA9IChEV09SRClHZXRXbmRQcm9jRW50cnkxNiggKGNoYXIgKiljbGFzcy0+bHBmblduZFByb2MgKTsKICAgICAgICAgV2luMzJQcm9jID0gKERXT1JEKVJFTEFZMzJfR2V0RW50cnlQb2ludCgKICAgICAgICAgICAgICAiV0lOUFJPQ1MzMiIsKGNoYXIgKiljbGFzcy0+bHBmblduZFByb2MsIDApOwogICAgICAgICAvKiBSZWdpc3RlciB0aGUgYWxpYXMgc28gd2UgZG9uJ3QgcGFzcyBXaW4xNiBwb2ludGVycyB0byBXaW4zMiBhcHBzICovCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9JbWFrZWZpbGUgYi9kZWJ1Z2dlci9JbWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NmE5YzcuLjAwMDAwMDAKLS0tIGEvZGVidWdnZXIvSW1ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotI2luY2x1ZGUgIi4uL1dpbmUudG1wbCIKLQotI2RlZmluZSBJSGF2ZVN1YmRpcnMKLSNkZWZpbmUJUGFzc0NEZWJ1Z0ZsYWdzICdDREVCVUdGTEFHUz0kKENERUJVR0ZMQUdTKScgJ0NDPSQoQ0MpJyAnTUFLRT0kKE1BS0UpJ1wKLQkJCSdMRD0kKExEKScKLQotTU9EVUxFID0gZGVidWdnZXIKLQotU1VCRElSUyA9IHJlYWRsaW5lCi0KLURFRklORVMgPSAtRFVTRV9SRUFETElORQotCi1TUkNTID0gXAotCWJyZWFrLmMgXAotCWRiX2Rpc2FzbS5jIFwKLQlkYmcudGFiLmMgXAotCWhhc2guYyBcCi0JaW5mby5jIFwKLQlsZXgueXkuYyBcCi0JbWVtb3J5LmMgXAotCXJlZ2lzdGVycy5jIFwKLQlzdGFjay5jCi0KLVNVQkRJUlNfT0JKUyA9IHJlYWRsaW5lL3JlYWRsaW5lLm8KLQotT0JKUyA9ICQoU1JDUzouYz0ubykgJChTVUJESVJTX09CSlMpCi0KLS8qCi0gKiBBbGwgdGhlIFNVQkRJUiBzdHVmZgotICovCi1NYWtlU3ViZGlycygkKFNVQkRJUlMpKQotRGVwZW5kU3ViZGlycygkKFNVQkRJUlMpKQotCi0vKgotICogVGhlIG1haW4gYWN0Ci0gKi8KLVdpbmVSZWxvY2F0YWJsZVRhcmdldCgkKE1PRFVMRSksLCQoT0JKUykpCi0KLWRlcGVuZDo6IGRiZy50YWIuYyBkYmcudGFiLmggbGV4Lnl5LmMKLQotRGVwZW5kVGFyZ2V0KCkKLQotaW5jbHVkZXM6OgotCi1pbnN0YWxsOjoKLQotY2xlYW46OgotCSQoUk0pIGxleC55eS5jIGRiZy50YWIqIHkudGFiLmMKLQotZGJnLnRhYi5jIGRiZy50YWIuaDogZGJnLnkKLQkkKFlBQ0MpIC1iIGRiZyAtZCBkYmcueQotCi1sZXgueXkuYzogZGVidWcubAotCSQoTEVYKSAtSSBkZWJ1Zy5sCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9icmVhay5jIGIvZGVidWdnZXIvYnJlYWsuYwppbmRleCA0NDA2YjJmLi44ZTlmYmI4IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9icmVhay5jCisrKyBiL2RlYnVnZ2VyL2JyZWFrLmMKQEAgLTE0Miw4ICsxNDIsMTUgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0JSRUFLUE9JTlRTOyBpKyspCiAgICAgewogICAgICAgICBpZiAoYnJlYWtwb2ludHNbaV0uaW5fdXNlICYmIGJyZWFrcG9pbnRzW2ldLmVuYWJsZWQpCi0gICAgICAgICAgICBERUJVR19TZXRPcGNvZGUoICZicmVha3BvaW50c1tpXS5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgPyBJTlQzIDogYnJlYWtwb2ludHNbaV0ub3Bjb2RlICk7CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChERUJVR19Jc0JhZFdyaXRlUHRyKCAmYnJlYWtwb2ludHNbaV0uYWRkciwgMSApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkludmFsaWQgYWRkcmVzcyBmb3IgYnJlYWtwb2ludCAlZCwgZGlzYWJsaW5nIGl0XG4iLCBpICk7CisgICAgICAgICAgICAgICAgYnJlYWtwb2ludHNbaV0uZW5hYmxlZCA9IEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBERUJVR19TZXRPcGNvZGUoICZicmVha3BvaW50c1tpXS5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCA/IElOVDMgOiBicmVha3BvaW50c1tpXS5vcGNvZGUgKTsKKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMTkzLDYgKzIwMCw3IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CisgICAgaWYgKCFEQkdfQ0hFQ0tfUkVBRF9QVFIoICZhZGRyLCAxICkpIHJldHVybjsKICAgICBwID0gREJHX0FERFJfVE9fTElOKCAmYWRkciApOwogICAgIGJyZWFrcG9pbnRzW251bV0uYWRkciAgICA9IGFkZHI7CiAgICAgYnJlYWtwb2ludHNbbnVtXS5hZGRybGVuID0gIWFkZHIuc2VnID8gMzIgOgpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvZGJnLnkgYi9kZWJ1Z2dlci9kYmcueQppbmRleCA1YWE2NzgwLi43ZWI1YTU4IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9kYmcueQorKysgYi9kZWJ1Z2dlci9kYmcueQpAQCAtNTEsNyArNTEsNiBAQAogCXwgaW5wdXQgbGluZSAgeyBpc3N1ZV9wcm9tcHQoKTsgfQogCiAgbGluZToJCSdcbicKLQl8IGluZm9jbWQgJ1xuJwogCXwgZXJyb3IgJ1xuJyAgICAgICB7IHl5ZXJyb2s7IH0KIAl8IFFVSVQgICdcbicgICAgICAgeyBleGl0KDApOyB9CiAJfCBIRUxQICAnXG4nICAgICAgIHsgREVCVUdfSGVscCgpOyB9CkBAIC03Miw2ICs3MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgfCBERUxFVEUgQlJFQUsgTlVNICdcbicgeyBERUJVR19EZWxCcmVha3BvaW50KCAkMyApOyB9CiAJfCBCQUNLVFJBQ0UgJ1xuJyAgICAgICAgeyBERUJVR19CYWNrVHJhY2UoKTsgfQorCXwgaW5mb2NtZAogCXwgeF9jb21tYW5kCiAJfCBwcmludF9jb21tYW5kCiAJfCBkZXBvc2l0X2NvbW1hbmQKQEAgLTExMywxMCArMTEzLDExIEBACiAJfCAnKCcgZXhwciAnKScJCXsgJCQgPSAkMjsgfQogCXwgJyonIGFkZHIJCXsgJCQgPSBERUJVR19SZWFkTWVtb3J5KCAmJDIgKTsgfQogCQotIGluZm9jbWQ6IElORk8gUkVHUyAgICAgeyBERUJVR19JbmZvUmVnaXN0ZXJzKCk7IH0KLQl8IElORk8gU1RBQ0sgICAgeyBERUJVR19JbmZvU3RhY2soKTsgfQotCXwgSU5GTyBCUkVBSyAgICB7IERFQlVHX0luZm9CcmVha3BvaW50cygpOyB9Ci0JfCBJTkZPIFNFR01FTlRTIHsgTERUX1ByaW50KCk7IH0KKyBpbmZvY21kOiBJTkZPIFJFR1MgJ1xuJyAgICAgICAgICB7IERFQlVHX0luZm9SZWdpc3RlcnMoKTsgfQorCXwgSU5GTyBTVEFDSyAnXG4nICAgICAgICAgeyBERUJVR19JbmZvU3RhY2soKTsgfQorCXwgSU5GTyBCUkVBSyAnXG4nICAgICAgICAgeyBERUJVR19JbmZvQnJlYWtwb2ludHMoKTsgfQorCXwgSU5GTyBTRUdNRU5UUyAnXG4nICAgICAgeyBMRFRfUHJpbnQoIDAsIC0xICk7IH0KKyAgICAgICAgfCBJTkZPIFNFR01FTlRTIGV4cHIgJ1xuJyB7IExEVF9QcmludCggU0VMRUNUT1JfVE9fRU5UUlkoJDMpLCAxICk7IH0KIAogCiAlJQpAQCAtMTYyLDkgKzE2Myw5IEBACiAgICAgewogICAgICAgICBEQkdfQUREUiBhZGRyOwogCi0gICAgICAgIGFkZHIuc2VnID0gKENTX3JlZyhERUJVR19jb250ZXh0KSA9PSBXSU5FX0NPREVfU0VMRUNUT1IpID8KLSAgICAgICAgICAgICAgICAgICAgMCA6IENTX3JlZyhERUJVR19jb250ZXh0KTsKKyAgICAgICAgYWRkci5zZWcgPSBDU19yZWcoREVCVUdfY29udGV4dCk7CiAgICAgICAgIGFkZHIub2ZmID0gRUlQX3JlZyhERUJVR19jb250ZXh0KTsKKyAgICAgICAgREJHX0ZJWF9BRERSX1NFRyggJmFkZHIsIDAgKTsKIAogICAgICAgICBpZiAoIWFkZHIuc2VnKSBuZXdtb2RlID0gMzI7CiAgICAgICAgIGVsc2UgbmV3bW9kZSA9IChHRVRfU0VMX0ZMQUdTKGFkZHIuc2VnKSAmIExEVF9GTEFHU18zMkJJVCkgPyAzMiA6IDE2OwpAQCAtMTc1LDEzICsxNzYsMjIgQEAKICAgICAgICAgLyogU2hvdyB3aGVyZSB3ZSBjcmFzaGVkICovCiAgICAgICAgIERFQlVHX1ByaW50QWRkcmVzcyggJmFkZHIsIGRiZ19tb2RlICk7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCI6ICAiKTsKLSAgICAgICAgREVCVUdfRGlzYXNtKCAmYWRkciApOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKLSAgICAgICAgaW5zdHJfbGVuID0gYWRkci5vZmYgLSBFSVBfcmVnKERFQlVHX2NvbnRleHQpOwotICAgICAgICAKLSAgICAgICAgaXNzdWVfcHJvbXB0KCk7Ci0gICAgICAgIHl5cGFyc2UoKTsKLSAgICAgICAgZmx1c2hfc3ltYm9scygpOworICAgICAgICBpZiAoREJHX0NIRUNLX1JFQURfUFRSKCAmYWRkciwgMSApKQorICAgICAgICB7CisgICAgICAgICAgICBERUJVR19EaXNhc20oICZhZGRyICk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKyAgICAgICAgICAgIGluc3RyX2xlbiA9IGFkZHIub2ZmIC0gRUlQX3JlZyhERUJVR19jb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGlzc3VlX3Byb21wdCgpOworICAgICAgICAgICAgeXlwYXJzZSgpOworICAgICAgICAgICAgZmx1c2hfc3ltYm9scygpOworICAgICAgICAgICAgYWRkci5zZWcgPSBDU19yZWcoREVCVUdfY29udGV4dCk7CisgICAgICAgICAgICBhZGRyLm9mZiA9IEVJUF9yZWcoREVCVUdfY29udGV4dCk7CisgICAgICAgICAgICBEQkdfRklYX0FERFJfU0VHKCAmYWRkciwgMCApOworICAgICAgICB9IHdoaWxlICghREJHX0NIRUNLX1JFQURfUFRSKCAmYWRkciwgMSApKTsKICAgICB9CiAKICAgICBERUJVR19SZXN0YXJ0RXhlY3V0aW9uKCByZWdzLCBkYmdfZXhlY19tb2RlLCBpbnN0cl9sZW4gKTsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2RlYnVnLmwgYi9kZWJ1Z2dlci9kZWJ1Zy5sCmluZGV4IDI5MzIxZTcuLmVmMTQyZWQgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2RlYnVnLmwKKysrIGIvZGVidWdnZXIvZGVidWcubApAQCAtNzMsNyArNzMsNyBAQAogJHNzICAgICB7IHl5bHZhbC5yZWcgPSBSRUdfU1M7ICByZXR1cm4gUkVHOyB9CiAKIGluZm98aW5mfGluCQkgICAgICB7IHJldHVybiBJTkZPOyB9Ci1zZWdtZW50c3xzZWdtICAgICAgICAgICAgICAgICB7IHJldHVybiBTRUdNRU5UUzsgfQorc2VnbWVudHN8c2VnbWVudHxzZWdtfHNlZ3xzZSAgeyByZXR1cm4gU0VHTUVOVFM7IH0KIGJyZWFrfGJyZWF8YnJlfGJyfGIgICAgICAgICAgIHsgcmV0dXJuIEJSRUFLOyB9CiBlbmFibGV8ZW5hYmx8ZW5hYnxlbmEgICAgICAgICB7IHJldHVybiBFTkFCTEU7fQogZGlzYWJsZXxkaXNhYmx8ZGlzYWJ8ZGlzYXxkaXMgeyByZXR1cm4gRElTQUJMRTsgfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvbWVtb3J5LmMgYi9kZWJ1Z2dlci9tZW1vcnkuYwppbmRleCAyMDZlNTg3Li40OTEwOGMyIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9tZW1vcnkuYworKysgYi9kZWJ1Z2dlci9tZW1vcnkuYwpAQCAtMTEsNiArMTEsNDAgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBERUJVR19Jc0JhZFJlYWRQdHIKKyAqCisgKiBDaGVjayBpZiB3ZSBhcmUgYWxsb3dlZCB0byByZWFkIG1lbW9yeSBhdCAnYWRkcmVzcycuCisgKi8KK0JPT0wgREVCVUdfSXNCYWRSZWFkUHRyKCBjb25zdCBEQkdfQUREUiAqYWRkcmVzcywgaW50IHNpemUgKQoreworICAgIGlmIChhZGRyZXNzLT5zZWcpICAvKiBzZWdtZW50ZWQgYWRkciAqLworICAgICAgICByZXR1cm4gSXNCYWRSZWFkUHRyKCAoU0VHUFRSKU1BS0VMT05HKCAoV09SRClhZGRyZXNzLT5vZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXT1JEKWFkZHJlc3MtPnNlZyApLCBzaXplICk7CisgICAgICAgIC8qIEZJWE1FOiBzaG91bGQgY2hlY2sgaWYgcmVzdWx0aW5nIGxpbmVhciBhZGRyIGlzIHJlYWRhYmxlICovCisgICAgZWxzZSAgLyogbGluZWFyIGFkZHJlc3MgKi8KKyAgICAgICAgcmV0dXJuIEZBTFNFOyAgLyogRklYTUU6IHNob3VsZCBkbyBzb21lIGNoZWNrcyBoZXJlICovCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgREVCVUdfSXNCYWRXcml0ZVB0cgorICoKKyAqIENoZWNrIGlmIHdlIGFyZSBhbGxvd2VkIHRvIHdyaXRlIG1lbW9yeSBhdCAnYWRkcmVzcycuCisgKi8KK0JPT0wgREVCVUdfSXNCYWRXcml0ZVB0ciggY29uc3QgREJHX0FERFIgKmFkZHJlc3MsIGludCBzaXplICkKK3sKKyAgICBpZiAoYWRkcmVzcy0+c2VnKSAgLyogc2VnbWVudGVkIGFkZHIgKi8KKyAgICAgICAgLyogTm90ZTogd2UgdXNlIElzQmFkUmVhZFB0ciBoZXJlIGJlY2F1c2Ugd2UgYXJlICovCisgICAgICAgIC8qIGFsd2F5cyBhbGxvd2VkIHRvIHdyaXRlIHRvIHJlYWQtb25seSBzZWdtZW50cyAqLworICAgICAgICByZXR1cm4gSXNCYWRSZWFkUHRyKCAoU0VHUFRSKU1BS0VMT05HKCAoV09SRClhZGRyZXNzLT5vZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXT1JEKWFkZHJlc3MtPnNlZyApLCBzaXplICk7CisgICAgICAgIC8qIEZJWE1FOiBzaG91bGQgY2hlY2sgaWYgcmVzdWx0aW5nIGxpbmVhciBhZGRyIGlzIHdyaXRhYmxlICovCisgICAgZWxzZSAgLyogbGluZWFyIGFkZHJlc3MgKi8KKyAgICAgICAgcmV0dXJuIEZBTFNFOyAgLyogRklYTUU6IHNob3VsZCBkbyBzb21lIGNoZWNrcyBoZXJlICovCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgREVCVUdfUmVhZE1lbW9yeQogICoKICAqIFJlYWQgYSBtZW1vcnkgdmFsdWUuCkBAIC0yMCw2ICs1NCw3IEBACiAgICAgREJHX0FERFIgYWRkciA9ICphZGRyZXNzOwogCiAgICAgREJHX0ZJWF9BRERSX1NFRyggJmFkZHIsIERTX3JlZyhERUJVR19jb250ZXh0KSApOworICAgIGlmICghREJHX0NIRUNLX1JFQURfUFRSKCAmYWRkciwgc2l6ZW9mKGludCkgKSkgcmV0dXJuIDA7CiAgICAgcmV0dXJuICooaW50ICopREJHX0FERFJfVE9fTElOKCAmYWRkciApOwogfQogCkBAIC0zNCw2ICs2OSw3IEBACiAgICAgREJHX0FERFIgYWRkciA9ICphZGRyZXNzOwogCiAgICAgREJHX0ZJWF9BRERSX1NFRyggJmFkZHIsIERTX3JlZyhERUJVR19jb250ZXh0KSApOworICAgIGlmICghREJHX0NIRUNLX1dSSVRFX1BUUiggJmFkZHIsIHNpemVvZihpbnQpICkpIHJldHVybjsKICAgICAqKGludCAqKURCR19BRERSX1RPX0xJTiggJmFkZHIgKSA9IHZhbHVlOwogfQogCkBAIC01Nyw3ICs5Myw3IEBACiAgICAgaWYgKGZvcm1hdCAhPSAnaScgJiYgY291bnQgPiAxKQogICAgIHsKICAgICAgICAgREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkciwgZGJnX21vZGUgKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIjogICIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiOiAiKTsKICAgICB9CiAKICAgICBwbnQgPSBEQkdfQUREUl9UT19MSU4oICZhZGRyICk7CkBAIC02Niw3ICsxMDIsMTMgQEAKICAgICB7CiAJY2FzZSAncyc6CiAJCWlmIChjb3VudCA9PSAxKSBjb3VudCA9IDI1NjsKLQkgICAgICAgIHdoaWxlKCpwbnQgJiYgY291bnQtLSkgZnB1dGMoICpwbnQrKywgc3RkZXJyICk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIURCR19DSEVDS19SRUFEX1BUUiggJmFkZHIsIHNpemVvZihjaGFyKSApKSByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIGlmICghKnBudCkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGFkZHIub2ZmKys7CisgICAgICAgICAgICAgICAgICAgIGZwdXRjKCAqcG50KyssIHN0ZGVyciApOworICAgICAgICAgICAgICAgIH0KIAkJZnByaW50ZihzdGRlcnIsIlxuIik7CiAJCXJldHVybjsKIApAQCAtNzQsNyArMTE2LDggQEAKIAkJd2hpbGUgKGNvdW50LS0pCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBERUJVR19QcmludEFkZHJlc3MoICZhZGRyLCBkYmdfbW9kZSApOwotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiOiAgIik7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCI6ICIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIURCR19DSEVDS19SRUFEX1BUUiggJmFkZHIsIDEgKSkgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICBERUJVR19EaXNhc20oICZhZGRyICk7CiAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJcbiIpOwogCQl9CkBAIC04MywxMyArMTI2LDE1IEBACiAJCWR1bXAgPSAodW5zaWduZWQgaW50ICopcG50OwogCQlmb3IoaT0wOyBpPGNvdW50OyBpKyspIAogCQl7Ci0JCQlmcHJpbnRmKHN0ZGVyciwiICU4Ljh4IiwgKmR1bXArKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyLm9mZiArPSA0OwotCQkJaWYgKChpICUgOCkgPT0gNykgewotCQkJCWZwcmludGYoc3RkZXJyLCJcbiIpOwotCQkJCURFQlVHX1ByaW50QWRkcmVzcyggJmFkZHIsIGRiZ19tb2RlICk7Ci0JCQkJZnByaW50ZihzdGRlcnIsIjogICIpOwotCQkJfTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFEQkdfQ0hFQ0tfUkVBRF9QVFIoICZhZGRyLCBzaXplb2YoaW50KSApKSByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCIgJTguOHgiLCAqZHVtcCsrKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkci5vZmYgKz0gc2l6ZW9mKGludCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoaSAlIDgpID09IDcpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkciwgZGJnX21vZGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCI6ICIpOworICAgICAgICAgICAgICAgICAgICB9CiAJCX0KIAkJZnByaW50ZihzdGRlcnIsIlxuIik7CiAJCXJldHVybjsKQEAgLTk4LDEzICsxNDMsMTUgQEAKIAkJZHVtcCA9ICh1bnNpZ25lZCBpbnQgKilwbnQ7CiAJCWZvcihpPTA7IGk8Y291bnQ7IGkrKykgCiAJCXsKLQkJCWZwcmludGYoc3RkZXJyLCIgJWQiLCAqZHVtcCsrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIub2ZmICs9IDQ7Ci0JCQlpZiAoKGkgJSA4KSA9PSA3KSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsIlxuIik7Ci0JCQkJREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkciwgZGJnX21vZGUgKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwiOiAgIik7Ci0JCQl9OworICAgICAgICAgICAgICAgICAgICBpZiAoIURCR19DSEVDS19SRUFEX1BUUiggJmFkZHIsIHNpemVvZihpbnQpICkpIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIiAlZCIsICpkdW1wKyspOworICAgICAgICAgICAgICAgICAgICBhZGRyLm9mZiArPSBzaXplb2YoaW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChpICUgOCkgPT0gNykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QcmludEFkZHJlc3MoICZhZGRyLCBkYmdfbW9kZSApOworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIjogIik7CisgICAgICAgICAgICAgICAgICAgIH0KIAkJfQogCQlmcHJpbnRmKHN0ZGVyciwiXG4iKTsKIAkJcmV0dXJuOwpAQCAtMTEzLDEzICsxNjAsMTUgQEAKIAkJd2R1bXAgPSAodW5zaWduZWQgc2hvcnQgKilwbnQ7CiAJCWZvcihpPTA7IGk8Y291bnQ7IGkrKykgCiAJCXsKLQkJCWZwcmludGYoc3RkZXJyLCIgJTA0eCIsICp3ZHVtcCsrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIub2ZmICs9IDI7Ci0JCQlpZiAoKGkgJSA4KSA9PSA3KSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsIlxuIik7Ci0JCQkJREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkciwgZGJnX21vZGUgKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwiOiAgIik7Ci0JCQl9OworICAgICAgICAgICAgICAgICAgICBpZiAoIURCR19DSEVDS19SRUFEX1BUUiggJmFkZHIsIHNpemVvZihzaG9ydCkgKSkgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICUwNHgiLCAqd2R1bXArKyk7CisgICAgICAgICAgICAgICAgICAgIGFkZHIub2ZmICs9IHNpemVvZihzaG9ydCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoaSAlIDgpID09IDcpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkciwgZGJnX21vZGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCI6ICIpOworICAgICAgICAgICAgICAgICAgICB9CiAJCX0KIAkJZnByaW50ZihzdGRlcnIsIlxuIik7CiAJCXJldHVybjsKQEAgLTEyNywxNyArMTc2LDIwIEBACiAJY2FzZSAnYyc6CiAJCWZvcihpPTA7IGk8Y291bnQ7IGkrKykgCiAJCXsKLQkJCWlmKCpwbnQgPCAweDIwKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsIiAgIik7Ci0JCQkJcG50Kys7Ci0JCQl9IGVsc2UKLQkJCQlmcHJpbnRmKHN0ZGVyciwiICVjIiwgKnBudCsrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIub2ZmKys7Ci0JCQlpZiAoKGkgJSAzMikgPT0gMzEpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwiXG4iKTsKLQkJCQlERUJVR19QcmludEFkZHJlc3MoICZhZGRyLCBkYmdfbW9kZSApOwotCQkJCWZwcmludGYoc3RkZXJyLCI6ICAiKTsKLQkJCX07CisgICAgICAgICAgICAgICAgICAgIGlmICghREJHX0NIRUNLX1JFQURfUFRSKCAmYWRkciwgc2l6ZW9mKGNoYXIpICkpIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgaWYoKnBudCA8IDB4MjApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICIpOworICAgICAgICAgICAgICAgICAgICAgICAgcG50Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBmcHJpbnRmKHN0ZGVyciwiICVjIiwgKnBudCsrKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkci5vZmYrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChpICUgMzIpID09IDMxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1ByaW50QWRkcmVzcyggJmFkZHIsIGRiZ19tb2RlICk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiOiAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCQl9CiAJCWZwcmludGYoc3RkZXJyLCJcbiIpOwogCQlyZXR1cm47CkBAIC0xNDUsMTMgKzE5NywxNSBAQAogCWNhc2UgJ2InOgogCQlmb3IoaT0wOyBpPGNvdW50OyBpKyspIAogCQl7Ci0JCQlmcHJpbnRmKHN0ZGVyciwiICUwMngiLCAoKnBudCsrKSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkci5vZmYrKzsKLQkJCWlmICgoaSAlIDE2KSA9PSAxNSkgewotCQkJCWZwcmludGYoc3RkZXJyLCJcbiIpOwotCQkJCURFQlVHX1ByaW50QWRkcmVzcyggJmFkZHIsIGRiZ19tb2RlICk7Ci0JCQkJZnByaW50ZihzdGRlcnIsIjogICIpOwotCQkJfTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFEQkdfQ0hFQ0tfUkVBRF9QVFIoICZhZGRyLCBzaXplb2YoY2hhcikgKSkgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICUwMngiLCAoKnBudCsrKSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBhZGRyLm9mZisrOworICAgICAgICAgICAgICAgICAgICBpZiAoKGkgJSAxNikgPT0gMTUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkciwgZGJnX21vZGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCI6ICIpOworICAgICAgICAgICAgICAgICAgICB9CiAJCX0KIAkJZnByaW50ZihzdGRlcnIsIlxuIik7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL3JlYWRsaW5lL0ltYWtlZmlsZSBiL2RlYnVnZ2VyL3JlYWRsaW5lL0ltYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY3OGJjYi4uMDAwMDAwMAotLS0gYS9kZWJ1Z2dlci9yZWFkbGluZS9JbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jaW5jbHVkZSAiLi4vLi4vV2luZS50bXBsIgotCi1NT0RVTEUgPSByZWFkbGluZQotCi1FWFRSQV9ERUZJTkVTPSAtREFOU0lfQVJST1dTIC1ESEFWRV9UQ0dFVEFUVFIgLURISURFCi0KLVNSQ1MgPSBcCi0JZWRpdGxpbmUuYyBcCi0Jc3lzdW5peC5jCi0KLU9CSlMgPSAkKFNSQ1M6LmM9Lm8pCi0KLVdpbmVSZWxvY2F0YWJsZVRhcmdldCgkKE1PRFVMRSksLCQoT0JKUykpCi1EZXBlbmRUYXJnZXQoKQotCi1pbmNsdWRlczo6Ci0KLWluc3RhbGw6OgpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvc3RhY2suYyBiL2RlYnVnZ2VyL3N0YWNrLmMKaW5kZXggNzNmY2FjZi4uYmU3ZmI5YiAxMDA2NDQKLS0tIGEvZGVidWdnZXIvc3RhY2suYworKysgYi9kZWJ1Z2dlci9zdGFjay5jCkBAIC02Miw0MCArNjIsNDYgQEAKICAgICBEQkdfQUREUiBhZGRyOwogICAgIGludCBmcmFtZW5vID0gMDsKIAotICBmcHJpbnRmKHN0ZGVyciwiQmFja3RyYWNlOlxuIik7Ci0gIGlmIChTU19yZWcoREVCVUdfY29udGV4dCkgPT0gV0lORV9EQVRBX1NFTEVDVE9SKSAgLyogMzItYml0IG1vZGUgKi8KLSAgewotICAgICAgRlJBTUUzMiAqZnJhbWUgPSAoRlJBTUUzMiAqKUVCUF9yZWcoREVCVUdfY29udGV4dCk7Ci0gICAgICBhZGRyLnNlZyA9IDA7Ci0gICAgICB3aGlsZSAoZnJhbWUtPmlwKQotICAgICAgewotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCIlZCAiLGZyYW1lbm8rKyk7Ci0gICAgICAgICAgYWRkci5vZmYgPSBmcmFtZS0+aXA7Ci0gICAgICAgICAgREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkciwgMzIgKTsKLSAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKLSAgICAgICAgICBmcmFtZSA9IChGUkFNRTMyICopZnJhbWUtPmJwOwotICAgICAgfQotICB9Ci0gIGVsc2UgIC8qIDE2LWJpdCBtb2RlICovCi0gIHsKLSAgICAgIEZSQU1FMTYgKmZyYW1lID0gKEZSQU1FMTYgKilQVFJfU0VHX09GRl9UT19MSU4oIFNTX3JlZyhERUJVR19jb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfcmVnKERFQlVHX2NvbnRleHQpICYgfjEgKTsKLSAgICAgIFdPUkQgY3MgPSBDU19yZWcoREVCVUdfY29udGV4dCk7Ci0gICAgICBpZiAoR0VUX1NFTF9GTEFHUyhTU19yZWcoREVCVUdfY29udGV4dCkpICYgTERUX0ZMQUdTXzMyQklUKQorICAgIGZwcmludGYoc3RkZXJyLCJCYWNrdHJhY2U6XG4iKTsKKyAgICBpZiAoU1NfcmVnKERFQlVHX2NvbnRleHQpID09IFdJTkVfREFUQV9TRUxFQ1RPUikgIC8qIDMyLWJpdCBtb2RlICovCisgICAgeworICAgICAgICBhZGRyLnNlZyA9IDA7CisgICAgICAgIGFkZHIub2ZmID0gRUJQX3JlZyhERUJVR19jb250ZXh0KTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUUzMiAqZnJhbWUgPSAoRlJBTUUzMiAqKWFkZHIub2ZmOworICAgICAgICAgICAgaWYgKCFEQkdfQ0hFQ0tfUkVBRF9QVFIoICZhZGRyLCBzaXplb2YoRlJBTUUzMikgKSkgcmV0dXJuOworICAgICAgICAgICAgaWYgKCFmcmFtZS0+aXApIGJyZWFrOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIiVkICIsZnJhbWVubysrKTsKKyAgICAgICAgICAgIGFkZHIub2ZmID0gZnJhbWUtPmlwOworICAgICAgICAgICAgREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkciwgMzIgKTsKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOworICAgICAgICAgICAgYWRkci5vZmYgPSBmcmFtZS0+YnA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgLyogMTYtYml0IG1vZGUgKi8KKyAgICB7CisgICAgICBXT1JEIHNzID0gU1NfcmVnKERFQlVHX2NvbnRleHQpLCBjcyA9IENTX3JlZyhERUJVR19jb250ZXh0KTsKKyAgICAgIGlmIChHRVRfU0VMX0ZMQUdTKHNzKSAmIExEVF9GTEFHU18zMkJJVCkKICAgICAgIHsKICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJOb3QgaW1wbGVtZW50ZWQ6IDMyLWJpdCBiYWNrdHJhY2Ugb24gYSBkaWZmZXJlbnQgc3RhY2sgc2VnbWVudC5cbiIgKTsKICAgICAgICAgICByZXR1cm47CiAgICAgICB9Ci0gICAgICB3aGlsZSAoZnJhbWUtPmJwKQorICAgICAgYWRkci5zZWcgPSBTU19yZWcoREVCVUdfY29udGV4dCk7CisgICAgICBhZGRyLm9mZiA9IEJQX3JlZyhERUJVR19jb250ZXh0KSAmIH4xOworICAgICAgZm9yICg7OykKICAgICAgIHsKKyAgICAgICAgICBGUkFNRTE2ICpmcmFtZSA9IChGUkFNRTE2ICopREJHX0FERFJfVE9fTElOKCZhZGRyKTsKKyAgICAgICAgICBpZiAoIURCR19DSEVDS19SRUFEX1BUUiggJmFkZHIsIHNpemVvZihGUkFNRTE2KSApKSByZXR1cm47CisgICAgICAgICAgaWYgKCFmcmFtZS0+YnApIGJyZWFrOwogICAgICAgICAgIGlmIChmcmFtZS0+YnAgJiAxKSBjcyA9IGZyYW1lLT5jczsKICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsIiVkICIsIGZyYW1lbm8rKyApOwogICAgICAgICAgIGFkZHIuc2VnID0gY3M7CiAgICAgICAgICAgYWRkci5vZmYgPSBmcmFtZS0+aXA7CiAgICAgICAgICAgREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkciwgMTYgKTsKICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKLSAgICAgICAgICBmcmFtZSA9IChGUkFNRTE2ICopUFRSX1NFR19PRkZfVE9fTElOKCBTU19yZWcoREVCVUdfY29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmJwICYgfjEgKTsKKyAgICAgICAgICBhZGRyLnNlZyA9IHNzOworICAgICAgICAgIGFkZHIub2ZmID0gZnJhbWUtPmJwICYgfjE7CiAgICAgICB9CiAgIH0KICAgZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CmRpZmYgLS1naXQgYS9pZjE2MzIvSW1ha2VmaWxlIGIvaWYxNjMyL0ltYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViNmMxZS4uMDAwMDAwMAotLS0gYS9pZjE2MzIvSW1ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLSNpbmNsdWRlICIuLi9hdXRvY29uZi5oIgotI2luY2x1ZGUgIi4uL1dpbmUudG1wbCIKLQotTU9EVUxFID0gaWYxNjMyCi0KLVNSQ1MgPSBcCi0JY2FsbGJhY2suYyBcCi0JcmVsYXkuYyBcCi0JcmVsYXkzMi5jCi0KLSNpZmRlZiBXSU5FTElCCi1DQUxMT0JKUyA9Ci1ETExTMTYgPQotRExMUzMyID0KLSNlbHNlCi1DQUxMT0JKUyA9IFwKLQljYWxsMTYubyBcCi0JY2FsbDMyLm8KLURMTFMxNiA9IFwKLQljb21tZGxnLnNwZWMgXAotCWNvbXBvYmouc3BlYyBcCi0JZGRlbWwuc3BlYyBcCi0JZ2RpLnNwZWMgXAotCWtlcm5lbC5zcGVjIFwKLQlrZXlib2FyZC5zcGVjIFwKLQltbXN5c3RlbS5zcGVjIFwKLQltb3VzZS5zcGVjIFwKLQlvbGUyLnNwZWMgXAotCW9sZTJjb252LnNwZWMgXAotCW9sZTJkaXNwLnNwZWMgXAotCW9sZTJubHMuc3BlYyBcCi0Jb2xlMnByb3guc3BlYyBcCi0Jb2xlY2xpLnNwZWMgXAotCW9sZXN2ci5zcGVjIFwKLQlzaGVsbC5zcGVjIFwKLQlzb3VuZC5zcGVjIFwKLQlzdG9yYWdlLnNwZWMgXAotCXN0cmVzcy5zcGVjIFwKLQlzeXN0ZW0uc3BlYyBcCi0JdG9vbGhlbHAuc3BlYyBcCi0JdXNlci5zcGVjIFwKLQl3aW44N2VtLnNwZWMgXAotCXdpbnByb2NzLnNwZWMgXAotCXdpbnNvY2suc3BlYwotRExMUzMyID0gXAotCWFkdmFwaTMyLnNwZWMgXAotCWNvbWRsZzMyLnNwZWMgXAotCWdkaTMyLnNwZWMgXAotCWtlcm5lbDMyLnNwZWMgXAotCXNoZWxsMzIuc3BlYyBcCi0JdXNlcjMyLnNwZWMgXAotCXdpbnByb2NzMzIuc3BlYwotI2VuZGlmCi0KLU9CSlMgPSAkKFNSQ1M6LmM9Lm8pICQoQ0FMTE9CSlMpICQoRExMUzE2Oi5zcGVjPS5vKSAkKERMTFMzMjouc3BlYz0ubykKLQotQlVJTEQgPSAkKFRPUCkvdG9vbHMvYnVpbGQKLQotI2RlZmluZSBNYWtlRGxsMTZGcm9tU3BlYyhuYW1lKQkJCUBAXAotbmFtZS5TIDogbmFtZS5zcGVjICQoQlVJTEQpCQkJQEBcCi0JJChCVUlMRCkgLXNwZWMxNiBuYW1lLnNwZWMgPiBuYW1lLlMJQEBcCi0KLSNkZWZpbmUgTWFrZURsbDMyRnJvbVNwZWMobmFtZSkJCQlAQFwKLW5hbWUuYyA6IG5hbWUuc3BlYyAkKEJVSUxEKQkJCUBAXAotCSQoQlVJTEQpIC1zcGVjMzIgbmFtZS5zcGVjID4gbmFtZS5jCUBAXAotCi0vKgotICogSWYgeW91IGFkZCBhIG5ldyBzcGVjIGZpbGUsIGNvcHkgb25lIG9mIHRoZXNlIGxpbmVzCi0gKi8KLU1ha2VEbGwxNkZyb21TcGVjKGNvbW1kbGcpCi1NYWtlRGxsMTZGcm9tU3BlYyhjb21wb2JqKQotTWFrZURsbDE2RnJvbVNwZWMoZGRlbWwpCi1NYWtlRGxsMTZGcm9tU3BlYyhnZGkpCi1NYWtlRGxsMTZGcm9tU3BlYyhrZXJuZWwpCi1NYWtlRGxsMTZGcm9tU3BlYyhrZXlib2FyZCkKLU1ha2VEbGwxNkZyb21TcGVjKHNoZWxsKQotTWFrZURsbDE2RnJvbVNwZWMobW1zeXN0ZW0pCi1NYWtlRGxsMTZGcm9tU3BlYyhtb3VzZSkKLU1ha2VEbGwxNkZyb21TcGVjKG9sZTIpCi1NYWtlRGxsMTZGcm9tU3BlYyhvbGUyY29udikKLU1ha2VEbGwxNkZyb21TcGVjKG9sZTJkaXNwKQotTWFrZURsbDE2RnJvbVNwZWMob2xlMm5scykKLU1ha2VEbGwxNkZyb21TcGVjKG9sZTJwcm94KQotTWFrZURsbDE2RnJvbVNwZWMob2xlY2xpKQotTWFrZURsbDE2RnJvbVNwZWMob2xlc3ZyKQotTWFrZURsbDE2RnJvbVNwZWMoc291bmQpCi1NYWtlRGxsMTZGcm9tU3BlYyhzdG9yYWdlKQotTWFrZURsbDE2RnJvbVNwZWMoc3RyZXNzKQotTWFrZURsbDE2RnJvbVNwZWMoc3lzdGVtKQotTWFrZURsbDE2RnJvbVNwZWModG9vbGhlbHApCi1NYWtlRGxsMTZGcm9tU3BlYyh1c2VyKQotTWFrZURsbDE2RnJvbVNwZWMod2luODdlbSkKLU1ha2VEbGwxNkZyb21TcGVjKHdpbnByb2NzKQotTWFrZURsbDE2RnJvbVNwZWMod2luc29jaykKLQotTWFrZURsbDMyRnJvbVNwZWMoZ2RpMzIpCi1NYWtlRGxsMzJGcm9tU3BlYyhrZXJuZWwzMikKLU1ha2VEbGwzMkZyb21TcGVjKHNoZWxsMzIpCi1NYWtlRGxsMzJGcm9tU3BlYyh1c2VyMzIpCi1NYWtlRGxsMzJGcm9tU3BlYyh3aW5wcm9jczMyKQotCi1XaW5lUmVsb2NhdGFibGVUYXJnZXQoJChNT0RVTEUpLCwkKE9CSlMpKQotRGVwZW5kVGFyZ2V0KCkKLQotI2lmbmRlZiBXSU5FTElCCi0KLWNhbGwzMi5TOiAkKEJVSUxEKSAkKERMTFMxNjouc3BlYz0uUykKLQkkKEJVSUxEKSAtY2FsbDMyIGBjYXQgJChETExTMTY6LnNwZWM9LlMpIHwgZ3JlcCBDYWxsVG8zMl8gfCBzZWQgJ3MvLipDYWxsVG8zMl9cKC4qXCkvXDEvJyB8IHNvcnQgfCB1bmlxYCA+IGNhbGwzMi5TCi0KLWNhbGwxNi5TOiAkKEJVSUxEKSAkKFRPUCkvaW5jbHVkZS9jYWxsYmFjay5oCi0JJChCVUlMRCkgLWNhbGwxNiBgY2F0ICQoVE9QKS9pbmNsdWRlL2NhbGxiYWNrLmggfCBncmVwICJleHRlcm4uKkNhbGxUbzE2XyIgfCBzZWQgJ3MvLipDYWxsVG8xNl9cKC4qXCkoLiovXDEvJyB8IHNvcnQgfCB1bmlxYCA+IGNhbGwxNi5TCi0KLSNlbmRpZiAgLyogV0lORUxJQiAqLwotCi1pbmNsdWRlczo6Ci0KLWluc3RhbGw6OgotCi1jbGVhbjo6Ci0JJChSTSkgJChETExTMTY6LnNwZWM9LlMpICQoRExMUzMyOi5zcGVjPS5jKSBjYWxsMzIuUyBjYWxsMTYuUwpkaWZmIC0tZ2l0IGEvaWYxNjMyL2NhbGxiYWNrLmMgYi9pZjE2MzIvY2FsbGJhY2suYwppbmRleCAxY2MxZmRlLi4yZDZhNzQyIDEwMDY0NAotLS0gYS9pZjE2MzIvY2FsbGJhY2suYworKysgYi9pZjE2MzIvY2FsbGJhY2suYwpAQCAtMjYsNyArMjYsNiBAQAogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKIAogICAgIGlmICghd25kUHRyKSByZXR1cm4gMDsKLSAgICBTcHlNZXNzYWdlKGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKIAogICAgIC8qIGNoZWNrIGlmIHdlIGhhdmUgc29tZXRoaW5nIGJldHRlciB0aGFuIDE2IGJpdCByZWxheXMgKi8KICAgICBpZighQUxJQVNfVXNlQWxpYXNlcyB8fCAhKGE9QUxJQVNfTG9va3VwQWxpYXMoKERXT1JEKWZ1bmMpKSB8fApkaWZmIC0tZ2l0IGEvaWYxNjMyL2dkaS5zcGVjIGIvaWYxNjMyL2dkaS5zcGVjCmluZGV4IDJlYTMzZjEuLmY5NjAwMDcgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9nZGkuc3BlYworKysgYi9pZjE2MzIvZ2RpLnNwZWMKQEAgLTI1NCw3ICsyNTQsNyBAQAogMzc0IHBhc2NhbDE2IEdldFN5c3RlbVBhbGV0dGVVc2Uod29yZCkgR2V0U3lzdGVtUGFsZXR0ZVVzZQogMzc1IHBhc2NhbDE2IEdldFN5c3RlbVBhbGV0dGVFbnRyaWVzKHdvcmQgd29yZCB3b3JkIHB0cikKICAgICAgICAgICAgICBHZXRTeXN0ZW1QYWxldHRlRW50cmllcwotMzc2IHN0dWIgUmVzZXREQworMzc2IHBhc2NhbDE2IFJlc2V0REMod29yZCBwdHIpIFJlc2V0REMKIDM3NyBzdHViIFNUQVJURE9DCiAzNzggc3R1YiBFTkRET0MKIDM3OSBzdHViIFNUQVJUUEFHRQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2tlcm5lbDMyLnNwZWMgYi9pZjE2MzIva2VybmVsMzIuc3BlYwppbmRleCA5ZjBjZWVlLi4xOTg3MDYxIDEwMDY0NAotLS0gYS9pZjE2MzIva2VybmVsMzIuc3BlYworKysgYi9pZjE2MzIva2VybmVsMzIuc3BlYwpAQCAtMTQ5LDEzICsxNDksMTMgQEAKIDAxNDUgc3R1YiBGcmVlUmVzb3VyY2UKIDAxNDYgc3R1YiBGcmVlVmlydHVhbEJ1ZmZlcgogMDE0NyBzdHViIEdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAotMDE0OCBzdHViIEdldEFDUAorMDE0OCAgICBzdGRjYWxsIEdldEFDUCgpIEdldEFDUAogMDE0OSBzdHViIEdldEF0b21OYW1lQQogMDE1MCBzdHViIEdldEF0b21OYW1lVwogMDE1MSBzdHViIEdldEJpbmFyeVR5cGUKIDAxNTIgc3R1YiBHZXRCaW5hcnlUeXBlQQogMDE1MyBzdHViIEdldEJpbmFyeVR5cGVXCi0wMTU0IHN0dWIgR2V0Q1BJbmZvCiswMTU0ICAgIHN0ZGNhbGwgR2V0Q1BJbmZvKGxvbmcgcHRyKSBHZXRDUEluZm8KIDAxNTUgc3R1YiBHZXRDb21tQ29uZmlnCiAwMTU2IHN0dWIgR2V0Q29tbU1hc2sKIDAxNTcgc3R1YiBHZXRDb21tTW9kZW1TdGF0dXMKQEAgLTIxNCw3ICsyMTQsNyBAQAogMDIxMAlzdGRjYWxsIEdldEVudmlyb25tZW50U3RyaW5ncygpCUdldEVudmlyb25tZW50U3RyaW5ncwogMDIxMSBzdHViIEdldEVudmlyb25tZW50U3RyaW5nc0EKIDAyMTIgc3R1YiBHZXRFbnZpcm9ubWVudFN0cmluZ3NXCi0wMjEzIHN0dWIgR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEKKzAyMTMgICAgc3RkY2FsbCBHZXRFbnZpcm9ubWVudFZhcmlhYmxlQShwdHIgcHRyIGxvbmcpIEdldEVudmlyb25tZW50VmFyaWFibGVBCiAwMjE0IHN0dWIgR2V0RW52aXJvbm1lbnRWYXJpYWJsZVcKIDAyMTUgc3R1YiBHZXRFeGl0Q29kZVByb2Nlc3MKIDAyMTYgc3R1YiBHZXRFeGl0Q29kZVRocmVhZApAQCAtMjIzLDEyICsyMjMsMTIgQEAKIDAyMTkgc3R1YiBHZXRGaWxlSW5mb3JtYXRpb25CeUhhbmRsZQogMDIyMCBzdHViIEdldEZpbGVTaXplCiAwMjIxIHN0dWIgR2V0RmlsZVRpbWUKLTAyMjIgc3R1YiBHZXRGaWxlVHlwZQorMDIyMiAgICBzdGRjYWxsIEdldEZpbGVUeXBlKGxvbmcpIEdldEZpbGVUeXBlCiAwMjIzIHN0dWIgR2V0RnVsbFBhdGhOYW1lQQogMDIyNCBzdHViIEdldEZ1bGxQYXRoTmFtZVcKIDAyMjUgc3R1YiBHZXRIYW5kbGVJbmZvcm1hdGlvbgogMDIyNiBzdHViIEdldExhcmdlc3RDb25zb2xlV2luZG93U2l6ZQotMDIyNyBzdHViIEdldExhc3RFcnJvcgorMDIyNyAgICBzdGRjYWxsIEdldExhc3RFcnJvcigpIEdldExhc3RFcnJvcgogMDIyOCBzdHViIEdldExvY2FsVGltZQogMDIyOSBzdHViIEdldExvY2FsZUluZm9BCiAwMjMwIHN0dWIgR2V0TG9jYWxlSW5mb1cKQEAgLTIzNiw3ICsyMzYsNyBAQAogMDIzMiBzdHViIEdldExvZ2ljYWxEcml2ZVN0cmluZ3NXCiAwMjMzIHN0dWIgR2V0TG9naWNhbERyaXZlcwogMDIzNCBzdHViIEdldE1haWxzbG90SW5mbwotMDIzNQlyZXR1cm4gR2V0TW9kdWxlRmlsZU5hbWVBIDEyIDAKKzAyMzUJc3RkY2FsbCBHZXRNb2R1bGVGaWxlTmFtZUEobG9uZyBwdHIgbG9uZykgR2V0TW9kdWxlRmlsZU5hbWVBCiAwMjM2IHN0dWIgR2V0TW9kdWxlRmlsZU5hbWVXCiAwMjM3CXN0ZGNhbGwgR2V0TW9kdWxlSGFuZGxlQShwdHIpCUdldE1vZHVsZUhhbmRsZQogMDIzOCBzdHViIEdldE1vZHVsZUhhbmRsZVcKQEAgLTI0OSw3ICsyNDksNyBAQAogMDI0NSBzdHViIEdldE51bWJlck9mQ29uc29sZUZvbnRzCiAwMjQ2IHN0dWIgR2V0TnVtYmVyT2ZDb25zb2xlSW5wdXRFdmVudHMKIDAyNDcgc3R1YiBHZXROdW1iZXJPZkNvbnNvbGVNb3VzZUJ1dHRvbnMKLTAyNDggc3R1YiBHZXRPRU1DUAorMDI0OCAgICBzdGRjYWxsIEdldE9FTUNQKCkgR2V0T0VNQ1AKIDAyNDkgc3R1YiBHZXRPdmVybGFwcGVkUmVzdWx0CiAwMjUwIHN0dWIgR2V0UHJpb3JpdHlDbGFzcwogMDI1MSBzdHViIEdldFByaXZhdGVQcm9maWxlSW50QQpAQCAtMjc0LDcgKzI3NCw3IEBACiAwMjcwIHN0dWIgR2V0UXVldWVkQ29tcGxldGlvblN0YXR1cwogMDI3MSBzdHViIEdldFNob3J0UGF0aE5hbWVBCiAwMjcyIHN0dWIgR2V0U2hvcnRQYXRoTmFtZVcKLTAyNzMJcmV0dXJuIEdldFN0YXJ0dXBJbmZvQSA0IDAKKzAyNzMJc3RkY2FsbCBHZXRTdGFydHVwSW5mb0EocHRyKSBHZXRTdGFydHVwSW5mb0EKIDAyNzQgc3R1YiBHZXRTdGFydHVwSW5mb1cKIDAyNzUJc3RkY2FsbCBHZXRTdGRIYW5kbGUobG9uZykJR2V0U3RkSGFuZGxlCiAwMjc2IHN0dWIgR2V0U3RyaW5nVHlwZUEKQEAgLTMwMCwxMCArMzAwLDEwIEBACiAwMjk2IHN0dWIgR2V0VGhyZWFkUHJpb3JpdHkKIDAyOTcgc3R1YiBHZXRUaHJlYWRTZWxlY3RvckVudHJ5CiAwMjk4IHN0dWIgR2V0VGhyZWFkVGltZXMKLTAyOTkgc3R1YiBHZXRUaWNrQ291bnQKKzAyOTkgICAgc3RkY2FsbCBHZXRUaWNrQ291bnQoKSBHZXRUaWNrQ291bnQKIDAzMDAgc3R1YiBHZXRUaW1lRm9ybWF0QQogMDMwMSBzdHViIEdldFRpbWVGb3JtYXRXCi0wMzAyIHN0dWIgR2V0VGltZVpvbmVJbmZvcm1hdGlvbgorMDMwMiAgICBzdGRjYWxsIEdldFRpbWVab25lSW5mb3JtYXRpb24ocHRyKSBHZXRUaW1lWm9uZUluZm9ybWF0aW9uCiAwMzAzIHN0dWIgR2V0VXNlckRlZmF1bHRMQ0lECiAwMzA0IHN0dWIgR2V0VXNlckRlZmF1bHRMYW5nSUQKIDAzMDUgc3R1YiBHZXRWRE1DdXJyZW50RGlyZWN0b3JpZXMKQEAgLTQ4Niw3ICs0ODYsNyBAQAogMDQ4MSBzdHViIFNldERlZmF1bHRDb21tQ29uZmlnQQogMDQ4MiBzdHViIFNldERlZmF1bHRDb21tQ29uZmlnVwogMDQ4MyBzdHViIFNldEVuZE9mRmlsZQotMDQ4NCBzdHViIFNldEVudmlyb25tZW50VmFyaWFibGVBCiswNDg0ICAgIHN0ZGNhbGwgU2V0RW52aXJvbm1lbnRWYXJpYWJsZUEocHRyIHB0cikgU2V0RW52aXJvbm1lbnRWYXJpYWJsZUEKIDA0ODUgc3R1YiBTZXRFbnZpcm9ubWVudFZhcmlhYmxlVwogMDQ4NiBzdHViIFNldEVycm9yTW9kZQogMDQ4NyBzdHViIFNldEV2ZW50CkBAIC00OTQsMTIgKzQ5NCwxMiBAQAogMDQ4OSBzdHViIFNldEZpbGVBcGlzVG9PRU0KIDA0OTAgc3R1YiBTZXRGaWxlQXR0cmlidXRlc0EKIDA0OTEgc3R1YiBTZXRGaWxlQXR0cmlidXRlc1cKLTA0OTIgc3R1YiBTZXRGaWxlUG9pbnRlcgorMDQ5MiAgICBzdGRjYWxsIFNldEZpbGVQb2ludGVyKGxvbmcgbG9uZyBwdHIgbG9uZykgU2V0RmlsZVBvaW50ZXIKIDA0OTMgc3R1YiBTZXRGaWxlVGltZQogMDQ5NCBzdHViIFNldEhhbmRsZUNvdW50CiAwNDk1IHN0dWIgU2V0SGFuZGxlSW5mb3JtYXRpb24KIDA0OTYgc3R1YiBTZXRMYXN0Q29uc29sZUV2ZW50QWN0aXZlCi0wNDk3IHN0dWIgU2V0TGFzdEVycm9yCiswNDk3ICAgIHN0ZGNhbGwgU2V0TGFzdEVycm9yKGxvbmcpIFNldExhc3RFcnJvcgogMDQ5OCBzdHViIFNldExvY2FsVGltZQogMDQ5OSBzdHViIFNldExvY2FsZUluZm9BCiAwNTAwIHN0dWIgU2V0TG9jYWxlSW5mb1cKQEAgLTU1MCw5ICs1NTAsOSBAQAogMDU0NSBzdHViIFZlckxhbmd1YWdlTmFtZUEKIDA1NDYgc3R1YiBWZXJMYW5ndWFnZU5hbWVXCiAwNTQ3IHN0dWIgVmVyaWZ5Q29uc29sZUlvSGFuZGxlCi0wNTQ4IHN0dWIgVmlydHVhbEFsbG9jCiswNTQ4ICAgIHN0ZGNhbGwgVmlydHVhbEFsbG9jKHB0ciBsb25nIGxvbmcgbG9uZykgVmlydHVhbEFsbG9jCiAwNTQ5IHN0dWIgVmlydHVhbEJ1ZmZlckV4Y2VwdGlvbkhhbmRsZXIKLTA1NTAgc3R1YiBWaXJ0dWFsRnJlZQorMDU1MCAgICBzdGRjYWxsIFZpcnR1YWxGcmVlKHB0ciBsb25nIGxvbmcpIFZpcnR1YWxGcmVlCiAwNTUxIHN0dWIgVmlydHVhbExvY2sKIDA1NTIgc3R1YiBWaXJ0dWFsUHJvdGVjdAogMDU1MyBzdHViIFZpcnR1YWxQcm90ZWN0RXgKQEAgLTU4MCw3ICs1ODAsNyBAQAogMDU3NSBzdHViIFdyaXRlQ29uc29sZU91dHB1dENoYXJhY3RlclcKIDA1NzYgc3R1YiBXcml0ZUNvbnNvbGVPdXRwdXRXCiAwNTc3IHN0dWIgV3JpdGVDb25zb2xlVwotMDU3OCBzdHViIFdyaXRlRmlsZQorMDU3OCAgICBzdGRjYWxsIFdyaXRlRmlsZShsb25nIHB0ciBsb25nIHB0ciBwdHIpIFdyaXRlRmlsZQogMDU3OSBzdHViIFdyaXRlRmlsZUV4CiAwNTgwIHN0dWIgV3JpdGVQcml2YXRlUHJvZmlsZVNlY3Rpb25BCiAwNTgxIHN0dWIgV3JpdGVQcml2YXRlUHJvZmlsZVNlY3Rpb25XCmRpZmYgLS1naXQgYS9pZjE2MzIvbW1zeXN0ZW0uc3BlYyBiL2lmMTYzMi9tbXN5c3RlbS5zcGVjCmluZGV4IGQ0ZTBiMjguLjE0MTcxZDQgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9tbXN5c3RlbS5zcGVjCisrKyBiL2lmMTYzMi9tbXN5c3RlbS5zcGVjCkBAIC0zMSw2ICszMSw4IEBACiAyMTAgICAgcGFzY2FsICBNSURJT1VUUkVTRVQod29yZCkgbWlkaU91dFJlc2V0CiAyMTEgICAgcGFzY2FsICBNSURJT1VUR0VUVk9MVU1FKHdvcmQgc2VncHRyKSBtaWRpT3V0R2V0Vm9sdW1lCiAyMTIgICAgcGFzY2FsICBNSURJT1VUU0VUVk9MVU1FKHdvcmQgbG9uZykgbWlkaU91dFNldFZvbHVtZQorMjEzICAgIHBhc2NhbCAgTUlESU9VVENBQ0hFUEFUQ0hFUyh3b3JkIHdvcmQgc2VncHRyIHdvcmQpIG1pZGlPdXRDYWNoZVBhdGNoZXMKKzIxNCAgICBwYXNjYWwgIE1JRElPVVRDQUNIRURSVU1QQVRDSEVTKHdvcmQgd29yZCBzZWdwdHIgd29yZCkgbWlkaU91dENhY2hlRHJ1bVBhdGNoZXMKIDIxNSAgICBwYXNjYWwgIE1JRElPVVRHRVRJRCh3b3JkIHB0cikgbWlkaU91dEdldElECiAyMTYgICAgcGFzY2FsICBNSURJT1VUTUVTU0FHRSh3b3JkIHdvcmQgbG9uZyBsb25nKSBtaWRpT3V0TWVzc2FnZQogMzAxICAgIHBhc2NhbCAgTUlESUlOR0VUTlVNREVWUygpIG1pZGlJbkdldE51bURldnMKQEAgLTg2LDcgKzg4LDcgQEAKIDUxMyAgICBwYXNjYWwgIFdBVkVJTkdFVElEKHdvcmQgcHRyKSB3YXZlSW5HZXRJRAogNTE0ICAgIHBhc2NhbCAgV0FWRUlOTUVTU0FHRSh3b3JkIHdvcmQgbG9uZyBsb25nKSB3YXZlSW5NZXNzYWdlCiA2MDEgICAgcGFzY2FsICB0aW1lR2V0U3lzdGVtVGltZShwdHIgd29yZCkgdGltZUdldFN5c3RlbVRpbWUKLTYwMiAgICBwYXNjYWwgIHRpbWVTZXRFdmVudCh3b3JkIHdvcmQgcHRyIGxvbmcgd29yZCkgdGltZVNldEV2ZW50Cis2MDIgICAgcGFzY2FsICB0aW1lU2V0RXZlbnQod29yZCB3b3JkIHNlZ3B0ciBsb25nIHdvcmQpIHRpbWVTZXRFdmVudAogNjAzICAgIHBhc2NhbCAgdGltZUtpbGxFdmVudCh3b3JkKSB0aW1lS2lsbEV2ZW50CiA2MDQgICAgcGFzY2FsICB0aW1lR2V0RGV2Q2FwcyhwdHIgd29yZCkgdGltZUdldERldkNhcHMKIDYwNSAgICBwYXNjYWwgIHRpbWVCZWdpblBlcmlvZCh3b3JkKSB0aW1lQmVnaW5QZXJpb2QKZGlmZiAtLWdpdCBhL2lmMTYzMi9yZWxheS5jIGIvaWYxNjMyL3JlbGF5LmMKaW5kZXggZDMyNWNlOC4uZGY0MTc0NyAxMDA2NDQKLS0tIGEvaWYxNjMyL3JlbGF5LmMKKysrIGIvaWYxNjMyL3JlbGF5LmMKQEAgLTMxLDggKzMxLDggQEAKICAgICBETExfRU5UUlkoS0VSTkVMKSwKICAgICBETExfRU5UUlkoVVNFUiksCiAgICAgRExMX0VOVFJZKEdESSksCi0gICAgRExMX0VOVFJZKFdJTjg3RU0pLAotICAgIERMTF9FTlRSWShTSEVMTCksCisgICAgRExMX0VOVFJZX05PVFVTRUQoV0lOODdFTSksCisgICAgRExMX0VOVFJZX05PVFVTRUQoU0hFTEwpLAogICAgIERMTF9FTlRSWShTT1VORCksCiAgICAgRExMX0VOVFJZKEtFWUJPQVJEKSwKICAgICBETExfRU5UUlkoV0lOU09DSyksCkBAIC00MSw3ICs0MSw3IEBACiAgICAgRExMX0VOVFJZKFNZU1RFTSksCiAgICAgRExMX0VOVFJZKFRPT0xIRUxQKSwKICAgICBETExfRU5UUlkoTU9VU0UpLAotICAgIERMTF9FTlRSWShDT01NRExHKSwKKyAgICBETExfRU5UUllfTk9UVVNFRChDT01NRExHKSwKICAgICBETExfRU5UUllfTk9UVVNFRChPTEUyKSwKICAgICBETExfRU5UUllfTk9UVVNFRChPTEUyQ09OViksCiAgICAgRExMX0VOVFJZX05PVFVTRUQoT0xFMkRJU1ApLApkaWZmIC0tZ2l0IGEvaWYxNjMyL3JlbGF5MzIuYyBiL2lmMTYzMi9yZWxheTMyLmMKaW5kZXggMGQwNjMwZC4uMGQ5MDZkNCAxMDA2NDQKLS0tIGEvaWYxNjMyL3JlbGF5MzIuYworKysgYi9pZjE2MzIvcmVsYXkzMi5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImRsbHMuaCIKICNpbmNsdWRlICJwZV9pbWFnZS5oIgorI2luY2x1ZGUgInJlbGF5MzIuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogLyogI2RlZmluZSBERUJVR19SRUxBWSAqLwogI2luY2x1ZGUgImRlYnVnLmgiCkBAIC0xMTAsOCArMTExLDcgQEAKICAgICAgICAgICAgICBpbnQgd1BhcmFtLCBpbnQgbFBhcmFtICkKIHsKIAlpbnQgcmV0OwotCVNweU1lc3NhZ2UoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwotCV9fYXNtX18gKAorX19hc21fXyAoCiAJCSJwdXNoICUxOyIKIAkJInB1c2ggJTI7IgogCQkicHVzaCAlMzsiCmRpZmYgLS1naXQgYS9pZjE2MzIvdXNlci5zcGVjIGIvaWYxNjMyL3VzZXIuc3BlYwppbmRleCBkZDgyYWVlLi42M2I3YTlkIDEwMDY0NAotLS0gYS9pZjE2MzIvdXNlci5zcGVjCisrKyBiL2lmMTYzMi91c2VyLnNwZWMKQEAgLTMyOSw3ICszMjksNyBAQAogMzYyIHN0dWIgRENIb29rCiAzNjQgc3R1YiBMb29rdXBJY29uSURGcm9tRGlyZWN0b3J5RXgKIDM2OCBwYXNjYWwxNiBDb3B5SWNvbih3b3JkIHdvcmQpIENvcHlJY29uCi0zNjkgc3R1YiBDb3B5Q3Vyc29yCiszNjkgcGFzY2FsMTYgQ29weUN1cnNvcih3b3JkIHdvcmQpIENvcHlDdXJzb3IKIDM3MCBwYXNjYWwxNiBHZXRXaW5kb3dQbGFjZW1lbnQod29yZCBwdHIpIEdldFdpbmRvd1BsYWNlbWVudAogMzcxIHBhc2NhbDE2IFNldFdpbmRvd1BsYWNlbWVudCh3b3JkIHB0cikgU2V0V2luZG93UGxhY2VtZW50CiAzNzIgc3R1YiBHZXRJbnRlcm5hbEljb25IZWFkZXIKQEAgLTM1OCw3ICszNTgsNyBAQAogNDAzIHBhc2NhbDE2IFVucmVnaXN0ZXJDbGFzcyhzZWdwdHIgd29yZCkgVW5yZWdpc3RlckNsYXNzCiA0MDQgcGFzY2FsMTYgR2V0Q2xhc3NJbmZvKHdvcmQgc2VncHRyIHB0cikgR2V0Q2xhc3NJbmZvCiA0MDYgcGFzY2FsMTYgQ3JlYXRlQ3Vyc29yKHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCBwdHIgcHRyKSBDcmVhdGVDdXJzb3IKLTQwNyBwYXNjYWwxNiBDcmVhdGVJY29uKHdvcmQgd29yZCB3b3JkIGJ5dGUgYnl0ZSBwdHIgcHRyKSBDcmVhdGVJY29uCis0MDcgcGFzY2FsMTYgQ3JlYXRlSWNvbih3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQgcHRyIHB0cikgQ3JlYXRlSWNvbgogNDA4IHBhc2NhbDE2IENyZWF0ZUN1cnNvckljb25JbmRpcmVjdCh3b3JkIHB0ciBwdHIgcHRyKQogCSAgICAgQ3JlYXRlQ3Vyc29ySWNvbkluZGlyZWN0CiA0MDkgc3R1YiBJbml0VGhyZWFkSW5wdXQKQEAgLTQwMSw3ICs0MDEsNyBAQAogNDUyIHBhc2NhbDE2IENyZWF0ZVdpbmRvd0V4KGxvbmcgc2VncHRyIHNlZ3B0ciBsb25nIHNfd29yZCBzX3dvcmQgc193b3JkIHNfd29yZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQgd29yZCB3b3JkIHNlZ3B0cikgQ3JlYXRlV2luZG93RXgKIDQ1NCBwYXNjYWwxNiBBZGp1c3RXaW5kb3dSZWN0RXgocHRyIGxvbmcgd29yZCBsb25nKSBBZGp1c3RXaW5kb3dSZWN0RXgKLTQ1NSBzdHViIEdldEljb25JZAorNDU1IHBhc2NhbDE2IEdldEljb25JRCh3b3JkIGxvbmcpIEdldEljb25JRAogNDU2IHBhc2NhbDE2IExvYWRJY29uSGFuZGxlcih3b3JkIHdvcmQpIExvYWRJY29uSGFuZGxlcgogNDU3IHBhc2NhbDE2IERlc3Ryb3lJY29uKHdvcmQpIERlc3Ryb3lJY29uCiA0NTggcGFzY2FsMTYgRGVzdHJveUN1cnNvcih3b3JkKSBEZXN0cm95Q3Vyc29yCkBAIC00MTAsNyArNDEwLDcgQEAKIDQ2MSBwYXNjYWwxNiBTZXRJbnRlcm5hbFdpbmRvd1Bvcyh3b3JkIHdvcmQgcHRyIHB0cikgU2V0SW50ZXJuYWxXaW5kb3dQb3MKIDQ2MiBwYXNjYWwxNiBDYWxjQ2hpbGRTY3JvbGwod29yZCB3b3JkKSBDYWxjQ2hpbGRTY3JvbGwKIDQ2MyBzdHViIFNjcm9sbENoaWxkcmVuCi00NjQgc3R1YiBEcmFnT2JqZWN0Cis0NjQgcGFzY2FsMTYgRHJhZ09iamVjdCh3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCkgRHJhZ09iamVjdAogNDY1IHN0dWIgRHJhZ0RldGVjdAogNDY2IHBhc2NhbDE2IERyYXdGb2N1c1JlY3Qod29yZCBwdHIpIERyYXdGb2N1c1JlY3QKIDQ3MCBzdHViIFN0cmluZ0Z1bmMKZGlmZiAtLWdpdCBhL2lmMTYzMi93aW5wcm9jcy5zcGVjIGIvaWYxNjMyL3dpbnByb2NzLnNwZWMKaW5kZXggMjdmZDUwZi4uYjc3MGU0ZCAxMDA2NDQKLS0tIGEvaWYxNjMyL3dpbnByb2NzLnNwZWMKKysrIGIvaWYxNjMyL3dpbnByb2NzLnNwZWMKQEAgLTEwOCw3ICsxMDgsNyBAQAogMTcyIHJlZ2lzdGVyIElOVF9JbnQ0OEhhbmRsZXIod29yZCkgSU5UX0R1bW15SGFuZGxlcgogMTczIHJlZ2lzdGVyIElOVF9JbnQ0OUhhbmRsZXIod29yZCkgSU5UX0R1bW15SGFuZGxlcgogMTc0IHJlZ2lzdGVyIElOVF9JbnQ0YUhhbmRsZXIod29yZCkgSU5UX0R1bW15SGFuZGxlcgotMTc1IHJlZ2lzdGVyIElOVF9JbnQ0YkhhbmRsZXIod29yZCkgSU5UX0R1bW15SGFuZGxlcgorMTc1IHJlZ2lzdGVyIElOVF9JbnQ0YkhhbmRsZXIod29yZCkgSU5UX0ludDRiSGFuZGxlcgogMTc2IHJlZ2lzdGVyIElOVF9JbnQ0Y0hhbmRsZXIod29yZCkgSU5UX0R1bW15SGFuZGxlcgogMTc3IHJlZ2lzdGVyIElOVF9JbnQ0ZEhhbmRsZXIod29yZCkgSU5UX0R1bW15SGFuZGxlcgogMTc4IHJlZ2lzdGVyIElOVF9JbnQ0ZUhhbmRsZXIod29yZCkgSU5UX0R1bW15SGFuZGxlcgpAQCAtMjg5LDMgKzI4OSwxMiBAQAogMzUzIHJlZ2lzdGVyIElOVF9JbnRmZEhhbmRsZXIod29yZCkgSU5UX0R1bW15SGFuZGxlcgogMzU0IHJlZ2lzdGVyIElOVF9JbnRmZUhhbmRsZXIod29yZCkgSU5UX0R1bW15SGFuZGxlcgogMzU1IHJlZ2lzdGVyIElOVF9JbnRmZkhhbmRsZXIod29yZCkgSU5UX0R1bW15SGFuZGxlcgorCisjIFZ4RHMuIFRoZSBmaXJzdCBWeGQgaXMgYXQgNDAwCisjCisjNDAwK1ZYRF9JRCByZWdpc3RlciA8VnhEIGhhbmRsZXI+KHdvcmQpIDxWeEQgaGFuZGxlcj4KKyMKKzQxNCByZWdpc3RlciBWWERfQ29tbSh3b3JkKSBWWERfQ29tbQorIzQxNSByZWdpc3RlciBWWERfUHJpbnRlcih3b3JkKSBWWERfUHJpbnRlcgorNDIzIHJlZ2lzdGVyIFZYRF9TaGVsbCh3b3JkKSBWWERfU2hlbGwKKzQzMyByZWdpc3RlciBWWERfUGFnZUZpbGUod29yZCkgVlhEX1BhZ2VGaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpdG1hcC5oIGIvaW5jbHVkZS9iaXRtYXAuaAppbmRleCBkZGEyZDU1Li5jMjM2Y2RjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2JpdG1hcC5oCisrKyBiL2luY2x1ZGUvYml0bWFwLmgKQEAgLTQ1LDYgKzQ1LDYgQEAKIAogICAvKiBvYmplY3RzL29lbWJpdG1hcC5jICovCiBleHRlcm4gSEJJVE1BUCBPQk1fTG9hZEJpdG1hcCggV09SRCBpZCApOwotZXh0ZXJuIEhJQ09OIE9CTV9Mb2FkSWNvbiggV09SRCBpZCApOworZXh0ZXJuIEhBTkRMRSBPQk1fTG9hZEN1cnNvckljb24oIFdPUkQgaWQsIEJPT0wgZkN1cnNvciApOwogCiAjZW5kaWYgIC8qIF9fV0lORV9CSVRNQVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaXRtYXBzL29jcl9jcm9zcyBiL2luY2x1ZGUvYml0bWFwcy9vY3JfY3Jvc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzNzkzZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYml0bWFwcy9vY3JfY3Jvc3MKQEAgLTAsMCArMSwzNyBAQAorLyogWFBNICovCitzdGF0aWMgY2hhciAqIG9jcl9jcm9zc1tdID0geworIjMyIDMyIDIgMSA5IDkiLAorIiAJcyBOb25lCWMgTm9uZSIsCisiLglzIGJsYWNrIGMgYmxhY2siLAorIiAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAiLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4gICAgICAgICAgICAgIiwKKyIgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaXRtYXBzL29jcl9pYmVhbSBiL2luY2x1ZGUvYml0bWFwcy9vY3JfaWJlYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3MmExZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYml0bWFwcy9vY3JfaWJlYW0KQEAgLTAsMCArMSwzNyBAQAorLyogWFBNICovCitzdGF0aWMgY2hhciAqIG9jcl9pYmVhbVtdID0geworIjMyIDMyIDIgMSAzIDgiLAorIiAJcyBibGFjayBjIGJsYWNrIiwKKyIuCXMgTm9uZQljIE5vbmUiLAorIiAgIC4gICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIgICAuICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiJ9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaXRtYXBzL29jcl9pY29uIGIvaW5jbHVkZS9iaXRtYXBzL29jcl9pY29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MWY3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2JpdG1hcHMvb2NyX2ljb24KQEAgLTAsMCArMSwzOCBAQAorLyogWFBNICovCitzdGF0aWMgY2hhciAqIG9jcl9pY29uW10gPSB7CisiMzIgMzIgMyAxIDggNiIsCisiIAlzIGJsYWNrIGMgYmxhY2siLAorIi4JcyBOb25lCWMgTm9uZSIsCisiWAlzIHdoaXRlIGMgd2hpdGUiLAorIiAgICAgICAgICAgICAgICAgLi4uLi4uLi4uLi4uLi4uIiwKKyIgICAgICAgICAgICAgICAgIC4uLi4uLi4uLi4uLi4uLiIsCisiICAgWFhYWFhYWFhYWFggICAuLi4uLi4uLi4uLi4uLi4iLAorIiAgIFhYICAgICAgIFhYICAgLi4uLi4uLi4uLi4uLi4uIiwKKyIgICBYWCAgICAgICBYWCAgIC4uLi4uLi4uLi4uLi4uLiIsCisiICAgWFggICAgICAgWFggICAuLi4uLi4uLi4uLi4uLi4iLAorIiAgIFhYICAgICAgIFhYICAgLi4uLi4uLi4uLi4uLi4uIiwKKyIgICBYWCAgICAgICBYWCAgIC4uLi4uLi4uLi4uLi4uLiIsCisiICAgWFggICAgICAgWFggICAuLi4uLi4uLi4uLi4uLi4iLAorIiAgIFhYICAgICAgIFhYICAgLi4uLi4uLi4uLi4uLi4uIiwKKyIgICBYWFhYWFhYWFhYWCAgIC4uLi4uLi4uLi4uLi4uLiIsCisiICAgICAgICAgICAgICAgICAuLi4uLi4uLi4uLi4uLi4iLAorIiAgICAgICAgICAgICAgICAgLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiJ9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaXRtYXBzL29jcl9ub3JtYWwgYi9pbmNsdWRlL2JpdG1hcHMvb2NyX25vcm1hbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2U3NDA5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9iaXRtYXBzL29jcl9ub3JtYWwKQEAgLTAsMCArMSwzOCBAQAorLyogWFBNICovCitzdGF0aWMgY2hhciAqIG9jcl9ub3JtYWxbXSA9IHsKKyIzMiAzMiAzIDEgMCAwIiwKKyIgCXMgYmxhY2sgYyBibGFjayIsCisiLglzIE5vbmUJYyBOb25lIiwKKyJYCXMgd2hpdGUgYyB3aGl0ZSIsCisiICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIiBYIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIgWFggLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiIFhYWCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIiBYWFhYIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIgWFhYWFggLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiIFhYWFhYWCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIiBYWFhYWFhYIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIgWFhYWFhYWFggLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiIFhYWFhYWFhYWCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIiBYWFhYWFggICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIgWFhYIFhYIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiIFhYICBYWCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIiBYIC4gIFhYIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIgIC4uLiBYWCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiIC4uLi4uIFhYIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiBYWCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uIFhYIC4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLiBYWCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIn07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpdG1hcHMvb2NyX3NpemUgYi9pbmNsdWRlL2JpdG1hcHMvb2NyX3NpemUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzZjYwNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYml0bWFwcy9vY3Jfc2l6ZQpAQCAtMCwwICsxLDM4IEBACisvKiBYUE0gKi8KK3N0YXRpYyBjaGFyICogb2NyX3NpemVbXSA9IHsKKyIzMiAzMiAzIDEgMTEgMTEiLAorIiAJcyBOb25lCWMgTm9uZSIsCisiLglzIGJsYWNrIGMgYmxhY2siLAorIlgJcyB3aGl0ZSBjIHdoaXRlIiwKKyIgICAgICAgICAgIC4uICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgIC5YWC4gICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgIC5YWFhYLiAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgIC5YWFhYWFguICAgICAgICAgICAgICAgICIsCisiICAgICAgIC5YWFhYWFhYWC4gICAgICAgICAgICAgICAiLAorIiAgICAgICAuLi4uWFguLi4uICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgLlhYLiAgICAgICAgICAgICAgICAgICIsCisiICAgIC4uICAgIC5YWC4gICAgLi4gICAgICAgICAgICAiLAorIiAgIC5YLiAgICAuWFguICAgIC5YLiAgICAgICAgICAgIiwKKyIgIC5YWC4gICAgLlhYLiAgICAuWFguICAgICAgICAgICIsCisiIC5YWFguLi4uLi5YWC4uLi4uLlhYWC4gICAgICAgICAiLAorIi5YWFhYWFhYWFhYWFhYWFhYWFhYWFhYLiAgICAgICAgIiwKKyIuWFhYWFhYWFhYWFhYWFhYWFhYWFhYWC4gICAgICAgICIsCisiIC5YWFguLi4uLi5YWC4uLi4uLlhYWC4gICAgICAgICAiLAorIiAgLlhYLiAgICAuWFguICAgIC5YWC4gICAgICAgICAgIiwKKyIgICAuWC4gICAgLlhYLiAgICAuWC4gICAgICAgICAgICIsCisiICAgIC4uICAgIC5YWC4gICAgLi4gICAgICAgICAgICAiLAorIiAgICAgICAgICAuWFguICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgLi4uLlhYLi4uLiAgICAgICAgICAgICAgICIsCisiICAgICAgIC5YWFhYWFhYWC4gICAgICAgICAgICAgICAiLAorIiAgICAgICAgLlhYWFhYWC4gICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAuWFhYWC4gICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgIC5YWC4gICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgLi4gICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYml0bWFwcy9vY3Jfc2l6ZW5lc3cgYi9pbmNsdWRlL2JpdG1hcHMvb2NyX3NpemVuZXN3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTlhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2JpdG1hcHMvb2NyX3NpemVuZXN3CkBAIC0wLDAgKzEsMzggQEAKKy8qIFhQTSAqLworc3RhdGljIGNoYXIgKiBvY3Jfc2l6ZW5lc3dbXSA9IHsKKyIzMiAzMiAzIDEgNiA2IiwKKyIgCXMgTm9uZQljIE5vbmUiLAorIi4JcyBibGFjayBjIGJsYWNrIiwKKyJYCXMgd2hpdGUgYyB3aGl0ZSIsCisiICAgICAuLi4uLi4uICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgLlhYWFhYWC4gICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAuWFhYWFguICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgIC5YWFhYLiAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgIC5YWFhYWC4gICAgICAgICAgICAgICAgICAgIiwKKyIuLiAgIC5YWFguWFguICAgICAgICAgICAgICAgICAgICIsCisiLlguIC5YWFguIC5YLiAgICAgICAgICAgICAgICAgICAiLAorIi5YWC5YWFguICAgLi4gICAgICAgICAgICAgICAgICAgIiwKKyIuWFhYWFguICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiLlhYWFguICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIi5YWFhYWC4gICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIuWFhYWFhYLiAgICAgICAgICAgICAgICAgICAgICAgICIsCisiIC4uLi4uLi4gICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpdG1hcHMvb2NyX3NpemVucyBiL2luY2x1ZGUvYml0bWFwcy9vY3Jfc2l6ZW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZmM2ODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2JpdG1hcHMvb2NyX3NpemVucwpAQCAtMCwwICsxLDM4IEBACisvKiBYUE0gKi8KK3N0YXRpYyBjaGFyICogb2NyX3NpemVuc1tdID0geworIjMyIDMyIDMgMSA0IDciLAorIiAJcyBOb25lCWMgTm9uZSIsCisiLglzIGJsYWNrIGMgYmxhY2siLAorIlgJcyB3aGl0ZSBjIHdoaXRlIiwKKyIgICAgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgLlhYLiAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgLlhYWFguICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgLlhYWFhYWC4gICAgICAgICAgICAgICAgICAgICAgICIsCisiLlhYWFhYWFhYLiAgICAgICAgICAgICAgICAgICAgICAiLAorIi4uLi5YWC4uLi4gICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAuWFguICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgLlhYLiAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgIC5YWC4gICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAuWFguICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiLi4uLlhYLi4uLiAgICAgICAgICAgICAgICAgICAgICAiLAorIi5YWFhYWFhYWC4gICAgICAgICAgICAgICAgICAgICAgIiwKKyIgLlhYWFhYWC4gICAgICAgICAgICAgICAgICAgICAgICIsCisiICAuWFhYWC4gICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgIC5YWC4gICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYml0bWFwcy9vY3Jfc2l6ZW53c2UgYi9pbmNsdWRlL2JpdG1hcHMvb2NyX3NpemVud3NlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNjQ5MWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2JpdG1hcHMvb2NyX3NpemVud3NlCkBAIC0wLDAgKzEsMzggQEAKKy8qIFhQTSAqLworc3RhdGljIGNoYXIgKiBvY3Jfc2l6ZW53c2VbXSA9IHsKKyIzMiAzMiAzIDEgNiA2IiwKKyIgCXMgTm9uZQljIE5vbmUiLAorIi4JcyBibGFjayBjIGJsYWNrIiwKKyJYCXMgd2hpdGUgYyB3aGl0ZSIsCisiIC4uLi4uLi4gICAgICAgICAgICAgICAgICAgICAgICAiLAorIi5YWFhYWFguICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIuWFhYWFguICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiLlhYWFguICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIi5YWFhYWC4gICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIuWFguWFhYLiAgIC4uICAgICAgICAgICAgICAgICAgICIsCisiLlguIC5YWFguIC5YLiAgICAgICAgICAgICAgICAgICAiLAorIi4uICAgLlhYWC5YWC4gICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAuWFhYWFguICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgIC5YWFhYLiAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgIC5YWFhYWC4gICAgICAgICAgICAgICAgICAgIiwKKyIgICAgIC5YWFhYWFguICAgICAgICAgICAgICAgICAgICIsCisiICAgICAuLi4uLi4uICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpdG1hcHMvb2NyX3NpemV3ZSBiL2luY2x1ZGUvYml0bWFwcy9vY3Jfc2l6ZXdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MWE5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2JpdG1hcHMvb2NyX3NpemV3ZQpAQCAtMCwwICsxLDM4IEBACisvKiBYUE0gKi8KK3N0YXRpYyBjaGFyICogb2NyX3NpemV3ZVtdID0geworIjMyIDMyIDMgMSA3IDQiLAorIiAJcyBOb25lCWMgTm9uZSIsCisiLglzIGJsYWNrIGMgYmxhY2siLAorIlgJcyB3aGl0ZSBjIHdoaXRlIiwKKyIgICAgLi4gICAgLi4gICAgICAgICAgICAgICAgICAgICIsCisiICAgLlguICAgIC5YLiAgICAgICAgICAgICAgICAgICAiLAorIiAgLlhYLiAgICAuWFguICAgICAgICAgICAgICAgICAgIiwKKyIgLlhYWC4uLi4uLlhYWC4gICAgICAgICAgICAgICAgICIsCisiLlhYWFhYWFhYWFhYWFhYLiAgICAgICAgICAgICAgICAiLAorIi5YWFhYWFhYWFhYWFhYWC4gICAgICAgICAgICAgICAgIiwKKyIgLlhYWC4uLi4uLlhYWC4gICAgICAgICAgICAgICAgICIsCisiICAuWFguICAgIC5YWC4gICAgICAgICAgICAgICAgICAiLAorIiAgIC5YLiAgICAuWC4gICAgICAgICAgICAgICAgICAgIiwKKyIgICAgLi4gICAgLi4gICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYml0bWFwcy9vY3JfdXAgYi9pbmNsdWRlL2JpdG1hcHMvb2NyX3VwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTcyNmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2JpdG1hcHMvb2NyX3VwCkBAIC0wLDAgKzEsMzggQEAKKy8qIFhQTSAqLworc3RhdGljIGNoYXIgKiBvY3JfdXBbXSA9IHsKKyIzMiAzMiAzIDEgNiAwIiwKKyIgCXMgTm9uZQljIE5vbmUiLAorIi4JcyBibGFjayBjIGJsYWNrIiwKKyJYCXMgd2hpdGUgYyB3aGl0ZSIsCisiICAgICAgLi4gICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgIC4uICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgIC4uLi4gICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAuLi4uICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAuLlhYLi4gICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgLi5YWC4uICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgLi5YWFhYLi4gICAgICAgICAgICAgICAgICAgICAiLAorIiAgIC4uWFhYWC4uICAgICAgICAgICAgICAgICAgICAgIiwKKyIgIC4uWFhYWFhYLi4gICAgICAgICAgICAgICAgICAgICIsCisiICAuLlhYWFhYWC4uICAgICAgICAgICAgICAgICAgICAiLAorIiAuLlhYWFhYWFhYLi4gICAgICAgICAgICAgICAgICAgIiwKKyIgLi5YWFhYWFhYWC4uICAgICAgICAgICAgICAgICAgICIsCisiLi5YWFhYWFhYWFhYLi4gICAgICAgICAgICAgICAgICAiLAorIi4uWFhYWFhYWFhYWC4uICAgICAgICAgICAgICAgICAgIiwKKyIuLi4uLlhYWFguLi4uLiAgICAgICAgICAgICAgICAgICIsCisiLi4uLi5YWFhYLi4uLi4gICAgICAgICAgICAgICAgICAiLAorIiAgIC4uWFhYWC4uICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAuLlhYWFguLiAgICAgICAgICAgICAgICAgICAgICIsCisiICAgLi5YWFhYLi4gICAgICAgICAgICAgICAgICAgICAiLAorIiAgIC4uWFhYWC4uICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAuLlhYWFguLiAgICAgICAgICAgICAgICAgICAgICIsCisiICAgLi5YWFhYLi4gICAgICAgICAgICAgICAgICAgICAiLAorIiAgIC4uWFhYWC4uICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAuLlhYWFguLiAgICAgICAgICAgICAgICAgICAgICIsCisiICAgLi5YWFhYLi4gICAgICAgICAgICAgICAgICAgICAiLAorIiAgIC4uWFhYWC4uICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAuLi4uLi4uLiAgICAgICAgICAgICAgICAgICAgICIsCisiICAgLi4uLi4uLi4gICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpdG1hcHMvb2NyX3dhaXQgYi9pbmNsdWRlL2JpdG1hcHMvb2NyX3dhaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM5ZDczZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYml0bWFwcy9vY3Jfd2FpdApAQCAtMCwwICsxLDM4IEBACisvKiBYUE0gKi8KK3N0YXRpYyBjaGFyICogb2NyX3dhaXRbXSA9IHsKKyIzMiAzMiAzIDEgNyAxMyIsCisiIAlzIGJsYWNrIGMgYmxhY2siLAorIi4JcyBOb25lCWMgTm9uZSIsCisiWAlzIHdoaXRlIGMgd2hpdGUiLAorIiAgICAgICAgICAgICAgIC4uLi4uLi4uLi4uLi4uLi4uIiwKKyIgICAgICAgICAgICAgICAuLi4uLi4uLi4uLi4uLi4uLiIsCisiICBYWFhYWFhYWFhYWCAgLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4gICAgICAgICAgICAgLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuICBYWFhYWFhYWFggIC4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLiAgWFhYWFhYWFhYICAuLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4gIFhYWFhYWCBYWCAgLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuICBYIFggWCBYIFggIC4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLiAgWFggWCBYIFhYICAuLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uICBYWCBYIFhYICAuLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4gIFhYIFhYICAuLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLiAgWFhYICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uICBYICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLiAgWCAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4gIFggIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4gIFhYWCAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4gIFhYWFhYICAuLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4gIFhYWCBYWFggIC4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4gIFhYWFhYWFhYWCAgLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuICBYWFhYIFhYWFggIC4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLiAgWFhYIFggWFhYICAuLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4gIFhYIFggWCBYWCAgLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuICBYIFggWCBYIFggIC4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLiAgICAgICAgICAgICAuLi4uLi4uLi4uLi4uLi4uLi4iLAorIiAgWFhYWFhYWFhYWFggIC4uLi4uLi4uLi4uLi4uLi4uIiwKKyIgICAgICAgICAgICAgICAuLi4uLi4uLi4uLi4uLi4uLiIsCisiICAgICAgICAgICAgICAgLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiJ9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9idXR0b24uaCBiL2luY2x1ZGUvYnV0dG9uLmgKaW5kZXggYjliMDU2NS4uMjhmZGQ4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9idXR0b24uaAorKysgYi9pbmNsdWRlL2J1dHRvbi5oCkBAIC0yOCw2ICsyOCw3IEBACiAKICNkZWZpbmUgQlVUVE9OX1NUQVRFKGh3bmQpICAgICAoKFdJTl9GaW5kV25kUHRyKGh3bmQpKS0+d0V4dHJhWzBdKQogCi1leHRlcm4gTE9ORyBCdXR0b25XbmRQcm9jKCBIV05EIGhXbmQsIFdPUkQgdU1zZywgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitleHRlcm4gTFJFU1VMVCBCdXR0b25XbmRQcm9jKCBIV05EIGhXbmQsIFVJTlQgdU1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKTsKIAogI2VuZGlmICAvKiBCVVRUT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYWxsYmFjay5oIGIvaW5jbHVkZS9jYWxsYmFjay5oCmluZGV4IGIxYTBlNTguLjFlNTY0OWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FsbGJhY2suaAorKysgYi9pbmNsdWRlL2NhbGxiYWNrLmgKQEAgLTEyLDggKzEyLDYgQEAKIAogI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKIAotI2lmbmRlZiBXSU5FTElCCi0KIGV4dGVybiBpbnQgQ2FsbFRvMzJfTGFyZ2VTdGFjayggaW50ICgqZnVuYykoKSwgaW50IG5iYXJncywgLi4uICk7CiAKIApAQCAtMjIsNiArMjAsOSBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVuYyAgICAgZHMgICAgcGFyYW1ldGVycyAqLwogZXh0ZXJuIFdPUkQgQ2FsbFRvMTZfd29yZF8gICAgICggRkFSUFJPQywgV09SRCApOworCisjaWZuZGVmIFdJTkVMSUIKKwogZXh0ZXJuIFdPUkQgQ2FsbFRvMTZfd29yZF93dyAgICggRkFSUFJPQywgV09SRCwgV09SRCwgV09SRCApOwogZXh0ZXJuIFdPUkQgQ2FsbFRvMTZfd29yZF93bCAgICggRkFSUFJPQywgV09SRCwgV09SRCwgTE9ORyApOwogZXh0ZXJuIFdPUkQgQ2FsbFRvMTZfd29yZF9sbCAgICggRkFSUFJPQywgV09SRCwgTE9ORywgTE9ORyApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFzcy5oIGIvaW5jbHVkZS9jbGFzcy5oCmluZGV4IDhlMjdjZDMuLjkwYzNhM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhc3MuaAorKysgYi9pbmNsdWRlL2NsYXNzLmgKQEAgLTMyLDcgKzMyLDcgQEAKICNlbmRpZgogCiAKLUhDTEFTUyBDTEFTU19GaW5kQ2xhc3NCeU5hbWUoIFNFR1BUUiBuYW1lLCBXT1JEIGhpbnN0YW5jZSwgQ0xBU1MgKipwdHIgKTsKK0hDTEFTUyBDTEFTU19GaW5kQ2xhc3NCeU5hbWUoIFNFR1BUUiBuYW1lLCBISU5TVEFOQ0UgaGluc3RhbmNlLCBDTEFTUyAqKnB0ciApOwogQ0xBU1MgKiBDTEFTU19GaW5kQ2xhc3NQdHIoIEhDTEFTUyBoY2xhc3MgKTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbWJvLmggYi9pbmNsdWRlL2NvbWJvLmgKaW5kZXggY2YzMDFmMC4uZDg5YmQ2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb21iby5oCisrKyBiL2luY2x1ZGUvY29tYm8uaApAQCAtMTUsMyArMTUsNiBAQAogICBSRUNUICBSZWN0QnV0dG9uOwogICBCT09MICBiUmVkcmF3RmxhZzsKIH0gSEVBRENPTUJPLCpMUEhFQURDT01CTzsKKworTFJFU1VMVCBDb21ib0JveFduZFByb2MoSFdORCBod25kLCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworTFJFU1VMVCBDb21ib0xCb3hXbmRQcm9jKEhXTkQgaHduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29tbWRsZy5oIGIvaW5jbHVkZS9jb21tZGxnLmgKaW5kZXggMjE2MWE2Yy4uZGNjOTZiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb21tZGxnLmgKKysrIGIvaW5jbHVkZS9jb21tZGxnLmgKQEAgLTI5MCw3ICsyOTAsMTMgQEAKICNkZWZpbmUgRklORERMRwkJICAgICAgIAkJOQogI2RlZmluZSBSRVBMQUNFRExHCSAgICAgICAJCTEwCiAKLQorTFJFU1VMVCBGaWxlT3BlbkRsZ1Byb2MoSFdORCBoV25kLCBVSU5UIHdNc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworTFJFU1VMVCBGaWxlU2F2ZURsZ1Byb2MoSFdORCBoV25kLCBVSU5UIHdNc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworTFJFU1VMVCBDb2xvckRsZ1Byb2MoSFdORCBoV25kLCBVSU5UIHdNc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworTFJFU1VMVCBGaW5kVGV4dERsZ1Byb2MoSFdORCBoV25kLCBVSU5UIHdNc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworTFJFU1VMVCBSZXBsYWNlVGV4dERsZ1Byb2MoSFdORCBoV25kLCBVSU5UIHdNc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworTFJFU1VMVCBQcmludERsZ1Byb2MoSFdORCBoV25kLCBVSU5UIHdNc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworTFJFU1VMVCBQcmludFNldHVwRGxnUHJvYyhIV05EIGhXbmQsIFVJTlQgd01zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiAKICNlbmRpZiAJCS8qICNpZmRlZiBDT01NRExHX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jdXJzb3IuaCBiL2luY2x1ZGUvY3Vyc29yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YzVjOGMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jdXJzb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZm9yIENVUlNPUgotICoKLSAqIENvcHlyaWdodCAgTWFydGluIEF5b3R0ZSwgMTk5MwotICoKLSAqLwotI2lmbmRlZiBfX1dJTkVfQ1VSU09SX0gKLSNkZWZpbmUgX19XSU5FX0NVUlNPUl9ICi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICBQT0lOVCAgICAgICAgICAgcG50SG90U3BvdDsgICAgIC8qIGN1cnNvciBob3Qgc3BvdCAqLwotICAgICAgICBXT1JEICAgICAgICAgICAgbldpZHRoOyAgICAgICAgIC8qIHdpZHRoIG9mIGJpdG1hcCBpbiBwaXhlbHMgKi8KLSAgICAgICAgV09SRCAgICAgICAgICAgIG5IZWlnaHQ7Ci0gICAgICAgIFdPUkQgICAgICAgICAgICBuV2lkdGhCeXRlczsKLSAgICAgICAgQllURSAgICAgICAgICAgIGJ5UGxhbmVzOyAgICAgICAvKiBudW1iZXIgb2YgYml0IHBsYW5lcyAqLwotICAgICAgICBCWVRFICAgICAgICAgICAgYnlCaXRzUGl4OyAgICAgIC8qIGJpdHMgcGVyIHBpeGVsICovCi0gICAgICAgIH0gQ1VSU09SSUNPTklORk8sIEZBUiAqTFBDVVJTT1JJQ09OSU5GTzsKLQotdHlwZWRlZiBzdHJ1Y3QgIHsKLQlXT1JECWNkUmVzZXJ2ZWQ7Ci0JV09SRAljZFR5cGU7Ci0JV09SRAljZENvdW50OwotICAgICAgICB9IENVUlNPUkRJUjsKLSAKLXR5cGVkZWYgc3RydWN0IHsKLQlXT1JECVdpZHRoOwotCVdPUkQJSGVpZ2h0OwotCVdPUkQJUGxhbmVzOwotCVdPUkQJQml0Q291bnQ7Ci0JRFdPUkQJY3VyRElCU2l6ZTsKLQlXT1JECWN1ckRJQk9mZnNldDsKLQl9IENVUlNPUkRFU0NSSVA7Ci0KLXR5cGVkZWYgc3RydWN0ICB7Ci0JQ3Vyc29yCXhjdXJzb3I7Ci0JfSBDVVJTT1JBTExPQzsKLQotZXh0ZXJuIHZvaWQgQ1VSU09SX1NldFdpbkN1cnNvciggSFdORCBod25kLCBIQ1VSU09SIGhjdXJzb3IgKTsgICAvKiBjdXJzb3IuYyAqLwotCi0jZW5kaWYgLyogX19XSU5FX0NVUlNPUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2N1cnNvcmljb24uaCBiL2luY2x1ZGUvY3Vyc29yaWNvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNGRkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2N1cnNvcmljb24uaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ3Vyc29yIGFuZCBpY29uIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCisgKi8KKworI2lmbmRlZiBfX1dJTkVfQ1VSU09SSUNPTl9ICisjZGVmaW5lIF9fV0lORV9DVVJTT1JJQ09OX0gKKworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorCisjaWZuZGVmIFdJTkVMSUIKKyNwcmFnbWEgcGFjaygxKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQllURSAgIGJXaWR0aDsKKyAgICBCWVRFICAgYkhlaWdodDsKKyAgICBCWVRFICAgYkNvbG9yQ291bnQ7CisgICAgQllURSAgIGJSZXNlcnZlZDsKKyAgICBXT1JEICAgd1BsYW5lczsKKyAgICBXT1JEICAgd0JpdENvdW50OworICAgIERXT1JEICBkd0J5dGVzSW5SZXM7CisgICAgV09SRCAgIHdSZXNJZDsKK30gSUNPTkRJUkVOVFJZOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFdPUkQgICB3V2lkdGg7CisgICAgV09SRCAgIHdIZWlnaHQ7CisgICAgV09SRCAgIHdQbGFuZXM7CisgICAgV09SRCAgIHdCaXRDb3VudDsKKyAgICBEV09SRCAgZHdCeXRlc0luUmVzOworICAgIFdPUkQgICB3UmVzSWQ7Cit9IENVUlNPUkRJUkVOVFJZOworCit0eXBlZGVmIHVuaW9uCit7CisgICAgSUNPTkRJUkVOVFJZICAgIGljb247CisgICAgQ1VSU09SRElSRU5UUlkgIGN1cnNvcjsKK30gQ1VSU09SSUNPTkRJUkVOVFJZOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFdPUkQgICAgICAgICAgICAgICAgaWRSZXNlcnZlZDsKKyAgICBXT1JEICAgICAgICAgICAgICAgIGlkVHlwZTsKKyAgICBXT1JEICAgICAgICAgICAgICAgIGlkQ291bnQ7CisgICAgQ1VSU09SSUNPTkRJUkVOVFJZICBpZEVudHJpZXNbMV0gV0lORV9QQUNLRUQ7Cit9IENVUlNPUklDT05ESVI7CisKKyNpZm5kZWYgV0lORUxJQgorI3ByYWdtYSBwYWNrKDQpCisjZW5kaWYKKworZXh0ZXJuIEN1cnNvciBDVVJTT1JJQ09OX1hDdXJzb3I7ICAvKiBDdXJyZW50IFggY3Vyc29yICovCisKKyNlbmRpZiAvKiBfX1dJTkVfQ1VSU09SSUNPTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlYnVnLmggYi9pbmNsdWRlL2RlYnVnLmgKaW5kZXggOGQ3NDYxNS4uYTY3ZjcyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZWJ1Zy5oCisrKyBiL2luY2x1ZGUvZGVidWcuaApAQCAtNzgsMTAgKzc4LDggQEAKICN1bmRlZiBERUJVR19SRVNPVVJDRQogI3VuZGVmIERFQlVHX1NDUk9MTAogI3VuZGVmIERFQlVHX1NFTEVDVE9SCi0jdW5kZWYgREVCVUdfU0VMRUNUT1JTCiAjdW5kZWYgREVCVUdfU0VNCiAjdW5kZWYgREVCVUdfU0hNCi0jdW5kZWYgREVCVUdfU1BZCiAjdW5kZWYgREVCVUdfU1RSRVNTCiAjdW5kZWYgREVCVUdfU1lTQ09MT1IKICN1bmRlZiBERUJVR19UQVNLCkBAIC04OSw2ICs4Nyw3IEBACiAjdW5kZWYgREVCVUdfVElNRVIKICN1bmRlZiBERUJVR19UT09MSEVMUAogI3VuZGVmIERFQlVHX1VUSUxJVFkKKyN1bmRlZiBERUJVR19WWEQKICN1bmRlZiBERUJVR19XSU4KICN1bmRlZiBERUJVR19XSU5TT0NLCiAjZW5kaWYKQEAgLTE1NiwxMCArMTU1LDggQEAKICNkZWZpbmUgREVCVUdfUkVTT1VSQ0UKICNkZWZpbmUgREVCVUdfU0NST0xMCiAjZGVmaW5lIERFQlVHX1NFTEVDVE9SCi0jZGVmaW5lIERFQlVHX1NFTEVDVE9SUwogI2RlZmluZSBERUJVR19TRU0KICNkZWZpbmUgREVCVUdfU0hNCi0jZGVmaW5lIERFQlVHX1NQWQogI2RlZmluZSBERUJVR19TVFJFU1MKICNkZWZpbmUgREVCVUdfU1lTQ09MT1IKICNkZWZpbmUgREVCVUdfVEFTSwpAQCAtMTY3LDYgKzE2NCw3IEBACiAjZGVmaW5lIERFQlVHX1RJTUVSCiAjZGVmaW5lIERFQlVHX1RPT0xIRUxQCiAjZGVmaW5lIERFQlVHX1VUSUxJVFkKKyNkZWZpbmUgREVCVUdfVlhECiAjZGVmaW5lIERFQlVHX1dJTgogI2RlZmluZSBERUJVR19XSU5TT0NLCiAjZW5kaWYKQEAgLTQ4NCwxMSArNDgyLDYgQEAKICNlbHNlCiAgICAgMCwKICNlbmRpZgotI2lmZGVmIERFQlVHX1NFTEVDVE9SUwotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKICNpZmRlZiBERUJVR19TRU0KICAgICAxLAogI2Vsc2UKQEAgLTQ5OSwxMSArNDkyLDYgQEAKICNlbHNlCiAgICAgMCwKICNlbmRpZgotI2lmZGVmIERFQlVHX1NQWQotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKICNpZmRlZiBERUJVR19TVFJFU1MKICAgICAxLAogI2Vsc2UKQEAgLTUzOSw2ICs1MjcsMTEgQEAKICNlbHNlCiAgICAgMCwKICNlbmRpZgorI2lmZGVmIERFQlVHX1ZYRAorICAgIDEsCisjZWxzZQorICAgIDAsCisjZW5kaWYKICNpZmRlZiBERUJVR19XSU4KICAgICAxLAogI2Vsc2UKQEAgLTEzNjMsMjEgKzEzNTYsOCBAQAogI2VuZGlmCiAKICNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfc2VsZWN0b3JzIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs2Ml0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19zZWxlY3RvcnMgZGVidWdfbXNnX2VuYWJsZWRbNjJdCi0jZWxzZQotI2lmZGVmIERFQlVHX1NFTEVDVE9SUwotI2RlZmluZSBkcHJpbnRmX3NlbGVjdG9ycyBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19zZWxlY3RvcnMgMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl9zZWxlY3RvcnMgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfc2VsZWN0b3JzIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfc2VtIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs2M10pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19zZW0gZGVidWdfbXNnX2VuYWJsZWRbNjNdCisjZGVmaW5lIGRwcmludGZfc2VtIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs2Ml0pIDsgZWxzZSBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ19zZW0gZGVidWdfbXNnX2VuYWJsZWRbNjJdCiAjZWxzZQogI2lmZGVmIERFQlVHX1NFTQogI2RlZmluZSBkcHJpbnRmX3NlbSBmcHJpbnRmCkBAIC0xMzg5LDggKzEzNjksOCBAQAogI2VuZGlmCiAKICNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfc2htIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs2NF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19zaG0gZGVidWdfbXNnX2VuYWJsZWRbNjRdCisjZGVmaW5lIGRwcmludGZfc2htIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs2M10pIDsgZWxzZSBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ19zaG0gZGVidWdfbXNnX2VuYWJsZWRbNjNdCiAjZWxzZQogI2lmZGVmIERFQlVHX1NITQogI2RlZmluZSBkcHJpbnRmX3NobSBmcHJpbnRmCkBAIC0xNDAyLDIxICsxMzgyLDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3NweSBpZighZGVidWdfbXNnX2VuYWJsZWRbNjVdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfc3B5IGRlYnVnX21zZ19lbmFibGVkWzY1XQotI2Vsc2UKLSNpZmRlZiBERUJVR19TUFkKLSNkZWZpbmUgZHByaW50Zl9zcHkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfc3B5IDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfc3B5IHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3NweSAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3N0cmVzcyBpZighZGVidWdfbXNnX2VuYWJsZWRbNjZdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfc3RyZXNzIGRlYnVnX21zZ19lbmFibGVkWzY2XQorI2RlZmluZSBkcHJpbnRmX3N0cmVzcyBpZighZGVidWdfbXNnX2VuYWJsZWRbNjRdKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfc3RyZXNzIGRlYnVnX21zZ19lbmFibGVkWzY0XQogI2Vsc2UKICNpZmRlZiBERUJVR19TVFJFU1MKICNkZWZpbmUgZHByaW50Zl9zdHJlc3MgZnByaW50ZgpAQCAtMTQyOCw4ICsxMzk1LDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3N5c2NvbG9yIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs2N10pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19zeXNjb2xvciBkZWJ1Z19tc2dfZW5hYmxlZFs2N10KKyNkZWZpbmUgZHByaW50Zl9zeXNjb2xvciBpZighZGVidWdfbXNnX2VuYWJsZWRbNjVdKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfc3lzY29sb3IgZGVidWdfbXNnX2VuYWJsZWRbNjVdCiAjZWxzZQogI2lmZGVmIERFQlVHX1NZU0NPTE9SCiAjZGVmaW5lIGRwcmludGZfc3lzY29sb3IgZnByaW50ZgpAQCAtMTQ0MSw4ICsxNDA4LDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3Rhc2sgaWYoIWRlYnVnX21zZ19lbmFibGVkWzY4XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3Rhc2sgZGVidWdfbXNnX2VuYWJsZWRbNjhdCisjZGVmaW5lIGRwcmludGZfdGFzayBpZighZGVidWdfbXNnX2VuYWJsZWRbNjZdKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfdGFzayBkZWJ1Z19tc2dfZW5hYmxlZFs2Nl0KICNlbHNlCiAjaWZkZWYgREVCVUdfVEFTSwogI2RlZmluZSBkcHJpbnRmX3Rhc2sgZnByaW50ZgpAQCAtMTQ1NCw4ICsxNDIxLDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3RleHQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzY5XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3RleHQgZGVidWdfbXNnX2VuYWJsZWRbNjldCisjZGVmaW5lIGRwcmludGZfdGV4dCBpZighZGVidWdfbXNnX2VuYWJsZWRbNjddKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfdGV4dCBkZWJ1Z19tc2dfZW5hYmxlZFs2N10KICNlbHNlCiAjaWZkZWYgREVCVUdfVEVYVAogI2RlZmluZSBkcHJpbnRmX3RleHQgZnByaW50ZgpAQCAtMTQ2Nyw4ICsxNDM0LDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3RpbWVyIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3MF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ190aW1lciBkZWJ1Z19tc2dfZW5hYmxlZFs3MF0KKyNkZWZpbmUgZHByaW50Zl90aW1lciBpZighZGVidWdfbXNnX2VuYWJsZWRbNjhdKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfdGltZXIgZGVidWdfbXNnX2VuYWJsZWRbNjhdCiAjZWxzZQogI2lmZGVmIERFQlVHX1RJTUVSCiAjZGVmaW5lIGRwcmludGZfdGltZXIgZnByaW50ZgpAQCAtMTQ4MCw4ICsxNDQ3LDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3Rvb2xoZWxwIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3MV0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ190b29saGVscCBkZWJ1Z19tc2dfZW5hYmxlZFs3MV0KKyNkZWZpbmUgZHByaW50Zl90b29saGVscCBpZighZGVidWdfbXNnX2VuYWJsZWRbNjldKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfdG9vbGhlbHAgZGVidWdfbXNnX2VuYWJsZWRbNjldCiAjZWxzZQogI2lmZGVmIERFQlVHX1RPT0xIRUxQCiAjZGVmaW5lIGRwcmludGZfdG9vbGhlbHAgZnByaW50ZgpAQCAtMTQ5Myw4ICsxNDYwLDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3V0aWxpdHkgaWYoIWRlYnVnX21zZ19lbmFibGVkWzcyXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3V0aWxpdHkgZGVidWdfbXNnX2VuYWJsZWRbNzJdCisjZGVmaW5lIGRwcmludGZfdXRpbGl0eSBpZighZGVidWdfbXNnX2VuYWJsZWRbNzBdKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfdXRpbGl0eSBkZWJ1Z19tc2dfZW5hYmxlZFs3MF0KICNlbHNlCiAjaWZkZWYgREVCVUdfVVRJTElUWQogI2RlZmluZSBkcHJpbnRmX3V0aWxpdHkgZnByaW50ZgpAQCAtMTUwNiw4ICsxNDczLDIxIEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl93aW4gaWYoIWRlYnVnX21zZ19lbmFibGVkWzczXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3dpbiBkZWJ1Z19tc2dfZW5hYmxlZFs3M10KKyNkZWZpbmUgZHByaW50Zl92eGQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzcxXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3Z4ZCBkZWJ1Z19tc2dfZW5hYmxlZFs3MV0KKyNlbHNlCisjaWZkZWYgREVCVUdfVlhECisjZGVmaW5lIGRwcmludGZfdnhkIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3Z4ZCAxCisjZWxzZQorI2RlZmluZSBkcHJpbnRmX3Z4ZCB3aGlsZSgwKSBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ192eGQgMAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIERFQlVHX1JVTlRJTUUKKyNkZWZpbmUgZHByaW50Zl93aW4gaWYoIWRlYnVnX21zZ19lbmFibGVkWzcyXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3dpbiBkZWJ1Z19tc2dfZW5hYmxlZFs3Ml0KICNlbHNlCiAjaWZkZWYgREVCVUdfV0lOCiAjZGVmaW5lIGRwcmludGZfd2luIGZwcmludGYKQEAgLTE1MTksOCArMTQ5OSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl93aW5zb2NrIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3NF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ193aW5zb2NrIGRlYnVnX21zZ19lbmFibGVkWzc0XQorI2RlZmluZSBkcHJpbnRmX3dpbnNvY2sgaWYoIWRlYnVnX21zZ19lbmFibGVkWzczXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3dpbnNvY2sgZGVidWdfbXNnX2VuYWJsZWRbNzNdCiAjZWxzZQogI2lmZGVmIERFQlVHX1dJTlNPQ0sKICNkZWZpbmUgZHByaW50Zl93aW5zb2NrIGZwcmludGYKQEAgLTE1OTcsMTAgKzE1NzcsOCBAQAogICAgICJyZXNvdXJjZSIsCiAgICAgInNjcm9sbCIsCiAgICAgInNlbGVjdG9yIiwKLSAgICAic2VsZWN0b3JzIiwKICAgICAic2VtIiwKICAgICAic2htIiwKLSAgICAic3B5IiwKICAgICAic3RyZXNzIiwKICAgICAic3lzY29sb3IiLAogICAgICJ0YXNrIiwKQEAgLTE2MDgsNiArMTU4Niw3IEBACiAgICAgInRpbWVyIiwKICAgICAidG9vbGhlbHAiLAogICAgICJ1dGlsaXR5IiwKKyAgICAidnhkIiwKICAgICAid2luIiwKICAgICAid2luc29jayIsCiAgICAgIiIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGVidWdnZXIuaCBiL2luY2x1ZGUvZGVidWdnZXIuaAppbmRleCAzMzExODI1Li45MTkwZmYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RlYnVnZ2VyLmgKKysrIGIvaW5jbHVkZS9kZWJ1Z2dlci5oCkBAIC0yNiw2ICsyNiwxOCBAQAogICAgICgoYWRkciktPnNlZyA/IChjaGFyICopUFRSX1NFR19PRkZfVE9fTElOKChhZGRyKS0+c2VnLChhZGRyKS0+b2ZmKSBcCiAgICAgICAgICAgICAgICAgIDogKGNoYXIgKikoYWRkciktPm9mZikKIAorI2RlZmluZSBEQkdfQ0hFQ0tfUkVBRF9QVFIoYWRkcixsZW4pIFwKKyAgICAoIURFQlVHX0lzQmFkUmVhZFB0cigoYWRkciksKGxlbikpIHx8IFwKKyAgICAgKGZwcmludGYoc3RkZXJyLCIqKiogSW52YWxpZCBhZGRyZXNzICIpLCBcCisgICAgICBERUJVR19QcmludEFkZHJlc3MoKGFkZHIpLGRiZ19tb2RlKSwgXAorICAgICAgZnByaW50ZihzdGRlcnIsIlxuIiksMCkpCisKKyNkZWZpbmUgREJHX0NIRUNLX1dSSVRFX1BUUihhZGRyLGxlbikgXAorICAgICghREVCVUdfSXNCYWRXcml0ZVB0cigoYWRkciksKGxlbikpIHx8IFwKKyAgICAgKGZwcmludGYoc3RkZXJyLCIqKiogSW52YWxpZCBhZGRyZXNzICIpLCBcCisgICAgICBERUJVR19QcmludEFkZHJlc3MoYWRkcixkYmdfbW9kZSksIFwKKyAgICAgIGZwcmludGYoc3RkZXJyLCJcbiIpLDApKQorCiBlbnVtIGRlYnVnX3JlZ3MKIHsKICAgICBSRUdfRUFYLCBSRUdfRUJYLCBSRUdfRUNYLCBSRUdfRURYLCBSRUdfRVNJLApAQCAtNzYsNiArODgsOCBAQAogZXh0ZXJuIHZvaWQgREVCVUdfSGVscCh2b2lkKTsKIAogICAvKiBkZWJ1Z2dlci9tZW1vcnkuYyAqLworZXh0ZXJuIEJPT0wgREVCVUdfSXNCYWRSZWFkUHRyKCBjb25zdCBEQkdfQUREUiAqYWRkcmVzcywgaW50IHNpemUgKTsKK2V4dGVybiBCT09MIERFQlVHX0lzQmFkV3JpdGVQdHIoIGNvbnN0IERCR19BRERSICphZGRyZXNzLCBpbnQgc2l6ZSApOwogZXh0ZXJuIGludCBERUJVR19SZWFkTWVtb3J5KCBjb25zdCBEQkdfQUREUiAqYWRkcmVzcyApOwogZXh0ZXJuIHZvaWQgREVCVUdfV3JpdGVNZW1vcnkoIGNvbnN0IERCR19BRERSICphZGRyZXNzLCBpbnQgdmFsdWUgKTsKIGV4dGVybiB2b2lkIERFQlVHX0V4YW1pbmVNZW1vcnkoIGNvbnN0IERCR19BRERSICphZGRyLCBpbnQgY291bnQsIGNoYXIgZm9ybWF0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGVza3RvcC5oIGIvaW5jbHVkZS9kZXNrdG9wLmgKaW5kZXggMDI0ZGZiNC4uYmE5ODc2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZXNrdG9wLmgKKysrIGIvaW5jbHVkZS9kZXNrdG9wLmgKQEAgLTIwLDQgKzIwLDYgQEAKIGV4dGVybiBCT09MIERFU0tUT1BfSW5pdCgpOwogZXh0ZXJuIEJPT0wgREVTS1RPUF9TZXRQYXR0ZXJuKGNoYXIgKnBhdHRlcm4gKTsKIAorZXh0ZXJuIExSRVNVTFQgRGVza3RvcFduZFByb2MgKCBIV05EIGh3bmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApOworCiAjZW5kaWYgIC8qIERFU0tUT1BfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kaWFsb2cuaCBiL2luY2x1ZGUvZGlhbG9nLmgKaW5kZXggYWNhOWFkYy4uNzcyMDc0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kaWFsb2cuaAorKysgYi9pbmNsdWRlL2RpYWxvZy5oCkBAIC0xMiw5ICsxMiw3IEBACiBleHRlcm4gQk9PTCBESUFMT0dfSW5pdCh2b2lkKTsKIGV4dGVybiBIV05EIERJQUxPR19HZXRGaXJzdFRhYkl0ZW0oIEhXTkQgaHduZERsZyApOwogCi0jaWZuZGVmIFdJTkVMSUIKICNwcmFnbWEgcGFjaygxKQotI2VuZGlmCiAKICAgLyogRGlhbG9nIGluZm8gc3RydWN0dXJlLgogICAgKiBUaGlzIHN0cnVjdHVyZSBpcyBzdG9yZWQgaW50byB0aGUgd2luZG93IGV4dHJhIGJ5dGVzIChjYlduZEV4dHJhKS4KQEAgLTcwLDggKzY4LDYgQEAKICAgICBTRUdQVFIgICAgICAgICAgICAgZmFjZU5hbWU7CiB9IERMR1RFTVBMQVRFOwogCi0jaWZuZGVmIFdJTkVMSUIKICNwcmFnbWEgcGFjayg0KQotI2VuZGlmCiAKICNlbmRpZiAgLyogRElBTE9HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZG9zX2ZzLmggYi9pbmNsdWRlL2Rvc19mcy5oCmluZGV4IGE2YTkxYTMuLjEyMDBkZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZG9zX2ZzLmgKKysrIGIvaW5jbHVkZS9kb3NfZnMuaApAQCAtMjIsNyArMjIsNyBAQAogZXh0ZXJuIGNoYXIgKkRPU19HZXRWb2x1bWVMYWJlbChpbnQgZHJpdmUpOwogZXh0ZXJuIGludCBET1NfU2V0Vm9sdW1lTGFiZWwoaW50IGRyaXZlLCBjaGFyICpsYWJlbCk7CiBleHRlcm4gaW50IERPU19HZXRGcmVlU3BhY2UoaW50IGRyaXZlLCBsb25nICpzaXplLCBsb25nICphdmFpbGFibGUpOwotZXh0ZXJuIGNoYXIgKkRPU19GaW5kRmlsZShjaGFyICpidWZmZXIsIGludCBidWZsZW4sIGNoYXIgKnJvb3RuYW1lLCBjaGFyICoqZXh0ZW5zaW9ucywgY2hhciAqcGF0aCk7CitleHRlcm4gY2hhciAqRE9TX0ZpbmRGaWxlKGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmxlbiwgY29uc3QgY2hhciAqcm9vdG5hbWUsIGNoYXIgKipleHRlbnNpb25zLCBjaGFyICpwYXRoKTsKIGV4dGVybiBjaGFyICpXaW5lSW5pRmlsZU5hbWUodm9pZCk7CiBleHRlcm4gY2hhciAqV2luSW5pRmlsZU5hbWUodm9pZCk7IAogZXh0ZXJuIHN0cnVjdCBkb3NkaXJlbnQgKkRPU19vcGVuZGlyKGNoYXIgKmRvc2Rpcm5hbWUpOyAKQEAgLTMwLDYgKzMwLDcgQEAKIGV4dGVybiB2b2lkIERPU19jbG9zZWRpcihzdHJ1Y3QgZG9zZGlyZW50ICpkZSk7CiBleHRlcm4gY2hhciAqRE9TX0dldFJlZGlyZWN0ZWREaXIoaW50IGRyaXZlKTsKIGV4dGVybiB2b2lkIGVycm5vX3RvX2Rvc2Vycih2b2lkKTsKK2V4dGVybiBpbnQgRE9TX0Vycm9yKGludCBleHRlbmRlZCwgaW50IGNsYXNzLCBpbnQgbG9jdXMpOwogCiBleHRlcm4gY2hhciBXaW5kb3dzUGF0aFsyNTZdOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2V2ZW50LmggYi9pbmNsdWRlL2V2ZW50LmgKaW5kZXggMGQxNjg5Zi4uNDAxOWYxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9ldmVudC5oCisrKyBiL2luY2x1ZGUvZXZlbnQuaApAQCAtMyw1ICszLDYgQEAKIAogZXh0ZXJuIHZvaWQgRVZFTlRfUHJvY2Vzc0V2ZW50KCBYRXZlbnQgKmV2ZW50ICk7ICAvKiBldmVudC5jICovCiBleHRlcm4gdm9pZCBFVkVOVF9SZWdpc3RlcldpbmRvdyggV2luZG93IHcsIEhXTkQgaHduZCApOyAgLyogZXZlbnQuYyAqLworZXh0ZXJuIHZvaWQgRVZFTlRfRHVtbXlNb3Rpb25Ob3RpZnkodm9pZCk7ICAvKiBldmVudC5jICovCiAKICNlbmRpZiAvKiBfX1dJTkVfRVZFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9nZGkuaCBiL2luY2x1ZGUvZ2RpLmgKaW5kZXggMDRhMjE4NS4uYThmMTg5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9nZGkuaAorKysgYi9pbmNsdWRlL2dkaS5oCkBAIC0xOTcsMzcgKzE5Nyw0MiBAQAogI2RlZmluZSBEQ19TQVZFRCAgICAgIDIgICAvKiBJdCBpcyBhIHNhdmVkIERDICovCiAKICAgLyogTGFzdCAzMiBieXRlcyBhcmUgcmVzZXJ2ZWQgZm9yIHN0b2NrIG9iamVjdCBoYW5kbGVzICovCisjaWZkZWYgV0lORUxJQjMyCisvKiBTdHVwaWQgb3ZlcmxvYWRpbmcgKHNlZSBEZWZXaW5kb3dQcm9jLCBjYXNlIFdNX0VSQVNFQktHTkQpICovCisjZGVmaW5lIEdESV9IRUFQX1NJWkUgICAgICAgICAgICAgICAoQ09MT1JfQlROSElHSExJR0hUKzEpCisjZWxzZQogI2RlZmluZSBHRElfSEVBUF9TSVpFICAgICAgICAgICAgICAgMHhmZmUwICAKKyNlbmRpZgogCiAgIC8qIEZpcnN0IGhhbmRsZSBwb3NzaWJsZSBmb3Igc3RvY2sgb2JqZWN0cyAobXVzdCBiZSA+PSBHRElfSEVBUF9TSVpFKSAqLwogI2RlZmluZSBGSVJTVF9TVE9DS19IQU5ETEUgICAgICAgICAgR0RJX0hFQVBfU0laRQogCiAgIC8qIFN0b2NrIG9iamVjdHMgaGFuZGxlcyAqLwogCi0jZGVmaW5lIFNUT0NLX1dISVRFX0JSVVNICSAgICAoRklSU1RfU1RPQ0tfSEFORExFICsgV0hJVEVfQlJVU0gpCi0jZGVmaW5lIFNUT0NLX0xUR1JBWV9CUlVTSAkgICAgKEZJUlNUX1NUT0NLX0hBTkRMRSArIExUR1JBWV9CUlVTSCkKLSNkZWZpbmUgU1RPQ0tfR1JBWV9CUlVTSAkgICAgKEZJUlNUX1NUT0NLX0hBTkRMRSArIEdSQVlfQlJVU0gpCi0jZGVmaW5lIFNUT0NLX0RLR1JBWV9CUlVTSAkgICAgKEZJUlNUX1NUT0NLX0hBTkRMRSArIERLR1JBWV9CUlVTSCkKLSNkZWZpbmUgU1RPQ0tfQkxBQ0tfQlJVU0gJICAgIChGSVJTVF9TVE9DS19IQU5ETEUgKyBCTEFDS19CUlVTSCkKLSNkZWZpbmUgU1RPQ0tfTlVMTF9CUlVTSAkgICAgKEZJUlNUX1NUT0NLX0hBTkRMRSArIE5VTExfQlJVU0gpCi0jZGVmaW5lIFNUT0NLX0hPTExPV19CUlVTSAkgICAgKEZJUlNUX1NUT0NLX0hBTkRMRSArIEhPTExPV19CUlVTSCkKLSNkZWZpbmUgU1RPQ0tfV0hJVEVfUEVOCSAgICAgICAgICAgIChGSVJTVF9TVE9DS19IQU5ETEUgKyBXSElURV9QRU4pCi0jZGVmaW5lIFNUT0NLX0JMQUNLX1BFTgkgICAgICAgICAgICAoRklSU1RfU1RPQ0tfSEFORExFICsgQkxBQ0tfUEVOKQotI2RlZmluZSBTVE9DS19OVUxMX1BFTgkgICAgICAgICAgICAoRklSU1RfU1RPQ0tfSEFORExFICsgTlVMTF9QRU4pCi0jZGVmaW5lIFNUT0NLX09FTV9GSVhFRF9GT05UCSAgICAoRklSU1RfU1RPQ0tfSEFORExFICsgT0VNX0ZJWEVEX0ZPTlQpCi0jZGVmaW5lIFNUT0NLX0FOU0lfRklYRURfRk9OVCAgICAgICAoRklSU1RfU1RPQ0tfSEFORExFICsgQU5TSV9GSVhFRF9GT05UKQotI2RlZmluZSBTVE9DS19BTlNJX1ZBUl9GT05UCSAgICAoRklSU1RfU1RPQ0tfSEFORExFICsgQU5TSV9WQVJfRk9OVCkKLSNkZWZpbmUgU1RPQ0tfU1lTVEVNX0ZPTlQJICAgIChGSVJTVF9TVE9DS19IQU5ETEUgKyBTWVNURU1fRk9OVCkKLSNkZWZpbmUgU1RPQ0tfREVWSUNFX0RFRkFVTFRfRk9OVCAgIChGSVJTVF9TVE9DS19IQU5ETEUgKyBERVZJQ0VfREVGQVVMVF9GT05UKQotI2RlZmluZSBTVE9DS19ERUZBVUxUX1BBTEVUVEUgICAgICAgKEZJUlNUX1NUT0NLX0hBTkRMRSArIERFRkFVTFRfUEFMRVRURSkKLSNkZWZpbmUgU1RPQ0tfU1lTVEVNX0ZJWEVEX0ZPTlQgICAgIChGSVJTVF9TVE9DS19IQU5ETEUgKyBTWVNURU1fRklYRURfRk9OVCkKKyNkZWZpbmUgTkJfU1RPQ0tfT0JKRUNUUyAgICAgICAgICAoU1lTVEVNX0ZJWEVEX0ZPTlQgKyAxKQogCi0jZGVmaW5lIE5CX1NUT0NLX09CSkVDVFMgICAgICAgICAgICAoU1lTVEVNX0ZJWEVEX0ZPTlQgKyAxKQorI2RlZmluZSBTVE9DS19XSElURV9CUlVTSCAgICAgICAgICgoSEJSVVNIKShGSVJTVF9TVE9DS19IQU5ETEUrV0hJVEVfQlJVU0gpKQorI2RlZmluZSBTVE9DS19MVEdSQVlfQlJVU0ggICAgICAgICgoSEJSVVNIKShGSVJTVF9TVE9DS19IQU5ETEUrTFRHUkFZX0JSVVNIKSkKKyNkZWZpbmUgU1RPQ0tfR1JBWV9CUlVTSCAgICAgICAgICAoKEhCUlVTSCkoRklSU1RfU1RPQ0tfSEFORExFK0dSQVlfQlJVU0gpKQorI2RlZmluZSBTVE9DS19ES0dSQVlfQlJVU0ggICAgICAgICgoSEJSVVNIKShGSVJTVF9TVE9DS19IQU5ETEUrREtHUkFZX0JSVVNIKSkKKyNkZWZpbmUgU1RPQ0tfQkxBQ0tfQlJVU0ggICAgICAgICAoKEhCUlVTSCkoRklSU1RfU1RPQ0tfSEFORExFK0JMQUNLX0JSVVNIKSkKKyNkZWZpbmUgU1RPQ0tfTlVMTF9CUlVTSCAgICAgICAgICAoKEhCUlVTSCkoRklSU1RfU1RPQ0tfSEFORExFK05VTExfQlJVU0gpKQorI2RlZmluZSBTVE9DS19IT0xMT1dfQlJVU0ggICAgICAgICgoSEJSVVNIKShGSVJTVF9TVE9DS19IQU5ETEUrSE9MTE9XX0JSVVNIKSkKKyNkZWZpbmUgU1RPQ0tfV0hJVEVfUEVOCSAgICAgICAgICAoKEhQRU4pKEZJUlNUX1NUT0NLX0hBTkRMRStXSElURV9QRU4pKQorI2RlZmluZSBTVE9DS19CTEFDS19QRU4JICAgICAgICAgICgoSFBFTikoRklSU1RfU1RPQ0tfSEFORExFK0JMQUNLX1BFTikpCisjZGVmaW5lIFNUT0NLX05VTExfUEVOCSAgICAgICAgICAoKEhQRU4pKEZJUlNUX1NUT0NLX0hBTkRMRStOVUxMX1BFTikpCisjZGVmaW5lIFNUT0NLX09FTV9GSVhFRF9GT05UICAgICAgKChIRk9OVCkoRklSU1RfU1RPQ0tfSEFORExFK09FTV9GSVhFRF9GT05UKSkKKyNkZWZpbmUgU1RPQ0tfQU5TSV9GSVhFRF9GT05UICAgICAoKEhGT05UKShGSVJTVF9TVE9DS19IQU5ETEUrQU5TSV9GSVhFRF9GT05UKSkKKyNkZWZpbmUgU1RPQ0tfQU5TSV9WQVJfRk9OVCAgICAgICAoKEhGT05UKShGSVJTVF9TVE9DS19IQU5ETEUrQU5TSV9WQVJfRk9OVCkpCisjZGVmaW5lIFNUT0NLX1NZU1RFTV9GT05UICAgICAgICAgKChIRk9OVCkoRklSU1RfU1RPQ0tfSEFORExFK1NZU1RFTV9GT05UKSkKKyNkZWZpbmUgU1RPQ0tfREVWSUNFX0RFRkFVTFRfRk9OVCAoKEhGT05UKShGSVJTVF9TVE9DS19IQU5ETEUrREVWSUNFX0RFRkFVTFRfRk9OVCkpCisjZGVmaW5lIFNUT0NLX0RFRkFVTFRfUEFMRVRURSAgICAgKChIUEFMRVRURSkoRklSU1RfU1RPQ0tfSEFORExFK0RFRkFVTFRfUEFMRVRURSkpCisjZGVmaW5lIFNUT0NLX1NZU1RFTV9GSVhFRF9GT05UICAgKChIRk9OVCkoRklSU1RfU1RPQ0tfSEFORExFK1NZU1RFTV9GSVhFRF9GT05UKSkKIAotI2RlZmluZSBGSVJTVF9TVE9DS19GT05UICAgICAgICAgICAgU1RPQ0tfT0VNX0ZJWEVEX0ZPTlQKLSNkZWZpbmUgTEFTVF9TVE9DS19GT05UICAgICAgICAgICAgIFNUT0NLX1NZU1RFTV9GSVhFRF9GT05UCisjZGVmaW5lIEZJUlNUX1NUT0NLX0ZPTlQgICAgICAgICAgU1RPQ0tfT0VNX0ZJWEVEX0ZPTlQKKyNkZWZpbmUgTEFTVF9TVE9DS19GT05UICAgICAgICAgICBTVE9DS19TWVNURU1fRklYRURfRk9OVAogCi0KKyNkZWZpbmUgTEFTVF9TVE9DS19IQU5ETEUgICAgICAgICAoKERXT1JEKVNUT0NLX1NZU1RFTV9GSVhFRF9GT05UKQogCiAgIC8qIERldmljZSA8LT4gbG9naWNhbCBjb29yZHMgY29udmVyc2lvbiAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ljb24uaCBiL2luY2x1ZGUvaWNvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTM4YTYwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaWNvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBmb3IgSUNPTgotICoKLSAqIENvcHlyaWdodCAgTWFydGluIEF5b3R0ZSwgMTk5MwotICoKLSAqLwotCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlCWVRFCVdpZHRoOwotCUJZVEUJSGVpZ2h0OwotCUJZVEUJQ29sb3JDb3VudDsKLQlCWVRFCVJlc2VydmVkMTsKLQlXT1JECVJlc2VydmVkMjsKLQlXT1JECVJlc2VydmVkMzsKLQlEV09SRAlpY29ESUJTaXplOwotCURXT1JECWljb0RJQk9mZnNldDsKLQl9IElDT05ERVNDUklQOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JSUNPTkRFU0NSSVAJZGVzY3JpcHRvcjsKLQlIQklUTUFQCQloQml0bWFwOwotCUhCSVRNQVAJCWhCaXRNYXNrOwotCX0gSUNPTkFMTE9DOwotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUva2VybmVsMzIuaCBiL2luY2x1ZGUva2VybmVsMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmI1OTVmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9rZXJuZWwzMi5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIGtlcm5lbDMyLmggLSA5NS0wOS0xNCAgQ2FtZXJvbiBIZWlkZQorICoKKyAqIFdpbjMyIGZ1bmN0aW9ucywgc3RydWN0dXJlcywgYW5kIHR5cGVzIHJlbGF0ZWQgdG8ga2VybmVsIGZ1bmN0aW9ucworICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK2ludCBLRVJOMzJfSW5pdCh2b2lkKTsKK3ZvaWQgU2V0TGFzdEVycm9yKERXT1JEIGVycm9yKTsKK0RXT1JEIEVycm5vVG9MYXN0RXJyb3IoaW50IGVycm5vX251bSk7CisKKy8qIExpbnV4J3Mgd2NoYXJfdCBpcyB1bnNpZ25lZCBsb25nIGJ1dCBXaW4zMiB3YW50cyB1bnNpZ25lZCBzaG9ydAorICovCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFdDSEFSOworCisvKiBDb2RlIHBhZ2UgaW5mb3JtYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgRFdPUkQgTWF4Q2hhclNpemU7CisgICAgICAgIEJZVEUgRGVmYXVsdENoYXJbMl07CisgICAgICAgIEJZVEUgTGVhZEJ5dGVzWzVdOworfSBDUElORk8sICpMUENQSU5GTzsKKworLyogVGhlICdvdmVybGFwcGVkJyBkYXRhIHN0cnVjdHVyZSB1c2VkIGJ5IGFzeW5jIEkvTyBmdW5jdGlvbnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgRFdPUkQgSW50ZXJuYWw7CisgICAgICAgIERXT1JEIEludGVybmFsSGlnaDsKKyAgICAgICAgRFdPUkQgT2Zmc2V0OworICAgICAgICBEV09SRCBPZmZzZXRIaWdoOworICAgICAgICBIQU5ETEUgaEV2ZW50OworfSBPVkVSTEFQUEVELCAqTFBPVkVSTEFQUEVEOworCisvKiBQcm9jZXNzIHN0YXJ0dXAgaW5mb3JtYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgRFdPUkQgY2I7CisgICAgICAgIExQU1RSIGxwUmVzZXJ2ZWQ7CisgICAgICAgIExQU1RSIGxwRGVza3RvcDsKKyAgICAgICAgTFBTVFIgbHBUaXRsZTsKKyAgICAgICAgRFdPUkQgZHdYOworICAgICAgICBEV09SRCBkd1k7CisgICAgICAgIERXT1JEIGR3WFNpemU7CisgICAgICAgIERXT1JEIGR3WVNpemU7CisgICAgICAgIERXT1JEIGR3WENvdW50Q2hhcnM7CisgICAgICAgIERXT1JEIGR3WUNvdW50Q2hhcnM7CisgICAgICAgIERXT1JEIGR3RmlsbEF0dHJpYnV0ZTsKKyAgICAgICAgRFdPUkQgZHdGbGFnczsKKyAgICAgICAgV09SRCB3U2hvd1dpbmRvdzsKKyAgICAgICAgV09SRCBjYlJlc2VydmVkMjsKKyAgICAgICAgQllURSAqbHBSZXNlcnZlZDI7CisgICAgICAgIEhBTkRMRSBoU3RkSW5wdXQ7CisgICAgICAgIEhBTkRMRSBoU3RkT3V0cHV0OworICAgICAgICBIQU5ETEUgaFN0ZEVycm9yOworfSBTVEFSVFVQSU5GTywgKkxQU1RBUlRVUElORk87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgV09SRCB3WWVhcjsKKyAgICAgICAgV09SRCB3TW9udGg7CisgICAgICAgIFdPUkQgd0RheU9mV2VlazsKKyAgICAgICAgV09SRCB3RGF5OworICAgICAgICBXT1JEIHdIb3VyOworICAgICAgICBXT1JEIHdNaW51dGU7CisgICAgICAgIFdPUkQgd1NlY29uZDsKKyAgICAgICAgV09SRCB3TWlsbGlzZWNvbmRzOworfSBTWVNURU1USU1FLCAqTFBTWVNURU1USU1FOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIExPTkcgQmlhczsKKyAgICAgICAgV0NIQVIgU3RhbmRhcmROYW1lWzMyXTsKKyAgICAgICAgU1lTVEVNVElNRSBTdGFuZGFyZERhdGU7CisgICAgICAgIExPTkcgU3RhbmRhcmRCaWFzOworICAgICAgICBXQ0hBUiBEYXlsaWdodE5hbWVbMzJdOworICAgICAgICBTWVNURU1USU1FIERheWxpZ2h0RGF0ZTsKKyAgICAgICAgTE9ORyBEYXlsaWdodEJpYXM7Cit9IFRJTUVfWk9ORV9JTkZPUk1BVElPTiwgKkxQVElNRV9aT05FX0lORk9STUFUSU9OOworCisjZGVmaW5lIFRJTUVfWk9ORV9JRF9VTktOT1dOICAgIDAKKyNkZWZpbmUgVElNRV9aT05FX0lEX1NUQU5EQVJEICAgMQorI2RlZmluZSBUSU1FX1pPTkVfSURfREFZTElHSFQgICAyCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGR0LmggYi9pbmNsdWRlL2xkdC5oCmluZGV4IDc2ZjljYTAuLmIwMmIyY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGR0LmgKKysrIGIvaW5jbHVkZS9sZHQuaApAQCAtMzAsNyArMzAsNyBAQAogZXh0ZXJuIHZvaWQgTERUX0VudHJ5VG9CeXRlcyggdW5zaWduZWQgbG9uZyAqYnVmZmVyLCBjb25zdCBsZHRfZW50cnkgKmNvbnRlbnQpOwogZXh0ZXJuIGludCBMRFRfR2V0RW50cnkoIGludCBlbnRyeSwgbGR0X2VudHJ5ICpjb250ZW50ICk7CiBleHRlcm4gaW50IExEVF9TZXRFbnRyeSggaW50IGVudHJ5LCBjb25zdCBsZHRfZW50cnkgKmNvbnRlbnQgKTsKLWV4dGVybiB2b2lkIExEVF9QcmludCgpOworZXh0ZXJuIHZvaWQgTERUX1ByaW50KCBpbnQgc3RhcnQsIGludCBsZW5ndGggKTsKIAogCiAgIC8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gYnVpbGQgdGhlIGxvY2FsIGNvcHkgb2YgdGhlIExEVC4gKi8KQEAgLTczLDcgKzczLDcgQEAKICAgICAgICAgICAgKCh2b2lkKikoR0VUX1NFTF9CQVNFKHNlZykgKyAodW5zaWduZWQgaW50KShvZmYpKSkKICNlbHNlCiAjZGVmaW5lIFBUUl9TRUdfVE9fTElOKHB0cikJKCh2b2lkKikocHRyKSkKLSNkZWZpbmUgUFRSX1NFR19PRkZfVE9fTElOKHNlZyxvZmYpCSgodm9pZCopKG9mZikpCisjZGVmaW5lIFBUUl9TRUdfT0ZGX1RPX0xJTihzZWcsb2ZmKQkoKHZvaWQqKSgoY2hhciopKHNlZykrKGludCkob2ZmKSkpCiAjZW5kaWYKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpc3Rib3guaCBiL2luY2x1ZGUvbGlzdGJveC5oCmluZGV4IDQ5MWVkMjAuLjQwNWExMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGlzdGJveC5oCisrKyBiL2luY2x1ZGUvbGlzdGJveC5oCkBAIC02NywzICs2Nyw1IEBACiAJCQkgICAgIFdPUkQgaXRlbVN0YXRlKTsKIGV4dGVybiBpbnQgTGlzdEJveEZpbmRNb3VzZShMUEhFQURMSVNUIGxwaGwsIGludCBYLCBpbnQgWSk7CiBleHRlcm4gdm9pZCBMaXN0Qm94QXNrTWVhc3VyZShMUEhFQURMSVNUIGxwaGwsIExQTElTVFNUUlVDVCBscGxzKTsKKworZXh0ZXJuIExSRVNVTFQgTGlzdEJveFduZFByb2MoSFdORCBod25kLFVJTlQgbWVzc2FnZSxXUEFSQU0gd1BhcmFtLExQQVJBTSBsUGFyYW0pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9sb2NhbC5oIGIvaW5jbHVkZS9sb2NhbC5oCmluZGV4IGRlNThkNGYuLjkzYjRjYmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbG9jYWwuaAorKysgYi9pbmNsdWRlL2xvY2FsLmgKQEAgLTEzLDE0ICsxMywxNCBAQAogICAvKiBleGNlcHRlZCB0aGF0IHRoZXkgbmVlZCBEUyBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyLiBUaGlzICAgICovCiAgIC8qIGFsbG93cyBtYW5hZ2luZyBzZXZlcmFsIGhlYXBzIGZyb20gdGhlIGVtdWxhdGlvbiBsaWJyYXJ5LiAgKi8KIAotZXh0ZXJuIEhMT0NBTCBMT0NBTF9BbGxvYyggV09SRCBkcywgV09SRCBmbGFncywgV09SRCBzaXplICk7Ci1leHRlcm4gSExPQ0FMIExPQ0FMX1JlQWxsb2MoIFdPUkQgZHMsIEhMT0NBTCBoYW5kbGUsIFdPUkQgc2l6ZSwgV09SRCBmbGFncyApOwotZXh0ZXJuIEhMT0NBTCBMT0NBTF9GcmVlKCBXT1JEIGRzLCBITE9DQUwgaGFuZGxlICk7Ci1leHRlcm4gSExPQ0FMIExPQ0FMX0hhbmRsZSggV09SRCBkcywgV09SRCBhZGRyICk7Ci1leHRlcm4gV09SRCBMT0NBTF9TaXplKCBXT1JEIGRzLCBITE9DQUwgaGFuZGxlICk7Ci1leHRlcm4gV09SRCBMT0NBTF9GbGFncyggV09SRCBkcywgSExPQ0FMIGhhbmRsZSApOwotZXh0ZXJuIFdPUkQgTE9DQUxfSGVhcFNpemUoIFdPUkQgZHMgKTsKLWV4dGVybiBXT1JEIExPQ0FMX0xvY2soIFdPUkQgZHMsIEhMT0NBTCBoYW5kbGUgKTsKLWV4dGVybiBCT09MIExPQ0FMX1VubG9jayggV09SRCBkcywgSExPQ0FMIGhhbmRsZSApOworZXh0ZXJuIEhMT0NBTCBMT0NBTF9BbGxvYyggSEFORExFIGRzLCBXT1JEIGZsYWdzLCBXT1JEIHNpemUgKTsKK2V4dGVybiBITE9DQUwgTE9DQUxfUmVBbGxvYyggSEFORExFIGRzLCBITE9DQUwgaGFuZGxlLCBXT1JEIHNpemUsIFdPUkQgZmxhZ3MgKTsKK2V4dGVybiBITE9DQUwgTE9DQUxfRnJlZSggSEFORExFIGRzLCBITE9DQUwgaGFuZGxlICk7CitleHRlcm4gSExPQ0FMIExPQ0FMX0hhbmRsZSggSEFORExFIGRzLCBXT1JEIGFkZHIgKTsKK2V4dGVybiBXT1JEIExPQ0FMX1NpemUoIEhBTkRMRSBkcywgSExPQ0FMIGhhbmRsZSApOworZXh0ZXJuIFdPUkQgTE9DQUxfRmxhZ3MoIEhBTkRMRSBkcywgSExPQ0FMIGhhbmRsZSApOworZXh0ZXJuIFdPUkQgTE9DQUxfSGVhcFNpemUoIEhBTkRMRSBkcyApOworZXh0ZXJuIE5QVk9JRCBMT0NBTF9Mb2NrKCBIQU5ETEUgZHMsIEhMT0NBTCBoYW5kbGUgKTsKK2V4dGVybiBCT09MIExPQ0FMX1VubG9jayggSEFORExFIGRzLCBITE9DQUwgaGFuZGxlICk7CiAKICNlbmRpZiAgLyogX19XSU5FX0xPQ0FMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWRpLmggYi9pbmNsdWRlL21kaS5oCmluZGV4IDY4OTFjM2QuLmQyZDE0MzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWRpLmgKKysrIGIvaW5jbHVkZS9tZGkuaApAQCAtMTEsOCArMTEsOCBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKIAogI2RlZmluZSBNRElfTUFYTElTVExFTkdUSAk2NAotZXh0ZXJuIExPTkcgTURJQ2xpZW50V25kUHJvYyhIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgCi0JCQkgICAgIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSk7IC8qIG1kaS5jICovCitleHRlcm4gTFJFU1VMVCBNRElDbGllbnRXbmRQcm9jKEhXTkQgaHduZCwgVUlOVCBtZXNzYWdlLCAKKwkJCQlXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsgLyogbWRpLmMgKi8KIAogCiB0eXBlZGVmIHN0cnVjdApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZW51LmggYi9pbmNsdWRlL21lbnUuaAppbmRleCBkNDcxZWVjLi5kMmZhZTdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lbnUuaAorKysgYi9pbmNsdWRlL21lbnUuaApAQCAtMTcsNiArMTcsNyBAQAogCQkJICAgICAgSFdORCBod25kLCBCT09MIHN1cHByZXNzX2RyYXcgKTsgICAvKiBtZW51LmMgKi8KIGV4dGVybiBITUVOVSBDb3B5U3lzTWVudSgpOyAvKiBtZW51LmMgKi8KIAorZXh0ZXJuIExSRVNVTFQgUG9wdXBNZW51V25kUHJvYyhIV05EIGh3bmQsVUlOVCBtZXNzYWdlLFdQQVJBTSB3UGFyYW0sTFBBUkFNIGxQYXJhbSApOwogCiB0eXBlZGVmIHN0cnVjdCB0YWdNRU5VSVRFTQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZXNzYWdlLmggYi9pbmNsdWRlL21lc3NhZ2UuaAppbmRleCBjOGExNDI5Li4xMDgzMmVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lc3NhZ2UuaAorKysgYi9pbmNsdWRlL21lc3NhZ2UuaApAQCAtMjAsNyArMjAsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgdGFnTUVTU0FHRVFVRVVFCiB7CiAgIFdPUkQgICAgICBuZXh0OwotICBXT1JEICAgICAgaFRhc2s7ICAgICAgICAgICAgICAgICAgLyogaFRhc2sgb3duaW5nIHRoZSBxdWV1ZSAgICAgICAgICAgICAgICAqLworICBIVEFTSyAgICAgaFRhc2s7ICAgICAgICAgICAgICAgICAgLyogaFRhc2sgb3duaW5nIHRoZSBxdWV1ZSAgICAgICAgICAgICAgICAqLwogICBXT1JEICAgICAgbXNnU2l6ZTsgICAgICAgICAgICAgICAgLyogU2l6ZSBvZiBtZXNzYWdlcyBpbiB0aGUgcXVldWUgICAgICAgICAqLwogICBXT1JEICAgICAgbXNnQ291bnQ7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdhaXRpbmcgbWVzc2FnZXMgICAgICAgICAgICAqLwogICBXT1JEICAgICAgbmV4dE1lc3NhZ2U7ICAgICAgICAgICAgLyogTmV4dCBtZXNzYWdlIHRvIGJlIHJldHJpZXZlZCAgICAgICAgICAqLwpAQCAtMjksMTAgKzI5LDEwIEBACiAgIERXT1JEICAgICBHZXRNZXNzYWdlVGltZVZhbDsgICAgICAvKiBWYWx1ZSByZXR1cm5lZCBieSBHZXRNZXNzYWdlVGltZSAgICAgICovCiAgIERXT1JEICAgICBHZXRNZXNzYWdlUG9zVmFsOyAgICAgICAvKiBWYWx1ZSByZXR1cm5lZCBieSBHZXRNZXNzYWdlUG9zICAgICAgICovCiAgIERXT1JEICAgICBHZXRNZXNzYWdlRXh0cmFJbmZvVmFsOyAvKiBWYWx1ZSByZXR1cm5lZCBieSBHZXRNZXNzYWdlRXh0cmFJbmZvICovCi0gIERXT1JEICAgICBsUGFyYW07ICAgICAgICAgICAgICAgICAvKiBOZXh0IGZvdXIgdmFsdWVzIHNldCBieSBTZW5kTWVzc2FnZSAgICovCi0gIFdPUkQgICAgICB3UGFyYW07Ci0gIFdPUkQgICAgICBtc2c7Ci0gIFdPUkQgICAgICBoV25kOworICBMUEFSQU0gICAgbFBhcmFtOyAgICAgICAgICAgICAgICAgLyogTmV4dCBmb3VyIHZhbHVlcyBzZXQgYnkgU2VuZE1lc3NhZ2UgICAqLworICBXUEFSQU0gICAgd1BhcmFtOworICBVSU5UICAgICAgbXNnOworICBIV05EICAgICAgaFduZDsKICAgV09SRCAgICAgIHdQb3N0UU1zZzsgICAgICAgICAgICAgIC8qIFBvc3RRdWl0TWVzc2FnZSBmbGFnICAgICAgICAgICAgICAgICAgKi8KICAgV09SRCAgICAgIHdFeGl0Q29kZTsgICAgICAgICAgICAgIC8qIFBvc3RRdWl0TWVzc2FnZSBleGl0IGNvZGUgICAgICAgICAgICAgKi8KICAgV09SRCAgICAgIEluU2VuZE1lc3NhZ2VIYW5kbGU7ICAgIC8qIEhhbmRsZSBvZiB0YXNrIHRoYXQgc2VudCBhIG1lc3NhZ2UgICAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWlzY2VtdS5oIGIvaW5jbHVkZS9taXNjZW11LmgKaW5kZXggYmYyYjAwNy4uOTkxODZlNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9taXNjZW11LmgKKysrIGIvaW5jbHVkZS9taXNjZW11LmgKQEAgLTEwLDcgKzEwLDYgQEAKICNpbmNsdWRlICJ3aW50eXBlcy5oIgogI2luY2x1ZGUgInJlZ2lzdGVycy5oIgogCi0KICAgLyogbWlzY2VtdS9kb3NtZW0uYyAqLwogZXh0ZXJuIEJPT0wgRE9TTUVNX0luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBET1NNRU1fRmlsbEJpb3NTZWdtZW50KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tb2R1bGUuaCBiL2luY2x1ZGUvbW9kdWxlLmgKaW5kZXggNWNhNWE1OS4uNWFiNzI5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tb2R1bGUuaAorKysgYi9pbmNsdWRlL21vZHVsZS5oCkBAIC0xOSw3ICsxOSw3IEBACiAgICAgV09SRCAgICBtYWdpYzsgICAgICAgICAgICAvKiAnTkUnIHNpZ25hdHVyZSAqLwogICAgIFdPUkQgICAgY291bnQ7ICAgICAgICAgICAgLyogVXNhZ2UgY291bnQgKi8KICAgICBXT1JEICAgIGVudHJ5X3RhYmxlOyAgICAgIC8qIE5lYXIgcHRyIHRvIGVudHJ5IHRhYmxlICovCi0gICAgV09SRCAgICBuZXh0OyAgICAgICAgICAgICAvKiBTZWxlY3RvciB0byBuZXh0IG1vZHVsZSAqLworICAgIEhNT0RVTEUgbmV4dDsgICAgICAgICAgICAgLyogU2VsZWN0b3IgdG8gbmV4dCBtb2R1bGUgKi8KICAgICBXT1JEICAgIGRncm91cF9lbnRyeTsgICAgIC8qIE5lYXIgcHRyIHRvIHNlZ21lbnQgZW50cnkgZm9yIERHUk9VUCAqLwogICAgIFdPUkQgICAgZmlsZWluZm87ICAgICAgICAgLyogTmVhciBwdHIgdG8gZmlsZSBpbmZvIChMT0FERURGSUxFSU5GTykgKi8KICAgICBXT1JEICAgIGZsYWdzOyAgICAgICAgICAgIC8qIE1vZHVsZSBmbGFncyAqLwpAQCAtNjksNyArNjksNyBAQAogICAgIFdPUkQgICAgc2l6ZTsgICAgICAvKiBTZWdtZW50IHNpemUgb24gZGlzayAqLwogICAgIFdPUkQgICAgZmxhZ3M7ICAgICAvKiBTZWdtZW50IGZsYWdzICovCiAgICAgV09SRCAgICBtaW5zaXplOyAgIC8qIE1pbi4gc2l6ZSBvZiBzZWdtZW50IGluIG1lbW9yeSAqLwotICAgIFdPUkQgICAgc2VsZWN0b3I7ICAvKiBTZWxlY3RvciBvZiBzZWdtZW50IGluIG1lbW9yeSAqLworICAgIEhBTkRMRSAgc2VsZWN0b3I7ICAvKiBTZWxlY3RvciBvZiBzZWdtZW50IGluIG1lbW9yeSAqLwogfSBTRUdUQUJMRUVOVFJZOwogCiAgIC8qIFNlbGYtbG9hZGluZyBtb2R1bGVzIGNvbnRhaW4gdGhpcyBzdHJ1Y3R1cmUgaW4gdGhlaXIgZmlyc3Qgc2VnbWVudCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tc2Rvcy5oIGIvaW5jbHVkZS9tc2Rvcy5oCmluZGV4IDI5MjJkMTMuLjY4NjE5NzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbXNkb3MuaAorKysgYi9pbmNsdWRlL21zZG9zLmgKQEAgLTM5LDYgKzM5LDcgQEAKICNkZWZpbmUgTUFYX0RPU19EUklWRVMJMjYKIAogZXh0ZXJuIFdPUkQgRXh0ZW5kZWRFcnJvcjsKK2V4dGVybiBCWVRFIEVycm9yQ2xhc3MsIEFjdGlvbiwgRXJyb3JMb2N1czsKIGV4dGVybiBzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0IENPTVtNQVhfUE9SVFNdOwogZXh0ZXJuIHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgTFBUW01BWF9QT1JUU107CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmVleGUuaCBiL2luY2x1ZGUvbmVleGUuaAppbmRleCBjMjRmMmY2Li5lOGM0NjBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25lZXhlLmgKKysrIGIvaW5jbHVkZS9uZWV4ZS5oCkBAIC02OCw2ICs2OCw3IEBACiAgKi8KICNkZWZpbmUgTkVfRkZMQUdTX1NJTkdMRURBVEEJMHgwMDAxCiAjZGVmaW5lIE5FX0ZGTEFHU19NVUxUSVBMRURBVEEJMHgwMDAyCisjZGVmaW5lIE5FX0ZGTEFHU19CVUlMVElOICAgICAgIDB4MDAxMCAgLyogV2luZSBidWlsdC1pbiBtb2R1bGUgKi8KICNkZWZpbmUgTkVfRkZMQUdTX1NFTEZMT0FECTB4MDgwMAogI2RlZmluZSBORV9GRkxBR1NfTElOS0VSUk9SCTB4MjAwMAogI2RlZmluZSBORV9GRkxBR1NfTElCTU9EVUxFCTB4ODAwMApAQCAtMTk2LDcgKzE5Nyw3IEBACiAgICAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOwogICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzOwogICAgIHVuc2lnbmVkIHNob3J0IGlkOwotICAgIHVuc2lnbmVkIHNob3J0IGhhbmRsZTsKKyAgICAgICAgICAgIEhBTkRMRSBoYW5kbGU7CiAgICAgdW5zaWduZWQgc2hvcnQgdXNhZ2U7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25vbmNsaWVudC5oIGIvaW5jbHVkZS9ub25jbGllbnQuaAppbmRleCAwYTM0ZDkwLi5kMmNhOGFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25vbmNsaWVudC5oCisrKyBiL2luY2x1ZGUvbm9uY2xpZW50LmgKQEAgLTE0LDEyICsxNCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9JTlQgKm1pblRyYWNrLCBQT0lOVCAqbWF4VHJhY2sgKTsKIGV4dGVybiB2b2lkIE5DX0RvTkNQYWludCggSFdORCBod25kLCBCT09MIGFjdGl2ZSwgQk9PTCBzdXBwcmVzc19tZW51cGFpbnQgKTsKIGV4dGVybiBMT05HIE5DX0hhbmRsZU5DUGFpbnQoIEhXTkQgaHduZCApOwotZXh0ZXJuIExPTkcgTkNfSGFuZGxlTkNBY3RpdmF0ZSggSFdORCBod25kLCBXT1JEIHdQYXJhbSApOworZXh0ZXJuIExPTkcgTkNfSGFuZGxlTkNBY3RpdmF0ZSggSFdORCBod25kLCBXUEFSQU0gd1BhcmFtICk7CiBleHRlcm4gTE9ORyBOQ19IYW5kbGVOQ0NhbGNTaXplKCBIV05EIGh3bmQsIE5DQ0FMQ1NJWkVfUEFSQU1TICpwYXJhbXMgKTsKIGV4dGVybiBMT05HIE5DX0hhbmRsZU5DSGl0VGVzdCggSFdORCBod25kLCBQT0lOVCBwdCApOwotZXh0ZXJuIExPTkcgTkNfSGFuZGxlTkNMQnV0dG9uRG93biggSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLWV4dGVybiBMT05HIE5DX0hhbmRsZU5DTEJ1dHRvbkRibENsayggSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLWV4dGVybiBMT05HIE5DX0hhbmRsZVN5c0NvbW1hbmQoIEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIFBPSU5UIHB0ICk7Ci1leHRlcm4gTE9ORyBOQ19IYW5kbGVTZXRDdXJzb3IoIEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitleHRlcm4gTE9ORyBOQ19IYW5kbGVOQ0xCdXR0b25Eb3duKCBIV05EIGh3bmQsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKTsKK2V4dGVybiBMT05HIE5DX0hhbmRsZU5DTEJ1dHRvbkRibENsayggSFdORCBod25kLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtICk7CitleHRlcm4gTE9ORyBOQ19IYW5kbGVTeXNDb21tYW5kKCBIV05EIGh3bmQsIFdQQVJBTSB3UGFyYW0sIFBPSU5UIHB0ICk7CitleHRlcm4gTE9ORyBOQ19IYW5kbGVTZXRDdXJzb3IoIEhXTkQgaHduZCwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApOwogCiAjZW5kaWYgLyogX19XSU5FX05PTkNMSUVOVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BlX2ltYWdlLmggYi9pbmNsdWRlL3BlX2ltYWdlLmgKaW5kZXggY2RhZGI2Ni4uYTY1Yzc1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wZV9pbWFnZS5oCisrKyBiL2luY2x1ZGUvcGVfaW1hZ2UuaApAQCAtMTksOCArMTksOCBAQAogICAgIGNoYXIgKiBmaWxlbmFtZTsgLyogQWN0dWFsIG5hbWUgb2YgdGhlIHVuaXggZmlsZSB0aGF0IHNhdGlzZmllcyB0aGlzICovCiAgICAgaW50IHR5cGU7ICAgICAgICAvKiBETEwgb3IgRVhFICovCiAgICAgaW50IGZkOwotICAgIHVuc2lnbmVkIHNob3J0IGhpbnN0YW5jZTsKLSAgICBIQU5ETEUgaE1vZHVsZTsKKyAgICBISU5TVEFOQ0UgaGluc3RhbmNlOworICAgIEhNT0RVTEUgaE1vZHVsZTsKICAgICBpbnQgaW5pdGlhbGlzZWQ7CiAgICAgc3RydWN0IG16X2hlYWRlcl9zICptel9oZWFkZXI7CiAgICAgc3RydWN0IHBlX2RhdGEgKnBlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZWdpc3RlcnMuaCBiL2luY2x1ZGUvcmVnaXN0ZXJzLmgKaW5kZXggN2UyZTRlNC4uNzc3NTIyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yZWdpc3RlcnMuaAorKysgYi9pbmNsdWRlL3JlZ2lzdGVycy5oCkBAIC00MCwxMyArNDAsMTEgQEAKICNkZWZpbmUgRVNfcmVnKGNvbnRleHQpICAgICAgKChjb250ZXh0KS0+c2NfZXMpCiAjZGVmaW5lIFNTX3JlZyhjb250ZXh0KSAgICAgICgoY29udGV4dCktPnNjX3NzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotI2lmZGVmIGxpbnV4ICAgICAgICAgICAgICAgIAorI2lmZGVmIGxpbnV4CisvKiBmcyBhbmQgZ3MgYXJlIG5vdCBzdXBwb3J0ZWQgb24gKkJTRC4gSG9wZWZ1bGx5IHdlIHdvbid0IG5lZWQgdGhlbS4gKi8KICNkZWZpbmUgRlNfcmVnKGNvbnRleHQpICAgICAgKChjb250ZXh0KS0+c2NfZnMpCiAjZGVmaW5lIEdTX3JlZyhjb250ZXh0KSAgICAgICgoY29udGV4dCktPnNjX2dzKQotI2Vsc2UgIC8qIEZJWE1FOiBhcmUgZnMgYW5kIGdzIHN1cHBvcnRlZCB1bmRlciAqQlNEPyAqLwotI2RlZmluZSBGU19yZWcoY29udGV4dCkgICAgICAwCi0jZGVmaW5lIEdTX3JlZyhjb250ZXh0KSAgICAgIDAKLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAKKyNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogI2lmbmRlZiBfX0ZyZWVCU0RfXyAgICAgICAgIAogI2RlZmluZSBFRkxfcmVnKGNvbnRleHQpICAgICAoKGNvbnRleHQpLT5zY19lZmxhZ3MpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3JlbGF5MzIuaCBiL2luY2x1ZGUvcmVsYXkzMi5oCmluZGV4IDdlYmY2ODguLjI3MzYwODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmVsYXkzMi5oCisrKyBiL2luY2x1ZGUvcmVsYXkzMi5oCkBAIC00LDggKzQsMTAgQEAKICAqIENvcHlyaWdodCAxOTk1IE1hcnRpbiB2b24gTG9ld2lzCiAgKi8KIAordm9pZCBSRUxBWTMyX1VuaW1wbGVtZW50ZWQoY2hhciAqZGxsLCBpbnQgaXRlbSk7CiB2b2lkICpSRUxBWTMyX0dldEVudHJ5UG9pbnQoY2hhciAqZGxsX25hbWUsIGNoYXIgKml0ZW0sIGludCBoaW50KTsKIExPTkcgUkVMQVkzMl9DYWxsV2luZG93UHJvYyhXTkRQUk9DLGludCxpbnQsaW50LGludCk7Cit2b2lkIFJFTEFZMzJfRGVidWdFbnRlcihjaGFyICpkbGwsY2hhciAqbmFtZSk7CiAKIHR5cGVkZWYgc3RydWN0IHRhZ1dORENMQVNTQXsKIAlVSU5UCXN0eWxlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZXNvdXJjZS5oIGIvaW5jbHVkZS9yZXNvdXJjZS5oCmluZGV4IDZhNWVlYjIuLmQzODljZTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmVzb3VyY2UuaAorKysgYi9pbmNsdWRlL3Jlc291cmNlLmgKQEAgLTE3LDkgKzE3LDYgQEAKIGV4dGVybiBIR0xPQkFMIE5FX0FsbG9jUmVzb3VyY2UoIEhNT0RVTEUgaE1vZHVsZSwgSFJTUkMgaFJzcmMsIERXT1JEIHNpemUgKTsKIGV4dGVybiBIR0xPQkFMIE5FX0xvYWRSZXNvdXJjZSggSE1PRFVMRSBoTW9kdWxlLCAgSFJTUkMgaFJzcmMgKTsKIAotZXh0ZXJuIEhCSVRNQVAgQ29udmVydENvcmVCaXRtYXAoIEhEQyBoZGMsIEJJVE1BUENPUkVIRUFERVIgKiBpbWFnZSApOwotZXh0ZXJuIEhCSVRNQVAgQ29udmVydEluZm9CaXRtYXAoIEhEQyBoZGMsIEJJVE1BUElORk8gKiBpbWFnZSApOwotCiBzdHJ1Y3QgUmVzb3VyY2VUYWJsZQogewogICAgICAgICBpbnQgaWQsdHlwZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2hlbGwuaCBiL2luY2x1ZGUvc2hlbGwuaAppbmRleCBiMjIyZTdlLi41YTU0NmVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NoZWxsLmgKKysrIGIvaW5jbHVkZS9zaGVsbC5oCkBAIC0xOCw3ICsxOCwxMSBAQAogCiAjZGVmaW5lIEhLRVlfQ0xBU1NFU19ST09UICAgICAgIDEKIAorI2lmZGVmIFdJTkVMSUIzMgordHlwZWRlZiB2b2lkKiBIS0VZOworI2Vsc2UKIHR5cGVkZWYgRFdPUkQgSEtFWTsKKyNlbmRpZgogdHlwZWRlZiBIS0VZIEZBUiogTFBIS0VZOwogCiB0eXBlZGVmIHN0cnVjdCB0YWdLRVlTVFJVQ1QgewpAQCAtMzIsNiArMzYsMTMgQEAKIAl9IEtFWVNUUlVDVDsKIHR5cGVkZWYgS0VZU1RSVUNUICpMUEtFWVNUUlVDVDsKIAordHlwZWRlZiBzdHJ1Y3QgdGFnRFJPUEZJTEVTVFJVQ1QgeyAJICAgLyogc3RydWN0dXJlIGZvciBkcm9wcGVkIGZpbGVzICovIAorCVdPUkQJCXdTaXplOworCVBPSU5UCQlwdE1vdXNlUG9zOyAgIAorCUJPT0wJCWZJbk5vbkNsaWVudEFyZWE7CisJLyogbWVtb3J5IGJsb2NrIHdpdGggZmlsZW5hbWVzIGZvbGxvd3MgKi8gICAgIAorICAgICAgICB9IERST1BGSUxFU1RSVUNULEZBUiAqTFBEUk9QRklMRVNUUlVDVDsgCisKICNkZWZpbmUgU0VfRVJSX1NIQVJFICAgICAgICAgICAgMjYKICNkZWZpbmUgU0VfRVJSX0FTU09DSU5DT01QTEVURSAgMjcKICNkZWZpbmUgU0VfRVJSX0RERVRJTUVPVVQgICAgICAgMjgKQEAgLTM5LDQgKzUwLDUgQEAKICNkZWZpbmUgU0VfRVJSX0RERUJVU1kgICAgICAgICAgMzAKICNkZWZpbmUgU0VfRVJSX05PQVNTT0MgICAgICAgICAgMzEKIAorTFJFU1VMVCBBYm91dERsZ1Byb2MoSFdORCBoV25kLFVJTlQgbXNnLFdQQVJBTSB3UGFyYW0sTFBBUkFNIGxQYXJhbSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3B5LmggYi9pbmNsdWRlL3NweS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYTc1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NweS5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiAJCQkgICAgIE1lc3NhZ2UgTG9nZ2luZyBmdW5jdGlvbnMKKyAqLworCisjaWZuZGVmIF9fV0lORV9TUFlfSAorI2RlZmluZSBfX1dJTkVfU1BZX0gKKworI2RlZmluZSBTUFlfRElTUEFUQ0hNRVNTQUdFICAgICAweDAwOTkKKyNkZWZpbmUgU1BZX1NFTkRNRVNTQUdFICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFNQWV9ERUZXTkRQUk9DICAgICAgICAgIDB4MDEwMQorCisjZGVmaW5lIFNQWV9SRVNVTFRfT0sgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBTUFlfUkVTVUxUX0lOVkFMSURIV05EICAweDAwMDEKKworZXh0ZXJuIHZvaWQgRW50ZXJTcHlNZXNzYWdlKCBpbnQsIEhXTkQsIFdPUkQsIFdPUkQsIExPTkcpOworZXh0ZXJuIHZvaWQgIEV4aXRTcHlNZXNzYWdlKCBpbnQsIEhXTkQsIFdPUkQsIExPTkcpOworZXh0ZXJuIHZvaWQgICAgICAgICBTcHlJbml0KCB2b2lkKTsKKworI2VuZGlmIC8qIF9fV0lORV9TUFlfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zdGFja2ZyYW1lLmggYi9pbmNsdWRlL3N0YWNrZnJhbWUuaAppbmRleCA4MWZjZjhlLi5jZjQzNThiIDEwMDY0NAotLS0gYS9pbmNsdWRlL3N0YWNrZnJhbWUuaAorKysgYi9pbmNsdWRlL3N0YWNrZnJhbWUuaApAQCAtNzIsNyArNzIsNyBAQAogI2Vsc2UKICNkZWZpbmUgQ1VSUkVOVF9TVEFDSzE2CWVycm9yLmVycm9yCiAjZGVmaW5lIENVUlJFTlRfRFMJCTAKLSNkZWZpbmUgTUFLRV9TRUdQVFIocHRyKQkocHRyKQorI2RlZmluZSBNQUtFX1NFR1BUUihwdHIpCSgoU0VHUFRSKXB0cikKICNlbmRpZgogCiAjZW5kaWYgLyogV0lORV9TVEFDS0ZSQU1FX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3RhdGljLmggYi9pbmNsdWRlL3N0YXRpYy5oCmluZGV4IDhkY2QwMDAuLmRmZTcxNDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3RhdGljLmgKKysrIGIvaW5jbHVkZS9zdGF0aWMuaApAQCAtMTcsNiArMTcsNiBAQAogICAgIEhJQ09OICBoSWNvbjsgICAvKiBJY29uIGhhbmRsZSBmb3IgU1NfSUNPTiBjb250cm9scyAqLyAKIH0gU1RBVElDSU5GTzsKIAotZXh0ZXJuIExPTkcgU3RhdGljV25kUHJvYyggSFdORCBoV25kLCBXT1JEIHVNc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworZXh0ZXJuIExSRVNVTFQgU3RhdGljV25kUHJvYyhIV05EIGhXbmQsVUlOVCB1TXNnLFdQQVJBTSB3UGFyYW0sTFBBUkFNIGxQYXJhbSApOwogCiAjZW5kaWYgIC8qIFNUQVRJQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N0ZGRlYnVnLmggYi9pbmNsdWRlL3N0ZGRlYnVnLmgKaW5kZXggYjI2MjAyMC4uMGI1YTVjNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zdGRkZWJ1Zy5oCisrKyBiL2luY2x1ZGUvc3RkZGVidWcuaApAQCAtMTM4LDEwICsxMzgsOCBAQAogI3VuZGVmIERFQlVHX1JFU09VUkNFCiAjdW5kZWYgREVCVUdfU0NST0xMCiAjdW5kZWYgREVCVUdfU0VMRUNUT1IKLSN1bmRlZiBERUJVR19TRUxFQ1RPUlMKICN1bmRlZiBERUJVR19TRU0KICN1bmRlZiBERUJVR19TSE0KLSN1bmRlZiBERUJVR19TUFkKICN1bmRlZiBERUJVR19TVFJFU1MKICN1bmRlZiBERUJVR19TWVNDT0xPUgogI3VuZGVmIERFQlVHX1RBU0sKQEAgLTE0OSw2ICsxNDcsNyBAQAogI3VuZGVmIERFQlVHX1RJTUVSCiAjdW5kZWYgREVCVUdfVE9PTEhFTFAKICN1bmRlZiBERUJVR19VVElMSVRZCisjdW5kZWYgREVCVUdfVlhECiAjdW5kZWYgREVCVUdfV0lOCiAjdW5kZWYgREVCVUdfV0lOU09DSwogI2VuZGlmCkBAIC0yMTYsMTAgKzIxNSw4IEBACiAjZGVmaW5lIERFQlVHX1JFU09VUkNFCiAjZGVmaW5lIERFQlVHX1NDUk9MTAogI2RlZmluZSBERUJVR19TRUxFQ1RPUgotI2RlZmluZSBERUJVR19TRUxFQ1RPUlMKICNkZWZpbmUgREVCVUdfU0VNCiAjZGVmaW5lIERFQlVHX1NITQotI2RlZmluZSBERUJVR19TUFkKICNkZWZpbmUgREVCVUdfU1RSRVNTCiAjZGVmaW5lIERFQlVHX1NZU0NPTE9SCiAjZGVmaW5lIERFQlVHX1RBU0sKQEAgLTIyNyw2ICsyMjQsNyBAQAogI2RlZmluZSBERUJVR19USU1FUgogI2RlZmluZSBERUJVR19UT09MSEVMUAogI2RlZmluZSBERUJVR19VVElMSVRZCisjZGVmaW5lIERFQlVHX1ZYRAogI2RlZmluZSBERUJVR19XSU4KICNkZWZpbmUgREVCVUdfV0lOU09DSwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Rhc2suaCBiL2luY2x1ZGUvdGFzay5oCmluZGV4IGRkN2U5ZTguLmZkNTYwNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdGFzay5oCisrKyBiL2luY2x1ZGUvdGFzay5oCkBAIC02MSw3ICs2MSw3IEBACiAgICAgY2hhciAgICBwcmlvcml0eTsgICAgICAgICAgICAgICAgICAgLyogVGFzayBwcmlvcml0eSwgYmV0d2VlbiAtMzIgYW5kIDE1ICovCiAgICAgQllURSAgICB1bnVzZWQxOwogICAgIEhHTE9CQUwgaFN0YWNrMzI7ICAgICAgICAgICAgICAgICAgIC8qIEhhbmRsZSB0byAzMi1iaXQgc3RhY2sgKi8KLSAgICBXT1JEICAgIGhTZWxmOyAgICAgICAgICAgICAgICAgICAgICAvKiBTZWxlY3RvciBvZiB0aGlzIFREQiAqLworICAgIEhUQVNLICAgaFNlbGY7ICAgICAgICAgICAgICAgICAgICAgIC8qIFNlbGVjdG9yIG9mIHRoaXMgVERCICovCiAgICAgSEFORExFICBoUHJldkluc3RhbmNlOyAgICAgICAgICAgICAgLyogUHJldmlvdXMgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZSAqLwogICAgIERXT1JEICAgZXNwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBzdGFjayBwb2ludGVyICovCiAgICAgV09SRCAgICBjdHJsd29yZDgwODc7ICAgICAgICAgICAgICAgLyogODB4ODcgY29udHJvbCB3b3JkICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Rvb2xoZWxwLmggYi9pbmNsdWRlL3Rvb2xoZWxwLmgKaW5kZXggYmExYTA1YS4uNWZmYjFiNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS90b29saGVscC5oCisrKyBiL2luY2x1ZGUvdG9vbGhlbHAuaApAQCAtMTY2LDE0ICsxNjYsMTQgQEAKICAgICBITU9EVUxFIGhNb2R1bGU7CiAgICAgV09SRCB3Y1VzYWdlOwogICAgIGNoYXIgc3pFeGVQYXRoW01BWF9QQVRIICsgMV07Ci0gICAgV09SRCB3TmV4dDsKKyAgICBIQU5ETEUgd05leHQ7CiB9IE1PRFVMRUVOVFJZOwogdHlwZWRlZiBNT0RVTEVFTlRSWSAqTFBNT0RVTEVFTlRSWTsKIAogQk9PTAlNb2R1bGVGaXJzdChNT0RVTEVFTlRSWSAqbHBNb2R1bGUpOwogQk9PTAlNb2R1bGVOZXh0KE1PRFVMRUVOVFJZICpscE1vZHVsZSk7Ci1ITU9EVUxFIE1vZHVsZUZpbmROYW1lKE1PRFVMRUVOVFJZICpscE1vZHVsZSwgTFBDU1RSIGxwc3RyTmFtZSk7Ci1ITU9EVUxFIE1vZHVsZUZpbmRIYW5kbGUoTU9EVUxFRU5UUlkgKmxwTW9kdWxlLCBITU9EVUxFIGhNb2R1bGUpOworQk9PTCAgICBNb2R1bGVGaW5kTmFtZShNT0RVTEVFTlRSWSAqbHBNb2R1bGUsIExQQ1NUUiBscHN0ck5hbWUpOworQk9PTCAgICBNb2R1bGVGaW5kSGFuZGxlKE1PRFVMRUVOVFJZICpscE1vZHVsZSwgSE1PRFVMRSBoTW9kdWxlKTsKIAogLyogdGFza3MgKi8KIApAQCAtMjQwLDcgKzI0MCw3IEBACiAgICAgRFdPUkQgICAgIGR3U2l6ZTsKICAgICBITU9EVUxFICAgaEluc3Q7ICAgICAgICAgICAgICAvKiBUaGlzIGlzIHJlYWxseSBhbiBoTW9kdWxlICovCiAgICAgY2hhciAgICAgIHN6Q2xhc3NOYW1lW01BWF9DTEFTU05BTUUgKyAxXTsKLSAgICBXT1JEICAgICAgd05leHQ7CisgICAgSEFORExFICAgIHdOZXh0OwogfSBDTEFTU0VOVFJZOwogCiBCT09MIENsYXNzRmlyc3QoIENMQVNTRU5UUlkgKnBDbGFzc0VudHJ5ICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbi5oIGIvaW5jbHVkZS93aW4uaAppbmRleCA2YjYxNGFhLi5mNDA5MzdkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbi5oCisrKyBiL2luY2x1ZGUvd2luLmgKQEAgLTc4LDkgKzc4LDExIEBACiBleHRlcm4gQk9PTCBXSU5fVW5saW5rV2luZG93KCBIV05EIGh3bmQgKTsKIGV4dGVybiBCT09MIFdJTl9MaW5rV2luZG93KCBIV05EIGh3bmQsIEhXTkQgaHduZEluc2VydEFmdGVyICk7CiBleHRlcm4gSFdORCBXSU5fRmluZFdpblRvUmVwYWludCggSFdORCBod25kICk7Ci1leHRlcm4gdm9pZCBXSU5fU2VuZFBhcmVudE5vdGlmeSggSFdORCBod25kLCBXT1JEIGV2ZW50LCBMT05HIGxQYXJhbSApOworZXh0ZXJuIHZvaWQgV0lOX1NlbmRQYXJlbnROb3RpZnkoIEhXTkQgaHduZCwgV09SRCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIGlkQ2hpbGQsIExPTkcgbFZhbHVlICk7CiBleHRlcm4gQk9PTCBXSU5fQ3JlYXRlRGVza3RvcFdpbmRvdyh2b2lkKTsKIGV4dGVybiBIV05EIFdJTl9HZXRUb3BQYXJlbnQoIEhXTkQgaHduZCApOworZXh0ZXJuIEhJTlNUQU5DRSBXSU5fR2V0V2luZG93SW5zdGFuY2UoIEhXTkQgaHduZCApOwogCiBleHRlcm4gRGlzcGxheSAqIGRpc3BsYXk7CiBleHRlcm4gU2NyZWVuICogc2NyZWVuOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5kb3dzLmggYi9pbmNsdWRlL3dpbmRvd3MuaAppbmRleCA3ZjY1NzQ4Li5lMTUxZWJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbmRvd3MuaAorKysgYi9pbmNsdWRlL3dpbmRvd3MuaApAQCAtMjUsNiArMjUsMTEgQEAKIAogI2RlZmluZSBNQUtFUE9JTlQobCkgKCooKFBPSU5UICopJihsKSkpCiAKKyNpZmRlZiBXSU5FTElCMzIKKyNkZWZpbmUgTUFLRVdQQVJBTShsb3csIGhpZ2gpICgoTE9ORykoKChXT1JEKShsb3cpKSB8IFwKKwkJCSAgICAgICgoKERXT1JEKSgoV09SRCkoaGlnaCkpKSA8PCAxNikpKQorI2VuZGlmCisKICNkZWZpbmUgTUFLRUxQQVJBTShsb3csIGhpZ2gpICgoTE9ORykoKChXT1JEKShsb3cpKSB8IFwKIAkJCSAgICAgICgoKERXT1JEKSgoV09SRCkoaGlnaCkpKSA8PCAxNikpKQogCkBAIC04OSw3ICs5NCw3IEBACiAgIC8qIFdpbmRvd3MgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIHZvaWQgKiAgICBscENyZWF0ZVBhcmFtczsKKyAgICBMUFZPSUQgICAgbHBDcmVhdGVQYXJhbXM7CiAgICAgSElOU1RBTkNFIGhJbnN0YW5jZTsKICAgICBITUVOVSAgICAgaE1lbnU7CiAgICAgSFdORCAgICAgIGh3bmRQYXJlbnQ7CkBAIC01NDIsNyArNTQ3LDExIEBACiB7IAogICAgIFdPUkQgICAgICAgbGJTdHlsZTsgCiAgICAgQ09MT1JSRUYgICBsYkNvbG9yIFdJTkVfUEFDS0VEOworI2lmZGVmIFdJTkVMSUIzMgorICAgIExPTkcgICAgICAgbGJIYXRjaDsgCisjZWxzZQogICAgIElOVCAgICAgIGxiSGF0Y2g7IAorI2VuZGlmCiB9IExPR0JSVVNILCAqUExPR0JSVVNILCAqTlBMT0dCUlVTSCwgKkxQTE9HQlJVU0g7CiAKICAgLyogQnJ1c2ggc3R5bGVzICovCkBAIC05OTAsNyArOTk5LDcgQEAKIHR5cGVkZWYgQklUTUFQSU5GTyAqTlBCSVRNQVBJTkZPOwogdHlwZWRlZiBCSVRNQVBJTkZPICpQQklUTUFQSU5GTzsKIAotdHlwZWRlZiBzdHJ1Y3QgdGFnQklUTUFQQ09SRUhFQURFUgordHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB1bnNpZ25lZCBsb25nIGJjU2l6ZTsKICAgICBVSU5UIGJjV2lkdGg7CkBAIC05OTksMTAgKzEwMDgsMzEgQEAKICAgICBVSU5UIGJjQml0Q291bnQ7CiB9IEJJVE1BUENPUkVIRUFERVI7CiAKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQklUTUFQQ09SRUhFQURFUiBibWNpSGVhZGVyOworICAgIFJHQlRSSVBMRSAgICAgICAgYm1jaUNvbG9yc1sxXTsKK30gQklUTUFQQ09SRUlORk8sICpMUEJJVE1BUENPUkVJTkZPOworCiAjZGVmaW5lIERJQl9SR0JfQ09MT1JTICAgMAogI2RlZmluZSBESUJfUEFMX0NPTE9SUyAgIDEKICNkZWZpbmUgQ0JNX0lOSVQgICAgICAgICA0CiAKKworICAvKiBDdXJzb3JzIC8gSWNvbnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQT0lOVCAgIHB0SG90U3BvdDsKKyAgICBXT1JEICAgIG5XaWR0aDsKKyAgICBXT1JEICAgIG5IZWlnaHQ7CisgICAgV09SRCAgICBuV2lkdGhCeXRlczsKKyAgICBCWVRFICAgIGJQbGFuZXM7CisgICAgQllURSAgICBiQml0c1BlclBpeGVsOworfSBDVVJTT1JJQ09OSU5GTzsKKworCisKIHR5cGVkZWYgc3RydWN0IHsKIAlCWVRFIGk7ICAvKiBtdWNoIG1vcmUgLi4uLiAqLwogfSBLQU5KSVNUUlVDVDsKQEAgLTEyODQsMTIgKzEzMTQsMTIgQEAKICNkZWZpbmUgSURDX1dBSVQgICAgICAgICBNQUtFSU5UUkVTT1VSQ0UoMzI1MTQpCiAjZGVmaW5lIElEQ19DUk9TUyAgICAgICAgTUFLRUlOVFJFU09VUkNFKDMyNTE1KQogI2RlZmluZSBJRENfVVBBUlJPVyAgICAgIE1BS0VJTlRSRVNPVVJDRSgzMjUxNikKLSNkZWZpbmUgSURDX1NJWkUgICAgICAgICBNQUtFSU5UUkVTT1VSQ0UoMzI1NDApCi0jZGVmaW5lIElEQ19JQ09OICAgICAgICAgTUFLRUlOVFJFU09VUkNFKDMyNTQxKQotI2RlZmluZSBJRENfU0laRU5XU0UgICAgIE1BS0VJTlRSRVNPVVJDRSgzMjU0MikKLSNkZWZpbmUgSURDX1NJWkVORVNXICAgICBNQUtFSU5UUkVTT1VSQ0UoMzI1NDMpCi0jZGVmaW5lIElEQ19TSVpFV0UgICAgICAgTUFLRUlOVFJFU09VUkNFKDMyNTQ0KQotI2RlZmluZSBJRENfU0laRU5TICAgICAgIE1BS0VJTlRSRVNPVVJDRSgzMjU0NSkKKyNkZWZpbmUgSURDX1NJWkUgICAgICAgICBNQUtFSU5UUkVTT1VSQ0UoMzI2NDApCisjZGVmaW5lIElEQ19JQ09OICAgICAgICAgTUFLRUlOVFJFU09VUkNFKDMyNjQxKQorI2RlZmluZSBJRENfU0laRU5XU0UgICAgIE1BS0VJTlRSRVNPVVJDRSgzMjY0MikKKyNkZWZpbmUgSURDX1NJWkVORVNXICAgICBNQUtFSU5UUkVTT1VSQ0UoMzI2NDMpCisjZGVmaW5lIElEQ19TSVpFV0UgICAgICAgTUFLRUlOVFJFU09VUkNFKDMyNjQ0KQorI2RlZmluZSBJRENfU0laRU5TICAgICAgIE1BS0VJTlRSRVNPVVJDRSgzMjY0NSkKIAogLyogT0VNIFJlc291cmNlIE9yZGluYWwgTnVtYmVycyAqLwogI2RlZmluZSBPQk1fQ0xPU0UgICAgICAgICAgIDMyNzU0CkBAIC0xMzc4LDExICsxNDA4LDExIEBACiAjZGVmaW5lIFNZU1RFTV9GSVhFRF9GT05UICAgMTYKIAogCi1lbnVtIHsgV01fTlVMTCwgV01fQ1JFQVRFLCBXTV9ERVNUUk9ZLCBXTV9NT1ZFLCBXTV9VTlVTRUQwLCBXTV9TSVpFLCBXTV9BQ1RJVkFURSwKLQlXTV9TRVRGT0NVUywgV01fS0lMTEZPQ1VTLCBXTV9VTlVTRUQxLCBXTV9FTkFCTEUsIFdNX1NFVFJFRFJBVywgCitlbnVtIHsgIFdNX05VTEwsIFdNX0NSRUFURSwgV01fREVTVFJPWSwgV01fTU9WRSwgV01fVU5VU0VEMCwgV01fU0laRSwgV01fQUNUSVZBVEUsCisJV01fU0VURk9DVVMsIFdNX0tJTExGT0NVUywgV01fU0VUVklTSUJMRSwgV01fRU5BQkxFLCBXTV9TRVRSRURSQVcsIAogCVdNX1NFVFRFWFQsIFdNX0dFVFRFWFQsIFdNX0dFVFRFWFRMRU5HVEgsIFdNX1BBSU5ULCBXTV9DTE9TRSwgCiAJV01fUVVFUllFTkRTRVNTSU9OLCBXTV9RVUlULCBXTV9RVUVSWU9QRU4sIFdNX0VSQVNFQktHTkQsIAotCVdNX1NZU0NPTE9SQ0hBTkdFLCBXTV9FTkRTRVNTSU9OLCBXTV9VTlVTRUQyLAorCVdNX1NZU0NPTE9SQ0hBTkdFLCBXTV9FTkRTRVNTSU9OLCBXTV9TWVNURU1FUlJPUiwKIAlXTV9TSE9XV0lORE9XLCBXTV9DVExDT0xPUiwgV01fV0lOSU5JQ0hBTkdFLCBXTV9ERVZNT0RFQ0hBTkdFLAogCVdNX0FDVElWQVRFQVBQLCBXTV9GT05UQ0hBTkdFLCBXTV9USU1FQ0hBTkdFLCBXTV9DQU5DRUxNT0RFLCBXTV9TRVRDVVJTT1IsCiAJV01fTU9VU0VBQ1RJVkFURSwgV01fQ0hJTERBQ1RJVkFURSwgV01fUVVFVUVTWU5DLCBXTV9HRVRNSU5NQVhJTkZPLApAQCAtMTM5MSw4ICsxNDIxLDE2IEBACiAJV01fREVMRVRFSVRFTSwgV01fVktFWVRPSVRFTSwKIAlXTV9DSEFSVE9JVEVNLCBXTV9TRVRGT05ULCBXTV9HRVRGT05UIH07CiAKKyNkZWZpbmUgV01fUVVFUllEUkFHSUNPTiAgICAweDAwMzcKKworI2RlZmluZSBXTV9DT01QQVJFSVRFTQkgICAgMHgwMDM5CisKKyNkZWZpbmUgV01fQ09NUEFDVElORwkgICAgMHgwMDQxCisKKyNkZWZpbmUgV01fQ09NTU5PVElGWQkgICAgMHgwMDQ0CiAjZGVmaW5lIFdNX1dJTkRPV1BPU0NIQU5HSU5HIDB4MDA0NgotI2RlZmluZSBXTV9XSU5ET1dQT1NDSEFOR0VEIDB4MDA0NworI2RlZmluZSBXTV9XSU5ET1dQT1NDSEFOR0VEICAweDAwNDcKKyNkZWZpbmUgV01fUE9XRVIJICAgIDB4MDA0OAogCiAjZGVmaW5lIFdNX05DQ1JFQVRFICAgICAgICAgMHgwMDgxCiAjZGVmaW5lIFdNX05DREVTVFJPWSAgICAgICAgMHgwMDgyCkBAIC0xNDAyLDYgKzE0NDAsNyBAQAogI2RlZmluZSBXTV9OQ0FDVElWQVRFICAgICAgIDB4MDA4NgogCiAjZGVmaW5lIFdNX0dFVERMR0NPREUJICAgIDB4MDA4NworI2RlZmluZSBXTV9TWU5DUEFJTlQJICAgIDB4MDA4OAogCiAgIC8qIE5vbi1jbGllbnQgbW91c2UgbWVzc2FnZXMgKi8KICNkZWZpbmUgV01fTkNNT1VTRU1PVkUgICAgICAweDAwYTAKQEAgLTE0MzcsOCArMTQ3NiwyNSBAQAogI2RlZmluZSBXTV9IU0NST0xMICAgICAgICAgIDB4MDExNAogI2RlZmluZSBXTV9WU0NST0xMICAgICAgICAgIDB4MDExNQogCisvKiBNZW51IG1lc3NhZ2VzICovCisjZGVmaW5lIFdNX0lOSVRNRU5VICAgICAgICAgMHgwMTE2CisjZGVmaW5lIFdNX0lOSVRNRU5VUE9QVVAgICAgMHgwMTE3CisKKyNkZWZpbmUgV01fTUVOVVNFTEVDVCAgICAgICAweDAxMUYKKyNkZWZpbmUgV01fTUVOVUNIQVIgICAgICAgICAweDAxMjAKICNkZWZpbmUgV01fRU5URVJJRExFICAgICAgICAweDAxMjEKIAorI2RlZmluZSBXTV9MQlRSQUNLUE9JTlQgICAgIDB4MDEzMQorCisgIC8qIFdpbjMyIENUTENPTE9SIG1lc3NhZ2VzICovCisjZGVmaW5lIFdNX0NUTENPTE9STVNHQk9YICAgIDB4MDEzMgorI2RlZmluZSBXTV9DVExDT0xPUkVESVQgICAgICAweDAxMzMKKyNkZWZpbmUgV01fQ1RMQ09MT1JMSVNUQk9YICAgMHgwMTM0CisjZGVmaW5lIFdNX0NUTENPTE9SQlROICAgICAgIDB4MDEzNQorI2RlZmluZSBXTV9DVExDT0xPUkRMRyAgICAgICAweDAxMzYKKyNkZWZpbmUgV01fQ1RMQ09MT1JTQ1JPTExCQVIgMHgwMTM3CisjZGVmaW5lIFdNX0NUTENPTE9SU1RBVElDICAgIDB4MDEzOAorCiAgIC8qIE1vdXNlIG1lc3NhZ2VzICovCiAjZGVmaW5lIFdNX01PVVNFTU9WRQkgICAgMHgwMjAwCiAjZGVmaW5lIFdNX0xCVVRUT05ET1dOCSAgICAweDAyMDEKQEAgLTE0NjcsMTUgKzE1MjMsNDQgQEAKICNkZWZpbmUgV01fTURJQ0FTQ0FERQkgICAgMHgwMjI3CiAjZGVmaW5lIFdNX01ESUlDT05BUlJBTkdFICAgMHgwMjI4CiAjZGVmaW5lIFdNX01ESUdFVEFDVElWRSAgICAgMHgwMjI5CisjZGVmaW5lIFdNX0RST1BPQkpFQ1QJICAgIDB4MDIyQQorI2RlZmluZSBXTV9RVUVSWURST1BPQkpFQ1QgIDB4MDIyQgorI2RlZmluZSBXTV9EUkFHTE9PUAkgICAgMHgwMjJECisjZGVmaW5lIFdNX0RSQUdTRUxFQ1QJICAgIDB4MDIyRQorI2RlZmluZSBXTV9EUkFHTU9WRQkgICAgMHgwMjJGCiAjZGVmaW5lIFdNX01ESVNFVE1FTlUJICAgIDB4MDIzMAogCiAjZGVmaW5lIFdNX0VOVEVSU0laRU1PVkUgICAgMHgwMjMxCiAjZGVmaW5lIFdNX0VYSVRTSVpFTU9WRSAgICAgMHgwMjMyCisjZGVmaW5lIFdNX0RST1BGSUxFUwkgICAgMHgwMjMzCisKKyNkZWZpbmUgV01fQ1VUICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIFdNX0NPUFkgICAgICAgICAgICAgIDB4MDMwMQorI2RlZmluZSBXTV9QQVNURSAgICAgICAgICAgICAweDAzMDIKKyNkZWZpbmUgV01fQ0xFQVIgICAgICAgICAgICAgMHgwMzAzCisjZGVmaW5lIFdNX1VORE8gICAgICAgICAgICAgIDB4MDMwNAorI2RlZmluZSBXTV9SRU5ERVJGT1JNQVQgICAgICAweDAzMDUKKyNkZWZpbmUgV01fUkVOREVSQUxMRk9STUFUUyAgMHgwMzA2CisjZGVmaW5lIFdNX0RFU1RST1lDTElQQk9BUkQgIDB4MDMwNworI2RlZmluZSBXTV9EUkFXQ0xJUEJPQVJEICAgICAweDAzMDgKKyNkZWZpbmUgV01fUEFJTlRDTElQQk9BUkQgICAgMHgwMzA5CisjZGVmaW5lIFdNX1ZTQ1JPTExDTElQQk9BUkQgIDB4MDMwQQorI2RlZmluZSBXTV9TSVpFQ0xJUEJPQVJEICAgICAweDAzMEIKKyNkZWZpbmUgV01fQVNLQ0JGT1JNQVROQU1FICAgMHgwMzBDCisjZGVmaW5lIFdNX0NIQU5HRUNCQ0hBSU4gICAgIDB4MDMwRAorI2RlZmluZSBXTV9IU0NST0xMQ0xJUEJPQVJEICAweDAzMEUKKyNkZWZpbmUgV01fUVVFUllORVdQQUxFVFRFICAgMHgwMzBGCisjZGVmaW5lIFdNX1BBTEVUVEVJU0NIQU5HSU5HIDB4MDMxMAorI2RlZmluZSBXTV9QQUxFVFRFQ0hBTkdFRCAgICAweDAzMTEKKworI2RlZmluZSBXTV9DT0FMRVNDRV9GSVJTVCAgICAweDAzOTAKKyNkZWZpbmUgV01fQ09BTEVTQ0VfTEFTVCAgICAgMHgwMzlGCiAKICAgLyogbWlzYyBtZXNzYWdlcyAqLwogI2RlZmluZSBXTV9OVUxMICAgICAgICAgICAgIDB4MDAwMAogI2RlZmluZSBXTV9VU0VSICAgICAgICAgICAgIDB4MDQwMAotCisjZGVmaW5lIFdNX0NQTF9MQVVOQ0ggICAgICAgKFdNX1VTRVIgKyAxMDAwKQorI2RlZmluZSBXTV9DUExfTEFVTkNIRUQgICAgIChXTV9VU0VSICsgMTAwMSkKIAogICAvKiBLZXkgc3RhdHVzIGZsYWdzIGZvciBtb3VzZSBldmVudHMgKi8KICNkZWZpbmUgTUtfTEJVVFRPTgkgICAgMHgwMDAxCkBAIC0xNTYwLDEzICsxNjQ1LDYgQEAKICNkZWZpbmUgVFBNX0NFTlRFUkFMSUdOIDB4MDAwNAogI2RlZmluZSBUUE1fUklHSFRBTElHTiAgMHgwMDA4CiAKLS8qIE1lbnUgbWVzc2FnZXMgKi8KLSNkZWZpbmUgV01fSU5JVE1FTlUgICAgICAgICAweDAxMTYKLSNkZWZpbmUgV01fSU5JVE1FTlVQT1BVUCAgICAweDAxMTcKLQotI2RlZmluZSBXTV9NRU5VU0VMRUNUICAgICAgIDB4MDExRgotI2RlZmluZSBXTV9NRU5VQ0hBUiAgICAgICAgIDB4MDEyMAotCiAjZGVmaW5lIE1GX0lOU0VSVCAwCiAjZGVmaW5lIE1GX0NIQU5HRSAweDAwODAKICNkZWZpbmUgTUZfQVBQRU5EIDB4MDEwMApAQCAtMjM3Miw2OTQgKzI0NTAsNjc3IEBACiAjcHJhZ21hIHBhY2soNCkKICNlbmRpZgogCi0KLSNkZWZpbmUgRihyZXQsbmFtZSkgcmV0IG5hbWUodm9pZCk7Ci0jZGVmaW5lIEZhKHJldCxuYW1lLHQxLGExKSByZXQgbmFtZSh0MSk7Ci0jZGVmaW5lIEZiKHJldCxuYW1lLHQxLGExLHQyLGEyKSByZXQgbmFtZSh0MSx0Mik7Ci0jZGVmaW5lIEZjKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzKSByZXQgbmFtZSh0MSx0Mix0Myk7Ci0jZGVmaW5lIEZkKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0KSByZXQgbmFtZSh0MSx0Mix0Myx0NCk7Ci0jZGVmaW5lIEZlKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1KSByZXQgbmFtZSh0MSx0Mix0Myx0NCx0NSk7Ci0jZGVmaW5lIEZmKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2KSByZXQgbmFtZSh0MSx0Mix0Myx0NCx0NSx0Nik7Ci0jZGVmaW5lIEZnKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3KSByZXQgbmFtZSh0MSx0Mix0Myx0NCx0NSx0Nix0Nyk7Ci0jZGVmaW5lIEZoKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3LHQ4LGE4KSByZXQgbmFtZSh0MSx0Mix0Myx0NCx0NSx0Nix0Nyx0OCk7Ci0jZGVmaW5lIEZpKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3LHQ4LGE4LHQ5LGE5KSByZXQgbmFtZSh0MSx0Mix0Myx0NCx0NSx0Nix0Nyx0OCx0OSk7Ci0jZGVmaW5lIEZqKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3LHQ4LGE4LHQ5LGE5LHQxMCxhMTApIHJldCBuYW1lKHQxLHQyLHQzLHQ0LHQ1LHQ2LHQ3LHQ4LHQ5LHQxMCk7Ci0jZGVmaW5lIEZrKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3LHQ4LGE4LHQ5LGE5LHQxMCxhMTAsdDExLGExMSkgcmV0IG5hbWUodDEsdDIsdDMsdDQsdDUsdDYsdDcsdDgsdDksdDEwLHQxMSk7Ci0jZGVmaW5lIEZsKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3LHQ4LGE4LHQ5LGE5LHQxMCxhMTAsdDExLGExMSx0MTIsYTEyKSByZXQgbmFtZSh0MSx0Mix0Myx0NCx0NSx0Nix0Nyx0OCx0OSx0MTAsdDExLHQxMik7Ci0jZGVmaW5lIEZtKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3LHQ4LGE4LHQ5LGE5LHQxMCxhMTAsdDExLGExMSx0MTIsYTEyLHQxMyxhMTMpIHJldCBuYW1lKHQxLHQyLHQzLHQ0LHQ1LHQ2LHQ3LHQ4LHQ5LHQxMCx0MTEsdDEyLHQxMyk7Ci0jZGVmaW5lIEZuKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3LHQ4LGE4LHQ5LGE5LHQxMCxhMTAsdDExLGExMSx0MTIsYTEyLHQxMyxhMTMsdDE0LGExNCkgcmV0IG5hbWUodDEsdDIsdDMsdDQsdDUsdDYsdDcsdDgsdDksdDEwLHQxMSx0MTIsdDEzLHQxNCk7Ci0KLWludCB3c3ByaW50ZihMUFNUUiBhLExQU1RSIGIsLi4uKTsKLQotLyogSW1wbGVtZW50ZWQgZnVuY3Rpb25zICovCi0KLUYoQk9PTCxBbnlQb3B1cCkKLUYoQk9PTCxDbG9zZUNsaXBib2FyZCkKLUYoQk9PTCxFbXB0eUNsaXBib2FyZCkKLUYoQk9PTCxHZXRJbnB1dFN0YXRlKQotRihCT09MLEluU2VuZE1lc3NhZ2UpCi1GKEJPT0wsU2V0RGVza1BhdHRlcm4pCi1GKERXT1JELEdldEN1cnJlbnRUaW1lKQotRihEV09SRCxHZXREaWFsb2dCYXNlVW5pdHMpCi1GKERXT1JELEdldE1lbnVDaGVja01hcmtEaW1lbnNpb25zKQotRihEV09SRCxHZXRNZXNzYWdlUG9zKQotRihEV09SRCxHZXRUaWNrQ291bnQpCi1GKEhBTkRMRSxHZXRDdXJyZW50VGFzaykKLUYoSE1FTlUsQ3JlYXRlTWVudSkKLUYoSE1FTlUsQ3JlYXRlUG9wdXBNZW51KQotRihIV05ELEdldEFjdGl2ZVdpbmRvdykKLUYoSFdORCxHZXRDYXB0dXJlKQotRihIV05ELEdldENsaXBib2FyZE93bmVyKQotRihIV05ELEdldENsaXBib2FyZFZpZXdlcikKLUYoSFdORCxHZXREZXNrdG9wSHduZCkKLUYoSFdORCxHZXREZXNrdG9wV2luZG93KQotRihIV05ELEdldEZvY3VzKQotRihIV05ELEdldE9wZW5DbGlwYm9hcmRXaW5kb3cpCi1GKEhXTkQsR2V0U3lzTW9kYWxXaW5kb3cpCi1GKExPTkcsR2V0TWVzc2FnZUV4dHJhSW5mbykKLUYoTE9ORyxHZXRNZXNzYWdlVGltZSkKLUYoTE9ORyxHZXRWZXJzaW9uKQotRihMT05HLEdldFdpbkZsYWdzKQotRihMUElOVCxHZXRUaHJlc2hvbGRFdmVudCkKLUYoTFBTVFIsVmFsaWRhdGVGcmVlU3BhY2VzKQotRihTRUdQVFIsR2V0RE9TRW52aXJvbm1lbnQpCi1GKFdPUkQsR2V0Q2FyZXRCbGlua1RpbWUpCi1GKFdPUkQsR2V0Q3VycmVudFBEQikKLUYoV09SRCxHZXREb3VibGVDbGlja1RpbWUpCi1GKFdPUkQsR2V0TnVtVGFza3MpCi1GKFdPUkQsR2V0VGFza0RTKQotRihpbnQsQ291bnRDbGlwYm9hcmRGb3JtYXRzKQotRihpbnQsR2V0S0JDb2RlUGFnZSkKLUYoaW50LEdldFRocmVzaG9sZFN0YXR1cykKLUYoaW50LE9wZW5Tb3VuZCkKLUYoaW50LFByb2ZJbnNDaGspCi1GKGludCxTdGFydFNvdW5kKQotRihpbnQsU3RvcFNvdW5kKQotRihpbnQsU3luY0FsbFZvaWNlcykKLUYodm9pZCxDbG9zZVNvdW5kKQotRih2b2lkLERlYnVnQnJlYWspCi1GKHZvaWQsRGVzdHJveUNhcmV0KQotRih2b2lkLFByb2ZDbGVhcikKLUYodm9pZCxQcm9mRmluaXNoKQotRih2b2lkLFByb2ZGbHVzaCkKLUYodm9pZCxQcm9mU3RhcnQpCi1GKHZvaWQsUHJvZlN0b3ApCi1GKHZvaWQsUmVsZWFzZUNhcHR1cmUpCi1GKHZvaWQsU3dpdGNoU3RhY2tCYWNrKQotRih2b2lkLFZhbGlkYXRlQ29kZVNlZ21lbnRzKQotRih2b2lkLFdhaXRNZXNzYWdlKQotRih2b2lkLFlpZWxkKQotRmEoQVRPTSxBZGRBdG9tLFNFR1BUUixhKQotRmEoQVRPTSxEZWxldGVBdG9tLEFUT00sYSkKLUZhKEFUT00sRmluZEF0b20sU0VHUFRSLGEpCi1GYShBVE9NLEdsb2JhbEFkZEF0b20sU0VHUFRSLGEpCi1GYShBVE9NLEdsb2JhbERlbGV0ZUF0b20sQVRPTSxhKQotRmEoQVRPTSxHbG9iYWxGaW5kQXRvbSxTRUdQVFIsYSkKLUZhKEFUT00sUmVnaXN0ZXJDbGFzcyxMUFdORENMQVNTLGEpIAotRmEoQk9PTCxCcmluZ1dpbmRvd1RvVG9wLEhXTkQsYSkKLUZhKEJPT0wsRGVsZXRlREMsSERDLGEpCi1GYShCT09MLERlbGV0ZU1ldGFGaWxlLEhNRVRBRklMRSxhKQotRmEoQk9PTCxEZWxldGVPYmplY3QsSEFORExFLGEpCi1GYShCT09MLERlc3Ryb3lDdXJzb3IsSENVUlNPUixhKQotRmEoQk9PTCxEZXN0cm95SWNvbixISUNPTixhKQotRmEoQk9PTCxEZXN0cm95TWVudSxITUVOVSxhKQotRmEoQk9PTCxEZXN0cm95V2luZG93LEhXTkQsYSkKLUZhKEJPT0wsRW5hYmxlSGFyZHdhcmVJbnB1dCxCT09MLGEpCi1GYShCT09MLEVuZERlZmVyV2luZG93UG9zLEhEV1AsaFdpblBvc0luZm8pCi1GYShCT09MLEZyZWVNb2R1bGUsSEFORExFLGEpCi1GYShCT09MLEZyZWVSZXNvdXJjZSxIQU5ETEUsYSkKLUZhKEJPT0wsR2xvYmFsVW5XaXJlLEhHTE9CQUwsYSkKLUZhKEJPT0wsR2xvYmFsVW5sb2NrLEhHTE9CQUwsYSkKLUZhKEJPT0wsSXNCYWRDb2RlUHRyLFNFR1BUUixhKQotRmEoQk9PTCxJc0NoYXJBbHBoYSxjaGFyLGNoKQotRmEoQk9PTCxJc0NoYXJBbHBoYU51bWVyaWMsY2hhcixjaCkKLUZhKEJPT0wsSXNDaGFyTG93ZXIsY2hhcixjaCkKLUZhKEJPT0wsSXNDaGFyVXBwZXIsY2hhcixjaCkKLUZhKEJPT0wsSXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUsV09SRCxhKQotRmEoQk9PTCxJc0ljb25pYyxIV05ELGEpCi1GYShCT09MLElzUmVjdEVtcHR5LExQUkVDVCxhKQotRmEoQk9PTCxJc1R3b0J5dGVDaGFyUHJlZml4LGNoYXIsYSkKLUZhKEJPT0wsSXNXaW5kb3csSFdORCxhKQotRmEoQk9PTCxJc1dpbmRvd0VuYWJsZWQsSFdORCxhKQotRmEoQk9PTCxJc1dpbmRvd1Zpc2libGUsSFdORCxhKQotRmEoQk9PTCxJc1pvb21lZCxIV05ELGEpCi1GYShCT09MLExvY2FsVW5sb2NrLEhBTkRMRSxhKQotRmEoQk9PTCxPcGVuQ2xpcGJvYXJkLEhXTkQsYSkKLUZhKEJPT0wsT3Blbkljb24sSFdORCxhKQotRmEoQk9PTCxSZW1vdmVGb250UmVzb3VyY2UsTFBTVFIsYSkKLUZhKEJPT0wsU2V0RGVza1dhbGxQYXBlcixMUFNUUixhKQotRmEoQk9PTCxTZXRFcnJvck1vZGUsV09SRCxhKQotRmEoQk9PTCxTZXRNZXNzYWdlUXVldWUsaW50LGEpCi1GYShCT09MLFNldFdpbkRlYnVnSW5mbyxMUFdJTkRFQlVHSU5GTyxhKQotRmEoQk9PTCxTd2FwTW91c2VCdXR0b24sQk9PTCxhKQotRmEoQk9PTCxUcmFuc2xhdGVNZXNzYWdlLExQTVNHLGEpCi1GYShCT09MLFVuaG9va1dpbmRvd3NIb29rRXgsSEhPT0ssYSkKLUZhKEJPT0wsVW5yZWFsaXplT2JqZWN0LEhCUlVTSCxhKQotRmEoQllURSxHZXRUZW1wRHJpdmUsQllURSxhKQotRmEoQ09MT1JSRUYsR2V0QmtDb2xvcixIREMsYSkKLUZhKENPTE9SUkVGLEdldFN5c0NvbG9yLHNob3J0LGEpCi1GYShDT0xPUlJFRixHZXRUZXh0Q29sb3IsSERDLGEpCi1GYShEV09SRCxHZXRBc3BlY3RSYXRpb0ZpbHRlcixIREMsYSkKLUZhKERXT1JELEdldEJpdG1hcERpbWVuc2lvbixIQklUTUFQLGEpCi1GYShEV09SRCxHZXRCcnVzaE9yZyxIREMsYSkKLUZhKERXT1JELEdldEN1cnJlbnRQb3NpdGlvbixIREMsYSkKLUZhKERXT1JELEdldERDT3JnLEhEQyxhKQotRmEoRFdPUkQsR2V0RnJlZVNwYWNlLFdPUkQsYSkKLUZhKERXT1JELEdldEhlYXBTcGFjZXMsSE1PRFVMRSxhKQotRmEoRFdPUkQsR2V0U2VsZWN0b3JCYXNlLFdPUkQsYSkKLUZhKERXT1JELEdldFNlbGVjdG9yTGltaXQsV09SRCxhKQotRmEoRFdPUkQsR2V0Vmlld3BvcnRFeHQsSERDLGEpCi1GYShEV09SRCxHZXRWaWV3cG9ydE9yZyxIREMsYSkKLUZhKERXT1JELEdldFdpbmRvd0V4dCxIREMsYSkKLUZhKERXT1JELEdldFdpbmRvd09yZyxIREMsYSkKLUZhKERXT1JELEdsb2JhbENvbXBhY3QsRFdPUkQsYSkKLUZhKERXT1JELEdsb2JhbERPU0FsbG9jLERXT1JELGEpCi1GYShEV09SRCxHbG9iYWxIYW5kbGUsV09SRCxhKQotRmEoRFdPUkQsR2xvYmFsU2l6ZSxIR0xPQkFMLGEpCi1GYShEV09SRCxPZW1LZXlTY2FuLFdPUkQsYSkKLUZhKEZBUlBST0MsTG9jYWxOb3RpZnksRkFSUFJPQyxhKQotRmEoSEFORExFLENyZWF0ZU1ldGFGaWxlLExQU1RSLGEpCi1GYShIQU5ETEUsR2V0QXRvbUhhbmRsZSxBVE9NLGEpCi1GYShIQU5ETEUsR2V0Q2xpcGJvYXJkRGF0YSxXT1JELGEpCi1GYShIQU5ETEUsR2V0Q29kZUhhbmRsZSxGQVJQUk9DLGEpCi1GYShIQU5ETEUsR2V0TWV0YUZpbGUsTFBTVFIsYSkKLUZhKEhBTkRMRSxHZXRNZXRhRmlsZUJpdHMsSEFORExFLGEpCi1GYShIQU5ETEUsR2V0TW9kdWxlSGFuZGxlLExQQ1NUUixhKQotRmEoSEFORExFLEdldFN0b2NrT2JqZWN0LGludCxhKQotRmEoSEFORExFLEdldFdpbmRvd1Rhc2ssSFdORCxhKQotRmEoSEFORExFLExvYWRMaWJyYXJ5LExQQ1NUUixhKQotRmEoSEFORExFLExvY2FsRnJlZSxIQU5ETEUsYSkKLUZhKEhBTkRMRSxMb2NhbEhhbmRsZSxXT1JELGEpCi1GYShIQU5ETEUsU2V0TWV0YUZpbGVCaXRzLEhBTkRMRSxhKQotRmEoSEJJVE1BUCxDcmVhdGVCaXRtYXBJbmRpcmVjdCxCSVRNQVAgRkFSKixhKQotRmEoSEJSVVNILENyZWF0ZUJydXNoSW5kaXJlY3QsTE9HQlJVU0ggRkFSKixhKQotRmEoSEJSVVNILENyZWF0ZVBhdHRlcm5CcnVzaCxIQklUTUFQLGEpCi1GYShIQlJVU0gsQ3JlYXRlU29saWRCcnVzaCxEV09SRCxhKQotRmEoSENVUlNPUixTZXRDdXJzb3IsSENVUlNPUixhKQotRmEoSERDLENyZWF0ZUNvbXBhdGlibGVEQyxIREMsYSkKLUZhKEhEQyxHZXREQyxIV05ELGEpCi1GYShIREMsR2V0RENTdGF0ZSxIREMsYSkKLUZhKEhEQyxHZXRXaW5kb3dEQyxIV05ELGEpCi1GYShIRFdQLEJlZ2luRGVmZXJXaW5kb3dQb3MsSU5ULG5OdW1XaW5kb3dzKQotRmEoSEZPTlQsQ3JlYXRlRm9udEluZGlyZWN0LExPR0ZPTlQgRkFSKixhKQotRmEoSEdMT0JBTCxHZXRUYXNrUXVldWUsSFRBU0ssYSkKLUZhKEhHTE9CQUwsR2xvYmFsRnJlZSxIR0xPQkFMLGEpCi1GYShIR0xPQkFMLEdsb2JhbExSVU5ld2VzdCxIR0xPQkFMLGEpCi1GYShIR0xPQkFMLEdsb2JhbExSVU9sZGVzdCxIR0xPQkFMLGEpCi1GYShIR0xPQkFMLExvY2tTZWdtZW50LEhHTE9CQUwsYSkKLUZhKEhNRU5VLEdldE1lbnUsSFdORCxhKQotRmEoSE1FTlUsTG9hZE1lbnVJbmRpcmVjdCxMUFNUUixhKQotRmEoSE1FVEFGSUxFLENsb3NlTWV0YUZpbGUsSEFORExFLGEpCi1GYShITU9EVUxFLCBHZXRFeGVQdHIsSEFORExFLGEpCi1GYShIUEFMRVRURSxDcmVhdGVQYWxldHRlLExQTE9HUEFMRVRURSxhKQotRmEoSFBFTixDcmVhdGVQZW5JbmRpcmVjdCxMT0dQRU4gRkFSKixhKQotRmEoSFJHTixDcmVhdGVFbGxpcHRpY1JnbkluZGlyZWN0LExQUkVDVCxhKQotRmEoSFJHTixDcmVhdGVSZWN0UmduSW5kaXJlY3QsTFBSRUNULGEpCi1GYShIUkdOLEdldENsaXBSZ24sSERDLGEpCi1GYShIUkdOLElucXVpcmVWaXNSZ24sSERDLGEpCi1GYShIUkdOLFNhdmVWaXNSZ24sSERDLGEpCi1GYShIV05ELEdldExhc3RBY3RpdmVQb3B1cCxIV05ELGEpCi1GYShIV05ELEdldFBhcmVudCxIV05ELGEpCi1GYShIV05ELEdldFRvcFdpbmRvdyxIV05ELGEpCi1GYShIV05ELFNldEFjdGl2ZVdpbmRvdyxIV05ELGEpCi1GYShIV05ELFNldENhcHR1cmUsSFdORCxhKQotRmEoSFdORCxTZXRDbGlwYm9hcmRWaWV3ZXIsSFdORCxhKQotRmEoSFdORCxTZXRGb2N1cyxIV05ELGEpCi1GYShIV05ELFNldFN5c01vZGFsV2luZG93LEhXTkQsYSkKLUZhKEhXTkQsV2luZG93RnJvbVBvaW50LFBPSU5ULGEpCi1GYShJTlQsX2xjbG9zZSxJTlQsYSkKLUZhKElOVCxsc3RybGVuLExQQ1NUUixhKQotRmEoTE9ORyxEaXNwYXRjaE1lc3NhZ2UsTFBNU0csbXNnKQotRmEoTE9ORyxTZXRTd2FwQXJlYVNpemUsV09SRCxhKQotRmEoTFBTVFIsQW5zaUxvd2VyLExQU1RSLGEpCi1GYShMUFNUUixBbnNpVXBwZXIsTFBTVFIsYSkKLUZhKExQU1RSLEdsb2JhbExvY2ssSEdMT0JBTCxhKQotRmEoTFBTVFIsTG9ja1Jlc291cmNlLEhBTkRMRSxhKQotRmEoU0VHUFRSLEFuc2lOZXh0LFNFR1BUUixhKQotRmEoU0VHUFRSLEdsb2JhbFdpcmUsSEdMT0JBTCxhKQotRmEoU0VHUFRSLFdJTjE2X0dsb2JhbExvY2ssSEdMT0JBTCxhKQotRmEoU0VHUFRSLFdJTjE2X0xvY2tSZXNvdXJjZSxIQU5ETEUsYSkKLUZhKFVJTlQsR0RJUmVhbGl6ZVBhbGV0dGUsSERDLGEpCi1GYShVSU5ULFJlYWxpemVQYWxldHRlLEhEQyxhKQotRmEoV09SRCxBbGxvY0NTdG9EU0FsaWFzLFdPUkQsYSkKLUZhKFdPUkQsQWxsb2NEU3RvQ1NBbGlhcyxXT1JELGEpCi1GYShXT1JELEFsbG9jU2VsZWN0b3IsV09SRCxhKQotRmEoV09SRCxBbGxvY1NlbGVjdG9yQXJyYXksV09SRCxhKQotRmEoV09SRCxBcnJhbmdlSWNvbmljV2luZG93cyxIV05ELGEpCi1GYShXT1JELEVudW1DbGlwYm9hcmRGb3JtYXRzLFdPUkQsYSkKLUZhKFdPUkQsRmFyR2V0T3duZXIsSEFORExFLGEpCi1GYShXT1JELEZyZWVTZWxlY3RvcixXT1JELGEpCi1GYShXT1JELEdldEJrTW9kZSxIREMsYSkKLUZhKFdPUkQsR2V0RHJpdmVUeXBlLElOVCxhKQotRmEoV09SRCxHZXRNYXBNb2RlLEhEQyxhKQotRmEoV09SRCxHZXRNZW51SXRlbUNvdW50LEhNRU5VLGEpCi1GYShXT1JELEdldFBvbHlGaWxsTW9kZSxIREMsYSkKLUZhKFdPUkQsR2V0Uk9QMixIREMsYSkKLUZhKFdPUkQsR2V0UmVsQWJzLEhEQyxhKQotRmEoV09SRCxHZXRTdHJldGNoQmx0TW9kZSxIREMsYSkKLUZhKFdPUkQsR2V0U3lzdGVtUGFsZXR0ZVVzZSxIREMsYSkKLUZhKFdPUkQsR2V0VGV4dEFsaWduLEhEQyxhKQotRmEoV09SRCxHbG9iYWxET1NGcmVlLFdPUkQsYSkKLUZhKFdPUkQsR2xvYmFsRmxhZ3MsSEdMT0JBTCxhKQotRmEoV09SRCxHbG9iYWxQYWdlTG9jayxIR0xPQkFMLGEpCi1GYShXT1JELEdsb2JhbFBhZ2VVbmxvY2ssSEdMT0JBTCxhKQotRmEoV09SRCxJbml0QXRvbVRhYmxlLFdPUkQsYSkKLUZhKFdPUkQsTG9jYWxDb21wYWN0LFdPUkQsYSkKLUZhKFdPUkQsTG9jYWxGbGFncyxITE9DQUwsYSkKLUZhKFdPUkQsTG9jYWxMb2NrLEhMT0NBTCxhKQotRmEoV09SRCxMb2NhbFNpemUsSExPQ0FMLGEpCi1GYShXT1JELFJlYWxpemVEZWZhdWx0UGFsZXR0ZSxIREMsYSkKLUZhKFdPUkQsUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQsTFBDU1RSLGEpCi1GYShXT1JELFJlZ2lzdGVyV2luZG93TWVzc2FnZSxTRUdQVFIsYSkKLUZhKFdPUkQsU2V0SGFuZGxlQ291bnQsV09SRCxhKQotRmEoV09SRCxWa0tleVNjYW4sV09SRCxhKQotRmEoaW50LEFkZEZvbnRSZXNvdXJjZSxMUFNUUixhKQotRmEoaW50LENhdGNoLExQQ0FUQ0hCVUYsYSkKLUZhKGludCxDbGVhckNvbW1CcmVhayxpbnQsYSkKLUZhKGludCxDbG9zZUNvbW0saW50LGEpCi1GYShpbnQsQ291bnRWb2ljZU5vdGVzLGludCxhKQotRmEoaW50LEdldEFzeW5jS2V5U3RhdGUsaW50LGEpCi1GYShpbnQsR2V0RGxnQ3RybElELEhXTkQsYSkKLUZhKGludCxHZXRLZXlTdGF0ZSxpbnQsYSkKLUZhKGludCxHZXRLZXlib2FyZFR5cGUsaW50LGEpCi1GYShpbnQsR2V0TW9kdWxlVXNhZ2UsSEFORExFLGEpCi1GYShpbnQsR2V0U3lzdGVtTWV0cmljcyxXT1JELGEpCi1GYShpbnQsR2V0V2luZG93VGV4dExlbmd0aCxIV05ELGEpCi1GYShpbnQsUmVzdG9yZVZpc1JnbixIREMsYSkKLUZhKGludCxTYXZlREMsSERDLGEpCi1GYShpbnQsU2V0Q29tbUJyZWFrLGludCxhKQotRmEoaW50LFNldENvbW1TdGF0ZSxEQ0IqLGEpCi1GYShpbnQsU2hvd0N1cnNvcixCT09MLGEpCi1GYShpbnQsVXBkYXRlQ29sb3JzLEhEQyxhKQotRmEoaW50LFdhaXRTb3VuZFN0YXRlLGludCxhKQotRmEoc2hvcnQsR2V0VGV4dENoYXJhY3RlckV4dHJhLEhEQyxhKQotRmEodm9pZCxDbGlwQ3Vyc29yLExQUkVDVCxhKQotRmEodm9pZCxDbG9zZVdpbmRvdyxIV05ELGEpCi1GYSh2b2lkLERyYXdNZW51QmFyLEhXTkQsYSkKLUZhKHZvaWQsRmF0YWxFeGl0LGludCxhKQotRmEodm9pZCxGcmVlTGlicmFyeSxIQU5ETEUsYSkKLUZhKHZvaWQsRnJlZVByb2NJbnN0YW5jZSxGQVJQUk9DLGEpCi1GYSh2b2lkLEdldENhcmV0UG9zLExQUE9JTlQsYSkKLUZhKHZvaWQsR2V0Q3Vyc29yUG9zLExQUE9JTlQsYSkKLUZhKHZvaWQsR2V0S2V5Ym9hcmRTdGF0ZSxCWVRFIEZBUiosYSkKLUZhKHZvaWQsR2xvYmFsRml4LEhHTE9CQUwsYSkKLUZhKHZvaWQsR2xvYmFsRnJlZUFsbCxIQU5ETEUsYSkKLUZhKHZvaWQsR2xvYmFsTm90aWZ5LEZBUlBST0MsYSkKLUZhKHZvaWQsR2xvYmFsVW5maXgsSEdMT0JBTCxhKQotRmEodm9pZCxIaWRlQ2FyZXQsSFdORCxhKQotRmEodm9pZCxMaW1pdEVtc1BhZ2VzLERXT1JELGEpCi1GYSh2b2lkLE1lc3NhZ2VCZWVwLFdPUkQsYSkKLUZhKHZvaWQsT3V0cHV0RGVidWdTdHJpbmcsTFBTVFIsYSkKLUZhKHZvaWQsUG9zdFF1aXRNZXNzYWdlLGludCxhKQotRmEodm9pZCxSZXBseU1lc3NhZ2UsTE9ORyxhKQotRmEodm9pZCxTZXRDYXJldEJsaW5rVGltZSxXT1JELGEpCi1GYSh2b2lkLFNldENvbnZlcnRIb29rLEJPT0wsYSkKLUZhKHZvaWQsU2V0RG91YmxlQ2xpY2tUaW1lLFdPUkQsYSkKLUZhKHZvaWQsU2V0S2V5Ym9hcmRTdGF0ZSxCWVRFIEZBUiosYSkKLUZhKHZvaWQsU2V0UmVjdEVtcHR5LExQUkVDVCxhKQotRmEodm9pZCxTaG93Q2FyZXQsSFdORCxhKQotRmEodm9pZCxTd2FwUmVjb3JkaW5nLFdPUkQsYSkKLUZhKHZvaWQsVW5sb2NrU2VnbWVudCxIR0xPQkFMLGEpCi1GYSh2b2lkLFVwZGF0ZVdpbmRvdyxIV05ELGEpCi1GYihCT09MLENhbGxNc2dGaWx0ZXIsU0VHUFRSLGEsc2hvcnQsYikKLUZiKEJPT0wsQ2hhbmdlQ2xpcGJvYXJkQ2hhaW4sSFdORCxhLEhXTkQsYikKLUZiKEJPT0wsRW5hYmxlV2luZG93LEhXTkQsYSxCT09MLGIpCi1GYihCT09MLEVudW1XaW5kb3dzLEZBUlBST0MsYSxMT05HLGIpCi1GYihCT09MLEVxdWFsUmVjdCxMUFJFQ1QsYSxMUFJFQ1QsYikKLUZiKEJPT0wsRXF1YWxSZ24sSFJHTixhLEhSR04sYikKLUZiKEJPT0wsRXhpdFdpbmRvd3MsRFdPUkQsZHdSZXNlcnZlZCxXT1JELHdSZXR1cm5Db2RlKQotRmIoQk9PTCxGbGFzaFdpbmRvdyxIV05ELGEsQk9PTCxiKQotRmIoQk9PTCxHZXRCaXRtYXBEaW1lbnNpb25FeCxIQklUTUFQLGEsTFBTSVpFLGIpCi1GYihCT09MLEdldEJydXNoT3JnRXgsSERDLGEsTFBQT0lOVCxiKQotRmIoQk9PTCxHZXRDdXJyZW50UG9zaXRpb25FeCxIREMsYSxMUFBPSU5ULGIpCi1GYihCT09MLEdldFRleHRNZXRyaWNzLEhEQyxhLExQVEVYVE1FVFJJQyxiKQotRmIoQk9PTCxHZXRWaWV3cG9ydEV4dEV4LEhEQyxhLExQUE9JTlQsYikKLUZiKEJPT0wsR2V0Vmlld3BvcnRPcmdFeCxIREMsYSxMUFBPSU5ULGIpCi1GYihCT09MLEdldFdpbkRlYnVnSW5mbyxMUFdJTkRFQlVHSU5GTyxhLFVJTlQsYikKLUZiKEJPT0wsR2V0V2luZG93RXh0RXgsSERDLGEsTFBQT0lOVCxiKQotRmIoQk9PTCxHZXRXaW5kb3dPcmdFeCxIREMsYSxMUFBPSU5ULGIpCi1GYihCT09MLEdldFdpbmRvd1BsYWNlbWVudCxIV05ELGEsTFBXSU5ET1dQTEFDRU1FTlQsYikKLUZiKEJPT0wsSW52ZXJ0UmduLEhEQyxhLEhSR04sYikKLUZiKEJPT0wsSXNCYWRIdWdlUmVhZFB0cixTRUdQVFIsYSxEV09SRCxiKQotRmIoQk9PTCxJc0JhZEh1Z2VXcml0ZVB0cixTRUdQVFIsYSxEV09SRCxiKQotRmIoQk9PTCxJc0JhZFJlYWRQdHIsU0VHUFRSLGEsV09SRCxiKQotRmIoQk9PTCxJc0JhZFN0cmluZ1B0cixTRUdQVFIsYSxXT1JELGIpCi1GYihCT09MLElzQmFkV3JpdGVQdHIsU0VHUFRSLGEsV09SRCxiKQotRmIoQk9PTCxJc0NoaWxkLEhXTkQsYSxIV05ELGIpCi1GYihCT09MLElzRGlhbG9nTWVzc2FnZSxIV05ELGEsTFBNU0csYikKLUZiKEJPT0wsS2lsbFN5c3RlbVRpbWVyLEhXTkQsYSxXT1JELGIpCi1GYihCT09MLEtpbGxUaW1lcixIV05ELGEsV09SRCxiKQotRmIoQk9PTCxPZW1Ub0Fuc2ksTFBTVFIsYSxMUFNUUixiKQotRmIoQk9PTCxQYWludFJnbixIREMsYSxIUkdOLGIpCi1GYihCT09MLFBsYXlNZXRhRmlsZSxIREMsYSxIQU5ETEUsYikKLUZiKEJPT0wsUHRJblJlY3QsTFBSRUNULGEsUE9JTlQsYikKLUZiKEJPT0wsUmVjdEluUmVnaW9uLEhSR04sYSxMUFJFQ1QsYikKLUZiKEJPT0wsUmVjdFZpc2libGUsSERDLGEsTFBSRUNULGIpCi1GYihCT09MLFJlc2l6ZVBhbGV0dGUsSFBBTEVUVEUsYSxXT1JELGIpCi1GYihCT09MLFJlc3RvcmVEQyxIREMsYSxzaG9ydCxiKQotRmIoQk9PTCxTZXRDb252ZXJ0UGFyYW1zLGludCxhLGludCxiKQotRmIoQk9PTCxTZXRNZW51LEhXTkQsYSxITUVOVSxiKQotRmIoQk9PTCxTZXRXaW5kb3dQbGFjZW1lbnQsSFdORCxhLExQV0lORE9XUExBQ0VNRU5ULGIpCi1GYihCT09MLFNob3dXaW5kb3csSFdORCxhLGludCxiKSAKLUZiKEJPT0wsVHJhbnNsYXRlTURJU3lzQWNjZWwsSFdORCxhLExQTVNHLGIpCi1GYihCT09MLFVuaG9va1dpbmRvd3NIb29rLHNob3J0LGEsRkFSUFJPQyxiKQotRmIoQk9PTCxVbnJlZ2lzdGVyQ2xhc3MsU0VHUFRSLGEsSEFORExFLGIpCi1GYihEV09SRCxHZXROZWFyZXN0Q29sb3IsSERDLGEsRFdPUkQsYikKLUZiKERXT1JELFNldEJrQ29sb3IsSERDLGEsQ09MT1JSRUYsYikKLUZiKERXT1JELFNldE1hcHBlckZsYWdzLEhEQyxhLERXT1JELGIpCi1GYihEV09SRCxTZXRUZXh0Q29sb3IsSERDLGEsRFdPUkQsYikKLUZiKERXT1JELFNpemVvZlJlc291cmNlLEhBTkRMRSxhLEhSU1JDLGIpCi1GYihGQVJQUk9DLEdldFByb2NBZGRyZXNzLEhBTkRMRSxhLFNFR1BUUixiKQotRmIoRkFSUFJPQyxNYWtlUHJvY0luc3RhbmNlLEZBUlBST0MsYSxIQU5ETEUsYikKLUZiKEZBUlBST0MsU2V0V2luZG93c0hvb2ssc2hvcnQsYSxGQVJQUk9DLGIpCi1GYihIQU5ETEUsQ29weU1ldGFGaWxlLEhBTkRMRSxhLExQU1RSLGIpCi1GYihIQU5ETEUsR2V0UHJvcCxIV05ELGEsU0VHUFRSLGIpCi1GYihIQU5ETEUsTG9hZEFjY2VsZXJhdG9ycyxIQU5ETEUsYSxTRUdQVFIsYikKLUZiKEhBTkRMRSxMb2FkTW9kdWxlLExQQ1NUUixhLExQVk9JRCxiKQotRmIoSEFORExFLExvYWRSZXNvdXJjZSxIQU5ETEUsYSxIQU5ETEUsYikKLUZiKEhBTkRMRSxMb2NhbEFsbG9jLFdPUkQsYSxXT1JELGIpCi1GYihIQU5ETEUsUmVtb3ZlUHJvcCxIV05ELGEsU0VHUFRSLGIpCi1GYihIQU5ETEUsU2VsZWN0T2JqZWN0LEhEQyxhLEhBTkRMRSxiKQotRmIoSEFORExFLFNldENsaXBib2FyZERhdGEsV09SRCxhLEhBTkRMRSxiKQotRmIoSEJJVE1BUCxMb2FkQml0bWFwLEhBTkRMRSxhLFNFR1BUUixiKQotRmIoSEJSVVNILENyZWF0ZURJQlBhdHRlcm5CcnVzaCxIQU5ETEUsYSxXT1JELGIpCi1GYihIQlJVU0gsQ3JlYXRlSGF0Y2hCcnVzaCxzaG9ydCxhLENPTE9SUkVGLGIpCi1GYihIQ1VSU09SLExvYWRDdXJzb3IsSEFORExFLGEsU0VHUFRSLGIpCi1GYihIREMsQmVnaW5QYWludCxIV05ELGEsTFBQQUlOVFNUUlVDVCxiKSAKLUZiKEhHTE9CQUwsR2xvYmFsQWxsb2MsV09SRCxhLERXT1JELGIpCi1GYihIR0xPQkFMLFNldFRhc2tRdWV1ZSxIVEFTSyxhLEhHTE9CQUwsYikKLUZiKEhJQ09OLExvYWRJY29uLEhBTkRMRSxhLFNFR1BUUixiKQotRmIoSE1FTlUsR2V0U3ViTWVudSxITUVOVSxhLHNob3J0LGIpCi1GYihITUVOVSxHZXRTeXN0ZW1NZW51LEhXTkQsYSxCT09MLGIpCi1GYihITUVOVSxMb2FkTWVudSxIQU5ETEUsYSxTRUdQVFIsYikKLUZiKEhNRU5VLExvb2t1cE1lbnVIYW5kbGUsSE1FTlUsYSxJTlQsYikKLUZiKEhQQUxFVFRFLEdESVNlbGVjdFBhbGV0dGUsSERDLGEsSFBBTEVUVEUsYikKLUZiKEhXTkQsQ2hpbGRXaW5kb3dGcm9tUG9pbnQsSFdORCxhLFBPSU5ULGIpCi1GYihIV05ELEZpbmRXaW5kb3csU0VHUFRSLGEsTFBTVFIsYikKLUZiKEhXTkQsR2V0RGxnSXRlbSxIV05ELGEsV09SRCxiKQotRmIoSFdORCxHZXROZXh0V2luZG93LEhXTkQsYSxXT1JELGIpCi1GYihIV05ELEdldFdpbmRvdyxIV05ELGEsV09SRCxiKQotRmIoSFdORCxTZXRQYXJlbnQsSFdORCxhLEhXTkQsYikKLUZiKElOVCxBbnNpVG9PZW0sTFBTVFIsYSxMUFNUUixiKQotRmIoSU5ULF9sY3JlYXQsTFBTVFIsYSxJTlQsYikKLUZiKElOVCxfbG9wZW4sTFBTVFIsYSxJTlQsYikKLUZiKElOVCxsc3RyY21wLExQQ1NUUixhLExQQ1NUUixiICkKLUZiKElOVCxsc3RyY21waSxMUENTVFIsYSxMUENTVFIsYiApCi1GYihMT05HLEVzY2FwZUNvbW1GdW5jdGlvbixpbnQsYSxpbnQsYikKLUZiKExPTkcsR2V0Q2xhc3NMb25nLEhXTkQsYSxzaG9ydCxiKQotRmIoTE9ORyxHZXRXaW5kb3dMb25nLEhXTkQsYSxzaG9ydCxiKQotRmIoU0VHUFRSLEFuc2lQcmV2LFNFR1BUUixhLFNFR1BUUixiKQotRmIoU0VHUFRSLGxzdHJjYXQsU0VHUFRSLGEsU0VHUFRSLGIpCi1GYihTRUdQVFIsbHN0cmNweSxTRUdQVFIsYSxTRUdQVFIsYikKLUZiKFdPUkQgRkFSKixTZXRDb21tRXZlbnRNYXNrLGludCxhLFdPUkQsYikKLUZiKFdPUkQsQW5zaUxvd2VyQnVmZixMUFNUUixhLFdPUkQsYikKLUZiKFdPUkQsQW5zaVVwcGVyQnVmZixMUFNUUixhLFdPUkQsYikKLUZiKFdPUkQsQ2hhbmdlU2VsZWN0b3IsV09SRCxhLFdPUkQsYikKLUZiKFdPUkQsR2V0Q2xhc3NXb3JkLEhXTkQsYSxzaG9ydCxiKQotRmIoV09SRCxHZXRDb21tRXZlbnRNYXNrLGludCxhLGludCxiKQotRmIoV09SRCxHZXRNZW51SXRlbUlELEhNRU5VLGEsaW50LGIpCi1GYihXT1JELEdldE5lYXJlc3RQYWxldHRlSW5kZXgsSFBBTEVUVEUsYSxEV09SRCxiKQotRmIoV09SRCxHZXRTeXN0ZW1EaXJlY3RvcnksTFBTVFIsYSxXT1JELGIpCi1GYihXT1JELEdldFdpbmRvd1dvcmQsSFdORCxhLHNob3J0LGIpCi1GYihXT1JELEdldFdpbmRvd3NEaXJlY3RvcnksTFBTVFIsYSxXT1JELGIpCi1GYihXT1JELElzRGxnQnV0dG9uQ2hlY2tlZCxIV05ELGEsV09SRCxiKQotRmIoV09SRCxMb2NhbFNocmluayxIQU5ETEUsYSxXT1JELGIpCi1GYihXT1JELE1hcFZpcnR1YWxLZXksV09SRCxhLFdPUkQsYikKLUZiKFdPUkQsUHJlc3RvQ2hhbmdvU2VsZWN0b3IsV09SRCxhLFdPUkQsYikKLUZiKFdPUkQsU2V0QmtNb2RlLEhEQyxhLFdPUkQsYikKLUZiKFdPUkQsU2V0TWFwTW9kZSxIREMsYSxXT1JELGIpCi1GYihXT1JELFNldFBvbHlGaWxsTW9kZSxIREMsYSxXT1JELGIpCi1GYihXT1JELFNldFJPUDIsSERDLGEsV09SRCxiKQotRmIoV09SRCxTZXRSZWxBYnMsSERDLGEsV09SRCxiKQotRmIoV09SRCxTZXRTZWxlY3RvckJhc2UsV09SRCxhLERXT1JELGIpCi1GYihXT1JELFNldFNlbGVjdG9yTGltaXQsV09SRCxhLERXT1JELGIpCi1GYihXT1JELFNldFN0cmV0Y2hCbHRNb2RlLEhEQyxhLFdPUkQsYikKLUZiKFdPUkQsU2V0U3lzdGVtUGFsZXR0ZVVzZSxIREMsYSxXT1JELGIpCi1GYihXT1JELFNldFRleHRBbGlnbixIREMsYSxXT1JELGIpCi1GYihXT1JELFdpbkV4ZWMsTFBTVFIsYSxXT1JELGIpCi1GYihpbnQsQWNjZXNzUmVzb3VyY2UsSEFORExFLGEsSEFORExFLGIpCi1GYihpbnQsQnVpbGRDb21tRENCLExQU1RSLGEsRENCKixiKQotRmIoaW50LENvbnZlcnRSZXF1ZXN0LEhXTkQsYSxMUEtBTkpJU1RSVUNULGIpCi1GYihpbnQsRW51bVByb3BzLEhXTkQsYSxGQVJQUk9DLGIpCi1GYihpbnQsRXhjbHVkZVVwZGF0ZVJnbixIREMsYSxIV05ELGIpCi1GYihpbnQsRmx1c2hDb21tLGludCxhLGludCxiKQotRmIoaW50LEdldENsaXBCb3gsSERDLGEsTFBSRUNULGIpCi1GYihpbnQsR2V0Q29tbUVycm9yLGludCxhLENPTVNUQVQqLGIpCi1GYihpbnQsR2V0Q29tbVN0YXRlLGludCxhLERDQiosYikKLUZiKGludCxHZXREZXZpY2VDYXBzLEhEQyxhLFdPUkQsYikKLUZiKGludCxHZXRQcmlvcml0eUNsaXBib2FyZEZvcm1hdCxXT1JEIEZBUiosYSxzaG9ydCxiKQotRmIoaW50LEdldFJnbkJveCxIUkdOLGEsTFBSRUNULGIpCi1GYihpbnQsR2V0U2Nyb2xsUG9zLEhXTkQsYSxpbnQsYikKLUZiKGludCxSZWxlYXNlREMsSFdORCxhLEhEQyxiKQotRmIoaW50LFNlbGVjdENsaXBSZ24sSERDLGEsSFJHTixiKQotRmIoaW50LFNlbGVjdFZpc1JnbixIREMsYSxIUkdOLGIpCi1GYihpbnQsU2V0U291bmROb2lzZSxpbnQsYSxpbnQsYikKLUZiKGludCxTZXRWb2ljZVF1ZXVlU2l6ZSxpbnQsYSxpbnQsYikKLUZiKGludCxTZXRWb2ljZVRocmVzaG9sZCxpbnQsYSxpbnQsYikKLUZiKGludCxUaHJvdyxMUENBVENIQlVGLGEsaW50LGIpCi1GYihpbnQsVHJhbnNtaXRDb21tQ2hhcixpbnQsYSxjaGFyLGIpCi1GYihpbnQsVW5nZXRDb21tQ2hhcixpbnQsYSxjaGFyLGIpCi1GYihzaG9ydCxTZXRUZXh0Q2hhcmFjdGVyRXh0cmEsSERDLGEsc2hvcnQsYikKLUZiKHZvaWQsQ2xpZW50VG9TY3JlZW4sSFdORCxhLExQUE9JTlQsYikKLUZiKHZvaWQsQ29weVJlY3QsTFBSRUNULGEsTFBSRUNULGIpCi1GYih2b2lkLERyYXdGb2N1c1JlY3QsSERDLGEsTFBSRUNULGIpCi1GYih2b2lkLEVuZERpYWxvZyxIV05ELGEsc2hvcnQsYikKLUZiKHZvaWQsRW5kUGFpbnQsSFdORCxhLExQUEFJTlRTVFJVQ1QsYikKLUZiKHZvaWQsRmFyU2V0T3duZXIsSEFORExFLGEsV09SRCxiKQotRmIodm9pZCxHZXRDbGllbnRSZWN0LEhXTkQsYSxMUFJFQ1QsYikKLUZiKHZvaWQsR2V0Q29kZUluZm8sRkFSUFJPQyxscFByb2MsTFBWT0lELGxwU2VnSW5mbykKLUZiKHZvaWQsR2V0V2luZG93UmVjdCxIV05ELGEsTFBSRUNULGIpCi1GYih2b2lkLEludmVydFJlY3QsSERDLGEsTFBSRUNULGIpCi1GYih2b2lkLE1hcERpYWxvZ1JlY3QsSFdORCxhLExQUkVDVCxiKQotRmIodm9pZCxQcm9mU2FtcFJhdGUsaW50LGEsaW50LGIpCi1GYih2b2lkLFByb2ZTZXR1cCxpbnQsYSxpbnQsYikKLUZiKHZvaWQsU2NyZWVuVG9DbGllbnQsSFdORCxhLExQUE9JTlQsYikKLUZiKHZvaWQsU2V0Q2FyZXRQb3Msc2hvcnQsYSxzaG9ydCxiKQotRmIodm9pZCxTZXRDdXJzb3JQb3Msc2hvcnQsYSxzaG9ydCxiKQotRmIodm9pZCxTZXREQ1N0YXRlLEhEQyxhLEhEQyxiKQotRmIodm9pZCxTZXRXaW5kb3dUZXh0LEhXTkQsYSxMUFNUUixiKQotRmIodm9pZCxTaG93T3duZWRQb3B1cHMsSFdORCxhLEJPT0wsYikKLUZiKHZvaWQsVmFsaWRhdGVSZWN0LEhXTkQsYSxMUFJFQ1QsYikKLUZiKHZvaWQsVmFsaWRhdGVSZ24sSFdORCxhLEhSR04sYikKLUZjKEJPT0wsQ2hlY2tNZW51SXRlbSxITUVOVSxhLFdPUkQsYixXT1JELGMpCi1GYyhCT09MLERQdG9MUCxIREMsYSxMUFBPSU5ULGIsaW50LGMpCi1GYyhCT09MLERlbGV0ZU1lbnUsSE1FTlUsYSxXT1JELGIsV09SRCxjKQotRmMoQk9PTCxEbGdEaXJTZWxlY3QsSFdORCxhLExQU1RSLGIsaW50LGMpCi1GYyhCT09MLERsZ0RpclNlbGVjdENvbWJvQm94LEhXTkQsYSxMUFNUUixiLGludCxjKQotRmMoQk9PTCxFbmFibGVNZW51SXRlbSxITUVOVSxhLFdPUkQsYixXT1JELGMpCi1GYyhCT09MLEVuYWJsZVNjcm9sbEJhcixIV05ELGEsSU5ULGIsVUlOVCxjKQotRmMoQk9PTCxFbnVtQ2hpbGRXaW5kb3dzLEhXTkQsYSxGQVJQUk9DLGIsTE9ORyxjKQotRmMoQk9PTCxFbnVtVGFza1dpbmRvd3MsSEFORExFLGEsRkFSUFJPQyxiLExPTkcsYykKLUZjKEJPT0wsRmlsbFJnbixIREMsYSxIUkdOLGIsSEJSVVNILGMpCi1GYyhCT09MLEdldENsYXNzSW5mbyxIQU5ETEUsYSxTRUdQVFIsYixMUFdORENMQVNTLGMpCi1GYyhCT09MLEdldFVwZGF0ZVJlY3QsSFdORCxhLExQUkVDVCxiLEJPT0wsYykKLUZjKEJPT0wsSW50ZXJzZWN0UmVjdCxMUFJFQ1QsYSxMUFJFQ1QsYixMUFJFQ1QsYykKLUZjKEJPT0wsTFB0b0RQLEhEQyxhLExQUE9JTlQsYixpbnQsYykKLUZjKEJPT0wsTGluZVRvLEhEQyxhLHNob3J0LGIsc2hvcnQsYykKLUZjKEJPT0wsTG9jYWxJbml0LFdPUkQsYSxXT1JELGIsV09SRCxjKQotRmMoQk9PTCxQb2x5Z29uLEhEQyxhLExQUE9JTlQsYixpbnQsYykKLUZjKEJPT0wsUG9seWxpbmUsSERDLGEsTFBQT0lOVCxiLGludCxjKQotRmMoQk9PTCxQdEluUmVnaW9uLEhSR04sYSxzaG9ydCxiLHNob3J0LGMpCi1GYyhCT09MLFB0VmlzaWJsZSxIREMsYSxzaG9ydCxiLHNob3J0LGMpCi1GYyhCT09MLFJlbW92ZU1lbnUsSE1FTlUsYSxXT1JELGIsV09SRCxjKQotRmMoQk9PTCxTZXRQcm9wLEhXTkQsYSxTRUdQVFIsYixIQU5ETEUsYykKLUZjKEJPT0wsU3VidHJhY3RSZWN0LExQUkVDVCxhLExQUkVDVCxiLExQUkVDVCxjKQotRmMoQk9PTCxVbmlvblJlY3QsTFBSRUNULGEsTFBSRUNULGIsTFBSRUNULGMpCi1GYyhCT09MLFdyaXRlUHJvZmlsZVN0cmluZyxMUFNUUixhLExQU1RSLGIsTFBTVFIsYykKLUZjKERXT1JELEdldFBpeGVsLEhEQyxhLHNob3J0LGIsc2hvcnQsYykKLUZjKERXT1JELEdldFRleHRFeHRlbnQsSERDLGEsTFBTVFIsYixzaG9ydCxjKQotRmMoRFdPUkQsTW92ZVRvLEhEQyxhLHNob3J0LGIsc2hvcnQsYykKLUZjKERXT1JELE9mZnNldFZpZXdwb3J0T3JnLEhEQyxhLHNob3J0LGIsc2hvcnQsYykKLUZjKERXT1JELE9mZnNldFdpbmRvd09yZyxIREMsYSxzaG9ydCxiLHNob3J0LGMpCi1GYyhEV09SRCxTZXRCaXRtYXBEaW1lbnNpb24sSEJJVE1BUCxhLHNob3J0LGIsc2hvcnQsYykKLUZjKERXT1JELFNldEJydXNoT3JnLEhEQyxhLHNob3J0LGIsc2hvcnQsYykKLUZjKERXT1JELFNldFZpZXdwb3J0RXh0LEhEQyxhLHNob3J0LGIsc2hvcnQsYykKLUZjKERXT1JELFNldFZpZXdwb3J0T3JnLEhEQyxhLHNob3J0LGIsc2hvcnQsYykKLUZjKERXT1JELFNldFdpbmRvd0V4dCxIREMsYSxzaG9ydCxiLHNob3J0LGMpCi1GYyhEV09SRCxTZXRXaW5kb3dPcmcsSERDLGEsc2hvcnQsYixzaG9ydCxjKQotRmMoRkFSUFJPQyxTZXRSZXNvdXJjZUhhbmRsZXIsSEFORExFLGEsTFBTVFIsYixGQVJQUk9DLGMpCi1GYyhIQU5ETEUsQWxsb2NSZXNvdXJjZSxIQU5ETEUsYSxIQU5ETEUsYixEV09SRCxjKQotRmMoSEFORExFLEZpbmRSZXNvdXJjZSxIQU5ETEUsYSxTRUdQVFIsYixTRUdQVFIsYykKLUZjKEhBTkRMRSxMb2NhbFJlQWxsb2MsSEFORExFLGEsV09SRCxiLFdPUkQsYykKLUZjKEhCSVRNQVAsQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCxIREMsYSxzaG9ydCxiLHNob3J0LGMpCi1GYyhIQklUTUFQLENyZWF0ZURpc2NhcmRhYmxlQml0bWFwLEhEQyxhLHNob3J0LGIsc2hvcnQsYykKLUZjKEhCUlVTSCxHZXRDb250cm9sQnJ1c2gsSFdORCxhLEhEQyxiLFdPUkQsYykKLUZjKEhEQyxHZXREQ0V4LEhXTkQsYSxIUkdOLGIsRFdPUkQsYykKLUZjKEhHTE9CQUwsR2xvYmFsUmVBbGxvYyxIR0xPQkFMLGEsRFdPUkQsYixXT1JELGMpCi1GYyhIUEFMRVRURSxTZWxlY3RQYWxldHRlLEhEQyxhLEhQQUxFVFRFLGIsQk9PTCxjKQotRmMoSFBFTixDcmVhdGVQZW4sc2hvcnQsYSxzaG9ydCxiLENPTE9SUkVGLGMpCi1GYyhIUkdOLENyZWF0ZVBvbHlnb25SZ24sTFBQT0lOVCxhLHNob3J0LGIsc2hvcnQsYykKLUZjKEhXTkQsR2V0TmV4dERsZ0dyb3VwSXRlbSxIV05ELGEsSFdORCxiLEJPT0wsYykKLUZjKEhXTkQsR2V0TmV4dERsZ1RhYkl0ZW0sSFdORCxhLEhXTkQsYixCT09MLGMpCi1GYyhJTlQsR2V0VGV4dEZhY2UsSERDLGEsSU5ULGIsTFBTVFIsYykKLUZjKElOVCxPcGVuRmlsZSxMUFNUUixhLExQT0ZTVFJVQ1QsYixXT1JELGMpCi1GYyhJTlQsX2xyZWFkLElOVCxhLExQU1RSLGIsV09SRCxjKQotRmMoSU5ULF9sd3JpdGUsSU5ULGEsTFBDU1RSLGIsV09SRCxjKQotRmMoTE9ORyxHZXRCaXRtYXBCaXRzLEhCSVRNQVAsYSxMT05HLGIsTFBTVFIsYykKLUZjKExPTkcsU2V0Qml0bWFwQml0cyxIQklUTUFQLGEsTE9ORyxiLExQU1RSLGMpCi1GYyhMT05HLFNldENsYXNzTG9uZyxIV05ELGEsc2hvcnQsYixMT05HLGMpCi1GYyhMT05HLFNldFdpbmRvd0xvbmcsSFdORCxhLHNob3J0LGIsTE9ORyxjKQotRmMoTE9ORyxfaHJlYWQsSU5ULGEsTFBTVFIsYixMT05HLGMpCi1GYyhMT05HLF9od3JpdGUsSU5ULGEsTFBDU1RSLGIsTE9ORyxjKQotRmMoTE9ORyxfbGxzZWVrLElOVCxhLExPTkcsYixJTlQsYykKLUZjKFNFR1BUUixsc3RyY3B5bixTRUdQVFIsYSxTRUdQVFIsYixXT1JELGMpCi1GYyhXT1JELEdldEF0b21OYW1lLEFUT00sYSxMUFNUUixiLHNob3J0LGMpCi1GYyhXT1JELEdldEludGVybmFsV2luZG93UG9zLEhXTkQsYSxMUFJFQ1QsYixMUFBPSU5ULGMpCi1GYyhXT1JELEdldE1lbnVTdGF0ZSxITUVOVSxhLFdPUkQsYixXT1JELGMpCi1GYyhXT1JELEdldFByb2ZpbGVJbnQsTFBTVFIsYSxMUFNUUixiLGludCxjKQotRmMoV09SRCxHbG9iYWxHZXRBdG9tTmFtZSxBVE9NLGEsTFBTVFIsYixzaG9ydCxjKQotRmMoV09SRCxTZWxlY3RvckFjY2Vzc1JpZ2h0cyxXT1JELGEsV09SRCxiLFdPUkQsYykKLUZjKFdPUkQsU2V0Q2xhc3NXb3JkLEhXTkQsYSxzaG9ydCxiLFdPUkQsYykKLUZjKFdPUkQsU2V0V2luZG93V29yZCxIV05ELGEsc2hvcnQsYixXT1JELGMpCi1GYyhpbnQsRmlsbFJlY3QsSERDLGEsTFBSRUNULGIsSEJSVVNILGMpCi1GYyhpbnQsRnJhbWVSZWN0LEhEQyxhLExQUkVDVCxiLEhCUlVTSCxjKQotRmMoaW50LEdldENsYXNzTmFtZSxIV05ELGEsTFBTVFIsYixzaG9ydCxjKQotRmMoaW50LEdldENsaXBib2FyZEZvcm1hdE5hbWUsV09SRCxhLExQU1RSLGIsc2hvcnQsYykKLUZjKGludCxHZXRFbnZpcm9ubWVudCxMUFNUUixhLExQU1RSLGIsV09SRCxjKQotRmMoaW50LEdldEluc3RhbmNlRGF0YSxIQU5ETEUsYSxXT1JELGIsaW50LGMpCi1GYyhpbnQsR2V0S2V5TmFtZVRleHQsTE9ORyxhLExQU1RSLGIsaW50LGMpCi1GYyhpbnQsR2V0TW9kdWxlRmlsZU5hbWUsSEFORExFLGEsTFBTVFIsYixzaG9ydCxjKQotRmMoaW50LEdldE9iamVjdCxIQU5ETEUsYSxpbnQsYixMUFNUUixjKQotRmMoaW50LEdldFVwZGF0ZVJnbixIV05ELGEsSFJHTixiLEJPT0wsYykKLUZjKGludCxHZXRXaW5kb3dUZXh0LEhXTkQsYSxMUFNUUixiLGludCxjKQotRmMoaW50LE11bERpdixpbnQsYSxpbnQsYixpbnQsYykKLUZjKGludCxPZmZzZXRDbGlwUmduLEhEQyxhLHNob3J0LGIsc2hvcnQsYykKLUZjKGludCxPZmZzZXRSZ24sSFJHTixhLHNob3J0LGIsc2hvcnQsYykKLUZjKGludCxPcGVuQ29tbSxMUFNUUixhLFdPUkQsYixXT1JELGMpCi1GYyhpbnQsUmVhZENvbW0saW50LGEsTFBTVFIsYixpbnQsYykKLUZjKGludCxTZXRFbnZpcm9ubWVudCxMUFNUUixhLExQU1RSLGIsV09SRCxjKQotRmMoaW50LFNldFZvaWNlRW52ZWxvcGUsaW50LGEsaW50LGIsaW50LGMpCi1GYyhpbnQsU2V0Vm9pY2VTb3VuZCxpbnQsYSxMT05HLGIsaW50LGMpCi1GYyhpbnQsVHJhbnNsYXRlQWNjZWxlcmF0b3IsSFdORCxhLEhBTkRMRSxiLExQTVNHLGMpCi1GYyhpbnQsV3JpdGVDb21tLGludCxhLExQU1RSLGIsaW50LGMpCi1GYyhpbnQsd3ZzcHJpbnRmLExQU1RSLGEsTFBTVFIsYixMUFNUUixjKQotRmMoc2hvcnQsU2V0VGV4dEp1c3RpZmljYXRpb24sSERDLGEsc2hvcnQsYixzaG9ydCxjKQotRmModm9pZCxBZGp1c3RXaW5kb3dSZWN0LExQUkVDVCxhLERXT1JELGIsQk9PTCxjKQotRmModm9pZCxBbnNpVG9PZW1CdWZmLExQU1RSLGEsTFBTVFIsYixJTlQsYykKLUZjKHZvaWQsQ2hlY2tEbGdCdXR0b24sSFdORCxhLFdPUkQsYixXT1JELGMpCi1GYyh2b2lkLEluZmxhdGVSZWN0LExQUkVDVCxhLHNob3J0LGIsc2hvcnQsYykKLUZjKHZvaWQsSW52YWxpZGF0ZVJlY3QsSFdORCxhLExQUkVDVCxiLEJPT0wsYykKLUZjKHZvaWQsSW52YWxpZGF0ZVJnbixIV05ELGEsSFJHTixiLEJPT0wsYykKLUZjKHZvaWQsT2VtVG9BbnNpQnVmZixMUFNUUixhLExQU1RSLGIsSU5ULGMpCi1GYyh2b2lkLE9mZnNldFJlY3QsTFBSRUNULGEsc2hvcnQsYixzaG9ydCxjKQotRmModm9pZCxTZXREbGdJdGVtVGV4dCxIV05ELGEsV09SRCxiLFNFR1BUUixjKQotRmModm9pZCxTZXRTeXNDb2xvcnMsaW50LGEsTFBJTlQsYixDT0xPUlJFRiosYykKLUZjKHZvaWQsU2hvd1Njcm9sbEJhcixIV05ELGEsV09SRCxiLEJPT0wsYykKLUZjKHZvaWQsU3dpdGNoU3RhY2tUbyxXT1JELGEsV09SRCxiLFdPUkQsYykKLUZkKEJPT0wsQXBwZW5kTWVudSxITUVOVSxhLFdPUkQsYixXT1JELGMsTFBTVFIsZCkKLUZkKEJPT0wsRHJhd0ljb24sSERDLGEsc2hvcnQsYixzaG9ydCxjLEhJQ09OLGQpCi1GZChCT09MLEVudW1NZXRhRmlsZSxIREMsYSxMT0NBTEhBTkRMRSxiLEZBUlBST0MsYyxCWVRFIEZBUiosZCkKLUZkKEJPT0wsRmxvb2RGaWxsLEhEQyxhLElOVCxiLElOVCxjLENPTE9SUkVGLGQpCi1GZChCT09MLEdldENoYXJXaWR0aCxIREMsYSxXT1JELGIsV09SRCxjLExQSU5ULGQpCi1GZChCT09MLEdldE1lc3NhZ2UsU0VHUFRSLG1zZyxIV05ELGIsV09SRCxjLFdPUkQsZCkKLUZkKEJPT0wsR2V0VGV4dEV4dGVudFBvaW50LEhEQyxhLExQU1RSLGIsc2hvcnQsYyxMUFNJWkUsZCkKLUZkKEJPT0wsSGlsaXRlTWVudUl0ZW0sSFdORCxhLEhNRU5VLGIsV09SRCxjLFdPUkQsZCkKLUZkKEJPT0wsTW92ZVRvRXgsSERDLGEsc2hvcnQsYixzaG9ydCxjLExQUE9JTlQsZCkKLUZkKEJPT0wsT2Zmc2V0Vmlld3BvcnRPcmdFeCxIREMsYSxzaG9ydCxiLHNob3J0LGMsTFBQT0lOVCxkKQotRmQoQk9PTCxPZmZzZXRXaW5kb3dPcmdFeCxIREMsYSxzaG9ydCxiLHNob3J0LGMsTFBQT0lOVCxkKQotRmQoQk9PTCxQb2x5UG9seWdvbixIREMsYSxMUFBPSU5ULGIsTFBJTlQsYyxXT1JELGQpCi1GZChCT09MLFBvc3RBcHBNZXNzYWdlLEhBTkRMRSxhLFdPUkQsYixXT1JELGMsTE9ORyxkKQotRmQoQk9PTCxQb3N0TWVzc2FnZSxIV05ELGEsV09SRCxiLFdPUkQsYyxMT05HLGQpCi1GZChCT09MLFJlZHJhd1dpbmRvdyxIV05ELGEsTFBSRUNULGIsSFJHTixjLFVJTlQsZCkKLUZkKEJPT0wsU2V0Qml0bWFwRGltZW5zaW9uRXgsSEJJVE1BUCxhLHNob3J0LGIsc2hvcnQsYyxMUFNJWkUsZCkKLUZkKEJPT0wsU2V0Vmlld3BvcnRFeHRFeCxIREMsYSxzaG9ydCxiLHNob3J0LGMsTFBTSVpFLGQpCi1GZChCT09MLFNldFZpZXdwb3J0T3JnRXgsSERDLGEsc2hvcnQsYixzaG9ydCxjLExQUE9JTlQsZCkKLUZkKEJPT0wsU2V0V2luZG93RXh0RXgsSERDLGEsc2hvcnQsYixzaG9ydCxjLExQU0laRSxkKQotRmQoQk9PTCxTZXRXaW5kb3dPcmdFeCxIREMsYSxzaG9ydCxiLHNob3J0LGMsTFBQT0lOVCxkKQotRmQoQk9PTCxXaW5IZWxwLEhXTkQsaHduZE1haW4sTFBTVFIsbHBzekhlbHAsV09SRCx1c0NvbW1hbmQsRFdPUkQsdWxEYXRhKQotRmQoQk9PTCxXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nLExQU1RSLGEsTFBTVFIsYixMUFNUUixjLExQU1RSLGQpCi1GZChDT0xPUlJFRixTZXRQaXhlbCxIREMsYSxzaG9ydCxiLHNob3J0LGMsQ09MT1JSRUYsZCkKLUZkKERXT1JELENhbGxOZXh0SG9va0V4LEhIT09LLGEsc2hvcnQsYixXUEFSQU0sYyxMUEFSQU0sZCkKLUZkKERXT1JELERlZkhvb2tQcm9jLHNob3J0LGEsV09SRCxiLERXT1JELGMsSEhPT0sgRkFSKixkKQotRmQoSERDLENyZWF0ZURDLExQU1RSLGEsTFBTVFIsYixMUFNUUixjLExQU1RSLGQpCi1GZChIREMsQ3JlYXRlSUMsTFBTVFIsYSxMUFNUUixiLExQU1RSLGMsTFBTVFIsZCkKLUZkKEhIT09LLFNldFdpbmRvd3NIb29rRXgsc2hvcnQsYSxIT09LUFJPQyxiLEhJTlNUQU5DRSxjLEhUQVNLLGQpCi1GZChIUkdOLENyZWF0ZUVsbGlwdGljUmduLHNob3J0LGEsc2hvcnQsYixzaG9ydCxjLHNob3J0LGQpCi1GZChIUkdOLENyZWF0ZVBvbHlQb2x5Z29uUmduLExQUE9JTlQsYSxMUElOVCxiLHNob3J0LGMsc2hvcnQsZCkKLUZkKEhSR04sQ3JlYXRlUmVjdFJnbixzaG9ydCxhLHNob3J0LGIsc2hvcnQsYyxzaG9ydCxkKQotRmQoSFdORCxDcmVhdGVEaWFsb2csSEFORExFLGEsU0VHUFRSLGIsSFdORCxjLFdORFBST0MsZCkKLUZkKEhXTkQsQ3JlYXRlRGlhbG9nSW5kaXJlY3QsSEFORExFLGEsU0VHUFRSLGIsSFdORCxjLFdORFBST0MsZCkKLUZkKElOVCxHZXRUZW1wRmlsZU5hbWUsQllURSxhLExQQ1NUUixiLFVJTlQsYyxMUFNUUixkKQotRmQoTE9ORyxEZWZEbGdQcm9jLEhXTkQsYSxXT1JELGIsV09SRCxjLExPTkcsZCkKLUZkKExPTkcsRGVmTURJQ2hpbGRQcm9jLEhXTkQsYSxXT1JELGIsV09SRCxjLExPTkcsZCkKLUZkKExPTkcsRGVmV2luZG93UHJvYyxIV05ELGEsV09SRCxiLFdPUkQsYyxMT05HLGQpCi1GZChMT05HLFNlbmRNZXNzYWdlLEhXTkQsYSxXT1JELGIsV09SRCxjLExPTkcsZCkKLUZkKFdPUkQsR2V0RGxnSXRlbUludCxIV05ELGEsV09SRCxiLEJPT0wgRkFSKixjLEJPT0wsZCkKLUZkKFdPUkQsR2V0UGFsZXR0ZUVudHJpZXMsSFBBTEVUVEUsYSxXT1JELGIsV09SRCxjLExQUEFMRVRURUVOVFJZLGQpCi1GZChXT1JELEdldFByaXZhdGVQcm9maWxlSW50LExQU1RSLGEsTFBTVFIsYixzaG9ydCxjLExQU1RSLGQpCi1GZChXT1JELEdldFN5c3RlbVBhbGV0dGVFbnRyaWVzLEhEQyxhLFdPUkQsYixXT1JELGMsTFBQQUxFVFRFRU5UUlksZCkKLUZkKFdPUkQsU2V0UGFsZXR0ZUVudHJpZXMsSFBBTEVUVEUsYSxXT1JELGIsV09SRCxjLExQUEFMRVRURUVOVFJZLGQpCi1GZChXT1JELFNldFN5c3RlbVRpbWVyLEhXTkQsYSxXT1JELGQsV09SRCxiLEZBUlBST0MsYykKLUZkKFdPUkQsU2V0VGltZXIsSFdORCxhLFdPUkQsZCxXT1JELGIsRkFSUFJPQyxjKQotRmQoaW50LENvbWJpbmVSZ24sSFJHTixhLEhSR04sYixIUkdOLGMsc2hvcnQsZCkKLUZkKGludCxEaWFsb2dCb3gsSElOU1RBTkNFLGEsU0VHUFRSLGIsSFdORCxjLFdORFBST0MsZCkKLUZkKGludCxEaWFsb2dCb3hJbmRpcmVjdCxIQU5ETEUsYSxIQU5ETEUsYixIV05ELGMsV05EUFJPQyxkKQotRmQoaW50LEVudW1Gb250cyxIREMsYSxMUFNUUixiLEZBUlBST0MsYyxMUFNUUixkKQotRmQoaW50LEVudW1PYmplY3RzLEhEQyxhLGludCxiLEZBUlBST0MsYyxMUFNUUixkKQotRmQoaW50LEdldERsZ0l0ZW1UZXh0LEhXTkQsYSxXT1JELGIsU0VHUFRSLGMsV09SRCxkKQotRmQoaW50LExvYWRTdHJpbmcsSEFORExFLGEsV09SRCxiLExQU1RSLGMsaW50LGQpCi1GZChpbnQsTWVzc2FnZUJveCxIV05ELGEsTFBTVFIsYixMUFNUUixjLFdPUkQsZCkKLUZkKGludCxTZXRTY3JvbGxQb3MsSFdORCxhLGludCxiLGludCxjLEJPT0wsZCkKLUZkKGludCxTZXRWb2ljZU5vdGUsaW50LGEsaW50LGIsaW50LGMsaW50LGQpCi1GZCh2b2lkLEFkanVzdFdpbmRvd1JlY3RFeCxMUFJFQ1QsYSxEV09SRCxiLEJPT0wsYyxEV09SRCxkKQotRmQodm9pZCxBbmltYXRlUGFsZXR0ZSxIUEFMRVRURSxhLFdPUkQsYixXT1JELGMsTFBQQUxFVFRFRU5UUlksZCkKLUZkKHZvaWQsQ2hlY2tSYWRpb0J1dHRvbixIV05ELGEsV09SRCxiLFdPUkQsYyxXT1JELGQpCi1GZCh2b2lkLENyZWF0ZUNhcmV0LEhXTkQsYSxIQklUTUFQLGIsc2hvcnQsYyxzaG9ydCxkKQotRmQodm9pZCxGaWxsV2luZG93LEhXTkQsYSxIV05ELGIsSERDLGMsSEJSVVNILGQpCi1GZCh2b2lkLEdldFNjcm9sbFJhbmdlLEhXTkQsYSxpbnQsYixMUElOVCxjLExQSU5ULGQpCi1GZCh2b2lkLE1hcFdpbmRvd1BvaW50cyxIV05ELGEsSFdORCxiLExQUE9JTlQsYyxXT1JELGQpCi1GZCh2b2lkLFBsYXlNZXRhRmlsZVJlY29yZCxIREMsYSxMUEhBTkRMRVRBQkxFLGIsTFBNRVRBUkVDT1JELGMsV09SRCxkKQotRmQodm9pZCxTZXREbGdJdGVtSW50LEhXTkQsYSxXT1JELGIsV09SRCxjLEJPT0wsZCkKLUZkKHZvaWQsU2V0SW50ZXJuYWxXaW5kb3dQb3MsSFdORCxhLFdPUkQsYixMUFJFQ1QsYyxMUFBPSU5ULGQpCi1GZShCT09MLENoYW5nZU1lbnUsSE1FTlUsYSxXT1JELGIsTFBTVFIsYyxXT1JELGQsV09SRCxlKQotRmUoQk9PTCxFbGxpcHNlLEhEQyxhLGludCxiLGludCxjLGludCxkLGludCxlKQotRmUoQk9PTCxFeHRGbG9vZEZpbGwsSERDLGEsSU5ULGIsSU5ULGMsQ09MT1JSRUYsZCxXT1JELGUpCi1GZShCT09MLEZyYW1lUmduLEhEQyxhLEhSR04sYixIQlJVU0gsZSxpbnQsYyxpbnQsZCkKLUZlKEJPT0wsSW5zZXJ0TWVudSxITUVOVSxhLFdPUkQsYixXT1JELGMsV09SRCxkLExQU1RSLGUpCi1GZShCT09MLE1vZGlmeU1lbnUsSE1FTlUsYSxXT1JELGIsV09SRCxjLFdPUkQsZCxMUFNUUixlKQotRmUoQk9PTCxQZWVrTWVzc2FnZSxMUE1TRyxhLEhXTkQsYixXT1JELGMsV09SRCxkLFdPUkQsZSkKLUZlKEJPT0wsUmVjdGFuZ2xlLEhEQyxhLGludCx4TGVmdCxpbnQseVRvcCxpbnQseFJpZ2h0LGludCx5Qm90dG9tKQotRmUoQk9PTCxTZXRNZW51SXRlbUJpdG1hcHMsSE1FTlUsYSxXT1JELGIsV09SRCxjLEhCSVRNQVAsZCxIQklUTUFQLGUpCi1GZShCT09MLFRleHRPdXQsSERDLGEsc2hvcnQsYixzaG9ydCxjLExQU1RSLGQsc2hvcnQsZSkKLUZlKERXT1JELEdldFRhYmJlZFRleHRFeHRlbnQsSERDLGEsTFBTVFIsYixpbnQsYyxpbnQsZCxMUElOVCxlKQotRmUoRFdPUkQsU2NhbGVWaWV3cG9ydEV4dCxIREMsYSxzaG9ydCxiLHNob3J0LGMsc2hvcnQsZCxzaG9ydCxlKQotRmUoRFdPUkQsU2NhbGVXaW5kb3dFeHQsSERDLGEsc2hvcnQsYixzaG9ydCxjLHNob3J0LGQsc2hvcnQsZSkKLUZlKEhCSVRNQVAsQ3JlYXRlQml0bWFwLHNob3J0LGEsc2hvcnQsYixCWVRFLGMsQllURSxkLExQU1RSLGUpCi1GZShIV05ELENyZWF0ZURpYWxvZ0luZGlyZWN0UGFyYW0sSEFORExFLGEsU0VHUFRSLGIsSFdORCxjLFdORFBST0MsZCxMUEFSQU0sZSkKLUZlKEhXTkQsQ3JlYXRlRGlhbG9nUGFyYW0sSEFORExFLGEsU0VHUFRSLGIsSFdORCxjLFdORFBST0MsZCxMUEFSQU0sZSkKLUZlKExPTkcsQ2FsbFdpbmRvd1Byb2MsV05EUFJPQyxhLEhXTkQsYixXT1JELGMsV09SRCxkLExPTkcsZSkKLUZlKExPTkcsRGVmRnJhbWVQcm9jLEhXTkQsYSxIV05ELGIsV09SRCxjLFdPUkQsZCxMT05HLGUpCi1GZShMT05HLFNlbmREbGdJdGVtTWVzc2FnZSxIV05ELGEsV09SRCxiLFdPUkQsYyxXT1JELGQsTE9ORyxlKQotRmUoaW50LERpYWxvZ0JveEluZGlyZWN0UGFyYW0sSEFORExFLGEsSEFORExFLGIsSFdORCxjLFdORFBST0MsZCxMT05HLGUpCi1GZShpbnQsRGlhbG9nQm94UGFyYW0sSEFORExFLGEsU0VHUFRSLGIsSFdORCxjLFdORFBST0MsZCxMT05HLGUpCi1GZShpbnQsRGxnRGlyTGlzdCxIV05ELGEsTFBTVFIsYixpbnQsYyxpbnQsZCxXT1JELGUpCi1GZShpbnQsRGxnRGlyTGlzdENvbWJvQm94LEhXTkQsYSxTRUdQVFIsYixpbnQsYyxpbnQsZCxXT1JELGUpCi1GZShpbnQsRHJhd1RleHQsSERDLGEsTFBTVFIsc3RyLGludCxjLExQUkVDVCxkLFdPUkQsZmxhZykKLUZlKGludCxFc2NhcGUsSERDLGEsaW50LGIsaW50LGMsTFBTVFIsZCxMUFNUUixlKQotRmUoaW50LEV4Y2x1ZGVDbGlwUmVjdCxIREMsYSxzaG9ydCxiLHNob3J0LGMsc2hvcnQsZCxzaG9ydCxlKQotRmUoaW50LEV4Y2x1ZGVWaXNSZWN0LEhEQyxhLHNob3J0LGIsc2hvcnQsYyxzaG9ydCxkLHNob3J0LGUpCi1GZShpbnQsR2V0TWVudVN0cmluZyxITUVOVSxhLFdPUkQsYixMUFNUUixjLHNob3J0LGQsV09SRCxlKQotRmUoaW50LEdldFByb2ZpbGVTdHJpbmcsTFBTVFIsYSxMUFNUUixiLExQU1RSLGMsTFBTVFIsZCxpbnQsZSkKLUZlKGludCxJbnRlcnNlY3RDbGlwUmVjdCxIREMsYSxzaG9ydCxiLHNob3J0LGMsc2hvcnQsZCxzaG9ydCxlKQotRmUoaW50LEludGVyc2VjdFZpc1JlY3QsSERDLGEsc2hvcnQsYixzaG9ydCxjLHNob3J0LGQsc2hvcnQsZSkKLUZlKGludCxTZXRWb2ljZUFjY2VudCxpbnQsYSxpbnQsYixpbnQsYyxpbnQsZCxpbnQsZSkKLUZlKGludCxUb0FzY2lpLFdPUkQsd1ZpcnRLZXksV09SRCx3U2NhbkNvZGUsTFBTVFIsbHBLZXlTdGF0ZSxMUFZPSUQsbHBDaGFyLFdPUkQsd0ZsYWdzKQotRmUodm9pZCxQYWludFJlY3QsSFdORCxhLEhXTkQsYixIREMsYyxIQlJVU0gsZCxMUFJFQ1QsZSkKLUZlKHZvaWQsU2Nyb2xsV2luZG93LEhXTkQsYSxzaG9ydCxiLHNob3J0LGMsTFBSRUNULGQsTFBSRUNULGUpCi1GZSh2b2lkLFNldFJlY3QsTFBSRUNULGEsc2hvcnQsYixzaG9ydCxjLHNob3J0LGQsc2hvcnQsZSkKLUZlKHZvaWQsU2V0UmVjdFJnbixIUkdOLGEsc2hvcnQsYixzaG9ydCxjLHNob3J0LGQsc2hvcnQsZSkKLUZlKHZvaWQsU2V0U2Nyb2xsUmFuZ2UsSFdORCxhLGludCxiLGludCxjLGludCxkLEJPT0wsZSkKLUZmKEJPT0wsTW92ZVdpbmRvdyxIV05ELGEsc2hvcnQsYixzaG9ydCxjLHNob3J0LGQsc2hvcnQsZSxCT09MLGYpCi1GZihCT09MLFBhdEJsdCxIREMsYSxzaG9ydCxiLHNob3J0LGMsc2hvcnQsZCxzaG9ydCxlLERXT1JELGYpCi1GZihCT09MLFNjYWxlVmlld3BvcnRFeHRFeCxIREMsYSxzaG9ydCxiLHNob3J0LGMsc2hvcnQsZCxzaG9ydCxlLExQU0laRSxmKQotRmYoQk9PTCxTY2FsZVdpbmRvd0V4dEV4LEhEQyxhLHNob3J0LGIsc2hvcnQsYyxzaG9ydCxkLHNob3J0LGUsTFBTSVpFLGYpCi1GZihIQklUTUFQLENyZWF0ZURJQml0bWFwLEhEQyxhLExQQklUTUFQSU5GT0hFQURFUixiLERXT1JELGMsTFBTVFIsZCxMUEJJVE1BUElORk8sZSxXT1JELGYpCi1GZihIUkdOLENyZWF0ZVJvdW5kUmVjdFJnbixzaG9ydCxhLHNob3J0LGIsc2hvcnQsYyxzaG9ydCxkLHNob3J0LGUsc2hvcnQsZikKLUZmKHNob3J0LEdldFByaXZhdGVQcm9maWxlU3RyaW5nLExQU1RSLGEsTFBTVFIsYixMUFNUUixjLExQU1RSLGQsc2hvcnQsZSxMUFNUUixmKQotRmYodm9pZCxMaW5lRERBLHNob3J0LGEsc2hvcnQsYixzaG9ydCxjLHNob3J0LGQsRkFSUFJPQyxlLGxvbmcsZikKLUZnKEJPT0wsUm91bmRSZWN0LEhEQyxhLHNob3J0LGIsc2hvcnQsYyxzaG9ydCxkLHNob3J0LGUsc2hvcnQsZixzaG9ydCxnKQotRmcoQk9PTCxTY3JvbGxEQyxIREMsYSxzaG9ydCxiLHNob3J0LGMsTFBSRUNULGQsTFBSRUNULGUsSFJHTixmLExQUkVDVCxnKQotRmcoQk9PTCxTZXRXaW5kb3dQb3MsSFdORCxhLEhXTkQsYixzaG9ydCxjLHNob3J0LGQsc2hvcnQsZSxzaG9ydCxmLFdPUkQsZykKLUZnKEJPT0wsVHJhY2tQb3B1cE1lbnUsSE1FTlUsYSxXT1JELGIsc2hvcnQsYyxzaG9ydCxkLHNob3J0LGUsSFdORCxmLExQUkVDVCxnKQotRmcoSENVUlNPUixDcmVhdGVDdXJzb3IsSEFORExFLGEsc2hvcnQsYixzaG9ydCxjLHNob3J0LGQsc2hvcnQsZSxMUFNUUixmLExQU1RSLGcpCi1GZyhISUNPTixDcmVhdGVJY29uLEhBTkRMRSxhLGludCxiLGludCxjLEJZVEUsZCxCWVRFLGUsTFBTVFIsZixMUFNUUixnKQotRmcoaW50LEdldERJQml0cyxIREMsYSxIQU5ETEUsYTIsV09SRCxiLFdPUkQsYyxMUFNUUixkLExQQklUTUFQSU5GTyxlLFdPUkQsZikKLUZnKGludCxTZXRESUJpdHMsSERDLGEsSEFORExFLGEyLFdPUkQsYixXT1JELGMsTFBTVFIsZCxMUEJJVE1BUElORk8sZSxXT1JELGYpCi1GaChCT09MLEV4dFRleHRPdXQsSERDLGEsc2hvcnQsYixzaG9ydCxjLFdPUkQsZCxMUFJFQ1QsZSxMUFNUUixmLFdPUkQsZyxMUElOVCxoKQotRmgoSERXUCxEZWZlcldpbmRvd1BvcyxIRFdQLGhXaW5Qb3NJbmZvLEhXTkQsaFduZCxIV05ELGhXbmRJbnNlcnRBZnRlcixJTlQseCxJTlQseSxJTlQsY3gsSU5ULGN5LFdPUkQsd0ZsYWdzKQotRmgoTE9ORyxUYWJiZWRUZXh0T3V0LEhEQyxhLHNob3J0LGIsc2hvcnQsYyxMUFNUUixkLHNob3J0LGUsc2hvcnQsZixMUElOVCxnLHNob3J0LGgpCi1GaChpbnQsU2Nyb2xsV2luZG93RXgsSFdORCxhLHNob3J0LGIsc2hvcnQsYyxMUFJFQ1QsZCxMUFJFQ1QsZSxIUkdOLGYsTFBSRUNULGcsV09SRCxoKQotRmkoQk9PTCxBcmMsSERDLGEsaW50LHhMZWZ0LGludCx5VG9wLGludCx4UmlnaHQsaW50LHlCb3R0b20saW50LHhTdGFydCxpbnQseVN0YXJ0LGludCx4RW5kLGludCx5RW5kKQotRmkoQk9PTCxCaXRCbHQsSERDLGEsc2hvcnQsYixzaG9ydCxjLHNob3J0LGQsc2hvcnQsZSxIREMsZixzaG9ydCxnLHNob3J0LGgsRFdPUkQsaSkKLUZpKEJPT0wsQ2hvcmQsSERDLGEsaW50LHhMZWZ0LGludCx5VG9wLGludCx4UmlnaHQsaW50LHlCb3R0b20saW50LHhTdGFydCxpbnQseVN0YXJ0LGludCx4RW5kLGludCx5RW5kKQotRmkoQk9PTCxHcmF5U3RyaW5nLEhEQyxhLEhCUlVTSCxiLEZBUlBST0MsZ3NwcmMsTFBBUkFNLGxQYXJhbSxJTlQsY2NoLElOVCx4LElOVCx5LElOVCxjeCxJTlQsY3kpCi1GaShCT09MLFBpZSxIREMsYSxpbnQseExlZnQsaW50LHlUb3AsaW50LHhSaWdodCxpbnQseUJvdHRvbSxpbnQseFN0YXJ0LGludCx5U3RhcnQsaW50LHhFbmQsaW50LHlFbmQpCi1GayhCT09MLFN0cmV0Y2hCbHQsSERDLGEsc2hvcnQsYixzaG9ydCxjLHNob3J0LGQsc2hvcnQsZSxIREMsZixzaG9ydCxnLHNob3J0LGgsc2hvcnQsaSxzaG9ydCxqLERXT1JELGspCi1GayhIV05ELENyZWF0ZVdpbmRvdyxTRUdQVFIsYSxTRUdQVFIsYixEV09SRCxjLHNob3J0LGQsc2hvcnQsZSxzaG9ydCxmLHNob3J0LGcsSFdORCxoLEhNRU5VLGksSEFORExFLGosU0VHUFRSLGspCi1GbChIV05ELENyZWF0ZVdpbmRvd0V4LERXT1JELGEsU0VHUFRSLGIsU0VHUFRSLGMsRFdPUkQsZCxzaG9ydCxlLHNob3J0LGYsc2hvcnQsZyxzaG9ydCxoLEhXTkQsaSxITUVOVSxqLEhBTkRMRSxrLFNFR1BUUixsKQotRmwoaW50LFNldERJQml0c1RvRGV2aWNlLEhEQyxhLHNob3J0LGIsc2hvcnQsYyxXT1JELGQsV09SRCxlLFdPUkQsZixXT1JELGcsV09SRCxoLFdPUkQsaSxMUFNUUixqLExQQklUTUFQSU5GTyxrLFdPUkQsbCkKLUZtKGludCxTdHJldGNoRElCaXRzLEhEQyxhLFdPUkQsYixXT1JELGMsV09SRCxkLFdPUkQsZSxXT1JELGYsV09SRCxnLFdPUkQsaCxXT1JELGksTFBTVFIsaixMUEJJVE1BUElORk8sayxXT1JELGwsRFdPUkQsbSkKLUZuKEhGT05ULENyZWF0ZUZvbnQsaW50LGEsaW50LGIsaW50LGMsaW50LGQsaW50LGUsQllURSxmLEJZVEUsZyxCWVRFLGgsQllURSxpLEJZVEUsaixCWVRFLGssQllURSxsLEJZVEUsbSxMUFNUUixuKQorQVRPTSBBZGRBdG9tKFNFR1BUUik7CitBVE9NIERlbGV0ZUF0b20oQVRPTSk7CitBVE9NIEZpbmRBdG9tKFNFR1BUUik7CitBVE9NIEdsb2JhbEFkZEF0b20oU0VHUFRSKTsKK0FUT00gR2xvYmFsRGVsZXRlQXRvbShBVE9NKTsKK0FUT00gR2xvYmFsRmluZEF0b20oU0VHUFRSKTsKK0FUT00gUmVnaXN0ZXJDbGFzcyhMUFdORENMQVNTKTsKK0JPT0wgQW55UG9wdXAodm9pZCk7CitCT09MIEFwcGVuZE1lbnUoSE1FTlUsV09SRCxXT1JELExQU1RSKTsKK0JPT0wgQXJjKEhEQyxpbnQsaW50LGludCxpbnQsaW50LGludCxpbnQsaW50KTsKK0JPT0wgQml0Qmx0KEhEQyxzaG9ydCxzaG9ydCxzaG9ydCxzaG9ydCxIREMsc2hvcnQsc2hvcnQsRFdPUkQpOworQk9PTCBCcmluZ1dpbmRvd1RvVG9wKEhXTkQpOworQk9PTCBDYWxsTXNnRmlsdGVyKFNFR1BUUixzaG9ydCk7CitCT09MIENoYW5nZUNsaXBib2FyZENoYWluKEhXTkQsSFdORCk7CitCT09MIENoYW5nZU1lbnUoSE1FTlUsV09SRCxMUFNUUixXT1JELFdPUkQpOworQk9PTCBDaGVja01lbnVJdGVtKEhNRU5VLFdPUkQsV09SRCk7CitCT09MIENob3JkKEhEQyxpbnQsaW50LGludCxpbnQsaW50LGludCxpbnQsaW50KTsKK0JPT0wgQ2xvc2VDbGlwYm9hcmQodm9pZCk7CitCT09MIERQdG9MUChIREMsTFBQT0lOVCxpbnQpOworQk9PTCBEZWxldGVEQyhIREMpOworQk9PTCBEZWxldGVNZW51KEhNRU5VLFdPUkQsV09SRCk7CitCT09MIERlbGV0ZU1ldGFGaWxlKEhNRVRBRklMRSk7CitCT09MIERlbGV0ZU9iamVjdChIQU5ETEUpOworQk9PTCBEZXN0cm95Q3Vyc29yKEhDVVJTT1IpOworQk9PTCBEZXN0cm95SWNvbihISUNPTik7CitCT09MIERlc3Ryb3lNZW51KEhNRU5VKTsKK0JPT0wgRGVzdHJveVdpbmRvdyhIV05EKTsKK0JPT0wgRGxnRGlyU2VsZWN0KEhXTkQsTFBTVFIsaW50KTsKK0JPT0wgRGxnRGlyU2VsZWN0Q29tYm9Cb3goSFdORCxMUFNUUixpbnQpOworQk9PTCBEcmF3SWNvbihIREMsc2hvcnQsc2hvcnQsSElDT04pOworQk9PTCBFbGxpcHNlKEhEQyxpbnQsaW50LGludCxpbnQpOworQk9PTCBFbXB0eUNsaXBib2FyZCh2b2lkKTsKK0JPT0wgRW5hYmxlSGFyZHdhcmVJbnB1dChCT09MKTsKK0JPT0wgRW5hYmxlTWVudUl0ZW0oSE1FTlUsV09SRCxXT1JEKTsKK0JPT0wgRW5hYmxlU2Nyb2xsQmFyKEhXTkQsSU5ULFVJTlQpOworQk9PTCBFbmFibGVXaW5kb3coSFdORCxCT09MKTsKK0JPT0wgRW5kRGVmZXJXaW5kb3dQb3MoSERXUCk7CitCT09MIEVudW1DaGlsZFdpbmRvd3MoSFdORCxGQVJQUk9DLExPTkcpOworQk9PTCBFbnVtTWV0YUZpbGUoSERDLExPQ0FMSEFORExFLEZBUlBST0MsQllURSopOworQk9PTCBFbnVtVGFza1dpbmRvd3MoSEFORExFLEZBUlBST0MsTE9ORyk7CitCT09MIEVudW1XaW5kb3dzKEZBUlBST0MsTE9ORyk7CitCT09MIEVxdWFsUmVjdChMUFJFQ1QsTFBSRUNUKTsKK0JPT0wgRXF1YWxSZ24oSFJHTixIUkdOKTsKK0JPT0wgRXhpdFdpbmRvd3MoRFdPUkQsV09SRCk7CitCT09MIEV4dEZsb29kRmlsbChIREMsSU5ULElOVCxDT0xPUlJFRixXT1JEKTsKK0JPT0wgRXh0VGV4dE91dChIREMsc2hvcnQsc2hvcnQsV09SRCxMUFJFQ1QsTFBTVFIsV09SRCxMUElOVCk7CitCT09MIEZpbGxSZ24oSERDLEhSR04sSEJSVVNIKTsKK0JPT0wgRmxhc2hXaW5kb3coSFdORCxCT09MKTsKK0JPT0wgRmxvb2RGaWxsKEhEQyxJTlQsSU5ULENPTE9SUkVGKTsKK0JPT0wgRnJhbWVSZ24oSERDLEhSR04sSEJSVVNILGludCxpbnQpOworQk9PTCBGcmVlTW9kdWxlKEhBTkRMRSk7CitCT09MIEZyZWVSZXNvdXJjZShIQU5ETEUpOworQk9PTCBHZXRCaXRtYXBEaW1lbnNpb25FeChIQklUTUFQLExQU0laRSk7CitCT09MIEdldEJydXNoT3JnRXgoSERDLExQUE9JTlQpOworQk9PTCBHZXRDaGFyV2lkdGgoSERDLFdPUkQsV09SRCxMUElOVCk7CitCT09MIEdldENsYXNzSW5mbyhIQU5ETEUsU0VHUFRSLExQV05EQ0xBU1MpOworQk9PTCBHZXRDdXJyZW50UG9zaXRpb25FeChIREMsTFBQT0lOVCk7CitCT09MIEdldElucHV0U3RhdGUodm9pZCk7CitCT09MIEdldE1lc3NhZ2UoU0VHUFRSLEhXTkQsVUlOVCxVSU5UKTsKK0JPT0wgR2V0VGV4dEV4dGVudFBvaW50KEhEQyxMUFNUUixzaG9ydCxMUFNJWkUpOworQk9PTCBHZXRUZXh0TWV0cmljcyhIREMsTFBURVhUTUVUUklDKTsKK0JPT0wgR2V0VXBkYXRlUmVjdChIV05ELExQUkVDVCxCT09MKTsKK0JPT0wgR2V0Vmlld3BvcnRFeHRFeChIREMsTFBQT0lOVCk7CitCT09MIEdldFZpZXdwb3J0T3JnRXgoSERDLExQUE9JTlQpOworQk9PTCBHZXRXaW5EZWJ1Z0luZm8oTFBXSU5ERUJVR0lORk8sVUlOVCk7CitCT09MIEdldFdpbmRvd0V4dEV4KEhEQyxMUFBPSU5UKTsKK0JPT0wgR2V0V2luZG93T3JnRXgoSERDLExQUE9JTlQpOworQk9PTCBHZXRXaW5kb3dQbGFjZW1lbnQoSFdORCxMUFdJTkRPV1BMQUNFTUVOVCk7CitCT09MIEdsb2JhbFVuV2lyZShIR0xPQkFMKTsKK0JPT0wgR2xvYmFsVW5sb2NrKEhHTE9CQUwpOworQk9PTCBHcmF5U3RyaW5nKEhEQyxIQlJVU0gsRkFSUFJPQyxMUEFSQU0sSU5ULElOVCxJTlQsSU5ULElOVCk7CitCT09MIEhpbGl0ZU1lbnVJdGVtKEhXTkQsSE1FTlUsV09SRCxXT1JEKTsKK0JPT0wgSW5TZW5kTWVzc2FnZSh2b2lkKTsKK0JPT0wgSW5zZXJ0TWVudShITUVOVSxXT1JELFdPUkQsV09SRCxMUFNUUik7CitCT09MIEludGVyc2VjdFJlY3QoTFBSRUNULExQUkVDVCxMUFJFQ1QpOworQk9PTCBJbnZlcnRSZ24oSERDLEhSR04pOworQk9PTCBJc0JhZENvZGVQdHIoU0VHUFRSKTsKK0JPT0wgSXNCYWRIdWdlUmVhZFB0cihTRUdQVFIsRFdPUkQpOworQk9PTCBJc0JhZEh1Z2VXcml0ZVB0cihTRUdQVFIsRFdPUkQpOworQk9PTCBJc0JhZFJlYWRQdHIoU0VHUFRSLFdPUkQpOworQk9PTCBJc0JhZFN0cmluZ1B0cihTRUdQVFIsV09SRCk7CitCT09MIElzQmFkV3JpdGVQdHIoU0VHUFRSLFdPUkQpOworQk9PTCBJc0NoYXJBbHBoYShjaGFyKTsKK0JPT0wgSXNDaGFyQWxwaGFOdW1lcmljKGNoYXIpOworQk9PTCBJc0NoYXJMb3dlcihjaGFyKTsKK0JPT0wgSXNDaGFyVXBwZXIoY2hhcik7CitCT09MIElzQ2hpbGQoSFdORCxIV05EKTsKK0JPT0wgSXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUoV09SRCk7CitCT09MIElzRGlhbG9nTWVzc2FnZShIV05ELExQTVNHKTsKK0JPT0wgSXNJY29uaWMoSFdORCk7CitCT09MIElzUmVjdEVtcHR5KExQUkVDVCk7CitCT09MIElzVHdvQnl0ZUNoYXJQcmVmaXgoY2hhcik7CitCT09MIElzV2luZG93KEhXTkQpOworQk9PTCBJc1dpbmRvd0VuYWJsZWQoSFdORCk7CitCT09MIElzV2luZG93VmlzaWJsZShIV05EKTsKK0JPT0wgSXNab29tZWQoSFdORCk7CitCT09MIEtpbGxTeXN0ZW1UaW1lcihIV05ELFdPUkQpOworQk9PTCBLaWxsVGltZXIoSFdORCxXT1JEKTsKK0JPT0wgTFB0b0RQKEhEQyxMUFBPSU5ULGludCk7CitCT09MIExpbmVUbyhIREMsc2hvcnQsc2hvcnQpOworQk9PTCBMb2NhbEluaXQoSEFORExFLFdPUkQsV09SRCk7CitCT09MIExvY2FsVW5sb2NrKEhBTkRMRSk7CitCT09MIE1vZGlmeU1lbnUoSE1FTlUsV09SRCxXT1JELFdPUkQsTFBTVFIpOworQk9PTCBNb3ZlVG9FeChIREMsc2hvcnQsc2hvcnQsTFBQT0lOVCk7CitCT09MIE1vdmVXaW5kb3coSFdORCxzaG9ydCxzaG9ydCxzaG9ydCxzaG9ydCxCT09MKTsKK0JPT0wgT2VtVG9BbnNpKExQU1RSLExQU1RSKTsKK0JPT0wgT2Zmc2V0Vmlld3BvcnRPcmdFeChIREMsc2hvcnQsc2hvcnQsTFBQT0lOVCk7CitCT09MIE9mZnNldFdpbmRvd09yZ0V4KEhEQyxzaG9ydCxzaG9ydCxMUFBPSU5UKTsKK0JPT0wgT3BlbkNsaXBib2FyZChIV05EKTsKK0JPT0wgT3Blbkljb24oSFdORCk7CitCT09MIFBhaW50UmduKEhEQyxIUkdOKTsKK0JPT0wgUGF0Qmx0KEhEQyxzaG9ydCxzaG9ydCxzaG9ydCxzaG9ydCxEV09SRCk7CitCT09MIFBlZWtNZXNzYWdlKExQTVNHLEhXTkQsV09SRCxXT1JELFdPUkQpOworQk9PTCBQaWUoSERDLGludCxpbnQsaW50LGludCxpbnQsaW50LGludCxpbnQpOworQk9PTCBQbGF5TWV0YUZpbGUoSERDLEhBTkRMRSk7CitCT09MIFBvbHlQb2x5Z29uKEhEQyxMUFBPSU5ULExQSU5ULFdPUkQpOworQk9PTCBQb2x5Z29uKEhEQyxMUFBPSU5ULGludCk7CitCT09MIFBvbHlsaW5lKEhEQyxMUFBPSU5ULGludCk7CitCT09MIFBvc3RBcHBNZXNzYWdlKEhBTkRMRSxXT1JELFdPUkQsTE9ORyk7CitCT09MIFBvc3RNZXNzYWdlKEhXTkQsV09SRCxXT1JELExPTkcpOworQk9PTCBQdEluUmVjdChMUFJFQ1QsUE9JTlQpOworQk9PTCBQdEluUmVnaW9uKEhSR04sc2hvcnQsc2hvcnQpOworQk9PTCBQdFZpc2libGUoSERDLHNob3J0LHNob3J0KTsKK0JPT0wgUmVjdEluUmVnaW9uKEhSR04sTFBSRUNUKTsKK0JPT0wgUmVjdFZpc2libGUoSERDLExQUkVDVCk7CitCT09MIFJlY3RhbmdsZShIREMsaW50LGludCxpbnQsaW50KTsKK0JPT0wgUmVkcmF3V2luZG93KEhXTkQsTFBSRUNULEhSR04sVUlOVCk7CitCT09MIFJlbW92ZUZvbnRSZXNvdXJjZShMUFNUUik7CitCT09MIFJlbW92ZU1lbnUoSE1FTlUsV09SRCxXT1JEKTsKK0JPT0wgUmVzaXplUGFsZXR0ZShIUEFMRVRURSxXT1JEKTsKK0JPT0wgUmVzdG9yZURDKEhEQyxzaG9ydCk7CitCT09MIFJvdW5kUmVjdChIREMsc2hvcnQsc2hvcnQsc2hvcnQsc2hvcnQsc2hvcnQsc2hvcnQpOworQk9PTCBTY2FsZVZpZXdwb3J0RXh0RXgoSERDLHNob3J0LHNob3J0LHNob3J0LHNob3J0LExQU0laRSk7CitCT09MIFNjYWxlV2luZG93RXh0RXgoSERDLHNob3J0LHNob3J0LHNob3J0LHNob3J0LExQU0laRSk7CitCT09MIFNjcm9sbERDKEhEQyxzaG9ydCxzaG9ydCxMUFJFQ1QsTFBSRUNULEhSR04sTFBSRUNUKTsKK0JPT0wgU2V0Qml0bWFwRGltZW5zaW9uRXgoSEJJVE1BUCxzaG9ydCxzaG9ydCxMUFNJWkUpOworQk9PTCBTZXRDb252ZXJ0UGFyYW1zKGludCxpbnQpOworQk9PTCBTZXREZXNrUGF0dGVybih2b2lkKTsKK0JPT0wgU2V0RGVza1dhbGxQYXBlcihMUFNUUik7CitCT09MIFNldEVycm9yTW9kZShXT1JEKTsKK0JPT0wgU2V0TWVudShIV05ELEhNRU5VKTsKK0JPT0wgU2V0TWVudUl0ZW1CaXRtYXBzKEhNRU5VLFdPUkQsV09SRCxIQklUTUFQLEhCSVRNQVApOworQk9PTCBTZXRNZXNzYWdlUXVldWUoaW50KTsKK0JPT0wgU2V0UHJvcChIV05ELFNFR1BUUixIQU5ETEUpOworQk9PTCBTZXRWaWV3cG9ydEV4dEV4KEhEQyxzaG9ydCxzaG9ydCxMUFNJWkUpOworQk9PTCBTZXRWaWV3cG9ydE9yZ0V4KEhEQyxzaG9ydCxzaG9ydCxMUFBPSU5UKTsKK0JPT0wgU2V0V2luRGVidWdJbmZvKExQV0lOREVCVUdJTkZPKTsKK0JPT0wgU2V0V2luZG93RXh0RXgoSERDLHNob3J0LHNob3J0LExQU0laRSk7CitCT09MIFNldFdpbmRvd09yZ0V4KEhEQyxzaG9ydCxzaG9ydCxMUFBPSU5UKTsKK0JPT0wgU2V0V2luZG93UGxhY2VtZW50KEhXTkQsTFBXSU5ET1dQTEFDRU1FTlQpOworQk9PTCBTZXRXaW5kb3dQb3MoSFdORCxIV05ELHNob3J0LHNob3J0LHNob3J0LHNob3J0LFdPUkQpOworQk9PTCBTaG93V2luZG93KEhXTkQsaW50KTsKK0JPT0wgU3RyZXRjaEJsdChIREMsc2hvcnQsc2hvcnQsc2hvcnQsc2hvcnQsSERDLHNob3J0LHNob3J0LHNob3J0LHNob3J0LERXT1JEKTsKK0JPT0wgU3VidHJhY3RSZWN0KExQUkVDVCxMUFJFQ1QsTFBSRUNUKTsKK0JPT0wgU3dhcE1vdXNlQnV0dG9uKEJPT0wpOworQk9PTCBUZXh0T3V0KEhEQyxzaG9ydCxzaG9ydCxMUFNUUixzaG9ydCk7CitCT09MIFRyYWNrUG9wdXBNZW51KEhNRU5VLFdPUkQsc2hvcnQsc2hvcnQsc2hvcnQsSFdORCxMUFJFQ1QpOworQk9PTCBUcmFuc2xhdGVNRElTeXNBY2NlbChIV05ELExQTVNHKTsKK0JPT0wgVHJhbnNsYXRlTWVzc2FnZShMUE1TRyk7CitCT09MIFVuaG9va1dpbmRvd3NIb29rKHNob3J0LEZBUlBST0MpOworQk9PTCBVbmhvb2tXaW5kb3dzSG9va0V4KEhIT09LKTsKK0JPT0wgVW5pb25SZWN0KExQUkVDVCxMUFJFQ1QsTFBSRUNUKTsKK0JPT0wgVW5yZWFsaXplT2JqZWN0KEhCUlVTSCk7CitCT09MIFVucmVnaXN0ZXJDbGFzcyhTRUdQVFIsSEFORExFKTsKK0JPT0wgV2luSGVscChIV05ELExQU1RSLFdPUkQsRFdPUkQpOworQk9PTCBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nKExQU1RSLExQU1RSLExQU1RSLExQU1RSKTsKK0JPT0wgV3JpdGVQcm9maWxlU3RyaW5nKExQU1RSLExQU1RSLExQU1RSKTsKK0JZVEUgR2V0VGVtcERyaXZlKEJZVEUpOworQ09MT1JSRUYgR2V0QmtDb2xvcihIREMpOworQ09MT1JSRUYgR2V0U3lzQ29sb3Ioc2hvcnQpOworQ09MT1JSRUYgR2V0VGV4dENvbG9yKEhEQyk7CitDT0xPUlJFRiBTZXRQaXhlbChIREMsc2hvcnQsc2hvcnQsQ09MT1JSRUYpOworRFdPUkQgQ2FsbE5leHRIb29rRXgoSEhPT0ssc2hvcnQsV1BBUkFNLExQQVJBTSk7CitEV09SRCBEZWZIb29rUHJvYyhzaG9ydCxXT1JELERXT1JELEhIT09LKik7CitEV09SRCBHZXRBc3BlY3RSYXRpb0ZpbHRlcihIREMpOworRFdPUkQgR2V0Qml0bWFwRGltZW5zaW9uKEhCSVRNQVApOworRFdPUkQgR2V0QnJ1c2hPcmcoSERDKTsKK0RXT1JEIEdldEN1cnJlbnRQb3NpdGlvbihIREMpOworRFdPUkQgR2V0Q3VycmVudFRpbWUodm9pZCk7CitEV09SRCBHZXREQ09yZyhIREMpOworRFdPUkQgR2V0RGlhbG9nQmFzZVVuaXRzKHZvaWQpOworRFdPUkQgR2V0RnJlZVNwYWNlKFdPUkQpOworRFdPUkQgR2V0SGVhcFNwYWNlcyhITU9EVUxFKTsKK0RXT1JEIEdldE1lbnVDaGVja01hcmtEaW1lbnNpb25zKHZvaWQpOworRFdPUkQgR2V0TWVzc2FnZVBvcyh2b2lkKTsKK0RXT1JEIEdldE5lYXJlc3RDb2xvcihIREMsRFdPUkQpOworRFdPUkQgR2V0UGl4ZWwoSERDLHNob3J0LHNob3J0KTsKK0RXT1JEIEdldFNlbGVjdG9yQmFzZShXT1JEKTsKK0RXT1JEIEdldFNlbGVjdG9yTGltaXQoV09SRCk7CitEV09SRCBHZXRUYWJiZWRUZXh0RXh0ZW50KEhEQyxMUFNUUixpbnQsaW50LExQSU5UKTsKK0RXT1JEIEdldFRleHRFeHRlbnQoSERDLExQU1RSLHNob3J0KTsKK0RXT1JEIEdldFRpY2tDb3VudCh2b2lkKTsKK0RXT1JEIEdldFZpZXdwb3J0RXh0KEhEQyk7CitEV09SRCBHZXRWaWV3cG9ydE9yZyhIREMpOworRFdPUkQgR2V0V2luZG93RXh0KEhEQyk7CitEV09SRCBHZXRXaW5kb3dPcmcoSERDKTsKK0RXT1JEIEdsb2JhbENvbXBhY3QoRFdPUkQpOworRFdPUkQgR2xvYmFsRE9TQWxsb2MoRFdPUkQpOworRFdPUkQgR2xvYmFsSGFuZGxlKFdPUkQpOworRFdPUkQgR2xvYmFsU2l6ZShIR0xPQkFMKTsKK0RXT1JEIE1vdmVUbyhIREMsc2hvcnQsc2hvcnQpOworRFdPUkQgT2VtS2V5U2NhbihXT1JEKTsKK0RXT1JEIE9mZnNldFZpZXdwb3J0T3JnKEhEQyxzaG9ydCxzaG9ydCk7CitEV09SRCBPZmZzZXRXaW5kb3dPcmcoSERDLHNob3J0LHNob3J0KTsKK0RXT1JEIFNjYWxlVmlld3BvcnRFeHQoSERDLHNob3J0LHNob3J0LHNob3J0LHNob3J0KTsKK0RXT1JEIFNjYWxlV2luZG93RXh0KEhEQyxzaG9ydCxzaG9ydCxzaG9ydCxzaG9ydCk7CitEV09SRCBTZXRCaXRtYXBEaW1lbnNpb24oSEJJVE1BUCxzaG9ydCxzaG9ydCk7CitEV09SRCBTZXRCa0NvbG9yKEhEQyxDT0xPUlJFRik7CitEV09SRCBTZXRCcnVzaE9yZyhIREMsc2hvcnQsc2hvcnQpOworRFdPUkQgU2V0TWFwcGVyRmxhZ3MoSERDLERXT1JEKTsKK0RXT1JEIFNldFRleHRDb2xvcihIREMsRFdPUkQpOworRFdPUkQgU2V0Vmlld3BvcnRFeHQoSERDLHNob3J0LHNob3J0KTsKK0RXT1JEIFNldFZpZXdwb3J0T3JnKEhEQyxzaG9ydCxzaG9ydCk7CitEV09SRCBTZXRXaW5kb3dFeHQoSERDLHNob3J0LHNob3J0KTsKK0RXT1JEIFNldFdpbmRvd09yZyhIREMsc2hvcnQsc2hvcnQpOworRFdPUkQgU2l6ZW9mUmVzb3VyY2UoSEFORExFLEhSU1JDKTsKK0ZBUlBST0MgR2V0UHJvY0FkZHJlc3MoSEFORExFLFNFR1BUUik7CitGQVJQUk9DIExvY2FsTm90aWZ5KEZBUlBST0MpOworRkFSUFJPQyBNYWtlUHJvY0luc3RhbmNlKEZBUlBST0MsSEFORExFKTsKK0ZBUlBST0MgU2V0UmVzb3VyY2VIYW5kbGVyKEhBTkRMRSxMUFNUUixGQVJQUk9DKTsKK0ZBUlBST0MgU2V0V2luZG93c0hvb2soc2hvcnQsRkFSUFJPQyk7CitIQU5ETEUgQ29weU1ldGFGaWxlKEhBTkRMRSxMUFNUUik7CitIQU5ETEUgQ3JlYXRlQ3Vyc29ySWNvbkluZGlyZWN0KEhBTkRMRSxDVVJTT1JJQ09OSU5GTyosTFBTVFIsTFBTVFIpOworSEFORExFIENyZWF0ZU1ldGFGaWxlKExQU1RSKTsKK0hBTkRMRSBEaXJlY3RSZXNBbGxvYyhIQU5ETEUsV09SRCxXT1JEKTsKK0hBTkRMRSBGaW5kUmVzb3VyY2UoSEFORExFLFNFR1BUUixTRUdQVFIpOworSEFORExFIEdldEF0b21IYW5kbGUoQVRPTSk7CitIQU5ETEUgR2V0Q2xpcGJvYXJkRGF0YShXT1JEKTsKK0hBTkRMRSBHZXRDb2RlSGFuZGxlKEZBUlBST0MpOworSEFORExFIEdldEN1cnJlbnRQREIodm9pZCk7CitIQU5ETEUgR2V0Q3VycmVudFRhc2sodm9pZCk7CitIQU5ETEUgR2V0TWV0YUZpbGUoTFBTVFIpOworSEFORExFIEdldE1ldGFGaWxlQml0cyhIQU5ETEUpOworSEFORExFIEdldE1vZHVsZUhhbmRsZShMUENTVFIpOworSEFORExFIEdldFByb3AoSFdORCxTRUdQVFIpOworSEFORExFIEdldFN0b2NrT2JqZWN0KGludCk7CitIQU5ETEUgR2V0V2luZG93VGFzayhIV05EKTsKK0hBTkRMRSBMb2FkQWNjZWxlcmF0b3JzKEhBTkRMRSxTRUdQVFIpOworSEFORExFIExvYWRMaWJyYXJ5KExQQ1NUUik7CitIQU5ETEUgTG9hZE1vZHVsZShMUENTVFIsTFBWT0lEKTsKK0hBTkRMRSBMb2FkUmVzb3VyY2UoSEFORExFLEhBTkRMRSk7CitIQU5ETEUgTG9jYWxBbGxvYyhXT1JELFdPUkQpOworSEFORExFIExvY2FsRnJlZShIQU5ETEUpOworSEFORExFIExvY2FsSGFuZGxlKFdPUkQpOworSEFORExFIExvY2FsUmVBbGxvYyhIQU5ETEUsV09SRCxXT1JEKTsKK0hBTkRMRSBSZW1vdmVQcm9wKEhXTkQsU0VHUFRSKTsKK0hBTkRMRSBTZWxlY3RPYmplY3QoSERDLEhBTkRMRSk7CitIQU5ETEUgU2V0Q2xpcGJvYXJkRGF0YShXT1JELEhBTkRMRSk7CitIQU5ETEUgU2V0TWV0YUZpbGVCaXRzKEhBTkRMRSk7CitIQU5ETEUgV2luRXhlYyhMUFNUUixXT1JEKTsKK0hCSVRNQVAgQ3JlYXRlQml0bWFwKHNob3J0LHNob3J0LEJZVEUsQllURSxMUFNUUik7CitIQklUTUFQIENyZWF0ZUJpdG1hcEluZGlyZWN0KEJJVE1BUCopOworSEJJVE1BUCBDcmVhdGVDb21wYXRpYmxlQml0bWFwKEhEQyxzaG9ydCxzaG9ydCk7CitIQklUTUFQIENyZWF0ZURJQml0bWFwKEhEQyxMUEJJVE1BUElORk9IRUFERVIsRFdPUkQsTFBTVFIsTFBCSVRNQVBJTkZPLFdPUkQpOworSEJJVE1BUCBDcmVhdGVEaXNjYXJkYWJsZUJpdG1hcChIREMsc2hvcnQsc2hvcnQpOworSEJJVE1BUCBMb2FkQml0bWFwKEhBTkRMRSxTRUdQVFIpOworSEJSVVNIIENyZWF0ZUJydXNoSW5kaXJlY3QoTE9HQlJVU0gqKTsKK0hCUlVTSCBDcmVhdGVESUJQYXR0ZXJuQnJ1c2goSEFORExFLFdPUkQpOworSEJSVVNIIENyZWF0ZUhhdGNoQnJ1c2goc2hvcnQsQ09MT1JSRUYpOworSEJSVVNIIENyZWF0ZVBhdHRlcm5CcnVzaChIQklUTUFQKTsKK0hCUlVTSCBDcmVhdGVTb2xpZEJydXNoKERXT1JEKTsKK0hCUlVTSCBHZXRDb250cm9sQnJ1c2goSFdORCxIREMsV09SRCk7CitIQ1VSU09SIENyZWF0ZUN1cnNvcihIQU5ETEUsSU5ULElOVCxJTlQsSU5ULExQU1RSLExQU1RSKTsKK0hDVVJTT1IgR2V0Q3Vyc29yKHZvaWQpOworSENVUlNPUiBMb2FkQ3Vyc29yKEhBTkRMRSxTRUdQVFIpOworSENVUlNPUiBTZXRDdXJzb3IoSENVUlNPUik7CitIREMgQmVnaW5QYWludChIV05ELExQUEFJTlRTVFJVQ1QpOworSERDIENyZWF0ZUNvbXBhdGlibGVEQyhIREMpOworSERDIENyZWF0ZURDKExQU1RSLExQU1RSLExQU1RSLExQU1RSKTsKK0hEQyBDcmVhdGVJQyhMUFNUUixMUFNUUixMUFNUUixMUFNUUik7CitIREMgR2V0REMoSFdORCk7CitIREMgR2V0RENFeChIV05ELEhSR04sRFdPUkQpOworSERDIEdldERDU3RhdGUoSERDKTsKK0hEQyBHZXRXaW5kb3dEQyhIV05EKTsKK0hEV1AgQmVnaW5EZWZlcldpbmRvd1BvcyhJTlQpOworSERXUCBEZWZlcldpbmRvd1BvcyhIRFdQLEhXTkQsSFdORCxJTlQsSU5ULElOVCxJTlQsV09SRCk7CitIRk9OVCBDcmVhdGVGb250KGludCxpbnQsaW50LGludCxpbnQsQllURSxCWVRFLEJZVEUsQllURSxCWVRFLEJZVEUsQllURSxCWVRFLExQU1RSKTsKK0hGT05UIENyZWF0ZUZvbnRJbmRpcmVjdChMT0dGT05UKik7CitIR0xPQkFMIEFsbG9jUmVzb3VyY2UoSElOU1RBTkNFLEhSU1JDLERXT1JEKTsKK0hHTE9CQUwgR2V0VGFza1F1ZXVlKEhUQVNLKTsKK0hHTE9CQUwgR2xvYmFsQWxsb2MoV09SRCxEV09SRCk7CitIR0xPQkFMIEdsb2JhbEZyZWUoSEdMT0JBTCk7CitIR0xPQkFMIEdsb2JhbExSVU5ld2VzdChIR0xPQkFMKTsKK0hHTE9CQUwgR2xvYmFsTFJVT2xkZXN0KEhHTE9CQUwpOworSEdMT0JBTCBHbG9iYWxSZUFsbG9jKEhHTE9CQUwsRFdPUkQsV09SRCk7CitIR0xPQkFMIExvY2tTZWdtZW50KEhHTE9CQUwpOworSEdMT0JBTCBTZXRUYXNrUXVldWUoSFRBU0ssSEdMT0JBTCk7CitISE9PSyBTZXRXaW5kb3dzSG9va0V4KHNob3J0LEhPT0tQUk9DLEhJTlNUQU5DRSxIVEFTSyk7CitISUNPTiBDcmVhdGVJY29uKEhBTkRMRSxJTlQsSU5ULEJZVEUsQllURSxMUFNUUixMUFNUUik7CitISUNPTiBMb2FkSWNvbihIQU5ETEUsU0VHUFRSKTsKK0hJTlNUQU5DRSBHZXRUYXNrRFModm9pZCk7CitITUVOVSBDcmVhdGVNZW51KHZvaWQpOworSE1FTlUgQ3JlYXRlUG9wdXBNZW51KHZvaWQpOworSE1FTlUgR2V0TWVudShIV05EKTsKK0hNRU5VIEdldFN1Yk1lbnUoSE1FTlUsc2hvcnQpOworSE1FTlUgR2V0U3lzdGVtTWVudShIV05ELEJPT0wpOworSE1FTlUgTG9hZE1lbnUoSEFORExFLFNFR1BUUik7CitITUVOVSBMb2FkTWVudUluZGlyZWN0KExQU1RSKTsKK0hNRU5VIExvb2t1cE1lbnVIYW5kbGUoSE1FTlUsSU5UKTsKK0hNRVRBRklMRSBDbG9zZU1ldGFGaWxlKEhBTkRMRSk7CitITU9EVUxFIEdldEV4ZVB0cihIQU5ETEUpOworSFBBTEVUVEUgQ3JlYXRlUGFsZXR0ZShMUExPR1BBTEVUVEUpOworSFBBTEVUVEUgR0RJU2VsZWN0UGFsZXR0ZShIREMsSFBBTEVUVEUpOworSFBBTEVUVEUgU2VsZWN0UGFsZXR0ZShIREMsSFBBTEVUVEUsQk9PTCk7CitIUEVOIENyZWF0ZVBlbihzaG9ydCxzaG9ydCxDT0xPUlJFRik7CitIUEVOIENyZWF0ZVBlbkluZGlyZWN0KExPR1BFTiopOworSFJHTiBDcmVhdGVFbGxpcHRpY1JnbihzaG9ydCxzaG9ydCxzaG9ydCxzaG9ydCk7CitIUkdOIENyZWF0ZUVsbGlwdGljUmduSW5kaXJlY3QoTFBSRUNUKTsKK0hSR04gQ3JlYXRlUG9seVBvbHlnb25SZ24oTFBQT0lOVCxMUElOVCxzaG9ydCxzaG9ydCk7CitIUkdOIENyZWF0ZVBvbHlnb25SZ24oTFBQT0lOVCxzaG9ydCxzaG9ydCk7CitIUkdOIENyZWF0ZVJlY3RSZ24oc2hvcnQsc2hvcnQsc2hvcnQsc2hvcnQpOworSFJHTiBDcmVhdGVSZWN0UmduSW5kaXJlY3QoTFBSRUNUKTsKK0hSR04gQ3JlYXRlUm91bmRSZWN0UmduKHNob3J0LHNob3J0LHNob3J0LHNob3J0LHNob3J0LHNob3J0KTsKK0hSR04gR2V0Q2xpcFJnbihIREMpOworSFJHTiBJbnF1aXJlVmlzUmduKEhEQyk7CitIUkdOIFNhdmVWaXNSZ24oSERDKTsKK0hXTkQgQ2hpbGRXaW5kb3dGcm9tUG9pbnQoSFdORCxQT0lOVCk7CitIV05EIENyZWF0ZURpYWxvZyhIQU5ETEUsU0VHUFRSLEhXTkQsV05EUFJPQyk7CitIV05EIENyZWF0ZURpYWxvZ0luZGlyZWN0KEhBTkRMRSxTRUdQVFIsSFdORCxXTkRQUk9DKTsKK0hXTkQgQ3JlYXRlRGlhbG9nSW5kaXJlY3RQYXJhbShIQU5ETEUsU0VHUFRSLEhXTkQsV05EUFJPQyxMUEFSQU0pOworSFdORCBDcmVhdGVEaWFsb2dQYXJhbShIQU5ETEUsU0VHUFRSLEhXTkQsV05EUFJPQyxMUEFSQU0pOworSFdORCBDcmVhdGVXaW5kb3coU0VHUFRSLFNFR1BUUixEV09SRCxJTlQsSU5ULElOVCxJTlQsSFdORCxITUVOVSxISU5TVEFOQ0UsU0VHUFRSKTsKK0hXTkQgQ3JlYXRlV2luZG93RXgoRFdPUkQsU0VHUFRSLFNFR1BUUixEV09SRCxJTlQsSU5ULElOVCxJTlQsSFdORCxITUVOVSxISU5TVEFOQ0UsU0VHUFRSKTsKK0hXTkQgRmluZFdpbmRvdyhTRUdQVFIsTFBTVFIpOworSFdORCBHZXRBY3RpdmVXaW5kb3codm9pZCk7CitIV05EIEdldENhcHR1cmUodm9pZCk7CitIV05EIEdldENsaXBib2FyZE93bmVyKHZvaWQpOworSFdORCBHZXRDbGlwYm9hcmRWaWV3ZXIodm9pZCk7CitIV05EIEdldERlc2t0b3BId25kKHZvaWQpOworSFdORCBHZXREZXNrdG9wV2luZG93KHZvaWQpOworSFdORCBHZXREbGdJdGVtKEhXTkQsV09SRCk7CitIV05EIEdldEZvY3VzKHZvaWQpOworSFdORCBHZXRMYXN0QWN0aXZlUG9wdXAoSFdORCk7CitIV05EIEdldE5leHREbGdHcm91cEl0ZW0oSFdORCxIV05ELEJPT0wpOworSFdORCBHZXROZXh0RGxnVGFiSXRlbShIV05ELEhXTkQsQk9PTCk7CitIV05EIEdldE5leHRXaW5kb3coSFdORCxXT1JEKTsKK0hXTkQgR2V0T3BlbkNsaXBib2FyZFdpbmRvdyh2b2lkKTsKK0hXTkQgR2V0UGFyZW50KEhXTkQpOworSFdORCBHZXRTeXNNb2RhbFdpbmRvdyh2b2lkKTsKK0hXTkQgR2V0VG9wV2luZG93KEhXTkQpOworSFdORCBHZXRXaW5kb3coSFdORCxXT1JEKTsKK0hXTkQgU2V0QWN0aXZlV2luZG93KEhXTkQpOworSFdORCBTZXRDYXB0dXJlKEhXTkQpOworSFdORCBTZXRDbGlwYm9hcmRWaWV3ZXIoSFdORCk7CitIV05EIFNldEZvY3VzKEhXTkQpOworSFdORCBTZXRQYXJlbnQoSFdORCxIV05EKTsKK0hXTkQgU2V0U3lzTW9kYWxXaW5kb3coSFdORCk7CitIV05EIFdpbmRvd0Zyb21Qb2ludChQT0lOVCk7CitJTlQgQWNjZXNzUmVzb3VyY2UoSElOU1RBTkNFLEhSU1JDKTsKK0lOVCBBZGRGb250UmVzb3VyY2UoTFBDU1RSKTsKK0lOVCBBbnNpVG9PZW0oTFBTVFIsTFBTVFIpOworSU5UIEdldFRlbXBGaWxlTmFtZShCWVRFLExQQ1NUUixVSU5ULExQU1RSKTsKK0lOVCBHZXRUZXh0RmFjZShIREMsSU5ULExQU1RSKTsKK0lOVCBPcGVuRmlsZShMUENTVFIsTFBPRlNUUlVDVCxVSU5UKTsKK0lOVCBfbGNsb3NlKElOVCk7CitJTlQgX2xjcmVhdChMUFNUUixJTlQpOworSU5UIF9sb3BlbihMUFNUUixJTlQpOworSU5UIF9scmVhZChJTlQsTFBTVFIsV09SRCk7CitJTlQgX2x3cml0ZShJTlQsTFBDU1RSLFdPUkQpOworSU5UIGxzdHJjbXAoTFBDU1RSLExQQ1NUUik7CitJTlQgbHN0cmNtcGkoTFBDU1RSLExQQ1NUUik7CitJTlQgbHN0cmxlbihMUENTVFIpOworTE9ORyBDYWxsV2luZG93UHJvYyhXTkRQUk9DLEhXTkQsVUlOVCxXUEFSQU0sTFBBUkFNKTsKK0xPTkcgRGVmRGxnUHJvYyhIV05ELFVJTlQsV1BBUkFNLExQQVJBTSk7CitMT05HIERlZkZyYW1lUHJvYyhIV05ELEhXTkQsVUlOVCxXUEFSQU0sTFBBUkFNKTsKK0xPTkcgRGVmTURJQ2hpbGRQcm9jKEhXTkQsVUlOVCxXUEFSQU0sTFBBUkFNKTsKK0xPTkcgRGlzcGF0Y2hNZXNzYWdlKExQTVNHKTsKK0xPTkcgRXNjYXBlQ29tbUZ1bmN0aW9uKGludCxpbnQpOworTE9ORyBHZXRCaXRtYXBCaXRzKEhCSVRNQVAsTE9ORyxMUFNUUik7CitMT05HIEdldENsYXNzTG9uZyhIV05ELHNob3J0KTsKK0xPTkcgR2V0TWVzc2FnZUV4dHJhSW5mbyh2b2lkKTsKK0xPTkcgR2V0TWVzc2FnZVRpbWUodm9pZCk7CitMT05HIEdldFZlcnNpb24odm9pZCk7CitMT05HIEdldFdpbkZsYWdzKHZvaWQpOworTE9ORyBHZXRXaW5kb3dMb25nKEhXTkQsc2hvcnQpOworTE9ORyBTZW5kRGxnSXRlbU1lc3NhZ2UoSFdORCxJTlQsVUlOVCxXUEFSQU0sTFBBUkFNKTsKK0xPTkcgU2V0Qml0bWFwQml0cyhIQklUTUFQLExPTkcsTFBTVFIpOworTE9ORyBTZXRDbGFzc0xvbmcoSFdORCxzaG9ydCxMT05HKTsKK0xPTkcgU2V0U3dhcEFyZWFTaXplKFdPUkQpOworTE9ORyBTZXRXaW5kb3dMb25nKEhXTkQsc2hvcnQsTE9ORyk7CitMT05HIFRhYmJlZFRleHRPdXQoSERDLHNob3J0LHNob3J0LExQU1RSLHNob3J0LHNob3J0LExQSU5ULHNob3J0KTsKK0xPTkcgX2hyZWFkKElOVCxMUFNUUixMT05HKTsKK0xPTkcgX2h3cml0ZShJTlQsTFBDU1RSLExPTkcpOworTE9ORyBfbGxzZWVrKElOVCxMT05HLElOVCk7CitMUElOVCBHZXRUaHJlc2hvbGRFdmVudCh2b2lkKTsKK0xQU1RSIEFuc2lMb3dlcihMUFNUUik7CitMUFNUUiBBbnNpVXBwZXIoTFBTVFIpOworTFBTVFIgTG9ja1Jlc291cmNlKEhBTkRMRSk7CitMUFNUUiBWYWxpZGF0ZUZyZWVTcGFjZXModm9pZCk7CitMUFZPSUQgR2xvYmFsTG9jayhIR0xPQkFMKTsKK0xSRVNVTFQgRGVmV2luZG93UHJvYyhIV05ELFVJTlQsV1BBUkFNLExQQVJBTSk7CitMUkVTVUxUIFNlbmRNZXNzYWdlKEhXTkQsVUlOVCxXUEFSQU0sTFBBUkFNKTsKK05QVk9JRCBMb2NhbExvY2soSExPQ0FMKTsKK1NFR1BUUiBBbnNpTmV4dChTRUdQVFIpOworU0VHUFRSIEFuc2lQcmV2KFNFR1BUUixTRUdQVFIpOworU0VHUFRSIEdldERPU0Vudmlyb25tZW50KHZvaWQpOworU0VHUFRSIEdsb2JhbFdpcmUoSEdMT0JBTCk7CitTRUdQVFIgV0lOMTZfR2xvYmFsTG9jayhIR0xPQkFMKTsKK1NFR1BUUiBXSU4xNl9Mb2NrUmVzb3VyY2UoSEFORExFKTsKK1NFR1BUUiBsc3RyY2F0KFNFR1BUUixTRUdQVFIpOworU0VHUFRSIGxzdHJjcHkoU0VHUFRSLFNFR1BUUik7CitTRUdQVFIgbHN0cmNweW4oU0VHUFRSLFNFR1BUUixXT1JEKTsKK1VJTlQgQW5zaUxvd2VyQnVmZihMUFNUUixVSU5UKTsKK1VJTlQgQW5zaVVwcGVyQnVmZihMUFNUUixVSU5UKTsKK1VJTlQgR0RJUmVhbGl6ZVBhbGV0dGUoSERDKTsKK1VJTlQgUmVhbGl6ZVBhbGV0dGUoSERDKTsKK1dPUkQgQWxsb2NDU3RvRFNBbGlhcyhXT1JEKTsKK1dPUkQgQWxsb2NEU3RvQ1NBbGlhcyhXT1JEKTsKK1dPUkQgQWxsb2NTZWxlY3RvcihXT1JEKTsKK1dPUkQgQWxsb2NTZWxlY3RvckFycmF5KFdPUkQpOworV09SRCBBcnJhbmdlSWNvbmljV2luZG93cyhIV05EKTsKK1dPUkQgQ2hhbmdlU2VsZWN0b3IoV09SRCxXT1JEKTsKK1dPUkQgRW51bUNsaXBib2FyZEZvcm1hdHMoV09SRCk7CitXT1JEIEZhckdldE93bmVyKEhBTkRMRSk7CitXT1JEIEZyZWVTZWxlY3RvcihXT1JEKTsKK1dPUkQgR2V0QXRvbU5hbWUoQVRPTSxMUFNUUixzaG9ydCk7CitXT1JEIEdldEJrTW9kZShIREMpOworV09SRCBHZXRDYXJldEJsaW5rVGltZSh2b2lkKTsKK1dPUkQgR2V0Q2xhc3NXb3JkKEhXTkQsc2hvcnQpOworV09SRCBHZXRDb21tRXZlbnRNYXNrKGludCxpbnQpOworV09SRCBHZXREbGdJdGVtSW50KEhXTkQsV09SRCxCT09MKixCT09MKTsKK1dPUkQgR2V0RG91YmxlQ2xpY2tUaW1lKHZvaWQpOworV09SRCBHZXREcml2ZVR5cGUoSU5UKTsKK1dPUkQgR2V0SW50ZXJuYWxXaW5kb3dQb3MoSFdORCxMUFJFQ1QsTFBQT0lOVCk7CitXT1JEIEdldE1hcE1vZGUoSERDKTsKK1dPUkQgR2V0TWVudUl0ZW1Db3VudChITUVOVSk7CitXT1JEIEdldE1lbnVJdGVtSUQoSE1FTlUsaW50KTsKK1dPUkQgR2V0TWVudVN0YXRlKEhNRU5VLFdPUkQsV09SRCk7CitXT1JEIEdldE5lYXJlc3RQYWxldHRlSW5kZXgoSFBBTEVUVEUsRFdPUkQpOworV09SRCBHZXROdW1UYXNrcyh2b2lkKTsKK1dPUkQgR2V0UGFsZXR0ZUVudHJpZXMoSFBBTEVUVEUsV09SRCxXT1JELExQUEFMRVRURUVOVFJZKTsKK1dPUkQgR2V0UG9seUZpbGxNb2RlKEhEQyk7CitXT1JEIEdldFByaXZhdGVQcm9maWxlSW50KExQU1RSLExQU1RSLHNob3J0LExQU1RSKTsKK1dPUkQgR2V0UHJvZmlsZUludChMUFNUUixMUFNUUixpbnQpOworV09SRCBHZXRST1AyKEhEQyk7CitXT1JEIEdldFJlbEFicyhIREMpOworV09SRCBHZXRTdHJldGNoQmx0TW9kZShIREMpOworV09SRCBHZXRTeXN0ZW1EaXJlY3RvcnkoTFBTVFIsV09SRCk7CitXT1JEIEdldFN5c3RlbVBhbGV0dGVFbnRyaWVzKEhEQyxXT1JELFdPUkQsTFBQQUxFVFRFRU5UUlkpOworV09SRCBHZXRTeXN0ZW1QYWxldHRlVXNlKEhEQyk7CitXT1JEIEdldFRleHRBbGlnbihIREMpOworV09SRCBHZXRXaW5kb3dXb3JkKEhXTkQsc2hvcnQpOworV09SRCBHZXRXaW5kb3dzRGlyZWN0b3J5KExQU1RSLFdPUkQpOworV09SRCBHbG9iYWxET1NGcmVlKFdPUkQpOworV09SRCBHbG9iYWxGbGFncyhIR0xPQkFMKTsKK1dPUkQgR2xvYmFsR2V0QXRvbU5hbWUoQVRPTSxMUFNUUixzaG9ydCk7CitXT1JEIEdsb2JhbFBhZ2VMb2NrKEhHTE9CQUwpOworV09SRCBHbG9iYWxQYWdlVW5sb2NrKEhHTE9CQUwpOworV09SRCBJbml0QXRvbVRhYmxlKFdPUkQpOworV09SRCBJc0RsZ0J1dHRvbkNoZWNrZWQoSFdORCxXT1JEKTsKK1dPUkQgTG9jYWxDb21wYWN0KFdPUkQpOworV09SRCBMb2NhbEZsYWdzKEhMT0NBTCk7CitXT1JEIExvY2FsU2hyaW5rKEhBTkRMRSxXT1JEKTsKK1dPUkQgTG9jYWxTaXplKEhMT0NBTCk7CitXT1JEIE1hcFZpcnR1YWxLZXkoV09SRCxXT1JEKTsKK1dPUkQgUHJlc3RvQ2hhbmdvU2VsZWN0b3IoV09SRCxXT1JEKTsKK1dPUkQgUmVhbGl6ZURlZmF1bHRQYWxldHRlKEhEQyk7CitXT1JEIFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KExQQ1NUUik7CitXT1JEIFJlZ2lzdGVyV2luZG93TWVzc2FnZShTRUdQVFIpOworV09SRCBTZWxlY3RvckFjY2Vzc1JpZ2h0cyhXT1JELFdPUkQsV09SRCk7CitXT1JEIFNldEJrTW9kZShIREMsV09SRCk7CitXT1JEIFNldENsYXNzV29yZChIV05ELHNob3J0LFdPUkQpOworV09SRCBTZXRIYW5kbGVDb3VudChXT1JEKTsKK1dPUkQgU2V0TWFwTW9kZShIREMsV09SRCk7CitXT1JEIFNldFBhbGV0dGVFbnRyaWVzKEhQQUxFVFRFLFdPUkQsV09SRCxMUFBBTEVUVEVFTlRSWSk7CitXT1JEIFNldFBvbHlGaWxsTW9kZShIREMsV09SRCk7CitXT1JEIFNldFJPUDIoSERDLFdPUkQpOworV09SRCBTZXRSZWxBYnMoSERDLFdPUkQpOworV09SRCBTZXRTZWxlY3RvckJhc2UoV09SRCxEV09SRCk7CitXT1JEIFNldFNlbGVjdG9yTGltaXQoV09SRCxEV09SRCk7CitXT1JEIFNldFN0cmV0Y2hCbHRNb2RlKEhEQyxXT1JEKTsKK1dPUkQgU2V0U3lzdGVtUGFsZXR0ZVVzZShIREMsV09SRCk7CitXT1JEIFNldFN5c3RlbVRpbWVyKEhXTkQsV09SRCxXT1JELEZBUlBST0MpOworV09SRCBTZXRUZXh0QWxpZ24oSERDLFdPUkQpOworV09SRCBTZXRUaW1lcihIV05ELFdPUkQsV09SRCxGQVJQUk9DKTsKK1dPUkQgU2V0V2luZG93V29yZChIV05ELHNob3J0LFdPUkQpOworV09SRCBWa0tleVNjYW4oV09SRCk7CitXT1JEKiBTZXRDb21tRXZlbnRNYXNrKGludCxXT1JEKTsKK2ludCBCdWlsZENvbW1EQ0IoTFBTVFIsRENCKik7CitpbnQgQ2F0Y2goTFBDQVRDSEJVRik7CitpbnQgQ2xlYXJDb21tQnJlYWsoaW50KTsKK2ludCBDbG9zZUNvbW0oaW50KTsKK2ludCBDb21iaW5lUmduKEhSR04sSFJHTixIUkdOLHNob3J0KTsKK2ludCBDb252ZXJ0UmVxdWVzdChIV05ELExQS0FOSklTVFJVQ1QpOworaW50IENvdW50Q2xpcGJvYXJkRm9ybWF0cyh2b2lkKTsKK2ludCBDb3VudFZvaWNlTm90ZXMoaW50KTsKK2ludCBEaWFsb2dCb3goSElOU1RBTkNFLFNFR1BUUixIV05ELFdORFBST0MpOworaW50IERpYWxvZ0JveEluZGlyZWN0KEhBTkRMRSxIQU5ETEUsSFdORCxXTkRQUk9DKTsKK2ludCBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtKEhBTkRMRSxIQU5ETEUsSFdORCxXTkRQUk9DLExPTkcpOworaW50IERpYWxvZ0JveFBhcmFtKEhBTkRMRSxTRUdQVFIsSFdORCxXTkRQUk9DLExPTkcpOworaW50IERsZ0Rpckxpc3QoSFdORCxMUFNUUixpbnQsaW50LFdPUkQpOworaW50IERsZ0Rpckxpc3RDb21ib0JveChIV05ELFNFR1BUUixpbnQsaW50LFdPUkQpOworaW50IERyYXdUZXh0KEhEQyxMUFNUUixpbnQsTFBSRUNULFdPUkQpOworaW50IEVudW1Gb250cyhIREMsTFBTVFIsRkFSUFJPQyxMUFNUUik7CitpbnQgRW51bU9iamVjdHMoSERDLGludCxGQVJQUk9DLExQU1RSKTsKK2ludCBFbnVtUHJvcHMoSFdORCxGQVJQUk9DKTsKK2ludCBFc2NhcGUoSERDLGludCxpbnQsTFBTVFIsTFBTVFIpOworaW50IEV4Y2x1ZGVDbGlwUmVjdChIREMsc2hvcnQsc2hvcnQsc2hvcnQsc2hvcnQpOworaW50IEV4Y2x1ZGVVcGRhdGVSZ24oSERDLEhXTkQpOworaW50IEV4Y2x1ZGVWaXNSZWN0KEhEQyxzaG9ydCxzaG9ydCxzaG9ydCxzaG9ydCk7CitpbnQgRmlsbFJlY3QoSERDLExQUkVDVCxIQlJVU0gpOworaW50IEZsdXNoQ29tbShpbnQsaW50KTsKK2ludCBGcmFtZVJlY3QoSERDLExQUkVDVCxIQlJVU0gpOworaW50IEdldEFzeW5jS2V5U3RhdGUoaW50KTsKK2ludCBHZXRDbGFzc05hbWUoSFdORCxMUFNUUixzaG9ydCk7CitpbnQgR2V0Q2xpcEJveChIREMsTFBSRUNUKTsKK2ludCBHZXRDbGlwYm9hcmRGb3JtYXROYW1lKFdPUkQsTFBTVFIsc2hvcnQpOworaW50IEdldENvbW1FcnJvcihpbnQsQ09NU1RBVCopOworaW50IEdldENvbW1TdGF0ZShpbnQsRENCKik7CitpbnQgR2V0RElCaXRzKEhEQyxIQU5ETEUsV09SRCxXT1JELExQU1RSLExQQklUTUFQSU5GTyxXT1JEKTsKK2ludCBHZXREZXZpY2VDYXBzKEhEQyxXT1JEKTsKK2ludCBHZXREbGdDdHJsSUQoSFdORCk7CitpbnQgR2V0RGxnSXRlbVRleHQoSFdORCxXT1JELFNFR1BUUixXT1JEKTsKK2ludCBHZXRFbnZpcm9ubWVudChMUFNUUixMUFNUUixXT1JEKTsKK2ludCBHZXRJbnN0YW5jZURhdGEoSEFORExFLFdPUkQsaW50KTsKK2ludCBHZXRLQkNvZGVQYWdlKHZvaWQpOworaW50IEdldEtleU5hbWVUZXh0KExPTkcsTFBTVFIsaW50KTsKK2ludCBHZXRLZXlTdGF0ZShpbnQpOworaW50IEdldEtleWJvYXJkVHlwZShpbnQpOworaW50IEdldE1lbnVTdHJpbmcoSE1FTlUsV09SRCxMUFNUUixzaG9ydCxXT1JEKTsKK2ludCBHZXRNb2R1bGVGaWxlTmFtZShIQU5ETEUsTFBTVFIsc2hvcnQpOworaW50IEdldE1vZHVsZVVzYWdlKEhBTkRMRSk7CitpbnQgR2V0T2JqZWN0KEhBTkRMRSxpbnQsTFBTVFIpOworaW50IEdldFByaW9yaXR5Q2xpcGJvYXJkRm9ybWF0KFdPUkQqLHNob3J0KTsKK2ludCBHZXRQcm9maWxlU3RyaW5nKExQU1RSLExQU1RSLExQU1RSLExQU1RSLGludCk7CitpbnQgR2V0UmduQm94KEhSR04sTFBSRUNUKTsKK2ludCBHZXRTY3JvbGxQb3MoSFdORCxpbnQpOworaW50IEdldFN5c3RlbU1ldHJpY3MoV09SRCk7CitpbnQgR2V0VGhyZXNob2xkU3RhdHVzKHZvaWQpOworaW50IEdldFVwZGF0ZVJnbihIV05ELEhSR04sQk9PTCk7CitpbnQgR2V0V2luZG93VGV4dChIV05ELExQU1RSLGludCk7CitpbnQgR2V0V2luZG93VGV4dExlbmd0aChIV05EKTsKK2ludCBJbnRlcnNlY3RDbGlwUmVjdChIREMsc2hvcnQsc2hvcnQsc2hvcnQsc2hvcnQpOworaW50IEludGVyc2VjdFZpc1JlY3QoSERDLHNob3J0LHNob3J0LHNob3J0LHNob3J0KTsKK2ludCBMb2FkU3RyaW5nKEhBTkRMRSxXT1JELExQU1RSLGludCk7CitpbnQgTWVzc2FnZUJveChIV05ELExQU1RSLExQU1RSLFdPUkQpOworaW50IE11bERpdihpbnQsaW50LGludCk7CitpbnQgT2Zmc2V0Q2xpcFJnbihIREMsc2hvcnQsc2hvcnQpOworaW50IE9mZnNldFJnbihIUkdOLHNob3J0LHNob3J0KTsKK2ludCBPcGVuQ29tbShMUFNUUixXT1JELFdPUkQpOworaW50IE9wZW5Tb3VuZCh2b2lkKTsKK2ludCBQcm9mSW5zQ2hrKHZvaWQpOworaW50IFJlYWRDb21tKGludCxMUFNUUixpbnQpOworaW50IFJlbGVhc2VEQyhIV05ELEhEQyk7CitpbnQgUmVzdG9yZVZpc1JnbihIREMpOworaW50IFNhdmVEQyhIREMpOworaW50IFNjcm9sbFdpbmRvd0V4KEhXTkQsc2hvcnQsc2hvcnQsTFBSRUNULExQUkVDVCxIUkdOLExQUkVDVCxXT1JEKTsKK2ludCBTZWxlY3RDbGlwUmduKEhEQyxIUkdOKTsKK2ludCBTZWxlY3RWaXNSZ24oSERDLEhSR04pOworaW50IFNldENvbW1CcmVhayhpbnQpOworaW50IFNldENvbW1TdGF0ZShEQ0IqKTsKK2ludCBTZXRESUJpdHMoSERDLEhBTkRMRSxXT1JELFdPUkQsTFBTVFIsTFBCSVRNQVBJTkZPLFdPUkQpOworaW50IFNldERJQml0c1RvRGV2aWNlKEhEQyxzaG9ydCxzaG9ydCxXT1JELFdPUkQsV09SRCxXT1JELFdPUkQsV09SRCxMUFNUUixMUEJJVE1BUElORk8sV09SRCk7CitpbnQgU2V0RW52aXJvbm1lbnQoTFBTVFIsTFBTVFIsV09SRCk7CitpbnQgU2V0U2Nyb2xsUG9zKEhXTkQsaW50LGludCxCT09MKTsKK2ludCBTZXRTb3VuZE5vaXNlKGludCxpbnQpOworaW50IFNldFZvaWNlQWNjZW50KGludCxpbnQsaW50LGludCxpbnQpOworaW50IFNldFZvaWNlRW52ZWxvcGUoaW50LGludCxpbnQpOworaW50IFNldFZvaWNlTm90ZShpbnQsaW50LGludCxpbnQpOworaW50IFNldFZvaWNlUXVldWVTaXplKGludCxpbnQpOworaW50IFNldFZvaWNlU291bmQoaW50LExPTkcsaW50KTsKK2ludCBTZXRWb2ljZVRocmVzaG9sZChpbnQsaW50KTsKK2ludCBTaG93Q3Vyc29yKEJPT0wpOworaW50IFN0YXJ0U291bmQodm9pZCk7CitpbnQgU3RvcFNvdW5kKHZvaWQpOworaW50IFN0cmV0Y2hESUJpdHMoSERDLFdPUkQsV09SRCxXT1JELFdPUkQsV09SRCxXT1JELFdPUkQsV09SRCxMUFNUUixMUEJJVE1BUElORk8sV09SRCxEV09SRCk7CitpbnQgU3luY0FsbFZvaWNlcyh2b2lkKTsKK2ludCBUaHJvdyhMUENBVENIQlVGLGludCk7CitpbnQgVG9Bc2NpaShXT1JELFdPUkQsTFBTVFIsTFBWT0lELFdPUkQpOworaW50IFRyYW5zbGF0ZUFjY2VsZXJhdG9yKEhXTkQsSEFORExFLExQTVNHKTsKK2ludCBUcmFuc21pdENvbW1DaGFyKGludCxjaGFyKTsKK2ludCBVbmdldENvbW1DaGFyKGludCxjaGFyKTsKK2ludCBVcGRhdGVDb2xvcnMoSERDKTsKK2ludCBXYWl0U291bmRTdGF0ZShpbnQpOworaW50IFdyaXRlQ29tbShpbnQsTFBTVFIsaW50KTsKK2ludCB3dnNwcmludGYoTFBTVFIsTFBTVFIsTFBTVFIpOworc2hvcnQgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoTFBTVFIsTFBTVFIsTFBTVFIsTFBTVFIsc2hvcnQsTFBTVFIpOworc2hvcnQgR2V0VGV4dENoYXJhY3RlckV4dHJhKEhEQyk7CitzaG9ydCBTZXRUZXh0Q2hhcmFjdGVyRXh0cmEoSERDLHNob3J0KTsKK3Nob3J0IFNldFRleHRKdXN0aWZpY2F0aW9uKEhEQyxzaG9ydCxzaG9ydCk7Cit2b2lkIEFkanVzdFdpbmRvd1JlY3QoTFBSRUNULERXT1JELEJPT0wpOwordm9pZCBBZGp1c3RXaW5kb3dSZWN0RXgoTFBSRUNULERXT1JELEJPT0wsRFdPUkQpOwordm9pZCBBbmltYXRlUGFsZXR0ZShIUEFMRVRURSxVSU5ULFVJTlQsTFBQQUxFVFRFRU5UUlkpOwordm9pZCBBbnNpVG9PZW1CdWZmKExQU1RSLExQU1RSLElOVCk7Cit2b2lkIENoZWNrRGxnQnV0dG9uKEhXTkQsV09SRCxXT1JEKTsKK3ZvaWQgQ2hlY2tSYWRpb0J1dHRvbihIV05ELFdPUkQsV09SRCxXT1JEKTsKK3ZvaWQgQ2xpZW50VG9TY3JlZW4oSFdORCxMUFBPSU5UKTsKK3ZvaWQgQ2xpcEN1cnNvcihMUFJFQ1QpOwordm9pZCBDbG9zZVNvdW5kKHZvaWQpOwordm9pZCBDbG9zZVdpbmRvdyhIV05EKTsKK3ZvaWQgQ29weVJlY3QoTFBSRUNULExQUkVDVCk7Cit2b2lkIENyZWF0ZUNhcmV0KEhXTkQsSEJJVE1BUCxzaG9ydCxzaG9ydCk7Cit2b2lkIERlYnVnQnJlYWsodm9pZCk7Cit2b2lkIERlc3Ryb3lDYXJldCh2b2lkKTsKK3ZvaWQgRGlyZWN0ZWRZaWVsZChIVEFTSyk7Cit2b2lkIERyYXdGb2N1c1JlY3QoSERDLExQUkVDVCk7Cit2b2lkIERyYXdNZW51QmFyKEhXTkQpOwordm9pZCBFbmREaWFsb2coSFdORCxzaG9ydCk7Cit2b2lkIEVuZFBhaW50KEhXTkQsTFBQQUlOVFNUUlVDVCk7Cit2b2lkIEZhclNldE93bmVyKEhBTkRMRSxXT1JEKTsKK3ZvaWQgRmF0YWxFeGl0KGludCk7Cit2b2lkIEZpbGxXaW5kb3coSFdORCxIV05ELEhEQyxIQlJVU0gpOwordm9pZCBGcmVlTGlicmFyeShIQU5ETEUpOwordm9pZCBGcmVlUHJvY0luc3RhbmNlKEZBUlBST0MpOwordm9pZCBHZXRDYXJldFBvcyhMUFBPSU5UKTsKK3ZvaWQgR2V0Q2xpZW50UmVjdChIV05ELExQUkVDVCk7Cit2b2lkIEdldENvZGVJbmZvKEZBUlBST0MsTFBWT0lEKTsKK3ZvaWQgR2V0Q3Vyc29yUG9zKExQUE9JTlQpOwordm9pZCBHZXRLZXlib2FyZFN0YXRlKEJZVEUqKTsKK3ZvaWQgR2V0U2Nyb2xsUmFuZ2UoSFdORCxpbnQsTFBJTlQsTFBJTlQpOwordm9pZCBHZXRXaW5kb3dSZWN0KEhXTkQsTFBSRUNUKTsKK3ZvaWQgR2xvYmFsRml4KEhHTE9CQUwpOwordm9pZCBHbG9iYWxGcmVlQWxsKEhBTkRMRSk7Cit2b2lkIEdsb2JhbE5vdGlmeShGQVJQUk9DKTsKK3ZvaWQgR2xvYmFsVW5maXgoSEdMT0JBTCk7Cit2b2lkIEhpZGVDYXJldChIV05EKTsKK3ZvaWQgSW5mbGF0ZVJlY3QoTFBSRUNULHNob3J0LHNob3J0KTsKK3ZvaWQgSW52YWxpZGF0ZVJlY3QoSFdORCxMUFJFQ1QsQk9PTCk7Cit2b2lkIEludmFsaWRhdGVSZ24oSFdORCxIUkdOLEJPT0wpOwordm9pZCBJbnZlcnRSZWN0KEhEQyxMUFJFQ1QpOwordm9pZCBMaW1pdEVtc1BhZ2VzKERXT1JEKTsKK3ZvaWQgTGluZUREQShzaG9ydCxzaG9ydCxzaG9ydCxzaG9ydCxGQVJQUk9DLGxvbmcpOwordm9pZCBNYXBEaWFsb2dSZWN0KEhXTkQsTFBSRUNUKTsKK3ZvaWQgTWFwV2luZG93UG9pbnRzKEhXTkQsSFdORCxMUFBPSU5ULFdPUkQpOwordm9pZCBNZXNzYWdlQmVlcChXT1JEKTsKK3ZvaWQgT2VtVG9BbnNpQnVmZihMUFNUUixMUFNUUixJTlQpOwordm9pZCBPZmZzZXRSZWN0KExQUkVDVCxzaG9ydCxzaG9ydCk7Cit2b2lkIE91dHB1dERlYnVnU3RyaW5nKExQU1RSKTsKK3ZvaWQgUGFpbnRSZWN0KEhXTkQsSFdORCxIREMsSEJSVVNILExQUkVDVCk7Cit2b2lkIFBsYXlNZXRhRmlsZVJlY29yZChIREMsTFBIQU5ETEVUQUJMRSxMUE1FVEFSRUNPUkQsV09SRCk7Cit2b2lkIFBvc3RRdWl0TWVzc2FnZShpbnQpOwordm9pZCBQcm9mQ2xlYXIodm9pZCk7Cit2b2lkIFByb2ZGaW5pc2godm9pZCk7Cit2b2lkIFByb2ZGbHVzaCh2b2lkKTsKK3ZvaWQgUHJvZlNhbXBSYXRlKGludCxpbnQpOwordm9pZCBQcm9mU2V0dXAoaW50LGludCk7Cit2b2lkIFByb2ZTdGFydCh2b2lkKTsKK3ZvaWQgUHJvZlN0b3Aodm9pZCk7Cit2b2lkIFJlbGVhc2VDYXB0dXJlKHZvaWQpOwordm9pZCBSZXBseU1lc3NhZ2UoTE9ORyk7Cit2b2lkIFNjcmVlblRvQ2xpZW50KEhXTkQsTFBQT0lOVCk7Cit2b2lkIFNjcm9sbFdpbmRvdyhIV05ELHNob3J0LHNob3J0LExQUkVDVCxMUFJFQ1QpOwordm9pZCBTZXRDYXJldEJsaW5rVGltZShXT1JEKTsKK3ZvaWQgU2V0Q2FyZXRQb3Moc2hvcnQsc2hvcnQpOwordm9pZCBTZXRDb252ZXJ0SG9vayhCT09MKTsKK3ZvaWQgU2V0Q3Vyc29yUG9zKHNob3J0LHNob3J0KTsKK3ZvaWQgU2V0RENTdGF0ZShIREMsSERDKTsKK3ZvaWQgU2V0RGxnSXRlbUludChIV05ELFdPUkQsV09SRCxCT09MKTsKK3ZvaWQgU2V0RGxnSXRlbVRleHQoSFdORCxXT1JELFNFR1BUUik7Cit2b2lkIFNldERvdWJsZUNsaWNrVGltZShXT1JEKTsKK3ZvaWQgU2V0SW50ZXJuYWxXaW5kb3dQb3MoSFdORCxXT1JELExQUkVDVCxMUFBPSU5UKTsKK3ZvaWQgU2V0S2V5Ym9hcmRTdGF0ZShCWVRFKik7Cit2b2lkIFNldFJlY3QoTFBSRUNULHNob3J0LHNob3J0LHNob3J0LHNob3J0KTsKK3ZvaWQgU2V0UmVjdEVtcHR5KExQUkVDVCk7Cit2b2lkIFNldFJlY3RSZ24oSFJHTixzaG9ydCxzaG9ydCxzaG9ydCxzaG9ydCk7Cit2b2lkIFNldFNjcm9sbFJhbmdlKEhXTkQsaW50LGludCxpbnQsQk9PTCk7Cit2b2lkIFNldFN5c0NvbG9ycyhpbnQsTFBJTlQsQ09MT1JSRUYqKTsKK3ZvaWQgU2V0V2luZG93VGV4dChIV05ELExQU1RSKTsKK3ZvaWQgU2hvd0NhcmV0KEhXTkQpOwordm9pZCBTaG93T3duZWRQb3B1cHMoSFdORCxCT09MKTsKK3ZvaWQgU2hvd1Njcm9sbEJhcihIV05ELFdPUkQsQk9PTCk7Cit2b2lkIFN3YXBSZWNvcmRpbmcoV09SRCk7Cit2b2lkIFN3aXRjaFN0YWNrQmFjayh2b2lkKTsKK3ZvaWQgU3dpdGNoU3RhY2tUbyhXT1JELFdPUkQsV09SRCk7Cit2b2lkIFVubG9ja1NlZ21lbnQoSEdMT0JBTCk7Cit2b2lkIFVwZGF0ZVdpbmRvdyhIV05EKTsKK3ZvaWQgVmFsaWRhdGVDb2RlU2VnbWVudHModm9pZCk7Cit2b2lkIFZhbGlkYXRlUmVjdChIV05ELExQUkVDVCk7Cit2b2lkIFZhbGlkYXRlUmduKEhXTkQsSFJHTik7Cit2b2lkIFdhaXRNZXNzYWdlKHZvaWQpOwordm9pZCBZaWVsZCh2b2lkKTsKIAogI2lmZGVmIFdJTkVMSUIKICNkZWZpbmUgV0lORUxJQl9VTklNUCh4KSBmcHJpbnRmIChzdGRlcnIsICJXaW5lTGliOiBVbmltcGxlbWVudGVkICVzXG4iLCB4KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5lLmggYi9pbmNsdWRlL3dpbmUuaAppbmRleCA1ZGVlOThhLi5mNjc0OGUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbmUuaAorKysgYi9pbmNsdWRlL3dpbmUuaApAQCAtNyw3ICs3LDE5IEBACiAjZGVmaW5lIFdJTkVfSU5JIFdpbmVJbmlGaWxlTmFtZSgpCiAjZGVmaW5lIFdJTl9JTkkgV2luSW5pRmlsZU5hbWUoKQogCi0jaWZkZWYgbGludXgKKyNpZmRlZiBpMzg2CitleHRlcm4gaW50IHJ1bnRpbWVfY3B1ICh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBydW50aW1lX2NwdSh2b2lkKSB7IHJldHVybiAzOyB9CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCAoIGxpbnV4KSB8fCBkZWZpbmVkKF9fc3ZyNF9fKQorLyoKKyAqIFNWUjQgTk9URToKKyAqIFRoaXMgaXMgbm90IGNvcnJlY3QgYnV0IGdldHMgaXQgdGhyb3VnaCB0aGUgY29tcGlsZXIKKyAqIE11c3QgY29tZSBiYWNrIGFuZCBsb29rIGF0IHRoaXMgYWdhaW4KKyAqLwogc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0IHsKIAl1bnNpZ25lZCBzaG9ydCBzY19ncywgX19nc2g7CiAJdW5zaWduZWQgc2hvcnQgc2NfZnMsIF9fZnNoOwpAQCAtMzIsOCArNDQsMTQgQEAKIAl1bnNpZ25lZCBsb25nIG9sZG1hc2s7CiAJdW5zaWduZWQgbG9uZyBjcjI7CiB9OworI2lmZGVmIGxpbnV4CiAjZGVmaW5lIFdJTkVfREFUQV9TRUxFQ1RPUiAweDJiCiAjZGVmaW5lIFdJTkVfQ09ERV9TRUxFQ1RPUiAweDIzCisjZW5kaWYKKyNpZmRlZiBfX3N2cjRfXworI2RlZmluZSBXSU5FX0RBVEFfU0VMRUNUT1IgMHgxZgorI2RlZmluZSBXSU5FX0NPREVfU0VMRUNUT1IgMHgxNworI2VuZGlmCiAjZW5kaWYgIC8qIGxpbnV4ICovCiAKICNpZmRlZiBfX05ldEJTRF9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbnNvY2suaCBiL2luY2x1ZGUvd2luc29jay5oCmluZGV4IDYzZTkyYmIuLjQ2NDcxYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luc29jay5oCisrKyBiL2luY2x1ZGUvd2luc29jay5oCkBAIC02NCw2ICs2NCw3IEBACiAKICNpZm5kZWYgX1NZU19TT0NLRVRfSF8KICNpZm5kZWYgX3N5c19zb2NrZXRfaAorI2lmbmRlZiBfTkVUX1RSQU5TUE9SVF9TT0NLRVRfSAogLyoKICAqIFN0cnVjdHVyZSB1c2VkIGJ5IGtlcm5lbCB0byBwYXNzIHByb3RvY29sCiAgKiBpbmZvcm1hdGlvbiBpbiByYXcgc29ja2V0cy4KQEAgLTc0LDEwICs3NSwxNCBAQAogfTsKICNlbmRpZgogI2VuZGlmCisjZW5kaWYKIAogLyoKICAqIE1heGltdW0gcXVldWUgbGVuZ3RoIHNwZWNpZmlhYmxlIGJ5IGxpc3Rlbi4KICAqLworI2lmZGVmIFNPTUFYQ09OTgorI3VuZGVmIFNPTUFYQ09OTgorI2VuZGlmCiAjZGVmaW5lIFNPTUFYQ09OTiAgICAgICA1CiAKICNpZm5kZWYgTVNHX0RPTlRST1VURQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW50eXBlcy5oIGIvaW5jbHVkZS93aW50eXBlcy5oCmluZGV4IDc0ZTNmZWIuLjM0OGFmMzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2ludHlwZXMuaAorKysgYi9pbmNsdWRlL3dpbnR5cGVzLmgKQEAgLTEsMTcgKzEsNDAgQEAKICNpZm5kZWYgX19XSU5FX1dJTlRZUEVTX0gKICNkZWZpbmUgX19XSU5FX1dJTlRZUEVTX0gKIAorI2lmZGVmIFdJTkVMSUIKKyMgaWZkZWYgV0lORUxJQjE2CisjICB1bmRlZiBXSU5FTElCMzIKKyMgZWxzZQorIyAgaWZuZGVmIFdJTkVMSUIzMgorIyAgIGRlZmluZSBXSU5FTElCMzIKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKwogdHlwZWRlZiBzaG9ydAlJTlQ7CiB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVJTlQ7CisjZGVmaW5lIFVJRk1UICIlaHUiCiB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFdPUkQ7CiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgRFdPUkQ7CiB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IEJPT0w7CiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgQllURTsKIHR5cGVkZWYgbG9uZyBMT05HOworI2lmZGVmIFdJTkVMSUIzMgordHlwZWRlZiBMT05HIFdQQVJBTTsKKyNlbHNlCiB0eXBlZGVmIFVJTlQgV1BBUkFNOworI2VuZGlmCiB0eXBlZGVmIExPTkcgTFBBUkFNOwogdHlwZWRlZiBMT05HIExSRVNVTFQ7CisjaWZkZWYgV0lORUxJQjMyCit0eXBlZGVmIHZvaWQqIEhBTkRMRTsKK3R5cGVkZWYgdm9pZCogTlBWT0lEOworI2RlZmluZSBOUEZNVCAiJXAiCisjZWxzZQogdHlwZWRlZiBXT1JEIEhBTkRMRTsKK3R5cGVkZWYgV09SRCBOUFZPSUQ7CisjZGVmaW5lIE5QRk1UICIlMDRYIgorI2VuZGlmCiB0eXBlZGVmIERXT1JEIEhIT09LOwogdHlwZWRlZiBEV09SRCBTRUdQVFI7CiB0eXBlZGVmIGNoYXIgKkxQU1RSOwpAQCAtMjMsMTcgKzQ2LDggQEAKIHR5cGVkZWYgRFdPUkQgKkxQRFdPUkQ7CiB0eXBlZGVmIExPTkcgKkxQTE9ORzsKIHR5cGVkZWYgdm9pZCAqTFBWT0lEOwotI2lmZGVmIFdJTkVMSUIKLXR5cGVkZWYgbG9uZyAoKkZBUlBST0MpKCk7Ci10eXBlZGVmIExPTkcgKCpXTkRQUk9DKShXT1JELFdPUkQsV09SRCxMT05HKTsKLSNlbHNlCi10eXBlZGVmIFNFR1BUUiBGQVJQUk9DOwotdHlwZWRlZiBTRUdQVFIgV05EUFJPQzsKLSNlbmRpZgotdHlwZWRlZiBGQVJQUk9DIERMR1BST0M7CiB0eXBlZGVmIFdPUkQgQ0FUQ0hCVUZbOV07CiB0eXBlZGVmIFdPUkQgKkxQQ0FUQ0hCVUY7Ci10eXBlZGVmIEZBUlBST0MgSE9PS1BST0M7CiAKICNkZWZpbmUgREVDTEFSRV9IQU5ETEUoYSkgdHlwZWRlZiBIQU5ETEUgYTsKIApAQCAtNjEsNiArNzUsMTYgQEAKIERFQ0xBUkVfSEFORExFKEhXTkQpOwogREVDTEFSRV9IQU5ETEUoTE9DQUxIQU5ETEUpOwogCisjaWZkZWYgV0lORUxJQgordHlwZWRlZiBsb25nICgqRkFSUFJPQykoKTsKK3R5cGVkZWYgTFJFU1VMVCAoKldORFBST0MpKEhXTkQsVUlOVCxXUEFSQU0sTFBBUkFNKTsKKyNlbHNlCit0eXBlZGVmIFNFR1BUUiBGQVJQUk9DOwordHlwZWRlZiBTRUdQVFIgV05EUFJPQzsKKyNlbmRpZgordHlwZWRlZiBGQVJQUk9DIERMR1BST0M7Cit0eXBlZGVmIEZBUlBST0MgSE9PS1BST0M7CisKICNkZWZpbmUgVFJVRSAxCiAjZGVmaW5lIEZBTFNFIDAKICNkZWZpbmUgQ1dfVVNFREVGQVVMVCAoKElOVCkweDgwMDApCmRpZmYgLS1naXQgYS9pcGMvSW1ha2VmaWxlIGIvaXBjL0ltYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTllODJhMS4uMDAwMDAwMAotLS0gYS9pcGMvSW1ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotI2luY2x1ZGUgIi4uL1dpbmUudG1wbCIKLQotTU9EVUxFID0gaXBjCi0KLVNSQ1MgPSAgICBiaXRfYXJyYXkuYyBcCi0gICAgICAgICAgZGRlX3Byb2MuYyAgXAotICAgICAgICAgIHNobV9tYWluX2Jsay5jIFwKLQkgIGRkZV9hdG9tLmMgIFwKLSAgICAgICAgICBzaG1fc2VtYXBoLmMgXAotCSAgZGRlX21lbS5jIFwKLSAgICAgICAgICBzaG1fYmxvY2suYyBcCi0gICAgICAgICAgc2htX2ZyYWdtZW50LmMKLQotT0JKUyA9ICQoU1JDUzouYz0ubykKLQotU0hNX09CSj1zaG1fYmxvY2subyBzaG1fc2VtYXBoLm8gc2htX21haW5fYmxrLm8gZGRlX3Byb2MubyBcCi0gICAgICAgICAgICAgICAJICAgZGRlX21lbS5vIGJpdF9hcnJheS5vIHNobV9mcmFnbWVudC5vIHdpbmVfdGVzdF9zdHViLm8KLQotCi1XaW5lUmVsb2NhdGFibGVUYXJnZXQoJChNT0RVTEUpLCwkKE9CSlMpKQotCi1EZXBlbmRUYXJnZXQoKQotCi10ZXN0czo6IGRkZV9tZW1fdGVzdCBkZGVfcHJvY190ZXN0IGRkZV9hdG9tX3Rlc3Qgc2htX2ZyYWdtZW50X3Rlc3QgXAotICAgICAgICBzaG1fc2VtYXBoX3Rlc3QKLQotTm9ybWFsUHJvZ3JhbVRhcmdldChiaXRfYXJyYXlfdGVzdCwgYml0X2FycmF5Lm8gYml0X2FycmF5X3Rlc3QubywsLCkKLU5vcm1hbFByb2dyYW1UYXJnZXQoc2htX3NlbWFwaF90ZXN0LCBzaG1fc2VtYXBoX3Rlc3QubyBzaG1fc2VtYXBoLm8sLCwpCi1Ob3JtYWxQcm9ncmFtVGFyZ2V0KHNobV9mcmFnbWVudF90ZXN0LCBzaG1fZnJhZ21lbnRfdGVzdC5vIHNobV9mcmFnbWVudC5vLCwsKQotTm9ybWFsUHJvZ3JhbVRhcmdldChkZGVfYXRvbV90ZXN0LCBkZGVfYXRvbV90ZXN0Lm8gZGRlX2F0b20ubyAkKFNITV9PQkopLCwsKQotTm9ybWFsUHJvZ3JhbVRhcmdldChkZGVfbWVtX3Rlc3QsIGRkZV9tZW1fdGVzdC5vICQoU0hNX09CSiksLCwpCi1Ob3JtYWxQcm9ncmFtVGFyZ2V0KGRkZV9wcm9jX3Rlc3QsIGRkZV9wcm9jX3Rlc3QubyAkKFNITV9PQkopICwsLCkKLQotCi1pbmNsdWRlczo6Ci0KLWluc3RhbGw6OgpkaWZmIC0tZ2l0IGEvbG9hZGVyL0ltYWtlZmlsZSBiL2xvYWRlci9JbWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0OGQxMzcuLjAwMDAwMDAKLS0tIGEvbG9hZGVyL0ltYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNpbmNsdWRlICIuLi9XaW5lLnRtcGwiCi0KLU1PRFVMRSA9IGxvYWRlcgotCi1TUkNTID0gXAotCW1haW4uYyBcCi0JbW9kdWxlLmMgXAotCW5lX2ltYWdlLmMgXAotCW5lX3Jlc291cmNlLmMgXAotCXBlX2ltYWdlLmMgXAotCXBlX3Jlc291cmNlLmMgXAotCXNpZ25hbC5jIFwKLQlyZXNvdXJjZS5jIFwKLQl0YXNrLmMgCi0KLU9CSlMgPSAkKFNSQ1M6LmM9Lm8pCi0KLVdpbmVSZWxvY2F0YWJsZVRhcmdldCgkKE1PRFVMRSksLCQoT0JKUykpCi1EZXBlbmRUYXJnZXQoKQotCi1pbmNsdWRlczo6Ci0KLWluc3RhbGw6OgpkaWZmIC0tZ2l0IGEvbG9hZGVyL21haW4uYyBiL2xvYWRlci9tYWluLmMKaW5kZXggOWJiMDE4NS4uZGU3ZGYxZSAxMDA2NDQKLS0tIGEvbG9hZGVyL21haW4uYworKysgYi9sb2FkZXIvbWFpbi5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAiY29tbS5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJtZW51LmgiCisjaW5jbHVkZSAia2VybmVsMzIuaCIKICNpbmNsdWRlICJhdG9tLmgiCiAjaW5jbHVkZSAiZGlhbG9nLmgiCiAjaW5jbHVkZSAibWVzc2FnZS5oIgpAQCAtMjksMTIgKzMwLDE1IEBACiAjaW5jbHVkZSAibWlzY2VtdS5oIgogI2luY2x1ZGUgIm5lZXhlLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgInNweS5oIgogI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJkY2UuaCIKICNpbmNsdWRlICJwZV9pbWFnZS5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAordm9pZCBpbml0X3dpbmVfc2lnbmFscyh2b2lkKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBNYWluIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUKQEAgLTQ4LDExICs1MiwxMyBAQAogCiAgICAgU3B5SW5pdCgpOwogCisjaWZuZGVmIFdJTkVMSUIKICAgICAgIC8qIEluaXRpYWxpemUgcmVsYXkgY29kZSAqLwogICAgIGlmICghUkVMQVlfSW5pdCgpKSByZXR1cm4gMDsKIAogICAgICAgLyogSW5pdGlhbGl6ZSBXaW4zMiByZWxheSBjb2RlICovCiAgICAgaWYgKCFSRUxBWTMyX0luaXQoKSkgcmV0dXJuIDA7CisjZW5kaWYKIAogICAgICAgLyogQ3JlYXRlIGJ1aWx0LWluIG1vZHVsZXMgKi8KICAgICBpZiAoIU1PRFVMRV9Jbml0KCkpIHJldHVybiAwOwpAQCAtNjMsNiArNjksNyBAQAogICAgICAgLyogSW5pdGlhbGl6ZSB0YXNrcyAqLwogICAgIGlmICghVEFTS19Jbml0KCkpIHJldHVybiAwOwogCisjaWZuZGVmIFdJTkVMSUIKICAgICAgIC8qIEluaXRpYWxpemUgaW50ZXJydXB0IHZlY3RvcnMgKi8KICAgICBpZiAoIUlOVF9Jbml0KCkpIHJldHVybiAwOwogCkBAIC03MSw2ICs3OCw3IEBACiAKICAgICAgIC8qIEluaXRpYWxpemUgc2lnbmFsIGhhbmRsaW5nICovCiAgICAgaW5pdF93aW5lX3NpZ25hbHMoKTsKKyNlbmRpZgogCiAgICAgICAvKiBJbml0aWFsaXplIGNvbW11bmljYXRpb25zICovCiAgICAgQ09NTV9Jbml0KCk7CkBAIC0xMDIsNiArMTEwLDkgQEAKICAgICAgIC8qIEluaXRpYWxpemUgbWVudXMgKi8KICAgICBpZiAoIU1FTlVfSW5pdCgpKSByZXR1cm4gMDsKIAorICAgICAgLyogSW5pdGlhbGl6ZSBXaW4zMiBkYXRhIHN0cnVjdHVyZXMgKi8KKyAgICBpZiAoIUtFUk4zMl9Jbml0KCkpIHJldHVybiAwOworCiAgICAgICAvKiBDcmVhdGUgc3lzdGVtIG1lc3NhZ2UgcXVldWUgKi8KICAgICBxdWV1ZVNpemUgPSBHZXRQcm9maWxlSW50KCAid2luZG93cyIsICJUeXBlQWhlYWQiLCAxMjAgKTsKICAgICBpZiAoIU1TR19DcmVhdGVTeXNNc2dRdWV1ZSggcXVldWVTaXplICkpIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbG9hZGVyL21vZHVsZS5jIGIvbG9hZGVyL21vZHVsZS5jCmluZGV4IDkyOGI2NDcuLmU0OGVkMDMgMTAwNjQ0Ci0tLSBhL2xvYWRlci9tb2R1bGUuYworKysgYi9sb2FkZXIvbW9kdWxlLmMKQEAgLTMwLDYyICszMCw4OSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE1PRFVMRV9Mb2FkQnVpbHRpbgorICoKKyAqIExvYWQgYSBidWlsdC1pbiBtb2R1bGUuIElmIHRoZSAnZm9yY2UnIHBhcmFtZXRlciBpcyBGQUxTRSwgd2Ugb25seQorICogbG9hZCB0aGUgbW9kdWxlIGlmIGl0IGhhcyBub3QgYmVlbiBkaXNhYmxlZCB2aWEgdGhlIC1kbGwgb3B0aW9uLgorICovCitzdGF0aWMgSE1PRFVMRSBNT0RVTEVfTG9hZEJ1aWx0aW4oIExQQ1NUUiBuYW1lLCBCT09MIGZvcmNlICkKK3sKKyNpZm5kZWYgV0lORUxJQiAvKiBKQlA6IE5vdCByZWFsbHkgYWxsb3dlZCBpbiBsaWJ3aW5lLmEgKEZJWE1FOj8pICovCisgICAgSE1PRFVMRSBoTW9kdWxlOworICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKKyAgICBTRUdUQUJMRUVOVFJZICpwU2VnVGFibGU7CisgICAgc3RydWN0IGRsbF90YWJsZV9zICp0YWJsZTsKKyAgICBpbnQgaTsKKyAgICBjaGFyIGRsbG5hbWVbMTZdLCAqcDsKKworICAgIC8qIEZpeCB0aGUgbmFtZSBpbiBjYXNlIHdlIGhhdmUgYSBmdWxsIHBhdGggYW5kIGV4dGVuc2lvbiAqLworCisgICAgaWYgKChwID0gc3RycmNociggbmFtZSwgJ1xcJyApKSkgbmFtZSA9IHAgKyAxOworICAgIHN0cm5jcHkoIGRsbG5hbWUsIG5hbWUsIDE1ICk7CisgICAgZGxsbmFtZVsxNV0gPSAnXDAnOworICAgIGlmICgocCA9IHN0cnJjaHIoIGRsbG5hbWUsICcuJyApKSkgKnAgPSAnXDAnOworCisgICAgZm9yIChpID0gMCwgdGFibGUgPSBkbGxfYnVpbHRpbl90YWJsZTsgaSA8IE5fQlVJTFRJTlM7IGkrKywgdGFibGUrKykKKyAgICAgICAgaWYgKCFzdHJjYXNlY21wKCB0YWJsZS0+bmFtZSwgZGxsbmFtZSApKSBicmVhazsKKyAgICBpZiAoaSA+PSBOX0JVSUxUSU5TKSByZXR1cm4gMDsKKyAgICBpZiAoIXRhYmxlLT51c2VkICYmICFmb3JjZSkgcmV0dXJuIDA7CisKKyAgICBoTW9kdWxlID0gR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX01PVkVBQkxFLCB0YWJsZS0+bW9kdWxlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLT5tb2R1bGVfZW5kIC0gdGFibGUtPm1vZHVsZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBOVUxMICk7CisgICAgaWYgKCFoTW9kdWxlKSByZXR1cm4gMDsKKyAgICBGYXJTZXRPd25lciggaE1vZHVsZSwgaE1vZHVsZSApOworCisgICAgdGFibGUtPmhNb2R1bGUgPSBoTW9kdWxlOworCisgICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIkJ1aWx0LWluICVzOiBobW9kdWxlPSUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgIHRhYmxlLT5uYW1lLCBoTW9kdWxlICk7CisKKyAgICAvKiBBbGxvY2F0ZSB0aGUgY29kZSBzZWdtZW50ICovCisKKyAgICBwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2soIGhNb2R1bGUgKTsKKyAgICBwU2VnVGFibGUgPSBORV9TRUdfVEFCTEUoIHBNb2R1bGUgKTsKKworICAgIHBTZWdUYWJsZS0+c2VsZWN0b3IgPSBHTE9CQUxfQ3JlYXRlQmxvY2soIEdNRU1fRklYRUQsIHRhYmxlLT5jb2RlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWdUYWJsZS0+bWluc2l6ZSwgaE1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCBUUlVFLCBGQUxTRSwgTlVMTCApOworICAgIGlmICghcFNlZ1RhYmxlLT5zZWxlY3RvcikgcmV0dXJuIDA7CisgICAgcFNlZ1RhYmxlKys7CisKKyAgICAvKiBBbGxvY2F0ZSB0aGUgZGF0YSBzZWdtZW50ICovCisKKyAgICBwU2VnVGFibGUtPnNlbGVjdG9yID0gR0xPQkFMX0FsbG9jKCBHTUVNX0ZJWEVELCBwU2VnVGFibGUtPm1pbnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgRkFMU0UsIEZBTFNFLCBGQUxTRSApOworICAgIGlmICghcFNlZ1RhYmxlLT5zZWxlY3RvcikgcmV0dXJuIDA7CisgICAgbWVtY3B5KCBHbG9iYWxMb2NrKCBwU2VnVGFibGUtPnNlbGVjdG9yICksCisgICAgICAgICAgICB0YWJsZS0+ZGF0YV9zdGFydCwgcFNlZ1RhYmxlLT5taW5zaXplICk7CisKKyAgICBwTW9kdWxlLT5uZXh0ID0gaEZpcnN0TW9kdWxlOworICAgIGhGaXJzdE1vZHVsZSA9IGhNb2R1bGU7CisgICAgcmV0dXJuIGhNb2R1bGU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTU9EVUxFX0luaXQKICAqCiAgKiBDcmVhdGUgdGhlIGJ1aWx0LWluIG1vZHVsZXMuCiAgKi8KIEJPT0wgTU9EVUxFX0luaXQodm9pZCkKIHsKLSAgICBITU9EVUxFIGhNb2R1bGU7Ci0gICAgTkVfTU9EVUxFICpwTW9kdWxlOwotICAgIFNFR1RBQkxFRU5UUlkgKnBTZWdUYWJsZTsKLSAgICBzdHJ1Y3QgZGxsX3RhYmxlX3MgKnRhYmxlOwotICAgIGludCBpOworICAgIC8qIEZvciB0aGVzZSwgYnVpbHQtaW4gbW9kdWxlcyBhcmUgYWx3YXlzIHVzZWQgKi8KIAotICAgICAgLyogQ3JlYXRlIHRoZSBidWlsdC1pbiBtb2R1bGVzICovCisgICAgaWYgKCFNT0RVTEVfTG9hZEJ1aWx0aW4oICJLRVJORUwiLCBUUlVFICkgfHwKKyAgICAgICAgIU1PRFVMRV9Mb2FkQnVpbHRpbiggIkdESSIsIFRSVUUgKSB8fAorICAgICAgICAhTU9EVUxFX0xvYWRCdWlsdGluKCAiVVNFUiIsIFRSVUUgKSB8fAorICAgICAgICAhTU9EVUxFX0xvYWRCdWlsdGluKCAiV0lOUFJPQ1MiLCBUUlVFICkpIHJldHVybiBGQUxTRTsKIAotICAgIGZvciAoaSA9IDAsIHRhYmxlID0gZGxsX2J1aWx0aW5fdGFibGU7IGkgPCBOX0JVSUxUSU5TOyBpKyssIHRhYmxlKyspCi0gICAgewotICAgICAgICBpZiAoIXRhYmxlLT51c2VkKSBjb250aW51ZTsKLQotICAgICAgICBoTW9kdWxlID0gR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX01PVkVBQkxFLCB0YWJsZS0+bW9kdWxlX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS0+bW9kdWxlX2VuZCAtIHRhYmxlLT5tb2R1bGVfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIE5VTEwgKTsKLSAgICAgICAgaWYgKCFoTW9kdWxlKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIEZhclNldE93bmVyKCBoTW9kdWxlLCBoTW9kdWxlICk7Ci0KLSAgICAgICAgdGFibGUtPmhNb2R1bGUgPSBoTW9kdWxlOwotCi0gICAgICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJCdWlsdC1pbiAlczogaG1vZHVsZT0lMDR4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUtPm5hbWUsIGhNb2R1bGUgKTsKLQotICAgICAgICAgIC8qIEFsbG9jYXRlIHRoZSBjb2RlIHNlZ21lbnQgKi8KLQotICAgICAgICBwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2soIGhNb2R1bGUgKTsKLSAgICAgICAgcFNlZ1RhYmxlID0gTkVfU0VHX1RBQkxFKCBwTW9kdWxlICk7Ci0KLSAgICAgICAgcFNlZ1RhYmxlLT5zZWxlY3RvciA9IEdMT0JBTF9DcmVhdGVCbG9jayhHTUVNX0ZJWEVELCB0YWJsZS0+Y29kZV9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnVGFibGUtPm1pbnNpemUsIGhNb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgVFJVRSwgRkFMU0UsIE5VTEwgKTsKLSAgICAgICAgaWYgKCFwU2VnVGFibGUtPnNlbGVjdG9yKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIHBTZWdUYWJsZSsrOwotCi0gICAgICAgICAgLyogQWxsb2NhdGUgdGhlIGRhdGEgc2VnbWVudCAqLwotCi0gICAgICAgIHBTZWdUYWJsZS0+c2VsZWN0b3IgPSBHTE9CQUxfQWxsb2MoIEdNRU1fRklYRUQsIHBTZWdUYWJsZS0+bWluc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgRkFMU0UsIEZBTFNFLCBGQUxTRSApOwotICAgICAgICBpZiAoIXBTZWdUYWJsZS0+c2VsZWN0b3IpIHJldHVybiBGQUxTRTsKLSAgICAgICAgbWVtY3B5KCBHbG9iYWxMb2NrKCBwU2VnVGFibGUtPnNlbGVjdG9yICksIHRhYmxlLT5kYXRhX3N0YXJ0LAotICAgICAgICAgICAgICAgIHBTZWdUYWJsZS0+bWluc2l6ZSApOwotCi0gICAgICAgIHBNb2R1bGUtPm5leHQgPSBoRmlyc3RNb2R1bGU7Ci0gICAgICAgIGhGaXJzdE1vZHVsZSA9IGhNb2R1bGU7Ci0gICAgfQotCisjZWxzZQorICAgIGZwcmludGYoc3RkZXJyLCAiSkJQOiBNT0RVTEVfSW5pdCgpIGlnbm9yZWQuXG4iKTsKKyNlbmRpZgogICAgIC8qIEluaXRpYWxpemUgS0VSTkVMLjE3OCAoX19XSU5GTEFHUykgd2l0aCB0aGUgY29ycmVjdCBmbGFncyB2YWx1ZSAqLwogCiAgICAgTU9EVUxFX1NldEVudHJ5UG9pbnQoIEdldE1vZHVsZUhhbmRsZSggIktFUk5FTCIgKSwgMTc4LCBHZXRXaW5GbGFncygpICk7Ci0KICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMTAzLDcgKzEzMCw3IEBACiAKICAgICAgIC8qIER1bXAgdGhlIG1vZHVsZSBpbmZvICovCiAKLSAgICBwcmludGYoICJNb2R1bGUgJTA0eDpcbiIsIGhtb2R1bGUgKTsKKyAgICBwcmludGYoICJNb2R1bGUgIk5QRk1UIjpcbiIsIGhtb2R1bGUgKTsKICAgICBwcmludGYoICJjb3VudD0lZCBmbGFncz0lMDR4IGhlYXA9JWQgc3RhY2s9JWRcbiIsCiAgICAgICAgICAgICBwTW9kdWxlLT5jb3VudCwgcE1vZHVsZS0+ZmxhZ3MsCiAgICAgICAgICAgICBwTW9kdWxlLT5oZWFwX3NpemUsIHBNb2R1bGUtPnN0YWNrX3NpemUgKTsKQEAgLTEyNCw3ICsxNTEsNyBAQAogICAgIHByaW50ZiggIlxuU2VnbWVudCB0YWJsZTpcbiIgKTsKICAgICBwU2VnID0gTkVfU0VHX1RBQkxFKCBwTW9kdWxlICk7CiAgICAgZm9yIChpID0gMDsgaSA8IHBNb2R1bGUtPnNlZ19jb3VudDsgaSsrLCBwU2VnKyspCi0gICAgICAgIHByaW50ZiggIiUwMng6IHBvcz0lZCBzaXplPSVkIGZsYWdzPSUwNHggbWluc2l6ZT0lZCBzZWw9JTA0eFxuIiwKKyAgICAgICAgcHJpbnRmKCAiJTAyeDogcG9zPSVkIHNpemU9JWQgZmxhZ3M9JTA0eCBtaW5zaXplPSVkIHNlbD0iTlBGTVQiXG4iLAogICAgICAgICAgICAgICAgIGkgKyAxLCBwU2VnLT5maWxlcG9zLCBwU2VnLT5zaXplLCBwU2VnLT5mbGFncywKICAgICAgICAgICAgICAgICBwU2VnLT5taW5zaXplLCBwU2VnLT5zZWxlY3RvciApOwogCkBAIC0yMzMsNyArMjYwLDcgQEAKICAgICBzdGF0aWMgaW50IGNhY2hlZGZkID0gLTE7CiAKICAgICBoTW9kdWxlID0gR2V0RXhlUHRyKCBoTW9kdWxlICk7ICAvKiBJbiBjYXNlIHdlIHdlcmUgcGFzc2VkIGFuIGhJbnN0YW5jZSAqLwotICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJNT0RVTEVfT3BlbkZpbGUoJTA0eCkgY2FjaGU6IG1vZD0lMDR4IGZkPSVkXG4iLAorICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJNT0RVTEVfT3BlbkZpbGUoIk5QRk1UIikgY2FjaGU6IG1vZD0iTlBGTVQiIGZkPSVkXG4iLAogICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBoQ2FjaGVkTW9kdWxlLCBjYWNoZWRmZCApOwogICAgIGlmICghKHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jayggaE1vZHVsZSApKSkgcmV0dXJuIC0xOwogICAgIGlmIChoQ2FjaGVkTW9kdWxlID09IGhNb2R1bGUpIHJldHVybiBjYWNoZWRmZDsKQEAgLTI3OCw5ICszMDUsMTMgQEAKIERXT1JEIE1PRFVMRV9BbGxvY2F0ZVNlZ21lbnQoV09SRCB3RmxhZ3MsIFdPUkQgd1NpemUsIFdPUkQgd0VsZW0pCiB7CiAgICAgV09SRCBzaXplID0gd1NpemUgPDwgd0VsZW07Ci0gICAgV09SRCBoTWVtID0gR2xvYmFsQWxsb2MoIE1PRFVMRV9OZTJNZW1GbGFncyh3RmxhZ3MpLCBzaXplKTsKKyAgICBIQU5ETEUgaE1lbSA9IEdsb2JhbEFsbG9jKCBNT0RVTEVfTmUyTWVtRmxhZ3Mod0ZsYWdzKSwgc2l6ZSk7CisjaWZkZWYgV0lORUxJQjMyCisgICAgcmV0dXJuIChEV09SRClHbG9iYWxMb2NrKGhNZW0pOworI2Vsc2UKICAgICBXT1JEIHNlbGVjdG9yID0gSElXT1JEKEdsb2JhbExvY2soaE1lbSkpOwogICAgIHJldHVybiBNQUtFTE9ORyhoTWVtLCBzZWxlY3Rvcik7CisjZW5kaWYKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zODksMTQgKzQyMCwxNCBAQAogCiAgICAgbHNlZWsoIGZkLCAwLCBTRUVLX1NFVCApOwogICAgIGlmICgocmVhZCggZmQsICZtel9oZWFkZXIsIHNpemVvZihtel9oZWFkZXIpICkgIT0gc2l6ZW9mKG16X2hlYWRlcikpIHx8Ci0gICAgICAgIChtel9oZWFkZXIubXpfbWFnaWMgIT0gTVpfU0lHTkFUVVJFKSkgcmV0dXJuIDExOyAgLyogaW52YWxpZCBleGUgKi8KKyAgICAgICAgKG16X2hlYWRlci5tel9tYWdpYyAhPSBNWl9TSUdOQVRVUkUpKSByZXR1cm4gKEhNT0RVTEUpMTE7ICAvKiBpbnZhbGlkIGV4ZSAqLwogCiAgICAgbHNlZWsoIGZkLCBtel9oZWFkZXIubmVfb2Zmc2V0LCBTRUVLX1NFVCApOwogICAgIGlmIChyZWFkKCBmZCwgJm5lX2hlYWRlciwgc2l6ZW9mKG5lX2hlYWRlcikgKSAhPSBzaXplb2YobmVfaGVhZGVyKSkKLSAgICAgICAgcmV0dXJuIDExOyAgLyogaW52YWxpZCBleGUgKi8KKyAgICAgICAgcmV0dXJuIChITU9EVUxFKTExOyAgLyogaW52YWxpZCBleGUgKi8KIAotICAgIGlmIChuZV9oZWFkZXIubmVfbWFnaWMgPT0gUEVfU0lHTkFUVVJFKSByZXR1cm4gMjE7ICAvKiB3aW4zMiBleGUgKi8KLSAgICBpZiAobmVfaGVhZGVyLm5lX21hZ2ljICE9IE5FX1NJR05BVFVSRSkgcmV0dXJuIDExOyAgLyogaW52YWxpZCBleGUgKi8KKyAgICBpZiAobmVfaGVhZGVyLm5lX21hZ2ljID09IFBFX1NJR05BVFVSRSkgcmV0dXJuIChITU9EVUxFKTIxOyAgLyogd2luMzIgZXhlICovCisgICAgaWYgKG5lX2hlYWRlci5uZV9tYWdpYyAhPSBORV9TSUdOQVRVUkUpIHJldHVybiAoSE1PRFVMRSkxMTsgIC8qIGludmFsaWQgZXhlICovCiAKICAgICAvKiBXZSBub3cgaGF2ZSBhIHZhbGlkIE5FIGhlYWRlciAqLwogCkBAIC00MTcsNyArNDQ4LDcgQEAKICAgICAgICAgICAgbmVfaGVhZGVyLmVudHJ5X3RhYl9sZW5ndGg7CiAKICAgICBoTW9kdWxlID0gR2xvYmFsQWxsb2MoIEdNRU1fTU9WRUFCTEUgfCBHTUVNX1pFUk9JTklULCBzaXplICk7Ci0gICAgaWYgKCFoTW9kdWxlKSByZXR1cm4gMTE7ICAvKiBpbnZhbGlkIGV4ZSAqLworICAgIGlmICghaE1vZHVsZSkgcmV0dXJuIChITU9EVUxFKTExOyAgLyogaW52YWxpZCBleGUgKi8KICAgICBGYXJTZXRPd25lciggaE1vZHVsZSwgaE1vZHVsZSApOwogICAgIHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jayggaE1vZHVsZSApOwogICAgIG1lbWNweSggcE1vZHVsZSwgJm5lX2hlYWRlciwgc2l6ZW9mKE5FX01PRFVMRSkgKTsKQEAgLTQ2NSw3ICs0OTYsNyBAQAogCiAgICAgICAgIGlmICghUkVBRCggbmVfaGVhZGVyLnNlZ21lbnRfdGFiX29mZnNldCwKICAgICAgICAgICAgICBuZV9oZWFkZXIubl9zZWdtZW50X3RhYiAqIHNpemVvZihzdHJ1Y3QgbmVfc2VnbWVudF90YWJsZV9lbnRyeV9zKSwKLSAgICAgICAgICAgICBidWZmZXIgKSkgcmV0dXJuIDExOyAgLyogaW52YWxpZCBleGUgKi8KKyAgICAgICAgICAgICBidWZmZXIgKSkgcmV0dXJuIChITU9EVUxFKTExOyAgLyogaW52YWxpZCBleGUgKi8KICAgICAgICAgcFNlZyA9IChzdHJ1Y3QgbmVfc2VnbWVudF90YWJsZV9lbnRyeV9zICopYnVmZmVyOwogICAgICAgICBmb3IgKGkgPSBuZV9oZWFkZXIubl9zZWdtZW50X3RhYjsgaSA+IDA7IGktLSwgcFNlZysrKQogICAgICAgICB7CkBAIC00NzQsNyArNTA1LDcgQEAKICAgICAgICAgfQogICAgICAgICBmcmVlKCBidWZmZXIgKTsKICAgICB9Ci0gICAgZWxzZSByZXR1cm4gMTE7ICAvKiBpbnZhbGlkIGV4ZSAqLworICAgIGVsc2UgcmV0dXJuIChITU9EVUxFKTExOyAgLyogaW52YWxpZCBleGUgKi8KIAogICAgIC8qIEdldCB0aGUgcmVzb3VyY2UgdGFibGUgKi8KIApAQCAtNDgzLDcgKzUxNCw3IEBACiAgICAgICAgIHBNb2R1bGUtPnJlc190YWJsZSA9IChpbnQpcERhdGEgLSAoaW50KXBNb2R1bGU7CiAgICAgICAgIGlmICghUkVBRChuZV9oZWFkZXIucmVzb3VyY2VfdGFiX29mZnNldCwKICAgICAgICAgICAgICAgICAgIG5lX2hlYWRlci5ybmFtZV90YWJfb2Zmc2V0IC0gbmVfaGVhZGVyLnJlc291cmNlX3RhYl9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICBwRGF0YSApKSByZXR1cm4gMTE7ICAvKiBpbnZhbGlkIGV4ZSAqLworICAgICAgICAgICAgICAgICAgcERhdGEgKSkgcmV0dXJuIChITU9EVUxFKTExOyAgLyogaW52YWxpZCBleGUgKi8KICAgICAgICAgcERhdGEgKz0gbmVfaGVhZGVyLnJuYW1lX3RhYl9vZmZzZXQgLSBuZV9oZWFkZXIucmVzb3VyY2VfdGFiX29mZnNldDsKICAgICB9CiAgICAgZWxzZSBwTW9kdWxlLT5yZXNfdGFibGUgPSAwOyAgLyogTm8gcmVzb3VyY2UgdGFibGUgKi8KQEAgLTQ5Myw3ICs1MjQsNyBAQAogICAgIHBNb2R1bGUtPm5hbWVfdGFibGUgPSAoaW50KXBEYXRhIC0gKGludClwTW9kdWxlOwogICAgIGlmICghUkVBRCggbmVfaGVhZGVyLnJuYW1lX3RhYl9vZmZzZXQsCiAgICAgICAgICAgICAgICBuZV9oZWFkZXIubW9kdWxlcmVmX3RhYl9vZmZzZXQgLSBuZV9oZWFkZXIucm5hbWVfdGFiX29mZnNldCwKLSAgICAgICAgICAgICAgIHBEYXRhICkpIHJldHVybiAxMTsgIC8qIGludmFsaWQgZXhlICovCisgICAgICAgICAgICAgICBwRGF0YSApKSByZXR1cm4gKEhNT0RVTEUpMTE7ICAvKiBpbnZhbGlkIGV4ZSAqLwogICAgIHBEYXRhICs9IG5lX2hlYWRlci5tb2R1bGVyZWZfdGFiX29mZnNldCAtIG5lX2hlYWRlci5ybmFtZV90YWJfb2Zmc2V0OwogCiAgICAgLyogR2V0IHRoZSBtb2R1bGUgcmVmZXJlbmNlcyB0YWJsZSAqLwpAQCAtNTAzLDcgKzUzNCw3IEBACiAgICAgICAgIHBNb2R1bGUtPm1vZHJlZl90YWJsZSA9IChpbnQpcERhdGEgLSAoaW50KXBNb2R1bGU7CiAgICAgICAgIGlmICghUkVBRCggbmVfaGVhZGVyLm1vZHVsZXJlZl90YWJfb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgbmVfaGVhZGVyLm5fbW9kX3JlZl90YWIgKiBzaXplb2YoV09SRCksCi0gICAgICAgICAgICAgICAgICBwRGF0YSApKSByZXR1cm4gMTE7ICAvKiBpbnZhbGlkIGV4ZSAqLworICAgICAgICAgICAgICAgICAgcERhdGEgKSkgcmV0dXJuIChITU9EVUxFKTExOyAgLyogaW52YWxpZCBleGUgKi8KICAgICAgICAgcERhdGEgKz0gbmVfaGVhZGVyLm5fbW9kX3JlZl90YWIgKiBzaXplb2YoV09SRCk7CiAgICAgfQogICAgIGVsc2UgcE1vZHVsZS0+bW9kcmVmX3RhYmxlID0gMDsgIC8qIE5vIG1vZHVsZSByZWZlcmVuY2VzICovCkBAIC01MTMsNyArNTQ0LDcgQEAKICAgICBwTW9kdWxlLT5pbXBvcnRfdGFibGUgPSAoaW50KXBEYXRhIC0gKGludClwTW9kdWxlOwogICAgIGlmICghUkVBRCggbmVfaGVhZGVyLmluYW1lX3RhYl9vZmZzZXQsIAogICAgICAgICAgICAgICAgbmVfaGVhZGVyLmVudHJ5X3RhYl9vZmZzZXQgLSBuZV9oZWFkZXIuaW5hbWVfdGFiX29mZnNldCwKLSAgICAgICAgICAgICAgIHBEYXRhICkpIHJldHVybiAxMTsgIC8qIGludmFsaWQgZXhlICovCisgICAgICAgICAgICAgICBwRGF0YSApKSByZXR1cm4gKEhNT0RVTEUpMTE7ICAvKiBpbnZhbGlkIGV4ZSAqLwogICAgIHBEYXRhICs9IG5lX2hlYWRlci5lbnRyeV90YWJfb2Zmc2V0IC0gbmVfaGVhZGVyLmluYW1lX3RhYl9vZmZzZXQ7CiAKICAgICAvKiBHZXQgdGhlIGVudHJ5IHRhYmxlICovCkBAIC01MjEsNyArNTUyLDcgQEAKICAgICBwTW9kdWxlLT5lbnRyeV90YWJsZSA9IChpbnQpcERhdGEgLSAoaW50KXBNb2R1bGU7CiAgICAgaWYgKCFSRUFEKCBuZV9oZWFkZXIuZW50cnlfdGFiX29mZnNldCwKICAgICAgICAgICAgICAgIG5lX2hlYWRlci5lbnRyeV90YWJfbGVuZ3RoLAotICAgICAgICAgICAgICAgcERhdGEgKSkgcmV0dXJuIDExOyAgLyogaW52YWxpZCBleGUgKi8KKyAgICAgICAgICAgICAgIHBEYXRhICkpIHJldHVybiAoSE1PRFVMRSkxMTsgIC8qIGludmFsaWQgZXhlICovCiAgICAgcERhdGEgKz0gbmVfaGVhZGVyLmVudHJ5X3RhYl9sZW5ndGg7CiAKICAgICAvKiBHZXQgdGhlIG5vbi1yZXNpZGVudCBuYW1lcyB0YWJsZSAqLwpAQCAtNTMwLDExICs1NjEsMTEgQEAKICAgICB7CiAgICAgICAgIHBNb2R1bGUtPm5ybmFtZV9oYW5kbGUgPSBHTE9CQUxfQWxsb2MoIDAsIG5lX2hlYWRlci5ucm5hbWVfdGFiX2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgRkFMU0UsIEZBTFNFLCBGQUxTRSApOwotICAgICAgICBpZiAoIXBNb2R1bGUtPm5ybmFtZV9oYW5kbGUpIHJldHVybiAxMTsgIC8qIGludmFsaWQgZXhlICovCisgICAgICAgIGlmICghcE1vZHVsZS0+bnJuYW1lX2hhbmRsZSkgcmV0dXJuIChITU9EVUxFKTExOyAgLyogaW52YWxpZCBleGUgKi8KICAgICAgICAgYnVmZmVyID0gR2xvYmFsTG9jayggcE1vZHVsZS0+bnJuYW1lX2hhbmRsZSApOwogICAgICAgICBsc2VlayggZmQsIG5lX2hlYWRlci5ucm5hbWVfdGFiX29mZnNldCwgU0VFS19TRVQgKTsKICAgICAgICAgaWYgKHJlYWQoIGZkLCBidWZmZXIsIG5lX2hlYWRlci5ucm5hbWVfdGFiX2xlbmd0aCApCi0gICAgICAgICAgICAgICE9IG5lX2hlYWRlci5ucm5hbWVfdGFiX2xlbmd0aCkgcmV0dXJuIDExOyAgLyogaW52YWxpZCBleGUgKi8KKyAgICAgICAgICAgICAgIT0gbmVfaGVhZGVyLm5ybmFtZV90YWJfbGVuZ3RoKSByZXR1cm4gKEhNT0RVTEUpMTE7ICAvKiBpbnZhbGlkIGV4ZSAqLwogICAgIH0KICAgICBlbHNlIHBNb2R1bGUtPm5ybmFtZV9oYW5kbGUgPSAwOwogCkBAIC01NDUsNyArNTc2LDcgQEAKICAgICAgICAgcE1vZHVsZS0+ZGxsc190b19pbml0ID0gR0xPQkFMX0FsbG9jKEdNRU1fWkVST0lOSVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE1vZHVsZS0+bW9kcmVmX2NvdW50KzEpKnNpemVvZihITU9EVUxFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UgKTsKLSAgICAgICAgaWYgKCFwTW9kdWxlLT5kbGxzX3RvX2luaXQpIHJldHVybiAxMTsgIC8qIGludmFsaWQgZXhlICovCisgICAgICAgIGlmICghcE1vZHVsZS0+ZGxsc190b19pbml0KSByZXR1cm4gKEhNT0RVTEUpMTE7ICAvKiBpbnZhbGlkIGV4ZSAqLwogICAgIH0KICAgICBlbHNlIHBNb2R1bGUtPmRsbHNfdG9faW5pdCA9IDA7CiAKQEAgLTU2OSw3ICs2MDAsNyBAQAogCiAgICAgaWYgKCEocE1vZHVsZSA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKIAotICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJNT0RVTEVfR2V0T3JkaW5hbCglMDR4LCclcycpXG4iLAorICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJNT0RVTEVfR2V0T3JkaW5hbCgiTlBGTVQiLCclcycpXG4iLAogICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBuYW1lICk7CiAKICAgICAgIC8qIEZpcnN0IGhhbmRsZSBuYW1lcyBvZiB0aGUgZm9ybSAnI3h4eHgnICovCkBAIC04MTcsMTAgKzg0OCwxMiBAQAogICAgIEhNT0RVTEUgKmhQcmV2TW9kdWxlOwogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKICAgICBTRUdUQUJMRUVOVFJZICpwU2VnbWVudDsKLSAgICBXT1JEICpwTW9kUmVmOworICAgIEhNT0RVTEUgKnBNb2RSZWY7CiAgICAgaW50IGk7CiAKICAgICBpZiAoIShwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2soIGhNb2R1bGUgKSkpIHJldHVybjsKKyAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfQlVJTFRJTikKKyAgICAgICAgcmV0dXJuOyAgLyogQ2FuJ3QgZnJlZSBidWlsdC1pbiBtb2R1bGUgKi8KIAogICAgIC8qIEZJWE1FOiBzaG91bGQgY2FsbCB0aGUgZXhpdCBjb2RlIGZvciB0aGUgbGlicmFyeSBoZXJlICovCiAKQEAgLTg2MSw2ICs4OTQsOCBAQAogfQogCiAKK0hJTlNUQU5DRSBQRV9Mb2FkTW9kdWxlKGludCBmZCwgT0ZTVFJVQ1QgKm9mcywgTE9BRFBBUkFNUyogcGFyYW1zKTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICBMb2FkTW9kdWxlICAgIChLRVJORUwuNDUpCiAgKi8KQEAgLTg3MCwxNiArOTA1LDMwIEBACiAgICAgSEFORExFIGhJbnN0YW5jZSwgaFByZXZJbnN0YW5jZTsKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAgICAgTE9BRFBBUkFNUyAqcGFyYW1zID0gKExPQURQQVJBTVMgKilwYXJhbUJsb2NrOworI2lmbmRlZiBXSU5FTElCIC8qIEpCUDogRGlzYWJsZWQgZm9yIG5vdyBpbiB3aW5lbGliLmEgKi8KICAgICBXT1JEICpwTW9kUmVmLCAqcERMTHM7CiAgICAgaW50IGksIGZkOwogCiAgICAgaE1vZHVsZSA9IE1PRFVMRV9GaW5kTW9kdWxlKCBuYW1lICk7CisKICAgICBpZiAoIWhNb2R1bGUpICAvKiBXZSBoYXZlIHRvIGxvYWQgdGhlIG1vZHVsZSAqLwogICAgIHsKICAgICAgICAgT0ZTVFJVQ1Qgb2ZzOworCisgICAgICAgIC8qIFRyeSB0byBsb2FkIHRoZSBidWlsdC1pbiBmaXJzdCBpZiBub3QgZGlzYWJsZWQgKi8KKyAgICAgICAgaWYgKChoTW9kdWxlID0gTU9EVUxFX0xvYWRCdWlsdGluKCBuYW1lLCBGQUxTRSApKSkgcmV0dXJuIGhNb2R1bGU7CisKICAgICAgICAgaWYgKHN0cmNociggbmFtZSwgJy8nICkpIG5hbWUgPSBET1NfR2V0RG9zRmlsZU5hbWUoIG5hbWUgKTsKICAgICAgICAgaWYgKChmZCA9IE9wZW5GaWxlKCBuYW1lLCAmb2ZzLCBPRl9SRUFEICkpID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBOb3cgdHJ5IHRoZSBidWlsdC1pbiBldmVuIGlmIGRpc2FibGVkICovCisgICAgICAgICAgICBpZiAoKGhNb2R1bGUgPSBNT0RVTEVfTG9hZEJ1aWx0aW4oIG5hbWUsIFRSVUUgKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiV2FybmluZzogY291bGQgbm90IGxvYWQgV2luZG93cyBETEwgJyVzJywgdXNpbmcgYnVpbHQtaW4gbW9kdWxlLlxuIiwgbmFtZSApOworICAgICAgICAgICAgICAgIHJldHVybiBoTW9kdWxlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIDI7ICAvKiBGaWxlIG5vdCBmb3VuZCAqLworICAgICAgICB9CiAKICAgICAgICAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBzdHJ1Y3R1cmUgKi8KIApAQCAtOTk2LDYgKzEwNDUsMTAgQEAKICAgICAgICAgICAvKiB0aGUgbW9kdWxlLCBldmVuIGlmIGl0IGNvbnRhaW5zIGNpcmN1bGFyIERMTCByZWZlcmVuY2VzICovCiAKICAgICAgICAgcE1vZHVsZS0+Y291bnQgPSAxOworCisgICAgICAgICAgLyogQ2xlYXIgYnVpbHQtaW4gZmxhZyBpbiBjYXNlIGl0IHdhcyBzZXQgaW4gdGhlIEVYRSBmaWxlICovCisKKyAgICAgICAgcE1vZHVsZS0+ZmxhZ3MgJj0gfk5FX0ZGTEFHU19CVUlMVElOOwogICAgIH0KICAgICBlbHNlCiAgICAgewpAQCAtMTAwNiw2ICsxMDU5LDE0IEBACiAgICAgICAgICAgICBORV9Mb2FkU2VnbWVudCggaE1vZHVsZSwgcE1vZHVsZS0+ZGdyb3VwICk7CiAgICAgICAgIHBNb2R1bGUtPmNvdW50Kys7CiAgICAgfQorI2Vsc2UKKyAgICBoTW9kdWxlID0gR2xvYmFsQWxsb2MoIEdNRU1fTU9WRUFCTEUgfCBHTUVNX1pFUk9JTklULCBzaXplb2YoTkVfTU9EVUxFKSApOworICAgIHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jayggaE1vZHVsZSApOworICAgIHBNb2R1bGUtPmNvdW50ID0gMTsKKyAgICBwTW9kdWxlLT5tYWdpYyA9IDB4NDU0ZTsKKyAgICBoUHJldkluc3RhbmNlID0gMDsKKyAgICBoSW5zdGFuY2UgPSBNT0RVTEVfQ3JlYXRlSW5zdGFuY2UoIGhNb2R1bGUsIChMT0FEUEFSQU1TKilwYXJhbUJsb2NrICk7CisjZW5kaWYgLyogV0lORUxJQiAqLwogCiAgICAgICAvKiBDcmVhdGUgYSB0YXNrIGZvciB0aGlzIGluc3RhbmNlICovCiAKQEAgLTEwNDMsNyArMTEwNCwxMSBAQAogICovCiBITU9EVUxFIFdJTjE2X0dldE1vZHVsZUhhbmRsZSggU0VHUFRSIG5hbWUgKQogeworI2lmZGVmIFdJTkVMSUIzMgorICAgIGlmIChISVdPUkQobmFtZSkgPT0gMCkgcmV0dXJuIEdldEV4ZVB0ciggbmFtZSApOworI2Vsc2UKICAgICBpZiAoSElXT1JEKG5hbWUpID09IDApIHJldHVybiBHZXRFeGVQdHIoIExPV09SRChuYW1lKSApOworI2VuZGlmCiAgICAgcmV0dXJuIE1PRFVMRV9GaW5kTW9kdWxlKCBQVFJfU0VHX1RPX0xJTihuYW1lKSApOwogfQogCkBAIC0xMDYyLDcgKzExMjcsNyBAQAogCiAgICAgaE1vZHVsZSA9IEdldEV4ZVB0ciggaE1vZHVsZSApOyAgLyogSW4gY2FzZSB3ZSB3ZXJlIHBhc3NlZCBhbiBoSW5zdGFuY2UgKi8KICAgICBpZiAoIShwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2soIGhNb2R1bGUgKSkpIHJldHVybiAwOwotICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJHZXRNb2R1bGVVc2FnZSglMDR4KTogcmV0dXJuaW5nICVkXG4iLAorICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJHZXRNb2R1bGVVc2FnZSgiTlBGTVQiKTogcmV0dXJuaW5nICVkXG4iLAogICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBwTW9kdWxlLT5jb3VudCApOwogICAgIHJldHVybiBwTW9kdWxlLT5jb3VudDsKIH0KQEAgLTEwOTksMTQgKzExNjQsMTQgQEAKICAgICBpZiAoKGhhbmRsZSA9IE1PRFVMRV9GaW5kTW9kdWxlKCBsaWJuYW1lICkpICE9IDApIHJldHVybiBoYW5kbGU7CiAgICAgICovCiAgICAgaGFuZGxlID0gTG9hZE1vZHVsZSggbGlibmFtZSwgKExQVk9JRCktMSApOwotICAgIGlmIChoYW5kbGUgPT0gMikgIC8qIGZpbGUgbm90IGZvdW5kICovCisgICAgaWYgKGhhbmRsZSA9PSAoSEFORExFKTIpICAvKiBmaWxlIG5vdCBmb3VuZCAqLwogICAgIHsKICAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKICAgICAgICAgc3RyY3B5KCBidWZmZXIsIGxpYm5hbWUgKTsKICAgICAgICAgc3RyY2F0KCBidWZmZXIsICIuZGxsIiApOwogICAgICAgICBoYW5kbGUgPSBMb2FkTW9kdWxlKCBidWZmZXIsIChMUFZPSUQpLTEgKTsKICAgICB9Ci0gICAgaWYgKGhhbmRsZSA+PSAzMikgTkVfSW5pdGlhbGl6ZURMTHMoIEdldEV4ZVB0cihoYW5kbGUpICk7CisgICAgaWYgKGhhbmRsZSA+PSAoSEFORExFKTMyKSBORV9Jbml0aWFsaXplRExMcyggR2V0RXhlUHRyKGhhbmRsZSkgKTsKICAgICByZXR1cm4gaGFuZGxlOwogfQogCkBAIC0xMTE2LDcgKzExODEsNyBAQAogICovCiB2b2lkIEZyZWVMaWJyYXJ5KCBIQU5ETEUgaGFuZGxlICkKIHsKLSAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCJGcmVlTGlicmFyeTogJTA0eFxuIiwgaGFuZGxlICk7CisgICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwiRnJlZUxpYnJhcnk6ICJOUEZNVCJcbiIsIGhhbmRsZSApOwogICAgIEZyZWVNb2R1bGUoIGhhbmRsZSApOwogfQogCkBAIC0xMTU3LDEyICsxMjIyLDEyIEBACiAKICAgICAgIC8qIE5vdyBsb2FkIHRoZSBleGVjdXRhYmxlIGZpbGUgKi8KIAotICAgIHBhcmFtcy5oRW52aXJvbm1lbnQgPSBTRUxFQ1RPUk9GKCBHZXRET1NFbnZpcm9ubWVudCgpICk7Ci0gICAgcGFyYW1zLmNtZExpbmUgID0gV0lOMTZfR2xvYmFsTG9jayggY21kTGluZUhhbmRsZSApOwotICAgIHBhcmFtcy5zaG93Q21kICA9IFdJTjE2X0dsb2JhbExvY2soIGNtZFNob3dIYW5kbGUgKTsKKyAgICBwYXJhbXMuaEVudmlyb25tZW50ID0gKEhBTkRMRSlTRUxFQ1RPUk9GKCBHZXRET1NFbnZpcm9ubWVudCgpICk7CisgICAgcGFyYW1zLmNtZExpbmUgID0gKFNFR1BUUilXSU4xNl9HbG9iYWxMb2NrKCBjbWRMaW5lSGFuZGxlICk7CisgICAgcGFyYW1zLnNob3dDbWQgID0gKFNFR1BUUilXSU4xNl9HbG9iYWxMb2NrKCBjbWRTaG93SGFuZGxlICk7CiAgICAgcGFyYW1zLnJlc2VydmVkID0gMDsKICAgICBoYW5kbGUgPSBMb2FkTW9kdWxlKCBmaWxlbmFtZSwgJnBhcmFtcyApOwotICAgIGlmIChoYW5kbGUgPT0gMikgIC8qIGZpbGUgbm90IGZvdW5kICovCisgICAgaWYgKGhhbmRsZSA9PSAoSEFORExFKTIpICAvKiBmaWxlIG5vdCBmb3VuZCAqLwogICAgIHsKICAgICAgICAgc3RyY2F0KCBmaWxlbmFtZSwgIi5leGUiICk7CiAgICAgICAgIGhhbmRsZSA9IExvYWRNb2R1bGUoIGZpbGVuYW1lLCAmcGFyYW1zICk7CkBAIC0xMTcwLDYgKzEyMzUsNyBAQAogCiAgICAgR2xvYmFsRnJlZSggY21kU2hvd0hhbmRsZSApOwogICAgIEdsb2JhbEZyZWUoIGNtZExpbmVIYW5kbGUgKTsKKyAgICBZaWVsZCgpOwkvKiBwcm9ncmFtIGlzIGV4ZWN1dGVkIGltbWVkaWF0bHkgLi4uLm5lZWRlZCBmb3Igd29yZCAqLwogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKQEAgLTExODgsMTMgKzEyNTQsMTMgQEAKICAgICBpZiAoSElXT1JEKG5hbWUpICE9IDApCiAgICAgewogICAgICAgICBvcmRpbmFsID0gTU9EVUxFX0dldE9yZGluYWwoIGhNb2R1bGUsIChMUFNUUilQVFJfU0VHX1RPX0xJTihuYW1lKSApOwotICAgICAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiR2V0UHJvY0FkZHJlc3M6ICUwNHggJyVzJ1xuIiwKKyAgICAgICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIkdldFByb2NBZGRyZXNzOiAiTlBGTVQiICclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCAoTFBTVFIpUFRSX1NFR19UT19MSU4obmFtZSkgKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgb3JkaW5hbCA9IExPV09SRChuYW1lKTsKLSAgICAgICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIkdldFByb2NBZGRyZXNzOiAlMDR4ICUwNHhcbiIsCisgICAgICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJHZXRQcm9jQWRkcmVzczogIk5QRk1UIiAlMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgb3JkaW5hbCApOwogICAgIH0KICAgICBpZiAoIW9yZGluYWwpIHJldHVybiAoRkFSUFJPQykwOwpAQCAtMTIwNiw2ICsxMjcyLDcgQEAKIH0KIAogCisjaWZuZGVmIFdJTkVMSUIKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldFduZFByb2NFbnRyeTE2IChub3QgYSBXaW5kb3dzIEFQSSBmdW5jdGlvbikKICAqCkBAIC0xMjIwLDYgKzEyODcsNyBAQAogICAgIG9yZGluYWwgPSBNT0RVTEVfR2V0T3JkaW5hbCggaE1vZHVsZSwgbmFtZSApOwogICAgIHJldHVybiBNT0RVTEVfR2V0RW50cnlQb2ludCggaE1vZHVsZSwgb3JkaW5hbCApOwogfQorI2VuZGlmCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2xvYWRlci9uZV9pbWFnZS5jIGIvbG9hZGVyL25lX2ltYWdlLmMKaW5kZXggYjA1ZTY1ZS4uOTE2N2E5OSAxMDA2NDQKLS0tIGEvbG9hZGVyL25lX2ltYWdlLmMKKysrIGIvbG9hZGVyL25lX2ltYWdlLmMKQEAgLTM0LDcgKzM0LDggQEAKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAgICAgU0VHVEFCTEVFTlRSWSAqcFNlZ1RhYmxlLCAqcFNlZzsKICAgICBXT1JEICpwTW9kdWxlVGFibGU7Ci0gICAgV09SRCBjb3VudCwgaSwgbW9kdWxlLCBvZmZzZXQ7CisgICAgV09SRCBjb3VudCwgaSwgb2Zmc2V0OworICAgIEhNT0RVTEUgbW9kdWxlOwogICAgIERXT1JEIGFkZHJlc3M7CiAgICAgaW50IGZkOwogICAgIHN0cnVjdCByZWxvY2F0aW9uX2VudHJ5X3MgKnJlcCwgKnJlbG9jX2VudHJpZXM7CkBAIC01NCwxMiArNTUsMTMgQEAKICAgICBpZiAoIXBTZWctPmZpbGVwb3MpIHJldHVybiBUUlVFOyAgLyogTm8gZmlsZSBpbWFnZSwganVzdCByZXR1cm4gKi8KIAkKICAgICBmZCA9IE1PRFVMRV9PcGVuRmlsZSggaE1vZHVsZSApOwotICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJMb2FkaW5nIHNlZ21lbnQgJWQsIHNlbGVjdG9yPSUwNHhcbiIsCisgICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIkxvYWRpbmcgc2VnbWVudCAlZCwgc2VsZWN0b3I9Ik5QRk1UIlxuIiwKICAgICAgICAgICAgICAgICAgICAgc2VnbnVtLCBwU2VnLT5zZWxlY3RvciApOwogICAgIGxzZWVrKCBmZCwgcFNlZy0+ZmlsZXBvcyA8PCBwTW9kdWxlLT5hbGlnbm1lbnQsIFNFRUtfU0VUICk7CiAgICAgc2l6ZSA9IHBTZWctPnNpemUgPyBwU2VnLT5zaXplIDogMHgxMDAwMDsKICAgICBtZW0gPSBHbG9iYWxMb2NrKHBTZWctPnNlbGVjdG9yKTsKICAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfU0VMRkxPQUQgJiYgc2VnbnVtID4gMSkgewkKKyNpZm5kZWYgV0lORUxJQgogIAkvKiBJbXBsZW1lbnQgc2VsZiBsb2FkaW5nIHNlZ21lbnRzICovCiAgCVNFTEZMT0FESEVBREVSICpzZWxmbG9hZGhlYWRlcjsKICAJV09SRCBvbGRzcywgb2xkc3AsIG9sZHNlbGVjdG9yLCBuZXdzZWxlY3RvcjsKQEAgLTkyLDYgKzk0LDkgQEAKICAJCiAgCUlGMTYzMl9TYXZlZDE2X3NzID0gb2xkc3M7CiAgCUlGMTYzMl9TYXZlZDE2X3NwID0gb2xkc3A7CisjZWxzZQorCWZwcmludGYoc3RkZXJyLCJKQlA6IElnbm9yaW5nIHNlbGYgbG9hZGluZyBzZWdtZW50cyBpbiBORV9Mb2FkU2VnbWVudC5cbiIpOworI2VuZGlmCiAgICAgIH0KICAgICBlbHNlIGlmICghKHBTZWctPmZsYWdzICYgTkVfU0VHRkxBR1NfSVRFUkFURUQpKQogICAgICAgcmVhZChmZCwgbWVtLCBzaXplKTsKQEAgLTEyNiw3ICsxMzEsNyBAQAogICAgIHJlYWQoIGZkLCAmY291bnQsIHNpemVvZihjb3VudCkgKTsKICAgICBpZiAoIWNvdW50KSByZXR1cm4gVFJVRTsKIAotICAgIGRwcmludGZfZml4dXAoIHN0ZGRlYiwgIkZpeHVwcyBmb3IgJSouKnMsIHNlZ21lbnQgJWQsIHNlbGVjdG9yICUwNHhcbiIsCisgICAgZHByaW50Zl9maXh1cCggc3RkZGViLCAiRml4dXBzIGZvciAlKi4qcywgc2VnbWVudCAlZCwgc2VsZWN0b3IgIk5QRk1UIlxuIiwKICAgICAgICAgICAgICAgICAgICAqKChCWVRFICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUpLAogICAgICAgICAgICAgICAgICAgICooKEJZVEUgKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZSksCiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZSArIDEsCkBAIC0xNjUsNyArMTcwLDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBORV9NT0RVTEUgKnBUYXJnZXQgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jayggbW9kdWxlICk7CiAgICAgICAgICAgICAgICAgaWYgKCFwVGFyZ2V0KQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJNb2R1bGUgbm90IGZvdW5kOiAlMDR4LCByZWZlcmVuY2UgJWQgb2YgbW9kdWxlICUqLipzXG4iLAorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJNb2R1bGUgbm90IGZvdW5kOiAiTlBGTVQiLCByZWZlcmVuY2UgJWQgb2YgbW9kdWxlICUqLipzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUsIHJlcC0+dGFyZ2V0MSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKEJZVEUgKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKEJZVEUgKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZSksCkBAIC0yNjYsNyArMjcxLDcgQEAKIAkgIGNhc2UgTkVfUkFERFJfTE9XQllURToKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBzcCA9IFBUUl9TRUdfT0ZGX1RPX0xJTiggcFNlZy0+c2VsZWN0b3IsIG9mZnNldCApOwotICAgICAgICAgICAgICAgIGRwcmludGZfZml4dXAoc3RkZGViLCIgICAgJTA0eDolMDR4OiUwNHggQllURSVzXG4iLAorICAgICAgICAgICAgICAgIGRwcmludGZfZml4dXAoc3RkZGViLCIgICAgIk5QRk1UIjolMDR4OiUwNHggQllURSVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlZy0+c2VsZWN0b3IsIG9mZnNldCwgKnNwLCBhZGRpdGl2ZSA/ICIgYWRkaXRpdmUiOiIiKTsKICAgICAgICAgICAgICAgICBvZmZzZXQgPSAqc3A7CiAJCWlmKGFkZGl0aXZlKQpAQCAtMjgwLDcgKzI4NSw3IEBACiAJICBjYXNlIE5FX1JBRERSX09GRlNFVDE2OgogCSAgICBkbyB7CiAgICAgICAgICAgICAgICAgc3AgPSBQVFJfU0VHX09GRl9UT19MSU4oIHBTZWctPnNlbGVjdG9yLCBvZmZzZXQgKTsKLQkJZHByaW50Zl9maXh1cChzdGRkZWIsIiAgICAlMDR4OiUwNHg6JTA0eCBPRkZTRVQxNiVzXG4iLAorCQlkcHJpbnRmX2ZpeHVwKHN0ZGRlYiwiICAgICJOUEZNVCI6JTA0eDolMDR4IE9GRlNFVDE2JXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnLT5zZWxlY3Rvciwgb2Zmc2V0LCAqc3AsIGFkZGl0aXZlID8gIiBhZGRpdGl2ZSIgOiAiIiApOwogCQlvZmZzZXQgPSAqc3A7CiAJCSpzcCA9IExPV09SRChhZGRyZXNzKTsKQEAgLTI5Miw3ICsyOTcsNyBAQAogCSAgY2FzZSBORV9SQUREUl9QT0lOVEVSMzI6CiAJICAgIGRvIHsKICAgICAgICAgICAgICAgICBzcCA9IFBUUl9TRUdfT0ZGX1RPX0xJTiggcFNlZy0+c2VsZWN0b3IsIG9mZnNldCApOwotCQlkcHJpbnRmX2ZpeHVwKHN0ZGRlYiwiICAgICUwNHg6JTA0eDolMDR4IFBPSU5URVIzMiVzXG4iLAorCQlkcHJpbnRmX2ZpeHVwKHN0ZGRlYiwiICAgICJOUEZNVCI6JTA0eDolMDR4IFBPSU5URVIzMiVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlZy0+c2VsZWN0b3IsIG9mZnNldCwgKnNwLCBhZGRpdGl2ZSA/ICIgYWRkaXRpdmUiIDogIiIgKTsKIAkJb2Zmc2V0ID0gKnNwOwogCQkqc3AgICAgPSBMT1dPUkQoYWRkcmVzcyk7CkBAIC0zMDUsNyArMzEwLDcgQEAKIAkgIGNhc2UgTkVfUkFERFJfU0VMRUNUT1I6CiAJICAgIGRvIHsKICAgICAgICAgICAgICAgICBzcCA9IFBUUl9TRUdfT0ZGX1RPX0xJTiggcFNlZy0+c2VsZWN0b3IsIG9mZnNldCApOwotCQlkcHJpbnRmX2ZpeHVwKHN0ZGRlYiwiICAgICUwNHg6JTA0eDolMDR4IFNFTEVDVE9SJXNcbiIsCisJCWRwcmludGZfZml4dXAoc3RkZGViLCIgICAgIk5QRk1UIjolMDR4OiUwNHggU0VMRUNUT1Ilc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWctPnNlbGVjdG9yLCBvZmZzZXQsICpzcCwgYWRkaXRpdmUgPyAiIGFkZGl0aXZlIiA6ICIiICk7CiAJCW9mZnNldCA9ICpzcDsKIAkJKnNwICAgID0gSElXT1JEKGFkZHJlc3MpOwpAQCAtNDM0LDYgKzQzOSw3IEBACiAgKi8KIHN0YXRpYyBCT09MIE5FX0luaXRETEwoIEhNT0RVTEUgaE1vZHVsZSApCiB7CisjaWZuZGVmIFdJTkVMSUIKICAgICBpbnQgY3NfcmVnLCBkc19yZWcsIGlwX3JlZywgY3hfcmVnLCBkaV9yZWcsIGJwX3JlZzsKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAgICAgU0VHVEFCTEVFTlRSWSAqcFNlZ1RhYmxlOwpAQCAtNDgyLDYgKzQ4OCwxMCBAQAogICAgIHJldHVybiBDYWxsVG8xNl9yZWdzXyggKEZBUlBST0MpKGNzX3JlZyA8PCAxNiB8IGlwX3JlZyksIGRzX3JlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyplcyovLCAwIC8qYnAqLywgMCAvKmF4Ki8sIDAgLypieCovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3hfcmVnLCAwIC8qZHgqLywgMCAvKnNpKi8sIGRpX3JlZyApOworI2Vsc2UKKyAgICBmcHJpbnRmKCBzdGRlcnIsIkpCUDogSWdub3JpbmcgY2FsbCB0byBMaWJNYWluXG4iICk7CisgICAgcmV0dXJuIEZBTFNFOworI2VuZGlmCiB9CiAKIApAQCAtNDkzLDE0ICs1MDMsMTQgQEAKIHZvaWQgTkVfSW5pdGlhbGl6ZURMTHMoIEhNT0RVTEUgaE1vZHVsZSApCiB7CiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwotICAgIFdPUkQgKnBETEw7CisgICAgSE1PRFVMRSAqcERMTDsKIAogICAgIHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jayggaE1vZHVsZSApOwogICAgIGlmIChwTW9kdWxlLT5kbGxzX3RvX2luaXQpCiAgICAgewogCUhBTkRMRSB0b19pbml0ID0gcE1vZHVsZS0+ZGxsc190b19pbml0OwogCXBNb2R1bGUtPmRsbHNfdG9faW5pdCA9IDA7Ci0gICAgICAgIGZvciAocERMTCA9IChXT1JEICopR2xvYmFsTG9jayggdG9faW5pdCApOyAqcERMTDsgcERMTCsrKQorICAgICAgICBmb3IgKHBETEwgPSAoSE1PRFVMRSAqKUdsb2JhbExvY2soIHRvX2luaXQgKTsgKnBETEw7IHBETEwrKykKICAgICAgICAgewogICAgICAgICAgICAgTkVfSW5pdGlhbGl6ZURMTHMoICpwRExMICk7CiAgICAgICAgICAgICBORV9Jbml0RExMKCAqcERMTCApOwpkaWZmIC0tZ2l0IGEvbG9hZGVyL25lX3Jlc291cmNlLmMgYi9sb2FkZXIvbmVfcmVzb3VyY2UuYwppbmRleCBhYjliMDg5Li5hODNmNjM5IDEwMDY0NAotLS0gYS9sb2FkZXIvbmVfcmVzb3VyY2UuYworKysgYi9sb2FkZXIvbmVfcmVzb3VyY2UuYwpAQCAtNTQsNyArNTQsOCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBkcHJpbnRmX3Jlc291cmNlKCBzdGRkZWIsICJOYW1lVGFibGUgZW50cnk6IHR5cGU9JTA0eCBpZD0lMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFR5cGVJbmZvLT50eXBlX2lkLCBwTmFtZUluZm8tPmlkICk7Ci0gICAgICAgICAgICBoYW5kbGUgPSBMb2FkUmVzb3VyY2UoIGhNb2R1bGUsIChpbnQpcE5hbWVJbmZvIC0gKGludClwTW9kdWxlICk7CisgICAgICAgICAgICBoYW5kbGUgPSBMb2FkUmVzb3VyY2UoIGhNb2R1bGUsIAorCQkJCSAgIChIQU5ETEUpKChpbnQpcE5hbWVJbmZvIC0gKGludClwTW9kdWxlKSApOwogICAgICAgICAgICAgZm9yKHAgPSAoV09SRCopTG9ja1Jlc291cmNlKGhhbmRsZSk7ICpwOyBwID0gKFdPUkQgKikoKGNoYXIqKXArKnApKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGRwcmludGZfcmVzb3VyY2UoIHN0ZGRlYiwiICB0eXBlPSUwNHggJyVzJyBpZD0lMDR4ICclcydcbiIsCkBAIC0xMTgsMTQgKzExOSwxNSBAQAogICAgICAgICAgICAgaWYgKHBOYW1lSW5mby0+aWQgJiAweDgwMDApIGNvbnRpbnVlOwogICAgICAgICAgICAgcCA9IChCWVRFICopcE1vZHVsZSArIHBNb2R1bGUtPnJlc190YWJsZSArIHBOYW1lSW5mby0+aWQ7CiAgICAgICAgICAgICBpZiAoKCpwID09IGxlbikgJiYgIXN0cm5jYXNlY21wKCBwKzEsIHN0ciwgbGVuICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChpbnQpcE5hbWVJbmZvIC0gKGludClwTW9kdWxlOworICAgICAgICAgICAgICAgIHJldHVybiAoSFJTUkMpKChpbnQpcE5hbWVJbmZvIC0gKGludClwTW9kdWxlKTsKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlICAvKiBOdW1lcmljIHJlc291cmNlIGlkICovCiAgICAgewogICAgICAgICBXT1JEIGlkID0gTE9XT1JEKHJlc0lkKSB8IDB4ODAwMDsKICAgICAgICAgZm9yIChjb3VudCA9IHBUeXBlSW5mby0+Y291bnQ7IGNvdW50ID4gMDsgY291bnQtLSwgcE5hbWVJbmZvKyspCi0gICAgICAgICAgICBpZiAocE5hbWVJbmZvLT5pZCA9PSBpZCkgcmV0dXJuIChpbnQpcE5hbWVJbmZvIC0gKGludClwTW9kdWxlOworICAgICAgICAgICAgaWYgKHBOYW1lSW5mby0+aWQgPT0gaWQpIAorCSAgICAgIHJldHVybiAoSFJTUkMpKChpbnQpcE5hbWVJbmZvIC0gKGludClwTW9kdWxlKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0yMTksMTMgKzIyMSwxNSBAQAogSEdMT0JBTCBORV9BbGxvY1Jlc291cmNlKCBITU9EVUxFIGhNb2R1bGUsIEhSU1JDIGhSc3JjLCBEV09SRCBzaXplICkKIHsKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7Ci0gICAgTkVfTkFNRUlORk8gKnBOYW1lSW5mbzsKKyAgICBORV9OQU1FSU5GTyAqcE5hbWVJbmZvPU5VTEw7CiAgICAgV09SRCBzaXplU2hpZnQ7CiAKICAgICBwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2soIGhNb2R1bGUgKTsKICAgICBpZiAoIXBNb2R1bGUgfHwgIXBNb2R1bGUtPnJlc190YWJsZSkgcmV0dXJuIDA7CiAgICAgc2l6ZVNoaWZ0ID0gKihXT1JEICopKChjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPnJlc190YWJsZSk7CisjaWZuZGVmIFdJTkVMSUIKICAgICBwTmFtZUluZm8gPSAoTkVfTkFNRUlORk8qKSgoY2hhciopcE1vZHVsZSArIGhSc3JjKTsKKyNlbmRpZgogICAgIGlmIChzaXplIDwgKERXT1JEKXBOYW1lSW5mby0+bGVuZ3RoIDw8IHNpemVTaGlmdCkKICAgICAgICAgc2l6ZSA9IChEV09SRClwTmFtZUluZm8tPmxlbmd0aCA8PCBzaXplU2hpZnQ7CiAgICAgcmV0dXJuIEdMT0JBTF9BbGxvYyggR01FTV9GSVhFRCwgc2l6ZSwgaE1vZHVsZSwgRkFMU0UsIEZBTFNFLCBGQUxTRSApOwpAQCAtMjM4LDE0ICsyNDIsMTYgQEAKIGludCBORV9BY2Nlc3NSZXNvdXJjZSggSE1PRFVMRSBoTW9kdWxlLCBIUlNSQyBoUnNyYyApCiB7CiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwotICAgIE5FX05BTUVJTkZPICpwTmFtZUluZm87CisgICAgTkVfTkFNRUlORk8gKnBOYW1lSW5mbz1OVUxMOwogICAgIFdPUkQgc2l6ZVNoaWZ0OwogICAgIGNoYXIgKm5hbWU7CiAgICAgaW50IGZkOwogCiAgICAgcE1vZHVsZSA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrKCBoTW9kdWxlICk7CiAgICAgaWYgKCFwTW9kdWxlIHx8ICFwTW9kdWxlLT5yZXNfdGFibGUpIHJldHVybiAwOworI2lmbmRlZiBXSU5FTElCCiAgICAgcE5hbWVJbmZvID0gKE5FX05BTUVJTkZPKikoKGNoYXIqKXBNb2R1bGUgKyBoUnNyYyk7CisjZW5kaWYKIAogICAgIG5hbWUgPSAoKExPQURFREZJTEVJTkZPKikoKGNoYXIqKXBNb2R1bGUgKyBwTW9kdWxlLT5maWxlaW5mbykpLT5maWxlbmFtZTsKICAgICBmZCA9IG9wZW4oIERPU19HZXRVbml4RmlsZU5hbWUobmFtZSksIE9fUkRPTkxZICk7CkBAIC0yNjEsMTMgKzI2NywxNSBAQAogRFdPUkQgTkVfU2l6ZW9mUmVzb3VyY2UoIEhNT0RVTEUgaE1vZHVsZSwgSFJTUkMgaFJzcmMgKQogewogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKLSAgICBORV9OQU1FSU5GTyAqcE5hbWVJbmZvOworICAgIE5FX05BTUVJTkZPICpwTmFtZUluZm89TlVMTDsKICAgICBXT1JEIHNpemVTaGlmdDsKIAogICAgIHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jayggaE1vZHVsZSApOwogICAgIGlmICghcE1vZHVsZSB8fCAhcE1vZHVsZS0+cmVzX3RhYmxlKSByZXR1cm4gMDsKICAgICBzaXplU2hpZnQgPSAqKFdPUkQgKikoKGNoYXIgKilwTW9kdWxlICsgcE1vZHVsZS0+cmVzX3RhYmxlKTsKKyNpZm5kZWYgV0lORUxJQgogICAgIHBOYW1lSW5mbyA9IChORV9OQU1FSU5GTyopKChjaGFyKilwTW9kdWxlICsgaFJzcmMpOworI2VuZGlmCiAgICAgcmV0dXJuIChEV09SRClwTmFtZUluZm8tPmxlbmd0aCA8PCBzaXplU2hpZnQ7CiB9CiAKQEAgLTI3OCwxMyArMjg2LDE1IEBACiBIR0xPQkFMIE5FX0xvYWRSZXNvdXJjZSggSE1PRFVMRSBoTW9kdWxlLCAgSFJTUkMgaFJzcmMgKQogewogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKLSAgICBORV9OQU1FSU5GTyAqcE5hbWVJbmZvOworICAgIE5FX05BTUVJTkZPICpwTmFtZUluZm89TlVMTDsKICAgICBXT1JEIHNpemVTaGlmdDsKICAgICBpbnQgZmQ7CiAKICAgICBwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2soIGhNb2R1bGUgKTsKICAgICBpZiAoIXBNb2R1bGUgfHwgIXBNb2R1bGUtPnJlc190YWJsZSkgcmV0dXJuIDA7CisjaWZuZGVmIFdJTkVMSUIKICAgICBwTmFtZUluZm8gPSAoTkVfTkFNRUlORk8qKSgoY2hhciopcE1vZHVsZSArIGhSc3JjKTsKKyNlbmRpZgogICAgIGlmIChwTmFtZUluZm8tPmhhbmRsZSkKICAgICB7CiAgICAgICAgIHBOYW1lSW5mby0+dXNhZ2UrKzsKQEAgLTMxMyw3ICszMjMsNyBAQAogewogICAgIC8qIE1heSBuZWVkIHRvIHJlbG9hZCB0aGUgcmVzb3VyY2UgaWYgZGlzY2FyZGVkICovCiAKLSAgICByZXR1cm4gV0lOMTZfR2xvYmFsTG9jayggaGFuZGxlICk7CisgICAgcmV0dXJuIChTRUdQVFIpV0lOMTZfR2xvYmFsTG9jayggaGFuZGxlICk7CiB9CiAKIApAQCAtMzQ5LDYgKzM1OSw2IEBACiAgICAgICAgIH0KICAgICAgICAgcFR5cGVJbmZvID0gKE5FX1RZUEVJTkZPICopcE5hbWVJbmZvOwogICAgIH0KLSAgICBmcHJpbnRmKCBzdGRlcnIsICJGcmVlUmVzb3VyY2U6ICUwNHggJTA0eCBub3QgZm91bmQhXG4iLCBoTW9kdWxlLCBoYW5kbGUgKTsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICJGcmVlUmVzb3VyY2U6ICJOUEZNVCIgIk5QRk1UIiBub3QgZm91bmQhXG4iLCBoTW9kdWxlLCBoYW5kbGUgKTsKICAgICByZXR1cm4gRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9sb2FkZXIvcGVfaW1hZ2UuYyBiL2xvYWRlci9wZV9pbWFnZS5jCmluZGV4IDQ5M2RlMGYuLjE4MTE3Y2QgMTAwNjQ0Ci0tLSBhL2xvYWRlci9wZV9pbWFnZS5jCisrKyBiL2xvYWRlci9wZV9pbWFnZS5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgImxkdC5oIgogI2luY2x1ZGUgInJlZ2lzdGVycy5oIgotCisjaW5jbHVkZSAic2VsZWN0b3JzLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCkBAIC01NCw3ICs1NCwxMSBAQAogICBpZihyX3NpemUpCiAgICAgdl9zaXplPXJfc2l6ZTsKICAgZWxzZQorI2lmZGVmIF9fc3ZyNF9fCisgICAgZnByaW50ZihzdGRlcnIsInhtbWFwOiAlcyBsaW5lICVkIGRvZXNuJ3Qgc3VwcG9ydCBNQVBfQU5PTlxuIixfX0ZJTEVfXywgX19MSU5FX18pOworI2Vsc2UKICAgICBmbGFncyB8PSBNQVBfQU5PTjsKKyNlbmRpZgogICByZXN1bHQgPSBtbWFwKHZhZGRyLCB2X3NpemUsIHByb3QsIGZsYWdzLCBmZCwgZmlsZV9vZmZzZXQpOwogICBpZigodW5zaWduZWQgaW50KSByZXN1bHQgIT0gMHhmZmZmZmZmZikgcmV0dXJuIHJlc3VsdDsKIApAQCAtMTMxLDcgKzEzNSwxMSBAQAogCQlleGl0KDApOwogCSAgfQogCSAgcHJpbnRmKCItLS0gJXMgJXMuJWRcbiIsIHBlX25hbWUtPk5hbWUsIE1vZHVsZSwgcGVfbmFtZS0+SGludCk7Ci0JICAqdGh1bmtfbGlzdD1SRUxBWTMyX0dldEVudHJ5UG9pbnQoTW9kdWxlLHBlX25hbWUtPk5hbWUscGVfbmFtZS0+SGludCk7CisjaWZuZGVmIFdJTkVMSUIgLyogRklYTUU6IEpCUDogU2hvdWxkIHRoaXMgaGFwcGVuIGluIGxpYndpbmUuYT8gKi8KKwkgICp0aHVua19saXN0PSh1bnNpZ25lZCBpbnQpUkVMQVkzMl9HZXRFbnRyeVBvaW50KE1vZHVsZSxwZV9uYW1lLT5OYW1lLHBlX25hbWUtPkhpbnQpOworI2Vsc2UKKwkgIGZwcmludGYoc3RkZXJyLCJKQlA6IENhbGwgdG8gUkVMQVkzMl9HZXRFbnRyeVBvaW50IGJlaW5nIGlnbm9yZWQuXG4iKTsKKyNlbmRpZgogCSAgaWYoISp0aHVua19saXN0KQogCSAgewogCSAgCWZwcmludGYoc3RkZXJyLCJObyBpbXBsZW1lbnRhdGlvbiBmb3IgJXMuJWRcbiIsTW9kdWxlLCBwZV9uYW1lLT5IaW50KTsKQEAgLTE5NywxMiArMjA1LDEyIEBACiAJZm9yKGk9MDsgaSA8IHdwbnQtPnBlLT5wZV9oZWFkZXItPmNvZmYuTnVtYmVyT2ZTZWN0aW9uczsgaSsrKQogCXsKIAlpZighbG9hZF9hZGRyKSB7Ci0JCXJlc3VsdCA9IHhtbWFwKChjaGFyICopMCwgd3BudC0+cGUtPnBlX3NlZ1tpXS5WaXJ0dWFsX1NpemUsCisJCXJlc3VsdCA9IChpbnQpeG1tYXAoKGNoYXIgKikwLCB3cG50LT5wZS0+cGVfc2VnW2ldLlZpcnR1YWxfU2l6ZSwKIAkJCXdwbnQtPnBlLT5wZV9zZWdbaV0uU2l6ZV9PZl9SYXdfRGF0YSwgNywKIAkJCU1BUF9QUklWQVRFLCB3cG50LT5mZCwgd3BudC0+cGUtPnBlX3NlZ1tpXS5Qb2ludGVyVG9SYXdEYXRhKTsKIAkJbG9hZF9hZGRyID0gKHVuc2lnbmVkIGludCkgcmVzdWx0IC0gIHdwbnQtPnBlLT5wZV9zZWdbaV0uVmlydHVhbF9BZGRyZXNzOwogCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IHhtbWFwKChjaGFyICopIGxvYWRfYWRkciArIHdwbnQtPnBlLT5wZV9zZWdbaV0uVmlydHVhbF9BZGRyZXNzLCAKKwkJcmVzdWx0ID0gKGludCl4bW1hcCgoY2hhciAqKSBsb2FkX2FkZHIgKyB3cG50LT5wZS0+cGVfc2VnW2ldLlZpcnR1YWxfQWRkcmVzcywgCiAJCQkgIHdwbnQtPnBlLT5wZV9zZWdbaV0uVmlydHVhbF9TaXplLAogCQkgICAgICB3cG50LT5wZS0+cGVfc2VnW2ldLlNpemVfT2ZfUmF3X0RhdGEsIDcsIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCAKIAkJICAgICAgd3BudC0+ZmQsIHdwbnQtPnBlLT5wZV9zZWdbaV0uUG9pbnRlclRvUmF3RGF0YSk7CkBAIC0yMzIsMTAgKzI0MCwxMyBAQAogCWlmKHdwbnQtPnBlLT5wZV9pbXBvcnQpIGZpeHVwX2ltcG9ydHMod3BudC0+cGUtPnBlX2ltcG9ydCk7CiAJaWYod3BudC0+cGUtPnBlX2V4cG9ydCkgZHVtcF9leHBvcnRzKHdwbnQtPnBlLT5wZV9leHBvcnQpOwogICAKLQl3cG50LT5oaW5zdGFuY2UgPSAweDgwMDA7CisJd3BudC0+aGluc3RhbmNlID0gKEhJTlNUQU5DRSkweDgwMDA7CiAJcmV0dXJuICh3cG50LT5oaW5zdGFuY2UpOwogfQogCitISU5TVEFOQ0UgTU9EVUxFX0NyZWF0ZUluc3RhbmNlKEhNT0RVTEUgaE1vZHVsZSxMT0FEUEFSQU1TICpwYXJhbXMpOwordm9pZCBJbml0VGFzayhzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgY29udGV4dCk7CisKIEhJTlNUQU5DRSBQRV9Mb2FkTW9kdWxlKGludCBmZCwgT0ZTVFJVQ1QgKm9mcywgTE9BRFBBUkFNUyogcGFyYW1zKQogewogCXN0cnVjdCB3X2ZpbGVzICp3cG50OwpAQCAtMjc1LDExICsyODYsMTEgQEAKIAogCWhNb2R1bGUgPSBHbG9iYWxBbGxvYyggR01FTV9NT1ZFQUJMRSB8IEdNRU1fWkVST0lOSVQsIHNpemUgKTsKIAl3cG50LT5oTW9kdWxlPWhNb2R1bGU7Ci0JaWYgKCFoTW9kdWxlKSByZXR1cm4gMTE7ICAvKiBpbnZhbGlkIGV4ZSAqLworCWlmICghaE1vZHVsZSkgcmV0dXJuIChISU5TVEFOQ0UpMTE7ICAvKiBpbnZhbGlkIGV4ZSAqLwogCiAJRmFyU2V0T3duZXIoIGhNb2R1bGUsIGhNb2R1bGUgKTsKIAkKLQlwTW9kdWxlID0gR2xvYmFsTG9jayhoTW9kdWxlKTsKKwlwTW9kdWxlID0gKE5FX01PRFVMRSopR2xvYmFsTG9jayhoTW9kdWxlKTsKIAogCS8qIFNldCBhbGwgdXNlZCBlbnRyaWVzICovCiAJcE1vZHVsZS0+bWFnaWM9TkVfU0lHTkFUVVJFOwpAQCAtMzEyLDkgKzMyMywxNCBAQAogCXBTZWdtZW50LT5taW5zaXplPTB4MTAwMDsKIAlwU2VnbWVudCsrOwogCi0JY3RzPUdldFduZFByb2NFbnRyeTE2KCJXaW4zMkNhbGxUb1N0YXJ0Iik7CisJY3RzPShEV09SRClHZXRXbmRQcm9jRW50cnkxNigiV2luMzJDYWxsVG9TdGFydCIpOworI2lmZGVmIFdJTkVMSUIzMgorCXBTZWdtZW50LT5zZWxlY3Rvcj0odm9pZCopY3RzOworCXBNb2R1bGUtPmlwPTA7CisjZWxzZQogCXBTZWdtZW50LT5zZWxlY3Rvcj1jdHM+PjE2OwogCXBNb2R1bGUtPmlwPWN0cyAmIDB4RkZGRjsKKyNlbmRpZgogCXBTZWdtZW50Kys7CiAKIAlwU3RyPShjaGFyKilwU2VnbWVudDsKQEAgLTMzMiw3ICszNDgsNyBAQAogCXBNb2R1bGUtPnN0YWNrX3NpemU9MHhFMDAwOwogCiAJLyogQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGVzIG5vdyA2NEtCICovCi0JaEluc3RhbmNlPU1PRFVMRV9DcmVhdGVJbnN0YW5jZShoTW9kdWxlKTsKKwloSW5zdGFuY2U9TU9EVUxFX0NyZWF0ZUluc3RhbmNlKGhNb2R1bGUsTlVMTCAvKiBGSVg6IE5VTEw/IHJlYWxseT8gKi8pOwogCXdwbnQtPmhpbnN0YW5jZT1oSW5zdGFuY2U7CiAKIAlUQVNLX0NyZWF0ZVRhc2soaE1vZHVsZSxoSW5zdGFuY2UsMCwKQEAgLTM0MiwxMSArMzU4LDEzIEBACiAJcmV0dXJuIGhJbnN0YW5jZTsKIH0KIAoraW50IFVTRVJfSW5pdEFwcChISU5TVEFOQ0UgaEluc3RhbmNlKTsKKwogdm9pZCBQRV9XaW4zMkNhbGxUb1N0YXJ0KHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCBjb250ZXh0KQogewogCWludCBmczsKIAlzdHJ1Y3Qgd19maWxlcyAqd3BudD13aW5lX2ZpbGVzOwotCWZzPUdsb2JhbEFsbG9jKEdITkQsMHgxMDAwMCk7CisJZnM9KGludClHbG9iYWxBbGxvYyhHSE5ELDB4MTAwMDApOwogCWZwcmludGYoc3RkZGViLCJHb2luZyB0byBzdGFydCBXaW4zMiBwcm9ncmFtXG4iKTsJCiAJSW5pdFRhc2soY29udGV4dCk7CiAJVVNFUl9Jbml0QXBwKHdwbnQtPmhNb2R1bGUpOwpkaWZmIC0tZ2l0IGEvbG9hZGVyL3Jlc291cmNlLmMgYi9sb2FkZXIvcmVzb3VyY2UuYwppbmRleCA5MGU5MjE2Li43YTViNGIxIDEwMDY0NAotLS0gYS9sb2FkZXIvcmVzb3VyY2UuYworKysgYi9sb2FkZXIvcmVzb3VyY2UuYwpAQCAtMTUsMTAgKzE1LDggQEAKICNpbmNsdWRlICJhcmNoLmgiCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImdkaS5oIgotI2luY2x1ZGUgImJpdG1hcC5oIgogI2luY2x1ZGUgImdsb2JhbC5oIgogI2luY2x1ZGUgIm5lZXhlLmgiCi0jaW5jbHVkZSAiaWNvbi5oIgogI2luY2x1ZGUgImFjY2VsLmgiCiAjaW5jbHVkZSAiZGxscy5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgpAQCAtMzQsMTUgKzMyLDYgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJICAgIExvYWRJY29uSGFuZGxlciAgICAoVVNFUi40NTYpCi0gKi8KLUhJQ09OIExvYWRJY29uSGFuZGxlciggSEFORExFIGhSZXNvdXJjZSwgQk9PTCBiTmV3ICkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICBGaW5kUmVzb3VyY2UgICAgKEtFUk5FTC42MCkKICAqLwogSFJTUkMgRmluZFJlc291cmNlKCBITU9EVUxFIGhNb2R1bGUsIFNFR1BUUiBuYW1lLCBTRUdQVFIgdHlwZSApCkBAIC01MCw3ICszOSw3IEBACiAgICAgV09SRCAqcE1vZHVsZTsKIAogICAgIGhNb2R1bGUgPSBHZXRFeGVQdHIoIGhNb2R1bGUgKTsgIC8qIEluIGNhc2Ugd2Ugd2VyZSBwYXNzZWQgYW4gaEluc3RhbmNlICovCi0gICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJGaW5kUmVzb3VyY2U6IG1vZHVsZT0lMDR4IHR5cGU9IiwgaE1vZHVsZSApOworICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCAiRmluZFJlc291cmNlOiBtb2R1bGU9Ik5QRk1UIiB0eXBlPSIsIGhNb2R1bGUgKTsKICAgICBQcmludElkKCB0eXBlICk7CiAgICAgZHByaW50Zl9yZXNvdXJjZSggc3RkZGViLCAiIG5hbWU9IiApOwogICAgIFByaW50SWQoIG5hbWUgKTsKQEAgLTc2LDcgKzY1LDcgQEAKICAgICBXT1JEICpwTW9kdWxlOwogCiAgICAgaE1vZHVsZSA9IEdldEV4ZVB0ciggaE1vZHVsZSApOyAgLyogSW4gY2FzZSB3ZSB3ZXJlIHBhc3NlZCBhbiBoSW5zdGFuY2UgKi8KLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIkxvYWRSZXNvdXJjZTogbW9kdWxlPSUwNHggcmVzPSUwNHhcbiIsCisgICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJMb2FkUmVzb3VyY2U6IG1vZHVsZT0iTlBGTVQiIHJlcz0iTlBGTVQiXG4iLAogICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgaFJzcmMgKTsKICAgICBpZiAoIWhSc3JjKSByZXR1cm4gMDsKICAgICBpZiAoIShwTW9kdWxlID0gKFdPUkQgKilHbG9iYWxMb2NrKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKQEAgLTEwMSw3ICs5MCw3IEBACiAgICAgSE1PRFVMRSBoTW9kdWxlOwogICAgIFdPUkQgKnBNb2R1bGU7CiAKLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIkxvY2tSZXNvdXJjZTogaGFuZGxlPSUwNHhcbiIsIGhhbmRsZSApOworICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCAiTG9ja1Jlc291cmNlOiBoYW5kbGU9Ik5QRk1UIlxuIiwgaGFuZGxlICk7CiAgICAgaWYgKCFoYW5kbGUpIHJldHVybiAoU0VHUFRSKTA7CiAgICAgaE1vZHVsZSA9IEdldEV4ZVB0ciggaGFuZGxlICk7CiAgICAgaWYgKCEocE1vZHVsZSA9IChXT1JEICopR2xvYmFsTG9jayggaE1vZHVsZSApKSkgcmV0dXJuIDA7CkBAIC0xMjIsNyArMTExLDcgQEAKICAgICBITU9EVUxFIGhNb2R1bGU7CiAgICAgV09SRCAqcE1vZHVsZTsKIAotICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCAiTG9ja1Jlc291cmNlOiBoYW5kbGU9JTA0eFxuIiwgaGFuZGxlICk7CisgICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJMb2NrUmVzb3VyY2U6IGhhbmRsZT0iTlBGTVQiXG4iLCBoYW5kbGUgKTsKICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIE5VTEw7CiAgICAgaE1vZHVsZSA9IEdldEV4ZVB0ciggaGFuZGxlICk7CiAgICAgaWYgKCEocE1vZHVsZSA9IChXT1JEICopR2xvYmFsTG9jayggaE1vZHVsZSApKSkgcmV0dXJuIDA7CkBAIC0xNDYsNyArMTM1LDcgQEAKICAgICBITU9EVUxFIGhNb2R1bGU7CiAgICAgV09SRCAqcE1vZHVsZTsKIAotICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCAiRnJlZVJlc291cmNlOiBoYW5kbGU9JTA0eFxuIiwgaGFuZGxlICk7CisgICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJGcmVlUmVzb3VyY2U6IGhhbmRsZT0iTlBGTVQiXG4iLCBoYW5kbGUgKTsKICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIEZBTFNFOwogICAgIGhNb2R1bGUgPSBHZXRFeGVQdHIoIGhhbmRsZSApOwogICAgIGlmICghKHBNb2R1bGUgPSAoV09SRCAqKUdsb2JhbExvY2soIGhNb2R1bGUgKSkpIHJldHVybiAwOwpAQCAtMTY1LDEyICsxNTQsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgQWNjZXNzUmVzb3VyY2UgICAgKEtFUk5FTC42NCkKICAqLwotaW50IEFjY2Vzc1Jlc291cmNlKCBITU9EVUxFIGhNb2R1bGUsIEhSU1JDIGhSc3JjICkKK0lOVCBBY2Nlc3NSZXNvdXJjZSggSElOU1RBTkNFIGhNb2R1bGUsIEhSU1JDIGhSc3JjICkKIHsKICAgICBXT1JEICpwTW9kdWxlOwogCiAgICAgaE1vZHVsZSA9IEdldEV4ZVB0ciggaE1vZHVsZSApOyAgLyogSW4gY2FzZSB3ZSB3ZXJlIHBhc3NlZCBhbiBoSW5zdGFuY2UgKi8KLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIkFjY2Vzc1Jlc291cmNlOiBtb2R1bGU9JTA0eCByZXM9JTA0eFxuIiwKKyAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIkFjY2Vzc1Jlc291cmNlOiBtb2R1bGU9Ik5QRk1UIiByZXM9Ik5QRk1UIlxuIiwKICAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIGhSc3JjICk7CiAgICAgaWYgKCFoUnNyYykgcmV0dXJuIDA7CiAgICAgaWYgKCEocE1vZHVsZSA9IChXT1JEICopR2xvYmFsTG9jayggaE1vZHVsZSApKSkgcmV0dXJuIDA7CkBAIC0xOTQsNyArMTgzLDcgQEAKICAgICBXT1JEICpwTW9kdWxlOwogCiAgICAgaE1vZHVsZSA9IEdldEV4ZVB0ciggaE1vZHVsZSApOyAgLyogSW4gY2FzZSB3ZSB3ZXJlIHBhc3NlZCBhbiBoSW5zdGFuY2UgKi8KLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIlNpemVvZlJlc291cmNlOiBtb2R1bGU9JTA0eCByZXM9JTA0eFxuIiwKKyAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIlNpemVvZlJlc291cmNlOiBtb2R1bGU9Ik5QRk1UIiByZXM9Ik5QRk1UIlxuIiwKICAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIGhSc3JjICk7CiAgICAgaWYgKCEocE1vZHVsZSA9IChXT1JEICopR2xvYmFsTG9jayggaE1vZHVsZSApKSkgcmV0dXJuIDA7CiAgICAgc3dpdGNoKCpwTW9kdWxlKQpAQCAtMjE3LDcgKzIwNiw3IEBACiAgICAgV09SRCAqcE1vZHVsZTsKIAogICAgIGhNb2R1bGUgPSBHZXRFeGVQdHIoIGhNb2R1bGUgKTsgIC8qIEluIGNhc2Ugd2Ugd2VyZSBwYXNzZWQgYW4gaEluc3RhbmNlICovCi0gICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJBbGxvY1Jlc291cmNlOiBtb2R1bGU9JTA0eCByZXM9JTA0eCBzaXplPSVsZFxuIiwKKyAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIkFsbG9jUmVzb3VyY2U6IG1vZHVsZT0iTlBGTVQiIHJlcz0iTlBGTVQiIHNpemU9JWxkXG4iLAogICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgaFJzcmMsIHNpemUgKTsKICAgICBpZiAoIWhSc3JjKSByZXR1cm4gMDsKICAgICBpZiAoIShwTW9kdWxlID0gKFdPUkQgKilHbG9iYWxMb2NrKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKQEAgLTIzNCwyNjQgKzIyMywyMiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICBEaXJlY3RSZXNBbGxvYyAgICAoS0VSTkVMLjE2OCkKKyAqCiAgKiBDaGVjayBTY2h1bG1hbiwgcC4gMjMyIGZvciBkZXRhaWxzCiAgKi8KIEhBTkRMRSBEaXJlY3RSZXNBbGxvYyhIQU5ETEUgaEluc3RhbmNlLCBXT1JEIHdUeXBlLCBXT1JEIHdTaXplKQogewotCUhBTkRMRSBoTW9kdWxlOwotCWRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCJEaXJlY3RSZXNBbGxvYygleCwleCwleClcbiIsaEluc3RhbmNlLHdUeXBlLHdTaXplKTsKLQloTW9kdWxlID0gR2V0RXhlUHRyKGhJbnN0YW5jZSk7Ci0JaWYoIWhNb2R1bGUpcmV0dXJuIDA7Ci0JaWYod1R5cGUgIT0gMHgxMCkJLyogMHgxMCBpcyB0aGUgb25seSBvYnNlcnZlZCB2YWx1ZSwgcGFzc2VkIGZyb20KKyAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwiRGlyZWN0UmVzQWxsb2MoIk5QRk1UIiwleCwleClcbiIsaEluc3RhbmNlLHdUeXBlLHdTaXplKTsKKyAgICBoSW5zdGFuY2UgPSBHZXRFeGVQdHIoaEluc3RhbmNlKTsKKyAgICBpZighaEluc3RhbmNlKXJldHVybiAwOworICAgIGlmKHdUeXBlICE9IDB4MTApCS8qIDB4MTAgaXMgdGhlIG9ubHkgb2JzZXJ2ZWQgdmFsdWUsIHBhc3NlZCBmcm9tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVDdXJzb3JJbmRpcmVjdC4gKi8KLQkJZnByaW50ZihzdGRlcnIsICJEaXJlY3RSZXNBbGxvYzogd1R5cGUgPSAleFxuIiwgd1R5cGUpOwotCS8qIFRoaXMgaG9wZWZ1bGx5IGRvZXMgcGVyLW1vZHVsZSBhbGxvY2F0aW9uIHJhdGhlciB0aGFuIHBlci1pbnN0YW5jZSAqLwotCXJldHVybiBHTE9CQUxfQWxsb2MoR01FTV9GSVhFRCwgd1NpemUsIGhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRpcmVjdFJlc0FsbG9jOiB3VHlwZSA9ICV4XG4iLCB3VHlwZSk7CisgICAgcmV0dXJuIEdMT0JBTF9BbGxvYyhHTUVNX01PVkVBQkxFLCB3U2l6ZSwgaEluc3RhbmNlLCBGQUxTRSwgRkFMU0UsIEZBTFNFKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQlDb252ZXJ0Q29yZUJpdG1hcAotICovCi1IQklUTUFQIENvbnZlcnRDb3JlQml0bWFwKCBIREMgaGRjLCBCSVRNQVBDT1JFSEVBREVSICogaW1hZ2UgKQotewotICAgIEJJVE1BUElORk8gKiBibXBJbmZvOwotICAgIEhCSVRNQVAgaGJpdG1hcDsKLSAgICBjaGFyICogYml0czsKLSAgICBpbnQgaSwgc2l6ZSwgbl9jb2xvcnM7Ci0gICAKLSAgICBuX2NvbG9ycyA9IDEgPDwgaW1hZ2UtPmJjQml0Q291bnQ7Ci0gICAgaWYgKGltYWdlLT5iY0JpdENvdW50IDwgMjQpCi0gICAgewotCXNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgKyBuX2NvbG9ycyAqIHNpemVvZihSR0JRVUFEKTsJCi0JYml0cyA9IChjaGFyICopIChpbWFnZSArIDEpICsgKG5fY29sb3JzICogc2l6ZW9mKFJHQlRSSVBMRSkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCXNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7Ci0JYml0cyA9IChjaGFyICopIChpbWFnZSArIDEpOwotICAgIH0KLSAgICBibXBJbmZvID0gKEJJVE1BUElORk8gKikgbWFsbG9jKCBzaXplICk7Ci0KLSAgICBibXBJbmZvLT5ibWlIZWFkZXIuYmlTaXplICAgICAgICAgID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwotICAgIGJtcEluZm8tPmJtaUhlYWRlci5iaVdpZHRoICAgICAgICAgPSBpbWFnZS0+YmNXaWR0aDsKLSAgICBibXBJbmZvLT5ibWlIZWFkZXIuYmlIZWlnaHQgICAgICAgID0gaW1hZ2UtPmJjSGVpZ2h0OwotICAgIGJtcEluZm8tPmJtaUhlYWRlci5iaVBsYW5lcyAgICAgICAgPSBpbWFnZS0+YmNQbGFuZXM7Ci0gICAgYm1wSW5mby0+Ym1pSGVhZGVyLmJpQml0Q291bnQgICAgICA9IGltYWdlLT5iY0JpdENvdW50OwotICAgIGJtcEluZm8tPmJtaUhlYWRlci5iaUNvbXByZXNzaW9uICAgPSAwOwotICAgIGJtcEluZm8tPmJtaUhlYWRlci5iaVNpemVJbWFnZSAgICAgPSAwOwotICAgIGJtcEluZm8tPmJtaUhlYWRlci5iaVhQZWxzUGVyTWV0ZXIgPSAwOwotICAgIGJtcEluZm8tPmJtaUhlYWRlci5iaVlQZWxzUGVyTWV0ZXIgPSAwOwotICAgIGJtcEluZm8tPmJtaUhlYWRlci5iaUNsclVzZWQgICAgICAgPSAwOwotICAgIGJtcEluZm8tPmJtaUhlYWRlci5iaUNsckltcG9ydGFudCAgPSAwOwotCi0gICAgaWYgKGltYWdlLT5iY0JpdENvdW50IDwgMjQpCi0gICAgewotCVJHQlRSSVBMRSAqIG9sZE1hcCA9IChSR0JUUklQTEUgKikoaW1hZ2UgKyAxKTsKLQlSR0JRVUFEICogbmV3TWFwID0gYm1wSW5mby0+Ym1pQ29sb3JzOwotCWZvciAoaSA9IDA7IGkgPCBuX2NvbG9yczsgaSsrLCBvbGRNYXArKywgbmV3TWFwKyspCi0JewotCSAgICBuZXdNYXAtPnJnYlJlZCAgICAgID0gb2xkTWFwLT5yZ2J0UmVkOwotCSAgICBuZXdNYXAtPnJnYkdyZWVuICAgID0gb2xkTWFwLT5yZ2J0R3JlZW47Ci0JICAgIG5ld01hcC0+cmdiQmx1ZSAgICAgPSBvbGRNYXAtPnJnYnRCbHVlOwotCSAgICBuZXdNYXAtPnJnYlJlc2VydmVkID0gMDsKLQl9Ci0gICAgfQotCi0gICAgaGJpdG1hcCA9IENyZWF0ZURJQml0bWFwKCBoZGMsICZibXBJbmZvLT5ibWlIZWFkZXIsIENCTV9JTklULAotCQkJICAgICAgYml0cywgYm1wSW5mbywgRElCX1JHQl9DT0xPUlMgKTsKLSAgICBmcmVlKCBibXBJbmZvICk7Ci0gICAgcmV0dXJuIGhiaXRtYXA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCUNvbnZlcnRJbmZvQml0bWFwCi0gKi8KLUhCSVRNQVAJQ29udmVydEluZm9CaXRtYXAoIEhEQyBoZGMsIEJJVE1BUElORk8gKiBpbWFnZSApCi17Ci0gICAgY2hhciAqIGJpdHMgPSAoKGNoYXIgKilpbWFnZSkgKyBESUJfQml0bWFwSW5mb1NpemUoaW1hZ2UsIERJQl9SR0JfQ09MT1JTKTsKLSAgICByZXR1cm4gQ3JlYXRlRElCaXRtYXAoIGhkYywgJmltYWdlLT5ibWlIZWFkZXIsIENCTV9JTklULAotCQkJICAgYml0cywgaW1hZ2UsIERJQl9SR0JfQ09MT1JTICk7Ci19IAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCUxvYWRJY29uIFtVU0VSLjE3NF0KLSAqLwotSElDT04gTG9hZEljb24oIEhBTkRMRSBpbnN0YW5jZSwgU0VHUFRSIGljb25fbmFtZSApCi17Ci0gICAgSElDT04gCWhJY29uOwotICAgIEhSU1JDICAgICAgIGhSc3JjOwotICAgIEhBTkRMRSAJcnNjX21lbTsKLSAgICBXT1JEIAkqbHA7Ci0gICAgSUNPTkRFU0NSSVAgKmxwaWNvZGVzYzsKLSAgICBJQ09OQUxMT0MJKmxwaWNvOwotICAgIGludAkJd2lkdGgsIGhlaWdodDsKLSAgICBCSVRNQVBJTkZPIAkqYm1pOwotICAgIEJJVE1BUElORk9IRUFERVIgCSpiaWg7Ci0gICAgUkdCUVVBRAkqcmdicTsKLSAgICBIREMgCWhkYzsKLSAgICBCSVRNQVBJTkZPICpwSW5mbzsKLSAgICBjaGFyICpiaXRzOwotICAgIGludCBzaXplOwotCi0gICAgaWYgKEhJV09SRChpY29uX25hbWUpKQotICAgICAgICBkcHJpbnRmX3Jlc291cmNlKCBzdGRkZWIsICJMb2FkSWNvbjogJTA0eCAnJXMnXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgKGNoYXIgKilQVFJfU0VHX1RPX0xJTiggaWNvbl9uYW1lICkgKTsKLSAgICBlbHNlCi0gICAgICAgIGRwcmludGZfcmVzb3VyY2UoIHN0ZGRlYiwgIkxvYWRJY29uOiAlMDR4ICUwNHhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLCBMT1dPUkQoaWNvbl9uYW1lKSApOwotICAgIAotICAgIGlmICghaW5zdGFuY2UpCi0gICAgewotICAgICAgICBpZiAoSElXT1JEKChpbnQpaWNvbl9uYW1lKSkgcmV0dXJuIDA7IC8qIEZJWE1FOiBzaG91bGQgaGFuZGxlICcjeHh4JyAqLwotICAgICAgICByZXR1cm4gT0JNX0xvYWRJY29uKCBMT1dPUkQoKGludClpY29uX25hbWUpICk7Ci0gICAgfQotCi0gICAgaWYgKCEoaFJzcmMgPSBGaW5kUmVzb3VyY2UoIGluc3RhbmNlLCBpY29uX25hbWUsIFJUX0dST1VQX0lDT04pKSkgcmV0dXJuIDA7Ci0gICAgcnNjX21lbSA9IExvYWRSZXNvdXJjZSggaW5zdGFuY2UsIGhSc3JjICk7Ci0gICAgaWYgKHJzY19tZW0gPT0gKEhBTkRMRSlOVUxMKSB7Ci0JcHJpbnRmKCJMb2FkSWNvbiAvIEljb24gJTA4eCBub3QgRm91bmQgIVxuIiwgKGludCkgaWNvbl9uYW1lKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgbHAgPSAoV09SRCAqKUxvY2tSZXNvdXJjZShyc2NfbWVtKTsKLSAgICBscGljb2Rlc2MgPSAoSUNPTkRFU0NSSVAgKikobHAgKyAzKTsKLSAgICBoSWNvbiA9IEdsb2JhbEFsbG9jKEdNRU1fTU9WRUFCTEUsIHNpemVvZihJQ09OQUxMT0MpICsgMTAyNCk7Ci0gICAgaWYgKGhJY29uID09IChISUNPTilOVUxMKSB7Ci0gICAgICAgIEZyZWVSZXNvdXJjZSggcnNjX21lbSApOwotCXJldHVybiAwOwotICAgIH0KLSAgICBscGljbyA9IChJQ09OQUxMT0MgKilHbG9iYWxMb2NrKGhJY29uKTsKLSAgICBscGljby0+ZGVzY3JpcHRvciA9ICpscGljb2Rlc2M7Ci0gICAgd2lkdGggPSBscGljb2Rlc2MtPldpZHRoOwotICAgIGhlaWdodCA9IGxwaWNvZGVzYy0+SGVpZ2h0OwotICAgIEZyZWVSZXNvdXJjZSggcnNjX21lbSApOwotICAgIGlmICghKGhSc3JjID0gRmluZFJlc291cmNlKCBpbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VJTlRSRVNPVVJDRShscGljby0+ZGVzY3JpcHRvci5pY29ESUJPZmZzZXQpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUX0lDT04gKSkpIHJldHVybiAwOwotICAgIGlmICghKHJzY19tZW0gPSBMb2FkUmVzb3VyY2UoIGluc3RhbmNlLCBoUnNyYyApKSkgcmV0dXJuIDA7Ci0KLSAgICBibWkgPSAoQklUTUFQSU5GTyAqKUxvY2tSZXNvdXJjZShyc2NfbWVtKTsKLSAgICBzaXplID0gRElCX0JpdG1hcEluZm9TaXplKCBibWksIERJQl9SR0JfQ09MT1JTICk7Ci0gICAgcEluZm8gPSAoQklUTUFQSU5GTyAqKW1hbGxvYyggc2l6ZSApOwotICAgIG1lbWNweSggcEluZm8sIGJtaSwgc2l6ZSApOwotICAgIGJpaCA9ICZwSW5mby0+Ym1pSGVhZGVyOwotICAgIGJpaC0+YmlIZWlnaHQgLz0gMjsKLQotICAgIGlmICghKGhkYyA9IEdldERDKCAwICkpKSByZXR1cm4gMDsKLSAgICBpZiAoYmloLT5iaVNpemUgIT0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKSByZXR1cm4gMDsKLSAgICBscGljby0+aEJpdG1hcCA9IENyZWF0ZURJQml0bWFwKCBoZGMsICZwSW5mby0+Ym1pSGVhZGVyLCBDQk1fSU5JVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilibWkgKyBzaXplLCBwSW5mbywgRElCX1JHQl9DT0xPUlMgKTsKLQotICAgIGlmIChiaWgtPmJpQ29tcHJlc3Npb24gIT0gQklfUkdCKQotICAgIHsKLQlmcHJpbnRmKHN0ZGVyciwiVW5rbm93biBzaXplIGZvciBjb21wcmVzc2VkIEljb24gYml0bWFwLlxuIik7Ci0JRnJlZVJlc291cmNlKCByc2NfbWVtICk7Ci0JUmVsZWFzZURDKCAwLCBoZGMpOyAKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgYml0cyA9IChjaGFyICopYm1pICsgc2l6ZSArCi0gICAgICBESUJfR2V0SW1hZ2VXaWR0aEJ5dGVzKGJpaC0+YmlXaWR0aCxiaWgtPmJpQml0Q291bnQpICogYmloLT5iaUhlaWdodDsKLSAgICBiaWgtPmJpQml0Q291bnQgPSAxOwotICAgIGJpaC0+YmlDbHJVc2VkID0gYmloLT5iaUNsckltcG9ydGFudCA9IDI7Ci0gICAgcmdicSA9ICZwSW5mby0+Ym1pQ29sb3JzWzBdOwotICAgIHJnYnFbMF0ucmdiQmx1ZSA9IHJnYnFbMF0ucmdiR3JlZW4gPSByZ2JxWzBdLnJnYlJlZCA9IDB4MDA7Ci0gICAgcmdicVsxXS5yZ2JCbHVlID0gcmdicVsxXS5yZ2JHcmVlbiA9IHJnYnFbMV0ucmdiUmVkID0gMHhmZjsKLSAgICByZ2JxWzBdLnJnYlJlc2VydmVkID0gcmdicVsxXS5yZ2JSZXNlcnZlZCA9IDA7Ci0gICAgbHBpY28tPmhCaXRNYXNrID0gQ3JlYXRlRElCaXRtYXAoaGRjLCAmcEluZm8tPmJtaUhlYWRlciwgQ0JNX0lOSVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cywgcEluZm8sIERJQl9SR0JfQ09MT1JTICk7Ci0gICAgRnJlZVJlc291cmNlKCByc2NfbWVtICk7Ci0gICAgUmVsZWFzZURDKCAwLCBoZGMpOwotICAgIGZyZWUoIHBJbmZvICk7Ci0gICAgR2xvYmFsVW5sb2NrKGhJY29uKTsKLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwiTG9hZEljb24gQWxsb2MgaEljb249JVhcbiIsIGhJY29uKTsKLSAgICByZXR1cm4gaEljb247Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJQ3JlYXRlSWNvbiBbVVNFUi40MDddCi0gKi8KLUhJQ09OIENyZWF0ZUljb24oSEFORExFIGhJbnN0YW5jZSwgaW50IG5XaWR0aCwgaW50IG5IZWlnaHQsIAotICAgICAgICAgICAgICAgICBCWVRFIG5QbGFuZXMsIEJZVEUgbkJpdHNQaXhlbCwgTFBTVFIgbHBBTkRiaXRzLCAKLSAgICAgICAgICAgICAgICAgTFBTVFIgbHBYT1JiaXRzKQotewotICAgIEhJQ09OIAloSWNvbjsKLSAgICBJQ09OQUxMT0MJKmxwaWNvOwotCi0gICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJDcmVhdGVJY29uOiBoSW5zdGFuY2UgPSAlMDR4LCBuV2lkdGggPSAlMDh4LCBuSGVpZ2h0ID0gJTA4eCBcbiIsCi0JICAgIGhJbnN0YW5jZSwgbldpZHRoLCBuSGVpZ2h0KTsKLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIiAgblBsYW5lcyA9ICUwNHgsIG5CaXRzUGl4ZWwgPSAlMDR4LCIsblBsYW5lcywgbkJpdHNQaXhlbCk7Ci0gICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICIgbHBBTkRiaXRzPSAlMDR4LCBscFhPUmJpdHMgPSAlMDR4LCBcbiIsIChpbnQpbHBBTkRiaXRzLAotICAgIAkJKGludClscFhPUmJpdHMpOwotCi0gICAgaWYgKGhJbnN0YW5jZSA9PSAoSEFORExFKU5VTEwpIHsgCi0gICAgICAgIHByaW50ZigiQ3JlYXRlSWNvbiAvIGhJbnN0YW5jZSAlMDR4IG5vdCBGb3VuZCFcbiIsaEluc3RhbmNlKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0JfQotICAgIGhJY29uID0gR2xvYmFsQWxsb2MoR01FTV9NT1ZFQUJMRSwgc2l6ZW9mKElDT05BTExPQykgKyAxMDI0KTsKLSAgICBpZiAoaEljb24gPT0gKEhJQ09OKU5VTEwpIHsKLQlwcmludGYoIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgSWNvbiBpbiBDcmVhdGVJY29uXG4iKTsKLQlyZXR1cm4gMDsKLQl9Ci0gICAgbHBpY289IChJQ09OQUxMT0MgKilHbG9iYWxMb2NrKGhJY29uKTsKLQotICAgIGxwaWNvLT5kZXNjcmlwdG9yLldpZHRoPW5XaWR0aDsKLSAgICBscGljby0+ZGVzY3JpcHRvci5IZWlnaHQ9bkhlaWdodDsKLSAgICBscGljby0+ZGVzY3JpcHRvci5Db2xvckNvdW50PTE2OyAvKiBEdW1teSBWYWx1ZSAqLyAKLSAgICBscGljby0+ZGVzY3JpcHRvci5SZXNlcnZlZDE9MDsKLSAgICBscGljby0+ZGVzY3JpcHRvci5SZXNlcnZlZDI9blBsYW5lczsKLSAgICBscGljby0+ZGVzY3JpcHRvci5SZXNlcnZlZDM9bldpZHRoKm5IZWlnaHQ7Ci0KLSAgICAvKiBlaXRoZXIgblBsYW5lcyBhbmQvb3IgbkJpdENvdW50IGlzIHNldCB0byBvbmUgKi8KLSAgICBscGljby0+ZGVzY3JpcHRvci5pY29ESUJTaXplPW5XaWR0aCpuSGVpZ2h0Km5QbGFuZXMqbkJpdHNQaXhlbDsgCi0gICAgbHBpY28tPmRlc2NyaXB0b3IuaWNvRElCT2Zmc2V0PTA7IAotCi0gICAgaWYoICEobHBpY28tPmhCaXRtYXA9Q3JlYXRlQml0bWFwKG5XaWR0aCwgbkhlaWdodCwgblBsYW5lcywgbkJpdHNQaXhlbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscFhPUmJpdHMpKSApIHsKLSAgICAgIHByaW50ZigiQ3JlYXRlSWNvbjogY291bGRuJ3QgY3JlYXRlIHRoZSBYT1IgYml0bWFwXG4iKTsKLSAgICAgIHJldHVybigwKTsKLSAgICB9Ci0gICAgCi0gICAgLyogdGhlIEFORCBCaXRNYXNrIGlzIGFsd2F5cyBtb25vY2hyb21lICovCi0gICAgaWYoICEobHBpY28tPmhCaXRNYXNrPUNyZWF0ZUJpdG1hcChuV2lkdGgsIG5IZWlnaHQsIDEsIDEsIGxwQU5EYml0cykpICkgewotICAgICAgcHJpbnRmKCJDcmVhdGVJY29uOiBjb3VsZG4ndCBjcmVhdGUgdGhlIEFORCBiaXRtYXBcbiIpOwotICAgICAgcmV0dXJuKDApOwotICAgIH0KLQotICAgIEdsb2JhbFVubG9jayhoSWNvbik7Ci0gICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJDcmVhdGVJY29uIEFsbG9jIGhJY29uPSVYXG4iLCBoSWNvbik7Ci0gICAgcmV0dXJuIGhJY29uOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJRGVzdHJveUljb24gW1VTRVIuNDU3XQotICovCi1CT09MIERlc3Ryb3lJY29uKEhJQ09OIGhJY29uKQotewotICAgIElDT05BTExPQwkqbHBpY287Ci0gICAgCi0gICAgaWYgKGhJY29uID09IChISUNPTilOVUxMKQotICAgIAlyZXR1cm4gRkFMU0U7Ci0gICAgbHBpY28gPSAoSUNPTkFMTE9DICopR2xvYmFsTG9jayhoSWNvbik7Ci0gICAgaWYgKGxwaWNvLT5oQml0bWFwICE9IChIQklUTUFQKU5VTEwpIAotICAgIAlEZWxldGVPYmplY3QobHBpY28tPmhCaXRtYXApOwotICAgIEdsb2JhbEZyZWUoaEljb24pOwotICAgIHJldHVybiBUUlVFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgRHVtcEljb24gW1VTRVIuNDU5XQotICovCi1EV09SRCBEdW1wSWNvbih2b2lkKiBjdXJzb3JJY29uSW5mbywgV09SRCBGQVIgKmxwTGVuLCBMUFNUUiBGQVIgKmxwWG9yQml0cywKLQlMUFNUUiBGQVIgKmxwQW5kTWFzaykKLXsKLQlkcHJpbnRmX3Jlc291cmNlKHN0ZG5pbXAsIkR1bXBJY29uOiBFbXB0eSBTdHViISEhXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJTG9hZEFjY2VsZXJhdG9ycwlbVVNFUi4xNzddCiAgKi8KIEhBTkRMRSBMb2FkQWNjZWxlcmF0b3JzKEhBTkRMRSBpbnN0YW5jZSwgU0VHUFRSIGxwVGFibGVOYW1lKQpAQCAtNTA0LDEwICsyNTEsMTAgQEAKICAgICBpbnQgCWksIG47CiAKICAgICBpZiAoSElXT1JEKGxwVGFibGVOYW1lKSkKLSAgICAgICAgZHByaW50Zl9hY2NlbCggc3RkZGViLCAiTG9hZEFjY2VsZXJhdG9yczogJTA0eCAnJXMnXG4iLAorICAgICAgICBkcHJpbnRmX2FjY2VsKCBzdGRkZWIsICJMb2FkQWNjZWxlcmF0b3JzOiAiTlBGTVQiICclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIChjaGFyICopUFRSX1NFR19UT19MSU4oIGxwVGFibGVOYW1lICkgKTsKICAgICBlbHNlCi0gICAgICAgIGRwcmludGZfYWNjZWwoIHN0ZGRlYiwgIkxvYWRBY2NlbGVyYXRvcnM6ICUwNHggJTA0eFxuIiwKKyAgICAgICAgZHByaW50Zl9hY2NlbCggc3RkZGViLCAiTG9hZEFjY2VsZXJhdG9yczogIk5QRk1UIiAlMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgTE9XT1JEKGxwVGFibGVOYW1lKSApOwogCiAgICAgaWYgKCEoaFJzcmMgPSBGaW5kUmVzb3VyY2UoIGluc3RhbmNlLCBscFRhYmxlTmFtZSwgUlRfQUNDRUxFUkFUT1IgKSkpCkBAIC01NTMsNyArMzAwLDcgQEAKIAltc2ctPm1lc3NhZ2UgIT0gV01fU1lTS0VZVVAgJiYKICAgICAJbXNnLT5tZXNzYWdlICE9IFdNX0NIQVIpIHJldHVybiAwOwogCi0gICAgZHByaW50Zl9hY2NlbChzdGRkZWIsICJUcmFuc2xhdGVBY2NlbGVyYXRvcnMgaEFjY2VsPSUwNFggIVxuIiwgaEFjY2VsKTsKKyAgICBkcHJpbnRmX2FjY2VsKHN0ZGRlYiwgIlRyYW5zbGF0ZUFjY2VsZXJhdG9ycyBoQWNjZWw9Ik5QRk1UIiAhXG4iLCBoQWNjZWwpOwogCiAgICAgbHBBY2NlbFRibCA9IChMUEFDQ0VMSEVBREVSKUdsb2JhbExvY2soaEFjY2VsKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgbHBBY2NlbFRibC0+d0NvdW50OyBpKyspIHsKQEAgLTYwMCw3ICszNDcsNyBAQAogICAgIGludCBzdHJpbmdfbnVtOwogICAgIGludCBpOwogCi0gICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJMb2FkU3RyaW5nOiBpbnN0YW5jZSA9ICUwNHgsIGlkID0gJWQsIGJ1ZmZlciA9ICUwOHgsICIKKyAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIkxvYWRTdHJpbmc6IGluc3RhbmNlID0gIk5QRk1UIiwgaWQgPSAlMDR4LCBidWZmZXIgPSAlMDh4LCAiCiAJICAgImxlbmd0aCA9ICVkXG4iLCBpbnN0YW5jZSwgcmVzb3VyY2VfaWQsIChpbnQpIGJ1ZmZlciwgYnVmbGVuKTsKIAogICAgIGhyc3JjID0gRmluZFJlc291cmNlKCBpbnN0YW5jZSwgKFNFR1BUUikoKHJlc291cmNlX2lkPj40KSsxKSwgUlRfU1RSSU5HICk7CmRpZmYgLS1naXQgYS9sb2FkZXIvc2lnbmFsLmMgYi9sb2FkZXIvc2lnbmFsLmMKaW5kZXggZDk0M2JjNS4uM2E1NjBjNSAxMDA2NDQKLS0tIGEvbG9hZGVyL3NpZ25hbC5jCisrKyBiL2xvYWRlci9zaWduYWwuYwpAQCAtNyw3ICs3LDcgQEAKICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8c2V0am1wLmg+CiAKLSNpZiBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCisjaWYgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fc3ZyNF9fKQogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiAjZWxzZQpAQCAtNDUsNyArNDUsNyBAQAogI2VuZGlmCiAKIAotI2lmZGVmIGxpbnV4CisjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX3N2cjRfXykKIHN0YXRpYyB2b2lkIHdpbl9mYXVsdChpbnQgc2lnbmFsLCBzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgY29udGV4dF9zdHJ1Y3QpCiB7CiAgICAgc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0ID0gJmNvbnRleHRfc3RydWN0OwpkaWZmIC0tZ2l0IGEvbG9hZGVyL3Rhc2suYyBiL2xvYWRlci90YXNrLmMKaW5kZXggYjIxODBmNC4uYWU4ZTJkNSAxMDA2NDQKLS0tIGEvbG9hZGVyL3Rhc2suYworKysgYi9sb2FkZXIvdGFzay5jCkBAIC00MiwxMiArNDIsMTUgQEAKICAgLyogVEFTS19SZXNjaGVkdWxlKCkgMTYtYml0IGVudHJ5IHBvaW50ICovCiBzdGF0aWMgRkFSUFJPQyBUQVNLX1Jlc2NoZWR1bGVQcm9jOwogCisjaWZkZWYgV0lORUxJQgorI2RlZmluZSBUQVNLX1NDSEVEVUxFKCkgIFRBU0tfUmVzY2hlZHVsZSgpOworI2Vsc2UKICNkZWZpbmUgVEFTS19TQ0hFRFVMRSgpICBDYWxsVG8xNl93b3JkXyhUQVNLX1Jlc2NoZWR1bGVQcm9jLDApCisjZW5kaWYKIAogCiBzdGF0aWMgSEFORExFIFRBU0tfQ3JlYXRlRE9TRW52aXJvbm1lbnQodm9pZCk7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVEFTS19Jbml0CiAgKi8KQEAgLTMyOCw2ICszMzEsMTAgQEAKICAgICBjc19yZWcgPSBwU2VnVGFibGVbcE1vZHVsZS0+Y3MgLSAxXS5zZWxlY3RvcjsKICAgICBpcF9yZWcgPSBwTW9kdWxlLT5pcDsKICAgICBkc19yZWcgPSBwU2VnVGFibGVbcE1vZHVsZS0+ZGdyb3VwIC0gMV0uc2VsZWN0b3I7CisjaWZuZGVmIFdJTkVMSUIKKy8qIEpCUDogSSBkb3VidCBhIENhbGxUbzE2X3JlZ3NfIGlzIHBvc3NpYmxlIGluIGxpYndpbmUuYSwgYW5kIElGMTYzMiBpcyBub3QKKyAqICAgICAgYWxsb3dlZC4KKyAqLwogICAgIElGMTYzMl9TYXZlZDE2X3NzID0gcFRhc2stPnNzOwogICAgIElGMTYzMl9TYXZlZDE2X3NwID0gcFRhc2stPnNwOwogICAgIGRwcmludGZfdGFzayggc3RkZGViLCAiU3RhcnRpbmcgbWFpbiBwcm9ncmFtOiBjczppcD0lMDR4OiUwNHggZHM9JTA0eCBzczpzcD0lMDR4OiUwNHhcbiIsCkBAIC0zMzgsNiArMzQ1LDExIEBACiAgICAgICAgICAgICAgICAgICAgcFRhc2stPmhQREIgLyplcyovLCAwIC8qYnAqLywgMCAvKmF4Ki8sCiAgICAgICAgICAgICAgICAgICAgcE1vZHVsZS0+c3RhY2tfc2l6ZSAvKmJ4Ki8sIHBNb2R1bGUtPmhlYXBfc2l6ZSAvKmN4Ki8sCiAgICAgICAgICAgICAgICAgICAgMCAvKmR4Ki8sIDAgLypzaSovLCBkc19yZWcgLypkaSovICk7CisjZWxzZQorICAgIGZwcmludGYoc3RkZXJyLCAiSkJQOiBJZ25vcmluZyBtYWluIHByb2dyYW06IGNzOmlwPSUwNHg6JTA0eCBkcz0lMDR4IHNzOnNwPSUwNHg6JTA0eFxuIiwKKyAgICAgICAgICAgICAgICAgY3NfcmVnLCBpcF9yZWcsIGRzX3JlZywKKyAgICAgICAgICAgICAgICAgcFRhc2stPnNzLCBwVGFzay0+c3ApOworI2VuZGlmCiAgICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuICovCiAgICAgZnByaW50Ziggc3RkZXJyLCAiVEFTS19DYWxsVG9TdGFydDogTWFpbiBwcm9ncmFtIHJldHVybmVkIVxuIiApOwogICAgIFRBU0tfS2lsbEN1cnJlbnRUYXNrKCAxICk7CkBAIC0zNTYsMTEgKzM2OCwxMyBAQAogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKICAgICBTRUdUQUJMRUVOVFJZICpwU2VnVGFibGU7CiAgICAgTFBTVFIgbmFtZTsKKyAgICBjaGFyIGZpbGVuYW1lWzI1Nl07CisjaWZuZGVmIFdJTkVMSUIzMgogICAgIGNoYXIgKnN0YWNrMTZUb3AsICpzdGFjazMyVG9wOwogICAgIFNUQUNLMTZGUkFNRSAqZnJhbWUxNjsKICAgICBTVEFDSzMyRlJBTUUgKmZyYW1lMzI7CiAgICAgZXh0ZXJuIERXT1JEIENBTEwxNl9SZXRBZGRyX3dvcmQ7Ci0gICAgY2hhciBmaWxlbmFtZVsyNTZdOworI2VuZGlmCiAgICAgCiAgICAgaWYgKCEocE1vZHVsZSA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKICAgICBwU2VnVGFibGUgPSBORV9TRUdfVEFCTEUoIHBNb2R1bGUgKTsKQEAgLTQyNCw5ICs0MzgsMTEgQEAKICAgICBwVGFzay0+cGRiLmludDIwID0gMHgyMGNkOwogICAgIHBUYXNrLT5wZGIuZGlzcGF0Y2hlclswXSA9IDB4OWE7ICAvKiBsam1wICovCiAgICAgKihEV09SRCAqKSZwVGFzay0+cGRiLmRpc3BhdGNoZXJbMV0gPSBNT0RVTEVfR2V0RW50cnlQb2ludCggR2V0TW9kdWxlSGFuZGxlKCJLRVJORUwiKSwgMTAyICk7ICAvKiBLRVJORUwuMTAyIGlzIERPUzNDYWxsKCkgKi8KKyNpZm5kZWYgV0lORUxJQgogICAgIHBUYXNrLT5wZGIuc2F2ZWRpbnQyMiA9IElOVF9HZXRIYW5kbGVyKCAweDIyICk7CiAgICAgcFRhc2stPnBkYi5zYXZlZGludDIzID0gSU5UX0dldEhhbmRsZXIoIDB4MjMgKTsKICAgICBwVGFzay0+cGRiLnNhdmVkaW50MjQgPSBJTlRfR2V0SGFuZGxlciggMHgyNCApOworI2VuZGlmCiAgICAgcFRhc2stPnBkYi5lbnZpcm9ubWVudCA9IGhFbnZpcm9ubWVudDsKICAgICBzdHJuY3B5KCBwVGFzay0+cGRiLmNtZExpbmUgKyAxLCBjbWRMaW5lLCAxMjYgKTsKICAgICBwVGFzay0+cGRiLmNtZExpbmVbMTI3XSA9ICdcMCc7CkBAIC00NTgsNiArNDc0LDcgQEAKIAogICAgICAgLyogQWxsb2NhdGUgdGhlIDMyLWJpdCBzdGFjayAqLwogCisjaWZuZGVmIFdJTkVMSUIKICAgICBwVGFzay0+aFN0YWNrMzIgPSBHTE9CQUxfQWxsb2MoIEdNRU1fRklYRUQsIFNUQUNLMzJfU0laRSwgcFRhc2stPmhQREIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgRkFMU0UsIEZBTFNFICk7CiAKQEAgLTUxMywxMiArNTMwLDEzIEBACiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlRhc2sgJyVzJzogIiwgbmFtZSApOwogICAgICAgICBERUJVR19BZGRCcmVha3BvaW50KCAmYWRkciApOwogICAgIH0KKyNlbmRpZgogCiAgICAgICAvKiBBZGQgdGhlIHRhc2sgdG8gdGhlIGxpbmtlZCBsaXN0ICovCiAKICAgICBUQVNLX0xpbmtUYXNrKCBoVGFzayApOwogCi0gICAgZHByaW50Zl90YXNrKCBzdGRkZWIsICJDcmVhdGVUYXNrOiBtb2R1bGU9JyVzJyBjbWRsaW5lPSclcycgdGFzaz0lMDR4XG4iLAorICAgIGRwcmludGZfdGFzayggc3RkZGViLCAiQ3JlYXRlVGFzazogbW9kdWxlPSclcycgY21kbGluZT0nJXMnIHRhc2s9Ik5QRk1UIlxuIiwKICAgICAgICAgICAgICAgICAgIG5hbWUsIGNtZExpbmUsIGhUYXNrICk7CiAKICAgICByZXR1cm4gaFRhc2s7CkBAIC02NDYsMTEgKzY2NCwxMiBAQAogICAgIGlmICghaFRhc2spIHJldHVybjsgIC8qIERvIG5vdGhpbmcgKi8KIAogICAgIHBOZXdUYXNrID0gKFREQiAqKUdsb2JhbExvY2soIGhUYXNrICk7Ci0gICAgZHByaW50Zl90YXNrKCBzdGRkZWIsICJTd2l0Y2hpbmcgdG8gdGFzayAlMDR4ICglLjhzKVxuIiwKKyAgICBkcHJpbnRmX3Rhc2soIHN0ZGRlYiwgIlN3aXRjaGluZyB0byB0YXNrICJOUEZNVCIgKCUuOHMpXG4iLAogICAgICAgICAgICAgICAgICAgaFRhc2ssIHBOZXdUYXNrLT5tb2R1bGVfbmFtZSApOwogCiAgICAgICAvKiBTYXZlIHRoZSBzdGFja3Mgb2YgdGhlIHByZXZpb3VzIHRhc2sgKGlmIGFueSkgKi8KIAorI2lmbmRlZiBXSU5FTElCIC8qIEZJWE1FOiBKQlA6IElGMTYzMiBub3QgYWxsb3dlZCBpbiBsaWJ3aW5lLmEgKi8KICAgICBpZiAocE9sZFRhc2spCiAgICAgewogICAgICAgICBwT2xkVGFzay0+c3MgID0gSUYxNjMyX1NhdmVkMTZfc3M7CkBAIC02NTgsNiArNjc3LDcgQEAKICAgICAgICAgcE9sZFRhc2stPmVzcCA9IElGMTYzMl9TYXZlZDMyX2VzcDsKICAgICB9CiAgICAgZWxzZSBJRjE2MzJfT3JpZ2luYWwzMl9lc3AgPSBJRjE2MzJfU2F2ZWQzMl9lc3A7CisjZW5kaWYKIAogICAgICAvKiBNYWtlIHRoZSB0YXNrIHRoZSBsYXN0IGluIHRoZSBsaW5rZWQgbGlzdCAocm91bmQtcm9iaW4gc2NoZWR1bGluZykgKi8KIApAQCAtNjY5LDEwICs2ODksMTIgQEAKICAgICAgIC8qIFN3aXRjaCB0byB0aGUgbmV3IHN0YWNrICovCiAKICAgICBoQ3VycmVudFRhc2sgPSBoVGFzazsKKyNpZm5kZWYgV0lORUxJQiAvKiBGSVhNRTogSkJQOiBJRjE2MzIgbm90IGFsbG93ZWQgaW4gbGlid2luZS5hICovCiAgICAgSUYxNjMyX1NhdmVkMTZfc3MgICA9IHBOZXdUYXNrLT5zczsKICAgICBJRjE2MzJfU2F2ZWQxNl9zcCAgID0gcE5ld1Rhc2stPnNwOwogICAgIElGMTYzMl9TYXZlZDMyX2VzcCAgPSBwTmV3VGFzay0+ZXNwOwogICAgIElGMTYzMl9TdGFjazMyX2Jhc2UgPSBXSU4xNl9HbG9iYWxMb2NrKCBwTmV3VGFzay0+aFN0YWNrMzIgKTsKKyNlbmRpZgogfQogCiAKQEAgLTcyMiw5ICs3NDQsOSBAQAogICAgIGNvbnRleHQuc2NfZWJ4ID0gMHg4MTsKICAgICBjb250ZXh0LnNjX2VjeCA9IHBNb2R1bGUtPnN0YWNrX3NpemU7CiAgICAgY29udGV4dC5zY19lZHggPSBwVGFzay0+bkNtZFNob3c7Ci0gICAgY29udGV4dC5zY19lc2kgPSBwVGFzay0+aFByZXZJbnN0YW5jZTsKLSAgICBjb250ZXh0LnNjX2VkaSA9IHBUYXNrLT5oSW5zdGFuY2U7Ci0gICAgY29udGV4dC5zY19lcyAgPSBwVGFzay0+aFBEQjsKKyAgICBjb250ZXh0LnNjX2VzaSA9IChEV09SRClwVGFzay0+aFByZXZJbnN0YW5jZTsKKyAgICBjb250ZXh0LnNjX2VkaSA9IChEV09SRClwVGFzay0+aEluc3RhbmNlOworICAgIGNvbnRleHQuc2NfZXMgID0gKFdPUkQpcFRhc2stPmhQREI7CiAKICAgICAvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBoZWFwICovCiAgICAgaWYgKCBwTW9kdWxlLT5oZWFwX3NpemUgKQpAQCAtNzQxLDcgKzc2Myw5IEBACiAgICAgcGluc3RhbmNlID0gKElOU1RBTkNFREFUQSAqKVBUUl9TRUdfT0ZGX1RPX0xJTihDVVJSRU5UX0RTLCAwKTsKICAgICBwaW5zdGFuY2UtPnN0YWNrYm90dG9tID0gc3RhY2toaTsgLyogeXVwLCB0aGF0J3MgcmlnaHQuIENvbmZ1c2VkIG1lIHRvby4gKi8KICAgICBwaW5zdGFuY2UtPnN0YWNrdG9wICAgID0gc3RhY2tsb3c7IAorI2lmbmRlZiBXSU5FTElCIC8qIEZJWE1FOiBKQlA6IElGMTYzMiBub3QgYWxsb3dlZCBpbiBsaWJ3aW5lLmEgKi8KICAgICBwaW5zdGFuY2UtPnN0YWNrbWluICAgID0gSUYxNjMyX1NhdmVkMTZfc3A7CisjZW5kaWYKIH0KIAogCkBAIC04NjksMTIgKzg5MywxNCBAQAogICAgIGlmICghdGh1bmthZGRyKSByZXR1cm4gKEZBUlBST0MpMDsKICAgICB0aHVuayA9IFBUUl9TRUdfVE9fTElOKCB0aHVua2FkZHIgKTsKIAotICAgIGRwcmludGZfdGFzayggc3RkZGViLCAiTWFrZVByb2NJbnN0YW5jZSglMDhseCwlMDR4KTogZ290IHRodW5rICUwOGx4XG4iLAorICAgIGRwcmludGZfdGFzayggc3RkZGViLCAiTWFrZVByb2NJbnN0YW5jZSglMDhseCwiTlBGTVQiKTogZ290IHRodW5rICUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgKFNFR1BUUilmdW5jLCBoSW5zdGFuY2UsIChTRUdQVFIpdGh1bmthZGRyICk7CiAgICAgCiAgICAgKnRodW5rKysgPSAweGI4OyAgICAvKiBtb3Z3IGluc3RhbmNlLCAlYXggKi8KKyNpZm5kZWYgV0lORUxJQgogICAgICp0aHVuaysrID0gKEJZVEUpKGhJbnN0YW5jZSAmIDB4ZmYpOwogICAgICp0aHVuaysrID0gKEJZVEUpKGhJbnN0YW5jZSA+PiA4KTsKKyNlbmRpZgogICAgICp0aHVuaysrID0gMHhlYTsgICAgLyogbGptcCBmdW5jICovCiAgICAgKihEV09SRCAqKXRodW5rID0gKERXT1JEKWZ1bmM7CiAgICAgcmV0dXJuIChGQVJQUk9DKXRodW5rYWRkcjsKQEAgLTkwOCw3ICs5MzQsNyBAQAogICAgIGVsc2UKICAgICAgICAgaGFuZGxlID0gR2xvYmFsSGFuZGxlKCBISVdPUkQocHJvYykgKTsKIAotICAgIHByaW50ZiggIlNUVUI6IEdldENvZGVIYW5kbGUoJTA4bHgpIHJldHVybmluZyAlMDR4XG4iLAorICAgIHByaW50ZiggIlNUVUI6IEdldENvZGVIYW5kbGUoJTA4bHgpIHJldHVybmluZyAiTlBGTVQiXG4iLAogICAgICAgICAgICAgKERXT1JEKXByb2MsIGhhbmRsZSApOwogICAgIHJldHVybiBoYW5kbGU7CiB9CkBAIC05NDksMTQgKzk3NSwxOCBAQAogSFRBU0sgR2V0Q3VycmVudFRhc2sodm9pZCkKIHsKICAgICAgIC8qIFVuZG9jdW1lbnRlZDogZmlyc3QgdGFzayBpcyByZXR1cm5lZCBpbiBoaWdoIHdvcmQgKi8KKyNpZmRlZiBXSU5FTElCMzIKKyAgICByZXR1cm4gaEN1cnJlbnRUYXNrOworI2Vsc2UKICAgICByZXR1cm4gTUFLRUxPTkcoIGhDdXJyZW50VGFzaywgaEZpcnN0VGFzayApOworI2VuZGlmCiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0Q3VycmVudFBEQiAgIChLRVJORUwuMzcpCiAgKi8KLVdPUkQgR2V0Q3VycmVudFBEQih2b2lkKQorSEFORExFIEdldEN1cnJlbnRQREIodm9pZCkKIHsKICAgICBUREIgKnBUYXNrOwogCkBAIC05ODYsNyArMTAxNiw3IEBACiAgICAgVERCICpwVGFzazsKIAogICAgIGlmICghKHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2soIGhDdXJyZW50VGFzayApKSkgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIFdJTjE2X0dsb2JhbExvY2soIHBUYXNrLT5wZGIuZW52aXJvbm1lbnQgKTsKKyAgICByZXR1cm4gKFNFR1BUUilXSU4xNl9HbG9iYWxMb2NrKCBwVGFzay0+cGRiLmVudmlyb25tZW50ICk7CiB9CiAKIApAQCAtMTAwMiw3ICsxMDMyLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldFRhc2tEUyAgIChLRVJORUwuMTU1KQogICovCi1XT1JEIEdldFRhc2tEUyh2b2lkKQorSElOU1RBTkNFIEdldFRhc2tEUyh2b2lkKQogewogICAgIFREQiAqcFRhc2s7CiAKQEAgLTEwNDAsNyArMTA3MCwxMiBAQAogCiAgICAgICAvKiBDaGVjayB0aGUgb3duZXIgZm9yIG1vZHVsZSBoYW5kbGUgKi8KIAorI2lmbmRlZiBXSU5FTElCCiAgICAgb3duZXIgPSBGYXJHZXRPd25lciggaGFuZGxlICk7CisjZWxzZQorICAgIG93bmVyID0gTlVMTDsKKyAgICBmcHJpbnRmKHN0ZGVyciwiSkJQOiBGYXJHZXRPd25lcigpIGlnbm9yZWQuXG4iKTsKKyNlbmRpZgogICAgIGlmICghKHB0ciA9IEdsb2JhbExvY2soIG93bmVyICkpKSByZXR1cm4gMDsKICAgICBpZiAoKChORV9NT0RVTEUgKilwdHIpLT5tYWdpYyA9PSBORV9TSUdOQVRVUkUpIHJldHVybiBvd25lcjsKIApAQCAtMTA4Miw3ICsxMTE3LDcgQEAKICAgICBUREIgKnBUYXNrOwogICAgIElOU1RBTkNFREFUQSAqcEluc3REYXRhOwogCi0gICAgZHByaW50Zl90b29saGVscCggc3RkZGViLCAiVGFza05leHQoJXApOiB0YXNrPSUwNHhcbiIsIGxwdGUsIGxwdGUtPmhOZXh0ICk7CisgICAgZHByaW50Zl90b29saGVscCggc3RkZGViLCAiVGFza05leHQoJXApOiB0YXNrPSJOUEZNVCJcbiIsIGxwdGUsIGxwdGUtPmhOZXh0ICk7CiAgICAgaWYgKCFscHRlLT5oTmV4dCkgcmV0dXJuIEZBTFNFOwogICAgIHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2soIGxwdGUtPmhOZXh0ICk7CiAgICAgaWYgKCFwVGFzayB8fCBwVGFzay0+bWFnaWMgIT0gVERCX01BR0lDKSByZXR1cm4gRkFMU0U7CmRpZmYgLS1naXQgYS9tZW1vcnkvSW1ha2VmaWxlIGIvbWVtb3J5L0ltYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3MzhkMS4uMDAwMDAwMAotLS0gYS9tZW1vcnkvSW1ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI2luY2x1ZGUgIi4uL1dpbmUudG1wbCIKLQotTU9EVUxFID0gbWVtb3J5Ci0KLVNSQ1MgPSBcCi0JYXRvbS5jIFwKLQlnbG9iYWwuYyBcCi0JbGR0LmMgXAotCWxvY2FsLmMgXAotCXNlbGVjdG9yLmMKLQotT0JKUyA9ICQoU1JDUzouYz0ubykKLQotV2luZVJlbG9jYXRhYmxlVGFyZ2V0KCQoTU9EVUxFKSwsJChPQkpTKSkKLURlcGVuZFRhcmdldCgpCi0KLWluY2x1ZGVzOjoKLQotaW5zdGFsbDo6CmRpZmYgLS1naXQgYS9tZW1vcnkvZ2xvYmFsLmMgYi9tZW1vcnkvZ2xvYmFsLmMKaW5kZXggODNmMGRkYS4uMDY4OWM4OCAxMDA2NDQKLS0tIGEvbWVtb3J5L2dsb2JhbC5jCisrKyBiL21lbW9yeS9nbG9iYWwuYwpAQCAtNDA5LDcgKzQwOSw3IEBACiAgKgogICogVGhpcyBpcyB0aGUgR2xvYmFsTG9jaygpIGZ1bmN0aW9uIHVzZWQgYnkgMzItYml0IGNvZGUuCiAgKi8KLUxQU1RSIEdsb2JhbExvY2soIEhHTE9CQUwgaGFuZGxlICkKK0xQVk9JRCBHbG9iYWxMb2NrKCBIR0xPQkFMIGhhbmRsZSApCiB7CiAgICAgaWYgKCFoYW5kbGUpIHJldHVybiAwOwogI2lmZGVmIENPTkZJR19JUEMKQEAgLTQ0Niw3ICs0NDYsNyBAQAogRFdPUkQgR2xvYmFsSGFuZGxlKCBXT1JEIHNlbCApCiB7CiAgICAgZHByaW50Zl9nbG9iYWwoIHN0ZGRlYiwgIkdsb2JhbEhhbmRsZTogJTA0eFxuIiwgc2VsICk7Ci0gICAgcmV0dXJuIE1BS0VMT05HKCBHRVRfQVJFTkFfUFRSKHNlbCktPmhhbmRsZSwgc2VsICk7CisgICAgcmV0dXJuIE1BS0VMT05HKCBHRVRfQVJFTkFfUFRSKHNlbCktPmhhbmRsZSwgR2xvYmFsSGFuZGxlVG9TZWwoc2VsKSApOwogfQogCiAKZGlmZiAtLWdpdCBhL21lbW9yeS9sZHQuYyBiL21lbW9yeS9sZHQuYwppbmRleCAyYjA3ODkzLi45NTAwZjJiIDEwMDY0NAotLS0gYS9tZW1vcnkvbGR0LmMKKysrIGIvbWVtb3J5L2xkdC5jCkBAIC03LDcgKzcsMTEgQEAKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgX19zdnI0X18KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCiAjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgpAQCAtMjIsNiArMjYsMTAgQEAKIAogX3N5c2NhbGwzKGludCwgbW9kaWZ5X2xkdCwgaW50LCBmdW5jLCB2b2lkICosIHB0ciwgdW5zaWduZWQgbG9uZywgYnl0ZWNvdW50KQogI2VuZGlmICAvKiBsaW51eCAqLworI2lmZGVmIF9fc3ZyNF9fCisjaW5jbHVkZSA8c3lzL3N5c2k4Ni5oPgorI2luY2x1ZGUgPHN5cy9zZWcuaD4KKyNlbmRpZgogCiAjaWYgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogI2luY2x1ZGUgPG1hY2hpbmUvc2VnbWVudHMuaD4KQEAgLTE0OCw2ICsxNTYsMzUgQEAKICAgICAgICAgfQogICAgIH0KICNlbmRpZiAgLyogX19OZXRCU0RfXyB8fCBfX0ZyZWVCU0RfXyAqLworI2lmZGVmIF9fc3ZyNF9fCit7CisgICAgc3RydWN0IHNzZCBsZHRfbW9kOworICAgIGludCBpOworICAgIGxkdF9tb2Quc2VsID0gRU5UUllfVE9fU0VMRUNUT1IoZW50cnkpIHwgNDsKKyAgICBsZHRfbW9kLmJvID0gY29udGVudC0+YmFzZTsKKyAgICBsZHRfbW9kLmxzID0gY29udGVudC0+bGltaXQ7CisgICAgaSA9ICAgKGNvbnRlbnQtPmxpbWl0ICYgMHhmMDAwMCkgfAorICAgICAgICAoY29udGVudC0+dHlwZSA8PCAxMCkgfAorICAgICAgICAgICAgKCgoY29udGVudC0+cmVhZF9vbmx5ICE9IDApIF4gMSkgPDwgOSkgfAorICAgICAgICAgICAgICAgICgoY29udGVudC0+c2VnXzMyYml0ICE9IDApIDw8IDIyKSB8CisgICAgICAgICAgICAgICAgICAgICgoY29udGVudC0+bGltaXRfaW5fcGFnZXMgIT0gMCk8PCAyMykgfAorICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDE1KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3MDAwOworCisgICAgbGR0X21vZC5hY2MxID0gKGkgJiAweGZmMDApID4+IDg7CisgICAgbGR0X21vZC5hY2MyID0gKGkgJiAweGYwMDAwMCkgPj4gMjA7CisgICAgCisgICAgCisgICAgaWYgKGNvbnRlbnQtPmJhc2UgPT0gMCkKKyAgICB7CisgICAgICAgIGxkdF9tb2QuYWNjMSA9ICAwOworICAgICAgICBsZHRfbW9kLmFjYzIgPSAwOworICAgIH0gICAgCisgICAgaWYgKChpID0gc3lzaTg2KFNJODZEU0NSLCAmbGR0X21vZCkpID09IC0xKQorICAgICAgICBwZXJyb3IoInN5c2k4NiIpOworICAgIAorfSAgICAKKyNlbmRpZgogI2VuZGlmICAvKiBpZm5kZWYgV0lORUxJQiAqLwogCiAgICAgaWYgKHJldCA8IDApIHJldHVybiByZXQ7CkBAIC0xNjgsMTIgKzIwNSwxMyBAQAogICoKICAqIFByaW50IHRoZSBjb250ZW50IG9mIHRoZSBMRFQgb24gc3Rkb3V0LgogICovCi12b2lkIExEVF9QcmludCgpCit2b2lkIExEVF9QcmludCggaW50IHN0YXJ0LCBpbnQgbGVuZ3RoICkKIHsKICAgICBpbnQgaTsKICAgICBjaGFyIGZsYWdzWzNdOwogCi0gICAgZm9yIChpID0gMDsgaSA8IExEVF9TSVpFOyBpKyspCisgICAgaWYgKGxlbmd0aCA9PSAtMSkgbGVuZ3RoID0gTERUX1NJWkUgLSBzdGFydDsKKyAgICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgbGVuZ3RoOyBpKyspCiAgICAgewogICAgICAgICBpZiAoIWxkdF9jb3B5W2ldLmJhc2UgJiYgIWxkdF9jb3B5W2ldLmxpbWl0KSBjb250aW51ZTsgLyogRnJlZSBlbnRyeSAqLwogICAgICAgICBpZiAoKGxkdF9mbGFnc19jb3B5W2ldICYgTERUX0ZMQUdTX1RZUEUpID09IFNFR01FTlRfQ09ERSkKZGlmZiAtLWdpdCBhL21lbW9yeS9sb2NhbC5jIGIvbWVtb3J5L2xvY2FsLmMKaW5kZXggZmE1ODQ1Yi4uOWYyMTVhZiAxMDA2NDQKLS0tIGEvbWVtb3J5L2xvY2FsLmMKKysrIGIvbWVtb3J5L2xvY2FsLmMKQEAgLTI4NSw3ICsyODUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTG9jYWxJbml0ICAgKEtFUk5FTC40KQogICovCi1ITE9DQUwgTG9jYWxJbml0KCBXT1JEIHNlbGVjdG9yLCBXT1JEIHN0YXJ0LCBXT1JEIGVuZCApCitCT09MIExvY2FsSW5pdCggSEFORExFIHNlbGVjdG9yLCBXT1JEIHN0YXJ0LCBXT1JEIGVuZCApCiB7CiAgICAgY2hhciAqcHRyOwogICAgIFdPUkQgaGVhcEluZm9BcmVuYSwgZnJlZUFyZW5hLCBsYXN0QXJlbmE7CkBAIC02NzIsNyArNjcyLDcgQEAKICAqCiAgKiBJbXBsZW1lbnRhdGlvbiBvZiBMb2NhbEZyZWUoKS4KICAqLwotSExPQ0FMIExPQ0FMX0ZyZWUoIFdPUkQgZHMsIEhMT0NBTCBoYW5kbGUgKQorSExPQ0FMIExPQ0FMX0ZyZWUoIEhBTkRMRSBkcywgSExPQ0FMIGhhbmRsZSApCiB7CiAgICAgY2hhciAqcHRyID0gUFRSX1NFR19PRkZfVE9fTElOKCBkcywgMCApOwogICAgIFdPUkQgYXJlbmE7CkBAIC02OTYsNyArNjk2LDcgQEAKICAqCiAgKiBJbXBsZW1lbnRhdGlvbiBvZiBMb2NhbEFsbG9jKCkuCiAgKi8KLUhMT0NBTCBMT0NBTF9BbGxvYyggV09SRCBkcywgV09SRCBmbGFncywgV09SRCBzaXplICkKK0hMT0NBTCBMT0NBTF9BbGxvYyggSEFORExFIGRzLCBXT1JEIGZsYWdzLCBXT1JEIHNpemUgKQogewogICAgIGNoYXIgKnB0cjsKICAgICBITE9DQUwgaGFuZGxlOwpAQCAtNzMyLDcgKzczMiw3IEBACiAgKgogICogSW1wbGVtZW50YXRpb24gb2YgTG9jYWxSZUFsbG9jKCkuCiAgKi8KLUhMT0NBTCBMT0NBTF9SZUFsbG9jKCBXT1JEIGRzLCBITE9DQUwgaGFuZGxlLCBXT1JEIHNpemUsIFdPUkQgZmxhZ3MgKQorSExPQ0FMIExPQ0FMX1JlQWxsb2MoIEhBTkRMRSBkcywgSExPQ0FMIGhhbmRsZSwgV09SRCBzaXplLCBXT1JEIGZsYWdzICkKIHsKICAgICBjaGFyICpwdHIgPSBQVFJfU0VHX09GRl9UT19MSU4oIGRzLCAwICk7CiAgICAgTE9DQUxIRUFQSU5GTyAqcEluZm87CkBAIC04MjAsNyArODIwLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExPQ0FMX0xvY2sKICAqLwotV09SRCBMT0NBTF9Mb2NrKCBXT1JEIGRzLCBITE9DQUwgaGFuZGxlICkKK0hBTkRMRSBMT0NBTF9Mb2NrKCBIQU5ETEUgZHMsIEhMT0NBTCBoYW5kbGUgKQogewogICAgIGNoYXIgKnB0ciA9IFBUUl9TRUdfT0ZGX1RPX0xJTiggZHMsIDAgKTsKIApAQCAtOTIyLDcgKzkyMiw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMb2NhbExvY2sgICAoS0VSTkVMLjgpCiAgKi8KLVdPUkQgTG9jYWxMb2NrKCBITE9DQUwgaGFuZGxlICkKK05QVk9JRCBMb2NhbExvY2soIEhMT0NBTCBoYW5kbGUgKQogewogICAgIHJldHVybiBMT0NBTF9Mb2NrKCBDVVJSRU5UX0RTLCBoYW5kbGUgKTsKIH0KZGlmZiAtLWdpdCBhL21lbW9yeS9zZWxlY3Rvci5jIGIvbWVtb3J5L3NlbGVjdG9yLmMKaW5kZXggZmVkODczZC4uOGNhMzYxYSAxMDA2NDQKLS0tIGEvbWVtb3J5L3NlbGVjdG9yLmMKKysrIGIvbWVtb3J5L3NlbGVjdG9yLmMKQEAgLTM1OCw3ICszNTgsNyBAQAogICAgIExEVF9HZXRFbnRyeSggU0VMRUNUT1JfVE9fRU5UUlkoc2VsKSwgJmVudHJ5ICk7CiAgICAgaWYgKChlbnRyeS50eXBlID09IFNFR01FTlRfQ09ERSkgJiYgZW50cnkucmVhZF9vbmx5KSByZXR1cm4gVFJVRTsKICAgICBpZiAoc3RybGVuKFBUUl9TRUdfVE9fTElOKHB0cikpIDwgc2l6ZSkgc2l6ZSA9IHN0cmxlbihQVFJfU0VHX1RPX0xJTihwdHIpKTsKLSAgICBpZiAoT0ZGU0VUT0YocHRyKSArIHNpemUgPiBlbnRyeS5saW1pdCkgcmV0dXJuIFRSVUU7CisgICAgaWYgKE9GRlNFVE9GKHB0cikgKyBzaXplIC0gMSA+IGVudHJ5LmxpbWl0KSByZXR1cm4gVFJVRTsKICAgICByZXR1cm4gRkFMU0U7CiB9CiAKQEAgLTM3Niw3ICszNzYsNyBAQAogICAgIGlmIChJU19TRUxFQ1RPUl9GUkVFKHNlbCkpIHJldHVybiBUUlVFOwogICAgIExEVF9HZXRFbnRyeSggU0VMRUNUT1JfVE9fRU5UUlkoc2VsKSwgJmVudHJ5ICk7CiAgICAgaWYgKChlbnRyeS50eXBlID09IFNFR01FTlRfQ09ERSkgJiYgZW50cnkucmVhZF9vbmx5KSByZXR1cm4gVFJVRTsKLSAgICBpZiAoT0ZGU0VUT0YocHRyKSArIHNpemUgPiBlbnRyeS5saW1pdCkgcmV0dXJuIFRSVUU7CisgICAgaWYgKE9GRlNFVE9GKHB0cikgKyBzaXplIC0gMSA+IGVudHJ5LmxpbWl0KSByZXR1cm4gVFJVRTsKICAgICByZXR1cm4gRkFMU0U7CiB9CiAKQEAgLTM5NCw3ICszOTQsNyBAQAogICAgIGlmIChJU19TRUxFQ1RPUl9GUkVFKHNlbCkpIHJldHVybiBUUlVFOwogICAgIExEVF9HZXRFbnRyeSggU0VMRUNUT1JfVE9fRU5UUlkoc2VsKSwgJmVudHJ5ICk7CiAgICAgaWYgKChlbnRyeS50eXBlID09IFNFR01FTlRfQ09ERSkgfHwgZW50cnkucmVhZF9vbmx5KSByZXR1cm4gVFJVRTsKLSAgICBpZiAoT0ZGU0VUT0YocHRyKSArIHNpemUgPiBlbnRyeS5saW1pdCkgcmV0dXJuIFRSVUU7CisgICAgaWYgKE9GRlNFVE9GKHB0cikgKyBzaXplIC0gMSA+IGVudHJ5LmxpbWl0KSByZXR1cm4gVFJVRTsKICAgICByZXR1cm4gRkFMU0U7CiB9CiAKZGlmZiAtLWdpdCBhL21pc2MvSW1ha2VmaWxlIGIvbWlzYy9JbWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODliZDcuLjAwMDAwMDAKLS0tIGEvbWlzYy9JbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jaW5jbHVkZSAiLi4vV2luZS50bXBsIgotCi1NT0RVTEUgPSBtaXNjCi0KLVNSQ1MgPSBcCi0JY2xpcGJvYXJkLmMgXAotCWNvbW0uYyBcCi0JY29tbWRsZy5jIFwKLQljb21wb2JqLmMgXAotCWRvc19mcy5jIFwKLQlkcml2ZXIuYyBcCi0JZXhlYy5jIFwKLQllc2NhcGUuYyBcCi0JZmlsZS5jIFwKLQlrZXlib2FyZC5jIFwKLQlrZXJuZWwzMi5jIFwKLQlsc3RyLmMgXAotCW1haW4uYyBcCi0Jb2xlMi5jIFwKLQlvbGUyZGlzcC5jIFwKLQlvbGUybmxzLmMgXAotCW9sZWNsaS5jIFwKLQlvbGVzdnIuYyBcCi0JbmV0d29yay5jIFwKLQlwcm9maWxlLmMgXAotCXJlY3QuYyBcCi0Jc2hlbGwuYyBcCi0Jc291bmQuYyBcCi0Jc3B5LmMgXAotCXN0cmVzcy5jIFwKLQl1c2VyLmMgXAotCXVzZXIzMi5jIFwKLQl3aW5zb2NrZXQuYwotCi1PQkpTID0gJChTUkNTOi5jPS5vKQotCi1XaW5lUmVsb2NhdGFibGVUYXJnZXQoJChNT0RVTEUpLCwkKE9CSlMpKQotRGVwZW5kVGFyZ2V0KCkKLQotaW5jbHVkZXM6OgotCi1pbnN0YWxsOjoKZGlmZiAtLWdpdCBhL21pc2MvTWFrZWZpbGUuaW4gYi9taXNjL01ha2VmaWxlLmluCmluZGV4IGM2MDZiOTQuLjc3OGUzMzEgMTAwNjQ0Ci0tLSBhL21pc2MvTWFrZWZpbGUuaW4KKysrIGIvbWlzYy9NYWtlZmlsZS5pbgpAQCAtMTIsNyArMTIsNiBAQAogCWVzY2FwZS5jIFwKIAlmaWxlLmMgXAogCWtleWJvYXJkLmMgXAotCWtlcm5lbDMyLmMgXAogCWxzdHIuYyBcCiAJbWFpbi5jIFwKIAlvbGUyLmMgXApkaWZmIC0tZ2l0IGEvbWlzYy9jbGlwYm9hcmQuYyBiL21pc2MvY2xpcGJvYXJkLmMKaW5kZXggZmVmMzA5ZC4uZDNkZjU5ZCAxMDA2NDQKLS0tIGEvbWlzYy9jbGlwYm9hcmQuYworKysgYi9taXNjL2NsaXBib2FyZC5jCkBAIC01OSw3ICs1OSw3IEBACiB7CiAgICAgaWYgKGhXbmRDbGlwYm9hcmRPd25lciAhPSAwKSByZXR1cm4gRkFMU0U7CiAgICAgaFduZENsaXBib2FyZE93bmVyID0gaFduZDsKLSAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIk9wZW5DbGlwYm9hcmQoJTA0WCk7ICFcbiIsIGhXbmQpOworICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiT3BlbkNsaXBib2FyZCgiTlBGTVQiKTsgIVxuIiwgaFduZCk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTEwNyw3ICsxMDcsNyBAQAogSFdORCBHZXRDbGlwYm9hcmRPd25lcigpCiB7CiAgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLAotCQkiR2V0Q2xpcGJvYXJkT3duZXIoKSA9ICUwNFggIVxuIiwgaFduZENsaXBib2FyZE93bmVyKTsKKwkJIkdldENsaXBib2FyZE93bmVyKCkgPSAiTlBGTVQiICFcbiIsIGhXbmRDbGlwYm9hcmRPd25lcik7CiAgICAgcmV0dXJuIGhXbmRDbGlwYm9hcmRPd25lcjsKIH0KIApAQCAtMTE5LDcgKzExOSw3IEBACiB7CiAgICAgTFBDTElQRk9STUFUIGxwRm9ybWF0ID0gQ2xpcEZvcm1hdHM7IAogICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwKLQkJIlNldENsaXBib2FyZERhdGUoJTA0WCwgJTA0WCkgIVxuIiwgd0Zvcm1hdCwgaERhdGEpOworCQkiU2V0Q2xpcGJvYXJkRGF0ZSglMDRYLCAiTlBGTVQiKSAhXG4iLCB3Rm9ybWF0LCBoRGF0YSk7CiAgICAgd2hpbGUoVFJVRSkgewogCWlmIChscEZvcm1hdCA9PSBOVUxMKSByZXR1cm4gMDsKIAlpZiAobHBGb3JtYXQtPndGb3JtYXRJRCA9PSB3Rm9ybWF0KSBicmVhazsKQEAgLTE3Myw3ICsxNzMsNyBAQAogCWlmIChscEZvcm1hdCA9PSBOVUxMKSBicmVhazsKIAlpZiAobHBGb3JtYXQtPmhEYXRhICE9IDApIHsKICAgICAgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLAotCQkiQ291bnRDbGlwYm9hcmRGb3JtYXRzIC8vIEZpbmQgTm90IEVtcHR5ICglMDRYKSAhXG4iLAorCQkiQ291bnRDbGlwYm9hcmRGb3JtYXRzIC8vIEZpbmQgTm90IEVtcHR5ICgiTlBGTVQiKSAhXG4iLAogCQkJCQlscEZvcm1hdC0+aERhdGEpOwogCSAgICBGb3JtYXRDb3VudCsrOwogCSAgICB9CkBAIC0yMTEsNyArMjExLDcgQEAKIAlscEZvcm1hdCA9IGxwRm9ybWF0LT5OZXh0Rm9ybWF0OwogCX0KICAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsCi0JCSJFbnVtQ2xpcGJvYXJkRm9ybWF0cyAvLyBGaW5kIE5vdCBFbXB0eSBJZD0lMDRYIGhEYXRhPSUwNFggIVxuIiwKKwkJIkVudW1DbGlwYm9hcmRGb3JtYXRzIC8vIEZpbmQgTm90IEVtcHR5IElkPSUwNFggaERhdGE9Ik5QRk1UIiAhXG4iLAogCQkJCWxwRm9ybWF0LT53Rm9ybWF0SUQsIGxwRm9ybWF0LT5oRGF0YSk7CiAgICAgcmV0dXJuIGxwRm9ybWF0LT53Rm9ybWF0SUQ7CiB9CkBAIC0yNzksNyArMjc5LDcgQEAKIEhXTkQgU2V0Q2xpcGJvYXJkVmlld2VyKEhXTkQgaFduZCkKIHsKICAgICBIV05EIGh3bmRQcmV2ID0gaFduZFZpZXdlcjsKLSAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIlNldENsaXBib2FyZFZpZXdlciglMDRYKSAhXG4iLCBoV25kKTsKKyAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIlNldENsaXBib2FyZFZpZXdlcigiTlBGTVQiKSAhXG4iLCBoV25kKTsKICAgICBoV25kVmlld2VyID0gaFduZDsKICAgICByZXR1cm4gaHduZFByZXY7CiB9CkBAIC0yOTAsNyArMjkwLDcgQEAKICAqLwogSFdORCBHZXRDbGlwYm9hcmRWaWV3ZXIoKQogewotICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiR2V0Q2xpcGJvYXJkRm9ybWF0KCkgPSAlMDRYICFcbiIsIGhXbmRWaWV3ZXIpOworICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiR2V0Q2xpcGJvYXJkRm9ybWF0KCkgPSAiTlBGTVQiICFcbiIsIGhXbmRWaWV3ZXIpOwogICAgIHJldHVybiBoV25kVmlld2VyOwogfQogCkBAIC0zMDEsNyArMzAxLDcgQEAKIEJPT0wgQ2hhbmdlQ2xpcGJvYXJkQ2hhaW4oSFdORCBoV25kLCBIV05EIGhXbmROZXh0KQogewogICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZG5pbXAsCi0JCSJDaGFuZ2VDbGlwYm9hcmRDaGFpbiglMDRYLCAlMDRYKSAhXG4iLCBoV25kLCBoV25kTmV4dCk7CisJCSJDaGFuZ2VDbGlwYm9hcmRDaGFpbigiTlBGTVQiLCAiTlBGTVQiKSAhXG4iLCBoV25kLCBoV25kTmV4dCk7CiAKICAgICAgcmV0dXJuIDA7CiB9CkBAIC0zMzEsNyArMzMxLDcgQEAKIEhXTkQgR2V0T3BlbkNsaXBib2FyZFdpbmRvdygpCiB7CiAgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLAotCQkiR2V0T3BlbkNsaXBib2FyZFdpbmRvdygpID0gJTA0WCAhXG4iLCBoV25kQ2xpcGJvYXJkT3duZXIpOworCQkiR2V0T3BlbkNsaXBib2FyZFdpbmRvdygpID0gIk5QRk1UIiAhXG4iLCBoV25kQ2xpcGJvYXJkT3duZXIpOwogICAgIHJldHVybiBoV25kQ2xpcGJvYXJkT3duZXI7CiB9CiAKZGlmZiAtLWdpdCBhL21pc2MvY29tbS5jIGIvbWlzYy9jb21tLmMKaW5kZXggNGRhN2U3ZS4uYmNlNDkxYyAxMDA2NDQKLS0tIGEvbWlzYy9jb21tLmMKKysrIGIvbWlzYy9jb21tLmMKQEAgLTM1OCw2ICszNTgsNyBAQAogCQkJcG9ydC5jX2NmbGFnICY9IFRJT0NNX1JUUzsKIAkJCWJyZWFrOwogCQorI2lmbmRlZiBfX3N2cjRfXwogCQljYXNlIFNFVERUUjoKIAkJCXBvcnQuY19jZmxhZyB8PSBDUlRTQ1RTOwogCQkJYnJlYWs7CkBAIC0zNjUsNiArMzY2LDcgQEAKIAkJY2FzZSBTRVRSVFM6CiAJCQlwb3J0LmNfY2ZsYWcgfD0gQ1JUU0NUUzsKIAkJCWJyZWFrOworI2VuZGlmCiAKIAkJY2FzZSBTRVRYT0ZGOgogCQkJcG9ydC5jX2lmbGFnIHw9IElYT0ZGOwpAQCAtNjE4LDExICs2MjAsMTMgQEAKIAkJCWNvbW1lcnJvciA9IElFX0JZVEVTSVpFOwogCQkJcmV0dXJuIC0xOwogCX0KKyNpZm5kZWYgX19zdnI0X18KIAogCWlmIChscGRjYi0+ZkR0cmZsb3cgfHwgbHBkY2ItPmZSdHNmbG93IHx8IGxwZGNiLT5mT3V0eEN0c0Zsb3cpCiAJCXBvcnQuY19jZmxhZyB8PSBDUlRTQ1RTOwogCiAJaWYgKGxwZGNiLT5mRHRyRGlzYWJsZSkgCisjZW5kaWYKIAkJcG9ydC5jX2NmbGFnICY9IH5DUlRTQ1RTOwogCQogCWlmIChscGRjYi0+ZkluWCkKQEAgLTcyNCwxMiArNzI4LDE0IEBACiAJbHBkY2ItPmZDaEV2dCA9IDA7CiAJbHBkY2ItPmZCaW5hcnkgPSAxOwogCisjaWZuZGVmIF9fc3ZyNF9fCiAJbHBkY2ItPmZEdHJEaXNhYmxlID0gMDsKIAlpZiAocG9ydC5jX2NmbGFnICYgQ1JUU0NUUykgewogCQlscGRjYi0+ZkR0cmZsb3cgPSAxOwogCQlscGRjYi0+ZlJ0c2Zsb3cgPSAxOwogCQlscGRjYi0+Zk91dHhDdHNGbG93ID0gMTsKIAkJbHBkY2ItPmZPdXR4RHNyRmxvdyA9IDE7CisjZW5kaWYKIAl9IGVsc2UgCiAJCWxwZGNiLT5mRHRyRGlzYWJsZSA9IDE7CiAKZGlmZiAtLWdpdCBhL21pc2MvY29tbWRsZy5jIGIvbWlzYy9jb21tZGxnLmMKaW5kZXggNzc0Y2M4NC4uZjg1NjI0ZiAxMDA2NDQKLS0tIGEvbWlzYy9jb21tZGxnLmMKKysrIGIvbWlzYy9jb21tZGxnLmMKQEAgLTgzLDcgKzgzLDcgQEAKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAotICAgIGhJbnN0ID0gR2V0V2luZG93V29yZCggbHBvZm4tPmh3bmRPd25lciwgR1dXX0hJTlNUQU5DRSApOworICAgIGhJbnN0ID0gV0lOX0dldFdpbmRvd0luc3RhbmNlKCBscG9mbi0+aHduZE93bmVyICk7CiAgICAgYlJldCA9IERpYWxvZ0JveEluZGlyZWN0UGFyYW0oIGhJbnN0LCBoRGxnVG1wbCwgbHBvZm4tPmh3bmRPd25lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V25kUHJvY0VudHJ5MTYoIkZpbGVPcGVuRGxnUHJvYyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpbHBvZm4gKTsKQEAgLTEzMCw3ICsxMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsIE5VTEwgKTsKIAogCi0gICAgaEluc3QgPSBHZXRXaW5kb3dXb3JkKCBscG9mbi0+aHduZE93bmVyLCBHV1dfSElOU1RBTkNFICk7CisgICAgaEluc3QgPSBXSU5fR2V0V2luZG93SW5zdGFuY2UoIGxwb2ZuLT5od25kT3duZXIgKTsKICAgICBiUmV0ID0gRGlhbG9nQm94SW5kaXJlY3RQYXJhbSggaEluc3QsIGhEbGdUbXBsLCBscG9mbi0+aHduZE93bmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXbmRQcm9jRW50cnkxNigiRmlsZVNhdmVEbGdQcm9jIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRClscG9mbik7IApAQCAtNTEzLDcgKzUxMywxMyBAQAogCXN0cmNweShQVFJfU0VHX1RPX0xJTihscG9mbi0+bHBzdHJGaWxlKSwgdG1wc3RyMik7CiAgICAgICB9CiAgICAgICBscG9mbi0+bkZpbGVPZmZzZXQgPSAwOwotICAgICAgbHBvZm4tPm5GaWxlRXh0ZW5zaW9uID0gc3RybGVuKFBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckZpbGUpKSAtIDM7CisgICAgICBscG9mbi0+bkZpbGVFeHRlbnNpb24gPSAwOworICAgICAgd2hpbGUodG1wc3RyMltscG9mbi0+bkZpbGVFeHRlbnNpb25dICE9ICcuJyAmJiB0bXBzdHIyW2xwb2ZuLT5uRmlsZUV4dGVuc2lvbl0gIT0gJ1wwJykKKyAgICAgICAgbHBvZm4tPm5GaWxlRXh0ZW5zaW9uKys7CisgICAgICBpZiAobHBvZm4tPm5GaWxlRXh0ZW5zaW9uID09ICdcMCcpCisJbHBvZm4tPm5GaWxlRXh0ZW5zaW9uID0gMDsKKyAgICAgIGVsc2UKKwlscG9mbi0+bkZpbGVFeHRlbnNpb24rKzsKICAgICAgIGlmIChQVFJfU0VHX1RPX0xJTihscG9mbi0+bHBzdHJGaWxlVGl0bGUpICE9IE5VTEwpIAogCXsKIAkgIGxSZXQgPSBTZW5kRGxnSXRlbU1lc3NhZ2UoaFduZCwgbHN0MSwgTEJfR0VUQ1VSU0VMLCAwLCAwKTsKQEAgLTUzNCw3ICs1NDAsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRmlsZU9wZW5EbGdQcm9jICAgKENPTU1ETEcuNikKICAqLwotQk9PTCBGaWxlT3BlbkRsZ1Byb2MoSFdORCBoV25kLCBXT1JEIHdNc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK0xSRVNVTFQgRmlsZU9wZW5EbGdQcm9jKEhXTkQgaFduZCwgVUlOVCB3TXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogeyAgCiAgIHN3aXRjaCAod01zZykKICAgICB7CkBAIC01NjgsNyArNTc0LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEZpbGVTYXZlRGxnUHJvYyAgIChDT01NRExHLjcpCiAgKi8KLUJPT0wgRmlsZVNhdmVEbGdQcm9jKEhXTkQgaFduZCwgV09SRCB3TXNnLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitMUkVTVUxUIEZpbGVTYXZlRGxnUHJvYyhIV05EIGhXbmQsIFVJTlQgd01zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgc3dpdGNoICh3TXNnKSB7CiAgICBjYXNlIFdNX0lOSVRESUFMT0c6CkBAIC02MTQsNyArNjIwLDcgQEAKICAgICBoRGxnVG1wbCA9IEdMT0JBTF9DcmVhdGVCbG9jayhHTUVNX0ZJWEVELCBzeXNyZXNfRElBTE9HX0NIT09TRV9DT0xPUi5ieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNyZXNfRElBTE9HX0NIT09TRV9DT0xPUi5zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQREIoKSwgRkFMU0UsIEZBTFNFLCBUUlVFLCBOVUxMICk7Ci0gICAgaEluc3QgPSBHZXRXaW5kb3dXb3JkKCBscENoQ29sLT5od25kT3duZXIsIEdXV19ISU5TVEFOQ0UgKTsKKyAgICBoSW5zdCA9IFdJTl9HZXRXaW5kb3dJbnN0YW5jZSggbHBDaENvbC0+aHduZE93bmVyICk7CiAgICAgYlJldCA9IERpYWxvZ0JveEluZGlyZWN0UGFyYW0oIGhJbnN0LCBoRGxnVG1wbCwgbHBDaENvbC0+aHduZE93bmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXbmRQcm9jRW50cnkxNigiQ29sb3JEbGdQcm9jIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpbHBDaENvbCApOwpAQCAtNjI2LDcgKzYzMiw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDb2xvckRsZ1Byb2MgICAoQ09NTURMRy44KQogICovCi1CT09MIENvbG9yRGxnUHJvYyhIV05EIGhXbmQsIFdPUkQgd01zZywgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorTFJFU1VMVCBDb2xvckRsZ1Byb2MoSFdORCBoV25kLCBVSU5UIHdNc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgIHN3aXRjaCAod01zZykgCiAgICAgewpAQCAtNjYxLDcgKzY2Nyw3IEBACiAgICAgaERsZ1RtcGwgPSBHTE9CQUxfQ3JlYXRlQmxvY2soR01FTV9GSVhFRCwgc3lzcmVzX0RJQUxPR19GSU5EX1RFWFQuYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzcmVzX0RJQUxPR19GSU5EX1RFWFQuc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50UERCKCksIEZBTFNFLCBGQUxTRSwgVFJVRSwgTlVMTCApOwotICAgIGhJbnN0ID0gR2V0V2luZG93V29yZCggbHBGaW5kLT5od25kT3duZXIsIEdXV19ISU5TVEFOQ0UgKTsKKyAgICBoSW5zdCA9IFdJTl9HZXRXaW5kb3dJbnN0YW5jZSggbHBGaW5kLT5od25kT3duZXIgKTsKICAgICBiUmV0ID0gRGlhbG9nQm94SW5kaXJlY3RQYXJhbSggaEluc3QsIGhEbGdUbXBsLCBscEZpbmQtPmh3bmRPd25lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V25kUHJvY0VudHJ5MTYoIkZpbmRUZXh0RGxnUHJvYyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKWxwRmluZCApOwpAQCAtNjgxLDcgKzY4Nyw3IEBACiAgICAgaERsZ1RtcGwgPSBHTE9CQUxfQ3JlYXRlQmxvY2soR01FTV9GSVhFRCwgc3lzcmVzX0RJQUxPR19SRVBMQUNFX1RFWFQuYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzcmVzX0RJQUxPR19SRVBMQUNFX1RFWFQuc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50UERCKCksIEZBTFNFLCBGQUxTRSwgVFJVRSwgTlVMTCApOwotICAgIGhJbnN0ID0gR2V0V2luZG93V29yZCggbHBGaW5kLT5od25kT3duZXIsIEdXV19ISU5TVEFOQ0UgKTsKKyAgICBoSW5zdCA9IFdJTl9HZXRXaW5kb3dJbnN0YW5jZSggbHBGaW5kLT5od25kT3duZXIgKTsKICAgICBiUmV0ID0gRGlhbG9nQm94SW5kaXJlY3RQYXJhbSggaEluc3QsIGhEbGdUbXBsLCBscEZpbmQtPmh3bmRPd25lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V25kUHJvY0VudHJ5MTYoIlJlcGxhY2VUZXh0RGxnUHJvYyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKWxwRmluZCApOwpAQCAtNjkzLDcgKzY5OSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBGaW5kVGV4dERsZ1Byb2MgICAoQ09NTURMRy4xMykKICAqLwotQk9PTCBGaW5kVGV4dERsZ1Byb2MoSFdORCBoV25kLCBXT1JEIHdNc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK0xSRVNVTFQgRmluZFRleHREbGdQcm9jKEhXTkQgaFduZCwgVUlOVCB3TXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICBzd2l0Y2ggKHdNc2cpCiAgICAgewpAQCAtNzIwLDcgKzcyNiw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBSZXBsYWNlVGV4dERsZ1Byb2MgICAoQ09NTURMRy4xNCkKICAqLwotQk9PTCBSZXBsYWNlVGV4dERsZ1Byb2MoSFdORCBoV25kLCBXT1JEIHdNc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK0xSRVNVTFQgUmVwbGFjZVRleHREbGdQcm9jKEhXTkQgaFduZCwgVUlOVCB3TXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICBzd2l0Y2ggKHdNc2cpCiAgICAgewpAQCAtNzU0LDYgKzc2MCwxMCBAQAogCiAgICAgcHJpbnRmKCJQcmludERsZyglcCkgLy8gRmxhZ3M9JTA4bFhcbiIsIGxwUHJpbnQsIGxwUHJpbnQtPkZsYWdzICk7CiAKKyAgICBpZiAobHBQcmludC0+RmxhZ3MgJiBQRF9SRVRVUk5ERUZBVUxUKQorICAgICAgICAvKiBGSVhNRTogc2hvdWxkIGZpbGwgbHBQcmludC0+aERldk1vZGUgYW5kIGxwUHJpbnQtPmhEZXZOYW1lcyBoZXJlICovCisgICAgICAgIHJldHVybiBUUlVFOworCiAgICAgaWYgKGxwUHJpbnQtPkZsYWdzICYgUERfUFJJTlRTRVRVUCkKICAgICAgICAgaERsZ1RtcGwgPSBHTE9CQUxfQ3JlYXRlQmxvY2soIEdNRU1fRklYRUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNyZXNfRElBTE9HX1BSSU5UX1NFVFVQLmJ5dGVzLApAQCAtNzY2LDcgKzc3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50UERCKCksIEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIFRSVUUsIE5VTEwgKTsKIAotICAgIGhJbnN0ID0gR2V0V2luZG93V29yZCggbHBQcmludC0+aHduZE93bmVyLCBHV1dfSElOU1RBTkNFICk7CisgICAgaEluc3QgPSBXSU5fR2V0V2luZG93SW5zdGFuY2UoIGxwUHJpbnQtPmh3bmRPd25lciApOwogICAgIGJSZXQgPSBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtKCBoSW5zdCwgaERsZ1RtcGwsIGxwUHJpbnQtPmh3bmRPd25lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxwUHJpbnQtPkZsYWdzICYgUERfUFJJTlRTRVRVUCkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V25kUHJvY0VudHJ5MTYoIlByaW50U2V0dXBEbGdQcm9jIikgOgpAQCAtNzgwLDcgKzc5MCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBQcmludERsZ1Byb2MgICAoQ09NTURMRy4yMSkKICAqLwotQk9PTCBQcmludERsZ1Byb2MoSFdORCBoV25kLCBXT1JEIHdNc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK0xSRVNVTFQgUHJpbnREbGdQcm9jKEhXTkQgaFduZCwgVUlOVCB3TXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICBzd2l0Y2ggKHdNc2cpCiAgICAgewpAQCAtODA3LDcgKzgxNyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBQcmludFNldHVwRGxnUHJvYyAgIChDT01NRExHLjIyKQogICovCi1CT09MIFByaW50U2V0dXBEbGdQcm9jKEhXTkQgaFduZCwgV09SRCB3TXNnLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitMUkVTVUxUIFByaW50U2V0dXBEbGdQcm9jKEhXTkQgaFduZCwgVUlOVCB3TXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICBzd2l0Y2ggKHdNc2cpCiAgICAgewpkaWZmIC0tZ2l0IGEvbWlzYy9kb3NfZnMuYyBiL21pc2MvZG9zX2ZzLmMKaW5kZXggYTE0MTc5OC4uNjY2NzA1OCAxMDA2NDQKLS0tIGEvbWlzYy9kb3NfZnMuYworKysgYi9taXNjL2Rvc19mcy5jCkBAIC0yNCw3ICsyNCw5IEBACiAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiAjaW5jbHVkZSA8c3lzL21vdW50Lmg+CiAjZW5kaWYKLQorI2lmZGVmIF9fc3ZyNF9fCisjaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgorI2VuZGlmCiAjaW5jbHVkZSAid2luZS5oIgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJtc2Rvcy5oIgpAQCAtNjAsNiArNjIsNjAgQEAKIHN0YXRpYyBzdHJ1Y3QgRG9zRHJpdmVTdHJ1Y3QgRG9zRHJpdmVzW01BWF9ET1NfRFJJVkVTXTsKIHN0YXRpYyBzdHJ1Y3QgZG9zZGlyZW50ICpEb3NEaXJzPU5VTEw7CiAKK1dPUkQgRXh0ZW5kZWRFcnJvcjsKK0JZVEUgRXJyb3JDbGFzcywgQWN0aW9uLCBFcnJvckxvY3VzOworCitpbnQgRE9TX0Vycm9yKGludCBlLCBpbnQgY2xhc3MsIGludCBlbCkKK3sKKwlFcnJvckNsYXNzID0gY2xhc3M7CisJQWN0aW9uID0gU0FfQXNrNFJldHJ5OworCUVycm9yTG9jdXMgPSBlbDsKKwlFeHRlbmRlZEVycm9yID0gZTsKKworCXJldHVybiBlOworfQorCit2b2lkIGVycm5vX3RvX2Rvc2Vycih2b2lkKQoreworCXN3aXRjaCAoZXJybm8pIHsKKwkJY2FzZSBFQUdBSU46CisJCQlET1NfRXJyb3IgKFNoYXJlVmlvbGF0aW9uLCBFQ19UZW1wb3JhcnksIEVMX1Vua25vd24pOworCQkJYnJlYWs7CisJCWNhc2UgRUJBREY6CisJCQlET1NfRXJyb3IgKEludmFsaWRIYW5kbGUsIEVDX0FwcEVycm9yLCBFTF9Vbmtub3duKTsKKwkJCWJyZWFrOworCQljYXNlIEVOT1NQQzoKKwkJCURPU19FcnJvciAoRGlza0Z1bGwsIEVDX01lZGlhRXJyb3IsIEVMX0Rpc2spOworCQkJYnJlYWs7CQkJCQorCQljYXNlIEVBQ0NFUzoKKwkJY2FzZSBFUEVSTToKKwkJY2FzZSBFUk9GUzoKKwkJCURPU19FcnJvciAoV3JpdGVQcm90ZWN0ZWQsIEVDX0FjY2Vzc0RlbmllZCwgRUxfVW5rbm93bik7CisJCQlicmVhazsKKwkJY2FzZSBFQlVTWToKKwkJCURPU19FcnJvciAoTG9ja1Zpb2xhdGlvbiwgRUNfQWNjZXNzRGVuaWVkLCBFTF9Vbmtub3duKTsKKwkJCWJyZWFrOwkJCisJCWNhc2UgRU5PRU5UOgorCQkJRE9TX0Vycm9yIChGaWxlTm90Rm91bmQsIEVDX05vdEZvdW5kLCBFTF9Vbmtub3duKTsKKwkJCWJyZWFrOwkJCQkKKwkJY2FzZSBFSVNESVI6CisJCQlET1NfRXJyb3IgKENhbk5vdE1ha2VEaXIsIEVDX0FjY2Vzc0RlbmllZCwgRUxfVW5rbm93bik7CisJCQlicmVhazsKKwkJY2FzZSBFTkZJTEU6CisJCWNhc2UgRU1GSUxFOgorCQkJRE9TX0Vycm9yIChOb01vcmVGaWxlcywgRUNfTWVkaWFFcnJvciwgRUxfVW5rbm93bik7CisJCQlicmVhazsKKwkJY2FzZSBFRVhJU1Q6CisJCQlET1NfRXJyb3IgKEZpbGVFeGlzdHMsIEVDX0V4aXN0cywgRUxfRGlzayk7CisJCQlicmVhazsJCQkJCisJCWRlZmF1bHQ6CisJCQlkcHJpbnRmX2ludChzdGRkZWIsICJpbnQyMTogdW5rbm93biBlcnJubyAlZCFcbiIsIGVycm5vKTsKKwkJCURPU19FcnJvciAoR2VuZXJhbEZhaWx1cmUsIEVDX1N5c3RlbUZhaWx1cmUsIEVMX1Vua25vd24pOworCQkJYnJlYWs7CisJfQorfQorCisKIHN0YXRpYyB2b2lkIEV4cGFuZFRpbGRlU3RyaW5nKGNoYXIgKnMpCiB7CiAgICAgc3RydWN0IHBhc3N3ZCAqZW50cnk7CkBAIC04OCw3ICsxNDQsNyBAQAogICAgICpzID0gMDsKIH0KIAotLyogU2ltcGxpZnkgdGhlIHBhdGggaW4gIm5hbWUiIGJ5IHJlbW92aW5nICAiLy8iJ3MgYW5kCisvKiBTaW1wbGlmeSB0aGUgcGF0aCBpbiAibmFtZSIgYnkgcmVtb3ZpbmcgICIvLyIncywgIi8uLyIncywgYW5kCiAgICAiLi4iJ3MgaW4gbmFtZXMgbGlrZSAiL3Vzci9iaW4vLi4vbGliL3Rlc3QiICovCiBzdGF0aWMgdm9pZCBET1NfU2ltcGxpZnlQYXRoKGNoYXIgKm5hbWUpCiB7CkBAIC0xMDgsNiArMTY0LDkgQEAKICAgICAgIHN0cmNweShwLGwrMyk7CiAgICAgICBjaGFuZ2VkID0gVFJVRTsKICAgICB9CisgICAgd2hpbGUgKChsID0gc3Ryc3RyKG5hbWUsICIvLi8iKSkpIHsKKyAgICAgIHN0cmNweShsLCBsKzIpOyBjaGFuZ2VkID0gVFJVRTsKKyAgICB9CiAgIH0gd2hpbGUgKGNoYW5nZWQpOwogICBkcHJpbnRmX2Rvc2ZzKHN0ZGRlYiwiU2ltcGxpZnlQYXRoOiBBZnRlciAlc1xuIixuYW1lKTsKIH0KQEAgLTU2OSwxOSArNjI4LDI3IEBACiAJaWYgKCFET1NfVmFsaWREcml2ZShkcml2ZSkpCiAJCXJldHVybiAwOwogCisjaWZkZWYgX19zdnI0X18KKwlpZiAoc3RhdGZzKERvc0RyaXZlc1tkcml2ZV0ucm9vdGRpciwgJmluZm8sIDAsIDApIDwgMCkgeworI2Vsc2UKIAlpZiAoc3RhdGZzKERvc0RyaXZlc1tkcml2ZV0ucm9vdGRpciwgJmluZm8pIDwgMCkgeworI2VuZGlmCiAJCWZwcmludGYoc3RkZXJyLCJkb3NmczogY2Fubm90IGRvIHN0YXRmcyglcylcbiIsCiAJCQlEb3NEcml2ZXNbZHJpdmVdLnJvb3RkaXIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAkqc2l6ZSA9IGluZm8uZl9ic2l6ZSAqIGluZm8uZl9ibG9ja3M7CisjaWZkZWYgX19zdnI0X18KKwkqYXZhaWxhYmxlID0gaW5mby5mX2JmcmVlICogaW5mby5mX2JzaXplOworI2Vsc2UKIAkqYXZhaWxhYmxlID0gaW5mby5mX2JhdmFpbCAqIGluZm8uZl9ic2l6ZTsKKyNlbmRpZgogCiAJcmV0dXJuIDE7CiB9CiAKLWNoYXIgKkRPU19GaW5kRmlsZShjaGFyICpidWZmZXIsIGludCBidWZsZW4sIGNoYXIgKmZpbGVuYW1lLCBjaGFyICoqZXh0ZW5zaW9ucywgCitjaGFyICpET1NfRmluZEZpbGUoY2hhciAqYnVmZmVyLCBpbnQgYnVmbGVuLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgY2hhciAqKmV4dGVuc2lvbnMsIAogCQljaGFyICpwYXRoKQogewogICAgIGNoYXIgKndvcmtpbmdwYXRoLCAqZGlybmFtZSwgKnJvb3RuYW1lLCAqKmU7CmRpZmYgLS1naXQgYS9taXNjL2RyaXZlci5jIGIvbWlzYy9kcml2ZXIuYwppbmRleCBlOWY1ZjQwLi43ZGE0OTkwIDEwMDY0NAotLS0gYS9taXNjL2RyaXZlci5jCisrKyBiL21pc2MvZHJpdmVyLmMKQEAgLTMzLDcgKzMzLDcgQEAKICAgICAgICAgCWRwcmludGZfZHJpdmVyKHN0ZGRlYiwiTG9hZFN0YXJ0dXBEcml2ZXJzIC8vIHN0cj0nJXMnXG4iLCBwdHIpOwogCQloRHJ2ID0gT3BlbkRyaXZlcihwdHIsICJkcml2ZXJzIiwgMEwpOwogICAgICAgICAJZHByaW50Zl9kcml2ZXIoc3RkZGViLAotCQkJIkxvYWRTdGFydHVwRHJpdmVycyAvLyBoRHJ2PSUwNFhcbiIsIGhEcnYpOworCQkJIkxvYWRTdGFydHVwRHJpdmVycyAvLyBoRHJ2PSJOUEZNVCJcbiIsIGhEcnYpOwogCQlwdHIgKz0gc3RybGVuKHB0cikgKyAxOwogCQl9CiAgICAgCWRwcmludGZfZHJpdmVyKHN0ZGRlYiwiTG9hZFN0YXJ0dXBEcml2ZXJzIC8vIGVuZCBvZiBsaXN0ICFcbiIpOwpAQCAtNDQsNyArNDQsNyBAQAogICovCiBMUkVTVUxUIFdJTkFQSSBTZW5kRHJpdmVyTWVzc2FnZShIRFJWUiBoRHJpdmVyLCBXT1JEIG1zZywgTFBBUkFNIGxQYXJhbTEsIExQQVJBTSBsUGFyYW0yKQogewotCWRwcmludGZfZHJpdmVyKHN0ZG5pbXAsIlNlbmREcml2ZXJNZXNzYWdlKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCk7XG4iLAorCWRwcmludGZfZHJpdmVyKHN0ZG5pbXAsIlNlbmREcml2ZXJNZXNzYWdlKCJOUEZNVCIsICUwNFgsICUwOGxYLCAlMDhsWCk7XG4iLAogCQkJCQkJaERyaXZlciwgbXNnLCBsUGFyYW0xLCBsUGFyYW0yKTsKICAgICAgICAgcmV0dXJuIDA7CiB9CkBAIC05Myw3ICs5Myw3IEBACiAJCWxwbmV3ZHJ2LT5scFByZXZJdGVtID0gbHBkcnY7CiAJCX0KIAlscG5ld2Rydi0+bHBEcnZQcm9jID0gTlVMTDsKLSAgICAJZHByaW50Zl9kcml2ZXIoc3RkZGViLCJPcGVuRHJpdmVyIC8vIGhEcnZyPSUwNFggbG9hZGVkICFcbiIsIGhEcnZyKTsKKyAgICAJZHByaW50Zl9kcml2ZXIoc3RkZGViLCJPcGVuRHJpdmVyIC8vIGhEcnZyPSJOUEZNVCIgbG9hZGVkICFcbiIsIGhEcnZyKTsKIAlyZXR1cm4gaERydnI7CiB9CiAKQEAgLTEwNCw3ICsxMDQsNyBAQAogewogCUxQRFJJVkVSSVRFTQlscGRydjsKICAgICAJZHByaW50Zl9kcml2ZXIoc3RkZGViLAotCQkiQ2xvc2VEcml2ZXIoJTA0WCwgJTA4bFgsICUwOGxYKTtcbiIsIGhEcnZyLCBsUGFyYW0xLCBsUGFyYW0yKTsKKwkJIkNsb3NlRHJpdmVyKCJOUEZNVCIsICUwOGxYLCAlMDhsWCk7XG4iLCBoRHJ2ciwgbFBhcmFtMSwgbFBhcmFtMik7CiAJbHBkcnYgPSAoTFBEUklWRVJJVEVNKSBHbG9iYWxMb2NrKGhEcnZyKTsKIAlpZiAobHBkcnYgIT0gTlVMTCAmJiBscGRydi0+ZGlzLmhEcml2ZXIgPT0gaERydnIpIHsKIAkJaWYgKGxwZHJ2LT5scFByZXZJdGVtKQpAQCAtMTEzLDcgKzExMyw3IEBACiAJCQkoKExQRFJJVkVSSVRFTSlscGRydi0+bHBOZXh0SXRlbSktPmxwUHJldkl0ZW0gPSBscGRydi0+bHBQcmV2SXRlbTsKIAkJR2xvYmFsVW5sb2NrKGhEcnZyKTsKIAkJR2xvYmFsRnJlZShoRHJ2cik7Ci0gICAgICAgIGRwcmludGZfZHJpdmVyKHN0ZGRlYiwiQ2xvc2VEcml2ZXIgLy8gaERydnI9JTA0WCBjbG9zZWQgIVxuIiwgaERydnIpOworICAgICAgICBkcHJpbnRmX2RyaXZlcihzdGRkZWIsIkNsb3NlRHJpdmVyIC8vIGhEcnZyPSJOUEZNVCIgY2xvc2VkICFcbiIsIGhEcnZyKTsKIAkJcmV0dXJuIFRSVUU7CiAJCX0KIAlyZXR1cm4gRkFMU0U7CkBAIC0xMjYsNyArMTI2LDcgQEAKIHsKIAlMUERSSVZFUklURU0JbHBkcnY7CiAJSEFORExFCQkJaE1vZHVsZSA9IDA7Ci0gICAgCWRwcmludGZfZHJpdmVyKHN0ZGRlYiwiR2V0RHJpdmVyTW9kdWxlSGFuZGxlKCUwNFgpO1xuIiwgaERydnIpOworICAgIAlkcHJpbnRmX2RyaXZlcihzdGRkZWIsIkdldERyaXZlck1vZHVsZUhhbmRsZSgiTlBGTVQiKTtcbiIsIGhEcnZyKTsKIAlscGRydiA9IChMUERSSVZFUklURU0pIEdsb2JhbExvY2soaERydnIpOwogCWlmIChscGRydiAhPSBOVUxMKSB7CiAJCWhNb2R1bGUgPSBscGRydi0+ZGlzLmhNb2R1bGU7CkBAIC0xNzUsNyArMTc1LDcgQEAKIEJPT0wgR2V0RHJpdmVySW5mbyhIRFJWUiBoRHJ2ciwgTFBEUklWRVJJTkZPU1RSVUNUIGxwRHJ2SW5mbykKIHsKIAlMUERSSVZFUklURU0JbHBkcnY7Ci0gICAgCWRwcmludGZfZHJpdmVyKHN0ZGRlYiwiR2V0RHJpdmVySW5mbyglMDRYLCAlcCk7XG4iLCBoRHJ2ciwgbHBEcnZJbmZvKTsKKyAgICAJZHByaW50Zl9kcml2ZXIoc3RkZGViLCJHZXREcml2ZXJJbmZvKCJOUEZNVCIsICVwKTtcbiIsIGhEcnZyLCBscERydkluZm8pOwogCWlmIChscERydkluZm8gPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwogCWxwZHJ2ID0gKExQRFJJVkVSSVRFTSkgR2xvYmFsTG9jayhoRHJ2cik7CiAJaWYgKGxwZHJ2ID09IE5VTEwpIHJldHVybiBGQUxTRTsKQEAgLTE5MSw3ICsxOTEsNyBAQAogewogCUxQRFJJVkVSSVRFTQlscGRydjsKIAlIRFJWUgkJCWhSZXREcnYgPSAwOwotICAgIAlkcHJpbnRmX2RyaXZlcihzdGRkZWIsIkdldE5leHREcml2ZXIoJTA0WCwgJTA4bFgpO1xuIiwgaERydnIsIGR3RmxhZ3MpOworICAgIAlkcHJpbnRmX2RyaXZlcihzdGRkZWIsIkdldE5leHREcml2ZXIoIk5QRk1UIiwgJTA4bFgpO1xuIiwgaERydnIsIGR3RmxhZ3MpOwogCWlmIChoRHJ2ciA9PSAwKSB7CiAJCWlmIChscERydkl0ZW1MaXN0ID09IE5VTEwpIHsKICAgICAgICAgICAgIAkJZHByaW50Zl9kcml2ZXIoc3RkZGViLApAQCAtMTk5LDcgKzE5OSw3IEBACiAJCQlMb2FkU3RhcnR1cERyaXZlcnMoKTsKIAkJCWlmIChscERydkl0ZW1MaXN0ID09IE5VTEwpIHJldHVybiAwOwogCQkJfQotICAgICAgICAJZHByaW50Zl9kcml2ZXIoc3RkZGViLCJHZXROZXh0RHJpdmVyIC8vIHJldHVybiBmaXJzdCAlMDRYICFcbiIsCisgICAgICAgIAlkcHJpbnRmX2RyaXZlcihzdGRkZWIsIkdldE5leHREcml2ZXIgLy8gcmV0dXJuIGZpcnN0ICJOUEZNVCIgIVxuIiwKIAkJCQkJbHBEcnZJdGVtTGlzdC0+ZGlzLmhEcml2ZXIpOwogCQlyZXR1cm4gbHBEcnZJdGVtTGlzdC0+ZGlzLmhEcml2ZXI7CiAJCX0KQEAgLTIxNSw3ICsyMTUsNyBAQAogCQkJfQogCQlHbG9iYWxVbmxvY2soaERydnIpOwogCQl9Ci0gICAgCWRwcmludGZfZHJpdmVyKHN0ZGRlYiwiR2V0TmV4dERyaXZlciAvLyByZXR1cm4gJTA0WCAhXG4iLCBoUmV0RHJ2KTsKKyAgICAJZHByaW50Zl9kcml2ZXIoc3RkZGViLCJHZXROZXh0RHJpdmVyIC8vIHJldHVybiAiTlBGTVQiICFcbiIsIGhSZXREcnYpOwogCXJldHVybiBoUmV0RHJ2OwogfQogCmRpZmYgLS1naXQgYS9taXNjL2ZpbGUuYyBiL21pc2MvZmlsZS5jCmluZGV4IDI0ODhjNjMuLmI5YmNjMDYgMTAwNjQ0Ci0tLSBhL21pc2MvZmlsZS5jCisrKyBiL21pc2MvZmlsZS5jCkBAIC0xMzksNyArMTM5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIE9wZW5GaWxlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQgT3BlbkZpbGUgKExQU1RSIGxwRmlsZU5hbWUsIExQT0ZTVFJVQ1Qgb2ZzLCBXT1JEIHdTdHlsZSkKK0lOVCBPcGVuRmlsZSAoTFBDU1RSIGxwRmlsZU5hbWUsIExQT0ZTVFJVQ1Qgb2ZzLCBVSU5UIHdTdHlsZSkKIHsKICAgICBjaGFyICAgICAgICAgZmlsZW5hbWVbTUFYX1BBVEgrMV07CiAgICAgaW50ICAgICAgICAgIGFjdGlvbjsKQEAgLTE0OSwxMCArMTQ5LDkgQEAKICAgICBpbnQgICAgICAgICAgdmVyaWZ5X3RpbWUgPSAwOwogICAKICAgICBkcHJpbnRmX2ZpbGUoc3RkZGViLCJPcGVuZmlsZSglcyw8c3RydWN0PiwlZClcbiIsbHBGaWxlTmFtZSx3U3R5bGUpOwotICAKKyAKICAgICBhY3Rpb24gPSB3U3R5bGUgJiAweGZmMDA7CiAgIAotICAKICAgICAvKiBPRl9DUkVBVEUgaXMgY29tcGxldGx5IGRpZmZlcmVudCBmcm9tIGFsbCBvdGhlciBvcHRpb25zLCBzbwogICAgICAgIGhhbmRsZSBpdCBmaXJzdCAqLwogCkBAIC0yNTEsNyArMjUwLDcgQEAKICAgICAKIAogICAgIGlmIChhY3Rpb24gJiBPRl9QQVJTRSkKLSAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gMDsKIAogICAgIGlmIChhY3Rpb24gJiBPRl9ERUxFVEUpCiAgICAgICByZXR1cm4gdW5saW5rKG9mcy0+c3pQYXRoTmFtZSk7CkBAIC0zNTUsOSArMzU0LDEzIEBACiB7CiAKICAgICAJZHByaW50Zl9maWxlKHN0ZGRlYiwiR2V0RHJpdmVUeXBlICVjOlxuIiwnQScrZHJpdmUpOworIAorICAgICAgICAvKiBGaWxlIERhbWFnZXIgdGhpbmtzIHRoYXQgb25seSByZXR1cm4gY29kZSAwIGlzIGJhZCBlbm91Z2ggCisJICogLUFsIEsKKwkgKi8KIAogCWlmICghRE9TX1ZhbGlkRHJpdmUoZHJpdmUpKQotCQlyZXR1cm4gRFJJVkVfRE9FU05PVEVYSVNUOworCQlyZXR1cm4gRFJJVkVfQ0FOTk9UREVURVJNSU5FOwogCiAJaWYgKGRyaXZlID09IDAgfHwgZHJpdmUgPT0gMSkKIAkJcmV0dXJuIERSSVZFX1JFTU9WQUJMRTsKZGlmZiAtLWdpdCBhL21pc2Mva2VybmVsMzIuYyBiL21pc2Mva2VybmVsMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2YTViYS4uMDAwMDAwMAotLS0gYS9taXNjL2tlcm5lbDMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogV2luMzIga2VybmVsIGZ1bmN0aW9ucwotICoKLSAqIENvcHlyaWdodCAxOTk1IE1hcnRpbiB2b24gTG9ld2lzCi0gKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIG9ubHkgd3JhcHBlcnMgdG8gZXhpc3RpbmcgV2luZSBmdW5jdGlvbnMgb3IgdHJpdmlhbAotICAgc3R1YnMuICdSZWFsJyBpbXBsZW1lbnRhdGlvbnMgZ28gaW50byBjb250ZXh0IHNwZWNpZmljIGZpbGVzICovCi0KLSNpbmNsdWRlICJ3aW5kb3dzLmgiCi0jaW5jbHVkZSAid2luZXJyb3IuaCIKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotaW50IFdJTjMyX0xhc3RFcnJvcjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0Q29tbWFuZExpbmVBICAgICAgKEtFUk5FTDMyLjE2MSkKLSAqLwotTFBTVFIgR2V0Q29tbWFuZExpbmVBKHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldEN1cnJlbnRUaHJlYWRJZCAgIChLRVJORUwzMi4yMDApCi0gKi8KLQotaW50IEdldEN1cnJlbnRUaHJlYWRJZCh2b2lkKQotewotCXJldHVybiBnZXRwaWQoKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRFbnZpcm9ubWVudFN0cmluZ3MgICAgKEtFUk5FTDMyLjIxMCkKLSAqLwotTFBTVFIgR2V0RW52aXJvbm1lbnRTdHJpbmdzKHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldFN0ZEhhbmRsZSAgICAgICAgICAgICAoS0VSTkVMMzIuMjc2KQotICovCi1IQU5ETEUgR2V0U3RkSGFuZGxlKERXT1JEIG5TdGRIYW5kbGUpCi17Ci0Jc3dpdGNoKG5TdGRIYW5kbGUpCi0JewotCQljYXNlIC0xMC8qU1REX0lOUFVUX0hBTkRMRSovOnJldHVybiAwOwotCQljYXNlIC0xMS8qU1REX09VVFBVVF9IQU5ETEUqLzpyZXR1cm4gMTsKLQkJY2FzZSAtMTIvKlNURF9FUlJPUl9IQU5ETEUqLzpyZXR1cm4gMjsKLQl9Ci0JcmV0dXJuIC0xOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRUaHJlYWRDb250ZXh0ICAgICAgICAgKEtFUk5FTDMyLjI5NCkKLSAqLwotQk9PTCBHZXRUaHJlYWRDb250ZXh0KEhBTkRMRSBoVGhyZWFkLCB2b2lkICpscENvbnRleHQpCi17Ci0JcmV0dXJuIEZBTFNFOwotfQpkaWZmIC0tZ2l0IGEvbWlzYy9tYWluLmMgYi9taXNjL21haW4uYwppbmRleCAyYTcwZGM0Li5kODg3NmExIDEwMDY0NAotLS0gYS9taXNjL21haW4uYworKysgYi9taXNjL21haW4uYwpAQCAtMzEsNyArMzEsNyBAQAogY29uc3QgY2hhciBwZW9wbGVbXSA9ICJXaW5lIGlzIGF2YWlsYWJsZSB0aGFua3MgdG8gdGhlIHdvcmsgb2YgIgogIkJvYiBBbXN0YWR0LCBEYWcgQXNoZWltLCBNYXJ0aW4gQXlvdHRlLCBSb3NzIEJpcm8sIEVyaWsgQm9zLCAiCiAiRm9ucyBCb3RtYW4sIEpvaG4gQnJlemFrLCBBbmRyZXcgQnVsaGFrLCBKb2huIEJ1cnRvbiwgUGF1bCBGYWxzdGFkLCAiCi0iT2xhZiBGbGViYmUsIFBldGVyIEdhbGJhdnksIFJhbW9uIEdhcmNpYSwgSGFucyBkZSBHcmFhZiwgIgorIk9sYWYgRmxlYmJlLCBQZXRlciBHYWxiYXZ5LCBSYW1vbiBHYXJjaWEsIEhhbnMgZGUgR3JhYWZmLCAiCiAiQ2hhcmxlcyBNLiBIYW5udW0sIENhbWVyb24gSGVpZGUsIEpvY2hlbiBIb2VuaWNrZSwgSmVmZnJleSBIc3UsICIKICJNaWd1ZWwgZGUgSWNhemEsIEFsZXhhbmRyZSBKdWxsaWFyZCwgSm9uIEtvbnJhdGgsIFNjb3R0IEEuIExhaXJkLCAiCiAiTWFydGluIHZvbiBMb2V3aXMsIEtlbm5ldGggTWFjRG9uYWxkLCBQZXRlciBNYWNEb25hbGQsIFdpbGxpYW0gTWFncm8sICIKQEAgLTExNCw3ICsxMTQsNyBAQAogICAiICAgIC1maXhlZG1hcCAgICAgICBVc2UgYSBcInN0YW5kYXJkXCIgY29sb3IgbWFwXG4iIFwKICAgIiAgICAtc3luY2hyb25vdXMgICAgVHVybiBvbiBzeW5jaHJvbm91cyBkaXNwbGF5IG1vZGVcbiIgXAogICAiICAgIC1iYWNraW5nc3RvcmUgICBUdXJuIG9uIGJhY2tpbmcgc3RvcmVcbiIgXAotICAiICAgIC1zcHkgZmlsZSAgICAgICBPYnNvbGV0ZS4gVXNlIC1kZWJ1Z21zZyArc3B5IGZvciBTcHkgbWVzc2FnZXNcbiIgXAorICAiICAgIC1zcHkgZmlsZSAgICAgICBPYnNvbGV0ZS4gVXNlIC1kZWJ1Z21zZyArbWVzc2FnZSBmb3IgbWVzc2FnZXNcbiIgXAogICAiICAgIC1kZWJ1Z21zZyBuYW1lICBUdXJuIGRlYnVnZ2luZy1tZXNzYWdlcyBvbiBvciBvZmZcbiIgXAogICAiICAgIC1kbGwgbmFtZSAgICAgICBFbmFibGUgb3IgZGlzYWJsZSBidWlsdC1pbiBETExzXG4iIFwKICAgIiAgICAtYWxsb3dyZWFkb25seSAgUmVhZCBvbmx5IGZpbGVzIG1heSBiZSBvcGVuZWQgaW4gd3JpdGUgbW9kZVxuIiBcCkBAIC00ODMsMTAgKzQ4MywxMiBAQAogc3RhdGljIHZvaWQgY2FsbGVkX2F0X2V4aXQodm9pZCkKIHsKICAgICBleHRlcm4gdm9pZCBzeW5jX3Byb2ZpbGVzKHZvaWQpOworICAgIGV4dGVybiB2b2lkIFNIRUxMX1NhdmVSZWdpc3RyeSh2b2lkKTsKIAogICAgIHN5bmNfcHJvZmlsZXMoKTsKICAgICBNQUlOX1Jlc3RvcmVTZXR1cCgpOwogICAgIFdTQUNsZWFudXAoKTsKKyAgICBTSEVMTF9TYXZlUmVnaXN0cnkoKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00OTksNiArNTAxLDcgQEAKICAgICBpbnQgKmRlcHRoX2xpc3Q7CiAKICAgICBleHRlcm4gaW50IF9XaW5NYWluKGludCBhcmdjLCBjaGFyICoqYXJndik7CisgICAgZXh0ZXJuIHZvaWQgU0hFTExfTG9hZFJlZ2lzdHJ5KHZvaWQpOwogCiAgICAgc2V0YnVmKHN0ZG91dCxOVUxMKTsKICAgICBzZXRidWYoc3RkZXJyLE5VTEwpOwpAQCAtNTI1LDYgKzUyOCw4IEBACiAgICAgfQogI2VuZGlmCiAKKyAgICBTSEVMTF9Mb2FkUmVnaXN0cnkoKTsKKwogICAgIHNjcmVlbiAgICAgICA9IERlZmF1bHRTY3JlZW5PZkRpc3BsYXkoIGRpc3BsYXkgKTsKICAgICBzY3JlZW5XaWR0aCAgPSBXaWR0aE9mU2NyZWVuKCBzY3JlZW4gKTsKICAgICBzY3JlZW5IZWlnaHQgPSBIZWlnaHRPZlNjcmVlbiggc2NyZWVuICk7CkBAIC01NzksMTAgKzU4NCwxNiBAQAogICovCiBMT05HIEdldFdpbkZsYWdzKHZvaWQpCiB7CisgIHN0YXRpYyBjb25zdCBsb25nIGNwdWZsYWdzWzVdID0KKyAgICB7IFdGX0NQVTA4NiwgV0ZfQ1BVMTg2LCBXRl9DUFUyODYsIFdGX0NQVTM4NiwgV0ZfQ1BVNDg2IH07CisKKyAgLyogVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSBQZW50aXVtIGZsYWcuICAqLworICBsb25nIGNwdWZsYWcgPSBjcHVmbGFnc1ttaW4gKHJ1bnRpbWVfY3B1ICgpLCA0KV07CisKICAgaWYgKE9wdGlvbnMuZW5oYW5jZWQpCi0gICAgcmV0dXJuIChXRl9FTkhBTkNFRCB8IFdGX0NQVTM4NiB8IFdGX1BNT0RFIHwgV0ZfODB4ODcgfCBXRl9QQUdJTkcpOworICAgIHJldHVybiAoV0ZfRU5IQU5DRUQgfCBjcHVmbGFnIHwgV0ZfUE1PREUgfCBXRl84MHg4NyB8IFdGX1BBR0lORyk7CiAgIGVsc2UKLSAgICByZXR1cm4gKFdGX1NUQU5EQVJEIHwgV0ZfQ1BVMzg2IHwgV0ZfUE1PREUgfCBXRl84MHg4Nyk7CisgICAgcmV0dXJuIChXRl9TVEFOREFSRCB8IGNwdWZsYWcgfCBXRl9QTU9ERSB8IFdGXzgweDg3KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02NTMsNiArNjY0LDE3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICBTZXRFbnZpcm9ubWVudFZhcmlhYmxlQSAoS0VSTkVMMzIuNDg0KQorICovCitCT09MIFNldEVudmlyb25tZW50VmFyaWFibGVBKExQU1RSIGxwTmFtZSwgTFBTVFIgbHBWYWx1ZSkKK3sKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IFNldEVudmlyb25tZW50KGxwTmFtZSwgbHBWYWx1ZSwgc3RybGVuKGxwVmFsdWUpICsgMSk7CisgICAgcmV0dXJuIChyYyA+IDApID8gMSA6IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJR2V0RW52aXJvbm1lbnQgKEdESS4xMzQpCiAgKi8KIGludCBHZXRFbnZpcm9ubWVudChMUFNUUiBscFBvcnROYW1lLCBMUFNUUiBscEVudmlyb24sIFdPUkQgbk1heFNpeikKQEAgLTY3NSw2ICs2OTcsNTkgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgIEdldEVudmlyb25tZW50VmFyaWFibGVBIChLRVJORUwzMi4yMTMpCisgKi8KK0RXT1JEIEdldEVudmlyb25tZW50VmFyaWFibGVBKExQU1RSIGxwTmFtZSwgTFBTVFIgbHBWYWx1ZSwgRFdPUkQgc2l6ZSkKK3sKKyAgICByZXR1cm4gR2V0RW52aXJvbm1lbnQobHBOYW1lLCBscFZhbHVlLCBzaXplKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgIEdldEVudmlyb25tZW50U3RyaW5ncyAoS0VSTkVMMzIuMjEwKQorICovCitMUFZPSUQgR2V0RW52aXJvbm1lbnRTdHJpbmdzKHZvaWQpCit7CisgICAgaW50IGNvdW50OworICAgIExQRU5WRU5UUlkgbHBFbnY7CisgICAgY2hhciAqZW52dGFibGUsICplbnZwdHI7CisKKyAgICAvKiBDb3VudCB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdlJ2xsIG5lZWQgZm9yIHRoZSBzdHJpbmcKKyAgICAgKiB0YWJsZS4gIEluY2x1ZGUgdGhlIHRyYWlsaW5nIG51bHMgYW5kIHRoZSBmaW5hbCBkb3VibGUgbnVsLgorICAgICAqLworICAgIGNvdW50ID0gMTsKKyAgICBscEVudiA9IGxwRW52TGlzdDsKKyAgICB3aGlsZShscEVudiAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYobHBFbnYtPk5hbWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY291bnQgKz0gc3RybGVuKGxwRW52LT5OYW1lKSArIDE7CisgICAgICAgICAgICBjb3VudCArPSBzdHJsZW4obHBFbnYtPlZhbHVlKSArIDE7CisgICAgICAgIH0KKyAgICAgICAgbHBFbnYgPSBscEVudi0+TmV4dDsKKyAgICB9CisKKyAgICBlbnZ0YWJsZSA9IG1hbGxvYyhjb3VudCk7CisgICAgaWYoZW52dGFibGUpCisgICAgeworICAgICAgICBscEVudiA9IGxwRW52TGlzdDsKKyAgICAgICAgZW52cHRyID0gZW52dGFibGU7CisKKyAgICAgICAgd2hpbGUobHBFbnYgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYobHBFbnYtPk5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCA9IHNwcmludGYoZW52cHRyLCAiJXM9JXMiLCBscEVudi0+TmFtZSwgbHBFbnYtPlZhbHVlKTsKKyAgICAgICAgICAgICAgICBlbnZwdHIgKz0gY291bnQgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbHBFbnYgPSBscEVudi0+TmV4dDsKKyAgICAgICAgfQorICAgICAgICAqZW52cHRyID0gJ1wwJzsKKyAgICB9CisKKyAgICByZXR1cm4gZW52dGFibGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJR2V0VGltZXJSZXNvbHV0aW9uIChVU0VSLjE0KQogICovCiBMT05HIEdldFRpbWVyUmVzb2x1dGlvbih2b2lkKQpkaWZmIC0tZ2l0IGEvbWlzYy9uZXR3b3JrLmMgYi9taXNjL25ldHdvcmsuYwppbmRleCBhYmY3ZTFiLi5iNzk4YTVlIDEwMDY0NAotLS0gYS9taXNjL25ldHdvcmsuYworKysgYi9taXNjL25ldHdvcmsuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAgKi8KIGludCBXTmV0V2F0Y2hRdWV1ZShIV05EIGhXbmQsTFBTVFIgc3pMb2NhbCxMUFNUUiBzelVzZXIsV09SRCBuUXVldWUpCiB7Ci0JcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0V2F0Y2hRdWV1ZSgleCwnJXMnLCclcycsJXgpXG4iLAorCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldFdhdGNoUXVldWUoIk5QRk1UIiwnJXMnLCclcycsJXgpXG4iLAogCQloV25kLHN6TG9jYWwsc3pVc2VyLG5RdWV1ZSk7CiAJcmV0dXJuIFdOX05FVF9FUlJPUjsKIH0KQEAgLTE5Niw3ICsxOTYsNyBAQAogICovCiBpbnQgV05ldERldmljZU1vZGUoSFdORCBoV25kT3duZXIpCiB7Ci0JcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0RGV2aWNlTW9kZSgleClcbiIsaFduZE93bmVyKTsKKwlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXREZXZpY2VNb2RlKCJOUEZNVCIpXG4iLGhXbmRPd25lcik7CiAJcmV0dXJuIFdOX05FVF9FUlJPUjsKIH0KIApAQCAtMjA1LDcgKzIwNSw3IEBACiAgKi8KIGludCBXTmV0QnJvd3NlRGlhbG9nKEhXTkQgaFBhcmVudCxXT1JEIG5UeXBlLExQU1RSIHN6UGF0aCkKIHsKLQlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRCcm93c2VEaWFsb2coJXgsJXgsJyVzJylcbiIsCisJcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0QnJvd3NlRGlhbG9nKCJOUEZNVCIsJXgsJyVzJylcbiIsCiAJCWhQYXJlbnQsblR5cGUsc3pQYXRoKTsKIAlyZXR1cm4gV05fTkVUX0VSUk9SOwogfQpAQCAtMjY1LDcgKzI2NSw3IEBACiAgKi8KIGludCBXTmV0UmVzdG9yZUNvbm5lY3Rpb24oSFdORCBod25kT3duZXIsTFBTVFIgbHBzekRldmljZSkKIHsKLQlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRSZXN0b3JlQ29ubmVjdGlvbigleCwnJXMnKVxuIiwKKwlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRSZXN0b3JlQ29ubmVjdGlvbigiTlBGTVQiLCclcycpXG4iLAogCQlod25kT3duZXIsbHBzekRldmljZSk7CiAJcmV0dXJuIFdOX05FVF9FUlJPUjsKIH0KQEAgLTI3Myw5ICsyNzMsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgV05ldFdyaXRlSm9iICAgICAgIFtVU0VSLjUyNF0KICAqLwotaW50IFdOZXRXcml0ZUpvYihXT1JEIGhKb2Isdm9pZCAqbHBEYXRhLExQV09SRCBscGNiRGF0YSkKK2ludCBXTmV0V3JpdGVKb2IoSEFORExFIGhKb2Isdm9pZCAqbHBEYXRhLExQV09SRCBscGNiRGF0YSkKIHsKLQlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRXcml0ZUpvYigleCwlcCwlcClcbiIsCisJcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0V3JpdGVKb2IoIk5QRk1UIiwlcCwlcClcbiIsCiAJCWhKb2IsbHBEYXRhLGxwY2JEYXRhKTsKIAlyZXR1cm4gV05fTkVUX0VSUk9SOwogfQpAQCAtMjg1LDcgKzI4NSw3IEBACiAgKi8KIFVJTlQgV05ldENvbm5lY3REaWFsb2coSFdORCBoV25kUGFyZW50LCBXT1JEIGlUeXBlKQogewotCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldENvbm5lY3REaWFsb2coJTRYLCAlNFgpXG4iLCBoV25kUGFyZW50LCBpVHlwZSk7CisJcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0Q29ubmVjdERpYWxvZygiTlBGTVQiLCAlNFgpXG4iLCBoV25kUGFyZW50LCBpVHlwZSk7CiAJcmV0dXJuIFdOX1NVQ0NFU1M7CiB9CiAKQEAgLTI5NCw3ICsyOTQsNyBAQAogICovCiBpbnQgV05ldERpc2Nvbm5lY3REaWFsb2coSFdORCBod25kT3duZXIsIFdPUkQgaVR5cGUpCiB7Ci0JcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0RGlzY29ubmVjdERpYWxvZygleCwleClcbiIsCisJcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0RGlzY29ubmVjdERpYWxvZygiTlBGTVQiLCV4KVxuIiwKIAkJaHduZE93bmVyLGlUeXBlKTsKIAlyZXR1cm4gV05fTkVUX0VSUk9SOwogfQpAQCAtMzA0LDcgKzMwNCw3IEBACiAgKi8KIFVJTlQgV05ldENvbm5lY3Rpb25EaWFsb2coSFdORCBoV25kUGFyZW50LCBXT1JEIGlUeXBlKQogewotCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldENvbm5lY3Rpb25EaWFsb2coJTRYLCAlNFgpXG4iLCAKKwlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRDb25uZWN0aW9uRGlhbG9nKCJOUEZNVCIsICU0WClcbiIsIAogCQloV25kUGFyZW50LCBpVHlwZSk7CiAJcmV0dXJuIFdOX1NVQ0NFU1M7CiB9CkBAIC0zMTQsNyArMzE0LDcgQEAKICAqLwogaW50IFdOZXRWaWV3UXVldWVEaWFsb2coSFdORCBod25kT3duZXIsTFBTVFIgbHBzelF1ZXVlKQogewotCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldFZpZXdRdWV1ZURpYWxvZygleCwnJXMnKVxuIiwKKwlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRWaWV3UXVldWVEaWFsb2coIk5QRk1UIiwnJXMnKVxuIiwKIAkJaHduZE93bmVyLGxwc3pRdWV1ZSk7CiAJcmV0dXJuIFdOX05FVF9FUlJPUjsKIH0KQEAgLTMyNSw3ICszMjUsNyBAQAogaW50IFdOZXRQcm9wZXJ0eURpYWxvZyhIV05EIGh3bmRQYXJlbnQsV09SRCBpQnV0dG9uLAogCVdPUkQgblByb3BTZWwsTFBTVFIgbHBzek5hbWUsV09SRCBuVHlwZSkKIHsKLQlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRQcm9wZXJ0eURpYWxvZygleCwleCwleCwnJXMnLCV4KVxuIiwKKwlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRQcm9wZXJ0eURpYWxvZygiTlBGTVQiLCV4LCV4LCclcycsJXgpXG4iLAogCQlod25kUGFyZW50LGlCdXR0b24sblByb3BTZWwsbHBzek5hbWUsblR5cGUpOwogCXJldHVybiBXTl9ORVRfRVJST1I7CiB9CkBAIC0zNDUsNyArMzQ1LDcgQEAKICAqLwogaW50IFdOZXREaXJlY3RvcnlOb3RpZnkoSFdORCBod25kT3duZXIsdm9pZCAqbHBEaXIsV09SRCB3T3BlcikKIHsKLQlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXREaXJlY3RvcnlOb3RpZnkoJXgsJXAsJXgpXG4iLAorCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldERpcmVjdG9yeU5vdGlmeSgiTlBGTVQiLCVwLCV4KVxuIiwKIAkJaHduZE93bmVyLGxwRGlyLHdPcGVyKTsKIAlyZXR1cm4gV05fTkVUX0VSUk9SOwogfQpAQCAtMzU2LDcgKzM1Niw3IEBACiBpbnQgV05ldEdldFByb3BlcnR5VGV4dChIV05EIGh3bmRQYXJlbnQsV09SRCBpQnV0dG9uLFdPUkQgblByb3BTZWwsCiAJTFBTVFIgbHBzek5hbWUsV09SRCBuVHlwZSkKIHsKLQlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRHZXRQcm9wZXJ0eVRleHQoJXgsJXgsJXgsJyVzJywleClcbiIsCisJcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0R2V0UHJvcGVydHlUZXh0KCJOUEZNVCIsJXgsJXgsJyVzJywleClcbiIsCiAJCWh3bmRQYXJlbnQsaUJ1dHRvbixuUHJvcFNlbCxscHN6TmFtZSxuVHlwZSk7CiAJcmV0dXJuIFdOX05FVF9FUlJPUjsKIH0KQEAgLTM3Nyw3ICszNzcsNyBAQAogICovCiBVSU5UIFdOZXRDbG9zZUVudW0oSEFORExFIGhFbnVtKQogewotCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldENsb3NlRW51bSglMDRYKTtcbiIsIGhFbnVtKTsKKwlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRDbG9zZUVudW0oIk5QRk1UIik7XG4iLCBoRW51bSk7CiAJcmV0dXJuIFdOX05FVF9FUlJPUjsKIH0KIApAQCAtMzg3LDcgKzM4Nyw3IEBACiBVSU5UIFdOZXRFbnVtUmVzb3VyY2UoSEFORExFIGhFbnVtLCBEV09SRCBjUmVxdSwgCiAJCQkJRFdPUkQgKmxwQ291bnQsIExQVk9JRCBscEJ1ZikKIHsKLQlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRFbnVtUmVzb3VyY2UoJTA0WCwgJTA4bFgsICVwLCAlcCk7XG4iLCAKKwlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRFbnVtUmVzb3VyY2UoIk5QRk1UIiwgJTA4bFgsICVwLCAlcCk7XG4iLCAKIAkJCQkJCQloRW51bSwgY1JlcXUsIGxwQ291bnQsIGxwQnVmKTsKIAlyZXR1cm4gV05fTkVUX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy9vbGUyZGlzcC5jIGIvbWlzYy9vbGUyZGlzcC5jCmluZGV4IDkyZGJhNDguLmVkYjQ2MWMgMTAwNjQ0Ci0tLSBhL21pc2Mvb2xlMmRpc3AuYworKysgYi9taXNjL29sZTJkaXNwLmMKQEAgLTMxLDEyICszMSwyMCBAQAogCWlmKCFCU1RSaGVhcHNlbCkKIAkJcmV0dXJuIDA7CiAJbWVtPUxPQ0FMX0FsbG9jKEJTVFJoZWFwc2VsLExNRU1fRklYRUQsbik7CisjaWZkZWYgV0lORUxJQjMyCisJcmV0dXJuIChCU1RSKW1lbTsKKyNlbHNlCiAJcmV0dXJuIG1lbSA/IE1BS0VMT05HKG1lbSxCU1RSaGVhcHNlbCkgOiAwOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIEJTVFJfRnJlZShCU1RSIGluKQogeworI2lmZGVmIFdJTkVMSUIzMgorCUxPQ0FMX0ZyZWUoQlNUUmhlYXBzZWwsIChIQU5ETEUpaW4pOworI2Vsc2UKIAlMT0NBTF9GcmVlKEJTVFJoZWFwc2VsLCBMT1dPUkQoaW4pKTsKKyNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCogQlNUUl9HZXRBZGRyKEJTVFIgaW4pCmRpZmYgLS1naXQgYS9taXNjL29sZTJubHMuYyBiL21pc2Mvb2xlMm5scy5jCmluZGV4IGZiZWMzZDcuLjU5MTVjZTggMTAwNjQ0Ci0tLSBhL21pc2Mvb2xlMm5scy5jCisrKyBiL21pc2Mvb2xlMm5scy5jCkBAIC0yNiw2ICsyNiw4IEBACiAJcmV0dXJuIDc7CiAjZWxpZiAjTEFORyhFcykKIAlyZXR1cm4gNzsgLyogSnVzdCBhIEd1ZXNzIDotKSAqLworI2VsaWYgI0xBTkcoRnIpCisJcmV0dXJuIDc7IC8qIGRpdHRvIDotKSAqLwogI2VsaWYgI0xBTkcoTm8pCiAJcmV0dXJuIDB4MTQ7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvbWlzYy9vbGVjbGkuYyBiL21pc2Mvb2xlY2xpLmMKaW5kZXggMGRhZGQxYS4uY2E1Y2E5ZCAxMDA2NDQKLS0tIGEvbWlzYy9vbGVjbGkuYworKysgYi9taXNjL29sZWNsaS5jCkBAIC01Miw2ICs1Miw2IEBACiAgKi8KIEJPT0wgV0lOQVBJIE9sZUlzRGNNZXRhKEhEQyBoZGMpCiB7Ci0JZHByaW50Zl9vbGUoc3RkZGViLCJPbGVJc0RDTWV0YSglMDRYKVxuIixoZGMpOworCWRwcmludGZfb2xlKHN0ZGRlYiwiT2xlSXNEQ01ldGEoIk5QRk1UIilcbiIsaGRjKTsKIAlyZXR1cm4gR0RJX0dldE9ialB0ciggaGRjLCBNRVRBRklMRV9EQ19NQUdJQyApICE9IDA7CiB9CmRpZmYgLS1naXQgYS9taXNjL3NoZWxsLmMgYi9taXNjL3NoZWxsLmMKaW5kZXggNzU4OGE1Ny4uMTI4MjJmMSAxMDA2NDQKLS0tIGEvbWlzYy9zaGVsbC5jCisrKyBiL21pc2Mvc2hlbGwuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgInJlbGF5MzIuaCIKICNpbmNsdWRlICIuLi9yYy9zeXNyZXMuaCIKICNpbmNsdWRlICJkbGdzLmgiCisjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCkBAIC0zNiw3ICszNyw3IEBACiAgICAgICAgIHByaW50ZigiU0hFTExfUmVnQ2hlY2tGb3JSb290OiBDb3VsZG4ndCBhbGxvY2F0ZSByb290IGtleSFcbiIpOwogICAgICAgICByZXR1cm4gRVJST1JfT1VUT0ZNRU1PUlk7CiAgICAgICB9Ci0gICAgICBscGhSb290S2V5LT5oS2V5ID0gMTsKKyAgICAgIGxwaFJvb3RLZXktPmhLZXkgPSAoSEtFWSkxOwogICAgICAgbHBoUm9vdEtleS0+bHBTdWJLZXkgPSBSb290S2V5TmFtZTsKICAgICAgIGxwaFJvb3RLZXktPmR3VHlwZSA9IDA7CiAgICAgICBscGhSb290S2V5LT5scFZhbHVlID0gTlVMTDsKQEAgLTYwLDYgKzYxLDE1NyBAQAogICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOwogfQogCisvKiBGSVhNRTogdGhlIGxvYWRpbmcgYW5kIHNhdmluZyBvZiB0aGUgcmVnaXN0cnkgZGF0YWJhc2UgaXMgcmF0aGVyIG1lc3N5LgorICogYmFkIGlucHV0ICh3aGlsZSByZWFkaW5nKSBtYXkgY3Jhc2ggd2luZS4KKyAqLwordm9pZAorX0R1bXBMZXZlbChGSUxFICpmLExQS0VZU1RSVUNUIGxwVEtleSxpbnQgdGFicykgeworCUxQS0VZU1RSVUNUCWxwS2V5OworCisJbHBLZXk9bHBUS2V5LT5scFN1Ykx2bDsKKwl3aGlsZSAobHBLZXkpIHsKKwkJaW50CWk7CisJCWZvciAoaT0wO2k8dGFicztpKyspIGZwcmludGYoZiwiXHQiKTsKKwkJLyogaW1wbGVtZW50IGRpZmZlcmVudCBkd1R5cGVzIC4uLiAqLworCQlpZiAobHBLZXktPmxwVmFsdWUpCisJCQlmcHJpbnRmKGYsIiVzPSVzXG4iLGxwS2V5LT5scFN1YktleSxscEtleS0+bHBWYWx1ZSk7CisJCWVsc2UKKwkJCWZwcmludGYoZiwiJXNcbiIsbHBLZXktPmxwU3ViS2V5KTsKKworCQlpZiAobHBLZXktPmxwU3ViTHZsKQorCQkJX0R1bXBMZXZlbChmLGxwS2V5LHRhYnMrMSk7CisJCWxwS2V5PWxwS2V5LT5scE5leHRLZXk7CisJfQorfQorCitzdGF0aWMgdm9pZAorX1NhdmVLZXkoSEtFWSBoS2V5LGNoYXIgKndoZXJlKSB7CisJRklMRQkJKmY7CisJTFBLRVlTVFJVQ1QJbHBLZXk7CisKKwlmPWZvcGVuKHdoZXJlLCJ3Iik7CisJaWYgKGY9PU5VTEwpIHsKKwkJcGVycm9yKCJyZWdpc3RyeS1mb3BlbiIpOworCQlyZXR1cm47CisJfQorCXN3aXRjaCAoKERXT1JEKWhLZXkpIHsKKwljYXNlIEhLRVlfQ0xBU1NFU19ST09UOgorCQlscEtleT1scGhSb290S2V5OworCQlicmVhazsKKwlkZWZhdWx0OnJldHVybjsKKwl9CisJX0R1bXBMZXZlbChmLGxwS2V5LDApOworCWZjbG9zZShmKTsKK30KKwordm9pZAorU0hFTExfU2F2ZVJlZ2lzdHJ5KHZvaWQpIHsKKwkvKiBGSVhNRTogCisJICogLWltcGxlbWVudCB3aW45NSBhZGRpdGlvbmFsIGtleXR5cGVzIGhlcmUKKwkgKiAoSEtFWV9MT0NBTF9NQUNISU5FLEhLRVlfQ1VSUkVOVF9VU0VSIG9yIHdoYXRldmVyKQorCSAqIC1jaG9vc2UgYmV0dGVyIGZpbGVuYW1lKHMpCisJICovCisJX1NhdmVLZXkoSEtFWV9DTEFTU0VTX1JPT1QsIi90bXAvd2luZXJlZyIpOworfQorCisjZGVmaW5lIEJVRlNJWkUJMjU2Cit2b2lkCitfTG9hZExldmVsKEZJTEUgKmYsTFBLRVlTVFJVQ1QgbHBLZXksaW50IHRhYnNleHAsY2hhciAqYnVmKSB7CisJaW50CQlpOworCWNoYXIJCSpzLCp0OworCUhLRVkJCWhOZXdLZXk7CisJTFBLRVlTVFJVQ1QJbHBOZXdLZXk7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoTlVMTD09ZmdldHMoYnVmLEJVRlNJWkUsZikpIHsKKwkJCWJ1ZlswXT0wOworCQkJcmV0dXJuOworCQl9CisJCWZvciAoaT0wO2J1ZltpXT09J1x0JztpKyspIC8qZW1wdHkqLzsKKwkJcz1idWYraTsKKwkJaWYgKE5VTEwhPSh0PXN0cmNocihzLCdcbicpKSkgKnQ9J1wwJzsKKwkJaWYgKE5VTEwhPSh0PXN0cmNocihzLCdccicpKSkgKnQ9J1wwJzsKKworCQlpZiAoaTx0YWJzZXhwKSByZXR1cm47CisKKwkJaWYgKGk+dGFic2V4cCkgeworCQkJaE5ld0tleT1HbG9iYWxBbGxvYyhHTUVNX01PVkVBQkxFLHNpemVvZihLRVlTVFJVQ1QpKTsKKwkJCWxwTmV3S2V5PWxwS2V5LT5scFN1Ykx2bD0oTFBLRVlTVFJVQ1QpR2xvYmFsTG9jayhoTmV3S2V5KTsKKwkJCWxwTmV3S2V5LT5oS2V5CQk9IGhOZXdLZXk7CisJCQlscE5ld0tleS0+ZHdUeXBlCT0gMDsKKwkJCWxwTmV3S2V5LT5scFN1YktleQk9CisJCQlscE5ld0tleS0+bHBWYWx1ZQk9CisJCQlscE5ld0tleS0+bHBTdWJMdmwJPQorCQkJbHBOZXdLZXktPmxwTmV4dEtleQk9CisJCQlscE5ld0tleS0+bHBQcmV2S2V5CT0gTlVMTDsKKwkJCWlmIChOVUxMIT0odD1zdHJjaHIocywnPScpKSkgeworCQkJCSp0PSdcMCc7dCsrOworCQkJCWxwTmV3S2V5LT5kd1R5cGUJPSBSRUdfU1o7CisJCQkJbHBOZXdLZXktPmxwU3ViS2V5CT0gc3RyZHVwKHMpOworCQkJCWxwTmV3S2V5LT5scFZhbHVlCT0gc3RyZHVwKHQpOworCQkJfSBlbHNlIHsKKwkJCQlscE5ld0tleS0+ZHdUeXBlCT0gUkVHX1NaOworCQkJCWxwTmV3S2V5LT5scFN1YktleQk9IHN0cmR1cChzKTsKKwkJCX0KKwkJCV9Mb2FkTGV2ZWwoZixscE5ld0tleSx0YWJzZXhwKzEsYnVmKTsKKwkJfQorCQlmb3IgKGk9MDtidWZbaV09PSdcdCc7aSsrKSAvKmVtcHR5Ki87CisJCXM9YnVmK2k7CisJCWlmIChpPHRhYnNleHApIHJldHVybjsKKwkJaWYgKGJ1ZlswXT09J1wwJykgYnJlYWs7IC8qIG1hcmtzIGVuZCBvZiBmaWxlICovCisJCS8qIHdlIGhhdmUgYSBidWYgbm93LiBldmVuIHdoZW4gcmV0dXJuaW5nIGZyb20gX0xvYWRMZXZlbCAqLworCQloTmV3S2V5CQk9IEdsb2JhbEFsbG9jKEdNRU1fTU9WRUFCTEUsc2l6ZW9mKEtFWVNUUlVDVCkpOworCQlscE5ld0tleQk9IGxwS2V5LT5scE5leHRLZXk9KExQS0VZU1RSVUNUKUdsb2JhbExvY2soaE5ld0tleSk7CisJCWxwTmV3S2V5LT5scFByZXZLZXkJPSBscEtleTsKKwkJbHBOZXdLZXktPmhLZXkJCT0gaE5ld0tleTsKKwkJbHBOZXdLZXktPmR3VHlwZQk9IDA7CisJCWxwTmV3S2V5LT5scFN1YktleQk9CisJCWxwTmV3S2V5LT5scFZhbHVlCT0KKwkJbHBOZXdLZXktPmxwU3ViTHZsCT0KKwkJbHBOZXdLZXktPmxwTmV4dEtleQk9IE5VTEw7CisJCWlmIChOVUxMIT0odD1zdHJjaHIocywnPScpKSkgeworCQkJKnQ9J1wwJzt0Kys7CisJCQlscE5ld0tleS0+ZHdUeXBlCT0gUkVHX1NaOworCQkJbHBOZXdLZXktPmxwU3ViS2V5CT0gc3RyZHVwKHMpOworCQkJbHBOZXdLZXktPmxwVmFsdWUJPSBzdHJkdXAodCk7CisJCX0gZWxzZSB7CisJCQlscE5ld0tleS0+ZHdUeXBlCT0gUkVHX1NaOworCQkJbHBOZXdLZXktPmxwU3ViS2V5CT0gc3RyZHVwKHMpOworCQl9CisJCWxwS2V5PWxwTmV3S2V5OworCX0KK30KKwordm9pZAorX0xvYWRLZXkoSEtFWSBoS2V5LGNoYXIgKmZyb20pIHsKKwlGSUxFCQkqZjsKKwlMUEtFWVNUUlVDVAlscEtleTsKKwljaGFyCQlidWZbQlVGU0laRV07IC8qIEZJWE1FOiBsb25nIGVub3VnaD8gKi8KKworCWY9Zm9wZW4oZnJvbSwiciIpOworCWlmIChmPT1OVUxMKSB7CisJCXBlcnJvcigiZm9wZW4tcmVnaXN0cnktcmVhZCIpOworCQlyZXR1cm47CisJfQorCXN3aXRjaCAoKERXT1JEKWhLZXkpIHsKKwljYXNlIEhLRVlfQ0xBU1NFU19ST09UOgorCQlscEtleT1scGhSb290S2V5OworCQlicmVhazsKKwlkZWZhdWx0OnJldHVybjsKKwl9CisJX0xvYWRMZXZlbChmLGxwS2V5LC0xLGJ1Zik7Cit9CisKK3ZvaWQKK1NIRUxMX0xvYWRSZWdpc3RyeSh2b2lkKSB7CisJRFdPUkQJZHdSZXQ7CisKKwlkd1JldD1TSEVMTF9SZWdDaGVja0ZvclJvb3QoKTsKKwlpZiAoZHdSZXQhPUVSUk9SX1NVQ0NFU1MpIAorCQlyZXR1cm47Lyp2ZXJ5IGJhZCBtYWdpYywgaWYgd2UgY2FuJ3QgZXZlbiBhbGxvY2F0ZSB0aGUgcm9vdGtleXMqLworCV9Mb2FkS2V5KEhLRVlfQ0xBU1NFU19ST09ULCIvdG1wL3dpbmVyZWciKTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCVJlZ09wZW5LZXkJCVtTSEVMTC4xXQogICovCkBAIC03MywxNiArMjI1LDE2IEBACiAgICAgICAgIGR3UmV0ID0gU0hFTExfUmVnQ2hlY2tGb3JSb290KCk7CiAgICAgICAgIGlmIChkd1JldCAhPSBFUlJPUl9TVUNDRVNTKSByZXR1cm4gZHdSZXQ7CiAJZHByaW50Zl9yZWcoc3RkZGViLCAiUmVnT3BlbktleSglMDhsWCwgJXA9JyVzJywgJXApXG4iLAotCQkJCQkJaEtleSwgbHBTdWJLZXksIGxwU3ViS2V5LCBscGhLZXkpOworCQkJCSAgICAgICAoRFdPUkQpaEtleSwgbHBTdWJLZXksIGxwU3ViS2V5LCBscGhLZXkpOwogCWlmIChscGhLZXkgPT0gTlVMTCkgcmV0dXJuIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwotICAgICAgICBzd2l0Y2goaEtleSkgeworICAgICAgICBzd2l0Y2goKERXT1JEKWhLZXkpIHsKIAljYXNlIDA6IAogCSAgbHBLZXkgPSBscGhUb3BLZXk7IGJyZWFrOwogICAgICAgICBjYXNlIEhLRVlfQ0xBU1NFU19ST09UOiAvKiA9PSAxICovCiAgICAgICAgIGNhc2UgMHg4MDAwMDAwMDoKICAgICAgICAgICBscEtleSA9IGxwaFJvb3RLZXk7IGJyZWFrOwogICAgICAgICBkZWZhdWx0OiAKLQkgIGRwcmludGZfcmVnKHN0ZGRlYiwiUmVnT3BlbktleSAvLyBzcGVjaWZpYyBrZXkgPSAlMDhsWCAhXG4iLCBoS2V5KTsKKwkgIGRwcmludGZfcmVnKHN0ZGRlYiwiUmVnT3BlbktleSAvLyBzcGVjaWZpYyBrZXkgPSAlMDhsWCAhXG4iLCAoRFdPUkQpaEtleSk7CiAJICBscEtleSA9IChMUEtFWVNUUlVDVClHbG9iYWxMb2NrKGhLZXkpOwogICAgICAgICB9CiAJaWYgKGxwU3ViS2V5ID09IE5VTEwgfHwgISpscFN1YktleSkgIHsgCkBAIC0xMjcsMTYgKzI3OSwxNiBAQAogCiAJZHdSZXQgPSBTSEVMTF9SZWdDaGVja0ZvclJvb3QoKTsKICAgICAgICAgaWYgKGR3UmV0ICE9IEVSUk9SX1NVQ0NFU1MpIHJldHVybiBkd1JldDsKLQlkcHJpbnRmX3JlZyhzdGRkZWIsICJSZWdDcmVhdGVLZXkoJTA4bFgsICclcycsICVwKVxuIiwJaEtleSwgbHBTdWJLZXksIGxwaEtleSk7CisJZHByaW50Zl9yZWcoc3RkZGViLCAiUmVnQ3JlYXRlS2V5KCUwOGxYLCAnJXMnLCAlcClcbiIsCShEV09SRCloS2V5LCBscFN1YktleSwgbHBoS2V5KTsKIAlpZiAobHBoS2V5ID09IE5VTEwpIHJldHVybiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKLSAgICAgICAgc3dpdGNoKGhLZXkpIHsKKyAgICAgICAgc3dpdGNoKChEV09SRCloS2V5KSB7CiAJY2FzZSAwOiAKIAkgIGxwS2V5ID0gbHBoVG9wS2V5OyBicmVhazsKICAgICAgICAgY2FzZSBIS0VZX0NMQVNTRVNfUk9PVDogLyogPT0gMSAqLwogICAgICAgICBjYXNlIDB4ODAwMDAwMDA6CiAgICAgICAgICAgbHBLZXkgPSBscGhSb290S2V5OyBicmVhazsKICAgICAgICAgZGVmYXVsdDogCi0JICBkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0NyZWF0ZUtleSAvLyBzcGVjaWZpYyBrZXkgPSAlMDhsWCAhXG4iLCBoS2V5KTsKKwkgIGRwcmludGZfcmVnKHN0ZGRlYiwiUmVnQ3JlYXRlS2V5IC8vIHNwZWNpZmljIGtleSA9ICUwOGxYICFcbiIsIChEV09SRCloS2V5KTsKIAkgIGxwS2V5ID0gKExQS0VZU1RSVUNUKUdsb2JhbExvY2soaEtleSk7CiAgICAgICAgIH0KIAlpZiAobHBTdWJLZXkgPT0gTlVMTCB8fCAhKmxwU3ViS2V5KSAgeyAKQEAgLTE3OSwxMSArMzMxLDExIEBACiAJICAgIGxwTmV3S2V5LT5scFZhbHVlID0gTlVMTDsKIAkgICAgbHBOZXdLZXktPmxwU3ViTHZsID0gTlVMTDsKIAkgICAgKmxwaEtleSA9IGhOZXdLZXk7Ci0JICAgIGRwcmludGZfcmVnKHN0ZGRlYiwiUmVnQ3JlYXRlS2V5IC8vIHN1Y2Nlc3NmdWwgJyVzJyBrZXk9JTA4bFggIVxuIiwgc3RyLCBoTmV3S2V5KTsKKwkgICAgZHByaW50Zl9yZWcoc3RkZGViLCJSZWdDcmVhdGVLZXkgLy8gc3VjY2Vzc2Z1bCAnJXMnIGtleT0lMDhsWCAhXG4iLCBzdHIsIChEV09SRCloTmV3S2V5KTsKIAkgICAgbHBLZXkgPSBscE5ld0tleTsKIAkgIH0gZWxzZSB7CiAgICAgICAgICAgICAqbHBoS2V5ID0gbHBLZXktPmhLZXk7Ci0JICAgIGRwcmludGZfcmVnKHN0ZGRlYiwiUmVnQ3JlYXRlS2V5IC8vIGZvdW5kICclcycsIGtleT0lMDhsWFxuIiwgc3RyLCAqbHBoS2V5KTsKKwkgICAgZHByaW50Zl9yZWcoc3RkZGViLCJSZWdDcmVhdGVLZXkgLy8gZm91bmQgJyVzJywga2V5PSUwOGxYXG4iLCBzdHIsIChEV09SRCkqbHBoS2V5KTsKIAkgIH0KIAl9CiAJcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CkBAIC0xOTUsNyArMzQ3LDcgQEAKICAqLwogTE9ORyBSZWdDbG9zZUtleShIS0VZIGhLZXkpCiB7Ci0JZHByaW50Zl9yZWcoc3RkbmltcCwgIkVNUFRZIFNUVUIgISEhIFJlZ0Nsb3NlS2V5KCUwOGxYKTtcbiIsIGhLZXkpOworCWRwcmludGZfcmVnKHN0ZG5pbXAsICJFTVBUWSBTVFVCICEhISBSZWdDbG9zZUtleSglMDhsWCk7XG4iLCAoRFdPUkQpaEtleSk7CiAJcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CiB9CiAKQEAgLTIwNSw4ICszNTcsOCBAQAogICovCiBMT05HIFJlZ0RlbGV0ZUtleShIS0VZIGhLZXksIExQQ1NUUiBscFN1YktleSkKIHsKLQlkcHJpbnRmX3JlZyhzdGRuaW1wLCAiRU1QVFkgU1RVQiAhISEgUmVnRGVsZXRlS2V5KCUwOGxYLCAnJXMnKTtcbiIsIAotCQkJCQkJCQkJCQkJaEtleSwgbHBTdWJLZXkpOworCWRwcmludGZfcmVnKHN0ZG5pbXAsICJFTVBUWSBTVFVCICEhISBSZWdEZWxldGVLZXkoJTA4bFgsICclcycpO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIChEV09SRCloS2V5LCBscFN1YktleSk7CiAJcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CiB9CiAKQEAgLTIyMSw3ICszNzMsNyBAQAogICAgIExQS0VZU1RSVUNUCWxwS2V5OwogICAgIExPTkcgICAgICAgCWR3UmV0OwogICAgIGRwcmludGZfcmVnKHN0ZGRlYiwgIlJlZ1NldFZhbHVlKCUwOGxYLCAnJXMnLCAlMDhsWCwgJyVzJywgJTA4bFgpO1xuIiwKLQkJaEtleSwgbHBTdWJLZXksIGR3VHlwZSwgbHBWYWwsIGR3SWdub3JlZCk7CisJCShEV09SRCloS2V5LCBscFN1YktleSwgZHdUeXBlLCBscFZhbCwgZHdJZ25vcmVkKTsKICAgICAvKmlmIChscFN1YktleSA9PSBOVUxMKSByZXR1cm4gRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7Ki8KICAgICBpZiAobHBWYWwgPT0gTlVMTCkgcmV0dXJuIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIGlmICgoZHdSZXQgPSBSZWdPcGVuS2V5KGhLZXksIGxwU3ViS2V5LCAmaFJldEtleSkpICE9IEVSUk9SX1NVQ0NFU1MpIHsKQEAgLTI1MSw3ICs0MDMsNyBAQAogCUxPTkcJCWR3UmV0OwogCWludAkJCXNpemU7CiAJZHByaW50Zl9yZWcoc3RkZGViLCAiUmVnUXVlcnlWYWx1ZSglMDhsWCwgJyVzJywgJXAsICVwKTtcbiIsCi0JCQkJCQkJaEtleSwgbHBTdWJLZXksIGxwVmFsLCBscGNiKTsKKyAgICAgICAgICAgICAgICAgICAgKERXT1JEKWhLZXksIGxwU3ViS2V5LCBscFZhbCwgbHBjYik7CiAJLyppZiAobHBTdWJLZXkgPT0gTlVMTCkgcmV0dXJuIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSOyovCiAJaWYgKGxwVmFsID09IE5VTEwpIHJldHVybiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKIAlpZiAobHBjYiA9PSBOVUxMKSByZXR1cm4gRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CkBAIC0yOTEsMTYgKzQ0MywxNiBAQAogCiAJZHdSZXQgPSBTSEVMTF9SZWdDaGVja0ZvclJvb3QoKTsKICAgICAgICAgaWYgKGR3UmV0ICE9IEVSUk9SX1NVQ0NFU1MpIHJldHVybiBkd1JldDsKLQlkcHJpbnRmX3JlZyhzdGRkZWIsICJSZWdFbnVtS2V5KCUwOGxYLCAlbGQpXG4iLCBoS2V5LCBkd1N1YktleSk7CisJZHByaW50Zl9yZWcoc3RkZGViLCAiUmVnRW51bUtleSglMDhsWCwgJWxkKVxuIiwgKERXT1JEKWhLZXksIGR3U3ViS2V5KTsKIAlpZiAobHBCdWYgPT0gTlVMTCkgcmV0dXJuIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwotICAgICAgICBzd2l0Y2goaEtleSkgeworICAgICAgICBzd2l0Y2goKERXT1JEKWhLZXkpIHsKIAljYXNlIDA6IAogCSAgbHBLZXkgPSBscGhUb3BLZXk7IGJyZWFrOwogICAgICAgICBjYXNlIEhLRVlfQ0xBU1NFU19ST09UOiAvKiA9PSAxICovCiAgICAgICAgIGNhc2UgMHg4MDAwMDAwMDoKICAgICAgICAgICBscEtleSA9IGxwaFJvb3RLZXk7IGJyZWFrOwogICAgICAgICBkZWZhdWx0OiAKLQkgIGRwcmludGZfcmVnKHN0ZGRlYiwiUmVnRW51bUtleSAvLyBzcGVjaWZpYyBrZXkgPSAlMDhsWCAhXG4iLCBoS2V5KTsKKwkgIGRwcmludGZfcmVnKHN0ZGRlYiwiUmVnRW51bUtleSAvLyBzcGVjaWZpYyBrZXkgPSAlMDhsWCAhXG4iLCAoRFdPUkQpaEtleSk7CiAJICBscEtleSA9IChMUEtFWVNUUlVDVClHbG9iYWxMb2NrKGhLZXkpOwogICAgICAgICB9CiAgICAgICAgIGxwS2V5ID0gbHBLZXktPmxwU3ViTHZsOwpAQCAtMzE5LDIyICs0NzEsNjEgQEAKIAlyZXR1cm4gRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCURyYWdBY2NlcHRGaWxlcwkJW1NIRUxMLjldCiAgKi8KIHZvaWQgRHJhZ0FjY2VwdEZpbGVzKEhXTkQgaFduZCwgQk9PTCBiKQogewotCWZwcmludGYoc3RkbmltcCwgIkRyYWdBY2NlcHRGaWxlcyA6IEVtcHR5IFN0dWIgISEhXG4iKTsKKyAvKiBmbGlwcyBXU19FWF9BQ0NFUFRGSUxFUyBiaXQgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiBiIChUUlVFIG9yIEZBTFNFKSAqLworCisgZHByaW50Zl9yZWcoc3RkZGViLCJEcmFnQWNjZXB0RmlsZXMoJTA0eCwgJXUpIG9sZCBleFN0eWxlICUwOGx4XG4iLGhXbmQsYixHZXRXaW5kb3dMb25nKGhXbmQsR1dMX0VYU1RZTEUpKTsKKworIFNldFdpbmRvd0xvbmcoaFduZCxHV0xfRVhTVFlMRSxHZXRXaW5kb3dMb25nKGhXbmQsR1dMX0VYU1RZTEUpIHwgYiooTE9ORylXU19FWF9BQ0NFUFRGSUxFUyk7IAogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQlEcmFnUXVlcnlGaWxlCQlbU0hFTEwuMTFdCiAgKi8KLXZvaWQgRHJhZ1F1ZXJ5RmlsZShIRFJPUCBoLCBVSU5UIHUsIExQU1RSIHUyLCBVSU5UIHUzKQorVUlOVCBEcmFnUXVlcnlGaWxlKEhEUk9QIGhEcm9wLCBXT1JEIHdGaWxlLCBMUFNUUiBscHN6RmlsZSwgV09SRCB3TGVuZ3RoKQogewotCWZwcmludGYoc3RkbmltcCwgIkRyYWdRdWVyeUZpbGUgOiBFbXB0eSBTdHViICEhIVxuIik7CisgLyogaERyb3AgaXMgYSBnbG9iYWwgbWVtb3J5IGJsb2NrIGFsbG9jYXRlZCB3aXRoIEdNRU1fU0hBUkUgCisgICAgd2l0aCBEUk9QRklMRVNUUlVDVCBhcyBhIGhlYWRlciBhbmQgZmlsZW5hbWVzIGZvbGxvd2luZworICAgIGl0LCB6ZXJvIGxlbmd0aCBmaWxlbmFtZSBpcyBpbiB0aGUgZW5kICovICAgICAgIAogCisgTFBEUk9QRklMRVNUUlVDVCBscERyb3BGaWxlU3RydWN0OworIExQU1RSCQkgIGxwQ3VycmVudDsKKyBXT1JECQkgIGk7CisKKyBkcHJpbnRmX3JlZyhzdGRkZWIsIkRyYWdRdWVyeUZpbGUoJTA0eCwgJWksICVwLCAldSlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoRHJvcCx3RmlsZSxscHN6RmlsZSx3TGVuZ3RoKTsKKworIGxwRHJvcEZpbGVTdHJ1Y3QgPSAoTFBEUk9QRklMRVNUUlVDVCkgR2xvYmFsTG9jayhoRHJvcCk7IAorIGlmKCFscERyb3BGaWxlU3RydWN0KQorICAgIHsKKyAgICAgICBkcHJpbnRmX3JlZyhzdGRkZWIsIkRyYWdRdWVyeUZpbGU6IHVuYWJsZSB0byBsb2NrIGhhbmRsZSFcbiIpOworICAgICAgIHJldHVybiAwOworICAgIH0gCisgbHBDdXJyZW50ID0gKExQU1RSKSBscERyb3BGaWxlU3RydWN0ICsgbHBEcm9wRmlsZVN0cnVjdC0+d1NpemU7CisKKyBpID0gMDsKKyB3aGlsZShpKysgPCB3RmlsZSkKKyAgICB7CisgICAgICAgd2hpbGUoKmxwQ3VycmVudCsrKTsgIC8qIHNraXAgZmlsZW5hbWUgKi8KKyAgICAgICBpZighKmxwQ3VycmVudCkgCisgICAgICAgICAgcmV0dXJuICh3RmlsZSA9PSAweEZGRkYpPyBpIDogMDsgIAorICAgIH0KKworIGkgPSBzdHJsZW4obHBDdXJyZW50KTsgCisgaWYoIWxwc3pGaWxlKSByZXR1cm4gaSsxOyAgIC8qIG5lZWRlZCBidWZmZXIgc2l6ZSAqLworCisgaSA9ICggd0xlbmd0aCA+IGkpPyBpIDogd0xlbmd0aC0xOworIHN0cm5jcHkobHBzekZpbGUsbHBDdXJyZW50LGkpOworIGxwc3pGaWxlW2ldPSdcMCc7CisKKyBHbG9iYWxVbmxvY2soaERyb3ApOworIHJldHVybiBpOwogfQogCiAKQEAgLTM0MywxNyArNTM0LDI1IEBACiAgKi8KIHZvaWQgRHJhZ0ZpbmlzaChIRFJPUCBoKQogewotCWZwcmludGYoc3RkbmltcCwgIkRyYWdGaW5pc2ggOiBFbXB0eSBTdHViICEhIVxuIik7CisgR2xvYmFsRnJlZSgoSEdMT0JBTCloKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJRHJhZ1F1ZXJ5UG9pbnQJCVtTSEVMTC4xM10KICAqLwotQk9PTCBEcmFnUXVlcnlQb2ludChIRFJPUCBoLCBQT0lOVCBGQVIgKnApCitCT09MIERyYWdRdWVyeVBvaW50KEhEUk9QIGhEcm9wLCBQT0lOVCBGQVIgKnApCiB7Ci0JZnByaW50ZihzdGRuaW1wLCAiRHJhZ1F1ZXJ5UG9pbnQgOiBFbXB0eSBTdHViICEhIVxuIik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyBMUERST1BGSUxFU1RSVUNUIGxwRHJvcEZpbGVTdHJ1Y3Q7ICAKKyBCT09MICAgICAgICAgICAgIGJSZXQ7CisKKyBscERyb3BGaWxlU3RydWN0ID0gKExQRFJPUEZJTEVTVFJVQ1QpIEdsb2JhbExvY2soaERyb3ApOworCisgbWVtY3B5KHAsJmxwRHJvcEZpbGVTdHJ1Y3QtPnB0TW91c2VQb3Msc2l6ZW9mKFBPSU5UKSk7CisgYlJldCA9IGxwRHJvcEZpbGVTdHJ1Y3QtPmZJbk5vbkNsaWVudEFyZWE7CisKKyBHbG9iYWxVbmxvY2soaERyb3ApOworIHJldHVybiBiUmV0OyAKIH0KIAogCkBAIC0zNzEsNyArNTcwLDcgQEAKICAgICAgKiB3ZSBoYXZlIHRvIHBhc3MgdGhlIHBhcmFtZXRlcnMuIElmIGFuIGluc3RhbmNlIGlzIGFscmVhZHkgcnVubmluZywKICAgICAgKiB3ZSBtaWdodCBoYXZlIHRvIHNlbmQgRERFIGNvbW1hbmRzLgogICAgICAqLwotICAgIGRwcmludGZfZXhlYyhzdGRkZWIsICJTaGVsbEV4ZWN1dGUoJTRYLCclcycsJyVzJywnJXMnLCclcycsJXgpXG4iLAorICAgIGRwcmludGZfZXhlYyhzdGRkZWIsICJTaGVsbEV4ZWN1dGUoIk5QRk1UIiwnJXMnLCclcycsJyVzJywnJXMnLCV4KVxuIiwKIAkJaFduZCwgbHBPcGVyYXRpb24gPyBscE9wZXJhdGlvbjoiPG51bGw+IiwgbHBGaWxlID8gbHBGaWxlOiI8bnVsbD4iLAogCQlscFBhcmFtZXRlcnMgPyBscFBhcmFtZXRlcnMgOiAiPG51bGw+IiwgCiAJCWxwRGlyZWN0b3J5ID8gbHBEaXJlY3RvcnkgOiAiPG51bGw+IiwgaVNob3dDbWQpOwpAQCAtMzkyLDcgKzU5MSw3IEBACiAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIGxlbj0yMDA7Ci0gICAgICBpZiAoUmVnUXVlcnlWYWx1ZShIS0VZX0NMQVNTRVNfUk9PVCxwLHN1YmNsYXNzLCZsZW4pPT1FUlJPUl9TVUNDRVNTKSB7CisgICAgICBpZiAoUmVnUXVlcnlWYWx1ZSgoSEtFWSlIS0VZX0NMQVNTRVNfUk9PVCxwLHN1YmNsYXNzLCZsZW4pPT1FUlJPUl9TVUNDRVNTKSB7CiAJaWYgKGxlbj4yMCkKIAkgIGZwcmludGYoc3RkZGViLCJTaGVsbEV4ZWN1dGU6c3ViY2xhc3Mgd2l0aCBsZW4gJWxkPyAoJXMpLCBwbGVhc2UgcmVwb3J0LlxuIixsZW4sc3ViY2xhc3MpOwogCXN1YmNsYXNzW2xlbl09J1wwJzsKQEAgLTQwMSw3ICs2MDAsNyBAQAogCXN0cmNhdChzdWJjbGFzcywiXFxjb21tYW5kIik7CiAJZHByaW50Zl9leGVjKHN0ZGRlYiwiU2hlbGxFeGVjdXRlOmxvb2tpbmcgZm9yICVzLlxuIixzdWJjbGFzcyk7CiAJbGVuPTQwMDsKLQlpZiAoUmVnUXVlcnlWYWx1ZShIS0VZX0NMQVNTRVNfUk9PVCxzdWJjbGFzcyxjbWQsJmxlbik9PUVSUk9SX1NVQ0NFU1MpIHsKKwlpZiAoUmVnUXVlcnlWYWx1ZSgoSEtFWSlIS0VZX0NMQVNTRVNfUk9PVCxzdWJjbGFzcyxjbWQsJmxlbik9PUVSUk9SX1NVQ0NFU1MpIHsKIAkgIGNoYXIgKnQ7CiAJICBkcHJpbnRmX2V4ZWMoc3RkZGViLCJTaGVsbEV4ZWN1dGU6Li4uZ290ICVzXG4iLGNtZCk7CiAJICBjbWRbbGVuXT0nXDAnOwpAQCAtNDEzLDYgKzYxMiw3IEBACiAJICAgIGNoYXIgKnM7CiAJICAgIHM9bWFsbG9jKGxlbitzdHJsZW4obHBGaWxlKSsxMCk7CiAJICAgIHN0cm5jcHkocyxjbWQsdC1jbWQpOworCSAgICBzW3QtY21kXT0nXDAnOwogCSAgICBzdHJjYXQocyxscEZpbGUpOwogCSAgICBzdHJjYXQocyx0KzIpOwogCSAgICBzdHJjcHkoY21kLHMpOwpAQCAtNDI1LDEzICs2MjUsMTQgQEAKIAkgIH0KIAl9IGVsc2UgewogCSAgZnByaW50ZihzdGRkZWIsIlNoZWxsRXhlY3V0ZTogTm8gJXNcXHNoZWxsXFwlc1xcY29tbWFuZCBmb3VuZCBmb3IgXCIlc1wiIHN1ZmZpeC5cbiIsc3ViY2xhc3MsbHBPcGVyYXRpb24scCk7Ci0JICByZXR1cm4gMTQ7IC8qIHVua25vd24gdHlwZSAqLworCSAgcmV0dXJuIChISU5TVEFOQ0UpMTQ7IC8qIHVua25vd24gdHlwZSAqLwogCX0KICAgICAgIH0gZWxzZSB7CiAJZnByaW50ZihzdGRkZWIsIlNoZWxsRXhlY3V0ZTogTm8gb3BlcmF0aW9uIGZvdW5kIGZvciBcIiVzXCIgc3VmZml4LlxuIixwKTsKLQlyZXR1cm4gMTQ7IC8qIGZpbGUgbm90IGZvdW5kICovCisJcmV0dXJuIChISU5TVEFOQ0UpMTQ7IC8qIGZpbGUgbm90IGZvdW5kICovCiAgICAgICB9CiAgICAgfQorICAgIGRwcmludGZfZXhlYyhzdGRkZWIsIlNoZWxsRXhlY3V0ZTpzdGFydGluZyAlc1xuIixjbWQpOwogICAgIHJldHVybiBXaW5FeGVjKGNtZCxpU2hvd0NtZCk7CiB9CiAKQEAgLTQ0NSwxOCArNjQ2LDIyIEBACiAgICAgICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgY2hhciBBcHBOYW1lWzUxMl0sIEFwcE1pc2NbNTEyXTsKK3N0YXRpYyBjaGFyIEFwcE5hbWVbMTI4XSwgQXBwTWlzY1s5MDZdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJQWJvdXREbGdQcm9jCQlbU0hFTEwuMzNdCiAgKi8KLUlOVCBBYm91dERsZ1Byb2MoSFdORCBoV25kLCBXT1JEIG1zZywgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorTFJFU1VMVCBBYm91dERsZ1Byb2MoSFdORCBoV25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgY2hhciBUZW1wbGF0ZVs1MTJdLCBBcHBUaXRsZVs1MTJdOwogIAogICBzd2l0Y2gobXNnKSB7CiAgICBjYXNlIFdNX0lOSVRESUFMT0c6CisjaWZkZWYgV0lORUxJQjMyCisgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGhXbmQsc3RjMSxTVE1fU0VUSUNPTixsUGFyYW0sMCk7CisjZWxzZQogICAgIFNlbmREbGdJdGVtTWVzc2FnZShoV25kLHN0YzEsU1RNX1NFVElDT04sTE9XT1JEKGxQYXJhbSksMCk7CisjZW5kaWYKICAgICBHZXRXaW5kb3dUZXh0KGhXbmQsIFRlbXBsYXRlLCA1MTEpOwogICAgIHNwcmludGYoQXBwVGl0bGUsIFRlbXBsYXRlLCBBcHBOYW1lKTsKICAgICBTZXRXaW5kb3dUZXh0KGhXbmQsIEFwcFRpdGxlKTsKQEAgLTQ4NCwxMSArNjg5LDEzIEBACiAgICAgRFdPUkQgV2luZVByb2MsV2luMTZQcm9jLFdpbjMyUHJvYzsKICAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkPTA7CiAKLSAgICBpZiAoc3pBcHApIHN0cmNweShBcHBOYW1lLCBzekFwcCk7CisgICAgaWYgKHN6QXBwKSBzdHJuY3B5KEFwcE5hbWUsIHN6QXBwLCBzaXplb2YoQXBwTmFtZSkpOwogICAgIGVsc2UgKkFwcE5hbWUgPSAwOworICAgIEFwcE5hbWVbc2l6ZW9mKEFwcE5hbWUpLTFdPTA7CiAKLSAgICBpZiAoc3pPdGhlclN0dWZmKSBzdHJjcHkoQXBwTWlzYywgc3pPdGhlclN0dWZmKTsKKyAgICBpZiAoc3pPdGhlclN0dWZmKSBzdHJuY3B5KEFwcE1pc2MsIHN6T3RoZXJTdHVmZiwgc2l6ZW9mKEFwcE1pc2MpKTsKICAgICBlbHNlICpBcHBNaXNjID0gMDsKKyAgICBBcHBNaXNjW3NpemVvZihBcHBNaXNjKS0xXT0wOwogCiAgICAgaWYgKCFoSWNvbikgaEljb24gPSBMb2FkSWNvbigwLE1BS0VJTlRSRVNPVVJDRShPSUNfV0lORUlDT04pKTsKICAgICAKQEAgLTUwNyw5ICs3MTQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQREIoKSwgRkFMU0UsIEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgTlVMTCApOwogICAgIGlmICghaGFuZGxlKSByZXR1cm4gRkFMU0U7Ci0gICAgYlJldCA9IERpYWxvZ0JveEluZGlyZWN0UGFyYW0oIEdldFdpbmRvd1dvcmQoIGhXbmQsIEdXV19ISU5TVEFOQ0UgKSwKKyAgICBiUmV0ID0gRGlhbG9nQm94SW5kaXJlY3RQYXJhbSggV0lOX0dldFdpbmRvd0luc3RhbmNlKCBoV25kICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwgaFduZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V25kUHJvY0VudHJ5MTYoIkFib3V0RGxnUHJvYyIpLCBoSWNvbiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXbmRQcm9jRW50cnkxNigiQWJvdXREbGdQcm9jIiksIAorCQkJCSAgIChMT05HKWhJY29uICk7CiAgICAgR0xPQkFMX0ZyZWVCbG9jayggaGFuZGxlICk7CiAgICAgcmV0dXJuIGJSZXQ7CiB9CkBAIC01MjEsNyArNzI5LDcgQEAKIHsKIAlISUNPTgloSWNvbiA9IDA7CiAJSElOU1RBTkNFIGhJbnN0MiA9IGhJbnN0OwotCWRwcmludGZfcmVnKHN0ZGRlYiwgIkV4dHJhY3RJY29uKCUwNFgsICclcycsICVkXG4iLCAKKwlkcHJpbnRmX3JlZyhzdGRkZWIsICJFeHRyYWN0SWNvbigiTlBGTVQiLCAnJXMnLCAlZFxuIiwgCiAJCQloSW5zdCwgbHBzekV4ZUZpbGVOYW1lLCBuSWNvbkluZGV4KTsKICAgICAgICAgcmV0dXJuIDA7CiAJaWYgKGxwc3pFeGVGaWxlTmFtZSAhPSBOVUxMKSB7CmRpZmYgLS1naXQgYS9taXNjL3NweS5jIGIvbWlzYy9zcHkuYwppbmRleCA4MzVmOGM2Li5lYmExNGZlIDEwMDY0NAotLS0gYS9taXNjL3NweS5jCisrKyBiL21pc2Mvc3B5LmMKQEAgLTEsNiArMSw3IEBACiAvKiBTUFkuQwogICoKICAqIENvcHlyaWdodCAxOTk0LCBCb2IgQW1zdGFkdAorICogICAgICAgICAgIDE5OTUsIEFsZXggS29yb2JrYSAgCiAgKi8KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMTMsOCArMTQsMTAgQEAKICNpbmNsdWRlICJvcHRpb25zLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInNweS5oIgogCi0jZGVmaW5lIFNQWV9NQVhfTVNHTlVNCQkweDAzZTgKKyNkZWZpbmUgU1BZX01BWF9NU0dOVU0JCVdNX1VTRVIKKyNkZWZpbmUgU1BZX01BWF9JTkRFTlRMRVZFTCAgICAgNjQKIAogY29uc3QgY2hhciAqTWVzc2FnZVR5cGVOYW1lc1tTUFlfTUFYX01TR05VTSArIDFdID0KIHsKQEAgLTI3LDcgKzMwLDcgQEAKICAgICAiV01fQUNUSVZBVEUiLAogICAgICJXTV9TRVRGT0NVUyIsCiAgICAgIldNX0tJTExGT0NVUyIsCi0gICAgIldNX1VOVVNFRDEiLAorICAgICJXTV9TRVRWSVNJQkxFIiwKICAgICAiV01fRU5BQkxFIiwKICAgICAiV01fU0VUUkVEUkFXIiwKICAgICAiV01fU0VUVEVYVCIsCkBAIC00MSw3ICs0NCw3IEBACiAgICAgIldNX0VSQVNFQktHTkQiLAogICAgICJXTV9TWVNDT0xPUkNIQU5HRSIsCiAgICAgIldNX0VORFNFU1NJT04iLAotICAgICJXTV9VTlVTRUQyIiwKKyAgICAiV01fU1lTVEVNRVJST1IiLAogICAgICJXTV9TSE9XV0lORE9XIiwKICAgICAiV01fQ1RMQ09MT1IiLAogICAgICJXTV9XSU5JTklDSEFOR0UiLApAQCAtNjcsMTcgKzcwLDE5IEBACiAgICAgIldNX1ZLRVlUT0lURU0iLAogICAgICJXTV9DSEFSVE9JVEVNIiwKICAgICAiV01fU0VURk9OVCIsCQkvKiAweDMwICovCi0gICAgIldNX0dFVEZPTlQiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgIldNX0dFVEZPTlQiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAKKyAgICAiV01fUVVFUllEUkFHSUNPTiIsIE5VTEwsIAorICAgICJXTV9DT01QQVJFSVRFTSIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAKLSAgICAvKiAweDQwICovCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICBOVUxMLCAJCSAgICAgICAgLyogMHg0MCAqLworICAgICJXTV9DT01QQUNUSU5HIiwgTlVMTCwgTlVMTCwgCisgICAgIldNX0NPTU1OT1RJRlkiLCBOVUxMLCAKICAgICAiV01fV0lORE9XUE9TQ0hBTkdJTkciLAkvKiAweDAwNDYgKi8KICAgICAiV01fV0lORE9XUE9TQ0hBTkdFRCIsCS8qIDB4MDA0NyAqLwotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgIldNX1BPV0VSIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKIAotICAgIC8qIDB4MDA1MCAqLwotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgTlVMTCwgCQkgICAgICAgIC8qIDB4MDA1MCAqLworICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIAogICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAKICAgICAvKiAweDAwNjAgKi8KQEAgLTk2LDcgKzEwMSw3IEBACiAgICAgIldNX05DUEFJTlQiLCAgICAgICAgICAJLyogMHgwMDg1ICovCiAgICAgIldNX05DQUNUSVZBVEUiLCAgICAgICAJLyogMHgwMDg2ICovCiAgICAgIldNX0dFVERMR0NPREUiLAkJLyogMHgwMDg3ICovCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAiV01fU1lOQ1BBSU5UIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKIAogICAgIC8qIDB4MDA5MCAqLwogICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCkBAIC0xNjQsNyArMTY5LDkgQEAKICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCiAgICAgLyogMHgwMTMwICovCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICBOVUxMLCAKKyAgICAiV01fTEJUUkFDS1BPSU5UIiwgCisgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCiAgICAgLyogMHgwMTQwICovCkBAIC0yNDQsMTIgKzI1MSwxOSBAQAogICAgICJXTV9NRElJQ09OQVJSQU5HRSIsICAgICAgICAvKiAweDAyMjggKi8KICAgICAiV01fTURJR0VUQUNUSVZFIiwgICAgICAgICAgLyogMHgwMjI5ICovCiAKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICJXTV9EUk9QT0JKRUNUIiwgCisgICAgIldNX1FVRVJZRFJPUE9CSkVDVCIsIAorICAgIE5VTEwsCisgICAgIldNX0RSQUdMT09QIiwKKyAgICAiV01fRFJBR1NFTEVDVCIsCisgICAgIldNX0RSQUdNT1ZFIiwKKyAgICAgCiAgICAgLyogMHgwMjMwKi8KICAgICAiV01fTURJU0VUTUVOVSIsICAgICAgICAgICAgLyogMHgwMjMwICovCiAgICAgIldNX0VOVEVSU0laRU1PVkUiLAkJLyogMHgwMjMxICovCiAgICAgIldNX0VYSVRTSVpFTU9WRSIsCQkvKiAweDAyMzIgKi8KLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAKKyAgICAiV01fRFJPUEZJTEVTIiwgCQkvKiAweDAyMzMgKi8KKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAKICAgICAvKiAweDAyMzgqLwogICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgCkBAIC0yODksMTEgKzMwMywyNyBAQAogICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKIAotICAgIC8qIDB4MDMwMCAqLwotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgIldNX0NVVCIsIAkJCS8qIDB4MDMwMCAqLworICAgICJXTV9DT1BZIiwgCisgICAgIldNX1BBU1RFIiwgCisgICAgIldNX0NMRUFSIiwgCisgICAgIldNX1VORE8iLCAKKyAgICAiV01fUkVOREVSRk9STUFUIiwgCisgICAgIldNX1JFTkRFUkFMTEZPUk1BVFMiLCAKKyAgICAiV01fREVTVFJPWUNMSVBCT0FSRCIsCisgICAgIldNX0RSQVdDTElQQk9BUkQiLCAKKyAgICAiV01fUEFJTlRDTElQQk9BUkQiLCAKKyAgICAiV01fVlNDUk9MTENMSVBCT0FSRCIsIAorICAgICJXTV9TSVpFQ0xJUEJPQVJEIiwgCisgICAgIldNX0FTS0NCRk9STUFUTkFNRSIsIAorICAgICJXTV9DSEFOR0VDQkNIQUlOIiwKKyAgICAiV01fSFNDUk9MTENMSVBCT0FSRCIsCisgICAgIldNX1FVRVJZTkVXUEFMRVRURSIsCS8qIDB4MDMwZiovCisKKyAgICAiV01fUEFMRVRURUlTQ0hBTkdJTkciLAorICAgICJXTV9QQUxFVFRFQ0hBTkdFRCIsIAkvKiAweDAzMTEgKi8KKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAKKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAKIAogICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKQEAgLTMxNCw3ICszNDQsOSBAQAogICAgIC8qIDB4MDM4MCAqLwogICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICJXTV9DT0FMRVNDRV9GSVJTVCIsIAorICAgICJXTV9DT0FMRVNDRV9MQVNUIiwgCisgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCiAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKQEAgLTMzNywzNSArMzY5LDEzOCBAQAogICAgICJXTV9EREVfREFUQSIsCS8qIDB4M0U1ICovCiAgICAgIldNX0RERV9SRVFVRVNUIiwJLyogMHgzRTYgKi8KICAgICAiV01fRERFX1BPS0UiLAkvKiAweDNFNyAqLwotICAgICJXTV9EREVfRVhFQ1VURSIJLyogMHgzRTggKi8KKyAgICAiV01fRERFX0VYRUNVVEUiLAkvKiAweDNFOCAqLworICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisKKyAgICAKKyAgICAvKiAweDAzZjAgKi8KKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisKKyAgICAiV01fVVNFUiIKIH07CiAKLWNoYXIgU3B5RmlsdGVyc1syNTYrMV07Ci1jaGFyIFNweUluY2x1ZGVzWzI1NisxXTsKK3N0YXRpYyBCT09MICAJU3B5RmlsdGVycyBbU1BZX01BWF9NU0dOVU0rMV07CitzdGF0aWMgQk9PTCAJU3B5SW5jbHVkZXNbU1BZX01BWF9NU0dOVU0rMV07CisKK3N0YXRpYyBpbnQgICAgICBpU3B5TWVzc2FnZUluZGVudExldmVsICA9IDA7CitzdGF0aWMgY2hhciAgICAgbHBzdHJTcHlNZXNzYWdlSW5kZW50W1NQWV9NQVhfSU5ERU5UTEVWRUxdOworc3RhdGljIGNoYXIgICAgKmxwc3RyU3B5TWVzc2FnZUZyb21XaW5lID0gIldpbmUiOworc3RhdGljIGNoYXIgICAgIGxwc3RyU3B5TWVzc2FnZUZyb21UYXNrWzEwXTsgCitzdGF0aWMgY2hhciAgICAqbHBzdHJTcHlNZXNzYWdlRnJvbVNlbGYgPSAic2VsZiI7CitzdGF0aWMgY2hhciAgICAqbHBzdHJTcHlNZXNzYWdlRnJvbSAgICAgPSAgTlVMTDsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJCVNweU1lc3NhZ2UKKyAqCQkJICAgICAgRW50ZXJTcHlNZXNzYWdlCiAgKi8KLXZvaWQgU3B5TWVzc2FnZShIV05EIGh3bmQsIFdPUkQgbXNnLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit2b2lkIEVudGVyU3B5TWVzc2FnZShpbnQgaUZsYWcsIEhXTkQgaFduZCwgV09SRCBtc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKLSAgICBjaGFyIG1zZ19uYW1lWzgwXTsKLSAgICAKLQlpZighZGVidWdnaW5nX3NweSkKLQkJcmV0dXJuOworICBIVEFTSwloVGFzayAgICAgPSBHZXRXaW5kb3dUYXNrKGhXbmQpOworICBXT1JEIAl3Q2hlY2tNc2cgPSAobXNnID4gV01fVVNFUik/IFdNX1VTRVI6IG1zZzsKIAotICAgIGlmIChtc2cgPiBTUFlfTUFYX01TR05VTSB8fCBNZXNzYWdlVHlwZU5hbWVzW21zZ10gPT0gTlVMTCkKLQlzcHJpbnRmKG1zZ19uYW1lLCAiJTA0eCIsIG1zZyk7Ci0gICAgZWxzZQotCXN0cmNweShtc2dfbmFtZSwgTWVzc2FnZVR5cGVOYW1lc1ttc2ddKTsKLSAgICAKLSAgICBzdHJjYXQobXNnX25hbWUsICI7Iik7Ci0gICAgCi0gICAgaWYgKChzdHJsZW4oU3B5SW5jbHVkZXMpID09IDAgfHwgc3Ryc3RyKFNweUluY2x1ZGVzLCBtc2dfbmFtZSkgIT0gTlVMTCkgJiYKLQlzdHJzdHIoU3B5RmlsdGVycywgbXNnX25hbWUpID09IE5VTEwpCisgIGlmKCAhU3B5SW5jbHVkZXNbd0NoZWNrTXNnXSB8fCBTcHlGaWx0ZXJzW3dDaGVja01zZ10pIHJldHVybjsKKworICAvKiBlYWNoIFNQWV9TRU5ETUVTU0FHRSBtdXN0IGJlIGNvbXBsZW1lbnRlZCBieSBjYWxsIHRvIEV4aXRTcHlNZXNzYWdlICovCisgIHN3aXRjaChpRmxhZykKKyAgIHsKKwljYXNlIFNQWV9ESVNQQVRDSE1FU1NBR0U6CisJCSAgICBpZihtc2cgPD0gV01fVVNFUikKKwkJICAgICAgeworCQkgICAgICAgaWYoTWVzc2FnZVR5cGVOYW1lc1ttc2ddKQorCQkgICAgICAgICAgZHByaW50Zl9tZXNzYWdlKHN0ZGRlYiwiKCUwNHgpIG1lc3NhZ2UgWyUwNHhdICVzIGRpc3BhdGNoZWQgIHdwPSUwNHggbHA9JTA4bHhcbiIsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgaFduZCwgbXNnLCBNZXNzYWdlVHlwZU5hbWVzW21zZ10sIHdQYXJhbSwgbFBhcmFtKTsKKwkJICAgICAgIGVsc2UKKwkJICAgICAgICAgIGRwcmludGZfbWVzc2FnZShzdGRkZWIsIiglMDR4KSBtZXNzYWdlIFslMDR4XSBkaXNwYXRjaGVkICB3cD0lMDR4IGxwPSUwOGx4XG4iLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgIGhXbmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOworCQkgICAgICB9CisJCSAgICBlbHNlCisJCSAgICAgICAgICBkcHJpbnRmX21lc3NhZ2Uoc3RkZGViLCIoJTA0eCkgbWVzc2FnZSBbJTA0eF0gV01fVVNFUislMDRkIGRpc3BhdGNoZWQgIHdwPSUwNHggbHA9JTA4bHhcbiIsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgaFduZCwgbXNnLCBtc2ctV01fVVNFUiAsd1BhcmFtICxsUGFyYW0pOworCQkgICAgYnJlYWs7CisJY2FzZSBTUFlfU0VORE1FU1NBR0U6CisJCSAgICBpZihoVGFzayA9PSBHZXRDdXJyZW50VGFzaygpKQorIAkJICAgICAgbHBzdHJTcHlNZXNzYWdlRnJvbSA9IGxwc3RyU3B5TWVzc2FnZUZyb21TZWxmOworCQkgICAgZWxzZSBpZihoVGFzayA9PSBOVUxMKQorICAJCSAgICAgIAkgICBscHN0clNweU1lc3NhZ2VGcm9tID0gbHBzdHJTcHlNZXNzYWdlRnJvbVdpbmU7CisgIAkJICAgIAkgZWxzZQorICAJCQkJeworICAJCQkJICAgc3ByaW50ZihscHN0clNweU1lc3NhZ2VGcm9tVGFzaywgInRhc2sgJTA0eCIsIGhUYXNrKTsJCisgIAkJCQkgICBscHN0clNweU1lc3NhZ2VGcm9tID0gbHBzdHJTcHlNZXNzYWdlRnJvbVRhc2s7CisgIAkJCQl9CisJCSAgICAgCisJICAgICAgICAgICAgaWYobXNnIDw9IFdNX1VTRVIpCisJICAgICAgICAgICAgICAgIHsKKwkgICAgICAgICAgICAgICAgICBpZihNZXNzYWdlVHlwZU5hbWVzW21zZ10pCisJCQkgICAgICBkcHJpbnRmX21lc3NhZ2Uoc3RkZGViLCIlcyglMDR4KSBtZXNzYWdlIFslMDR4XSAlcyBzZW50IGZyb20gJXMgd3A9JTA0eCBscD0lMDhseFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIGxwc3RyU3B5TWVzc2FnZUluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIGhXbmQsIG1zZywgTWVzc2FnZVR5cGVOYW1lc1ttc2ddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgbHBzdHJTcHlNZXNzYWdlRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIHdQYXJhbSwgbFBhcmFtKTsKKwkgICAgICAgICAgICAgICAgICBlbHNlCisJICAgICAgICAgICAgICAgICAgICAgIGRwcmludGZfbWVzc2FnZShzdGRkZWIsIiVzKCUwNHgpIG1lc3NhZ2UgWyUwNHhdIHNlbnQgZnJvbSAlcyB3cD0lMDR4IGxwPSUwOGx4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgbHBzdHJTcHlNZXNzYWdlSW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgaFduZCwgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgbHBzdHJTcHlNZXNzYWdlRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgICAgICAJCX0KKyAgICAgICAgCSAgICBlbHNlCisgICAgICAgICAgICAgCQkgIGRwcmludGZfbWVzc2FnZShzdGRkZWIsIiVzKCUwNHgpIG1lc3NhZ2UgWyUwNHhdIFdNX1VTRVIrJTA0eCBzZW50IGZyb20gJXMgd3A9JTA0eCBscD0lMDhseFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSAgbHBzdHJTcHlNZXNzYWdlSW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICBoV25kLCBtc2csIG1zZy1XTV9VU0VSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICBscHN0clNweU1lc3NhZ2VGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSAgd1BhcmFtLCBsUGFyYW0pOworCisJICAgICAgICAgICAgaWYoU1BZX01BWF9JTkRFTlRMRVZFTCA+IGlTcHlNZXNzYWdlSW5kZW50TGV2ZWwgKSAKKwkJICAgIAl7CisJCQkgIGlTcHlNZXNzYWdlSW5kZW50TGV2ZWwrKzsKKwkJCSAgbHBzdHJTcHlNZXNzYWdlSW5kZW50W2lTcHlNZXNzYWdlSW5kZW50TGV2ZWxdPSdcMCc7CisJCQkgIGxwc3RyU3B5TWVzc2FnZUluZGVudFtpU3B5TWVzc2FnZUluZGVudExldmVsLTFdICA9J1x0JzsKKwkJICAgICAgCX0KKwkJICAgIGJyZWFrOyAgIAorCWNhc2UgU1BZX0RFRldORFBST0M6CisJCSAgICBpZihtc2cgPD0gV01fVVNFUikKKwkJICAgICAgICBpZihNZXNzYWdlVHlwZU5hbWVzW21zZ10pCisJCSAgICAgICAgICAgZHByaW50Zl9tZXNzYWdlKHN0ZGRlYiwgIiVzKCUwNHgpIERlZldpbmRvd1Byb2M6ICVzIFslMDR4XSAgd3A9JTA0eCBscD0lMDhseFxuIiwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBzdHJTcHlNZXNzYWdlSW5kZW50LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICBoV25kLCBNZXNzYWdlVHlwZU5hbWVzW21zZ10sIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKKwkJICAgICAgICBlbHNlCisJCSAgICAgICAgICAgZHByaW50Zl9tZXNzYWdlKHN0ZGRlYiwgIiVzKCUwNHgpIERlZldpbmRvd1Byb2M6IFslMDR4XSAgd3A9JTA0eCBscD0lMDhseFxuIiwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBzdHJTcHlNZXNzYWdlSW5kZW50LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICBoV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CisJCSAgICBlbHNlCisJCSAgICAgICAgZHByaW50Zl9tZXNzYWdlKHN0ZGRlYiwgIiVzKCUwNHgpIERlZldpbmRvd1Byb2M6IFdNX1VTRVIrJWQgWyUwNHhdIHdwPSUwNHggbHA9JTA4bHhcbiIsCisJCSAgICAgICAgICAgICAgICAgICAgICAgIGxwc3RyU3B5TWVzc2FnZUluZGVudCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgaFduZCwgbXNnIC0gV01fVVNFUiwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOworCQkgICAgYnJlYWs7CisJZGVmYXVsdDoJCSAgICAKKyAgIH0gIAorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCSAgICAgIEV4aXRTcHlNZXNzYWdlCisgKi8KK3ZvaWQgRXhpdFNweU1lc3NhZ2UoaW50IGlGbGFnLCBIV05EIGhXbmQsIFdPUkQgbXNnLCBMT05HIGxSZXR1cm4pCit7CisgIFdPUkQgd0NoZWNrTXNnID0gKG1zZyA+IFdNX1VTRVIpPyBXTV9VU0VSOiBtc2c7CisKKyAgaWYoICFTcHlJbmNsdWRlc1t3Q2hlY2tNc2ddIHx8IFNweUZpbHRlcnNbd0NoZWNrTXNnXSkgcmV0dXJuOworCisgIGlTcHlNZXNzYWdlSW5kZW50TGV2ZWwtLTsKKyAgbHBzdHJTcHlNZXNzYWdlSW5kZW50W2lTcHlNZXNzYWdlSW5kZW50TGV2ZWxdPSdcMCc7CisKKyAgc3dpdGNoKGlGbGFnKQogICAgIHsKLQltc2dfbmFtZVtzdHJsZW4obXNnX25hbWUpIC0gMV0gPSAnXDAnOwotCWRwcmludGZfc3B5KHN0ZGRlYiwgIiUwNHggICUyMC4yMHMgICUwNHggICUwNHggICUwOGx4XG4iLAotCQlod25kLCBtc2dfbmFtZSwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CisJY2FzZSBTUFlfUkVTVUxUX0lOVkFMSURIV05EOiAKKwkJZHByaW50Zl9tZXNzYWdlKHN0ZGRlYiwiJXMoJTA0eCkgbWVzc2FnZSBbJTA0eF0gSEFTIElOVkFMSUQgSFdORFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBzdHJTcHlNZXNzYWdlSW5kZW50LCBoV25kLCBtc2cpOworCSAgICAgICAgYnJlYWs7CisJY2FzZSBTUFlfUkVTVUxUX09LOgorCQlkcHJpbnRmX21lc3NhZ2Uoc3RkZGViLCIlcyglMDR4KSBtZXNzYWdlIFslMDR4XSByZXR1cm5lZCAlMDhseFxuIiwKKwkgICAgICAgICAgICAgICAgICAgICAgICBscHN0clNweU1lc3NhZ2VJbmRlbnQsIGhXbmQsIG1zZywgbFJldHVybik7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAgICAgfQogfQogCkBAIC0zNzQsMTUgKzUwOSwzMCBAQAogICovCiB2b2lkIFNweUluaXQodm9pZCkKIHsKLSAgICBHZXRQcml2YXRlUHJvZmlsZVN0cmluZygic3B5IiwgImV4Y2x1ZGUiLCAiIiwgU3B5RmlsdGVycywgCi0JCQkgICAgc2l6ZW9mKFNweUZpbHRlcnMpLTEsIFdJTkVfSU5JKTsKLSAgICBHZXRQcml2YXRlUHJvZmlsZVN0cmluZygic3B5IiwgImluY2x1ZGUiLCAiIiwgU3B5SW5jbHVkZXMsIAotCQkJICAgIHNpemVvZihTcHlJbmNsdWRlcyktMSwgV0lORV9JTkkpOworICAgIGludCAgICAgIGk7CisgICAgY2hhciAgICAgbHBzdHJCdWZmZXJbNTEyXTsKIAotICAgIGlmICgqU3B5SW5jbHVkZXMgIT0gMCkgewotICAgICAgc3RyY2F0KFNweUluY2x1ZGVzLCAiOyIpOwotICAgIH0KLSAgICBpZiAoKlNweUZpbHRlcnMgIT0gMCkgewotICAgICAgc3RyY2F0KFNweUZpbHRlcnMsICI7Iik7Ci0gICAgfQorICAgIGZvcihpPTA7IGkgPD0gU1BZX01BWF9NU0dOVU07IGkrKykgU3B5RmlsdGVyc1tpXSA9IFNweUluY2x1ZGVzW2ldID0gRkFMU0U7CisKKyAgICBHZXRQcml2YXRlUHJvZmlsZVN0cmluZygic3B5IiwgIkV4Y2x1ZGUiLCAiIixscHN0ckJ1ZmZlciAsNTExICwgV0lORV9JTkkpOworICAgIGRwcmludGZfbWVzc2FnZShzdGRkZWIsIlNweUluaXQ6IEV4Y2x1ZGU9JXNcbiIsbHBzdHJCdWZmZXIpOworICAgIGlmKCAqbHBzdHJCdWZmZXIgIT0gMCApCisgICAgICBpZihzdHJzdHIobHBzdHJCdWZmZXIsIkVYQ0xVREVBTEwiKSkKKwlmb3IoaT0wOyBpIDw9IFNQWV9NQVhfTVNHTlVNOyBpKyspIFNweUZpbHRlcnNbaV0gPSBUUlVFOworICAgICAgZWxzZQorICAgICAgICBmb3IoaT0wOyBpIDw9IFNQWV9NQVhfTVNHTlVNOyBpKyspCisJICAgIGlmKE1lc3NhZ2VUeXBlTmFtZXNbaV0pCisJICAgICAgIGlmKHN0cnN0cihscHN0ckJ1ZmZlcixNZXNzYWdlVHlwZU5hbWVzW2ldKSkgU3B5RmlsdGVyc1tpXSA9IFRSVUU7IAorCisgICAgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoInNweSIsICJJbmNsdWRlIiwgIiIsbHBzdHJCdWZmZXIgLDUxMSAsIFdJTkVfSU5JKTsKKyAgICBkcHJpbnRmX21lc3NhZ2Uoc3RkZGViLCJTcHlJbml0OiBJbmNsdWRlPSVzXG4iLGxwc3RyQnVmZmVyKTsKKyAgICBpZiggKmxwc3RyQnVmZmVyICE9IDAgKQorICAgICAgaWYoc3Ryc3RyKGxwc3RyQnVmZmVyLCJJTkNMVURFQUxMIikpCisgICAgICAgIGZvcihpPTA7IGkgPD0gU1BZX01BWF9NU0dOVU07IGkrKykgU3B5SW5jbHVkZXNbaV0gPSBUUlVFOworICAgICAgZWxzZSAKKyAgICAgICAgZm9yKGk9MDsgaSA8PSBTUFlfTUFYX01TR05VTTsgaSsrKQorICAgICAgICAgICAgaWYoTWVzc2FnZVR5cGVOYW1lc1tpXSkKKyAgICAgICAgICAgICAgIGlmKHN0cnN0cihscHN0ckJ1ZmZlcixNZXNzYWdlVHlwZU5hbWVzW2ldKSkgU3B5SW5jbHVkZXNbaV0gPSBUUlVFOworCiB9CisKZGlmZiAtLWdpdCBhL21pc2MvdXNlci5jIGIvbWlzYy91c2VyLmMKaW5kZXggOThiN2IxYi4uMTAwNWZmZCAxMDA2NDQKLS0tIGEvbWlzYy91c2VyLmMKKysrIGIvbWlzYy91c2VyLmMKQEAgLTg5LDcgKzg5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQkJVVNFUl9Jbml0QXBwCiAgKi8KLWludCBVU0VSX0luaXRBcHAoaW50IGhJbnN0YW5jZSkKK2ludCBVU0VSX0luaXRBcHAoSElOU1RBTkNFIGhJbnN0YW5jZSkKIHsKICAgICBpbnQgcXVldWVTaXplOwogCmRpZmYgLS1naXQgYS9taXNjL3VzZXIzMi5jIGIvbWlzYy91c2VyMzIuYwppbmRleCBmNWIyODBmLi41YTRjMDJmIDEwMDY0NAotLS0gYS9taXNjL3VzZXIzMi5jCisrKyBiL21pc2MvdXNlcjMyLmMKQEAgLTE3LDcgKzE3LDcgQEAKIC8qIFN0cnVjdHVyZSBjb3B5IGZ1bmN0aW9ucyAqLwogc3RhdGljIHZvaWQgTVNHMTZ0bzMyKE1TRyAqbXNnMTYsc3RydWN0IFdJTjMyX01TRyAqbXNnMzIpCiB7Ci0JbXNnMzItPmh3bmQ9bXNnMTYtPmh3bmQ7CisJbXNnMzItPmh3bmQ9KERXT1JEKW1zZzE2LT5od25kOwogCW1zZzMyLT5tZXNzYWdlPW1zZzE2LT5tZXNzYWdlOwogCW1zZzMyLT53UGFyYW09bXNnMTYtPndQYXJhbTsKIAltc2czMi0+bFBhcmFtPW1zZzE2LT5sUGFyYW07CkBAIC0yOCw3ICsyOCw3IEBACiAKIHN0YXRpYyB2b2lkIE1TRzMydG8xNihzdHJ1Y3QgV0lOMzJfTVNHICptc2czMixNU0cgKm1zZzE2KQogewotCW1zZzE2LT5od25kPW1zZzMyLT5od25kOworCW1zZzE2LT5od25kPShIV05EKW1zZzMyLT5od25kOwogCW1zZzE2LT5tZXNzYWdlPW1zZzMyLT5tZXNzYWdlOwogCW1zZzE2LT53UGFyYW09bXNnMzItPndQYXJhbTsKIAltc2cxNi0+bFBhcmFtPW1zZzMyLT5sUGFyYW07CkBAIC00NSwxNCArNDUsMTQgQEAKIAlXTkRDTEFTUyBjb3B5OwogCWNoYXIgKnMxLCpzMjsKIAljb3B5LnN0eWxlPXduZGNsYXNzLT5zdHlsZTsKLQlBTElBU19SZWdpc3RlckFsaWFzKDAsMCx3bmRjbGFzcy0+bHBmblduZFByb2MpOworCUFMSUFTX1JlZ2lzdGVyQWxpYXMoMCwwLChEV09SRCl3bmRjbGFzcy0+bHBmblduZFByb2MpOwogCWNvcHkubHBmblduZFByb2M9d25kY2xhc3MtPmxwZm5XbmRQcm9jOwogCWNvcHkuY2JDbHNFeHRyYT13bmRjbGFzcy0+Y2JDbHNFeHRyYTsKIAljb3B5LmNiV25kRXh0cmE9d25kY2xhc3MtPmNiV25kRXh0cmE7Ci0JY29weS5oSW5zdGFuY2U9d25kY2xhc3MtPmhJbnN0YW5jZTsKLQljb3B5LmhJY29uPXduZGNsYXNzLT5oSWNvbjsKLQljb3B5LmhDdXJzb3I9d25kY2xhc3MtPmhDdXJzb3I7Ci0JY29weS5oYnJCYWNrZ3JvdW5kPXduZGNsYXNzLT5oYnJCYWNrZ3JvdW5kOworCWNvcHkuaEluc3RhbmNlPShISU5TVEFOQ0Upd25kY2xhc3MtPmhJbnN0YW5jZTsKKwljb3B5LmhJY29uPShISUNPTil3bmRjbGFzcy0+aEljb247CisJY29weS5oQ3Vyc29yPShIQ1VSU09SKXduZGNsYXNzLT5oQ3Vyc29yOworCWNvcHkuaGJyQmFja2dyb3VuZD0oSEJSVVNIKXduZGNsYXNzLT5oYnJCYWNrZ3JvdW5kOwogCWlmKHduZGNsYXNzLT5scHN6TWVudU5hbWUpCiAJewogCQlzMT1hbGxvY2Eoc3RybGVuKHduZGNsYXNzLT5scHN6TWVudU5hbWUpKzEpOwpAQCAtNzUsNyArNzUsNyBAQAogTFJFU1VMVCBVU0VSMzJfRGVmV2luZG93UHJvY0EoRFdPUkQgaHduZCxEV09SRCBtc2csRFdPUkQgd1BhcmFtLERXT1JEIGxQYXJhbSkKIHsKIAkvKiBzb21lIG1lc3NhZ2VzIGNlcnRhaW5seSBuZWVkIHNwZWNpYWwgY2FzaW5nLiBXZSBjb21lIHRvIHRoYXQgbGF0ZXIgKi8KLQlyZXR1cm4gRGVmV2luZG93UHJvYyhod25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKKwlyZXR1cm4gRGVmV2luZG93UHJvYygoSFdORClod25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC04NSw3ICs4NSw3IEBACiB7CiAJQk9PTCByZXQ7CiAJTVNHIG1zZzsKLQlyZXQ9R2V0TWVzc2FnZShNQUtFX1NFR1BUUigmbXNnKSxod25kLG1pbixtYXgpOworCXJldD1HZXRNZXNzYWdlKE1BS0VfU0VHUFRSKCZtc2cpLChIV05EKWh3bmQsbWluLG1heCk7CiAJTVNHMTZ0bzMyKCZtc2csbHBtc2cpOwogCXJldHVybiByZXQ7CiB9CkBAIC05Nyw4ICs5Nyw4IEBACiB7CiAJUEFJTlRTVFJVQ1QgcHM7CiAJSERDIHJldDsKLQlyZXQ9QmVnaW5QYWludChod25kLCZwcyk7Ci0JbHBwcy0+aGRjPXBzLmhkYzsKKwlyZXQ9QmVnaW5QYWludCgoSFdORClod25kLCZwcyk7CisJbHBwcy0+aGRjPShEV09SRClwcy5oZGM7CiAJbHBwcy0+ZkVyYXNlPXBzLmZFcmFzZTsKIAlscHBzLT5yY1BhaW50LnRvcD1wcy5yY1BhaW50LnRvcDsKIAlscHBzLT5yY1BhaW50LmxlZnQ9cHMucmNQYWludC5sZWZ0OwpAQCAtMTIzLDcgKzEyMyw3IEBACiAJcHMucmNQYWludC5ib3R0b209bHBwcy0+cmNQYWludC5ib3R0b207CiAJcHMuZlJlc3RvcmU9bHBwcy0+ZlJlc3RvcmU7CiAJcHMuZkluY1VwZGF0ZT1scHBzLT5mSW5jVXBkYXRlOwotCUVuZFBhaW50KGh3bmQsJnBzKTsKKwlFbmRQYWludCgoSFdORClod25kLCZwcyk7CiAJcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL21pc2Mvd2luc29ja2V0LmMgYi9taXNjL3dpbnNvY2tldC5jCmluZGV4IDJmZGQ1YTYuLjIzNjc1YTEgMTAwNjQ0Ci0tLSBhL21pc2Mvd2luc29ja2V0LmMKKysrIGIvbWlzYy93aW5zb2NrZXQuYwpAQCAtOTAsMTQgKzkwLDE0IEBACiAJY2hhciBzY3JhdGNoWzgxOTJdOwogfTsKIHN0YXRpYyBzdHJ1Y3QgV2luU29ja0hlYXAgKkhlYXA7Ci1zdGF0aWMgaW50IEhlYXBIYW5kbGU7CitzdGF0aWMgSEFORExFIEhlYXBIYW5kbGU7CiBzdGF0aWMgaW50IFNjcmF0Y2hQdHI7CiAKICNpZm5kZWYgV0lORUxJQgogI2RlZmluZSBHRVRfU0VHX1BUUih4KQlNQUtFTE9ORygoaW50KSgoY2hhciopKHgpLShjaGFyKilIZWFwKSwJXAogCQkJCQkJCUdsb2JhbEhhbmRsZVRvU2VsKEhlYXBIYW5kbGUpKQogI2Vsc2UKLSNkZWZpbmUgR0VUX1NFR19QVFIoeCkJKHgpCisjZGVmaW5lIEdFVF9TRUdfUFRSKHgpCSgoU0VHUFRSKXgpCiAjZW5kaWYKIAogI2lmbmRlZiBXSU5FTElCCkBAIC0xOTYsNyArMTk2LDkgQEAKIAljYXNlIEVTVEFMRToJCXJldHVybiBXU0FFU1RBTEU7CiAJY2FzZSBFUkVNT1RFOgkJcmV0dXJuIFdTQUVSRU1PVEU7CiAKKyNpZmRlZiBFRFFVT1QKICAgICAgICAgZGVmYXVsdDoKKyNlbmRpZgogCQlmcHJpbnRmKHN0ZGVyciwgIndpbnNvY2s6IHVua25vd24gZXJyb3JubyAlZCFcbiIsIGVycm5vKTsKIAkJcmV0dXJuIFdTQUVPUE5PVFNVUFA7CiAJfQpAQCAtMjgzLDcgKzI4NSw3IEBACiAJZm9yKGk9MDtob3N0LT5oX2FkZHJfbGlzdFtpXTtpKyspCiAJCTsKIAlhZGRyX2xpc3Q9c2NyYXRjaF9hbGxvYyhzaXplb2YoU0VHUFRSKSooaSsxKSk7Ci0JaGVhcGVudC0+aF9hZGRyX2xpc3QgPSBHRVRfU0VHX1BUUihhZGRyX2xpc3QpOworCWhlYXBlbnQtPmhfYWRkcl9saXN0ID0gKGNoYXIqKilHRVRfU0VHX1BUUihhZGRyX2xpc3QpOwogCWZvcihpPTA7aG9zdC0+aF9hZGRyX2xpc3RbaV07aSsrKQogCXsKIAkJdm9pZCAqYWRkcj1zY3JhdGNoX2FsbG9jKGhvc3QtPmhfbGVuZ3RoKTsKQEAgLTc0MCwxNyArNzQyLDE4IEBACiB7CiAJc3RydWN0IGlwY19wYWNrZXQgbWVzc2FnZTsKIAotCWlmIChtc2dyY3Yod2luZV9rZXksICZtZXNzYWdlLCBJUENfUEFDS0VUX1NJWkUsIE1UWVBFLCBJUENfTk9XQUlUKSA9PSAtMSkKKwlpZiAobXNncmN2KHdpbmVfa2V5LCAoc3RydWN0IG1zZ2J1ZiopJm1lc3NhZ2UsIAorCQkgICBJUENfUEFDS0VUX1NJWkUsIE1UWVBFLCBJUENfTk9XQUlUKSA9PSAtMSkKIAkJcGVycm9yKCJ3aW5lOiBtc2dyY3YiKTsKIAogCWZwcmludGYoc3RkZXJyLCAKLQkJIldTQTogUG9zdE1lc3NhZ2UgKGh3bmQgJWQsIHdNc2cgJWQsIHdQYXJhbSAlZCwgbFBhcmFtICVsZClcbiIsCisJCSJXU0E6IFBvc3RNZXNzYWdlIChod25kICJOUEZNVCIsIHdNc2cgJWQsIHdQYXJhbSAiTlBGTVQiLCBsUGFyYW0gJWxkKVxuIiwKIAkJbWVzc2FnZS5oV25kLAogCQltZXNzYWdlLndNc2csCiAJCW1lc3NhZ2UuaGFuZGxlLAogCQltZXNzYWdlLmxQYXJhbSk7CiAKLQlQb3N0TWVzc2FnZShtZXNzYWdlLmhXbmQsIG1lc3NhZ2Uud01zZywgbWVzc2FnZS5oYW5kbGUsIG1lc3NhZ2UubFBhcmFtKTsKKwlQb3N0TWVzc2FnZShtZXNzYWdlLmhXbmQsIG1lc3NhZ2Uud01zZywgKFdQQVJBTSltZXNzYWdlLmhhbmRsZSwgbWVzc2FnZS5sUGFyYW0pOwogCQkKIAlzaWduYWwoU0lHVVNSMSwgcmVjdl9tZXNzYWdlKTsKIH0KQEAgLTc2NywxMCArNzcwLDExIEBACiAJbWVzc2FnZS5sUGFyYW0gPSBsUGFyYW07CiAKIAlmcHJpbnRmKHN0ZGVyciwgCi0JCSJXU0E6IHNlbmQgKGh3bmQgJWQsIHdNc2cgJWQsIGhhbmRsZSAlZCwgbFBhcmFtICVsZClcbiIsCisJCSJXU0E6IHNlbmQgKGh3bmQgIk5QRk1UIiwgd01zZyAlZCwgaGFuZGxlICJOUEZNVCIsIGxQYXJhbSAlbGQpXG4iLAogCQloV25kLCB3TXNnLCBoYW5kbGUsIGxQYXJhbSk7CiAJCi0JaWYgKG1zZ3NuZCh3aW5lX2tleSwgJm1lc3NhZ2UsICBJUENfUEFDS0VUX1NJWkUsIElQQ19OT1dBSVQpID09IC0xKQorCWlmIChtc2dzbmQod2luZV9rZXksIChzdHJ1Y3QgbXNnYnVmKikmbWVzc2FnZSwgIAorCQkgICBJUENfUEFDS0VUX1NJWkUsIElQQ19OT1dBSVQpID09IC0xKQogCQlwZXJyb3IoIndpbmU6IG1zZ3NuZCIpOwogCQkKIAlraWxsKGdldHBwaWQoKSwgU0lHVVNSMSk7CkBAIC05MTMsNyArOTE3LDcgQEAKIAlsb25nIGV2ZW50OwogCWZkX3NldCByZWFkX2Zkcywgd3JpdGVfZmRzLCBleGNlcHRfZmRzOwogCi0JZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQV9Bc3luY1NlbGVjdDogc29ja2V0ICVkLCBIV05EICVkLCB3TXNnICVkLCBldmVudCAlbGRcbiIsIHMsIGhXbmQsIHdNc2csIGxFdmVudCk7CisJZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQV9Bc3luY1NlbGVjdDogc29ja2V0ICVkLCBIV05EICJOUEZNVCIsIHdNc2cgJWQsIGV2ZW50ICVsZFxuIiwgcywgaFduZCwgd01zZywgbEV2ZW50KTsKIAogCS8qIHJlbW92ZSBvdXRzdGFuZGluZyBhc3luY3NlbGVjdCgpIHByb2Nlc3NlcyAqLwogCS8qIGtpbGwgKi8KQEAgLTk1NSw3ICs5NTksNyBAQAogCiBJTlQgV1NBQ2FuY2VsQXN5bmNSZXF1ZXN0KEhBTkRMRSBoQXN5bmNUYXNrSGFuZGxlKQogewotCWRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0FfQXN5bmNSZXF1ZXN0OiBoYW5kbGUgJWRcbiIsIGhBc3luY1Rhc2tIYW5kbGUpOworCWRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0FfQXN5bmNSZXF1ZXN0OiBoYW5kbGUgIk5QRk1UIlxuIiwgaEFzeW5jVGFza0hhbmRsZSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL21pc2NlbXUvSW1ha2VmaWxlIGIvbWlzY2VtdS9JbWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYWRiMWEuLjAwMDAwMDAKLS0tIGEvbWlzY2VtdS9JbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jaW5jbHVkZSAiLi4vV2luZS50bXBsIgotCi1NT0RVTEUgPSBtaXNjZW11Ci0KLVNSQ1MgPSBcCi0JZG9zbWVtLmMgXAotCWRwbWkuYyBcCi0JZW11bGF0ZS5jIFwKLQlpbnN0ci5jIFwKLQlpbnQxMC5jIFwKLQlpbnQxMy5jIFwKLQlpbnQxYS5jIFwKLQlpbnQyMS5jIFwKLQlpbnQyNS5jIFwKLQlpbnQyNi5jIFwKLQlpbnQyYS5jIFwKLQlpbnQyZi5jIFwKLQlpbnQ1Yy5jIFwKLQlpbnRlcnJ1cHRzLmMgXAotCWlvcG9ydHMuYwotCi1PQkpTID0gJChTUkNTOi5jPS5vKQotCi1XaW5lUmVsb2NhdGFibGVUYXJnZXQoJChNT0RVTEUpLCwkKE9CSlMpKQotRGVwZW5kVGFyZ2V0KCkKLQotaW5jbHVkZXM6OgotCi1pbnN0YWxsOjoKZGlmZiAtLWdpdCBhL21pc2NlbXUvTWFrZWZpbGUuaW4gYi9taXNjZW11L01ha2VmaWxlLmluCmluZGV4IDZkZjY4YjAuLmYxZjY3ZWEgMTAwNjQ0Ci0tLSBhL21pc2NlbXUvTWFrZWZpbGUuaW4KKysrIGIvbWlzY2VtdS9NYWtlZmlsZS5pbgpAQCAtMiw2ICsyLDcgQEAKIE1PRFVMRSA9IG1pc2NlbXUKIAogQ19TUkNTID0gXAorCWNwdS5jIFwKIAlkb3NtZW0uYyBcCiAJZHBtaS5jIFwKIAllbXVsYXRlLmMgXApAQCAtMTQsOSArMTUsMTEgQEAKIAlpbnQyNi5jIFwKIAlpbnQyYS5jIFwKIAlpbnQyZi5jIFwKKwlpbnQ0Yi5jIFwKIAlpbnQ1Yy5jIFwKIAlpbnRlcnJ1cHRzLmMgXAotCWlvcG9ydHMuYworCWlvcG9ydHMuYyBcCisJdnhkLmMKIAogYWxsOiAkKE1PRFVMRSkubwogCmRpZmYgLS1naXQgYS9taXNjZW11L2NwdS5jIGIvbWlzY2VtdS9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzZjMzViCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY2VtdS9jcHUuYwpAQCAtMCwwICsxLDQzIEBACisvKgorICogV2hhdCBwcm9jZXNzb3I/CisgKgorICogQ29weXJpZ2h0IDE5OTUgTW9ydGVuIFdlbGluZGVyCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworaW50IHJ1bnRpbWVfY3B1ICh2b2lkKQoreworICBzdGF0aWMgaW50IGNhY2hlID0gMDsKKworI2lmZGVmIGxpbnV4CisgIGlmICghY2FjaGUpCisgICAgeworICAgICAgRklMRSAqZiA9IGZvcGVuICgiL3Byb2MvY3B1aW5mbyIsICJyIik7CisKKyAgICAgIGNhY2hlID0gMzsgIC8qIERlZmF1bHQuICAqLworCisgICAgICBpZiAoZikKKwl7CisJICBjaGFyIGluZm9bNV0sIHZhbHVlWzVdOworCSAgd2hpbGUgKGZzY2FuZiAoZiwgIiAlNHMlKnMgOiAlNHMlKnMiLCBpbmZvLCB2YWx1ZSkgPT0gMikKKwkgICAgaWYgKCFzdHJjYXNlY21wIChpbmZvLCAiY3B1IikpCisJICAgICAgeworCQlpZiAoaXNkaWdpdCAodmFsdWVbMF0pICYmIHZhbHVlWzFdID09ICc4JworCQkgICAgJiYgdmFsdWVbMl0gPT0gJzYnICYmIHZhbHVlWzNdID09IDApCisJCSAgeworCQkgICAgY2FjaGUgPSB2YWx1ZVswXSAtICcwJzsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkgICAgICB9CisJICBmY2xvc2UgKGYpOworCX0KKyAgICB9CisgIHJldHVybiBjYWNoZTsKKyNlbHNlCisgIC8qIEZJWE1FOiBob3cgZG8gd2UgZG8gdGhpcyBvbiBvdGhlciBzeXN0ZW1zPyAqLworICByZXR1cm4gMzsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbWlzY2VtdS9kcG1pLmMgYi9taXNjZW11L2RwbWkuYwppbmRleCAxYzc4N2U5Li43Mzg5Mzk2IDEwMDY0NAotLS0gYS9taXNjZW11L2RwbWkuYworKysgYi9taXNjZW11L2RwbWkuYwpAQCAtMTI3LDEwICsxMjcsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgKFNFR1BUUilNQUtFTE9ORyggRFhfcmVnKCZjb250ZXh0KSwgQ1hfcmVnKCZjb250ZXh0KSApKTsKIAlicmVhazsKIAorICAgIGNhc2UgMHgwMzAwOiAgLyogU2ltdWxhdGUgcmVhbCBtb2RlIGludGVycnVwdCAKKyAgICAgICAgKiAgSW50ZXJydXB0IG51bWJlciBpcyBpbiBCTCwgZmxhZ3MgYXJlIGluIEJICisgICAgICAgICogIEVTOkRJIHBvaW50cyB0byByZWFsLW1vZGUgY2FsbCBzdHJ1Y3R1cmUgIAorICAgICAgICAqICBDdXJyZW50bHkgd2UganVzdCBwcmludCBpdCBvdXQgYW5kIHJldHVybiBlcnJvci4KKyAgICAgICAgKi8KKyAgICAgICAgcHRyID0gKEJZVEUgKilQVFJfU0VHX09GRl9UT19MSU4oIEVTX3JlZygmY29udGV4dCksIERJX3JlZygmY29udGV4dCkgKTsKKyAgICAgICAgZnByaW50ZihzdGRuaW1wLAorICAgICAgICAgICAgICAgIlJlYWxNb2RlSW50ICUwMng6IEFYPSUwNHggQlg9JTA0eCBDWD0lMDR4IERYPSUwNHggU0k9JTA0eCBEST0lMDR4IEVTPSUwNHggRFM9JTA0eFxuIiwKKyAgICAgICAgICAgICAgICBCTF9yZWcoJmNvbnRleHQpLAorICAgICAgICAgICAgICAqKFdPUkQqKShwdHIrMHgxYyksKihXT1JEKikocHRyKzB4MTApLCooV09SRCopKHB0cisweDE4KSwqKFdPUkQqKShwdHIrMHgxNCksCisgICAgICAgICAgICAgICooV09SRCopKHB0cisweDA0KSwqKFdPUkQqKShwdHIrMHgwMCksKihXT1JEKikocHRyKzB4MjIpLCooV09SRCopKHB0cisweDI0KSk7CisgICAgICAgIFNFVF9DRkxBRygmY29udGV4dCk7CisgICAgICAgIGJyZWFrOworCiAgICAgY2FzZSAweDA0MDA6ICAvKiBHZXQgRFBNSSB2ZXJzaW9uICovCiAgICAgICAgIEFYX3JlZygmY29udGV4dCkgPSAweDAwNWE7ICAvKiBEUE1JIHZlcnNpb24gMC45MCAqLwogICAgICAgICBCWF9yZWcoJmNvbnRleHQpID0gMHgwMDA1OyAgLyogRmxhZ3M6IDMyLWJpdCwgdmlydHVhbCBtZW1vcnkgKi8KLSAgICAgICAgQ0xfcmVnKCZjb250ZXh0KSA9IDM7ICAgICAgIC8qIENQVSB0eXBlOiAzODYgKi8KKyAgICAgICAgQ0xfcmVnKCZjb250ZXh0KSA9IHJ1bnRpbWVfY3B1ICgpOwogICAgICAgICBEWF9yZWcoJmNvbnRleHQpID0gMHgwMTAyOyAgLyogTWFzdGVyL3NsYXZlIGludGVycnVwdCBjb250cm9sbGVyIGJhc2UqLwogICAgICAgICBicmVhazsKIApkaWZmIC0tZ2l0IGEvbWlzY2VtdS9lbXVsYXRlLmMgYi9taXNjZW11L2VtdWxhdGUuYwppbmRleCBhZmE2MWU3Li5kMzFjY2I3IDEwMDY0NAotLS0gYS9taXNjZW11L2VtdWxhdGUuYworKysgYi9taXNjZW11L2VtdWxhdGUuYwpAQCAtNzIsNyArNzIsNyBAQAogICAgICAgICAvKiBJTjogQVgmMHgwQzAwIHJvdW5kaW5nIHByb3RvY29sICovCiAgICAgICAgIC8qIE9VVDogRFg6QVggdmFyaWFibGUgcG9wcGVkICovCiAgICAgICAgIHsKLSAgICAgICAgICAgIERXT1JEIGR3OworICAgICAgICAgICAgRFdPUkQgZHc9MDsKICAgICAgICAgICAgIC8qIEkgZG9uJ3Qga25vdyBtdWNoIGFib3V0IGFzbSgpIHByb2dyYW1taW5nLiBUaGlzIGNvdWxkIGJlIAogICAgICAgICAgICAgICogd3JvbmcuIAogICAgICAgICAgICAgICovCkBAIC05MSw2ICs5MSw3IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAxMDogLyogZHVubm8uIGJ1dCBsb29rcyBsaWtlIHJldHVybmluZyBuci4gb2YgdGhpbmdzIG9uIHN0YWNrIGluIEFYICovCisJQVhfcmVnKCZjb250ZXh0KSA9IDA7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAxMTogLyoganVzdCByZXR1cm5zIHRoZSBpbnN0YWxsZWQgZmxhZyBpbiBEWDpBWCAqLwpkaWZmIC0tZ2l0IGEvbWlzY2VtdS9pbnN0ci5jIGIvbWlzY2VtdS9pbnN0ci5jCmluZGV4IGU1ZDg5ZDguLjgzZjdjZWYgMTAwNjQ0Ci0tLSBhL21pc2NlbXUvaW5zdHIuYworKysgYi9taXNjZW11L2luc3RyLmMKQEAgLTExLDEwICsxMSwxMiBAQAogI2luY2x1ZGUgInJlZ2lzdGVycy5oIgogCiAKKyNkZWZpbmUgU1RBQ0tfcmVnKGNvbnRleHQpIFwKKyAgICgoR0VUX1NFTF9GTEFHUyhTU19yZWcoY29udGV4dCkpICYgTERUX0ZMQUdTXzMyQklUKSA/IFwKKyAgICAgICAgICAgICAgICAgICBFU1BfcmVnKGNvbnRleHQpIDogU1BfcmVnKGNvbnRleHQpKQorCiAjZGVmaW5lIFNUQUNLX1BUUihjb250ZXh0KSBcCi0gICAgKFBUUl9TRUdfT0ZGX1RPX0xJTiggU1NfcmVnKGNvbnRleHQpLCBcCi0gICAgICAgICgoR0VUX1NFTF9GTEFHUyhTU19yZWcoY29udGV4dCkpICYgTERUX0ZMQUdTXzMyQklUKSA/IFwKLSAgICAgICAgICAgIEVTUF9yZWcoY29udGV4dCkgOiBTUF9yZWcoY29udGV4dCkpKSkKKyAgICAoUFRSX1NFR19PRkZfVE9fTElOKFNTX3JlZyhjb250ZXh0KSxTVEFDS19yZWcoY29udGV4dCkpKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJTlNUUl9SZXBsYWNlU2VsZWN0b3IKQEAgLTI1MCw4ICsyNTIsMTIgQEAKICAgICBjYXNlIDB4MGY6IHN3aXRjaChpbnN0clsxXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgMHhiMjogU1NfcmVnKGNvbnRleHQpID0gc2VnOyBicmVhazsgIC8qIGxzcyAqLworI2lmZGVmIEZTX3JlZwogICAgICAgICAgICAgICAgY2FzZSAweGI0OiBGU19yZWcoY29udGV4dCkgPSBzZWc7IGJyZWFrOyAgLyogbGZzICovCisjZW5kaWYKKyNpZmRlZiBHU19yZWcKICAgICAgICAgICAgICAgIGNhc2UgMHhiNTogR1NfcmVnKGNvbnRleHQpID0gc2VnOyBicmVhazsgIC8qIGxncyAqLworI2VuZGlmCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICB9CkBAIC0yOTgsMTIgKzMwNCwxNiBAQAogICAgICAgICBjYXNlIDB4MjY6CiAgICAgICAgICAgICBzZWdwcmVmaXggPSBFU19yZWcoY29udGV4dCk7CiAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBGU19yZWcKICAgICAgICAgY2FzZSAweDY0OgogICAgICAgICAgICAgc2VncHJlZml4ID0gRlNfcmVnKGNvbnRleHQpOwogICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBHU19yZWcKICAgICAgICAgY2FzZSAweDY1OgogICAgICAgICAgICAgc2VncHJlZml4ID0gR1NfcmVnKGNvbnRleHQpOwogICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKICAgICAgICAgY2FzZSAweDY2OgogICAgICAgICAgICAgbG9uZ19vcCA9ICFsb25nX29wOyAgLyogb3Bjb2RlIHNpemUgcHJlZml4ICovCiAgICAgICAgICAgICBicmVhazsKQEAgLTM0Niw3ICszNTYsNyBAQAogICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTc6IFNTX3JlZyhjb250ZXh0KSA9IHNlZzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgxZjogRFNfcmVnKGNvbnRleHQpID0gc2VnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTUF9yZWcoY29udGV4dCkgKz0gc2l6ZW9mKFdPUkQpOworICAgICAgICAgICAgICAgICAgICBTVEFDS19yZWcoY29udGV4dCkgKz0gbG9uZ19vcCA/IDQgOiAyOwogICAgICAgICAgICAgICAgICAgICBFSVBfcmVnKGNvbnRleHQpICs9IHByZWZpeGxlbiArIDE7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgICAgIH0KQEAgLTM1NiwyNyArMzY2LDQzIEBACiAgICAgICAgIGNhc2UgMHgwZjogLyogZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gKi8KICAgICAgICAgICAgIHN3aXRjaChpbnN0clsxXSkKICAgICAgICAgICAgIHsKKyNpZmRlZiBGU19yZWcKICAgICAgICAgICAgIGNhc2UgMHhhMTogLyogcG9wIGZzICovCi0gICAgICAgICAgICBjYXNlIDB4YTk6IC8qIHBvcCBncyAqLwogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgV09SRCBzZWcgPSAqKFdPUkQgKilTVEFDS19QVFIoIGNvbnRleHQgKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKChzZWcgPSBJTlNUUl9SZXBsYWNlU2VsZWN0b3IoIGNvbnRleHQsIHNlZyApKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goaW5zdHJbMV0pCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4YTE6IEZTX3JlZyhjb250ZXh0KSA9IHNlZzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4YTk6IEdTX3JlZyhjb250ZXh0KSA9IHNlZzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTUF9yZWcoY29udGV4dCkgKz0gc2l6ZW9mKFdPUkQpOworICAgICAgICAgICAgICAgICAgICAgICAgRlNfcmVnKGNvbnRleHQpID0gc2VnOworICAgICAgICAgICAgICAgICAgICAgICAgU1RBQ0tfcmVnKGNvbnRleHQpICs9IGxvbmdfb3AgPyA0IDogMjsKICAgICAgICAgICAgICAgICAgICAgICAgIEVJUF9yZWcoY29udGV4dCkgKz0gcHJlZml4bGVuICsgMjsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmICAvKiBGU19yZWcgKi8KKworI2lmZGVmIEdTX3JlZworICAgICAgICAgICAgY2FzZSAweGE5OiAvKiBwb3AgZ3MgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFdPUkQgc2VnID0gKihXT1JEICopU1RBQ0tfUFRSKCBjb250ZXh0ICk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoc2VnID0gSU5TVFJfUmVwbGFjZVNlbGVjdG9yKCBjb250ZXh0LCBzZWcgKSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR1NfcmVnKGNvbnRleHQpID0gc2VnOworICAgICAgICAgICAgICAgICAgICAgICAgU1RBQ0tfcmVnKGNvbnRleHQpICs9IGxvbmdfb3AgPyA0IDogMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVJUF9yZWcoY29udGV4dCkgKz0gcHJlZml4bGVuICsgMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmICAvKiBHU19yZWcgKi8KIAogICAgICAgICAgICAgY2FzZSAweGIyOiAvKiBsc3MgYWRkcixyZWcgKi8KKyNpZmRlZiBGU19yZWcKICAgICAgICAgICAgIGNhc2UgMHhiNDogLyogbGZzIGFkZHIscmVnICovCisjZW5kaWYKKyNpZmRlZiBHU19yZWcKICAgICAgICAgICAgIGNhc2UgMHhiNTogLyogbGdzIGFkZHIscmVnICovCisjZW5kaWYKICAgICAgICAgICAgICAgICBpZiAoSU5TVFJfRW11bGF0ZUxEUyggY29udGV4dCwgaW5zdHIsIGxvbmdfb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdfYWRkciwgc2VncHJlZml4LCAmbGVuICkpCiAgICAgICAgICAgICAgICAgewpAQCAtNDU4LDcgKzQ4NCw3IEBACiAJICAgIH0KICAgICAgICAgICAgIHJldHVybiBUUlVFOwogCi0gICAgICAgIGNhc2UgMHg4ZTogLyogbW92IHJlZyxzZWdtZW50X3JlZyAqLworICAgICAgICBjYXNlIDB4OGU6IC8qIG1vdiBYWCxzZWdtZW50X3JlZyAqLwogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFdPUkQgc2VnID0gKihXT1JEICopSU5TVFJfR2V0T3BlcmFuZEFkZHIoIGNvbnRleHQsIGluc3RyICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ19hZGRyLCBzZWdwcmVmaXgsICZsZW4gKTsKQEAgLTQ4MiwxMyArNTA4LDE3IEBACiAgICAgICAgICAgICAgICAgICAgIEVJUF9yZWcoY29udGV4dCkgKz0gcHJlZml4bGVuICsgbGVuICsgMTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICAgICAgY2FzZSA0OgorI2lmZGVmIEZTX3JlZwogICAgICAgICAgICAgICAgICAgICBGU19yZWcoY29udGV4dCkgPSBzZWc7CiAgICAgICAgICAgICAgICAgICAgIEVJUF9yZWcoY29udGV4dCkgKz0gcHJlZml4bGVuICsgbGVuICsgMTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisjZW5kaWYKICAgICAgICAgICAgICAgICBjYXNlIDU6CisjaWZkZWYgR1NfcmVnCiAgICAgICAgICAgICAgICAgICAgIEdTX3JlZyhjb250ZXh0KSA9IHNlZzsKICAgICAgICAgICAgICAgICAgICAgRUlQX3JlZyhjb250ZXh0KSArPSBwcmVmaXhsZW4gKyBsZW4gKyAxOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyNlbmRpZgogICAgICAgICAgICAgICAgIGNhc2UgNjogIC8qIHVudXNlZCAqLwogICAgICAgICAgICAgICAgIGNhc2UgNzogIC8qIHVudXNlZCAqLwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTUyMCw3ICs1NTAsNyBAQAogICAgICAgICAgICAgICAgICooLS1zdGFjaykgPSBGTF9yZWcoY29udGV4dCk7CiAgICAgICAgICAgICAgICAgKigtLXN0YWNrKSA9IENTX3JlZyhjb250ZXh0KTsKICAgICAgICAgICAgICAgICAqKC0tc3RhY2spID0gSVBfcmVnKGNvbnRleHQpICsgcHJlZml4bGVuICsgMjsKLSAgICAgICAgICAgICAgICBTUF9yZWcoY29udGV4dCkgLT0gMyAqIHNpemVvZihXT1JEKTsKKyAgICAgICAgICAgICAgICBTVEFDS19yZWcoY29udGV4dCkgLT0gMyAqIHNpemVvZihXT1JEKTsKICAgICAgICAgICAgICAgICAvKiBKdW1wIHRvIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLwogICAgICAgICAgICAgICAgIENTX3JlZyhjb250ZXh0KSAgPSBISVdPUkQoYWRkcik7CiAgICAgICAgICAgICAgICAgRUlQX3JlZyhjb250ZXh0KSA9IExPV09SRChhZGRyKTsKQEAgLTUzNCw3ICs1NjQsNyBAQAogICAgICAgICAgICAgICAgIEVJUF9yZWcoY29udGV4dCkgPSAqc3RhY2srKzsKICAgICAgICAgICAgICAgICBDU19yZWcoY29udGV4dCkgID0gKnN0YWNrKys7CiAgICAgICAgICAgICAgICAgRUZMX3JlZyhjb250ZXh0KSA9ICpzdGFjazsKLSAgICAgICAgICAgICAgICBTUF9yZWcoY29udGV4dCkgKz0gMypzaXplb2YoRFdPUkQpOyAgLyogUG9wIHRoZSByZXR1cm4gYWRkcmVzcyBhbmQgZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBTVEFDS19yZWcoY29udGV4dCkgKz0gMypzaXplb2YoRFdPUkQpOyAgLyogUG9wIHRoZSByZXR1cm4gYWRkcmVzcyBhbmQgZmxhZ3MgKi8KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKQEAgLTU0Miw3ICs1NzIsNyBAQAogICAgICAgICAgICAgICAgIEVJUF9yZWcoY29udGV4dCkgPSAqc3RhY2srKzsKICAgICAgICAgICAgICAgICBDU19yZWcoY29udGV4dCkgID0gKnN0YWNrKys7CiAgICAgICAgICAgICAgICAgRkxfcmVnKGNvbnRleHQpICA9ICpzdGFjazsKLSAgICAgICAgICAgICAgICBTUF9yZWcoY29udGV4dCkgKz0gMypzaXplb2YoV09SRCk7ICAvKiBQb3AgdGhlIHJldHVybiBhZGRyZXNzIGFuZCBmbGFncyAqLworICAgICAgICAgICAgICAgIFNUQUNLX3JlZyhjb250ZXh0KSArPSAzKnNpemVvZihXT1JEKTsgIC8qIFBvcCB0aGUgcmV0dXJuIGFkZHJlc3MgYW5kIGZsYWdzICovCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gVFJVRTsKIApkaWZmIC0tZ2l0IGEvbWlzY2VtdS9pbnQxYS5jIGIvbWlzY2VtdS9pbnQxYS5jCmluZGV4IDY5Mzg2YzAuLjczODAyOWMgMTAwNjQ0Ci0tLSBhL21pc2NlbXUvaW50MWEuYworKysgYi9taXNjZW11L2ludDFhLmMKQEAgLTIzLDEyICsyMywxNCBAQAogewogICAgIHN0cnVjdCB0bSAqYmR0aW1lOwogICAgIHN0cnVjdCB0aW1ldmFsIHR2czsKKyAgICB0aW1lX3Qgc2Vjb25kczsKIAogICAgIC8qIFRoaXMgc2hvdWxkIGdpdmUgdXMgdGhlIChhcHByb3hpbWF0ZWx5KSBjb3JyZWN0CiAgICAgICogMTguMjA2IGNsb2NrIHRpY2tzIHBlciBzZWNvbmQgc2luY2UgbWlkbmlnaHQuCiAgICAgICovCiAgICAgZ2V0dGltZW9mZGF5KCAmdHZzLCBOVUxMICk7Ci0gICAgYmR0aW1lID0gbG9jYWx0aW1lKCAmdHZzLnR2X3NlYyApOworICAgIHNlY29uZHMgPSB0dnMudHZfc2VjOworICAgIGJkdGltZSA9IGxvY2FsdGltZSggJnNlY29uZHMgKTsKICAgICByZXR1cm4gKCgoYmR0aW1lLT50bV9ob3VyICogMzYwMCArIGJkdGltZS0+dG1fbWluICogNjAgKwogICAgICAgICAgICAgICBiZHRpbWUtPnRtX3NlYykgKiAxODIwNikgLyAxMDAwKSArCiAgICAgICAgICAgICAgICAgICAodHZzLnR2X3VzZWMgLyA1NDkyNyk7CmRpZmYgLS1naXQgYS9taXNjZW11L2ludDIxLmMgYi9taXNjZW11L2ludDIxLmMKaW5kZXggZDU4MGVjNS4uMzA4NjJhNiAxMDA2NDQKLS0tIGEvbWlzY2VtdS9pbnQyMS5jCisrKyBiL21pc2NlbXUvaW50MjEuYwpAQCAtMjUsNyArMjUsMTIgQEAKICNpbmNsdWRlICJtaXNjZW11LmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgotCisjaWZkZWYgX19zdnI0X18KKy8qIFNWUjQgRE9FU05UZG8gbG9ja2luZyB0aGUgc2FtZSB3YXkgbXVzdCBpbXBsZW1lbnQgcHJvcGVybHkgKi8KKyNkZWZpbmUgTE9DS19FWCAwCisjZGVmaW5lIExPQ0tfU0ggIDEKKyNkZWZpbmUgTE9DS19OQiAgOAorI2VuZGlmCiAvKiBEZWZpbmUgdGhlIGRyaXZlIHBhcmFtZXRlciBibG9jaywgYXMgdXNlZCBieSBpbnQyMS8xRgogICogYW5kIGludDIxLzMyLiAgVGhpcyB0YWJsZSBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUKICAqIGdsb2JhbCAnZHBiJyBwb2ludGVyLCB3aGljaCBwb2ludHMgaW50byB0aGUgbG9jYWwgZG9zCkBAIC01Myw4ICs1OCw3IEBACiAgICAgV09SRCBmcmVlX2NsdXN0ZXJzOyAgICAgLyogTnVtYmVyIG9mIGZyZWUgY2x1c3RlcnMgKDB4RkZGRj11bmtub3duKSAqLwogfTsKIAotV09SRCBFeHRlbmRlZEVycm9yLCBDb2RlUGFnZSA9IDQzNzsKLUJZVEUgRXJyb3JDbGFzcywgQWN0aW9uLCBFcnJvckxvY3VzOworV09SRCBDb2RlUGFnZSA9IDQzNzsKIHN0cnVjdCBEUEIgKmRwYjsKIERXT1JEIGRwYnNlZ3B0cjsKIApAQCAtNzQsNTMgKzc4LDkgQEAKIAogc3RhdGljIGludCBFcnJvcihpbnQgZSwgaW50IGNsYXNzLCBpbnQgZWwpCiB7Ci0JRXJyb3JDbGFzcyA9IGNsYXNzOwotCUFjdGlvbiA9IFNBX0FzazRSZXRyeTsKLQlFcnJvckxvY3VzID0gZWw7Ci0JRXh0ZW5kZWRFcnJvciA9IGU7Ci0KLQlyZXR1cm4gZTsKKyAgcmV0dXJuIERPU19FcnJvcihlLGNsYXNzLGVsKTsKIH0KIAotdm9pZCBlcnJub190b19kb3NlcnIodm9pZCkKLXsKLQlzd2l0Y2ggKGVycm5vKSB7Ci0JCWNhc2UgRUFHQUlOOgotCQkJRXJyb3IgKFNoYXJlVmlvbGF0aW9uLCBFQ19UZW1wb3JhcnksIEVMX1Vua25vd24pOwotCQkJYnJlYWs7Ci0JCWNhc2UgRUJBREY6Ci0JCQlFcnJvciAoSW52YWxpZEhhbmRsZSwgRUNfQXBwRXJyb3IsIEVMX1Vua25vd24pOwotCQkJYnJlYWs7Ci0JCWNhc2UgRU5PU1BDOgotCQkJRXJyb3IgKERpc2tGdWxsLCBFQ19NZWRpYUVycm9yLCBFTF9EaXNrKTsKLQkJCWJyZWFrOwkJCQkKLQkJY2FzZSBFQUNDRVM6Ci0JCWNhc2UgRVBFUk06Ci0JCWNhc2UgRVJPRlM6Ci0JCQlFcnJvciAoV3JpdGVQcm90ZWN0ZWQsIEVDX0FjY2Vzc0RlbmllZCwgRUxfVW5rbm93bik7Ci0JCQlicmVhazsKLQkJY2FzZSBFQlVTWToKLQkJCUVycm9yIChMb2NrVmlvbGF0aW9uLCBFQ19BY2Nlc3NEZW5pZWQsIEVMX1Vua25vd24pOwotCQkJYnJlYWs7CQkKLQkJY2FzZSBFTk9FTlQ6Ci0JCQlFcnJvciAoRmlsZU5vdEZvdW5kLCBFQ19Ob3RGb3VuZCwgRUxfVW5rbm93bik7Ci0JCQlicmVhazsJCQkJCi0JCWNhc2UgRUlTRElSOgotCQkJRXJyb3IgKENhbk5vdE1ha2VEaXIsIEVDX0FjY2Vzc0RlbmllZCwgRUxfVW5rbm93bik7Ci0JCQlicmVhazsKLQkJY2FzZSBFTkZJTEU6Ci0JCWNhc2UgRU1GSUxFOgotCQkJRXJyb3IgKE5vTW9yZUZpbGVzLCBFQ19NZWRpYUVycm9yLCBFTF9Vbmtub3duKTsKLQkJCWJyZWFrOwotCQljYXNlIEVFWElTVDoKLQkJCUVycm9yIChGaWxlRXhpc3RzLCBFQ19FeGlzdHMsIEVMX0Rpc2spOwotCQkJYnJlYWs7CQkJCQotCQlkZWZhdWx0OgotCQkJZHByaW50Zl9pbnQoc3RkZGViLCAiaW50MjE6IHVua25vd24gZXJybm8gJWQhXG4iLCBlcnJubyk7Ci0JCQlFcnJvciAoR2VuZXJhbEZhaWx1cmUsIEVDX1N5c3RlbUZhaWx1cmUsIEVMX1Vua25vd24pOwotCQkJYnJlYWs7Ci0JfQotfQogCiBCWVRFICpHZXRDdXJyZW50RFRBKHZvaWQpCiB7CkBAIC00ODgsOSArNDQ4LDExIEBACiB7CiAJc3RydWN0IHRtICpub3c7CiAJc3RydWN0IHRpbWV2YWwgdHY7CisJdGltZV90IHNlY29uZHM7CiAKIAlnZXR0aW1lb2ZkYXkoJnR2LE5VTEwpOwkJLyogTm90ZSB1c2Ugb2YgZ2V0dGltZW9mZGF5KCksIGluc3RlYWQgb2YgdGltZSgpICovCi0Jbm93ID0gbG9jYWx0aW1lKCZ0di50dl9zZWMpOworCXNlY29uZHMgPSB0di50dl9zZWM7CisJbm93ID0gbG9jYWx0aW1lKCZzZWNvbmRzKTsKIAkgCiAJQ1hfcmVnKGNvbnRleHQpID0gKG5vdy0+dG1faG91cjw8OCkgfCBub3ctPnRtX21pbjsKIAlEWF9yZWcoY29udGV4dCkgPSAobm93LT50bV9zZWM8PDgpIHwgdHYudHZfdXNlYy8xMDAwMDsKQEAgLTU5MSw3ICs1NTMsMTEgQEAKIAogCSAgaW50IHJlc3VsdCxyZXRyaWVzPXNoYXJpbmdfcmV0cmllczsKIAkgIHsKKyNpZmRlZiBfX3N2cjRfXworICAgICAgICAgICAgICBwcmludGYoIlNob3VsZCBjYWxsIGZsb2NrIGFuZCBuZWVkcyBwb3J0aW5nIHRvIGxvY2tmXG4iKTsKKyNlbHNlCiAJICAgIHJlc3VsdCA9IGZsb2NrKGhhbmRsZSwgbG9jayB8IExPQ0tfTkIpOworI2VuZGlmCiAJICAgIGlmICggcmV0cmllcyAmJiAoIXJlc3VsdCkgKQogCSAgICB7CiAgICAgICAgICAgICAgIGludCBpOwpAQCAtNjY4LDggKzYzNCw3IEBACiAgICAgICAgICAgICByZXR1cm47CiAJfQogCi0JaWYgKG1rZGlyKGRpcm5hbWUsMCkgPT0gLTEpCi0gICAgICAgIHsKKwlpZiAoKG1rZGlyKGRpcm5hbWUsMCkgPT0gLTEpICAmJiBlcnJubyE9RUVYSVNUKSB7CiAgICAgICAgICAgICBFcnJvciggQ2FuTm90TWFrZURpciwgRUNfQWNjZXNzRGVuaWVkLCBFTF9EaXNrICk7CiAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCkgPSBDYW5Ob3RNYWtlRGlyOwogICAgICAgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOwpAQCAtMTU1Myw2ICsxNTE4LDcgQEAKICAgICAgICAgICAgICAgY2FzZSAweDBGOiAgIC8qIFNldCBsb2dpY2FsIGRyaXZlIG1hcHBpbmcgKi8KICAgICAgICAgICAgICAgICAvKiBGSVhNRTogTm90IGltcGxlbWVudGVkIGF0IHRoZSBtb21lbnQsIGFsd2F5cyByZXR1cm5zIGVycm9yCiAgICAgICAgICAgICAgICAgICovCisJCWZwcmludGYoc3RkbmltcCwiQXR0ZW1wdCB0byBtYXAgZHJpdmUgJTAyeFxuIixCTF9yZWcoJmNvbnRleHQpKTsKICAgICAgICAgICAgICAgICBBWF9yZWcoJmNvbnRleHQpID0gMHgwMDAxOyAvKiBpbnZhbGlkIGZ1bmN0aW9uICovCiAgICAgICAgICAgICAgICAgU0VUX0NGTEFHKCZjb250ZXh0KTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE3NjMsOCArMTcyOSw4IEBACiAJICAgIH0KIAkgICAgYnJlYWs7CiAgICAgCi0gICAgICBjYXNlIDB4ZGM6IC8qIENPTk5FQ1RJT04gU0VSVklDRVMgLSBHRVQgQ09OTkVDVElPTiBOVU1CRVIgKi8KLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAweGRjOiAvKiBDT05ORUNUSU9OIFNFUlZJQ0VTIC0gR0VUIENPTk5FQ1RJT04gTlVNQkVSICovCisgICAgICAgICAgICBicmVhazsKIAogCSAgY2FzZSAweGVhOiAvKiBOT1ZFTEwgTkVUV0FSRSAtIFJFVFVSTiBTSEVMTCBWRVJTSU9OICovCiAJICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWlzY2VtdS9pbnQyZi5jIGIvbWlzY2VtdS9pbnQyZi5jCmluZGV4IDY2YTdhMDEuLjc3OWY2YjcgMTAwNjQ0Ci0tLSBhL21pc2NlbXUvaW50MmYuYworKysgYi9taXNjZW11L2ludDJmLmMKQEAgLTEsMTQgKzEsMTkgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgInJlZ2lzdGVycy5oIgogI2luY2x1ZGUgIndpbmUuaCIKICNpbmNsdWRlICJtc2Rvcy5oIgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKIC8qICNkZWZpbmUgREVCVUdfSU5UICovCiAjaW5jbHVkZSAiZGVidWcuaCIKIAorICAvKiBiYXNlIFdJTlBST0MgbW9kdWxlIG51bWJlciBmb3IgVnhEcyAqLworI2RlZmluZSBWWERfQkFTRSA0MDAKKwogc3RhdGljIHZvaWQgZG9faW50MmZfMTYoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIwLDI1ICsyNSw0MSBAQAogewogICAgIHN3aXRjaChBSF9yZWcoJmNvbnRleHQpKQogICAgIHsKLQljYXNlIDB4MTA6Ci0gICAgICAgICAgICAgICAgQUxfcmVnKCZjb250ZXh0KSA9IDB4ZmY7IC8qIHNoYXJlIGlzIGluc3RhbGxlZCAqLwotCQlicmVhazsKKyAgICBjYXNlIDB4MTA6CisgICAgICAgIEFMX3JlZygmY29udGV4dCkgPSAweGZmOyAvKiBzaGFyZSBpcyBpbnN0YWxsZWQgKi8KKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIDB4MTU6IC8qIG1zY2RleCAqLwotCQkvKiBpZ25vcmUgcmVxdWVzdHMgKi8KLQkJYnJlYWs7CisgICAgY2FzZSAweDE1OiAvKiBtc2NkZXggKi8KKyAgICAgICAgLyogaWdub3JlIHJlcXVlc3RzICovCisgICAgICAgIGJyZWFrOwogCi0JY2FzZSAweDE2OgotCQlkb19pbnQyZl8xNiggJmNvbnRleHQgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQlkZWZhdWx0OgotCQlJTlRfQkFSRiggJmNvbnRleHQsIDB4MmYgKTsKLSAgICAgICAgICAgIH0KKyAgICBjYXNlIDB4MTY6CisgICAgICAgIGRvX2ludDJmXzE2KCAmY29udGV4dCApOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMHg0YToKKyAgICAgICAgc3dpdGNoKEFMX3JlZygmY29udGV4dCkpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAweDEyOiAgLyogcmVhbHRpbWUgY29tcHJlc3Npb24gaW50ZXJmYWNlICovCisgICAgICAgICAgICBicmVhazsgIC8qIG5vdCBpbnN0YWxsZWQgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIElOVF9CQVJGKCAmY29udGV4dCwgMHgyZiApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIElOVF9CQVJGKCAmY29udGV4dCwgMHgyZiApOworICAgICAgICBicmVhazsKKyAgICB9CiB9CiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICBkb19pbnQyZl8xNgorICovCiBzdGF0aWMgdm9pZCBkb19pbnQyZl8xNihzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQpCiB7CisgICAgRFdPUkQgYWRkcjsKKwogICAgIHN3aXRjaChBTF9yZWcoY29udGV4dCkpCiAgICAgewogICAgIGNhc2UgMHgwMDogIC8qIFdpbmRvd3MgZW5oYW5jZWQgbW9kZSBpbnN0YWxsYXRpb24gY2hlY2sgKi8KQEAgLTUyLDM0ICs3Myw1NiBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHg4MDogIC8qIFJlbGVhc2UgdGltZS1zbGljZSAqLwotICAgICAgICBicmVhazsgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKwlBTF9yZWcoY29udGV4dCkgPSAwOworCS8qIEZJWE1FOiBXZSBuZWVkIHRvIGRvIHNvbWV0aGluZyB0aGF0IGxldHMgc29tZSBvdGhlciBwcm9jZXNzIHJ1bgorCSAgIGhlcmUuICAqLworCXNsZWVwKDApOworICAgICAgICBicmVhazsKIAotCWNhc2UgMHg4NDogIC8qIEdldCBkZXZpY2UgQVBJIGVudHJ5IHBvaW50ICovCi0JICAgIGZwcmludGYoc3RkZXJyLCJBcHBsaWNhdGlvbiBhdHRlbXB0ZWQgdG8gYWNjZXNzIFZ4RCAlNFhcbiIsCi0JCQlCWF9yZWcoY29udGV4dCkpOwotCQlmcHJpbnRmKHN0ZGVyciwiVGhpcyBkZXZpY2UgaXMgbm90IGtub3duIHRvIFdpbmUuIik7Ci0JCWZwcmludGYoc3RkZXJyLCJFeHBlY3QgYSBmYWlsdXJlIG5vd1xuIik7Ci0JCUVTX3JlZyhjb250ZXh0KT0wOwotCQlESV9yZWcoY29udGV4dCk9MDsKLQkJYnJlYWs7CisgICAgY2FzZSAweDgzOiAgLyogUmV0dXJuIEN1cnJlbnQgVmlydHVhbCBNYWNoaW5lIElEICovCisgICAgICAgIC8qIFZpcnR1YWwgTWFjaGluZXMgYXJlIHVzdWFsbHkgY3JlYXRlZC9kZXN0cm95ZWQgd2hlbiBXaW5kb3dzIHJ1bnMKKyAgICAgICAgICogRE9TIHByb2dyYW1zLiBTaW5jZSB3ZSBuZXZlciBkbywgd2UgYXJlIGFsd2F5cyBpbiB0aGUgU3lzdGVtIFZNLgorICAgICAgICAgKiBBY2NvcmRpbmcgdG8gUmFsZiBCcm93bidzIEludGVycnVwdCBMaXN0LCBuZXZlciByZXR1cm4gMC4gQnV0IGl0CisgICAgICAgICAqIHNlZW1zIHRvIHdvcmsgb2theSAocmV0dXJuaW5nIDApLCBqdXN0IHRvIGJlIHN1cmUgd2UgcmV0dXJuIDEuCisgICAgICAgICAqLworCUJYX3JlZyhjb250ZXh0KSA9IDE7IC8qIFZNIDEgaXMgcHJvYmFibHkgdGhlIFN5c3RlbSBWTSAqLworCWJyZWFrOworCisgICAgY2FzZSAweDg0OiAgLyogR2V0IGRldmljZSBBUEkgZW50cnkgcG9pbnQgKi8KKyAgICAgICAgYWRkciA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBHZXRNb2R1bGVIYW5kbGUoIldJTlBST0NTIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlhEX0JBU0UgKyBCWF9yZWcoY29udGV4dCkgKTsKKyAgICAgICAgaWYgKCFhZGRyKSAgLyogbm90IHN1cHBvcnRlZCAqLworICAgICAgICB7CisJICAgIGZwcmludGYoIHN0ZGVyciwiQXBwbGljYXRpb24gYXR0ZW1wdGVkIHRvIGFjY2VzcyBWeEQgJTA0eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIEJYX3JlZyhjb250ZXh0KSApOworCSAgICBmcHJpbnRmKCBzdGRlcnIsIlRoaXMgZGV2aWNlIGlzIG5vdCBrbm93biB0byBXaW5lLiIpOworCSAgICBmcHJpbnRmKCBzdGRlcnIsIkV4cGVjdCBhIGZhaWx1cmUgbm93XG4iKTsKKyAgICAgICAgfQorCUVTX3JlZyhjb250ZXh0KSA9IFNFTEVDVE9ST0YoYWRkcik7CisJRElfcmVnKGNvbnRleHQpID0gT0ZGU0VUT0YoYWRkcik7CisJYnJlYWs7CiAKICAgICBjYXNlIDB4ODY6ICAvKiBEUE1JIGRldGVjdCBtb2RlICovCiAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IDA7ICAvKiBSdW5uaW5nIHVuZGVyIERQTUkgKi8KICAgICAgICAgYnJlYWs7CiAKKyAgICAvKiBGSVhNRTogaXMgdGhpcyByaWdodD8gIFNwZWNzIHNheSB0aGF0IHRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGFibGUKKyAgICAgICBpbiByZWFsICh2ODYpIG1vZGUgd2hpY2ggd2UgbmV2ZXIgZW50ZXIuICAqLwogICAgIGNhc2UgMHg4NzogIC8qIERQTUkgaW5zdGFsbGF0aW9uIGNoZWNrICovCiAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IDB4MDAwMDsgLyogRFBNSSBJbnN0YWxsZWQgKi8KICAgICAgICAgQlhfcmVnKGNvbnRleHQpID0gMHgwMDAxOyAvKiAzMmJpdHMgYXZhaWxhYmxlICovCi0gICAgICAgIENMX3JlZyhjb250ZXh0KSA9IDB4MDM7ICAgLyogcHJvY2Vzc29yIDM4NiAqLworICAgICAgICBDTF9yZWcoY29udGV4dCkgPSBydW50aW1lX2NwdSgpOwogICAgICAgICBEWF9yZWcoY29udGV4dCkgPSAweDAwNWE7IC8qIERQTUkgbWFqb3IvbWlub3IgMC45MCAqLwogICAgICAgICBTSV9yZWcoY29udGV4dCkgPSAwOyAgICAgIC8qICMgb2YgcGFyYS4gb2YgRE9TIGV4dGVuZGVkIHByaXZhdGUgZGF0YSAqLwogICAgICAgICBFU19yZWcoY29udGV4dCkgPSAwOyAgICAgIC8qIEVTOkRJIGlzIERQTUkgc3dpdGNoIGVudHJ5IHBvaW50ICovCiAgICAgICAgIERJX3JlZyhjb250ZXh0KSA9IDA7CiAgICAgICAgIGJyZWFrOwogCisgICAgY2FzZSAweDhhOiAgLyogRFBNSSBnZXQgdmVuZG9yLXNwZWNpZmljIEFQSSBlbnRyeSBwb2ludC4gKi8KKwkvKiBUaGUgMS4wIHNwZWNzIHNheSB0aGlzIHNob3VsZCB3b3JrIHdpdGggYWxsIDAuOSBob3N0cy4gICovCisJYnJlYWs7CisKICAgICBkZWZhdWx0OgogICAgICAgICBJTlRfQkFSRiggY29udGV4dCwgMHgyZiApOwogICAgIH0KIH0KLQotCmRpZmYgLS1naXQgYS9taXNjZW11L2ludDRiLmMgYi9taXNjZW11L2ludDRiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjZjBiNgotLS0gL2Rldi9udWxsCisrKyBiL21pc2NlbXUvaW50NGIuYwpAQCAtMCwwICsxLDM0IEBACisvKgorICogSW50IDRCIGhhbmRsaW5nCisgKgorICovCisKKyNpbmNsdWRlICJ3aW5lLmgiCisjaW5jbHVkZSAibWlzY2VtdS5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisvKiAjZGVmaW5lIERFQlVHX0lOVCAqLworI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAicmVnaXN0ZXJzLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgSU5UX0ludDRiSGFuZGxlcgorICoKKyAqLwordm9pZCBJTlRfSW50NGJIYW5kbGVyKCBzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgY29udGV4dCApCit7CisKKyAgc3dpdGNoKEFIX3JlZygmY29udGV4dCkpCisgICB7CisJY2FzZSAweDgxOiAvKiBWaXJ0dWFsIERNQSBTcGVjIChJQk0gU0NTSSBpbnRlcmZhY2UpICovICAgCisgICAgICAgICAgICAgaWYoQUxfcmVnKCZjb250ZXh0KSAhPSAweDAyKSAvKiBpZiBub3QgaW5zdGFsbCBjaGVjayAqLworCQl7CisJCSBTRVRfQ0ZMQUcoJmNvbnRleHQpOwkJIAorCQkgQUxfcmVnKCZjb250ZXh0KSA9IDB4MGY7IC8qIGZ1bmN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCAqLworCQl9CisJICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKwkgICAgIElOVF9CQVJGKCZjb250ZXh0LCAweDRiKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL21pc2NlbXUvaW50NWMuYyBiL21pc2NlbXUvaW50NWMuYwppbmRleCBmMjc5NGI3Li4yODU0MGYyIDEwMDY0NAotLS0gYS9taXNjZW11L2ludDVjLmMKKysrIGIvbWlzY2VtdS9pbnQ1Yy5jCkBAIC0xLDkgKzEsMTAgQEAKIC8qCiAgKiBOZXRCSU9TIGludGVycnVwdCBoYW5kbGluZwogICoKLSAqIENvcHlyaWdodCAxOTk1IEFsZXhhbmRyZSBKdWxsaWFyZAorICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkLCBBbGV4IEtvcm9ia2EKICAqLwogCisjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAid2luZS5oIgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgpAQCAtMTUsOSArMTYsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE5ldEJJT1NDYWxsICAoS0VSTkVMLjEwMykKICAqCi0gKiBBbHNvIGhhbmRsZXIgZm9yIGludGVycnVwdCA1Yy4KKyAqIEFsc28gaGFuZGxlciBmb3IgaW50ZXJydXB0IDVjLiAKICAqLwogdm9pZCBOZXRCSU9TQ2FsbCggc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0IGNvbnRleHQgKQogewotICAgIElOVF9CQVJGKCAmY29udGV4dCwgMHg1YyApOworICBCWVRFKiBwdHI7CisKKyAgcHRyID0gKEJZVEUqKSBQVFJfU0VHX09GRl9UT19MSU4oRVNfcmVnKCZjb250ZXh0KSxCWF9yZWcoJmNvbnRleHQpKTsKKworICBmcHJpbnRmKHN0ZG5pbXAsIk5ldEJJT1NDYWxsOiBjb21tYW5kIGNvZGUgJTAyeCAoaWdub3JlZClcbiIsKnB0cik7CisgIAorICBBTF9yZWcoJmNvbnRleHQpID0gKihwdHIrMHgwMSkgPSAweEZCOyAvKiBOZXRCSU9TIGVtdWxhdG9yIG5vdCBmb3VuZCAqLwogfQorCmRpZmYgLS1naXQgYS9taXNjZW11L3Z4ZC5jIGIvbWlzY2VtdS92eGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTcxMmY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzY2VtdS92eGQuYwpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIFZ4RCBlbXVsYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgMTk5NSBBbmFuZCBLdW1yaWEKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAibXNkb3MuaCIKKyNpbmNsdWRlICJtaXNjZW11LmgiCisjaW5jbHVkZSAid2luZS5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisvKiAjZGVmaW5lIERFQlVHX1ZYRCAqLworI2luY2x1ZGUgImRlYnVnLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVlhEX1BhZ2VGaWxlCisgKi8KK3ZvaWQgVlhEX1BhZ2VGaWxlKCBzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgY29udGV4dCApCit7CisgICAgLyogdGFrZW4gZnJvbSBSYWxmIEJyb3duJ3MgSW50ZXJydXB0IExpc3QgKi8KKworICAgIGRwcmludGZfdnhkKHN0ZGRlYiwiVnhEIFBhZ2VGaWxlIGNhbGxlZCAuLi5cbiIpOworCisgICAgc3dpdGNoKEFYX3JlZygmY29udGV4dCkpIAorICAgIHsKKyAgICBjYXNlIDB4MDA6IC8qIGdldCB2ZXJzaW9uLCBpcyB0aGlzIHdpbmRvd3MgdmVyc2lvbj8gKi8KKwlkcHJpbnRmX3Z4ZChzdGRkZWIsIlZ4RCBQYWdlRmlsZTogcmV0dXJuaW5nIHZlcnNpb25cbiIpOworICAgICAgICBBWF9yZWcoJmNvbnRleHQpID0gKFdJTlZFUlNJT04gPj4gOCkgfCAoKFdJTlZFUlNJT04gPDwgOCkgJiAweGZmMDApOworCVJFU0VUX0NGTEFHKCZjb250ZXh0KTsKKwlicmVhazsKKworICAgIGNhc2UgMHgwMTogLyogZ2V0IHN3YXAgZmlsZSBpbmZvICovCisJZHByaW50Zl92eGQoc3RkZGViLCJWeEQgUGFnZUZpbGU6IHJldHVybmluZyBzd2FwIGZpbGUgaW5mb1xuIik7CisJQVhfcmVnKCZjb250ZXh0KSA9IDB4MDA7IC8qIHBhZ2luZyBkaXNhYmxlZCAqLworCUVDWF9yZWcoJmNvbnRleHQpID0gMDsgICAvKiBtYXhpbXVtIHNpemUgb2YgcGFnaW5nIGZpbGUgKi8JCisJLyogRklYTUU6IGRvIEkgdG91Y2ggRFM6U0kgb3IgRFM6REk/ICovCisJUkVTRVRfQ0ZMQUcoJmNvbnRleHQpOworCWJyZWFrOworCisgICAgY2FzZSAweDAyOiAvKiBkZWxldGUgcGVybWFuZW50IHN3YXAgb24gZXhpdCAqLworCWRwcmludGZfdnhkKHN0ZGRlYiwiVnhEIFBhZ2VGaWxlOiBzdXBwb3NlZCB0byBkZWxldGUgc3dhcFxuIik7CisJUkVTRVRfQ0ZMQUcoJmNvbnRleHQpOworCWJyZWFrOworCisgICAgY2FzZSAweDAzOiAvKiBjdXJyZW50IHRlbXBvcmFyeSBzd2FwIGZpbGUgc2l6ZSAqLworCWRwcmludGZfdnhkKHN0ZGRlYiwiVnhEIFBhZ2VGaWxlOiB3aGF0IGlzIGN1cnJlbnQgdGVtcC4gc3dhcCBzaXplXG4iKTsKKwlSRVNFVF9DRkxBRygmY29udGV4dCk7CisJYnJlYWs7CisKKyAgICBjYXNlIDB4MDQ6IC8qIHJlYWQgb3Igd3JpdGU/PyBJTlRFUlJVUC5EICovCisgICAgY2FzZSAweDA1OiAvKiBjYW5jZWw/PyBJTlRFUlJVUC5EICovCisgICAgY2FzZSAweDA2OiAvKiB0ZXN0IEkvTyB2YWxpZCBJTlRFUlJVUC5EICovCisgICAgZGVmYXVsdDoKKwlJTlRfQkFSRiggJmNvbnRleHQsIDB4MmYpOworCWJyZWFrOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBWWERfU2hlbGwKKyAqLwordm9pZCBWWERfU2hlbGwoIHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCBjb250ZXh0ICkKK3sKKyAgICBkcHJpbnRmX3Z4ZChzdGRkZWIsIlZ4RCBTaGVsbCBjYWxsZWQgLi4uXG4iKTsKKworICAgIHN3aXRjaCAoRFhfcmVnKCZjb250ZXh0KSkgLyogUmFsZiBCcm93biBzYXlzIEVEWCwgYnV0IEkgdXNlIERYIGluc3RlYWQgKi8KKyAgICB7CisgICAgY2FzZSAweDAwMDA6CisJZHByaW50Zl92eGQoc3RkZGViLCJWeEQgU2hlbGw6IHJldHVybmluZyB2ZXJzaW9uXG4iKTsKKyAgICAgICAgQVhfcmVnKCZjb250ZXh0KSA9IChXSU5WRVJTSU9OID4+IDgpIHwgKChXSU5WRVJTSU9OIDw8IDgpICYgMHhmZjAwKTsKKwlFQlhfcmVnKCZjb250ZXh0KSA9IDE7IC8qIHN5c3RlbSBWTSBIYW5kbGUgKi8KKwlicmVhazsKKworICAgIGNhc2UgMHgwMDAxOgorICAgIGNhc2UgMHgwMDAyOgorICAgIGNhc2UgMHgwMDAzOgorICAgIGNhc2UgMHgwMDA0OgorICAgIGNhc2UgMHgwMDA1OgorCWRwcmludGZfdnhkKHN0ZGRlYiwiVnhEIFNoZWxsOiBFRFggPSAlMDhseFxuIixFRFhfcmVnKCZjb250ZXh0KSk7CisJSU5UX0JBUkYoICZjb250ZXh0LCAweDJmKTsKKwlicmVhazsKKworICAgIGNhc2UgMHgwMDA2OiAvKiBTSEVMTF9HZXRfVk1fU3RhdGUgKi8KKwlkcHJpbnRmX3Z4ZChzdGRkZWIsIlZ4RCBTaGVsbDogcmV0dXJuaW5nIFZNIHN0YXRlXG4iKTsKKwkvKiBBY3R1YWxseSB3ZSBkb24ndCwgbm90IHlldC4gV2UgaGF2ZSB0byByZXR1cm4gYSBzdHJ1Y3R1cmUKKyAgICAgICAgICogYW5kIEkgYW0gbm90IHRvIHN1cmUgaG93IHRvIHNldCBpdCB1cCBhbmQgcmV0dXJuIGl0IHlldCwKKyAgICAgICAgICogc28gZm9yIG5vdyBsZXQncyBkbyBub3RoaW5nLiBJIGNhbiAoaG9wZWZ1bGx5KSBnZXQgdGhpcworICAgICAgICAgKiBieSB0aGUgbmV4dCByZWxlYXNlCisgICAgICAgICAqLworCS8qIFJFU0VUX0NGTEFHKCZjb250ZXh0KTsgKi8KKwlicmVhazsKKworICAgIGNhc2UgMHgwMDA3OgorICAgIGNhc2UgMHgwMDA4OgorICAgIGNhc2UgMHgwMDA5OgorICAgIGNhc2UgMHgwMDBBOgorICAgIGNhc2UgMHgwMDBCOgorICAgIGNhc2UgMHgwMDBDOgorICAgIGNhc2UgMHgwMDBEOgorICAgIGNhc2UgMHgwMDBFOgorICAgIGNhc2UgMHgwMDBGOgorICAgIGNhc2UgMHgwMDEwOgorICAgIGNhc2UgMHgwMDExOgorICAgIGNhc2UgMHgwMDEyOgorICAgIGNhc2UgMHgwMDEzOgorICAgIGNhc2UgMHgwMDE0OgorICAgIGNhc2UgMHgwMDE1OgorICAgIGNhc2UgMHgwMDE2OgorICAgIGRlZmF1bHQ6CisgCWRwcmludGZfdnhkKHN0ZGRlYiwiVnhEIFNoZWxsOiBFRFggPSAlMDhseFxuIixFRFhfcmVnKCZjb250ZXh0KSk7IAorCUlOVF9CQVJGKCAmY29udGV4dCwgMHgyZik7CisJYnJlYWs7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFZYRF9Db21tCisgKi8KK3ZvaWQgVlhEX0NvbW0oIHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCBjb250ZXh0ICkKK3sKKyAgICBkcHJpbnRmX3Z4ZChzdGRkZWIsIlZ4RCBDb21tIGNhbGxlZCAuLi5cbiIpOworCisgICAgc3dpdGNoIChBWF9yZWcoJmNvbnRleHQpKQorICAgIHsKKyAgICBjYXNlIDB4MDAwMDogLyogZ2V0IHZlcnNpb24gKi8KKwlkcHJpbnRmX3Z4ZChzdGRkZWIsIlZ4RCBDb21tOiByZXR1cm5pbmcgdmVyc2lvblxuIik7CisgICAgICAgIEFYX3JlZygmY29udGV4dCkgPSAoV0lOVkVSU0lPTiA+PiA4KSB8ICgoV0lOVkVSU0lPTiA8PCA4KSAmIDB4ZmYwMCk7CisJUkVTRVRfQ0ZMQUcoJmNvbnRleHQpOworCWJyZWFrOworCisgICAgY2FzZSAweDAwMDE6IC8qIHNldCBwb3J0IGdsb2JhbCAqLworICAgIGNhc2UgMHgwMDAyOiAvKiBnZXQgZm9jdXMgKi8KKyAgICBjYXNlIDB4MDAwMzogLyogdmlydHVhbGlzZSBwb3J0ICovCisgICAgZGVmYXVsdDoKKyAgICAgICAgSU5UX0JBUkYoICZjb250ZXh0LCAweDJmKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL0ltYWtlZmlsZSBiL211bHRpbWVkaWEvSW1ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWVhOTRmLi4wMDAwMDAwCi0tLSBhL211bHRpbWVkaWEvSW1ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI2luY2x1ZGUgIi4uL1dpbmUudG1wbCIKLQotTU9EVUxFID0gbXVsdGltZWRpYQotCi1TUkNTID0gXAotCWF1ZGlvLmMgXAotCWpveXN0aWNrLmMgXAotCW1jaWFuaW0uYyBcCi0JbWNpY2RhLmMgXAotCW1jaXN0cmluZy5jIFwKLQltaWRpLmMgXAotCW1tYXV4LmMgXAotCW1tc3lzdGVtLmMgXAotCXRpbWUuYwotCi1PQkpTID0gJChTUkNTOi5jPS5vKQotCi1XaW5lUmVsb2NhdGFibGVUYXJnZXQoJChNT0RVTEUpLCwkKE9CSlMpKQotRGVwZW5kVGFyZ2V0KCkKLQotaW5jbHVkZXM6OgotCi1pbnN0YWxsOjoKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWNpc3RyaW5nLmMgYi9tdWx0aW1lZGlhL21jaXN0cmluZy5jCmluZGV4IGY4NjA1NjMuLjc5ZmU2NjkgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbWNpc3RyaW5nLmMKKysrIGIvbXVsdGltZWRpYS9tY2lzdHJpbmcuYwpAQCAtNzUzLDIxICs3NTMsMjEgQEAKIAkJCX0KIAogCQkJLyogPGtleXdvcmQ+IDxpbnRlZ2VyPiAqLwotI2RlZmluZSBXSUkoc3RyLGZsYWcsZWxlbWVudCkgXAorI2RlZmluZSBXSUkoc3RyLGZsYWcsZm10LGVsZW1lbnQpIFwKIAkJCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLHN0cikgJiYgKGkrMTxucm9ma2V5d29yZHMpKSB7XAotCQkJCXNzY2FuZihrZXl3b3Jkc1tpKzFdLCIlZCIsJihVLndhdmVzZXRQYXJhbXMuIGVsZW1lbnQgKSk7XAorCQkJCXNzY2FuZihrZXl3b3Jkc1tpKzFdLGZtdCwmKFUud2F2ZXNldFBhcmFtcy4gZWxlbWVudCApKTtcCiAJCQkJZHdGbGFncyB8PSBmbGFnO1wKIAkJCQlpKz0yO1wKIAkJCQljb250aW51ZTtcCiAJCQl9Ci0JCQlXSUkoImZvcm1hdHRhZyIsTUNJX1dBVkVfU0VUX0ZPUk1BVFRBRyx3Rm9ybWF0VGFnKTsKLQkJCVdJSSgiY2hhbm5lbHMiLE1DSV9XQVZFX1NFVF9DSEFOTkVMUyxuQ2hhbm5lbHMpOwotCQkJV0lJKCJieXRlc3BlcnNlYyIsTUNJX1dBVkVfU0VUX0FWR0JZVEVTUEVSU0VDLG5BdmdCeXRlc1BlclNlYyk7Ci0JCQlXSUkoInNhbXBsZXNwZXJzZWMiLE1DSV9XQVZFX1NFVF9TQU1QTEVTUEVSU0VDLG5TYW1wbGVzUGVyU2VjKTsKLQkJCVdJSSgiYWxpZ25tZW50IixNQ0lfV0FWRV9TRVRfQkxPQ0tBTElHTixuQmxvY2tBbGlnbik7Ci0JCQlXSUkoImJpdHNwZXJzYW1wbGUiLE1DSV9XQVZFX1NFVF9CSVRTUEVSU0FNUExFLHdCaXRzUGVyU2FtcGxlKTsKLQkJCVdJSSgiaW5wdXQiLE1DSV9XQVZFX0lOUFVULHdJbnB1dCk7Ci0JCQlXSUkoIm91dHB1dCIsTUNJX1dBVkVfT1VUUFVULHdPdXRwdXQpOworCQkJV0lJKCJmb3JtYXR0YWciLE1DSV9XQVZFX1NFVF9GT1JNQVRUQUcsVUlGTVQsd0Zvcm1hdFRhZyk7CisJCQlXSUkoImNoYW5uZWxzIixNQ0lfV0FWRV9TRVRfQ0hBTk5FTFMsVUlGTVQsbkNoYW5uZWxzKTsKKwkJCVdJSSgiYnl0ZXNwZXJzZWMiLE1DSV9XQVZFX1NFVF9BVkdCWVRFU1BFUlNFQywiJWx1IixuQXZnQnl0ZXNQZXJTZWMpOworCQkJV0lJKCJzYW1wbGVzcGVyc2VjIixNQ0lfV0FWRV9TRVRfU0FNUExFU1BFUlNFQywiJWx1IixuU2FtcGxlc1BlclNlYyk7CisJCQlXSUkoImFsaWdubWVudCIsTUNJX1dBVkVfU0VUX0JMT0NLQUxJR04sVUlGTVQsbkJsb2NrQWxpZ24pOworCQkJV0lJKCJiaXRzcGVyc2FtcGxlIixNQ0lfV0FWRV9TRVRfQklUU1BFUlNBTVBMRSxVSUZNVCx3Qml0c1BlclNhbXBsZSk7CisJCQlXSUkoImlucHV0IixNQ0lfV0FWRV9JTlBVVCxVSUZNVCx3SW5wdXQpOworCQkJV0lJKCJvdXRwdXQiLE1DSV9XQVZFX09VVFBVVCxVSUZNVCx3T3V0cHV0KTsKICN1bmRlZiBXSUkKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9ERVZUWVBFX1NFUVVFTkNFUjoKQEAgLTkyMSw3ICs5MjEsNyBAQAogc3RhdGljIERXT1JECiBNQ0lTVFJfQ2FwYWJpbGl0eShfTUNJU1RSX1BST1RPXykgewogCU1DSV9HRVRERVZDQVBTX1BBUk1TCWdkY1BhcmFtczsKLQlpbnQJdHlwZSxpLHJlczsKKwlpbnQJdHlwZT0wLGkscmVzOwogCiAJZ2RjUGFyYW1zLmR3Q2FsbGJhY2sgPSAwOwogCWlmICghbnJvZmtleXdvcmRzKQpAQCAtMTMxNyw2ICsxMzE3LDggQEAKIAlyZXR1cm4gcmVzOwogfQogCitEV09SRCBtY2lTeXNJbmZvKERXT1JEIGR3RmxhZ3MsTFBNQ0lfU1lTSU5GT19QQVJNUyBscFBhcm1zKTsKKwogLyogcXVlcnkgTUNJIGRyaXZlciBpdHNlbGYgZm9yIGluZm9ybWF0aW9uCiAgKiBBcmd1bWVudHM6CiAgKgkiaW5zdGFsbG5hbWUiCXJldHVybiBpbnN0YWxsIG5hbWUgb2YgPGRldmljZT4gKHN5c3RlbS5pbmkpCkBAIC0yMDgwLDkgKzIwODIsOSBAQAogCVVJTlQgdVJldHVybkxlbmd0aCwgSFdORCBod25kQ2FsbGJhY2spCiB7CiAJY2hhcgkqY21kLCpkZXYsKmFyZ3MsKiprZXl3b3JkczsKLQlXT1JECXVEZXZUeXAsd0RldklEOworCVdPUkQJdURldlR5cD0wLHdEZXZJRD0wOwogCURXT1JECWR3RmxhZ3M7Ci0JaW50CXJlcyxpLG5yb2ZrZXl3b3JkczsKKwlpbnQJcmVzPTAsaSxucm9ma2V5d29yZHM7CiAKIAlkcHJpbnRmX21jaShzdGRuaW1wLCJtY2lTZW5kU3RyaW5nKCclcycsICVwLCAlZCwgJVgpXG4iLCBscHN0ckNvbW1hbmQsIAogCQlscHN0clJldHVyblN0cmluZywgdVJldHVybkxlbmd0aCwgaHduZENhbGxiYWNrCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21tc3lzdGVtLmMgYi9tdWx0aW1lZGlhL21tc3lzdGVtLmMKaW5kZXggYjJiYzBlMS4uZGIzZTcwNyAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tbXN5c3RlbS5jCisrKyBiL211bHRpbWVkaWEvbW1zeXN0ZW0uYwpAQCAtMTA1MSw4ICsxMDUxLDkgQEAKIFVJTlQgbWlkaU91dENhY2hlUGF0Y2hlcyhITUlESU9VVCBoTWlkaU91dCwKICAgICBVSU5UIHVCYW5rLCBXT1JEIEZBUiogbHB3UGF0Y2hBcnJheSwgVUlOVCB1RmxhZ3MpCiB7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpT3V0Q2FjaGVQYXRjaGVzXG4iKTsKLQlyZXR1cm4gMDsKKyAgICAgICAgLyogbm90IHJlYWxseSBuZWNlc3NhcnkgdG8gc3VwcG9ydCB0aGlzICovCisJZnByaW50ZihzdGRuaW1wLCAibWlkaU91dENhY2hlUGF0Y2hlczogbm90IHN1cHBvcnRlZCB5ZXRcbiIpOworCXJldHVybiBNTVNZU0VSUl9OT1RTVVBQT1JURUQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTA2MSw4ICsxMDYyLDggQEAKIFVJTlQgbWlkaU91dENhY2hlRHJ1bVBhdGNoZXMoSE1JRElPVVQgaE1pZGlPdXQsCiAgICAgVUlOVCB1UGF0Y2gsIFdPUkQgRkFSKiBscHdLZXlBcnJheSwgVUlOVCB1RmxhZ3MpCiB7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpT3V0Q2FjaGVEcnVtUGF0Y2hlc1xuIik7Ci0JcmV0dXJuIDA7CisJZnByaW50ZihzdGRuaW1wLCAibWlkaU91dENhY2hlRHJ1bVBhdGNoZXNpOiBub3Qgc3VwcG9ydGVkIHlldFxuIik7CisJcmV0dXJuIE1NU1lTRVJSX05PVFNVUFBPUlRFRDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL3RpbWUuYyBiL211bHRpbWVkaWEvdGltZS5jCmluZGV4IDAwYmZmYzQuLjUxOTNhYmQgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvdGltZS5jCisrKyBiL211bHRpbWVkaWEvdGltZS5jCkBAIC00NSw3ICs0NSw2IEBACiAgKi8KIFdPUkQgTU1TeXNUaW1lQ2FsbGJhY2soSFdORCBoV25kLCBXT1JEIHdNc2csIElOVCBuSUQsIERXT1JEIGR3VGltZSkKIHsKLSAgICBGQVJQUk9DCWxwRnVuYzsKICAgICBMUFRJTUVSRU5UUlkgbHBUaW1lciA9IGxwVGltZXJMaXN0OwogICAgIG1tU3lzVGltZU1TLnUubXMgKz0gMzM7CiAgICAgbW1TeXNUaW1lU01QVEUudS5zbXB0ZS5mcmFtZSsrOwpAQCAtNTgsMjMgKzU3LDI1IEBACiAJCWRwcmludGZfbW10aW1lKHN0ZGRlYiwgIk1NU3lzVGltZUNhbGxiYWNrIC8vIGxwRnVuYz0lMDhseCB3VGltZXJJRD0lMDRYIGR3VXNlcj0lMDhsWCAhXG4iLAogCQkJbHBUaW1lci0+bHBGdW5jLCBscFRpbWVyLT53VGltZXJJRCwgbHBUaW1lci0+ZHdVc2VyKTsKIAkJZHByaW50Zl9tbXRpbWUoc3RkZGViLCAiTU1TeXNUaW1lQ2FsbGJhY2sgLy8gaEluc3RhbmNlPSUwNFggIVxuIiwgbHBUaW1lci0+aEluc3RhbmNlKTsKLS8qCi0JCWxwRnVuYyA9IE1ha2VQcm9jSW5zdGFuY2UobHBUaW1lci0+aEluc3RhbmNlLCBscFRpbWVyLT5scEZ1bmMpOwotCQlkcHJpbnRmX21tdGltZShzdGRkZWIsICJNTVN5c1RpbWVDYWxsYmFjayAvLyBNYWtlUHJvY0luc3RhbmNlKGxwRnVuYyk9JXAgJXAgIVxuIiwgCi0JCQlscEZ1bmMsIFBUUl9TRUdfVE9fTElOKGxwRnVuYykpOwotKi8KLQkJbHBGdW5jID0gTU9EVUxFX0dldEVudHJ5UG9pbnQoIGxwVGltZXItPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICBNT0RVTEVfR2V0T3JkaW5hbChscFRpbWVyLT5oSW5zdGFuY2UsIlRpbWVyQ2FsbEJhY2siICkpOworCisvKiBUaGlzIGlzIHdyb25nIChscEZ1bmMgaXMgTlVMTCBhbGwgdGhlIHRpbWUpCisKKyAgIAkgICAgICAgIGxwRnVuYyA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBscFRpbWVyLT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX0dldE9yZGluYWwobHBUaW1lci0+aEluc3RhbmNlLCJUaW1lckNhbGxCYWNrIiApKTsKIAkJZHByaW50Zl9tbXRpbWUoc3RkZGViLCAiTU1TeXNUaW1lQ2FsbGJhY2sgLy8gbHBGdW5jPSUwOGx4ICFcbiIsIGxwRnVuYyk7Ci0JCQorKi8KKworCisvKiAgICAgICAgLSBUaW1lUHJvYyBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBoZXJlIGlzIHNvbWV0aGluZyBzdHJhbmdlLCB1bmRlciBXaW5kb3dzIDMuMXggaXQgaXMgY2FsbGVkIAorICogICAgICAgICAgZHVyaW5nIGludGVycnVwdCB0aW1lLCAgaXMgYWxsb3dlZCB0byBleGVjdXRlIHZlcnkgbGltaXRlZCBudW1iZXIgb2YgQVBJIGNhbGxzIChsaWtlCisgKgkgICAgUG9zdE1lc3NhZ2UpLCBhbmQgbXVzdCByZXNpZGUgaW4gRExMICh0aGVyZWZvcmUgdXNlcyBzdGFjayBvZiBhY3RpdmUgYXBwbGljYXRpb24pLiBTbyBJIAorICogICAgICAgICAgZ3Vlc3MgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB2aWEgU2V0VGltZXIgaGFzIHRvIGJlIGltcHJvdmVkIHVwb24uCQkKKyAqLworCiAJCUNhbGxUbzE2X3dvcmRfd3dsbGwobHBUaW1lci0+bHBGdW5jLAogCQkJbHBUaW1lci0+aEluc3RhbmNlLCBscFRpbWVyLT53VGltZXJJRCwgCiAJCQkwLCBscFRpbWVyLT5kd1VzZXIsIDAsIDApOwogCi0vKgotCQlDYWxsVGltZUZ1bmNQcm9jKGxwVGltZXItPmxwRnVuYywgbHBUaW1lci0+d1RpbWVySUQsIAotCQkJCTAsIGxwVGltZXItPmR3VXNlciwgMCwgMCk7Ci0qLwogCQlkcHJpbnRmX21tdGltZShzdGRkZWIsICJNTVN5c1RpbWVDYWxsYmFjayAvLyBhZnRlciBDYWxsQmFjazE2ICFcbiIpOwogCQlmZmx1c2goc3Rkb3V0KTsKIAkgICAgfQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9JbWFrZWZpbGUgYi9vYmplY3RzL0ltYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhNGY4Mi4uMDAwMDAwMAotLS0gYS9vYmplY3RzL0ltYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSNpbmNsdWRlICIuLi9XaW5lLnRtcGwiCi0KLU1PRFVMRSA9IG9iamVjdHMKLQotU1JDUyA9IFwKLQliaXRibHQuYyBcCi0JYml0bWFwLmMgXAotCWJydXNoLmMgXAotCWNsaXBwaW5nLmMgXAotCWNvbG9yLmMgXAotCWRjLmMgXAotCWRjdmFsdWVzLmMgXAotCWRpYi5jIFwKLQlmb250LmMgXAotCWdkaW9iai5jIFwKLQlsaW5lZGRhLmMgXAotCW1ldGFmaWxlLmMgXAotCW9lbWJpdG1hcC5jIFwKLQlwYWxldHRlLmMgXAotCXBlbi5jIFwKLQlyZWdpb24uYyBcCi0JdGV4dC5jCi0KLU9CSlMgPSAkKFNSQ1M6LmM9Lm8pCi0KLVdpbmVSZWxvY2F0YWJsZVRhcmdldCgkKE1PRFVMRSksLCQoT0JKUykpCi1EZXBlbmRUYXJnZXQoKQotCi1pbmNsdWRlczo6Ci0KLWluc3RhbGw6OgpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9NYWtlZmlsZS5pbiBiL29iamVjdHMvTWFrZWZpbGUuaW4KaW5kZXggZjg4YmIyMS4uZWIzMTE2MiAxMDA2NDQKLS0tIGEvb2JqZWN0cy9NYWtlZmlsZS5pbgorKysgYi9vYmplY3RzL01ha2VmaWxlLmluCkBAIC03LDYgKzcsNyBAQAogCWJydXNoLmMgXAogCWNsaXBwaW5nLmMgXAogCWNvbG9yLmMgXAorCWN1cnNvcmljb24uYyBcCiAJZGMuYyBcCiAJZGN2YWx1ZXMuYyBcCiAJZGliLmMgXApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9iaXRibHQuYyBiL29iamVjdHMvYml0Ymx0LmMKaW5kZXggYWI4ZGFmOS4uYWU3ZGQzMCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9iaXRibHQuYworKysgYi9vYmplY3RzL2JpdGJsdC5jCkBAIC0xMjM2LDcgKzEyMzYsNyBAQAogCXJldHVybiBUUlVFOwogICAgIH0KIAotICAgIGRwcmludGZfYml0Ymx0KHN0ZGRlYiwgIlBhdEJsdDogJWQgJWQsJWQgJWR4JWQgJTA2bHhcbiIsCisgICAgZHByaW50Zl9iaXRibHQoc3RkZGViLCAiUGF0Qmx0OiAiTlBGTVQiICVkLCVkICVkeCVkICUwNmx4XG4iLAogCSAgICBoZGMsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwgcm9wICk7CiAKICAgICByZXR1cm4gQ2FsbFRvMzJfTGFyZ2VTdGFjayggKGludCgqKSgpKUJJVEJMVF9JbnRlcm5hbFN0cmV0Y2hCbHQsIDExLApAQCAtMTI2Myw3ICsxMjYzLDcgQEAKICAgICBkY1NyYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGNTcmMsIERDX01BR0lDICk7CiAKICAgICBkcHJpbnRmX2JpdGJsdChzdGRkZWIsCi0gICAgICAgICAgICAgICAgIkJpdEJsdDogJTA0eCAlZCwlZCAlZCBicHAgLT4gJTA0eCAlZCwlZCAlZHglZHglZCByb3A9JTA2bHhcbiIsCisgICAgICAgICAgICAgICAgIkJpdEJsdDogIk5QRk1UIiAlZCwlZCAlZCBicHAgLT4gIk5QRk1UIiAlZCwlZCAlZHglZHglZCByb3A9JTA2bHhcbiIsCiAgICAgICAgICAgICAgICAgaGRjU3JjLCB4U3JjLCB5U3JjLCBkY1NyYyA/IGRjU3JjLT53LmJpdHNQZXJQaXhlbCA6IDAsCiAgICAgICAgICAgICAgICAgaGRjRHN0LCB4RHN0LCB5RHN0LCB3aWR0aCwgaGVpZ2h0LCBkY0RzdC0+dy5iaXRzUGVyUGl4ZWwsIHJvcCk7CiAKQEAgLTEyOTMsNyArMTI5Myw3IEBACiAKICAgICBkY1NyYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGNTcmMsIERDX01BR0lDICk7CiAgICAgZHByaW50Zl9iaXRibHQoc3RkZGViLAotICAgICAgICAgICJTdHJldGNoQmx0OiAlMDR4ICVkLCVkICVkeCVkeCVkIC0+ICUwNHggJWQsJWQgJWR4JWR4JWQgcm9wPSUwNmx4XG4iLAorICAgICAgICAgICJTdHJldGNoQmx0OiAiTlBGTVQiICVkLCVkICVkeCVkeCVkIC0+ICJOUEZNVCIgJWQsJWQgJWR4JWR4JWQgcm9wPSUwNmx4XG4iLAogICAgICAgICAgICAgICAgICAgIGhkY1NyYywgeFNyYywgeVNyYywgd2lkdGhTcmMsIGhlaWdodFNyYywKICAgICAgICAgICAgICAgICAgICBkY1NyYyA/IGRjU3JjLT53LmJpdHNQZXJQaXhlbCA6IDAsIGhkY0RzdCwgeERzdCwgeURzdCwKICAgICAgICAgICAgICAgICAgICB3aWR0aERzdCwgaGVpZ2h0RHN0LCBkY0RzdC0+dy5iaXRzUGVyUGl4ZWwsIHJvcCApOwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9iaXRtYXAuYyBiL29iamVjdHMvYml0bWFwLmMKaW5kZXggMTc5ZDE2ZC4uZGRlNGQ5NCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9iaXRtYXAuYworKysgYi9vYmplY3RzL2JpdG1hcC5jCkBAIC04LDExICs4LDkgQEAKICNpbmNsdWRlIDxYMTEvWGxpYi5oPgogI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgogI2luY2x1ZGUgImdkaS5oIgotI2luY2x1ZGUgImFyY2guaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgogI2luY2x1ZGUgImRjLmgiCiAjaW5jbHVkZSAiYml0bWFwLmgiCi0jaW5jbHVkZSAicmVzb3VyY2UuaCIgIC8qIGZvciBDb252ZXJ0Q29yZS9JbmZvQml0bWFwICovCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKIC8qICNkZWZpbmUgREVCVUdfR0RJICAgICovCiAvKiAjZGVmaW5lIERFQlVHX0JJVE1BUCAqLwpAQCAtMTI2LDcgKzEyNCw3IEBACiBIQklUTUFQIENyZWF0ZUNvbXBhdGlibGVCaXRtYXAoIEhEQyBoZGMsIHNob3J0IHdpZHRoLCBzaG9ydCBoZWlnaHQgKQogewogICAgIERDICogZGM7Ci0gICAgZHByaW50Zl9nZGkoc3RkZGViLCAiQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcDogJWQgJWR4JWRcbiIsIAorICAgIGRwcmludGZfZ2RpKHN0ZGRlYiwgIkNyZWF0ZUNvbXBhdGlibGVCaXRtYXA6ICJOUEZNVCIgJWR4JWRcbiIsIAogCQloZGMsIHdpZHRoLCBoZWlnaHQgKTsKICAgICBpZiAoIShkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICkpKSByZXR1cm4gMDsKICAgICByZXR1cm4gQ3JlYXRlQml0bWFwKCB3aWR0aCwgaGVpZ2h0LCAxLCBkYy0+dy5iaXRzUGVyUGl4ZWwsIE5VTEwgKTsKQEAgLTIxMywxNyArMjExLDE3IEBACiAgICAgSERDIGhkYzsKICAgICBIUlNSQyBoUnNyYzsKICAgICBIR0xPQkFMIGhhbmRsZTsKLSAgICBpbnQgc2l6ZTsKLSAgICBsb25nICpscDsKKyAgICBCSVRNQVBJTkZPICppbmZvOwogCiAgICAgaWYgKEhJV09SRChuYW1lKSkKICAgICB7CiAgICAgICAgIGNoYXIgKnN0ciA9IChjaGFyICopUFRSX1NFR19UT19MSU4oIG5hbWUgKTsKLSAgICAgICAgZHByaW50Zl9iaXRtYXAoIHN0ZGRlYiwgIkxvYWRCaXRtYXAoJTA0eCwnJXMnKVxuIiwgaW5zdGFuY2UsIHN0ciApOwotICAgICAgICBpZiAoc3RyWzBdID09ICcjJykgbmFtZSA9IChTRUdQVFIpYXRvaSggc3RyICsgMSApOworICAgICAgICBkcHJpbnRmX2JpdG1hcCggc3RkZGViLCAiTG9hZEJpdG1hcCgiTlBGTVQiLCclcycpXG4iLCBpbnN0YW5jZSwgc3RyICk7CisgICAgICAgIGlmIChzdHJbMF0gPT0gJyMnKSBuYW1lID0gKFNFR1BUUikoV09SRClhdG9pKCBzdHIgKyAxICk7CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgZHByaW50Zl9iaXRtYXAoc3RkZGViLCJMb2FkQml0bWFwKCUwNHgsJTA0eClcbiIsaW5zdGFuY2UsTE9XT1JEKG5hbWUpKTsKKyAgICAgICAgZHByaW50Zl9iaXRtYXAoIHN0ZGRlYiwgIkxvYWRCaXRtYXAoIk5QRk1UIiwlMDR4KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLCBMT1dPUkQobmFtZSkgKTsKIAogICAgIGlmICghaW5zdGFuY2UpICAvKiBPRU0gYml0bWFwICovCiAgICAgewpAQCAtMjM0LDE0ICsyMzIsMTIgQEAKICAgICBpZiAoIShoUnNyYyA9IEZpbmRSZXNvdXJjZSggaW5zdGFuY2UsIG5hbWUsIFJUX0JJVE1BUCApKSkgcmV0dXJuIDA7CiAgICAgaWYgKCEoaGFuZGxlID0gTG9hZFJlc291cmNlKCBpbnN0YW5jZSwgaFJzcmMgKSkpIHJldHVybiAwOwogCi0gICAgbHAgPSAobG9uZyAqKUxvY2tSZXNvdXJjZSggaGFuZGxlICk7Ci0gICAgc2l6ZSA9IENPTlZfTE9ORygqbHApOworICAgIGluZm8gPSAoQklUTUFQSU5GTyAqKUxvY2tSZXNvdXJjZSggaGFuZGxlICk7CiAgICAgaWYgKChoZGMgPSBHZXREQygwKSkgIT0gMCkKICAgICB7Ci0gICAgICAgIGlmIChzaXplID09IHNpemVvZihCSVRNQVBDT1JFSEVBREVSKSkKLSAgICAgICAgICAgIGhiaXRtYXAgPSBDb252ZXJ0Q29yZUJpdG1hcCggaGRjLCAoQklUTUFQQ09SRUhFQURFUiAqKSBscCApOwotICAgICAgICBlbHNlIGlmIChzaXplID09IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSkKLSAgICAgICAgICAgIGhiaXRtYXAgPSBDb252ZXJ0SW5mb0JpdG1hcCggaGRjLCAoQklUTUFQSU5GTyAqKSBscCApOworICAgICAgICBjaGFyICpiaXRzID0gKGNoYXIgKilpbmZvICsgRElCX0JpdG1hcEluZm9TaXplKCBpbmZvLCBESUJfUkdCX0NPTE9SUyApOworICAgICAgICBoYml0bWFwID0gQ3JlYXRlRElCaXRtYXAoIGhkYywgJmluZm8tPmJtaUhlYWRlciwgQ0JNX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cywgaW5mbywgRElCX1JHQl9DT0xPUlMgKTsKICAgICAgICAgUmVsZWFzZURDKCAwLCBoZGMgKTsKICAgICB9CiAgICAgRnJlZVJlc291cmNlKCBoYW5kbGUgKTsKQEAgLTMwNiw3ICszMDIsNyBAQAogICovCiBIQklUTUFQIENyZWF0ZURpc2NhcmRhYmxlQml0bWFwKEhEQyBoZGMsIHNob3J0IHdpZHRoLCBzaG9ydCBoZWlnaHQpCiB7Ci0gICAgZHByaW50Zl9iaXRtYXAoc3RkZGViLCJDcmVhdGVEaXNjYXJkYWJsZUJpdG1hcCglMDRYLCAlZCwgJWQpOyAiCisgICAgZHByaW50Zl9iaXRtYXAoc3RkZGViLCJDcmVhdGVEaXNjYXJkYWJsZUJpdG1hcCgiTlBGTVQiLCAlZCwgJWQpOyAiCiAJICAgIi8vIGNhbGwgQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCgpIGZvciBub3chXG4iLAogCSAgIGhkYywgd2lkdGgsIGhlaWdodCk7CiAgICAgcmV0dXJuIENyZWF0ZUNvbXBhdGlibGVCaXRtYXAoaGRjLCB3aWR0aCwgaGVpZ2h0KTsKZGlmZiAtLWdpdCBhL29iamVjdHMvYnJ1c2guYyBiL29iamVjdHMvYnJ1c2guYwppbmRleCBkZTY0Mjc0Li45ODI5MjBhIDEwMDY0NAotLS0gYS9vYmplY3RzL2JydXNoLmMKKysrIGIvb2JqZWN0cy9icnVzaC5jCkBAIC0xNzEsMTQgKzE3MSwxOCBAQAogICAgIExPR0JSVVNIIGxvZ2JydXNoID0geyBCU19QQVRURVJOLCAwLCAwIH07CiAgICAgQklUTUFQT0JKICpibXAsICpuZXdibXA7CiAKLSAgICBkcHJpbnRmX2dkaShzdGRkZWIsICJDcmVhdGVQYXR0ZXJuQnJ1c2g6ICVkXG4iLCBoYml0bWFwICk7CisgICAgZHByaW50Zl9nZGkoc3RkZGViLCAiQ3JlYXRlUGF0dGVybkJydXNoOiAiTlBGTVQiXG4iLCBoYml0bWFwICk7CiAKICAgICAgIC8qIE1ha2UgYSBjb3B5IG9mIHRoZSBiaXRtYXAgKi8KIAogICAgIGlmICghKGJtcCA9IChCSVRNQVBPQkogKikgR0RJX0dldE9ialB0ciggaGJpdG1hcCwgQklUTUFQX01BR0lDICkpKQogCXJldHVybiAwOwotICAgIGxvZ2JydXNoLmxiSGF0Y2ggPSBDcmVhdGVCaXRtYXBJbmRpcmVjdCggJmJtcC0+Yml0bWFwICk7Ci0gICAgbmV3Ym1wID0gKEJJVE1BUE9CSiAqKSBHRElfR2V0T2JqUHRyKCBsb2dicnVzaC5sYkhhdGNoLCBCSVRNQVBfTUFHSUMgKTsKKyNpZmRlZiBXSU5FTElCMzIKKyAgICBsb2dicnVzaC5sYkhhdGNoID0gKExPTkcpQ3JlYXRlQml0bWFwSW5kaXJlY3QoICZibXAtPmJpdG1hcCApOworI2Vsc2UKKyAgICBsb2dicnVzaC5sYkhhdGNoID0gKElOVClDcmVhdGVCaXRtYXBJbmRpcmVjdCggJmJtcC0+Yml0bWFwICk7CisjZW5kaWYKKyAgICBuZXdibXAgPSAoQklUTUFQT0JKICopIEdESV9HZXRPYmpQdHIoIChIQU5ETEUpbG9nYnJ1c2gubGJIYXRjaCwgQklUTUFQX01BR0lDICk7CiAgICAgaWYgKCFuZXdibXApIHJldHVybiAwOwogICAgIFhDb3B5QXJlYSggZGlzcGxheSwgYm1wLT5waXhtYXAsIG5ld2JtcC0+cGl4bWFwLCBCSVRNQVBfR0MoYm1wKSwKIAkgICAgICAgMCwgMCwgYm1wLT5iaXRtYXAuYm1XaWR0aCwgYm1wLT5iaXRtYXAuYm1IZWlnaHQsIDAsIDAgKTsKQEAgLTE5NSw3ICsxOTksNyBAQAogICAgIEJJVE1BUElORk8gKmluZm8sICpuZXdJbmZvOwogICAgIGludCBzaXplOwogICAgIAotICAgIGRwcmludGZfZ2RpKHN0ZGRlYiwgIkNyZWF0ZURJQlBhdHRlcm5CcnVzaDogJWRcbiIsIGhiaXRtYXAgKTsKKyAgICBkcHJpbnRmX2dkaShzdGRkZWIsICJDcmVhdGVESUJQYXR0ZXJuQnJ1c2g6ICJOUEZNVCJcbiIsIGhiaXRtYXAgKTsKIAogICAgICAgLyogTWFrZSBhIGNvcHkgb2YgdGhlIGJpdG1hcCAqLwogCkBAIC0yMDcsMTQgKzIxMSwxOCBAQAogCSAgICAgICAgICogOCAqIGluZm8tPmJtaUhlYWRlci5iaUhlaWdodDsKICAgICBzaXplICs9IERJQl9CaXRtYXBJbmZvU2l6ZSggaW5mbywgY29sb3J1c2UgKTsKIAotICAgIGlmICghKGxvZ2JydXNoLmxiSGF0Y2ggPSBHbG9iYWxBbGxvYyggR01FTV9NT1ZFQUJMRSwgc2l6ZSApKSkKKyNpZmRlZiBXSU5FTElCMzIKKyAgICBpZiAoIShsb2dicnVzaC5sYkhhdGNoID0gKExPTkcpR2xvYmFsQWxsb2MoIEdNRU1fTU9WRUFCTEUsIHNpemUgKSkpCisjZWxzZQorICAgIGlmICghKGxvZ2JydXNoLmxiSGF0Y2ggPSAoSU5UKUdsb2JhbEFsbG9jKCBHTUVNX01PVkVBQkxFLCBzaXplICkpKQorI2VuZGlmCiAgICAgewogCUdsb2JhbFVubG9jayggaGJpdG1hcCApOwogCXJldHVybiAwOwogICAgIH0KLSAgICBuZXdJbmZvID0gKEJJVE1BUElORk8gKikgR2xvYmFsTG9jayggbG9nYnJ1c2gubGJIYXRjaCApOworICAgIG5ld0luZm8gPSAoQklUTUFQSU5GTyAqKSBHbG9iYWxMb2NrKCAoSEFORExFKWxvZ2JydXNoLmxiSGF0Y2ggKTsKICAgICBtZW1jcHkoIG5ld0luZm8sIGluZm8sIHNpemUgKTsKLSAgICBHbG9iYWxVbmxvY2soIGxvZ2JydXNoLmxiSGF0Y2ggKTsKKyAgICBHbG9iYWxVbmxvY2soIChIQU5ETEUpbG9nYnJ1c2gubGJIYXRjaCApOwogICAgIEdsb2JhbFVubG9jayggaGJpdG1hcCApOwogICAgIHJldHVybiBDcmVhdGVCcnVzaEluZGlyZWN0KCAmbG9nYnJ1c2ggKTsKIH0KQEAgLTI0OCw3ICsyNTYsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0U3lzQ29sb3JCcnVzaCAgICAoVVNFUi4yODEpCiAgKi8KLVdPUkQgR2V0U3lzQ29sb3JCcnVzaChXT1JEIHgpCitIQlJVU0ggR2V0U3lzQ29sb3JCcnVzaChXT1JEIHgpCiB7CiAJcmV0dXJuIEdldFN0b2NrT2JqZWN0KEdSQVlfQlJVU0gpOwogfQpAQCAtMjYxLDEwICsyNjksMTAgQEAKICAgICBzd2l0Y2goYnJ1c2gtPmxvZ2JydXNoLmxiU3R5bGUpCiAgICAgewogICAgICAgY2FzZSBCU19QQVRURVJOOgotCSAgRGVsZXRlT2JqZWN0KCBicnVzaC0+bG9nYnJ1c2gubGJIYXRjaCApOworCSAgRGVsZXRlT2JqZWN0KCAoSEFORExFKWJydXNoLT5sb2dicnVzaC5sYkhhdGNoICk7CiAJICBicmVhazsKICAgICAgIGNhc2UgQlNfRElCUEFUVEVSTjoKLQkgIEdsb2JhbEZyZWUoIGJydXNoLT5sb2dicnVzaC5sYkhhdGNoICk7CisJICBHbG9iYWxGcmVlKCAoSEFORExFKWJydXNoLT5sb2dicnVzaC5sYkhhdGNoICk7CiAJICBicmVhazsKICAgICB9CiAgICAgcmV0dXJuIEdESV9GcmVlT2JqZWN0KCBoYnJ1c2ggKTsKQEAgLTMzOSw3ICszNDcsNyBAQAogICAgIEJJVE1BUElORk8gKiBibXBJbmZvOwogICAgIEhCUlVTSCBwcmV2SGFuZGxlID0gZGMtPncuaEJydXNoOwogCi0gICAgZHByaW50Zl9nZGkoc3RkZGViLCAiQnJ1c2hfU2VsZWN0T2JqZWN0ICAgaGRjPSUwNHggIGhicnVzaD0lMDR4XG4iLAorICAgIGRwcmludGZfZ2RpKHN0ZGRlYiwgIkJydXNoX1NlbGVjdE9iamVjdCAgIGhkYz0iTlBGTVQiICBoYnJ1c2g9Ik5QRk1UIlxuIiwKIAkJaGRjLGhicnVzaCk7CiAgICAgaWYgKGRjLT5oZWFkZXIud01hZ2ljID09IE1FVEFGSUxFX0RDX01BR0lDKQogICAgIHsKQEAgLTM0OSwxNiArMzU3LDE2IEBACiAJY2FzZSBCU19IQVRDSEVEOgogCWNhc2UgQlNfSE9MTE9XOgogCSAgICBpZiAoIU1GX0NyZWF0ZUJydXNoSW5kaXJlY3QoZGMsIGhicnVzaCwgJihicnVzaC0+bG9nYnJ1c2gpKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiAoSEJSVVNIKTA7CiAJICAgIGJyZWFrOwogCiAJY2FzZSBCU19QQVRURVJOOgogCWNhc2UgQlNfRElCUEFUVEVSTjoKIAkgICAgaWYgKCFNRl9DcmVhdGVQYXR0ZXJuQnJ1c2goZGMsIGhicnVzaCwgJihicnVzaC0+bG9nYnJ1c2gpKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiAoSEJSVVNIKTA7CiAJICAgIGJyZWFrOwogCX0KLQlyZXR1cm4gMTsKKwlyZXR1cm4gKEhCUlVTSCkxOwogICAgIH0KICAgICAKICAgICBkYy0+dy5oQnJ1c2ggPSBoYnJ1c2g7CkBAIC0zOTEsMTIgKzM5OSwxMiBAQAogCQogICAgICAgY2FzZSBCU19QQVRURVJOOgogCWRwcmludGZfZ2RpKCBzdGRkZWIsICJCU19QQVRURVJOXG4iKTsKLQlCUlVTSF9TZWxlY3RQYXR0ZXJuQnJ1c2goIGRjLCBicnVzaC0+bG9nYnJ1c2gubGJIYXRjaCApOworCUJSVVNIX1NlbGVjdFBhdHRlcm5CcnVzaCggZGMsIChIQlJVU0gpYnJ1c2gtPmxvZ2JydXNoLmxiSGF0Y2ggKTsKIAlicmVhazsKIAogICAgICAgY2FzZSBCU19ESUJQQVRURVJOOgogCWRwcmludGZfZ2RpKCBzdGRkZWIsICJCU19ESUJQQVRURVJOXG4iKTsKLQlpZiAoKGJtcEluZm8gPSAoQklUTUFQSU5GTyAqKSBHbG9iYWxMb2NrKCBicnVzaC0+bG9nYnJ1c2gubGJIYXRjaCApKSkKKwlpZiAoKGJtcEluZm8gPSAoQklUTUFQSU5GTyAqKSBHbG9iYWxMb2NrKCAoSEFORExFKWJydXNoLT5sb2dicnVzaC5sYkhhdGNoICkpKQogCXsKIAkgICAgaW50IHNpemUgPSBESUJfQml0bWFwSW5mb1NpemUoIGJtcEluZm8sIGJydXNoLT5sb2dicnVzaC5sYkNvbG9yICk7CiAJICAgIGhCaXRtYXAgPSBDcmVhdGVESUJpdG1hcCggaGRjLCAmYm1wSW5mby0+Ym1pSGVhZGVyLCBDQk1fSU5JVCwKQEAgLTQwNCw3ICs0MTIsNyBAQAogCQkJCSAgICAgIChXT1JEKSBicnVzaC0+bG9nYnJ1c2gubGJDb2xvciApOwogCSAgICBCUlVTSF9TZWxlY3RQYXR0ZXJuQnJ1c2goIGRjLCBoQml0bWFwICk7CiAJICAgIERlbGV0ZU9iamVjdCggaEJpdG1hcCApOwotCSAgICBHbG9iYWxVbmxvY2soIGJydXNoLT5sb2dicnVzaC5sYkhhdGNoICk7CSAgICAKKwkgICAgR2xvYmFsVW5sb2NrKCAoSEFORExFKWJydXNoLT5sb2dicnVzaC5sYkhhdGNoICk7CSAgICAKIAl9CiAJCiAJYnJlYWs7CmRpZmYgLS1naXQgYS9vYmplY3RzL2NsaXBwaW5nLmMgYi9vYmplY3RzL2NsaXBwaW5nLmMKaW5kZXggMDAzYTZhZS4uZTZhMzMzNSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9jbGlwcGluZy5jCisrKyBiL29iamVjdHMvY2xpcHBpbmcuYwpAQCAtNjcsNyArNjcsNyBAQAogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBFUlJPUjsKIAotICAgIGRwcmludGZfY2xpcHBpbmcoc3RkZGViLCAiU2VsZWN0Q2xpcFJnbjogJXggJXhcbiIsIGhkYywgaHJnbiApOworICAgIGRwcmludGZfY2xpcHBpbmcoc3RkZGViLCAiU2VsZWN0Q2xpcFJnbjogIk5QRk1UIiAiTlBGTVQiXG4iLCBoZGMsIGhyZ24gKTsKIAogICAgIGlmIChocmduKQogICAgIHsKQEAgLTk0LDcgKzk0LDcgQEAKICAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKICAgICBpZiAoIWRjIHx8ICFocmduKSByZXR1cm4gRVJST1I7CiAKLSAgICBkcHJpbnRmX2NsaXBwaW5nKHN0ZGRlYiwgIlNlbGVjdFZpc1JnbjogJXggJXhcbiIsIGhkYywgaHJnbiApOworICAgIGRwcmludGZfY2xpcHBpbmcoc3RkZGViLCAiU2VsZWN0VmlzUmduOiAiTlBGTVQiICJOUEZNVCJcbiIsIGhkYywgaHJnbiApOwogCiAgICAgcmV0dmFsID0gQ29tYmluZVJnbiggZGMtPncuaFZpc1JnbiwgaHJnbiwgMCwgUkdOX0NPUFkgKTsKICAgICBDTElQUElOR19VcGRhdGVHQ1JlZ2lvbiggZGMgKTsKQEAgLTExNiw3ICsxMTYsNyBAQAogCXJldHVybiBOVUxMUkVHSU9OOyAgIC8qID8/ICovCiAgICAgfQogCi0gICAgZHByaW50Zl9jbGlwcGluZyhzdGRkZWIsICJPZmZzZXRDbGlwUmduOiAleCAlZCwlZFxuIiwgaGRjLCB4LCB5ICk7CisgICAgZHByaW50Zl9jbGlwcGluZyhzdGRkZWIsICJPZmZzZXRDbGlwUmduOiAiTlBGTVQiICVkLCVkXG4iLCBoZGMsIHgsIHkgKTsKIAogICAgIGlmIChkYy0+dy5oQ2xpcFJnbikKICAgICB7CkBAIC0xMzYsNyArMTM2LDcgQEAKICAgICBpbnQgcmV0dmFsOwogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBFUlJPUjsgICAgCi0gICAgZHByaW50Zl9jbGlwcGluZyhzdGRkZWIsICJPZmZzZXRWaXNSZ246ICV4ICVkLCVkXG4iLCBoZGMsIHgsIHkgKTsKKyAgICBkcHJpbnRmX2NsaXBwaW5nKHN0ZGRlYiwgIk9mZnNldFZpc1JnbjogIk5QRk1UIiAlZCwlZFxuIiwgaGRjLCB4LCB5ICk7CiAgICAgcmV0dmFsID0gT2Zmc2V0UmduKCBkYy0+dy5oVmlzUmduLCB4LCB5ICk7CiAgICAgQ0xJUFBJTkdfVXBkYXRlR0NSZWdpb24oIGRjICk7CiAgICAgcmV0dXJuIHJldHZhbDsKQEAgLTE5NSw3ICsxOTUsNyBAQAogCXJldHVybiBOVUxMUkVHSU9OOyAgIC8qID8/ICovCiAgICAgfQogCi0gICAgZHByaW50Zl9jbGlwcGluZyhzdGRkZWIsICJFeGNsdWRlQ2xpcFJlY3Q6ICV4ICVkeCVkLCVkeCVkXG4iLAorICAgIGRwcmludGZfY2xpcHBpbmcoc3RkZGViLCAiRXhjbHVkZUNsaXBSZWN0OiAiTlBGTVQiICVkeCVkLCVkeCVkXG4iLAogCSAgICBoZGMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSApOwogICAgIHJldHVybiBDTElQUElOR19JbnRlcnNlY3RDbGlwUmVjdCggZGMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgVFJVRSApOwogfQpAQCAtMjE2LDcgKzIxNiw3IEBACiAJcmV0dXJuIE5VTExSRUdJT047ICAgLyogPz8gKi8KICAgICB9CiAKLSAgICBkcHJpbnRmX2NsaXBwaW5nKHN0ZGRlYiwgIkludGVyc2VjdENsaXBSZWN0OiAleCAlZHglZCwlZHglZFxuIiwKKyAgICBkcHJpbnRmX2NsaXBwaW5nKHN0ZGRlYiwgIkludGVyc2VjdENsaXBSZWN0OiAiTlBGTVQiICVkeCVkLCVkeCVkXG4iLAogCSAgICBoZGMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSApOwogICAgIHJldHVybiBDTElQUElOR19JbnRlcnNlY3RDbGlwUmVjdCggZGMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgRkFMU0UgKTsKIH0KQEAgLTI2OSw3ICsyNjksNyBAQAogewogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBFUlJPUjsgICAgCi0gICAgZHByaW50Zl9jbGlwcGluZyhzdGRkZWIsICJFeGNsdWRlVmlzUmVjdDogJXggJWR4JWQsJWR4JWRcbiIsCisgICAgZHByaW50Zl9jbGlwcGluZyhzdGRkZWIsICJFeGNsdWRlVmlzUmVjdDogIk5QRk1UIiAlZHglZCwlZHglZFxuIiwKIAkgICAgaGRjLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20gKTsKICAgICByZXR1cm4gQ0xJUFBJTkdfSW50ZXJzZWN0VmlzUmVjdCggZGMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgVFJVRSApOwogfQpAQCAtMjgzLDcgKzI4Myw3IEBACiB7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgcmV0dXJuIEVSUk9SOyAgICAKLSAgICBkcHJpbnRmX2NsaXBwaW5nKHN0ZGRlYiwgIkludGVyc2VjdFZpc1JlY3Q6ICV4ICVkeCVkLCVkeCVkXG4iLAorICAgIGRwcmludGZfY2xpcHBpbmcoc3RkZGViLCAiSW50ZXJzZWN0VmlzUmVjdDogIk5QRk1UIiAlZHglZCwlZHglZFxuIiwKIAkgICAgaGRjLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20gKTsKICAgICByZXR1cm4gQ0xJUFBJTkdfSW50ZXJzZWN0VmlzUmVjdCggZGMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgRkFMU0UgKTsKIH0KQEAgLTI5Nyw3ICsyOTcsNyBAQAogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBFUlJPUjsgICAgCiAKLSAgICBkcHJpbnRmX2NsaXBwaW5nKHN0ZGRlYiwgIlB0VmlzaWJsZTogJXggJWQsJWRcbiIsIGhkYywgeCwgeSApOworICAgIGRwcmludGZfY2xpcHBpbmcoc3RkZGViLCAiUHRWaXNpYmxlOiAiTlBGTVQiICVkLCVkXG4iLCBoZGMsIHgsIHkgKTsKICAgICBpZiAoIWRjLT53LmhHQ0NsaXBSZ24pIHJldHVybiBGQUxTRTsKICAgICByZXR1cm4gUHRJblJlZ2lvbiggZGMtPncuaEdDQ2xpcFJnbiwgWExQVE9EUChkYyx4KSwgWUxQVE9EUChkYyx5KSApOwogfQpAQCAtMzExLDcgKzMxMSw3IEBACiAgICAgUkVDVCB0bXBSZWN0OwogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBGQUxTRTsKLSAgICBkcHJpbnRmX2NsaXBwaW5nKHN0ZGRlYiwiUmVjdFZpc2libGU6ICV4ICVkLCVkeCVkLCVkXG4iLAorICAgIGRwcmludGZfY2xpcHBpbmcoc3RkZGViLCJSZWN0VmlzaWJsZTogIk5QRk1UIiAlZCwlZHglZCwlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgIGhkYywgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLCByZWN0LT5yaWdodCwgcmVjdC0+Ym90dG9tICk7CiAgICAgaWYgKCFkYy0+dy5oR0NDbGlwUmduKSByZXR1cm4gRkFMU0U7CiAgICAgLyogY29weSByZWN0YW5nbGUgdG8gYXZvaWQgb3ZlcndyaXRpbmcgYnkgTFB0b0RQICovCkBAIC0zMjksNyArMzI5LDcgQEAKICAgICBpbnQgcmV0OwogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBFUlJPUjsgICAgCi0gICAgZHByaW50Zl9jbGlwcGluZyhzdGRkZWIsICJHZXRDbGlwQm94OiAleCAlcFxuIiwgaGRjLCByZWN0ICk7CisgICAgZHByaW50Zl9jbGlwcGluZyhzdGRkZWIsICJHZXRDbGlwQm94OiAiTlBGTVQiICVwXG4iLCBoZGMsIHJlY3QgKTsKICAgICByZXQgPSBHZXRSZ25Cb3goIGRjLT53LmhHQ0NsaXBSZ24sIHJlY3QgKTsKICAgICBEUHRvTFAoIGhkYywgKExQUE9JTlQpcmVjdCwgMiApOwogICAgIHJldHVybiByZXQ7CkBAIC0zNDUsNyArMzQ1LDcgQEAKICAgICBSR05PQkogKm9iaiwgKmNvcHlPYmo7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgcmV0dXJuIDA7Ci0gICAgZHByaW50Zl9jbGlwcGluZyhzdGRkZWIsICJTYXZlVmlzUmduOiAleFxuIiwgaGRjICk7CisgICAgZHByaW50Zl9jbGlwcGluZyhzdGRkZWIsICJTYXZlVmlzUmduOiAiTlBGTVQiXG4iLCBoZGMgKTsKICAgICBpZiAoIWRjLT53LmhWaXNSZ24pCiAgICAgewogICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTYXZlVmlzUmduOiBoVmlzUmduIGlzIHplcm8uIFBsZWFzZSByZXBvcnQgdGhpcy5cbiIgKTsKQEAgLTM3Miw3ICszNzIsNyBAQAogICAgIFJHTk9CSiAqb2JqLCAqc2F2ZWRPYmo7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYyB8fCAhZGMtPncuaFZpc1JnbikgcmV0dXJuIEVSUk9SOyAgICAKLSAgICBkcHJpbnRmX2NsaXBwaW5nKHN0ZGRlYiwgIlJlc3RvcmVWaXNSZ246ICV4XG4iLCBoZGMgKTsKKyAgICBkcHJpbnRmX2NsaXBwaW5nKHN0ZGRlYiwgIlJlc3RvcmVWaXNSZ246ICJOUEZNVCJcbiIsIGhkYyApOwogICAgIGlmICghKG9iaiA9IChSR05PQkogKikgR0RJX0dldE9ialB0ciggZGMtPncuaFZpc1JnbiwgUkVHSU9OX01BR0lDICkpKQogCXJldHVybiBFUlJPUjsKICAgICBpZiAoIShzYXZlZCA9IG9iai0+aGVhZGVyLmhOZXh0KSkgcmV0dXJuIEVSUk9SOwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9jb2xvci5jIGIvb2JqZWN0cy9jb2xvci5jCmluZGV4IGJkZTAzM2IuLjU5NDEzNDAgMTAwNjQ0Ci0tLSBhL29iamVjdHMvY29sb3IuYworKysgYi9vYmplY3RzL2NvbG9yLmMKQEAgLTIsOSArMiw4IEBACiAgKiBDb2xvciBmdW5jdGlvbnMKICAqCiAgKiBDb3B5cmlnaHQgMTk5MyBBbGV4YW5kcmUgSnVsbGlhcmQKLSAqCi1zdGF0aWMgY2hhciBDb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgIEFsZXhhbmRyZSBKdWxsaWFyZCwgMTk5MyI7Ci0qLworICovCisKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxYMTEvWGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC0yNDMsNyArMjQyLDYgQEAKIAl9CiAJQ09MT1JfV2luQ29sb3JtYXAgPSBEZWZhdWx0Q29sb3JtYXBPZlNjcmVlbiggc2NyZWVuICk7CiAgICAgICAgIGJyZWFrOwotCS8qIEZhbGwgdGhyb3VnaCAqLwogICAgIGNhc2UgU3RhdGljR3JheToKIAlDT0xPUl9XaW5Db2xvcm1hcCA9IERlZmF1bHRDb2xvcm1hcE9mU2NyZWVuKCBzY3JlZW4gKTsKIAlDT0xPUl9GaXhlZE1hcCA9IDE7CkBAIC0zMDMsOCArMzAxLDYgQEAKICAgICBXT1JEIGluZGV4ID0gMDsKICAgICBXT1JEICptYXBwaW5nOwogCi0gICAgLyogaWYgKHNjcmVlbkRlcHRoID4gOCkgcmV0dXJuIGNvbG9yOyAqLwotCiAgICAgaWYgKGRjICYmIChkYy0+dy5iaXRzUGVyUGl4ZWwgPT0gMSkgJiYgKChjb2xvciA+PiAyNCkgPT0gMCkpCiAgICAgewogCS8qIG1vbm9jaHJvbWUgKi8KQEAgLTMxNCw1MyArMzEwLDUyIEBACiAgICAgICAgIGVsc2UgcmV0dXJuIDA7ICAvKiBibGFjayAqLwogICAgIH0KIAotICAgIGlmKENPTE9SX0ZpeGVkTWFwKSB7Ci0KKyAgICBpZiAoQ09MT1JfRml4ZWRNYXApCisgICAgewogICAgICAgICAvKiB0aGVyZSBpcyBubyBjb2xvcm1hcCBwb3NzaWJsZTsgd2UgYXJlIGdvaW5nIHRvIGhhdmUgdG8gY29tcHV0ZQogICAgICAgICAgICB0aGUgcGl4ZWwgdmFsdWUgZnJvbSB0aGUgdmlzdWFsIGluZm9ybWF0aW9uIHN0b3JlZCBlYXJsaWVyICovCiAKLQl1bnNpZ25lZCBsb25nIHdoaWNoID0gY29sb3IgPj4gMjQ7Ci0KIAl1bnNpZ25lZCBsb25nIHJlZCwgZ3JlZW4sIGJsdWU7CiAJdW5zaWduZWQgaWR4OwogCVBBTEVUVEVPQkogKiBwYWxQdHI7CiAKLQlzd2l0Y2god2hpY2gpIHsKLQkJY2FzZSAwOiAvKiBSR0IgKi8KLQkJY2FzZSAyOiAvKiBQQUxFVFRFUkdCIC0tIG5lZWRzIHNvbWUgd29yaywgYnV0IHdoeSBib3RoZXI7IHdlJ3ZlIGdvdCBhIFJFQUxMWSBMQVJHRSBudW1iZXIgb2YgY29sb3JzLi4uPyAqLwotCQlkZWZhdWx0OgorCXN3aXRjaChjb2xvciA+PiAyNCkKKyAgICAgICAgeworICAgICAgICBjYXNlIDA6IC8qIFJHQiAqLworICAgICAgICBjYXNlIDI6IC8qIFBBTEVUVEVSR0IgLS0gbmVlZHMgc29tZSB3b3JrLCBidXQgd2h5IGJvdGhlcjsgd2UndmUgZ290IGEgUkVBTExZIExBUkdFIG51bWJlciBvZiBjb2xvcnMuLi4/ICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZWQgPSBHZXRSVmFsdWUoY29sb3IpOworICAgICAgICAgICAgZ3JlZW4gPSBHZXRHVmFsdWUoY29sb3IpOworICAgICAgICAgICAgYmx1ZSA9IEdldEJWYWx1ZShjb2xvcik7CisgICAgICAgICAgICBicmVhazsKIAotCQlyZWQgPSBHZXRSVmFsdWUoY29sb3IpOwotCQlncmVlbiA9IEdldEdWYWx1ZShjb2xvcik7Ci0JCWJsdWUgPSBHZXRCVmFsdWUoY29sb3IpOwotCQlicmVhazsKLQotCQljYXNlIDE6IC8qIFBBTEVUVEVJRFggLS0gaG1tLCBnZXQgdGhlIHJlYWwgY29sb3IgZnJvbSB0aGUgc3RvY2sgcGFsZXR0ZSAqLwotCQlwYWxQdHIgPSAoUEFMRVRURU9CSiAqKSBHRElfR2V0T2JqUHRyKCBTVE9DS19ERUZBVUxUX1BBTEVUVEUsIFBBTEVUVEVfTUFHSUMpOwotCQlpZHggPSBjb2xvciAmIDB4ZmZmZjsKLQkJaWYoaWR4ID49IHBhbFB0ci0+bG9ncGFsZXR0ZS5wYWxOdW1FbnRyaWVzKSB7Ci0JCQkvKiBvdXQgb2YgYm91bmRzICovCi0JCQlyZWQgPSBncmVlbiA9IGJsdWUgPSAwOwotCQl9Ci0JCWVsc2UgewotCQkJcmVkID0gcGFsUHRyLT5sb2dwYWxldHRlLnBhbFBhbEVudHJ5W2lkeF0ucGVSZWQ7Ci0JCQlncmVlbiA9IHBhbFB0ci0+bG9ncGFsZXR0ZS5wYWxQYWxFbnRyeVtpZHhdLnBlR3JlZW47Ci0JCQlibHVlID0gcGFsUHRyLT5sb2dwYWxldHRlLnBhbFBhbEVudHJ5W2lkeF0ucGVCbHVlOwotCQl9CisgICAgICAgIGNhc2UgMTogLyogUEFMRVRURUlEWCAtLSBobW0sIGdldCB0aGUgcmVhbCBjb2xvciBmcm9tIHRoZSBzdG9jayBwYWxldHRlICovCisgICAgICAgICAgICBwYWxQdHIgPSAoUEFMRVRURU9CSiAqKSBHRElfR2V0T2JqUHRyKCBTVE9DS19ERUZBVUxUX1BBTEVUVEUsIFBBTEVUVEVfTUFHSUMpOworICAgICAgICAgICAgaWR4ID0gY29sb3IgJiAweGZmZmY7CisgICAgICAgICAgICBpZiAoaWR4ID49IHBhbFB0ci0+bG9ncGFsZXR0ZS5wYWxOdW1FbnRyaWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIG91dCBvZiBib3VuZHMgKi8KKyAgICAgICAgICAgICAgICByZWQgPSBncmVlbiA9IGJsdWUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlZCA9IHBhbFB0ci0+bG9ncGFsZXR0ZS5wYWxQYWxFbnRyeVtpZHhdLnBlUmVkOworICAgICAgICAgICAgICAgIGdyZWVuID0gcGFsUHRyLT5sb2dwYWxldHRlLnBhbFBhbEVudHJ5W2lkeF0ucGVHcmVlbjsKKyAgICAgICAgICAgICAgICBibHVlID0gcGFsUHRyLT5sb2dwYWxldHRlLnBhbFBhbEVudHJ5W2lkeF0ucGVCbHVlOworICAgICAgICAgICAgfQogCX0KIAotCWlmKENPTE9SX0dyYXltYXgpIHsKKwlpZiAoQ09MT1JfR3JheW1heCkKKyAgICAgICAgewogCSAgICAvKiBncmF5c2NhbGUgb25seTsgcmV0dXJuIHNjYWxlZCB2YWx1ZSAqLwogICAgICAgICAgICAgcmV0dXJuICggKHJlZCAqIDMwICsgZ3JlZW4gKiA2OSArIGJsdWUgKiAxMSkgKiBDT0xPUl9HcmF5bWF4KSAvIDI1NTAwOwogCX0KLQllbHNlIHsKKwllbHNlCisgICAgICAgIHsKIAkgICAgLyogc2NhbGUgZWFjaCBpbmRpdmlkdWFsbHkgYW5kIGNvbnN0cnVjdCB0aGUgVHJ1ZUNvbG9yIHBpeGVsIHZhbHVlICovCi0JICAgIGlmKENPTE9SX1JlZG1heCAhPSAyNTUpCi0gICAgICAgICAgICAgICAgcmVkID0gKHJlZCAqIENPTE9SX1JlZG1heCkgLyAyNTU7Ci0JICAgIGlmKENPTE9SX0dyZWVubWF4ICE9IDI1NSkKLSAgICAgICAgICAgICAgICBncmVlbiA9IChncmVlbiAqIENPTE9SX0dyZWVubWF4KSAvIDI1NTsKLQkgICAgaWYoQ09MT1JfQmx1ZW1heCAhPSAyNTUpCi0gICAgICAgICAgICAgICAgYmx1ZSA9IChibHVlICogQ09MT1JfQmx1ZW1heCkgLyAyNTU7CisJICAgIGlmIChDT0xPUl9SZWRtYXggIT0gMjU1KSByZWQgPSAocmVkICogQ09MT1JfUmVkbWF4KSAvIDI1NTsKKyAgICAgICAgICAgIGlmIChDT0xPUl9HcmVlbm1heCAhPSAyNTUpIGdyZWVuID0gKGdyZWVuICogQ09MT1JfR3JlZW5tYXgpIC8gMjU1OworCSAgICBpZiAoQ09MT1JfQmx1ZW1heCAhPSAyNTUpIGJsdWUgPSAoYmx1ZSAqIENPTE9SX0JsdWVtYXgpIC8gMjU1OwogCiAJICAgIHJldHVybiAocmVkIDw8IENPTE9SX1JlZHNoaWZ0KSB8IChncmVlbiA8PCBDT0xPUl9HcmVlbnNoaWZ0KSB8IChibHVlIDw8IENPTE9SX0JsdWVzaGlmdCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL29iamVjdHMvY3Vyc29yaWNvbi5jIGIvb2JqZWN0cy9jdXJzb3JpY29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNjM2YyYQotLS0gL2Rldi9udWxsCisrKyBiL29iamVjdHMvY3Vyc29yaWNvbi5jCkBAIC0wLDAgKzEsODUzIEBACisvKgorICogQ3Vyc29yIGFuZCBpY29uIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgMTk5NSBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqLworCisvKgorICogVGhlb3J5OgorICoKKyAqIEN1cnNvcnMgYW5kIGljb25zIGFyZSBzdG9yZWQgaW4gYSBnbG9iYWwgaGVhcCBibG9jaywgd2l0aCB0aGUKKyAqIGZvbGxvd2luZyBsYXlvdXQ6CisgKgorICogQ1VSU09SSUNPTklORk8gaW5mbzsKKyAqIEJZVEVbXSAgICAgICAgIEFORGJpdHM7CisgKiBCWVRFW10gICAgICAgICBYT1JiaXRzOworICoKKyAqIFRoZSBiaXRzIHN0cnVjdHVyZXMgYXJlIGluIHRoZSBmb3JtYXQgb2YgYSBkZXZpY2UtZGVwZW5kZW50IGJpdG1hcC4KKyAqCisgKiBUaGlzIGxheW91dCBpcyB2ZXJ5IHN1Yi1vcHRpbWFsLCBhcyB0aGUgYml0bWFwIGJpdHMgYXJlIHN0b3JlZCBpbgorICogdGhlIFggY2xpZW50IGluc3RlYWQgb2YgaW4gdGhlIHNlcnZlciBsaWtlIG90aGVyIGJpdG1hcHM7IGhvd2V2ZXIsCisgKiBzb21lIHByb2dyYW1zIChub3RhYmx5IFBhaW50IEJydXNoKSBleHBlY3QgdG8gYmUgYWJsZSB0byBtYW5pcHVsYXRlCisgKiB0aGUgYml0cyBkaXJlY3RseSA6LSgKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgImJpdG1hcC5oIgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSAiY3Vyc29yaWNvbi5oIgorI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKKyNpbmNsdWRlICJ3aW4uaCIKKyNpbmNsdWRlICJzdGRkZWJ1Zy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKKworQ3Vyc29yIENVUlNPUklDT05fWEN1cnNvciA9IE5vbmU7ICAvKiBDdXJyZW50IFggY3Vyc29yICovCitzdGF0aWMgSENVUlNPUiBoQWN0aXZlQ3Vyc29yID0gMDsgIC8qIEFjdGl2ZSBjdXJzb3IgKi8KK3N0YXRpYyBpbnQgQ1VSU09SX1Nob3dDb3VudCA9IDA7ICAgLyogQ3Vyc29yIGRpc3BsYXkgY291bnQgKi8KK3N0YXRpYyBSRUNUIENVUlNPUl9DbGlwUmVjdDsgICAgICAgLyogQ3Vyc29yIGNsaXBwaW5nIHJlY3QgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICBDVVJTT1JJQ09OX0ZpbmRCZXN0SWNvbgorICoKKyAqIEZpbmQgdGhlIGljb24gY2xvc2VzdCB0byB0aGUgcmVxdWVzdGVkIHNpemUgYW5kIG51bWJlciBvZiBjb2xvcnMuCisgKi8KK3N0YXRpYyBJQ09ORElSRU5UUlkgKkNVUlNPUklDT05fRmluZEJlc3RJY29uKCBDVVJTT1JJQ09ORElSICpkaXIsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgY29sb3JzICkKK3sKKyAgICBpbnQgaSwgbWF4Y29sb3JzLCBtYXh3aWR0aCwgbWF4aGVpZ2h0OworICAgIElDT05ESVJFTlRSWSAqZW50cnksICpiZXN0RW50cnkgPSBOVUxMOworCisgICAgaWYgKGRpci0+aWRDb3VudCA8IDEpCisgICAgeworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJJY29uOiBlbXB0eSBkaXJlY3RvcnkhXG4iICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZGlyLT5pZENvdW50ID09IDEpIHJldHVybiAmZGlyLT5pZEVudHJpZXNbMF0uaWNvbjsgIC8qIE5vIGNob2ljZS4uLiAqLworCisgICAgLyogRmlyc3QgZmluZCB0aGUgZXhhY3Qgc2l6ZSB3aXRoIGxlc3MgY29sb3JzICovCisKKyAgICBtYXhjb2xvcnMgPSAwOworICAgIGZvciAoaSA9IDAsIGVudHJ5ID0gJmRpci0+aWRFbnRyaWVzWzBdLmljb247IGkgPCBkaXItPmlkQ291bnQ7IGkrKyxlbnRyeSsrKQorICAgICAgICBpZiAoKGVudHJ5LT5iV2lkdGggPT0gd2lkdGgpICYmIChlbnRyeS0+YkhlaWdodCA9PSBoZWlnaHQpICYmCisgICAgICAgICAgICAoZW50cnktPmJDb2xvckNvdW50IDw9IGNvbG9ycykgJiYgKGVudHJ5LT5iQ29sb3JDb3VudCA+IG1heGNvbG9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJlc3RFbnRyeSA9IGVudHJ5OworICAgICAgICAgICAgbWF4Y29sb3JzID0gZW50cnktPmJDb2xvckNvdW50OworICAgICAgICB9CisgICAgaWYgKGJlc3RFbnRyeSkgcmV0dXJuIGJlc3RFbnRyeTsKKworICAgIC8qIEZpcnN0IGZpbmQgdGhlIGV4YWN0IHNpemUgd2l0aCBtb3JlIGNvbG9ycyAqLworCisgICAgbWF4Y29sb3JzID0gMjU1OworICAgIGZvciAoaSA9IDAsIGVudHJ5ID0gJmRpci0+aWRFbnRyaWVzWzBdLmljb247IGkgPCBkaXItPmlkQ291bnQ7IGkrKyxlbnRyeSsrKQorICAgICAgICBpZiAoKGVudHJ5LT5iV2lkdGggPT0gd2lkdGgpICYmIChlbnRyeS0+YkhlaWdodCA9PSBoZWlnaHQpICYmCisgICAgICAgICAgICAoZW50cnktPmJDb2xvckNvdW50ID4gY29sb3JzKSAmJiAoZW50cnktPmJDb2xvckNvdW50IDw9IG1heGNvbG9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJlc3RFbnRyeSA9IGVudHJ5OworICAgICAgICAgICAgbWF4Y29sb3JzID0gZW50cnktPmJDb2xvckNvdW50OworICAgICAgICB9CisgICAgaWYgKGJlc3RFbnRyeSkgcmV0dXJuIGJlc3RFbnRyeTsKKworICAgIC8qIE5vdyBmaW5kIGEgc21hbGxlciBvbmUgd2l0aCBsZXNzIGNvbG9ycyAqLworCisgICAgbWF4Y29sb3JzID0gbWF4d2lkdGggPSBtYXhoZWlnaHQgPSAwOworICAgIGZvciAoaSA9IDAsIGVudHJ5ID0gJmRpci0+aWRFbnRyaWVzWzBdLmljb247IGkgPCBkaXItPmlkQ291bnQ7IGkrKyxlbnRyeSsrKQorICAgICAgICBpZiAoKGVudHJ5LT5iV2lkdGggPD0gd2lkdGgpICYmIChlbnRyeS0+YkhlaWdodCA8PSBoZWlnaHQpICYmCisgICAgICAgICAgICAoZW50cnktPmJXaWR0aCA+PSBtYXh3aWR0aCkgJiYgKGVudHJ5LT5iSGVpZ2h0ID49IG1heGhlaWdodCkgJiYKKyAgICAgICAgICAgIChlbnRyeS0+YkNvbG9yQ291bnQgPD0gY29sb3JzKSAmJiAoZW50cnktPmJDb2xvckNvdW50ID4gbWF4Y29sb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmVzdEVudHJ5ID0gZW50cnk7CisgICAgICAgICAgICBtYXh3aWR0aCAgPSBlbnRyeS0+YldpZHRoOworICAgICAgICAgICAgbWF4aGVpZ2h0ID0gZW50cnktPmJIZWlnaHQ7CisgICAgICAgICAgICBtYXhjb2xvcnMgPSBlbnRyeS0+YkNvbG9yQ291bnQ7CisgICAgICAgIH0KKyAgICBpZiAoYmVzdEVudHJ5KSByZXR1cm4gYmVzdEVudHJ5OworCisgICAgLyogTm93IGZpbmQgYSBzbWFsbGVyIG9uZSB3aXRoIG1vcmUgY29sb3JzICovCisKKyAgICBtYXhjb2xvcnMgPSAyNTU7CisgICAgbWF4d2lkdGggPSBtYXhoZWlnaHQgPSAwOworICAgIGZvciAoaSA9IDAsIGVudHJ5ID0gJmRpci0+aWRFbnRyaWVzWzBdLmljb247IGkgPCBkaXItPmlkQ291bnQ7IGkrKyxlbnRyeSsrKQorICAgICAgICBpZiAoKGVudHJ5LT5iV2lkdGggPD0gd2lkdGgpICYmIChlbnRyeS0+YkhlaWdodCA8PSBoZWlnaHQpICYmCisgICAgICAgICAgICAoZW50cnktPmJXaWR0aCA+PSBtYXh3aWR0aCkgJiYgKGVudHJ5LT5iSGVpZ2h0ID49IG1heGhlaWdodCkgJiYKKyAgICAgICAgICAgIChlbnRyeS0+YkNvbG9yQ291bnQgPiBjb2xvcnMpICYmIChlbnRyeS0+YkNvbG9yQ291bnQgPD0gbWF4Y29sb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmVzdEVudHJ5ID0gZW50cnk7CisgICAgICAgICAgICBtYXh3aWR0aCAgPSBlbnRyeS0+YldpZHRoOworICAgICAgICAgICAgbWF4aGVpZ2h0ID0gZW50cnktPmJIZWlnaHQ7CisgICAgICAgICAgICBtYXhjb2xvcnMgPSBlbnRyeS0+YkNvbG9yQ291bnQ7CisgICAgICAgIH0KKyAgICBpZiAoYmVzdEVudHJ5KSByZXR1cm4gYmVzdEVudHJ5OworCisgICAgLyogTm93IGZpbmQgYSBsYXJnZXIgb25lIHdpdGggbGVzcyBjb2xvcnMgKi8KKworICAgIG1heGNvbG9ycyA9IDA7CisgICAgbWF4d2lkdGggPSBtYXhoZWlnaHQgPSAyNTU7CisgICAgZm9yIChpID0gMCwgZW50cnkgPSAmZGlyLT5pZEVudHJpZXNbMF0uaWNvbjsgaSA8IGRpci0+aWRDb3VudDsgaSsrLGVudHJ5KyspCisgICAgICAgIGlmICgoZW50cnktPmJXaWR0aCA8PSBtYXh3aWR0aCkgJiYgKGVudHJ5LT5iSGVpZ2h0IDw9IG1heGhlaWdodCkgJiYKKyAgICAgICAgICAgIChlbnRyeS0+YkNvbG9yQ291bnQgPD0gY29sb3JzKSAmJiAoZW50cnktPmJDb2xvckNvdW50ID4gbWF4Y29sb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmVzdEVudHJ5ID0gZW50cnk7CisgICAgICAgICAgICBtYXh3aWR0aCAgPSBlbnRyeS0+YldpZHRoOworICAgICAgICAgICAgbWF4aGVpZ2h0ID0gZW50cnktPmJIZWlnaHQ7CisgICAgICAgICAgICBtYXhjb2xvcnMgPSBlbnRyeS0+YkNvbG9yQ291bnQ7CisgICAgICAgIH0KKyAgICBpZiAoYmVzdEVudHJ5KSByZXR1cm4gYmVzdEVudHJ5OworCisgICAgLyogTm93IGZpbmQgYSBsYXJnZXIgb25lIHdpdGggbW9yZSBjb2xvcnMgKi8KKworICAgIG1heGNvbG9ycyA9IG1heHdpZHRoID0gbWF4aGVpZ2h0ID0gMjU1OworICAgIGZvciAoaSA9IDAsIGVudHJ5ID0gJmRpci0+aWRFbnRyaWVzWzBdLmljb247IGkgPCBkaXItPmlkQ291bnQ7IGkrKyxlbnRyeSsrKQorICAgICAgICBpZiAoKGVudHJ5LT5iV2lkdGggPD0gbWF4d2lkdGgpICYmIChlbnRyeS0+YkhlaWdodCA8PSBtYXhoZWlnaHQpICYmCisgICAgICAgICAgICAoZW50cnktPmJDb2xvckNvdW50ID4gY29sb3JzKSAmJiAoZW50cnktPmJDb2xvckNvdW50IDw9IG1heGNvbG9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJlc3RFbnRyeSA9IGVudHJ5OworICAgICAgICAgICAgbWF4d2lkdGggID0gZW50cnktPmJXaWR0aDsKKyAgICAgICAgICAgIG1heGhlaWdodCA9IGVudHJ5LT5iSGVpZ2h0OworICAgICAgICAgICAgbWF4Y29sb3JzID0gZW50cnktPmJDb2xvckNvdW50OworICAgICAgICB9CisKKyAgICByZXR1cm4gYmVzdEVudHJ5OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgQ1VSU09SSUNPTl9GaW5kQmVzdEN1cnNvcgorICoKKyAqIEZpbmQgdGhlIGN1cnNvciBjbG9zZXN0IHRvIHRoZSByZXF1ZXN0ZWQgc2l6ZS4KKyAqLworc3RhdGljIENVUlNPUkRJUkVOVFJZICpDVVJTT1JJQ09OX0ZpbmRCZXN0Q3Vyc29yKCBDVVJTT1JJQ09ORElSICpkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCApCit7CisgICAgaW50IGksIG1heHdpZHRoLCBtYXhoZWlnaHQ7CisgICAgQ1VSU09SRElSRU5UUlkgKmVudHJ5LCAqYmVzdEVudHJ5ID0gTlVMTDsKKworICAgIGlmIChkaXItPmlkQ291bnQgPCAxKQorICAgIHsKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiQ3Vyc29yOiBlbXB0eSBkaXJlY3RvcnkhXG4iICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZGlyLT5pZENvdW50ID09IDEpIHJldHVybiAmZGlyLT5pZEVudHJpZXNbMF0uY3Vyc29yOyAvKiBObyBjaG9pY2UuLi4gKi8KKworICAgIC8qIEZpcnN0IGZpbmQgdGhlIGxhcmdlc3Qgb25lIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcmVxdWVzdGVkIHNpemUqLworCisgICAgbWF4d2lkdGggPSBtYXhoZWlnaHQgPSAwOworICAgIGZvcihpID0gMCxlbnRyeSA9ICZkaXItPmlkRW50cmllc1swXS5jdXJzb3I7IGkgPCBkaXItPmlkQ291bnQ7IGkrKyxlbnRyeSsrKQorICAgICAgICBpZiAoKGVudHJ5LT53V2lkdGggPD0gd2lkdGgpICYmIChlbnRyeS0+d0hlaWdodCA8PSBoZWlnaHQpICYmCisgICAgICAgICAgICAoZW50cnktPndXaWR0aCA+IG1heHdpZHRoKSAmJiAoZW50cnktPndIZWlnaHQgPiBtYXhoZWlnaHQpKQorICAgICAgICB7CisgICAgICAgICAgICBiZXN0RW50cnkgPSBlbnRyeTsKKyAgICAgICAgICAgIG1heHdpZHRoICA9IGVudHJ5LT53V2lkdGg7CisgICAgICAgICAgICBtYXhoZWlnaHQgPSBlbnRyeS0+d0hlaWdodDsKKyAgICAgICAgfQorICAgIGlmIChiZXN0RW50cnkpIHJldHVybiBiZXN0RW50cnk7CisKKyAgICAvKiBOb3cgZmluZCB0aGUgc21hbGxlc3Qgb25lIGxhcmdlciB0aGFuIHRoZSByZXF1ZXN0ZWQgc2l6ZSAqLworCisgICAgbWF4d2lkdGggPSBtYXhoZWlnaHQgPSAyNTU7CisgICAgZm9yKGkgPSAwLGVudHJ5ID0gJmRpci0+aWRFbnRyaWVzWzBdLmN1cnNvcjsgaSA8IGRpci0+aWRDb3VudDsgaSsrLGVudHJ5KyspCisgICAgICAgIGlmICgoZW50cnktPndXaWR0aCA8IG1heHdpZHRoKSAmJiAoZW50cnktPndIZWlnaHQgPCBtYXhoZWlnaHQpKQorICAgICAgICB7CisgICAgICAgICAgICBiZXN0RW50cnkgPSBlbnRyeTsKKyAgICAgICAgICAgIG1heHdpZHRoICA9IGVudHJ5LT53V2lkdGg7CisgICAgICAgICAgICBtYXhoZWlnaHQgPSBlbnRyeS0+d0hlaWdodDsKKyAgICAgICAgfQorCisgICAgcmV0dXJuIGJlc3RFbnRyeTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIENVUlNPUklDT05fTG9hZERpckVudHJ5CisgKgorICogTG9hZCB0aGUgaWNvbi9jdXJzb3IgZGlyZWN0b3J5IGZvciBhIGdpdmVuIHJlc291cmNlIG5hbWUgYW5kIGZpbmQgdGhlCisgKiBiZXN0IG1hdGNoaW5nIGVudHJ5LgorICovCitzdGF0aWMgQk9PTCBDVVJTT1JJQ09OX0xvYWREaXJFbnRyeShIQU5ETEUgaEluc3RhbmNlLCBTRUdQVFIgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGNvbG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgZkN1cnNvciwgQ1VSU09SSUNPTkRJUkVOVFJZICpkaXJFbnRyeSkKK3sKKyAgICBIUlNSQyBoUnNyYzsKKyAgICBIQU5ETEUgaE1lbTsKKyAgICBDVVJTT1JJQ09ORElSICpkaXI7CisgICAgQ1VSU09SSUNPTkRJUkVOVFJZICplbnRyeSA9IE5VTEw7CisKKyAgICBpZiAoIShoUnNyYyA9IEZpbmRSZXNvdXJjZSggaEluc3RhbmNlLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ3Vyc29yID8gUlRfR1JPVVBfQ1VSU09SIDogUlRfR1JPVVBfSUNPTiApKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmICghKGhNZW0gPSBMb2FkUmVzb3VyY2UoIGhJbnN0YW5jZSwgaFJzcmMgKSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoKGRpciA9IChDVVJTT1JJQ09ORElSICopTG9ja1Jlc291cmNlKCBoTWVtICkpKQorICAgIHsKKyAgICAgICAgaWYgKGZDdXJzb3IpCisgICAgICAgICAgICBlbnRyeSA9IChDVVJTT1JJQ09ORElSRU5UUlkgKilDVVJTT1JJQ09OX0ZpbmRCZXN0Q3Vyc29yKCBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0ICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVudHJ5ID0gKENVUlNPUklDT05ESVJFTlRSWSAqKUNVUlNPUklDT05fRmluZEJlc3RJY29uKCBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY29sb3JzICk7CisgICAgICAgIGlmIChlbnRyeSkgKmRpckVudHJ5ID0gKmVudHJ5OworICAgIH0KKyAgICBGcmVlUmVzb3VyY2UoIGhNZW0gKTsKKyAgICByZXR1cm4gKGVudHJ5ICE9IE5VTEwpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgQ1VSU09SSUNPTl9Mb2FkCisgKgorICogTG9hZCBhIGN1cnNvciBvciBpY29uLgorICovCitzdGF0aWMgSEFORExFIENVUlNPUklDT05fTG9hZCggSEFORExFIGhJbnN0YW5jZSwgU0VHUFRSIG5hbWUsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgY29sb3JzLCBCT09MIGZDdXJzb3IgKQoreworICAgIEhBTkRMRSBoYW5kbGUsIGhBbmRCaXRzLCBoWG9yQml0czsKKyAgICBIUlNSQyBoUnNyYzsKKyAgICBIREMgaGRjOworICAgIGludCBzaXplLCBzaXplQW5kLCBzaXplWG9yOworICAgIFBPSU5UIGhvdHNwb3QgPSB7IDAgLDAgfTsKKyAgICBCSVRNQVBPQkogKmJtcFhvciwgKmJtcEFuZDsKKyAgICBCSVRNQVBJTkZPICpibWksICpwSW5mbzsKKyAgICBDVVJTT1JJQ09OSU5GTyAqaW5mbzsKKyAgICBDVVJTT1JJQ09ORElSRU5UUlkgZGlyRW50cnk7CisgICAgY2hhciAqYml0czsKKworICAgIGlmICghaEluc3RhbmNlKSAgLyogT0VNIGN1cnNvci9pY29uICovCisgICAgeworICAgICAgICBpZiAoSElXT1JEKG5hbWUpKSAgLyogQ2hlY2sgZm9yICcjeHh4JyBuYW1lICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgKnB0ciA9IFBUUl9TRUdfVE9fTElOKCBuYW1lICk7CisgICAgICAgICAgICBpZiAocHRyWzBdICE9ICcjJykgcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAoIShuYW1lID0gKFNFR1BUUilhdG9pKCBwdHIgKyAxICkpKSByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0JNX0xvYWRDdXJzb3JJY29uKCBMT1dPUkQobmFtZSksIGZDdXJzb3IgKTsKKyAgICB9CisKKyAgICAvKiBGaW5kIHRoZSBiZXN0IGVudHJ5IGluIHRoZSBkaXJlY3RvcnkgKi8KKworICAgIGlmICghQ1VSU09SSUNPTl9Mb2FkRGlyRW50cnkoIGhJbnN0YW5jZSwgbmFtZSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnMsIGZDdXJzb3IsICZkaXJFbnRyeSApKSByZXR1cm4gMDsKKworICAgIC8qIExvYWQgdGhlIHJlc291cmNlICovCisKKyAgICBpZiAoIShoUnNyYyA9IEZpbmRSZXNvdXJjZSggaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFSU5UUkVTT1VSQ0UoIGRpckVudHJ5Lmljb24ud1Jlc0lkICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDdXJzb3IgPyBSVF9DVVJTT1IgOiBSVF9JQ09OICkpKSByZXR1cm4gMDsKKyAgICBpZiAoIShoYW5kbGUgPSBMb2FkUmVzb3VyY2UoIGhJbnN0YW5jZSwgaFJzcmMgKSkpIHJldHVybiAwOworCisgICAgaWYgKGZDdXJzb3IpICAvKiBJZiBjdXJzb3IsIGdldCB0aGUgaG90c3BvdCAqLworICAgIHsKKyAgICAgICAgUE9JTlQgKnB0ID0gKFBPSU5UICopTG9ja1Jlc291cmNlKCBoYW5kbGUgKTsKKyAgICAgICAgaG90c3BvdCA9ICpwdDsKKyAgICAgICAgYm1pID0gKEJJVE1BUElORk8gKikocHQgKyAxKTsKKyAgICB9CisgICAgZWxzZSBibWkgPSAoQklUTUFQSU5GTyAqKUxvY2tSZXNvdXJjZSggaGFuZGxlICk7CisKKyAgICAvKiBDcmVhdGUgYSBjb3B5IG9mIHRoZSBiaXRtYXAgaGVhZGVyICovCisKKyAgICBzaXplID0gRElCX0JpdG1hcEluZm9TaXplKCBibWksIERJQl9SR0JfQ09MT1JTICk7CisgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgcm9vbSBmb3IgdGhlIG1vbm9jaHJvbWUgYml0bWFwIGxhdGVyIG9uICovCisgICAgc2l6ZSA9IG1heCggc2l6ZSwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICsgMipzaXplb2YoUkdCUVVBRCkgKTsKKyAgICBwSW5mbyA9IChCSVRNQVBJTkZPICopbWFsbG9jKCBzaXplICk7CisgICAgbWVtY3B5KCBwSW5mbywgYm1pLCBzaXplICk7CisKKyAgICBpZiAocEluZm8tPmJtaUhlYWRlci5iaVNpemUgPT0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKQorICAgIHsKKyAgICAgICAgaWYgKHBJbmZvLT5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiAhPSBCSV9SR0IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJVbmtub3duIHNpemUgZm9yIGNvbXByZXNzZWQgaWNvbiBiaXRtYXAuXG4iKTsKKyAgICAgICAgICAgIEZyZWVSZXNvdXJjZSggaGFuZGxlICk7CisgICAgICAgICAgICBmcmVlKCBwSW5mbyApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcEluZm8tPmJtaUhlYWRlci5iaUhlaWdodCAvPSAyOworICAgIH0KKyAgICBlbHNlIGlmIChwSW5mby0+Ym1pSGVhZGVyLmJpU2l6ZSA9PSBzaXplb2YoQklUTUFQQ09SRUhFQURFUikpCisgICAgeworICAgICAgICBCSVRNQVBDT1JFSEVBREVSICpjb3JlID0gKEJJVE1BUENPUkVIRUFERVIgKilwSW5mbzsKKyAgICAgICAgY29yZS0+YmNIZWlnaHQgLz0gMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiQ1VSU09SSUNPTl9Mb2FkOiBVbmtub3duIGJpdG1hcCBsZW5ndGggJWxkIVxuIiwKKyAgICAgICAgICAgICAgICAgcEluZm8tPmJtaUhlYWRlci5iaVNpemUgKTsKKyAgICAgICAgRnJlZVJlc291cmNlKCBoYW5kbGUgKTsKKyAgICAgICAgZnJlZSggcEluZm8gKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogQ3JlYXRlIHRoZSBYT1IgYml0bWFwICovCisKKyAgICBpZiAoIShoZGMgPSBHZXREQyggMCApKSkKKyAgICB7CisgICAgICAgIEZyZWVSZXNvdXJjZSggaGFuZGxlICk7CisgICAgICAgIGZyZWUoIHBJbmZvICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGhYb3JCaXRzID0gQ3JlYXRlRElCaXRtYXAoIGhkYywgJnBJbmZvLT5ibWlIZWFkZXIsIENCTV9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilibWkgKyBzaXplLCBwSW5mbywgRElCX1JHQl9DT0xPUlMgKTsKKworICAgIC8qIEZpeCB0aGUgYml0bWFwIGhlYWRlciB0byBsb2FkIHRoZSBtb25vY2hyb21lIG1hc2sgKi8KKworICAgIGlmIChwSW5mby0+Ym1pSGVhZGVyLmJpU2l6ZSA9PSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpCisgICAgeworICAgICAgICBCSVRNQVBJTkZPSEVBREVSICpiaWggPSAmcEluZm8tPmJtaUhlYWRlcjsKKyAgICAgICAgUkdCUVVBRCAqcmdiID0gcEluZm8tPmJtaUNvbG9yczsKKyAgICAgICAgYml0cyA9IChjaGFyICopYm1pICsgc2l6ZSArCisgICAgICAgICAgICBESUJfR2V0SW1hZ2VXaWR0aEJ5dGVzKGJpaC0+YmlXaWR0aCxiaWgtPmJpQml0Q291bnQpKmJpaC0+YmlIZWlnaHQ7CisgICAgICAgIGJpaC0+YmlCaXRDb3VudCA9IDE7CisgICAgICAgIGJpaC0+YmlDbHJVc2VkID0gYmloLT5iaUNsckltcG9ydGFudCA9IDI7CisgICAgICAgIHJnYlswXS5yZ2JCbHVlID0gcmdiWzBdLnJnYkdyZWVuID0gcmdiWzBdLnJnYlJlZCA9IDB4MDA7CisgICAgICAgIHJnYlsxXS5yZ2JCbHVlID0gcmdiWzFdLnJnYkdyZWVuID0gcmdiWzFdLnJnYlJlZCA9IDB4ZmY7CisgICAgICAgIHJnYlswXS5yZ2JSZXNlcnZlZCA9IHJnYlsxXS5yZ2JSZXNlcnZlZCA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJJVE1BUENPUkVIRUFERVIgKmJjaCA9IChCSVRNQVBDT1JFSEVBREVSICopcEluZm87CisgICAgICAgIFJHQlRSSVBMRSAqcmdiID0gKFJHQlRSSVBMRSAqKShiY2ggKyAxKTsKKyAgICAgICAgYml0cyA9IChjaGFyICopYm1pICsgc2l6ZSArCisgICAgICAgICAgICBESUJfR2V0SW1hZ2VXaWR0aEJ5dGVzKGJjaC0+YmNXaWR0aCxiY2gtPmJjQml0Q291bnQpKmJjaC0+YmNIZWlnaHQ7CisgICAgICAgIGJjaC0+YmNCaXRDb3VudCA9IDE7CisgICAgICAgIHJnYlswXS5yZ2J0Qmx1ZSA9IHJnYlswXS5yZ2J0R3JlZW4gPSByZ2JbMF0ucmdidFJlZCA9IDB4MDA7CisgICAgICAgIHJnYlsxXS5yZ2J0Qmx1ZSA9IHJnYlsxXS5yZ2J0R3JlZW4gPSByZ2JbMV0ucmdidFJlZCA9IDB4ZmY7CisgICAgfQorCisgICAgLyogQ3JlYXRlIHRoZSBBTkQgYml0bWFwICovCisKKyAgICBoQW5kQml0cyA9IENyZWF0ZURJQml0bWFwKCBoZGMsICZwSW5mby0+Ym1pSGVhZGVyLCBDQk1fSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzLCBwSW5mbywgRElCX1JHQl9DT0xPUlMgKTsKKyAgICBSZWxlYXNlREMoIDAsIGhkYyApOworICAgIEZyZWVSZXNvdXJjZSggaGFuZGxlICk7CisKKyAgICAvKiBOb3cgY3JlYXRlIHRoZSBDVVJTT1JJQ09OSU5GTyBzdHJ1Y3R1cmUgKi8KKworICAgIGJtcFhvciA9IChCSVRNQVBPQkogKikgR0RJX0dldE9ialB0ciggaFhvckJpdHMsIEJJVE1BUF9NQUdJQyApOworICAgIGJtcEFuZCA9IChCSVRNQVBPQkogKikgR0RJX0dldE9ialB0ciggaEFuZEJpdHMsIEJJVE1BUF9NQUdJQyApOworICAgIHNpemVYb3IgPSBibXBYb3ItPmJpdG1hcC5ibUhlaWdodCAqIGJtcFhvci0+Yml0bWFwLmJtV2lkdGhCeXRlczsKKyAgICBzaXplQW5kID0gYm1wQW5kLT5iaXRtYXAuYm1IZWlnaHQgKiBibXBBbmQtPmJpdG1hcC5ibVdpZHRoQnl0ZXM7CisKKyAgICBpZiAoIShoYW5kbGUgPSBHbG9iYWxBbGxvYyggR01FTV9NT1ZFQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENVUlNPUklDT05JTkZPKSArIHNpemVYb3IgKyBzaXplQW5kKSkpCisgICAgeworICAgICAgICBEZWxldGVPYmplY3QoIGhYb3JCaXRzICk7CisgICAgICAgIERlbGV0ZU9iamVjdCggaEFuZEJpdHMgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8qIE1ha2UgaXQgb3duZWQgYnkgdGhlIG1vZHVsZSAqLworICAgIEZhclNldE93bmVyKCBoYW5kbGUsIEdldEV4ZVB0ciggaEluc3RhbmNlICkgKTsKKyAgICBpbmZvID0gKENVUlNPUklDT05JTkZPICopR2xvYmFsTG9jayggaGFuZGxlICk7CisgICAgaW5mby0+cHRIb3RTcG90LnggICA9IGhvdHNwb3QueDsKKyAgICBpbmZvLT5wdEhvdFNwb3QueSAgID0gaG90c3BvdC55OworICAgIGluZm8tPm5XaWR0aCAgICAgICAgPSBibXBYb3ItPmJpdG1hcC5ibVdpZHRoOworICAgIGluZm8tPm5IZWlnaHQgICAgICAgPSBibXBYb3ItPmJpdG1hcC5ibUhlaWdodDsKKyAgICBpbmZvLT5uV2lkdGhCeXRlcyAgID0gYm1wWG9yLT5iaXRtYXAuYm1XaWR0aEJ5dGVzOworICAgIGluZm8tPmJQbGFuZXMgICAgICAgPSBibXBYb3ItPmJpdG1hcC5ibVBsYW5lczsKKyAgICBpbmZvLT5iQml0c1BlclBpeGVsID0gYm1wWG9yLT5iaXRtYXAuYm1CaXRzUGl4ZWw7CisKKyAgICAvKiBUcmFuc2ZlciB0aGUgYml0bWFwIGJpdHMgdG8gdGhlIENVUlNPUklDT05JTkZPIHN0cnVjdHVyZSAqLworCisgICAgR2V0Qml0bWFwQml0cyggaEFuZEJpdHMsIHNpemVBbmQsIChjaGFyICopKGluZm8gKyAxKSApOworICAgIEdldEJpdG1hcEJpdHMoIGhYb3JCaXRzLCBzaXplWG9yLCAoY2hhciAqKShpbmZvICsgMSkgKyBzaXplQW5kICk7CisgICAgRGVsZXRlT2JqZWN0KCBoWG9yQml0cyApOworICAgIERlbGV0ZU9iamVjdCggaEFuZEJpdHMgKTsKKyAgICBHbG9iYWxVbmxvY2soIGhhbmRsZSApOworICAgIHJldHVybiBoYW5kbGU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ1VSU09SSUNPTl9Db3B5CisgKgorICogTWFrZSBhIGNvcHkgb2YgYSBjdXJzb3Igb3IgaWNvbi4KKyAqLworc3RhdGljIEhBTkRMRSBDVVJTT1JJQ09OX0NvcHkoIEhBTkRMRSBoSW5zdGFuY2UsIEhBTkRMRSBoYW5kbGUgKQoreworICAgIGNoYXIgKnB0ck9sZCwgKnB0ck5ldzsKKyAgICBpbnQgc2l6ZTsKKyAgICBIQU5ETEUgaE5ldzsKKworICAgIGlmICghKHB0ck9sZCA9IChjaGFyICopR2xvYmFsTG9jayggaGFuZGxlICkpKSByZXR1cm4gMDsKKyAgICBpZiAoIShoSW5zdGFuY2UgPSBHZXRFeGVQdHIoIGhJbnN0YW5jZSApKSkgcmV0dXJuIDA7CisgICAgc2l6ZSA9IEdsb2JhbFNpemUoIGhhbmRsZSApOworICAgIGhOZXcgPSBHbG9iYWxBbGxvYyggR01FTV9NT1ZFQUJMRSwgc2l6ZSApOworICAgIEZhclNldE93bmVyKCBoTmV3LCBoSW5zdGFuY2UgKTsKKyAgICBwdHJOZXcgPSAoY2hhciAqKUdsb2JhbExvY2soIGhOZXcgKTsKKyAgICBtZW1jcHkoIHB0ck5ldywgcHRyT2xkLCBzaXplICk7CisgICAgR2xvYmFsVW5sb2NrKCBoYW5kbGUgKTsKKyAgICBHbG9iYWxVbmxvY2soIGhOZXcgKTsKKyAgICByZXR1cm4gaE5ldzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMb2FkQ3Vyc29yICAgIChVU0VSLjE3MykKKyAqLworSENVUlNPUiBMb2FkQ3Vyc29yKCBIQU5ETEUgaEluc3RhbmNlLCBTRUdQVFIgbmFtZSApCit7CisgICAgaWYgKEhJV09SRChuYW1lKSkKKyAgICAgICAgZHByaW50Zl9jdXJzb3IoIHN0ZGRlYiwgIkxvYWRDdXJzb3I6ICJOUEZNVCIgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwgKGNoYXIgKilQVFJfU0VHX1RPX0xJTiggbmFtZSApICk7CisgICAgZWxzZQorICAgICAgICBkcHJpbnRmX2N1cnNvciggc3RkZGViLCAiTG9hZEN1cnNvcjogIk5QRk1UIiAlMDR4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaEluc3RhbmNlLCBMT1dPUkQobmFtZSkgKTsKKworICAgIHJldHVybiBDVVJTT1JJQ09OX0xvYWQoIGhJbnN0YW5jZSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNNRVRSSUNTX0NYQ1VSU09SLCBTWVNNRVRSSUNTX0NZQ1VSU09SLCAxLCBUUlVFKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMb2FkSWNvbiAgICAoVVNFUi4xNzQpCisgKi8KK0hJQ09OIExvYWRJY29uKCBIQU5ETEUgaEluc3RhbmNlLCBTRUdQVFIgbmFtZSApCit7CisgICAgaWYgKEhJV09SRChuYW1lKSkKKyAgICAgICAgZHByaW50Zl9pY29uKCBzdGRkZWIsICJMb2FkSWNvbjogIk5QRk1UIiAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwgKGNoYXIgKilQVFJfU0VHX1RPX0xJTiggbmFtZSApICk7CisgICAgZWxzZQorICAgICAgICBkcHJpbnRmX2ljb24oIHN0ZGRlYiwgIkxvYWRJY29uOiAiTlBGTVQiICUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgaEluc3RhbmNlLCBMT1dPUkQobmFtZSkgKTsKKworICAgIHJldHVybiBDVVJTT1JJQ09OX0xvYWQoIGhJbnN0YW5jZSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNNRVRSSUNTX0NYSUNPTiwgU1lTTUVUUklDU19DWUlDT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCAxNiwgMSA8PCBzY3JlZW5EZXB0aCApLCBGQUxTRSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENyZWF0ZUN1cnNvciAgICAoVVNFUi40MDYpCisgKi8KK0hJQ09OIENyZWF0ZUN1cnNvciggSEFORExFIGhJbnN0YW5jZSwgSU5UIHhIb3RTcG90LCBJTlQgeUhvdFNwb3QsCisgICAgICAgICAgICAgICAgICAgIElOVCBuV2lkdGgsIElOVCBuSGVpZ2h0LCBMUFNUUiBscEFORGJpdHMsIExQU1RSIGxwWE9SYml0cykKK3sKKyAgICBDVVJTT1JJQ09OSU5GTyBpbmZvID0geyB7IHhIb3RTcG90LCB5SG90U3BvdCB9LCBuV2lkdGgsIG5IZWlnaHQsIDEsIDEgfTsKKworICAgIGRwcmludGZfY3Vyc29yKCBzdGRkZWIsICJDcmVhdGVDdXJzb3I6ICVkeCVkIHNwb3Q9JWQsJWQgeG9yPSVwIGFuZD0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgbldpZHRoLCBuSGVpZ2h0LCB4SG90U3BvdCwgeUhvdFNwb3QsIGxwWE9SYml0cywgbHBBTkRiaXRzKTsKKyAgICByZXR1cm4gQ3JlYXRlQ3Vyc29ySWNvbkluZGlyZWN0KCBoSW5zdGFuY2UsICZpbmZvLCBscEFORGJpdHMsIGxwWE9SYml0cyApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENyZWF0ZUljb24gICAgKFVTRVIuNDA3KQorICovCitISUNPTiBDcmVhdGVJY29uKCBIQU5ETEUgaEluc3RhbmNlLCBJTlQgbldpZHRoLCBJTlQgbkhlaWdodCwgQllURSBiUGxhbmVzLAorICAgICAgICAgICAgICAgICAgQllURSBiQml0c1BpeGVsLCBMUFNUUiBscEFORGJpdHMsIExQU1RSIGxwWE9SYml0cykKK3sKKyAgICBDVVJTT1JJQ09OSU5GTyBpbmZvID0geyB7IDAsIDAgfSwgbldpZHRoLCBuSGVpZ2h0LCBiUGxhbmVzLCBiQml0c1BpeGVsIH07CisKKyAgICBkcHJpbnRmX2ljb24oIHN0ZGRlYiwgIkNyZWF0ZUljb246ICVkeCVkeCVkLCB4b3I9JXAsIGFuZD0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIG5XaWR0aCwgbkhlaWdodCwgYlBsYW5lcyAqIGJCaXRzUGl4ZWwsIGxwWE9SYml0cywgbHBBTkRiaXRzKTsKKyAgICByZXR1cm4gQ3JlYXRlQ3Vyc29ySWNvbkluZGlyZWN0KCBoSW5zdGFuY2UsICZpbmZvLCBscEFORGJpdHMsIGxwWE9SYml0cyApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENyZWF0ZUN1cnNvckljb25JbmRpcmVjdCAgICAoVVNFUi40MDgpCisgKi8KK0hBTkRMRSBDcmVhdGVDdXJzb3JJY29uSW5kaXJlY3QoIEhBTkRMRSBoSW5zdGFuY2UsIENVUlNPUklDT05JTkZPICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgbHBBTkRiaXRzLCBMUFNUUiBscFhPUmJpdHMgKQoreworICAgIEhBTkRMRSBoYW5kbGU7CisgICAgY2hhciAqcHRyOworICAgIGludCBzaXplQW5kLCBzaXplWG9yOworCisgICAgaEluc3RhbmNlID0gR2V0RXhlUHRyKCBoSW5zdGFuY2UgKTsgIC8qIE1ha2UgaXQgYSBtb2R1bGUgaGFuZGxlICovCisgICAgaWYgKCFoSW5zdGFuY2UgfHwgIWxwWE9SYml0cyB8fCAhbHBBTkRiaXRzIHx8IGluZm8tPmJQbGFuZXMgIT0gMSkgcmV0dXJuIDA7CisgICAgaW5mby0+bldpZHRoQnl0ZXMgPSAoaW5mby0+bldpZHRoICogaW5mby0+YkJpdHNQZXJQaXhlbCArIDE1KSAvIDE2ICogMjsKKyAgICBzaXplWG9yID0gaW5mby0+bkhlaWdodCAqIGluZm8tPm5XaWR0aEJ5dGVzOworICAgIHNpemVBbmQgPSBpbmZvLT5uSGVpZ2h0ICogKChpbmZvLT5uV2lkdGggKyAxNSkgLyAxNiAqIDIpOworICAgIGlmICghKGhhbmRsZSA9IERpcmVjdFJlc0FsbG9jKGhJbnN0YW5jZSwgMHgxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ1VSU09SSUNPTklORk8pICsgc2l6ZVhvciArIHNpemVBbmQpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcHRyID0gKGNoYXIgKilHbG9iYWxMb2NrKCBoYW5kbGUgKTsKKyAgICBtZW1jcHkoIHB0ciwgaW5mbywgc2l6ZW9mKCppbmZvKSApOworICAgIG1lbWNweSggcHRyICsgc2l6ZW9mKENVUlNPUklDT05JTkZPKSwgbHBBTkRiaXRzLCBzaXplQW5kICk7CisgICAgbWVtY3B5KCBwdHIgKyBzaXplb2YoQ1VSU09SSUNPTklORk8pICsgc2l6ZUFuZCwgbHBYT1JiaXRzLCBzaXplWG9yICk7CisgICAgR2xvYmFsVW5sb2NrKCBoYW5kbGUgKTsKKyAgICByZXR1cm4gaGFuZGxlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENvcHlJY29uICAgIChVU0VSLjM2OCkKKyAqLworSElDT04gQ29weUljb24oIEhBTkRMRSBoSW5zdGFuY2UsIEhJQ09OIGhJY29uICkKK3sKKyAgICBkcHJpbnRmX2ljb24oIHN0ZGRlYiwgIkNvcHlJY29uOiAlMDR4ICUwNHhcbiIsIGhJbnN0YW5jZSwgaEljb24gKTsKKyAgICByZXR1cm4gQ1VSU09SSUNPTl9Db3B5KCBoSW5zdGFuY2UsIGhJY29uICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ29weUN1cnNvciAgICAoVVNFUi4zNjkpCisgKi8KK0hDVVJTT1IgQ29weUN1cnNvciggSEFORExFIGhJbnN0YW5jZSwgSENVUlNPUiBoQ3Vyc29yICkKK3sKKyAgICBkcHJpbnRmX2N1cnNvciggc3RkZGViLCAiQ29weUN1cnNvcjogJTA0eCAlMDR4XG4iLCBoSW5zdGFuY2UsIGhDdXJzb3IgKTsKKyAgICByZXR1cm4gQ1VSU09SSUNPTl9Db3B5KCBoSW5zdGFuY2UsIGhDdXJzb3IgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBEZXN0cm95SWNvbiAgICAoVVNFUi40NTcpCisgKi8KK0JPT0wgRGVzdHJveUljb24oIEhJQ09OIGhJY29uICkKK3sKKyAgICBkcHJpbnRmX2ljb24oIHN0ZGRlYiwgIkRlc3Ryb3lJY29uOiAlMDR4XG4iLCBoSWNvbiApOworICAgIHJldHVybiBHbG9iYWxGcmVlKCBoSWNvbiApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERlc3Ryb3lDdXJzb3IgICAgKFVTRVIuNDU4KQorICovCitCT09MIERlc3Ryb3lDdXJzb3IoIEhDVVJTT1IgaEN1cnNvciApCit7CisgICAgZHByaW50Zl9jdXJzb3IoIHN0ZGRlYiwgIkRlc3Ryb3lDdXJzb3I6ICUwNHhcbiIsIGhDdXJzb3IgKTsKKyAgICByZXR1cm4gR2xvYmFsRnJlZSggaEN1cnNvciApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERyYXdJY29uICAgIChVU0VSLjg0KQorICovCitCT09MIERyYXdJY29uKCBIREMgaGRjLCBzaG9ydCB4LCBzaG9ydCB5LCBISUNPTiBoSWNvbiApCit7CisgICAgQ1VSU09SSUNPTklORk8gKnB0cjsKKyAgICBIREMgaE1lbURDOworICAgIEhCSVRNQVAgaFhvckJpdHMsIGhBbmRCaXRzOworICAgIENPTE9SUkVGIG9sZEZnLCBvbGRCZzsKKworICAgIGlmICghKHB0ciA9IChDVVJTT1JJQ09OSU5GTyAqKUdsb2JhbExvY2soIGhJY29uICkpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCEoaE1lbURDID0gQ3JlYXRlQ29tcGF0aWJsZURDKCBoZGMgKSkpIHJldHVybiBGQUxTRTsKKyAgICBoQW5kQml0cyA9IENyZWF0ZUJpdG1hcCggcHRyLT5uV2lkdGgsIHB0ci0+bkhlaWdodCwgMSwgMSwgKGNoYXIgKikocHRyKzEpKTsKKyAgICBoWG9yQml0cyA9IENyZWF0ZUJpdG1hcCggcHRyLT5uV2lkdGgsIHB0ci0+bkhlaWdodCwgcHRyLT5iUGxhbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHItPmJCaXRzUGVyUGl4ZWwsIChjaGFyICopKHB0ciArIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHB0ci0+bkhlaWdodCAqICgocHRyLT5uV2lkdGggKyAxNSkgLyAxNiAqIDIpICk7CisgICAgb2xkRmcgPSBTZXRUZXh0Q29sb3IoIGhkYywgUkdCKDAsMCwwKSApOworICAgIG9sZEJnID0gU2V0QmtDb2xvciggaGRjLCBSR0IoMjU1LDI1NSwyNTUpICk7CisKKyAgICBpZiAoaFhvckJpdHMgJiYgaEFuZEJpdHMpCisgICAgeworICAgICAgICBIQklUTUFQIGhCaXRUZW1wID0gU2VsZWN0T2JqZWN0KCBoTWVtREMsIGhBbmRCaXRzICk7CisgICAgICAgIEJpdEJsdCggaGRjLCB4LCB5LCBwdHItPm5XaWR0aCwgcHRyLT5uSGVpZ2h0LCBoTWVtREMsIDAsIDAsIFNSQ0FORCApOworICAgICAgICBTZWxlY3RPYmplY3QoIGhNZW1EQywgaFhvckJpdHMgKTsKKyAgICAgICAgQml0Qmx0KCBoZGMsIHgsIHksIHB0ci0+bldpZHRoLCBwdHItPm5IZWlnaHQsIGhNZW1EQywgMCwgMCwgU1JDSU5WRVJUKTsKKyAgICAgICAgU2VsZWN0T2JqZWN0KCBoTWVtREMsIGhCaXRUZW1wICk7CisgICAgfQorICAgIERlbGV0ZURDKCBoTWVtREMgKTsKKyAgICBpZiAoaFhvckJpdHMpIERlbGV0ZU9iamVjdCggaFhvckJpdHMgKTsKKyAgICBpZiAoaEFuZEJpdHMpIERlbGV0ZU9iamVjdCggaEFuZEJpdHMgKTsKKyAgICBHbG9iYWxVbmxvY2soIGhJY29uICk7CisgICAgU2V0VGV4dENvbG9yKCBoZGMsIG9sZEZnICk7CisgICAgU2V0QmtDb2xvciggaGRjLCBvbGRCZyApOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIER1bXBJY29uICAgIChVU0VSLjQ1OSkKKyAqLworRFdPUkQgRHVtcEljb24oIENVUlNPUklDT05JTkZPICppbmZvLCBXT1JEICpscExlbiwKKyAgICAgICAgICAgICAgICBMUFNUUiAqbHBYb3JCaXRzLCBMUFNUUiAqbHBBbmRCaXRzICkKK3sKKyAgICBpbnQgc2l6ZUFuZCwgc2l6ZVhvcjsKKworICAgIGlmICghaW5mbykgcmV0dXJuIDA7CisgICAgc2l6ZVhvciA9IGluZm8tPm5IZWlnaHQgKiBpbmZvLT5uV2lkdGhCeXRlczsKKyAgICBzaXplQW5kID0gaW5mby0+bkhlaWdodCAqICgoaW5mby0+bldpZHRoICsgMTUpIC8gMTYgKiAyKTsKKyAgICBpZiAobHBBbmRCaXRzKSAqbHBBbmRCaXRzID0gKExQU1RSKShpbmZvICsgMSk7CisgICAgaWYgKGxwWG9yQml0cykgKmxwWG9yQml0cyA9IChMUFNUUikoaW5mbyArIDEpICsgc2l6ZUFuZDsKKyAgICBpZiAobHBMZW4pICpscExlbiA9IHNpemVvZihDVVJTT1JJQ09OSU5GTykgKyBzaXplQW5kICsgc2l6ZVhvcjsKKyAgICByZXR1cm4gTUFLRUxPTkcoIHNpemVYb3IsIHNpemVYb3IgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDVVJTT1JJQ09OX1NldEN1cnNvcgorICoKKyAqIENoYW5nZSB0aGUgWCBjdXJzb3IuIEhlbHBlciBmdW5jdGlvbiBmb3IgU2V0Q3Vyc29yKCkgYW5kIFNob3dDdXJzb3IoKS4KKyAqLworc3RhdGljIEJPT0wgQ1VSU09SSUNPTl9TZXRDdXJzb3IoIEhDVVJTT1IgaEN1cnNvciApCit7CisgICAgUGl4bWFwIHBpeG1hcEJpdHMsIHBpeG1hcE1hc2ssIHBpeG1hcEFsbDsKKyAgICBYQ29sb3IgZmcsIGJnOworICAgIEN1cnNvciBjdXJzb3IgPSBOb25lOworCisgICAgaWYgKCFoQ3Vyc29yKSAgLyogQ3JlYXRlIGFuIGVtcHR5IGN1cnNvciAqLworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZGF0YVtdID0geyAwIH07CisKKyAgICAgICAgYmcucmVkID0gYmcuZ3JlZW4gPSBiZy5ibHVlID0gMHgwMDAwOworICAgICAgICBwaXhtYXBCaXRzID0gWENyZWF0ZUJpdG1hcEZyb21EYXRhKCBkaXNwbGF5LCByb290V2luZG93LCBkYXRhLCAxLCAxICk7CisgICAgICAgIGlmIChwaXhtYXBCaXRzKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJzb3IgPSBYQ3JlYXRlUGl4bWFwQ3Vyc29yKCBkaXNwbGF5LCBwaXhtYXBCaXRzLCBwaXhtYXBCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJnLCAmYmcsIDAsIDAgKTsKKyAgICAgICAgICAgIFhGcmVlUGl4bWFwKCBkaXNwbGF5LCBwaXhtYXBCaXRzICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgLyogQ3JlYXRlIHRoZSBYIGN1cnNvciBmcm9tIHRoZSBiaXRzICovCisgICAgeworICAgICAgICBDVVJTT1JJQ09OSU5GTyAqcHRyOworICAgICAgICBYSW1hZ2UgKmltYWdlOworCisgICAgICAgIGlmICghKHB0ciA9IChDVVJTT1JJQ09OSU5GTyopR2xvYmFsTG9jayggaEN1cnNvciApKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAocHRyLT5iUGxhbmVzICogcHRyLT5iQml0c1BlclBpeGVsICE9IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkN1cnNvciAlMDR4IGhhcyBtb3JlIHRoYW4gMSBicHAhXG4iLCBoQ3Vyc29yICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAvKiBDcmVhdGUgYSBwaXhtYXAgYW5kIHRyYW5zZmVyIGFsbCB0aGUgYml0cyB0byBpdCAqLworCisgICAgICAgIHBpeG1hcEFsbCA9IFhDcmVhdGVQaXhtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+bldpZHRoLCBwdHItPm5IZWlnaHQgKiAyLCAxICk7CisgICAgICAgIGltYWdlID0gWENyZWF0ZUltYWdlKCBkaXNwbGF5LCBEZWZhdWx0VmlzdWFsT2ZTY3JlZW4oc2NyZWVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIFpQaXhtYXAsIDAsIChjaGFyICopKHB0ciArIDEpLCBwdHItPm5XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+bkhlaWdodCAqIDIsIDE2LCBwdHItPm5XaWR0aEJ5dGVzKTsKKyAgICAgICAgaWYgKGltYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBleHRlcm4gdm9pZCBfWEluaXRJbWFnZUZ1bmNQdHJzKCBYSW1hZ2UqICk7CisgICAgICAgICAgICBpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0OworICAgICAgICAgICAgaW1hZ2UtPmJpdG1hcF9iaXRfb3JkZXIgPSBNU0JGaXJzdDsKKyAgICAgICAgICAgIGltYWdlLT5iaXRtYXBfdW5pdCA9IDE2OworICAgICAgICAgICAgX1hJbml0SW1hZ2VGdW5jUHRycyhpbWFnZSk7CisgICAgICAgICAgICBpZiAocGl4bWFwQWxsKQorICAgICAgICAgICAgICAgIENhbGxUbzMyX0xhcmdlU3RhY2soIFhQdXRJbWFnZSwgMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwgcGl4bWFwQWxsLCBCSVRNQVBfbW9ub0dDLCBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCBwdHItPm5XaWR0aCwgcHRyLT5uSGVpZ2h0KjIgKTsKKyAgICAgICAgICAgIGltYWdlLT5kYXRhID0gTlVMTDsKKyAgICAgICAgICAgIFhEZXN0cm95SW1hZ2UoIGltYWdlICk7CisgICAgICAgIH0KKworICAgICAgICAvKiBOb3cgY3JlYXRlIHRoZSAyIHBpeG1hcHMgZm9yIGJpdHMgYW5kIG1hc2sgKi8KKworICAgICAgICBwaXhtYXBCaXRzID0gWENyZWF0ZVBpeG1hcCggZGlzcGxheSwgcm9vdFdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+bldpZHRoLCBwdHItPm5IZWlnaHQsIDEgKTsKKyAgICAgICAgcGl4bWFwTWFzayA9IFhDcmVhdGVQaXhtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHItPm5XaWR0aCwgcHRyLT5uSGVpZ2h0LCAxICk7CisKKyAgICAgICAgLyogTWFrZSBzdXJlIGV2ZXJ5dGhpbmcgd2VudCBPSyBzbyBmYXIgKi8KKworICAgICAgICBpZiAocGl4bWFwQml0cyAmJiBwaXhtYXBNYXNrICYmIHBpeG1hcEFsbCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogV2UgaGF2ZSB0byBkbyBzb21lIG1hZ2ljIGhlcmUsIGFzIGN1cnNvcnMgYXJlIG5vdCBmdWxseQorICAgICAgICAgICAgICogY29tcGF0aWJsZSBiZXR3ZWVuIFdpbmRvd3MgYW5kIFgxMS4gVW5kZXIgWDExLCB0aGVyZQorICAgICAgICAgICAgICogYXJlIG9ubHkgMyBwb3NzaWJsZSBjb2xvciBjdXJzb3I6IGJsYWNrLCB3aGl0ZSBhbmQKKyAgICAgICAgICAgICAqIG1hc2tlZC4gU28gd2UgbWFwIHRoZSA0dGggV2luZG93cyBjb2xvciAoaW52ZXJ0IHRoZQorICAgICAgICAgICAgICogYml0cyBvbiB0aGUgc2NyZWVuKSB0byBibGFjay4gVGhpcyByZXF1aXJlIHNvbWUgYm9vbGVhbgorICAgICAgICAgICAgICogYXJpdGhtZXRpYzoKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiAgIFdpbmRvd3MgICAgICAgICAgICAgICAgICAgICAgICBYMTEKKyAgICAgICAgICAgICAqIFhvciAgICBBbmQgICAgICBSZXN1bHQgICAgICBCaXRzICAgICBNYXNrCisgICAgICAgICAgICAgKiAgMCAgICAgIDAgICAgIGJsYWNrICAgICAgICAgIDAgICAgICAgIDEKKyAgICAgICAgICAgICAqICAwICAgICAgMSAgICAgbm8gY2hhbmdlICAgICAgWCAgICAgICAgMAorICAgICAgICAgICAgICogIDEgICAgICAwICAgICB3aGl0ZSAgICAgICAgICAxICAgICAgICAxCisgICAgICAgICAgICAgKiAgMSAgICAgIDEgICAgIGludmVydGVkICAgICAgIDAgICAgICAgIDEgICg9YmxhY2spCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogd2hpY2ggZ2l2ZXM6CisgICAgICAgICAgICAgKiAgQml0cyA9ICdYb3InIHhvciAnQW5kJworICAgICAgICAgICAgICogIE1hc2sgPSAnWG9yJyBvciBub3QgJ0FuZCcKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgWENvcHlBcmVhKCBkaXNwbGF5LCBwaXhtYXBBbGwsIHBpeG1hcEJpdHMsIEJJVE1BUF9tb25vR0MsCisgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIHB0ci0+bldpZHRoLCBwdHItPm5IZWlnaHQsIDAsIDAgKTsKKyAgICAgICAgICAgIFhDb3B5QXJlYSggZGlzcGxheSwgcGl4bWFwQWxsLCBwaXhtYXBNYXNrLCBCSVRNQVBfbW9ub0dDLAorICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBwdHItPm5XaWR0aCwgcHRyLT5uSGVpZ2h0LCAwLCAwICk7CisgICAgICAgICAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIEJJVE1BUF9tb25vR0MsIEdYeG9yICk7CisgICAgICAgICAgICBYQ29weUFyZWEoIGRpc3BsYXksIHBpeG1hcEFsbCwgcGl4bWFwQml0cywgQklUTUFQX21vbm9HQywKKyAgICAgICAgICAgICAgICAgICAgICAgMCwgcHRyLT5uSGVpZ2h0LCBwdHItPm5XaWR0aCwgcHRyLT5uSGVpZ2h0LCAwLCAwICk7CisgICAgICAgICAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIEJJVE1BUF9tb25vR0MsIEdYb3JSZXZlcnNlICk7CisgICAgICAgICAgICBYQ29weUFyZWEoIGRpc3BsYXksIHBpeG1hcEFsbCwgcGl4bWFwTWFzaywgQklUTUFQX21vbm9HQywKKyAgICAgICAgICAgICAgICAgICAgICAgMCwgcHRyLT5uSGVpZ2h0LCBwdHItPm5XaWR0aCwgcHRyLT5uSGVpZ2h0LCAwLCAwICk7CisgICAgICAgICAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIEJJVE1BUF9tb25vR0MsIEdYY29weSApOworICAgICAgICAgICAgZmcucmVkID0gZmcuZ3JlZW4gPSBmZy5ibHVlID0gMHhmZmZmOworICAgICAgICAgICAgYmcucmVkID0gYmcuZ3JlZW4gPSBiZy5ibHVlID0gMHgwMDAwOworICAgICAgICAgICAgY3Vyc29yID0gWENyZWF0ZVBpeG1hcEN1cnNvciggZGlzcGxheSwgcGl4bWFwQml0cywgcGl4bWFwTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZnLCAmYmcsIHB0ci0+cHRIb3RTcG90LngsIHB0ci0+cHRIb3RTcG90LnkgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE5vdyBmcmVlIGV2ZXJ5dGhpbmcgKi8KKworICAgICAgICBpZiAocGl4bWFwQWxsKSBYRnJlZVBpeG1hcCggZGlzcGxheSwgcGl4bWFwQWxsICk7CisgICAgICAgIGlmIChwaXhtYXBCaXRzKSBYRnJlZVBpeG1hcCggZGlzcGxheSwgcGl4bWFwQml0cyApOworICAgICAgICBpZiAocGl4bWFwTWFzaykgWEZyZWVQaXhtYXAoIGRpc3BsYXksIHBpeG1hcE1hc2sgKTsKKyAgICAgICAgR2xvYmFsVW5sb2NrKCBoQ3Vyc29yICk7CisgICAgfQorCisgICAgaWYgKGN1cnNvciA9PSBOb25lKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKENVUlNPUklDT05fWEN1cnNvciAhPSBOb25lKSBYRnJlZUN1cnNvciggZGlzcGxheSwgQ1VSU09SSUNPTl9YQ3Vyc29yICk7CisgICAgQ1VSU09SSUNPTl9YQ3Vyc29yID0gY3Vyc29yOworCisgICAgaWYgKHJvb3RXaW5kb3cgIT0gRGVmYXVsdFJvb3RXaW5kb3coZGlzcGxheSkpCisgICAgeworICAgICAgICAvKiBTZXQgdGhlIGN1cnNvciBvbiB0aGUgZGVza3RvcCB3aW5kb3cgKi8KKyAgICAgICAgWERlZmluZUN1cnNvciggZGlzcGxheSwgcm9vdFdpbmRvdywgY3Vyc29yICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFNldCB0aGUgc2FtZSBjdXJzb3IgZm9yIGFsbCB0b3AtbGV2ZWwgd2luZG93cyAqLworICAgICAgICBIV05EIGh3bmQgPSBHZXRXaW5kb3coIEdldERlc2t0b3BXaW5kb3coKSwgR1dfQ0hJTEQgKTsKKyAgICAgICAgd2hpbGUoaHduZCkKKyAgICAgICAgeworICAgICAgICAgICAgV2luZG93IHdpbiA9IFdJTl9HZXRYV2luZG93KCBod25kICk7CisgICAgICAgICAgICBpZiAod2luKSBYRGVmaW5lQ3Vyc29yKCBkaXNwbGF5LCB3aW4sIGN1cnNvciApOworICAgICAgICAgICAgaHduZCA9IEdldFdpbmRvdyggaHduZCwgR1dfSFdORE5FWFQgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZXRDdXJzb3IgICAgKFVTRVIuNjkpCisgKi8KK0hDVVJTT1IgU2V0Q3Vyc29yKCBIQ1VSU09SIGhDdXJzb3IgKQoreworICAgIEhDVVJTT1IgaE9sZEN1cnNvcjsKKworICAgIGlmIChoQ3Vyc29yID09IGhBY3RpdmVDdXJzb3IpIHJldHVybiBoQWN0aXZlQ3Vyc29yOyAgLyogTm8gY2hhbmdlICovCisgICAgZHByaW50Zl9jdXJzb3IoIHN0ZGRlYiwgIlNldEN1cnNvcjogJTA0eFxuIiwgaEN1cnNvciApOworICAgIGhPbGRDdXJzb3IgPSBoQWN0aXZlQ3Vyc29yOworICAgIGhBY3RpdmVDdXJzb3IgPSBoQ3Vyc29yOworICAgIC8qIENoYW5nZSB0aGUgY3Vyc29yIHNoYXBlIG9ubHkgaWYgaXQgaXMgdmlzaWJsZSAqLworICAgIGlmIChDVVJTT1JfU2hvd0NvdW50ID49IDApIENVUlNPUklDT05fU2V0Q3Vyc29yKCBoQWN0aXZlQ3Vyc29yICk7CisgICAgcmV0dXJuIGhPbGRDdXJzb3I7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0Q3Vyc29yUG9zICAgIChVU0VSLjcwKQorICovCit2b2lkIFNldEN1cnNvclBvcyggc2hvcnQgeCwgc2hvcnQgeSApCit7CisgICAgZHByaW50Zl9jdXJzb3IoIHN0ZGRlYiwgIlNldEN1cnNvclBvczogeD0lZCB5PSVkXG4iLCB4LCB5ICk7CisgICAgWFdhcnBQb2ludGVyKCBkaXNwbGF5LCBOb25lLCByb290V2luZG93LCAwLCAwLCAwLCAwLCB4LCB5ICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2hvd0N1cnNvciAgICAoVVNFUi43MSkKKyAqLworaW50IFNob3dDdXJzb3IoIEJPT0wgYlNob3cgKQoreworICAgIGRwcmludGZfY3Vyc29yKCBzdGRkZWIsICJTaG93Q3Vyc29yOiAlZCwgY291bnQ9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGJTaG93LCBDVVJTT1JfU2hvd0NvdW50ICk7CisKKyAgICBpZiAoYlNob3cpCisgICAgeworICAgICAgICBpZiAoKytDVVJTT1JfU2hvd0NvdW50ID09IDApCisgICAgICAgICAgICBDVVJTT1JJQ09OX1NldEN1cnNvciggaEFjdGl2ZUN1cnNvciApOyAgLyogU2hvdyBpdCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoLS1DVVJTT1JfU2hvd0NvdW50ID09IC0xKQorICAgICAgICAgICAgQ1VSU09SSUNPTl9TZXRDdXJzb3IoIDAgKTsgIC8qIEhpZGUgaXQgKi8KKyAgICB9CisgICAgcmV0dXJuIENVUlNPUl9TaG93Q291bnQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0Q3Vyc29yICAgIChVU0VSLjI0NykKKyAqLworSENVUlNPUiBHZXRDdXJzb3Iodm9pZCkKK3sKKyAgICByZXR1cm4gaEFjdGl2ZUN1cnNvcjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDbGlwQ3Vyc29yICAgIChVU0VSLjE2KQorICovCit2b2lkIENsaXBDdXJzb3IoIFJFQ1QgKnJlY3QgKQoreworICAgIGlmICghcmVjdCkgU2V0UmVjdEVtcHR5KCAmQ1VSU09SX0NsaXBSZWN0ICk7CisgICAgZWxzZSBDb3B5UmVjdCggJkNVUlNPUl9DbGlwUmVjdCwgcmVjdCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldEN1cnNvclBvcyAgICAoVVNFUi4xNykKKyAqLwordm9pZCBHZXRDdXJzb3JQb3MoIFBPSU5UICpwdCApCit7CisgICAgV2luZG93IHJvb3QsIGNoaWxkOworICAgIGludCByb290WCwgcm9vdFksIGNoaWxkWCwgY2hpbGRZOworICAgIHVuc2lnbmVkIGludCBtb3VzZWJ1dDsKKworICAgIGlmICghcHQpIHJldHVybjsKKyAgICBpZiAoIVhRdWVyeVBvaW50ZXIoIGRpc3BsYXksIHJvb3RXaW5kb3csICZyb290LCAmY2hpbGQsCisJCSAgICAgICAgJnJvb3RYLCAmcm9vdFksICZjaGlsZFgsICZjaGlsZFksICZtb3VzZWJ1dCApKQorCXB0LT54ID0gcHQtPnkgPSAwOworICAgIGVsc2UKKyAgICB7CisJcHQtPnggPSByb290WCArIGRlc2t0b3BYOworCXB0LT55ID0gcm9vdFkgKyBkZXNrdG9wWTsKKyAgICB9CisgICAgZHByaW50Zl9jdXJzb3Ioc3RkZGViLCAiR2V0Q3Vyc29yUG9zOiByZXQ9JWQsJWRcbiIsIHB0LT54LCBwdC0+eSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldENsaXBDdXJzb3IgICAgKFVTRVIuMzA5KQorICovCit2b2lkIEdldENsaXBDdXJzb3IoIFJFQ1QgKnJlY3QgKQoreworICAgIGlmIChyZWN0KSBDb3B5UmVjdCggcmVjdCwgJkNVUlNPUl9DbGlwUmVjdCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgR2V0SWNvbklEICAgIChVU0VSLjQ1NSkKKyAqLworV09SRCBHZXRJY29uSUQoIEhBTkRMRSBoUmVzb3VyY2UsIERXT1JEIHJlc1R5cGUgKQoreworICAgIGZwcmludGYoIHN0ZGVyciwgIkdldEljb25JZCglMDR4LCVsZCk6IGVtcHR5IHN0dWIhXG4iLAorICAgICAgICAgICAgIGhSZXNvdXJjZSwgcmVzVHlwZSApOworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgTG9hZEljb25IYW5kbGVyICAgIChVU0VSLjQ1NikKKyAqLworSElDT04gTG9hZEljb25IYW5kbGVyKCBIQU5ETEUgaFJlc291cmNlLCBCT09MIGJOZXcgKQoreworICAgIGZwcmludGYoIHN0ZGVyciwgIkxvYWRJY29uSGFuZGxlKCUwNHgsJWQpOiBlbXB0eSBzdHViIVxuIiwKKyAgICAgICAgICAgICBoUmVzb3VyY2UsIGJOZXcgKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29iamVjdHMvZGMuYyBiL29iamVjdHMvZGMuYwppbmRleCA1YTc0YWQyLi43ZGJkNjhlIDEwMDY0NAotLS0gYS9vYmplY3RzL2RjLmMKKysrIGIvb2JqZWN0cy9kYy5jCkBAIC0zMzIsNyArMzMyLDcgQEAKICAgICBpZiAoIShoYW5kbGUgPSBHRElfQWxsb2NPYmplY3QoIHNpemVvZihEQyksIERDX01BR0lDICkpKSByZXR1cm4gMDsKICAgICBuZXdkYyA9IChEQyAqKSBHRElfSEVBUF9MSU5fQUREUiggaGFuZGxlICk7CiAKLSAgICBkcHJpbnRmX2RjKHN0ZGRlYiwgIkdldERDU3RhdGUoJWQpOiByZXR1cm5pbmcgJWRcbiIsIGhkYywgaGFuZGxlICk7CisgICAgZHByaW50Zl9kYyhzdGRkZWIsICJHZXREQ1N0YXRlKCJOUEZNVCIpOiByZXR1cm5pbmcgIk5QRk1UIlxuIiwgaGRjLCBoYW5kbGUgKTsKIAogICAgIG1lbXNldCggJm5ld2RjLT51LngsIDAsIHNpemVvZihuZXdkYy0+dS54KSApOwogICAgIG1lbWNweSggJm5ld2RjLT53LCAmZGMtPncsIHNpemVvZihkYy0+dykgKTsKQEAgLTM2NSw3ICszNjUsNyBAQAogICAgIGlmICghKGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKSkpIHJldHVybjsKICAgICBpZiAoIShkY3MgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjcywgRENfTUFHSUMgKSkpIHJldHVybjsKICAgICBpZiAoIWRjcy0+dy5mbGFncyAmIERDX1NBVkVEKSByZXR1cm47Ci0gICAgZHByaW50Zl9kYyhzdGRkZWIsICJTZXREQ1N0YXRlOiAlZCAlZFxuIiwgaGRjLCBoZGNzICk7CisgICAgZHByaW50Zl9kYyhzdGRkZWIsICJTZXREQ1N0YXRlOiAiTlBGTVQiICJOUEZNVCJcbiIsIGhkYywgaGRjcyApOwogCiAgICAgICAvKiBTYXZlIHRoZSByZWdpb25zIGJlZm9yZSBvdmVyd3JpdGluZyBldmVyeXRoaW5nICovCiAgICAgaFZpc1JnbiAgICA9IGRjLT53LmhWaXNSZ247CkBAIC00MDksNyArNDA5LDcgQEAKICAgICBkY3MgPSAoREMgKikgR0RJX0hFQVBfTElOX0FERFIoIGhkY3MgKTsKICAgICBkY3MtPmhlYWRlci5oTmV4dCA9IGRjLT5oZWFkZXIuaE5leHQ7CiAgICAgZGMtPmhlYWRlci5oTmV4dCA9IGhkY3M7Ci0gICAgZHByaW50Zl9kYyhzdGRkZWIsICJTYXZlREMoJWQpOiByZXR1cm5pbmcgJWRcbiIsIGhkYywgZGMtPnNhdmVMZXZlbCsxICk7CisgICAgZHByaW50Zl9kYyhzdGRkZWIsICJTYXZlREMoIk5QRk1UIik6IHJldHVybmluZyAlZFxuIiwgaGRjLCBkYy0+c2F2ZUxldmVsKzEgKTsKICAgICByZXR1cm4gKytkYy0+c2F2ZUxldmVsOwogfQogCkBAIC00MjEsNyArNDIxLDcgQEAKIHsKICAgICBEQyAqIGRjLCAqIGRjczsKIAotICAgIGRwcmludGZfZGMoc3RkZGViLCAiUmVzdG9yZURDOiAlZCAlZFxuIiwgaGRjLCBsZXZlbCApOworICAgIGRwcmludGZfZGMoc3RkZGViLCAiUmVzdG9yZURDOiAiTlBGTVQiICVkXG4iLCBoZGMsIGxldmVsICk7CiAgICAgZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIAogICAgIHsKQEAgLTQ1OCw3ICs0NTgsNyBAQAogICAgIGlmICghaGFuZGxlKSByZXR1cm4gMDsKICAgICBkYyA9IChEQyAqKSBHRElfSEVBUF9MSU5fQUREUiggaGFuZGxlICk7CiAKLSAgICBkcHJpbnRmX2RjKHN0ZGRlYiwgIkNyZWF0ZURDKCVzICVzICVzKTogcmV0dXJuaW5nICVkXG4iLCAKKyAgICBkcHJpbnRmX2RjKHN0ZGRlYiwgIkNyZWF0ZURDKCVzICVzICVzKTogcmV0dXJuaW5nICJOUEZNVCJcbiIsCiAJICAgIGRyaXZlciwgZGV2aWNlLCBvdXRwdXQsIGhhbmRsZSApOwogCiAgICAgaWYgKCFkaXNwbGF5RGV2Q2FwcykKQEAgLTUxNCw3ICs1MTQsNyBAQAogICAgIGlmICghaGFuZGxlKSByZXR1cm4gMDsKICAgICBkYyA9IChEQyAqKSBHRElfSEVBUF9MSU5fQUREUiggaGFuZGxlICk7CiAKLSAgICBkcHJpbnRmX2RjKHN0ZGRlYiwgIkNyZWF0ZUNvbXBhdGlibGVEQyglZCk6IHJldHVybmluZyAlZFxuIiwgaGRjLCBoYW5kbGUgKTsKKyAgICBkcHJpbnRmX2RjKHN0ZGRlYiwgIkNyZWF0ZUNvbXBhdGlibGVEQygiTlBGTVQiKTogcmV0dXJuaW5nICJOUEZNVCJcbiIsIGhkYywgaGFuZGxlICk7CiAKICAgICAgIC8qIENyZWF0ZSBkZWZhdWx0IGJpdG1hcCAqLwogICAgIGlmICghKGhiaXRtYXAgPSBDcmVhdGVCaXRtYXAoIDEsIDEsIDEsIDEsIE5VTEwgKSkpCkBAIC01NTgsNyArNTU4LDcgQEAKICAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKICAgICBpZiAoIWRjKSByZXR1cm4gRkFMU0U7CiAKLSAgICBkcHJpbnRmX2RjKHN0ZGRlYiwgIkRlbGV0ZURDOiAlZFxuIiwgaGRjICk7CisgICAgZHByaW50Zl9kYyhzdGRkZWIsICJEZWxldGVEQzogIk5QRk1UIlxuIiwgaGRjICk7CiAKICAgICB3aGlsZSAoZGMtPnNhdmVMZXZlbCkKICAgICB7CkBAIC01ODgsNiArNTg4LDE2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUmVzZXREQyAgICAoR0RJLjM3NikKKyAqLworSERDIFJlc2V0REMoIEhEQyBoZGMsIC8qIERFVk1PREUgKi8gdm9pZCAqZGV2bW9kZSApCit7CisgICAgZnByaW50Ziggc3RkZXJyLCAiUmVzZXREQzogZW1wdHkgc3R1YiFcbiIgKTsKKyAgICByZXR1cm4gaGRjOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldERldmljZUNhcHMgICAgKEdESS44MCkKICAqLwogaW50IEdldERldmljZUNhcHMoIEhEQyBoZGMsIFdPUkQgY2FwICkKQEAgLTU5Nyw3ICs2MDcsNyBAQAogCiAgICAgaWYgKGNhcCA+IHNpemVvZihEZXZpY2VDYXBzKS1zaXplb2YoV09SRCkpIHJldHVybiAwOwogICAgIAotICAgIGRwcmludGZfZGMoc3RkZGViLCAiR2V0RGV2aWNlQ2FwcyglZCwlZCk6IHJldHVybmluZyAlZFxuIiwKKyAgICBkcHJpbnRmX2RjKHN0ZGRlYiwgIkdldERldmljZUNhcHMoIk5QRk1UIiwlZCk6IHJldHVybmluZyAlZFxuIiwKIAkgICAgaGRjLCBjYXAsICooV09SRCAqKSgoKGNoYXIgKilkYy0+dy5kZXZDYXBzKSArIGNhcCkgKTsKICAgICByZXR1cm4gKihXT1JEICopKCgoY2hhciAqKWRjLT53LmRldkNhcHMpICsgY2FwKTsKIH0KZGlmZiAtLWdpdCBhL29iamVjdHMvZGliLmMgYi9vYmplY3RzL2RpYi5jCmluZGV4IGM5NzYxODAuLjEwODJiNzQgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZGliLmMKKysrIGIvb2JqZWN0cy9kaWIuYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgImJpdG1hcC5oIgogI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAicGFsZXR0ZS5oIgotI2luY2x1ZGUgImljb24uaCIKICNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJjb2xvci5oIgpAQCAtNTEsMTQgKzUwLDIzIEBACiAgKi8KIGludCBESUJfQml0bWFwSW5mb1NpemUoIEJJVE1BUElORk8gKiBpbmZvLCBXT1JEIGNvbG9ydXNlICkKIHsKLSAgICBpbnQgc2l6ZSA9IGluZm8tPmJtaUhlYWRlci5iaUNsclVzZWQ7Ci0gICAgaWYgKCFzaXplICYmIChpbmZvLT5ibWlIZWFkZXIuYmlCaXRDb3VudCAhPSAyNCkpCi0Jc2l6ZSA9IDEgPDwgaW5mby0+Ym1pSGVhZGVyLmJpQml0Q291bnQ7Ci0gICAgaWYgKGNvbG9ydXNlID09IERJQl9SR0JfQ09MT1JTKSAKLQlzaXplID0gaW5mby0+Ym1pSGVhZGVyLmJpU2l6ZSArIHNpemUgKiBzaXplb2YoUkdCUVVBRCk7Ci0gICAgZWxzZQotCXNpemUgPSBpbmZvLT5ibWlIZWFkZXIuYmlTaXplICsgc2l6ZSAqIHNpemVvZihXT1JEKTsKLSAgICByZXR1cm4gc2l6ZTsKKyAgICBpbnQgY29sb3JzOworCisgICAgaWYgKGluZm8tPmJtaUhlYWRlci5iaVNpemUgPT0gc2l6ZW9mKEJJVE1BUENPUkVIRUFERVIpKQorICAgIHsKKyAgICAgICAgQklUTUFQQ09SRUhFQURFUiAqY29yZSA9IChCSVRNQVBDT1JFSEVBREVSICopaW5mbzsKKyAgICAgICAgY29sb3JzID0gKGNvcmUtPmJjQml0Q291bnQgIT0gMjQpID8gMSA8PCBjb3JlLT5iY0JpdENvdW50IDogMDsKKyAgICAgICAgcmV0dXJuIHNpemVvZihCSVRNQVBDT1JFSEVBREVSKSArIGNvbG9ycyAqCisgICAgICAgICAgICAgKChjb2xvcnVzZSA9PSBESUJfUkdCX0NPTE9SUykgPyBzaXplb2YoUkdCVFJJUExFKSA6IHNpemVvZihXT1JEKSk7CisgICAgfQorICAgIGVsc2UgIC8qIGFzc3VtZSBCSVRNQVBJTkZPSEVBREVSICovCisgICAgeworICAgICAgICBjb2xvcnMgPSBpbmZvLT5ibWlIZWFkZXIuYmlDbHJVc2VkOworICAgICAgICBpZiAoIWNvbG9ycyAmJiAoaW5mby0+Ym1pSGVhZGVyLmJpQml0Q291bnQgIT0gMjQpKQorICAgICAgICAgICAgY29sb3JzID0gMSA8PCBpbmZvLT5ibWlIZWFkZXIuYmlCaXRDb3VudDsKKyAgICAgICAgcmV0dXJuIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSArIGNvbG9ycyAqCisgICAgICAgICAgICAgICAoKGNvbG9ydXNlID09IERJQl9SR0JfQ09MT1JTKSA/IHNpemVvZihSR0JRVUFEKSA6IHNpemVvZihXT1JEKSk7CisgICAgfQogfQogCiAKQEAgLTg2LDYgKzk0LDEwMyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERJQl9HZXRCaXRtYXBJbmZvCisgKgorICogR2V0IHRoZSBpbmZvIGZyb20gYSBiaXRtYXAgaGVhZGVyLgorICogUmV0dXJuIDEgZm9yIElORk9IRUFERVIsIDAgZm9yIENPUkVIRUFERVIsIC0xIGZvciBlcnJvci4KKyAqLworc3RhdGljIGludCBESUJfR2V0Qml0bWFwSW5mbyggQklUTUFQSU5GT0hFQURFUiAqaGVhZGVyLCBEV09SRCAqd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqaGVpZ2h0LCBXT1JEICpicHAgKQoreworICAgIGlmIChoZWFkZXItPmJpU2l6ZSA9PSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpCisgICAgeworICAgICAgICAqd2lkdGggID0gaGVhZGVyLT5iaVdpZHRoOworICAgICAgICAqaGVpZ2h0ID0gaGVhZGVyLT5iaUhlaWdodDsKKyAgICAgICAgKmJwcCAgICA9IGhlYWRlci0+YmlCaXRDb3VudDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChoZWFkZXItPmJpU2l6ZSA9PSBzaXplb2YoQklUTUFQQ09SRUhFQURFUikpCisgICAgeworICAgICAgICBCSVRNQVBDT1JFSEVBREVSICpjb3JlID0gKEJJVE1BUENPUkVIRUFERVIgKiloZWFkZXI7CisgICAgICAgICp3aWR0aCAgPSBjb3JlLT5iY1dpZHRoOworICAgICAgICAqaGVpZ2h0ID0gY29yZS0+YmNIZWlnaHQ7CisgICAgICAgICpicHAgICAgPSBjb3JlLT5iY0JpdENvdW50OworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZnByaW50Ziggc3RkZXJyLCAiRElCX0dldEJpdG1hcEluZm86IHdyb25nIHNpemUgKCVsZCkgZm9yIGhlYWRlclxuIiwKKyAgICAgICAgICAgICBoZWFkZXItPmJpU2l6ZSApOworICAgIHJldHVybiAtMTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBESUJfQnVpbGRDb2xvck1hcAorICoKKyAqIEJ1aWxkIHRoZSBjb2xvciBtYXAgZnJvbSB0aGUgYml0bWFwIHBhbGV0dGUuIFNob3VsZCBub3QgYmUgY2FsbGVkCisgKiBmb3IgYSAyNC1iaXQgZGVlcCBiaXRtYXAuCisgKi8KK3N0YXRpYyBpbnQgKkRJQl9CdWlsZENvbG9yTWFwKCBEQyAqZGMsIFdPUkQgY29sb3J1c2UsIFdPUkQgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTUFQSU5GTyAqaW5mbyApCit7CisgICAgaW50IGksIGNvbG9yczsKKyAgICBCT09MIGlzSW5mbzsKKyAgICBXT1JEICpjb2xvclB0cjsKKyAgICBpbnQgKmNvbG9yTWFwcGluZzsKKworICAgIGlmICgoaXNJbmZvID0gKGluZm8tPmJtaUhlYWRlci5iaVNpemUgPT0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKSkpCisgICAgeworICAgICAgICBjb2xvcnMgPSBpbmZvLT5ibWlIZWFkZXIuYmlDbHJVc2VkOworICAgICAgICBpZiAoIWNvbG9ycykgY29sb3JzID0gMSA8PCBpbmZvLT5ibWlIZWFkZXIuYmlCaXRDb3VudDsKKyAgICAgICAgY29sb3JQdHIgPSAoV09SRCAqKWluZm8tPmJtaUNvbG9yczsKKyAgICB9CisgICAgZWxzZSAgLyogYXNzdW1lIEJJVE1BUENPUkVJTkZPICovCisgICAgeworICAgICAgICBjb2xvcnMgPSAxIDw8ICgoQklUTUFQQ09SRUhFQURFUiAqKSZpbmZvLT5ibWlIZWFkZXIpLT5iY0JpdENvdW50OworICAgICAgICBjb2xvclB0ciA9IChXT1JEICopKChCSVRNQVBDT1JFSU5GTyAqKWluZm8pLT5ibWNpQ29sb3JzOworICAgIH0KKyAgICBpZiAoIShjb2xvck1hcHBpbmcgPSAoaW50ICopbWFsbG9jKCBjb2xvcnMgKiBzaXplb2YoaW50KSApKSkgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoY29sb3J1c2UgPT0gRElCX1JHQl9DT0xPUlMpCisgICAgeworICAgICAgICBpZiAoaXNJbmZvKQorICAgICAgICB7CisgICAgICAgICAgICBSR0JRVUFEICogcmdiID0gKFJHQlFVQUQgKiljb2xvclB0cjsKKyAgICAgICAgCisgICAgICAgICAgICBpZiAoZGVwdGggPT0gMSkgIC8qIE1vbm9jaHJvbWUgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29sb3JzOyBpKyssIHJnYisrKQorICAgICAgICAgICAgICAgICAgICBjb2xvck1hcHBpbmdbaV0gPSAocmdiLT5yZ2JSZWQgKyByZ2ItPnJnYkdyZWVuICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2ItPnJnYkJsdWUgPiAyNTUqMy8yKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29sb3JzOyBpKyssIHJnYisrKQorICAgICAgICAgICAgICAgICAgICBjb2xvck1hcHBpbmdbaV0gPSBDT0xPUl9Ub1BoeXNpY2FsKCBkYywgUkdCKHJnYi0+cmdiUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYi0+cmdiR3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiLT5yZ2JCbHVlKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBSR0JUUklQTEUgKiByZ2IgPSAoUkdCVFJJUExFICopY29sb3JQdHI7CisgICAgICAgIAorICAgICAgICAgICAgaWYgKGRlcHRoID09IDEpICAvKiBNb25vY2hyb21lICovCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbG9yczsgaSsrLCByZ2IrKykKKyAgICAgICAgICAgICAgICAgICAgY29sb3JNYXBwaW5nW2ldID0gKHJnYi0+cmdidFJlZCArIHJnYi0+cmdidEdyZWVuICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2ItPnJnYnRCbHVlID4gMjU1KjMvMik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbG9yczsgaSsrLCByZ2IrKykKKyAgICAgICAgICAgICAgICAgICAgY29sb3JNYXBwaW5nW2ldID0gQ09MT1JfVG9QaHlzaWNhbCggZGMsIFJHQihyZ2ItPnJnYnRSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2ItPnJnYnRHcmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYi0+cmdidEJsdWUpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlICAvKiBESUJfUEFMX0NPTE9SUyAqLworICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbG9yczsgaSsrLCBjb2xvclB0cisrKQorICAgICAgICAgICAgY29sb3JNYXBwaW5nW2ldID0gQ09MT1JfVG9QaHlzaWNhbCggZGMsIFBBTEVUVEVJTkRFWCgqY29sb3JQdHIpICk7CisgICAgfQorICAgIHJldHVybiBjb2xvck1hcHBpbmc7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRElCX1NldEltYWdlQml0c18xCiAgKgogICogU2V0RElCaXRzIGZvciBhIDEtYml0IGRlZXAgRElCLgpAQCAtNDU0LDY4ICs1NTksNDggQEAKICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgU2V0RElCaXRzKCkgYW5kIFNldERJQml0c1RvRGV2aWNlKCkuCiAgKi8KIHN0YXRpYyBpbnQgRElCX1NldEltYWdlQml0cyggREMgKmRjLCBXT1JEIGxpbmVzLCBXT1JEIGRlcHRoLCBMUFNUUiBiaXRzLAotCQkJICAgICBCSVRNQVBJTkZPICppbmZvLCBXT1JEIGNvbG9ydXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBpbmZvV2lkdGgsIFdPUkQgaW5mb0JwcCwgRFdPUkQgY29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVE1BUElORk8gKmluZm8sIFdPUkQgY29sb3J1c2UsCiAJCQkgICAgIERyYXdhYmxlIGRyYXdhYmxlLCBHQyBnYywgaW50IHhTcmMsIGludCB5U3JjLAogCQkJICAgICBpbnQgeERlc3QsIGludCB5RGVzdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0ICkKIHsKICAgICBpbnQgKmNvbG9yTWFwcGluZzsKICAgICBYSW1hZ2UgKmJtcEltYWdlOwotICAgIGludCBpLCBjb2xvcnM7CiAKICAgICAgIC8qIEJ1aWxkIHRoZSBjb2xvciBtYXBwaW5nIHRhYmxlICovCiAKLSAgICBpZiAoaW5mby0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPT0gMjQpIGNvbG9yTWFwcGluZyA9IE5VTEw7CisgICAgaWYgKGluZm9CcHAgPT0gMjQpIGNvbG9yTWFwcGluZyA9IE5VTEw7CiAgICAgZWxzZQotICAgIHsKLQljb2xvcnMgPSBpbmZvLT5ibWlIZWFkZXIuYmlDbHJVc2VkOwotCWlmICghY29sb3JzKSBjb2xvcnMgPSAxIDw8IGluZm8tPmJtaUhlYWRlci5iaUJpdENvdW50OwotCWlmICghKGNvbG9yTWFwcGluZyA9IChpbnQgKiltYWxsb2MoIGNvbG9ycyAqIHNpemVvZihpbnQpICkpKQotCSAgICByZXR1cm4gMDsKLQlpZiAoY29sb3J1c2UgPT0gRElCX1JHQl9DT0xPUlMpCi0JewotCSAgICBSR0JRVUFEICogcmdiUHRyID0gaW5mby0+Ym1pQ29sb3JzOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbG9yczsgaSsrLCByZ2JQdHIrKykKLSAgICAgICAgICAgICAgICBjb2xvck1hcHBpbmdbaV0gPSBDT0xPUl9Ub1BoeXNpY2FsKCBkYywgUkdCKHJnYlB0ci0+cmdiUmVkLAotCQkJCQkJCSAgICByZ2JQdHItPnJnYkdyZWVuLAotCQkJCQkJCSAgICByZ2JQdHItPnJnYkJsdWUpICk7Ci0JfQotCWVsc2UKLQl7Ci0JICAgIFdPUkQgKiBpbmRleCA9IChXT1JEICopaW5mby0+Ym1pQ29sb3JzOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgY29sb3JzOyBpKyssIGluZGV4KyspCi0JCWNvbG9yTWFwcGluZ1tpXSA9IENPTE9SX1RvUGh5c2ljYWwoIGRjLCBQQUxFVFRFSU5ERVgoKmluZGV4KSApOwotCX0KLSAgICB9CisgICAgICAgIGlmICghKGNvbG9yTWFwcGluZyA9IERJQl9CdWlsZENvbG9yTWFwKCBkYywgY29sb3J1c2UsIGRlcHRoLCBpbmZvICkpKQorICAgICAgICAgICAgcmV0dXJuIDA7CiAKICAgICAgIC8qIFRyYW5zZmVyIHRoZSBwaXhlbHMgKi8KLSAgICBYQ1JFQVRFSU1BR0UoYm1wSW1hZ2UsIGluZm8tPmJtaUhlYWRlci5iaVdpZHRoLCBsaW5lcywgZGVwdGggKTsKKyAgICBYQ1JFQVRFSU1BR0UoYm1wSW1hZ2UsIGluZm9XaWR0aCwgbGluZXMsIGRlcHRoICk7CiAKLSAgICBzd2l0Y2goaW5mby0+Ym1pSGVhZGVyLmJpQml0Q291bnQpCisgICAgc3dpdGNoKGluZm9CcHApCiAgICAgewogICAgIGNhc2UgMToKLQlESUJfU2V0SW1hZ2VCaXRzXzEoIGxpbmVzLCBiaXRzLCBpbmZvLT5ibWlIZWFkZXIuYmlXaWR0aCwKKwlESUJfU2V0SW1hZ2VCaXRzXzEoIGxpbmVzLCBiaXRzLCBpbmZvV2lkdGgsCiAJCQkgICAgY29sb3JNYXBwaW5nLCBibXBJbWFnZSApOwogCWJyZWFrOwogICAgIGNhc2UgNDoKLQlpZiAoaW5mby0+Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb24pCi0JCURJQl9TZXRJbWFnZUJpdHNfUkxFNCggbGluZXMsIGJpdHMsIGluZm8tPmJtaUhlYWRlci5iaVdpZHRoLAotCQkJICAgIGNvbG9yTWFwcGluZywgYm1wSW1hZ2UgKTsKLQllbHNlCQotCQlESUJfU2V0SW1hZ2VCaXRzXzQoIGxpbmVzLCBiaXRzLCBpbmZvLT5ibWlIZWFkZXIuYmlXaWR0aCwKLQkJCSAgICBjb2xvck1hcHBpbmcsIGJtcEltYWdlICk7CisJaWYgKGNvbXByZXNzaW9uKSBESUJfU2V0SW1hZ2VCaXRzX1JMRTQoIGxpbmVzLCBiaXRzLCBpbmZvV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvck1hcHBpbmcsIGJtcEltYWdlICk7CisJZWxzZSBESUJfU2V0SW1hZ2VCaXRzXzQoIGxpbmVzLCBiaXRzLCBpbmZvV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvck1hcHBpbmcsIGJtcEltYWdlICk7CiAJYnJlYWs7CiAgICAgY2FzZSA4OgotCWlmIChpbmZvLT5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbikKLQkJRElCX1NldEltYWdlQml0c19STEU4KCBsaW5lcywgYml0cywgaW5mby0+Ym1pSGVhZGVyLmJpV2lkdGgsCi0JCQkgICAgY29sb3JNYXBwaW5nLCBibXBJbWFnZSApOwotCWVsc2UKLQkJRElCX1NldEltYWdlQml0c184KCBsaW5lcywgYml0cywgaW5mby0+Ym1pSGVhZGVyLmJpV2lkdGgsCi0JCQkgICAgY29sb3JNYXBwaW5nLCBibXBJbWFnZSApOworCWlmIChjb21wcmVzc2lvbikgRElCX1NldEltYWdlQml0c19STEU4KCBsaW5lcywgYml0cywgaW5mb1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JNYXBwaW5nLCBibXBJbWFnZSApOworCWVsc2UgRElCX1NldEltYWdlQml0c184KCBsaW5lcywgYml0cywgaW5mb1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JNYXBwaW5nLCBibXBJbWFnZSApOwogCWJyZWFrOwogICAgIGNhc2UgMjQ6Ci0JRElCX1NldEltYWdlQml0c18yNCggbGluZXMsIGJpdHMsIGluZm8tPmJtaUhlYWRlci5iaVdpZHRoLAotCQkJICAgICBkYywgYm1wSW1hZ2UgKTsKKwlESUJfU2V0SW1hZ2VCaXRzXzI0KCBsaW5lcywgYml0cywgaW5mb1dpZHRoLCBkYywgYm1wSW1hZ2UgKTsKIAlicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJJbnZhbGlkIGRlcHRoICVkIGZvciBTZXRESUJpdHMhXG4iLCBpbmZvQnBwICk7CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBpZiAoY29sb3JNYXBwaW5nKSBmcmVlKGNvbG9yTWFwcGluZyk7CiAgICAgWFB1dEltYWdlKCBkaXNwbGF5LCBkcmF3YWJsZSwgZ2MsIGJtcEltYWdlLCB4U3JjLCB5U3JjLApAQCAtNTQ4LDYgKzYzMyw3IEBACiAgICAgcmV0dXJuIHdTcmNIZWlnaHQ7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2V0RElCaXRzICAgIChHREkuNDQwKQogICovCkBAIC01NTYsMjEgKzY0MiwyNiBAQAogewogICAgIERDICogZGM7CiAgICAgQklUTUFQT0JKICogYm1wOworICAgIERXT1JEIHdpZHRoLCBoZWlnaHQsIGNvbXByZXNzaW9uID0gMDsKKyAgICBXT1JEIGJwcDsKIAogICAgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwogCiAgICAgaWYgKCEoZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApKSkgcmV0dXJuIDA7CiAgICAgaWYgKCEoYm1wID0gKEJJVE1BUE9CSiAqKUdESV9HZXRPYmpQdHIoIGhiaXRtYXAsIEJJVE1BUF9NQUdJQyApKSkKIAlyZXR1cm4gMDsKLSAgICBpZiAoIWxpbmVzIHx8IChzdGFydHNjYW4gPj0gKFdPUkQpaW5mby0+Ym1pSGVhZGVyLmJpSGVpZ2h0KSkgcmV0dXJuIDA7Ci0gICAgaWYgKHN0YXJ0c2NhbitsaW5lcyA+IGluZm8tPmJtaUhlYWRlci5iaUhlaWdodCkKLQlsaW5lcyA9IGluZm8tPmJtaUhlYWRlci5iaUhlaWdodCAtIHN0YXJ0c2NhbjsKKyAgICBpZiAoRElCX0dldEJpdG1hcEluZm8oICZpbmZvLT5ibWlIZWFkZXIsICZ3aWR0aCwgJmhlaWdodCwgJmJwcCApID09IC0xKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoaW5mby0+Ym1pSGVhZGVyLmJpU2l6ZSA9PSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpCisgICAgICAgIGNvbXByZXNzaW9uID0gaW5mby0+Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb247CisgICAgaWYgKCFsaW5lcyB8fCAoc3RhcnRzY2FuID49IChXT1JEKWhlaWdodCkpIHJldHVybiAwOworICAgIGlmIChzdGFydHNjYW4gKyBsaW5lcyA+IGhlaWdodCkgbGluZXMgPSBoZWlnaHQgLSBzdGFydHNjYW47CiAKLSAgICByZXR1cm4gQ2FsbFRvMzJfTGFyZ2VTdGFjayggKGludCgqKSgpKURJQl9TZXRJbWFnZUJpdHMsIDE0LAorICAgIHJldHVybiBDYWxsVG8zMl9MYXJnZVN0YWNrKCAoaW50KCopKCkpRElCX1NldEltYWdlQml0cywgMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjLCBsaW5lcywgYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMsIGluZm8sIGNvbG9ydXNlLCBibXAtPnBpeG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTUFQX0dDKGJtcCksIDAsIDAsIDAsIHN0YXJ0c2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wLT5iaXRtYXAuYm1XaWR0aCwgbGluZXMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cywgd2lkdGgsIGJwcCwgY29tcHJlc3Npb24sIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ydXNlLCBibXAtPnBpeG1hcCwgQklUTUFQX0dDKGJtcCksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0c2NhbiwgYm1wLT5iaXRtYXAuYm1XaWR0aCwgbGluZXMgKTsKIH0KIAogCkBAIC01ODIsMjUgKzY3MywzMSBAQAogCQkgICAgICAgTFBTVFIgYml0cywgQklUTUFQSU5GTyAqIGluZm8sIFdPUkQgY29sb3J1c2UgKQogewogICAgIERDICogZGM7CisgICAgRFdPUkQgd2lkdGgsIGhlaWdodCwgY29tcHJlc3Npb24gPSAwOworICAgIFdPUkQgYnBwOwogCiAgICAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCiAKICAgICBpZiAoIShkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICkpKSByZXR1cm4gMDsKLSAgICBpZiAoIWxpbmVzIHx8IChzdGFydHNjYW4gPj0gaW5mby0+Ym1pSGVhZGVyLmJpSGVpZ2h0KSkgcmV0dXJuIDA7Ci0gICAgaWYgKHN0YXJ0c2NhbitsaW5lcyA+IGluZm8tPmJtaUhlYWRlci5iaUhlaWdodCkKLQlsaW5lcyA9IGluZm8tPmJtaUhlYWRlci5iaUhlaWdodCAtIHN0YXJ0c2NhbjsKKyAgICBpZiAoRElCX0dldEJpdG1hcEluZm8oICZpbmZvLT5ibWlIZWFkZXIsICZ3aWR0aCwgJmhlaWdodCwgJmJwcCApID09IC0xKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoaW5mby0+Ym1pSGVhZGVyLmJpU2l6ZSA9PSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpCisgICAgICAgIGNvbXByZXNzaW9uID0gaW5mby0+Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb247CisgICAgaWYgKCFsaW5lcyB8fCAoc3RhcnRzY2FuID49IGhlaWdodCkpIHJldHVybiAwOworICAgIGlmIChzdGFydHNjYW4gKyBsaW5lcyA+IGhlaWdodCkgbGluZXMgPSBoZWlnaHQgLSBzdGFydHNjYW47CiAgICAgaWYgKHlTcmMgPCBzdGFydHNjYW4pIHlTcmMgPSBzdGFydHNjYW47Ci0gICAgZWxzZSBpZiAoeVNyYyA+PSBzdGFydHNjYW4rbGluZXMpIHJldHVybiAwOwotICAgIGlmICh4U3JjID49IGluZm8tPmJtaUhlYWRlci5iaVdpZHRoKSByZXR1cm4gMDsKLSAgICBpZiAoeVNyYytjeSA+PSBzdGFydHNjYW4rbGluZXMpIGN5ID0gc3RhcnRzY2FuICsgbGluZXMgLSB5U3JjOwotICAgIGlmICh4U3JjK2N4ID49IGluZm8tPmJtaUhlYWRlci5iaVdpZHRoKSBjeCA9IGluZm8tPmJtaUhlYWRlci5iaVdpZHRoLXhTcmM7CisgICAgZWxzZSBpZiAoeVNyYyA+PSBzdGFydHNjYW4gKyBsaW5lcykgcmV0dXJuIDA7CisgICAgaWYgKHhTcmMgPj0gd2lkdGgpIHJldHVybiAwOworICAgIGlmICh5U3JjICsgY3kgPj0gc3RhcnRzY2FuICsgbGluZXMpIGN5ID0gc3RhcnRzY2FuICsgbGluZXMgLSB5U3JjOworICAgIGlmICh4U3JjICsgY3ggPj0gd2lkdGgpIGN4ID0gd2lkdGggLSB4U3JjOwogICAgIGlmICghY3ggfHwgIWN5KSByZXR1cm4gMDsKIAogICAgIERDX1NldHVwR0NGb3JUZXh0KCBkYyApOyAgLyogVG8gaGF2ZSB0aGUgY29ycmVjdCBjb2xvcnMgKi8KICAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjLT51LnguZ2MsIERDX1hST1BmdW5jdGlvbltkYy0+dy5ST1Btb2RlLTFdICk7Ci0gICAgcmV0dXJuIENhbGxUbzMyX0xhcmdlU3RhY2soIChpbnQoKikoKSlESUJfU2V0SW1hZ2VCaXRzLCAxNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGMsIGxpbmVzLCBkYy0+dy5iaXRzUGVyUGl4ZWwsIGJpdHMsIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ydXNlLCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgIHJldHVybiBDYWxsVG8zMl9MYXJnZVN0YWNrKCAoaW50KCopKCkpRElCX1NldEltYWdlQml0cywgMTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjLCBsaW5lcywgZGMtPncuYml0c1BlclBpeGVsLCBiaXRzLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBwLCBjb21wcmVzc2lvbiwgaW5mbywgY29sb3J1c2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhTcmMsIHlTcmMgLSBzdGFydHNjYW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIFhMUFRPRFAoIGRjLCB4RGVzdCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyBZTFBUT0RQKCBkYywgeURlc3QgKSwKQEAgLTY3OSw2NSArNzc2LDYxIEBACiAJCSAgICAgICAgTFBTVFIgYml0cywgQklUTUFQSU5GTyAqIGRhdGEsIFdPUkQgY29sb3J1c2UgKQogewogICAgIEhCSVRNQVAgaGFuZGxlOwotICAgIAotCWlmKGhlYWRlci0+YmlTaXplIT1zaXplb2YoQklUTUFQSU5GT0hFQURFUikpCi0JewotCQlmcHJpbnRmKHN0ZGVyciwiQ3JlYXRlRElCaXRtYXA6IHdyb25nIHNpemUgKCVsZCkgZm9yIGhlYWRlclxuIiwKLQkJCWhlYWRlci0+YmlTaXplKTsKLQkJcmV0dXJuIDA7Ci0JfQotICAgIGhhbmRsZSA9IENyZWF0ZUNvbXBhdGlibGVCaXRtYXAoIGhkYywgaGVhZGVyLT5iaVdpZHRoLCBoZWFkZXItPmJpSGVpZ2h0ICk7Ci0vKiAgICBoYW5kbGUgPSBDcmVhdGVCaXRtYXAoIGhlYWRlci0+YmlXaWR0aCwgaGVhZGVyLT5iaUhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIGhlYWRlci0+YmlCaXRDb3VudCwgTlVMTCApOwotKi8KKyAgICBCT09MIGZDb2xvcjsKKyAgICBEV09SRCB3aWR0aCwgaGVpZ2h0OworICAgIFdPUkQgYnBwOworCisgICAgaWYgKERJQl9HZXRCaXRtYXBJbmZvKCBoZWFkZXIsICZ3aWR0aCwgJmhlaWdodCwgJmJwcCApID09IC0xKSByZXR1cm4gMDsKKworICAgIC8qIENoZWNrIGlmIHdlIHNob3VsZCBjcmVhdGUgYSBtb25vY2hyb21lIG9yIGNvbG9yIGJpdG1hcC4gKi8KKyAgICAvKiBXZSBjcmVhdGUgYSBtb25vY2hyb21lIGJpdG1hcCBvbmx5IGlmIGl0IGhhcyBleGFjdGx5IDIgICovCisgICAgLyogY29sb3JzLCB3aGljaCBhcmUgZWl0aGVyIGJsYWNrIG9yIHdoaXRlLCBub3RoaW5nIGVsc2UuICAqLworICAgIC8qIEluIGFsbCBvdGhlciBjYXNlcywgd2UgY3JlYXRlIGEgY29sb3IgYml0bWFwLiAgICAgICAgICAgKi8KKworICAgIGlmIChicHAgIT0gMSkgZkNvbG9yID0gVFJVRTsKKyAgICBlbHNlIGlmICgoY29sb3J1c2UgIT0gRElCX1JHQl9DT0xPUlMpIHx8CisgICAgICAgICAgICAgKGluaXQgIT0gQ0JNX0lOSVQpIHx8ICFkYXRhKSBmQ29sb3IgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoZGF0YS0+Ym1pSGVhZGVyLmJpU2l6ZSA9PSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJHQlFVQUQgKnJnYiA9IGRhdGEtPmJtaUNvbG9yczsKKyAgICAgICAgICAgIERXT1JEIGNvbCA9IFJHQiggcmdiLT5yZ2JSZWQsIHJnYi0+cmdiR3JlZW4sIHJnYi0+cmdiQmx1ZSApOworICAgICAgICAgICAgaWYgKChjb2wgPT0gUkdCKDAsMCwwKSkgfHwgKGNvbCA9PSBSR0IoMHhmZiwweGZmLDB4ZmYpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZ2IrKzsKKyAgICAgICAgICAgICAgICBjb2wgPSBSR0IoIHJnYi0+cmdiUmVkLCByZ2ItPnJnYkdyZWVuLCByZ2ItPnJnYkJsdWUgKTsKKyAgICAgICAgICAgICAgICBmQ29sb3IgPSAoKGNvbCAhPSBSR0IoMCwwLDApKSAmJiAoY29sICE9IFJHQigweGZmLDB4ZmYsMHhmZikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgZkNvbG9yID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChkYXRhLT5ibWlIZWFkZXIuYmlTaXplID09IHNpemVvZihCSVRNQVBDT1JFSEVBREVSKSkKKyAgICAgICAgeworICAgICAgICAgICAgUkdCVFJJUExFICpyZ2IgPSAoKEJJVE1BUENPUkVJTkZPICopZGF0YSktPmJtY2lDb2xvcnM7CisgICAgICAgICAgICBEV09SRCBjb2wgPSBSR0IoIHJnYi0+cmdidFJlZCwgcmdiLT5yZ2J0R3JlZW4sIHJnYi0+cmdidEJsdWUgKTsKKyAgICAgICAgICAgIGlmICgoY29sID09IFJHQigwLDAsMCkpIHx8IChjb2wgPT0gUkdCKDB4ZmYsMHhmZiwweGZmKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmdiKys7CisgICAgICAgICAgICAgICAgY29sID0gUkdCKCByZ2ItPnJnYnRSZWQsIHJnYi0+cmdidEdyZWVuLCByZ2ItPnJnYnRCbHVlICk7CisgICAgICAgICAgICAgICAgZkNvbG9yID0gKChjb2wgIT0gUkdCKDAsMCwwKSkgJiYgKGNvbCAhPSBSR0IoMHhmZiwweGZmLDB4ZmYpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGZDb2xvciA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJDcmVhdGVESUJpdG1hcDogd3Jvbmcgc2l6ZSAoJWxkKSBmb3IgZGF0YVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGRhdGEtPmJtaUhlYWRlci5iaVNpemUgKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogTm93IGNyZWF0ZSB0aGUgYml0bWFwICovCisKKyAgICBoYW5kbGUgPSBmQ29sb3IgPyBDcmVhdGVDb21wYXRpYmxlQml0bWFwKCBoZGMsIHdpZHRoLCBoZWlnaHQgKSA6CisgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQml0bWFwKCB3aWR0aCwgaGVpZ2h0LCAxLCAxLCBOVUxMICk7CiAgICAgaWYgKCFoYW5kbGUpIHJldHVybiAwOwotICAgIGlmIChpbml0ID09IENCTV9JTklUKSBTZXRESUJpdHMoIGhkYywgaGFuZGxlLCAwLCBoZWFkZXItPmJpSGVpZ2h0LAotCQkJCSAgICBiaXRzLCBkYXRhLCBjb2xvcnVzZSApOworCisgICAgaWYgKGluaXQgPT0gQ0JNX0lOSVQpCisgICAgICAgIFNldERJQml0cyggaGRjLCBoYW5kbGUsIDAsIGhlaWdodCwgYml0cywgZGF0YSwgY29sb3J1c2UgKTsKICAgICByZXR1cm4gaGFuZGxlOwogfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBEcmF3SWNvbiAgICAoVVNFUi44NCkKLSAqLwotQk9PTCBEcmF3SWNvbihIREMgaERDLCBzaG9ydCB4LCBzaG9ydCB5LCBISUNPTiBoSWNvbikKLXsKLSAgICBJQ09OQUxMT0MJKmxwaWNvOwotICAgIEJJVE1BUAlibTsKLSAgICBIQklUTUFQCWhCaXRUZW1wOwotICAgIEhEQwkJaE1lbURDOwotICAgIENPTE9SUkVGICAgIG9sZEZnLCBvbGRCZzsKLQotICAgIG9sZEZnID0gU2V0VGV4dENvbG9yKCBoREMsIFJHQigwLDAsMCkgKTsKLSAgICBvbGRCZyA9IFNldEJrQ29sb3IoIGhEQywgUkdCKDI1NSwyNTUsMjU1KSApOwotICAgIGRwcmludGZfaWNvbihzdGRkZWIsIkRyYXdJY29uKCUwNFgsICVkLCAlZCwgJTA0WCkgXG4iLCBoREMsIHgsIHksIGhJY29uKTsKLSAgICBpZiAoaEljb24gPT0gKEhJQ09OKU5VTEwpIHJldHVybiBGQUxTRTsKLSAgICBscGljbyA9IChJQ09OQUxMT0MgKilHbG9iYWxMb2NrKGhJY29uKTsKLSAgICBHZXRPYmplY3QobHBpY28tPmhCaXRtYXAsIHNpemVvZihCSVRNQVApLCAoTFBTVFIpJmJtKTsKLSAgICBoTWVtREMgPSBDcmVhdGVDb21wYXRpYmxlREMoaERDKTsKLSAgICBpZiAobHBpY28tPmhCaXRNYXNrKQotICAgIHsKLSAgICAgICAgaEJpdFRlbXAgPSBTZWxlY3RPYmplY3QoaE1lbURDLCBscGljby0+aEJpdE1hc2spOwotICAgICAgICBCaXRCbHQoaERDLCB4LCB5LCBibS5ibVdpZHRoLCBibS5ibUhlaWdodCwgaE1lbURDLCAwLCAwLCBTUkNBTkQpOwotICAgICAgICBTZWxlY3RPYmplY3QoaE1lbURDLCBscGljby0+aEJpdG1hcCk7Ci0gICAgICAgIEJpdEJsdChoREMsIHgsIHksIGJtLmJtV2lkdGgsIGJtLmJtSGVpZ2h0LCBoTWVtREMsIDAsIDAsIFNSQ0lOVkVSVCk7Ci0gICAgfQotICAgIGVsc2UgIC8qIG5vIG1hc2sgLT4gZXZlcnl0aGluZyBpcyBtYXNrZWQ7IHNvIHVzZSBTUkNDT1BZIGFzIGl0J3MgZmFzdGVyICovCi0gICAgewotICAgICAgICBoQml0VGVtcCA9IFNlbGVjdE9iamVjdChoTWVtREMsIGxwaWNvLT5oQml0bWFwKTsKLSAgICAgICAgQml0Qmx0KGhEQywgeCwgeSwgYm0uYm1XaWR0aCwgYm0uYm1IZWlnaHQsIGhNZW1EQywgMCwgMCwgU1JDQ09QWSk7Ci0gICAgfQotICAgIFNlbGVjdE9iamVjdCggaE1lbURDLCBoQml0VGVtcCApOwotICAgIERlbGV0ZURDKGhNZW1EQyk7Ci0gICAgR2xvYmFsVW5sb2NrKCBoSWNvbiApOwotICAgIFNldFRleHRDb2xvciggaERDLCBvbGRGZyApOwotICAgIFNldEJrQ29sb3IoIGhEQywgb2xkQmcgKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENvcHlJY29uICAgIChVU0VSLjM2OCkKLSAqLwotQk9PTCBDb3B5SWNvbihIQU5ETEUgaGFuZGxlLCBISUNPTiBoSWNvbikKLXsKLSAgICBwcmludGYoIlNUVUIgISEhIENvcHlJY29uOiAleCAleFxuIixoYW5kbGUsaEljb24pOwotICAgIHJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9mb250LmMgYi9vYmplY3RzL2ZvbnQuYwppbmRleCBiYmViNjM0Li5iMWE4OWE4IDEwMDY0NAotLS0gYS9vYmplY3RzL2ZvbnQuYworKysgYi9vYmplY3RzL2ZvbnQuYwpAQCAtMjY1LDcgKzI2NSw3IEBACiBEV09SRCBHZXRHbHlwaE91dExpbmUoSERDIGhkYywgVUlOVCB1Q2hhciwgVUlOVCBmdUZvcm1hdCwgTFBHTFlQSE1FVFJJQ1MgbHBnbSwgCiAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgY2JCdWZmZXIsIExQU1RSIGxwQnVmZmVyLCBMUE1BVDIgbHBtYXQyKSAKIHsKLSAgICBmcHJpbnRmKCBzdGRuaW1wLCJHZXRHbHlwaE91dExpbmUoJTA0eCwgJyVjJywgJTA0eCwgJXAsICVsZCwgJXAsICVwKSAvLyAtIGVtcHR5IHN0dWIhXG4iLAorICAgIGZwcmludGYoIHN0ZG5pbXAsIkdldEdseXBoT3V0TGluZSgiTlBGTVQiLCAnJWMnLCAlMDR4LCAlcCwgJWxkLCAlcCwgJXApIC8vIC0gZW1wdHkgc3R1YiFcbiIsCiAgICAgICAgICAgICAgaGRjLCB1Q2hhciwgZnVGb3JtYXQsIGxwZ20sIGNiQnVmZmVyLCBscEJ1ZmZlciwgbHBtYXQyICk7CiAgICAgcmV0dXJuIChEV09SRCktMTsgLyogZmFpbHVyZSAqLwogfQpAQCAtMjk4LDcgKzI5OCw3IEBACiAgICAgZm9udFB0ciA9IChGT05UT0JKICopIEdESV9IRUFQX0xJTl9BRERSKCBoZm9udCApOwogICAgIG1lbWNweSggJmZvbnRQdHItPmxvZ2ZvbnQsIGZvbnQsIHNpemVvZihMT0dGT05UKSApOwogICAgIEFuc2lMb3dlciggZm9udFB0ci0+bG9nZm9udC5sZkZhY2VOYW1lICk7Ci0gICAgZHByaW50Zl9mb250KHN0ZGRlYiwiQ3JlYXRlRm9udEluZGlyZWN0KCVwKTsgcmV0dXJuICUwNHhcbiIsZm9udCxoZm9udCk7CisgICAgZHByaW50Zl9mb250KHN0ZGRlYiwiQ3JlYXRlRm9udEluZGlyZWN0KCVwKTsgcmV0dXJuICJOUEZNVCJcbiIsZm9udCxoZm9udCk7CiAgICAgcmV0dXJuIGhmb250OwogfQogCkBAIC0zMzksNyArMzM5LDcgQEAKICAgICBYX1BIWVNGT05UICogc3RvY2tQdHI7CiAgICAgSEZPTlQgcHJldkhhbmRsZSA9IGRjLT53LmhGb250OwogICAgIFhGb250U3RydWN0ICogZm9udFN0cnVjdDsKLSAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJGT05UX1NlbGVjdE9iamVjdCglcCwgJTA0eCwgJXApXG4iLCAKKyAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJGT05UX1NlbGVjdE9iamVjdCglcCwgIk5QRk1UIiwgJXApXG4iLCAKIAkJICAgICBkYywgaGZvbnQsIGZvbnQpOwogICAgICAgLyogTG9hZCBmb250IGlmIG5lY2Vzc2FyeSAqLwogCkBAIC0zNTQsMTAgKzM1NCwxNCBAQAogICAgIH0KIAogICAgIGlmIChkYy0+aGVhZGVyLndNYWdpYyA9PSBNRVRBRklMRV9EQ19NQUdJQykKLQlyZXR1cm4gTUZfQ3JlYXRlRm9udEluZGlyZWN0KGRjLCBoZm9udCwgJihmb250LT5sb2dmb250KSk7CisgICAgICBpZiAoTUZfQ3JlYXRlRm9udEluZGlyZWN0KGRjLCBoZm9udCwgJihmb250LT5sb2dmb250KSkpCisJcmV0dXJuIHByZXZIYW5kbGU7CisgICAgICBlbHNlCisJcmV0dXJuIDA7CiAKKyAgICAgIC8qICBNdXN0IGJlIERXT1JEIGZvciBXSU5FTElCMzIgc3VwcG9ydCAgKi8KICAgICBpZiAoKGhmb250ID49IEZJUlNUX1NUT0NLX0ZPTlQpICYmIChoZm9udCA8PSBMQVNUX1NUT0NLX0ZPTlQpKQotCXN0b2NrUHRyID0gJnN0b2NrRm9udHNbaGZvbnQgLSBGSVJTVF9TVE9DS19GT05UXTsKKwlzdG9ja1B0ciA9ICZzdG9ja0ZvbnRzWyhEV09SRCloZm9udCAtIChEV09SRClGSVJTVF9TVE9DS19GT05UXTsKICAgICBlbHNlIAogCXN0b2NrUHRyID0gTlVMTDsKICAgICAKQEAgLTM2OCw3ICszNzIsNyBAQAogICAgICAgICAgICAgICAvKiBJZiBpdCBpcyBub3QgYSBzdG9jayBmb250LCB3ZSBjYW4gc2ltcGx5IHJldHVybiAwICovCiAgICAgICAgICAgICBpZiAoIXN0b2NrUHRyKSByZXR1cm4gMDsKICAgICAgICAgICAgICAgLyogT3RoZXJ3aXNlIHdlIG11c3QgdHJ5IHRvIGZpbmQgYSBzdWJzdGl0dXRlICovCi0gICAgICAgICAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJMb2FkaW5nIGZvbnQgJ2ZpeGVkJyBmb3IgJXhcbiIsIGhmb250ICk7CisgICAgICAgICAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJMb2FkaW5nIGZvbnQgJ2ZpeGVkJyBmb3IgIk5QRk1UIlxuIiwgaGZvbnQgKTsKICAgICAgICAgICAgIGZvbnQtPmxvZ2ZvbnQubGZQaXRjaEFuZEZhbWlseSAmPSB+VkFSSUFCTEVfUElUQ0g7CiAgICAgICAgICAgICBmb250LT5sb2dmb250LmxmUGl0Y2hBbmRGYW1pbHkgfD0gRklYRURfUElUQ0g7CiAgICAgICAgICAgICBmb250U3RydWN0ID0gWExvYWRRdWVyeUZvbnQoIGRpc3BsYXksICJmaXhlZCIgKTsKQEAgLTM4Myw3ICszODcsNyBAQAogICAgIHsKIAlmb250U3RydWN0ID0gc3RvY2tQdHItPmZzdHJ1Y3Q7CiAJZHByaW50Zl9mb250KHN0ZGRlYiwKLSAgICAgICAgICAgICAgICAgICAgICJGT05UX1NlbGVjdE9iamVjdDogTG9hZGVkIGZvbnQgZnJvbSBjYWNoZSAleCAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICJGT05UX1NlbGVjdE9iamVjdDogTG9hZGVkIGZvbnQgZnJvbSBjYWNoZSAiTlBGTVQiICVwXG4iLAogCQkgICAgIGhmb250LCBmb250U3RydWN0ICk7CiAgICAgfQkKIApAQCAtNTE0LDcgKzUxOCw3IEBACiAgICAgc2l6ZS0+Y3kgPSBhYnMoKGRjLT51LnguZm9udC5mc3RydWN0LT5hc2NlbnQrZGMtPnUueC5mb250LmZzdHJ1Y3QtPmRlc2NlbnQpCiAJCSAgICAqIGRjLT53LlduZEV4dFkgLyBkYy0+dy5WcG9ydEV4dFkpOwogCi0gICAgZHByaW50Zl9mb250KHN0ZGRlYiwiR2V0VGV4dEV4dGVudFBvaW50KCVkICclKi4qcycgJWQgJXApOiByZXR1cm5pbmcgJWQsJWRcbiIsCisgICAgZHByaW50Zl9mb250KHN0ZGRlYiwiR2V0VGV4dEV4dGVudFBvaW50KCJOUEZNVCIgJyUqLipzJyAlZCAlcCk6IHJldHVybmluZyAlZCwlZFxuIiwKIAkgICAgaGRjLCBjb3VudCwgY291bnQsIHN0ciwgY291bnQsIHNpemUsIHNpemUtPmN4LCBzaXplLT5jeSApOwogICAgIHJldHVybiBUUlVFOwogfQpAQCAtNTUxLDcgKzU1NSw3IEBACiAgKi8KIERXT1JEIFNldE1hcHBlckZsYWdzKEhEQyBoREMsIERXT1JEIGR3RmxhZykKIHsKLSAgICBkcHJpbnRmX2ZvbnQoc3RkbmltcCwiU2V0bWFwcGVyRmxhZ3MoJTA0WCwgJTA4bFgpIC8vIEVtcHR5IFN0dWIgIVxuIiwgCisgICAgZHByaW50Zl9mb250KHN0ZG5pbXAsIlNldG1hcHBlckZsYWdzKCJOUEZNVCIsICUwOGxYKSAvLyBFbXB0eSBTdHViICFcbiIsIAogCQkgaERDLCBkd0ZsYWcpOyAKICAgICByZXR1cm4gMEw7CiB9CkBAIC01OTcsNyArNjAxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEFkZEZvbnRSZXNvdXJjZSAgICAoR0RJLjExOSkKICAqLwotaW50IEFkZEZvbnRSZXNvdXJjZSggTFBTVFIgc3RyICkKK0lOVCBBZGRGb250UmVzb3VyY2UoIExQQ1NUUiBzdHIgKQogewogICAgIGZwcmludGYoIHN0ZG5pbXAsICJTVFVCOiBBZGRGb250UmVzb3VyY2UoJyVzJylcbiIsIHN0ciApOwogICAgIHJldHVybiAxOwpAQCAtNzQwLDcgKzc0NCw3IEBACiAgIGludCAgICAgICAgICBuUmV0ID0gMDsKICAgaW50ICAgICAgICAgIGk7CiAgIAotICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJFbnVtRm9udHMoJTA0WCwgJXA9JyVzJywgJTA4bHgsICVwKVxuIiwgCisgIGRwcmludGZfZm9udChzdGRkZWIsIkVudW1Gb250cygiTlBGTVQiLCAlcD0nJXMnLCAlMDhseCwgJXApXG4iLCAKIAkgICAgICAgaERDLCBscEZhY2VOYW1lLCBscEZhY2VOYW1lLCAoTE9ORylscEVudW1GdW5jLCBscERhdGEpOwogICBpZiAobHBFbnVtRnVuYyA9PSAwKSByZXR1cm4gMDsKICAgaExvZyA9IEdESV9IRUFQX0FMTE9DKCBzaXplb2YoTE9HRk9OVCkgKyBMRl9GQUNFU0laRSApOwpAQCAtODEwLDggKzgxNCw4IEBACiAgIGludAkgICAgICAgCW5SZXQgPSAwOwogICBpbnQJICAgICAgIAlpOwogICAKLSAgZHByaW50Zl9mb250KHN0ZGRlYiwiRW51bUZvbnRGYW1pbGllcyglMDRYLCAlcCwgJTA4bHgsICVwKVxuIiwKLQkgICAgICAgaERDLCBscHN6RmFtaWx5LCBscEVudW1GdW5jLCBscERhdGEpOworICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJFbnVtRm9udEZhbWlsaWVzKCJOUEZNVCIsICVwLCAlMDhseCwgJXApXG4iLAorCSAgICAgICBoREMsIGxwc3pGYW1pbHksIChEV09SRClscEVudW1GdW5jLCBscERhdGEpOwogICBpZiAobHBFbnVtRnVuYyA9PSAwKSByZXR1cm4gMDsKICAgaExvZyA9IEdESV9IRUFQX0FMTE9DKCBzaXplb2YoRU5VTUxPR0ZPTlQpICk7CiAgIGxwRW51bUxvZ0ZvbnQgPSAoTFBFTlVNTE9HRk9OVCkgR0RJX0hFQVBfTElOX0FERFIoaExvZyk7CmRpZmYgLS1naXQgYS9vYmplY3RzL2dkaW9iai5jIGIvb2JqZWN0cy9nZGlvYmouYwppbmRleCBhZjdjY2NjLi5iMjQzNDEyNSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9nZGlvYmouYworKysgYi9vYmplY3RzL2dkaW9iai5jCkBAIC0yMDgsNyArMjA4LDcgQEAKIAkJaWYgKCpscGhPYmogPT0gMCkgewogCQkJKmxwaE9iaiA9IGhOZXdPYmo7CiAJCQkqKGxwaE9iaiArIDEpID0gMDsKLQkJCWRwcmludGZfZ2RpKHN0ZGRlYiwiR0RJX0FwcGVuZFRvUGVuQnJ1c2hMaXN0KCUwNFgpIGFwcGVuZGVkIChjb3VudD0lZClcbiIsIGhOZXdPYmosIGkpOworCQkJZHByaW50Zl9nZGkoc3RkZGViLCJHRElfQXBwZW5kVG9QZW5CcnVzaExpc3QoIk5QRk1UIikgYXBwZW5kZWQgKGNvdW50PSVkKVxuIiwgaE5ld09iaiwgaSk7CiAJCQlyZXR1cm4gVFJVRTsKIAkJfQogCQlscGhPYmorKzsKQEAgLTI0NSw3ICsyNDUsOCBAQAogICAgIEdESU9CSkhEUiAqIG9iamVjdDsKIAogICAgICAgLyogQ2FuJ3QgZnJlZSBzdG9jayBvYmplY3RzICovCi0gICAgaWYgKGhhbmRsZSA+PSBGSVJTVF9TVE9DS19IQU5ETEUpIHJldHVybiBUUlVFOworICAgIGlmICgoRFdPUkQpaGFuZGxlID49IEZJUlNUX1NUT0NLX0hBTkRMRSAmJgorCShEV09SRCloYW5kbGUgPD0gTEFTVF9TVE9DS19IQU5ETEUgICApIHJldHVybiBUUlVFOwogICAgIAogICAgIG9iamVjdCA9IChHRElPQkpIRFIgKikgR0RJX0hFQVBfTElOX0FERFIoIGhhbmRsZSApOwogICAgIGlmICghb2JqZWN0KSByZXR1cm4gRkFMU0U7CkBAIC0yNjcsMTIgKzI2OCwxMSBAQAogewogICAgIEdESU9CSkhEUiAqIHB0ciA9IE5VTEw7CiAKLSAgICBpZiAoaGFuZGxlID49IEZJUlNUX1NUT0NLX0hBTkRMRSkKLSAgICB7Ci0JaWYgKGhhbmRsZSA8IEZJUlNUX1NUT0NLX0hBTkRMRSArIE5CX1NUT0NLX09CSkVDVFMpCi0JICAgIHB0ciA9IFN0b2NrT2JqZWN0c1toYW5kbGUgLSBGSVJTVF9TVE9DS19IQU5ETEVdOwotICAgIH0KLSAgICBlbHNlIHB0ciA9IChHRElPQkpIRFIgKikgR0RJX0hFQVBfTElOX0FERFIoIGhhbmRsZSApOworICAgIGlmICgoRFdPUkQpaGFuZGxlID49IEZJUlNUX1NUT0NLX0hBTkRMRSAmJgorCShEV09SRCloYW5kbGUgPD0gTEFTVF9TVE9DS19IQU5ETEUgICApCisgICAgICBwdHIgPSBTdG9ja09iamVjdHNbKERXT1JEKWhhbmRsZSAtIEZJUlNUX1NUT0NLX0hBTkRMRV07CisgICAgZWxzZSAKKyAgICAgIHB0ciA9IChHRElPQkpIRFIgKikgR0RJX0hFQVBfTElOX0FERFIoIGhhbmRsZSApOwogICAgIGlmICghcHRyKSByZXR1cm4gTlVMTDsKICAgICBpZiAocHRyLT53TWFnaWMgIT0gbWFnaWMpIHJldHVybiBOVUxMOwogICAgIHJldHVybiBwdHI7CkBAIC0yODksNyArMjg5LDcgQEAKICAgICBHRElPQkpIRFIgKiBoZWFkZXIgPSAoR0RJT0JKSERSICopIEdESV9IRUFQX0xJTl9BRERSKCBvYmogKTsKICAgICBpZiAoIWhlYWRlcikgcmV0dXJuIEZBTFNFOwogCi0gICAgZHByaW50Zl9nZGkoc3RkZGViLCAiRGVsZXRlT2JqZWN0OiAlZFxuIiwgb2JqICk7CisgICAgZHByaW50Zl9nZGkoc3RkZGViLCAiRGVsZXRlT2JqZWN0OiAiTlBGTVQiXG4iLCBvYmogKTsKIAogICAgICAgLyogRGVsZXRlIG9iamVjdCAqLwogCkBAIC0zMTMsOSArMzEzLDkgQEAKIHsKICAgICBpZiAoKG9iaiA8IDApIHx8IChvYmogPj0gTkJfU1RPQ0tfT0JKRUNUUykpIHJldHVybiAwOwogICAgIGlmICghU3RvY2tPYmplY3RzW29ial0pIHJldHVybiAwOwotICAgIGRwcmludGZfZ2RpKHN0ZGRlYiwgIkdldFN0b2NrT2JqZWN0OiByZXR1cm5pbmcgJTA0eFxuIiwgCi0JCUZJUlNUX1NUT0NLX0hBTkRMRSArIG9iaiApOwotICAgIHJldHVybiBGSVJTVF9TVE9DS19IQU5ETEUgKyBvYmo7CisgICAgZHByaW50Zl9nZGkoc3RkZGViLCAiR2V0U3RvY2tPYmplY3Q6IHJldHVybmluZyAlbGRcbiIsCisJCShEV09SRClGSVJTVF9TVE9DS19IQU5ETEUgKyBvYmogKTsKKyAgICByZXR1cm4gKEhBTkRMRSkoKERXT1JEKUZJUlNUX1NUT0NLX0hBTkRMRSArIG9iaik7CiB9CiAKIApAQCAtMzI1LDE1ICszMjUsMTQgQEAKIGludCBHZXRPYmplY3QoIEhBTkRMRSBoYW5kbGUsIGludCBjb3VudCwgTFBTVFIgYnVmZmVyICkKIHsKICAgICBHRElPQkpIRFIgKiBwdHIgPSBOVUxMOwotICAgIGRwcmludGZfZ2RpKHN0ZGRlYiwgIkdldE9iamVjdDogJTA0eCAlZCAlcFxuIiwgaGFuZGxlLCBjb3VudCwgYnVmZmVyICk7CisgICAgZHByaW50Zl9nZGkoc3RkZGViLCAiR2V0T2JqZWN0OiAiTlBGTVQiICVkICVwXG4iLCBoYW5kbGUsIGNvdW50LCBidWZmZXIgKTsKICAgICBpZiAoIWNvdW50KSByZXR1cm4gMDsKIAotICAgIGlmIChoYW5kbGUgPj0gRklSU1RfU1RPQ0tfSEFORExFKQotICAgIHsKLQlpZiAoaGFuZGxlIDwgRklSU1RfU1RPQ0tfSEFORExFICsgTkJfU1RPQ0tfT0JKRUNUUykKLQkgICAgcHRyID0gU3RvY2tPYmplY3RzW2hhbmRsZSAtIEZJUlNUX1NUT0NLX0hBTkRMRV07Ci0gICAgfQotICAgIGVsc2UgcHRyID0gKEdESU9CSkhEUiAqKSBHRElfSEVBUF9MSU5fQUREUiggaGFuZGxlICk7CisgICAgaWYgKChEV09SRCloYW5kbGUgPj0gRklSU1RfU1RPQ0tfSEFORExFICYmCisJKERXT1JEKWhhbmRsZSA8PSBMQVNUX1NUT0NLX0hBTkRMRSAgICkKKyAgICAgIHB0ciA9IFN0b2NrT2JqZWN0c1soRFdPUkQpaGFuZGxlIC0gRklSU1RfU1RPQ0tfSEFORExFXTsKKyAgICBlbHNlCisgICAgICBwdHIgPSAoR0RJT0JKSERSICopIEdESV9IRUFQX0xJTl9BRERSKCBoYW5kbGUgKTsKICAgICBpZiAoIXB0cikgcmV0dXJuIDA7CiAgICAgCiAgICAgc3dpdGNoKHB0ci0+d01hZ2ljKQpAQCAtMzYxLDEzICszNjAsMTIgQEAKICAgICBHRElPQkpIRFIgKiBwdHIgPSBOVUxMOwogICAgIERDICogZGM7CiAgICAgCi0gICAgZHByaW50Zl9nZGkoc3RkZGViLCAiU2VsZWN0T2JqZWN0OiAlZCAlMDR4XG4iLCBoZGMsIGhhbmRsZSApOwotICAgIGlmIChoYW5kbGUgPj0gRklSU1RfU1RPQ0tfSEFORExFKQotICAgIHsKLQlpZiAoaGFuZGxlIDwgRklSU1RfU1RPQ0tfSEFORExFICsgTkJfU1RPQ0tfT0JKRUNUUykKLQkgICAgcHRyID0gU3RvY2tPYmplY3RzW2hhbmRsZSAtIEZJUlNUX1NUT0NLX0hBTkRMRV07Ci0gICAgfQotICAgIGVsc2UgcHRyID0gKEdESU9CSkhEUiAqKSBHRElfSEVBUF9MSU5fQUREUiggaGFuZGxlICk7CisgICAgZHByaW50Zl9nZGkoc3RkZGViLCAiU2VsZWN0T2JqZWN0OiAiTlBGTVQiICJOUEZNVCJcbiIsIGhkYywgaGFuZGxlICk7CisgICAgaWYgKChEV09SRCloYW5kbGUgPj0gRklSU1RfU1RPQ0tfSEFORExFICYmCisJKERXT1JEKWhhbmRsZSA8PSBMQVNUX1NUT0NLX0hBTkRMRSAgICkKKyAgICAgIHB0ciA9IFN0b2NrT2JqZWN0c1soRFdPUkQpaGFuZGxlIC0gRklSU1RfU1RPQ0tfSEFORExFXTsKKyAgICBlbHNlIAorICAgICAgcHRyID0gKEdESU9CSkhEUiAqKSBHRElfSEVBUF9MSU5fQUREUiggaGFuZGxlICk7CiAgICAgaWYgKCFwdHIpIHJldHVybiAwOwogICAgIAogICAgIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKQEAgLTM4OCw3ICszODYsNyBAQAogICAgICAgY2FzZSBGT05UX01BR0lDOgogCSAgcmV0dXJuIEZPTlRfU2VsZWN0T2JqZWN0KCBkYywgaGFuZGxlLCAoRk9OVE9CSiAqKXB0ciApOwkgIAogICAgICAgY2FzZSBSRUdJT05fTUFHSUM6Ci0JICByZXR1cm4gU2VsZWN0Q2xpcFJnbiggaGRjLCBoYW5kbGUgKTsKKwkgIHJldHVybiAoSEFORExFKVNlbGVjdENsaXBSZ24oIGhkYywgaGFuZGxlICk7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtMzk5LDcgKzM5Nyw3IEBACiAgKi8KIEJPT0wgVW5yZWFsaXplT2JqZWN0KCBIQU5ETEUgaGFuZGxlICkKIHsKLSAgICBkcHJpbnRmX2dkaShzdGRuaW1wLCAiVW5yZWFsaXplT2JqZWN0OiAlMDR4XG4iLCBoYW5kbGUgKTsKKyAgICBkcHJpbnRmX2dkaShzdGRuaW1wLCAiVW5yZWFsaXplT2JqZWN0OiAiTlBGTVQiXG4iLCBoYW5kbGUgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNDI1LDcgKzQyMyw3IEBACiAgIHN3aXRjaCAobk9ialR5cGUpIHsKICAgIGNhc2UgT0JKX1BFTjoKICAgICB3TWFnaWMgPSBQRU5fTUFHSUM7Ci0gICAgZHByaW50Zl9nZGkoc3RkZGViLCJFbnVtT2JqZWN0cyglMDRYLCBPQkpfUEVOLCAlMDhseCwgJXApO1xuIiwKKyAgICBkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzKCJOUEZNVCIsIE9CSl9QRU4sICUwOGx4LCAlcCk7XG4iLAogCQloREMsIChMT05HKWxwRW51bUZ1bmMsIGxwRGF0YSk7CiAgICAgaExvZyA9IEdESV9IRUFQX0FMTE9DKCBzaXplb2YoTE9HUEVOKSApOwogICAgIGxwTG9nID0gKExQU1RSKSBHRElfSEVBUF9MSU5fQUREUihoTG9nKTsKQEAgLTQzNiw3ICs0MzQsNyBAQAogICAgIGJyZWFrOwogICAgY2FzZSBPQkpfQlJVU0g6CiAgICAgd01hZ2ljID0gQlJVU0hfTUFHSUM7Ci0gICAgZHByaW50Zl9nZGkoc3RkZGViLCJFbnVtT2JqZWN0cyglMDRYLCBPQkpfQlJVU0gsICUwOGx4LCAlcCk7XG4iLAorICAgIGRwcmludGZfZ2RpKHN0ZGRlYiwiRW51bU9iamVjdHMoIk5QRk1UIiwgT0JKX0JSVVNILCAlMDhseCwgJXApO1xuIiwKIAkJaERDLCAoTE9ORylscEVudW1GdW5jLCBscERhdGEpOwogICAgIGhMb2cgPSBHRElfSEVBUF9BTExPQyggc2l6ZW9mKExPR0JSVVNIKSApOwogICAgIGxwTG9nID0gKExQU1RSKSBHRElfSEVBUF9MSU5fQUREUihoTG9nKTsKQEAgLTQ0Niw3ICs0NDQsNyBAQAogICAgIH0KICAgICBicmVhazsKICAgIGRlZmF1bHQ6Ci0gICAgZnByaW50ZihzdGRlcnIsIkVudW1PYmplY3RzKCUwNFgsICUwNFgsICUwOGx4LCAlcCk7IC8vIFVua25vd24gT0JKIHR5cGUgIVxuIiwgCisgICAgZnByaW50ZihzdGRlcnIsIkVudW1PYmplY3RzKCJOUEZNVCIsICUwNFgsICUwOGx4LCAlcCk7IC8vIFVua25vd24gT0JKIHR5cGUgIVxuIiwgCiAJICAgIGhEQywgbk9ialR5cGUsIChMT05HKWxwRW51bUZ1bmMsIGxwRGF0YSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KQEAgLTQ4NCw3ICs0ODIsNyBAQAogICAKICAgaWYgKGxwUGVuQnJ1c2hMaXN0ID09IE5VTEwpIHJldHVybiAwOwogICBmb3IgKGxwaE9iaiA9IGxwUGVuQnJ1c2hMaXN0OyAqbHBoT2JqICE9IDA7ICkgewotICAgIGRwcmludGZfZ2RpKHN0ZGRlYiwiRW51bU9iamVjdHMgLy8gKmxwaE9iaj0lMDRYXG4iLCAqbHBoT2JqKTsKKyAgICBkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vICpscGhPYmo9Ik5QRk1UIlxuIiwgKmxwaE9iaik7CiAgICAgaGVhZGVyID0gKEdESU9CSkhEUiAqKSBHRElfSEVBUF9MSU5fQUREUigqbHBoT2JqKyspOwogICAgIGlmIChoZWFkZXItPndNYWdpYyA9PSB3TWFnaWMpIHsKICAgICAgIGRwcmludGZfZ2RpKHN0ZGRlYiwiRW51bU9iamVjdHMgLy8gRENfT2JqIGxwTG9nPSVwIGxwRGF0YT0lcFxuIiwgbHBMb2csIGxwRGF0YSk7CkBAIC00OTIsNyArNDkwLDcgQEAKIAlCUlVTSF9HZXRPYmplY3QoIChCUlVTSE9CSiAqKWhlYWRlciwgc2l6ZW9mKExPR0JSVVNIKSwgbHBMb2cpOwogCWRwcmludGZfZ2RpKHN0ZGRlYiwiRW51bU9iamVjdHMgLy8gRENfQnJ1c2ggbGJTdHlsZT0lMDRYXG4iLCAoKExQTE9HQlJVU0gpbHBMb2cpLT5sYlN0eWxlKTsKIAlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIERDX0JydXNoIGxiQ29sb3I9JTA4bFhcbiIsICgoTFBMT0dCUlVTSClscExvZyktPmxiQ29sb3IpOwotCWRwcmludGZfZ2RpKHN0ZGRlYiwiRW51bU9iamVjdHMgLy8gRENfQnJ1c2ggbGJIYXRjaD0lMDRYXG4iLCAoKExQTE9HQlJVU0gpbHBMb2cpLT5sYkhhdGNoKTsKKwlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIERDX0JydXNoIGxiSGF0Y2g9JTA0bFhcbiIsIChMT05HKSgoTFBMT0dCUlVTSClscExvZyktPmxiSGF0Y2gpOwogICAgICAgfQogICAgICAgaWYgKGhlYWRlci0+d01hZ2ljID09IFBFTl9NQUdJQykgewogCVBFTl9HZXRPYmplY3QoIChQRU5PQkogKiloZWFkZXIsIHNpemVvZihMT0dQRU4pLCBscExvZyk7CmRpZmYgLS1naXQgYS9vYmplY3RzL21ldGFmaWxlLmMgYi9vYmplY3RzL21ldGFmaWxlLmMKaW5kZXggODQ2OTY0ZS4uOTYyOGU5OSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9tZXRhZmlsZS5jCisrKyBiL29iamVjdHMvbWV0YWZpbGUuYwpAQCAtNzU5LDcgKzc1OSw3IEBACiAgICAgc3dpdGNoIChsb2dicnVzaC0+bGJTdHlsZSkKICAgICB7CiAgICAgY2FzZSBCU19QQVRURVJOOgotCWJtcCA9IChCSVRNQVBPQkogKilHRElfR2V0T2JqUHRyKGxvZ2JydXNoLT5sYkhhdGNoLCBCSVRNQVBfTUFHSUMpOworCWJtcCA9IChCSVRNQVBPQkogKilHRElfR2V0T2JqUHRyKChIQU5ETEUpbG9nYnJ1c2gtPmxiSGF0Y2gsIEJJVE1BUF9NQUdJQyk7CiAJaWYgKCFibXApIHJldHVybiBGQUxTRTsKIAlsZW4gPSBzaXplb2YoTUVUQVJFQ09SRCkgKyBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgKyAKIAkgICAgICAoYm1wLT5iaXRtYXAuYm1IZWlnaHQgKiBibXAtPmJpdG1hcC5ibVdpZHRoQnl0ZXMpICsgNjsKQEAgLTc4Myw3ICs3ODMsNyBAQAogCWJyZWFrOwogCiAgICAgY2FzZSBCU19ESUJQQVRURVJOOgotCWluZm8gPSAoQklUTUFQSU5GTyAqKUdsb2JhbExvY2sobG9nYnJ1c2gtPmxiSGF0Y2gpOworCWluZm8gPSAoQklUTUFQSU5GTyAqKUdsb2JhbExvY2soKEhBTkRMRSlsb2dicnVzaC0+bGJIYXRjaCk7CiAJYm1TaXplID0gaW5mby0+Ym1pSGVhZGVyLmJpU2l6ZUltYWdlOwogCWlmICghYm1TaXplKQogCSAgICBibVNpemUgPSAoaW5mby0+Ym1pSGVhZGVyLmJpV2lkdGggKiBpbmZvLT5ibWlIZWFkZXIuYmlCaXRDb3VudCAKZGlmZiAtLWdpdCBhL29iamVjdHMvb2VtYml0bWFwLmMgYi9vYmplY3RzL29lbWJpdG1hcC5jCmluZGV4IGVjZDQwYjQuLmM4NTA5OTQgMTAwNjQ0Ci0tLSBhL29iamVjdHMvb2VtYml0bWFwLmMKKysrIGIvb2JqZWN0cy9vZW1iaXRtYXAuYwpAQCAtNiw2ICs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8WDExL1hsaWIuaD4KICNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KICNpbmNsdWRlIDxYMTEveHBtLmg+CkBAIC0xMyw3ICsxNCw3IEBACiAjaW5jbHVkZSAiYml0bWFwLmgiCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJjb2xvci5oIgotI2luY2x1ZGUgImljb24uaCIKKyNpbmNsdWRlICJjdXJzb3JpY29uLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCkBAIC0xNTQsNiArMTU1LDUxIEBACiB9OwogCiAKKyAgLyogSW5jbHVkZSBPRU0gY3Vyc29ycyAqLworI2luY2x1ZGUgImJpdG1hcHMvb2NyX25vcm1hbCIKKyNpbmNsdWRlICJiaXRtYXBzL29jcl9pYmVhbSIKKyNpbmNsdWRlICJiaXRtYXBzL29jcl93YWl0IgorI2luY2x1ZGUgImJpdG1hcHMvb2NyX2Nyb3NzIgorI2luY2x1ZGUgImJpdG1hcHMvb2NyX3VwIgorI2luY2x1ZGUgImJpdG1hcHMvb2NyX3NpemUiCisjaW5jbHVkZSAiYml0bWFwcy9vY3JfaWNvbiIKKyNpbmNsdWRlICJiaXRtYXBzL29jcl9zaXplbndzZSIKKyNpbmNsdWRlICJiaXRtYXBzL29jcl9zaXplbmVzdyIKKyNpbmNsdWRlICJiaXRtYXBzL29jcl9zaXpld2UiCisjaW5jbHVkZSAiYml0bWFwcy9vY3Jfc2l6ZW5zIgorI2lmIDAKKyNpbmNsdWRlICJiaXRtYXBzL29jcl9zaXplYWxsIgorI2luY2x1ZGUgImJpdG1hcHMvb2NyX2ljb2N1ciIKKyNlbmRpZgorCisvKiBDdXJzb3IgYXJlIG5vdCBhbGwgY29udGlndW91cyAoZ28gZmlndXJlLi4uKSAqLworI2RlZmluZSBPQ1JfRklSU1QxIE9DUl9OT1JNQUwKKyNkZWZpbmUgT0NSX0xBU1QxICBPQ1JfVVAKKyNkZWZpbmUgT0NSX0ZJUlNUMiBPQ1JfU0laRQorI2RlZmluZSBPQ1JfTEFTVDIgIE9DUl9TSVpFTlMgIC8qIE9DUl9JQ09DVVIgKi8KKyNkZWZpbmUgTkJfQ1VSU09SUyAoT0NSX0xBU1QyIC0gT0NSX0ZJUlNUMiArIDEgKyBPQ1JfTEFTVDEgLSBPQ1JfRklSU1QxICsgMSkKK3N0YXRpYyBjaGFyICoqT0JNX0N1cnNvcnNfRGF0YVtOQl9DVVJTT1JTXSA9IAoreworICAgIG9jcl9ub3JtYWwsICAgIC8qIE9DUl9OT1JNQUwgKi8KKyAgICBvY3JfaWJlYW0sICAgICAvKiBPQ1JfSUJFQU0gKi8KKyAgICBvY3Jfd2FpdCwgICAgICAvKiBPQ1JfV0FJVCAqLworICAgIG9jcl9jcm9zcywgICAgIC8qIE9DUl9DUk9TUyAqLworICAgIG9jcl91cCwgICAgICAgIC8qIE9DUl9VUCAqLworICAgIG9jcl9zaXplLCAgICAgIC8qIE9DUl9TSVpFICovCisgICAgb2NyX2ljb24sICAgICAgLyogT0NSX0lDT04gKi8KKyAgICBvY3Jfc2l6ZW53c2UsICAvKiBPQ1JfU0laRU5XU0UgKi8KKyAgICBvY3Jfc2l6ZW5lc3csICAvKiBPQ1JfU0laRU5FU1cgKi8KKyAgICBvY3Jfc2l6ZXdlLCAgICAvKiBPQ1JfU0laRVdFICovCisgICAgb2NyX3NpemVucyAgICAgLyogT0NSX1NJWkVOUyAqLworI2lmIDAKKyAgICBvY3Jfc2l6ZWFsbCwgICAvKiBPQ1JfU0laRUFMTCAqLworICAgIG9jcl9pY29jdXIgICAgIC8qIE9DUl9JQ09DVVIgKi8KKyNlbmRpZgorfTsKKworc3RhdGljIEhDVVJTT1IgT0JNX0N1cnNvcnNbTkJfQ1VSU09SU10gPSB7IDAsIH07CisKKwogICAvKiBBbGwgdGhlIGNvbG9ycyB1c2VkIGluIHRoZSB4cG0gZmlsZXMgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGlzICAgKi8KICAgLyogbGlzdCwgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxvYWRlZCBiaXRtYXBzIG9ubHkgdXNlIGNvbG9ycyBmcm9tICovCiAgIC8qIHRoZSBXaW5kb3dzIGNvbG9ybWFwLiBOb3RlOiB0aGUgUEFMRVRURUlOREVYKCkgYXJlIG5vdCByZWFsbHkgICAqLwpAQCAtMTY2LDcgKzIxMiw2IEBACiAgICAgQ09MT1JSRUYgY29sb3I7CiB9IE9CTV9TeW1ib2xpY0NvbG9yc1tdID0KIHsKLSAgICAgIC8qIEJsYWNrICYgd2hpdGUgbXVzdCBhbHdheXMgYmUgdGhlIGZpcnN0IDIgY29sb3JzICovCiAgICAgeyAiYmxhY2siLCAgICAgICAgICAgIFJHQigwLDAsMCkgfSwKICAgICB7ICJ3aGl0ZSIsICAgICAgICAgICAgUkdCKDI1NSwyNTUsMjU1KSB9LAogICAgIHsgInJlZCIsICAgICAgICAgICAgICBSR0IoMjU1LDAsMCkgfSwKQEAgLTE5MCw2ICsyMzUsMTYgQEAKICNkZWZpbmUgTkJfQ09MT1JfU1lNQk9MUyBcCiAgICAgICAgICAgICAoc2l6ZW9mKE9CTV9TeW1ib2xpY0NvbG9ycykvc2l6ZW9mKE9CTV9TeW1ib2xpY0NvbG9yc1swXSkpCiAKKyAgLyogVGhlc2UgYXJlIHRoZSBzeW1ib2xpYyBjb2xvcnMgZm9yIG1vbm9jaHJvbWUgYml0bWFwcyAgICovCisgIC8qIFRoaXMgaXMgbmVlZGVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJsYWNrIGlzIGFsd2F5cyAwIGFuZCAqLworICAvKiB3aGl0ZSBhbHdheXMgMSwgYXMgcmVxdWlyZWQgYnkgV2luZG93cy4gICAgICAgICAgICAgICAgKi8KKworc3RhdGljIFhwbUNvbG9yU3ltYm9sIE9CTV9CbGFja0FuZFdoaXRlWzJdID0KK3sKKyAgICB7ICJibGFjayIsIE5VTEwsIDAgfSwKKyAgICB7ICJ3aGl0ZSIsIE5VTEwsIDB4ZmZmZmZmZmYgfQorfTsKKwogc3RhdGljIFhwbUNvbG9yU3ltYm9sICpPQk1fQ29sb3JzID0gTlVMTDsKIAogCkBAIC0yNDMsNyArMjk4LDcgQEAKICAgICBibXBPYmpQdHItPmJpdG1hcC5ibVR5cGUgICAgICAgPSAwOwogICAgIGJtcE9ialB0ci0+Yml0bWFwLmJtV2lkdGggICAgICA9IHdpZHRoOwogICAgIGJtcE9ialB0ci0+Yml0bWFwLmJtSGVpZ2h0ICAgICA9IGhlaWdodDsKLSAgICBibXBPYmpQdHItPmJpdG1hcC5ibVdpZHRoQnl0ZXMgPSAod2lkdGggKyAxNSkgLyAxNiAqIDI7CisgICAgYm1wT2JqUHRyLT5iaXRtYXAuYm1XaWR0aEJ5dGVzID0gKHdpZHRoICogYnBwICsgMTUpIC8gMTYgKiAyOwogICAgIGJtcE9ialB0ci0+Yml0bWFwLmJtUGxhbmVzICAgICA9IDE7CiAgICAgYm1wT2JqUHRyLT5iaXRtYXAuYm1CaXRzUGl4ZWwgID0gYnBwOwogICAgIGJtcE9ialB0ci0+Yml0bWFwLmJtQml0cyAgICAgICA9IE5VTEw7CkBAIC0yNTcsMjIgKzMxMiwyOCBAQAogICogQ3JlYXRlIHRoZSAyIGJpdG1hcHMgZnJvbSBYUE0gZGF0YS4KICAqLwogc3RhdGljIEJPT0wgT0JNX0NyZWF0ZUJpdG1hcHMoIGNoYXIgKipkYXRhLCBCT09MIGNvbG9yLCBCT09MIG1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEJJVE1BUCAqaEJpdG1hcCwgSEJJVE1BUCAqaEJpdG1hcE1hc2sgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhCSVRNQVAgKmhCaXRtYXAsIEhCSVRNQVAgKmhCaXRtYXBNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPSU5UICpob3RzcG90ICkKIHsKICAgICBQaXhtYXAgcGl4bWFwLCBwaXhtYXNrOwogICAgIFhwbUF0dHJpYnV0ZXMgYXR0cnM7CiAgICAgaW50IGVycjsKIAotICAgIGF0dHJzLnZhbHVlbWFzayAgICA9IFhwbUNvbG9ybWFwIHwgWHBtRGVwdGggfCBYcG1Db2xvclN5bWJvbHM7CisgICAgYXR0cnMudmFsdWVtYXNrICAgID0gWHBtQ29sb3JtYXAgfCBYcG1EZXB0aCB8IFhwbUNvbG9yU3ltYm9scyB8IFhwbUhvdHNwb3Q7CiAgICAgYXR0cnMuY29sb3JtYXAgICAgID0gQ09MT1JfV2luQ29sb3JtYXA7CiAgICAgYXR0cnMuZGVwdGggICAgICAgID0gY29sb3IgPyBzY3JlZW5EZXB0aCA6IDE7Ci0gICAgYXR0cnMuY29sb3JzeW1ib2xzID0gT0JNX0NvbG9yczsKKyAgICBhdHRycy5jb2xvcnN5bWJvbHMgPSAoYXR0cnMuZGVwdGggPiAxKSA/IE9CTV9Db2xvcnMgOiBPQk1fQmxhY2tBbmRXaGl0ZTsKICAgICBhdHRycy5udW1zeW1ib2xzICAgPSAoYXR0cnMuZGVwdGggPiAxKSA/IE5CX0NPTE9SX1NZTUJPTFMgOiAyOwogICAgICAgICAKICAgICBlcnIgPSBYcG1DcmVhdGVQaXhtYXBGcm9tRGF0YSggZGlzcGxheSwgcm9vdFdpbmRvdywgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpeG1hcCwgJnBpeG1hc2ssICZhdHRycyApOwogCiAgICAgaWYgKGVyciAhPSBYcG1TdWNjZXNzKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKGhvdHNwb3QpCisgICAgeworICAgICAgICBob3RzcG90LT54ID0gYXR0cnMueF9ob3RzcG90OworICAgICAgICBob3RzcG90LT55ID0gYXR0cnMueV9ob3RzcG90OworICAgIH0KICAgICAqaEJpdG1hcCA9IE9CTV9NYWtlQml0bWFwKCBhdHRycy53aWR0aCwgYXR0cnMuaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmRlcHRoLCBwaXhtYXAgKTsKICAgICBpZiAobWFzaykgKmhCaXRtYXBNYXNrID0gT0JNX01ha2VCaXRtYXAoIGF0dHJzLndpZHRoLCBhdHRycy5oZWlnaHQsCkBAIC0zMDEsMTAgKzM2MiwxMCBAQAogCiAgICAgaWYgKCFPQk1fSW5pdENvbG9yU3ltYm9scygpKSByZXR1cm4gMDsKICAgICAKLSAgICBpZiAoIUNhbGxUbzMyX0xhcmdlU3RhY2soIChpbnQoKikoKSlPQk1fQ3JlYXRlQml0bWFwcywgNSwKKyAgICBpZiAoIUNhbGxUbzMyX0xhcmdlU3RhY2soIChpbnQoKikoKSlPQk1fQ3JlYXRlQml0bWFwcywgNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9CTV9QaXhtYXBzX0RhdGFbaWRdLmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQk1fUGl4bWFwc19EYXRhW2lkXS5jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAmaGJpdG1hcCwgJmhiaXRtYXNrICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgJmhiaXRtYXAsICZoYml0bWFzaywgTlVMTCwgTlVMTCApKQogICAgIHsKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiRXJyb3IgY3JlYXRpbmcgT0VNIGJpdG1hcCAlZFxuIiwgT0JNX0ZJUlNUK2lkICk7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMzE0LDYwICszNzUsOTUgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBPQk1fTG9hZEljb24KKyAqICAgICAgICAgICBPQk1fTG9hZEN1cnNvckljb24KICAqLwotSElDT04gT0JNX0xvYWRJY29uKCBXT1JEIGlkICkKK0hBTkRMRSBPQk1fTG9hZEN1cnNvckljb24oIFdPUkQgaWQsIEJPT0wgZkN1cnNvciApCiB7Ci0gICAgSElDT04gaGljb247Ci0gICAgSUNPTkFMTE9DICpwSWNvbjsKLSAgICBCSVRNQVBPQkogKmJtcDsKKyAgICBIQU5ETEUgaGFuZGxlOworICAgIENVUlNPUklDT05JTkZPICpwSW5mbzsKKyAgICBCSVRNQVBPQkogKmJtcFhvciwgKmJtcEFuZDsKKyAgICBIQklUTUFQIGhYb3JCaXRzLCBoQW5kQml0czsKKyAgICBQT0lOVCBob3RzcG90OworICAgIGludCBzaXplWG9yLCBzaXplQW5kOwogCi0gICAgaWYgKChpZCA8IE9JQ19GSVJTVCkgfHwgKGlkID4gT0lDX0xBU1QpKSByZXR1cm4gMDsKLSAgICBpZCAtPSBPSUNfRklSU1Q7CisgICAgaWYgKGZDdXJzb3IpCisgICAgeworICAgICAgICBpZiAoKGlkID49IE9DUl9GSVJTVDEpICYmIChpZCA8PSBPQ1JfTEFTVDEpKQorICAgICAgICAgICAgaWQgLT0gT0NSX0ZJUlNUMTsKKyAgICAgICAgZWxzZSBpZiAoKGlkID49IE9DUl9GSVJTVDIpICYmIChpZCA8PSBPQ1JfTEFTVDIpKQorICAgICAgICAgICAgaWQgKz0gKE9DUl9MQVNUMSAtIE9DUl9GSVJTVDEgKyAxKSAtIE9DUl9GSVJTVDI7CisgICAgICAgIGVsc2UgcmV0dXJuIDA7CisgICAgICAgIGlmIChPQk1fQ3Vyc29yc1tpZF0pIHJldHVybiBPQk1fQ3Vyc29yc1tpZF07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICgoaWQgPCBPSUNfRklSU1QpIHx8IChpZCA+IE9JQ19MQVNUKSkgcmV0dXJuIDA7CisgICAgICAgIGlkIC09IE9JQ19GSVJTVDsKKyAgICB9CiAKICAgICBpZiAoIU9CTV9Jbml0Q29sb3JTeW1ib2xzKCkpIHJldHVybiAwOwogICAgIAotICAgIGlmICghKGhpY29uID0gR2xvYmFsQWxsb2MoIEdNRU1fTU9WRUFCTEUsIHNpemVvZihJQ09OQUxMT0MpICkpKSByZXR1cm4gMDsKLSAgICBwSWNvbiA9IChJQ09OQUxMT0MgKilHbG9iYWxMb2NrKCBoaWNvbiApOwotCi0gICAgaWYgKCFDYWxsVG8zMl9MYXJnZVN0YWNrKCAoaW50KCopKCkpT0JNX0NyZWF0ZUJpdG1hcHMsIDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQk1fSWNvbnNfRGF0YVtpZF0sIFRSVUUsIFRSVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEljb24tPmhCaXRtYXAsICZwSWNvbi0+aEJpdE1hc2sgKSkKKyAgICBpZiAoIUNhbGxUbzMyX0xhcmdlU3RhY2soIChpbnQoKikoKSlPQk1fQ3JlYXRlQml0bWFwcywgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDdXJzb3IgPyBPQk1fQ3Vyc29yc19EYXRhW2lkXSA6IE9CTV9JY29uc19EYXRhW2lkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICFmQ3Vyc29yLCBUUlVFLCAmaFhvckJpdHMsICZoQW5kQml0cywgJmhvdHNwb3QgKSkKICAgICB7Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkVycm9yIGNyZWF0aW5nIE9FTSBpY29uICVkXG4iLCBPSUNfRklSU1QraWQgKTsKLSAgICAgICAgR2xvYmFsRnJlZSggaGljb24gKTsKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiRXJyb3IgY3JlYXRpbmcgT0VNIGN1cnNvci9pY29uICVkXG4iLCBpZCApOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBibXAgPSAoQklUTUFQT0JKICopIEdESV9HZXRPYmpQdHIoIHBJY29uLT5oQml0bWFwLCBCSVRNQVBfTUFHSUMgKTsKLSAgICBwSWNvbi0+ZGVzY3JpcHRvci5XaWR0aCA9IGJtcC0+Yml0bWFwLmJtV2lkdGg7Ci0gICAgcEljb24tPmRlc2NyaXB0b3IuSGVpZ2h0ID0gYm1wLT5iaXRtYXAuYm1IZWlnaHQ7Ci0gICAgcEljb24tPmRlc2NyaXB0b3IuQ29sb3JDb3VudCA9IGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsOworICAgIGJtcFhvciA9IChCSVRNQVBPQkogKikgR0RJX0dldE9ialB0ciggaFhvckJpdHMsIEJJVE1BUF9NQUdJQyApOworICAgIGJtcEFuZCA9IChCSVRNQVBPQkogKikgR0RJX0dldE9ialB0ciggaEFuZEJpdHMsIEJJVE1BUF9NQUdJQyApOworICAgIHNpemVYb3IgPSBibXBYb3ItPmJpdG1hcC5ibUhlaWdodCAqIGJtcFhvci0+Yml0bWFwLmJtV2lkdGhCeXRlczsKKyAgICBzaXplQW5kID0gYm1wWG9yLT5iaXRtYXAuYm1IZWlnaHQgKiAoKGJtcFhvci0+Yml0bWFwLmJtV2lkdGgrMTUpIC8gMTYgKiAyKTsKIAotICAgIGlmIChwSWNvbi0+aEJpdE1hc2spCisgICAgaWYgKCEoaGFuZGxlID0gR2xvYmFsQWxsb2MoIEdNRU1fTU9WRUFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDVVJTT1JJQ09OSU5GTykgKyBzaXplWG9yICsgc2l6ZUFuZCkpKQogICAgIHsKLSAgICAgICAgQklUTUFQT0JKICpibXBNYXNrOworICAgICAgICBEZWxldGVPYmplY3QoIGhYb3JCaXRzICk7CisgICAgICAgIERlbGV0ZU9iamVjdCggaEFuZEJpdHMgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCisgICAgcEluZm8gPSAoQ1VSU09SSUNPTklORk8gKilHbG9iYWxMb2NrKCBoYW5kbGUgKTsKKyAgICBwSW5mby0+cHRIb3RTcG90LnggICA9IGhvdHNwb3QueDsKKyAgICBwSW5mby0+cHRIb3RTcG90LnkgICA9IGhvdHNwb3QueTsKKyAgICBwSW5mby0+bldpZHRoICAgICAgICA9IGJtcFhvci0+Yml0bWFwLmJtV2lkdGg7CisgICAgcEluZm8tPm5IZWlnaHQgICAgICAgPSBibXBYb3ItPmJpdG1hcC5ibUhlaWdodDsKKyAgICBwSW5mby0+bldpZHRoQnl0ZXMgICA9IGJtcFhvci0+Yml0bWFwLmJtV2lkdGhCeXRlczsKKyAgICBwSW5mby0+YlBsYW5lcyAgICAgICA9IGJtcFhvci0+Yml0bWFwLmJtUGxhbmVzOworICAgIHBJbmZvLT5iQml0c1BlclBpeGVsID0gYm1wWG9yLT5iaXRtYXAuYm1CaXRzUGl4ZWw7CisKKyAgICBpZiAoaEFuZEJpdHMpCisgICAgewogICAgICAgICAgIC8qIEludmVydCB0aGUgbWFzayAqLwotICAgICAgICBibXBNYXNrID0gKEJJVE1BUE9CSiAqKSBHRElfR2V0T2JqUHRyKCBwSWNvbi0+aEJpdE1hc2ssIEJJVE1BUF9NQUdJQyApOworCiAgICAgICAgIFhTZXRGdW5jdGlvbiggZGlzcGxheSwgQklUTUFQX21vbm9HQywgR1hpbnZlcnQgKTsKLSAgICAgICAgWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGJtcE1hc2stPnBpeG1hcCwgQklUTUFQX21vbm9HQywgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJtcE1hc2stPmJpdG1hcC5ibVdpZHRoLCBibXBNYXNrLT5iaXRtYXAuYm1IZWlnaHQgKTsKKyAgICAgICAgWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGJtcEFuZC0+cGl4bWFwLCBCSVRNQVBfbW9ub0dDLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgYm1wQW5kLT5iaXRtYXAuYm1XaWR0aCwgYm1wQW5kLT5iaXRtYXAuYm1IZWlnaHQgKTsKKyAgICAgICAgWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBCSVRNQVBfbW9ub0dDLCBHWGNvcHkgKTsKIAogICAgICAgICAgIC8qIFNldCB0aGUgbWFza2VkIHBpeGVscyB0byBibGFjayAqLwotICAgICAgICBpZiAoYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWwgIT0gMSkKKworICAgICAgICBpZiAoYm1wWG9yLT5iaXRtYXAuYm1CaXRzUGl4ZWwgIT0gMSkKICAgICAgICAgewogICAgICAgICAgICAgWFNldEZvcmVncm91bmQoIGRpc3BsYXksIEJJVE1BUF9jb2xvckdDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTE9SX1RvUGh5c2ljYWwoIE5VTEwsIFJHQigwLDAsMCkgKSk7CiAgICAgICAgICAgICBYU2V0QmFja2dyb3VuZCggZGlzcGxheSwgQklUTUFQX2NvbG9yR0MsIDAgKTsKICAgICAgICAgICAgIFhTZXRGdW5jdGlvbiggZGlzcGxheSwgQklUTUFQX2NvbG9yR0MsIEdYb3IgKTsKLSAgICAgICAgICAgIFhDb3B5UGxhbmUoIGRpc3BsYXksIGJtcE1hc2stPnBpeG1hcCwgYm1wLT5waXhtYXAsIEJJVE1BUF9jb2xvckdDLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgYm1wLT5iaXRtYXAuYm1XaWR0aCwgYm1wLT5iaXRtYXAuYm1IZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAxICk7CisgICAgICAgICAgICBYQ29weVBsYW5lKGRpc3BsYXksIGJtcEFuZC0+cGl4bWFwLCBibXBYb3ItPnBpeG1hcCwgQklUTUFQX2NvbG9yR0MsCisgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGJtcFhvci0+Yml0bWFwLmJtV2lkdGgsIGJtcFhvci0+Yml0bWFwLmJtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAxICk7CiAgICAgICAgICAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIEJJVE1BUF9jb2xvckdDLCBHWGNvcHkgKTsKICAgICAgICAgfQotICAgICAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIEJJVE1BUF9tb25vR0MsIEdYY29weSApOwogICAgIH0KIAotICAgIHJldHVybiBoaWNvbjsKKyAgICBpZiAoaEFuZEJpdHMpIEdldEJpdG1hcEJpdHMoIGhBbmRCaXRzLCBzaXplQW5kLCAoY2hhciAqKShwSW5mbyArIDEpICk7CisgICAgZWxzZSBtZW1zZXQoIChjaGFyICopKHBJbmZvICsgMSksIDB4ZmYsIHNpemVBbmQgKTsKKyAgICBHZXRCaXRtYXBCaXRzKCBoWG9yQml0cywgc2l6ZVhvciwgKGNoYXIgKikocEluZm8gKyAxKSArIHNpemVBbmQgKTsKKworICAgIERlbGV0ZU9iamVjdCggaFhvckJpdHMgKTsKKyAgICBEZWxldGVPYmplY3QoIGhBbmRCaXRzICk7CisKKyAgICBpZiAoZkN1cnNvcikgT0JNX0N1cnNvcnNbaWRdID0gaGFuZGxlOworICAgIHJldHVybiBoYW5kbGU7CiB9CmRpZmYgLS1naXQgYS9vYmplY3RzL3BhbGV0dGUuYyBiL29iamVjdHMvcGFsZXR0ZS5jCmluZGV4IGRkOTI1Y2UuLjdmYTJjZmUgMTAwNjQ0Ci0tLSBhL29iamVjdHMvcGFsZXR0ZS5jCisrKyBiL29iamVjdHMvcGFsZXR0ZS5jCkBAIC04MCw2ICs4MCwxNCBAQAogICAgIHJldHVybiBjb3VudDsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUmVzaXplUGFsZXR0ZSAgICAgICAgICAoR0RJLjM2OCkKKyAqLworQk9PTCBSZXNpemVQYWxldHRlKEhQQUxFVFRFIGhQYWwsIFVJTlQgY0VudHJpZXMpCit7CisgZnByaW50ZihzdGRuaW1wLCJSZXNpemVQYWxldHRlOiBlbXB0eSBzdHViISBcbiIpOworIHJldHVybiBGQUxTRTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2V0U3lzdGVtUGFsZXR0ZVVzZSAgICAoR0RJLjM3MykKQEAgLTkwLDcgKzk4LDcgQEAKIFdPUkQgU2V0U3lzdGVtUGFsZXR0ZVVzZSggSERDIGhkYywgV09SRCB1c2UpCiB7CiAJIFdPUkQgb2xkPVN5c3RlbVBhbGV0dGVVc2U7Ci0JIHByaW50ZigiU2V0U3lzdGVtUGFsZXR0ZVVzZSglMDRYLCUwNFgpIC8vIGVtcHR5IHN0dWIgISEhXG4iLCBoZGMsIHVzZSk7CisJIHByaW50ZigiU2V0U3lzdGVtUGFsZXR0ZVVzZSgiTlBGTVQiLCUwNFgpIC8vIGVtcHR5IHN0dWIgISEhXG4iLCBoZGMsIHVzZSk7CiAJIFN5c3RlbVBhbGV0dGVVc2U9dXNlOwogCSByZXR1cm4gb2xkOwogfQpAQCAtMTAwLDcgKzEwOCw3IEBACiAgKi8KIFdPUkQgR2V0U3lzdGVtUGFsZXR0ZVVzZSggSERDIGhkYyApCiB7Ci0JcHJpbnRmKCJHZXRTeXN0ZW1QYWxldHRlVXNlKCUwNFgpIC8vIGVtcHR5IHN0dWIgISEhXG4iLCBoZGMpOworCXByaW50ZigiR2V0U3lzdGVtUGFsZXR0ZVVzZSgiTlBGTVQiKSAvLyBlbXB0eSBzdHViICEhIVxuIiwgaGRjKTsKIAlyZXR1cm4gU3lzdGVtUGFsZXR0ZVVzZTsKIH0KIApAQCAtMTc1LDcgKzE4Myw3IEBACiAJfQogCWVudHJ5Kys7CiAgICAgfQotICAgIGRwcmludGZfcGFsZXR0ZShzdGRkZWIsIkdldE5lYXJlc3RQYWxldHRlSW5kZXgoJXgsJTA2bHgpOiByZXR1cm5pbmcgJWRcbiIsIAorICAgIGRwcmludGZfcGFsZXR0ZShzdGRkZWIsIkdldE5lYXJlc3RQYWxldHRlSW5kZXgoIk5QRk1UIiwlMDZseCk6IHJldHVybmluZyAlZFxuIiwgCiAJICAgICBocGFsZXR0ZSwgY29sb3IsIGluZGV4ICk7CiAgICAgcmV0dXJuIGluZGV4OwogfQpAQCAtMjAwLDcgKzIwOCw3IEBACiAgICAgSFBBTEVUVEUgcHJldjsKICAgICBEQyAqZGM7CiAKLSAgICBkcHJpbnRmX3BhbGV0dGUoc3RkZGViLCAiR0RJU2VsZWN0UGFsZXR0ZTogJWQgJWRcbiIsIGhkYywgaHBhbCApOworICAgIGRwcmludGZfcGFsZXR0ZShzdGRkZWIsICJHRElTZWxlY3RQYWxldHRlOiAiTlBGTVQiICJOUEZNVCJcbiIsIGhkYywgaHBhbCApOwogICAgIGlmICghKGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKSkpIHJldHVybiAwOwogICAgIHByZXYgPSBkYy0+dy5oUGFsZXR0ZTsKICAgICBkYy0+dy5oUGFsZXR0ZSA9IGhwYWw7CkBAIC0yMTUsNyArMjIzLDcgQEAKICAqLwogVUlOVCBHRElSZWFsaXplUGFsZXR0ZSggSERDIGhkYyApCiB7Ci0gICAgZHByaW50Zl9wYWxldHRlKHN0ZG5pbXAsICJHRElSZWFsaXplUGFsZXR0ZTogJWRcbiIsIGhkYyApOworICAgIGRwcmludGZfcGFsZXR0ZShzdGRuaW1wLCAiR0RJUmVhbGl6ZVBhbGV0dGU6ICJOUEZNVCJcbiIsIGhkYyApOwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9vYmplY3RzL3Blbi5jIGIvb2JqZWN0cy9wZW4uYwppbmRleCAxMzE2NjdhLi5hZGYwMmU2IDEwMDY0NAotLS0gYS9vYmplY3RzL3Blbi5jCisrKyBiL29iamVjdHMvcGVuLmMKQEAgLTYxLDcgKzYxLDEwIEBACiAgICAgSFBFTiBwcmV2SGFuZGxlID0gZGMtPncuaFBlbjsKIAogICAgIGlmIChkYy0+aGVhZGVyLndNYWdpYyA9PSBNRVRBRklMRV9EQ19NQUdJQykKLQlyZXR1cm4gTUZfQ3JlYXRlUGVuSW5kaXJlY3QoZGMsIGhwZW4sICYocGVuLT5sb2dwZW4pKTsKKyAgICAgIGlmIChNRl9DcmVhdGVQZW5JbmRpcmVjdChkYywgaHBlbiwgJihwZW4tPmxvZ3BlbikpKQorCXJldHVybiBwcmV2SGFuZGxlOworICAgICAgZWxzZQorCXJldHVybiAwOwogCiAgICAgZGMtPncuaFBlbiA9IGhwZW47CiAKZGlmZiAtLWdpdCBhL29iamVjdHMvcmVnaW9uLmMgYi9vYmplY3RzL3JlZ2lvbi5jCmluZGV4IDAyYTEwZDcuLjViZTIzZmYgMTAwNjQ0Ci0tLSBhL29iamVjdHMvcmVnaW9uLmMKKysrIGIvb2JqZWN0cy9yZWdpb24uYwpAQCAtMTksNyArMTksNyBAQAogICovCiBCT09MIFJFR0lPTl9EZWxldGVPYmplY3QoIEhSR04gaHJnbiwgUkdOT0JKICogb2JqICkKIHsKLSAgICBkcHJpbnRmX3JlZ2lvbihzdGRkZWIsICJEZWxldGVSZWdpb246ICV4XG4iLCBocmduICk7CisgICAgZHByaW50Zl9yZWdpb24oc3RkZGViLCAiRGVsZXRlUmVnaW9uOiAiTlBGTVQiXG4iLCBocmduICk7CiAgICAgaWYgKG9iai0+eHJnbikgWERlc3Ryb3lSZWdpb24oIG9iai0+eHJnbiApOwogICAgIHJldHVybiBHRElfRnJlZU9iamVjdCggaHJnbiApOwogfQpAQCAtMzIsNyArMzIsNyBAQAogewogICAgIFJHTk9CSiAqIG9iaiA9IChSR05PQkogKikgR0RJX0dldE9ialB0ciggaHJnbiwgUkVHSU9OX01BR0lDICk7CiAgICAgaWYgKCFvYmopIHJldHVybiBFUlJPUjsKLSAgICBkcHJpbnRmX3JlZ2lvbihzdGRkZWIsICJPZmZzZXRSZ246ICVkICVkLCVkXG4iLCBocmduLCB4LCB5ICk7CisgICAgZHByaW50Zl9yZWdpb24oc3RkZGViLCAiT2Zmc2V0UmduOiAiTlBGTVQiICVkLCVkXG4iLCBocmduLCB4LCB5ICk7CiAgICAgaWYgKCFvYmotPnhyZ24pIHJldHVybiBOVUxMUkVHSU9OOwogICAgIFhPZmZzZXRSZWdpb24oIG9iai0+eHJnbiwgeCwgeSApOwogICAgIHJldHVybiBDT01QTEVYUkVHSU9OOwpAQCAtNDYsNyArNDYsNyBAQAogewogICAgIFJHTk9CSiAqIG9iaiA9IChSR05PQkogKikgR0RJX0dldE9ialB0ciggaHJnbiwgUkVHSU9OX01BR0lDICk7CiAgICAgaWYgKCFvYmopIHJldHVybiBFUlJPUjsKLSAgICBkcHJpbnRmX3JlZ2lvbihzdGRkZWIsICJHZXRSZ25Cb3g6ICVkXG4iLCBocmduICk7CisgICAgZHByaW50Zl9yZWdpb24oc3RkZGViLCAiR2V0UmduQm94OiAiTlBGTVQiXG4iLCBocmduICk7CiAgICAgaWYgKCFvYmotPnhyZ24pCiAgICAgewogICAgICAgICBTZXRSZWN0RW1wdHkoIHJlY3QgKTsKQEAgLTg0LDcgKzg0LDcgQEAKICAgICAgICAgWFVuaW9uUmVjdFdpdGhSZWdpb24oICZyZWN0LCBvYmotPnhyZ24sIG9iai0+eHJnbiApOwogICAgIH0KICAgICBlbHNlIG9iai0+eHJnbiA9IDA7Ci0gICAgZHByaW50Zl9yZWdpb24oIHN0ZGRlYiwgIkNyZWF0ZVJlY3RSZ24oJWQsJWQtJWQsJWQpOiByZXR1cm5pbmcgJXhcbiIsCisgICAgZHByaW50Zl9yZWdpb24oIHN0ZGRlYiwgIkNyZWF0ZVJlY3RSZ24oJWQsJWQtJWQsJWQpOiByZXR1cm5pbmcgIk5QRk1UIlxuIiwKICAgICAgICAgICAgICAgICAgICAgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBocmduICk7CiAgICAgcmV0dXJuIGhyZ247CiB9CkBAIC0xMDYsNyArMTA2LDcgQEAKIHsKICAgICBSR05PQkogKiBvYmo7CiAKLSAgICBkcHJpbnRmX3JlZ2lvbihzdGRkZWIsICJTZXRSZWN0UmduOiAleCAlZCwlZC0lZCwlZFxuIiwgCisgICAgZHByaW50Zl9yZWdpb24oc3RkZGViLCAiU2V0UmVjdFJnbjogIk5QRk1UIiAlZCwlZC0lZCwlZFxuIiwgCiAJCSAgIGhyZ24sIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSApOwogICAgIAogICAgIGlmICghKG9iaiA9IChSR05PQkogKikgR0RJX0dldE9ialB0ciggaHJnbiwgUkVHSU9OX01BR0lDICkpKSByZXR1cm47CkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICBpZiAoIShocmduID0gR0RJX0FsbG9jT2JqZWN0KCBzaXplb2YoUkdOT0JKKSwgUkVHSU9OX01BR0lDICkpKSByZXR1cm4gMDsKICAgICBvYmogPSAoUkdOT0JKICopIEdESV9IRUFQX0xJTl9BRERSKCBocmduICk7CiAgICAgb2JqLT54cmduID0gWENyZWF0ZVJlZ2lvbigpOwotICAgIGRwcmludGZfcmVnaW9uKHN0ZGRlYiwiQ3JlYXRlUm91bmRSZWN0UmduKCVkLCVkLSVkLCVkICVkeCVkKTogcmV0dXJuPSV4XG4iLAorICAgIGRwcmludGZfcmVnaW9uKHN0ZGRlYiwiQ3JlYXRlUm91bmRSZWN0UmduKCVkLCVkLSVkLCVkICVkeCVkKTogcmV0dXJuPSJOUEZNVCJcbiIsCiAgICAgICAgICAgICAgICBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIGVsbGlwc2Vfd2lkdGgsIGVsbGlwc2VfaGVpZ2h0LCBocmduICk7CiAKICAgICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KQEAgLTI3Niw3ICsyNzYsNyBAQAogICAgIH0KICAgICBvYmogPSAoUkdOT0JKICopIEdESV9IRUFQX0xJTl9BRERSKCBocmduICk7CiAgICAgb2JqLT54cmduID0gMDsKLSAgICBkcHJpbnRmX3JlZ2lvbihzdGRkZWIsICJDcmVhdGVQb2x5UG9seWdvblJnbjogJWQgcG9seWdvbnMsIHJldHVybmluZyAleFxuIiwKKyAgICBkcHJpbnRmX3JlZ2lvbihzdGRkZWIsICJDcmVhdGVQb2x5UG9seWdvblJnbjogJWQgcG9seWdvbnMsIHJldHVybmluZyAiTlBGTVQiXG4iLAogICAgICAgICAgICAgICAgICAgIG5icG9seWdvbnMsIGhyZ24gKTsKIAogICAgICAgLyogQ3JlYXRlIFggcmVnaW9uICovCkBAIC00MDYsNyArNDA2LDcgQEAKIHsKICAgICBSR05PQkogKmRlc3RPYmosICpzcmMxT2JqLCAqc3JjMk9iajsKICAgICAKLSAgICBkcHJpbnRmX3JlZ2lvbihzdGRkZWIsICJDb21iaW5lUmduOiAleCwleCAtPiAleCBtb2RlPSV4XG4iLCAKKyAgICBkcHJpbnRmX3JlZ2lvbihzdGRkZWIsICJDb21iaW5lUmduOiAiTlBGTVQiLCJOUEZNVCIgLT4gIk5QRk1UIiBtb2RlPSV4XG4iLCAKIAkJICAgaFNyYzEsIGhTcmMyLCBoRGVzdCwgbW9kZSApOwogICAgIAogICAgIGlmICghKGRlc3RPYmogPSAoUkdOT0JKICopIEdESV9HZXRPYmpQdHIoIGhEZXN0LCBSRUdJT05fTUFHSUMgKSkpCmRpZmYgLS1naXQgYS9vYmplY3RzL3RleHQuYyBiL29iamVjdHMvdGV4dC5jCmluZGV4IDFlZTY0ZDAuLmZkOTRiMTAgMTAwNjQ0Ci0tLSBhL29iamVjdHMvdGV4dC5jCisrKyBiL29iamVjdHMvdGV4dC5jCkBAIC01NzEsNyArNTcxLDcgQEAKIExPTkcgVGFiYmVkVGV4dE91dCggSERDIGhkYywgc2hvcnQgeCwgc2hvcnQgeSwgTFBTVFIgbHBzdHIsIHNob3J0IGNvdW50LCAKICAgICAgICAgICAgICAgICAgICAgc2hvcnQgY1RhYlN0b3BzLCBMUElOVCBscFRhYlBvcywgc2hvcnQgblRhYk9yZyApCiB7Ci0gICAgZHByaW50Zl90ZXh0KCBzdGRkZWIsICJUYWJiZWRUZXh0T3V0OiAleCAlZCwlZCAnJSouKnMnICVkXG4iLAorICAgIGRwcmludGZfdGV4dCggc3RkZGViLCAiVGFiYmVkVGV4dE91dDogIk5QRk1UIiAlZCwlZCAnJSouKnMnICVkXG4iLAogICAgICAgICAgICAgICAgICAgaGRjLCB4LCB5LCBjb3VudCwgY291bnQsIGxwc3RyLCBjb3VudCApOwogICAgIHJldHVybiBURVhUX1RhYmJlZFRleHRPdXQoIGhkYywgeCwgeSwgbHBzdHIsIGNvdW50LCBjVGFiU3RvcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBUYWJQb3MsIG5UYWJPcmcsIFRSVUUgKTsKQEAgLTU4NCw3ICs1ODQsNyBAQAogRFdPUkQgR2V0VGFiYmVkVGV4dEV4dGVudCggSERDIGhkYywgTFBTVFIgbHBzdHIsIGludCBjb3VudCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjVGFiU3RvcHMsIExQSU5UIGxwVGFiUG9zICkKIHsKLSAgICBkcHJpbnRmX3RleHQoIHN0ZGRlYiwgIkdldFRhYmJlZFRleHRFeHRlbnQ6ICV4ICclKi4qcycgJWRcbiIsCisgICAgZHByaW50Zl90ZXh0KCBzdGRkZWIsICJHZXRUYWJiZWRUZXh0RXh0ZW50OiAiTlBGTVQiICclKi4qcycgJWRcbiIsCiAgICAgICAgICAgICAgICAgICBoZGMsIGNvdW50LCBjb3VudCwgbHBzdHIsIGNvdW50ICk7CiAgICAgcmV0dXJuIFRFWFRfVGFiYmVkVGV4dE91dCggaGRjLCAwLCAwLCBscHN0ciwgY291bnQsIGNUYWJTdG9wcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscFRhYlBvcywgMCwgRkFMU0UgKTsKZGlmZiAtLWdpdCBhL3JjL0ltYWtlZmlsZSBiL3JjL0ltYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxY2I4Zi4uMDAwMDAwMAotLS0gYS9yYy9JbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0jaW5jbHVkZSAiLi4vV2luZS50bXBsIgotCi1NT0RVTEUgPSByYwotCi0uU1VGRklYRVM6IC5yYwotCi0ucmMuYzoKLQllY2hvICIjaW5jbHVkZSBcIndpbmRvd3MuaFwiIiA+JCoucmN0Ci0JZWNobyBXSU5ET1dTX0hfRU5EU19IRVJFID4+JCoucmN0Ci0JY2F0ICQ8ID4+JCoucmN0Ci0JJChDQykgLUUgLXggYyAtUCAkKENGTEFHUykgJCoucmN0IHwgc2VkIC1lICcxLC9eV0lORE9XU19IX0VORFNfSEVSRS9kJyB8IC4vd2luZXJjIC1vICQqIC12IC1wICQqCi0JJChSTSkgJCoucmN0Ci0KLVhDT01NIFRoaXMgd291bGQgYmUgbmljZXIsIGJ1dCBpdCBicmVha3MgZ2NjICgyLjUuOCBvbiBMaW51eCkgIC0tQUoKLVhDT01NIGdjYyAtRSAteCBjIC1QICQoQ0ZMQUdTKSAtaW1hY3JvcyAuLi9pbmNsdWRlL3dpbmRvd3MuaCAkKi5yYyB8IC4vd2luZXJjIC1vICQqIC12IC1wICQqCi0KLVJDU1JDUyA9IHN5c3Jlcy5yYwotCi1SQ09CSlMgPSAkKFJDU1JDUzoucmM9Lm8pCi0KLVdpbmVSZWxvY2F0YWJsZVRhcmdldCgkKE1PRFVMRSksLCQoUkNPQkpTKSkKLQotJChSQ09CSlMpOiB3aW5lcmMgJChUT1ApL2luY2x1ZGUvd2luZG93cy5oCi0KLWluY2x1ZGVzOjoKLQl0b3VjaCAkKFJDU1JDUzoucmM9LmgpCi0KLWNsZWFuOjoKLQkkKFJNKSAkKFJDU1JDUzoucmM9LmMpICQoUkNTUkNTOi5yYz0uaCkgJChSQ1NSQ1M6LnJjPS5yY3QpCi0KLQotWENPTU0gUnVsZXMgdG8gYnVpbGQgdGhlIHdpbmVyYyBwcm9ncmFtCi0KLVNSQ1MgPSBcCi0JbGV4Lnl5LmMgXAotCXdpbmVyYy5jIFwKLQl5LnRhYi5jCi0KLU9CSlMgPSAkKFNSQ1M6LmM9Lm8pCi0KLSNpZmRlZiBTdW5BcmNoaXRlY3R1cmUKLVlBQ0M9Ymlzb24gLXkKLUxFWD1mbGV4Ci1MT0NBTF9MSUJSQVJJRVMgPSAtbHkgLWxsCi0jZW5kaWYKLSNpZiBkZWZpbmVkKGkzODZCc2RBcmNoaXRlY3R1cmUpIHx8IGRlZmluZWQoaTM4NkZyZWVCc2QpIHx8IGRlZmluZWQoRnJlZUJTREFyY2hpdGVjdHVyZSkKLUxPQ0FMX0xJQlJBUklFUyA9IC1sbAotI2VuZGlmCi0KLU5vcm1hbFByb2dyYW1UYXJnZXQod2luZXJjLCQoT0JKUyksJChERVBMSUJTKSwkKExPQ0FMX0xJQlJBUklFUyksKQotCi1kZXBlbmQ6OiB5LnRhYi5jIHkudGFiLmggbGV4Lnl5LmMKLQotRGVwZW5kVGFyZ2V0KCkKLQotY2xlYW46OgotCSQoUk0pIGxleC55eS5jIHkudGFiLioKLQoteS50YWIuYyB5LnRhYi5oOiBwYXJzZXIueQotCSQoWUFDQykgLWQgLXQgcGFyc2VyLnkKLQotbGV4Lnl5LmM6IHBhcnNlci5sIHkudGFiLmgKLQkkKExFWCkgLTggLUkgcGFyc2VyLmwKLSAKLQpkaWZmIC0tZ2l0IGEvcmMvTWFrZWZpbGUuaW4gYi9yYy9NYWtlZmlsZS5pbgppbmRleCBhZWM4ZDAyLi4wZjU1OGM2IDEwMDY0NAotLS0gYS9yYy9NYWtlZmlsZS5pbgorKysgYi9yYy9NYWtlZmlsZS5pbgpAQCAtNCw2ICs0LDggQEAKIAogQ19TUkNTID0gc3lzcmVzLmMKIAorTEFOR1VBR0VTID0gRW4gRXMgRGUgTm8gRnIgRmkgRGEKKwogYWxsOiAkKE1PRFVMRSkubwogCiBATUFLRV9SVUxFU0AKQEAgLTE3LDcgKzE5LDcgQEAKIHdpbmVyYzogbGV4Lnl5Lm8gd2luZXJjLm8geS50YWIubwogCSQoQ0MpICQoQUxMQ0ZMQUdTKSBsZXgueXkubyB3aW5lcmMubyB5LnRhYi5vIC1vIHdpbmVyYyAkKExFWExJQikKIAotc3lzcmVzLnJjdDogc3lzcmVzLnJjIHN5c3Jlc19Fbi5yYyBzeXNyZXNfRXMucmMgc3lzcmVzX0RlLnJjIHN5c3Jlc19Oby5yYworc3lzcmVzLnJjdDogc3lzcmVzLnJjICQoTEFOR1VBR0VTOiU9c3lzcmVzXyUucmMpCiAJZWNobyAiI2luY2x1ZGUgXCJ3aW5kb3dzLmhcIiIgPnN5c3Jlcy5yY3QKIAllY2hvIFdJTkRPV1NfSF9FTkRTX0hFUkUgPj5zeXNyZXMucmN0CiAJY2F0IHN5c3Jlcy5yYyA+PnN5c3Jlcy5yY3QKZGlmZiAtLWdpdCBhL3JjL3BhcnNlci5oIGIvcmMvcGFyc2VyLmgKaW5kZXggNTA2NGM2MC4uZGM2NjdiYSAxMDA2NDQKLS0tIGEvcmMvcGFyc2VyLmgKKysrIGIvcmMvcGFyc2VyLmgKQEAgLTc3LDYgKzc3LDkgQEAKIGdlbl9yZXMqIG1ha2VfZGlhbG9nKGdlbl9yZXMqLGludCxpbnQsaW50LGludCxnZW5fcmVzKik7CiAKIGdlbl9yZXMgKmhleF90b19yYXcoY2hhciosZ2VuX3JlcyopOworZ2VuX3JlcyAqaW50X3RvX3JhdyhpbnQsZ2VuX3JlcyopOworZ2VuX3JlcyAqbWFrZV9mb250KGdlbl9yZXMqKTsKK2dlbl9yZXMgKm1ha2VfcmF3KGdlbl9yZXMqKTsKIGdlbl9yZXMgKm1ha2VfYml0bWFwKGdlbl9yZXMqKTsKIGdlbl9yZXMgKm1ha2VfaWNvbihnZW5fcmVzKik7CiBnZW5fcmVzICptYWtlX2N1cnNvcihnZW5fcmVzKik7CmRpZmYgLS1naXQgYS9yYy9wYXJzZXIueSBiL3JjL3BhcnNlci55CmluZGV4IGQ4ZDcwMDQuLjEyMWM1MDggMTAwNjQ0Ci0tLSBhL3JjL3BhcnNlci55CisrKyBiL3JjL3BhcnNlci55CkBAIC0yMDQsNSArMjA0LDYgQEAKIGludCB5eWVycm9yKGNoYXIgKnMpCiB7CiAJcHV0cyhzKTsKKwlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvcmMvc3lzcmVzLnJjIGIvcmMvc3lzcmVzLnJjCmluZGV4IDRjZDJlZmQuLjUyZTM3NDkgMTAwNjQ0Ci0tLSBhL3JjL3N5c3Jlcy5yYworKysgYi9yYy9zeXNyZXMucmMKQEAgLTYsNiArNiwxMiBAQAogI2luY2x1ZGUgInN5c3Jlc19Oby5yYyIKICNlbGlmICNMQU5HKEVzKQogI2luY2x1ZGUgInN5c3Jlc19Fcy5yYyIKKyNlbGlmICNMQU5HKEZyKQorI2luY2x1ZGUgInN5c3Jlc19Gci5yYyIKKyNlbGlmICNMQU5HKEZpKQorI2luY2x1ZGUgInN5c3Jlc19GaS5yYyIKKyNlbGlmICNMQU5HKERhKQorI2luY2x1ZGUgInN5c3Jlc19EYS5yYyIKICNlbHNlCiAjZXJyb3IgTEFORyBub3Qgc2V0IHRvIGFuIGltcGxlbWVudGVkIGxhbmd1YWdlLgogI2VuZGlmCmRpZmYgLS1naXQgYS9yYy9zeXNyZXNfRGEucmMgYi9yYy9zeXNyZXNfRGEucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5YzExZgotLS0gL2Rldi9udWxsCisrKyBiL3JjL3N5c3Jlc19EYS5yYwpAQCAtMCwwICsxLDIwMCBAQAorU1lTTUVOVSBNRU5VIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUKK3sKKyBNRU5VSVRFTSAiJkdlbm9wcmV0IiwgNjE3MjgKKyBNRU5VSVRFTSAiJkZseXQiLCA2MTQ1NgorIE1FTlVJVEVNICImU3T4cnJlbHNlIiwgNjE0NDAKKyBNRU5VSVRFTSAiTWkmbmltZXIiLCA2MTQ3MgorIE1FTlVJVEVNICJNYSZ4aW1lciIsIDYxNDg4CisgTUVOVUlURU0gU0VQQVJBVE9SCisgTUVOVUlURU0gIiZMdWtcdEFsdC1GNCIsIDYxNTM2CisgTUVOVUlURU0gU0VQQVJBVE9SCisgTUVOVUlURU0gIiZTa2lmdCB0aWwgLi4uXHRDdHJsLUVzYyIsIDYxNzQ0CisgTUVOVUlURU0gU0VQQVJBVE9SCisgTUVOVUlURU0gIiZPbSBXSU5FIC4uLiIsIDYxNzYxCit9CisKK01TR0JPWCBESUFMT0cgMTAwLCA4MCwgMjE2LCAxNjgKK1NUWUxFIERTX1NZU01PREFMIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitCRUdJTgorICAgICAgICBJQ09OICIiLCAxMDg4LCA4LCAyMCwgMTYsIDE2LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUKKyAgICAgICAgTFRFWFQgIiIsIDEwMCwgMzIsIDQsIDE3NiwgNDgsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQCisgICAgICAgIFBVU0hCVVRUT04gIiZPayIsIDEsIDE2LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZBbm51bGxlciIsIDIsIDY0LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZBZmJyeWQiLCAzLCAxMTIsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJkdlbnRhZyIsIDQsIDE2MCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImSWdub3JlciIsIDUsIDIwOCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImSmEiLCA2LCAyNTYsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJk5laiIsIDcsIDMwNCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorRU5ECisKK1NIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSA1MCwgNDQsIDIyMywgMjAwCitTVFlMRSBEU19MT0NBTEVESVQgfCBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIk9tICVzIgorRk9OVCAxMCwgIlN5c3RlbSIKK3sKKyBERUZQVVNIQlVUVE9OICJPayIsIDEsIDkxLCAxODAsIDQwLCAxNAorIENPTlRST0wgIiIsIC0xLCAiU1RBVElDIiwgU1NfQkxBQ0tGUkFNRSB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0RJU0FCTEVELCA0LCAzNSwgMjE1LCAxNDAKKyBMVEVYVCAiVGVrc3QiLCAxMDAsIDExLCA0MCwgMjAwLCAxMzAsIFNTX05PUFJFRklYIHwgV1NfR1JPVVAKKyBJQ09OICIiLCAxMDg4LCAxOTUsIDEwLCAxOCwgMjAKK30KKworCitPUEVOX0ZJTEUgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAyNzUsIDEzNAorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIsVibiIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIiZGaWxuYXZuOiIsIDEwOTAsIDYsIDYsIDc2LCA5CisgRURJVFRFWFQgMTE1MiwgNiwgMTYsIDkwLCAxMiwgRVNfQVVUT0hTQ1JPTEwgfCBFU19PRU1DT05WRVJUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAorIExJU1RCT1ggMTEyMCwgNiwgMzIsIDkwLCA2OCwgTEJTX1NUQU5EQVJEIHwgTEJTX09XTkVSRFJBV0ZJWEVEIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfRElTQUJMRU5PU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICImS2F0YWxvZ2VyOiIsIC0xLCAxMTAsIDYsIDkyLCA5CisgTFRFWFQgIiIsIDEwODgsIDExMCwgMTgsIDkyLCA5LCBTU19OT1BSRUZJWCB8IFdTX0dST1VQCisgTElTVEJPWCAxMTIxLCAxMTAsIDMyLCA5MiwgNjgsIExCU19TVEFOREFSRCB8IExCU19PV05FUkRSQVdGSVhFRCB8IExCU19IQVNTVFJJTkdTIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiJk92ZXJzaWd0IG92ZXIgZmlsZXIgYWYgdHlwZToiLCAxMDg5LCA2LCAxMDQsIDkwLCA5CisgQ09NQk9CT1ggMTEzNiwgNiwgMTE0LCA5MCwgMzYsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfQVVUT0hTQ1JPTEwgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICImRHJldjoiLCAxMDkxLCAxMTAsIDEwNCwgOTIsIDkKKyBDT01CT0JPWCAxMTM3LCAxMTAsIDExNCwgOTIsIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgREVGUFVTSEJVVFRPTiAixSZibiIsIDEsIDIwOCwgNiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiQW5udWxlciIsIDIsIDIwOCwgMjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiJkhq5mxwIiwgMTAzOCwgMjA4LCA0NiwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBDSEVDS0JPWCAiJlNrcml2ZWJlc2t5dHRldCIsIDEwNDAsIDIwOCwgNjgsIDUwLCAxMiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCit9CisKKworU0FWRV9GSUxFIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjc1LCAxMzQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJHZW0gc29tIC4uLiIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIiZGaWxuYXZuOiIsIDEwOTAsIDYsIDYsIDc2LCA5CisgRURJVFRFWFQgMTE1MiwgNiwgMTYsIDkwLCAxMiwgRVNfQVVUT0hTQ1JPTEwgfCBFU19PRU1DT05WRVJUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAorIExJU1RCT1ggMTEyMCwgNiwgMzIsIDkwLCA2OCwgTEJTX1NUQU5EQVJEIHwgTEJTX09XTkVSRFJBV0ZJWEVEIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfRElTQUJMRU5PU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICImS2F0YWxvZ2VyOiIsIC0xLCAxMTAsIDYsIDkyLCA5CisgTFRFWFQgIiIsIDEwODgsIDExMCwgMTgsIDkyLCA5LCBTU19OT1BSRUZJWCB8IFdTX0dST1VQCisgTElTVEJPWCAxMTIxLCAxMTAsIDMyLCA5MiwgNjgsIExCU19TVEFOREFSRCB8IExCU19PV05FUkRSQVdGSVhFRCB8IExCU19IQVNTVFJJTkdTIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiJk92ZXJzaWd0IG92ZXIgZmlsZXIgYWYgdHlwZToiLCAxMDg5LCA2LCAxMDQsIDkwLCA5CisgQ09NQk9CT1ggMTEzNiwgNiwgMTE0LCA5MCwgMzYsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfQVVUT0hTQ1JPTEwgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICImRHJldjoiLCAxMDkxLCAxMTAsIDEwNCwgOTIsIDkKKyBDT01CT0JPWCAxMTM3LCAxMTAsIDExNCwgOTIsIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgREVGUFVTSEJVVFRPTiAiJkdlbSBzb20iLCAxLCAyMDgsIDYsIDU2LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIkFubnVsbGVyIiwgMiwgMjA4LCAyNCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICImSGrmbHAiLCAxMDM4LCAyMDgsIDQ2LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICImU2tyaXZlYmVza3l0dGV0IiwgMTA0MCwgMjA4LCA2OCwgNTAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKK30KKworCitQUklOVCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI2NCwgMTM0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiVWRza3JpdiIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIlByaW50ZXI6IiwgMTA4OCwgNiwgNiwgNDAsIDkKKyBMVEVYVCAiIiwgMTA4OSwgNjAsIDYsIDE1MCwgOQorIEdST1VQQk9YICJVZHNrcml2IG9tcuVkZSIsIDEwNzIsIDYsIDMwLCAxNjAsIDY1LCBCU19HUk9VUEJPWAorIFJBRElPQlVUVE9OICImQWx0IiwgMTA1NiwgMTYsIDQ1LCA2MCwgMTIKKyBSQURJT0JVVFRPTiAiJk1hcmtlcmV0IiwgMTA1NywgMTYsIDYwLCA2MCwgMTIKKyBSQURJT0JVVFRPTiAiJlNpZGVyIiwgMTA1OCwgMTYsIDc1LCA2MCwgMTIKKyBERUZQVVNIQlVUVE9OICJVZHNrcml2IiwgMSwgMjA2LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBbm51bGxlciIsIDIsIDIwNiwgMjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiJkluZHN0aWxsaW5nIiwgMTAyNCwgMjA2LCA0NiwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiJkZyYToiLCAxMDkwLCA2MCwgODAsIDMwLCA5CisgTFRFWFQgIiZUaWw6IiwgMTA5MSwgMTIwLCA4MCwgMzAsIDkKKyBMVEVYVCAiVWRza3JpZnRzJmt2YWxpdGV0OiIsIDEwOTIsIDYsIDEwMCwgNzYsIDkKKyBDT01CT0JPWCAxMTM2LCA4MCwgMTAwLCA5MiwgNjgsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKKyBDSEVDS0JPWCAiVWRza3JpdiB0aWwgZmkmbCIsIDEwNDAsIDIwLCAxMDAsIDUwLCAxMiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIlNhbW1lbnRyeWtrZXQiLCAxMDQxLCAxNjAsIDEwMCwgNTAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKK30KKworCitQUklOVF9TRVRVUCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI2NCwgMTM0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiVWRza3JpZnRzaW5kc3RpbGxpbmciCitGT05UIDgsICJIZWx2IgoreworIEdST1VQQk9YICJQcmludGVyIiwgMTA3MiwgNiwgMTAsIDE4MCwgNjUsIEJTX0dST1VQQk9YCisgUkFESU9CVVRUT04gIiZTdGFuZGFyZHByaW50ZXIiLCAxMDU2LCAxNiwgMjAsIDgwLCAxMgorIExURVhUICJbbm9uZV0iLCAxMDg4LCAzNSwgMzUsIDEyMCwgOQorIFJBRElPQlVUVE9OICJTcGVjaWZpayAmcHJpbnRlciIsIDEwNTcsIDE2LCA1MCwgODAsIDEyCisgQ09NQk9CT1ggMTEzNiwgMzUsIDY1LCAxNDksIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgREVGUFVTSEJVVFRPTiAiT2siLCAxLCAyMDYsIDYsIDU2LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIkFubnVsbGVyIiwgMiwgMjA2LCAyNCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICImSW5kc3RpbGxpbmciLCAxMDI0LCAyMDYsIDQ2LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIEdST1VQQk9YICJPcmllbnRlcmluZyIsIDEwNzMsIDYsIDg1LCAxMDAsIDUwLCBCU19HUk9VUEJPWAorIFJBRElPQlVUVE9OICJQbyZydHLmdCIsIDEwNTgsIDUwLCAxMDAsIDQwLCAxMgorIFJBRElPQlVUVE9OICImTGFuZHNrYWIiLCAxMDU5LCA1MCwgMTE1LCA0MCwgMTIKKyBJQ09OICJMQU5EU0NBUCIsIDEwOTcsIDEwLCA5NSwgMzIsIDMyCisgSUNPTiAiUE9SVFJBSVQiLCAxMDk4LCAxMCwgOTUsIDMyLCAzMgorIEdST1VQQk9YICJQYXBpciIsIDEwNzQsIDEyMCwgODUsIDE4MCwgNTAsIEJTX0dST1VQQk9YCisgTFRFWFQgIlN0+HJyZWxzZSIsIDEwODksIDEzMCwgOTUsIDMwLCA5CisgTFRFWFQgIiZLaWxkZSIsIDEwOTAsIDEzMCwgMTEwLCAzMCwgOQorIENPTUJPQk9YIDExMzcsIDE1NSwgOTUsIDkyLCA2OCwgQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19TT1JUIHwgQ0JTX0hBU1NUUklOR1MgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIENPTUJPQk9YIDExMzgsIDE1NSwgMTEwLCA5MiwgNjgsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKK30KKworCitDSE9PU0VfRk9OVCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI2NCwgMTM0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiU2tyaWZ0c25pdCIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIlNrcmlmdHNuaXQ6IiwgMTA4OCwgNiwgNiwgNDAsIDkKKyBMVEVYVCAiIiwgMTA4OSwgNjAsIDYsIDE1MCwgOQorIERFRlBVU0hCVVRUT04gIk9rIiwgMSwgMjA2LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBbm51bGxlciIsIDIsIDIwNiwgMjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCit9CisKKworQ0hPT1NFX0NPTE9SIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjY0LCAyMDAKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJGYXJ2ZSIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIiZHcnVuZGzmZ2dlbmRlIGZhcnZlcjoiLCAxMDg4LCA2LCA2LCA0MCwgOQorIExURVhUICImU2VsdnZhbGd0ZSBmYXJ2ZXI6IiwgMTA4OSwgNiwgMTI2LCA0MCwgOQorIExURVhUICImRW5zZmFydmV0IiwgMTA5MCwgMTAwLCAxNDYsIDQwLCA5CisgTFRFWFQgIiZJbnRlbnNpdGV0OiIsIDEwOTEsIDE1MCwgMTI2LCA0MCwgOQorIExURVhUICImRmFydmVt5nRuaW5nOiIsIDEwOTIsIDE1MCwgMTQ2LCA0MCwgOQorIExURVhUICImTHlzc3R5cmtlOiIsIDEwOTMsIDE1MCwgMTY2LCA0MCwgOQorIExURVhUICImUvhkOiIsIDEwOTQsIDE1MCwgMTI2LCA0MCwgOQorIExURVhUICImR3L4bjoiLCAxMDk1LCAxNTAsIDE0NiwgNDAsIDkKKyBMVEVYVCAiJkJs5ToiLCAxMDk2LCAxNTAsIDE2NiwgNDAsIDkKKyBERUZQVVNIQlVUVE9OICJPayIsIDEsIDYsIDE4MiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiJlRpbGb4aiB0aWwgc2VsdnZhbGd0ZSBmYXJ2ZXIiLCAxMDI0LCAxMjAsIDE4MiwgMTAwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiJlNsZXQgc2VsdnZhbGd0ZSBmYXJ2ZXIiLCAxMDI1LCA2LCAxNjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiQW5udWxsZXIiLCAyLCA3NiwgMTgyLCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK0ZJTkRfVEVYVCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI2NCwgODQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJGaW5kIgorRk9OVCA4LCAiSGVsdiIKK3sKKyBMVEVYVCAiJkZpbmQgaHZhZDoiLCAxMDg4LCA2LCA2LCA0MCwgOQorIExURVhUICIiLCAxMDg5LCA2MCwgNiwgMTUwLCA5CisgQ0hFQ0tCT1ggIkt1biAmaGVsZSBvcmQiLCAxMDQwLCAyMCwgMzAsIDUwLCAxMiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIkZvcnNrZWwgcOUgc3RvcmUvc23lICZib2dzdGF2ZXIiLCAxMDQxLCAyMCwgNTAsIDUwLCAxMiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgR1JPVVBCT1ggIlJldG5pbmciLCAxMDcyLCA5MCwgNDAsIDgwLCA0MCwgQlNfR1JPVVBCT1gKKyBSQURJT0JVVFRPTiAiJk9wIiwgMTA1NiwgMTAwLCA1MCwgNTAsIDEyCisgUkFESU9CVVRUT04gIiZOZWQiLCAxMDU3LCAxNTAsIDUwLCA1MCwgMTIKKyBERUZQVVNIQlVUVE9OICImRmluZCBu5nN0ZSIsIDEsIDIwNiwgNiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiQW5udWxsZXIiLCAyLCAyMDYsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK1JFUExBQ0VfVEVYVCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI2NCwgMTE0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiRXJzdGF0IgorRk9OVCA4LCAiSGVsdiIKK3sKKyBMVEVYVCAiJkZpbmQgaHZhZDoiLCAxMDg4LCA2LCA2LCA0MCwgOQorIExURVhUICIiLCAxMDg5LCA2MCwgNiwgMTUwLCA5CisgTFRFWFQgIiZFcnN0YXQgbWVkOiIsIDEwOTAsIDYsIDI2LCA0MCwgOQorIExURVhUICIiLCAxMDkxLCA2MCwgMjYsIDE1MCwgOQorIENIRUNLQk9YICJLdW4gJmhlbGUgb3JkIiwgMTA0MCwgMjAsIDQwLCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICJGb3Jza2VsIHDlIHN0b3JlL3Nt5SAmYm9nc3RhdmVyIiwgMTA0MSwgMjAsIDYwLCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIERFRlBVU0hCVVRUT04gIiZGaW5kIG7mc3RlIiwgMSwgMjA2LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICImRXJzdGF0IiwgMTAyNCwgMjA2LCAyNCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJFcnN0YXQgJmFsbGUiLCAxMDI1LCAyMDYsIDQ0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIkFmYnJ5ZCIsIDIsIDIwNiwgNjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCit9CmRpZmYgLS1naXQgYS9yYy9zeXNyZXNfRmkucmMgYi9yYy9zeXNyZXNfRmkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE5ZjdhMgotLS0gL2Rldi9udWxsCisrKyBiL3JjL3N5c3Jlc19GaS5yYwpAQCAtMCwwICsxLDIwMCBAQAorU1lTTUVOVSBNRU5VIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUKK3sKKyBNRU5VSVRFTSAiJlBhbGF1dGEiLCA2MTcyOAorIE1FTlVJVEVNICJTaWkmcnLkIiwgNjE0NTYKKyBNRU5VSVRFTSAiJk11dXRhIGtva29hIiwgNjE0NDAKKyBNRU5VSVRFTSAiUCZpZW5lbm7kIiwgNjE0NzIKKyBNRU5VSVRFTSAiUyZ1dXJlbm5hIiwgNjE0ODgKKyBNRU5VSVRFTSBTRVBBUkFUT1IKKyBNRU5VSVRFTSAiJlN1bGplXHRBbHQrRjQiLCA2MTUzNgorIE1FTlVJVEVNIFNFUEFSQVRPUgorIE1FTlVJVEVNICImVmFpaGRhLi4uXHRDdHJsK0VzYyIsIDYxNzQ0CisgTUVOVUlURU0gU0VQQVJBVE9SCisgTUVOVUlURU0gIiZUaWV0b2phIFdJTkVpc3RhLi4uIiwgNjE3NjEKK30KKworTVNHQk9YIERJQUxPRyAxMDAsIDgwLCAyMTYsIDE2OAorU1RZTEUgRFNfU1lTTU9EQUwgfCBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0JFR0lOCisgICAgICAgIElDT04gIiIsIDEwODgsIDgsIDIwLCAxNiwgMTYsIFdTX0NISUxEIHwgV1NfVklTSUJMRQorICAgICAgICBMVEVYVCAiIiwgMTAwLCAzMiwgNCwgMTc2LCA0OCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKKyAgICAgICAgUFVTSEJVVFRPTiAiJk9LIiwgMSwgMTYsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJlBlcnV1dGEiLCAyLCA2NCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImS2Vza2V5dOQiLCAzLCAxMTIsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJllyaXTkIHV1ZGVsbGVlbiIsIDQsIDE2MCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImSHlsa+TkIiwgNSwgMjA4LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZLeWxs5CIsIDYsIDI1NiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImRWkiLCA3LCAzMDQsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKK0VORAorCitTSEVMTF9BQk9VVF9NU0dCT1ggRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgNTAsIDQ0LCAyMjMsIDIwMAorU1RZTEUgRFNfTE9DQUxFRElUIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJUaWV0b2phOiAlcyIKK0ZPTlQgMTAsICJTeXN0ZW0iCit7CisgREVGUFVTSEJVVFRPTiAiT0siLCAxLCA5MSwgMTgwLCA0MCwgMTQKKyBDT05UUk9MICIiLCAtMSwgIlNUQVRJQyIsIFNTX0JMQUNLRlJBTUUgfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19ESVNBQkxFRCwgNCwgMzUsIDIxNSwgMTQwCisgTFRFWFQgIlRla3N0aSIsIDEwMCwgMTEsIDQwLCAyMDAsIDEzMCwgU1NfTk9QUkVGSVggfCBXU19HUk9VUAorIElDT04gIiIsIDEwODgsIDE5NSwgMTAsIDE4LCAyMAorfQorCisKK09QRU5fRklMRSBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI3NSwgMTM0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiQXZhYSIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIlRpZWRvc3RvJm5pbWk6IiwgMTA5MCwgNiwgNiwgNzYsIDkKKyBFRElUVEVYVCAxMTUyLCA2LCAxNiwgOTAsIDEyLCBFU19BVVRPSFNDUk9MTCB8IEVTX09FTUNPTlZFUlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCisgTElTVEJPWCAxMTIwLCA2LCAzMiwgOTAsIDY4LCBMQlNfU1RBTkRBUkQgfCBMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfSEFTU1RSSU5HUyB8IExCU19ESVNBQkxFTk9TQ1JPTEwgfCBXU19UQUJTVE9QCisgTFRFWFQgIiZIYWtlbWlzdG90OiIsIC0xLCAxMTAsIDYsIDkyLCA5CisgTFRFWFQgIiIsIDEwODgsIDExMCwgMTgsIDkyLCA5LCBTU19OT1BSRUZJWCB8IFdTX0dST1VQCisgTElTVEJPWCAxMTIxLCAxMTAsIDMyLCA5MiwgNjgsIExCU19TVEFOREFSRCB8IExCU19PV05FUkRSQVdGSVhFRCB8IExCU19IQVNTVFJJTkdTIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiJkx1ZXR0ZWxlIHRpZWRvc3RvdCB0eXlwZWl0dORpbjoiLCAxMDg5LCA2LCAxMDQsIDkwLCA5CisgQ09NQk9CT1ggMTEzNiwgNiwgMTE0LCA5MCwgMzYsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfQVVUT0hTQ1JPTEwgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICImQXNlbWF0OiIsIDEwOTEsIDExMCwgMTA0LCA5MiwgOQorIENPTUJPQk9YIDExMzcsIDExMCwgMTE0LCA5MiwgNjgsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKKyBERUZQVVNIQlVUVE9OICJBdmFhIiwgMSwgMjA4LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJQZXJ1dXRhIiwgMiwgMjA4LCAyNCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICImT2hqZSIsIDEwMzgsIDIwOCwgNDYsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIiZWYWluIGx1a3UiLCAxMDQwLCAyMDgsIDY4LCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK1NBVkVfRklMRSBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI3NSwgMTM0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiVGFsbGVubmEgbmltZWxs5CIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIlRpZWRvc3RvJm5pbWk6IiwgMTA5MCwgNiwgNiwgNzYsIDkKKyBFRElUVEVYVCAxMTUyLCA2LCAxNiwgOTAsIDEyLCBFU19BVVRPSFNDUk9MTCB8IEVTX09FTUNPTlZFUlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCisgTElTVEJPWCAxMTIwLCA2LCAzMiwgOTAsIDY4LCBMQlNfU1RBTkRBUkQgfCBMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfSEFTU1RSSU5HUyB8IExCU19ESVNBQkxFTk9TQ1JPTEwgfCBXU19UQUJTVE9QCisgTFRFWFQgIiZIYWtlbWlzdG90OiIsIC0xLCAxMTAsIDYsIDkyLCA5CisgTFRFWFQgIiIsIDEwODgsIDExMCwgMTgsIDkyLCA5LCBTU19OT1BSRUZJWCB8IFdTX0dST1VQCisgTElTVEJPWCAxMTIxLCAxMTAsIDMyLCA5MiwgNjgsIExCU19TVEFOREFSRCB8IExCU19PV05FUkRSQVdGSVhFRCB8IExCU19IQVNTVFJJTkdTIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiVGFsbGVubmEgdGllZG9zdG8gJm11b2Rvc3NhOiIsIDEwODksIDYsIDEwNCwgOTAsIDkKKyBDT01CT0JPWCAxMTM2LCA2LCAxMTQsIDkwLCAzNiwgQ0JTX0RST1BET1dOTElTVCB8IENCU19BVVRPSFNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgTFRFWFQgIiZBc2VtYXQ6IiwgMTA5MSwgMTEwLCAxMDQsIDkyLCA5CisgQ09NQk9CT1ggMTEzNywgMTEwLCAxMTQsIDkyLCA2OCwgQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19TT1JUIHwgQ0JTX0hBU1NUUklOR1MgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIERFRlBVU0hCVVRUT04gIlRhbGxlbm5hIiwgMSwgMjA4LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJQZXJ1dXRhIiwgMiwgMjA4LCAyNCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICImT2hqZSIsIDEwMzgsIDIwOCwgNDYsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIiZWYWluIGx1a3UiLCAxMDQwLCAyMDgsIDY4LCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK1BSSU5UIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjY0LCAxMzQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJUdWxvc3RhIgorRk9OVCA4LCAiSGVsdiIKK3sKKyBMVEVYVCAiS2lyam9pdGluOiIsIDEwODgsIDYsIDYsIDQwLCA5CisgTFRFWFQgIiIsIDEwODksIDYwLCA2LCAxNTAsIDkKKyBHUk9VUEJPWCAiVHVsb3N0dXNhbHVlIiwgMTA3MiwgNiwgMzAsIDE2MCwgNjUsIEJTX0dST1VQQk9YCisgUkFESU9CVVRUT04gIiZLYWlra2kiLCAxMDU2LCAxNiwgNDUsIDYwLCAxMgorIFJBRElPQlVUVE9OICImVmFsaW50YSIsIDEwNTcsIDE2LCA2MCwgNjAsIDEyCisgUkFESU9CVVRUT04gIiZTaXZ1dCIsIDEwNTgsIDE2LCA3NSwgNjAsIDEyCisgREVGUFVTSEJVVFRPTiAiVHVsb3N0YSIsIDEsIDIwNiwgNiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiUGVydXV0YSIsIDIsIDIwNiwgMjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiJkFzZXR1a3NldCIsIDEwMjQsIDIwNiwgNDYsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgTFRFWFQgIiZNaXN05DoiLCAxMDkwLCA2MCwgODAsIDMwLCA5CisgTFRFWFQgIk1pJmhpbjoiLCAxMDkxLCAxMjAsIDgwLCAzMCwgOQorIExURVhUICImVHVsb3N0dXN0YXJra3V1czoiLCAxMDkyLCA2LCAxMDAsIDc2LCA5CisgQ09NQk9CT1ggMTEzNiwgODAsIDEwMCwgOTIsIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIlR1bG9zdGEgdCZpZWRvc3Rvb24iLCAxMDQwLCAyMCwgMTAwLCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICJUaWl2aXN0ZXR0eSIsIDEwNDEsIDE2MCwgMTAwLCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK1BSSU5UX1NFVFVQIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjY0LCAxMzQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJLaXJqb2l0dGltZW4gYXNldHVrc2V0IgorRk9OVCA4LCAiSGVsdiIKK3sKKyBHUk9VUEJPWCAiS2lyam9pdGluIiwgMTA3MiwgNiwgMTAsIDE4MCwgNjUsIEJTX0dST1VQQk9YCisgUkFESU9CVVRUT04gIk8mbGV0dXNraXJqb2l0aW4iLCAxMDU2LCAxNiwgMjAsIDgwLCAxMgorIExURVhUICJbZWkgdmFsaXR0dV0iLCAxMDg4LCAzNSwgMzUsIDEyMCwgOQorIFJBRElPQlVUVE9OICImRXJpdHlpbmVuIGtpcmpvaXRpbiIsIDEwNTcsIDE2LCA1MCwgODAsIDEyCisgQ09NQk9CT1ggMTEzNiwgMzUsIDY1LCAxNDksIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgREVGUFVTSEJVVFRPTiAiT0siLCAxLCAyMDYsIDYsIDU2LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIlBlcnV1dGEiLCAyLCAyMDYsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIiZBc2V0dWtzZXQuLi4iLCAxMDI0LCAyMDYsIDQ2LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIEdST1VQQk9YICJTdXVudGEiLCAxMDczLCA2LCA4NSwgMTAwLCA1MCwgQlNfR1JPVVBCT1gKKyBSQURJT0JVVFRPTiAiJlB5c3R5IiwgMTA1OCwgNTAsIDEwMCwgNDAsIDEyCisgUkFESU9CVVRUT04gIiZWYWFrYSIsIDEwNTksIDUwLCAxMTUsIDQwLCAxMgorIElDT04gIkxBTkRTQ0FQIiwgMTA5NywgMTAsIDk1LCAzMiwgMzIKKyBJQ09OICJQT1JUUkFJVCIsIDEwOTgsIDEwLCA5NSwgMzIsIDMyCisgR1JPVVBCT1ggIlBhcGVyaSIsIDEwNzQsIDEyMCwgODUsIDE4MCwgNTAsIEJTX0dST1VQQk9YCisgTFRFWFQgIiZLb2tvOiIsIDEwODksIDEzMCwgOTUsIDMwLCA5CisgTFRFWFQgIkzkJmhkZToiLCAxMDkwLCAxMzAsIDExMCwgMzAsIDkKKyBDT01CT0JPWCAxMTM3LCAxNTUsIDk1LCA5MiwgNjgsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKKyBDT01CT0JPWCAxMTM4LCAxNTUsIDExMCwgOTIsIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCit9CisKKworQ0hPT1NFX0ZPTlQgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAyNjQsIDEzNAorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIkZvbnRpdCIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIkZvbnR0aToiLCAxMDg4LCA2LCA2LCA0MCwgOQorIExURVhUICIiLCAxMDg5LCA2MCwgNiwgMTUwLCA5CisgREVGUFVTSEJVVFRPTiAiT0siLCAxLCAyMDYsIDYsIDU2LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIlBlcnV1dGEiLCAyLCAyMDYsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK0NIT09TRV9DT0xPUiBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI2NCwgMjAwCitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiVuRyaSIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIlBlJnJ1c3bkcml0OiIsIDEwODgsIDYsIDYsIDQwLCA5CisgTFRFWFQgIiZNdW9rYXR1dCB25HJpdDoiLCAxMDg5LCA2LCAxMjYsIDQwLCA5CisgTFRFWFQgIlbkcml8JlRhc2FpbmVuIiwgMTA5MCwgMTAwLCAxNDYsIDQwLCA5CisgTFRFWFQgIiZT5HZ5OiIsIDEwOTEsIDE1MCwgMTI2LCA0MCwgOQorIExURVhUICImS3lsbDoiLCAxMDkyLCAxNTAsIDE0NiwgNDAsIDkKKyBMVEVYVCAiSyZpcmtrOiIsIDEwOTMsIDE1MCwgMTY2LCA0MCwgOQorIExURVhUICImUHVuOiIsIDEwOTQsIDE1MCwgMTI2LCA0MCwgOQorIExURVhUICImVmlocjoiLCAxMDk1LCAxNTAsIDE0NiwgNDAsIDkKKyBMVEVYVCAiU2kmbjoiLCAxMDk2LCAxNTAsIDE2NiwgNDAsIDkKKyBERUZQVVNIQlVUVE9OICJPSyIsIDEsIDYsIDE4MiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiJkxpc+TkIHbkcmkiLCAxMDI0LCAxMjAsIDE4MiwgMTAwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiUG9pcyZ0YSB25HJpIiwgMTAyNSwgNiwgMTY0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIlMmdWxqZSIsIDIsIDc2LCAxODIsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCit9CisKKworRklORF9URVhUIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjY0LCA4NAorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIkV0c2kiCitGT05UIDgsICJIZWx2IgoreworIExURVhUICImRXRzaXR05HbkOiIsIDEwODgsIDYsIDYsIDQwLCA5CisgTFRFWFQgIiIsIDEwODksIDYwLCA2LCAxNTAsIDkKKyBDSEVDS0JPWCAiJktva28gc2FuYSIsIDEwNDAsIDIwLCAzMCwgNTAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBDSEVDS0JPWCAiS2lyamFpbmsmb2tvIiwgMTA0MSwgMjAsIDUwLCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIEdST1VQQk9YICJTdXVudGEiLCAxMDcyLCA5MCwgNDAsIDgwLCA0MCwgQlNfR1JPVVBCT1gKKyBSQURJT0JVVFRPTiAiJlls9nMiLCAxMDU2LCAxMDAsIDUwLCA1MCwgMTIKKyBSQURJT0JVVFRPTiAiJkFsYXMiLCAxMDU3LCAxNTAsIDUwLCA1MCwgMTIKKyBERUZQVVNIQlVUVE9OICJFdHNpICZzZXVyYWF2YSIsIDEsIDIwNiwgNiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiUGVydXV0YSIsIDIsIDIwNiwgMjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCit9CisKKworUkVQTEFDRV9URVhUIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjY0LCAxMTQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJLb3J2YWEiCitGT05UIDgsICJIZWx2IgoreworIExURVhUICImRXRzaXR05HbkOiIsIDEwODgsIDYsIDYsIDQwLCA5CisgTFRFWFQgIiIsIDEwODksIDYwLCA2LCAxNTAsIDkKKyBMVEVYVCAiS28mcnZhdHRhdmE6IiwgMTA5MCwgNiwgMjYsIDQwLCA5CisgTFRFWFQgIiIsIDEwOTEsIDYwLCAyNiwgMTUwLCA5CisgQ0hFQ0tCT1ggIiZLb2tvIHNhbmEiLCAxMDQwLCAyMCwgNDAsIDUwLCAxMiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIktpcmphaW5rJm9rbyIsIDEwNDEsIDIwLCA2MCwgNTAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBERUZQVVNIQlVUVE9OICJFdHNpICZzZXVyYWF2YSIsIDEsIDIwNiwgNiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiS29ydiZhYSIsIDEwMjQsIDIwNiwgMjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiS29ydmFhIGthJmlra2kiLCAxMDI1LCAyMDYsIDQ0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIlMmdWxqZSIsIDIsIDIwNiwgNjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCit9CmRpZmYgLS1naXQgYS9yYy9zeXNyZXNfRnIucmMgYi9yYy9zeXNyZXNfRnIucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzZWEyZAotLS0gL2Rldi9udWxsCisrKyBiL3JjL3N5c3Jlc19Gci5yYwpAQCAtMCwwICsxLDIwMSBAQAorCitTWVNNRU5VIE1FTlUgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQoreworIE1FTlVJVEVNICImUmVzdGF1cmF0aW9uIiwgNjE3MjgKKyBNRU5VSVRFTSAiJkTpcGxhY2VtZW50IiwgNjE0NTYKKyBNRU5VSVRFTSAiRGkmbWVuc2lvbiIsIDYxNDQwCisgTUVOVUlURU0gIlLpZHVjdCZpb24iLCA2MTQ3MgorIE1FTlVJVEVNICImQWdyYW5kaXNzZW1lbnQiLCA2MTQ4OAorIE1FTlVJVEVNIFNFUEFSQVRPUgorIE1FTlVJVEVNICImRmVybWV0dXJlXHRBbHQtRjQiLCA2MTUzNgorIE1FTlVJVEVNIFNFUEFSQVRPUgorIE1FTlVJVEVNICImQmFzY3VsZXIgdmVycyAuLi5cdEN0cmwtRWNoYXAiLCA2MTc0NAorIE1FTlVJVEVNIFNFUEFSQVRPUgorIE1FTlVJVEVNICJBIHByb3BvcyBkZSAmV2luZSAuLi4iLCA2MTc2MQorfQorCitNU0dCT1ggRElBTE9HIDEwMCwgODAsIDIxNiwgMTY4CitTVFlMRSBEU19TWVNNT0RBTCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQkVHSU4KKyAgICAgICAgSUNPTiAiIiwgMTA4OCwgOCwgMjAsIDE2LCAxNiwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFCisgICAgICAgIExURVhUICIiLCAxMDAsIDMyLCA0LCAxNzYsIDQ4LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUAorICAgICAgICBQVVNIQlVUVE9OICImT2siLCAxLCAxNiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImQW5udWxlciIsIDIsIDY0LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZBbm51bGVyIiwgMywgMTEyLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZS6XDpdGVyIiwgNCwgMTYwLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZJZ25vcmVyIiwgNSwgMjA4LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZPdWkiLCA2LCAyNTYsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJk5vbiIsIDcsIDMwNCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorRU5ECisKK1NIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSA1MCwgNDQsIDIxMywgMTc5CitTVFlMRSBEU19MT0NBTEVESVQgfCBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIkEgcHJvcG9zIGRlICVzIgorRk9OVCAxMCwgIlN5c3RlbSIKK3sKKyBERUZQVVNIQlVUVE9OICJPSyIsIDEsIDg2LCAxNjAsIDQwLCAxNAorIENPTlRST0wgIiIsIC0xLCAiU1RBVElDIiwgU1NfQkxBQ0tGUkFNRSB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0RJU0FCTEVELCA0LCAzNSwgMjA1LCAxMjAKKyBMVEVYVCAiVGV4dCIsIDEwMCwgMTEsIDQwLCAxOTAsIDExMCwgU1NfTk9QUkVGSVggfCBXU19HUk9VUAorIElDT04gIiIsIDEwODgsIDE4NSwgMTAsIDE4LCAyMAorfQorCisKK09QRU5fRklMRSBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI3NSwgMTM0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiT3V2cmlyIgorRk9OVCA4LCAiSGVsdiIKK3sKKyBMVEVYVCAiJk5vbSBkZSBmaWNoaWVyOiIsIDEwOTAsIDYsIDYsIDc2LCA5CisgRURJVFRFWFQgMTE1MiwgNiwgMTYsIDkwLCAxMiwgRVNfQVVUT0hTQ1JPTEwgfCBFU19PRU1DT05WRVJUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAorIExJU1RCT1ggMTEyMCwgNiwgMzIsIDkwLCA2OCwgTEJTX1NUQU5EQVJEIHwgTEJTX09XTkVSRFJBV0ZJWEVEIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfRElTQUJMRU5PU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICImUulwZXJ0b2lyZXMiLCAtMSwgMTEwLCA2LCA5MiwgOQorIExURVhUICIiLCAxMDg4LCAxMTAsIDE4LCA5MiwgOSwgU1NfTk9QUkVGSVggfCBXU19HUk9VUAorIExJU1RCT1ggMTEyMSwgMTEwLCAzMiwgOTIsIDY4LCBMQlNfU1RBTkRBUkQgfCBMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfSEFTU1RSSU5HUyB8IExCU19ESVNBQkxFTk9TQ1JPTEwgfCBXU19UQUJTVE9QCisgTFRFWFQgIkxpc3RlIGRlcyBmaWNoaWVycyBkZSAmdHlwZToiLCAxMDg5LCA2LCAxMDQsIDkwLCA5CisgQ09NQk9CT1ggMTEzNiwgNiwgMTE0LCA5MCwgMzYsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfQVVUT0hTQ1JPTEwgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICImTGVjdGV1cnM6IiwgMTA5MSwgMTEwLCAxMDQsIDkyLCA5CisgQ09NQk9CT1ggMTEzNywgMTEwLCAxMTQsIDkyLCA2OCwgQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19TT1JUIHwgQ0JTX0hBU1NUUklOR1MgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgMjA4LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBbm51bGVyIiwgMiwgMjA4LCAyNCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICImQWlkZSIsIDEwMzgsIDIwOCwgNDYsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIkxlY3R1cmUgc2V1bGUiLCAxMDQwLCAyMDgsIDY4LCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK1NBVkVfRklMRSBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI3NSwgMTM0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiRW5yZWdpc3RyZXIgc291cyAuLi4iCitGT05UIDgsICJIZWx2IgoreworIExURVhUICImTm9tIGRlIGZpY2hpZXI6IiwgMTA5MCwgNiwgNiwgNzYsIDkKKyBFRElUVEVYVCAxMTUyLCA2LCAxNiwgOTAsIDEyLCBFU19BVVRPSFNDUk9MTCB8IEVTX09FTUNPTlZFUlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCisgTElTVEJPWCAxMTIwLCA2LCAzMiwgOTAsIDY4LCBMQlNfU1RBTkRBUkQgfCBMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfSEFTU1RSSU5HUyB8IExCU19ESVNBQkxFTk9TQ1JPTEwgfCBXU19UQUJTVE9QCisgTFRFWFQgIiZS6XBlcnRvaXJlczoiLCAtMSwgMTEwLCA2LCA5MiwgOQorIExURVhUICIiLCAxMDg4LCAxMTAsIDE4LCA5MiwgOSwgU1NfTk9QUkVGSVggfCBXU19HUk9VUAorIExJU1RCT1ggMTEyMSwgMTEwLCAzMiwgOTIsIDY4LCBMQlNfU1RBTkRBUkQgfCBMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfSEFTU1RSSU5HUyB8IExCU19ESVNBQkxFTk9TQ1JPTEwgfCBXU19UQUJTVE9QCisgTFRFWFQgIkxpc3RlIGRlcyBmaWNoaWVycyBkZSAmdHlwZToiLCAxMDg5LCA2LCAxMDQsIDkwLCA5CisgQ09NQk9CT1ggMTEzNiwgNiwgMTE0LCA5MCwgMzYsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfQVVUT0hTQ1JPTEwgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICImTGVjdGV1cnM6IiwgMTA5MSwgMTEwLCAxMDQsIDkyLCA5CisgQ09NQk9CT1ggMTEzNywgMTEwLCAxMTQsIDkyLCA2OCwgQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19TT1JUIHwgQ0JTX0hBU1NUUklOR1MgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgMjA4LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBbm51bGVyIiwgMiwgMjA4LCAyNCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICImQWlkZSIsIDEwMzgsIDIwOCwgNDYsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIkxlY3R1cmUgc2V1bGUiLCAxMDQwLCAyMDgsIDY4LCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK1BSSU5UIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjY0LCAxMzQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJJbXByaW1lciIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIkltcHJpbWFudGU6IiwgMTA4OCwgNiwgNiwgNDAsIDkKKyBMVEVYVCAiIiwgMTA4OSwgNjAsIDYsIDE1MCwgOQorIEdST1VQQk9YICJFdGVuZHVlIiwgMTA3MiwgNiwgMzAsIDE2MCwgNjUsIEJTX0dST1VQQk9YCisgUkFESU9CVVRUT04gIiZUb3V0IiwgMTA1NiwgMTYsIDQ1LCA2MCwgMTIKKyBSQURJT0JVVFRPTiAiJlPpbGVjdGlvbiIsIDEwNTcsIDE2LCA2MCwgNjAsIDEyCisgUkFESU9CVVRUT04gIiZQYWdlcyIsIDEwNTgsIDE2LCA3NSwgNjAsIDEyCisgREVGUFVTSEJVVFRPTiAiT0siLCAxLCAyMDYsIDYsIDU2LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIkFubnVsZXIiLCAyLCAyMDYsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIiZDb25maWd1cmVyLi4uIiwgMTAyNCwgMjA2LCA0NiwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiJkRlOiIsIDEwOTAsIDYwLCA4MCwgMzAsIDkKKyBMVEVYVCAiJkE6IiwgMTA5MSwgMTIwLCA4MCwgMzAsIDkKKyBMVEVYVCAiJlF1YWxpdOkgZCdpbXByZXNzaW9uOiIsIDEwOTIsIDYsIDEwMCwgNzYsIDkKKyBDT01CT0JPWCAxMTM2LCA4MCwgMTAwLCA5MiwgNjgsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKKyBDSEVDS0JPWCAiJkZpY2hpZXIgZCdpbXByZXNzaW9uIiwgMTA0MCwgMjAsIDEwMCwgNTAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBDSEVDS0JPWCAiQ29waWVzIHQmcmnpZXMiLCAxMDQxLCAxNjAsIDEwMCwgNTAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKK30KKworCitQUklOVF9TRVRVUCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI2NCwgMTM0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiQ29uZmlndXJhdGlvbiBkZSBsJ2ltcHJlc3Npb24iCitGT05UIDgsICJIZWx2IgoreworIEdST1VQQk9YICJJbXByaW1hbnRlIiwgMTA3MiwgNiwgMTAsIDE4MCwgNjUsIEJTX0dST1VQQk9YCisgUkFESU9CVVRUT04gIiZJbXByaW1hbnRlIHBhciBk6WZhdXQiLCAxMDU2LCAxNiwgMjAsIDgwLCAxMgorIExURVhUICJbYXVjdW5lXSIsIDEwODgsIDM1LCAzNSwgMTIwLCA5CisgUkFESU9CVVRUT04gIkltcHJpbWFudGUgJnNw6WNpZmlxdWUiLCAxMDU3LCAxNiwgNTAsIDgwLCAxMgorIENPTUJPQk9YIDExMzYsIDM1LCA2NSwgMTQ5LCA2OCwgQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19TT1JUIHwgQ0JTX0hBU1NUUklOR1MgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgMjA2LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBbm51bGVyIiwgMiwgMjA2LCAyNCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICImT3B0aW9ucy4uLiIsIDEwMjQsIDIwNiwgNDYsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgR1JPVVBCT1ggIk9yaWVudGF0aW9uIiwgMTA3MywgNiwgODUsIDEwMCwgNTAsIEJTX0dST1VQQk9YCisgUkFESU9CVVRUT04gIiZQb3J0cmFpdCIsIDEwNTgsIDUwLCAxMDAsIDQwLCAxMgorIFJBRElPQlVUVE9OICJQYXlzYWcmZSIsIDEwNTksIDUwLCAxMTUsIDQwLCAxMgorIElDT04gIkxBTkRTQ0FQIiwgMTA5NywgMTAsIDk1LCAzMiwgMzIKKyBJQ09OICJQT1JUUkFJVCIsIDEwOTgsIDEwLCA5NSwgMzIsIDMyCisgR1JPVVBCT1ggIlBhcGllciIsIDEwNzQsIDEyMCwgODUsIDE4MCwgNTAsIEJTX0dST1VQQk9YCisgTFRFWFQgIiZUYWlsbGUgOiIsIDEwODksIDEzMCwgOTUsIDMwLCA5CisgTFRFWFQgIiZBbGkmbWVudGF0aW9uIDoiLCAxMDkwLCAxMzAsIDExMCwgMzAsIDkKKyBDT01CT0JPWCAxMTM3LCAxNTUsIDk1LCA5MiwgNjgsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKKyBDT01CT0JPWCAxMTM4LCAxNTUsIDExMCwgOTIsIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCit9CisKKworQ0hPT1NFX0ZPTlQgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAyNjQsIDEzNAorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIlBvbGljZXMiCitGT05UIDgsICJIZWx2IgoreworIExURVhUICImUG9saWNlOiIsIDEwODgsIDYsIDYsIDQwLCA5CisgTFRFWFQgIiIsIDEwODksIDYwLCA2LCAxNTAsIDkKKyBERUZQVVNIQlVUVE9OICJPSyIsIDEsIDIwNiwgNiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiQW5udWxlciIsIDIsIDIwNiwgMjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCit9CisKKworQ0hPT1NFX0NPTE9SIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjY0LCAyMDAKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJDb3VsZXVycyIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIkNvdWxldXJzIGRlICZiYXNlOiIsIDEwODgsIDYsIDYsIDQwLCA5CisgTFRFWFQgIiVDb3VsZXVycyBwZXJzb25uYWxpc+llczoiLCAxMDg5LCA2LCAxMjYsIDQwLCA5CisgTFRFWFQgIkNvdWxldXJ8JlVuaSIsIDEwOTAsIDEwMCwgMTQ2LCA0MCwgOQorIExURVhUICImQ291bGV1cjoiLCAxMDkxLCAxNTAsIDEyNiwgNDAsIDkKKyBMVEVYVCAiJlNhdC4gOiIsIDEwOTIsIDE1MCwgMTQ2LCA0MCwgOQorIExURVhUICImTHVtLiA6IiwgMTA5MywgMTUwLCAxNjYsIDQwLCA5CisgTFRFWFQgIiZSb3VnZToiLCAxMDk0LCAxNTAsIDEyNiwgNDAsIDkKKyBMVEVYVCAiJlZlcnQ6IiwgMTA5NSwgMTUwLCAxNDYsIDQwLCA5CisgTFRFWFQgIiZCbGV1OiIsIDEwOTYsIDE1MCwgMTY2LCA0MCwgOQorIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgNiwgMTgyLCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICImQWpvdXRlciBsYSBjb3VsZXVyIiwgMTAyNCwgMTIwLCAxODIsIDEwMCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIiZTdXBwcmltZXIgbGEgY291bGV1ciIsIDEwMjUsIDYsIDE2NCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBbm51bGVyIiwgMiwgNzYsIDE4MiwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKK30KKworCitGSU5EX1RFWFQgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAyNjQsIDg0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiUmVjaGVyY2hlciIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIiZSZWNoZXJjaGVyOiIsIDEwODgsIDYsIDYsIDQwLCA5CisgTFRFWFQgIiIsIDEwODksIDYwLCA2LCAxNTAsIDkKKyBDSEVDS0JPWCAiTSZvdCBzZXVsZW1lbnQiLCAxMDQwLCAyMCwgMzAsIDUwLCAxMiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIlJlc3BlY3QgZGVzICZtYWp1c2N1bGVzL21pbnVzY3VsZXMiLCAxMDQxLCAyMCwgNTAsIDUwLCAxMiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgR1JPVVBCT1ggIkRpcmVjdGlvbiIsIDEwNzIsIDkwLCA0MCwgODAsIDQwLCBCU19HUk9VUEJPWAorIFJBRElPQlVUVE9OICImSGF1dCIsIDEwNTYsIDEwMCwgNTAsIDUwLCAxMgorIFJBRElPQlVUVE9OICImQmFzIiwgMTA1NywgMTUwLCA1MCwgNTAsIDEyCisgREVGUFVTSEJVVFRPTiAiJlBvdXJzdWl2cmUiLCAxLCAyMDYsIDYsIDU2LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIkFubnVsZXIiLCAyLCAyMDYsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK1JFUExBQ0VfVEVYVCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI2NCwgMTE0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiUmVtcGxhY2VyIgorRk9OVCA4LCAiSGVsdiIKK3sKKyBMVEVYVCAiJlJlY2hlcmNoZXI6IiwgMTA4OCwgNiwgNiwgNDAsIDkKKyBMVEVYVCAiIiwgMTA4OSwgNjAsIDYsIDE1MCwgOQorIExURVhUICJSJmVtcGxhY2VyIHBhcjoiLCAxMDkwLCA2LCAyNiwgNDAsIDkKKyBMVEVYVCAiIiwgMTA5MSwgNjAsIDI2LCAxNTAsIDkKKyBDSEVDS0JPWCAiTSZvdCBzZXVsZW1lbnQiLCAxMDQwLCAyMCwgNDAsIDUwLCAxMiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIlJlc3BlY3QgZGVzICZtYWp1c2N1bGVzL21pbnVzY3VsZXMiLCAxMDQxLCAyMCwgNjAsIDUwLCAxMiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgREVGUFVTSEJVVFRPTiAiJlBvdXJzdWl2cmUiLCAxLCAyMDYsIDYsIDU2LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIlJlbXBsYSZjZXIiLCAxMDI0LCAyMDYsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIlJlbXBsYWNlciAmdG91dCIsIDEwMjUsIDIwNiwgNDQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiJkZlcm1lciIsIDIsIDIwNiwgNjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCit9CmRpZmYgLS1naXQgYS9yYy93aW5lcmMuYyBiL3JjL3dpbmVyYy5jCmluZGV4IDE0YjBjODUuLmFmZGQ4OWUgMTAwNjQ0Ci0tLSBhL3JjL3dpbmVyYy5jCisrKyBiL3JjL3dpbmVyYy5jCkBAIC0zMSw2ICszMSw5IEBACiBGSUxFICpoZWFkZXIsKmNvZGU7CiBjaGFyIGhuYW1lWzI1Nl0sc25hbWVbMjU2XTsKIAoraW50IHRyYW5zZm9ybV9iaW5hcnlfZmlsZSh2b2lkKTsKK2ludCB5eXBhcnNlKHZvaWQpOworCiBpbnQgbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pCiB7ICAKIAlleHRlcm4gaW50IHl5ZGVidWc7CkBAIC04OCw2ICs5MSw3IEBACiAJCWZwcmludGYoY29kZSwiJTNkLCIsYyk7CiAJfQogCWZwcmludGYoY29kZSwiXG4wfVxuaW50IF9BcGxpY2F0aW9uX3Jlc291cmNlc19zaXplPSVkO1xuIixpKTsKKwlyZXR1cm4gMDsKIH0KIAogLyogU3VuT1MnIG1lbWNweSBpcyB3cm9uZyBmb3Igb3ZlcmxhcHBpbmcgYXJyYXlzICovCkBAIC01OTIsMTkgKzU5NiwyMiBAQAogICAgIGZwcmludGYoIGNvZGUsICIgIDBcbn07XG4iICk7CiB9CiAKLXZvaWQgbWFrZV9mb250KCkKK2dlbl9yZXMqIG1ha2VfZm9udChnZW5fcmVzKiByZXMpCiB7CiAJZnByaW50ZihzdGRlcnIsIkZvbnRzIG5vdCBzdXBwb3J0ZWRcbiIpOworCXJldHVybiBOVUxMOwogfQogCi12b2lkIG1ha2VfcmF3KCkKK2dlbl9yZXMqIG1ha2VfcmF3KGdlbl9yZXMqIHJlcykKIHsKIAlmcHJpbnRmKHN0ZGVyciwiUkNEYXRhIG5vdCBzdXBwb3J0ZWRcbiIpOworCXJldHVybiBOVUxMOwogfQogCi12b2lkIGludF90b19yYXcoKQorZ2VuX3JlcyogaW50X3RvX3JhdyhpbnQgaSxnZW5fcmVzKiByZXMpCiB7CiAJZnByaW50ZihzdGRlcnIsIkludFRvUmF3IG5vdCBzdXBwb3J0ZWRcbiIpOworCXJldHVybiBOVUxMOwogfQogCiAvKiB0cmFuc2xhdGUgIkhlbGxvLFxcdHdvcmxkIVxcMTAiIHRvICJIZWxsbyxcdHdvcmxkIVxuIiAqLwpkaWZmIC0tZ2l0IGEvdG9vbGtpdC9JbWFrZWZpbGUgYi90b29sa2l0L0ltYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiZjU4My4uMDAwMDAwMAotLS0gYS90b29sa2l0L0ltYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSNpbmNsdWRlICIuLi9XaW5lLnRtcGwiCi0KLU1PRFVMRSA9IHRvb2xraXQKLQotU1JDUyA9IFwKLQlhcmNoLmMgXAotCWhlYXAuYyBcCi0Jc3VwLmMgXAotCXdpbm1haW4uYwotCi1PQkpTID0gJChTUkNTOi5jPS5vKQotCi1XaW5lUmVsb2NhdGFibGVUYXJnZXQoJChNT0RVTEUpLCwkKE9CSlMpKQotRGVwZW5kVGFyZ2V0KCkKLQotaW5jbHVkZXM6OgotCi1pbnN0YWxsOjoKZGlmZiAtLWdpdCBhL3Rvb2xraXQvTWFrZWZpbGUuaW4gYi90b29sa2l0L01ha2VmaWxlLmluCmluZGV4IGQwOWNiMTEuLjczZjg3NDYgMTAwNjQ0Ci0tLSBhL3Rvb2xraXQvTWFrZWZpbGUuaW4KKysrIGIvdG9vbGtpdC9NYWtlZmlsZS5pbgpAQCAtMSwxNCArMSwyNyBAQAogVE9QU1JDID0gQHRvcF9zcmNkaXJACitYX0xJQlMgPSBAWF9MSUJTQAorWExJQiAgID0gQFhfUFJFX0xJQlNAIC1sWGV4dCAtbFgxMSBAWF9FWFRSQV9MSUJTQAogTU9EVUxFID0gdG9vbGtpdAogCiBDX1NSQ1MgPSBcCisJYXRvbS5jIFwKIAlhcmNoLmMgXAogCWhlYXAuYyBcCisJbWlzY3N0dWJzLmMgXAogCXN1cC5jIFwKIAl3aW5tYWluLmMKIAogYWxsOiAkKE1PRFVMRSkubwogCitoZWxsbzogaGVsbG8ubyAuLi93aW5lbGliLmEKKwlnY2MgLWcgLW8gaGVsbG8gaGVsbG8ubyAuLi93aW5lbGliLmEgLWxtICQoWF9MSUJTKSAtbFhwbSAkKFhMSUIpCisKK2hlbGxvMjogaGVsbG8yLm8gLi4vd2luZWxpYi5hCisJZ2NjIC1nIC1vIGhlbGxvMiBoZWxsbzIubyAuLi93aW5lbGliLmEgLWxtICQoWF9MSUJTKSAtbFhwbSAkKFhMSUIpCisKIEBNQUtFX1JVTEVTQAogCitjbGVhbjo6CisJJChSTSkgaGVsbG8gaGVsbG8yCisKICMjIyBEZXBlbmRlbmNpZXM6CmRpZmYgLS1naXQgYS90b29sa2l0L2F0b20uYyBiL3Rvb2xraXQvYXRvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YWU0NDUKLS0tIC9kZXYvbnVsbAorKysgYi90b29sa2l0L2F0b20uYwpAQCAtMCwwICsxLDM0MCBAQAorLyoKKyAqIEF0b20gdGFibGUgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgIndpbmRvd3MuaCIKKworI2lmZGVmIENPTkZJR19JUEMKKyNpbmNsdWRlICJkZGVfYXRvbS5oIgorI2luY2x1ZGUgIm9wdGlvbnMuaCIKKyNlbmRpZgorCisjZGVmaW5lIE1JTl9TVFJfQVRPTSAgICAgICAgICAgICAgMHhjMDAwCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIFdPUkQgIHJlZkNvdW50OworICBCWVRFICBsZW5ndGg7CisgIGNoYXIqIHN0cjsKK30gQVRPTURBVEE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHZvaWQqIG5leHQ7CisgIEFUT01EQVRBIGEyaFsxNl07Cit9IEFUT010b0hBTkRMRXRhYmxlOworCitzdGF0aWMgQVRPTXRvSEFORExFdGFibGUqIEdsb2JhbEF0b21UYWJsZSA9IE5VTEw7CitzdGF0aWMgQVRPTXRvSEFORExFdGFibGUqICBMb2NhbEF0b21UYWJsZSA9IE5VTEw7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQVRPTV9Jbml0CisgKgorICogR2xvYmFsIHRhYmxlIGluaXRpYWxpc2F0aW9uLgorICovCitCT09MIEFUT01fSW5pdCh2b2lkKQoreworICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBBVE9NX0FkZEF0b20KKyAqLworc3RhdGljIEFUT00gQVRPTV9BZGRBdG9tKCBBVE9NdG9IQU5ETEV0YWJsZSoqIHRhYmxlcHRyLCBTRUdQVFIgbmFtZSApCit7CisgICAgQVRPTURBVEEqIEZpcnN0VW51c2VkOworICAgIEFUT00gRmlyc3RVbnVzZWRJbmRleDsKKyAgICBBVE9NIEluZGV4OworICAgIEFUT010b0hBTkRMRXRhYmxlKiB0YWJsZTsKKyAgICBpbnQgaSxsZW47CisgICAgY2hhciAqc3RyOworCisgICAgLyogQ2hlY2sgZm9yIGludGVnZXIgYXRvbSAqLworCisgICAgaWYgKCFISVdPUkQobmFtZSkpIHJldHVybiAoQVRPTSlMT1dPUkQobmFtZSk7CisgICAgc3RyID0gKGNoYXIqKW5hbWU7CisgICAgaWYgKHN0clswXSA9PSAnIycpIHJldHVybiBhdG9pKCAmc3RyWzFdICk7CisKKyAgICBpZiAoKGxlbiA9IHN0cmxlbiggc3RyICkpID4gMjU1KSBsZW4gPSAyNTU7CisgICAgdGFibGUgPSAqdGFibGVwdHI7CisgICAgRmlyc3RVbnVzZWQgPSBOVUxMOworICAgIEZpcnN0VW51c2VkSW5kZXggPSAwOworICAgIEluZGV4ID0gTUlOX1NUUl9BVE9NOworICAgIHdoaWxlICh0YWJsZSkKKyAgICB7CisgICAgICBmb3IoaT0wOyBpPDE2OyBpKyssIEluZGV4KyspCisgICAgICB7CisJaWYgKCF0YWJsZS0+YTJoW2ldLnJlZkNvdW50KQorCXsKKwkgIEZpcnN0VW51c2VkPSZ0YWJsZS0+YTJoW2ldOworCSAgRmlyc3RVbnVzZWRJbmRleD1JbmRleDsKKwl9CisJZWxzZSBpZiAoKHRhYmxlLT5hMmhbaV0ubGVuZ3RoID09IGxlbikgJiYgCisJCSAoIXN0cm5jYXNlY21wKCB0YWJsZS0+YTJoW2ldLnN0ciwgc3RyLCBsZW4gKSkpCisJeworCSAgICB0YWJsZS0+YTJoW2ldLnJlZkNvdW50Kys7CisJICAgIHJldHVybiBJbmRleDsKKwl9CisgICAgICB9CisgICAgICB0YWJsZXB0ciA9IChBVE9NdG9IQU5ETEV0YWJsZSoqKSZ0YWJsZS0+bmV4dDsKKyAgICAgIHRhYmxlID0gdGFibGUtPm5leHQ7CisgICAgfQorICAgIGlmKCFGaXJzdFVudXNlZCkKKyAgICB7CisgICAgICAqdGFibGVwdHIgPSBtYWxsb2Moc2l6ZW9mKEFUT010b0hBTkRMRXRhYmxlKSk7CisgICAgICAoKnRhYmxlcHRyKS0+bmV4dCA9IE5VTEw7CisgICAgICBmb3IoaT0wOyBpPDE2OyBpKyspCisgICAgICB7CisJKCp0YWJsZXB0ciktPmEyaFtpXS5zdHIgPSBOVUxMOworCSgqdGFibGVwdHIpLT5hMmhbaV0ucmVmQ291bnQgPSAwOworICAgICAgfQorICAgICAgRmlyc3RVbnVzZWQgPSAoKnRhYmxlcHRyKS0+YTJoOworICAgICAgRmlyc3RVbnVzZWRJbmRleCA9IEluZGV4OworICAgIH0KKyAgICBpZigoRmlyc3RVbnVzZWQtPnN0ciA9IG1hbGxvYyhsZW4rMSkpKQorICAgIHsKKyAgICAgIG1lbWNweSggRmlyc3RVbnVzZWQtPnN0ciwgc3RyLCBsZW4gKTsKKyAgICAgIEZpcnN0VW51c2VkLT5zdHJbbGVuXSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiAwOworICAgIEZpcnN0VW51c2VkLT5yZWZDb3VudCA9IDE7CisgICAgRmlyc3RVbnVzZWQtPmxlbmd0aCA9IGxlbjsKKyAgICByZXR1cm4gRmlyc3RVbnVzZWRJbmRleDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBBVE9NX0RlbGV0ZUF0b20KKyAqLworc3RhdGljIEFUT00gQVRPTV9EZWxldGVBdG9tKCBBVE9NdG9IQU5ETEV0YWJsZSoqIHRhYmxlcHRyLCBBVE9NIGF0b20gKQoreyAgICAKKyAgICBBVE9NdG9IQU5ETEV0YWJsZSogdGFibGU7CisgICAgaW50IGk7CisgICAgQVRPTSBJbmRleDsKKworICAgIGlmIChhdG9tIDwgTUlOX1NUUl9BVE9NKSByZXR1cm4gMDsgIC8qIEludGVnZXIgYXRvbSAqLworCisgICAgSW5kZXggPSBNSU5fU1RSX0FUT007CisgICAgdGFibGUgPSAqdGFibGVwdHI7CisgICAgd2hpbGUgKHRhYmxlKQorICAgIHsKKyAgICAgIGlmKGF0b20tSW5kZXggPCAxNikKKyAgICAgIHsKKwlpPWF0b20tSW5kZXg7CisKKwkvKiBEZWxldGUgYXRvbSAqLworCWlmICgtLXRhYmxlLT5hMmhbaV0ucmVmQ291bnQgPT0gMCkKKwl7CisJICBmcmVlKHRhYmxlLT5hMmhbaV0uc3RyKTsKKwkgIHRhYmxlLT5hMmhbaV0uc3RyPU5VTEw7CisJfSAgICAKKwlyZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKwlJbmRleCs9MTY7CisJdGFibGUgPSB0YWJsZS0+bmV4dDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGF0b207Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQVRPTV9GaW5kQXRvbQorICovCitzdGF0aWMgQVRPTSBBVE9NX0ZpbmRBdG9tKCBBVE9NdG9IQU5ETEV0YWJsZSoqIHRhYmxlcHRyLCBTRUdQVFIgbmFtZSApCit7CisgICAgQVRPTSBJbmRleDsKKyAgICBBVE9NdG9IQU5ETEV0YWJsZSogdGFibGU7CisgICAgaW50IGksbGVuOworICAgIGNoYXIgKnN0cjsKKworICAgIC8qIENoZWNrIGZvciBpbnRlZ2VyIGF0b20gKi8KKworICAgIGlmICghSElXT1JEKG5hbWUpKSByZXR1cm4gKEFUT00pTE9XT1JEKG5hbWUpOworICAgIHN0ciA9IChjaGFyKiluYW1lOworICAgIGlmIChzdHJbMF0gPT0gJyMnKSByZXR1cm4gYXRvaSggJnN0clsxXSApOworCisgICAgaWYgKChsZW4gPSBzdHJsZW4oIHN0ciApKSA+IDI1NSkgbGVuID0gMjU1OworICAgIHRhYmxlPSp0YWJsZXB0cjsKKyAgICBJbmRleD1NSU5fU1RSX0FUT007CisgICAgd2hpbGUgKHRhYmxlKQorICAgIHsKKyAgICAgIGZvcihpPTA7IGk8MTY7IGkrKywgSW5kZXgrKykKKyAgICAgIHsKKwlpZiAoKHRhYmxlLT5hMmhbaV0ucmVmQ291bnQgIT0gMCkgJiYKKwkgICAgKHRhYmxlLT5hMmhbaV0ubGVuZ3RoID09IGxlbikgJiYgCisJICAgICghc3RybmNhc2VjbXAoIHRhYmxlLT5hMmhbaV0uc3RyLCBzdHIsIGxlbiApKSkKKwkgIHJldHVybiBJbmRleDsKKyAgICAgIH0KKyAgICAgIHRhYmxlPXRhYmxlLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBBVE9NX0dldEF0b21OYW1lCisgKi8KK3N0YXRpYyBXT1JEIEFUT01fR2V0QXRvbU5hbWUoIEFUT010b0hBTkRMRXRhYmxlKiogdGFibGVwdHIsIEFUT00gYXRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGJ1ZmZlciwgc2hvcnQgY291bnQgKQoreworICAgIEFUT010b0hBTkRMRXRhYmxlKiB0YWJsZTsKKyAgICBBVE9NIEluZGV4OworICAgIGNoYXIgKiBzdHJQdHI9TlVMTDsKKyAgICBpbnQgaSxsZW49MDsKKyAgICBjaGFyIHRleHRbOF07CisgICAgCisgICAgaWYgKCFjb3VudCkgcmV0dXJuIDA7CisgICAgaWYgKGF0b20gPCBNSU5fU1RSX0FUT00pCisgICAgeworCXNwcmludGYoIHRleHQsICIjJWQiLCBhdG9tICk7CisJbGVuID0gc3RybGVuKHRleHQpOworCXN0clB0ciA9IHRleHQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBJbmRleCA9IE1JTl9TVFJfQVRPTTsKKyAgICAgIHRhYmxlID0gKnRhYmxlcHRyOworICAgICAgd2hpbGUgKHRhYmxlKQorICAgICAgeworCWlmKGF0b20tSW5kZXggPCAxNikKKwl7CisJICBpPWF0b20tSW5kZXg7CisJICAKKwkgIGlmICh0YWJsZS0+YTJoW2ldLnJlZkNvdW50ID09IDApCisJICAgIHRhYmxlPU5VTEw7CisJICBlbHNlCisJICB7CisJICAgIGxlbiA9IHRhYmxlLT5hMmhbaV0ubGVuZ3RoOworCSAgICBzdHJQdHIgPSB0YWJsZS0+YTJoW2ldLnN0cjsKKwkgIH0KKwkgIGJyZWFrOworCX0KKwllbHNlCisJeworCSAgSW5kZXgrPTE2OworCSAgdGFibGUgPSB0YWJsZS0+bmV4dDsKKwl9CisgICAgICB9CisgICAgICBpZighdGFibGUpcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChsZW4gPj0gY291bnQpIGxlbiA9IGNvdW50LTE7CisgICAgbWVtY3B5KCBidWZmZXIsIHN0clB0ciwgbGVuICk7CisgICAgYnVmZmVyW2xlbl0gPSAnXDAnOworICAgIHJldHVybiBsZW47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgSW5pdEF0b21UYWJsZSAgIChLRVJORUwuNjgpCisgKi8KK1dPUkQgSW5pdEF0b21UYWJsZSggV09SRCBlbnRyaWVzICkKK3sKKyAgICByZXR1cm4gZW50cmllczsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRBdG9tSGFuZGxlICAgKEtFUk5FTC43MykKKyAqLworSEFORExFIEdldEF0b21IYW5kbGUoIEFUT00gYXRvbSApCit7CisgIGZwcmludGYoc3RkZXJyLCJKQlA6IEdldEF0b21IYW5kbGUoKSBjYWxsZWQgKG9ic29sZXRlKS5cbiIpOworICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBBZGRBdG9tICAgKEtFUk5FTC43MCkKKyAqLworQVRPTSBBZGRBdG9tKCBTRUdQVFIgc3RyICkKK3sKKyAgICByZXR1cm4gQVRPTV9BZGRBdG9tKCAmTG9jYWxBdG9tVGFibGUsIChTRUdQVFIpc3RyICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRGVsZXRlQXRvbSAgIChLRVJORUwuNzEpCisgKi8KK0FUT00gRGVsZXRlQXRvbSggQVRPTSBhdG9tICkKK3sKKyAgICByZXR1cm4gQVRPTV9EZWxldGVBdG9tKCAmTG9jYWxBdG9tVGFibGUsIGF0b20gKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBGaW5kQXRvbSAgIChLRVJORUwuNjkpCisgKi8KK0FUT00gRmluZEF0b20oIFNFR1BUUiBzdHIgKQoreworICAgIHJldHVybiBBVE9NX0ZpbmRBdG9tKCAmTG9jYWxBdG9tVGFibGUsIHN0ciApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldEF0b21OYW1lICAgKEtFUk5FTC43MikKKyAqLworV09SRCBHZXRBdG9tTmFtZSggQVRPTSBhdG9tLCBMUFNUUiBidWZmZXIsIHNob3J0IGNvdW50ICkKK3sKKyAgICByZXR1cm4gQVRPTV9HZXRBdG9tTmFtZSggJkxvY2FsQXRvbVRhYmxlLCBhdG9tLCBidWZmZXIsIGNvdW50ICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2xvYmFsQWRkQXRvbSAgIChVU0VSLjI2OCkKKyAqLworQVRPTSBHbG9iYWxBZGRBdG9tKCBTRUdQVFIgc3RyICkKK3sKKyNpZmRlZiBDT05GSUdfSVBDCisgICAgaWYgKE9wdGlvbnMuaXBjKSByZXR1cm4gRERFX0dsb2JhbEFkZEF0b20oIHN0ciApOworI2VuZGlmCisgICAgcmV0dXJuIEFUT01fQWRkQXRvbSggJkdsb2JhbEF0b21UYWJsZSwgc3RyICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2xvYmFsRGVsZXRlQXRvbSAgIChVU0VSLjI2OSkKKyAqLworQVRPTSBHbG9iYWxEZWxldGVBdG9tKCBBVE9NIGF0b20gKQoreworI2lmZGVmIENPTkZJR19JUEMKKyAgICBpZiAoT3B0aW9ucy5pcGMpIHJldHVybiBEREVfR2xvYmFsRGVsZXRlQXRvbSggYXRvbSApOworI2VuZGlmCisgICAgcmV0dXJuIEFUT01fRGVsZXRlQXRvbSggJkdsb2JhbEF0b21UYWJsZSwgYXRvbSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdsb2JhbEZpbmRBdG9tICAgKFVTRVIuMjcwKQorICovCitBVE9NIEdsb2JhbEZpbmRBdG9tKCBTRUdQVFIgc3RyICkKK3sKKyNpZmRlZiBDT05GSUdfSVBDCisgICAgaWYgKE9wdGlvbnMuaXBjKSByZXR1cm4gRERFX0dsb2JhbEZpbmRBdG9tKCBzdHIgKTsKKyNlbmRpZgorICAgIHJldHVybiBBVE9NX0ZpbmRBdG9tKCAmR2xvYmFsQXRvbVRhYmxlLCBzdHIgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHbG9iYWxHZXRBdG9tTmFtZSAgIChVU0VSLjI3MSkKKyAqLworV09SRCBHbG9iYWxHZXRBdG9tTmFtZSggQVRPTSBhdG9tLCBMUFNUUiBidWZmZXIsIHNob3J0IGNvdW50ICkKK3sKKyNpZmRlZiBDT05GSUdfSVBDCisgICAgaWYgKE9wdGlvbnMuaXBjKSByZXR1cm4gRERFX0dsb2JhbEdldEF0b21OYW1lKCBhdG9tLCBidWZmZXIsIGNvdW50ICk7CisjZW5kaWYKKyAgICByZXR1cm4gQVRPTV9HZXRBdG9tTmFtZSggJkdsb2JhbEF0b21UYWJsZSwgYXRvbSwgYnVmZmVyLCBjb3VudCApOworfQpkaWZmIC0tZ2l0IGEvdG9vbGtpdC9oZWFwLmMgYi90b29sa2l0L2hlYXAuYwppbmRleCBjMTU4NGM3Li4zNzBmN2M2IDEwMDY0NAotLS0gYS90b29sa2l0L2hlYXAuYworKysgYi90b29sa2l0L2hlYXAuYwpAQCAtNiwxMSArNiwxNCBAQAogICogQWxsIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBpcyBiZWluZyBkb25lIGJ5IHRoZSBsaWJjIG1hbGxvYyBhbmQgZnJpZW5kcy4KICAqLwogCi0jaWZuZGVmIF9fU1REQ19fCisvKiAjaWZuZGVmIF9fU1REQ19fICovCiAjaW5jbHVkZSA8bWFsbG9jLmg+Ci0jZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKy8qICNlbmRpZiAqLwogI2luY2x1ZGUgIndpbmRvd3MuaCIKIAorI2lmZGVmIFdJTkVMSUIxNgorCiAvKiBDb250cm9scyB0aGUgYmxvY2tzIHBlciBoYW5kbGUgdGFibGUgKi8KICNkZWZpbmUgTUFYQkxPQ0tTIDEwMjQKIApAQCAtMjAzLDMgKzIwNiwxMTEgQEAKIH0KIAogI2VuZGlmCisKKyNlbHNlIC8qIFdJTkVMSUIxNiAqLworSEFORExFIExvY2FsQWxsb2MgKFdPUkQgZmxhZ3MsIFdPUkQgYnl0ZXMpCit7CisgICAgSEFORExFIG07CisKKyAgICBpZiAoZmxhZ3MgJiBMTUVNX1dJTkVfQUxJR04pCisJbSA9IG1lbWFsaWduICg0LCBieXRlcyk7CisgICAgZWxzZQorCW0gPSBtYWxsb2MgKGJ5dGVzKTsKKyAgICBpZiAobSl7CisJaWYgKGZsYWdzICYgTE1FTV9aRVJPSU5JVCkKKwkgICAgYnplcm8gKG0sIGJ5dGVzKTsKKyAgICB9CisgICAgcmV0dXJuIG07Cit9CisKK1dPUkQgTG9jYWxDb21wYWN0IChXT1JEIG1pbl9mcmVlKQoreworICAgIHJldHVybiBtaW5fZnJlZTsKK30KKworV09SRCBMb2NhbEZsYWdzIChIQU5ETEUgaE1lbSkKK3sKKyAgICByZXR1cm4gMDsKK30KKworSEFORExFIExvY2FsRnJlZSAoSEFORExFIGhNZW0pCit7CisgICAgZnJlZShoTWVtKTsKKyAgICByZXR1cm4gMDsKK30KKworQk9PTCBMb2NhbEluaXQgKEhBTkRMRSBzZWdtZW50LCBXT1JEIHN0YXJ0LCBXT1JEIGVuZCkKK3sKKyAgICByZXR1cm4gVFJVRTsKK30KKworTFBWT0lEIExvY2FsTG9jayAoSEFORExFIGhNZW0pCit7CisgICAgcmV0dXJuIGhNZW07Cit9CisKK0hBTkRMRSBMb2NhbFJlQWxsb2MgKEhBTkRMRSBoTWVtLCBXT1JEIGZsYWdzLCBXT1JEIGJ5dGVzKQoreworICAgIHJlYWxsb2MoaE1lbSwgYnl0ZXMpOworICAgIHJldHVybiBoTWVtOworfQorCitXT1JEIExvY2FsU2l6ZSAoSEFORExFIGhNZW0pCit7CisgICAgLyogTm90IGltcGxlbWVudGVkIHlldCAqLworICByZXR1cm4gMDsKK30KKworCitCT09MIExvY2FsVW5Mb2NrIChIQU5ETEUgaE1lbSkKK3sKKyAgICByZXR1cm4gMDsKK30KKworSEFORExFIEdsb2JhbEFsbG9jIChXT1JEIGZsYWdzLCBEV09SRCBzaXplKQoreworICAgIHJldHVybiBMb2NhbEFsbG9jIChmbGFncywgc2l6ZSk7Cit9CisKK0hBTkRMRSBHbG9iYWxGcmVlIChIQU5ETEUgaE1lbSkKK3sKKyAgICByZXR1cm4gTG9jYWxGcmVlIChoTWVtKTsKK30KKworTFBWT0lEIEdsb2JhbExvY2sgKEhHTE9CQUwgaE1lbSkKK3sKKyAgICByZXR1cm4gTG9jYWxMb2NrIChoTWVtKTsKK30KKworQk9PTCBHbG9iYWxVbmxvY2sgKEhBTkRMRSBoTWVtKQoreworICAgIHJldHVybiBMb2NhbFVuTG9jayAoaE1lbSk7Cit9CisKK1dPUkQgR2xvYmFsRmxhZ3MgKEhBTkRMRSBoTWVtKQoreworICAgIHJldHVybiBMb2NhbEZsYWdzIChoTWVtKTsKK30KKworRFdPUkQgR2xvYmFsU2l6ZSAoSEFORExFIGhNZW0pCit7CisgICAgcmV0dXJuIExvY2FsU2l6ZSAoaE1lbSk7Cit9CisKK0RXT1JEIEdsb2JhbENvbXBhY3QoRFdPUkQgZGVzaXJlZCkKK3sKKyAgICBpZiAoZGVzaXJlZCkKKwlyZXR1cm4gZGVzaXJlZDsKKyAgICBlbHNlCisJcmV0dXJuIDB4MDEwMDAwMDA7CS8qIFNob3VsZCBjaGVjayB0aGUgYXZhaWxhYmxlIGNvcmUuICovCit9CisKK0hBTkRMRSBHbG9iYWxSZUFsbG9jKEhBTkRMRSBoTWVtLCBEV09SRCBuZXdfc2l6ZSwgV09SRCBmbGFncykKK3sKKyAgICBpZiAoIShmbGFncyAmIEdNRU1fTU9ESUZZKSkKKyAgICAgIHJldHVybiBMb2NhbFJlQWxsb2MgKGhNZW0sIG5ld19zaXplLCBmbGFncyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGhNZW07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbGtpdC9oZWxsby5jIGIvdG9vbGtpdC9oZWxsby5jCmluZGV4IDYwNGYxOGIuLjQyODVhYzEgMTAwNjQ0Ci0tLSBhL3Rvb2xraXQvaGVsbG8uYworKysgYi90b29sa2l0L2hlbGxvLmMKQEAgLTUsNyArNSw3IEBACiAgICAgVGV4dE91dCAoZGMsIHgsIHksIHMsIHN0cmxlbiAocykpOwogfQogCi1MT05HIFduZFByb2MgKEhBTkRMRSB3bmQsIFVJTlQgbXNnLCBXT1JEIHcsIExPTkcgbCkKK0xSRVNVTFQgV25kUHJvYyAoSFdORCB3bmQsIFVJTlQgbXNnLCBXUEFSQU0gdywgTFBBUkFNIGwpCiB7CiAgICAgc3RhdGljIHNob3J0IHhDaGFyLCB5Q2hhcjsKICAgICBIREMgZGM7CkBAIC01Myw3ICs1Myw3IEBACiAJY2xhc3MuaEN1cnNvciAgICA9IExvYWRDdXJzb3IgKDAsIElEQ19BUlJPVyk7CiAJY2xhc3MuaGJyQmFja2dyb3VuZCA9IEdldFN0b2NrT2JqZWN0IChXSElURV9CUlVTSCk7CiAJY2xhc3MubHBzek1lbnVOYW1lID0gTlVMTDsKLQljbGFzcy5scHN6Q2xhc3NOYW1lID0gImNsYXNzIjsKKwljbGFzcy5scHN6Q2xhc3NOYW1lID0gKFNFR1BUUikiY2xhc3MiOwogICAgIH0KICAgICBpZiAoIVJlZ2lzdGVyQ2xhc3MgKCZjbGFzcykpCiAJcmV0dXJuIEZBTFNFOwpAQCAtNjgsNCArNjgsNSBAQAogCVRyYW5zbGF0ZU1lc3NhZ2UgKCZtc2cpOwogCURpc3BhdGNoTWVzc2FnZSAoJm1zZyk7CiAgICAgfQorICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdG9vbGtpdC9oZWxsbzIuYyBiL3Rvb2xraXQvaGVsbG8yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5ZjEzMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xraXQvaGVsbG8yLmMKQEAgLTAsMCArMSw5IEBACisjaW5jbHVkZSAid2luZG93cy5oIgorCitpbnQgUEFTQ0FMIFdpbk1haW4gKEhBTkRMRSBpbnN0LCBIQU5ETEUgcHJldiwgTFBTVFIgY21kbGluZSwgaW50IHNob3cpCit7CisgIHJldHVybiBNZXNzYWdlQm94KChIV05EKTAsCisJCSAgICAoTFBTVFIpIkhlbGxvLCBoZWxsbyEiLAorCQkgICAgKExQU1RSKSJIZWxsbyBXaW5lIEFwcGxpY2F0aW9uIiwKKwkJICAgIChNQl9PSyB8IE1CX0lDT05FWENMQU1BVElPTikpOworfQpkaWZmIC0tZ2l0IGEvdG9vbGtpdC9taXNjc3R1YnMuYyBiL3Rvb2xraXQvbWlzY3N0dWJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiOTAxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xraXQvbWlzY3N0dWJzLmMKQEAgLTAsMCArMSwzMjQgQEAKKy8qCisgKiBKQlAgKEppbSBQZXRlcnNvbiA8anNwZXRlckBiaXJjaC5lZS52dC5lZHU+KTogTG90cyBvZiBzdHVicyBuZWVkZWQgZm9yCisgKiAgICAgIGxpYndpbmUuYS4KKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJkZGVfbWVtLmgiCisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgImdsb2JhbC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKK2ludCBDYWxsVG8zMl9MYXJnZVN0YWNrKCBpbnQgKCpmdW5jKSgpLCBpbnQgbmJhcmdzLCAuLi4pCit7CisgIHZhX2xpc3QgYXJnbGlzdDsKKyAgaW50IGksYVszMl07CisKKyAgdmFfc3RhcnQoYXJnbGlzdCxuYmFyZ3MpOworCisgIGZvcihpPTA7IGk8bmJhcmdzOyBpKyspIGFbaV09dmFfYXJnKGFyZ2xpc3QsaW50KTsKKworICBzd2l0Y2gobmJhcmdzKSAvKiBFd3d3Li4uIElja3kuICBCdXQgd2hhdCBjYW4gSSBkbz8gKi8KKyAgeworICBjYXNlIDU6IHJldHVybiBmdW5jKGFbMF0sYVsxXSxhWzJdLGFbM10sYVs0XSk7CisgIGNhc2UgNjogcmV0dXJuIGZ1bmMoYVswXSxhWzFdLGFbMl0sYVszXSxhWzRdLGFbNV0pOworICBjYXNlIDg6IHJldHVybiBmdW5jKGFbMF0sYVsxXSxhWzJdLGFbM10sYVs0XSxhWzVdLGFbNl0sYVs3XSk7CisgIGNhc2UgMTA6IHJldHVybiBmdW5jKGFbMF0sYVsxXSxhWzJdLGFbM10sYVs0XSxhWzVdLGFbNl0sCisgICAgICAgICAgICAgICAgYVs3XSxhWzhdLGFbOV0pOworICBjYXNlIDExOiByZXR1cm4gZnVuYyhhWzBdLGFbMV0sYVsyXSxhWzNdLGFbNF0sYVs1XSxhWzZdLAorICAgICAgICAgICAgICAgIGFbN10sYVs4XSxhWzldLGFbMTBdKTsKKyAgY2FzZSAxNDogcmV0dXJuIGZ1bmMoYVswXSxhWzFdLGFbMl0sYVszXSxhWzRdLGFbNV0sYVs2XSwKKyAgICAgICAgICAgICAgICBhWzddLGFbOF0sYVs5XSxhWzEwXSxhWzExXSxhWzEyXSxhWzEzXSk7CisgIGRlZmF1bHQ6IGZwcmludGYoc3RkZXJyLCJKQlA6IENhbGxUbzMyX0xhcmdlU3RhY2sgY2FsbGVkIHdpdGggdW5zdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyIG9mIGFyZ3VtZW50cyAoJWQpLiAgSWdub3JlZC5cbiIsbmJhcmdzKTsKKyAgICAgICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworV09SRCBDYWxsVG8xNl93b3JkXyAoIEZBUlBST0MgZnVuYywgV09SRCBhcmcgKSB7IHJldHVybiBmdW5jKGFyZyk7IH0KKworLyogdHlwZWRlZiB2b2lkKiBBVE9NOyAqLworLyogQVRPTSBHbG9iYWxBZGRBdG9tKGNoYXIgKm4pICovCisvKiB7ICovCisvKiAgIHJldHVybiBzdHJkdXAobik7ICovCisvKiB9ICovCisvKiBHbG9iYWxEZWxldGVBdG9tKEFUT00gbikgKi8KKy8qIHsgKi8KKy8qICAgZnJlZShuKTsgKi8KKy8qIH0gKi8KKy8qIEdsb2JhbEZpbmRBdG9tKGNoYXIqbikgKi8KKy8qIHsgKi8KKy8qICAgZnByaW50ZihzdGRlcnIsIkpCUDogR2xvYmFsRmluZEF0b20oKSBpZ25vcmVkLlxuIik7ICovCisvKiAgIHJldHVybiAwOyAqLworLyogfSAqLworLyogY2hhciAqR2xvYmFsR2V0QXRvbU5hbWUoQVRPTSBhKSAqLworLyogeyAqLworLyogICByZXR1cm4gYTsgKi8KKy8qIH0gKi8KKwordm9pZCBHbG9iYWxGcmVlQWxsKEhBTkRMRSBvd25lcikKK3sKKyAgZnByaW50ZihzdGRlcnIsIkpCUDogR2xvYmFsRnJlZUFsbCgpIGlnbm9yZWQuXG4iKTsKK30KKworU0VHUFRSIFdJTjE2X0dsb2JhbExvY2soSEdMT0JBTCBoKQoreworICByZXR1cm4gKFNFR1BUUiloOworfQorCisKKworI2lmIDAKK3R5cGVkZWYgV09SRCogSExPQ0FMOworCitpbnQgSXNWYWxpZEhMT0NBTChITE9DQUwgaGFuZGxlKQoreworICByZXR1cm4gKihoYW5kbGUtMSkgKyAqKGhhbmRsZS0yKSA9PSAwOyAvKiBWYWxpZCBITE9DQUwncyBzdW0gdG8gMCAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMT0NBTF9GcmVlCisgKgorICovCitITE9DQUwgTE9DQUxfRnJlZSggV09SRCBkcywgSExPQ0FMIGhhbmRsZSApCit7CisgIGlmICghSXNWYWxpZEhMT0NBTChoYW5kbGUpKSByZXR1cm4gaGFuZGxlOyAvKiBjb3VsZG4ndCBmcmVlIGl0ICovCisgIGZyZWUoaGFuZGxlLTIpOworICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMT0NBTF9BbGxvYworICoKKyAqLworSExPQ0FMIExPQ0FMX0FsbG9jKCBXT1JEIGRzLCBXT1JEIGZsYWdzLCBXT1JEIHNpemUgKQoreworICBITE9DQUwgaGFuZGxlOworICAgIAorICBoYW5kbGUgPSBtYWxsb2Moc2l6ZSArIDIqc2l6ZW9mKFdPUkQpKTsKKyAgaGFuZGxlICs9IDI7CisgICooaGFuZGxlLTIpID0gc2l6ZTsKKyAgKihoYW5kbGUtMSkgPSAtc2l6ZTsKKyAgcmV0dXJuIGhhbmRsZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMT0NBTF9SZUFsbG9jCisgKgorICovCitITE9DQUwgTE9DQUxfUmVBbGxvYyggV09SRCBkcywgSExPQ0FMIGhhbmRsZSwgV09SRCBzaXplLCBXT1JEIGZsYWdzICkKK3sKKyAgSExPQ0FMIG5ld2hhbmRsZTsKKworICBpZighSXNWYWxpZEhMT0NBTChoYW5kbGUpKXJldHVybiAwOworICBuZXdoYW5kbGUgPSByZWFsbG9jKGhhbmRsZS0yLCBzaXplKzIqc2l6ZW9mKFdPUkQpKTsKKyAgbmV3aGFuZGxlICs9IDI7CisgICoobmV3aGFuZGxlLTIpID0gc2l6ZTsKKyAgKihuZXdoYW5kbGUtMSkgPSAtc2l6ZTsKKyAgcmV0dXJuIG5ld2hhbmRsZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMT0NBTF9Mb2NrCisgKi8KK1dPUkQgTE9DQUxfTG9jayggV09SRCBkcywgSExPQ0FMIGhhbmRsZSApCit7CisgIGlmKCFJc1ZhbGlkSExPQ0FMKGhhbmRsZSkpcmV0dXJuIDA7CisgIHJldHVybiBoYW5kbGU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTE9DQUxfVW5sb2NrCisgKi8KK0JPT0wgTE9DQUxfVW5sb2NrKCBXT1JEIGRzLCBITE9DQUwgaGFuZGxlICkKK3sKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTE9DQUxfU2l6ZQorICoKKyAqLworV09SRCBMT0NBTF9TaXplKCBXT1JEIGRzLCBITE9DQUwgaGFuZGxlICkKK3sKKyAgcmV0dXJuICooaGFuZGxlLTIpOworfQorI2VuZGlmCisKK0hMT0NBTCBMT0NBTF9GcmVlKCBXT1JEIGRzLCBITE9DQUwgaGFuZGxlICkKK3sKKyAgZnByaW50ZihzdGRlcnIsIkpCUDogTE9DQUxfKigpIGlnbm9yZWQuXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisKK0hMT0NBTCBMT0NBTF9BbGxvYyggV09SRCBkcywgV09SRCBmbGFncywgV09SRCBzaXplICkKK3sKKyAgZnByaW50ZihzdGRlcnIsIkpCUDogTE9DQUxfKigpIGlnbm9yZWQuXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisKK0hMT0NBTCBMT0NBTF9SZUFsbG9jKCBXT1JEIGRzLCBITE9DQUwgaGFuZGxlLCBXT1JEIHNpemUsIFdPUkQgZmxhZ3MgKQoreworICBmcHJpbnRmKHN0ZGVyciwiSkJQOiBMT0NBTF8qKCkgaWdub3JlZC5cbiIpOworICByZXR1cm4gMDsKK30KKworV09SRCBMT0NBTF9Mb2NrKCBXT1JEIGRzLCBITE9DQUwgaGFuZGxlICkKK3sKKyAgZnByaW50ZihzdGRlcnIsIkpCUDogTE9DQUxfKigpIGlnbm9yZWQuXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisKK0JPT0wgTE9DQUxfVW5sb2NrKCBXT1JEIGRzLCBITE9DQUwgaGFuZGxlICkKK3sKKyAgZnByaW50ZihzdGRlcnIsIkpCUDogTE9DQUxfKigpIGlnbm9yZWQuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK1dPUkQgTE9DQUxfU2l6ZSggV09SRCBkcywgSExPQ0FMIGhhbmRsZSApCit7CisgIGZwcmludGYoc3RkZXJyLCJKQlA6IExPQ0FMXyooKSBpZ25vcmVkLlxuIik7CisgIHJldHVybiAwOworfQorCit2b2lkIEZhclNldE93bmVyKEhBTkRMRSBhLCBXT1JEIGIpCit7CisgIGZwcmludGYoc3RkZXJyLCJKQlA6IEZhclNldE93bmVyKCkgaWdub3JlZC5cbiIpOworfQorCisjZGVmaW5lIEdMT0JBTF9NQVhfQUxMT0NfU0laRSAweDAwZmYwMDAwICAvKiBMYXJnZXN0IGFsbG9jYXRpb24gaXMgMTZNIC0gNjRLICovCisKK0hHTE9CQUwgR0xPQkFMX0FsbG9jKCBXT1JEIGZsYWdzLCBEV09SRCBzaXplLCBIR0xPQkFMIGhPd25lciwKKyAgICAgICAgICAgICAgICAgICAgICBCT09MIGlzQ29kZSwgQk9PTCBpczMyQml0LCBCT09MIGlzUmVhZE9ubHkgKQoreworICAgIHZvaWQgKnB0cjsKKyAgICBIR0xPQkFMIGhhbmRsZTsKKyAgICBTSE1EQVRBIHNobWRhdGE7CisKKyAgICBkcHJpbnRmX2dsb2JhbCggc3RkZGViLCAiR0xPQkFMX0FsbG9jOiAlbGQgZmxhZ3M9JTA0eFxuIiwgc2l6ZSwgZmxhZ3MgKTsKKworICAgICAgLyogRml4dXAgdGhlIHNpemUgKi8KKworICAgIGlmIChzaXplID49IEdMT0JBTF9NQVhfQUxMT0NfU0laRSAtIDB4MWYpIHJldHVybiAwOworICAgIGlmIChzaXplID09IDApIHNpemUgPSAweDIwOworICAgIGVsc2Ugc2l6ZSA9IChzaXplICsgMHgxZikgJiB+MHgxZjsKKworICAgICAgLyogQWxsb2NhdGUgdGhlIGxpbmVhciBtZW1vcnkgKi8KKworI2lmZGVmIENPTkZJR19JUEMKKyAgICBpZiAoKGZsYWdzICYgR01FTV9EREVTSEFSRSkgJiYgT3B0aW9ucy5pcGMpCisgICAgICAgIHB0ciA9IERERV9tYWxsb2MoZmxhZ3MsIHNpemUsICZzaG1kYXRhKTsKKyAgICBlbHNlIAorI2VuZGlmICAvKiBDT05GSUdfSVBDICovCisJcHRyID0gbWFsbG9jKCBzaXplICk7CisgICAgaWYgKCFwdHIpIHJldHVybiAwOworCisgICAgICAvKiBBbGxvY2F0ZSB0aGUgc2VsZWN0b3IocykgKi8KKworICAgIGhhbmRsZSA9IEdMT0JBTF9DcmVhdGVCbG9jayggZmxhZ3MsIHB0ciwgc2l6ZSwgaE93bmVyLAorCQkJCWlzQ29kZSwgaXMzMkJpdCwgaXNSZWFkT25seSwgJnNobWRhdGEpOworICAgIGlmICghaGFuZGxlKQorICAgIHsKKyAgICAgICAgZnJlZSggcHRyICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChmbGFncyAmIEdNRU1fWkVST0lOSVQpIG1lbXNldCggcHRyLCAwLCBzaXplICk7CisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworSEdMT0JBTCBHTE9CQUxfQ3JlYXRlQmxvY2soIFdPUkQgZmxhZ3MsIHZvaWQgKnB0ciwgRFdPUkQgc2l6ZSwKKwkJCSAgICBIR0xPQkFMIGhPd25lciwgQk9PTCBpc0NvZGUsCisJCQkgICAgQk9PTCBpczMyQml0LCBCT09MIGlzUmVhZE9ubHksCisJCQkgICAgU0hNREFUQSAqc2htZGF0YSkKK3sKKyAgZnByaW50ZihzdGRlcnIsIkpCUDogR0xPQkFMX0NyZWF0ZUJsb2NrKCkgZmFrZWQuXG4iKTsKKyAgcmV0dXJuIHB0cjsKK30KKworQk9PTCBHTE9CQUxfRnJlZUJsb2NrKCBIR0xPQkFMIGhhbmRsZSApCit7CisgIGZwcmludGYoc3RkZXJyLCJKQlA6IEdMT0JBTF9GcmVlQmxvY2soKSBpZ25vcmVkLlxuIik7CisgIHJldHVybiAxOworfQorCitEV09SRCBHbG9iYWxIYW5kbGUoV09SRCBhKQoreworICBmcHJpbnRmKHN0ZGVyciwiSkJQOiBHbG9iYWxIYW5kbGUoKSBpZ25vcmVkLlxuIik7CisgIHJldHVybiAwOworfQorCit2b2lkICpSRUxBWTMyX0dldEVudHJ5UG9pbnQoY2hhciAqZGxsX25hbWUsIGNoYXIgKml0ZW0sIGludCBoaW50KQoreworICBmcHJpbnRmKHN0ZGVyciwiSkJQOiBSRUxBWTMyX0dldEVudHJ5UG9pbnQoKSBpZ25vcmVkLlxuIik7CisgIHJldHVybiBOVUxMOworfQorCitleHRlcm4gTFJFU1VMVCBBYm91dERsZ1Byb2MoSFdORCxVSU5ULFdQQVJBTSxMUEFSQU0pOworZXh0ZXJuIExSRVNVTFQgQnV0dG9uV25kUHJvYyhIV05ELFVJTlQsV1BBUkFNLExQQVJBTSk7CitleHRlcm4gTFJFU1VMVCBDQVJFVF9DYWxsYmFjayhIV05ELFVJTlQsV1BBUkFNLExQQVJBTSk7CitleHRlcm4gTFJFU1VMVCBDb2xvckRsZ1Byb2MoSFdORCxVSU5ULFdQQVJBTSxMUEFSQU0pOworZXh0ZXJuIExSRVNVTFQgQ29tYm9Cb3hXbmRQcm9jKEhXTkQsVUlOVCxXUEFSQU0sTFBBUkFNKTsKK2V4dGVybiBMUkVTVUxUIENvbWJvTEJveFduZFByb2MoSFdORCxVSU5ULFdQQVJBTSxMUEFSQU0pOworZXh0ZXJuIExSRVNVTFQgRGVza3RvcFduZFByb2MoSFdORCxVSU5ULFdQQVJBTSxMUEFSQU0pOworZXh0ZXJuIExSRVNVTFQgRWRpdFduZFByb2MoSFdORCxVSU5ULFdQQVJBTSxMUEFSQU0pOworZXh0ZXJuIExSRVNVTFQgRmlsZU9wZW5EbGdQcm9jKEhXTkQsVUlOVCxXUEFSQU0sTFBBUkFNKTsKK2V4dGVybiBMUkVTVUxUIEZpbGVTYXZlRGxnUHJvYyhIV05ELFVJTlQsV1BBUkFNLExQQVJBTSk7CitleHRlcm4gTFJFU1VMVCBGaW5kVGV4dERsZ1Byb2MoSFdORCxVSU5ULFdQQVJBTSxMUEFSQU0pOworZXh0ZXJuIExSRVNVTFQgTGlzdEJveFduZFByb2MoSFdORCxVSU5ULFdQQVJBTSxMUEFSQU0pOworZXh0ZXJuIExSRVNVTFQgTURJQ2xpZW50V25kUHJvYyhIV05ELFVJTlQsV1BBUkFNLExQQVJBTSk7CitleHRlcm4gTFJFU1VMVCBQb3B1cE1lbnVXbmRQcm9jKEhXTkQsVUlOVCxXUEFSQU0sTFBBUkFNKTsKK2V4dGVybiBMUkVTVUxUIFByaW50RGxnUHJvYyhIV05ELFVJTlQsV1BBUkFNLExQQVJBTSk7CitleHRlcm4gTFJFU1VMVCBQcmludFNldHVwRGxnUHJvYyhIV05ELFVJTlQsV1BBUkFNLExQQVJBTSk7CitleHRlcm4gTFJFU1VMVCBSZXBsYWNlVGV4dERsZ1Byb2MoSFdORCxVSU5ULFdQQVJBTSxMUEFSQU0pOworZXh0ZXJuIExSRVNVTFQgU2Nyb2xsQmFyV25kUHJvYyhIV05ELFVJTlQsV1BBUkFNLExQQVJBTSk7CitleHRlcm4gTFJFU1VMVCBTdGF0aWNXbmRQcm9jKEhXTkQsVUlOVCxXUEFSQU0sTFBBUkFNKTsKK2V4dGVybiBMUkVTVUxUIFN5c3RlbU1lc3NhZ2VCb3hQcm9jKEhXTkQsVUlOVCxXUEFSQU0sTFBBUkFNKTsKK2V4dGVybiBMUkVTVUxUIFRBU0tfUmVzY2hlZHVsZShIV05ELFVJTlQsV1BBUkFNLExQQVJBTSk7CisKK0xSRVNVTFQgRXJyb3JQcm9jKEhXTkQgaFduZCxVSU5UIG1zZyxXUEFSQU0gd1BhcmFtLExQQVJBTSBsUGFyYW0pCit7CisgIGZwcmludGYoc3RkZXJyLCJFUlJPUjogRXJyb3JQcm9jKCkgY2FsbGVkIVxuIik7CisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRXbmRQcm9jRW50cnkxNiAobm90IGEgV2luZG93cyBBUEkgZnVuY3Rpb24pCisgKgorICogUmV0dXJuIGFuIGVudHJ5IHBvaW50IGZyb20gdGhlIFdJTlBST0NTIGRsbC4KKyAqLworV05EUFJPQyBHZXRXbmRQcm9jRW50cnkxNiggY2hhciAqbmFtZSApCit7CisjZGVmaW5lIE1BUF9TVFJfVE9fUFJPQyhzdHIscHJvYykgaWYoIXN0cmNtcChuYW1lLHN0cikpcmV0dXJuIHByb2MKKyAgTUFQX1NUUl9UT19QUk9DKCJBYm91dERsZ1Byb2MiLEFib3V0RGxnUHJvYyk7CisgIE1BUF9TVFJfVE9fUFJPQygiQnV0dG9uV25kUHJvYyIsQnV0dG9uV25kUHJvYyk7CisgIE1BUF9TVFJfVE9fUFJPQygiQ0FSRVRfQ2FsbGJhY2siLENBUkVUX0NhbGxiYWNrKTsKKyAgTUFQX1NUUl9UT19QUk9DKCJDb2xvckRsZ1Byb2MiLENvbG9yRGxnUHJvYyk7CisgIE1BUF9TVFJfVE9fUFJPQygiQ29tYm9Cb3hXbmRQcm9jIixDb21ib0JveFduZFByb2MpOworICBNQVBfU1RSX1RPX1BST0MoIkNvbWJvTEJveFduZFByb2MiLENvbWJvTEJveFduZFByb2MpOworICBNQVBfU1RSX1RPX1BST0MoIkRlZkRsZ1Byb2MiLERlZkRsZ1Byb2MpOworICBNQVBfU1RSX1RPX1BST0MoIkRlc2t0b3BXbmRQcm9jIixEZXNrdG9wV25kUHJvYyk7CisgIE1BUF9TVFJfVE9fUFJPQygiRWRpdFduZFByb2MiLEVkaXRXbmRQcm9jKTsKKyAgTUFQX1NUUl9UT19QUk9DKCJGaWxlT3BlbkRsZ1Byb2MiLEZpbGVPcGVuRGxnUHJvYyk7CisgIE1BUF9TVFJfVE9fUFJPQygiRmlsZVNhdmVEbGdQcm9jIixGaWxlU2F2ZURsZ1Byb2MpOworICBNQVBfU1RSX1RPX1BST0MoIkZpbmRUZXh0RGxnUHJvYyIsRmluZFRleHREbGdQcm9jKTsKKyAgTUFQX1NUUl9UT19QUk9DKCJMaXN0Qm94V25kUHJvYyIsTGlzdEJveFduZFByb2MpOworICBNQVBfU1RSX1RPX1BST0MoIk1ESUNsaWVudFduZFByb2MiLE1ESUNsaWVudFduZFByb2MpOworICBNQVBfU1RSX1RPX1BST0MoIlBvcHVwTWVudVduZFByb2MiLFBvcHVwTWVudVduZFByb2MpOworICBNQVBfU1RSX1RPX1BST0MoIlByaW50RGxnUHJvYyIsUHJpbnREbGdQcm9jKTsKKyAgTUFQX1NUUl9UT19QUk9DKCJQcmludFNldHVwRGxnUHJvYyIsUHJpbnRTZXR1cERsZ1Byb2MpOworICBNQVBfU1RSX1RPX1BST0MoIlJlcGxhY2VUZXh0RGxnUHJvYyIsUmVwbGFjZVRleHREbGdQcm9jKTsKKyAgTUFQX1NUUl9UT19QUk9DKCJTY3JvbGxCYXJXbmRQcm9jIixTY3JvbGxCYXJXbmRQcm9jKTsKKyAgTUFQX1NUUl9UT19QUk9DKCJTdGF0aWNXbmRQcm9jIixTdGF0aWNXbmRQcm9jKTsKKyAgTUFQX1NUUl9UT19QUk9DKCJTeXN0ZW1NZXNzYWdlQm94UHJvYyIsU3lzdGVtTWVzc2FnZUJveFByb2MpOworICBNQVBfU1RSX1RPX1BST0MoIlRBU0tfUmVzY2hlZHVsZSIsVEFTS19SZXNjaGVkdWxlKTsKKyAgcmV0dXJuIEVycm9yUHJvYzsKK30KZGlmZiAtLWdpdCBhL3Rvb2xraXQvc3VwLmMgYi90b29sa2l0L3N1cC5jCmluZGV4IDlhNjZlNzQuLjQyMWEwOTcgMTAwNjQ0Ci0tLSBhL3Rvb2xraXQvc3VwLmMKKysrIGIvdG9vbGtpdC9zdXAuYwpAQCAtMSwxMiArMSwxMyBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAid2luZS5oIgogI2luY2x1ZGUgImFyY2guaCIKICNpbmNsdWRlICJuZWV4ZS5oIgogCi1MT05HIENhbGxXaW5kb3dQcm9jIChXTkRQUk9DIGZ1bmMsIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLAotCQkgICAgIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK0xSRVNVTFQgQ2FsbFdpbmRvd1Byb2MgKFdORFBST0MgZnVuYywgSFdORCBod25kLCBVSU5UIG1lc3NhZ2UsCisJCQlXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgIHJldHVybiAoKmZ1bmMpKGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKIH0KQEAgLTkxLDQgKzkyLDUgQEAKICAgICBMT0FEU0hPUlQgKGlkKTsKICAgICBMT0FEU0hPUlQgKGhhbmRsZSk7CiAgICAgTE9BRFNIT1JUICh1c2FnZSk7CisgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90b29sa2l0L3dpbm1haW4uYyBiL3Rvb2xraXQvd2lubWFpbi5jCmluZGV4IGY1YmQyMjcuLjE5ODJmNmIgMTAwNjQ0Ci0tLSBhL3Rvb2xraXQvd2lubWFpbi5jCisrKyBiL3Rvb2xraXQvd2lubWFpbi5jCkBAIC00LDMzICs0LDI3IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmUuaCIKIAotX1dpbk1haW4gKGludCBhcmdjLCBjaGFyICphcmd2IFtdKQorZXh0ZXJuIGludCBNQUlOX0luaXQodm9pZCk7CitleHRlcm4gQk9PTCBXSURHRVRTX0luaXQodm9pZCk7CitleHRlcm4gQk9PTCBXSU5fQ3JlYXRlRGVza3RvcFdpbmRvdyh2b2lkKTsKK2V4dGVybiBpbnQgUEFTQ0FMIFdpbk1haW4oSElOU1RBTkNFLEhJTlNUQU5DRSxMUFNUUixpbnQpOworZXh0ZXJuIHZvaWQgVEFTS19SZXNjaGVkdWxlKHZvaWQpOworZXh0ZXJuIGludCBVU0VSX0luaXRBcHAoSElOU1RBTkNFKTsKKworaW50IF9XaW5NYWluIChpbnQgYXJnYywgY2hhciAqYXJndiBbXSkKIHsKLSAgICBpbnQgcmV0X3ZhbDsKLSAgICBjaGFyIGZpbGVuYW1lIFs0MDk2XSwgKm1vZHVsZV9uYW1lLCAqcmVzb3VyY2VfZmlsZTsKLSAgICBIQU5ETEUgaFRhc2tNYWluLCBoSW5zdGFuY2U7Ci0gICAgCi0JLyogVGhlIGxpYndpbmUgcmVzb3VyY2UgRExMIGlzIHRlbXBvcmFyaWx5IGRpc2FibGVkICovCi0jaWYgMAotICAgIGlmICgobW9kdWxlX25hbWUgPSBzdHJjaHIgKGFyZ3YgWzBdLCAnLycpKSA9PSBOVUxMKXsKLQlwcmludGYgKCJFcnJvcjogQ2FuJ3QgZGV0ZXJtaW5lIGJhc2UgbmFtZSBmb3IgcmVzb3VyY2UgbG9hZGluZ1xuIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQorICBISU5TVEFOQ0UgaEluc3RhbmNlOwogCi0gICAgcmVzb3VyY2VfZmlsZSA9IG1hbGxvYyAoc3RybGVuICgrK21vZHVsZV9uYW1lKSArIDUpOwotICAgIHN0cmNweSAocmVzb3VyY2VfZmlsZSwgbW9kdWxlX25hbWUpOwotICAgIHN0cmNhdCAocmVzb3VyY2VfZmlsZSwgIi5kbGwiKTsKKyAgaWYoIU1BSU5fSW5pdCgpKSByZXR1cm4gMDsgLyogSkJQOiBOZWVkZWQgZm9yIERvc0RyaXZlc1tdIHN0cnVjdHVyZSwgZXRjLiAqLworICBoSW5zdGFuY2UgPSBXaW5FeGVjKCAqYXJndiwgU1dfU0hPV05PUk1BTCApOworICBUQVNLX1Jlc2NoZWR1bGUoKTsKKyAgVVNFUl9Jbml0QXBwKCBoSW5zdGFuY2UgKTsKKyAgLyogUGVyZm9ybSBnbG9iYWwgaW5pdGlhbGlzYXRpb25zIHRoYXQgbmVlZCBhIHRhc2sgY29udGV4dCAqLworICBpZiAoIVdJREdFVFNfSW5pdCgpKSByZXR1cm4gLTE7CisgIGlmICghV0lOX0NyZWF0ZURlc2t0b3BXaW5kb3coKSkgcmV0dXJuIC0xOwogCi0gICAgaEluc3RhbmNlID0gTG9hZEltYWdlIChyZXNvdXJjZV9maWxlLCAwLCAwKTsKLSNlbmRpZgotICAgIAotICAgIFVTRVJfSW5pdEFwcCggaEluc3RhbmNlICk7Ci0jaWYgMAotICAgIGhUYXNrTWFpbiA9IENyZWF0ZU5ld1Rhc2sgKDEpOyAvKiBUaGlzIGlzIG5vdCBjb3JyZWN0ICovCi0jZW5kaWYKLSAgICByZXRfdmFsID0gV2luTWFpbiAoaEluc3RhbmNlLAkvKiBoSW5zdGFuY2UgKi8KLQkJICAgICAgIDAsCQkvKiBoUHJldkluc3RhbmNlICovCi0JCSAgICAgICAiIiwJCS8qIGxwc3pDbWRQYXJhbSAqLwotCQkgICAgICAgU1dfTk9STUFMKTsgCS8qIG5DbWRTaG93ICovCi0gICAgcmV0dXJuIHJldF92YWw7CisgIHJldHVybiBXaW5NYWluIChoSW5zdGFuY2UsICAgIC8qIGhJbnN0YW5jZSAqLworCQkgIDAsCSAgICAgICAgLyogaFByZXZJbnN0YW5jZSAqLworCQkgICIiLAkgICAgICAgIC8qIGxwc3pDbWRQYXJhbSAqLworCQkgIFNXX05PUk1BTCk7ICAgLyogbkNtZFNob3cgKi8KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL0ltYWtlZmlsZSBiL3Rvb2xzL0ltYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVhYmQ3Yi4uMDAwMDAwMAotLS0gYS90b29scy9JbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jaW5jbHVkZSAiLi4vV2luZS50bXBsIgotCi1TUkNTID0gYnVpbGQuYwotCi1PQkpTID0gJChTUkNTOi5jPS5vKQotCi1BbGxUYXJnZXQoYnVpbGQpCi0KLU5vcm1hbFByb2dyYW1UYXJnZXQoYnVpbGQsYnVpbGQubywkKERFUExJQlMpLCwpCi0KLURlcGVuZFRhcmdldCgpCi0KLWluY2x1ZGVzOjoKLQotaW5zdGFsbDo6CmRpZmYgLS1naXQgYS90b29scy9idWlsZC5jIGIvdG9vbHMvYnVpbGQuYwppbmRleCAwMjIxYzQ5Li41OTU4ODc1IDEwMDY0NAotLS0gYS90b29scy9idWlsZC5jCisrKyBiL3Rvb2xzL2J1aWxkLmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlICJuZWV4ZS5oIgogCiAvKiBFTEYgc3ltYm9scyBkbyBub3QgaGF2ZSBhbiB1bmRlcnNjb3JlIGluIGZyb250ICovCi0jaWZkZWYgX19FTEZfXworI2lmIGRlZmluZWQgKF9fRUxGX18pIHx8IGRlZmluZWQgKF9fc3ZyNF9fKQogI2RlZmluZSBQUkVGSVgKICNlbHNlCiAjZGVmaW5lIFBSRUZJWCAiXyIKQEAgLTUzOSw3ICs1MzksNyBAQAogICAgIHBNb2R1bGUtPm1hZ2ljID0gTkVfU0lHTkFUVVJFOwogICAgIHBNb2R1bGUtPmNvdW50ID0gMTsKICAgICBwTW9kdWxlLT5uZXh0ID0gMDsKLSAgICBwTW9kdWxlLT5mbGFncyA9IE5FX0ZGTEFHU19TSU5HTEVEQVRBIHwgTkVfRkZMQUdTX0xJQk1PRFVMRTsKKyAgICBwTW9kdWxlLT5mbGFncyA9IE5FX0ZGTEFHU19TSU5HTEVEQVRBIHwgTkVfRkZMQUdTX0JVSUxUSU4gfCBORV9GRkxBR1NfTElCTU9EVUxFOwogICAgIHBNb2R1bGUtPmRncm91cCA9IDI7CiAgICAgcE1vZHVsZS0+aGVhcF9zaXplID0gMHhmZmZmOwogICAgIHBNb2R1bGUtPnN0YWNrX3NpemUgPSAwOwpAQCAtNzE4LDE0ICs3MTgsMTMgQEAKIAogICAgIHByaW50ZiggIi8qIEZpbGUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHksIGRvIG5vdCBlZGl0ISAqL1xuIiApOwogICAgIHByaW50ZiggIiNpbmNsdWRlIDxzeXMvdHlwZXMuaD5cbiIpOwotCXByaW50ZiggIiNpbmNsdWRlIFwid2luZG93cy5oXCJcbiIpOworICAgIHByaW50ZiggIiNpbmNsdWRlIFwid2luZG93cy5oXCJcbiIpOwogICAgIHByaW50ZiggIiNpbmNsdWRlIFwiZGxscy5oXCJcbiIpOwogICAgIHByaW50ZiggIiNpbmNsdWRlIFwicGVfaW1hZ2UuaFwiXG4iKTsKICAgICBwcmludGYoICIjaW5jbHVkZSBcIndpbmVycm9yLmhcIlxuIik7Ci0JcHJpbnRmKCAiI2luY2x1ZGUgXCJyZWxheTMyLmhcIlxuIik7CisgICAgcHJpbnRmKCAiI2luY2x1ZGUgXCJyZWxheTMyLmhcIlxuIik7CiAgICAgcHJpbnRmKCAiI2luY2x1ZGUgXCJzdGRkZWJ1Zy5oXCJcbiIpOwogICAgIHByaW50ZiggIiNpbmNsdWRlIFwiZGVidWcuaFwiXG4iKTsKLSAgICBwcmludGYoICJcbmV4dGVybiBpbnQgUkVMQVkzMl9VbmltcGxlbWVudGVkKCk7XG5cbiIgKTsKIAogICAgIG9kcCA9IE9yZGluYWxEZWZpbml0aW9uczsKICAgICBmb3IgKGkgPSAwOyBpIDw9IExpbWl0OyBpKyssIG9kcCsrKQpAQCAtNzYwLDggKzc1OSwxMyBAQAogICAgICAgICAgICAgICAgIGlmIChhcmdubyE9YXJnYy0xKSBwdXRjaGFyKCAnLCcgKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHByaW50ZiggIilcbntcbiIgKTsKLSAgICAgICAgICAgIHByaW50ZiggIlx0ZHByaW50Zl9yZWxheShzdGRkZWIsXCJFbnRlcmluZyAlJXMuJSVzKCIpOwotICAgICAgICAgICAgZm9yIChhcmdubz0wO2FyZ25vPGFyZ2M7YXJnbm8rKykgcHJpbnRmKCAiJSV4ICIpOworICAgICAgICAgICAgcHJpbnRmKCAiXHRkcHJpbnRmX3JlbGF5KHN0ZGRlYixcIkNhbGwgJSVzLiUlcygiKTsKKyAgICAgICAgICAgIGZvciAoYXJnbm89MDthcmdubzxhcmdjO2FyZ25vKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHV0Y2hhciggJyUnICk7CisgICAgICAgICAgICAgICAgcHV0Y2hhciggKGZkcC0+YXJnX3R5cGVzW2FyZ25vXSA9PSAncCcpID8gJ3AnIDogJ3gnICk7CisgICAgICAgICAgICAgICAgaWYgKGFyZ25vIDwgYXJnYy0xKSBwdXRjaGFyKCAnLCcgKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHByaW50ZiggIilcXG5cIiwgXCIlc1wiLCBcIiVzXCIiLCBVcHBlckRMTE5hbWUsIG9kcC0+ZXhwb3J0X25hbWUpOwogICAgICAgICAgICAgZm9yKGFyZ25vPTA7YXJnbm88YXJnYzthcmdubysrKSBwcmludGYoICIsJWMiLCAnYScrYXJnbm8pOwogICAgICAgICAgICAgcHJpbnRmKCAiKTtcblx0JXMoIiwgZmRwLT5pbnRlcm5hbF9uYW1lICk7CkBAIC04NDcsNyArODUxLDExIEBACiAgICAgcHJpbnRmKCAiXHQuZGF0YVxuIiApOwogICAgIHByaW50ZiggIlx0Lmdsb2JsICIgUFJFRklYICIlc19EYXRhX1N0YXJ0XG4iLCBVcHBlckRMTE5hbWUgKTsKICAgICBwcmludGYoIFBSRUZJWCAiJXNfRGF0YV9TdGFydDpcbiIsIFVwcGVyRExMTmFtZSApOworI2lmZGVmIF9fc3ZyNF9fCisgICAgcHJpbnRmKCAiXHQuNGJ5dGUgMCwwLDAsMCwwLDAsMCwwXG4iICk7CisjZWxzZQogICAgIHByaW50ZiggIlx0LndvcmQgMCwwLDAsMCwwLDAsMCwwXG4iICk7CisjZW5kaWYKICAgICBkYXRhX29mZnNldCA9IDE2OwogICAgIHByaW50ZiggIlx0LnRleHRcbiIgKTsKICAgICBwcmludGYoICJcdC5nbG9ibCAiIFBSRUZJWCAiJXNfQ29kZV9TdGFydFxuIiwgVXBwZXJETExOYW1lICk7CkBAIC04NzksNyArODg3LDExIEBACiAgICAgICAgICAgY2FzZSBUWVBFX1dPUkQ6CiAgICAgICAgICAgICBwcmludGYoICIvKiAlcy4lZCAqL1xuIiwgVXBwZXJETExOYW1lLCBpKTsKICAgICAgICAgICAgIG9kcC0+b2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CisjaWZkZWYgX19zdnI0X18KKyAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IDIgKiBPdXRwdXRWYXJpYWJsZUNvZGUoICIuNGJ5dGUiLCBvZHApOworI2Vsc2UKICAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IDIgKiBPdXRwdXRWYXJpYWJsZUNvZGUoICIud29yZCIsIG9kcCk7CisjZW5kaWYKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgY2FzZSBUWVBFX0xPTkc6CmRpZmYgLS1naXQgYS93aW4zMi9NYWtlZmlsZS5pbiBiL3dpbjMyL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYWJjYjYKLS0tIC9kZXYvbnVsbAorKysgYi93aW4zMi9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDE4IEBACitUT1BTUkMgPSBAdG9wX3NyY2RpckAKK01PRFVMRSA9IHdpbjMyCisKK0NfU1JDUyA9IFwKKwljb2RlX3BhZ2UuYyBcCisJZW52aXJvbm1lbnQuYyBcCisJZXJyb3IuYyBcCisJZmlsZS5jIFwKKwlpbml0LmMgXAorCW1lbW9yeS5jIFwKKwl0aHJlYWQuYyBcCisJdGltZS5jCisKK2FsbDogJChNT0RVTEUpLm8KKworQE1BS0VfUlVMRVNACisKKyMjIyBEZXBlbmRlbmNpZXM6CmRpZmYgLS1naXQgYS93aW4zMi9jb2RlX3BhZ2UuYyBiL3dpbjMyL2NvZGVfcGFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMzhlYTQKLS0tIC9kZXYvbnVsbAorKysgYi93aW4zMi9jb2RlX3BhZ2UuYwpAQCAtMCwwICsxLDM4IEBACisvKgorICogV2luMzIga2VybmVsIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAxOTk1IE1hcnRpbiB2b24gTG9ld2lzIGFuZCBDYW1lcm9uIEhlaWRlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAia2VybmVsMzIuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0QUNQICAgICAgICAgICAgICAgKEtFUk5FTDMyLjE0OCkKKyAqLworVUlOVCBHZXRBQ1Aodm9pZCkKK3sKKyAgICByZXR1cm4gMTI1MjsgICAgLyogV2luZG93cyAzLjEgSVNPIExhdGluICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldENQSW5mbyAgICAgICAgICAgIChLRVJORUwzMi4xNTQpCisgKi8KK0JPT0wgR2V0Q1BJbmZvKFVJTlQgY29kZXBhZ2UsIExQQ1BJTkZPIGNwaW5mbykKK3sKKyAgICBjcGluZm8tPk1heENoYXJTaXplID0gMTsKKyAgICBjcGluZm8tPkRlZmF1bHRDaGFyWzBdID0gJz8nOworCisgICAgcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIEdldE9FTUNQICAgICAgICAgICAgICAgIChLRVJORUwzMi4yNDgpCisgKi8KK1VJTlQgR2V0T0VNQ1Aodm9pZCkKK3sKKyAgICByZXR1cm4gNDM3OyAgICAvKiBNUy1ET1MgVW5pdGVkIFN0YXRlcyAqLworfQorCmRpZmYgLS1naXQgYS93aW4zMi9lbnZpcm9ubWVudC5jIGIvd2luMzIvZW52aXJvbm1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzdjNTdmCi0tLSAvZGV2L251bGwKKysrIGIvd2luMzIvZW52aXJvbm1lbnQuYwpAQCAtMCwwICsxLDI2IEBACisvKgorICogV2luMzIga2VybmVsIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAxOTk1IE1hcnRpbiB2b24gTG9ld2lzIGFuZCBDYW1lcm9uIEhlaWRlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAia2VybmVsMzIuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0Q29tbWFuZExpbmVBICAgICAgKEtFUk5FTDMyLjE2MSkKKyAqLworTFBTVFIgR2V0Q29tbWFuZExpbmVBKHZvaWQpCit7CisgICAgc3RhdGljIGNoYXIgYnVmZmVyWzI1Nl07CisgICAgUERCICpwZGIgPSAoUERCICopR2xvYmFsTG9jayggR2V0Q3VycmVudFBEQigpICk7CisgICAgbWVtY3B5KCBidWZmZXIsICZwZGItPmNtZExpbmVbMV0sIHBkYi0+Y21kTGluZVswXSApOworICAgIHByaW50ZigiQ29tbWFuZExpbmUgPSAlc1xuIiwgYnVmZmVyICk7CisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKwpkaWZmIC0tZ2l0IGEvd2luMzIvZXJyb3IuYyBiL3dpbjMyL2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiZTFmOAotLS0gL2Rldi9udWxsCisrKyBiL3dpbjMyL2Vycm9yLmMKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIFdpbjMyIGtlcm5lbCBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5NSBNYXJ0aW4gdm9uIExvZXdpcyBhbmQgQ2FtZXJvbiBIZWlkZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgImtlcm5lbDMyLmgiCisKK3N0YXRpYyBpbnQgV0lOMzJfTGFzdEVycm9yOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIEdldExhc3RFcnJvciAgICAgICAgICAgIChLRVJORUwzMi4yMjcpCisgKi8KK0RXT1JEIEdldExhc3RFcnJvcih2b2lkKQoreworICAgIHJldHVybiBXSU4zMl9MYXN0RXJyb3I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgU2V0TGFzdEVycm9yICAgICAgICAgICAgKEtFUk5FTDMyLjQ5NykKKyAqCisgKiBUaGlzIGlzIHByb2JhYmx5IG5vdCB1c2VkIGJ5IGFwcHMgdG9vIG11Y2gsIGJ1dCBpdCdzIHVzZWZ1bCBmb3IKKyAqIG91ciBvd24gaW50ZXJuYWwgdXNlLgorICovCit2b2lkIFNldExhc3RFcnJvcihEV09SRCBlcnJvcikKK3sKKyAgICBXSU4zMl9MYXN0RXJyb3IgPSBlcnJvcjsKK30KKworRFdPUkQgRXJybm9Ub0xhc3RFcnJvcihpbnQgZXJybm9fbnVtKQoreworICAgIHJldHVybiBlcnJub19udW07ICAgLyogT2J2aW91c2x5IG5vdCBmaW5pc2hlZCB5ZXQuIDotKSAqLworfQpkaWZmIC0tZ2l0IGEvd2luMzIvZmlsZS5jIGIvd2luMzIvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYjRhMDkKLS0tIC9kZXYvbnVsbAorKysgYi93aW4zMi9maWxlLmMKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIFdpbjMyIGtlcm5lbCBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5NSBNYXJ0aW4gdm9uIExvZXdpcyBhbmQgQ2FtZXJvbiBIZWlkZQorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAia2VybmVsMzIuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0RmlsZVR5cGUgICAgICAgICAgICAgIChLRVJORUwzMi4yMjIpCisgKgorICogR2V0RmlsZVR5cGUgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgc3RkaW4sIHN0ZG91dCwgYW5kIHN0ZGVyciwgd2hpY2gKKyAqIGFyZSBjb25zaWRlcmVkIHRvIGJlIG9mIHR5cGUgRklMRV9UWVBFX0NIQVIuCisgKi8KK0RXT1JEIEdldEZpbGVUeXBlKEhBTkRMRSBoRmlsZSkKK3sKKyAgICBEV09SRCBmaWxlX3R5cGU7CisKKyAgICBpZihoRmlsZSA8IDMpCisgICAgeworICAgICAgICBmaWxlX3R5cGUgPSAyOyAgICAgICAgLyogRklMRV9UWVBFX0NIQVIgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZmlsZV90eXBlID0gMDsgICAgICAgIC8qIEZJTEVfVFlQRV9VTktOT1dOICovCisgICAgfQorCisgICAgcmV0dXJuIGZpbGVfdHlwZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0U3RkSGFuZGxlICAgICAgICAgICAgIChLRVJORUwzMi4yNzYpCisgKi8KK0hBTkRMRSBHZXRTdGRIYW5kbGUoRFdPUkQgblN0ZEhhbmRsZSkKK3sKKyAgICAgICAgc3dpdGNoKG5TdGRIYW5kbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIC0xMC8qU1REX0lOUFVUX0hBTkRMRSovOnJldHVybiAoSEFORExFKTA7CisgICAgICAgICAgICAgICAgY2FzZSAtMTEvKlNURF9PVVRQVVRfSEFORExFKi86cmV0dXJuIChIQU5ETEUpMTsKKyAgICAgICAgICAgICAgICBjYXNlIC0xMi8qU1REX0VSUk9SX0hBTkRMRSovOnJldHVybiAoSEFORExFKTI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChIQU5ETEUpLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIFNldEZpbGVQb2ludGVyICAgICAgICAgIChLRVJORUwzMi40OTIpCisgKgorICogTHVja2lseSBlbm91Z2gsIHRoaXMgZnVuY3Rpb24gbWFwcyBhbG1vc3QgZGlyZWN0bHkgaW50byBhbiBsc2VlaworICogY2FsbCwgdGhlIGV4Y2VwdGlvbiBiZWluZyB0aGUgdXNlIG9mIDY0LWJpdCBvZmZzZXRzLgorICovCitEV09SRCBTZXRGaWxlUG9pbnRlcihIQU5ETEUgaEZpbGUsIExPTkcgZGlzdGFuY2UsIExPTkcgKmhpZ2h3b3JkLAorICAgICAgICAgICAgICAgICAgICAgRFdPUkQgbWV0aG9kKQoreworICAgIGludCByYzsKKworICAgIGlmKGhpZ2h3b3JkICE9IE5VTEwpCisgICAgeworICAgICAgICBpZigqaGlnaHdvcmQgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCJTZXRGaWxlUG9pbnRlcjogNjQtYml0IG9mZnNldHMgbm90IHlldCBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJjID0gbHNlZWsoaEZpbGUsIGRpc3RhbmNlLCBtZXRob2QpOworICAgIGlmKHJjID09IC0xKQorICAgICAgICBTZXRMYXN0RXJyb3IoRXJybm9Ub0xhc3RFcnJvcihlcnJubykpOworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBXcml0ZUZpbGUgICAgICAgICAgICAgICAoS0VSTkVMMzIuNTc4KQorICoKKyAqIFdyaXRlRmlsZSBpc24ndCB2ZXJ5IHVzZWZ1bCBhdCB0aGlzIHBvaW50IHNpbmNlIG9ubHkgc3RhbmRhcmQKKyAqIGhhbmRsZXMgYXJlIHBlcm1pdHRlZCwgYnV0IGl0IGxldHMgdXMgc2VlIHJ1bnRpbWUgZXJyb3JzIGF0IGxlYXN0LgorICovCitCT09MIFdyaXRlRmlsZShIQU5ETEUgaEZpbGUsIExQVk9JRCBscEJ1ZmZlciwgRFdPUkQgbnVtYmVyT2ZCeXRlc1RvV3JpdGUsCisgICAgICAgICAgICAgIExQRFdPUkQgbnVtYmVyT2ZCeXRlc1dyaXR0ZW4sIExQT1ZFUkxBUFBFRCBscE92ZXJsYXBwZWQpCit7CisgICAgaW50IHdyaXR0ZW47CisKKyAgICBpZihoRmlsZSA8IDMpCisgICAgeworICAgICAgICB3cml0dGVuID0gd3JpdGUoaEZpbGUsIGxwQnVmZmVyLCBudW1iZXJPZkJ5dGVzVG9Xcml0ZSk7CisgICAgICAgIGlmKG51bWJlck9mQnl0ZXNXcml0dGVuKQorICAgICAgICAgICAgKm51bWJlck9mQnl0ZXNXcml0dGVuID0gd3JpdHRlbjsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvd2luMzIvaW5pdC5jIGIvd2luMzIvaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMDBlZGMKLS0tIC9kZXYvbnVsbAorKysgYi93aW4zMi9pbml0LmMKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIFdpbjMyIGtlcm5lbCBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5NSBNYXJ0aW4gdm9uIExvZXdpcyBhbmQgQ2FtZXJvbiBIZWlkZQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgImtlcm5lbDMyLmgiCisKK2ludCBXSU4zMl9MYXN0RXJyb3I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIEdldE1vZHVsZUZpbGVOYW1lQSAgICAgIChLRVJORUwzMi4yMzUpCisgKi8KK0RXT1JEIEdldE1vZHVsZUZpbGVOYW1lQShITU9EVUxFIGhNb2R1bGUsIExQU1RSIGxwRmlsZW5hbWUsIERXT1JEIG5TaXplKQoreworICAgIHN0cmNweShscEZpbGVuYW1lLCAiYzpcXGR1bW15Iik7CisgICAgcmV0dXJuIDg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIEdldFN0YXJ0dXBJbmZvQSAgICAgICAgIChLRVJORUwzMi4yNzMpCisgKi8KK1ZPSUQgR2V0U3RhcnR1cEluZm9BKExQU1RBUlRVUElORk8gbHBTdGFydHVwSW5mbykKK3sKKyAgICBscFN0YXJ0dXBJbmZvLT5jYiA9IHNpemVvZihTVEFSVFVQSU5GTyk7CisgICAgbHBTdGFydHVwSW5mby0+bHBSZXNlcnZlZCA9IE5VTEw7CisgICAgbHBTdGFydHVwSW5mby0+bHBEZXNrdG9wID0gIkRlc2t0b3AiOworICAgIGxwU3RhcnR1cEluZm8tPmxwVGl0bGUgPSAiVGl0bGUiOworCisgICAgbHBTdGFydHVwSW5mby0+bHBSZXNlcnZlZDIgPSBOVUxMOyAvKiBtdXN0IGJlIE5VTEwgZm9yIFZDIHJ1bnRpbWUgKi8KKyAgICBscFN0YXJ0dXBJbmZvLT5oU3RkSW5wdXQgPSAwOworICAgIGxwU3RhcnR1cEluZm8tPmhTdGRPdXRwdXQgPSAxOworICAgIGxwU3RhcnR1cEluZm8tPmhTdGRFcnJvciA9IDI7Cit9CisKK2ludCBLRVJOMzJfSW5pdCh2b2lkKQoreworICAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvd2luMzIvbWVtb3J5LmMgYi93aW4zMi9tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjU0NTEwCi0tLSAvZGV2L251bGwKKysrIGIvd2luMzIvbWVtb3J5LmMKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIFdpbjMyIGtlcm5lbCBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5NSBNYXJ0aW4gdm9uIExvZXdpcyBhbmQgQ2FtZXJvbiBIZWlkZQorICovCisKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAia2VybmVsMzIuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVmlydHVhbEFsbG9jICAgICAgICAgICAgIChLRVJORUwzMi41NDgpCisgKi8KK0xQVk9JRCBWaXJ0dWFsQWxsb2MoTFBWT0lEIGxwdkFkZHJlc3MsIERXT1JEIGNiU2l6ZSwKKyAgICAgICAgICAgICAgICAgICBEV09SRCBmZHdBbGxvY2F0aW9uVHlwZSwgRFdPUkQgZmR3UHJvdGVjdCkKK3sKKyAgICBjaGFyICpwdHI7CisKKyAgICBwcmludGYoIlZpcnR1YWxBbGxvYzogc2l6ZSA9ICVsZCwgYWRkcmVzcz0lcFxuIiwgY2JTaXplLCBscHZBZGRyZXNzKTsKKyAgICBwdHIgPSBtYWxsb2MoY2JTaXplICsgNjU1MzYpOworICAgIGlmKHB0cikKKyAgICB7CisgICAgICAgIC8qIFJvdW5kIGl0IHVwIHRvIHRoZSBuZXh0IDY0SyBib3VuZGFyeSBhbmQgemVybyBpdC4KKyAgICAgICAgICovCisgICAgICAgIHB0ciA9ICh2b2lkICopKCgodW5zaWduZWQgbG9uZylwdHIgJiAweEZGRkYwMDAwTCkgKyAweDAwMDEwMDAwTCk7CisgICAgICAgIG1lbXNldChwdHIsIDAsIGNiU2l6ZSk7CisgICAgfQorICAgIHByaW50ZigiVmlydHVhbEFsbG9jOiBnb3QgcG9pbnRlciAlcFxuIiwgcHRyKTsKKyAgICByZXR1cm4gcHRyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBWaXJ0dWFsRnJlZSAgICAgICAgICAgICAgIChLRVJORUwzMi41NTApCisgKi8KK0JPT0wgVmlydHVhbEZyZWUoTFBWT0lEIGxwdkFkZHJlc3MsIERXT1JEIGNiU2l6ZSwgRFdPUkQgZmR3RnJlZVR5cGUpCit7CisgICAgaWYobHB2QWRkcmVzcykKKyAgICAgICAgZnJlZShscHZBZGRyZXNzKTsKKyAgICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvd2luMzIvdGhyZWFkLmMgYi93aW4zMi90aHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmI5ZTJjCi0tLSAvZGV2L251bGwKKysrIGIvd2luMzIvdGhyZWFkLmMKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIFdpbjMyIGtlcm5lbCBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5NSBNYXJ0aW4gdm9uIExvZXdpcworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgImtlcm5lbDMyLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldEN1cnJlbnRUaHJlYWRJZCAgIChLRVJORUwzMi4yMDApCisgKi8KKworaW50IEdldEN1cnJlbnRUaHJlYWRJZCh2b2lkKQoreworICAgICAgICByZXR1cm4gZ2V0cGlkKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldFRocmVhZENvbnRleHQgICAgICAgICAoS0VSTkVMMzIuMjk0KQorICovCitCT09MIEdldFRocmVhZENvbnRleHQoSEFORExFIGhUaHJlYWQsIHZvaWQgKmxwQ29udGV4dCkKK3sKKyAgICAgICAgcmV0dXJuIEZBTFNFOworfQorCmRpZmYgLS1naXQgYS93aW4zMi90aW1lLmMgYi93aW4zMi90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThmOTcwMwotLS0gL2Rldi9udWxsCisrKyBiL3dpbjMyL3RpbWUuYwpAQCAtMCwwICsxLDMxIEBACisvKgorICogV2luMzIga2VybmVsIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAxOTk1IE1hcnRpbiB2b24gTG9ld2lzIGFuZCBDYW1lcm9uIEhlaWRlCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKKyNpbmNsdWRlICJrZXJuZWwzMi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICBHZXRUaW1lWm9uZUluZm9ybWF0aW9uICAoS0VSTkVMMzIuMzAyKQorICovCitEV09SRCBHZXRUaW1lWm9uZUluZm9ybWF0aW9uKExQVElNRV9aT05FX0lORk9STUFUSU9OIHR6aW5mbykKK3sKKyAgICB0aW1lX3QgZ210LCBsdDsKKworICAgIG1lbXNldCh0emluZm8sIDAsIHNpemVvZihUSU1FX1pPTkVfSU5GT1JNQVRJT04pKTsKKworICAgIGdtdCA9IHRpbWUoTlVMTCk7CisgICAgbHQgPSBta3RpbWUobG9jYWx0aW1lKCZnbXQpKTsKKyAgICB0emluZm8tPkJpYXMgPSAoZ210IC0gbHQpIC8gNjA7CisgICAgdHppbmZvLT5TdGFuZGFyZEJpYXMgPSAwOworICAgIHR6aW5mby0+RGF5bGlnaHRCaWFzID0gLTYwOworCisgICAgcmV0dXJuIFRJTUVfWk9ORV9JRF9VTktOT1dOOworfQorCmRpZmYgLS1naXQgYS93aW5kb3dzL0ltYWtlZmlsZSBiL3dpbmRvd3MvSW1ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGMwZjI3Li4wMDAwMDAwCi0tLSBhL3dpbmRvd3MvSW1ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotI2luY2x1ZGUgIi4uL1dpbmUudG1wbCIKLQotTU9EVUxFID0gd2luZG93cwotCi1TUkNTID0gXAotCWFsaWFzLmMgXAotCWNhcmV0LmMgXAotCWNsYXNzLmMgXAotCWN1cnNvci5jIFwKLQlkY2UuYyBcCi0JZGVmZGxnLmMgXAotCWRlZnduZC5jIFwKLQlkaWFsb2cuYyBcCi0JZXZlbnQuYyBcCi0JZm9jdXMuYyBcCi0JZ3JhcGhpY3MuYyBcCi0JaG9vay5jIFwKLQlrZXlib2FyZC5jIFwKLQltYXBwaW5nLmMgXAotCW1kaS5jIFwKLQltZXNzYWdlLmMgXAotCW1zZ2JveC5jIFwKLQlub25jbGllbnQuYyBcCi0JcGFpbnRpbmcuYyBcCi0JcHJvcGVydHkuYyBcCi0Jc2Nyb2xsLmMgXAotCXN5c2NvbG9yLmMgXAotCXN5c21ldHJpY3MuYyBcCi0JdGltZXIuYyBcCi0JdXRpbGl0eS5jIFwKLQl3aW4uYyBcCi0Jd2lucG9zLmMKLQotT0JKUyA9ICQoU1JDUzouYz0ubykKLQotV2luZVJlbG9jYXRhYmxlVGFyZ2V0KCQoTU9EVUxFKSwsJChPQkpTKSkKLURlcGVuZFRhcmdldCgpCi0KLWluY2x1ZGVzOjoKLQotaW5zdGFsbDo6CmRpZmYgLS1naXQgYS93aW5kb3dzL01ha2VmaWxlLmluIGIvd2luZG93cy9NYWtlZmlsZS5pbgppbmRleCA0ZWVmOGEwLi5kMDQxMDJiIDEwMDY0NAotLS0gYS93aW5kb3dzL01ha2VmaWxlLmluCisrKyBiL3dpbmRvd3MvTWFrZWZpbGUuaW4KQEAgLTUsNyArNSw2IEBACiAJYWxpYXMuYyBcCiAJY2FyZXQuYyBcCiAJY2xhc3MuYyBcCi0JY3Vyc29yLmMgXAogCWRjZS5jIFwKIAlkZWZkbGcuYyBcCiAJZGVmd25kLmMgXApkaWZmIC0tZ2l0IGEvd2luZG93cy9jYXJldC5jIGIvd2luZG93cy9jYXJldC5jCmluZGV4IGE4NWE0N2MuLjhjZjAwY2EgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvY2FyZXQuYworKysgYi93aW5kb3dzL2NhcmV0LmMKQEAgLTIsMTMgKzIsMTIgQEAKICAqIENhcmV0IGZ1bmN0aW9ucwogICoKICAqIENvcHlyaWdodCAxOTkzIERhdmlkIE1ldGNhbGZlCi0gKgotc3RhdGljIGNoYXIgQ29weXJpZ2h0W10gPSAiQ29weXJpZ2h0ICBEYXZpZCBNZXRjYWxmZSwgMTk5MyI7Ci0qLworICovCiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAic2VsZWN0b3JzLmgiCiAjaW5jbHVkZSAiYWxpYXMuaCIKKyNpbmNsdWRlICJyZWxheTMyLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKIC8qICNkZWZpbmUgREVCVUdfQ0FSRVQgKi8KICNpbmNsdWRlICJkZWJ1Zy5oIgpAQCAtNTAsNyArNDksNyBAQAogICAgIHsKIAlDYXJldC5vbiA9IChDYXJldC5vbiA/IEZBTFNFIDogVFJVRSk7CiAJaGRjID0gR2V0REMoQ2FyZXQuaHduZCk7Ci0JaWYgKENhcmV0LmJpdG1hcCA9PSAwIHx8IENhcmV0LmJpdG1hcCA9PSAxKQorCWlmIChDYXJldC5iaXRtYXAgPT0gKEhCSVRNQVApMCB8fCBDYXJldC5iaXRtYXAgPT0gKEhCSVRNQVApMSkKIAkgICAgaEJydXNoID0gQ3JlYXRlU29saWRCcnVzaChDYXJldC5jb2xvcik7CiAJZWxzZQogCSAgICBoQnJ1c2ggPSBDcmVhdGVQYXR0ZXJuQnJ1c2goQ2FyZXQuYml0bWFwKTsKQEAgLTgwLDcgKzc5LDcgQEAKIAogICAgIENhcmV0Lm9uID0gRkFMU0U7CiAgICAgaGRjID0gR2V0REMoQ2FyZXQuaHduZCk7Ci0gICAgaWYgKENhcmV0LmJpdG1hcCA9PSAwIHx8IENhcmV0LmJpdG1hcCA9PSAxKQorICAgIGlmIChDYXJldC5iaXRtYXAgPT0gKEhCSVRNQVApMCB8fCBDYXJldC5iaXRtYXAgPT0gKEhCSVRNQVApMSkKIAloQnJ1c2ggPSBDcmVhdGVTb2xpZEJydXNoKENhcmV0LmNvbG9yKTsKICAgICBlbHNlCiAJaEJydXNoID0gQ3JlYXRlUGF0dGVybkJydXNoKENhcmV0LmJpdG1hcCk7CkBAIC0xMjYsNyArMTI1LDcgQEAKIC8qICAgIGlmIChDYXJldC5od25kKQogCURlc3Ryb3lDYXJldCgpOwogKi8KLSAgICBpZiAoYml0bWFwICYmIGJpdG1hcCAhPSAxKQorICAgIGlmIChiaXRtYXAgJiYgYml0bWFwICE9IChIQklUTUFQKTEpCiAJQ2FyZXQuYml0bWFwID0gYml0bWFwOwogCiAgICAgaWYgKHdpZHRoKQpAQCAtMTQ0LDcgKzE0Myw3IEBACiAgICAgQ2FyZXQub24gPSBGQUxTRTsKICAgICBDYXJldC54ID0gMDsKICAgICBDYXJldC55ID0gMDsKLSAgICBpZiAoYml0bWFwID09IDEpCisgICAgaWYgKGJpdG1hcCA9PSAoSEJJVE1BUCkxKQogCUNhcmV0LmNvbG9yID0gR2V0U3lzQ29sb3IoQ09MT1JfR1JBWVRFWFQpOwogICAgIGVsc2UKIAlDYXJldC5jb2xvciA9IEdldFN5c0NvbG9yKENPTE9SX1dJTkRPV1RFWFQpOwpAQCAtMTU2LDcgKzE1NSw3IEBACiAgICAgQ2FyZXQudGltZXJpZCA9IFNldFN5c3RlbVRpbWVyKCAoSFdORCkwLCAwLCBDYXJldC50aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRkFSUFJPQylHZXRXbmRQcm9jRW50cnkxNigiQ0FSRVRfQ2FsbGJhY2siKSk7CiAKLSAgICBkcHJpbnRmX2NhcmV0KHN0ZGRlYiwiQ3JlYXRlQ2FyZXQ6IGh3bmQ9JWQsIHRpbWVyaWQ9JWRcbiIsIAorICAgIGRwcmludGZfY2FyZXQoc3RkZGViLCJDcmVhdGVDYXJldDogaHduZD0iTlBGTVQiLCB0aW1lcmlkPSVkXG4iLCAKIAkJICBod25kLCBDYXJldC50aW1lcmlkKTsKIH0KICAgIApkaWZmIC0tZ2l0IGEvd2luZG93cy9jbGFzcy5jIGIvd2luZG93cy9jbGFzcy5jCmluZGV4IDRjZTA3ZWQuLmYxNDhiMzggMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvY2xhc3MuYworKysgYi93aW5kb3dzL2NsYXNzLmMKQEAgLTI4LDcgKzI4LDcgQEAKICAqIFJldHVybiBhIGhhbmRsZSBhbmQgYSBwb2ludGVyIHRvIHRoZSBjbGFzcy4KICAqICdwdHInIGNhbiBiZSBOVUxMIGlmIHRoZSBwb2ludGVyIGlzIG5vdCBuZWVkZWQuCiAgKi8KLUhDTEFTUyBDTEFTU19GaW5kQ2xhc3NCeU5hbWUoIFNFR1BUUiBuYW1lLCBXT1JEIGhpbnN0YW5jZSwgQ0xBU1MgKipwdHIgKQorSENMQVNTIENMQVNTX0ZpbmRDbGFzc0J5TmFtZSggU0VHUFRSIG5hbWUsIEhJTlNUQU5DRSBoaW5zdGFuY2UsIENMQVNTICoqcHRyICkKIHsKICAgICBBVE9NIGF0b207CiAgICAgSENMQVNTIGNsYXNzOwpAQCAtNDMsNyArNDMsOCBAQAogICAgICAgICBjbGFzc1B0ciA9IChDTEFTUyAqKSBVU0VSX0hFQVBfTElOX0FERFIoY2xhc3MpOwogICAgICAgICBpZiAoY2xhc3NQdHItPndjLnN0eWxlICYgQ1NfR0xPQkFMQ0xBU1MpIGNvbnRpbnVlOwogICAgICAgICBpZiAoKGNsYXNzUHRyLT5hdG9tTmFtZSA9PSBhdG9tKSAmJiAKLSAgICAgICAgICAgICgoaGluc3RhbmNlPT0weGZmZmYgKXx8IChoaW5zdGFuY2UgPT0gY2xhc3NQdHItPndjLmhJbnN0YW5jZSkpKQorICAgICAgICAgICAgKCAoaGluc3RhbmNlPT0oSElOU1RBTkNFKTB4ZmZmZikgfHwKKwkgICAgICAoaGluc3RhbmNlID09IGNsYXNzUHRyLT53Yy5oSW5zdGFuY2UpICkgKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAocHRyKSAqcHRyID0gY2xhc3NQdHI7CiAgICAgICAgICAgICByZXR1cm4gY2xhc3M7CkBAIC05Miw3ICs5Myw3IEBACiAgICAgSENMQVNTIGhhbmRsZSwgcHJldkNsYXNzOwogICAgIGludCBjbGFzc0V4dHJhOwogCi0gICAgZHByaW50Zl9jbGFzcyggc3RkZGViLCAiUmVnaXN0ZXJDbGFzczogd25kcHJvYz0lMDhseCBoaW5zdD0lMDR4IG5hbWU9JyVzJyBiYWNrZ3JvdW5kICUwNHhcbiIsCisgICAgZHByaW50Zl9jbGFzcyggc3RkZGViLCAiUmVnaXN0ZXJDbGFzczogd25kcHJvYz0lMDhseCBoaW5zdD0iTlBGTVQiIG5hbWU9JyVzJyBiYWNrZ3JvdW5kICJOUEZNVCJcbiIsCiAgICAgICAgICAgICAgICAgIChEV09SRCljbGFzcy0+bHBmblduZFByb2MsIGNsYXNzLT5oSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgIEhJV09SRChjbGFzcy0+bHBzekNsYXNzTmFtZSkgPwogICAgICAgICAgICAgICAgICAgKGNoYXIgKilQVFJfU0VHX1RPX0xJTihjbGFzcy0+bHBzekNsYXNzTmFtZSkgOiAiKGludCkiLApAQCAtMTQzLDcgKzE0NCw3IEBACiAJSEFORExFIGhuYW1lID0gVVNFUl9IRUFQX0FMTE9DKCBzdHJsZW4obWVudW5hbWUpKzEgKTsKIAlpZiAoaG5hbWUpCiAJewotCSAgICBuZXdDbGFzcy0+d2MubHBzek1lbnVOYW1lID0gVVNFUl9IRUFQX1NFR19BRERSKCBobmFtZSApOworCSAgICBuZXdDbGFzcy0+d2MubHBzek1lbnVOYW1lID0gKFNFR1BUUilVU0VSX0hFQVBfU0VHX0FERFIoIGhuYW1lICk7CiAJICAgIHN0cmNweSggVVNFUl9IRUFQX0xJTl9BRERSKCBobmFtZSApLCBtZW51bmFtZSApOwogCX0KICAgICB9CkBAIC0xOTEsNyArMTkyLDExIEBACiAgICAgaWYgKGNsYXNzUHRyLT53Yy5oYnJCYWNrZ3JvdW5kKSBEZWxldGVPYmplY3QoIGNsYXNzUHRyLT53Yy5oYnJCYWNrZ3JvdW5kICk7CiAgICAgR2xvYmFsRGVsZXRlQXRvbSggY2xhc3NQdHItPmF0b21OYW1lICk7CiAgICAgaWYgKEhJV09SRChjbGFzc1B0ci0+d2MubHBzek1lbnVOYW1lKSkKKyNpZmRlZiBXSU5FTElCMzIKKwlVU0VSX0hFQVBfRlJFRSggKEhBTkRMRSljbGFzc1B0ci0+d2MubHBzek1lbnVOYW1lICk7CisjZWxzZQogCVVTRVJfSEVBUF9GUkVFKCBMT1dPUkQoY2xhc3NQdHItPndjLmxwc3pNZW51TmFtZSkgKTsKKyNlbmRpZgogICAgIFVTRVJfSEVBUF9GUkVFKCBjbGFzcyApOwogICAgIHJldHVybiBUUlVFOwogfQpAQCAtMjY1LDcgKzI3MCw3IEBACiAgICAgQ0xBU1MgKmNsYXNzUHRyOwogCiAgICAgLyogRklYTUU6IFdlIGhhdmUgdGhlIGZpbmQgdGhlIGNvcnJlY3QgaEluc3RhbmNlICovCi0gICAgZHByaW50Zl9jbGFzcyhzdGRkZWIsIkdldENsYXNzTmFtZSgleCwlcCwlZClcbiIsaHduZCxscENsYXNzTmFtZSxtYXhDb3VudCk7CisgICAgZHByaW50Zl9jbGFzcyhzdGRkZWIsIkdldENsYXNzTmFtZSgiTlBGTVQiLCVwLCVkKVxuIixod25kLGxwQ2xhc3NOYW1lLG1heENvdW50KTsKICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKSkpIHJldHVybiAwOwogICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzUHRyKHduZFB0ci0+aENsYXNzKSkpIHJldHVybiAwOwogICAgIApAQCAtMjgwLDcgKzI4NSw3IEBACiB7CiAgICAgQ0xBU1MgKmNsYXNzUHRyOwogCi0gICAgZHByaW50Zl9jbGFzcyggc3RkZGViLCAiR2V0Q2xhc3NJbmZvOiBoSW5zdGFuY2U9JTA0eCBjbGFzc05hbWU9JXNcbiIsCisgICAgZHByaW50Zl9jbGFzcyggc3RkZGViLCAiR2V0Q2xhc3NJbmZvOiBoSW5zdGFuY2U9Ik5QRk1UIiBjbGFzc05hbWU9JXNcbiIsCiAJCSAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICBISVdPUkQobmFtZSkgPyAoY2hhciAqKVBUUl9TRUdfVE9fTElOKG5hbWUpIDogIihpbnQpIiApOwogCmRpZmYgLS1naXQgYS93aW5kb3dzL2N1cnNvci5jIGIvd2luZG93cy9jdXJzb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3NWRmMS4uMDAwMDAwMAotLS0gYS93aW5kb3dzL2N1cnNvci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qCi0gKiAgICBXSU5FCi1zdGF0aWMgY2hhciBDb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgIE1hcnRpbiBBeW90dGUsIDE5OTMiOwotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxYMTEvY3Vyc29yZm9udC5oPgotI2luY2x1ZGUgPFgxMS9YbGliLmg+Ci0jaW5jbHVkZSA8WDExL1h1dGlsLmg+Ci0jaW5jbHVkZSAid2luZG93cy5oIgotI2luY2x1ZGUgIndpbi5oIgotI2luY2x1ZGUgImdkaS5oIgotI2luY2x1ZGUgIm5lZXhlLmgiCi0jaW5jbHVkZSAid2luZS5oIgotI2luY2x1ZGUgImNhbGxiYWNrLmgiCi0jaW5jbHVkZSAiY3Vyc29yLmgiCi0jaW5jbHVkZSAicmVzb3VyY2UuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYXJjaC5oIgotI2luY2x1ZGUgImJpdG1hcC5oIgotCi1zdGF0aWMgaW50IFNob3dDdXJzQ291bnQgPSAwOwotc3RhdGljIEhDVVJTT1IgaEFjdGl2ZUN1cnNvcjsKLXN0YXRpYyBIQ1VSU09SIGhFbXB0eUN1cnNvciA9IDA7Ci1SRUNUCUNsaXBDdXJzb3JSZWN0OwotCi1zdGF0aWMgc3RydWN0IHsgCi0gICBTRUdQVFIgbmFtZTsgSENVUlNPUiBjdXJzb3I7IHVuc2lnbmVkIGludCBzaGFwZTsKLX0gc3lzdGVtX2N1cnNvcltdID0KLXsKLSAgICB7IElEQ19BUlJPVywgICAgMCwgWENfdG9wX2xlZnRfYXJyb3d9LAotICAgIHsgSURDX0lCRUFNLCAgICAwLCBYQ194dGVybSB9LAotICAgIHsgSURDX1dBSVQsICAgICAwLCBYQ193YXRjaCB9LAotICAgIHsgSURDX0NST1NTLCAgICAwLCBYQ19jcm9zc2hhaXIgfSwKLSAgICB7IElEQ19VUEFSUk9XLCAgMCwgWENfYmFzZWRfYXJyb3dfdXAgfSwKLSAgICB7IElEQ19TSVpFLCAgICAgMCwgWENfYm90dG9tX3JpZ2h0X2Nvcm5lciB9LAotICAgIHsgSURDX0lDT04sICAgICAwLCBYQ19pY29uIH0sCi0gICAgeyBJRENfU0laRU5XU0UsIDAsIFhDX2ZsZXVyIH0sCi0gICAgeyBJRENfU0laRU5FU1csIDAsIFhDX2ZsZXVyIH0sCi0gICAgeyBJRENfU0laRVdFLCAgIDAsIFhDX3NiX2hfZG91YmxlX2Fycm93IH0sCi0gICAgeyBJRENfU0laRU5TLCAgIDAsIFhDX3NiX3ZfZG91YmxlX2Fycm93IH0KLX07Ci0KLSNkZWZpbmUgTkJfU1lTX0NVUlNPUlMgIChzaXplb2Yoc3lzdGVtX2N1cnNvcikvc2l6ZW9mKHN5c3RlbV9jdXJzb3JbMF0pKQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCUxvYWRDdXJzb3IgW1VTRVIuMTczXQotICovCi1IQ1VSU09SIExvYWRDdXJzb3IoSEFORExFIGluc3RhbmNlLCBTRUdQVFIgY3Vyc29yX25hbWUpCi17Ci0gICAgSENVUlNPUiAJaEN1cnNvcjsKLSAgICBIUlNSQyAgICAgICBoUnNyYzsKLSAgICBIQU5ETEUgCXJzY19tZW07Ci0gICAgY2hhciAgICAgICAgKmxwYml0czsKLSAgICBMT05HICAgICAgICAqbHBsLHNpemU7Ci0gICAgQ1VSU09SQUxMT0MgKmxwY3VyOwotICAgIENVUlNPUkRJUiAgICpscGN1cmRpcjsKLSAgICBDVVJTT1JERVNDUklQIGN1cmRlc2M7Ci0gICAgUE9JTlQgICAgICAgaG90c3BvdDsKLSAgICBpbnQgaTsKLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwiTG9hZEN1cnNvcjogaW5zdGFuY2UgPSAlMDR4LCBuYW1lID0gJTA4bHhcbiIsCi0JICAgaW5zdGFuY2UsIGN1cnNvcl9uYW1lKTsKLSAgICBpZiAoIWluc3RhbmNlKQotICAgIHsKLQlmb3IgKGkgPSAwOyBpIDwgTkJfU1lTX0NVUlNPUlM7IGkrKykKLQkgICAgaWYgKHN5c3RlbV9jdXJzb3JbaV0ubmFtZSA9PSBjdXJzb3JfbmFtZSkKLQkgICAgewotCSAgICAgICAgaWYgKCFzeXN0ZW1fY3Vyc29yW2ldLmN1cnNvcikgCi0JICAgICAgICB7Ci0JCSAgICBoQ3Vyc29yID0gR2xvYmFsQWxsb2MgKEdNRU1fTU9WRUFCTEUsIHNpemVvZiAoQ3Vyc29yKSk7Ci0JCSAgICBkcHJpbnRmX2N1cnNvcihzdGRkZWIsIkxvYWRDdXJzb3IgQWxsb2MgaEN1cnNvcj0lWFxuIiwgaEN1cnNvcik7Ci0JCSAgICBzeXN0ZW1fY3Vyc29yW2ldLmN1cnNvciA9IGhDdXJzb3I7Ci0JCSAgICBscGN1ciA9IChDVVJTT1JBTExPQyAqKSBHbG9iYWxMb2NrKGhDdXJzb3IpOwotCQkgICAgbHBjdXItPnhjdXJzb3IgPSBYQ3JlYXRlRm9udEN1cnNvcihkaXNwbGF5LCBzeXN0ZW1fY3Vyc29yW2ldLnNoYXBlKTsKLQkJICAgIEdsb2JhbFVubG9jayhoQ3Vyc29yKTsKLQkgICAgICAgIH0KLQkgICAgICAgCXJldHVybiBzeXN0ZW1fY3Vyc29yW2ldLmN1cnNvcjsKLQkgICAgfQotCXJldHVybiAwOwotICAgIH0KLQotICAgIGlmICghKGhSc3JjID0gRmluZFJlc291cmNlKCBpbnN0YW5jZSwgY3Vyc29yX25hbWUsIFJUX0dST1VQX0NVUlNPUiApKSkKLQlyZXR1cm4gMDsKLSAgICByc2NfbWVtID0gTG9hZFJlc291cmNlKGluc3RhbmNlLCBoUnNyYyApOwotICAgIGlmIChyc2NfbWVtID09IChIQU5ETEUpTlVMTCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiTG9hZEN1cnNvciAvIEN1cnNvciAlMDhseCBub3QgRm91bmQgIVxuIiwgY3Vyc29yX25hbWUpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBscGN1cmRpciA9IChDVVJTT1JESVIgKilMb2NrUmVzb3VyY2UocnNjX21lbSk7Ci0gICAgaWYgKGxwY3VyZGlyID09IE5VTEwpIHsKLSAgICAgICAgRnJlZVJlc291cmNlKCByc2NfbWVtICk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGN1cmRlc2MgPSAqKENVUlNPUkRFU0NSSVAgKikobHBjdXJkaXIgKyAxKTsgIC8qIENPTlZfQ1VSREVTQyA/ICovCi0jaWYgMAotICAgIGRwcmludGZfY3Vyc29yKHN0ZGRlYiwiTG9hZEN1cnNvciAvIGN1clJlc2VydmVkPSVYXG4iLCBscGN1cmRpci0+Y2RSZXNlcnZlZCk7Ci0gICAgZHByaW50Zl9jdXJzb3Ioc3RkZGViLCJMb2FkQ3Vyc29yIC8gY3VyUmVzb3VyY2VUeXBlPSVYXG4iLCBscGN1cmRpci0+Y2RUeXBlKTsKLSAgICBkcHJpbnRmX2N1cnNvcihzdGRkZWIsIkxvYWRDdXJzb3IgLyBjdXJSZXNvdXJjZUNvdW50PSVYXG4iLCBscGN1cmRpci0+Y2RDb3VudCk7Ci0gICAgZHByaW50Zl9jdXJzb3Ioc3RkZGViLCJMb2FkQ3Vyc29yIC8gY3Vyc29yIFdpZHRoPSVkXG4iLCAKLQkJKGludCljdXJkZXNjLldpZHRoKTsKLSAgICBkcHJpbnRmX2N1cnNvcihzdGRkZWIsIkxvYWRDdXJzb3IgLyBjdXJzb3IgSGVpZ2h0PSVkXG4iLCAKLQkJKGludCljdXJkZXNjLkhlaWdodCk7Ci0gICAgZHByaW50Zl9jdXJzb3Ioc3RkZGViLCJMb2FkQ3Vyc29yIC8gY3Vyc29yIGN1ckRJQlNpemU9JWxYXG4iLCAKLQkJKERXT1JEKWN1cmRlc2MuY3VyRElCU2l6ZSk7Ci0gICAgZHByaW50Zl9jdXJzb3Ioc3RkZGViLCJMb2FkQ3Vyc29yIC8gY3Vyc29yIGN1ckRJQk9mZnNldD0lbFhcbiIsCi0JCShEV09SRCljdXJkZXNjLmN1ckRJQk9mZnNldCk7Ci0jZW5kaWYKLSAgICBGcmVlUmVzb3VyY2UoIHJzY19tZW0gKTsKLSAgICBpZiAoIShoUnNyYyA9IEZpbmRSZXNvdXJjZSggaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VJTlRSRVNPVVJDRShjdXJkZXNjLmN1ckRJQk9mZnNldCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVF9DVVJTT1IgKSkpCi0JcmV0dXJuIDA7Ci0gICAgcnNjX21lbSA9IExvYWRSZXNvdXJjZShpbnN0YW5jZSwgaFJzcmMgKTsKLSAgICBpZiAocnNjX21lbSA9PSAoSEFORExFKU5VTEwpIHsKLSAgICAJZnByaW50ZihzdGRlcnIsCi0JCSJMb2FkQ3Vyc29yIC8gQ3Vyc29yICUwOGx4IEJpdG1hcCBub3QgRm91bmQgIVxuIiwgY3Vyc29yX25hbWUpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBscGwgPSAoTE9ORyAqKSBMb2NrUmVzb3VyY2UocnNjX21lbSk7Ci0gICAgaWYgKGxwbCA9PSBOVUxMKSB7Ci0gICAgICAgIEZyZWVSZXNvdXJjZSggcnNjX21lbSApOwotCXJldHVybiAwOwotCX0KLSAgICBob3RzcG90ID0gKihQT0lOVCAqKSBscGwrKzsgIC8qIENPTlZfUE9JTlQgPyAqLwotICAgIHNpemUgPSBDT05WX0xPTkcgKCpscGwpOwotI2lmIDAKLSAgICBpZiAoIShoZGMgPSBHZXREQygwKSkpIHsKLSAgICAgICBGcmVlUmVzb3VyY2UoIHJzY19tZW0gKTsKLSAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHNpemUgPT0gc2l6ZW9mKEJJVE1BUENPUkVIRUFERVIpKXsKLQlDT05WX0JJVE1BUENPUkVIRUFERVIgKGxwbCk7Ci0gICAgICAgICgoQklUTUFQSU5GT0hFQURFUiAqKWxwbCktPmJpSGVpZ2h0IC89IDI7Ci0JbHBjdXItPmhCaXRtYXAgPSBDb252ZXJ0Q29yZUJpdG1hcCggaGRjLCAoQklUTUFQQ09SRUhFQURFUiAqKSBscGwgKTsKLSAgICB9IGVsc2UgaWYgKHNpemUgPT0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKXsKLQlDT05WX0JJVE1BUElORk8gKGxwbCk7Ci0gICAgICAgICgoQklUTUFQSU5GT0hFQURFUiAqKWxwbCktPmJpSGVpZ2h0IC89IDI7Ci0JbHBjdXItPmhCaXRtYXAgPSBDb252ZXJ0SW5mb0JpdG1hcCggaGRjLCAoQklUTUFQSU5GTyAqKSBscGwgKTsKLSAgICB9IGVsc2UgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCJObyBiaXRtYXAgZm9yIGN1cnNvcj9cbiIpOwotICAgICAgbHBjdXItPmhCaXRtYXAgPSAwOwotICAgIH0KLSAgICBSZWxlYXNlREMoMCxoZGMpOwotI2VuZGlmCi0gICAgaWYgKHNpemUgPT0gc2l6ZW9mKEJJVE1BUENPUkVIRUFERVIpKQotCWxwYml0cyA9IChjaGFyICopbHBsICsgc2l6ZW9mKEJJVE1BUENPUkVIRUFERVIpICsgMipzaXplb2YoUkdCVFJJUExFKTsKLSAgICBlbHNlIGlmIChzaXplID09IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSkKLQlscGJpdHMgPSAoY2hhciAqKWxwbCArIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSArIDIqc2l6ZW9mKFJHQlFVQUQpOwotICAgIGVsc2UgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCJJbnZhbGlkIGJpdG1hcCBpbiBjdXJzb3IgcmVzb3VyY2VcbiIpOwotICAgICAgRnJlZVJlc291cmNlKHJzY19tZW0pOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC8qIFRoZSBoZWlnaHQgb2YgdGhlIGN1cnNvciBpcyB0aGUgaGVpZ2h0IG9mIHRoZSBYT1ItQml0bWFwCi0gICAgICogcGx1cyB0aGUgaGVpZ2h0IG9mIHRoZSBBTkQtQml0bWFwLCBzbyBkaXZpZGUgaXQgYnkgdHdvLgotICAgICAqLwotICAgIHNpemUgPSBjdXJkZXNjLkhlaWdodC8yICogKChjdXJkZXNjLldpZHRoKzMxKS8zMiAqIDQpOwotI2lmIDAKLSAgICBkcHJpbnRmX2N1cnNvcihzdGRkZWIsIkJpdG1hcDpcbiIpOwotICAgIGZvcihpPTA7aTwyKnNpemU7aSsrKSAgewotICAgICAgZHByaW50Zl9jdXJzb3Ioc3RkZGViLCIlMDJ4ICIsKHVuc2lnbmVkIGNoYXIpIGxwY1tpXSk7Ci0gICAgICBpZiAoKGkgJiA3KSA9PSA3KSBkcHJpbnRmX2N1cnNvcihzdGRkZWIsIlxuIik7Ci0gICAgfQotI2VuZGlmCi0gICAgaEN1cnNvciA9IENyZWF0ZUN1cnNvcihpbnN0YW5jZSwgaG90c3BvdC54LCBob3RzcG90LnksIAotCQkJICAgY3VyZGVzYy5XaWR0aCwgY3VyZGVzYy5IZWlnaHQgLyAyLAotCQkJICAgbHBiaXRzK3NpemUsIGxwYml0cyk7Ci0gICAgRnJlZVJlc291cmNlKCByc2NfbWVtICk7Ci0gICAgcmV0dXJuIGhDdXJzb3I7Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDcmVhdGVDdXJzb3JJY29uSW5kaXJlY3QgICAgICAgICAgIChVU0VSLjQwOCkKLSAqCi0gKiBSZXR1cm5zIGhhbmRsZSB0byBlaXRoZXIgYW4gaWNvbiBvciBhIGN1cnNvci4gVXNlZCBieSBDcmVhdGVDdXJzb3IKLSAqIGFuZCBDcmVhdGVJY29uIGluICBXaW5kb3plLCBidXQgd2lsbCB1c2Ugc2FtZSBpbiB0aGlzIHZlcnNpb24uCi0gKi8KLUhBTkRMRSBDcmVhdGVDdXJzb3JJY29uSW5kaXJlY3QoSEFORExFIGhJbnN0YW5jZSwgTFBDVVJTT1JJQ09OSU5GTyBscEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGxwQU5EQml0cywgLyogYml0bWFwIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgbHBYT1JCaXRzIC8qIG1hc2tpbmcgZGF0YSAqLykKLXsKLSAgICAgICAgcmV0dXJuIENyZWF0ZUljb24oaEluc3RhbmNlLAotICAgICAgICAgICAgICAgIGxwSW5mby0+bldpZHRoLCBscEluZm8tPm5IZWlnaHQsCi0gICAgICAgICAgICAgICAgbHBJbmZvLT5ieVBsYW5lcywgbHBJbmZvLT5ieUJpdHNQaXgsCi0gICAgICAgICAgICAgICAgbHBBTkRCaXRzLCBscFhPUkJpdHMpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCUNyZWF0ZUN1cnNvciBbVVNFUi40MDZdCi0gKi8KLUhDVVJTT1IgQ3JlYXRlQ3Vyc29yKEhBTkRMRSBpbnN0YW5jZSwgc2hvcnQgblhob3RzcG90LCBzaG9ydCBuWWhvdHNwb3QsIAotCXNob3J0IG5XaWR0aCwgc2hvcnQgbkhlaWdodCwgTFBTVFIgbHBBTkRiaXRQbGFuZSwgTFBTVFIgbHBYT1JiaXRQbGFuZSkKLXsKLSAgICBIQ1VSU09SCWhDdXJzb3I7Ci0gICAgQ1VSU09SQUxMT0MgKmxwY3VyOwotICAgIGludAkJYnBsID0gKG5XaWR0aCArIDMxKS8zMiAqIDQ7Ci0gICAgY2hhcgkqdG1wYml0cyA9IG1hbGxvYyhicGwgKiBuSGVpZ2h0KTsKLSAgICBjaGFyCSpzcmMsICpkc3Q7Ci0gICAgaW50CQlpOwotICAgIFhJbWFnZQkqaW1hZ2U7Ci0gICAgUGl4bWFwCXBpeHNoYXBlLCBwaXhtYXNrOwotICAgIGV4dGVybiB2b2lkIF9YSW5pdEltYWdlRnVuY1B0cnMoIFhJbWFnZSogKTsKLSAgCi0gICAgWENvbG9yIGJrY29sb3IsZmdjb2xvcjsKLSAgICBDb2xvcm1hcCBjbWFwID0gWERlZmF1bHRDb2xvcm1hcChkaXNwbGF5LFhEZWZhdWx0U2NyZWVuKGRpc3BsYXkpKTsKLSAgICAKLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIkNyZWF0ZUN1cnNvcjogaW5zdD0lMDR4IG5YaG90c3BvdD0lZCAgbllob3RzcG90PSVkIG5XaWR0aD0lZCBuSGVpZ2h0PSVkXG4iLCAgCi0gICAgICAgaW5zdGFuY2UsIG5YaG90c3BvdCwgbllob3RzcG90LCBuV2lkdGgsIG5IZWlnaHQpOwotICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCJDcmVhdGVDdXJzb3I6IGluc3Q9JTA0eCBscEFORGJpdFBsYW5lPSVwIGxwWE9SYml0UGxhbmU9JXBcbiIsCi0JaW5zdGFuY2UsIGxwQU5EYml0UGxhbmUsIGxwWE9SYml0UGxhbmUpOwotCi0gICAgaW1hZ2UgPSBYQ3JlYXRlSW1hZ2UoIGRpc3BsYXksIERlZmF1bHRWaXN1YWxPZlNjcmVlbihzY3JlZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBaUGl4bWFwLCAwLCB0bXBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuV2lkdGgsIG5IZWlnaHQsIDMyLCBicGwgKTsKLSAgICBpZiAoIWltYWdlKSB7Ci0JZnJlZSAodG1wYml0cyk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3Q7Ci0gICAgaW1hZ2UtPmJpdG1hcF9iaXRfb3JkZXIgPSBNU0JGaXJzdDsKLSAgICBpbWFnZS0+Yml0bWFwX3VuaXQgPSAxNjsKLSAgICBfWEluaXRJbWFnZUZ1bmNQdHJzKGltYWdlKTsKLQotICAgIGhDdXJzb3IgPSBHbG9iYWxBbGxvYyhHTUVNX01PVkVBQkxFLCBzaXplb2YoQ3Vyc29yKSk7IAotICAgIGlmIChoQ3Vyc29yID09IChIQ1VSU09SKU5VTEwpIHsKLQlYRGVzdHJveUltYWdlKGltYWdlKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgZHByaW50Zl9jdXJzb3Ioc3RkZGViLCJDcmVhdGVDdXJzb3IgQWxsb2MgaEN1cnNvcj0lWFxuIiwgaEN1cnNvcik7Ci0gICAgbHBjdXIgPSAoQ1VSU09SQUxMT0MgKilHbG9iYWxMb2NrKGhDdXJzb3IpOwotCi0gICAgZm9yKHNyYz1scEFORGJpdFBsYW5lLCBkc3Q9dG1wYml0cysobkhlaWdodC0xKSpicGw7IAotCWRzdD49dG1wYml0czsgc3JjKz1icGwsIGRzdC09YnBsKQotICAgICAgICBmb3IoaT0wOyBpPGJwbDsgaSsrKSAKLSAgICAgICAgICAgIGRzdFtpXSA9IH5zcmNbaV07Ci0gICAgcGl4bWFzayA9IFhDcmVhdGVQaXhtYXAoZGlzcGxheSwgRGVmYXVsdFJvb3RXaW5kb3coZGlzcGxheSksIAotCQkJICAgIG5XaWR0aCwgbkhlaWdodCwgMSk7Ci0gICAgQ2FsbFRvMzJfTGFyZ2VTdGFjayhYUHV0SW1hZ2UsIDEwLAotCQkJZGlzcGxheSwgcGl4bWFzaywgQklUTUFQX21vbm9HQywgaW1hZ2UsIAotCQkJMCwgMCwgMCwgMCwgbldpZHRoLCBuSGVpZ2h0ICk7Ci0KLSAgICBmb3Ioc3JjPWxwWE9SYml0UGxhbmUsIGRzdD10bXBiaXRzKyhuSGVpZ2h0LTEpKmJwbDsgCi0JZHN0Pj10bXBiaXRzOyBzcmMrPWJwbCwgZHN0LT1icGwpCi0gICAgICAgIGZvcihpPTA7IGk8YnBsOyBpKyspIAotICAgICAgICAgICAgZHN0W2ldID0gfnNyY1tpXTsKLSAgICBwaXhzaGFwZSA9IFhDcmVhdGVQaXhtYXAoZGlzcGxheSwgRGVmYXVsdFJvb3RXaW5kb3coZGlzcGxheSksIAotCQkJICAgICBuV2lkdGgsIG5IZWlnaHQsIDEpOwotICAgIENhbGxUbzMyX0xhcmdlU3RhY2soWFB1dEltYWdlLCAxMCwKLQkJCWRpc3BsYXksIHBpeHNoYXBlLCBCSVRNQVBfbW9ub0dDLCBpbWFnZSwgCi0JCQkwLCAwLCAwLCAwLCBuV2lkdGgsIG5IZWlnaHQgKTsKLSAgICBYUGFyc2VDb2xvcihkaXNwbGF5LGNtYXAsIiMwMDAwMDAiLCZmZ2NvbG9yKTsKLSAgICBYUGFyc2VDb2xvcihkaXNwbGF5LGNtYXAsIiNmZmZmZmYiLCZia2NvbG9yKTsKLSAgICBscGN1ci0+eGN1cnNvciA9IFhDcmVhdGVQaXhtYXBDdXJzb3IoZGlzcGxheSwgcGl4c2hhcGUsIHBpeG1hc2ssCi0JCQkgICAgICAgICAgICAgICAgICZmZ2NvbG9yLCAmYmtjb2xvciwgblhob3RzcG90LCBuWWhvdHNwb3QpOwotICAgIFhGcmVlUGl4bWFwKGRpc3BsYXksIHBpeHNoYXBlKTsKLSAgICBYRnJlZVBpeG1hcChkaXNwbGF5LCBwaXhtYXNrKTsKLSAgICBHbG9iYWxVbmxvY2soaEN1cnNvcik7Ci0gICAgWERlc3Ryb3lJbWFnZShpbWFnZSk7Ci0gICAgcmV0dXJuIGhDdXJzb3I7Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQlEZXN0cm95Q3Vyc29yIFtVU0VSLjQ1OF0KLSAqLwotQk9PTCBEZXN0cm95Q3Vyc29yKEhDVVJTT1IgaEN1cnNvcikKLXsKLSAgICBpbnQgaTsKLSAgICBDVVJTT1JBTExPQwkqbHBjdXI7Ci0gICAgCi0gICAgaWYgKGhDdXJzb3IgPT0gMCkgcmV0dXJuIEZBTFNFOwotICAgIGZvciAoaSA9IDA7IGkgPCBOQl9TWVNfQ1VSU09SUzsgaSsrKSB7Ci0JaWYgKHN5c3RlbV9jdXJzb3JbaV0uY3Vyc29yID09IGhDdXJzb3IpIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBscGN1ciA9IChDVVJTT1JBTExPQyAqKUdsb2JhbExvY2soaEN1cnNvcik7Ci0gICAgWEZyZWVDdXJzb3IgKGRpc3BsYXksIGxwY3VyLT54Y3Vyc29yKTsKLSAgICBHbG9iYWxVbmxvY2soaEN1cnNvcik7Ci0gICAgR2xvYmFsRnJlZShoQ3Vyc29yKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBDVVJTT1JfU2V0Q3Vyc29yCi0gKgotICogSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9uIGZvciBTZXRDdXJzb3IoKSBhbmQgU2hvd0N1cnNvcigpLgotICovCi1zdGF0aWMgdm9pZCBDVVJTT1JfU2V0Q3Vyc29yKCBIQ1VSU09SIGhDdXJzb3IgKQotewotICAgIENVUlNPUkFMTE9DCSpscGN1cjsKLQotICAgIGlmICghKGxwY3VyID0gKENVUlNPUkFMTE9DICopR2xvYmFsTG9jayhoQ3Vyc29yKSkpIHJldHVybjsKLSAgICBpZiAocm9vdFdpbmRvdyAhPSBEZWZhdWx0Um9vdFdpbmRvdyhkaXNwbGF5KSkKLSAgICB7Ci0gICAgICAgIFhEZWZpbmVDdXJzb3IoIGRpc3BsYXksIHJvb3RXaW5kb3csIGxwY3VyLT54Y3Vyc29yICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEhXTkQgaHduZCA9IEdldFdpbmRvdyggR2V0RGVza3RvcFdpbmRvdygpLCBHV19DSElMRCApOwotICAgICAgICB3aGlsZShod25kKQotICAgICAgICB7Ci0gICAgICAgICAgICBXaW5kb3cgd2luID0gV0lOX0dldFhXaW5kb3coIGh3bmQgKTsKLSAgICAgICAgICAgIGlmICh3aW4pIFhEZWZpbmVDdXJzb3IoIGRpc3BsYXksIHdpbiwgbHBjdXItPnhjdXJzb3IgKTsKLSAgICAgICAgICAgIGh3bmQgPSBHZXRXaW5kb3coIGh3bmQsIEdXX0hXTkRORVhUICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgR2xvYmFsVW5sb2NrKCBoQ3Vyc29yICk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCVNldEN1cnNvciBbVVNFUi42OV0KLSAqLwotSENVUlNPUiBTZXRDdXJzb3IoSENVUlNPUiBoQ3Vyc29yKQotewotICAgIEhDVVJTT1IgaE9sZEN1cnNvcjsKLQotICAgIGRwcmludGZfY3Vyc29yKHN0ZGRlYiwiU2V0Q3Vyc29yIC8gaEN1cnNvcj0lMDRYICFcbiIsIGhDdXJzb3IpOwotICAgIGhPbGRDdXJzb3IgPSBoQWN0aXZlQ3Vyc29yOwotICAgIGhBY3RpdmVDdXJzb3IgPSBoQ3Vyc29yOwotICAgIGlmICgoaEN1cnNvciAhPSBoT2xkQ3Vyc29yKSB8fCAoU2hvd0N1cnNDb3VudCA8IDApKQotICAgIHsKLSAgICAgICAgQ1VSU09SX1NldEN1cnNvciggaEN1cnNvciApOwotICAgIH0KLSAgICBTaG93Q3Vyc0NvdW50ID0gMDsKLSAgICByZXR1cm4gaE9sZEN1cnNvcjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQlHZXRDdXJzb3IgW1VTRVIuMjQ3XQotICovCi1IQ1VSU09SIEdldEN1cnNvcih2b2lkKQotewotICAgIHJldHVybiBoQWN0aXZlQ3Vyc29yOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFNldEN1cnNvclBvcyBbVVNFUi43MF0KLSAqLwotdm9pZCBTZXRDdXJzb3JQb3Moc2hvcnQgeCwgc2hvcnQgeSkKLXsKLSAgICBkcHJpbnRmX2N1cnNvcihzdGRkZWIsIlNldEN1cnNvclBvcyAvLyB4PSVkIHk9JWRcbiIsIHgsIHkpOwotICAgIFhXYXJwUG9pbnRlciggZGlzcGxheSwgTm9uZSwgcm9vdFdpbmRvdywgMCwgMCwgMCwgMCwgeCwgeSApOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnNvclBvcyBbVVNFUi4xN10KLSAqLwotdm9pZCBHZXRDdXJzb3JQb3MoTFBQT0lOVCBscFJldFBvaW50KQotewotICAgIFdpbmRvdyAJcm9vdCwgY2hpbGQ7Ci0gICAgaW50CQlyb290WCwgcm9vdFk7Ci0gICAgaW50CQljaGlsZFgsIGNoaWxkWTsKLSAgICB1bnNpZ25lZCBpbnQgbW91c2VidXQ7Ci0KLSAgICBpZiAoIWxwUmV0UG9pbnQpIHJldHVybjsKLSAgICBpZiAoIVhRdWVyeVBvaW50ZXIoIGRpc3BsYXksIHJvb3RXaW5kb3csICZyb290LCAmY2hpbGQsCi0JCSAgICAgICAgJnJvb3RYLCAmcm9vdFksICZjaGlsZFgsICZjaGlsZFksICZtb3VzZWJ1dCApKQotCWxwUmV0UG9pbnQtPnggPSBscFJldFBvaW50LT55ID0gMDsKLSAgICBlbHNlCi0gICAgewotCWxwUmV0UG9pbnQtPnggPSByb290WCArIGRlc2t0b3BYOwotCWxwUmV0UG9pbnQtPnkgPSByb290WSArIGRlc2t0b3BZOwotICAgIH0KLSAgICBkcHJpbnRmX2N1cnNvcihzdGRkZWIsCi0JCSJHZXRDdXJzb3JQb3MgLy8geD0lZCB5PSVkXG4iLCBscFJldFBvaW50LT54LCBscFJldFBvaW50LT55KTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQlTaG93Q3Vyc29yIFtVU0VSLjcxXQotICovCi1pbnQgU2hvd0N1cnNvcihCT09MIGJTaG93KQotewotICAgIGRwcmludGZfY3Vyc29yKHN0ZGRlYiwgIlNob3dDdXJzb3IoJWQpLCBjb3VudD0lZFxuIiwgYlNob3csIFNob3dDdXJzQ291bnQpOwotCi0gICAgaWYgKGJTaG93KQotICAgIHsKLSAgICAgICAgaWYgKCsrU2hvd0N1cnNDb3VudCA9PSAwKSAgLyogVGltZSB0byBzaG93IGl0ICovCi0gICAgICAgICAgICBDVVJTT1JfU2V0Q3Vyc29yKCBoQWN0aXZlQ3Vyc29yICk7Ci0gICAgfQotICAgIGVsc2UgIC8qIEhpZGUgaXQgKi8KLSAgICB7Ci0gICAgICAgIGlmICgtLVNob3dDdXJzQ291bnQgPT0gLTEpICAvKiBUaW1lIHRvIGhpZGUgaXQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoRW1wdHlDdXJzb3IpCi0gICAgICAgICAgICAgICAgaEVtcHR5Q3Vyc29yID0gQ3JlYXRlQ3Vyc29yKCAwLCAxLCAxLCAxLCAxLAotCQkJCQkgICAgIlx4RkZceEZGXHhGRlx4RkYiLCAiXHhGRlx4RkZceEZGXHhGRiIgKTsKLSAgICAgICAgICAgIENVUlNPUl9TZXRDdXJzb3IoIGhFbXB0eUN1cnNvciApOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIENsaXBDdXJzb3IgW1VTRVIuMTZdCi0gKi8KLXZvaWQgQ2xpcEN1cnNvcihMUFJFQ1QgbHBOZXdDbGlwUmVjdCkKLXsKLSAgICBpZiAoIWxwTmV3Q2xpcFJlY3QpIFNldFJlY3RFbXB0eSggJkNsaXBDdXJzb3JSZWN0ICk7Ci0gICAgZWxzZSBDb3B5UmVjdCggJkNsaXBDdXJzb3JSZWN0LCBscE5ld0NsaXBSZWN0ICk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q2xpcEN1cnNvciBbVVNFUi4zMDldCi0gKi8KLXZvaWQgR2V0Q2xpcEN1cnNvcihMUFJFQ1QgbHBSZXRDbGlwUmVjdCkKLXsKLSAgICBpZiAobHBSZXRDbGlwUmVjdCAhPSBOVUxMKQotCUNvcHlSZWN0KGxwUmV0Q2xpcFJlY3QsICZDbGlwQ3Vyc29yUmVjdCk7Ci19CmRpZmYgLS1naXQgYS93aW5kb3dzL2RjZS5jIGIvd2luZG93cy9kY2UuYwppbmRleCBjYmQ2Y2Y0Li43Y2I5ZGYzIDEwMDY0NAotLS0gYS93aW5kb3dzL2RjZS5jCisrKyBiL3dpbmRvd3MvZGNlLmMKQEAgLTM5Miw3ICszOTIsNyBAQAogICAgIFNlbGVjdFZpc1JnbiggaGRjLCBocmduVmlzaWJsZSApOwogICAgIERlbGV0ZU9iamVjdCggaHJnblZpc2libGUgKTsKIAotICAgIGRwcmludGZfZGMoc3RkZGViLCAiR2V0RENFeCglZCwlZCwweCVseCk6IHJldHVybmluZyAlZFxuIiwgCisgICAgZHByaW50Zl9kYyhzdGRkZWIsICJHZXREQ0V4KCJOUEZNVCIsIk5QRk1UIiwweCVseCk6IHJldHVybmluZyAiTlBGTVQiXG4iLCAKIAkgICAgICAgaHduZCwgaHJnbkNsaXAsIGZsYWdzLCBoZGMpOwogICAgIHJldHVybiBoZGM7CiB9CkBAIC00MzIsNyArNDMyLDcgQEAKICAgICBIQU5ETEUgaGRjZTsKICAgICBEQ0UgKiBkY2UgPSBOVUxMOwogICAgIAotICAgIGRwcmludGZfZGMoc3RkZGViLCAiUmVsZWFzZURDOiAlZCAlZFxuIiwgaHduZCwgaGRjICk7CisgICAgZHByaW50Zl9kYyhzdGRkZWIsICJSZWxlYXNlREM6ICJOUEZNVCIgIk5QRk1UIlxuIiwgaHduZCwgaGRjICk7CiAgICAgICAgIAogICAgIGZvciAoaGRjZSA9IGZpcnN0RENFOyAoaGRjZSk7IGhkY2UgPSBkY2UtPmhOZXh0KQogICAgIHsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGVmZGxnLmMgYi93aW5kb3dzL2RlZmRsZy5jCmluZGV4IGEzZmI0NjQuLjlmMzBhZjEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGVmZGxnLmMKKysrIGIvd2luZG93cy9kZWZkbGcuYwpAQCAtMTExLDcgKzExMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBEZWZEbGdQcm9jICAgKFVTRVIuMzA4KQogICovCi1MT05HIERlZkRsZ1Byb2MoIEhXTkQgaHduZCwgV09SRCBtc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCitMUkVTVUxUIERlZkRsZ1Byb2MoIEhXTkQgaHduZCwgVUlOVCBtc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQogewogICAgIERJQUxPR0lORk8gKiBkbGdJbmZvOwogICAgIEJPT0wgcmVzdWx0ID0gRkFMU0U7CkBAIC0xMjAsOCArMTIwLDggQEAKICAgICBpZiAoIXduZFB0cikgcmV0dXJuIDA7CiAgICAgZGxnSW5mbyA9IChESUFMT0dJTkZPICopJnduZFB0ci0+d0V4dHJhOwogCi0gICAgZHByaW50Zl9kaWFsb2coc3RkZGViLCAiRGVmRGxnUHJvYzogJWQgJTA0eCAlZCAlMDhseFxuIiwgCi0JCSAgIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICBkcHJpbnRmX2RpYWxvZyhzdGRkZWIsICJEZWZEbGdQcm9jOiAiTlBGTVQiICUwNHggJWxkICUwOGx4XG4iLCAKKwkJICAgaHduZCwgbXNnLCAoRFdPUkQpd1BhcmFtLCBsUGFyYW0gKTsKIAogICAgIGRsZ0luZm8tPm1zZ1Jlc3VsdCA9IDA7CiAgICAgaWYgKGRsZ0luZm8tPmRsZ1Byb2MpCkBAIC0xOTcsNyArMTk3LDcgQEAKIAogCWNhc2UgV01fTkVYVERMR0NUTDoKIAkgICAgewotICAgICAgICAgICAgICAgIEhXTkQgaHduZERlc3QgPSB3UGFyYW07CisgICAgICAgICAgICAgICAgSFdORCBod25kRGVzdCA9IChIV05EKXdQYXJhbTsKICAgICAgICAgICAgICAgICBpZiAoIWxQYXJhbSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIEhXTkQgaHduZFByZXYgPSBHZXRGb2N1cygpOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9kZWZ3bmQuYyBiL3dpbmRvd3MvZGVmd25kLmMKaW5kZXggNjI2M2RkNS4uMTQ3OWI2OCAxMDA2NDQKLS0tIGEvd2luZG93cy9kZWZ3bmQuYworKysgYi93aW5kb3dzL2RlZnduZC5jCkBAIC0xNSwxMCArMTUsMTIgQEAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogLyogI2RlZmluZSBERUJVR19NRVNTQUdFICovCiAjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJzcHkuaCIKIAogICAvKiBMYXN0IENPTE9SIGlkICovCiAjZGVmaW5lIENPTE9SX01BWCAgIENPTE9SX0JUTkhJR0hMSUdIVAogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIERFRldORF9TZXRUZXh0CiAgKgpAQCAtNDAsMTUgKzQyLDE0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBEZWZXaW5kb3dQcm9jICAgKFVTRVIuMTA3KQogICovCi1MT05HIERlZldpbmRvd1Byb2MoIEhXTkQgaHduZCwgV09SRCBtc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCitMUkVTVUxUIERlZldpbmRvd1Byb2MoIEhXTkQgaHduZCwgVUlOVCBtc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQogewogICAgIENMQVNTICogY2xhc3NQdHI7CiAgICAgTFBTVFIgdGV4dFB0cjsKICAgICBpbnQgbGVuOwogICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7Ci0gICAgCi0gICAgZHByaW50Zl9tZXNzYWdlKHN0ZGRlYiwgIkRlZldpbmRvd1Byb2M6ICVkICVkICVkICUwOGx4XG4iLCAKLQkJICAgIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKKworICAgIEVudGVyU3B5TWVzc2FnZShTUFlfREVGV05EUFJPQyxod25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKIAogICAgIHN3aXRjaChtc2cpCiAgICAgewpAQCAtMTIwLDcgKzEyMSw4IEBACiAJcmV0dXJuIE1BX0FDVElWQVRFOwogCiAgICAgY2FzZSBXTV9BQ1RJVkFURToKLQlpZiAod1BhcmFtKSBTZXRGb2N1cyggaHduZCApOworICAgICAgLyogTE9XT1JEKCkgbmVlZGVkIGZvciBXSU5FTElCMzIgaW1wbGVtZW50YXRpb24uICBTaG91bGQgYmUgZmluZS4gKi8KKwlpZiAoTE9XT1JEKHdQYXJhbSkhPVdBX0lOQUNUSVZFKSBTZXRGb2N1cyggaHduZCApOwogCWJyZWFrOwogCiAgICAgY2FzZSBXTV9XSU5ET1dQT1NDSEFOR0lORzoKQEAgLTE0NSwxMSArMTQ3LDExIEBACiAJewogCSAgICBpZiAoIShjbGFzc1B0ciA9IENMQVNTX0ZpbmRDbGFzc1B0ciggd25kUHRyLT5oQ2xhc3MgKSkpIHJldHVybiAwOwogCSAgICBpZiAoIWNsYXNzUHRyLT53Yy5oYnJCYWNrZ3JvdW5kKSByZXR1cm4gMDsKLSAgICAgICAgICAgIGlmIChjbGFzc1B0ci0+d2MuaGJyQmFja2dyb3VuZCA8PSBDT0xPUl9NQVgrMSkKKyAgICAgICAgICAgIGlmIChjbGFzc1B0ci0+d2MuaGJyQmFja2dyb3VuZCA8PSAoSEJSVVNIKShDT0xPUl9NQVgrMSkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIEhCUlVTSCBoYnJ1c2g7CiAgICAgICAgICAgICAgICAgIGhicnVzaCA9IENyZWF0ZVNvbGlkQnJ1c2goCi0gICAgICAgICAgICAgICAgICAgICBHZXRTeXNDb2xvcihjbGFzc1B0ci0+d2MuaGJyQmFja2dyb3VuZC0xKSk7CisgICAgICAgICAgICAgICAgICAgICBHZXRTeXNDb2xvcigoKERXT1JEKWNsYXNzUHRyLT53Yy5oYnJCYWNrZ3JvdW5kKS0xKSk7CiAgICAgICAgICAgICAgICAgIEZpbGxXaW5kb3coIEdldFBhcmVudChod25kKSwgaHduZCwgKEhEQyl3UGFyYW0sIGhicnVzaCk7CiAgICAgICAgICAgICAgICAgIERlbGV0ZU9iamVjdCAoaGJydXNoKTsKICAgICAgICAgICAgIH0KQEAgLTE2Miw2ICsxNjQsMjIgQEAKICAgICBjYXNlIFdNX0dFVERMR0NPREU6CiAJcmV0dXJuIDA7CiAKKyAgICBjYXNlIFdNX0NUTENPTE9STVNHQk9YOgorICAgIGNhc2UgV01fQ1RMQ09MT1JFRElUOgorICAgIGNhc2UgV01fQ1RMQ09MT1JMSVNUQk9YOgorICAgIGNhc2UgV01fQ1RMQ09MT1JCVE46CisgICAgY2FzZSBXTV9DVExDT0xPUkRMRzoKKyAgICBjYXNlIFdNX0NUTENPTE9SU1RBVElDOgorICAgICAgICBTZXRCa0NvbG9yKCAoSERDKXdQYXJhbSwgR2V0U3lzQ29sb3IoQ09MT1JfV0lORE9XKSApOworICAgICAgICBTZXRUZXh0Q29sb3IoIChIREMpd1BhcmFtLCBHZXRTeXNDb2xvcihDT0xPUl9XSU5ET1dURVhUKSApOworICAgICAgICByZXR1cm4gKExPTkcpc3lzQ29sb3JPYmplY3RzLmhicnVzaFdpbmRvdzsKKworICAgIGNhc2UgV01fQ1RMQ09MT1JTQ1JPTExCQVI6CisgICAgICAgIFNldEJrQ29sb3IoIChIREMpd1BhcmFtLCBSR0IoMjU1LCAyNTUsIDI1NSkgKTsKKyAgICAgICAgU2V0VGV4dENvbG9yKCAoSERDKXdQYXJhbSwgUkdCKDAsIDAsIDApICk7CisgICAgICAgIFVucmVhbGl6ZU9iamVjdCggc3lzQ29sb3JPYmplY3RzLmhicnVzaFNjcm9sbGJhciApOworICAgICAgICByZXR1cm4gKExPTkcpc3lzQ29sb3JPYmplY3RzLmhicnVzaFNjcm9sbGJhcjsKKwogICAgIGNhc2UgV01fQ1RMQ09MT1I6CiAJewogCSAgICBpZiAoSElXT1JEKGxQYXJhbSkgPT0gQ1RMQ09MT1JfU0NST0xMQkFSKQpAQCAtMTY5LDEzICsxODcsMTMgQEAKIAkJU2V0QmtDb2xvciggKEhEQyl3UGFyYW0sIFJHQigyNTUsIDI1NSwgMjU1KSApOwogCQlTZXRUZXh0Q29sb3IoIChIREMpd1BhcmFtLCBSR0IoMCwgMCwgMCkgKTsKIAkJVW5yZWFsaXplT2JqZWN0KCBzeXNDb2xvck9iamVjdHMuaGJydXNoU2Nyb2xsYmFyICk7Ci0JCXJldHVybiBzeXNDb2xvck9iamVjdHMuaGJydXNoU2Nyb2xsYmFyOworCQlyZXR1cm4gKExPTkcpc3lzQ29sb3JPYmplY3RzLmhicnVzaFNjcm9sbGJhcjsKIAkgICAgfQogCSAgICBlbHNlCiAJICAgIHsKIAkJU2V0QmtDb2xvciggKEhEQyl3UGFyYW0sIEdldFN5c0NvbG9yKENPTE9SX1dJTkRPVykgKTsKIAkJU2V0VGV4dENvbG9yKCAoSERDKXdQYXJhbSwgR2V0U3lzQ29sb3IoQ09MT1JfV0lORE9XVEVYVCkgKTsKLQkJcmV0dXJuIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hXaW5kb3c7CisJCXJldHVybiAoTE9ORylzeXNDb2xvck9iamVjdHMuaGJydXNoV2luZG93OwogCSAgICB9CiAJfQogCQpkaWZmIC0tZ2l0IGEvd2luZG93cy9kaWFsb2cuYyBiL3dpbmRvd3MvZGlhbG9nLmMKaW5kZXggYjZhM2QzMS4uOGRjMjljNCAxMDA2NDQKLS0tIGEvd2luZG93cy9kaWFsb2cuYworKysgYi93aW5kb3dzL2RpYWxvZy5jCkBAIC0yMTgsNyArMjE4LDcgQEAKICAgICBIR0xPQkFMIGhtZW07CiAgICAgU0VHUFRSIGRhdGE7CiAKLSAgICBkcHJpbnRmX2RpYWxvZyhzdGRkZWIsICJDcmVhdGVEaWFsb2dQYXJhbTogJWQsJTA4bHgsJWQsJTA4bHgsJWxkXG4iLAorICAgIGRwcmludGZfZGlhbG9nKHN0ZGRlYiwgIkNyZWF0ZURpYWxvZ1BhcmFtOiAiTlBGTVQiLCUwOGx4LCJOUEZNVCIsJTA4bHgsJWxkXG4iLAogCSAgICBoSW5zdCwgZGxnVGVtcGxhdGUsIG93bmVyLCAoRFdPUkQpZGxnUHJvYywgcGFyYW0gKTsKICAgICAgCiAgICAgaWYgKCEoaFJzcmMgPSBGaW5kUmVzb3VyY2UoIGhJbnN0LCBkbGdUZW1wbGF0ZSwgUlRfRElBTE9HICkpKSByZXR1cm4gMDsKQEAgLTMwMyw3ICszMDMsOCBAQAogICAgIHJlY3QucmlnaHQgPSB0ZW1wbGF0ZS5oZWFkZXIuY3ggKiB4VW5pdCAvIDQ7CiAgICAgcmVjdC5ib3R0b20gPSB0ZW1wbGF0ZS5oZWFkZXIuY3kgKiB5VW5pdCAvIDg7CiAgICAgaWYgKHRlbXBsYXRlLmhlYWRlci5zdHlsZSAmIERTX01PREFMRlJBTUUpIGV4U3R5bGUgfD0gV1NfRVhfRExHTU9EQUxGUkFNRTsKLSAgICBBZGp1c3RXaW5kb3dSZWN0RXgoICZyZWN0LCB0ZW1wbGF0ZS5oZWFkZXIuc3R5bGUsIGhNZW51LCBleFN0eWxlICk7CisgICAgQWRqdXN0V2luZG93UmVjdEV4KCAmcmVjdCwgdGVtcGxhdGUuaGVhZGVyLnN0eWxlLCAKKwkJCWhNZW51ID8gVFJVRSA6IEZBTFNFICwgZXhTdHlsZSApOwogICAgIHJlY3QucmlnaHQgLT0gcmVjdC5sZWZ0OwogICAgIHJlY3QuYm90dG9tIC09IHJlY3QudG9wOwogCkBAIC0zOTMsOCArMzk0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT55ICogeVVuaXQgLyA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXItPmN4ICogeFVuaXQgLyA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXItPmN5ICogeVVuaXQgLyA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod25kLCBoZWFkZXItPmlkLCBkbGdJbmZvLT5oRGlhbG9nSGVhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNFR1BUUikwICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3bmQsIChITUVOVSloZWFkZXItPmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbGdJbmZvLT5oRGlhbG9nSGVhcCwgKFNFR1BUUikwICk7CiAJfQogCWVsc2UKICAgICAgICAgewpAQCAtNDA0LDcgKzQwNSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci0+eSAqIHlVbml0IC8gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5jeCAqIHhVbml0IC8gNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5jeSAqIHlVbml0IC8gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHduZCwgaGVhZGVyLT5pZCwgaEluc3QsIChTRUdQVFIpMCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod25kLCAoSE1FTlUpaGVhZGVyLT5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEluc3QsIChTRUdQVFIpMCApOwogCX0KIAogICAgICAgICAvKiBNYWtlIHRoZSBjb250cm9sIGxhc3Qgb25lIGluIFotb3JkZXIsIHNvIHRoYXQgY29udHJvbHMgcmVtYWluCkBAIC00MTMsNyArNDE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSB8IFNXUF9OT0FDVElWQVRFICk7CiAKICAgICAgICAgICAgIC8qIFNlbmQgaW5pdGlhbGlzYXRpb24gbWVzc2FnZXMgdG8gdGhlIGNvbnRyb2wgKi8KLSAgICAgICAgaWYgKGhGb250KSBTZW5kTWVzc2FnZSggaHduZEN0cmwsIFdNX1NFVEZPTlQsIGhGb250LCAwICk7CisgICAgICAgIGlmIChoRm9udCkgU2VuZE1lc3NhZ2UoIGh3bmRDdHJsLCBXTV9TRVRGT05ULCAoV1BBUkFNKWhGb250LCAwICk7CiAgICAgICAgIGlmIChTZW5kTWVzc2FnZSggaHduZEN0cmwsIFdNX0dFVERMR0NPREUsIDAsIDAgKSAmIERMR0NfREVGUFVTSEJVVFRPTikKICAgICAgICAgewogICAgICAgICAgICAgICAvKiBJZiB0aGVyZSdzIGFscmVhZHkgYSBkZWZhdWx0IHB1c2gtYnV0dG9uLCBzZXQgaXQgYmFjayAqLwpAQCAtNDM5LDggKzQ0MSw4IEBACiAgICAgICAvKiBTZW5kIGluaXRpYWxpc2F0aW9uIG1lc3NhZ2VzIGFuZCBzZXQgZm9jdXMgKi8KIAogICAgIGlmIChkbGdJbmZvLT5oVXNlckZvbnQpCi0JU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX1NFVEZPTlQsIGRsZ0luZm8tPmhVc2VyRm9udCwgMCApOwotICAgIGlmIChTZW5kTWVzc2FnZSggaHduZCwgV01fSU5JVERJQUxPRywgZGxnSW5mby0+aHduZEZvY3VzLCBwYXJhbSApKQorCVNlbmRNZXNzYWdlKCBod25kLCBXTV9TRVRGT05ULCAoV1BBUkFNKWRsZ0luZm8tPmhVc2VyRm9udCwgMCApOworICAgIGlmIChTZW5kTWVzc2FnZSggaHduZCwgV01fSU5JVERJQUxPRywgKFdQQVJBTSlkbGdJbmZvLT5od25kRm9jdXMsIHBhcmFtICkpCiAJU2V0Rm9jdXMoIGRsZ0luZm8tPmh3bmRGb2N1cyApOwogICAgIGlmICh0ZW1wbGF0ZS5oZWFkZXIuc3R5bGUgJiBXU19WSVNJQkxFKSBTaG93V2luZG93KGh3bmQsIFNXX1NIT1cpOwogICAgIHJldHVybiBod25kOwpAQCAtNTA0LDcgKzUwNiw3IEBACiB7CiAgICAgSFdORCBod25kOwogICAgIAotICAgIGRwcmludGZfZGlhbG9nKHN0ZGRlYiwgIkRpYWxvZ0JveFBhcmFtOiAlZCwlMDhseCwlZCwlMDhseCwlbGRcbiIsCisgICAgZHByaW50Zl9kaWFsb2coc3RkZGViLCAiRGlhbG9nQm94UGFyYW06ICJOUEZNVCIsJTA4bHgsIk5QRk1UIiwlMDhseCwlbGRcbiIsCiAJICAgIGhJbnN0LCBkbGdUZW1wbGF0ZSwgb3duZXIsIChEV09SRClkbGdQcm9jLCBwYXJhbSApOwogICAgIGh3bmQgPSBDcmVhdGVEaWFsb2dQYXJhbSggaEluc3QsIGRsZ1RlbXBsYXRlLCBvd25lciwgZGxnUHJvYywgcGFyYW0gKTsKICAgICBpZiAoaHduZCkgcmV0dXJuIERJQUxPR19Eb0RpYWxvZ0JveCggaHduZCwgb3duZXIgKTsKQEAgLTUzMSw3ICs1MzMsNyBAQAogICAgIEhXTkQgaHduZDsKICAgICBTRUdQVFIgcHRyOwogCi0gICAgaWYgKCEocHRyID0gV0lOMTZfR2xvYmFsTG9jayggZGxnVGVtcGxhdGUgKSkpIHJldHVybiAtMTsKKyAgICBpZiAoIShwdHIgPSAoU0VHUFRSKVdJTjE2X0dsb2JhbExvY2soIGRsZ1RlbXBsYXRlICkpKSByZXR1cm4gLTE7CiAgICAgaHduZCA9IENyZWF0ZURpYWxvZ0luZGlyZWN0UGFyYW0oIGhJbnN0LCBwdHIsIG93bmVyLCBkbGdQcm9jLCBwYXJhbSApOwogICAgIEdsb2JhbFVubG9jayggZGxnVGVtcGxhdGUgKTsKICAgICBpZiAoaHduZCkgcmV0dXJuIERJQUxPR19Eb0RpYWxvZ0JveCggaHduZCwgb3duZXIgKTsKQEAgLTU0OCw3ICs1NTAsNyBAQAogICAgIERJQUxPR0lORk8gKiBkbGdJbmZvID0gKERJQUxPR0lORk8gKil3bmRQdHItPndFeHRyYTsKICAgICBkbGdJbmZvLT5tc2dSZXN1bHQgPSByZXR2YWw7CiAgICAgZGxnSW5mby0+ZkVuZCA9IFRSVUU7Ci0gICAgZHByaW50Zl9kaWFsb2coc3RkZGViLCAiRW5kRGlhbG9nOiAlZCAlZFxuIiwgaHduZCwgcmV0dmFsICk7CisgICAgZHByaW50Zl9kaWFsb2coc3RkZGViLCAiRW5kRGlhbG9nOiAiTlBGTVQiICVkXG4iLCBod25kLCByZXR2YWwgKTsKIH0KIAogCkBAIC02MTAsMjAgKzYxMiwzNiBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBWS19FU0NBUEU6CisjaWZkZWYgV0lORUxJQjMyCisgICAgICAgICAgICBTZW5kTWVzc2FnZSggaHduZERsZywgV01fQ09NTUFORCwgCisJCQkgTUFLRVdQQVJBTSggSURDQU5DRUwsIDAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKUdldERsZ0l0ZW0oaHduZERsZyxJRENBTkNFTCkgKTsKKyNlbHNlCiAgICAgICAgICAgICBTZW5kTWVzc2FnZSggaHduZERsZywgV01fQ09NTUFORCwgSURDQU5DRUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxQQVJBTSggR2V0RGxnSXRlbShod25kRGxnLElEQ0FOQ0VMKSwgMCApKTsKKyNlbmRpZgogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBWS19SRVRVUk46CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgRFdPUkQgZHcgPSBTZW5kTWVzc2FnZSggaHduZERsZywgRE1fR0VUREVGSUQsIDAsIDAgKTsKICAgICAgICAgICAgICAgICBpZiAoSElXT1JEKGR3KSA9PSBEQ19IQVNERUZJRCkKKyNpZmRlZiBXSU5FTElCMzIKKyAgICAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIGh3bmREbGcsIFdNX0NPTU1BTkQsIAorCQkJCSBNQUtFV1BBUkFNKCBMT1dPUkQoZHcpLCBCTl9DTElDS0VEICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKUdldERsZ0l0ZW0oIGh3bmREbGcsIExPV09SRChkdykgKSApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIGh3bmREbGcsIFdNX0NPTU1BTkQsIAorCQkJCSBNQUtFV1BBUkFNKCBJRE9LLCAwICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKUdldERsZ0l0ZW0oaHduZERsZyxJRE9LKSApOworI2Vsc2UKICAgICAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIGh3bmREbGcsIFdNX0NPTU1BTkQsIExPV09SRChkdyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTFBBUkFNKCBHZXREbGdJdGVtKCBod25kRGxnLCBMT1dPUkQoZHcpICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DTElDS0VEICkpOwogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIGh3bmREbGcsIFdNX0NPTU1BTkQsIElET0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTFBBUkFNKCBHZXREbGdJdGVtKGh3bmREbGcsSURPSyksIDAgKSk7CisjZW5kaWYKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC02ODEsNyArNjk5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlICAgKFVTRVIuMTAxKQogICovCi1MT05HIFNlbmREbGdJdGVtTWVzc2FnZShIV05EIGh3bmQsIFdPUkQgaWQsIFVJTlQgbXNnLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitMUkVTVUxUIFNlbmREbGdJdGVtTWVzc2FnZShIV05EIGh3bmQsIElOVCBpZCwgVUlOVCBtc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgICAgSFdORCBod25kQ3RybCA9IEdldERsZ0l0ZW0oIGh3bmQsIGlkICk7CiAgICAgaWYgKGh3bmRDdHJsKSByZXR1cm4gU2VuZE1lc3NhZ2UoIGh3bmRDdHJsLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CmRpZmYgLS1naXQgYS93aW5kb3dzL2V2ZW50LmMgYi93aW5kb3dzL2V2ZW50LmMKaW5kZXggODM3ZDI4NC4uYTkxZDI0OCAxMDA2NDQKLS0tIGEvd2luZG93cy9ldmVudC5jCisrKyBiL3dpbmRvd3MvZXZlbnQuYwpAQCAtMTE4LDggKzExOCw3IEBACiAKIHN0YXRpYyBCT09MIEtleURvd24gPSBGQUxTRTsKIAotCi1zdGF0aWMgY2hhciAqZXZlbnRfbmFtZXNbXSA9CitzdGF0aWMgY29uc3QgY2hhciAqZXZlbnRfbmFtZXNbXSA9CiB7CiAgICAgIiIsICIiLCAiS2V5UHJlc3MiLCAiS2V5UmVsZWFzZSIsICJCdXR0b25QcmVzcyIsICJCdXR0b25SZWxlYXNlIiwKICAgICAiTW90aW9uTm90aWZ5IiwgIkVudGVyTm90aWZ5IiwgIkxlYXZlTm90aWZ5IiwgIkZvY3VzSW4iLCAiRm9jdXNPdXQiLApAQCAtMTU3LDcgKzE1Niw3IEBACiAgICAgWEZpbmRDb250ZXh0KCBkaXNwbGF5LCAoKFhBbnlFdmVudCAqKWV2ZW50KS0+d2luZG93LCB3aW5Db250ZXh0LCAmcHRyICk7CiAgICAgaHduZCA9IChIV05EKSAoaW50KXB0cjsKIAotICAgIGRwcmludGZfZXZlbnQoc3RkZGViLCAiR290IGV2ZW50ICVzIGZvciBod25kICVkXG4iLCAKKyAgICBkcHJpbnRmX2V2ZW50KHN0ZGRlYiwgIkdvdCBldmVudCAlcyBmb3IgaHduZCAiTlBGTVQiXG4iLAogCQkgIGV2ZW50X25hbWVzW2V2ZW50LT50eXBlXSwgaHduZCApOwogCiAgICAgc3dpdGNoKGV2ZW50LT50eXBlKQpAQCAtMjE0LDcgKzIxMyw3IEBACiAJYnJlYWs7CiAKICAgICBkZWZhdWx0OiAgICAKLQlkcHJpbnRmX2V2ZW50KHN0ZGRlYiwgIlVucHJvY2Vzc2VkIGV2ZW50ICVzIGZvciBod25kICVkXG4iLAorCWRwcmludGZfZXZlbnQoc3RkZGViLCAiVW5wcm9jZXNzZWQgZXZlbnQgJXMgZm9yIGh3bmQgIk5QRk1UIlxuIiwKIAkgICAgICAgIGV2ZW50X25hbWVzW2V2ZW50LT50eXBlXSwgaHduZCApOwogCWJyZWFrOwogICAgIH0KQEAgLTM5Nyw2ICszOTYsMjYgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBFVkVOVF9EdW1teU1vdGlvbk5vdGlmeQorICoKKyAqIEdlbmVyYXRlIGEgZHVtbXkgTW90aW9uTm90aWZ5IGV2ZW50LiBVc2VkIHRvIGZvcmNlIGEgV01fU0VUQ1VSU09SIG1lc3NhZ2UuCisgKi8KK3ZvaWQgRVZFTlRfRHVtbXlNb3Rpb25Ob3RpZnkodm9pZCkKK3sKKyAgICBXaW5kb3cgcm9vdCwgY2hpbGQ7CisgICAgaW50IHJvb3RYLCByb290WSwgY2hpbGRYLCBjaGlsZFk7CisgICAgdW5zaWduZWQgaW50IHN0YXRlOworCisgICAgaWYgKFhRdWVyeVBvaW50ZXIoIGRpc3BsYXksIHJvb3RXaW5kb3csICZyb290LCAmY2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICZyb290WCwgJnJvb3RZLCAmY2hpbGRYLCAmY2hpbGRZLCAmc3RhdGUgKSkKKyAgICB7CisgICAgICAgIGhhcmR3YXJlX2V2ZW50KFdNX01PVVNFTU9WRSwgRVZFTlRfWFN0YXRlVG9LZXlTdGF0ZSggc3RhdGUgKSwgMEwsCisgICAgICAgICAgICAgICAgICAgICAgIHJvb3RYIC0gZGVza3RvcFgsIHJvb3RZIC0gZGVza3RvcFksIEdldFRpY2tDb3VudCgpLCAwICk7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEVWRU5UX0J1dHRvblByZXNzCiAgKi8KIHN0YXRpYyB2b2lkIEVWRU5UX0J1dHRvblByZXNzKCBYQnV0dG9uRXZlbnQgKmV2ZW50ICkKQEAgLTUzOSw3ICs1NTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgR3JhYk1vZGVBc3luYywgR3JhYk1vZGVBc3luYywKICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUsIEN1cnJlbnRUaW1lICkgPT0gR3JhYlN1Y2Nlc3MpCiAgICAgewotCWRwcmludGZfd2luKHN0ZGRlYiwgIlNldENhcHR1cmU6ICUwNHhcbiIsIGh3bmQpOworCWRwcmludGZfd2luKHN0ZGRlYiwgIlNldENhcHR1cmU6ICJOUEZNVCJcbiIsIGh3bmQpOwogCWNhcHR1cmVXbmQgICA9IGh3bmQ7CiAJcmV0dXJuIG9sZF9jYXB0dXJlX3duZDsKICAgICB9CmRpZmYgLS1naXQgYS93aW5kb3dzL2ZvY3VzLmMgYi93aW5kb3dzL2ZvY3VzLmMKaW5kZXggN2RjODg5Ny4uMTQxYmVkZSAxMDA2NDQKLS0tIGEvd2luZG93cy9mb2N1cy5jCisrKyBiL3dpbmRvd3MvZm9jdXMuYwpAQCAtODMsMTAgKzgzLDEyIEBACiAKICAgICBoV25kUHJldkZvY3VzID0gaFduZEZvY3VzOwogICAgIGhXbmRGb2N1cyA9IGh3bmQ7ICAgIAotICAgIGlmIChoV25kUHJldkZvY3VzKSBTZW5kTWVzc2FnZSggaFduZFByZXZGb2N1cywgV01fS0lMTEZPQ1VTLCBod25kLCAwICk7CisgICAgaWYgKGhXbmRQcmV2Rm9jdXMpIFNlbmRNZXNzYWdlKCBoV25kUHJldkZvY3VzLCBXTV9LSUxMRk9DVVMsIAorCQkJCSAgICAoV1BBUkFNKWh3bmQsIDAgKTsKICAgICBpZiAoaHduZCA9PSBoV25kRm9jdXMpICAvKiBNYXliZSBhbHJlYWR5IGNoYW5nZWQgZHVyaW5nIFdNX0tJTExGT0NVUyAqLwogICAgIHsKLQlpZiAoaHduZCkgU2VuZE1lc3NhZ2UoIGhXbmRGb2N1cywgV01fU0VURk9DVVMsIGhXbmRQcmV2Rm9jdXMsIDAgKTsKKwlpZiAoaHduZCkgU2VuZE1lc3NhZ2UoIGhXbmRGb2N1cywgV01fU0VURk9DVVMsIAorCQkJICAgICAgIChXUEFSQU0paFduZFByZXZGb2N1cywgMCApOwogCUZPQ1VTX1NldFhGb2N1cyggaHduZCApOwogICAgIH0KICAgICByZXR1cm4gaFduZFByZXZGb2N1czsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZ3JhcGhpY3MuYyBiL3dpbmRvd3MvZ3JhcGhpY3MuYwppbmRleCBkNjIzNzUyLi42MDhmYmVhIDEwMDY0NAotLS0gYS93aW5kb3dzL2dyYXBoaWNzLmMKKysrIGIvd2luZG93cy9ncmFwaGljcy5jCkBAIC02OTMsMTkgKzY5MywxNyBAQAogQk9PTCBHUkFQSF9EcmF3Qml0bWFwKCBIREMgaGRjLCBIQklUTUFQIGhiaXRtYXAsIGludCB4ZGVzdCwgaW50IHlkZXN0LAogCQkgICAgICAgaW50IHhzcmMsIGludCB5c3JjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQgKQogewotICAgIFhHQ1ZhbHVlcyB2YWw7CiAgICAgQklUTUFQT0JKICpibXA7CiAgICAgREMgKmRjOwogICAgIAogICAgIGlmICghKGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKSkpIHJldHVybiBGQUxTRTsKICAgICBpZiAoIShibXAgPSAoQklUTUFQT0JKICopIEdESV9HZXRPYmpQdHIoIGhiaXRtYXAsIEJJVE1BUF9NQUdJQyApKSkKIAlyZXR1cm4gRkFMU0U7Ci0gICAgdmFsLmZ1bmN0aW9uICAgPSBHWGNvcHk7Ci0gICAgdmFsLmZvcmVncm91bmQgPSBkYy0+dy50ZXh0UGl4ZWw7Ci0gICAgdmFsLmJhY2tncm91bmQgPSBkYy0+dy5iYWNrZ3JvdW5kUGl4ZWw7Ci0gICAgWENoYW5nZUdDKGRpc3BsYXksIGRjLT51LnguZ2MsIEdDRnVuY3Rpb258R0NGb3JlZ3JvdW5kfEdDQmFja2dyb3VuZCwgJnZhbCk7CisgICAgWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBHWGNvcHkgKTsKICAgICBpZiAoYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWwgPT0gMSkKICAgICB7CisgICAgICAgIFhTZXRGb3JlZ3JvdW5kKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBkYy0+dy5iYWNrZ3JvdW5kUGl4ZWwgKTsKKyAgICAgICAgWFNldEJhY2tncm91bmQoIGRpc3BsYXksIGRjLT51LnguZ2MsIGRjLT53LnRleHRQaXhlbCApOwogCVhDb3B5UGxhbmUoIGRpc3BsYXksIGJtcC0+cGl4bWFwLCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAogCQkgICAgeHNyYywgeXNyYywgd2lkdGgsIGhlaWdodCwKIAkJICAgIGRjLT53LkRDT3JnWCArIHhkZXN0LCBkYy0+dy5EQ09yZ1kgKyB5ZGVzdCwgMSApOwpAQCAtOTgwLDcgKzk3OCw3IEBACiAgICAgUkVDVCByZWN0OwogICAgIERDICpkYzsKIAotICAgIGRwcmludGZfZ3JhcGhpY3MoIHN0ZGRlYiwgIkV4dEZsb29kRmlsbCAleCAlZCwlZCAlMDZseCAlZFxuIiwKKyAgICBkcHJpbnRmX2dyYXBoaWNzKCBzdGRkZWIsICJFeHRGbG9vZEZpbGwgIk5QRk1UIiAlZCwlZCAlMDZseCAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICBoZGMsIHgsIHksIGNvbG9yLCBmaWxsVHlwZSApOwogICAgIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoaGRjLCBEQ19NQUdJQyk7CiAgICAgaWYgKCFkYykgCmRpZmYgLS1naXQgYS93aW5kb3dzL2hvb2suYyBiL3dpbmRvd3MvaG9vay5jCmluZGV4IGQ0ZmUyZWIuLjA4NDcyYWYgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvaG9vay5jCisrKyBiL3dpbmRvd3MvaG9vay5jCkBAIC01Miw3ICs1MiwxMSBAQAogICAgIGlmIChkYXRhLT5wcm9jID09IGhwcm9jKSB7CiAgICAgICBoaG9vayA9ICpwcmV2SG9vazsKICAgICAgICpwcmV2SG9vayA9IGRhdGEtPm5leHQ7CisjaWZkZWYgV0lORUxJQjMyCisgICAgICBVU0VSX0hFQVBfRlJFRSgoSEFORExFKWhob29rKTsKKyNlbHNlCiAgICAgICBVU0VSX0hFQVBfRlJFRShMT1dPUkQoaGhvb2spKTsKKyNlbmRpZgogICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICB9CkBAIC02Miw3ICs2NiwxMSBAQAogICAgIGlmIChkYXRhLT5wcm9jID09IGhwcm9jKSB7CiAgICAgICBoaG9vayA9ICpwcmV2SG9vazsKICAgICAgICpwcmV2SG9vayA9IGRhdGEtPm5leHQ7CisjaWZkZWYgV0lORUxJQjMyCisgICAgICBVU0VSX0hFQVBfRlJFRSgoSEFORExFKWhob29rKTsKKyNlbHNlCiAgICAgICBVU0VSX0hFQVBfRlJFRShMT1dPUkQoaGhvb2spKTsKKyNlbmRpZgogICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICB9CkBAIC04NCw4ICs5Miw5IEBACiAgKi8KIEJPT0wgQ2FsbE1zZ0ZpbHRlciggU0VHUFRSIG1zZywgc2hvcnQgY29kZSApCiB7Ci0gICAgaWYgKENBTExfU1lTVEVNX0hPT0soIFdIX1NZU01TR0ZJTFRFUiwgY29kZSwgMCwgKExQQVJBTSltc2cgKSkgcmV0dXJuIFRSVUU7Ci0gICAgZWxzZSByZXR1cm4gQ0FMTF9UQVNLX0hPT0soIFdIX01TR0ZJTFRFUiwgY29kZSwgMCwgKExQQVJBTSltc2cgKTsKKyAgICBpZiAoQ0FMTF9UQVNLX0hPT0soIFdIX01TR0ZJTFRFUiwgY29kZSwgMCwgKExQQVJBTSltc2cgKSkgCisJcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIENBTExfU1lTVEVNX0hPT0soIFdIX1NZU01TR0ZJTFRFUiwgY29kZSwgMCwgKExQQVJBTSltc2cgKTsKIH0KIAogCkBAIC0xMDAsNyArMTA5LDggQEAKIAogICAgIGlmICgoaWQgPCBGSVJTVF9IT09LKSB8fCAoaWQgPiBMQVNUX0hPT0spKSByZXR1cm4gMDsKICAgICBpZiAoaWQgIT0gV0hfR0VUTUVTU0FHRSAmJiBpZCAhPSBXSF9DQUxMV05EUFJPQykgewotCWZwcmludGYoIHN0ZG5pbXAsICJVbmltcGxlbWVudGVkIGhvb2sgc2V0OiAlZCFcbiIsIGlkICk7CisJZnByaW50Ziggc3RkbmltcCwgIlVuaW1wbGVtZW50ZWQgaG9vayBzZXQ6ICglZCwlMDhseCwlMDR4LCUwNHgpIVxuIiwKKyAgICAgICAgICAgICAgICAgaWQsIChEV09SRClwcm9jLCBoaW5zdCwgaHRhc2sgKTsKICAgICB9CiAgICAgaWYgKGh0YXNrKSAgLyogVGFzay1zcGVjaWZpYyBob29rICovCiAgICAgewpAQCAtMTIxLDcgKzEzMSw3IEBACiAgICAgZGF0YS0+cHJvYyAgPSBwcm9jOwogICAgIGRhdGEtPmlkICAgID0gaWQ7CiAgICAgZGF0YS0+aHRhc2sgPSBodGFzazsKLSAgICAqcHJldkhvb2sgICA9IFVTRVJfSEVBUF9TRUdfQUREUihoYW5kbGUpOworICAgICpwcmV2SG9vayAgID0gKEhIT09LKVVTRVJfSEVBUF9TRUdfQUREUihoYW5kbGUpOwogICAgIHJldHVybiAqcHJldkhvb2s7CiB9CiAKQEAgLTE0MSw3ICsxNTEsMTEgQEAKICAgICB9CiAgICAgaWYgKCEqcHJldkhvb2spIHJldHVybiBGQUxTRTsKICAgICAqcHJldkhvb2sgPSBkYXRhLT5uZXh0OworI2lmZGVmIFdJTkVMSUIzMgorICAgIFVTRVJfSEVBUF9GUkVFKCAoSEFORExFKWhob29rICk7CisjZWxzZQogICAgIFVTRVJfSEVBUF9GUkVFKCBoaG9vayAmIDB4ZmZmZiApOworI2VuZGlmCiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWFwcGluZy5jIGIvd2luZG93cy9tYXBwaW5nLmMKaW5kZXggNzRiOTFmMy4uNWU2NjgxOSAxMDA2NDQKLS0tIGEvd2luZG93cy9tYXBwaW5nLmMKKysrIGIvd2luZG93cy9tYXBwaW5nLmMKQEAgLTg2LDcgKzg2LDcgQEAKIAlyZXR1cm4gMTsKICAgICB9CiAKLSAgICBkcHJpbnRmX2dkaShzdGRkZWIsICJTZXRNYXBNb2RlOiAlZCAlZFxuIiwgaGRjLCBtb2RlICk7CisgICAgZHByaW50Zl9nZGkoc3RkZGViLCAiU2V0TWFwTW9kZTogIk5QRk1UIiAlZFxuIiwgaGRjLCBtb2RlICk7CiAgICAgCiAgICAgcHJldk1vZGUgPSBkYy0+dy5NYXBNb2RlOwogICAgIHN3aXRjaChtb2RlKQpkaWZmIC0tZ2l0IGEvd2luZG93cy9tZGkuYyBiL3dpbmRvd3MvbWRpLmMKaW5kZXggZGU3ZGVkNy4uNzZmNmQ4NyAxMDA2NDQKLS0tIGEvd2luZG93cy9tZGkuYworKysgYi93aW5kb3dzL21kaS5jCkBAIC0yNyw3ICsyNyw3IEBACiAgICAgY2hhciBidWZmZXJbMTI4XTsKICAgICBpbnQgaWQsIG4sIGluZGV4OwogCi0gICAgZHByaW50Zl9tZGkoc3RkZGViLCAiTURJUmVjcmVhdGVNZW51TGlzdDogaFdpbmRvd01lbnUgJTB4XG4iLCAKKyAgICBkcHJpbnRmX21kaShzdGRkZWIsICJNRElSZWNyZWF0ZU1lbnVMaXN0OiBoV2luZG93TWVudSAiTlBGTVQiXG4iLCAKIAkgICAgY2ktPmhXaW5kb3dNZW51KTsKICAgICAKICAgICBpZCA9IGNpLT5pZEZpcnN0Q2hpbGQ7IApAQCAtNjYsNyArNjYsNyBAQAogICovCiBITUVOVSBNRElTZXRNZW51KEhXTkQgaHduZCwgQk9PTCBmUmVmcmVzaCwgSE1FTlUgaG1lbnVGcmFtZSwgSE1FTlUgaG1lbnVXaW5kb3cpCiB7Ci0gICAgZHByaW50Zl9tZGkoc3RkZGViLCAiV01fTURJU0VUTUVOVTogJTA0eCAlMDR4ICUwNHggJTA0eFxuIiwgaHduZCwgZlJlZnJlc2gsIGhtZW51RnJhbWUsIGhtZW51V2luZG93KTsKKyAgICBkcHJpbnRmX21kaShzdGRkZWIsICJXTV9NRElTRVRNRU5VOiAiTlBGTVQiICUwNHggIk5QRk1UIiAiTlBGTVQiXG4iLCBod25kLCBmUmVmcmVzaCwgaG1lbnVGcmFtZSwgaG1lbnVXaW5kb3cpOwogICAgIGlmICghZlJlZnJlc2gpIHsKIAlIV05EIGh3bmRGcmFtZSA9IEdldFBhcmVudChod25kKTsKIAlITUVOVSBvbGRGcmFtZU1lbnUgPSBHZXRNZW51KGh3bmRGcmFtZSk7CkBAIC0xMTIsNyArMTEyLDcgQEAKIAkJCSAgV1NfTUFYSU1JWkVCT1ggfCBXU19NSU5JTUlaRUJPWCB8IFdTX1NZU01FTlUgfAogCQkJICBXU19USElDS0ZSQU1FIHwgV1NfVklTSUJMRSB8IGNzLT5zdHlsZSwKIAkJCSAgY3MtPngsIGNzLT55LCBjcy0+Y3gsIGNzLT5jeSwgcGFyZW50LCAoSE1FTlUpIDAsCi0JCQkgIHctPmhJbnN0YW5jZSwgbFBhcmFtKTsKKwkJCSAgdy0+aEluc3RhbmNlLCAoU0VHUFRSKWxQYXJhbSk7CiAKICAgICBpZiAoaHduZCkKICAgICB7CkBAIC0yMTUsNyArMjE1LDcgQEAKIAl7CiAJICAgIHdoaWxlIChoaW5mbyAhPSAwKSB7CiAJCWNoaSA9IChNRElDSElMRElORk8gKilVU0VSX0hFQVBfTElOX0FERFIoaGluZm8pOwotCQlpZiAoY2hpLT5od25kID09IGlkKSBicmVhazsKKwkJaWYgKGNoaS0+aHduZCA9PSAoSFdORClpZCkgYnJlYWs7CiAJICAgICAgICBoaW5mbyA9IGNoaS0+bmV4dDsKIAkgICAgfQogCX0KQEAgLTIyMyw3ICsyMjMsNyBAQAogCWlmIChoaW5mbyA9PSAwKQogCSAgICByZXR1cm47CiAKLQlkcHJpbnRmX21kaShzdGRkZWIsICJNRElCcmluZ1RvVG9wOiBjaGlsZCAlMDR4XG4iLCBjaGktPmh3bmQpOworCWRwcmludGZfbWRpKHN0ZGRlYiwgIk1ESUJyaW5nVG9Ub3A6IGNoaWxkICJOUEZNVCJcbiIsIGNoaS0+aHduZCk7CiAJaWYgKGhpbmZvICE9IGNpLT5pbmZvQWN0aXZlQ2hpbGRyZW4pCiAJewogCSAgICBpZiAoY2ktPmZsYWdDaGlsZE1heGltaXplZCkKQEAgLTI4NSw3ICsyODUsNyBAQAogCSAgICBTZW5kTWVzc2FnZShwYXJlbnQsIFdNX0NISUxEQUNUSVZBVEUsIDAsIDApOwogCX0KIAkKLQlkcHJpbnRmX21kaShzdGRkZWIsICJNRElCcmluZ1RvVG9wOiBwb3MgJTA0eCwgaHduZCAlMDR4XG4iLCAKKwlkcHJpbnRmX21kaShzdGRkZWIsICJNRElCcmluZ1RvVG9wOiBwb3MgJTA0eCwgaHduZCAiTlBGTVQiXG4iLCAKIAkJaWQsIGNoaS0+aHduZCk7CiAgICAgfQogfQpAQCAtMzU0LDE3ICszNTQsMTcgQEAKICAgICBIV05EICAgICAgICAgIGFjdF9od25kOwogICAgIExPTkcgICAgICAgICAgbFBhcmFtOwogCi0gICAgZHByaW50Zl9tZGkoc3RkZGViLCAiTURJQ2hpbGRBY3RpdmF0ZTogdG9wICUwNHhcbiIsIHctPmh3bmRDaGlsZCk7CisgICAgZHByaW50Zl9tZGkoc3RkZGViLCAiTURJQ2hpbGRBY3RpdmF0ZTogdG9wICJOUEZNVCJcbiIsIHctPmh3bmRDaGlsZCk7CiAKICAgICBoaW5mbyA9IGNpLT5pbmZvQWN0aXZlQ2hpbGRyZW47CiAgICAgaWYgKGhpbmZvKQogICAgIHsKIAljaGkgPSAoTURJQ0hJTERJTkZPICopVVNFUl9IRUFQX0xJTl9BRERSKGhpbmZvKTsKIAlkZWFjdF9od25kID0gY2ktPmh3bmRBY3RpdmVDaGlsZDsKLQlhY3RfaHduZCAgID0gY2hpLT5od25kOwotCWxQYXJhbSAgICAgPSAoKExPTkcpIGRlYWN0X2h3bmQgPDwgMTYpIHwgYWN0X2h3bmQ7CisJYWN0X2h3bmQgICA9IGNoaS0+aHduZDsgICAgICAgICAgICAgICAgLyogRklYOiBIYWNrICovCisJbFBhcmFtICAgICA9ICgoTE9ORykgZGVhY3RfaHduZCA8PCAxNikgfCAoTE9ORylhY3RfaHduZDsKIAotCWRwcmludGZfbWRpKHN0ZGRlYiwgIk1ESUNoaWxkQWN0aXZhdGU6IGRlYWN0ICUwNHgsIGFjdCAlMDR4XG4iLAorCWRwcmludGZfbWRpKHN0ZGRlYiwgIk1ESUNoaWxkQWN0aXZhdGU6IGRlYWN0ICJOUEZNVCIsIGFjdCAiTlBGTVQiXG4iLAogCSAgICAgICBkZWFjdF9od25kLCBhY3RfaHduZCk7CiAKIAljaS0+aHduZEFjdGl2ZUNoaWxkID0gYWN0X2h3bmQ7CkBAIC00MjQsMTMgKzQyNCwxMyBAQAogCWhpbmZvID0gY2hpLT5uZXh0OwogICAgIH0KICAgICAKLSAgICBkcHJpbnRmX21kaShzdGRkZWIsICJNRElDYXNjYWRlOiBsYXN0IGNoaWxkIGlzICUwNHhcbiIsIGNoaS0+aHduZCk7CisgICAgZHByaW50Zl9tZGkoc3RkZGViLCAiTURJQ2FzY2FkZTogbGFzdCBjaGlsZCBpcyAiTlBGTVQiXG4iLCBjaGktPmh3bmQpOwogICAgIHggPSAwOwogICAgIHkgPSAwOwogICAgIHdoaWxlIChoaW5mbyAhPSAwKQogICAgIHsKIAljaGkgPSBVU0VSX0hFQVBfTElOX0FERFIoaGluZm8pOwotCWRwcmludGZfbWRpKHN0ZGRlYiwgIk1ESUNhc2NhZGU6IG1vdmUgJTA0eCB0byAoJWQsJWQpIHNpemUgWyVkLCVkXVxuIiwgCisJZHByaW50Zl9tZGkoc3RkZGViLCAiTURJQ2FzY2FkZTogbW92ZSAiTlBGTVQiIHRvICglZCwlZCkgc2l6ZSBbJWQsJWRdXG4iLCAKIAkJY2hpLT5od25kLCB4LCB5LCB4c2l6ZSwgeXNpemUpOwogICAgICAgICBpZiAoSXNJY29uaWMoY2hpLT5od25kKSkgY29udGludWU7CiAJU2V0V2luZG93UG9zKGNoaS0+aHduZCwgMCwgeCwgeSwgeHNpemUsIHlzaXplLCAKQEAgLTU1Niw3ICs1NTYsNyBAQAogICAgIHcgID0gV0lOX0ZpbmRXbmRQdHIoaHduZENsaWVudCk7CiAgICAgY2kgPSAoTURJQ0xJRU5USU5GTyAqKSB3LT53RXh0cmE7CiAKLSAgICBkcHJpbnRmX21kaShzdGRkZWIsICJNRElQYWludE1heGltaXplZDogZnJhbWUgJTA0eCwgIGNsaWVudCAlMDR4IgorICAgIGRwcmludGZfbWRpKHN0ZGRlYiwgIk1ESVBhaW50TWF4aW1pemVkOiBmcmFtZSAiTlBGTVQiLCAgY2xpZW50ICJOUEZNVAogCQkiLCAgbWF4IGZsYWcgJWQsICBtZW51ICUwNHhcbiIsIGh3bmRGcmFtZSwgaHduZENsaWVudCwgCiAJCWNpLT5mbGFnQ2hpbGRNYXhpbWl6ZWQsIHduZFB0ciA/IHduZFB0ci0+d0lEbWVudSA6IDApOwogCkBAIC01NzYsOCArNTc2LDggQEAKIAl9CiAKIAlkcHJpbnRmX21kaShzdGRkZWIsIAotCQkgICAgIk1ESVBhaW50TWF4aW1pemVkOiBoZGNNZW0gJTA0eCwgY2xvc2UgYml0bWFwICUwNHgsICIKLQkJICAgICJtYXhpbWl6ZWQgYml0bWFwICUwNHhcbiIsCisJCSAgICAiTURJUGFpbnRNYXhpbWl6ZWQ6IGhkY01lbSAiTlBGTVQiLCBjbG9zZSBiaXRtYXAgIk5QRk1UIiwgIgorCQkgICAgIm1heGltaXplZCBiaXRtYXAgIk5QRk1UIlxuIiwKIAkJICAgIGhkY01lbSwgaGJpdG1hcENsb3NlLCBoYml0bWFwTWF4aW1pemVkKTsKIAogCU5DX0dldEluc2lkZVJlY3QoaHduZEZyYW1lLCAmcmVjdCk7CkBAIC02MTcsNyArNjE3LDcgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBoYW5kbGVyIGZvciBhbGwgTURJIHJlcXVlc3RzLgogICovCi1MT05HIE1ESUNsaWVudFduZFByb2MoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK0xSRVNVTFQgTURJQ2xpZW50V25kUHJvYyhIV05EIGh3bmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgICBMUENSRUFURVNUUlVDVCAgICAgICBjczsKICAgICBMUENMSUVOVENSRUFURVNUUlVDVCBjY3M7CkBAIC02NTYsNyArNjU2LDcgQEAKIAlyZXR1cm4gTURJQ2FzY2FkZShod25kLCBjaSk7CiAKICAgICAgIGNhc2UgV01fTURJQ1JFQVRFOgotCXJldHVybiBNRElDcmVhdGVDaGlsZCh3LCBjaSwgaHduZCwgbFBhcmFtICk7CisJcmV0dXJuIChMT05HKU1ESUNyZWF0ZUNoaWxkKHcsIGNpLCBod25kLCBsUGFyYW0gKTsKIAogICAgICAgY2FzZSBXTV9NRElERVNUUk9ZOgogCXJldHVybiBNRElEZXN0cm95Q2hpbGQodywgY2ksIGh3bmQsIHdQYXJhbSwgVFJVRSk7CkBAIC02OTAsNyArNjkwLDExIEBACiAJCiAgICAgICBjYXNlIFdNX1BBUkVOVE5PVElGWToKIAlpZiAod1BhcmFtID09IFdNX0RFU1RST1kpCisjaWZkZWYgV0lORUxJQjMyCisJICAgIHJldHVybiBNRElEZXN0cm95Q2hpbGQodywgY2ksIGh3bmQsIGxQYXJhbSwgRkFMU0UpOworI2Vsc2UKIAkgICAgcmV0dXJuIE1ESURlc3Ryb3lDaGlsZCh3LCBjaSwgaHduZCwgTE9XT1JEKGxQYXJhbSksIEZBTFNFKTsKKyNlbmRpZgogCWVsc2UgaWYgKHdQYXJhbSA9PSBXTV9MQlVUVE9ORE9XTikKIAkgICAgTURJQnJpbmdDaGlsZFRvVG9wKGh3bmQsIGNpLT5od25kSGl0VGVzdCwgRkFMU0UsIEZBTFNFKTsKIAlicmVhazsKQEAgLTcwOCw4ICs3MTIsOCBAQAogICoJCQkJCURlZkZyYW1lUHJvYyAoVVNFUi40NDUpCiAgKgogICovCi1MT05HIERlZkZyYW1lUHJvYyhIV05EIGh3bmQsIEhXTkQgaHduZE1ESUNsaWVudCwgV09SRCBtZXNzYWdlLCAKLQkJICBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitMUkVTVUxUIERlZkZyYW1lUHJvYyhIV05EIGh3bmQsIEhXTkQgaHduZE1ESUNsaWVudCwgVUlOVCBtZXNzYWdlLCAKKwkJICAgICBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgIGlmIChod25kTURJQ2xpZW50KQogICAgIHsKQEAgLTc1MSw3ICs3NTUsMTEgQEAKICAqCQkJCQlEZWZNRElDaGlsZFByb2MgKFVTRVIuNDQ3KQogICoKICAqLworI2lmZGVmIFdJTkVMSUIzMgorTE9ORyBEZWZNRElDaGlsZFByb2MoSFdORCBod25kLCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCisjZWxzZQogTE9ORyBEZWZNRElDaGlsZFByb2MoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKKyNlbmRpZgogewogICAgIE1ESUNMSUVOVElORk8gICAgICAgKmNpOwogICAgIFdORCAgICAgICAgICAgICAgICAgKnc7CkBAIC03NzMsMTAgKzc4MSwxMCBAQAogCXN3aXRjaCAod1BhcmFtKQogCXsKIAkgIGNhc2UgU0NfTUFYSU1JWkU6Ci0JICAgIHJldHVybiBTZW5kTWVzc2FnZShHZXRQYXJlbnQoaHduZCksIFdNX01ESU1BWElNSVpFLCBod25kLCAwKTsKKwkgICAgcmV0dXJuIFNlbmRNZXNzYWdlKEdldFBhcmVudChod25kKSwgV01fTURJTUFYSU1JWkUsIChXUEFSQU0paHduZCwgMCk7CiAKIAkgIGNhc2UgU0NfUkVTVE9SRToKLQkgICAgcmV0dXJuIFNlbmRNZXNzYWdlKEdldFBhcmVudChod25kKSwgV01fTURJUkVTVE9SRSwgaHduZCwgMCk7CisJICAgIHJldHVybiBTZW5kTWVzc2FnZShHZXRQYXJlbnQoaHduZCksIFdNX01ESVJFU1RPUkUsIChXUEFSQU0paHduZCwgMCk7CiAJfQogCWJyZWFrOwogCQpkaWZmIC0tZ2l0IGEvd2luZG93cy9tZXNzYWdlLmMgYi93aW5kb3dzL21lc3NhZ2UuYwppbmRleCA3MmNiOWFiLi5hZGVmYjE0IDEwMDY0NAotLS0gYS93aW5kb3dzL21lc3NhZ2UuYworKysgYi93aW5kb3dzL21lc3NhZ2UuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKICNpbmNsdWRlICJob29rLmgiCiAjaW5jbHVkZSAiZXZlbnQuaCIKKyNpbmNsdWRlICJzcHkuaCIKICNpbmNsdWRlICJ3aW5wb3MuaCIKICNpbmNsdWRlICJhdG9tLmgiCiAjaW5jbHVkZSAiZGRlLmgiCkBAIC0xMzcsNyArMTM4LDcgQEAKIHsKICAgICBpbnQgaSwgcG9zID0gbXNnUXVldWUtPm5leHRNZXNzYWdlOwogCi0gICAgZHByaW50Zl9tc2coc3RkZGViLCJNU0dfRmluZE1zZzogaHduZD0weCUwNHhcblxuIiwgaHduZCApOworICAgIGRwcmludGZfbXNnKHN0ZGRlYiwiTVNHX0ZpbmRNc2c6IGh3bmQ9MHgiTlBGTVQiXG5cbiIsIGh3bmQgKTsKIAogICAgIGlmICghbXNnUXVldWUtPm1zZ0NvdW50KSByZXR1cm4gLTE7CiAgICAgaWYgKCFod25kICYmICFmaXJzdCAmJiAhbGFzdCkgcmV0dXJuIHBvczsKQEAgLTMxMCw3ICszMTEsNyBAQAogCiAgICAgICAgIC8qIFNlbmQgdGhlIFdNX1BBUkVOVE5PVElGWSBtZXNzYWdlICovCiAKLSAgICAgICAgaWYgKG1vdXNlQ2xpY2spIFdJTl9TZW5kUGFyZW50Tm90aWZ5KCBtc2ctPmh3bmQsIG1zZy0+bWVzc2FnZSwKKyAgICAgICAgaWYgKG1vdXNlQ2xpY2spIFdJTl9TZW5kUGFyZW50Tm90aWZ5KCBtc2ctPmh3bmQsIG1zZy0+bWVzc2FnZSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoIG1zZy0+cHQueCwgbXNnLT5wdC55ICkgKTsKIAogICAgICAgICAvKiBBY3RpdmF0ZSB0aGUgd2luZG93IGlmIG5lZWRlZCAqLwpAQCAtMzIwLDcgKzMyMSw4IEBACiAgICAgICAgICAgICBIV05EIGh3bmRUb3AgPSBXSU5fR2V0VG9wUGFyZW50KCBtc2ctPmh3bmQgKTsKICAgICAgICAgICAgIGlmIChod25kVG9wICE9IEdldEFjdGl2ZVdpbmRvdygpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExPTkcgcmV0ID0gU2VuZE1lc3NhZ2UoIG1zZy0+aHduZCwgV01fTU9VU0VBQ1RJVkFURSwgaHduZFRvcCwKKyAgICAgICAgICAgICAgICBMT05HIHJldCA9IFNlbmRNZXNzYWdlKCBtc2ctPmh3bmQsIFdNX01PVVNFQUNUSVZBVEUsCisJCQkJCShXUEFSQU0paHduZFRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyggaGl0dGVzdCwgbXNnLT5tZXNzYWdlICkgKTsKICAgICAgICAgICAgICAgICBpZiAoKHJldCA9PSBNQV9BQ1RJVkFURUFOREVBVCkgfHwgKHJldCA9PSBNQV9OT0FDVElWQVRFQU5ERUFUKSkKICAgICAgICAgICAgICAgICAgICAgZWF0TXNnID0gVFJVRTsKQEAgLTMzNiw3ICszMzgsNyBAQAogCiAgICAgICAvKiBTZW5kIHRoZSBXTV9TRVRDVVJTT1IgbWVzc2FnZSAqLwogCi0gICAgU2VuZE1lc3NhZ2UoIG1zZy0+aHduZCwgV01fU0VUQ1VSU09SLCBtc2ctPmh3bmQsCisgICAgU2VuZE1lc3NhZ2UoIG1zZy0+aHduZCwgV01fU0VUQ1VSU09SLCAoV1BBUkFNKW1zZy0+aHduZCwKICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoIGhpdHRlc3QsIG1zZy0+bWVzc2FnZSApKTsKICAgICBpZiAoZWF0TXNnKSByZXR1cm4gRkFMU0U7CiAKQEAgLTk1NCw4ICs5NTYsOCBAQAogewogICAgIE1TR19QZWVrTWVzc2FnZSggKE1TRyAqKVBUUl9TRUdfVE9fTElOKG1zZyksCiAgICAgICAgICAgICAgICAgICAgICBod25kLCBmaXJzdCwgbGFzdCwgUE1fUkVNT1ZFLCBGQUxTRSApOwotICAgIENBTExfU1lTVEVNX0hPT0soIFdIX0dFVE1FU1NBR0UsIDAsIDAsIChMUEFSQU0pbXNnICk7CiAgICAgQ0FMTF9UQVNLX0hPT0soIFdIX0dFVE1FU1NBR0UsIDAsIDAsIChMUEFSQU0pbXNnICk7CisgICAgQ0FMTF9TWVNURU1fSE9PSyggV0hfR0VUTUVTU0FHRSwgMCwgMCwgKExQQVJBTSltc2cgKTsKICAgICByZXR1cm4gKCgoTVNHICopUFRSX1NFR19UT19MSU4obXNnKSktPm1lc3NhZ2UgIT0gV01fUVVJVCk7CiB9CiAKQEAgLTk4OCw3ICs5OTAsNyBAQAogICAgICAgd2hpbGUgKGh3bmQpIHsKIAlpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKSkpIGJyZWFrOwogCWlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19QT1BVUCB8fCB3bmRQdHItPmR3U3R5bGUgJiBXU19DQVBUSU9OKSB7Ci0JICBkcHJpbnRmX21zZyhzdGRkZWIsIkJST0FEQ0FTVCBNZXNzYWdlIHRvIGhXbmQ9JTA0WCBtPSUwNFggdz0lMDRYIGw9JTA4bFggIVxuIiwKKwkgIGRwcmludGZfbXNnKHN0ZGRlYiwiQlJPQURDQVNUIE1lc3NhZ2UgdG8gaFduZD0iTlBGTVQiIG09JTA0WCB3PSUwNFggbD0lMDhsWCAhXG4iLAogCQkgICAgICBod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CiAJICBQb3N0TWVzc2FnZShod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CiAJfQpAQCAtMTAyNywxNiArMTAyOSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2VuZE1lc3NhZ2UgICAoVVNFUi4xMTEpCiAgKi8KLUxPTkcgU2VuZE1lc3NhZ2UoIEhXTkQgaHduZCwgV09SRCBtc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCitMUkVTVUxUIFNlbmRNZXNzYWdlKCBIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKIHsKICAgICBXTkQgKiB3bmRQdHI7CiAgICAgTE9ORyByZXQ7CiAgICAgc3RydWN0CiAgICAgewotCUxPTkcgbFBhcmFtOwotCVdPUkQgd1BhcmFtOwotCVdPUkQgd01zZzsKLQlXT1JEIGhXbmQ7CisJTFBBUkFNIGxQYXJhbTsKKwlXUEFSQU0gd1BhcmFtOworCVVJTlQgd01zZzsKKwlIV05EIGhXbmQ7CiAgICAgfSBtc2dzdHJ1Y3QgPSB7IGxQYXJhbSwgd1BhcmFtLCBtc2csIGh3bmQgfTsKIAogI2lmZGVmIENPTkZJR19JUEMKQEAgLTEwNTMsOCArMTA1NSw4IEBACiAgICAgICAgICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKSkpIGJyZWFrOwogICAgICAgICAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1BPUFVQIHx8IHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NBUFRJT04pCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZHByaW50Zl9tc2coc3RkZGViLCJCUk9BRENBU1QgTWVzc2FnZSB0byBoV25kPSUwNFggbT0lMDRYIHc9JTA0WCBsPSUwOGxYICFcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgICAgICAgICAgICAgZHByaW50Zl9tc2coc3RkZGViLCJCUk9BRENBU1QgTWVzc2FnZSB0byBoV25kPSJOUEZNVCIgbT0lMDRYIHc9JTA0bFggbD0lMDhsWCAhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3bmQsIG1zZywgKERXT1JEKXdQYXJhbSwgbFBhcmFtKTsKICAgICAgICAgICAgICAgICAgcmV0IHw9IFNlbmRNZXNzYWdlKCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CiAJICAgIH0KICAgICAgICAgICAgIGh3bmQgPSB3bmRQdHItPmh3bmROZXh0OwpAQCAtMTA2MywxMyArMTA2NSwxOCBAQAogICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAKLSAgICBDQUxMX1NZU1RFTV9IT09LKCBXSF9DQUxMV05EUFJPQywgMCwgMCwgTUFLRV9TRUdQVFIoJm1zZ3N0cnVjdCkgKTsKLSAgICBDQUxMX1RBU0tfSE9PSyggV0hfQ0FMTFdORFBST0MsIDAsIDAsIE1BS0VfU0VHUFRSKCZtc2dzdHJ1Y3QpICk7Ci0gICAgaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpIHJldHVybiAwOworICAgIEVudGVyU3B5TWVzc2FnZShTUFlfU0VORE1FU1NBR0UsIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOworCisgICAgQ0FMTF9UQVNLX0hPT0soIFdIX0NBTExXTkRQUk9DLCBIQ19BQ1RJT04sIDEsIE1BS0VfU0VHUFRSKCZtc2dzdHJ1Y3QpICk7CisgICAgQ0FMTF9TWVNURU1fSE9PSyggV0hfQ0FMTFdORFBST0MsIEhDX0FDVElPTiwgMSwgTUFLRV9TRUdQVFIoJm1zZ3N0cnVjdCkgKTsKKyAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgCisgICAgeworICAgICAgICBFeGl0U3B5TWVzc2FnZShTUFlfUkVTVUxUX0lOVkFMSURIV05ELGh3bmQsbXNnLDApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgcmV0ID0gQ2FsbFdpbmRvd1Byb2MoIHduZFB0ci0+bHBmblduZFByb2MsIG1zZ3N0cnVjdC5oV25kLCBtc2dzdHJ1Y3Qud01zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnc3RydWN0LndQYXJhbSwgbXNnc3RydWN0LmxQYXJhbSApOwotICAgIGRwcmludGZfbXNnKCBzdGRkZWIsIlNlbmRNZXNzYWdlKCU0LjR4LCV4LCV4LCVseCkgLT4gJWx4XG4iLAotICAgICAgICAgICAgICAgICBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtLCByZXQgKTsKKyAgICBFeGl0U3B5TWVzc2FnZShTUFlfUkVTVUxUX09LLGh3bmQsbXNnLHJldCk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTEyNiwxNyArMTEzMywxNiBAQAogICAgIExPTkcgcmV0dmFsOwogICAgIGludCBwYWludGluZzsKICAgICAKLSAgICBkcHJpbnRmX21zZyhzdGRkZWIsICJEaXNwYXRjaCBtZXNzYWdlIGh3bmQ9JTA0eCBtc2c9MHgleCB3PSVkIGw9JWxkIHRpbWU9JWx1IHB0PSVkLCVkXG4iLAotCSAgICBtc2ctPmh3bmQsIG1zZy0+bWVzc2FnZSwgbXNnLT53UGFyYW0sIG1zZy0+bFBhcmFtLCAKLQkgICAgbXNnLT50aW1lLCBtc2ctPnB0LngsIG1zZy0+cHQueSApOworICAgIEVudGVyU3B5TWVzc2FnZSggU1BZX0RJU1BBVENITUVTU0FHRSwgbXNnLT5od25kLCBtc2ctPm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICBtc2ctPndQYXJhbSwgbXNnLT5sUGFyYW0gKTsKIAogICAgICAgLyogUHJvY2VzcyB0aW1lciBtZXNzYWdlcyAqLwogICAgIGlmICgobXNnLT5tZXNzYWdlID09IFdNX1RJTUVSKSB8fCAobXNnLT5tZXNzYWdlID09IFdNX1NZU1RJTUVSKSkKICAgICB7CiAJaWYgKG1zZy0+bFBhcmFtKQogICAgICAgICB7Ci0gICAgICAgICAgICBXT1JEIGRzID0gbXNnLT5od25kID8gR2V0V2luZG93V29yZCggbXNnLT5od25kLCBHV1dfSElOU1RBTkNFICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDVVJSRU5UX0RTOworICAgICAgICAgICAgSElOU1RBTkNFIGRzID0gbXNnLT5od25kID8gV0lOX0dldFdpbmRvd0luc3RhbmNlKCBtc2ctPmh3bmQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKEhJTlNUQU5DRSlDVVJSRU5UX0RTOwogCSAgICByZXR1cm4gQ2FsbFduZFByb2MoIChXTkRQUk9DKW1zZy0+bFBhcmFtLCBkcywgbXNnLT5od25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2ctPm1lc3NhZ2UsIG1zZy0+d1BhcmFtLCBHZXRUaWNrQ291bnQoKSApOwogICAgICAgICB9CkBAIC0xMTUyLDcgKzExNTgsNyBAQAogICAgIGlmIChwYWludGluZyAmJiBJc1dpbmRvdyhtc2ctPmh3bmQpICYmCiAgICAgICAgICh3bmRQdHItPmZsYWdzICYgV0lOX05FRURTX0JFR0lOUEFJTlQpKQogICAgIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkJlZ2luUGFpbnQgbm90IGNhbGxlZCBvbiBXTV9QQUlOVCBmb3IgaHduZCAlZCFcbiIsIAorCWZwcmludGYoc3RkZXJyLCAiQmVnaW5QYWludCBub3QgY2FsbGVkIG9uIFdNX1BBSU5UIGZvciBod25kICJOUEZNVCIhXG4iLCAKIAkJbXNnLT5od25kKTsKIAl3bmRQdHItPmZsYWdzICY9IH5XSU5fTkVFRFNfQkVHSU5QQUlOVDsKICAgICB9CkBAIC0xMjA3LDcgKzEyMTMsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldFRpY2tDb3VudCAgICAoVVNFUi4xMykKKyAqICAgICAgICAgICBHZXRUaWNrQ291bnQgICAgKFVTRVIuMTMpIChLRVJORUwzMi4yOTkpCiAgKi8KIERXT1JEIEdldFRpY2tDb3VudCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvd2luZG93cy9tc2dib3guYyBiL3dpbmRvd3MvbXNnYm94LmMKaW5kZXggMDViYzA5Yy4uZTBjZDQ2YyAxMDA2NDQKLS0tIGEvd2luZG93cy9tc2dib3guYworKysgYi93aW5kb3dzL21zZ2JveC5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSAic2VsZWN0b3JzLmgiCiAjaW5jbHVkZSAiYWxpYXMuaCIKICNpbmNsdWRlICJyZWxheTMyLmgiCisjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiLi4vcmMvc3lzcmVzLmgiCiAjaW5jbHVkZSAidGFzay5oIgogCkBAIC0yMCw3ICsyMSw3IEBACiAgIFdPUkQgIHR5cGU7CiB9IE1TR0JPWCwgKkxQTVNHQk9YOwogCi1MT05HIFN5c3RlbU1lc3NhZ2VCb3hQcm9jKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitMUkVTVUxUIFN5c3RlbU1lc3NhZ2VCb3hQcm9jKEhXTkQgaHduZCxVSU5UIG1lc3NhZ2UsV1BBUkFNIHdQYXJhbSxMUEFSQU0gbFBhcmFtKQogewogICBMUE1TR0JPWCBscG1iOwogICBSRUNUIHJlY3QsIHRleHRyZWN0OwpAQCAtNjgsMTcgKzY5LDIxIEBACiAgICAgLyogU2V0IHRoZSBpY29uICovCiAgICAgc3dpdGNoKGxwbWItPnR5cGUgJiBNQl9JQ09OTUFTSykgewogICAgICBjYXNlIE1CX0lDT05FWENMQU1BVElPTjoKLSAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBzdGMxLCBTVE1fU0VUSUNPTiwgTG9hZEljb24oMCwgSURJX0VYQ0xBTUFUSU9OKSwgMCk7CisgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgc3RjMSwgU1RNX1NFVElDT04sIAorCQkJIChXUEFSQU0pTG9hZEljb24oMCwgSURJX0VYQ0xBTUFUSU9OKSwgMCk7CiAgICAgICBicmVhazsKICAgICAgY2FzZSBNQl9JQ09OUVVFU1RJT046Ci0gICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgc3RjMSwgU1RNX1NFVElDT04sIExvYWRJY29uKDAsIElESV9RVUVTVElPTiksIDApOworICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIHN0YzEsIFNUTV9TRVRJQ09OLCAKKwkJCSAoV1BBUkFNKUxvYWRJY29uKDAsIElESV9RVUVTVElPTiksIDApOwogICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTUJfSUNPTkFTVEVSSVNLOgotICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIHN0YzEsIFNUTV9TRVRJQ09OLCBMb2FkSWNvbigwLCBJRElfQVNURVJJU0spLCAwKTsKKyAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBzdGMxLCBTVE1fU0VUSUNPTiwgCisJCQkgKFdQQVJBTSlMb2FkSWNvbigwLCBJRElfQVNURVJJU0spLCAwKTsKICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1CX0lDT05IQU5EOgogICAgICBkZWZhdWx0OgotICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIHN0YzEsIFNUTV9TRVRJQ09OLCBMb2FkSWNvbigwLCBJRElfSEFORCksIDApOworICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIHN0YzEsIFNUTV9TRVRJQ09OLCAKKwkJCSAoV1BBUkFNKUxvYWRJY29uKDAsIElESV9IQU5EKSwgMCk7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgCkBAIC0yMDAsNyArMjA1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3Jlc19ESUFMT0dfTVNHQk9YLnNpemUsIEdldEN1cnJlbnRQREIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBGQUxTRSwgVFJVRSwgTlVMTCApOwogICAgIGlmICghaGFuZGxlKSByZXR1cm4gMDsKLSAgICByZXQgPSBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtKCBHZXRXaW5kb3dXb3JkKGhXbmQsIEdXV19ISU5TVEFOQ0UpLAorICAgIHJldCA9IERpYWxvZ0JveEluZGlyZWN0UGFyYW0oIFdJTl9HZXRXaW5kb3dJbnN0YW5jZShoV25kKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsIGhXbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V25kUHJvY0VudHJ5MTYoIlN5c3RlbU1lc3NhZ2VCb3hQcm9jIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExPTkcpJm1ib3ggKTsKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvbm9uY2xpZW50LmMgYi93aW5kb3dzL25vbmNsaWVudC5jCmluZGV4IGExOTIyNjIuLmFhNzdiZWYgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvbm9uY2xpZW50LmMKKysrIGIvd2luZG93cy9ub25jbGllbnQuYwpAQCAtMTcwLDcgKzE3MCw3IEBACiAJcE1pbk1heCA9IChNSU5NQVhJTkZPICopIFVTRVJfSEVBUF9MSU5fQUREUiggbWlubWF4SGFuZGxlICk7CiAJbWVtY3B5KCBwTWluTWF4LCAmTWluTWF4LCBzaXplb2YoTWluTWF4KSApOwkKIAlTZW5kTWVzc2FnZSggaHduZCwgV01fR0VUTUlOTUFYSU5GTywgMCwKLSAgICAgICAgICAgICAgICAgICAgIFVTRVJfSEVBUF9TRUdfQUREUihtaW5tYXhIYW5kbGUpICk7CisgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKVVTRVJfSEVBUF9TRUdfQUREUihtaW5tYXhIYW5kbGUpICk7CiAgICAgfQogICAgIGVsc2UgcE1pbk1heCA9ICZNaW5NYXg7CiAKQEAgLTI2MCw3ICsyNjAsNyBAQAogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICBpZiAoIXduZFB0cikgcmV0dXJuIEhURVJST1I7CiAKLSAgICBkcHJpbnRmX25vbmNsaWVudChzdGRkZWIsICJOQ19IYW5kbGVOQ0hpdFRlc3Q6IGh3bmQ9JXggcHQ9JWQsJWRcbiIsIAorICAgIGRwcmludGZfbm9uY2xpZW50KHN0ZGRlYiwgIk5DX0hhbmRsZU5DSGl0VGVzdDogaHduZD0iTlBGTVQiIHB0PSVkLCVkXG4iLAogCQkgICAgICBod25kLCBwdC54LCBwdC55ICk7CiAKICAgICBHZXRXaW5kb3dSZWN0KCBod25kLCAmcmVjdCApOwpAQCAtNjI0LDcgKzYyNCw3IEBACiAKICAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAKLSAgICBkcHJpbnRmX25vbmNsaWVudChzdGRkZWIsICJOQ19Eb05DUGFpbnQ6ICV4ICVkXG4iLCBod25kLCBhY3RpdmUgKTsKKyAgICBkcHJpbnRmX25vbmNsaWVudChzdGRkZWIsICJOQ19Eb05DUGFpbnQ6ICJOUEZNVCIgJWRcbiIsIGh3bmQsIGFjdGl2ZSApOwogICAgIGlmICghd25kUHRyIHx8ICEod25kUHRyLT5kd1N0eWxlICYgV1NfVklTSUJMRSkpIHJldHVybjsgLyogTm90aGluZyB0byBkbyAqLwogCiAgICAgaWYgKCEoaGRjID0gR2V0RENFeCggaHduZCwgMCwgRENYX1VTRVNUWUxFIHwgRENYX1dJTkRPVyApKSkgcmV0dXJuOwpAQCAtNjM5LDcgKzYzOSw3IEBACiAgICAgICAgIEhJQ09OIGhJY29uID0gV0lOX0NMQVNTX0lORk8od25kUHRyKS5oSWNvbjsKICAgICAgICAgaWYgKGhJY29uKSAgCiAgICAgICAgIHsKLSAgICAgICAgICAgIFNlbmRNZXNzYWdlKGh3bmQsIFdNX0lDT05FUkFTRUJLR05ELCBoZGMsIDApOworICAgICAgICAgICAgU2VuZE1lc3NhZ2UoaHduZCwgV01fSUNPTkVSQVNFQktHTkQsIChXUEFSQU0paGRjLCAwKTsKICAgICAgICAgICAgIERyYXdJY29uKGhkYywgMCwgMCwgaEljb24pOwogICAgICAgICB9CiAgICAgICAgIFJlbGVhc2VEQyhod25kLCBoZGMpOwpAQCAtNzMwLDkgKzczMCw5IEBACiAgKgogICogSGFuZGxlIGEgV01fTkNBQ1RJVkFURSBtZXNzYWdlLiBDYWxsZWQgZnJvbSBEZWZXaW5kb3dQcm9jKCkuCiAgKi8KLUxPTkcgTkNfSGFuZGxlTkNBY3RpdmF0ZSggSFdORCBod25kLCBXT1JEIHdQYXJhbSApCitMT05HIE5DX0hhbmRsZU5DQWN0aXZhdGUoIEhXTkQgaHduZCwgV1BBUkFNIHdQYXJhbSApCiB7Ci0gICAgTkNfRG9OQ1BhaW50KCBod25kLCB3UGFyYW0sIEZBTFNFICk7CisgICAgTkNfRG9OQ1BhaW50KCBod25kLCAod1BhcmFtICE9IDApLCBGQUxTRSApOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC03NDIsOSArNzQyLDkgQEAKICAqCiAgKiBIYW5kbGUgYSBXTV9TRVRDVVJTT1IgbWVzc2FnZS4gQ2FsbGVkIGZyb20gRGVmV2luZG93UHJvYygpLgogICovCi1MT05HIE5DX0hhbmRsZVNldEN1cnNvciggSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQorTE9ORyBOQ19IYW5kbGVTZXRDdXJzb3IoIEhXTkQgaHduZCwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCiB7Ci0gICAgaWYgKGh3bmQgIT0gd1BhcmFtKSByZXR1cm4gMDsgIC8qIERvbid0IHNldCB0aGUgY3Vyc29yIGZvciBjaGlsZCB3aW5kb3dzICovCisgICAgaWYgKGh3bmQgIT0gKEhXTkQpd1BhcmFtKSByZXR1cm4gMDsgIC8qIERvbid0IHNldCB0aGUgY3Vyc29yIGZvciBjaGlsZCB3aW5kb3dzICovCiAKICAgICBzd2l0Y2goTE9XT1JEKGxQYXJhbSkpCiAgICAgewpAQCAtNzczLDIzICs3NzMsMjMgQEAKIAogICAgIGNhc2UgSFRMRUZUOgogICAgIGNhc2UgSFRSSUdIVDoKLQlyZXR1cm4gU2V0Q3Vyc29yKCBMb2FkQ3Vyc29yKCAwLCBJRENfU0laRVdFICkgKTsKKwlyZXR1cm4gKExPTkcpU2V0Q3Vyc29yKCBMb2FkQ3Vyc29yKCAwLCBJRENfU0laRVdFICkgKTsKIAogICAgIGNhc2UgSFRUT1A6CiAgICAgY2FzZSBIVEJPVFRPTToKLQlyZXR1cm4gU2V0Q3Vyc29yKCBMb2FkQ3Vyc29yKCAwLCBJRENfU0laRU5TICkgKTsKKwlyZXR1cm4gKExPTkcpU2V0Q3Vyc29yKCBMb2FkQ3Vyc29yKCAwLCBJRENfU0laRU5TICkgKTsKIAogICAgIGNhc2UgSFRUT1BMRUZUOgogICAgIGNhc2UgSFRCT1RUT01SSUdIVDoJCi0JcmV0dXJuIFNldEN1cnNvciggTG9hZEN1cnNvciggMCwgSURDX1NJWkVOV1NFICkgKTsKKwlyZXR1cm4gKExPTkcpU2V0Q3Vyc29yKCBMb2FkQ3Vyc29yKCAwLCBJRENfU0laRU5XU0UgKSApOwogCiAgICAgY2FzZSBIVFRPUFJJR0hUOgogICAgIGNhc2UgSFRCT1RUT01MRUZUOgotCXJldHVybiBTZXRDdXJzb3IoIExvYWRDdXJzb3IoIDAsIElEQ19TSVpFTkVTVyApICk7CisJcmV0dXJuIChMT05HKVNldEN1cnNvciggTG9hZEN1cnNvciggMCwgSURDX1NJWkVORVNXICkgKTsKICAgICB9CiAKICAgICAvKiBEZWZhdWx0IGN1cnNvcjogYXJyb3cgKi8KLSAgICByZXR1cm4gU2V0Q3Vyc29yKCBMb2FkQ3Vyc29yKCAwLCBJRENfQVJST1cgKSApOworICAgIHJldHVybiAoTE9ORylTZXRDdXJzb3IoIExvYWRDdXJzb3IoIDAsIElEQ19BUlJPVyApICk7CiB9CiAKIApAQCAtNzk5LDcgKzc5OSw3IEBACiAgKiBJbml0aWFsaXNhdGlvbiBvZiBhIG1vdmUgb3IgcmVzaXplLCB3aGVuIGluaXRpYXRpZWQgZnJvbSBhIG1lbnUgY2hvaWNlLgogICogUmV0dXJuIGhpdCB0ZXN0IGNvZGUgZm9yIGNhcHRpb24gb3Igc2l6aW5nIGJvcmRlci4KICAqLwotc3RhdGljIExPTkcgTkNfU3RhcnRTaXplTW92ZSggSFdORCBod25kLCBXT1JEIHdQYXJhbSwgUE9JTlQgKmNhcHR1cmVQb2ludCApCitzdGF0aWMgTE9ORyBOQ19TdGFydFNpemVNb3ZlKCBIV05EIGh3bmQsIFdQQVJBTSB3UGFyYW0sIFBPSU5UICpjYXB0dXJlUG9pbnQgKQogewogICAgIExPTkcgaGl0dGVzdCA9IDA7CiAgICAgUE9JTlQgcHQ7CkBAIC0xMTE0LDcgKzExMTQsNyBAQAogCiAgICAgZG8KICAgICB7Ci0gICAgICAgIEdldE1lc3NhZ2UoIFVTRVJfSEVBUF9TRUdfQUREUihoTXNnKSwgMCwgMCwgMCApOworICAgICAgICBHZXRNZXNzYWdlKCAoU0VHUFRSKVVTRVJfSEVBUF9TRUdfQUREUihoTXNnKSwgMCwgMCwgMCApOwogCXN3aXRjaChtc2ctPm1lc3NhZ2UpCiAJewogCWNhc2UgV01fTEJVVFRPTlVQOgpAQCAtMTE3NCw3ICsxMTc0LDcgQEAKICAqCiAgKiBIYW5kbGUgYSBXTV9OQ0xCVVRUT05ET1dOIG1lc3NhZ2UuIENhbGxlZCBmcm9tIERlZldpbmRvd1Byb2MoKS4KICAqLwotTE9ORyBOQ19IYW5kbGVOQ0xCdXR0b25Eb3duKCBIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCitMT05HIE5DX0hhbmRsZU5DTEJ1dHRvbkRvd24oIEhXTkQgaHduZCwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCiB7CiAgICAgSERDIGhkYyA9IEdldFdpbmRvd0RDKCBod25kICk7CiAKQEAgLTEyMzAsNyArMTIzMCw3IEBACiAgKgogICogSGFuZGxlIGEgV01fTkNMQlVUVE9OREJMQ0xLIG1lc3NhZ2UuIENhbGxlZCBmcm9tIERlZldpbmRvd1Byb2MoKS4KICAqLwotTE9ORyBOQ19IYW5kbGVOQ0xCdXR0b25EYmxDbGsoIEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKK0xPTkcgTkNfSGFuZGxlTkNMQnV0dG9uRGJsQ2xrKCBIV05EIGh3bmQsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQogewogICAgIC8qCiAgICAgICogaWYgdGhpcyBpcyBhbiBpY29uLCBzZW5kIGEgcmVzdG9yZSBzaW5jZSB3ZSBhcmUgaGFuZGxpbmcKQEAgLTEyNjIsMTIgKzEyNjIsMTIgQEAKICAqCiAgKiBIYW5kbGUgYSBXTV9TWVNDT01NQU5EIG1lc3NhZ2UuIENhbGxlZCBmcm9tIERlZldpbmRvd1Byb2MoKS4KICAqLwotTE9ORyBOQ19IYW5kbGVTeXNDb21tYW5kKCBIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBQT0lOVCBwdCApCitMT05HIE5DX0hhbmRsZVN5c0NvbW1hbmQoIEhXTkQgaHduZCwgV1BBUkFNIHdQYXJhbSwgUE9JTlQgcHQgKQogewogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKIAotICAgIGRwcmludGZfbm9uY2xpZW50KHN0ZGRlYiwgIkhhbmRsaW5nIFdNX1NZU0NPTU1BTkQgJXggJWQsJWRcbiIsIAotCQkgICAgICB3UGFyYW0sIHB0LngsIHB0LnkgKTsKKyAgICBkcHJpbnRmX25vbmNsaWVudChzdGRkZWIsICJIYW5kbGluZyBXTV9TWVNDT01NQU5EICVseCAlZCwlZFxuIiwgCisJCSAgICAgIChEV09SRCl3UGFyYW0sIHB0LngsIHB0LnkgKTsKIAogICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkgU2NyZWVuVG9DbGllbnQoIHduZFB0ci0+aHduZFBhcmVudCwgJnB0ICk7CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvcGFpbnRpbmcuYyBiL3dpbmRvd3MvcGFpbnRpbmcuYwppbmRleCBiMTg4YWMzLi43ZTE2NjMyIDEwMDY0NAotLS0gYS93aW5kb3dzL3BhaW50aW5nLmMKKysrIGIvd2luZG93cy9wYWludGluZy5jCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgRGVsZXRlT2JqZWN0KCBocmduVXBkYXRlICk7CiAgICAgaWYgKCFscHMtPmhkYykKICAgICB7Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkdldERDRXgoKSBmYWlsZWQgaW4gQmVnaW5QYWludCgpLCBod25kPSV4XG4iLCBod25kICk7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkdldERDRXgoKSBmYWlsZWQgaW4gQmVnaW5QYWludCgpLCBod25kPSJOUEZNVCJcbiIsIGh3bmQgKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgaWYgKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTkVFRFNfRVJBU0VCS0dORCkKICAgICB7CiAgICAgICAgIHduZFB0ci0+ZmxhZ3MgJj0gfldJTl9ORUVEU19FUkFTRUJLR05EOwotICAgICAgICBscHMtPmZFcmFzZSA9ICFTZW5kTWVzc2FnZSggaHduZCwgV01fRVJBU0VCS0dORCwgbHBzLT5oZGMsIDAgKTsKKyAgICAgICAgbHBzLT5mRXJhc2UgPSAhU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX0VSQVNFQktHTkQsIChXUEFSQU0pbHBzLT5oZGMsIDAgKTsKICAgICB9CiAgICAgZWxzZSBscHMtPmZFcmFzZSA9IFRSVUU7CiAKQEAgLTkzLDExICs5MywxNyBAQAogewogICAgICAgLyogU2VuZCBXTV9DVExDT0xPUiBtZXNzYWdlIGlmIG5lZWRlZCAqLwogCi0gICAgaWYgKGhicnVzaCA8PSBDVExDT0xPUl9NQVgpCisgICAgaWYgKChEV09SRCloYnJ1c2ggPD0gQ1RMQ09MT1JfTUFYKQogICAgIHsKIAlpZiAoIWh3bmRQYXJlbnQpIHJldHVybjsKKyNpZmRlZiBXSU5FTElCMzIKKwloYnJ1c2ggPSAoSEJSVVNIKVNlbmRNZXNzYWdlKCBod25kUGFyZW50LCAKKwkJCQkgICAgICBXTV9DVExDT0xPUk1TR0JPWCsoRFdPUkQpaGJydXNoLAorCQkJCSAgICAgIChXUEFSQU0paGRjLCAoTFBBUkFNKWh3bmQgKTsKKyNlbHNlCiAJaGJydXNoID0gKEhCUlVTSClTZW5kTWVzc2FnZSggaHduZFBhcmVudCwgV01fQ1RMQ09MT1IsCiAJCQkJICAgICAgaGRjLCBNQUtFTE9ORyggaHduZCwgaGJydXNoICkgKTsKKyNlbmRpZgogICAgIH0KICAgICBpZiAoaGJydXNoKSBGaWxsUmVjdCggaGRjLCByZWN0LCBoYnJ1c2ggKTsKIH0KQEAgLTEwOCw4ICsxMTQsMTMgQEAKICAqLwogSEJSVVNIIEdldENvbnRyb2xCcnVzaCggSFdORCBod25kLCBIREMgaGRjLCBXT1JEIGNvbnRyb2wgKQogeworI2lmZGVmIFdJTkVMSUIzMgorICAgIHJldHVybiAoSEJSVVNIKVNlbmRNZXNzYWdlKCBHZXRQYXJlbnQoaHduZCksIFdNX0NUTENPTE9SK2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXUEFSQU0paGRjLCAoTFBBUkFNKWh3bmQgKTsKKyNlbHNlCiAgICAgcmV0dXJuIChIQlJVU0gpU2VuZE1lc3NhZ2UoIEdldFBhcmVudChod25kKSwgV01fQ1RMQ09MT1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkYywgTUFLRUxPTkcoIGh3bmQsIGNvbnRyb2wgKSApOworI2VuZGlmCiB9CiAKIApAQCAtMTI5LDEzICsxNDAsMTMgQEAKIAogICAgIGlmIChyZWN0VXBkYXRlKQogICAgIHsKLSAgICAgICAgZHByaW50Zl93aW4oIHN0ZGRlYiwgIlJlZHJhd1dpbmRvdzogJXggJWQsJWQtJWQsJWQgJXggZmxhZ3M9JTA0eFxuIiwKKyAgICAgICAgZHByaW50Zl93aW4oIHN0ZGRlYiwgIlJlZHJhd1dpbmRvdzogIk5QRk1UIiAlZCwlZC0lZCwlZCAiTlBGTVQiIGZsYWdzPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICBod25kLCByZWN0VXBkYXRlLT5sZWZ0LCByZWN0VXBkYXRlLT50b3AsCiAgICAgICAgICAgICAgICAgICAgICByZWN0VXBkYXRlLT5yaWdodCwgcmVjdFVwZGF0ZS0+Ym90dG9tLCBocmduVXBkYXRlLCBmbGFncyk7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIGRwcmludGZfd2luKCBzdGRkZWIsICJSZWRyYXdXaW5kb3c6ICV4IE5VTEwgJXggZmxhZ3M9JTA0eFxuIiwKKyAgICAgICAgZHByaW50Zl93aW4oIHN0ZGRlYiwgIlJlZHJhd1dpbmRvdzogIk5QRk1UIiBOVUxMICJOUEZNVCIgZmxhZ3M9JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgIGh3bmQsIGhyZ25VcGRhdGUsIGZsYWdzKTsKICAgICB9CiAgICAgR2V0Q2xpZW50UmVjdCggaHduZCwgJnJlY3RDbGllbnQgKTsKQEAgLTIzOSw3ICsyNTAsNyBAQAogICAgICAgICAgICAgICAgIGlmICghKHduZFB0ci0+ZHdTdHlsZSAmIFdTX01JTklNSVpFKQogICAgICAgICAgICAgICAgICAgICB8fCAhV0lOX0NMQVNTX0lORk8od25kUHRyKS5oSWNvbikKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChTZW5kTWVzc2FnZSggaHduZCwgV01fRVJBU0VCS0dORCwgaGRjLCAwICkpCisgICAgICAgICAgICAgICAgICAgIGlmIChTZW5kTWVzc2FnZSggaHduZCwgV01fRVJBU0VCS0dORCwgKFdQQVJBTSloZGMsIDAgKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHduZFB0ci0+ZmxhZ3MgJj0gfldJTl9ORUVEU19FUkFTRUJLR05EOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBSZWxlYXNlREMoIGh3bmQsIGhkYyApOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9wcm9wZXJ0eS5jIGIvd2luZG93cy9wcm9wZXJ0eS5jCmluZGV4IGYzZTg4YmEuLjYwMTYxNWYgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvcHJvcGVydHkuYworKysgYi93aW5kb3dzL3Byb3BlcnR5LmMKQEAgLTMxLDcgKzMxLDcgQEAKICAgICBQUk9QRVJUWSAqcHJvcDsKICAgICBXTkQgKnduZFB0cjsKIAotICAgIGRwcmludGZfcHJvcCggc3RkZGViLCAiU2V0UHJvcDogJTA0eCAlMDhseCAlMDR4XG4iLCBod25kLCBzdHIsIGhEYXRhICk7CisgICAgZHByaW50Zl9wcm9wKCBzdGRkZWIsICJTZXRQcm9wOiAiTlBGTVQiICUwOGx4ICJOUEZNVCJcbiIsIGh3bmQsIHN0ciwgaERhdGEgKTsKICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuIEZBTFNFOwogICAgIGhQcm9wID0gVVNFUl9IRUFQX0FMTE9DKCBzaXplb2YoUFJPUEVSVFkpICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChISVdPUkQoc3RyKSA/IHN0cmxlbihQVFJfU0VHX1RPX0xJTihzdHIpKSA6IDAgKSk7CkBAIC02Miw3ICs2Miw3IEBACiAgICAgSEFORExFIGhQcm9wOwogICAgIFdORCAqd25kUHRyOwogCi0gICAgZHByaW50Zl9wcm9wKCBzdGRkZWIsICJHZXRQcm9wOiAlMDR4ICUwOGx4XG4iLCBod25kLCBzdHIgKTsKKyAgICBkcHJpbnRmX3Byb3AoIHN0ZGRlYiwgIkdldFByb3A6ICJOUEZNVCIgJTA4bHhcbiIsIGh3bmQsIHN0ciApOwogICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gMDsKICAgICBoUHJvcCA9IHduZFB0ci0+aFByb3A7CiAgICAgd2hpbGUgKGhQcm9wKQpAQCAtODgsNyArODgsNyBAQAogICAgIEhBTkRMRSAqaFByb3A7CiAgICAgV05EICp3bmRQdHI7CiAKLSAgICBkcHJpbnRmX3Byb3AoIHN0ZGRlYiwgIlJlbW92ZVByb3A6ICUwNHggJTA4bHhcbiIsIGh3bmQsIHN0ciApOworICAgIGRwcmludGZfcHJvcCggc3RkZGViLCAiUmVtb3ZlUHJvcDogIk5QRk1UIiAlMDhseFxuIiwgaHduZCwgc3RyICk7CiAgICAgaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpIHJldHVybiAwOwogICAgIGhQcm9wID0gJnduZFB0ci0+aFByb3A7CiAgICAgd2hpbGUgKCpoUHJvcCkKQEAgLTExOSwyMyArMTE5LDI1IEBACiAgICAgSEFORExFIGhQcm9wOwogICAgIFdORCAqd25kUHRyOwogCi0gICAgZHByaW50Zl9wcm9wKCBzdGRkZWIsICJFbnVtUHJvcHM6ICUwNHggJTA4bHhcbiIsIGh3bmQsIChMT05HKWZ1bmMgKTsKKyAgICBkcHJpbnRmX3Byb3AoIHN0ZGRlYiwgIkVudW1Qcm9wczogIk5QRk1UIiAlMDhseFxuIiwgaHduZCwgKExPTkcpZnVuYyApOwogICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gMDsKICAgICBoUHJvcCA9IHduZFB0ci0+aFByb3A7CiAgICAgd2hpbGUgKGhQcm9wKQogICAgIHsKICAgICAgICAgUFJPUEVSVFkgKnByb3AgPSAoUFJPUEVSVFkgKilVU0VSX0hFQVBfTElOX0FERFIoaFByb3ApOwogICAgICAgICAKLSAgICAgICAgZHByaW50Zl9wcm9wKCBzdGRkZWIsICIgIENhbGxiYWNrOiBhdG9tPSUwNHggZGF0YT0lMDR4IHN0cj0nJXMnXG4iLAorICAgICAgICBkcHJpbnRmX3Byb3AoIHN0ZGRlYiwgIiAgQ2FsbGJhY2s6IGF0b209JTA0eCBkYXRhPSJOUEZNVCIgc3RyPSclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgcHJvcC0+YXRvbSwgcHJvcC0+aERhdGEsIHByb3AtPnN0cmluZyApOwogCiAgICAgICAgICAgLyogQWxyZWFkeSBnZXQgdGhlIG5leHQgaW4gY2FzZSB0aGUgY2FsbGJhY2sgKi8KICAgICAgICAgICAvKiBmdW5jdGlvbiByZW1vdmVzIHRoZSBjdXJyZW50IHByb3BlcnR5LiAgICAqLwogICAgICAgICBoUHJvcCA9IHByb3AtPm5leHQ7CiAgICAgICAgIHJldCA9IENhbGxFbnVtUHJvcFByb2MoIGZ1bmMsIGh3bmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AtPmF0b20gPyBNQUtFTE9ORyggcHJvcC0+YXRvbSwgMCApIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFUl9IRUFQX1NFR19BRERSKGhQcm9wKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50KXByb3AtPnN0cmluZyAtIChpbnQpcHJvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AtPmF0b20gPyAKKwkJCQkgIChMT05HKU1BS0VMT05HKCBwcm9wLT5hdG9tLCAwICkKKwkJCQk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExPTkcpKFVTRVJfSEVBUF9TRUdfQUREUihoUHJvcCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludClwcm9wLT5zdHJpbmcgLSAoaW50KXByb3ApKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC0+aERhdGEgKTsKICAgICAgICAgaWYgKCFyZXQpIGJyZWFrOwogICAgIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvdGltZXIuYyBiL3dpbmRvd3MvdGltZXIuYwppbmRleCA4OGI3MDczLi43OTdmNjZlIDEwMDY0NAotLS0gYS93aW5kb3dzL3RpbWVyLmMKKysrIGIvd2luZG93cy90aW1lci5jCkBAIC0xMTQsOCArMTE0LDggQEAKIAlUSU1FUl9SZXN0YXJ0VGltZXIoIHBUaW1lciwgY3VyVGltZSApOwogICAgIH0KIAotICAgIGRwcmludGZfdGltZXIoc3RkZGViLCAiVGltZXIgZXhwaXJlZDogJXAsICUwNHgsICUwNHgsICUwNHgsICUwOGx4XG4iLCAKLQkJICBwVGltZXIsIHBUaW1lci0+aHduZCwgcFRpbWVyLT5tc2csIHBUaW1lci0+aWQsIHBUaW1lci0+cHJvYyk7CisgICAgZHByaW50Zl90aW1lcihzdGRkZWIsICJUaW1lciBleHBpcmVkOiAlcCwgIk5QRk1UIiwgJTA0eCwgJTA0eCwgJTA4bHhcbiIsIAorCQkgIHBUaW1lciwgcFRpbWVyLT5od25kLCBwVGltZXItPm1zZywgcFRpbWVyLT5pZCwgKERXT1JEKXBUaW1lci0+cHJvYyk7CiAgICAgICAvKiBCdWlsZCB0aGUgbWVzc2FnZSAqLwogICAgIG1zZy0+aHduZCAgICA9IHBUaW1lci0+aHduZDsKICAgICBtc2ctPm1lc3NhZ2UgPSBwVGltZXItPm1zZzsKQEAgLTE3MCw4ICsxNzAsOCBAQAogICAgIHBUaW1lci0+dGltZW91dCA9IHRpbWVvdXQ7CiAgICAgcFRpbWVyLT5leHBpcmVzID0gR2V0VGlja0NvdW50KCkgKyB0aW1lb3V0OwogICAgIHBUaW1lci0+cHJvYyAgICA9IHByb2M7Ci0gICAgZHByaW50Zl90aW1lcihzdGRkZWIsICJUaW1lciBhZGRlZDogJXAsICUwNHgsICUwNHgsICUwNHgsICUwOGx4XG4iLCAKLQkJICBwVGltZXIsIHBUaW1lci0+aHduZCwgcFRpbWVyLT5tc2csIHBUaW1lci0+aWQsIHBUaW1lci0+cHJvYyk7CisgICAgZHByaW50Zl90aW1lcihzdGRkZWIsICJUaW1lciBhZGRlZDogJXAsICJOUEZNVCIsICUwNHgsICUwNHgsICUwOGx4XG4iLCAKKwkJICBwVGltZXIsIHBUaW1lci0+aHduZCwgcFRpbWVyLT5tc2csIHBUaW1lci0+aWQsIChEV09SRClwVGltZXItPnByb2MpOwogICAgIFRJTUVSX0luc2VydFRpbWVyKCBwVGltZXIgKTsKICAgICBNU0dfSW5jVGltZXJDb3VudCggR2V0VGFza1F1ZXVlKDApICk7CiAgICAgaWYgKCFpZCkKQEAgLTIxNyw3ICsyMTcsNyBAQAogICovCiBXT1JEIFNldFRpbWVyKCBIV05EIGh3bmQsIFdPUkQgaWQsIFdPUkQgdGltZW91dCwgRkFSUFJPQyBwcm9jICkKIHsKLSAgICBkcHJpbnRmX3RpbWVyKHN0ZGRlYiwgIlNldFRpbWVyOiAlZCAlZCAlZCAlMDhseFxuIiwgaHduZCwgaWQsIHRpbWVvdXQsIChMT05HKXByb2MgKTsKKyAgICBkcHJpbnRmX3RpbWVyKHN0ZGRlYiwgIlNldFRpbWVyOiAiTlBGTVQiICVkICVkICUwOGx4XG4iLCBod25kLCBpZCwgdGltZW91dCwgKExPTkcpcHJvYyApOwogICAgIHJldHVybiBUSU1FUl9TZXRUaW1lciggaHduZCwgaWQsIHRpbWVvdXQsIHByb2MsIEZBTFNFICk7CiB9CiAKQEAgLTIyNyw3ICsyMjcsNyBAQAogICovCiBXT1JEIFNldFN5c3RlbVRpbWVyKCBIV05EIGh3bmQsIFdPUkQgaWQsIFdPUkQgdGltZW91dCwgRkFSUFJPQyBwcm9jICkKIHsKLSAgICBkcHJpbnRmX3RpbWVyKHN0ZGRlYiwgIlNldFN5c3RlbVRpbWVyOiAlZCAlZCAlZCAlMDhseFxuIiwgCisgICAgZHByaW50Zl90aW1lcihzdGRkZWIsICJTZXRTeXN0ZW1UaW1lcjogIk5QRk1UIiAlZCAlZCAlMDhseFxuIiwgCiAJCSAgaHduZCwgaWQsIHRpbWVvdXQsIChMT05HKXByb2MgKTsKICAgICByZXR1cm4gVElNRVJfU2V0VGltZXIoIGh3bmQsIGlkLCB0aW1lb3V0LCBwcm9jLCBUUlVFICk7CiB9CkBAIC0yMzgsNyArMjM4LDcgQEAKICAqLwogQk9PTCBLaWxsVGltZXIoIEhXTkQgaHduZCwgV09SRCBpZCApCiB7Ci0gICAgZHByaW50Zl90aW1lcihzdGRkZWIsICJLaWxsVGltZXI6ICVkICVkXG4iLCBod25kLCBpZCApOworICAgIGRwcmludGZfdGltZXIoc3RkZGViLCAiS2lsbFRpbWVyOiAiTlBGTVQiICVkXG4iLCBod25kLCBpZCApOwogICAgIHJldHVybiBUSU1FUl9LaWxsVGltZXIoIGh3bmQsIGlkLCBGQUxTRSApOwogfQogCkBAIC0yNDgsNiArMjQ4LDYgQEAKICAqLwogQk9PTCBLaWxsU3lzdGVtVGltZXIoIEhXTkQgaHduZCwgV09SRCBpZCApCiB7Ci0gICAgZHByaW50Zl90aW1lcihzdGRkZWIsICJLaWxsU3lzdGVtVGltZXI6ICVkICVkXG4iLCBod25kLCBpZCApOworICAgIGRwcmludGZfdGltZXIoc3RkZGViLCAiS2lsbFN5c3RlbVRpbWVyOiAiTlBGTVQiICVkXG4iLCBod25kLCBpZCApOwogICAgIHJldHVybiBUSU1FUl9LaWxsVGltZXIoIGh3bmQsIGlkLCBUUlVFICk7CiB9CmRpZmYgLS1naXQgYS93aW5kb3dzL3V0aWxpdHkuYyBiL3dpbmRvd3MvdXRpbGl0eS5jCmluZGV4IDYxZGYwY2IuLjg4MzgzOTQgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvdXRpbGl0eS5jCisrKyBiL3dpbmRvd3MvdXRpbGl0eS5jCkBAIC00MjMsMyArNDIzLDI1IEBACiAJZnJlZShuZXdhcmdzKTsKIAlyZXR1cm4gcmVzdWx0OwogfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcmFnRGV0ZWN0ICggVVNFUi40NjUgKQorICoKKyAqIEhhcmRseSBldmVyIGNhbGxlZCBhdCBhbGwKKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ09iamVjdCAoIFVTRVIuNDY0ICkKKyAqCisgKiByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGlvbiBvZiBXTV9RVUVSWURST1BPQkpFQ1QsIFdNX0RSQUdMT09QLCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdNX0RSQUdNT1ZFLCAgICAgICAgV01fRFJPUE9CSkVDVAorICovCitMT05HIERyYWdPYmplY3QoSFdORCBoRGVza3RvcCwgSFdORCBoV25kLCBVSU5UIFVua25vd24xLCBXT1JEIFVua25vd24yLCBXT1JEIFVua25vd24zLCBIQ1VSU09SIGhDdXJzb3IpCit7CisKKyBmcHJpbnRmKHN0ZG5pbXAsIkRyYWdPYmplY3Q6IEVtcHR5U3R1YiEhIVxuIik7CisgcmV0dXJuIDA7Cit9CisgCisKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2luLmMgYi93aW5kb3dzL3dpbi5jCmluZGV4IGQ3ZTJkMmQuLjE2NGI1NjMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2luLmMKKysrIGIvd2luZG93cy93aW4uYwpAQCAtMTQsOCArMTQsNyBAQAogI2luY2x1ZGUgImRjZS5oIgogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKICNpbmNsdWRlICJtZW51LmgiCi0jaW5jbHVkZSAiaWNvbi5oIgotI2luY2x1ZGUgImN1cnNvci5oIgorI2luY2x1ZGUgImN1cnNvcmljb24uaCIKICNpbmNsdWRlICJldmVudC5oIgogI2luY2x1ZGUgIm1lc3NhZ2UuaCIKICNpbmNsdWRlICJub25jbGllbnQuaCIKQEAgLTE0MCw3ICsxMzksNyBAQAogICAgIGZvciAoIDsgaHduZCAhPSAwOyBod25kID0gd25kUHRyLT5od25kTmV4dCApCiAgICAgewogCWlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gMDsKLQlkcHJpbnRmX3dpbiggc3RkZGViLCAiV0lOX0ZpbmRXaW5Ub1JlcGFpbnQ6ICUwNHgsIHN0eWxlICUwOGx4XG4iLAorCWRwcmludGZfd2luKCBzdGRkZWIsICJXSU5fRmluZFdpblRvUmVwYWludDogIk5QRk1UIiwgc3R5bGUgJTA4bHhcbiIsCiAJCSAgICAgaHduZCwgd25kUHRyLT5kd1N0eWxlICk7CiAgICAgICAgIGlmICghKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEUpIHx8ICh3bmRQdHItPmZsYWdzICYgV0lOX05PX1JFRFJBVykpCiAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTE2NSwxNiArMTY0LDIyIEBACiAgKiBTZW5kIGEgV01fUEFSRU5UTk9USUZZIHRvIGFsbCBhbmNlc3RvcnMgb2YgdGhlIGdpdmVuIHdpbmRvdywgdW5sZXNzCiAgKiB0aGUgd2luZG93IGhhcyB0aGUgV1NfRVhfTk9QQVJFTlROT1RJRlkgc3R5bGUuCiAgKi8KLXZvaWQgV0lOX1NlbmRQYXJlbnROb3RpZnkoIEhXTkQgaHduZCwgV09SRCBldmVudCwgTE9ORyBsUGFyYW0gKQordm9pZCBXSU5fU2VuZFBhcmVudE5vdGlmeSggSFdORCBod25kLCBXT1JEIGV2ZW50LCBXT1JEIGlkQ2hpbGQsIExPTkcgbFZhbHVlICkKIHsKICAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAgICAgCiAgICAgd2hpbGUgKHduZFB0ciAmJiAod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpKQogICAgIHsKICAgICAgICAgaWYgKHduZFB0ci0+ZHdFeFN0eWxlICYgV1NfRVhfTk9QQVJFTlROT1RJRlkpIGJyZWFrOwotCVNlbmRNZXNzYWdlKCB3bmRQdHItPmh3bmRQYXJlbnQsIFdNX1BBUkVOVE5PVElGWSwgZXZlbnQsIGxQYXJhbSApOworI2lmZGVmIFdJTkVMSUIzMgorCVNlbmRNZXNzYWdlKCB3bmRQdHItPmh3bmRQYXJlbnQsIFdNX1BBUkVOVE5PVElGWSwgCisJCSAgICAgTUFLRVdQQVJBTShldmVudCxpZENoaWxkKSwKKwkJICAgICAoTFBBUkFNKWxWYWx1ZSApOworI2Vsc2UKKwlTZW5kTWVzc2FnZSggd25kUHRyLT5od25kUGFyZW50LCBXTV9QQVJFTlROT1RJRlksIGV2ZW50LAorCQkgICAgIE1BS0VMUEFSQU0oTE9XT1JEKGxWYWx1ZSksIGlkQ2hpbGQpICk7CisjZW5kaWYKICAgICAgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIHduZFB0ci0+aHduZFBhcmVudCApOwotCiAgICAgfQogfQogCkBAIC0yNjksNyArMjc0LDcgQEAKICAgICBTZW5kTWVzc2FnZSggaHduZERlc2t0b3AsIFdNX05DQ1JFQVRFLCAwLCAwICk7CiAgICAgaWYgKChoZGMgPSBHZXREQyggaHduZERlc2t0b3AgKSkgIT0gMCkKICAgICB7Ci0gICAgICAgIFNlbmRNZXNzYWdlKCBod25kRGVza3RvcCwgV01fRVJBU0VCS0dORCwgaGRjLCAwICk7CisgICAgICAgIFNlbmRNZXNzYWdlKCBod25kRGVza3RvcCwgV01fRVJBU0VCS0dORCwgKFdQQVJBTSloZGMsIDAgKTsKICAgICAgICAgUmVsZWFzZURDKCBod25kRGVza3RvcCwgaGRjICk7CiAgICAgfQogICAgIHJldHVybiBUUlVFOwpAQCAtMzE1LDkgKzMyMCw5IEBACiAgICAgZWxzZQogICAgICAgICBkcHJpbnRmX3dpbiggc3RkZGViLCAiJTA0eCAiLCBMT1dPUkQoY2xhc3NOYW1lKSApOwogCi0gICAgZHByaW50Zl93aW4oc3RkZGViLCAiJTA4bHggJTA4bHggJWQsJWQgJWR4JWQgJTA0eCAlMDR4ICUwNHggJTA4bHhcbiIsCisgICAgZHByaW50Zl93aW4oc3RkZGViLCAiJTA4bHggJTA4bHggJWQsJWQgJWR4JWQgIk5QRk1UIiAiTlBGTVQiICJOUEZNVCIgJTA4bHhcbiIsCiAJCWV4U3R5bGUsIHN0eWxlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LAotCQlwYXJlbnQsIG1lbnUsIGluc3RhbmNlLCBkYXRhKTsKKwkJcGFyZW50LCBtZW51LCBpbnN0YW5jZSwgKERXT1JEKWRhdGEpOwogCiAgICAgaWYgKHggPT0gQ1dfVVNFREVGQVVMVCkgeCA9IHkgPSAwOwogICAgIGlmICh3aWR0aCA9PSBDV19VU0VERUZBVUxUKQpAQCAtMzMyLDcgKzMzNyw3IEBACiAgICAgewogCS8qIE1ha2Ugc3VyZSBwYXJlbnQgaXMgdmFsaWQgKi8KICAgICAgICAgaWYgKCFJc1dpbmRvdyggcGFyZW50ICkpIHsKLQkgICAgZHByaW50Zl93aW4oc3RkZGViLCJDcmVhdGVXaW5kb3dFeDogUGFyZW50ICV4IGlzIG5vdCBhIHdpbmRvd1xuIiwgcGFyZW50KTsKKwkgICAgZHByaW50Zl93aW4oc3RkZGViLCJDcmVhdGVXaW5kb3dFeDogUGFyZW50ICJOUEZNVCIgaXMgbm90IGEgd2luZG93XG4iLCBwYXJlbnQpOwogCSAgICByZXR1cm4gMDsKIAl9CiAgICAgfQpAQCAtNDM2LDExICs0NDEsNiBAQAogCiAgICAgaWYgKCEoc3R5bGUgJiBXU19DSElMRCkgJiYgKHJvb3RXaW5kb3cgPT0gRGVmYXVsdFJvb3RXaW5kb3coZGlzcGxheSkpKQogICAgIHsKLSAgICAgICAgQ1VSU09SQUxMT0MgKmN1cnNvcjsKLSAgICAgICAgSENVUlNPUiBoQ3Vyc29yID0gY2xhc3NQdHItPndjLmhDdXJzb3I7Ci0gICAgICAgIGlmICghaEN1cnNvcikgaEN1cnNvciA9IExvYWRDdXJzb3IoIDAsIElEQ19BUlJPVyApOwotICAgICAgICBjdXJzb3IgPSAoQ1VSU09SQUxMT0MgKikgR2xvYmFsTG9jayhoQ3Vyc29yKTsKLQogICAgICAgICB3aW5fYXR0ci5ldmVudF9tYXNrID0gRXhwb3N1cmVNYXNrIHwgS2V5UHJlc3NNYXNrIHwgS2V5UmVsZWFzZU1hc2sgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlck1vdGlvbk1hc2sgfCBCdXR0b25QcmVzc01hc2sgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnV0dG9uUmVsZWFzZU1hc2sgfCBGb2N1c0NoYW5nZU1hc2s7CkBAIC00NDgsNyArNDQ4LDcgQEAKICAgICAgICAgd2luX2F0dHIuY29sb3JtYXAgICAgICA9IENPTE9SX1dpbkNvbG9ybWFwOwogICAgICAgICB3aW5fYXR0ci5iYWNraW5nX3N0b3JlID0gT3B0aW9ucy5iYWNraW5nc3RvcmUgPyBXaGVuTWFwcGVkIDogTm90VXNlZnVsOwogICAgICAgICB3aW5fYXR0ci5zYXZlX3VuZGVyICAgID0gKChjbGFzc1B0ci0+d2Muc3R5bGUgJiBDU19TQVZFQklUUykgIT0gMCk7Ci0gICAgICAgIHdpbl9hdHRyLmN1cnNvciAgICAgICAgPSBjdXJzb3IgPyBjdXJzb3ItPnhjdXJzb3IgOiBOb25lOworICAgICAgICB3aW5fYXR0ci5jdXJzb3IgICAgICAgID0gQ1VSU09SSUNPTl9YQ3Vyc29yOwogICAgICAgICB3bmRQdHItPndpbmRvdyA9IFhDcmVhdGVXaW5kb3coIGRpc3BsYXksIHJvb3RXaW5kb3csIHgsIHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgMCwgQ29weUZyb21QYXJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRPdXRwdXQsIENvcHlGcm9tUGFyZW50LApAQCAtNDU3LDcgKzQ1Nyw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1dCYWNraW5nU3RvcmUsICZ3aW5fYXR0ciApOwogICAgICAgICBYU3RvcmVOYW1lKCBkaXNwbGF5LCB3bmRQdHItPndpbmRvdywgUFRSX1NFR19UT19MSU4od2luZG93TmFtZSkgKTsKICAgICAgICAgRVZFTlRfUmVnaXN0ZXJXaW5kb3coIHduZFB0ci0+d2luZG93LCBod25kICk7Ci0gICAgICAgIEdsb2JhbFVubG9jayggaEN1cnNvciApOwogICAgIH0KICAgICAKICAgICBpZiAoKHN0eWxlICYgV1NfQ0FQVElPTikgJiYgIShzdHlsZSAmIFdTX0NISUxEKSkKQEAgLTUwNyw3ICs1MDYsNyBAQAogICAgICAgLyogQ3JlYXRlIGEgY29weSBvZiBTeXNNZW51ICovCiAgICAgaWYgKHN0eWxlICYgV1NfU1lTTUVOVSkgd25kUHRyLT5oU3lzTWVudSA9IENvcHlTeXNNZW51KCk7CiAKLSAgICBXSU5fU2VuZFBhcmVudE5vdGlmeSggaHduZCwgV01fQ1JFQVRFLCBNQUtFTE9ORyggaHduZCwgd25kUHRyLT53SURtZW51ICkgKTsKKyAgICBXSU5fU2VuZFBhcmVudE5vdGlmeSggaHduZCwgV01fQ1JFQVRFLCB3bmRQdHItPndJRG1lbnUsIChMT05HKWh3bmQgKTsKIAogICAgIC8qIFNob3cgdGhlIHdpbmRvdywgbWF4aW1pemluZyBvciBtaW5pbWl6aW5nIGlmIG5lZWRlZCAqLwogCkBAIC01MjgsNyArNTI3LDcgQEAKICAgICB9CiAgICAgZWxzZSBpZiAoc3R5bGUgJiBXU19WSVNJQkxFKSBTaG93V2luZG93KCBod25kLCBTV19TSE9XICk7CiAKLSAgICBkcHJpbnRmX3dpbihzdGRkZWIsICJDcmVhdGVXaW5kb3dFeDogcmV0dXJuICUwNFggXG4iLCBod25kKTsKKyAgICBkcHJpbnRmX3dpbihzdGRkZWIsICJDcmVhdGVXaW5kb3dFeDogcmV0dXJuICJOUEZNVCIgXG4iLCBod25kKTsKICAgICByZXR1cm4gaHduZDsKIH0KIApAQCAtNTQxLDcgKzU0MCw3IEBACiAgICAgV05EICogd25kUHRyOwogICAgIENMQVNTICogY2xhc3NQdHI7CiAKLSAgICBkcHJpbnRmX3dpbihzdGRkZWIsICJEZXN0cm95V2luZG93ICglMDR4KVxuIiwgaHduZCk7CisgICAgZHByaW50Zl93aW4oc3RkZGViLCAiRGVzdHJveVdpbmRvdyAoIk5QRk1UIilcbiIsIGh3bmQpOwogICAgIAogICAgICAgLyogSW5pdGlhbGlzYXRpb24gKi8KIApAQCAtNTU2LDcgKzU1NSw3IEBACiAJCSAgICAgIFNXUF9OT1pPUkRFUiB8IFNXUF9OT01PVkUgfCBTV1BfTk9TSVpFICk7CiAgICAgaWYgKChod25kID09IEdldENhcHR1cmUoKSkgfHwgSXNDaGlsZCggaHduZCwgR2V0Q2FwdHVyZSgpICkpCiAJUmVsZWFzZUNhcHR1cmUoKTsKLSAgICBXSU5fU2VuZFBhcmVudE5vdGlmeSggaHduZCwgV01fREVTVFJPWSwgTUFLRUxPTkcoaHduZCwgd25kUHRyLT53SURtZW51KSApOworICAgIFdJTl9TZW5kUGFyZW50Tm90aWZ5KCBod25kLCBXTV9ERVNUUk9ZLCB3bmRQdHItPndJRG1lbnUsIChMT05HKWh3bmQgKTsKIAogICAgICAgLyogUmVjdXJzaXZlbHkgZGVzdHJveSBvd25lZCB3aW5kb3dzICovCiAKQEAgLTYyMCw3ICs2MTksOCBAQAogCiAgICAgaWYgKENsYXNzTWF0Y2gpCiAgICAgewotCWhjbGFzcyA9IENMQVNTX0ZpbmRDbGFzc0J5TmFtZSggQ2xhc3NNYXRjaCwgMHhmZmZmLCAmY2xhc3NQdHIgKTsKKwloY2xhc3MgPSBDTEFTU19GaW5kQ2xhc3NCeU5hbWUoIENsYXNzTWF0Y2gsIChISU5TVEFOQ0UpMHhmZmZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGFzc1B0ciApOwogCWlmICghaGNsYXNzKSByZXR1cm4gMDsKICAgICB9CiAgICAgZWxzZSBoY2xhc3MgPSAwOwpAQCAtNzA4LDE0ICs3MDgsMzIgQEAKICAgICBzd2l0Y2gob2Zmc2V0KQogICAgIHsKIAljYXNlIEdXV19JRDogICAgICAgICByZXR1cm4gd25kUHRyLT53SURtZW51OwotCWNhc2UgR1dXX0hXTkRQQVJFTlQ6IHJldHVybiB3bmRQdHItPmh3bmRQYXJlbnQ7Ci0JY2FzZSBHV1dfSElOU1RBTkNFOiAgcmV0dXJuIHduZFB0ci0+aEluc3RhbmNlOworI2lmZGVmIFdJTkVMSUIzMgorICAgICAgICBjYXNlIEdXV19IV05EUEFSRU5UOgorICAgICAgICBjYXNlIEdXV19ISU5TVEFOQ0U6IAorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkdldFdpbmRvd1dvcmQgY2FsbGVkIHdpdGggb2Zmc2V0ICVkLlxuIixvZmZzZXQpOworICAgICAgICAgICAgcmV0dXJuIDA7CisjZWxzZQorCWNhc2UgR1dXX0hXTkRQQVJFTlQ6IHJldHVybiAoV09SRCl3bmRQdHItPmh3bmRQYXJlbnQ7CisJY2FzZSBHV1dfSElOU1RBTkNFOiAgcmV0dXJuIChXT1JEKXduZFB0ci0+aEluc3RhbmNlOworI2VuZGlmCiAgICAgfQogICAgIHJldHVybiAwOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgIFdJTl9HZXRXaW5kb3dJbnN0YW5jZQorICovCitISU5TVEFOQ0UgV0lOX0dldFdpbmRvd0luc3RhbmNlKEhXTkQgaHduZCkKK3sKKyAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOworICAgIGlmICghd25kUHRyKSByZXR1cm4gKEhJTlNUQU5DRSkwOworICAgIHJldHVybiB3bmRQdHItPmhJbnN0YW5jZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJICAgICBTZXRXaW5kb3dXb3JkICAgIChVU0VSLjEzNCkKICAqLwogV09SRCBTZXRXaW5kb3dXb3JkKCBIV05EIGh3bmQsIHNob3J0IG9mZnNldCwgV09SRCBuZXd2YWwgKQpAQCAtNzI3LDcgKzc0NSwxMyBAQAogICAgIGVsc2Ugc3dpdGNoKG9mZnNldCkKICAgICB7CiAJY2FzZSBHV1dfSUQ6ICAgICAgICBwdHIgPSAmd25kUHRyLT53SURtZW51OyAgIGJyZWFrOwotCWNhc2UgR1dXX0hJTlNUQU5DRTogcHRyID0gJnduZFB0ci0+aEluc3RhbmNlOyBicmVhazsKKyNpZmRlZiBXSU5FTElCMzIKKwljYXNlIEdXV19ISU5TVEFOQ0U6CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiU2V0V2luZG93V29yZCBjYWxsZWQgd2l0aCBvZmZzZXQgJWQuXG4iLG9mZnNldCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyNlbHNlCisJY2FzZSBHV1dfSElOU1RBTkNFOiBwdHIgPSAoV09SRCopJnduZFB0ci0+aEluc3RhbmNlOyBicmVhazsKKyNlbmRpZgogCWRlZmF1bHQ6IHJldHVybiAwOwogICAgIH0KICAgICByZXR2YWwgPSAqcHRyOwpAQCAtNzQ5LDYgKzc3MywxMCBAQAogCWNhc2UgR1dMX1NUWUxFOiAgIHJldHVybiB3bmRQdHItPmR3U3R5bGU7CiAgICAgICAgIGNhc2UgR1dMX0VYU1RZTEU6IHJldHVybiB3bmRQdHItPmR3RXhTdHlsZTsKIAljYXNlIEdXTF9XTkRQUk9DOiByZXR1cm4gKExPTkcpd25kUHRyLT5scGZuV25kUHJvYzsKKyNpZmRlZiBXSU5FTElCMzIKKwljYXNlIEdXV19IV05EUEFSRU5UOiByZXR1cm4gKExPTkcpd25kUHRyLT5od25kUGFyZW50OworCWNhc2UgR1dXX0hJTlNUQU5DRTogIHJldHVybiAoTE9ORyl3bmRQdHItPmhJbnN0YW5jZTsKKyNlbmRpZgogICAgIH0KICAgICByZXR1cm4gMDsKIH0KQEAgLTc5Myw4ICs4MjEsOCBAQAogICAgICAgLyogV2UgaGF2ZSB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBvbiB0aGUgVVNFUiBoZWFwICovCiAgICAgICAvKiB0byBiZSBhYmxlIHRvIHBhc3MgaXRzIGFkZHJlc3MgdG8gMTYtYml0IGNvZGUgKi8KICAgICBpZiAoIShoYW5kbGUgPSBVU0VSX0hFQVBfQUxMT0MoIG5NYXhDb3VudCApKSkgcmV0dXJuIDA7Ci0gICAgbGVuID0gKGludClTZW5kTWVzc2FnZSggaHduZCwgV01fR0VUVEVYVCwgKFdPUkQpbk1heENvdW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VSX0hFQVBfU0VHX0FERFIoaGFuZGxlKSApOworICAgIGxlbiA9IChpbnQpU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX0dFVFRFWFQsIChXUEFSQU0pbk1heENvdW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKVVTRVJfSEVBUF9TRUdfQUREUihoYW5kbGUpICk7CiAgICAgc3RybmNweSggbHBTdHJpbmcsIFVTRVJfSEVBUF9MSU5fQUREUihoYW5kbGUpLCBuTWF4Q291bnQgKTsKICAgICBVU0VSX0hFQVBfRlJFRSggaGFuZGxlICk7CiAgICAgcmV0dXJuIGxlbjsKQEAgLTgxNyw3ICs4NDUsNyBAQAogICAgICAgLyogdG8gYmUgYWJsZSB0byBwYXNzIGl0cyBhZGRyZXNzIHRvIDE2LWJpdCBjb2RlICovCiAgICAgaWYgKCEoaGFuZGxlID0gVVNFUl9IRUFQX0FMTE9DKCBzdHJsZW4obHBTdHJpbmcpKzEgKSkpIHJldHVybjsKICAgICBzdHJjcHkoIFVTRVJfSEVBUF9MSU5fQUREUihoYW5kbGUpLCBscFN0cmluZyApOwotICAgIFNlbmRNZXNzYWdlKCBod25kLCBXTV9TRVRURVhULCAwLCBVU0VSX0hFQVBfU0VHX0FERFIoaGFuZGxlKSApOworICAgIFNlbmRNZXNzYWdlKCBod25kLCBXTV9TRVRURVhULCAwLCAoTFBBUkFNKVVTRVJfSEVBUF9TRUdfQUREUihoYW5kbGUpICk7CiAgICAgVVNFUl9IRUFQX0ZSRUUoIGhhbmRsZSApOwogfQogCkBAIC0xMTk3LDcgKzEyMjUsNyBAQAogewogCUhXTkQgaFduZE9sZE1vZGFsID0gaFduZFN5c01vZGFsOwogCWhXbmRTeXNNb2RhbCA9IGhXbmQ7Ci0JZHByaW50Zl93aW4oc3RkbmltcCwiRU1QVFkgU1RVQiAhISBTZXRTeXNNb2RhbFdpbmRvdyglMDRYKSAhXG4iLCBoV25kKTsKKwlkcHJpbnRmX3dpbihzdGRuaW1wLCJFTVBUWSBTVFVCICEhIFNldFN5c01vZGFsV2luZG93KCJOUEZNVCIpICFcbiIsIGhXbmQpOwogCXJldHVybiBoV25kT2xkTW9kYWw7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2lucG9zLmMgYi93aW5kb3dzL3dpbnBvcy5jCmluZGV4IDVlZjllNDUuLjMyY2EyMWM2IDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbnBvcy5jCisrKyBiL3dpbmRvd3Mvd2lucG9zLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSAic3lzbWV0cmljcy5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJ3aW4uaCIKKyNpbmNsdWRlICJldmVudC5oIgogI2luY2x1ZGUgIm1lc3NhZ2UuaCIKICNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCiAjaW5jbHVkZSAid2lucG9zLmgiCkBAIC0zMDksNyArMzEwLDcgQEAKIHsgICAgCiAgICAgaW50IGZsYWdzID0gU1dQX05PWk9SREVSIHwgU1dQX05PQUNUSVZBVEU7CiAgICAgaWYgKCFyZXBhaW50KSBmbGFncyB8PSBTV1BfTk9SRURSQVc7Ci0gICAgZHByaW50Zl93aW4oc3RkZGViLCAiTW92ZVdpbmRvdzogJWQgJWQsJWQgJWR4JWQgJWRcbiIsIAorICAgIGRwcmludGZfd2luKHN0ZGRlYiwgIk1vdmVXaW5kb3c6ICJOUEZNVCIgJWQsJWQgJWR4JWQgJWRcbiIsIAogCSAgICBod25kLCB4LCB5LCBjeCwgY3ksIHJlcGFpbnQgKTsKICAgICByZXR1cm4gU2V0V2luZG93UG9zKCBod25kLCAwLCB4LCB5LCBjeCwgY3ksIGZsYWdzICk7CiB9CkBAIC0zMjgsNyArMzI5LDcgQEAKIAogICAgIGlmICghd25kUHRyKSByZXR1cm4gRkFMU0U7CiAKLSAgICBkcHJpbnRmX3dpbihzdGRkZWIsIlNob3dXaW5kb3c6IGh3bmQ9JTA0WCwgY21kPSVkXG4iLCBod25kLCBjbWQpOworICAgIGRwcmludGZfd2luKHN0ZGRlYiwiU2hvd1dpbmRvdzogaHduZD0iTlBGTVQiLCBjbWQ9JWRcbiIsIGh3bmQsIGNtZCk7CiAKICAgICB3YXNWaXNpYmxlID0gKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEUpICE9IDA7CiAKQEAgLTU0Miw4ICs1NDMsMTQgQEAKICAgICBpZiAoaHduZEFjdGl2ZSkKICAgICB7CiAJaWYgKCFTZW5kTWVzc2FnZSggaHduZEFjdGl2ZSwgV01fTkNBQ1RJVkFURSwgRkFMU0UsIDAgKSkgcmV0dXJuIDA7CisjaWZkZWYgV0lORUxJQjMyCisJU2VuZE1lc3NhZ2UoIGh3bmRBY3RpdmUsIFdNX0FDVElWQVRFLAorCQkgICAgIE1BS0VXUEFSQU0oIFdBX0lOQUNUSVZFLCBJc0ljb25pYyhod25kQWN0aXZlKSApLAorCQkgICAgIChMUEFSQU0paHduZCApOworI2Vsc2UKIAlTZW5kTWVzc2FnZSggaHduZEFjdGl2ZSwgV01fQUNUSVZBVEUsIFdBX0lOQUNUSVZFLAogCQkgICAgIE1BS0VMT05HKCBJc0ljb25pYyhod25kQWN0aXZlKSwgaHduZCApICk7CisjZW5kaWYKIAkvKiBTZW5kIFdNX0FDVElWQVRFQVBQIGhlcmUgKi8KICAgICB9CiAKQEAgLTU1NSw4ICs1NjIsMTUgQEAKIAogCS8qIFNlbmQgV01fQUNUSVZBVEVBUFAgaGVyZSAqLwogCVNlbmRNZXNzYWdlKCBod25kLCBXTV9OQ0FDVElWQVRFLCBUUlVFLCAwICk7CisjaWZkZWYgV0lORUxJQjMyCisJU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX0FDVElWQVRFLAorCQkgICAgIE1BS0VXUEFSQU0oIG1vdXNlTXNnID8gV0FfQ0xJQ0tBQ1RJVkUgOiBXQV9BQ1RJVkUsIAorCQkJCSBJc0ljb25pYyhod25kKSApCisJCSAgICAgLCAoTFBBUkFNKXByZXZBY3RpdmUgKTsKKyNlbHNlCiAJU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX0FDVElWQVRFLCBtb3VzZU1zZyA/IFdBX0NMSUNLQUNUSVZFIDogV0FfQUNUSVZFLAogCQkgICAgIE1BS0VMT05HKCBJc0ljb25pYyhod25kKSwgcHJldkFjdGl2ZSApICk7CisjZW5kaWYKICAgICB9CiAgICAgcmV0dXJuIHByZXZBY3RpdmU7CiB9CkBAIC05MTksNiArOTMzLDcgQEAKICAgICAgIC8qIFJlcGFpbnQgdGhlIHdpbmRvdyAqLwogCiAgICAgaWYgKHduZFB0ci0+d2luZG93KSBNU0dfU3luY2hyb25pemUoKTsgIC8qIFdhaXQgZm9yIGFsbCBleHBvc2UgZXZlbnRzICovCisgICAgRVZFTlRfRHVtbXlNb3Rpb25Ob3RpZnkoKTsgLyogU2ltdWxhdGUgYSBtb3VzZSBldmVudCB0byBzZXQgdGhlIGN1cnNvciAqLwogICAgIGlmICgoZmxhZ3MgJiBTV1BfRlJBTUVDSEFOR0VEKSAmJiAhKGZsYWdzICYgU1dQX05PUkVEUkFXKSkKICAgICAgICAgUmVkcmF3V2luZG93KCB3aW5wb3MuaHduZCwgTlVMTCwgMCwKICAgICAgICAgICAgICAgICAgICAgICBSRFdfSU5WQUxJREFURSB8IFJEV19GUkFNRSB8IFJEV19FUkFTRSApOwpAQCAtOTI4LDYgKzk0Myw4IEBACiAKICAgICAgIC8qIEFuZCBsYXN0LCBzZW5kIHRoZSBXTV9XSU5ET1dQT1NDSEFOR0VEIG1lc3NhZ2UgKi8KIAorICAgIHdpbnBvcy5mbGFncyB8PSBTV1BfTk9NT1ZFOyAvKiBwcmV2ZW50IGxvb3BpbmcuLiB3aW5kb3cgaXMgYWxyZWFkeSBtb3ZlZCA/Pz8gKEZJWE1FKSovCisKICAgICBpZiAoISh3aW5wb3MuZmxhZ3MgJiBTV1BfTk9TRU5EQ0hBTkdJTkcpKQogICAgICAgICBTZW5kTWVzc2FnZSggd2lucG9zLmh3bmQsIFdNX1dJTkRPV1BPU0NIQU5HRUQsCiAgICAgICAgICAgICAgICAgICAgICAwLCBNQUtFX1NFR1BUUigmd2lucG9zKSApOwpAQCAtMTA1Nyw3ICsxMDc0LDcgQEAKICAqLwogdm9pZCBUaWxlQ2hpbGRXaW5kb3dzKCBIV05EIHBhcmVudCwgV09SRCBhY3Rpb24gKQogewotICAgIHByaW50ZigiU1RVQiBUaWxlQ2hpbGRXaW5kb3dzKCUwNFgsICVkKVxuIiwgcGFyZW50LCBhY3Rpb24pOworICAgIHByaW50ZigiU1RVQiBUaWxlQ2hpbGRXaW5kb3dzKCJOUEZNVCIsICVkKVxuIiwgcGFyZW50LCBhY3Rpb24pOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEwNjUsNSArMTA4Miw1IEBACiAgKi8KIHZvaWQgQ2FzY2FkZUNoaWxkV2luZG93cyggSFdORCBwYXJlbnQsIFdPUkQgYWN0aW9uICkKIHsKLSAgICBwcmludGYoIlNUVUIgQ2FzY2FkZUNoaWxkV2luZG93cyglMDRYLCAlZClcbiIsIHBhcmVudCwgYWN0aW9uKTsKKyAgICBwcmludGYoIlNUVUIgQ2FzY2FkZUNoaWxkV2luZG93cygiTlBGTVQiLCAlZClcbiIsIHBhcmVudCwgYWN0aW9uKTsKIH0K