VGhpcyBpcyAuLi8uLi9nbXAvZG9jL2dtcC5pbmZvLCBwcm9kdWNlZCBieSBtYWtlaW5mbyB2ZXJzaW9uIDQuMTMgZnJvbQouLi8uLi9nbXAvZG9jL2dtcC50ZXhpLgoKVGhpcyBtYW51YWwgZGVzY3JpYmVzIGhvdyB0byBpbnN0YWxsIGFuZCB1c2UgdGhlIEdOVSBtdWx0aXBsZSBwcmVjaXNpb24KYXJpdGhtZXRpYyBsaWJyYXJ5LCB2ZXJzaW9uIDYuMC4wLgoKICAgQ29weXJpZ2h0IDE5OTEsIDE5OTMtMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KCiAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcwpkb2N1bWVudCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSwgVmVyc2lvbgoxLjMgb3IgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CndpdGggbm8gSW52YXJpYW50IFNlY3Rpb25zLCB3aXRoIHRoZSBGcm9udC1Db3ZlciBUZXh0cyBiZWluZyAiQSBHTlUKTWFudWFsIiwgYW5kIHdpdGggdGhlIEJhY2stQ292ZXIgVGV4dHMgYmVpbmcgIllvdSBoYXZlIGZyZWVkb20gdG8gY29weQphbmQgbW9kaWZ5IHRoaXMgR05VIE1hbnVhbCwgbGlrZSBHTlUgc29mdHdhcmUiLiAgQSBjb3B5IG9mIHRoZSBsaWNlbnNlCmlzIGluY2x1ZGVkIGluICpub3RlIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZTo6LgoKSU5GTy1ESVItU0VDVElPTiBHTlUgbGlicmFyaWVzClNUQVJULUlORk8tRElSLUVOVFJZCiogZ21wOiAoZ21wKS4gICAgICAgICAgICAgICAgICAgR05VIE11bHRpcGxlIFByZWNpc2lvbiBBcml0aG1ldGljIExpYnJhcnkuCkVORC1JTkZPLURJUi1FTlRSWQoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IFRvcCwgIE5leHQ6IENvcHlpbmcsICBQcmV2OiAoZGlyKSwgIFVwOiAoZGlyKQoKR05VIE1QCioqKioqKgoKICAgVGhpcyBtYW51YWwgZGVzY3JpYmVzIGhvdyB0byBpbnN0YWxsIGFuZCB1c2UgdGhlIEdOVSBtdWx0aXBsZQpwcmVjaXNpb24gYXJpdGhtZXRpYyBsaWJyYXJ5LCB2ZXJzaW9uIDYuMC4wLgoKICAgQ29weXJpZ2h0IDE5OTEsIDE5OTMtMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KCiAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcwpkb2N1bWVudCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSwgVmVyc2lvbgoxLjMgb3IgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CndpdGggbm8gSW52YXJpYW50IFNlY3Rpb25zLCB3aXRoIHRoZSBGcm9udC1Db3ZlciBUZXh0cyBiZWluZyAiQSBHTlUKTWFudWFsIiwgYW5kIHdpdGggdGhlIEJhY2stQ292ZXIgVGV4dHMgYmVpbmcgIllvdSBoYXZlIGZyZWVkb20gdG8gY29weQphbmQgbW9kaWZ5IHRoaXMgR05VIE1hbnVhbCwgbGlrZSBHTlUgc29mdHdhcmUiLiAgQSBjb3B5IG9mIHRoZSBsaWNlbnNlCmlzIGluY2x1ZGVkIGluICpub3RlIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZTo6LgoKCiogTWVudToKCiogQ29weWluZzo6ICAgICAgICAgICAgICAgICAgICBHTVAgQ29weWluZyBDb25kaXRpb25zIChMR1BMKS4KKiBJbnRyb2R1Y3Rpb24gdG8gR01QOjogICAgICAgIEJyaWVmIGludHJvZHVjdGlvbiB0byBHTlUgTVAuCiogSW5zdGFsbGluZyBHTVA6OiAgICAgICAgICAgICBIb3cgdG8gY29uZmlndXJlIGFuZCBjb21waWxlIHRoZSBHTVAgbGlicmFyeS4KKiBHTVAgQmFzaWNzOjogICAgICAgICAgICAgICAgIFdoYXQgZXZlcnkgR01QIHVzZXIgc2hvdWxkIGtub3cuCiogUmVwb3J0aW5nIEJ1Z3M6OiAgICAgICAgICAgICBIb3cgdG8gdXNlZnVsbHkgcmVwb3J0IGJ1Z3MuCiogSW50ZWdlciBGdW5jdGlvbnM6OiAgICAgICAgICBGdW5jdGlvbnMgZm9yIGFyaXRobWV0aWMgb24gc2lnbmVkIGludGVnZXJzLgoqIFJhdGlvbmFsIE51bWJlciBGdW5jdGlvbnM6OiAgRnVuY3Rpb25zIGZvciBhcml0aG1ldGljIG9uIHJhdGlvbmFsIG51bWJlcnMuCiogRmxvYXRpbmctcG9pbnQgRnVuY3Rpb25zOjogICBGdW5jdGlvbnMgZm9yIGFyaXRobWV0aWMgb24gZmxvYXRzLgoqIExvdy1sZXZlbCBGdW5jdGlvbnM6OiAgICAgICAgRmFzdCBmdW5jdGlvbnMgZm9yIG5hdHVyYWwgbnVtYmVycy4KKiBSYW5kb20gTnVtYmVyIEZ1bmN0aW9uczo6ICAgIEZ1bmN0aW9ucyBmb3IgZ2VuZXJhdGluZyByYW5kb20gbnVtYmVycy4KKiBGb3JtYXR0ZWQgT3V0cHV0OjogICAgICAgICAgIGBwcmludGYnIHN0eWxlIG91dHB1dC4KKiBGb3JtYXR0ZWQgSW5wdXQ6OiAgICAgICAgICAgIGBzY2FuZicgc3R5bGUgaW5wdXQuCiogQysrIENsYXNzIEludGVyZmFjZTo6ICAgICAgICBDbGFzcyB3cmFwcGVycyBhcm91bmQgR01QIHR5cGVzLgoqIEN1c3RvbSBBbGxvY2F0aW9uOjogICAgICAgICAgSG93IHRvIGN1c3RvbWl6ZSB0aGUgaW50ZXJuYWwgYWxsb2NhdGlvbi4KKiBMYW5ndWFnZSBCaW5kaW5nczo6ICAgICAgICAgIFVzaW5nIEdNUCBmcm9tIG90aGVyIGxhbmd1YWdlcy4KKiBBbGdvcml0aG1zOjogICAgICAgICAgICAgICAgIFdoYXQgaGFwcGVucyBiZWhpbmQgdGhlIHNjZW5lcy4KKiBJbnRlcm5hbHM6OiAgICAgICAgICAgICAgICAgIEhvdyB2YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGJlaGluZCB0aGUgc2NlbmVzLgoKKiBDb250cmlidXRvcnM6OiAgICAgICAgICAgICAgIFdobyBicmluZ3MgeW91IHRoaXMgbGlicmFyeT8KKiBSZWZlcmVuY2VzOjogICAgICAgICAgICAgICAgIFNvbWUgdXNlZnVsIHBhcGVycyBhbmQgYm9va3MgdG8gcmVhZC4KKiBHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2U6OgoqIENvbmNlcHQgSW5kZXg6OgoqIEZ1bmN0aW9uIEluZGV4OjoKCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBDb3B5aW5nLCAgTmV4dDogSW50cm9kdWN0aW9uIHRvIEdNUCwgIFByZXY6IFRvcCwgIFVwOiBUb3AKCkdOVSBNUCBDb3B5aW5nIENvbmRpdGlvbnMKKioqKioqKioqKioqKioqKioqKioqKioqKgoKVGhpcyBsaWJyYXJ5IGlzICJmcmVlIjsgdGhpcyBtZWFucyB0aGF0IGV2ZXJ5b25lIGlzIGZyZWUgdG8gdXNlIGl0IGFuZApmcmVlIHRvIHJlZGlzdHJpYnV0ZSBpdCBvbiBhIGZyZWUgYmFzaXMuICBUaGUgbGlicmFyeSBpcyBub3QgaW4gdGhlCnB1YmxpYyBkb21haW47IGl0IGlzIGNvcHlyaWdodGVkIGFuZCB0aGVyZSBhcmUgcmVzdHJpY3Rpb25zIG9uIGl0cwpkaXN0cmlidXRpb24sIGJ1dCB0aGVzZSByZXN0cmljdGlvbnMgYXJlIGRlc2lnbmVkIHRvIHBlcm1pdCBldmVyeXRoaW5nCnRoYXQgYSBnb29kIGNvb3BlcmF0aW5nIGNpdGl6ZW4gd291bGQgd2FudCB0byBkby4gIFdoYXQgaXMgbm90IGFsbG93ZWQKaXMgdG8gdHJ5IHRvIHByZXZlbnQgb3RoZXJzIGZyb20gZnVydGhlciBzaGFyaW5nIGFueSB2ZXJzaW9uIG9mIHRoaXMKbGlicmFyeSB0aGF0IHRoZXkgbWlnaHQgZ2V0IGZyb20geW91LgoKICAgU3BlY2lmaWNhbGx5LCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSByaWdodCB0byBnaXZlCmF3YXkgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGVsc2UgY2FuCmdldCBpdCBpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGlzIGxpYnJhcnkgb3IgdXNlIHBpZWNlcwpvZiBpdCBpbiBuZXcgZnJlZSBwcm9ncmFtcywgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCgogICBUbyBtYWtlIHN1cmUgdGhhdCBldmVyeW9uZSBoYXMgc3VjaCByaWdodHMsIHdlIGhhdmUgdG8gZm9yYmlkIHlvdSB0bwpkZXByaXZlIGFueW9uZSBlbHNlIG9mIHRoZXNlIHJpZ2h0cy4gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZQpjb3BpZXMgb2YgdGhlIEdOVSBNUCBsaWJyYXJ5LCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUKcmlnaHRzIHRoYXQgeW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IKY2FuIGdldCB0aGUgc291cmNlIGNvZGUuICBBbmQgeW91IG11c3QgdGVsbCB0aGVtIHRoZWlyIHJpZ2h0cy4KCiAgIEFsc28sIGZvciBvdXIgb3duIHByb3RlY3Rpb24sIHdlIG11c3QgbWFrZSBjZXJ0YWluIHRoYXQgZXZlcnlvbmUKZmluZHMgb3V0IHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSBHTlUgTVAgbGlicmFyeS4gIElmIGl0IGlzCm1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZSB3YW50IHRoZWlyIHJlY2lwaWVudHMgdG8Ka25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB3aGF0IHdlIGRpc3RyaWJ1dGVkLCBzbyB0aGF0IGFueQpwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIG91ciByZXB1dGF0aW9uLgoKICAgTW9yZSBwcmVjaXNlbHksIHRoZSBHTlUgTVAgbGlicmFyeSBpcyBkdWFsIGxpY2Vuc2VkLCB1bmRlciB0aGUKY29uZGl0aW9ucyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoc2VlCmBDT1BZSU5HLkxFU1NFUnYzJyksIG9yIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHNlZQpgQ09QWUlOR3YyJykuIFRoaXMgaXMgdGhlIHJlY2lwaWVudCdzIGNob2ljZSwgYW5kIHRoZSByZWNpcGllbnQgYWxzbyBoYXMKdGhlIGFkZGl0aW9uYWwgb3B0aW9uIG9mIGFwcGx5aW5nIGxhdGVyIHZlcnNpb25zIG9mIHRoZXNlIGxpY2Vuc2VzLiAoVGhlCnJlYXNvbiBmb3IgdGhpcyBkdWFsIGxpY2Vuc2luZyBpcyB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSB0aGUKbGlicmFyeSB3aXRoIHByb2dyYW1zIHdoaWNoIGFyZSBsaWNlbnNlZCB1bmRlciBHUEwgdmVyc2lvbiAyLCBidXQgd2hpY2gKZm9yIGhpc3RvcmljYWwgb3Igb3RoZXIgcmVhc29ucyBkbyBub3QgYWxsb3cgdXNlIHVuZGVyIGxhdGVyIHZlcnNpb25zCm9mIHRoZSBHUEwpLgoKICAgUHJvZ3JhbXMgd2hpY2ggYXJlIG5vdCBwYXJ0IG9mIHRoZSBsaWJyYXJ5IGl0c2VsZiwgc3VjaCBhcwpkZW1vbnN0cmF0aW9uIHByb2dyYW1zIGFuZCB0aGUgR01QIHRlc3RzdWl0ZSwgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZQp0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChzZWUgYENPUFlJTkd2MycpLCBvcgphbnkgbGF0ZXIgdmVyc2lvbi4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBJbnRyb2R1Y3Rpb24gdG8gR01QLCAgTmV4dDogSW5zdGFsbGluZyBHTVAsICBQcmV2OiBDb3B5aW5nLCAgVXA6IFRvcAoKMSBJbnRyb2R1Y3Rpb24gdG8gR05VIE1QCioqKioqKioqKioqKioqKioqKioqKioqKgoKR05VIE1QIGlzIGEgcG9ydGFibGUgbGlicmFyeSB3cml0dGVuIGluIEMgZm9yIGFyYml0cmFyeSBwcmVjaXNpb24KYXJpdGhtZXRpYyBvbiBpbnRlZ2VycywgcmF0aW9uYWwgbnVtYmVycywgYW5kIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCkl0IGFpbXMgdG8gcHJvdmlkZSB0aGUgZmFzdGVzdCBwb3NzaWJsZSBhcml0aG1ldGljIGZvciBhbGwgYXBwbGljYXRpb25zCnRoYXQgbmVlZCBoaWdoZXIgcHJlY2lzaW9uIHRoYW4gaXMgZGlyZWN0bHkgc3VwcG9ydGVkIGJ5IHRoZSBiYXNpYyBDCnR5cGVzLgoKICAgTWFueSBhcHBsaWNhdGlvbnMgdXNlIGp1c3QgYSBmZXcgaHVuZHJlZCBiaXRzIG9mIHByZWNpc2lvbjsgYnV0IHNvbWUKYXBwbGljYXRpb25zIG1heSBuZWVkIHRob3VzYW5kcyBvciBldmVuIG1pbGxpb25zIG9mIGJpdHMuICBHTVAgaXMKZGVzaWduZWQgdG8gZ2l2ZSBnb29kIHBlcmZvcm1hbmNlIGZvciBib3RoLCBieSBjaG9vc2luZyBhbGdvcml0aG1zCmJhc2VkIG9uIHRoZSBzaXplcyBvZiB0aGUgb3BlcmFuZHMsIGFuZCBieSBjYXJlZnVsbHkga2VlcGluZyB0aGUKb3ZlcmhlYWQgYXQgYSBtaW5pbXVtLgoKICAgVGhlIHNwZWVkIG9mIEdNUCBpcyBhY2hpZXZlZCBieSB1c2luZyBmdWxsd29yZHMgYXMgdGhlIGJhc2ljCmFyaXRobWV0aWMgdHlwZSwgYnkgdXNpbmcgc29waGlzdGljYXRlZCBhbGdvcml0aG1zLCBieSBpbmNsdWRpbmcKY2FyZWZ1bGx5IG9wdGltaXplZCBhc3NlbWJseSBjb2RlIGZvciB0aGUgbW9zdCBjb21tb24gaW5uZXIgbG9vcHMgZm9yCm1hbnkgZGlmZmVyZW50IENQVXMsIGFuZCBieSBhIGdlbmVyYWwgZW1waGFzaXMgb24gc3BlZWQgKGFzIG9wcG9zZWQgdG8Kc2ltcGxpY2l0eSBvciBlbGVnYW5jZSkuCgogICBUaGVyZSBpcyBhc3NlbWJseSBjb2RlIGZvciB0aGVzZSBDUFVzOiBBUk0gQ29ydGV4LUE5LCBDb3J0ZXgtQTE1LAphbmQgZ2VuZXJpYyBBUk0sIERFQyBBbHBoYSAyMTA2NCwgMjExNjQsIGFuZCAyMTI2NCwgQU1EIEs4IGFuZCBLMTAKKHNvbGQgdW5kZXIgbWFueSBicmFuZHMsIGUuZy4gQXRobG9uNjQsIFBoZW5vbSwgT3B0ZXJvbikgQnVsbGRvemVyLCBhbmQKQm9iY2F0LCBJbnRlbCBQZW50aXVtLCBQZW50aXVtIFByby9JSS9JSUksIFBlbnRpdW0gNCwgQ29yZTIsIE5laGFsZW0sClNhbmR5IGJyaWRnZSwgSGFzd2VsbCwgZ2VuZXJpYyB4ODYsIEludGVsIElBLTY0LCBNb3Rvcm9sYS9JQk0gUG93ZXJQQwozMiBhbmQgNjQgc3VjaCBhcyBQT1dFUjk3MCwgUE9XRVI1LCBQT1dFUjYsIGFuZCBQT1dFUjcsIE1JUFMgMzItYml0IGFuZAo2NC1iaXQsIFNQQVJDIDMyLWJpdCBhZCA2NC1iaXQgd2l0aCBzcGVjaWFsIHN1cHBvcnQgZm9yIGFsbCBVbHRyYVNQQVJDCm1vZGVscy4gIFRoZXJlIGlzIGFsc28gYXNzZW1ibHkgY29kZSBmb3IgbWFueSBvYnNvbGV0ZSBDUFVzLgoKRm9yIHVwLXRvLWRhdGUgaW5mb3JtYXRpb24gb24gR01QLCBwbGVhc2Ugc2VlIHRoZSBHTVAgd2ViIHBhZ2VzIGF0CgogICAgIGBodHRwczovL2dtcGxpYi5vcmcvJwoKVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGlzIGF2YWlsYWJsZSBhdAoKICAgICBgaHR0cHM6Ly9mdHAuZ251Lm9yZy9nbnUvZ21wLycKCiAgIE1hbnkgc2l0ZXMgYXJvdW5kIHRoZSB3b3JsZCBtaXJyb3IgYGZ0cC5nbnUub3JnJywgcGxlYXNlIHVzZSBhIG1pcnJvcgpuZWFyIHlvdSwgc2VlIGBodHRwczovL3d3dy5nbnUub3JnL29yZGVyL2Z0cC5odG1sJyBmb3IgYSBmdWxsIGxpc3QuCgogICBUaGVyZSBhcmUgdGhyZWUgcHVibGljIG1haWxpbmcgbGlzdHMgb2YgaW50ZXJlc3QuICBPbmUgZm9yIHJlbGVhc2UKYW5ub3VuY2VtZW50cywgb25lIGZvciBnZW5lcmFsIHF1ZXN0aW9ucyBhbmQgZGlzY3Vzc2lvbnMgYWJvdXQgdXNhZ2Ugb2YKdGhlIEdNUCBsaWJyYXJ5IGFuZCBvbmUgZm9yIGJ1ZyByZXBvcnRzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQoKICAgICBgaHR0cHM6Ly9nbXBsaWIub3JnL21haWxtYW4vbGlzdGluZm8vJy4KCiAgIFRoZSBwcm9wZXIgcGxhY2UgZm9yIGJ1ZyByZXBvcnRzIGlzIDxnbXAtYnVnc0BnbXBsaWIub3JnPi4gIFNlZQoqbm90ZSBSZXBvcnRpbmcgQnVnczo6IGZvciBpbmZvcm1hdGlvbiBhYm91dCByZXBvcnRpbmcgYnVncy4KCgoxLjEgSG93IHRvIHVzZSB0aGlzIE1hbnVhbAo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKRXZlcnlvbmUgc2hvdWxkIHJlYWQgKm5vdGUgR01QIEJhc2ljczo6LiAgSWYgeW91IG5lZWQgdG8gaW5zdGFsbCB0aGUKbGlicmFyeSB5b3Vyc2VsZiwgdGhlbiByZWFkICpub3RlIEluc3RhbGxpbmcgR01QOjouICBJZiB5b3UgaGF2ZSBhCnN5c3RlbSB3aXRoIG11bHRpcGxlIEFCSXMsIHRoZW4gcmVhZCAqbm90ZSBBQkkgYW5kIElTQTo6LCBmb3IgdGhlCmNvbXBpbGVyIG9wdGlvbnMgdGhhdCBtdXN0IGJlIHVzZWQgb24gYXBwbGljYXRpb25zLgoKICAgVGhlIHJlc3Qgb2YgdGhlIG1hbnVhbCBjYW4gYmUgdXNlZCBmb3IgbGF0ZXIgcmVmZXJlbmNlLCBhbHRob3VnaCBpdAppcyBwcm9iYWJseSBhIGdvb2QgaWRlYSB0byBnbGFuY2UgdGhyb3VnaCBpdC4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBJbnN0YWxsaW5nIEdNUCwgIE5leHQ6IEdNUCBCYXNpY3MsICBQcmV2OiBJbnRyb2R1Y3Rpb24gdG8gR01QLCAgVXA6IFRvcAoKMiBJbnN0YWxsaW5nIEdNUAoqKioqKioqKioqKioqKioqCgpHTVAgaGFzIGFuIGF1dG9jb25mL2F1dG9tYWtlL2xpYnRvb2wgYmFzZWQgY29uZmlndXJhdGlvbiBzeXN0ZW0uICBPbiBhClVuaXgtbGlrZSBzeXN0ZW0gYSBiYXNpYyBidWlsZCBjYW4gYmUgZG9uZSB3aXRoCgogICAgIC4vY29uZmlndXJlCiAgICAgbWFrZQoKU29tZSBzZWxmLXRlc3RzIGNhbiBiZSBydW4gd2l0aAoKICAgICBtYWtlIGNoZWNrCgpBbmQgeW91IGNhbiBpbnN0YWxsICh1bmRlciBgL3Vzci9sb2NhbCcgYnkgZGVmYXVsdCkgd2l0aAoKICAgICBtYWtlIGluc3RhbGwKCiAgIElmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zLCBwbGVhc2UgcmVwb3J0IHRoZW0gdG8KPGdtcC1idWdzQGdtcGxpYi5vcmc+LiAgU2VlICpub3RlIFJlcG9ydGluZyBCdWdzOjosIGZvciBpbmZvcm1hdGlvbiBvbgp3aGF0IHRvIGluY2x1ZGUgaW4gdXNlZnVsIGJ1ZyByZXBvcnRzLgoKKiBNZW51OgoKKiBCdWlsZCBPcHRpb25zOjoKKiBBQkkgYW5kIElTQTo6CiogTm90ZXMgZm9yIFBhY2thZ2UgQnVpbGRzOjoKKiBOb3RlcyBmb3IgUGFydGljdWxhciBTeXN0ZW1zOjoKKiBLbm93biBCdWlsZCBQcm9ibGVtczo6CiogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uOjoKCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBCdWlsZCBPcHRpb25zLCAgTmV4dDogQUJJIGFuZCBJU0EsICBQcmV2OiBJbnN0YWxsaW5nIEdNUCwgIFVwOiBJbnN0YWxsaW5nIEdNUAoKMi4xIEJ1aWxkIE9wdGlvbnMKPT09PT09PT09PT09PT09PT0KCkFsbCB0aGUgdXN1YWwgYXV0b2NvbmYgY29uZmlndXJlIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSwgcnVuIGAuL2NvbmZpZ3VyZQotLWhlbHAnIGZvciBhIHN1bW1hcnkuICBUaGUgZmlsZSBgSU5TVEFMTC5hdXRvY29uZicgaGFzIHNvbWUgZ2VuZXJpYwppbnN0YWxsYXRpb24gaW5mb3JtYXRpb24gdG9vLgoKVG9vbHMKICAgICBgY29uZmlndXJlJyByZXF1aXJlcyB2YXJpb3VzIFVuaXgtbGlrZSB0b29scy4gIFNlZSAqbm90ZSBOb3RlcyBmb3IKICAgICBQYXJ0aWN1bGFyIFN5c3RlbXM6OiwgZm9yIHNvbWUgb3B0aW9ucyBvbiBub24tVW5peCBzeXN0ZW1zLgoKICAgICBJdCBtaWdodCBiZSBwb3NzaWJsZSB0byBidWlsZCB3aXRob3V0IHRoZSBoZWxwIG9mIGBjb25maWd1cmUnLAogICAgIGNlcnRhaW5seSBhbGwgdGhlIGNvZGUgaXMgdGhlcmUsIGJ1dCB1bmZvcnR1bmF0ZWx5IHlvdSdsbCBiZSBvbgogICAgIHlvdXIgb3duLgoKQnVpbGQgRGlyZWN0b3J5CiAgICAgVG8gY29tcGlsZSBpbiBhIHNlcGFyYXRlIGJ1aWxkIGRpcmVjdG9yeSwgYGNkJyB0byB0aGF0IGRpcmVjdG9yeSwKICAgICBhbmQgcHJlZml4IHRoZSBjb25maWd1cmUgY29tbWFuZCB3aXRoIHRoZSBwYXRoIHRvIHRoZSBHTVAgc291cmNlCiAgICAgZGlyZWN0b3J5LiAgRm9yIGV4YW1wbGUKCiAgICAgICAgICBjZCAvbXkvYnVpbGQvZGlyCiAgICAgICAgICAvbXkvc291cmNlcy9nbXAtNi4wLjAvY29uZmlndXJlCgogICAgIE5vdCBhbGwgYG1ha2UnIHByb2dyYW1zIGhhdmUgdGhlIG5lY2Vzc2FyeSBmZWF0dXJlcyAoYFZQQVRIJykgdG8KICAgICBzdXBwb3J0IHRoaXMuICBJbiBwYXJ0aWN1bGFyLCBTdW5PUyBhbmQgU2xvd2FyaXMgYG1ha2UnIGhhdmUgYnVncwogICAgIHRoYXQgbWFrZSB0aGVtIHVuYWJsZSB0byBidWlsZCBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeS4gIFVzZSBHTlUKICAgICBgbWFrZScgaW5zdGVhZC4KCmAtLXByZWZpeCcgYW5kIGAtLWV4ZWMtcHJlZml4JwogICAgIFRoZSBgLS1wcmVmaXgnIG9wdGlvbiBjYW4gYmUgdXNlZCBpbiB0aGUgbm9ybWFsIHdheSB0byBkaXJlY3QgR01QCiAgICAgdG8gaW5zdGFsbCB1bmRlciBhIHBhcnRpY3VsYXIgdHJlZS4gIFRoZSBkZWZhdWx0IGlzIGAvdXNyL2xvY2FsJy4KCiAgICAgYC0tZXhlYy1wcmVmaXgnIGNhbiBiZSB1c2VkIHRvIGRpcmVjdCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzCiAgICAgbGlrZSBgbGliZ21wLmEnIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBzaGFyZQogICAgIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBwYXJ0cyBsaWtlIHRoZSBkb2N1bWVudGF0aW9uLCBidXQKICAgICBzZXBhcmF0ZSB0aGUgZGVwZW5kZW50IHBhcnRzLiAgTm90ZSBob3dldmVyIHRoYXQgYGdtcC5oJyBhbmQKICAgICBgbXAuaCcgYXJlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgc2luY2UgdGhleSBlbmNvZGUgY2VydGFpbgogICAgIGFzcGVjdHMgb2YgYGxpYmdtcCcsIHNvIGl0IHdpbGwgYmUgbmVjZXNzYXJ5IHRvIGVuc3VyZSBib3RoCiAgICAgYCRwcmVmaXgvaW5jbHVkZScgYW5kIGAkZXhlY19wcmVmaXgvaW5jbHVkZScgYXJlIGF2YWlsYWJsZSB0byB0aGUKICAgICBjb21waWxlci4KCmAtLWRpc2FibGUtc2hhcmVkJywgYC0tZGlzYWJsZS1zdGF0aWMnCiAgICAgQnkgZGVmYXVsdCBib3RoIHNoYXJlZCBhbmQgc3RhdGljIGxpYnJhcmllcyBhcmUgYnVpbHQgKHdoZXJlCiAgICAgcG9zc2libGUpLCBidXQgb25lIG9yIG90aGVyIGNhbiBiZSBkaXNhYmxlZC4gIFNoYXJlZCBsaWJyYXJpZXMKICAgICByZXN1bHQgaW4gc21hbGxlciBleGVjdXRhYmxlcyBhbmQgcGVybWl0IGNvZGUgc2hhcmluZyBiZXR3ZWVuCiAgICAgc2VwYXJhdGUgcnVubmluZyBwcm9jZXNzZXMsIGJ1dCBvbiBzb21lIENQVXMgYXJlIHNsaWdodGx5IHNsb3dlciwKICAgICBoYXZpbmcgYSBzbWFsbCBjb3N0IG9uIGVhY2ggZnVuY3Rpb24gY2FsbC4KCk5hdGl2ZSBDb21waWxhdGlvbiwgYC0tYnVpbGQ9Q1BVLVZFTkRPUi1PUycKICAgICBGb3Igbm9ybWFsIG5hdGl2ZSBjb21waWxhdGlvbiwgdGhlIHN5c3RlbSBjYW4gYmUgc3BlY2lmaWVkIHdpdGgKICAgICBgLS1idWlsZCcuICBCeSBkZWZhdWx0IGAuL2NvbmZpZ3VyZScgdXNlcyB0aGUgb3V0cHV0IGZyb20gcnVubmluZwogICAgIGAuL2NvbmZpZy5ndWVzcycuICBPbiBzb21lIHN5c3RlbXMgYC4vY29uZmlnLmd1ZXNzJyBjYW4gZGV0ZXJtaW5lCiAgICAgdGhlIGV4YWN0IENQVSB0eXBlLCBvbiBvdGhlcnMgaXQgd2lsbCBiZSBuZWNlc3NhcnkgdG8gZ2l2ZSBpdAogICAgIGV4cGxpY2l0bHkuICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAuL2NvbmZpZ3VyZSAtLWJ1aWxkPXVsdHJhc3BhcmMtc3VuLXNvbGFyaXMyLjcKCiAgICAgSW4gYWxsIGNhc2VzIHRoZSBgT1MnIHBhcnQgaXMgaW1wb3J0YW50LCBzaW5jZSBpdCBjb250cm9scyBob3cKICAgICBsaWJ0b29sIGdlbmVyYXRlcyBzaGFyZWQgbGlicmFyaWVzLiAgUnVubmluZyBgLi9jb25maWcuZ3Vlc3MnIGlzCiAgICAgdGhlIHNpbXBsZXN0IHdheSB0byBzZWUgd2hhdCBpdCBzaG91bGQgYmUsIGlmIHlvdSBkb24ndCBrbm93CiAgICAgYWxyZWFkeS4KCkNyb3NzIENvbXBpbGF0aW9uLCBgLS1ob3N0PUNQVS1WRU5ET1ItT1MnCiAgICAgV2hlbiBjcm9zcy1jb21waWxpbmcsIHRoZSBzeXN0ZW0gdXNlZCBmb3IgY29tcGlsaW5nIGlzIGdpdmVuIGJ5CiAgICAgYC0tYnVpbGQnIGFuZCB0aGUgc3lzdGVtIHdoZXJlIHRoZSBsaWJyYXJ5IHdpbGwgcnVuIGlzIGdpdmVuIGJ5CiAgICAgYC0taG9zdCcuICBGb3IgZXhhbXBsZSB3aGVuIHVzaW5nIGEgRnJlZUJTRCBBdGhsb24gc3lzdGVtIHRvIGJ1aWxkCiAgICAgR05VL0xpbnV4IG02OGsgYmluYXJpZXMsCgogICAgICAgICAgLi9jb25maWd1cmUgLS1idWlsZD1hdGhsb24tcGMtZnJlZWJzZDMuNSAtLWhvc3Q9bTY4ay1tYWMtbGludXgtZ251CgogICAgIENvbXBpbGVyIHRvb2xzIGFyZSBzb3VnaHQgZmlyc3Qgd2l0aCB0aGUgaG9zdCBzeXN0ZW0gdHlwZSBhcyBhCiAgICAgcHJlZml4LiAgRm9yIGV4YW1wbGUgYG02OGstbWFjLWxpbnV4LWdudS1yYW5saWInIGlzIHRyaWVkLCB0aGVuCiAgICAgcGxhaW4gYHJhbmxpYicuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciBhIHNldCBvZgogICAgIGNyb3NzLWNvbXBpbGluZyB0b29scyB0byBjby1leGlzdCB3aXRoIG5hdGl2ZSB0b29scy4gIFRoZSBwcmVmaXgKICAgICBpcyB0aGUgYXJndW1lbnQgdG8gYC0taG9zdCcsIGFuZCB0aGlzIGNhbiBiZSBhbiBhbGlhcywgc3VjaCBhcwogICAgIGBtNjhrLWxpbnV4Jy4gIEJ1dCBub3RlIHRoYXQgdG9vbHMgZG9uJ3QgaGF2ZSB0byBiZSBzZXR1cCB0aGlzCiAgICAgd2F5LCBpdCdzIGVub3VnaCB0byBqdXN0IGhhdmUgYSBgUEFUSCcgd2l0aCBhIHN1aXRhYmxlCiAgICAgY3Jvc3MtY29tcGlsaW5nIGBjYycgZXRjLgoKICAgICBDb21waWxpbmcgZm9yIGEgZGlmZmVyZW50IENQVSBpbiB0aGUgc2FtZSBmYW1pbHkgYXMgdGhlIGJ1aWxkCiAgICAgc3lzdGVtIGlzIGEgZm9ybSBvZiBjcm9zcy1jb21waWxhdGlvbiwgdGhvdWdoIHZlcnkgcG9zc2libHkgdGhpcwogICAgIHdvdWxkIG1lcmVseSBiZSBzcGVjaWFsIG9wdGlvbnMgb24gYSBuYXRpdmUgY29tcGlsZXIuICBJbiBhbnkgY2FzZQogICAgIGAuL2NvbmZpZ3VyZScgYXZvaWRzIGRlcGVuZGluZyBvbiBiZWluZyBhYmxlIHRvIHJ1biBjb2RlIG9uIHRoZQogICAgIGJ1aWxkIHN5c3RlbSwgd2hpY2ggaXMgaW1wb3J0YW50IHdoZW4gY3JlYXRpbmcgYmluYXJpZXMgZm9yIGEKICAgICBuZXdlciBDUFUgc2luY2UgdGhleSB2ZXJ5IHBvc3NpYmx5IHdvbid0IHJ1biBvbiB0aGUgYnVpbGQgc3lzdGVtLgoKICAgICBJbiBhbGwgY2FzZXMgdGhlIGNvbXBpbGVyIG11c3QgYmUgYWJsZSB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUKICAgICAob2Ygd2hhdGV2ZXIgZm9ybWF0KSBmcm9tIGEgc3RhbmRhcmQgQyBgbWFpbicuICBBbHRob3VnaCBvbmx5CiAgICAgb2JqZWN0IGZpbGVzIHdpbGwgZ28gdG8gbWFrZSB1cCBgbGliZ21wJywgYC4vY29uZmlndXJlJyB1c2VzCiAgICAgbGlua2luZyB0ZXN0cyBmb3IgdmFyaW91cyBwdXJwb3Nlcywgc3VjaCBhcyBkZXRlcm1pbmluZyB3aGF0CiAgICAgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgb24gdGhlIGhvc3Qgc3lzdGVtLgoKICAgICBDdXJyZW50bHkgYSB3YXJuaW5nIGlzIGdpdmVuIHVubGVzcyBhbiBleHBsaWNpdCBgLS1idWlsZCcgaXMgdXNlZAogICAgIHdoZW4gY3Jvc3MtY29tcGlsaW5nLCBiZWNhdXNlIGl0IG1heSBub3QgYmUgcG9zc2libGUgdG8gY29ycmVjdGx5CiAgICAgZ3Vlc3MgdGhlIGJ1aWxkIHN5c3RlbSB0eXBlIGlmIHRoZSBgUEFUSCcgaGFzIG9ubHkgYQogICAgIGNyb3NzLWNvbXBpbGluZyBgY2MnLgoKICAgICBOb3RlIHRoYXQgdGhlIGAtLXRhcmdldCcgb3B0aW9uIGlzIG5vdCBhcHByb3ByaWF0ZSBmb3IgR01QLiAgSXQncwogICAgIGZvciB1c2Ugd2hlbiBidWlsZGluZyBjb21waWxlciB0b29scywgd2l0aCBgLS1ob3N0JyBiZWluZyB3aGVyZQogICAgIHRoZXkgd2lsbCBydW4sIGFuZCBgLS10YXJnZXQnIHdoYXQgdGhleSdsbCBwcm9kdWNlIGNvZGUgZm9yLgogICAgIE9yZGluYXJ5IHByb2dyYW1zIG9yIGxpYnJhcmllcyBsaWtlIEdNUCBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZQogICAgIGAtLWhvc3QnIHBhcnQsIGJlaW5nIHdoZXJlIHRoZXknbGwgcnVuLiAgKFNvbWUgcGFzdCB2ZXJzaW9ucyBvZgogICAgIEdNUCB1c2VkIGAtLXRhcmdldCcgaW5jb3JyZWN0bHkuKQoKQ1BVIHR5cGVzCiAgICAgSW4gZ2VuZXJhbCwgaWYgeW91IHdhbnQgYSBsaWJyYXJ5IHRoYXQgcnVucyBhcyBmYXN0IGFzIHBvc3NpYmxlLAogICAgIHlvdSBzaG91bGQgY29uZmlndXJlIEdNUCBmb3IgdGhlIGV4YWN0IENQVSB0eXBlIHlvdXIgc3lzdGVtIHVzZXMuCiAgICAgSG93ZXZlciwgdGhpcyBtYXkgbWVhbiB0aGUgYmluYXJpZXMgd29uJ3QgcnVuIG9uIG9sZGVyIG1lbWJlcnMgb2YKICAgICB0aGUgZmFtaWx5LCBhbmQgbWlnaHQgcnVuIHNsb3dlciBvbiBvdGhlciBtZW1iZXJzLCBvbGRlciBvciBuZXdlci4KICAgICBUaGUgYmVzdCBpZGVhIGlzIGFsd2F5cyB0byBidWlsZCBHTVAgZm9yIHRoZSBleGFjdCBtYWNoaW5lIHR5cGUKICAgICB5b3UgaW50ZW5kIHRvIHJ1biBpdCBvbi4KCiAgICAgVGhlIGZvbGxvd2luZyBDUFVzIGhhdmUgc3BlY2lmaWMgc3VwcG9ydC4gIFNlZSBgY29uZmlndXJlLmFjJyBmb3IKICAgICBkZXRhaWxzIG9mIHdoYXQgY29kZSBhbmQgY29tcGlsZXIgb3B0aW9ucyB0aGV5IHNlbGVjdC4KCiAgICAgICAgKiBBbHBoYTogYWxwaGEsIGFscGhhZXY1LCBhbHBoYWV2NTYsIGFscGhhcGNhNTYsIGFscGhhcGNhNTcsCiAgICAgICAgICBhbHBoYWV2NiwgYWxwaGFldjY3LCBhbHBoYWV2NjggYWxwaGFldjcKCiAgICAgICAgKiBDcmF5OiBjOTAsIGo5MCwgdDkwLCBzdjEKCiAgICAgICAgKiBIUFBBOiBocHBhMS4wLCBocHBhMS4xLCBocHBhMi4wLCBocHBhMi4wbiwgaHBwYTIuMHcsIGhwcGE2NAoKICAgICAgICAqIElBLTY0OiBpYTY0LCBpdGFuaXVtLCBpdGFuaXVtMgoKICAgICAgICAqIE1JUFM6IG1pcHMsIG1pcHMzLCBtaXBzNjQKCiAgICAgICAgKiBNb3Rvcm9sYTogbTY4aywgbTY4MDAwLCBtNjgwMTAsIG02ODAyMCwgbTY4MDMwLCBtNjgwNDAsCiAgICAgICAgICBtNjgwNjAsIG02ODMwMiwgbTY4MzYwLCBtODhrLCBtODgxMTAKCiAgICAgICAgKiBQT1dFUjogcG93ZXIsIHBvd2VyMSwgcG93ZXIyLCBwb3dlcjJzYwoKICAgICAgICAqIFBvd2VyUEM6IHBvd2VycGMsIHBvd2VycGM2NCwgcG93ZXJwYzQwMSwgcG93ZXJwYzQwMywKICAgICAgICAgIHBvd2VycGM0MDUsIHBvd2VycGM1MDUsIHBvd2VycGM2MDEsIHBvd2VycGM2MDIsIHBvd2VycGM2MDMsCiAgICAgICAgICBwb3dlcnBjNjAzZSwgcG93ZXJwYzYwNCwgcG93ZXJwYzYwNGUsIHBvd2VycGM2MjAsIHBvd2VycGM2MzAsCiAgICAgICAgICBwb3dlcnBjNzQwLCBwb3dlcnBjNzQwMCwgcG93ZXJwYzc0NTAsIHBvd2VycGM3NTAsIHBvd2VycGM4MDEsCiAgICAgICAgICBwb3dlcnBjODIxLCBwb3dlcnBjODIzLCBwb3dlcnBjODYwLCBwb3dlcnBjOTcwCgogICAgICAgICogU1BBUkM6IHNwYXJjLCBzcGFyY3Y4LCBtaWNyb3NwYXJjLCBzdXBlcnNwYXJjLCBzcGFyY3Y5LAogICAgICAgICAgdWx0cmFzcGFyYywgdWx0cmFzcGFyYzIsIHVsdHJhc3BhcmMyaSwgdWx0cmFzcGFyYzMsIHNwYXJjNjQKCiAgICAgICAgKiB4ODYgZmFtaWx5OiBpMzg2LCBpNDg2LCBpNTg2LCBwZW50aXVtLCBwZW50aXVtbW14LCBwZW50aXVtcHJvLAogICAgICAgICAgcGVudGl1bTIsIHBlbnRpdW0zLCBwZW50aXVtNCwgazYsIGs2MiwgazYzLCBhdGhsb24sIGFtZDY0LAogICAgICAgICAgdmlhYzMsIHZpYWMzMgoKICAgICAgICAqIE90aGVyOiBhcm0sIHNoLCBzaDIsIHZheCwKCiAgICAgQ1BVcyBub3QgbGlzdGVkIHdpbGwgdXNlIGdlbmVyaWMgQyBjb2RlLgoKR2VuZXJpYyBDIEJ1aWxkCiAgICAgSWYgc29tZSBvZiB0aGUgYXNzZW1ibHkgY29kZSBjYXVzZXMgcHJvYmxlbXMsIG9yIGlmIG90aGVyd2lzZQogICAgIGRlc2lyZWQsIHRoZSBnZW5lcmljIEMgY29kZSBjYW4gYmUgc2VsZWN0ZWQgd2l0aCB0aGUgY29uZmlndXJlCiAgICAgYC0tZGlzYWJsZS1hc3NlbWJseScuCgogICAgIE5vdGUgdGhhdCB0aGlzIHdpbGwgcnVuIHF1aXRlIHNsb3dseSwgYnV0IGl0IHNob3VsZCBiZSBwb3J0YWJsZQogICAgIGFuZCBzaG91bGQgYXQgbGVhc3QgbWFrZSBpdCBwb3NzaWJsZSB0byBnZXQgc29tZXRoaW5nIHJ1bm5pbmcgaWYKICAgICBhbGwgZWxzZSBmYWlscy4KCkZhdCBiaW5hcnksIGAtLWVuYWJsZS1mYXQnCiAgICAgVXNpbmcgYC0tZW5hYmxlLWZhdCcgc2VsZWN0cyBhICJmYXQgYmluYXJ5IiBidWlsZCBvbiB4ODYsIHdoZXJlCiAgICAgb3B0aW1pemVkIGxvdyBsZXZlbCBzdWJyb3V0aW5lcyBhcmUgY2hvc2VuIGF0IHJ1bnRpbWUgYWNjb3JkaW5nIHRvCiAgICAgdGhlIENQVSBkZXRlY3RlZC4gIFRoaXMgbWVhbnMgbW9yZSBjb2RlLCBidXQgZ2l2ZXMgZ29vZAogICAgIHBlcmZvcm1hbmNlIG9uIGFsbCB4ODYgY2hpcHMuICAoVGhpcyBvcHRpb24gbWlnaHQgYmVjb21lIGF2YWlsYWJsZQogICAgIGZvciBtb3JlIGFyY2hpdGVjdHVyZXMgaW4gdGhlIGZ1dHVyZS4pCgpgQUJJJwogICAgIE9uIHNvbWUgc3lzdGVtcyBHTVAgc3VwcG9ydHMgbXVsdGlwbGUgQUJJcyAoYXBwbGljYXRpb24gYmluYXJ5CiAgICAgaW50ZXJmYWNlcyksIG1lYW5pbmcgZGF0YSB0eXBlIHNpemVzIGFuZCBjYWxsaW5nIGNvbnZlbnRpb25zLiAgQnkKICAgICBkZWZhdWx0IEdNUCBjaG9vc2VzIHRoZSBiZXN0IEFCSSBhdmFpbGFibGUsIGJ1dCBhIHBhcnRpY3VsYXIgQUJJCiAgICAgY2FuIGJlIHNlbGVjdGVkLiAgRm9yIGV4YW1wbGUKCiAgICAgICAgICAuL2NvbmZpZ3VyZSAtLWhvc3Q9bWlwczY0LXNnaS1pcml4NiBBQkk9bjMyCgogICAgIFNlZSAqbm90ZSBBQkkgYW5kIElTQTo6LCBmb3IgdGhlIGF2YWlsYWJsZSBjaG9pY2VzIG9uIHJlbGV2YW50CiAgICAgQ1BVcywgYW5kIHdoYXQgYXBwbGljYXRpb25zIG5lZWQgdG8gZG8uCgpgQ0MnLCBgQ0ZMQUdTJwogICAgIEJ5IGRlZmF1bHQgdGhlIEMgY29tcGlsZXIgdXNlZCBpcyBjaG9zZW4gZnJvbSBhbW9uZyBzb21lIGxpa2VseQogICAgIGNhbmRpZGF0ZXMsIHdpdGggYGdjYycgbm9ybWFsbHkgcHJlZmVycmVkIGlmIGl0J3MgcHJlc2VudC4gIFRoZQogICAgIHVzdWFsIGBDQz13aGF0ZXZlcicgY2FuIGJlIHBhc3NlZCB0byBgLi9jb25maWd1cmUnIHRvIGNob29zZQogICAgIHNvbWV0aGluZyBkaWZmZXJlbnQuCgogICAgIEZvciB2YXJpb3VzIHN5c3RlbXMsIGRlZmF1bHQgY29tcGlsZXIgZmxhZ3MgYXJlIHNldCBiYXNlZCBvbiB0aGUKICAgICBDUFUgYW5kIGNvbXBpbGVyLiAgVGhlIHVzdWFsIGBDRkxBR1M9Ii13aGF0ZXZlciInIGNhbiBiZSBwYXNzZWQgdG8KICAgICBgLi9jb25maWd1cmUnIHRvIHVzZSBzb21ldGhpbmcgZGlmZmVyZW50IG9yIHRvIHNldCBnb29kIGZsYWdzIGZvcgogICAgIHN5c3RlbXMgR01QIGRvZXNuJ3Qgb3RoZXJ3aXNlIGtub3cuCgogICAgIFRoZSBgQ0MnIGFuZCBgQ0ZMQUdTJyB1c2VkIGFyZSBwcmludGVkIGR1cmluZyBgLi9jb25maWd1cmUnLCBhbmQKICAgICBjYW4gYmUgZm91bmQgaW4gZWFjaCBnZW5lcmF0ZWQgYE1ha2VmaWxlJy4gIFRoaXMgaXMgdGhlIGVhc2llc3Qgd2F5CiAgICAgdG8gY2hlY2sgdGhlIGRlZmF1bHRzIHdoZW4gY29uc2lkZXJpbmcgY2hhbmdpbmcgb3IgYWRkaW5nCiAgICAgc29tZXRoaW5nLgoKICAgICBOb3RlIHRoYXQgd2hlbiBgQ0MnIGFuZCBgQ0ZMQUdTJyBhcmUgc3BlY2lmaWVkIG9uIGEgc3lzdGVtCiAgICAgc3VwcG9ydGluZyBtdWx0aXBsZSBBQklzIGl0J3MgaW1wb3J0YW50IHRvIGdpdmUgYW4gZXhwbGljaXQKICAgICBgQUJJPXdoYXRldmVyJywgc2luY2UgR01QIGNhbid0IGRldGVybWluZSB0aGUgQUJJIGp1c3QgZnJvbSB0aGUKICAgICBmbGFncyBhbmQgd29uJ3QgYmUgYWJsZSB0byBzZWxlY3QgdGhlIGNvcnJlY3QgYXNzZW1ibHkgY29kZS4KCiAgICAgSWYganVzdCBgQ0MnIGlzIHNlbGVjdGVkIHRoZW4gbm9ybWFsIGRlZmF1bHQgYENGTEFHUycgZm9yIHRoYXQKICAgICBjb21waWxlciB3aWxsIGJlIHVzZWQgKGlmIEdNUCByZWNvZ25pc2VzIGl0KS4gIEZvciBleGFtcGxlCiAgICAgYENDPWdjYycgY2FuIGJlIHVzZWQgdG8gZm9yY2UgdGhlIHVzZSBvZiBHQ0MsIHdpdGggZGVmYXVsdCBmbGFncwogICAgIChhbmQgZGVmYXVsdCBBQkkpLgoKYENQUEZMQUdTJwogICAgIEFueSBmbGFncyBsaWtlIGAtRCcgZGVmaW5lcyBvciBgLUknIGluY2x1ZGVzIHJlcXVpcmVkIGJ5IHRoZQogICAgIHByZXByb2Nlc3NvciBzaG91bGQgYmUgc2V0IGluIGBDUFBGTEFHUycgcmF0aGVyIHRoYW4gYENGTEFHUycuCiAgICAgQ29tcGlsaW5nIGlzIGRvbmUgd2l0aCBib3RoIGBDUFBGTEFHUycgYW5kIGBDRkxBR1MnLCBidXQKICAgICBwcmVwcm9jZXNzaW5nIHVzZXMganVzdCBgQ1BQRkxBR1MnLiAgVGhpcyBkaXN0aW5jdGlvbiBpcyBiZWNhdXNlCiAgICAgbW9zdCBwcmVwcm9jZXNzb3JzIHdvbid0IGFjY2VwdCBhbGwgdGhlIGZsYWdzIHRoZSBjb21waWxlciBkb2VzLgogICAgIFByZXByb2Nlc3NpbmcgaXMgZG9uZSBzZXBhcmF0ZWx5IGluIHNvbWUgY29uZmlndXJlIHRlc3RzLgoKYENDX0ZPUl9CVUlMRCcKICAgICBTb21lIGJ1aWxkLXRpbWUgcHJvZ3JhbXMgYXJlIGNvbXBpbGVkIGFuZCBydW4gdG8gZ2VuZXJhdGUKICAgICBob3N0LXNwZWNpZmljIGRhdGEgdGFibGVzLiAgYENDX0ZPUl9CVUlMRCcgaXMgdGhlIGNvbXBpbGVyIHVzZWQKICAgICBmb3IgdGhpcy4gIEl0IGRvZXNuJ3QgbmVlZCB0byBiZSBpbiBhbnkgcGFydGljdWxhciBBQkkgb3IgbW9kZSwgaXQKICAgICBtZXJlbHkgbmVlZHMgdG8gZ2VuZXJhdGUgZXhlY3V0YWJsZXMgdGhhdCBjYW4gcnVuLiAgVGhlIGRlZmF1bHQgaXMKICAgICB0byB0cnkgdGhlIHNlbGVjdGVkIGBDQycgYW5kIHNvbWUgbGlrZWx5IGNhbmRpZGF0ZXMgc3VjaCBhcyBgY2MnCiAgICAgYW5kIGBnY2MnLCBsb29raW5nIGZvciBzb21ldGhpbmcgdGhhdCB3b3Jrcy4KCiAgICAgTm8gZmxhZ3MgYXJlIHVzZWQgd2l0aCBgQ0NfRk9SX0JVSUxEJyBiZWNhdXNlIGEgc2ltcGxlIGludm9jYXRpb24KICAgICBsaWtlIGBjYyBmb28uYycgc2hvdWxkIGJlIGVub3VnaC4gIElmIHNvbWUgcGFydGljdWxhciBvcHRpb25zIGFyZQogICAgIHJlcXVpcmVkIHRoZXkgY2FuIGJlIGluY2x1ZGVkIGFzIGZvciBpbnN0YW5jZSBgQ0NfRk9SX0JVSUxEPSJjYwogICAgIC13aGF0ZXZlciInLgoKQysrIFN1cHBvcnQsIGAtLWVuYWJsZS1jeHgnCiAgICAgQysrIHN1cHBvcnQgaW4gR01QIGNhbiBiZSBlbmFibGVkIHdpdGggYC0tZW5hYmxlLWN4eCcsIGluIHdoaWNoCiAgICAgY2FzZSBhIEMrKyBjb21waWxlciB3aWxsIGJlIHJlcXVpcmVkLiAgQXMgYSBjb252ZW5pZW5jZQogICAgIGAtLWVuYWJsZS1jeHg9ZGV0ZWN0JyBjYW4gYmUgdXNlZCB0byBlbmFibGUgQysrIHN1cHBvcnQgb25seSBpZiBhCiAgICAgY29tcGlsZXIgY2FuIGJlIGZvdW5kLiAgVGhlIEMrKyBzdXBwb3J0IGNvbnNpc3RzIG9mIGEgbGlicmFyeQogICAgIGBsaWJnbXB4eC5sYScgYW5kIGhlYWRlciBmaWxlIGBnbXB4eC5oJyAoKm5vdGUgSGVhZGVycyBhbmQKICAgICBMaWJyYXJpZXM6OikuCgogICAgIEEgc2VwYXJhdGUgYGxpYmdtcHh4LmxhJyBoYXMgYmVlbiBhZG9wdGVkIHJhdGhlciB0aGFuIGhhdmluZyBDKysKICAgICBvYmplY3RzIHdpdGhpbiBgbGliZ21wLmxhJyBpbiBvcmRlciB0byBlbnN1cmUgZHluYW1pYyBsaW5rZWQgQwogICAgIHByb2dyYW1zIGFyZW4ndCBibG9hdGVkIGJ5IGEgZGVwZW5kZW5jeSBvbiB0aGUgQysrIHN0YW5kYXJkCiAgICAgbGlicmFyeSwgYW5kIHRvIGF2b2lkIGFueSBjaGFuY2UgdGhhdCB0aGUgQysrIGNvbXBpbGVyIGNvdWxkIGJlCiAgICAgcmVxdWlyZWQgd2hlbiBsaW5raW5nIHBsYWluIEMgcHJvZ3JhbXMuCgogICAgIGBsaWJnbXB4eC5sYScgd2lsbCB1c2UgY2VydGFpbiBpbnRlcm5hbHMgZnJvbSBgbGliZ21wLmxhJyBhbmQgY2FuCiAgICAgb25seSBiZSBleHBlY3RlZCB0byB3b3JrIHdpdGggYGxpYmdtcC5sYScgZnJvbSB0aGUgc2FtZSBHTVAKICAgICB2ZXJzaW9uLiAgRnV0dXJlIGNoYW5nZXMgdG8gdGhlIHJlbGV2YW50IGludGVybmFscyB3aWxsIGJlCiAgICAgYWNjb21wYW5pZWQgYnkgcmVuYW1pbmcsIHNvIGEgbWlzbWF0Y2ggd2lsbCBjYXVzZSB1bnJlc29sdmVkCiAgICAgc3ltYm9scyByYXRoZXIgdGhhbiBwZXJoYXBzIG15c3RlcmlvdXMgbWlzYmVoYXZpb3VyLgoKICAgICBJbiBnZW5lcmFsIGBsaWJnbXB4eC5sYScgd2lsbCBiZSB1c2FibGUgb25seSB3aXRoIHRoZSBDKysgY29tcGlsZXIKICAgICB0aGF0IGJ1aWx0IGl0LCBzaW5jZSBuYW1lIG1hbmdsaW5nIGFuZCBydW50aW1lIHN1cHBvcnQgYXJlIHVzdWFsbHkKICAgICBpbmNvbXBhdGlibGUgYmV0d2VlbiBkaWZmZXJlbnQgY29tcGlsZXJzLgoKYENYWCcsIGBDWFhGTEFHUycKICAgICBXaGVuIEMrKyBzdXBwb3J0IGlzIGVuYWJsZWQsIHRoZSBDKysgY29tcGlsZXIgYW5kIGl0cyBmbGFncyBjYW4gYmUKICAgICBzZXQgd2l0aCB2YXJpYWJsZXMgYENYWCcgYW5kIGBDWFhGTEFHUycgaW4gdGhlIHVzdWFsIHdheS4gIFRoZQogICAgIGRlZmF1bHQgZm9yIGBDWFgnIGlzIHRoZSBmaXJzdCBjb21waWxlciB0aGF0IHdvcmtzIGZyb20gYSBsaXN0IG9mCiAgICAgbGlrZWx5IGNhbmRpZGF0ZXMsIHdpdGggYGcrKycgbm9ybWFsbHkgcHJlZmVycmVkIHdoZW4gYXZhaWxhYmxlLgogICAgIFRoZSBkZWZhdWx0IGZvciBgQ1hYRkxBR1MnIGlzIHRvIHRyeSBgQ0ZMQUdTJywgYENGTEFHUycgd2l0aG91dAogICAgIGAtZycsIHRoZW4gZm9yIGBnKysnIGVpdGhlciBgLWcgLU8yJyBvciBgLU8yJywgb3IgZm9yIG90aGVyCiAgICAgY29tcGlsZXJzIGAtZycgb3Igbm90aGluZy4gIFRyeWluZyBgQ0ZMQUdTJyB0aGlzIHdheSBpcyBjb252ZW5pZW50CiAgICAgd2hlbiB1c2luZyBgZ2NjJyBhbmQgYGcrKycgdG9nZXRoZXIsIHNpbmNlIHRoZSBmbGFncyBmb3IgYGdjYycgd2lsbAogICAgIHVzdWFsbHkgc3VpdCBgZysrJy4KCiAgICAgSXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgQyBhbmQgQysrIGNvbXBpbGVycyBtYXRjaCwgbWVhbmluZyB0aGVpcgogICAgIHN0YXJ0dXAgYW5kIHJ1bnRpbWUgc3VwcG9ydCByb3V0aW5lcyBhcmUgY29tcGF0aWJsZSBhbmQgdGhhdCB0aGV5CiAgICAgZ2VuZXJhdGUgY29kZSBpbiB0aGUgc2FtZSBBQkkgKGlmIHRoZXJlJ3MgYSBjaG9pY2Ugb2YgQUJJcyBvbiB0aGUKICAgICBzeXN0ZW0pLiAgYC4vY29uZmlndXJlJyBpc24ndCBjdXJyZW50bHkgYWJsZSB0byBjaGVjayB0aGVzZSB0aGluZ3MKICAgICB2ZXJ5IHdlbGwgaXRzZWxmLCBzbyBmb3IgdGhhdCByZWFzb24gYC0tZGlzYWJsZS1jeHgnIGlzIHRoZQogICAgIGRlZmF1bHQsIHRvIGF2b2lkIGEgYnVpbGQgZmFpbHVyZSBkdWUgdG8gYSBjb21waWxlciBtaXNtYXRjaC4KICAgICBQZXJoYXBzIHRoaXMgd2lsbCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KCiAgICAgSW5jaWRlbnRhbGx5LCBpdCdzIG5vcm1hbGx5IG5vdCBnb29kIGVub3VnaCB0byBzZXQgYENYWCcgdG8gdGhlCiAgICAgc2FtZSBhcyBgQ0MnLiAgQWx0aG91Z2ggYGdjYycgZm9yIGluc3RhbmNlIHJlY29nbmlzZXMgYGZvby5jYycgYXMKICAgICBDKysgY29kZSwgb25seSBgZysrJyB3aWxsIGludm9rZSB0aGUgbGlua2VyIHRoZSByaWdodCB3YXkgd2hlbgogICAgIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgb3Igc2hhcmVkIGxpYnJhcnkgZnJvbSBDKysgb2JqZWN0IGZpbGVzLgoKVGVtcG9yYXJ5IE1lbW9yeSwgYC0tZW5hYmxlLWFsbG9jYT08Y2hvaWNlPicKICAgICBHTVAgYWxsb2NhdGVzIHRlbXBvcmFyeSB3b3Jrc3BhY2UgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgdGhyZWUKICAgICBtZXRob2RzLCB3aGljaCBjYW4gYmUgc2VsZWN0ZWQgd2l0aCBmb3IgaW5zdGFuY2UKICAgICBgLS1lbmFibGUtYWxsb2NhPW1hbGxvYy1yZWVudHJhbnQnLgoKICAgICAgICAqIGBhbGxvY2EnIC0gQyBsaWJyYXJ5IG9yIGNvbXBpbGVyIGJ1aWx0aW4uCgogICAgICAgICogYG1hbGxvYy1yZWVudHJhbnQnIC0gdGhlIGhlYXAsIGluIGEgcmUtZW50cmFudCBmYXNoaW9uLgoKICAgICAgICAqIGBtYWxsb2Mtbm90cmVlbnRyYW50JyAtIHRoZSBoZWFwLCB3aXRoIGdsb2JhbCB2YXJpYWJsZXMuCgogICAgIEZvciBjb252ZW5pZW5jZSwgdGhlIGZvbGxvd2luZyBjaG9pY2VzIGFyZSBhbHNvIGF2YWlsYWJsZS4KICAgICBgLS1kaXNhYmxlLWFsbG9jYScgaXMgdGhlIHNhbWUgYXMgYG5vJy4KCiAgICAgICAgKiBgeWVzJyAtIGEgc3lub255bSBmb3IgYGFsbG9jYScuCgogICAgICAgICogYG5vJyAtIGEgc3lub255bSBmb3IgYG1hbGxvYy1yZWVudHJhbnQnLgoKICAgICAgICAqIGByZWVudHJhbnQnIC0gYGFsbG9jYScgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UKICAgICAgICAgIGBtYWxsb2MtcmVlbnRyYW50Jy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQuCgogICAgICAgICogYG5vdHJlZW50cmFudCcgLSBgYWxsb2NhJyBpZiBhdmFpbGFibGUsIG90aGVyd2lzZQogICAgICAgICAgYG1hbGxvYy1ub3RyZWVudHJhbnQnLgoKICAgICBgYWxsb2NhJyBpcyByZWVudHJhbnQgYW5kIGZhc3QsIGFuZCBpcyByZWNvbW1lbmRlZC4gIEl0IGFjdHVhbGx5CiAgICAgYWxsb2NhdGVzIGp1c3Qgc21hbGwgYmxvY2tzIG9uIHRoZSBzdGFjazsgbGFyZ2VyIG9uZXMgdXNlCiAgICAgbWFsbG9jLXJlZW50cmFudC4KCiAgICAgYG1hbGxvYy1yZWVudHJhbnQnIGlzLCBhcyB0aGUgbmFtZSBzdWdnZXN0cywgcmVlbnRyYW50IGFuZCB0aHJlYWQKICAgICBzYWZlLCBidXQgYG1hbGxvYy1ub3RyZWVudHJhbnQnIGlzIGZhc3RlciBhbmQgc2hvdWxkIGJlIHVzZWQgaWYKICAgICByZWVudHJhbmN5IGlzIG5vdCByZXF1aXJlZC4KCiAgICAgVGhlIHR3byBtYWxsb2MgbWV0aG9kcyBpbiBmYWN0IHVzZSB0aGUgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zCiAgICAgc2VsZWN0ZWQgYnkgYG1wX3NldF9tZW1vcnlfZnVuY3Rpb25zJywgdGhlc2UgYmVpbmcgYG1hbGxvYycgYW5kCiAgICAgZnJpZW5kcyBieSBkZWZhdWx0LiAgKk5vdGUgQ3VzdG9tIEFsbG9jYXRpb246Oi4KCiAgICAgQW4gYWRkaXRpb25hbCBjaG9pY2UgYC0tZW5hYmxlLWFsbG9jYT1kZWJ1ZycgaXMgYXZhaWxhYmxlLCB0byBoZWxwCiAgICAgd2hlbiBkZWJ1Z2dpbmcgbWVtb3J5IHJlbGF0ZWQgcHJvYmxlbXMgKCpub3RlIERlYnVnZ2luZzo6KS4KCkZGVCBNdWx0aXBsaWNhdGlvbiwgYC0tZGlzYWJsZS1mZnQnCiAgICAgQnkgZGVmYXVsdCBtdWx0aXBsaWNhdGlvbnMgYXJlIGRvbmUgdXNpbmcgS2FyYXRzdWJhLCAzLXdheSBUb29tLAogICAgIGhpZ2hlciBkZWdyZWUgVG9vbSwgYW5kIEZlcm1hdCBGRlQuICBUaGUgRkZUIGlzIG9ubHkgdXNlZCBvbiBsYXJnZQogICAgIHRvIHZlcnkgbGFyZ2Ugb3BlcmFuZHMgYW5kIGNhbiBiZSBkaXNhYmxlZCB0byBzYXZlIGNvZGUgc2l6ZSBpZgogICAgIGRlc2lyZWQuCgpBc3NlcnRpb24gQ2hlY2tpbmcsIGAtLWVuYWJsZS1hc3NlcnQnCiAgICAgVGhpcyBvcHRpb24gZW5hYmxlcyBzb21lIGNvbnNpc3RlbmN5IGNoZWNraW5nIHdpdGhpbiB0aGUgbGlicmFyeS4KICAgICBUaGlzIGNhbiBiZSBvZiB1c2Ugd2hpbGUgZGVidWdnaW5nLCAqbm90ZSBEZWJ1Z2dpbmc6Oi4KCkV4ZWN1dGlvbiBQcm9maWxpbmcsIGAtLWVuYWJsZS1wcm9maWxpbmc9cHJvZi9ncHJvZi9pbnN0cnVtZW50JwogICAgIEVuYWJsZSBwcm9maWxpbmcgc3VwcG9ydCwgaW4gb25lIG9mIHZhcmlvdXMgc3R5bGVzLCAqbm90ZQogICAgIFByb2ZpbGluZzo6LgoKYE1QTl9QQVRIJwogICAgIFZhcmlvdXMgYXNzZW1ibHkgdmVyc2lvbnMgb2YgZWFjaCBtcG4gc3Vicm91dGluZXMgYXJlIHByb3ZpZGVkLgogICAgIEZvciBhIGdpdmVuIENQVSwgYSBzZWFyY2ggaXMgbWFkZSB0aG91Z2ggYSBwYXRoIHRvIGNob29zZSBhCiAgICAgdmVyc2lvbiBvZiBlYWNoLiAgRm9yIGV4YW1wbGUgYHNwYXJjdjgnIGhhcwoKICAgICAgICAgIE1QTl9QQVRIPSJzcGFyYzMyL3Y4IHNwYXJjMzIgZ2VuZXJpYyIKCiAgICAgd2hpY2ggbWVhbnMgbG9vayBmaXJzdCBmb3IgdjggY29kZSwgdGhlbiBwbGFpbiBzcGFyYzMyICh3aGljaCBpcwogICAgIHY3KSwgYW5kIGZpbmFsbHkgZmFsbCBiYWNrIG9uIGdlbmVyaWMgQy4gIEtub3dsZWRnZWFibGUgdXNlcnMgd2l0aAogICAgIHNwZWNpYWwgcmVxdWlyZW1lbnRzIGNhbiBzcGVjaWZ5IGEgZGlmZmVyZW50IHBhdGguICBOb3JtYWxseSB0aGlzCiAgICAgaXMgY29tcGxldGVseSB1bm5lY2Vzc2FyeS4KCkRvY3VtZW50YXRpb24KICAgICBUaGUgc291cmNlIGZvciB0aGUgZG9jdW1lbnQgeW91J3JlIG5vdyByZWFkaW5nIGlzIGBkb2MvZ21wLnRleGknLAogICAgIGluIFRleGluZm8gZm9ybWF0LCBzZWUgKm5vdGUgVGV4aW5mbzogKHRleGluZm8pVG9wLgoKICAgICBJbmZvIGZvcm1hdCBgZG9jL2dtcC5pbmZvJyBpcyBpbmNsdWRlZCBpbiB0aGUgZGlzdHJpYnV0aW9uLiAgVGhlCiAgICAgdXN1YWwgYXV0b21ha2UgdGFyZ2V0cyBhcmUgYXZhaWxhYmxlIHRvIG1ha2UgUG9zdFNjcmlwdCwgRFZJLCBQREYKICAgICBhbmQgSFRNTCAodGhlc2Ugd2lsbCByZXF1aXJlIHZhcmlvdXMgVGVYIGFuZCBUZXhpbmZvIHRvb2xzKS4KCiAgICAgRG9jQm9vayBhbmQgWE1MIGNhbiBiZSBnZW5lcmF0ZWQgYnkgdGhlIFRleGluZm8gYG1ha2VpbmZvJyBwcm9ncmFtCiAgICAgdG9vLCBzZWUgKm5vdGUgT3B0aW9ucyBmb3IgYG1ha2VpbmZvJzogKHRleGluZm8pbWFrZWluZm8gb3B0aW9ucy4KCiAgICAgU29tZSBzdXBwbGVtZW50YXJ5IG5vdGVzIGNhbiBhbHNvIGJlIGZvdW5kIGluIHRoZSBgZG9jJwogICAgIHN1YmRpcmVjdG9yeS4KCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogQUJJIGFuZCBJU0EsICBOZXh0OiBOb3RlcyBmb3IgUGFja2FnZSBCdWlsZHMsICBQcmV2OiBCdWlsZCBPcHRpb25zLCAgVXA6IEluc3RhbGxpbmcgR01QCgoyLjIgQUJJIGFuZCBJU0EKPT09PT09PT09PT09PT09CgpBQkkgKEFwcGxpY2F0aW9uIEJpbmFyeSBJbnRlcmZhY2UpIHJlZmVycyB0byB0aGUgY2FsbGluZyBjb252ZW50aW9ucwpiZXR3ZWVuIGZ1bmN0aW9ucywgbWVhbmluZyB3aGF0IHJlZ2lzdGVycyBhcmUgdXNlZCBhbmQgd2hhdCBzaXplcyB0aGUKdmFyaW91cyBDIGRhdGEgdHlwZXMgYXJlLiAgSVNBIChJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlKSByZWZlcnMgdG8KdGhlIGluc3RydWN0aW9ucyBhbmQgcmVnaXN0ZXJzIGEgQ1BVIGhhcyBhdmFpbGFibGUuCgogICBTb21lIDY0LWJpdCBJU0EgQ1BVcyBoYXZlIGJvdGggYSA2NC1iaXQgQUJJIGFuZCBhIDMyLWJpdCBBQkkKZGVmaW5lZCwgdGhlIGxhdHRlciBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIENQVXMgaW4gdGhlIGZhbWlseS4KR01QIHN1cHBvcnRzIHNvbWUgQ1BVcyBsaWtlIHRoaXMgaW4gYm90aCBBQklzLiAgSW4gZmFjdCB3aXRoaW4gR01QCmBBQkknIG1lYW5zIGEgY29tYmluYXRpb24gb2YgY2hpcCBBQkksIHBsdXMgaG93IEdNUCBjaG9vc2VzIHRvIHVzZSBpdC4KRm9yIGV4YW1wbGUgaW4gc29tZSAzMi1iaXQgQUJJcywgR01QIG1heSBzdXBwb3J0IGEgbGltYiBhcyBlaXRoZXIgYQozMi1iaXQgYGxvbmcnIG9yIGEgNjQtYml0IGBsb25nIGxvbmcnLgoKICAgQnkgZGVmYXVsdCBHTVAgY2hvb3NlcyB0aGUgYmVzdCBBQkkgYXZhaWxhYmxlIGZvciBhIGdpdmVuIHN5c3RlbSwKYW5kIHRoaXMgZ2VuZXJhbGx5IGdpdmVzIHNpZ25pZmljYW50bHkgZ3JlYXRlciBzcGVlZC4gIEJ1dCBhbiBBQkkgY2FuCmJlIGNob3NlbiBleHBsaWNpdGx5IHRvIG1ha2UgR01QIGNvbXBhdGlibGUgd2l0aCBvdGhlciBsaWJyYXJpZXMsIG9yCnBhcnRpY3VsYXIgYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiAgRm9yIGV4YW1wbGUsCgogICAgIC4vY29uZmlndXJlIEFCST0zMgoKICAgSW4gYWxsIGNhc2VzIGl0J3Mgdml0YWwgdGhhdCBhbGwgb2JqZWN0IGNvZGUgdXNlZCBpbiBhIGdpdmVuIHByb2dyYW0KaXMgY29tcGlsZWQgZm9yIHRoZSBzYW1lIEFCSS4KCiAgIFVzdWFsbHkgYSBsaW1iIGlzIGltcGxlbWVudGVkIGFzIGEgYGxvbmcnLiAgV2hlbiBhIGBsb25nIGxvbmcnIGxpbWIKaXMgdXNlZCB0aGlzIGlzIGVuY29kZWQgaW4gdGhlIGdlbmVyYXRlZCBgZ21wLmgnLiAgVGhpcyBpcyBjb252ZW5pZW50CmZvciBhcHBsaWNhdGlvbnMsIGJ1dCBpdCBkb2VzIG1lYW4gdGhhdCBgZ21wLmgnIHdpbGwgdmFyeSwgYW5kIGNhbid0IGJlCmp1c3QgY29waWVkIGFyb3VuZC4gIGBnbXAuaCcgcmVtYWlucyBjb21waWxlciBpbmRlcGVuZGVudCB0aG91Z2gsIHNpbmNlCmFsbCBjb21waWxlcnMgZm9yIGEgcGFydGljdWxhciBBQkkgd2lsbCBiZSBleHBlY3RlZCB0byB1c2UgdGhlIHNhbWUKbGltYiB0eXBlLgoKICAgQ3VycmVudGx5IG5vIGF0dGVtcHQgaXMgbWFkZSB0byBmb2xsb3cgd2hhdGV2ZXIgY29udmVudGlvbnMgYSBzeXN0ZW0KaGFzIGZvciBpbnN0YWxsaW5nIGxpYnJhcnkgb3IgaGVhZGVyIGZpbGVzIGJ1aWx0IGZvciBhIHBhcnRpY3VsYXIgQUJJLgpUaGlzIHdpbGwgcHJvYmFibHkgb25seSBtYXR0ZXIgd2hlbiBpbnN0YWxsaW5nIG11bHRpcGxlIGJ1aWxkcyBvZiBHTVAsCmFuZCBpdCBtaWdodCBiZSBhcyBzaW1wbGUgYXMgY29uZmlndXJpbmcgd2l0aCBhIHNwZWNpYWwgYGxpYmRpcicsIG9yIGl0Cm1pZ2h0IHJlcXVpcmUgbW9yZSB0aGFuIHRoYXQuICBOb3RlIHRoYXQgYnVpbGRzIGZvciBkaWZmZXJlbnQgQUJJcyBuZWVkCnRvIGRvbmUgc2VwYXJhdGVseSwgd2l0aCBhIGZyZXNoIGAuL2NvbmZpZ3VyZScgYW5kIGBtYWtlJyBlYWNoLgoKCkFNRDY0IChgeDg2XzY0JykKICAgICBPbiBBTUQ2NCBzeXN0ZW1zIHN1cHBvcnRpbmcgYm90aCAzMi1iaXQgYW5kIDY0LWJpdCBtb2RlcyBmb3IKICAgICBhcHBsaWNhdGlvbnMsIHRoZSBmb2xsb3dpbmcgQUJJIGNob2ljZXMgYXJlIGF2YWlsYWJsZS4KCiAgICBgQUJJPTY0JwogICAgICAgICAgVGhlIDY0LWJpdCBBQkkgdXNlcyA2NC1iaXQgbGltYnMgYW5kIHBvaW50ZXJzIGFuZCBtYWtlcyBmdWxsCiAgICAgICAgICB1c2Ugb2YgdGhlIGNoaXAgYXJjaGl0ZWN0dXJlLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KICAgICAgICAgIEFwcGxpY2F0aW9ucyB3aWxsIHVzdWFsbHkgbm90IG5lZWQgc3BlY2lhbCBjb21waWxlciBmbGFncywKICAgICAgICAgIGJ1dCBmb3IgcmVmZXJlbmNlIHRoZSBvcHRpb24gaXMKCiAgICAgICAgICAgICAgIGdjYyAgLW02NAoKICAgIGBBQkk9MzInCiAgICAgICAgICBUaGUgMzItYml0IEFCSSBpcyB0aGUgdXN1YWwgaTM4NiBjb252ZW50aW9ucy4gIFRoaXMgd2lsbCBiZQogICAgICAgICAgc2xvd2VyLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGV4Y2VwdCBmb3IgaW50ZXItb3BlcmF0aW5nCiAgICAgICAgICB3aXRoIG90aGVyIGNvZGUgbm90IHlldCA2NC1iaXQgY2FwYWJsZS4gIEFwcGxpY2F0aW9ucyBtdXN0IGJlCiAgICAgICAgICBjb21waWxlZCB3aXRoCgogICAgICAgICAgICAgICBnY2MgIC1tMzIKCiAgICAgICAgICAoSW4gR0NDIDIuOTUgYW5kIGVhcmxpZXIgdGhlcmUncyBubyBgLW0zMicgb3B0aW9uLCBpdCdzIHRoZQogICAgICAgICAgb25seSBtb2RlLikKCiAgICBgQUJJPXgzMicKICAgICAgICAgIFRoZSB4MzIgQUJJIHVzZXMgNjQtYml0IGxpbWJzIGJ1dCAzMi1iaXQgcG9pbnRlcnMuICBMaWtlIHRoZQogICAgICAgICAgNjQtYml0IEFCSSwgaXQgbWFrZXMgZnVsbCB1c2Ugb2YgdGhlIGNoaXAncyBhcml0aG1ldGljCiAgICAgICAgICBjYXBhYmlsaXRpZXMuICBUaGlzIEFCSSBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBvcGVyYXRpbmcKICAgICAgICAgIHN5c3RlbXMuCgogICAgICAgICAgICAgICBnY2MgIC1teDMyCgoKCkhQUEEgMi4wIChgaHBwYTIuMConLCBgaHBwYTY0JykKCiAgICBgQUJJPTIuMHcnCiAgICAgICAgICBUaGUgMi4wdyBBQkkgdXNlcyA2NC1iaXQgbGltYnMgYW5kIHBvaW50ZXJzIGFuZCBpcyBhdmFpbGFibGUKICAgICAgICAgIG9uIEhQLVVYIDExIG9yIHVwLiAgQXBwbGljYXRpb25zIG11c3QgYmUgY29tcGlsZWQgd2l0aAoKICAgICAgICAgICAgICAgZ2NjIFtidWlsdCBmb3IgMi4wd10KICAgICAgICAgICAgICAgY2MgICtERDY0CgogICAgYEFCST0yLjBuJwogICAgICAgICAgVGhlIDIuMG4gQUJJIG1lYW5zIHRoZSAzMi1iaXQgSFBQQSAxLjAgQUJJIGFuZCBhbGwgaXRzIG5vcm1hbAogICAgICAgICAgY2FsbGluZyBjb252ZW50aW9ucywgYnV0IHdpdGggNjQtYml0IGluc3RydWN0aW9ucyBwZXJtaXR0ZWQKICAgICAgICAgIHdpdGhpbiBmdW5jdGlvbnMuICBHTVAgdXNlcyBhIDY0LWJpdCBgbG9uZyBsb25nJyBmb3IgYSBsaW1iLgogICAgICAgICAgVGhpcyBBQkkgaXMgYXZhaWxhYmxlIG9uIGhwcGE2NCBHTlUvTGludXggYW5kIG9uIEhQLVVYIDEwIG9yCiAgICAgICAgICBoaWdoZXIuICBBcHBsaWNhdGlvbnMgbXVzdCBiZSBjb21waWxlZCB3aXRoCgogICAgICAgICAgICAgICBnY2MgW2J1aWx0IGZvciAyLjBuXQogICAgICAgICAgICAgICBjYyAgK0RBMi4wICtlCgogICAgICAgICAgTm90ZSB0aGF0IGN1cnJlbnQgdmVyc2lvbnMgb2YgR0NDIChlZy4gMy4yKSBkb24ndCBnZW5lcmF0ZQogICAgICAgICAgNjQtYml0IGluc3RydWN0aW9ucyBmb3IgYGxvbmcgbG9uZycgb3BlcmF0aW9ucyBhbmQgc28gbWF5IGJlCiAgICAgICAgICBzbG93ZXIgdGhhbiBmb3IgMi4wdy4gIChUaGUgR01QIGFzc2VtYmx5IGNvZGUgaXMgdGhlIHNhbWUKICAgICAgICAgIHRob3VnaC4pCgogICAgYEFCST0xLjAnCiAgICAgICAgICBIUFBBIDIuMCBDUFVzIGNhbiBydW4gYWxsIEhQUEEgMS4wIGFuZCAxLjEgY29kZSBpbiB0aGUgMzItYml0CiAgICAgICAgICBIUFBBIDEuMCBBQkkuICBObyBzcGVjaWFsIGNvbXBpbGVyIG9wdGlvbnMgYXJlIG5lZWRlZCBmb3IKICAgICAgICAgIGFwcGxpY2F0aW9ucy4KCiAgICAgQWxsIHRocmVlIEFCSXMgYXJlIGF2YWlsYWJsZSBmb3IgQ1BVIHR5cGVzIGBocHBhMi4wdycsIGBocHBhMi4wJwogICAgIGFuZCBgaHBwYTY0JywgYnV0IGZvciBDUFUgdHlwZSBgaHBwYTIuMG4nIG9ubHkgMi4wbiBvciAxLjAgYXJlCiAgICAgY29uc2lkZXJlZC4KCiAgICAgTm90ZSB0aGF0IEdDQyBvbiBIUC1VWCBoYXMgbm8gb3B0aW9ucyB0byBjaG9vc2UgYmV0d2VlbiAyLjBuIGFuZAogICAgIDIuMHcgbW9kZXMsIHVubGlrZSBIUCBgY2MnLiAgSW5zdGVhZCBpdCBtdXN0IGJlIGJ1aWx0IGZvciBvbmUgb3IKICAgICB0aGUgb3RoZXIgQUJJLiAgR01QIHdpbGwgZGV0ZWN0IGhvdyBpdCB3YXMgYnVpbHQsIGFuZCBza2lwIHRvIHRoZQogICAgIGNvcnJlc3BvbmRpbmcgYEFCSScuCgoKSUEtNjQgdW5kZXIgSFAtVVggKGBpYTY0Ki0qLWhwdXgqJywgYGl0YW5pdW0qLSotaHB1eConKQogICAgIEhQLVVYIHN1cHBvcnRzIHR3byBBQklzIGZvciBJQS02NC4gIEdNUCBwZXJmb3JtYW5jZSBpcyB0aGUgc2FtZSBpbgogICAgIGJvdGguCgogICAgYEFCST0zMicKICAgICAgICAgIEluIHRoZSAzMi1iaXQgQUJJLCBwb2ludGVycywgYGludCdzIGFuZCBgbG9uZydzIGFyZSAzMiBiaXRzCiAgICAgICAgICBhbmQgR01QIHVzZXMgYSA2NCBiaXQgYGxvbmcgbG9uZycgZm9yIGEgbGltYi4gIEFwcGxpY2F0aW9ucwogICAgICAgICAgY2FuIGJlIGNvbXBpbGVkIHdpdGhvdXQgYW55IHNwZWNpYWwgZmxhZ3Mgc2luY2UgdGhpcyBBQkkgaXMKICAgICAgICAgIHRoZSBkZWZhdWx0IGluIGJvdGggSFAgQyBhbmQgR0NDLCBidXQgZm9yIHJlZmVyZW5jZSB0aGUgZmxhZ3MKICAgICAgICAgIGFyZQoKICAgICAgICAgICAgICAgZ2NjICAtbWlscDMyCiAgICAgICAgICAgICAgIGNjICAgK0REMzIKCiAgICBgQUJJPTY0JwogICAgICAgICAgSW4gdGhlIDY0LWJpdCBBQkksIGBsb25nJ3MgYW5kIHBvaW50ZXJzIGFyZSA2NCBiaXRzIGFuZCBHTVAKICAgICAgICAgIHVzZXMgYSBgbG9uZycgZm9yIGEgbGltYi4gIEFwcGxpY2F0aW9ucyBtdXN0IGJlIGNvbXBpbGVkIHdpdGgKCiAgICAgICAgICAgICAgIGdjYyAgLW1scDY0CiAgICAgICAgICAgICAgIGNjICAgK0RENjQKCiAgICAgT24gb3RoZXIgSUEtNjQgc3lzdGVtcywgR05VL0xpbnV4IGZvciBpbnN0YW5jZSwgYEFCST02NCcgaXMgdGhlCiAgICAgb25seSBjaG9pY2UuCgoKTUlQUyB1bmRlciBJUklYIDYgKGBtaXBzKi0qLWlyaXhbNjc4OV0nKQogICAgIElSSVggNiBhbHdheXMgaGFzIGEgNjQtYml0IE1JUFMgMyBvciBiZXR0ZXIgQ1BVLCBhbmQgc3VwcG9ydHMgQUJJcwogICAgIG8zMiwgbjMyLCBhbmQgNjQuICBuMzIgb3IgNjQgYXJlIHJlY29tbWVuZGVkLCBhbmQgR01QIHBlcmZvcm1hbmNlCiAgICAgd2lsbCBiZSB0aGUgc2FtZSBpbiBlYWNoLiAgVGhlIGRlZmF1bHQgaXMgbjMyLgoKICAgIGBBQkk9bzMyJwogICAgICAgICAgVGhlIG8zMiBBQkkgaXMgMzItYml0IHBvaW50ZXJzIGFuZCBpbnRlZ2VycywgYW5kIG5vIDY0LWJpdAogICAgICAgICAgb3BlcmF0aW9ucy4gIEdNUCB3aWxsIGJlIHNsb3dlciB0aGFuIGluIG4zMiBvciA2NCwgdGhpcwogICAgICAgICAgb3B0aW9uIG9ubHkgZXhpc3RzIHRvIHN1cHBvcnQgb2xkIGNvbXBpbGVycywgZWcuIEdDQyAyLjcuMi4KICAgICAgICAgIEFwcGxpY2F0aW9ucyBjYW4gYmUgY29tcGlsZWQgd2l0aCBubyBzcGVjaWFsIGZsYWdzIG9uIGFuIG9sZAogICAgICAgICAgY29tcGlsZXIsIG9yIG9uIGEgbmV3ZXIgY29tcGlsZXIgd2l0aAoKICAgICAgICAgICAgICAgZ2NjICAtbWFiaT0zMgogICAgICAgICAgICAgICBjYyAgIC0zMgoKICAgIGBBQkk9bjMyJwogICAgICAgICAgVGhlIG4zMiBBQkkgaXMgMzItYml0IHBvaW50ZXJzIGFuZCBpbnRlZ2VycywgYnV0IHdpdGggYQogICAgICAgICAgNjQtYml0IGxpbWIgdXNpbmcgYSBgbG9uZyBsb25nJy4gIEFwcGxpY2F0aW9ucyBtdXN0IGJlCiAgICAgICAgICBjb21waWxlZCB3aXRoCgogICAgICAgICAgICAgICBnY2MgIC1tYWJpPW4zMgogICAgICAgICAgICAgICBjYyAgIC1uMzIKCiAgICBgQUJJPTY0JwogICAgICAgICAgVGhlIDY0LWJpdCBBQkkgaXMgNjQtYml0IHBvaW50ZXJzIGFuZCBpbnRlZ2Vycy4gIEFwcGxpY2F0aW9ucwogICAgICAgICAgbXVzdCBiZSBjb21waWxlZCB3aXRoCgogICAgICAgICAgICAgICBnY2MgIC1tYWJpPTY0CiAgICAgICAgICAgICAgIGNjICAgLTY0CgogICAgIE5vdGUgdGhhdCBNSVBTIEdOVS9MaW51eCwgYXMgb2Yga2VybmVsIHZlcnNpb24gMi4yLCBkb2Vzbid0IGhhdmUKICAgICB0aGUgbmVjZXNzYXJ5IHN1cHBvcnQgZm9yIG4zMiBvciA2NCBhbmQgc28gb25seSBnZXRzIGEgMzItYml0IGxpbWIKICAgICBhbmQgdGhlIE1JUFMgMiBjb2RlLgoKClBvd2VyUEMgNjQgKGBwb3dlcnBjNjQnLCBgcG93ZXJwYzYyMCcsIGBwb3dlcnBjNjMwJywgYHBvd2VycGM5NzAnLCBgcG93ZXI0JywgYHBvd2VyNScpCgogICAgYEFCST1tb2RlNjQnCiAgICAgICAgICBUaGUgQUlYIDY0IEFCSSB1c2VzIDY0LWJpdCBsaW1icyBhbmQgcG9pbnRlcnMgYW5kIGlzIHRoZQogICAgICAgICAgZGVmYXVsdCBvbiBQb3dlclBDIDY0IGAqLSotYWl4Kicgc3lzdGVtcy4gIEFwcGxpY2F0aW9ucyBtdXN0CiAgICAgICAgICBiZSBjb21waWxlZCB3aXRoCgogICAgICAgICAgICAgICBnY2MgIC1tYWl4NjQKICAgICAgICAgICAgICAgeGxjICAtcTY0CgogICAgICAgICAgT24gNjQtYml0IEdOVS9MaW51eCwgQlNELCBhbmQgTWFjIE9TIFgvRGFyd2luIHN5c3RlbXMsIHRoZQogICAgICAgICAgYXBwbGljYXRpb25zIG11c3QgYmUgY29tcGlsZWQgd2l0aAoKICAgICAgICAgICAgICAgZ2NjICAtbTY0CgogICAgYEFCST1tb2RlMzInCiAgICAgICAgICBUaGUgYG1vZGUzMicgQUJJIHVzZXMgYSA2NC1iaXQgYGxvbmcgbG9uZycgbGltYiBidXQgd2l0aCB0aGUKICAgICAgICAgIGNoaXAgc3RpbGwgaW4gMzItYml0IG1vZGUgYW5kIHVzaW5nIDMyLWJpdCBjYWxsaW5nCiAgICAgICAgICBjb252ZW50aW9ucy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIHN5c3RlbXMgd2hlcmUgdGhlIHRydWUKICAgICAgICAgIDY0LWJpdCBBQkkgaXMgdW5hdmFpbGFibGUuICBObyBzcGVjaWFsIGNvbXBpbGVyIG9wdGlvbnMgYXJlCiAgICAgICAgICB0eXBpY2FsbHkgbmVlZGVkIGZvciBhcHBsaWNhdGlvbnMuICBUaGlzIEFCSSBpcyBub3QgYXZhaWxhYmxlCiAgICAgICAgICB1bmRlciBBSVguCgogICAgYEFCST0zMicKICAgICAgICAgIFRoaXMgaXMgdGhlIGJhc2ljIDMyLWJpdCBQb3dlclBDIEFCSSwgd2l0aCBhIDMyLWJpdCBsaW1iLiAgTm8KICAgICAgICAgIHNwZWNpYWwgY29tcGlsZXIgb3B0aW9ucyBhcmUgbmVlZGVkIGZvciBhcHBsaWNhdGlvbnMuCgogICAgIEdNUCdzIHNwZWVkIGlzIGdyZWF0ZXN0IGZvciB0aGUgYG1vZGU2NCcgQUJJLCB0aGUgYG1vZGUzMicgQUJJIGlzCiAgICAgMm5kIGJlc3QuICBJbiBgQUJJPTMyJyBvbmx5IHRoZSAzMi1iaXQgSVNBIGlzIHVzZWQgYW5kIHRoaXMKICAgICBkb2Vzbid0IG1ha2UgZnVsbCB1c2Ugb2YgYSA2NC1iaXQgY2hpcC4KCgpTcGFyYyBWOSAoYHNwYXJjNjQnLCBgc3BhcmN2OScsIGB1bHRyYXNwYXJjKicpCgogICAgYEFCST02NCcKICAgICAgICAgIFRoZSA2NC1iaXQgVjkgQUJJIGlzIGF2YWlsYWJsZSBvbiB0aGUgdmFyaW91cyBCU0Qgc3BhcmM2NAogICAgICAgICAgcG9ydHMsIHJlY2VudCB2ZXJzaW9ucyBvZiBTcGFyYzY0IEdOVS9MaW51eCwgYW5kIFNvbGFyaXMgMi43CiAgICAgICAgICBhbmQgdXAgKHdoZW4gdGhlIGtlcm5lbCBpcyBpbiA2NC1iaXQgbW9kZSkuICBHQ0MgMy4yIG9yCiAgICAgICAgICBoaWdoZXIsIG9yIFN1biBgY2MnIGlzIHJlcXVpcmVkLiAgT24gR05VL0xpbnV4LCBkZXBlbmRpbmcgb24KICAgICAgICAgIHRoZSBkZWZhdWx0IGBnY2MnIG1vZGUsIGFwcGxpY2F0aW9ucyBtdXN0IGJlIGNvbXBpbGVkIHdpdGgKCiAgICAgICAgICAgICAgIGdjYyAgLW02NAoKICAgICAgICAgIE9uIFNvbGFyaXMgYXBwbGljYXRpb25zIG11c3QgYmUgY29tcGlsZWQgd2l0aAoKICAgICAgICAgICAgICAgZ2NjICAtbTY0IC1tcHRyNjQgLVdhLC14YXJjaD12OSAtbWNwdT12OQogICAgICAgICAgICAgICBjYyAgIC14YXJjaD12OQoKICAgICAgICAgIE9uIHRoZSBCU0Qgc3BhcmM2NCBzeXN0ZW1zIG5vIHNwZWNpYWwgb3B0aW9ucyBhcmUgcmVxdWlyZWQsCiAgICAgICAgICBzaW5jZSA2NC1iaXRzIGlzIHRoZSBvbmx5IEFCSSBhdmFpbGFibGUuCgogICAgYEFCST0zMicKICAgICAgICAgIEZvciB0aGUgYmFzaWMgMzItYml0IEFCSSwgR01QIHN0aWxsIHVzZXMgYXMgbXVjaCBvZiB0aGUgVjkKICAgICAgICAgIElTQSBhcyBpdCBjYW4uICBJbiB0aGUgU3VuIGRvY3VtZW50YXRpb24gdGhpcyBjb21iaW5hdGlvbiBpcwogICAgICAgICAga25vd24gYXMgInY4cGx1cyIuICBPbiBHTlUvTGludXgsIGRlcGVuZGluZyBvbiB0aGUgZGVmYXVsdAogICAgICAgICAgYGdjYycgbW9kZSwgYXBwbGljYXRpb25zIG1heSBuZWVkIHRvIGJlIGNvbXBpbGVkIHdpdGgKCiAgICAgICAgICAgICAgIGdjYyAgLW0zMgoKICAgICAgICAgIE9uIFNvbGFyaXMsIG5vIHNwZWNpYWwgY29tcGlsZXIgb3B0aW9ucyBhcmUgcmVxdWlyZWQgZm9yCiAgICAgICAgICBhcHBsaWNhdGlvbnMsIHRob3VnaCB1c2luZyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIGlzCiAgICAgICAgICByZWNvbW1lbmRlZC4gIChgZ2NjJyAyLjggYW5kIGVhcmxpZXIgb25seSBzdXBwb3J0IGAtbXY4JwogICAgICAgICAgdGhvdWdoLikKCiAgICAgICAgICAgICAgIGdjYyAgLW12OHBsdXMKICAgICAgICAgICAgICAgY2MgICAteGFyY2g9djhwbHVzCgogICAgIEdNUCBzcGVlZCBpcyBncmVhdGVzdCBpbiBgQUJJPTY0Jywgc28gaXQncyB0aGUgZGVmYXVsdCB3aGVyZQogICAgIGF2YWlsYWJsZS4gIFRoZSBzcGVlZCBpcyBwYXJ0bHkgYmVjYXVzZSB0aGVyZSBhcmUgZXh0cmEgcmVnaXN0ZXJzCiAgICAgYXZhaWxhYmxlIGFuZCBwYXJ0bHkgYmVjYXVzZSA2NC1iaXRzIGlzIGNvbnNpZGVyZWQgdGhlIG1vcmUKICAgICBpbXBvcnRhbnQgY2FzZSBhbmQgaGFzIHRoZXJlZm9yZSBoYWQgYmV0dGVyIGNvZGUgd3JpdHRlbiBmb3IgaXQuCgogICAgIERvbid0IGJlIGNvbmZ1c2VkIGJ5IHRoZSBuYW1lcyBvZiB0aGUgYC1tJyBhbmQgYC14JyBjb21waWxlcgogICAgIG9wdGlvbnMsIHRoZXkncmUgY2FsbGVkIGBhcmNoJyBidXQgZWZmZWN0aXZlbHkgY29udHJvbCBib3RoIEFCSQogICAgIGFuZCBJU0EuCgogICAgIE9uIFNvbGFyaXMgMi42IGFuZCBlYXJsaWVyLCBvbmx5IGBBQkk9MzInIGlzIGF2YWlsYWJsZSBzaW5jZSB0aGUKICAgICBrZXJuZWwgZG9lc24ndCBzYXZlIGFsbCByZWdpc3RlcnMuCgogICAgIE9uIFNvbGFyaXMgMi43IHdpdGggdGhlIGtlcm5lbCBpbiAzMi1iaXQgbW9kZSwgYSBub3JtYWwgbmF0aXZlCiAgICAgYnVpbGQgd2lsbCByZWplY3QgYEFCST02NCcgYmVjYXVzZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGVzIHdvbid0CiAgICAgcnVuLiAgYEFCST02NCcgY2FuIHN0aWxsIGJlIGJ1aWx0IGlmIGRlc2lyZWQgYnkgbWFraW5nIGl0IGxvb2sKICAgICBsaWtlIGEgY3Jvc3MtY29tcGlsZSwgZm9yIGV4YW1wbGUKCiAgICAgICAgICAuL2NvbmZpZ3VyZSAtLWJ1aWxkPW5vbmUgLS1ob3N0PXNwYXJjdjktc3VuLXNvbGFyaXMyLjcgQUJJPTY0CgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogTm90ZXMgZm9yIFBhY2thZ2UgQnVpbGRzLCAgTmV4dDogTm90ZXMgZm9yIFBhcnRpY3VsYXIgU3lzdGVtcywgIFByZXY6IEFCSSBhbmQgSVNBLCAgVXA6IEluc3RhbGxpbmcgR01QCgoyLjMgTm90ZXMgZm9yIFBhY2thZ2UgQnVpbGRzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkdNUCBzaG91bGQgcHJlc2VudCBubyBncmVhdCBkaWZmaWN1bHRpZXMgZm9yIHBhY2thZ2luZyBpbiBhIGJpbmFyeQpkaXN0cmlidXRpb24uCgogICBMaWJ0b29sIGlzIHVzZWQgdG8gYnVpbGQgdGhlIGxpYnJhcnkgYW5kIGAtdmVyc2lvbi1pbmZvJyBpcyBzZXQKYXBwcm9wcmlhdGVseSwgaGF2aW5nIHN0YXJ0ZWQgZnJvbSBgMzowOjAnIGluIEdNUCAzLjAgKCpub3RlIExpYnJhcnkKaW50ZXJmYWNlIHZlcnNpb25zOiAobGlidG9vbClWZXJzaW9uaW5nLikuCgogICBUaGUgR01QIDQgc2VyaWVzIHdpbGwgYmUgdXB3YXJkbHkgYmluYXJ5IGNvbXBhdGlibGUgaW4gZWFjaCByZWxlYXNlCmFuZCB3aWxsIGJlIHVwd2FyZGx5IGJpbmFyeSBjb21wYXRpYmxlIHdpdGggYWxsIG9mIHRoZSBHTVAgMyBzZXJpZXMuCkFkZGl0aW9uYWwgZnVuY3Rpb24gaW50ZXJmYWNlcyBtYXkgYmUgYWRkZWQgaW4gZWFjaCByZWxlYXNlLCBzbyBvbgpzeXN0ZW1zIHdoZXJlIGxpYnRvb2wgdmVyc2lvbmluZyBpcyBub3QgZnVsbHkgY2hlY2tlZCBieSB0aGUgbG9hZGVyIGFuCmF1eGlsaWFyeSBtZWNoYW5pc20gbWF5IGJlIG5lZWRlZCB0byBleHByZXNzIHRoYXQgYSBkeW5hbWljIGxpbmtlZAphcHBsaWNhdGlvbiBkZXBlbmRzIG9uIGEgbmV3IGVub3VnaCBHTVAuCgogICBBbiBhdXhpbGlhcnkgbWVjaGFuaXNtIG1heSBhbHNvIGJlIG5lZWRlZCB0byBleHByZXNzIHRoYXQKYGxpYmdtcHh4LmxhJyAoZnJvbSBgLS1lbmFibGUtY3h4JywgKm5vdGUgQnVpbGQgT3B0aW9uczo6KSByZXF1aXJlcwpgbGliZ21wLmxhJyBmcm9tIHRoZSBzYW1lIEdNUCB2ZXJzaW9uLCBzaW5jZSB0aGlzIGlzIG5vdCBkb25lIGJ5IHRoZQpsaWJ0b29sIHZlcnNpb25pbmcsIG5vciBvdGhlcndpc2UuICBBIG1pc21hdGNoIHdpbGwgcmVzdWx0IGluCnVucmVzb2x2ZWQgc3ltYm9scyBmcm9tIHRoZSBsaW5rZXIsIG9yIHBlcmhhcHMgdGhlIGxvYWRlci4KCiAgIFdoZW4gYnVpbGRpbmcgYSBwYWNrYWdlIGZvciBhIENQVSBmYW1pbHksIGNhcmUgc2hvdWxkIGJlIHRha2VuIHRvIHVzZQpgLS1ob3N0JyAob3IgYC0tYnVpbGQnKSB0byBjaG9vc2UgdGhlIGxlYXN0IGNvbW1vbiBkZW5vbWluYXRvciBhbW9uZwp0aGUgQ1BVcyB3aGljaCBtaWdodCB1c2UgdGhlIHBhY2thZ2UuICBGb3IgZXhhbXBsZSB0aGlzIG1pZ2h0IG1lYW4gcGxhaW4KYHNwYXJjJyAobWVhbmluZyBWNykgZm9yIFNQQVJDcy4KCiAgIEZvciB4ODZzLCBgLS1lbmFibGUtZmF0JyBzZXRzIHRoaW5ncyB1cCBmb3IgYSBmYXQgYmluYXJ5IGJ1aWxkLAptYWtpbmcgYSBydW50aW1lIHNlbGVjdGlvbiBvZiBvcHRpbWl6ZWQgbG93IGxldmVsIHJvdXRpbmVzLiAgVGhpcyBpcyBhCmdvb2QgY2hvaWNlIGZvciBwYWNrYWdpbmcgdG8gcnVuIG9uIGEgcmFuZ2Ugb2YgeDg2IGNoaXBzLgoKICAgVXNlcnMgd2hvIGNhcmUgYWJvdXQgc3BlZWQgd2lsbCB3YW50IEdNUCBidWlsdCBmb3IgdGhlaXIgZXhhY3QgQ1BVCnR5cGUsIHRvIG1ha2UgYmVzdCB1c2Ugb2YgdGhlIGF2YWlsYWJsZSBvcHRpbWl6YXRpb25zLiAgUHJvdmlkaW5nIGEgd2F5CnRvIHN1aXRhYmx5IHJlYnVpbGQgYSBwYWNrYWdlIG1heSBiZSB1c2VmdWwuICBUaGlzIGNvdWxkIGJlIGFzIHNpbXBsZQphcyBtYWtpbmcgaXQgcG9zc2libGUgZm9yIGEgdXNlciB0byBvbWl0IGAtLWJ1aWxkJyAoYW5kIGAtLWhvc3QnKSBzbwpgLi9jb25maWcuZ3Vlc3MnIHdpbGwgZGV0ZWN0IHRoZSBDUFUuICBCdXQgYSB3YXkgdG8gbWFudWFsbHkgc3BlY2lmeSBhCmAtLWJ1aWxkJyB3aWxsIGJlIHdhbnRlZCBmb3Igc3lzdGVtcyB3aGVyZSBgLi9jb25maWcuZ3Vlc3MnIGlzIGluZXhhY3QuCgogICBPbiBzeXN0ZW1zIHdpdGggbXVsdGlwbGUgQUJJcywgYSBwYWNrYWdlZCBidWlsZCB3aWxsIG5lZWQgdG8gZGVjaWRlCndoaWNoIGFtb25nIHRoZSBjaG9pY2VzIGlzIHRvIGJlIHByb3ZpZGVkLCBzZWUgKm5vdGUgQUJJIGFuZCBJU0E6Oi4gIEEKZ2l2ZW4gcnVuIG9mIGAuL2NvbmZpZ3VyZScgZXRjIHdpbGwgb25seSBidWlsZCBvbmUgQUJJLiAgSWYgYSBzZWNvbmQKQUJJIGlzIGFsc28gcmVxdWlyZWQgdGhlbiBhIHNlY29uZCBydW4gb2YgYC4vY29uZmlndXJlJyBldGMgbXVzdCBiZQptYWRlLCBzdGFydGluZyBmcm9tIGEgY2xlYW4gZGlyZWN0b3J5IHRyZWUgKGBtYWtlIGRpc3RjbGVhbicpLgoKICAgQXMgbm90ZWQgdW5kZXIgIkFCSSBhbmQgSVNBIiwgY3VycmVudGx5IG5vIGF0dGVtcHQgaXMgbWFkZSB0byBmb2xsb3cKc3lzdGVtIGNvbnZlbnRpb25zIGZvciBpbnN0YWxsIGxvY2F0aW9ucyB0aGF0IHZhcnkgd2l0aCBBQkksIHN1Y2ggYXMKYC91c3IvbGliL3NwYXJjdjknIGZvciBgQUJJPTY0JyBhcyBvcHBvc2VkIHRvIGAvdXNyL2xpYicgZm9yIGBBQkk9MzInLgpBIHBhY2thZ2UgYnVpbGQgY2FuIG92ZXJyaWRlIGBsaWJkaXInIGFuZCBvdGhlciBzdGFuZGFyZCB2YXJpYWJsZXMgYXMKbmVjZXNzYXJ5LgoKICAgTm90ZSB0aGF0IGBnbXAuaCcgaXMgYSBnZW5lcmF0ZWQgZmlsZSwgYW5kIHdpbGwgYmUgYXJjaGl0ZWN0dXJlIGFuZApBQkkgZGVwZW5kZW50LiAgV2hlbiBhdHRlbXB0aW5nIHRvIGluc3RhbGwgdHdvIEFCSXMgc2ltdWx0YW5lb3VzbHkgaXQKd2lsbCBiZSBpbXBvcnRhbnQgdGhhdCBhbiBhcHBsaWNhdGlvbiBjb21waWxlIGdldHMgdGhlIGNvcnJlY3QgYGdtcC5oJwpmb3IgaXRzIGRlc2lyZWQgQUJJLiAgSWYgY29tcGlsZXIgaW5jbHVkZSBwYXRocyBkb24ndCB2YXJ5IHdpdGggQUJJCm9wdGlvbnMgdGhlbiBpdCBtaWdodCBiZSBuZWNlc3NhcnkgdG8gY3JlYXRlIGEgYC91c3IvaW5jbHVkZS9nbXAuaCcKd2hpY2ggdGVzdHMgcHJlcHJvY2Vzc29yIHN5bWJvbHMgYW5kIGNob29zZXMgdGhlIGNvcnJlY3QgYWN0dWFsIGBnbXAuaCcuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogTm90ZXMgZm9yIFBhcnRpY3VsYXIgU3lzdGVtcywgIE5leHQ6IEtub3duIEJ1aWxkIFByb2JsZW1zLCAgUHJldjogTm90ZXMgZm9yIFBhY2thZ2UgQnVpbGRzLCAgVXA6IEluc3RhbGxpbmcgR01QCgoyLjQgTm90ZXMgZm9yIFBhcnRpY3VsYXIgU3lzdGVtcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQUlYIDMgYW5kIDQKICAgICBPbiBzeXN0ZW1zIGAqLSotYWl4WzM0XSonIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGRpc2FibGVkIGJ5CiAgICAgZGVmYXVsdCwgc2luY2Ugc29tZSB2ZXJzaW9ucyBvZiB0aGUgbmF0aXZlIGBhcicgZmFpbCBvbiB0aGUKICAgICBjb252ZW5pZW5jZSBsaWJyYXJpZXMgdXNlZC4gIEEgc2hhcmVkIGJ1aWxkIGNhbiBiZSBhdHRlbXB0ZWQgd2l0aAoKICAgICAgICAgIC4vY29uZmlndXJlIC0tZW5hYmxlLXNoYXJlZCAtLWRpc2FibGUtc3RhdGljCgogICAgIE5vdGUgdGhhdCB0aGUgYC0tZGlzYWJsZS1zdGF0aWMnIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGluIGEgc2hhcmVkCiAgICAgYnVpbGQgbGlidG9vbCBtYWtlcyBgbGliZ21wLmEnIGEgc3ltbGluayB0byBgbGliZ21wLnNvJywKICAgICBhcHBhcmVudGx5IGZvciB0aGUgYmVuZWZpdCBvZiBvbGQgdmVyc2lvbnMgb2YgYGxkJyB3aGljaCBvbmx5CiAgICAgcmVjb2duaXNlIGAuYScsIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoaXMgaXMgZG9uZSBldmVuIGlmIGEgZnVsbHkKICAgICBmdW5jdGlvbmFsIGBsZCcgaXMgYXZhaWxhYmxlLgoKQVJNCiAgICAgT24gc3lzdGVtcyBgYXJtKi0qLSonLCB2ZXJzaW9ucyBvZiBHQ0MgdXAgdG8gYW5kIGluY2x1ZGluZyAyLjk1LjMKICAgICBoYXZlIGEgYnVnIGluIHVuc2lnbmVkIGRpdmlzaW9uLCBnaXZpbmcgd3JvbmcgcmVzdWx0cyBmb3Igc29tZQogICAgIG9wZXJhbmRzLiAgR01QIGAuL2NvbmZpZ3VyZScgd2lsbCBkZW1hbmQgR0NDIDIuOTUuNCBvciBsYXRlci4KCkNvbXBhcSBDKysKICAgICBDb21wYXEgQysrIG9uIE9TRiA1LjEgaGFzIHR3byBmbGF2b3VycyBvZiBgaW9zdHJlYW0nLCBhIHN0YW5kYXJkCiAgICAgb25lIGFuZCBhbiBvbGQgcHJlLXN0YW5kYXJkIG9uZSAoc2VlIGBtYW4gaW9zdHJlYW1faW50cm8nKS4gIEdNUAogICAgIGNhbiBvbmx5IHVzZSB0aGUgc3RhbmRhcmQgb25lLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzIG5vdCB0aGUKICAgICBkZWZhdWx0IGJ1dCBtdXN0IGJlIHNlbGVjdGVkIGJ5IGRlZmluaW5nIGBfX1VTRV9TVERfSU9TVFJFQU0nLgogICAgIENvbmZpZ3VyZSB3aXRoIGZvciBpbnN0YW5jZQoKICAgICAgICAgIC4vY29uZmlndXJlIC0tZW5hYmxlLWN4eCBDUFBGTEFHUz0tRF9fVVNFX1NURF9JT1NUUkVBTQoKRmxvYXRpbmcgUG9pbnQgTW9kZQogICAgIE9uIHNvbWUgc3lzdGVtcywgdGhlIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50IGhhcyBhIGNvbnRyb2wgbW9kZQogICAgIHdoaWNoIGNhbiBzZXQgYWxsIG9wZXJhdGlvbnMgdG8gYmUgZG9uZSBpbiBhIHBhcnRpY3VsYXIgcHJlY2lzaW9uLAogICAgIGZvciBpbnN0YW5jZSBzaW5nbGUsIGRvdWJsZSBvciBleHRlbmRlZCBvbiB4ODYgc3lzdGVtcyAoeDg3CiAgICAgZmxvYXRpbmcgcG9pbnQpLiAgVGhlIEdNUCBmdW5jdGlvbnMgaW52b2x2aW5nIGEgYGRvdWJsZScgY2Fubm90IGJlCiAgICAgZXhwZWN0ZWQgdG8gb3BlcmF0ZSB0byB0aGVpciBmdWxsIHByZWNpc2lvbiB3aGVuIHRoZSBoYXJkd2FyZSBpcwogICAgIGluIHNpbmdsZSBwcmVjaXNpb24gbW9kZS4gIE9mIGNvdXJzZSB0aGlzIGFmZmVjdHMgYWxsIGNvZGUsCiAgICAgaW5jbHVkaW5nIGFwcGxpY2F0aW9uIGNvZGUsIG5vdCBqdXN0IEdNUC4KCkZyZWVCU0QgNy54LCA4LngsIDkuMCwgOS4xLCA5LjIKICAgICBgbTQnIGluIHRoZXNlIHJlbGVhc2VzIG9mIEZyZWVCU0QgaGFzIGFuIGV2YWwgZnVuY3Rpb24gd2hpY2gKICAgICBpZ25vcmVzIGl0cyAybmQgYW5kIDNyZCBhcmd1bWVudHMsIHdoaWNoIG1ha2VzIGl0IHVuc3VpdGFibGUgZm9yCiAgICAgYC5hc20nIGZpbGUgcHJvY2Vzc2luZy4gIGAuL2NvbmZpZ3VyZScgd2lsbCBkZXRlY3QgdGhlIHByb2JsZW0gYW5kCiAgICAgZWl0aGVyIGFib3J0IG9yIGNob29zZSBhbm90aGVyIG00IGluIHRoZSBgUEFUSCcuICBUaGUgYnVnIGlzIGZpeGVkCiAgICAgaW4gRnJlZUJTRCA5LjMgYW5kIDEwLjAsIHNvIGVpdGhlciB1cGdyYWRlIG9yIHVzZSBHTlUgbTQuICBOb3RlCiAgICAgdGhhdCB0aGUgRnJlZUJTRCBwYWNrYWdlIHN5c3RlbSBpbnN0YWxscyBHTlUgbTQgdW5kZXIgdGhlIG5hbWUKICAgICBgZ200Jywgd2hpY2ggR01QIGNhbm5vdCBndWVzcy4KCkZyZWVCU0QgNy54LCA4LngsIDkueAogICAgIEdNUCByZWxlYXNlcyBzdGFydGluZyB3aXRoIDYuMCBkbyBub3Qgc3VwcG9ydCBgQUJJPTMyJyBvbgogICAgIEZyZWVCU0QvYW1kNjQgcHJpb3IgdG8gcmVsZWFzZSAxMC4wIG9mIHRoZSBzeXN0ZW0uICBUaGUgY2F1c2UgaXMgYQogICAgIGJyb2tlbiBgbGltaXRzLmgnLCB3aGljaCBHTVAgbm8gbG9uZ2VyIHdvcmtzIGFyb3VuZC4KCk1TLURPUyBhbmQgTVMgV2luZG93cwogICAgIE9uIGFuIE1TLURPUyBzeXN0ZW0gREpHUFAgY2FuIGJlIHVzZWQgdG8gYnVpbGQgR01QLCBhbmQgb24gYW4gTVMKICAgICBXaW5kb3dzIHN5c3RlbSBDeWd3aW4sIERKR1BQIGFuZCBNSU5HVyBjYW4gYmUgdXNlZC4gIEFsbCB0aHJlZSBhcmUKICAgICBleGNlbGxlbnQgcG9ydHMgb2YgR0NDIGFuZCB0aGUgdmFyaW91cyBHTlUgdG9vbHMuCgogICAgICAgICAgYGh0dHA6Ly93d3cuY3lnd2luLmNvbS8nCiAgICAgICAgICBgaHR0cDovL3d3dy5kZWxvcmllLmNvbS9kamdwcC8nCiAgICAgICAgICBgaHR0cDovL3d3dy5taW5ndy5vcmcvJwoKICAgICBNaWNyb3NvZnQgYWxzbyBwdWJsaXNoZXMgYW4gSW50ZXJpeCAiU2VydmljZXMgZm9yIFVuaXgiIHdoaWNoIGNhbgogICAgIGJlIHVzZWQgdG8gYnVpbGQgR01QIG9uIFdpbmRvd3MgKHdpdGggYSBub3JtYWwgYC4vY29uZmlndXJlJyksIGJ1dAogICAgIGl0J3Mgbm90IGZyZWUgc29mdHdhcmUuCgpNUyBXaW5kb3dzIERMTHMKICAgICBPbiBzeXN0ZW1zIGAqLSotY3lnd2luKicsIGAqLSotbWluZ3cqJyBhbmQgYCotKi1wdzMyKicgYnkgZGVmYXVsdAogICAgIEdNUCBidWlsZHMgb25seSBhIHN0YXRpYyBsaWJyYXJ5LCBidXQgYSBETEwgY2FuIGJlIGJ1aWx0IGluc3RlYWQKICAgICB1c2luZwoKICAgICAgICAgIC4vY29uZmlndXJlIC0tZGlzYWJsZS1zdGF0aWMgLS1lbmFibGUtc2hhcmVkCgogICAgIFN0YXRpYyBhbmQgRExMIGxpYnJhcmllcyBjYW4ndCBib3RoIGJlIGJ1aWx0LCBzaW5jZSBjZXJ0YWluIGV4cG9ydAogICAgIGRpcmVjdGl2ZXMgaW4gYGdtcC5oJyBtdXN0IGJlIGRpZmZlcmVudC4KCiAgICAgQSBNSU5HVyBETEwgYnVpbGQgb2YgR01QIGNhbiBiZSB1c2VkIHdpdGggTWljcm9zb2Z0IEMuICBMaWJ0b29sCiAgICAgZG9lc24ndCBpbnN0YWxsIGEgYC5saWInIGZvcm1hdCBpbXBvcnQgbGlicmFyeSwgYnV0IGl0IGNhbiBiZQogICAgIGNyZWF0ZWQgd2l0aCBNUyBgbGliJyBhcyBmb2xsb3dzLCBhbmQgY29waWVkIHRvIHRoZSBpbnN0YWxsCiAgICAgZGlyZWN0b3J5LiAgU2ltaWxhcmx5IGZvciBgbGlibXAnIGFuZCBgbGliZ21weHgnLgoKICAgICAgICAgIGNkIC5saWJzCiAgICAgICAgICBsaWIgL2RlZjpsaWJnbXAtMy5kbGwuZGVmIC9vdXQ6bGliZ21wLTMubGliCgogICAgIE1JTkdXIHVzZXMgdGhlIEMgcnVudGltZSBsaWJyYXJ5IGBtc3ZjcnQuZGxsJyBmb3IgSS9PLCBzbwogICAgIGFwcGxpY2F0aW9ucyB3YW50aW5nIHRvIHVzZSB0aGUgR01QIEkvTyByb3V0aW5lcyBtdXN0IGJlIGNvbXBpbGVkCiAgICAgd2l0aCBgY2wgL01EJyB0byBkbyB0aGUgc2FtZS4gIElmIG9uZSBvZiB0aGUgb3RoZXIgQyBydW50aW1lCiAgICAgbGlicmFyeSBjaG9pY2VzIHByb3ZpZGVkIGJ5IE1TIEMgaXMgZGVzaXJlZCB0aGVuIHRoZSBzdWdnZXN0aW9uIGlzCiAgICAgdG8gdXNlIHRoZSBHTVAgc3RyaW5nIGZ1bmN0aW9ucyBhbmQgY29uZmluZSBJL08gdG8gdGhlIGFwcGxpY2F0aW9uLgoKTW90b3JvbGEgNjhrIENQVSBUeXBlcwogICAgIGBtNjhrJyBpcyB0YWtlbiB0byBtZWFuIDY4MDAwLiAgYG02ODAyMCcgb3IgaGlnaGVyIHdpbGwgZ2l2ZSBhCiAgICAgcGVyZm9ybWFuY2UgYm9vc3Qgb24gYXBwbGljYWJsZSBDUFVzLiAgYG02ODM2MCcgY2FuIGJlIHVzZWQgZm9yCiAgICAgQ1BVMzIgc2VyaWVzIGNoaXBzLiAgYG02ODMwMicgY2FuIGJlIHVzZWQgZm9yICJEcmFnb25iYWxsIiBzZXJpZXMKICAgICBjaGlwcywgdGhvdWdoIHRoaXMgaXMgbWVyZWx5IGEgc3lub255bSBmb3IgYG02ODAwMCcuCgpOZXRCU0QgNS54CiAgICAgYG00JyBpbiB0aGVzZSByZWxlYXNlcyBvZiBOZXRCU0QgaGFzIGFuIGV2YWwgZnVuY3Rpb24gd2hpY2gKICAgICBpZ25vcmVzIGl0cyAybmQgYW5kIDNyZCBhcmd1bWVudHMsIHdoaWNoIG1ha2VzIGl0IHVuc3VpdGFibGUgZm9yCiAgICAgYC5hc20nIGZpbGUgcHJvY2Vzc2luZy4gIGAuL2NvbmZpZ3VyZScgd2lsbCBkZXRlY3QgdGhlIHByb2JsZW0gYW5kCiAgICAgZWl0aGVyIGFib3J0IG9yIGNob29zZSBhbm90aGVyIG00IGluIHRoZSBgUEFUSCcuICBUaGUgYnVnIGlzIGZpeGVkCiAgICAgaW4gTmV0QlNEIDYsIHNvIGVpdGhlciB1cGdyYWRlIG9yIHVzZSBHTlUgbTQuICBOb3RlIHRoYXQgdGhlCiAgICAgTmV0QlNEIHBhY2thZ2Ugc3lzdGVtIGluc3RhbGxzIEdOVSBtNCB1bmRlciB0aGUgbmFtZSBgZ200Jywgd2hpY2gKICAgICBHTVAgY2Fubm90IGd1ZXNzLgoKT3BlbkJTRCAyLjYKICAgICBgbTQnIGluIHRoaXMgcmVsZWFzZSBvZiBPcGVuQlNEIGhhcyBhIGJ1ZyBpbiBgZXZhbCcgdGhhdCBtYWtlcyBpdAogICAgIHVuc3VpdGFibGUgZm9yIGAuYXNtJyBmaWxlIHByb2Nlc3NpbmcuICBgLi9jb25maWd1cmUnIHdpbGwgZGV0ZWN0CiAgICAgdGhlIHByb2JsZW0gYW5kIGVpdGhlciBhYm9ydCBvciBjaG9vc2UgYW5vdGhlciBtNCBpbiB0aGUgYFBBVEgnLgogICAgIFRoZSBidWcgaXMgZml4ZWQgaW4gT3BlbkJTRCAyLjcsIHNvIGVpdGhlciB1cGdyYWRlIG9yIHVzZSBHTlUgbTQuCgpQb3dlciBDUFUgVHlwZXMKICAgICBJbiBHTVAsIENQVSB0eXBlcyBgcG93ZXIqJyBhbmQgYHBvd2VycGMqJyB3aWxsIGVhY2ggdXNlCiAgICAgaW5zdHJ1Y3Rpb25zIG5vdCBhdmFpbGFibGUgb24gdGhlIG90aGVyLCBzbyBpdCdzIGltcG9ydGFudCB0bwogICAgIGNob29zZSB0aGUgcmlnaHQgb25lIGZvciB0aGUgQ1BVIHRoYXQgd2lsbCBiZSB1c2VkLiAgQ3VycmVudGx5IEdNUAogICAgIGhhcyBubyBhc3NlbWJseSBjb2RlIHN1cHBvcnQgZm9yIHVzaW5nIGp1c3QgdGhlIGNvbW1vbiBpbnN0cnVjdGlvbgogICAgIHN1YnNldC4gIFRvIGdldCBleGVjdXRhYmxlcyB0aGF0IHJ1biBvbiBib3RoLCB0aGUgY3VycmVudAogICAgIHN1Z2dlc3Rpb24gaXMgdG8gdXNlIHRoZSBnZW5lcmljIEMgY29kZSAoYC0tZGlzYWJsZS1hc3NlbWJseScpLAogICAgIHBvc3NpYmx5IHdpdGggYXBwcm9wcmlhdGUgY29tcGlsZXIgb3B0aW9ucyAobGlrZSBgLW1jcHU9Y29tbW9uJyBmb3IKICAgICBgZ2NjJykuICBDUFUgYHJzNjAwMCcgKHdoaWNoIGlzIG5vdCBhIENQVSBidXQgYSBmYW1pbHkgb2YKICAgICB3b3Jrc3RhdGlvbnMpIGlzIGFjY2VwdGVkIGJ5IGBjb25maWcuc3ViJywgYnV0IGlzIGN1cnJlbnRseQogICAgIGVxdWl2YWxlbnQgdG8gYC0tZGlzYWJsZS1hc3NlbWJseScuCgpTcGFyYyBDUFUgVHlwZXMKICAgICBgc3BhcmN2OCcgb3IgYHN1cGVyc3BhcmMnIG9uIHJlbGV2YW50IHN5c3RlbXMgd2lsbCBnaXZlIGEKICAgICBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbmNyZWFzZSBvdmVyIHRoZSBWNyBjb2RlIHNlbGVjdGVkIGJ5IHBsYWluCiAgICAgYHNwYXJjJy4KClNwYXJjIEFwcCBSZWdzCiAgICAgVGhlIEdNUCBhc3NlbWJseSBjb2RlIGZvciBib3RoIDMyLWJpdCBhbmQgNjQtYml0IFNwYXJjIGNsb2JiZXJzIHRoZQogICAgICJhcHBsaWNhdGlvbiByZWdpc3RlcnMiIGBnMicsIGBnMycgYW5kIGBnNCcsIHRoZSBzYW1lIHdheSB0aGF0IHRoZQogICAgIEdDQyBkZWZhdWx0IGAtbWFwcC1yZWdzJyBkb2VzICgqbm90ZSBTUEFSQyBPcHRpb25zOiAoZ2NjKVNQQVJDCiAgICAgT3B0aW9ucy4pLgoKICAgICBUaGlzIG1ha2VzIHRoYXQgY29kZSB1bnN1aXRhYmxlIGZvciB1c2Ugd2l0aCB0aGUgc3BlY2lhbCBWOQogICAgIGAtbWNtb2RlbD1lbWJtZWRhbnknICh3aGljaCB1c2VzIGBnNCcgYXMgYSBkYXRhIHNlZ21lbnQgcG9pbnRlciksCiAgICAgYW5kIGZvciBhcHBsaWNhdGlvbnMgd2FudGluZyB0byB1c2UgdGhvc2UgcmVnaXN0ZXJzIGZvciBzcGVjaWFsCiAgICAgcHVycG9zZXMuICBJbiB0aGVzZSBjYXNlcyB0aGUgb25seSBzdWdnZXN0aW9uIGN1cnJlbnRseSBpcyB0bwogICAgIGJ1aWxkIEdNUCB3aXRoIGAtLWRpc2FibGUtYXNzZW1ibHknIHRvIGF2b2lkIHRoZSBhc3NlbWJseSBjb2RlLgoKU3VuT1MgNAogICAgIGAvdXNyL2Jpbi9tNCcgbGFja3MgdmFyaW91cyBmZWF0dXJlcyBuZWVkZWQgdG8gcHJvY2VzcyBgLmFzbScKICAgICBmaWxlcywgYW5kIGluc3RlYWQgYC4vY29uZmlndXJlJyB3aWxsIGF1dG9tYXRpY2FsbHkgdXNlCiAgICAgYC91c3IvNWJpbi9tNCcsIHdoaWNoIHdlIGJlbGlldmUgaXMgYWx3YXlzIGF2YWlsYWJsZSAoaWYgbm90IHRoZW4KICAgICB1c2UgR05VIG00KS4KCng4NiBDUFUgVHlwZXMKICAgICBgaTU4NicsIGBwZW50aXVtJyBvciBgcGVudGl1bW1teCcgY29kZSBpcyBnb29kIGZvciBpdHMgaW50ZW5kZWQgUDUKICAgICBQZW50aXVtIGNoaXBzLCBidXQgcXVpdGUgc2xvdyB3aGVuIHJ1biBvbiBJbnRlbCBQNiBjbGFzcyBjaGlwcwogICAgIChQUHJvLCBQLUlJLCBQLUlJSSkuICBgaTM4NicgaXMgYSBiZXR0ZXIgY2hvaWNlIHdoZW4gbWFraW5nCiAgICAgYmluYXJpZXMgdGhhdCBtdXN0IHJ1biBvbiBib3RoLgoKeDg2IE1NWCBhbmQgU1NFMiBDb2RlCiAgICAgSWYgdGhlIENQVSBzZWxlY3RlZCBoYXMgTU1YIGNvZGUgYnV0IHRoZSBhc3NlbWJsZXIgZG9lc24ndCBzdXBwb3J0CiAgICAgaXQsIGEgd2FybmluZyBpcyBnaXZlbiBhbmQgbm9uLU1NWCBjb2RlIGlzIHVzZWQgaW5zdGVhZC4gIFRoaXMKICAgICB3aWxsIGJlIGFuIGluZmVyaW9yIGJ1aWxkLCBzaW5jZSB0aGUgTU1YIGNvZGUgdGhhdCdzIHByZXNlbnQgaXMKICAgICB0aGVyZSBiZWNhdXNlIGl0J3MgZmFzdGVyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgcGxhaW4gaW50ZWdlcgogICAgIGNvZGUuICBUaGUgc2FtZSBhcHBsaWVzIHRvIFNTRTIuCgogICAgIE9sZCB2ZXJzaW9ucyBvZiBgZ2FzJyBkb24ndCBzdXBwb3J0IE1NWCBpbnN0cnVjdGlvbnMsIGluIHBhcnRpY3VsYXIKICAgICB2ZXJzaW9uIDEuOTIuMyB0aGF0IGNvbWVzIHdpdGggRnJlZUJTRCAyLjIuOCBvciB0aGUgbW9yZSByZWNlbnQKICAgICBPcGVuQlNEIDMuMSBkb2Vzbid0LgoKICAgICBTb2xhcmlzIDIuNiBhbmQgMi43IGBhcycgZ2VuZXJhdGUgaW5jb3JyZWN0IG9iamVjdCBjb2RlIGZvcgogICAgIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyIGBtb3ZxJyBpbnN0cnVjdGlvbnMsIGFuZCBzbyBjYW4ndCBiZSB1c2VkIGZvcgogICAgIE1NWCBjb2RlLiAgSW5zdGFsbCBhIHJlY2VudCBgZ2FzJyBpZiBNTVggY29kZSBpcyB3YW50ZWQgb24gdGhlc2UKICAgICBzeXN0ZW1zLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEtub3duIEJ1aWxkIFByb2JsZW1zLCAgTmV4dDogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLCAgUHJldjogTm90ZXMgZm9yIFBhcnRpY3VsYXIgU3lzdGVtcywgIFVwOiBJbnN0YWxsaW5nIEdNUAoKMi41IEtub3duIEJ1aWxkIFByb2JsZW1zCj09PT09PT09PT09PT09PT09PT09PT09PQoKWW91IG1pZ2h0IGZpbmQgbW9yZSB1cC10by1kYXRlIGluZm9ybWF0aW9uIGF0IGBodHRwczovL2dtcGxpYi5vcmcvJy4KCkNvbXBpbGVyIGxpbmsgb3B0aW9ucwogICAgIFRoZSB2ZXJzaW9uIG9mIGxpYnRvb2wgY3VycmVudGx5IGluIHVzZSByYXRoZXIgYWdncmVzc2l2ZWx5IHN0cmlwcwogICAgIGNvbXBpbGVyIG9wdGlvbnMgd2hlbiBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuICBUaGlzIHdpbGwKICAgICBob3BlZnVsbHkgYmUgcmVsYXhlZCBpbiB0aGUgZnV0dXJlLCBidXQgZm9yIG5vdyBpZiB0aGlzIGlzIGEKICAgICBwcm9ibGVtIHRoZSBzdWdnZXN0aW9uIGlzIHRvIGNyZWF0ZSBhIGxpdHRsZSBzY3JpcHQgdG8gaGlkZSB0aGVtLAogICAgIGFuZCBmb3IgaW5zdGFuY2UgY29uZmlndXJlIHdpdGgKCiAgICAgICAgICAuL2NvbmZpZ3VyZSBDQz1nY2Mtd2l0aC1teS1vcHRpb25zCgpESkdQUCAoYCotKi1tc2Rvc2RqZ3BwKicpCiAgICAgVGhlIERKR1BQIHBvcnQgb2YgYGJhc2gnIDIuMDMgaXMgdW5hYmxlIHRvIHJ1biB0aGUgYGNvbmZpZ3VyZScKICAgICBzY3JpcHQsIGl0IGV4aXRzIHNpbGVudGx5LCBoYXZpbmcgZGllZCB3cml0aW5nIGEgcHJlYW1ibGUgdG8KICAgICBgY29uZmlnLmxvZycuICBVc2UgYGJhc2gnIDIuMDQgb3IgaGlnaGVyLgoKICAgICBgbWFrZSBhbGwnIHdhcyBmb3VuZCB0byBydW4gb3V0IG9mIG1lbW9yeSBkdXJpbmcgdGhlIGZpbmFsCiAgICAgYGxpYmdtcC5sYScgbGluayBvbiBvbmUgc3lzdGVtIHRlc3RlZCwgZGVzcGl0ZSBoYXZpbmcgNjRNYgogICAgIGF2YWlsYWJsZS4gIFJ1bm5pbmcgYG1ha2UgbGliZ21wLmxhJyBkaXJlY3RseSBoZWxwZWQsIHBlcmhhcHMKICAgICByZWN1cnNpbmcgaW50byB0aGUgdmFyaW91cyBzdWJkaXJlY3RvcmllcyB1c2VzIHVwIG1lbW9yeS4KCkdOVSBiaW51dGlscyBgc3RyaXAnIHByaW9yIHRvIDIuMTIKICAgICBgc3RyaXAnIGZyb20gR05VIGJpbnV0aWxzIDIuMTEgYW5kIGVhcmxpZXIgc2hvdWxkIG5vdCBiZSB1c2VkIG9uCiAgICAgdGhlIHN0YXRpYyBsaWJyYXJpZXMgYGxpYmdtcC5hJyBhbmQgYGxpYm1wLmEnIHNpbmNlIGl0IHdpbGwKICAgICBkaXNjYXJkIGFsbCBidXQgdGhlIGxhc3Qgb2YgbXVsdGlwbGUgYXJjaGl2ZSBtZW1iZXJzIHdpdGggdGhlIHNhbWUKICAgICBuYW1lLCBsaWtlIHRoZSB0aHJlZSB2ZXJzaW9ucyBvZiBgaW5pdC5vJyBpbiBgbGliZ21wLmEnLiAgQmludXRpbHMKICAgICAyLjEyIG9yIGhpZ2hlciBjYW4gYmUgdXNlZCBzdWNjZXNzZnVsbHkuCgogICAgIFRoZSBzaGFyZWQgbGlicmFyaWVzIGBsaWJnbXAuc28nIGFuZCBgbGlibXAuc28nIGFyZSBub3QgYWZmZWN0ZWQgYnkKICAgICB0aGlzIGFuZCBhbnkgdmVyc2lvbiBvZiBgc3RyaXAnIGNhbiBiZSB1c2VkIG9uIHRoZW0uCgpgbWFrZScgc3ludGF4IGVycm9yCiAgICAgT24gY2VydGFpbiB2ZXJzaW9ucyBvZiBTQ08gT3BlblNlcnZlciA1IGFuZCBJUklYIDYuNSB0aGUgbmF0aXZlCiAgICAgYG1ha2UnIGlzIHVuYWJsZSB0byBoYW5kbGUgdGhlIGxvbmcgZGVwZW5kZW5jaWVzIGxpc3QgZm9yCiAgICAgYGxpYmdtcC5sYScuICBUaGUgc3ltcHRvbSBpcyBhICJzeW50YXggZXJyb3IiIG9uIHRoZSBmb2xsb3dpbmcKICAgICBsaW5lIG9mIHRoZSB0b3AtbGV2ZWwgYE1ha2VmaWxlJy4KCiAgICAgICAgICBsaWJnbXAubGE6ICQobGliZ21wX2xhX09CSkVDVFMpICQobGliZ21wX2xhX0RFUEVOREVOQ0lFUykKCiAgICAgRWl0aGVyIHVzZSBHTlUgTWFrZSwgb3IgYXMgYSB3b3JrYXJvdW5kIHJlbW92ZQogICAgIGAkKGxpYmdtcF9sYV9ERVBFTkRFTkNJRVMpJyBmcm9tIHRoYXQgbGluZSAod2hpY2ggd2lsbCBtYWtlIHRoZQogICAgIGluaXRpYWwgYnVpbGQgd29yaywgYnV0IGlmIGFueSByZWNvbXBpbGluZyBpcyBkb25lIGBsaWJnbXAubGEnCiAgICAgbWlnaHQgbm90IGJlIHJlYnVpbHQpLgoKTWFjT1MgWCAoYCotKi1kYXJ3aW4qJykKICAgICBMaWJ0b29sIGN1cnJlbnRseSBvbmx5IGtub3dzIGhvdyB0byBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbgogICAgIE1hY09TIFggdXNpbmcgdGhlIG5hdGl2ZSBgY2MnICh3aGljaCBpcyBhIG1vZGlmaWVkIEdDQyksIG5vdCBhCiAgICAgcGxhaW4gR0NDLiAgQSBzdGF0aWMtb25seSBidWlsZCBzaG91bGQgd29yayB0aG91Z2gKICAgICAoYC0tZGlzYWJsZS1zaGFyZWQnKS4KCk5lWFQgcHJpb3IgdG8gMy4zCiAgICAgVGhlIHN5c3RlbSBjb21waWxlciBvbiBvbGQgdmVyc2lvbnMgb2YgTmVYVCB3YXMgYSBtYXNzYWNyZWQgYW5kCiAgICAgb2xkIEdDQywgZXZlbiBpZiBpdCBjYWxsZWQgaXRzZWxmIGBjYycuICBUaGlzIGNvbXBpbGVyIGNhbm5vdCBiZQogICAgIHVzZWQgdG8gYnVpbGQgR01QLCB5b3UgbmVlZCB0byBnZXQgYSByZWFsIEdDQywgYW5kIGluc3RhbGwgdGhhdC4KICAgICAoTmVYVCBtYXkgaGF2ZSBmaXhlZCB0aGlzIGluIHJlbGVhc2UgMy4zIG9mIHRoZWlyIHN5c3RlbS4pCgpQT1dFUiBhbmQgUG93ZXJQQwogICAgIEJ1Z3MgaW4gR0NDIDIuNy4yIChhbmQgMi42LjMpIG1lYW4gaXQgY2FuJ3QgYmUgdXNlZCB0byBjb21waWxlIEdNUAogICAgIG9uIFBPV0VSIG9yIFBvd2VyUEMuICBJZiB5b3Ugd2FudCB0byB1c2UgR0NDIGZvciB0aGVzZSBtYWNoaW5lcywKICAgICBnZXQgR0NDIDIuNy4yLjEgKG9yIGxhdGVyKS4KClNlcXVlbnQgU3ltbWV0cnkKICAgICBVc2UgdGhlIEdOVSBhc3NlbWJsZXIgaW5zdGVhZCBvZiB0aGUgc3lzdGVtIGFzc2VtYmxlciwgc2luY2UgdGhlCiAgICAgbGF0dGVyIGhhcyBzZXJpb3VzIGJ1Z3MuCgpTb2xhcmlzIDIuNgogICAgIFRoZSBzeXN0ZW0gYHNlZCcgcHJpbnRzIGFuIGVycm9yICJPdXRwdXQgbGluZSB0b28gbG9uZyIgd2hlbgogICAgIGxpYnRvb2wgYnVpbGRzIGBsaWJnbXAubGEnLiAgVGhpcyBkb2Vzbid0IHNlZW0gdG8gY2F1c2UgYW55CiAgICAgb2J2aW91cyBpbGwgZWZmZWN0cywgYnV0IEdOVSBgc2VkJyBpcyByZWNvbW1lbmRlZCwgdG8gYXZvaWQgYW55CiAgICAgZG91YnQuCgpTcGFyYyBTb2xhcmlzIDIuNyB3aXRoIGdjYyAyLjk1LjIgaW4gYEFCST0zMicKICAgICBBIHNoYXJlZCBsaWJyYXJ5IGJ1aWxkIG9mIEdNUCBzZWVtcyB0byBmYWlsIGluIHRoaXMgY29tYmluYXRpb24sCiAgICAgaXQgYnVpbGRzIGJ1dCB0aGVuIGZhaWxzIHRoZSB0ZXN0cywgYXBwYXJlbnRseSBkdWUgdG8gc29tZQogICAgIGluY29ycmVjdCBkYXRhIHJlbG9jYXRpb25zIHdpdGhpbiBgZ21wX3JhbmRpbml0X2xjXzJleHBfc2l6ZScuCiAgICAgVGhlIGV4YWN0IGNhdXNlIGlzIHVua25vd24sIGAtLWRpc2FibGUtc2hhcmVkJyBpcyByZWNvbW1lbmRlZC4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24sICBQcmV2OiBLbm93biBCdWlsZCBQcm9ibGVtcywgIFVwOiBJbnN0YWxsaW5nIEdNUAoKMi42IFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpGb3Igb3B0aW1hbCBwZXJmb3JtYW5jZSwgYnVpbGQgR01QIGZvciB0aGUgZXhhY3QgQ1BVIHR5cGUgb2YgdGhlIHRhcmdldApjb21wdXRlciwgc2VlICpub3RlIEJ1aWxkIE9wdGlvbnM6Oi4KCiAgIFVubGlrZSB3aGF0IGlzIHRoZSBjYXNlIGZvciBtb3N0IG90aGVyIHByb2dyYW1zLCB0aGUgY29tcGlsZXIKdHlwaWNhbGx5IGRvZXNuJ3QgbWF0dGVyIG11Y2gsIHNpbmNlIEdNUCB1c2VzIGFzc2VtYmx5IGxhbmd1YWdlIGZvciB0aGUKbW9zdCBjcml0aWNhbCBvcGVyYXRpb24uCgogICBJbiBwYXJ0aWN1bGFyIGZvciBsb25nLXJ1bm5pbmcgR01QIGFwcGxpY2F0aW9ucywgYW5kIGFwcGxpY2F0aW9ucwpkZW1hbmRpbmcgZXh0cmVtZWx5IGxhcmdlIG51bWJlcnMsIGJ1aWxkaW5nIGFuZCBydW5uaW5nIHRoZSBgdHVuZXVwJwpwcm9ncmFtIGluIHRoZSBgdHVuZScgc3ViZGlyZWN0b3J5LCBjYW4gYmUgaW1wb3J0YW50LiAgRm9yIGV4YW1wbGUsCgogICAgIGNkIHR1bmUKICAgICBtYWtlIHR1bmV1cAogICAgIC4vdHVuZXVwCgogICB3aWxsIGdlbmVyYXRlIGJldHRlciBjb250ZW50cyBmb3IgdGhlIGBnbXAtbXBhcmFtLmgnIHBhcmFtZXRlciBmaWxlLgoKICAgVG8gdXNlIHRoZSByZXN1bHRzLCBwdXQgdGhlIG91dHB1dCBpbiB0aGUgZmlsZSBpbmRpY2F0ZWQgaW4gdGhlCmBQYXJhbWV0ZXJzIGZvciAuLi4nIGhlYWRlci4gIFRoZW4gcmVjb21waWxlIGZyb20gc2NyYXRjaC4KCiAgIFRoZSBgdHVuZXVwJyBwcm9ncmFtIHRha2VzIG9uZSB1c2VmdWwgcGFyYW1ldGVyLCBgLWYgTk5OJywgd2hpY2gKaW5zdHJ1Y3RzIHRoZSBwcm9ncmFtIGhvdyBsb25nIHRvIGNoZWNrIEZGVCBtdWx0aXBseSBwYXJhbWV0ZXJzLiAgSWYKeW91J3JlIGdvaW5nIHRvIHVzZSBHTVAgZm9yIGV4dHJlbWVseSBsYXJnZSBudW1iZXJzLCB5b3UgbWF5IHdhbnQgdG8KcnVuIGB0dW5ldXAnIHdpdGggYSBsYXJnZSBOTk4gdmFsdWUuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogR01QIEJhc2ljcywgIE5leHQ6IFJlcG9ydGluZyBCdWdzLCAgUHJldjogSW5zdGFsbGluZyBHTVAsICBVcDogVG9wCgozIEdNUCBCYXNpY3MKKioqKioqKioqKioqCgoqVXNpbmcgZnVuY3Rpb25zLCBtYWNyb3MsIGRhdGEgdHlwZXMsIGV0Yy4gbm90IGRvY3VtZW50ZWQgaW4gdGhpcwptYW51YWwgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQuICBJZiB5b3UgZG8gc28geW91ciBhcHBsaWNhdGlvbiBpcwpndWFyYW50ZWVkIHRvIGJlIGluY29tcGF0aWJsZSB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiBHTVAuKgoKKiBNZW51OgoKKiBIZWFkZXJzIGFuZCBMaWJyYXJpZXM6OgoqIE5vbWVuY2xhdHVyZSBhbmQgVHlwZXM6OgoqIEZ1bmN0aW9uIENsYXNzZXM6OgoqIFZhcmlhYmxlIENvbnZlbnRpb25zOjoKKiBQYXJhbWV0ZXIgQ29udmVudGlvbnM6OgoqIE1lbW9yeSBNYW5hZ2VtZW50OjoKKiBSZWVudHJhbmN5OjoKKiBVc2VmdWwgTWFjcm9zIGFuZCBDb25zdGFudHM6OgoqIENvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9uczo6CiogRGVtb25zdHJhdGlvbiBQcm9ncmFtczo6CiogRWZmaWNpZW5jeTo6CiogRGVidWdnaW5nOjoKKiBQcm9maWxpbmc6OgoqIEF1dG9jb25mOjoKKiBFbWFjczo6CgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogSGVhZGVycyBhbmQgTGlicmFyaWVzLCAgTmV4dDogTm9tZW5jbGF0dXJlIGFuZCBUeXBlcywgIFByZXY6IEdNUCBCYXNpY3MsICBVcDogR01QIEJhc2ljcwoKMy4xIEhlYWRlcnMgYW5kIExpYnJhcmllcwo9PT09PT09PT09PT09PT09PT09PT09PT09CgpBbGwgZGVjbGFyYXRpb25zIG5lZWRlZCB0byB1c2UgR01QIGFyZSBjb2xsZWN0ZWQgaW4gdGhlIGluY2x1ZGUgZmlsZQpgZ21wLmgnLiAgSXQgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIGJvdGggQyBhbmQgQysrIGNvbXBpbGVycy4KCiAgICAgI2luY2x1ZGUgPGdtcC5oPgoKICAgTm90ZSBob3dldmVyIHRoYXQgcHJvdG90eXBlcyBmb3IgR01QIGZ1bmN0aW9ucyB3aXRoIGBGSUxFIConCnBhcmFtZXRlcnMgYXJlIG9ubHkgcHJvdmlkZWQgaWYgYDxzdGRpby5oPicgaXMgaW5jbHVkZWQgdG9vLgoKICAgICAjaW5jbHVkZSA8c3RkaW8uaD4KICAgICAjaW5jbHVkZSA8Z21wLmg+CgogICBMaWtld2lzZSBgPHN0ZGFyZy5oPicgaXMgcmVxdWlyZWQgZm9yIHByb3RvdHlwZXMgd2l0aCBgdmFfbGlzdCcKcGFyYW1ldGVycywgc3VjaCBhcyBgZ21wX3ZwcmludGYnLiAgQW5kIGA8b2JzdGFjay5oPicgZm9yIHByb3RvdHlwZXMKd2l0aCBgc3RydWN0IG9ic3RhY2snIHBhcmFtZXRlcnMsIHN1Y2ggYXMgYGdtcF9vYnN0YWNrX3ByaW50ZicsIHdoZW4KYXZhaWxhYmxlLgoKICAgQWxsIHByb2dyYW1zIHVzaW5nIEdNUCBtdXN0IGxpbmsgYWdhaW5zdCB0aGUgYGxpYmdtcCcgbGlicmFyeS4gIE9uIGEKdHlwaWNhbCBVbml4LWxpa2Ugc3lzdGVtIHRoaXMgY2FuIGJlIGRvbmUgd2l0aCBgLWxnbXAnLCBmb3IgZXhhbXBsZQoKICAgICBnY2MgbXlwcm9ncmFtLmMgLWxnbXAKCiAgIEdNUCBDKysgZnVuY3Rpb25zIGFyZSBpbiBhIHNlcGFyYXRlIGBsaWJnbXB4eCcgbGlicmFyeS4gIFRoaXMgaXMKYnVpbHQgYW5kIGluc3RhbGxlZCBpZiBDKysgc3VwcG9ydCBoYXMgYmVlbiBlbmFibGVkICgqbm90ZSBCdWlsZApPcHRpb25zOjopLiAgRm9yIGV4YW1wbGUsCgogICAgIGcrKyBteWN4eHByb2cuY2MgLWxnbXB4eCAtbGdtcAoKICAgR01QIGlzIGJ1aWx0IHVzaW5nIExpYnRvb2wgYW5kIGFuIGFwcGxpY2F0aW9uIGNhbiB1c2UgdGhhdCB0byBsaW5rCmlmIGRlc2lyZWQsICpub3RlIEdOVSBMaWJ0b29sOiAobGlidG9vbClUb3AuCgogICBJZiBHTVAgaGFzIGJlZW4gaW5zdGFsbGVkIHRvIGEgbm9uLXN0YW5kYXJkIGxvY2F0aW9uIHRoZW4gaXQgbWF5IGJlCm5lY2Vzc2FyeSB0byB1c2UgYC1JJyBhbmQgYC1MJyBjb21waWxlciBvcHRpb25zIHRvIHBvaW50IHRvIHRoZSByaWdodApkaXJlY3RvcmllcywgYW5kIHNvbWUgc29ydCBvZiBydW4tdGltZSBwYXRoIGZvciBhIHNoYXJlZCBsaWJyYXJ5LgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IE5vbWVuY2xhdHVyZSBhbmQgVHlwZXMsICBOZXh0OiBGdW5jdGlvbiBDbGFzc2VzLCAgUHJldjogSGVhZGVycyBhbmQgTGlicmFyaWVzLCAgVXA6IEdNUCBCYXNpY3MKCjMuMiBOb21lbmNsYXR1cmUgYW5kIFR5cGVzCj09PT09PT09PT09PT09PT09PT09PT09PT09CgpJbiB0aGlzIG1hbnVhbCwgImludGVnZXIiIHVzdWFsbHkgbWVhbnMgYSBtdWx0aXBsZSBwcmVjaXNpb24gaW50ZWdlciwgYXMKZGVmaW5lZCBieSB0aGUgR01QIGxpYnJhcnkuICBUaGUgQyBkYXRhIHR5cGUgZm9yIHN1Y2ggaW50ZWdlcnMgaXMKYG1wel90Jy4gIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgaG93IHRvIGRlY2xhcmUgc3VjaCBpbnRlZ2VyczoKCiAgICAgbXB6X3Qgc3VtOwoKICAgICBzdHJ1Y3QgZm9vIHsgbXB6X3QgeCwgeTsgfTsKCiAgICAgbXB6X3QgdmVjWzIwXTsKCiAgICJSYXRpb25hbCBudW1iZXIiIG1lYW5zIGEgbXVsdGlwbGUgcHJlY2lzaW9uIGZyYWN0aW9uLiAgVGhlIEMgZGF0YQp0eXBlIGZvciB0aGVzZSBmcmFjdGlvbnMgaXMgYG1wcV90Jy4gIEZvciBleGFtcGxlOgoKICAgICBtcHFfdCBxdW90aWVudDsKCiAgICJGbG9hdGluZyBwb2ludCBudW1iZXIiIG9yICJGbG9hdCIgZm9yIHNob3J0LCBpcyBhbiBhcmJpdHJhcnkKcHJlY2lzaW9uIG1hbnRpc3NhIHdpdGggYSBsaW1pdGVkIHByZWNpc2lvbiBleHBvbmVudC4gIFRoZSBDIGRhdGEgdHlwZQpmb3Igc3VjaCBvYmplY3RzIGlzIGBtcGZfdCcuICBGb3IgZXhhbXBsZToKCiAgICAgbXBmX3QgZnA7CgogICBUaGUgZmxvYXRpbmcgcG9pbnQgZnVuY3Rpb25zIGFjY2VwdCBhbmQgcmV0dXJuIGV4cG9uZW50cyBpbiB0aGUgQwp0eXBlIGBtcF9leHBfdCcuICBDdXJyZW50bHkgdGhpcyBpcyB1c3VhbGx5IGEgYGxvbmcnLCBidXQgb24gc29tZQpzeXN0ZW1zIGl0J3MgYW4gYGludCcgZm9yIGVmZmljaWVuY3kuCgogICBBICJsaW1iIiBtZWFucyB0aGUgcGFydCBvZiBhIG11bHRpLXByZWNpc2lvbiBudW1iZXIgdGhhdCBmaXRzIGluIGEKc2luZ2xlIG1hY2hpbmUgd29yZC4gIChXZSBjaG9zZSB0aGlzIHdvcmQgYmVjYXVzZSBhIGxpbWIgb2YgdGhlIGh1bWFuCmJvZHkgaXMgYW5hbG9nb3VzIHRvIGEgZGlnaXQsIG9ubHkgbGFyZ2VyLCBhbmQgY29udGFpbmluZyBzZXZlcmFsCmRpZ2l0cy4pICBOb3JtYWxseSBhIGxpbWIgaXMgMzIgb3IgNjQgYml0cy4gIFRoZSBDIGRhdGEgdHlwZSBmb3IgYSBsaW1iCmlzIGBtcF9saW1iX3QnLgoKICAgQ291bnRzIG9mIGxpbWJzIG9mIGEgbXVsdGktcHJlY2lzaW9uIG51bWJlciByZXByZXNlbnRlZCBpbiB0aGUgQyB0eXBlCmBtcF9zaXplX3QnLiAgQ3VycmVudGx5IHRoaXMgaXMgbm9ybWFsbHkgYSBgbG9uZycsIGJ1dCBvbiBzb21lIHN5c3RlbXMKaXQncyBhbiBgaW50JyBmb3IgZWZmaWNpZW5jeSwgYW5kIG9uIHNvbWUgc3lzdGVtcyBpdCB3aWxsIGJlIGBsb25nCmxvbmcnIGluIHRoZSBmdXR1cmUuCgogICBDb3VudHMgb2YgYml0cyBvZiBhIG11bHRpLXByZWNpc2lvbiBudW1iZXIgYXJlIHJlcHJlc2VudGVkIGluIHRoZSBDCnR5cGUgYG1wX2JpdGNudF90Jy4gIEN1cnJlbnRseSB0aGlzIGlzIGFsd2F5cyBhbiBgdW5zaWduZWQgbG9uZycsIGJ1dCBvbgpzb21lIHN5c3RlbXMgaXQgd2lsbCBiZSBhbiBgdW5zaWduZWQgbG9uZyBsb25nJyBpbiB0aGUgZnV0dXJlLgoKICAgIlJhbmRvbSBzdGF0ZSIgbWVhbnMgYW4gYWxnb3JpdGhtIHNlbGVjdGlvbiBhbmQgY3VycmVudCBzdGF0ZSBkYXRhLgpUaGUgQyBkYXRhIHR5cGUgZm9yIHN1Y2ggb2JqZWN0cyBpcyBgZ21wX3JhbmRzdGF0ZV90Jy4gIEZvciBleGFtcGxlOgoKICAgICBnbXBfcmFuZHN0YXRlX3QgcnN0YXRlOwoKICAgQWxzbywgaW4gZ2VuZXJhbCBgbXBfYml0Y250X3QnIGlzIHVzZWQgZm9yIGJpdCBjb3VudHMgYW5kIHJhbmdlcywgYW5kCmBzaXplX3QnIGlzIHVzZWQgZm9yIGJ5dGUgb3IgY2hhcmFjdGVyIGNvdW50cy4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBGdW5jdGlvbiBDbGFzc2VzLCAgTmV4dDogVmFyaWFibGUgQ29udmVudGlvbnMsICBQcmV2OiBOb21lbmNsYXR1cmUgYW5kIFR5cGVzLCAgVXA6IEdNUCBCYXNpY3MKCjMuMyBGdW5jdGlvbiBDbGFzc2VzCj09PT09PT09PT09PT09PT09PT09CgpUaGVyZSBhcmUgc2l4IGNsYXNzZXMgb2YgZnVuY3Rpb25zIGluIHRoZSBHTVAgbGlicmFyeToKCiAgMS4gRnVuY3Rpb25zIGZvciBzaWduZWQgaW50ZWdlciBhcml0aG1ldGljLCB3aXRoIG5hbWVzIGJlZ2lubmluZyB3aXRoCiAgICAgYG1wel8nLiAgVGhlIGFzc29jaWF0ZWQgdHlwZSBpcyBgbXB6X3QnLiAgVGhlcmUgYXJlIGFib3V0IDE1MAogICAgIGZ1bmN0aW9ucyBpbiB0aGlzIGNsYXNzLiAgKCpub3RlIEludGVnZXIgRnVuY3Rpb25zOjopCgogIDIuIEZ1bmN0aW9ucyBmb3IgcmF0aW9uYWwgbnVtYmVyIGFyaXRobWV0aWMsIHdpdGggbmFtZXMgYmVnaW5uaW5nIHdpdGgKICAgICBgbXBxXycuICBUaGUgYXNzb2NpYXRlZCB0eXBlIGlzIGBtcHFfdCcuICBUaGVyZSBhcmUgYWJvdXQgMzUKICAgICBmdW5jdGlvbnMgaW4gdGhpcyBjbGFzcywgYnV0IHRoZSBpbnRlZ2VyIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBmb3IKICAgICBhcml0aG1ldGljIG9uIHRoZSBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIHNlcGFyYXRlbHkuICAoKm5vdGUKICAgICBSYXRpb25hbCBOdW1iZXIgRnVuY3Rpb25zOjopCgogIDMuIEZ1bmN0aW9ucyBmb3IgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYywgd2l0aCBuYW1lcyBiZWdpbm5pbmcgd2l0aAogICAgIGBtcGZfJy4gIFRoZSBhc3NvY2lhdGVkIHR5cGUgaXMgYG1wZl90Jy4gIFRoZXJlIGFyZSBhYm91dCA3MAogICAgIGZ1bmN0aW9ucyBpcyB0aGlzIGNsYXNzLiAgKCpub3RlIEZsb2F0aW5nLXBvaW50IEZ1bmN0aW9uczo6KQoKICA0LiBGYXN0IGxvdy1sZXZlbCBmdW5jdGlvbnMgdGhhdCBvcGVyYXRlIG9uIG5hdHVyYWwgbnVtYmVycy4gIFRoZXNlCiAgICAgYXJlIHVzZWQgYnkgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgcHJlY2VkaW5nIGdyb3VwcywgYW5kIHlvdSBjYW4KICAgICBhbHNvIGNhbGwgdGhlbSBkaXJlY3RseSBmcm9tIHZlcnkgdGltZS1jcml0aWNhbCB1c2VyIHByb2dyYW1zLgogICAgIFRoZXNlIGZ1bmN0aW9ucycgbmFtZXMgYmVnaW4gd2l0aCBgbXBuXycuICBUaGUgYXNzb2NpYXRlZCB0eXBlIGlzCiAgICAgYXJyYXkgb2YgYG1wX2xpbWJfdCcuICBUaGVyZSBhcmUgYWJvdXQgNjAgKGhhcmQtdG8tdXNlKSBmdW5jdGlvbnMKICAgICBpbiB0aGlzIGNsYXNzLiAgKCpub3RlIExvdy1sZXZlbCBGdW5jdGlvbnM6OikKCiAgNS4gTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMuICBGdW5jdGlvbnMgZm9yIHNldHRpbmcgdXAgY3VzdG9tCiAgICAgYWxsb2NhdGlvbiBhbmQgZnVuY3Rpb25zIGZvciBnZW5lcmF0aW5nIHJhbmRvbSBudW1iZXJzLiAgKCpub3RlCiAgICAgQ3VzdG9tIEFsbG9jYXRpb246OiwgYW5kICpub3RlIFJhbmRvbSBOdW1iZXIgRnVuY3Rpb25zOjopCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogVmFyaWFibGUgQ29udmVudGlvbnMsICBOZXh0OiBQYXJhbWV0ZXIgQ29udmVudGlvbnMsICBQcmV2OiBGdW5jdGlvbiBDbGFzc2VzLCAgVXA6IEdNUCBCYXNpY3MKCjMuNCBWYXJpYWJsZSBDb252ZW50aW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT0KCkdNUCBmdW5jdGlvbnMgZ2VuZXJhbGx5IGhhdmUgb3V0cHV0IGFyZ3VtZW50cyBiZWZvcmUgaW5wdXQgYXJndW1lbnRzLgpUaGlzIG5vdGF0aW9uIGlzIGJ5IGFuYWxvZ3kgd2l0aCB0aGUgYXNzaWdubWVudCBvcGVyYXRvci4gIFRoZSBCU0QgTVAKY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMgYXJlIGV4Y2VwdGlvbnMsIGhhdmluZyB0aGUgb3V0cHV0IGFyZ3VtZW50cwpsYXN0LgoKICAgR01QIGxldHMgeW91IHVzZSB0aGUgc2FtZSB2YXJpYWJsZSBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGluIG9uZQpjYWxsLiAgRm9yIGV4YW1wbGUsIHRoZSBtYWluIGZ1bmN0aW9uIGZvciBpbnRlZ2VyIG11bHRpcGxpY2F0aW9uLApgbXB6X211bCcsIGNhbiBiZSB1c2VkIHRvIHNxdWFyZSBgeCcgYW5kIHB1dCB0aGUgcmVzdWx0IGJhY2sgaW4gYHgnIHdpdGgKCiAgICAgbXB6X211bCAoeCwgeCwgeCk7CgogICBCZWZvcmUgeW91IGNhbiBhc3NpZ24gdG8gYSBHTVAgdmFyaWFibGUsIHlvdSBuZWVkIHRvIGluaXRpYWxpemUgaXQKYnkgY2FsbGluZyBvbmUgb2YgdGhlIHNwZWNpYWwgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLiAgV2hlbiB5b3UncmUKZG9uZSB3aXRoIGEgdmFyaWFibGUsIHlvdSBuZWVkIHRvIGNsZWFyIGl0IG91dCwgdXNpbmcgb25lIG9mIHRoZQpmdW5jdGlvbnMgZm9yIHRoYXQgcHVycG9zZS4gIFdoaWNoIGZ1bmN0aW9uIHRvIHVzZSBkZXBlbmRzIG9uIHRoZSB0eXBlCm9mIHZhcmlhYmxlLiAgU2VlIHRoZSBjaGFwdGVycyBvbiBpbnRlZ2VyIGZ1bmN0aW9ucywgcmF0aW9uYWwgbnVtYmVyCmZ1bmN0aW9ucywgYW5kIGZsb2F0aW5nLXBvaW50IGZ1bmN0aW9ucyBmb3IgZGV0YWlscy4KCiAgIEEgdmFyaWFibGUgc2hvdWxkIG9ubHkgYmUgaW5pdGlhbGl6ZWQgb25jZSwgb3IgYXQgbGVhc3QgY2xlYXJlZApiZXR3ZWVuIGVhY2ggaW5pdGlhbGl6YXRpb24uICBBZnRlciBhIHZhcmlhYmxlIGhhcyBiZWVuIGluaXRpYWxpemVkLCBpdAptYXkgYmUgYXNzaWduZWQgdG8gYW55IG51bWJlciBvZiB0aW1lcy4KCiAgIEZvciBlZmZpY2llbmN5IHJlYXNvbnMsIGF2b2lkIGV4Y2Vzc2l2ZSBpbml0aWFsaXppbmcgYW5kIGNsZWFyaW5nLgpJbiBnZW5lcmFsLCBpbml0aWFsaXplIG5lYXIgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24gYW5kIGNsZWFyIG5lYXIgdGhlCmVuZC4gIEZvciBleGFtcGxlLAoKICAgICB2b2lkCiAgICAgZm9vICh2b2lkKQogICAgIHsKICAgICAgIG1wel90ICBuOwogICAgICAgaW50ICAgIGk7CiAgICAgICBtcHpfaW5pdCAobik7CiAgICAgICBmb3IgKGkgPSAxOyBpIDwgMTAwOyBpKyspCiAgICAgICAgIHsKICAgICAgICAgICBtcHpfbXVsIChuLCAuLi4pOwogICAgICAgICAgIG1wel9mZGl2X3EgKG4sIC4uLik7CiAgICAgICAgICAgLi4uCiAgICAgICAgIH0KICAgICAgIG1wel9jbGVhciAobik7CiAgICAgfQoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IFBhcmFtZXRlciBDb252ZW50aW9ucywgIE5leHQ6IE1lbW9yeSBNYW5hZ2VtZW50LCAgUHJldjogVmFyaWFibGUgQ29udmVudGlvbnMsICBVcDogR01QIEJhc2ljcwoKMy41IFBhcmFtZXRlciBDb252ZW50aW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT09CgpXaGVuIGEgR01QIHZhcmlhYmxlIGlzIHVzZWQgYXMgYSBmdW5jdGlvbiBwYXJhbWV0ZXIsIGl0J3MgZWZmZWN0aXZlbHkgYQpjYWxsLWJ5LXJlZmVyZW5jZSwgbWVhbmluZyBpZiB0aGUgZnVuY3Rpb24gc3RvcmVzIGEgdmFsdWUgdGhlcmUgaXQgd2lsbApjaGFuZ2UgdGhlIG9yaWdpbmFsIGluIHRoZSBjYWxsZXIuICBQYXJhbWV0ZXJzIHdoaWNoIGFyZSBpbnB1dC1vbmx5IGNhbgpiZSBkZXNpZ25hdGVkIGBjb25zdCcgdG8gcHJvdm9rZSBhIGNvbXBpbGVyIGVycm9yIG9yIHdhcm5pbmcgb24KYXR0ZW1wdGluZyB0byBtb2RpZnkgdGhlbS4KCiAgIFdoZW4gYSBmdW5jdGlvbiBpcyBnb2luZyB0byByZXR1cm4gYSBHTVAgcmVzdWx0LCBpdCBzaG91bGQgZGVzaWduYXRlCmEgcGFyYW1ldGVyIHRoYXQgaXQgc2V0cywgbGlrZSB0aGUgbGlicmFyeSBmdW5jdGlvbnMgZG8uICBNb3JlIHRoYW4gb25lCnZhbHVlIGNhbiBiZSByZXR1cm5lZCBieSBoYXZpbmcgbW9yZSB0aGFuIG9uZSBvdXRwdXQgcGFyYW1ldGVyLCBhZ2FpbgpsaWtlIHRoZSBsaWJyYXJ5IGZ1bmN0aW9ucy4gIEEgYHJldHVybicgb2YgYW4gYG1wel90JyBldGMgZG9lc24ndApyZXR1cm4gdGhlIG9iamVjdCwgb25seSBhIHBvaW50ZXIsIGFuZCB0aGlzIGlzIGFsbW9zdCBjZXJ0YWlubHkgbm90CndoYXQncyB3YW50ZWQuCgogICBIZXJlJ3MgYW4gZXhhbXBsZSBhY2NlcHRpbmcgYW4gYG1wel90JyBwYXJhbWV0ZXIsIGRvaW5nIGEKY2FsY3VsYXRpb24sIGFuZCBzdG9yaW5nIHRoZSByZXN1bHQgdG8gdGhlIGluZGljYXRlZCBwYXJhbWV0ZXIuCgogICAgIHZvaWQKICAgICBmb28gKG1wel90IHJlc3VsdCwgY29uc3QgbXB6X3QgcGFyYW0sIHVuc2lnbmVkIGxvbmcgbikKICAgICB7CiAgICAgICB1bnNpZ25lZCBsb25nICBpOwogICAgICAgbXB6X211bF91aSAocmVzdWx0LCBwYXJhbSwgbik7CiAgICAgICBmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKQogICAgICAgICBtcHpfYWRkX3VpIChyZXN1bHQsIHJlc3VsdCwgaSo3KTsKICAgICB9CgogICAgIGludAogICAgIG1haW4gKHZvaWQpCiAgICAgewogICAgICAgbXB6X3QgIHIsIG47CiAgICAgICBtcHpfaW5pdCAocik7CiAgICAgICBtcHpfaW5pdF9zZXRfc3RyIChuLCAiMTIzNDU2IiwgMCk7CiAgICAgICBmb28gKHIsIG4sIDIwTCk7CiAgICAgICBnbXBfcHJpbnRmICgiJVpkXG4iLCByKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KCiAgIGBmb28nIHdvcmtzIGV2ZW4gaWYgdGhlIG1haW5saW5lIHBhc3NlcyB0aGUgc2FtZSB2YXJpYWJsZSBmb3IKYHBhcmFtJyBhbmQgYHJlc3VsdCcsIGp1c3QgbGlrZSB0aGUgbGlicmFyeSBmdW5jdGlvbnMuICBCdXQgc29tZXRpbWVzCml0J3MgdHJpY2t5IHRvIG1ha2UgdGhhdCB3b3JrLCBhbmQgYW4gYXBwbGljYXRpb24gbWlnaHQgbm90IHdhbnQgdG8KYm90aGVyIHN1cHBvcnRpbmcgdGhhdCBzb3J0IG9mIHRoaW5nLgoKICAgRm9yIGludGVyZXN0LCB0aGUgR01QIHR5cGVzIGBtcHpfdCcgZXRjIGFyZSBpbXBsZW1lbnRlZCBhcwpvbmUtZWxlbWVudCBhcnJheXMgb2YgY2VydGFpbiBzdHJ1Y3R1cmVzLiAgVGhpcyBpcyB3aHkgZGVjbGFyaW5nIGEKdmFyaWFibGUgY3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgZmllbGRzIEdNUCBuZWVkcywgYnV0IHRoZW4gdXNpbmcgaXQKYXMgYSBwYXJhbWV0ZXIgcGFzc2VzIGEgcG9pbnRlciB0byB0aGUgb2JqZWN0LiAgTm90ZSB0aGF0IHRoZSBhY3R1YWwKZmllbGRzIGluIGVhY2ggYG1wel90JyBldGMgYXJlIGZvciBpbnRlcm5hbCB1c2Ugb25seSBhbmQgc2hvdWxkIG5vdCBiZQphY2Nlc3NlZCBkaXJlY3RseSBieSBjb2RlIHRoYXQgZXhwZWN0cyB0byBiZSBjb21wYXRpYmxlIHdpdGggZnV0dXJlIEdNUApyZWxlYXNlcy4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBNZW1vcnkgTWFuYWdlbWVudCwgIE5leHQ6IFJlZW50cmFuY3ksICBQcmV2OiBQYXJhbWV0ZXIgQ29udmVudGlvbnMsICBVcDogR01QIEJhc2ljcwoKMy42IE1lbW9yeSBNYW5hZ2VtZW50Cj09PT09PT09PT09PT09PT09PT09PQoKVGhlIEdNUCB0eXBlcyBsaWtlIGBtcHpfdCcgYXJlIHNtYWxsLCBjb250YWluaW5nIG9ubHkgYSBjb3VwbGUgb2Ygc2l6ZXMsCmFuZCBwb2ludGVycyB0byBhbGxvY2F0ZWQgZGF0YS4gIE9uY2UgYSB2YXJpYWJsZSBpcyBpbml0aWFsaXplZCwgR01QCnRha2VzIGNhcmUgb2YgYWxsIHNwYWNlIGFsbG9jYXRpb24uICBBZGRpdGlvbmFsIHNwYWNlIGlzIGFsbG9jYXRlZAp3aGVuZXZlciBhIHZhcmlhYmxlIGRvZXNuJ3QgaGF2ZSBlbm91Z2guCgogICBgbXB6X3QnIGFuZCBgbXBxX3QnIHZhcmlhYmxlcyBuZXZlciByZWR1Y2UgdGhlaXIgYWxsb2NhdGVkIHNwYWNlLgpOb3JtYWxseSB0aGlzIGlzIHRoZSBiZXN0IHBvbGljeSwgc2luY2UgaXQgYXZvaWRzIGZyZXF1ZW50IHJlYWxsb2NhdGlvbi4KQXBwbGljYXRpb25zIHRoYXQgbmVlZCB0byByZXR1cm4gbWVtb3J5IHRvIHRoZSBoZWFwIGF0IHNvbWUgcGFydGljdWxhcgpwb2ludCBjYW4gdXNlIGBtcHpfcmVhbGxvYzInLCBvciBjbGVhciB2YXJpYWJsZXMgbm8gbG9uZ2VyIG5lZWRlZC4KCiAgIGBtcGZfdCcgdmFyaWFibGVzLCBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdXNlIGEgZml4ZWQgYW1vdW50Cm9mIHNwYWNlLCBkZXRlcm1pbmVkIGJ5IHRoZSBjaG9zZW4gcHJlY2lzaW9uIGFuZCBhbGxvY2F0ZWQgYXQKaW5pdGlhbGl6YXRpb24sIHNvIHRoZWlyIHNpemUgZG9lc24ndCBjaGFuZ2UuCgogICBBbGwgbWVtb3J5IGlzIGFsbG9jYXRlZCB1c2luZyBgbWFsbG9jJyBhbmQgZnJpZW5kcyBieSBkZWZhdWx0LCBidXQKdGhpcyBjYW4gYmUgY2hhbmdlZCwgc2VlICpub3RlIEN1c3RvbSBBbGxvY2F0aW9uOjouICBUZW1wb3JhcnkgbWVtb3J5Cm9uIHRoZSBzdGFjayBpcyBhbHNvIHVzZWQgKHZpYSBgYWxsb2NhJyksIGJ1dCB0aGlzIGNhbiBiZSBjaGFuZ2VkIGF0CmJ1aWxkLXRpbWUgaWYgZGVzaXJlZCwgc2VlICpub3RlIEJ1aWxkIE9wdGlvbnM6Oi4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBSZWVudHJhbmN5LCAgTmV4dDogVXNlZnVsIE1hY3JvcyBhbmQgQ29uc3RhbnRzLCAgUHJldjogTWVtb3J5IE1hbmFnZW1lbnQsICBVcDogR01QIEJhc2ljcwoKMy43IFJlZW50cmFuY3kKPT09PT09PT09PT09PT0KCkdNUCBpcyByZWVudHJhbnQgYW5kIHRocmVhZC1zYWZlLCB3aXRoIHNvbWUgZXhjZXB0aW9uczoKCiAgICogSWYgY29uZmlndXJlZCB3aXRoIGAtLWVuYWJsZS1hbGxvY2E9bWFsbG9jLW5vdHJlZW50cmFudCcgKG9yIHdpdGgKICAgICBgLS1lbmFibGUtYWxsb2NhPW5vdHJlZW50cmFudCcgd2hlbiBgYWxsb2NhJyBpcyBub3QgYXZhaWxhYmxlKSwKICAgICB0aGVuIG5hdHVyYWxseSBHTVAgaXMgbm90IHJlZW50cmFudC4KCiAgICogYG1wZl9zZXRfZGVmYXVsdF9wcmVjJyBhbmQgYG1wZl9pbml0JyB1c2UgYSBnbG9iYWwgdmFyaWFibGUgZm9yIHRoZQogICAgIHNlbGVjdGVkIHByZWNpc2lvbi4gIGBtcGZfaW5pdDInIGNhbiBiZSB1c2VkIGluc3RlYWQsIGFuZCBpbiB0aGUKICAgICBDKysgaW50ZXJmYWNlIGFuIGV4cGxpY2l0IHByZWNpc2lvbiB0byB0aGUgYG1wZl9jbGFzcycgY29uc3RydWN0b3IuCgogICAqIGBtcHpfcmFuZG9tJyBhbmQgdGhlIG90aGVyIG9sZCByYW5kb20gbnVtYmVyIGZ1bmN0aW9ucyB1c2UgYSBnbG9iYWwKICAgICByYW5kb20gc3RhdGUgYW5kIGFyZSBoZW5jZSBub3QgcmVlbnRyYW50LiAgVGhlIG5ld2VyIHJhbmRvbSBudW1iZXIKICAgICBmdW5jdGlvbnMgdGhhdCBhY2NlcHQgYSBgZ21wX3JhbmRzdGF0ZV90JyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQKICAgICBpbnN0ZWFkLgoKICAgKiBgZ21wX3JhbmRpbml0JyAob2Jzb2xldGUpIHJldHVybnMgYW4gZXJyb3IgaW5kaWNhdGlvbiB0aHJvdWdoIGEKICAgICBnbG9iYWwgdmFyaWFibGUsIHdoaWNoIGlzIG5vdCB0aHJlYWQgc2FmZS4gIEFwcGxpY2F0aW9ucyBhcmUKICAgICBhZHZpc2VkIHRvIHVzZSBgZ21wX3JhbmRpbml0X2RlZmF1bHQnIG9yIGBnbXBfcmFuZGluaXRfbGNfMmV4cCcKICAgICBpbnN0ZWFkLgoKICAgKiBgbXBfc2V0X21lbW9yeV9mdW5jdGlvbnMnIHVzZXMgZ2xvYmFsIHZhcmlhYmxlcyB0byBzdG9yZSB0aGUKICAgICBzZWxlY3RlZCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCgogICAqIElmIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMgc2V0IGJ5IGEgY2FsbCB0bwogICAgIGBtcF9zZXRfbWVtb3J5X2Z1bmN0aW9ucycgKG9yIGBtYWxsb2MnIGFuZCBmcmllbmRzIGJ5IGRlZmF1bHQpIGFyZQogICAgIG5vdCByZWVudHJhbnQsIHRoZW4gR01QIHdpbGwgbm90IGJlIHJlZW50cmFudCBlaXRoZXIuCgogICAqIElmIHRoZSBzdGFuZGFyZCBJL08gZnVuY3Rpb25zIHN1Y2ggYXMgYGZ3cml0ZScgYXJlIG5vdCByZWVudHJhbnQKICAgICB0aGVuIHRoZSBHTVAgSS9PIGZ1bmN0aW9ucyB1c2luZyB0aGVtIHdpbGwgbm90IGJlIHJlZW50cmFudCBlaXRoZXIuCgogICAqIEl0J3Mgc2FmZSBmb3IgdHdvIHRocmVhZHMgdG8gcmVhZCBmcm9tIHRoZSBzYW1lIEdNUCB2YXJpYWJsZQogICAgIHNpbXVsdGFuZW91c2x5LCBidXQgaXQncyBub3Qgc2FmZSBmb3Igb25lIHRvIHJlYWQgd2hpbGUgYW5vdGhlcgogICAgIG1pZ2h0IGJlIHdyaXRpbmcsIG5vciBmb3IgdHdvIHRocmVhZHMgdG8gd3JpdGUgc2ltdWx0YW5lb3VzbHkuCiAgICAgSXQncyBub3Qgc2FmZSBmb3IgdHdvIHRocmVhZHMgdG8gZ2VuZXJhdGUgYSByYW5kb20gbnVtYmVyIGZyb20gdGhlCiAgICAgc2FtZSBgZ21wX3JhbmRzdGF0ZV90JyBzaW11bHRhbmVvdXNseSwgc2luY2UgdGhpcyBpbnZvbHZlcyBhbgogICAgIHVwZGF0ZSBvZiB0aGF0IHZhcmlhYmxlLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IFVzZWZ1bCBNYWNyb3MgYW5kIENvbnN0YW50cywgIE5leHQ6IENvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucywgIFByZXY6IFJlZW50cmFuY3ksICBVcDogR01QIEJhc2ljcwoKMy44IFVzZWZ1bCBNYWNyb3MgYW5kIENvbnN0YW50cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogLS0gR2xvYmFsIENvbnN0YW50OiBjb25zdCBpbnQgbXBfYml0c19wZXJfbGltYgogICAgIFRoZSBudW1iZXIgb2YgYml0cyBwZXIgbGltYi4KCiAtLSBNYWNybzogX19HTlVfTVBfVkVSU0lPTgogLS0gTWFjcm86IF9fR05VX01QX1ZFUlNJT05fTUlOT1IKIC0tIE1hY3JvOiBfX0dOVV9NUF9WRVJTSU9OX1BBVENITEVWRUwKICAgICBUaGUgbWFqb3IgYW5kIG1pbm9yIEdNUCB2ZXJzaW9uLCBhbmQgcGF0Y2ggbGV2ZWwsIHJlc3BlY3RpdmVseSwgYXMKICAgICBpbnRlZ2Vycy4gIEZvciBHTVAgaS5qLCB0aGVzZSBudW1iZXJzIHdpbGwgYmUgaSwgaiwgYW5kIDAsCiAgICAgcmVzcGVjdGl2ZWx5LiAgRm9yIEdNUCBpLmouaywgdGhlc2UgbnVtYmVycyB3aWxsIGJlIGksIGosIGFuZCBrLAogICAgIHJlc3BlY3RpdmVseS4KCiAtLSBHbG9iYWwgQ29uc3RhbnQ6IGNvbnN0IGNoYXIgKiBjb25zdCBnbXBfdmVyc2lvbgogICAgIFRoZSBHTVAgdmVyc2lvbiBudW1iZXIsIGFzIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZywgaW4gdGhlIGZvcm0KICAgICAiaS5qLmsiLiAgVGhpcyByZWxlYXNlIGlzICI2LjAuMCIuICBOb3RlIHRoYXQgdGhlIGZvcm1hdCAiaS5qIiB3YXMKICAgICB1c2VkLCBiZWZvcmUgdmVyc2lvbiA0LjMuMCwgd2hlbiBrIHdhcyB6ZXJvLgoKIC0tIE1hY3JvOiBfX0dNUF9DQwogLS0gTWFjcm86IF9fR01QX0NGTEFHUwogICAgIFRoZSBjb21waWxlciBhbmQgY29tcGlsZXIgZmxhZ3MsIHJlc3BlY3RpdmVseSwgdXNlZCB3aGVuIGNvbXBpbGluZwogICAgIEdNUCwgYXMgc3RyaW5ncy4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBDb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMsICBOZXh0OiBEZW1vbnN0cmF0aW9uIFByb2dyYW1zLCAgUHJldjogVXNlZnVsIE1hY3JvcyBhbmQgQ29uc3RhbnRzLCAgVXA6IEdNUCBCYXNpY3MKCjMuOSBDb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhpcyB2ZXJzaW9uIG9mIEdNUCBpcyB1cHdhcmRseSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIGFsbCA1LngsIDQueCwKYW5kIDMueCB2ZXJzaW9ucywgYW5kIHVwd2FyZGx5IGNvbXBhdGlibGUgYXQgdGhlIHNvdXJjZSBsZXZlbCB3aXRoIGFsbAoyLnggdmVyc2lvbnMsIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zLgoKICAgKiBgbXBuX2djZCcgaGFkIGl0cyBzb3VyY2UgYXJndW1lbnRzIHN3YXBwZWQgYXMgb2YgR01QIDMuMCwgZm9yCiAgICAgY29uc2lzdGVuY3kgd2l0aCBvdGhlciBgbXBuJyBmdW5jdGlvbnMuCgogICAqIGBtcGZfZ2V0X3ByZWMnIGNvdW50ZWQgcHJlY2lzaW9uIHNsaWdodGx5IGRpZmZlcmVudGx5IGluIEdNUCAzLjAKICAgICBhbmQgMy4wLjEsIGJ1dCBpbiAzLjEgcmV2ZXJ0ZWQgdG8gdGhlIDIueCBzdHlsZS4KCiAgICogYG1wbl9iZGl2bW9kJywgZG9jdW1lbnRlZCBhcyBwcmVsaW1pbmFyeSBpbiBHTVAgNCwgaGFzIGJlZW4KICAgICByZW1vdmVkLgoKICAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGNvbXBhdGliaWxpdHkgaXNzdWVzIGJldHdlZW4gR01QIDEgYW5kIEdNUCAyCnRoYXQgb2YgY291cnNlIGFsc28gYXBwbHkgd2hlbiBwb3J0aW5nIGFwcGxpY2F0aW9ucyBmcm9tIEdNUCAxIHRvIEdNUAo1LiAgUGxlYXNlIHNlZSB0aGUgR01QIDIgbWFudWFsIGZvciBkZXRhaWxzLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IERlbW9uc3RyYXRpb24gUHJvZ3JhbXMsICBOZXh0OiBFZmZpY2llbmN5LCAgUHJldjogQ29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zLCAgVXA6IEdNUCBCYXNpY3MKCjMuMTAgRGVtb25zdHJhdGlvbiBwcm9ncmFtcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSBgZGVtb3MnIHN1YmRpcmVjdG9yeSBoYXMgc29tZSBzYW1wbGUgcHJvZ3JhbXMgdXNpbmcgR01QLiAgVGhlc2UKYXJlbid0IGJ1aWx0IG9yIGluc3RhbGxlZCwgYnV0IHRoZXJlJ3MgYSBgTWFrZWZpbGUnIHdpdGggcnVsZXMgZm9yIHRoZW0uCkZvciBpbnN0YW5jZSwKCiAgICAgbWFrZSBwZXhwcgogICAgIC4vcGV4cHIgNjheOTc1KzEwCgpUaGUgZm9sbG93aW5nIHByb2dyYW1zIGFyZSBwcm92aWRlZAoKICAgKiBgcGV4cHInIGlzIGFuIGV4cHJlc3Npb24gZXZhbHVhdG9yLCB0aGUgcHJvZ3JhbSB1c2VkIG9uIHRoZSBHTVAKICAgICB3ZWIgcGFnZS4KCiAgICogVGhlIGBjYWxjJyBzdWJkaXJlY3RvcnkgaGFzIGEgc2ltaWxhciBidXQgc2ltcGxlciBldmFsdWF0b3IgdXNpbmcKICAgICBgbGV4JyBhbmQgYHlhY2MnLgoKICAgKiBUaGUgYGV4cHInIHN1YmRpcmVjdG9yeSBpcyB5ZXQgYW5vdGhlciBleHByZXNzaW9uIGV2YWx1YXRvciwgYQogICAgIGxpYnJhcnkgZGVzaWduZWQgZm9yIGVhc2Ugb2YgdXNlIHdpdGhpbiBhIEMgcHJvZ3JhbS4gIFNlZQogICAgIGBkZW1vcy9leHByL1JFQURNRScgZm9yIG1vcmUgaW5mb3JtYXRpb24uCgogICAqIGBmYWN0b3JpemUnIGlzIGEgUG9sbGFyZC1SaG8gZmFjdG9yaXphdGlvbiBwcm9ncmFtLgoKICAgKiBgaXNwcmltZScgaXMgYSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIHRvIHRoZSBgbXB6X3Byb2JhYl9wcmltZV9wJwogICAgIGZ1bmN0aW9uLgoKICAgKiBgcHJpbWVzJyBjb3VudHMgb3IgbGlzdHMgcHJpbWVzIGluIGFuIGludGVydmFsLCB1c2luZyBhIHNpZXZlLgoKICAgKiBgcWNuJyBpcyBhbiBleGFtcGxlIHVzZSBvZiBgbXB6X2tyb25lY2tlcl91aScgdG8gZXN0aW1hdGUgcXVhZHJhdGljCiAgICAgY2xhc3MgbnVtYmVycy4KCiAgICogVGhlIGBwZXJsJyBzdWJkaXJlY3RvcnkgaXMgYSBjb21wcmVoZW5zaXZlIHBlcmwgaW50ZXJmYWNlIHRvIEdNUC4KICAgICBTZWUgYGRlbW9zL3BlcmwvSU5TVEFMTCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBEb2N1bWVudGF0aW9uIGlzCiAgICAgaW4gUE9EIGZvcm1hdCBpbiBgZGVtb3MvcGVybC9HTVAucG0nLgoKICAgQXMgYW4gYXNpZGUsIGNvbnNpZGVyYXRpb24gaGFzIGJlZW4gZ2l2ZW4gYXQgdmFyaW91cyB0aW1lcyB0byBzb21lCnNvcnQgb2YgZXhwcmVzc2lvbiBldmFsdWF0aW9uIHdpdGhpbiB0aGUgbWFpbiBHTVAgbGlicmFyeS4gIEdvaW5nCmJleW9uZCBzb21ldGhpbmcgbWluaW1hbCBxdWlja2x5IGxlYWRzIHRvIG1hdHRlcnMgbGlrZSB1c2VyLWRlZmluZWQKZnVuY3Rpb25zLCBsb29waW5nLCBmaXhudW1zIGZvciBjb250cm9sIHZhcmlhYmxlcywgZXRjLCB3aGljaCBhcmUKY29uc2lkZXJlZCBvdXRzaWRlIHRoZSBzY29wZSBvZiBHTVAgKG11Y2ggY2xvc2VyIHRvIGxhbmd1YWdlCmludGVycHJldGVycyBvciBjb21waWxlcnMsICpOb3RlIExhbmd1YWdlIEJpbmRpbmdzOjouKSAgU29tZXRoaW5nCnNpbXBsZSBmb3IgcHJvZ3JhbSBpbnB1dCBjb252ZW5pZW5jZSBtYXkgeWV0IGJlIGEgcG9zc2liaWxpdHksIGEKY29tYmluYXRpb24gb2YgdGhlIGBleHByJyBkZW1vIGFuZCB0aGUgYHBleHByJyB0cmVlIGJhY2stZW5kIHBlcmhhcHMuCkJ1dCBmb3Igbm93IHRoZSBhYm92ZSBldmFsdWF0b3JzIGFyZSBvZmZlcmVkIGFzIGlsbHVzdHJhdGlvbnMuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogRWZmaWNpZW5jeSwgIE5leHQ6IERlYnVnZ2luZywgIFByZXY6IERlbW9uc3RyYXRpb24gUHJvZ3JhbXMsICBVcDogR01QIEJhc2ljcwoKMy4xMSBFZmZpY2llbmN5Cj09PT09PT09PT09PT09PQoKU21hbGwgT3BlcmFuZHMKICAgICBPbiBzbWFsbCBvcGVyYW5kcywgdGhlIHRpbWUgZm9yIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWRzIGFuZCBtZW1vcnkKICAgICBhbGxvY2F0aW9uIGNhbiBiZSBzaWduaWZpY2FudCBpbiBjb21wYXJpc29uIHRvIGFjdHVhbCBjYWxjdWxhdGlvbi4KICAgICBUaGlzIGlzIHVuYXZvaWRhYmxlIGluIGEgZ2VuZXJhbCBwdXJwb3NlIHZhcmlhYmxlIHByZWNpc2lvbgogICAgIGxpYnJhcnksIGFsdGhvdWdoIEdNUCBhdHRlbXB0cyB0byBiZSBhcyBlZmZpY2llbnQgYXMgaXQgY2FuIG9uCiAgICAgYm90aCBsYXJnZSBhbmQgc21hbGwgb3BlcmFuZHMuCgpTdGF0aWMgTGlua2luZwogICAgIE9uIHNvbWUgQ1BVcywgaW4gcGFydGljdWxhciB0aGUgeDg2cywgdGhlIHN0YXRpYyBgbGliZ21wLmEnIHNob3VsZAogICAgIGJlIHVzZWQgZm9yIG1heGltdW0gc3BlZWQsIHNpbmNlIHRoZSBQSUMgY29kZSBpbiB0aGUgc2hhcmVkCiAgICAgYGxpYmdtcC5zbycgd2lsbCBoYXZlIGEgc21hbGwgb3ZlcmhlYWQgb24gZWFjaCBmdW5jdGlvbiBjYWxsIGFuZAogICAgIGdsb2JhbCBkYXRhIGFkZHJlc3MuICBGb3IgbWFueSBwcm9ncmFtcyB0aGlzIHdpbGwgYmUKICAgICBpbnNpZ25pZmljYW50LCBidXQgZm9yIGxvbmcgY2FsY3VsYXRpb25zIHRoZXJlJ3MgYSBnYWluIHRvIGJlIGhhZC4KCkluaXRpYWxpemluZyBhbmQgQ2xlYXJpbmcKICAgICBBdm9pZCBleGNlc3NpdmUgaW5pdGlhbGl6aW5nIGFuZCBjbGVhcmluZyBvZiB2YXJpYWJsZXMsIHNpbmNlIHRoaXMKICAgICBjYW4gYmUgcXVpdGUgdGltZSBjb25zdW1pbmcsIGVzcGVjaWFsbHkgaW4gY29tcGFyaXNvbiB0byBvdGhlcndpc2UKICAgICBmYXN0IG9wZXJhdGlvbnMgbGlrZSBhZGRpdGlvbi4KCiAgICAgQSBsYW5ndWFnZSBpbnRlcnByZXRlciBtaWdodCB3YW50IHRvIGtlZXAgYSBmcmVlIGxpc3Qgb3Igc3RhY2sgb2YKICAgICBpbml0aWFsaXplZCB2YXJpYWJsZXMgcmVhZHkgZm9yIHVzZS4gIEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0bwogICAgIGludGVncmF0ZSBzb21ldGhpbmcgbGlrZSB0aGF0IHdpdGggYSBnYXJiYWdlIGNvbGxlY3RvciB0b28uCgpSZWFsbG9jYXRpb25zCiAgICAgQW4gYG1wel90JyBvciBgbXBxX3QnIHZhcmlhYmxlIHVzZWQgdG8gaG9sZCBzdWNjZXNzaXZlbHkgaW5jcmVhc2luZwogICAgIHZhbHVlcyB3aWxsIGhhdmUgaXRzIG1lbW9yeSByZXBlYXRlZGx5IGByZWFsbG9jJ2VkLCB3aGljaCBjb3VsZCBiZQogICAgIHF1aXRlIHNsb3cgb3IgY291bGQgZnJhZ21lbnQgbWVtb3J5LCBkZXBlbmRpbmcgb24gdGhlIEMgbGlicmFyeS4KICAgICBJZiBhbiBhcHBsaWNhdGlvbiBjYW4gZXN0aW1hdGUgdGhlIGZpbmFsIHNpemUgdGhlbiBgbXB6X2luaXQyJyBvcgogICAgIGBtcHpfcmVhbGxvYzInIGNhbiBiZSBjYWxsZWQgdG8gYWxsb2NhdGUgdGhlIG5lY2Vzc2FyeSBzcGFjZSBmcm9tCiAgICAgdGhlIGJlZ2lubmluZyAoKm5vdGUgSW5pdGlhbGl6aW5nIEludGVnZXJzOjopLgoKICAgICBJdCBkb2Vzbid0IG1hdHRlciBpZiBhIHNpemUgc2V0IHdpdGggYG1wel9pbml0Micgb3IgYG1wel9yZWFsbG9jMicKICAgICBpcyB0b28gc21hbGwsIHNpbmNlIGFsbCBmdW5jdGlvbnMgd2lsbCBkbyBhIGZ1cnRoZXIgcmVhbGxvY2F0aW9uCiAgICAgaWYgbmVjZXNzYXJ5LiAgQmFkbHkgb3ZlcmVzdGltYXRpbmcgbWVtb3J5IHJlcXVpcmVkIHdpbGwgd2FzdGUKICAgICBzcGFjZSB0aG91Z2guCgpgMmV4cCcgRnVuY3Rpb25zCiAgICAgSXQncyB1cCB0byBhbiBhcHBsaWNhdGlvbiB0byBjYWxsIGZ1bmN0aW9ucyBsaWtlIGBtcHpfbXVsXzJleHAnCiAgICAgd2hlbiBhcHByb3ByaWF0ZS4gIEdlbmVyYWwgcHVycG9zZSBmdW5jdGlvbnMgbGlrZSBgbXB6X211bCcgbWFrZQogICAgIG5vIGF0dGVtcHQgdG8gaWRlbnRpZnkgcG93ZXJzIG9mIHR3byBvciBvdGhlciBzcGVjaWFsIGZvcm1zLAogICAgIGJlY2F1c2Ugc3VjaCBpbnB1dHMgd2lsbCB1c3VhbGx5IGJlIHZlcnkgcmFyZSBhbmQgdGVzdGluZyBldmVyeQogICAgIHRpbWUgd291bGQgYmUgd2FzdGVmdWwuCgpgdWknIGFuZCBgc2knIEZ1bmN0aW9ucwogICAgIFRoZSBgdWknIGZ1bmN0aW9ucyBhbmQgdGhlIHNtYWxsIG51bWJlciBvZiBgc2knIGZ1bmN0aW9ucyBleGlzdCBmb3IKICAgICBjb252ZW5pZW5jZSBhbmQgc2hvdWxkIGJlIHVzZWQgd2hlcmUgYXBwbGljYWJsZS4gIEJ1dCBpZiBmb3IKICAgICBleGFtcGxlIGFuIGBtcHpfdCcgY29udGFpbnMgYSB2YWx1ZSB0aGF0IGZpdHMgaW4gYW4gYHVuc2lnbmVkCiAgICAgbG9uZycgdGhlcmUncyBubyBuZWVkIGV4dHJhY3QgaXQgYW5kIGNhbGwgYSBgdWknIGZ1bmN0aW9uLCBqdXN0CiAgICAgdXNlIHRoZSByZWd1bGFyIGBtcHonIGZ1bmN0aW9uLgoKSW4tUGxhY2UgT3BlcmF0aW9ucwogICAgIGBtcHpfYWJzJywgYG1wcV9hYnMnLCBgbXBmX2FicycsIGBtcHpfbmVnJywgYG1wcV9uZWcnIGFuZAogICAgIGBtcGZfbmVnJyBhcmUgZmFzdCB3aGVuIHVzZWQgZm9yIGluLXBsYWNlIG9wZXJhdGlvbnMgbGlrZQogICAgIGBtcHpfYWJzKHgseCknLCBzaW5jZSBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvbmx5IGEgc2luZ2xlCiAgICAgZmllbGQgb2YgYHgnIG5lZWRzIGNoYW5naW5nLiAgT24gc3VpdGFibGUgY29tcGlsZXJzIChHQ0MgZm9yCiAgICAgaW5zdGFuY2UpIHRoaXMgaXMgaW5saW5lZCB0b28uCgogICAgIGBtcHpfYWRkX3VpJywgYG1wel9zdWJfdWknLCBgbXBmX2FkZF91aScgYW5kIGBtcGZfc3ViX3VpJyBiZW5lZml0CiAgICAgZnJvbSBhbiBpbi1wbGFjZSBvcGVyYXRpb24gbGlrZSBgbXB6X2FkZF91aSh4LHgseSknLCBzaW5jZSB1c3VhbGx5CiAgICAgb25seSBvbmUgb3IgdHdvIGxpbWJzIG9mIGB4JyB3aWxsIG5lZWQgdG8gYmUgY2hhbmdlZC4gIFRoZSBzYW1lCiAgICAgYXBwbGllcyB0byB0aGUgZnVsbCBwcmVjaXNpb24gYG1wel9hZGQnIGV0YyBpZiBgeScgaXMgc21hbGwuICBJZgogICAgIGB5JyBpcyBiaWcgdGhlbiBjYWNoZSBsb2NhbGl0eSBtYXkgYmUgaGVscGVkLCBidXQgdGhhdCdzIGFsbC4KCiAgICAgYG1wel9tdWwnIGlzIGN1cnJlbnRseSB0aGUgb3Bwb3NpdGUsIGEgc2VwYXJhdGUgZGVzdGluYXRpb24gaXMKICAgICBzbGlnaHRseSBiZXR0ZXIuICBBIGNhbGwgbGlrZSBgbXB6X211bCh4LHgseSknIHdpbGwsIHVubGVzcyBgeScgaXMKICAgICBvbmx5IG9uZSBsaW1iLCBtYWtlIGEgdGVtcG9yYXJ5IGNvcHkgb2YgYHgnIGJlZm9yZSBmb3JtaW5nIHRoZQogICAgIHJlc3VsdC4gIE5vcm1hbGx5IHRoYXQgY29weWluZyB3aWxsIG9ubHkgYmUgYSB0aW55IGZyYWN0aW9uIG9mIHRoZQogICAgIHRpbWUgZm9yIHRoZSBtdWx0aXBseSwgc28gdGhpcyBpcyBub3QgYSBwYXJ0aWN1bGFybHkgaW1wb3J0YW50CiAgICAgY29uc2lkZXJhdGlvbi4KCiAgICAgYG1wel9zZXQnLCBgbXBxX3NldCcsIGBtcHFfc2V0X251bScsIGBtcGZfc2V0JywgZXRjLCBtYWtlIG5vCiAgICAgYXR0ZW1wdCB0byByZWNvZ25pc2UgYSBjb3B5IG9mIHNvbWV0aGluZyB0byBpdHNlbGYsIHNvIGEgY2FsbCBsaWtlCiAgICAgYG1wel9zZXQoeCx4KScgd2lsbCBiZSB3YXN0ZWZ1bC4gIE5hdHVyYWxseSB0aGF0IHdvdWxkIG5ldmVyIGJlCiAgICAgd3JpdHRlbiBkZWxpYmVyYXRlbHksIGJ1dCBpZiBpdCBtaWdodCBhcmlzZSBmcm9tIHR3byBwb2ludGVycyB0bwogICAgIHRoZSBzYW1lIG9iamVjdCB0aGVuIGEgdGVzdCB0byBhdm9pZCBpdCBtaWdodCBiZSBkZXNpcmFibGUuCgogICAgICAgICAgaWYgKHggIT0geSkKICAgICAgICAgICAgbXB6X3NldCAoeCwgeSk7CgogICAgIE5vdGUgdGhhdCBpdCdzIG5ldmVyIHdvcnRoIGludHJvZHVjaW5nIGV4dHJhIGBtcHpfc2V0JyBjYWxscyBqdXN0CiAgICAgdG8gZ2V0IGluLXBsYWNlIG9wZXJhdGlvbnMuICBJZiBhIHJlc3VsdCBzaG91bGQgZ28gdG8gYSBwYXJ0aWN1bGFyCiAgICAgdmFyaWFibGUgdGhlbiBqdXN0IGRpcmVjdCBpdCB0aGVyZSBhbmQgbGV0IEdNUCB0YWtlIGNhcmUgb2YgZGF0YQogICAgIG1vdmVtZW50LgoKRGl2aXNpYmlsaXR5IFRlc3RpbmcgKFNtYWxsIEludGVnZXJzKQogICAgIGBtcHpfZGl2aXNpYmxlX3VpX3AnIGFuZCBgbXB6X2NvbmdydWVudF91aV9wJyBhcmUgdGhlIGJlc3QKICAgICBmdW5jdGlvbnMgZm9yIHRlc3Rpbmcgd2hldGhlciBhbiBgbXB6X3QnIGlzIGRpdmlzaWJsZSBieSBhbgogICAgIGluZGl2aWR1YWwgc21hbGwgaW50ZWdlci4gIFRoZXkgdXNlIGFuIGFsZ29yaXRobSB3aGljaCBpcyBmYXN0ZXIKICAgICB0aGFuIGBtcHpfdGRpdl91aScsIGJ1dCB3aGljaCBnaXZlcyBubyB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQKICAgICB0aGUgYWN0dWFsIHJlbWFpbmRlciwgb25seSB3aGV0aGVyIGl0J3MgemVybyAob3IgYSBwYXJ0aWN1bGFyCiAgICAgdmFsdWUpLgoKICAgICBIb3dldmVyIHdoZW4gdGVzdGluZyBkaXZpc2liaWxpdHkgYnkgc2V2ZXJhbCBzbWFsbCBpbnRlZ2VycywgaXQncwogICAgIGJlc3QgdG8gdGFrZSBhIHJlbWFpbmRlciBtb2R1bG8gdGhlaXIgcHJvZHVjdCwgdG8gc2F2ZQogICAgIG11bHRpLXByZWNpc2lvbiBvcGVyYXRpb25zLiAgRm9yIGluc3RhbmNlIHRvIHRlc3Qgd2hldGhlciBhIG51bWJlcgogICAgIGlzIGRpdmlzaWJsZSBieSBhbnkgb2YgMjMsIDI5IG9yIDMxIHRha2UgYSByZW1haW5kZXIgbW9kdWxvCiAgICAgMjMqMjkqMzEgPSAyMDY3NyBhbmQgdGhlbiB0ZXN0IHRoYXQuCgogICAgIFRoZSBkaXZpc2lvbiBmdW5jdGlvbnMgbGlrZSBgbXB6X3RkaXZfcV91aScgd2hpY2ggZ2l2ZSBhIHF1b3RpZW50CiAgICAgYXMgd2VsbCBhcyBhIHJlbWFpbmRlciBhcmUgZ2VuZXJhbGx5IGEgbGl0dGxlIHNsb3dlciB0aGFuIHRoZQogICAgIHJlbWFpbmRlci1vbmx5IGZ1bmN0aW9ucyBsaWtlIGBtcHpfdGRpdl91aScuICBJZiB0aGUgcXVvdGllbnQgaXMKICAgICBvbmx5IHJhcmVseSB3YW50ZWQgdGhlbiBpdCdzIHByb2JhYmx5IGJlc3QgdG8ganVzdCB0YWtlIGEKICAgICByZW1haW5kZXIgYW5kIHRoZW4gZ28gYmFjayBhbmQgY2FsY3VsYXRlIHRoZSBxdW90aWVudCBpZiBhbmQgd2hlbgogICAgIGl0J3Mgd2FudGVkIChgbXB6X2RpdmV4YWN0X3VpJyBjYW4gYmUgdXNlZCBpZiB0aGUgcmVtYWluZGVyIGlzCiAgICAgemVybykuCgpSYXRpb25hbCBBcml0aG1ldGljCiAgICAgVGhlIGBtcHEnIGZ1bmN0aW9ucyBvcGVyYXRlIG9uIGBtcHFfdCcgdmFsdWVzIHdpdGggbm8gY29tbW9uCiAgICAgZmFjdG9ycyBpbiB0aGUgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvci4gIENvbW1vbiBmYWN0b3JzIGFyZQogICAgIGNoZWNrZWQtZm9yIGFuZCBjYXN0IG91dCBhcyBuZWNlc3NhcnkuICBJbiBnZW5lcmFsLCBjYW5jZWxsaW5nCiAgICAgZmFjdG9ycyBldmVyeSB0aW1lIGlzIHRoZSBiZXN0IGFwcHJvYWNoIHNpbmNlIGl0IG1pbmltaXplcyB0aGUKICAgICBzaXplcyBmb3Igc3Vic2VxdWVudCBvcGVyYXRpb25zLgoKICAgICBIb3dldmVyLCBhcHBsaWNhdGlvbnMgdGhhdCBrbm93IHNvbWV0aGluZyBhYm91dCB0aGUgZmFjdG9yaXphdGlvbgogICAgIG9mIHRoZSB2YWx1ZXMgdGhleSdyZSB3b3JraW5nIHdpdGggbWlnaHQgYmUgYWJsZSB0byBhdm9pZCBzb21lIG9mCiAgICAgdGhlIEdDRHMgdXNlZCBmb3IgY2Fub25pY2FsaXphdGlvbiwgb3Igc3dhcCB0aGVtIGZvciBkaXZpc2lvbnMuCiAgICAgRm9yIGV4YW1wbGUgd2hlbiBtdWx0aXBseWluZyBieSBhIHByaW1lIGl0J3MgZW5vdWdoIHRvIGNoZWNrIGZvcgogICAgIGZhY3RvcnMgb2YgaXQgaW4gdGhlIGRlbm9taW5hdG9yIGluc3RlYWQgb2YgZG9pbmcgYSBmdWxsIEdDRC4gIE9yCiAgICAgd2hlbiBmb3JtaW5nIGEgYmlnIHByb2R1Y3QgaXQgbWlnaHQgYmUga25vd24gdGhhdCB2ZXJ5IGxpdHRsZQogICAgIGNhbmNlbGxhdGlvbiB3aWxsIGJlIHBvc3NpYmxlLCBhbmQgc28gY2Fub25pY2FsaXphdGlvbiBjYW4gYmUgbGVmdAogICAgIHRvIHRoZSBlbmQuCgogICAgIFRoZSBgbXBxX251bXJlZicgYW5kIGBtcHFfZGVucmVmJyBtYWNyb3MgZ2l2ZSBhY2Nlc3MgdG8gdGhlCiAgICAgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciB0byBkbyB0aGluZ3Mgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhlCiAgICAgc3VwcGxpZWQgYG1wcScgZnVuY3Rpb25zLiAgKk5vdGUgQXBwbHlpbmcgSW50ZWdlciBGdW5jdGlvbnM6Oi4KCiAgICAgVGhlIGNhbm9uaWNhbCBmb3JtIGZvciByYXRpb25hbHMgYWxsb3dzIG1peGVkLXR5cGUgYG1wcV90JyBhbmQKICAgICBpbnRlZ2VyIGFkZGl0aW9ucyBvciBzdWJ0cmFjdGlvbnMgdG8gYmUgZG9uZSBkaXJlY3RseSB3aXRoCiAgICAgbXVsdGlwbGVzIG9mIHRoZSBkZW5vbWluYXRvci4gIFRoaXMgd2lsbCBiZSBzb21ld2hhdCBmYXN0ZXIgdGhhbgogICAgIGBtcHFfYWRkJy4gIEZvciBleGFtcGxlLAoKICAgICAgICAgIC8qIG1wcSBpbmNyZW1lbnQgKi8KICAgICAgICAgIG1wel9hZGQgKG1wcV9udW1yZWYocSksIG1wcV9udW1yZWYocSksIG1wcV9kZW5yZWYocSkpOwoKICAgICAgICAgIC8qIG1wcSArPSB1bnNpZ25lZCBsb25nICovCiAgICAgICAgICBtcHpfYWRkbXVsX3VpIChtcHFfbnVtcmVmKHEpLCBtcHFfZGVucmVmKHEpLCAxMjNVTCk7CgogICAgICAgICAgLyogbXBxIC09IG1weiAqLwogICAgICAgICAgbXB6X3N1Ym11bCAobXBxX251bXJlZihxKSwgbXBxX2RlbnJlZihxKSwgeik7CgpOdW1iZXIgU2VxdWVuY2VzCiAgICAgRnVuY3Rpb25zIGxpa2UgYG1wel9mYWNfdWknLCBgbXB6X2ZpYl91aScgYW5kIGBtcHpfYmluX3VpdWknIGFyZQogICAgIGRlc2lnbmVkIGZvciBjYWxjdWxhdGluZyBpc29sYXRlZCB2YWx1ZXMuICBJZiBhIHJhbmdlIG9mIHZhbHVlcyBpcwogICAgIHdhbnRlZCBpdCdzIHByb2JhYmx5IGJlc3QgdG8gY2FsbCB0byBnZXQgYSBzdGFydGluZyBwb2ludCBhbmQKICAgICBpdGVyYXRlIGZyb20gdGhlcmUuCgpUZXh0IElucHV0L091dHB1dAogICAgIEhleGFkZWNpbWFsIG9yIG9jdGFsIGFyZSBzdWdnZXN0ZWQgZm9yIGlucHV0IG9yIG91dHB1dCBpbiB0ZXh0CiAgICAgZm9ybS4gIFBvd2VyLW9mLTIgYmFzZXMgbGlrZSB0aGVzZSBjYW4gYmUgY29udmVydGVkIG11Y2ggbW9yZQogICAgIGVmZmljaWVudGx5IHRoYW4gb3RoZXIgYmFzZXMsIGxpa2UgZGVjaW1hbC4gIEZvciBiaWcgbnVtYmVycwogICAgIHRoZXJlJ3MgdXN1YWxseSBub3RoaW5nIG9mIHBhcnRpY3VsYXIgaW50ZXJlc3QgdG8gYmUgc2VlbiBpbiB0aGUKICAgICBkaWdpdHMsIHNvIHRoZSBiYXNlIGRvZXNuJ3QgbWF0dGVyIG11Y2guCgogICAgIE1heWJlIHdlIGNhbiBob3BlIG9jdGFsIHdpbGwgb25lIGRheSBiZWNvbWUgdGhlIG5vcm1hbCBiYXNlIGZvcgogICAgIGV2ZXJ5ZGF5IHVzZSwgYXMgcHJvcG9zZWQgYnkgS2luZyBDaGFybGVzIFhJSSBvZiBTd2VkZW4gYW5kIGxhdGVyCiAgICAgcmVmb3JtZXJzLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IERlYnVnZ2luZywgIE5leHQ6IFByb2ZpbGluZywgIFByZXY6IEVmZmljaWVuY3ksICBVcDogR01QIEJhc2ljcwoKMy4xMiBEZWJ1Z2dpbmcKPT09PT09PT09PT09PT0KClN0YWNrIE92ZXJmbG93CiAgICAgRGVwZW5kaW5nIG9uIHRoZSBzeXN0ZW0sIGEgc2VnbWVudGF0aW9uIHZpb2xhdGlvbiBvciBidXMgZXJyb3IKICAgICBtaWdodCBiZSB0aGUgb25seSBpbmRpY2F0aW9uIG9mIHN0YWNrIG92ZXJmbG93LiAgU2VlCiAgICAgYC0tZW5hYmxlLWFsbG9jYScgY2hvaWNlcyBpbiAqbm90ZSBCdWlsZCBPcHRpb25zOjosIGZvciBob3cgdG8KICAgICBhZGRyZXNzIHRoaXMuCgogICAgIEluIG5ldyBlbm91Z2ggdmVyc2lvbnMgb2YgR0NDLCBgLWZzdGFjay1jaGVjaycgbWF5IGJlIGFibGUgdG8KICAgICBlbnN1cmUgYW4gb3ZlcmZsb3cgaXMgcmVjb2duaXNlZCBieSB0aGUgc3lzdGVtIGJlZm9yZSB0b28gbXVjaAogICAgIGRhbWFnZSBpcyBkb25lLCBvciBgLWZzdGFjay1saW1pdC1zeW1ib2wnIG9yCiAgICAgYC1mc3RhY2stbGltaXQtcmVnaXN0ZXInIG1heSBiZSBhYmxlIHRvIGFkZCBjaGVja2luZyBpZiB0aGUgc3lzdGVtCiAgICAgaXRzZWxmIGRvZXNuJ3QgZG8gYW55ICgqbm90ZSBPcHRpb25zIGZvciBDb2RlIEdlbmVyYXRpb246CiAgICAgKGdjYylDb2RlIEdlbiBPcHRpb25zLikuICBUaGVzZSBvcHRpb25zIG11c3QgYmUgYWRkZWQgdG8gdGhlCiAgICAgYENGTEFHUycgdXNlZCBpbiB0aGUgR01QIGJ1aWxkICgqbm90ZSBCdWlsZCBPcHRpb25zOjopLCBhZGRpbmcKICAgICB0aGVtIGp1c3QgdG8gYW4gYXBwbGljYXRpb24gd2lsbCBoYXZlIG5vIGVmZmVjdC4gIE5vdGUgYWxzbwogICAgIHRoZXkncmUgYSBzbG93ZG93biwgYWRkaW5nIG92ZXJoZWFkIHRvIGVhY2ggZnVuY3Rpb24gY2FsbCBhbmQgZWFjaAogICAgIHN0YWNrIGFsbG9jYXRpb24uCgpIZWFwIFByb2JsZW1zCiAgICAgVGhlIG1vc3QgbGlrZWx5IGNhdXNlIG9mIGFwcGxpY2F0aW9uIHByb2JsZW1zIHdpdGggR01QIGlzIGhlYXAKICAgICBjb3JydXB0aW9uLiAgRmFpbGluZyB0byBgaW5pdCcgR01QIHZhcmlhYmxlcyB3aWxsIGhhdmUKICAgICB1bnByZWRpY3RhYmxlIGVmZmVjdHMsIGFuZCBjb3JydXB0aW9uIGFyaXNpbmcgZWxzZXdoZXJlIGluIGEKICAgICBwcm9ncmFtIG1heSB3ZWxsIGFmZmVjdCBHTVAuICBJbml0aWFsaXppbmcgR01QIHZhcmlhYmxlcyBtb3JlIHRoYW4KICAgICBvbmNlIG9yIGZhaWxpbmcgdG8gY2xlYXIgdGhlbSB3aWxsIGNhdXNlIG1lbW9yeSBsZWFrcy4KCiAgICAgSW4gYWxsIHN1Y2ggY2FzZXMgYSBgbWFsbG9jJyBkZWJ1Z2dlciBpcyByZWNvbW1lbmRlZC4gIE9uIGEgR05VIG9yCiAgICAgQlNEIHN5c3RlbSB0aGUgc3RhbmRhcmQgQyBsaWJyYXJ5IGBtYWxsb2MnIGhhcyBzb21lIGRpYWdub3N0aWMKICAgICBmYWNpbGl0aWVzLCBzZWUgKm5vdGUgQWxsb2NhdGlvbiBEZWJ1Z2dpbmc6IChsaWJjKUFsbG9jYXRpb24KICAgICBEZWJ1Z2dpbmcsIG9yIGBtYW4gMyBtYWxsb2MnLiAgT3RoZXIgcG9zc2liaWxpdGllcywgaW4gbm8KICAgICBwYXJ0aWN1bGFyIG9yZGVyLCBpbmNsdWRlCgogICAgICAgICAgYGh0dHA6Ly93d3cuaW5mLmV0aHouY2gvcGVyc29uYWwvYmllcmUvcHJvamVjdHMvY2NtYWxsb2MvJwogICAgICAgICAgYGh0dHA6Ly9kbWFsbG9jLmNvbS8nCiAgICAgICAgICBgaHR0cDovL3d3dy5wZXJlbnMuY29tL0ZyZWVTb2Z0d2FyZS8nICAoZWxlY3RyaWMgZmVuY2UpCiAgICAgICAgICBgaHR0cDovL3BhY2thZ2VzLmRlYmlhbi5vcmcvc3RhYmxlL2RldmVsL2ZkYScKICAgICAgICAgIGBodHRwOi8vd3d3LmdudXBkYXRlLm9yZy9jb21wb25lbnRzL2xlYWtidWcvJwogICAgICAgICAgYGh0dHA6Ly9wZW9wbGUucmVkaGF0LmNvbS9+b3RheWxvci9tZW1wcm9mLycKICAgICAgICAgIGBodHRwOi8vd3d3LmNibWFtaWdhLmRlbW9uLmNvLnVrL21wYXRyb2wvJwoKICAgICBUaGUgR01QIGRlZmF1bHQgYWxsb2NhdGlvbiByb3V0aW5lcyBpbiBgbWVtb3J5LmMnIGFsc28gaGF2ZSBhCiAgICAgc2ltcGxlIHNlbnRpbmVsIHNjaGVtZSB3aGljaCBjYW4gYmUgZW5hYmxlZCB3aXRoIGAjZGVmaW5lIERFQlVHJwogICAgIGluIHRoYXQgZmlsZS4gIFRoaXMgaXMgbWFpbmx5IGRlc2lnbmVkIGZvciBkZXRlY3RpbmcgYnVmZmVyCiAgICAgb3ZlcnJ1bnMgZHVyaW5nIEdNUCBkZXZlbG9wbWVudCwgYnV0IG1pZ2h0IGZpbmQgb3RoZXIgdXNlcy4KClN0YWNrIEJhY2t0cmFjZXMKICAgICBPbiBzb21lIHN5c3RlbXMgdGhlIGNvbXBpbGVyIG9wdGlvbnMgR01QIHVzZXMgYnkgZGVmYXVsdCBjYW4KICAgICBpbnRlcmZlcmUgd2l0aCBkZWJ1Z2dpbmcuICBJbiBwYXJ0aWN1bGFyIG9uIHg4NiBhbmQgNjhrIHN5c3RlbXMKICAgICBgLWZvbWl0LWZyYW1lLXBvaW50ZXInIGlzIHVzZWQgYW5kIHRoaXMgZ2VuZXJhbGx5IGluaGliaXRzIHN0YWNrCiAgICAgYmFja3RyYWNpbmcuICBSZWNvbXBpbGluZyB3aXRob3V0IHN1Y2ggb3B0aW9ucyBtYXkgaGVscCB3aGlsZQogICAgIGRlYnVnZ2luZywgdGhvdWdoIHRoZSB1c3VhbCBjYXZlYXRzIGFib3V0IGl0IHBvdGVudGlhbGx5IG1vdmluZyBhCiAgICAgbWVtb3J5IHByb2JsZW0gb3IgaGlkaW5nIGEgY29tcGlsZXIgYnVnIHdpbGwgYXBwbHkuCgpHREIsIHRoZSBHTlUgRGVidWdnZXIKICAgICBBIHNhbXBsZSBgLmdkYmluaXQnIGlzIGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24sIHNob3dpbmcgaG93CiAgICAgdG8gY2FsbCBzb21lIHVuZG9jdW1lbnRlZCBkdW1wIGZ1bmN0aW9ucyB0byBwcmludCBHTVAgdmFyaWFibGVzCiAgICAgZnJvbSB3aXRoaW4gR0RCLiAgTm90ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBzaG91bGRuJ3QgYmUgdXNlZCBpbgogICAgIGZpbmFsIGFwcGxpY2F0aW9uIGNvZGUgc2luY2UgdGhleSdyZSB1bmRvY3VtZW50ZWQgYW5kIG1heSBiZQogICAgIHN1YmplY3QgdG8gaW5jb21wYXRpYmxlIGNoYW5nZXMgaW4gZnV0dXJlIHZlcnNpb25zIG9mIEdNUC4KClNvdXJjZSBGaWxlIFBhdGhzCiAgICAgR01QIGhhcyBtdWx0aXBsZSBzb3VyY2UgZmlsZXMgd2l0aCB0aGUgc2FtZSBuYW1lLCBpbiBkaWZmZXJlbnQKICAgICBkaXJlY3Rvcmllcy4gIEZvciBleGFtcGxlIGBtcHonLCBgbXBxJyBhbmQgYG1wZicgZWFjaCBoYXZlIGFuCiAgICAgYGluaXQuYycuICBJZiB0aGUgZGVidWdnZXIgY2FuJ3QgYWxyZWFkeSBkZXRlcm1pbmUgdGhlIHJpZ2h0IG9uZQogICAgIGl0IG1heSBoZWxwIHRvIGJ1aWxkIHdpdGggYWJzb2x1dGUgcGF0aHMgb24gZWFjaCBDIGZpbGUuICBPbmUgd2F5CiAgICAgdG8gZG8gdGhhdCBpcyB0byB1c2UgYSBzZXBhcmF0ZSBvYmplY3QgZGlyZWN0b3J5IHdpdGggYW4gYWJzb2x1dGUKICAgICBwYXRoIHRvIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgoKICAgICAgICAgIGNkIC9teS9idWlsZC9kaXIKICAgICAgICAgIC9teS9zb3VyY2UvZGlyL2dtcC02LjAuMC9jb25maWd1cmUKCiAgICAgVGhpcyB3b3JrcyB2aWEgYFZQQVRIJywgYW5kIG1pZ2h0IHJlcXVpcmUgR05VIGBtYWtlJy4gIEFsdGVybmF0ZWx5CiAgICAgaXQgbWlnaHQgYmUgcG9zc2libGUgdG8gY2hhbmdlIHRoZSBgLmMubG8nIHJ1bGVzIGFwcHJvcHJpYXRlbHkuCgpBc3NlcnRpb24gQ2hlY2tpbmcKICAgICBUaGUgYnVpbGQgb3B0aW9uIGAtLWVuYWJsZS1hc3NlcnQnIGlzIGF2YWlsYWJsZSB0byBhZGQgc29tZQogICAgIGNvbnNpc3RlbmN5IGNoZWNrcyB0byB0aGUgbGlicmFyeSAoc2VlICpub3RlIEJ1aWxkIE9wdGlvbnM6OikuCiAgICAgVGhlc2UgYXJlIGxpa2VseSB0byBiZSBvZiBsaW1pdGVkIHZhbHVlIHRvIG1vc3QgYXBwbGljYXRpb25zLgogICAgIEFzc2VydGlvbiBmYWlsdXJlcyBhcmUganVzdCBhcyBsaWtlbHkgdG8gaW5kaWNhdGUgbWVtb3J5CiAgICAgY29ycnVwdGlvbiBhcyBhIGxpYnJhcnkgb3IgY29tcGlsZXIgYnVnLgoKICAgICBBcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxvdy1sZXZlbCBgbXBuJyBmdW5jdGlvbnMsIGhvd2V2ZXIsIHdpbGwKICAgICBiZW5lZml0IGZyb20gYC0tZW5hYmxlLWFzc2VydCcgc2luY2UgaXQgYWRkcyBjaGVja3Mgb24gdGhlCiAgICAgcGFyYW1ldGVycyBvZiBtb3N0IHN1Y2ggZnVuY3Rpb25zLCBtYW55IG9mIHdoaWNoIGhhdmUgc3VidGxlCiAgICAgcmVzdHJpY3Rpb25zIG9uIHRoZWlyIHVzYWdlLiAgTm90ZSBob3dldmVyIHRoYXQgb25seSB0aGUgZ2VuZXJpYyBDCiAgICAgY29kZSBoYXMgY2hlY2tzLCBub3QgdGhlIGFzc2VtYmx5IGNvZGUsIHNvIGAtLWRpc2FibGUtYXNzZW1ibHknCiAgICAgc2hvdWxkIGJlIHVzZWQgZm9yIG1heGltdW0gY2hlY2tpbmcuCgpUZW1wb3JhcnkgTWVtb3J5IENoZWNraW5nCiAgICAgVGhlIGJ1aWxkIG9wdGlvbiBgLS1lbmFibGUtYWxsb2NhPWRlYnVnJyBhcnJhbmdlcyB0aGF0IGVhY2ggYmxvY2sKICAgICBvZiB0ZW1wb3JhcnkgbWVtb3J5IGluIEdNUCBpcyBhbGxvY2F0ZWQgd2l0aCBhIHNlcGFyYXRlIGNhbGwgdG8KICAgICBgbWFsbG9jJyAob3IgdGhlIGFsbG9jYXRpb24gZnVuY3Rpb24gc2V0IHdpdGgKICAgICBgbXBfc2V0X21lbW9yeV9mdW5jdGlvbnMnKS4KCiAgICAgVGhpcyBjYW4gaGVscCBhIG1hbGxvYyBkZWJ1Z2dlciBkZXRlY3QgYWNjZXNzZXMgb3V0c2lkZSB0aGUKICAgICBpbnRlbmRlZCBib3VuZHMsIG9yIGRldGVjdCBtZW1vcnkgbm90IHJlbGVhc2VkLiAgSW4gYSBub3JtYWwKICAgICBidWlsZCwgb24gdGhlIG90aGVyIGhhbmQsIHRlbXBvcmFyeSBtZW1vcnkgaXMgYWxsb2NhdGVkIGluIGJsb2NrcwogICAgIHdoaWNoIEdNUCBkaXZpZGVzIHVwIGZvciBpdHMgb3duIHVzZSwgb3IgbWF5IGJlIGFsbG9jYXRlZCB3aXRoIGEKICAgICBjb21waWxlciBidWlsdGluIGBhbGxvY2EnIHdoaWNoIHdpbGwgZ28gbm93aGVyZSBuZWFyIGFueSBtYWxsb2MKICAgICBkZWJ1Z2dlciBob29rcy4KCk1heGltdW0gRGVidWdnYWJpbGl0eQogICAgIFRvIHN1bW1hcml6ZSB0aGUgYWJvdmUsIGEgR01QIGJ1aWxkIGZvciBtYXhpbXVtIGRlYnVnZ2FiaWxpdHkKICAgICB3b3VsZCBiZQoKICAgICAgICAgIC4vY29uZmlndXJlIC0tZGlzYWJsZS1zaGFyZWQgLS1lbmFibGUtYXNzZXJ0IFwKICAgICAgICAgICAgLS1lbmFibGUtYWxsb2NhPWRlYnVnIC0tZGlzYWJsZS1hc3NlbWJseSBDRkxBR1M9LWcKCiAgICAgRm9yIEMrKywgYWRkIGAtLWVuYWJsZS1jeHggQ1hYRkxBR1M9LWcnLgoKQ2hlY2tlcgogICAgIFRoZSBHQ0MgY2hlY2tlciAoYGh0dHBzOi8vc2F2YW5uYWgubm9uZ251Lm9yZy9wcm9qZWN0cy9jaGVja2VyLycpCiAgICAgY2FuIGJlIHVzZWQgd2l0aCBHTVAuICBJdCBjb250YWlucyBhIHN0dWIgbGlicmFyeSB3aGljaCBtZWFucyBHTVAKICAgICBhcHBsaWNhdGlvbnMgY29tcGlsZWQgd2l0aCBjaGVja2VyIGNhbiB1c2UgYSBub3JtYWwgR01QIGJ1aWxkLgoKICAgICBBIGJ1aWxkIG9mIEdNUCB3aXRoIGNoZWNraW5nIHdpdGhpbiBHTVAgaXRzZWxmIGNhbiBiZSBtYWRlLiAgVGhpcwogICAgIHdpbGwgcnVuIHZlcnkgdmVyeSBzbG93bHkuICBPbiBHTlUvTGludXggZm9yIGV4YW1wbGUsCgogICAgICAgICAgLi9jb25maWd1cmUgLS1kaXNhYmxlLWFzc2VtYmx5IENDPWNoZWNrZXJnY2MKCiAgICAgYC0tZGlzYWJsZS1hc3NlbWJseScgbXVzdCBiZSB1c2VkLCBzaW5jZSB0aGUgR01QIGFzc2VtYmx5IGNvZGUKICAgICBkb2Vzbid0IHN1cHBvcnQgdGhlIGNoZWNraW5nIHNjaGVtZS4gIFRoZSBHTVAgQysrIGZlYXR1cmVzIGNhbm5vdAogICAgIGJlIHVzZWQsIHNpbmNlIGN1cnJlbnQgdmVyc2lvbnMgb2YgY2hlY2tlciAoMC45LjkuMSkgZG9uJ3QgeWV0CiAgICAgc3VwcG9ydCB0aGUgc3RhbmRhcmQgQysrIGxpYnJhcnkuCgpWYWxncmluZAogICAgIFZhbGdyaW5kIChgaHR0cDovL3ZhbGdyaW5kLm9yZy8nKSBpcyBhIG1lbW9yeSBjaGVja2VyIGZvciB4ODYsCiAgICAgQVJNLCBNSVBTLCBQb3dlclBDLCBhbmQgUy8zOTAuICBJdCB0cmFuc2xhdGVzIGFuZCBlbXVsYXRlcyBtYWNoaW5lCiAgICAgaW5zdHJ1Y3Rpb25zIHRvIGRvIHN0cm9uZyBjaGVja3MgZm9yIHVuaW5pdGlhbGl6ZWQgZGF0YSAoYXQgdGhlCiAgICAgbGV2ZWwgb2YgaW5kaXZpZHVhbCBiaXRzKSwgbWVtb3J5IGFjY2Vzc2VzIHRocm91Z2ggYmFkIHBvaW50ZXJzLAogICAgIGFuZCBtZW1vcnkgbGVha3MuCgogICAgIFZhbGdyaW5kIGRvZXMgbm90IGFsd2F5cyBzdXBwb3J0IGV2ZXJ5IHBvc3NpYmxlIGluc3RydWN0aW9uLCBpbgogICAgIHBhcnRpY3VsYXIgb25lcyByZWNlbnRseSBhZGRlZCB0byBhbiBJU0EuICBWYWxncmluZCBtaWdodAogICAgIHRoZXJlZm9yZSBiZSBpbmNvbXBhdGlibGUgd2l0aCBhIHJlY2VudCBHTVAgb3IgZXZlbiBhIGxlc3MgcmVjZW50CiAgICAgR01QIHdoaWNoIGlzIGNvbXBpbGVkIHVzaW5nIGEgcmVjZW50IEdDQy4KCiAgICAgR01QJ3MgYXNzZW1ibHkgY29kZSBzb21ldGltZXMgcHJvbW90ZXMgYSByZWFkIG9mIHRoZSBsaW1icyB0byBzb21lCiAgICAgbGFyZ2VyIHNpemUsIGZvciBlZmZpY2llbmN5LiAgR01QIHdpbGwgZG8gdGhpcyBldmVuIGF0IHRoZSBzdGFydAogICAgIGFuZCBlbmQgb2YgYSBtdWx0aWxpbWIgb3BlcmFuZCwgdXNpbmcgbmF0dXJhbGx5IGFsaWduZWQgb3BlcmF0aW9ucwogICAgIG9uIHRoZSBsYXJnZXIgdHlwZS4gIFRoaXMgbWF5IGxlYWQgdG8gYmVuaWduIHJlYWRzIG91dHNpZGUgb2YKICAgICBhbGxvY2F0ZWQgYXJlYXMsIHRyaWdnZXJpbmcgY29tcGxhaW50cyBmcm9tIFZhbGdyaW5kLiAgVmFsZ3JpbmQncwogICAgIG9wdGlvbiBgLS1wYXJ0aWFsLWxvYWRzLW9rPXllcycgc2hvdWxkIGhlbHAuCgpPdGhlciBQcm9ibGVtcwogICAgIEFueSBzdXNwZWN0ZWQgYnVnIGluIEdNUCBpdHNlbGYgc2hvdWxkIGJlIGlzb2xhdGVkIHRvIG1ha2Ugc3VyZQogICAgIGl0J3Mgbm90IGFuIGFwcGxpY2F0aW9uIHByb2JsZW0sIHNlZSAqbm90ZSBSZXBvcnRpbmcgQnVnczo6LgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IFByb2ZpbGluZywgIE5leHQ6IEF1dG9jb25mLCAgUHJldjogRGVidWdnaW5nLCAgVXA6IEdNUCBCYXNpY3MKCjMuMTMgUHJvZmlsaW5nCj09PT09PT09PT09PT09CgpSdW5uaW5nIGEgcHJvZ3JhbSB1bmRlciBhIHByb2ZpbGVyIGlzIGEgZ29vZCB3YXkgdG8gZmluZCB3aGVyZSBpdCdzCnNwZW5kaW5nIG1vc3QgdGltZSBhbmQgd2hlcmUgaW1wcm92ZW1lbnRzIGNhbiBiZSBiZXN0IHNvdWdodC4gIFRoZQpwcm9maWxpbmcgY2hvaWNlcyBmb3IgYSBHTVAgYnVpbGQgYXJlIGFzIGZvbGxvd3MuCgpgLS1kaXNhYmxlLXByb2ZpbGluZycKICAgICBUaGUgZGVmYXVsdCBpcyB0byBhZGQgbm90aGluZyBzcGVjaWFsIGZvciBwcm9maWxpbmcuCgogICAgIEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBqdXN0IGNvbXBpbGUgdGhlIG1haW5saW5lIG9mIGEgcHJvZ3JhbQogICAgIHdpdGggYC1wJyBhbmQgdXNlIGBwcm9mJyB0byBnZXQgYSBwcm9maWxlIGNvbnNpc3Rpbmcgb2YKICAgICB0aW1lci1iYXNlZCBzYW1wbGluZyBvZiB0aGUgcHJvZ3JhbSBjb3VudGVyLiAgTW9zdCBvZiB0aGUgR01QCiAgICAgYXNzZW1ibHkgY29kZSBoYXMgdGhlIG5lY2Vzc2FyeSBzeW1ib2wgaW5mb3JtYXRpb24uCgogICAgIFRoaXMgYXBwcm9hY2ggaGFzIHRoZSBhZHZhbnRhZ2Ugb2YgbWluaW1pemluZyBpbnRlcmZlcmVuY2Ugd2l0aAogICAgIG5vcm1hbCBwcm9ncmFtIG9wZXJhdGlvbiwgYnV0IG9uIG1vc3Qgc3lzdGVtcyB0aGUgcmVzb2x1dGlvbiBvZgogICAgIHRoZSBzYW1wbGluZyBpcyBxdWl0ZSBsb3cgKDEwIG1pbGxpc2Vjb25kcyBmb3IgaW5zdGFuY2UpLAogICAgIHJlcXVpcmluZyBsb25nIHJ1bnMgdG8gZ2V0IGFjY3VyYXRlIGluZm9ybWF0aW9uLgoKYC0tZW5hYmxlLXByb2ZpbGluZz1wcm9mJwogICAgIEJ1aWxkIHdpdGggc3VwcG9ydCBmb3IgdGhlIHN5c3RlbSBgcHJvZicsIHdoaWNoIG1lYW5zIGAtcCcgYWRkZWQKICAgICB0byB0aGUgYENGTEFHUycuCgogICAgIFRoaXMgcHJvdmlkZXMgY2FsbCBjb3VudGluZyBpbiBhZGRpdGlvbiB0byBwcm9ncmFtIGNvdW50ZXIKICAgICBzYW1wbGluZywgd2hpY2ggYWxsb3dzIHRoZSBtb3N0IGZyZXF1ZW50bHkgY2FsbGVkIHJvdXRpbmVzIHRvIGJlCiAgICAgaWRlbnRpZmllZCwgYW5kIGFuIGF2ZXJhZ2UgdGltZSBzcGVudCBpbiBlYWNoIHJvdXRpbmUgdG8gYmUKICAgICBkZXRlcm1pbmVkLgoKICAgICBUaGUgeDg2IGFzc2VtYmx5IGNvZGUgaGFzIHN1cHBvcnQgZm9yIHRoaXMgb3B0aW9uLCBidXQgb24gb3RoZXIKICAgICBwcm9jZXNzb3JzIHRoZSBhc3NlbWJseSByb3V0aW5lcyB3aWxsIGJlIGFzIGlmIGNvbXBpbGVkIHdpdGhvdXQKICAgICBgLXAnIGFuZCB0aGVyZWZvcmUgd29uJ3QgYXBwZWFyIGluIHRoZSBjYWxsIGNvdW50cy4KCiAgICAgT24gc29tZSBzeXN0ZW1zLCBzdWNoIGFzIEdOVS9MaW51eCwgYC1wJyBpbiBmYWN0IG1lYW5zIGAtcGcnIGFuZCBpbgogICAgIHRoaXMgY2FzZSBgLS1lbmFibGUtcHJvZmlsaW5nPWdwcm9mJyBkZXNjcmliZWQgYmVsb3cgc2hvdWxkIGJlIHVzZWQKICAgICBpbnN0ZWFkLgoKYC0tZW5hYmxlLXByb2ZpbGluZz1ncHJvZicKICAgICBCdWlsZCB3aXRoIHN1cHBvcnQgZm9yIGBncHJvZicsIHdoaWNoIG1lYW5zIGAtcGcnIGFkZGVkIHRvIHRoZQogICAgIGBDRkxBR1MnLgoKICAgICBUaGlzIHByb3ZpZGVzIGNhbGwgZ3JhcGggY29uc3RydWN0aW9uIGluIGFkZGl0aW9uIHRvIGNhbGwgY291bnRpbmcKICAgICBhbmQgcHJvZ3JhbSBjb3VudGVyIHNhbXBsaW5nLCB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSB0byBjb3VudAogICAgIGNhbGxzIGNvbWluZyBmcm9tIGRpZmZlcmVudCBsb2NhdGlvbnMuICBGb3IgZXhhbXBsZSB0aGUgbnVtYmVyIG9mCiAgICAgY2FsbHMgdG8gYG1wbl9tdWwnIGZyb20gYG1wel9tdWwnIHZlcnN1cyB0aGUgbnVtYmVyIGZyb20KICAgICBgbXBmX211bCcuICBUaGUgcHJvZ3JhbSBjb3VudGVyIHNhbXBsaW5nIGlzIHN0aWxsIGZsYXQgdGhvdWdoLCBzbwogICAgIG9ubHkgYSB0b3RhbCB0aW1lIGluIGBtcG5fbXVsJyB3b3VsZCBiZSBhY2N1bXVsYXRlZCwgbm90IGEKICAgICBzZXBhcmF0ZSBhbW91bnQgZm9yIGVhY2ggY2FsbCBzaXRlLgoKICAgICBUaGUgeDg2IGFzc2VtYmx5IGNvZGUgaGFzIHN1cHBvcnQgZm9yIHRoaXMgb3B0aW9uLCBidXQgb24gb3RoZXIKICAgICBwcm9jZXNzb3JzIHRoZSBhc3NlbWJseSByb3V0aW5lcyB3aWxsIGJlIGFzIGlmIGNvbXBpbGVkIHdpdGhvdXQKICAgICBgLXBnJyBhbmQgdGhlcmVmb3JlIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgY2FsbCBjb3VudHMuCgogICAgIE9uIHg4NiBhbmQgbTY4ayBzeXN0ZW1zIGAtcGcnIGFuZCBgLWZvbWl0LWZyYW1lLXBvaW50ZXInIGFyZQogICAgIGluY29tcGF0aWJsZSwgc28gdGhlIGxhdHRlciBpcyBvbWl0dGVkIGZyb20gdGhlIGRlZmF1bHQgZmxhZ3MgaW4KICAgICB0aGF0IGNhc2UsIHdoaWNoIG1pZ2h0IHJlc3VsdCBpbiBwb29yZXIgY29kZSBnZW5lcmF0aW9uLgoKICAgICBJbmNpZGVudGFsbHksIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byB1c2UgdGhlIGBncHJvZicgcHJvZ3JhbQogICAgIHdpdGggYSBwbGFpbiBgLS1lbmFibGUtcHJvZmlsaW5nPXByb2YnIGJ1aWxkLiAgQnV0IGluIHRoYXQgY2FzZQogICAgIG9ubHkgdGhlIGBncHJvZiAtcCcgZmxhdCBwcm9maWxlIGFuZCBjYWxsIGNvdW50cyBjYW4gYmUgZXhwZWN0ZWQKICAgICB0byBiZSB2YWxpZCwgbm90IHRoZSBgZ3Byb2YgLXEnIGNhbGwgZ3JhcGguCgpgLS1lbmFibGUtcHJvZmlsaW5nPWluc3RydW1lbnQnCiAgICAgQnVpbGQgd2l0aCB0aGUgR0NDIG9wdGlvbiBgLWZpbnN0cnVtZW50LWZ1bmN0aW9ucycgYWRkZWQgdG8gdGhlCiAgICAgYENGTEFHUycgKCpub3RlIE9wdGlvbnMgZm9yIENvZGUgR2VuZXJhdGlvbjogKGdjYylDb2RlIEdlbgogICAgIE9wdGlvbnMuKS4KCiAgICAgVGhpcyBpbnNlcnRzIHNwZWNpYWwgaW5zdHJ1bWVudGluZyBjYWxscyBhdCB0aGUgc3RhcnQgYW5kIGVuZCBvZgogICAgIGVhY2ggZnVuY3Rpb24sIGFsbG93aW5nIGV4YWN0IHRpbWluZyBhbmQgZnVsbCBjYWxsIGdyYXBoCiAgICAgY29uc3RydWN0aW9uLgoKICAgICBUaGlzIGluc3RydW1lbnRpbmcgaXMgbm90IG5vcm1hbGx5IGEgc3RhbmRhcmQgc3lzdGVtIGZlYXR1cmUgYW5kCiAgICAgd2lsbCByZXF1aXJlIHN1cHBvcnQgZnJvbSBhbiBleHRlcm5hbCBsaWJyYXJ5LCBzdWNoIGFzCgogICAgICAgICAgYGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZm5jY2hlY2svJwoKICAgICBUaGlzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBgTElCUycgZHVyaW5nIHRoZSBHTVAgY29uZmlndXJlIHNvIHRoYXQKICAgICB0ZXN0IHByb2dyYW1zIHdpbGwgbGluay4gIEZvciBleGFtcGxlLAoKICAgICAgICAgIC4vY29uZmlndXJlIC0tZW5hYmxlLXByb2ZpbGluZz1pbnN0cnVtZW50IExJQlM9LWxmYwoKICAgICBPbiBhIEdOVSBzeXN0ZW0gdGhlIEMgbGlicmFyeSBwcm92aWRlcyBkdW1teSBpbnN0cnVtZW50aW5nCiAgICAgZnVuY3Rpb25zLCBzbyBwcm9ncmFtcyBjb21waWxlZCB3aXRoIHRoaXMgb3B0aW9uIHdpbGwgbGluay4gIEluCiAgICAgdGhpcyBjYXNlIGl0J3Mgb25seSBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoZSBjb3JyZWN0IGxpYnJhcnkgaXMKICAgICBhZGRlZCB3aGVuIGxpbmtpbmcgYW4gYXBwbGljYXRpb24uCgogICAgIFRoZSB4ODYgYXNzZW1ibHkgY29kZSBzdXBwb3J0cyB0aGlzIG9wdGlvbiwgYnV0IG9uIG90aGVyCiAgICAgcHJvY2Vzc29ycyB0aGUgYXNzZW1ibHkgcm91dGluZXMgd2lsbCBiZSBhcyBpZiBjb21waWxlZCB3aXRob3V0CiAgICAgYC1maW5zdHJ1bWVudC1mdW5jdGlvbnMnIG1lYW5pbmcgdGltZSBzcGVudCBpbiB0aGVtIHdpbGwKICAgICBlZmZlY3RpdmVseSBiZSBhdHRyaWJ1dGVkIHRvIHRoZWlyIGNhbGxlci4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBBdXRvY29uZiwgIE5leHQ6IEVtYWNzLCAgUHJldjogUHJvZmlsaW5nLCAgVXA6IEdNUCBCYXNpY3MKCjMuMTQgQXV0b2NvbmYKPT09PT09PT09PT09PQoKQXV0b2NvbmYgYmFzZWQgYXBwbGljYXRpb25zIGNhbiBlYXNpbHkgY2hlY2sgd2hldGhlciBHTVAgaXMgaW5zdGFsbGVkLgpUaGUgb25seSB0aGluZyB0byBiZSBub3RlZCBpcyB0aGF0IEdNUCBsaWJyYXJ5IHN5bWJvbHMgZnJvbSB2ZXJzaW9uIDMKb253YXJkcyBoYXZlIHByZWZpeGVzIGxpa2UgYF9fZ21weicuICBUaGUgZm9sbG93aW5nIHRoZXJlZm9yZSB3b3VsZCBiZQphIHNpbXBsZSB0ZXN0LAoKICAgICBBQ19DSEVDS19MSUIoZ21wLCBfX2dtcHpfaW5pdCkKCiAgIFRoaXMganVzdCB1c2VzIHRoZSBkZWZhdWx0IGBBQ19DSEVDS19MSUInIGFjdGlvbnMgZm9yIGZvdW5kIG9yIG5vdApmb3VuZCwgYnV0IGFuIGFwcGxpY2F0aW9uIHRoYXQgbXVzdCBoYXZlIEdNUCB3b3VsZCB3YW50IHRvIGdlbmVyYXRlIGFuCmVycm9yIGlmIG5vdCBmb3VuZC4gIEZvciBleGFtcGxlLAoKICAgICBBQ19DSEVDS19MSUIoZ21wLCBfX2dtcHpfaW5pdCwgLAogICAgICAgW0FDX01TR19FUlJPUihbR05VIE1QIG5vdCBmb3VuZCwgc2VlIGh0dHBzOi8vZ21wbGliLm9yZy9dKV0pCgogICBJZiBmdW5jdGlvbnMgYWRkZWQgaW4gc29tZSBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgR01QIGFyZSByZXF1aXJlZCwKdGhlbiBvbmUgb2YgdGhvc2UgY2FuIGJlIHVzZWQgd2hlbiBjaGVja2luZy4gIEZvciBleGFtcGxlIGBtcHpfbXVsX3NpJwp3YXMgYWRkZWQgaW4gR01QIDMuMSwKCiAgICAgQUNfQ0hFQ0tfTElCKGdtcCwgX19nbXB6X211bF9zaSwgLAogICAgICAgW0FDX01TR19FUlJPUigKICAgICAgIFtHTlUgTVAgbm90IGZvdW5kLCBvciBub3QgMy4xIG9yIHVwLCBzZWUgaHR0cHM6Ly9nbXBsaWIub3JnL10pXSkKCiAgIEFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIHRlc3QgdGhlIHZlcnNpb24gbnVtYmVyIGluIGBnbXAuaCcgdXNpbmcKc2F5IGBBQ19FR1JFUF9DUFAnLiAgVGhhdCB3b3VsZCBtYWtlIGl0IHBvc3NpYmxlIHRvIHRlc3QgdGhlIGV4YWN0CnZlcnNpb24sIGlmIHNvbWUgcGFydGljdWxhciBzdWItbWlub3IgcmVsZWFzZSBpcyBrbm93biB0byBiZSBuZWNlc3NhcnkuCgogICBJbiBnZW5lcmFsIGl0J3MgcmVjb21tZW5kZWQgdGhhdCBhcHBsaWNhdGlvbnMgc2hvdWxkIHNpbXBseSBkZW1hbmQgYQpuZXcgZW5vdWdoIEdNUCByYXRoZXIgdGhhbiB0cnlpbmcgdG8gcHJvdmlkZSBzdXBwbGVtZW50cyBmb3IgZmVhdHVyZXMKbm90IGF2YWlsYWJsZSBpbiBwYXN0IHZlcnNpb25zLgoKICAgT2NjYXNpb25hbGx5IGFuIGFwcGxpY2F0aW9uIHdpbGwgbmVlZCBvciB3YW50IHRvIGtub3cgdGhlIHNpemUgb2YgYQp0eXBlIGF0IGNvbmZpZ3VyYXRpb24gb3IgcHJlcHJvY2Vzc2luZyB0aW1lLCBub3QganVzdCB3aXRoIGBzaXplb2YnIGluCnRoZSBjb2RlLiAgVGhpcyBjYW4gYmUgZG9uZSBpbiB0aGUgbm9ybWFsIHdheSB3aXRoIGBtcF9saW1iX3QnIGV0YywgYnV0CkdNUCA0LjAgb3IgdXAgaXMgYmVzdCBmb3IgdGhpcywgc2luY2UgcHJpb3IgdmVyc2lvbnMgbmVlZGVkIGNlcnRhaW4KYC1EJyBkZWZpbmVzIG9uIHN5c3RlbXMgdXNpbmcgYSBgbG9uZyBsb25nJyBsaW1iLiAgVGhlIGZvbGxvd2luZyB3b3VsZApzdWl0IEF1dG9jb25mIDIuNTAgb3IgdXAsCgogICAgIEFDX0NIRUNLX1NJWkVPRihtcF9saW1iX3QsICwgWyNpbmNsdWRlIDxnbXAuaD5dKQoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEVtYWNzLCAgUHJldjogQXV0b2NvbmYsICBVcDogR01QIEJhc2ljcwoKMy4xNSBFbWFjcwo9PT09PT09PT09Cgo8Qy1oIEMtaT4gKGBpbmZvLWxvb2t1cC1zeW1ib2wnKSBpcyBhIGdvb2Qgd2F5IHRvIGZpbmQgZG9jdW1lbnRhdGlvbiBvbgpDIGZ1bmN0aW9ucyB3aGlsZSBlZGl0aW5nICgqbm90ZSBJbmZvIERvY3VtZW50YXRpb24gTG9va3VwOiAoZW1hY3MpSW5mbwpMb29rdXAuKS4KCiAgIFRoZSBHTVAgbWFudWFsIGNhbiBiZSBpbmNsdWRlZCBpbiBzdWNoIGxvb2t1cHMgYnkgcHV0dGluZyB0aGUKZm9sbG93aW5nIGluIHlvdXIgYC5lbWFjcycsCgogICAgIChldmFsLWFmdGVyLWxvYWQgImluZm8tbG9vayIKICAgICAgICcobGV0ICgobW9kZS12YWx1ZSAoYXNzb2MgJ2MtbW9kZSAoYXNzb2MgJ3N5bWJvbCBpbmZvLWxvb2t1cC1hbGlzdCkpKSkKICAgICAgICAgIChzZXRjYXIgKG50aGNkciAzIG1vZGUtdmFsdWUpCiAgICAgICAgICAgICAgICAgIChjb25zICcoIihnbXApRnVuY3Rpb24gSW5kZXgiIG5pbCAiXiAtLiogIiAiXFw+IikKICAgICAgICAgICAgICAgICAgICAgICAgKG50aCAzIG1vZGUtdmFsdWUpKSkpKQoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IFJlcG9ydGluZyBCdWdzLCAgTmV4dDogSW50ZWdlciBGdW5jdGlvbnMsICBQcmV2OiBHTVAgQmFzaWNzLCAgVXA6IFRvcAoKNCBSZXBvcnRpbmcgQnVncwoqKioqKioqKioqKioqKioqCgpJZiB5b3UgdGhpbmsgeW91IGhhdmUgZm91bmQgYSBidWcgaW4gdGhlIEdNUCBsaWJyYXJ5LCBwbGVhc2UKaW52ZXN0aWdhdGUgaXQgYW5kIHJlcG9ydCBpdC4gIFdlIGhhdmUgbWFkZSB0aGlzIGxpYnJhcnkgYXZhaWxhYmxlIHRvCnlvdSwgYW5kIGl0IGlzIG5vdCB0b28gbXVjaCB0byBhc2sgeW91IHRvIHJlcG9ydCB0aGUgYnVncyB5b3UgZmluZC4KCiAgIEJlZm9yZSB5b3UgcmVwb3J0IGEgYnVnLCBjaGVjayBpdCdzIG5vdCBhbHJlYWR5IGFkZHJlc3NlZCBpbiAqbm90ZQpLbm93biBCdWlsZCBQcm9ibGVtczo6LCBvciBwZXJoYXBzICpub3RlIE5vdGVzIGZvciBQYXJ0aWN1bGFyClN5c3RlbXM6Oi4gIFlvdSBtYXkgYWxzbyB3YW50IHRvIGNoZWNrIGBodHRwczovL2dtcGxpYi5vcmcvJyBmb3IKcGF0Y2hlcyBmb3IgdGhpcyByZWxlYXNlLgoKICAgUGxlYXNlIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBpbiBhbnkgcmVwb3J0LAoKICAgKiBUaGUgR01QIHZlcnNpb24gbnVtYmVyLCBhbmQgaWYgcHJlLXBhY2thZ2VkIG9yIHBhdGNoZWQgdGhlbiBzYXkgc28uCgogICAqIEEgdGVzdCBwcm9ncmFtIHRoYXQgbWFrZXMgaXQgcG9zc2libGUgZm9yIHVzIHRvIHJlcHJvZHVjZSB0aGUgYnVnLgogICAgIEluY2x1ZGUgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBydW4gdGhlIHByb2dyYW0uCgogICAqIEEgZGVzY3JpcHRpb24gb2Ygd2hhdCBpcyB3cm9uZy4gIElmIHRoZSByZXN1bHRzIGFyZSBpbmNvcnJlY3QsIGluCiAgICAgd2hhdCB3YXkuICBJZiB5b3UgZ2V0IGEgY3Jhc2gsIHNheSBzby4KCiAgICogSWYgeW91IGdldCBhIGNyYXNoLCBpbmNsdWRlIGEgc3RhY2sgYmFja3RyYWNlIGZyb20gdGhlIGRlYnVnZ2VyIGlmCiAgICAgaXQncyBpbmZvcm1hdGl2ZSAoYHdoZXJlJyBpbiBgZ2RiJywgb3IgYCRDJyBpbiBgYWRiJykuCgogICAqIFBsZWFzZSBkbyBub3Qgc2VuZCBjb3JlIGR1bXBzLCBleGVjdXRhYmxlcyBvciBgc3RyYWNlJ3MuCgogICAqIFRoZSBgY29uZmlndXJlJyBvcHRpb25zIHlvdSB1c2VkIHdoZW4gYnVpbGRpbmcgR01QLCBpZiBhbnkuCgogICAqIFRoZSBvdXRwdXQgZnJvbSBgY29uZmlndXJlJywgYXMgcHJpbnRlZCB0byBzdGRvdXQsIHdpdGggYW55CiAgICAgb3B0aW9ucyB1c2VkLgoKICAgKiBUaGUgbmFtZSBvZiB0aGUgY29tcGlsZXIgYW5kIGl0cyB2ZXJzaW9uLiAgRm9yIGBnY2MnLCBnZXQgdGhlCiAgICAgdmVyc2lvbiB3aXRoIGBnY2MgLXYnLCBvdGhlcndpc2UgcGVyaGFwcyBgd2hhdCBgd2hpY2ggY2NgJywgb3IKICAgICBzaW1pbGFyLgoKICAgKiBUaGUgb3V0cHV0IGZyb20gcnVubmluZyBgdW5hbWUgLWEnLgoKICAgKiBUaGUgb3V0cHV0IGZyb20gcnVubmluZyBgLi9jb25maWcuZ3Vlc3MnLCBhbmQgZnJvbSBydW5uaW5nCiAgICAgYC4vY29uZmlnZnNmLmd1ZXNzJyAobWlnaHQgYmUgdGhlIHNhbWUpLgoKICAgKiBJZiB0aGUgYnVnIGlzIHJlbGF0ZWQgdG8gYGNvbmZpZ3VyZScsIHRoZW4gdGhlIGNvbXByZXNzZWQgY29udGVudHMKICAgICBvZiBgY29uZmlnLmxvZycuCgogICAqIElmIHRoZSBidWcgaXMgcmVsYXRlZCB0byBhbiBgYXNtJyBmaWxlIG5vdCBhc3NlbWJsaW5nLCB0aGVuIHRoZQogICAgIGNvbnRlbnRzIG9mIGBjb25maWcubTQnIGFuZCB0aGUgb2ZmZW5kaW5nIGxpbmUgb3IgbGluZXMgZnJvbSB0aGUKICAgICB0ZW1wb3JhcnkgYG1wbi90bXAtPGZpbGU+LnMnLgoKICAgUGxlYXNlIG1ha2UgYW4gZWZmb3J0IHRvIHByb2R1Y2UgYSBzZWxmLWNvbnRhaW5lZCByZXBvcnQsIHdpdGgKc29tZXRoaW5nIGRlZmluaXRlIHRoYXQgY2FuIGJlIHRlc3RlZCBvciBkZWJ1Z2dlZC4gIFZhZ3VlIHF1ZXJpZXMgb3IKcGllY2VtZWFsIG1lc3NhZ2VzIGFyZSBkaWZmaWN1bHQgdG8gYWN0IG9uIGFuZCBkb24ndCBoZWxwIHRoZQpkZXZlbG9wbWVudCBlZmZvcnQuCgogICBJdCBpcyBub3QgdW5jb21tb24gdGhhdCBhbiBvYnNlcnZlZCBwcm9ibGVtIGlzIGFjdHVhbGx5IGR1ZSB0byBhIGJ1ZwppbiB0aGUgY29tcGlsZXI7IHRoZSBHTVAgY29kZSB0ZW5kcyB0byBleHBsb3JlIGludGVyZXN0aW5nIGNvcm5lcnMgaW4KY29tcGlsZXJzLgoKICAgSWYgeW91ciBidWcgcmVwb3J0IGlzIGdvb2QsIHdlIHdpbGwgZG8gb3VyIGJlc3QgdG8gaGVscCB5b3UgZ2V0IGEKY29ycmVjdGVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnk7IGlmIHRoZSBidWcgcmVwb3J0IGlzIHBvb3IsIHdlIHdvbid0CmRvIGFueXRoaW5nIGFib3V0IGl0IChleGNlcHQgbWF5YmUgYXNrIHlvdSB0byBzZW5kIGEgYmV0dGVyIHJlcG9ydCkuCgogICBTZW5kIHlvdXIgcmVwb3J0IHRvOiA8Z21wLWJ1Z3NAZ21wbGliLm9yZz4uCgogICBJZiB5b3UgdGhpbmsgc29tZXRoaW5nIGluIHRoaXMgbWFudWFsIGlzIHVuY2xlYXIsIG9yIGRvd25yaWdodAppbmNvcnJlY3QsIG9yIGlmIHRoZSBsYW5ndWFnZSBuZWVkcyB0byBiZSBpbXByb3ZlZCwgcGxlYXNlIHNlbmQgYSBub3RlCnRvIHRoZSBzYW1lIGFkZHJlc3MuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogSW50ZWdlciBGdW5jdGlvbnMsICBOZXh0OiBSYXRpb25hbCBOdW1iZXIgRnVuY3Rpb25zLCAgUHJldjogUmVwb3J0aW5nIEJ1Z3MsICBVcDogVG9wCgo1IEludGVnZXIgRnVuY3Rpb25zCioqKioqKioqKioqKioqKioqKioKClRoaXMgY2hhcHRlciBkZXNjcmliZXMgdGhlIEdNUCBmdW5jdGlvbnMgZm9yIHBlcmZvcm1pbmcgaW50ZWdlcgphcml0aG1ldGljLiAgVGhlc2UgZnVuY3Rpb25zIHN0YXJ0IHdpdGggdGhlIHByZWZpeCBgbXB6XycuCgogICBHTVAgaW50ZWdlcnMgYXJlIHN0b3JlZCBpbiBvYmplY3RzIG9mIHR5cGUgYG1wel90Jy4KCiogTWVudToKCiogSW5pdGlhbGl6aW5nIEludGVnZXJzOjoKKiBBc3NpZ25pbmcgSW50ZWdlcnM6OgoqIFNpbXVsdGFuZW91cyBJbnRlZ2VyIEluaXQgJiBBc3NpZ246OgoqIENvbnZlcnRpbmcgSW50ZWdlcnM6OgoqIEludGVnZXIgQXJpdGhtZXRpYzo6CiogSW50ZWdlciBEaXZpc2lvbjo6CiogSW50ZWdlciBFeHBvbmVudGlhdGlvbjo6CiogSW50ZWdlciBSb290czo6CiogTnVtYmVyIFRoZW9yZXRpYyBGdW5jdGlvbnM6OgoqIEludGVnZXIgQ29tcGFyaXNvbnM6OgoqIEludGVnZXIgTG9naWMgYW5kIEJpdCBGaWRkbGluZzo6CiogSS9PIG9mIEludGVnZXJzOjoKKiBJbnRlZ2VyIFJhbmRvbSBOdW1iZXJzOjoKKiBJbnRlZ2VyIEltcG9ydCBhbmQgRXhwb3J0OjoKKiBNaXNjZWxsYW5lb3VzIEludGVnZXIgRnVuY3Rpb25zOjoKKiBJbnRlZ2VyIFNwZWNpYWwgRnVuY3Rpb25zOjoKCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBJbml0aWFsaXppbmcgSW50ZWdlcnMsICBOZXh0OiBBc3NpZ25pbmcgSW50ZWdlcnMsICBQcmV2OiBJbnRlZ2VyIEZ1bmN0aW9ucywgIFVwOiBJbnRlZ2VyIEZ1bmN0aW9ucwoKNS4xIEluaXRpYWxpemF0aW9uIEZ1bmN0aW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgZnVuY3Rpb25zIGZvciBpbnRlZ2VyIGFyaXRobWV0aWMgYXNzdW1lIHRoYXQgYWxsIGludGVnZXIgb2JqZWN0cyBhcmUKaW5pdGlhbGl6ZWQuICBZb3UgZG8gdGhhdCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiBgbXB6X2luaXQnLiAgRm9yCmV4YW1wbGUsCgogICAgIHsKICAgICAgIG1wel90IGludGVnOwogICAgICAgbXB6X2luaXQgKGludGVnKTsKICAgICAgIC4uLgogICAgICAgbXB6X2FkZCAoaW50ZWcsIC4uLik7CiAgICAgICAuLi4KICAgICAgIG1wel9zdWIgKGludGVnLCAuLi4pOwoKICAgICAgIC8qIFVubGVzcyB0aGUgcHJvZ3JhbSBpcyBhYm91dCB0byBleGl0LCBkbyAuLi4gKi8KICAgICAgIG1wel9jbGVhciAoaW50ZWcpOwogICAgIH0KCiAgIEFzIHlvdSBjYW4gc2VlLCB5b3UgY2FuIHN0b3JlIG5ldyB2YWx1ZXMgYW55IG51bWJlciBvZiB0aW1lcywgb25jZSBhbgpvYmplY3QgaXMgaW5pdGlhbGl6ZWQuCgogLS0gRnVuY3Rpb246IHZvaWQgbXB6X2luaXQgKG1wel90IFgpCiAgICAgSW5pdGlhbGl6ZSBYLCBhbmQgc2V0IGl0cyB2YWx1ZSB0byAwLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9pbml0cyAobXB6X3QgWCwgLi4uKQogICAgIEluaXRpYWxpemUgYSBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBgbXB6X3QnIHZhcmlhYmxlcywgYW5kIHNldAogICAgIHRoZWlyIHZhbHVlcyB0byAwLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9pbml0MiAobXB6X3QgWCwgbXBfYml0Y250X3QgTikKICAgICBJbml0aWFsaXplIFgsIHdpdGggc3BhY2UgZm9yIE4tYml0IG51bWJlcnMsIGFuZCBzZXQgaXRzIHZhbHVlIHRvIDAuCiAgICAgQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIGluc3RlYWQgb2YgYG1wel9pbml0JyBvciBgbXB6X2luaXRzJyBpcyBuZXZlcgogICAgIG5lY2Vzc2FyeTsgcmVhbGxvY2F0aW9uIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseSBieSBHTVAgd2hlbgogICAgIG5lZWRlZC4KCiAgICAgV2hpbGUgTiBkZWZpbmVzIHRoZSBpbml0aWFsIHNwYWNlLCBYIHdpbGwgZ3JvdyBhdXRvbWF0aWNhbGx5IGluIHRoZQogICAgIG5vcm1hbCB3YXksIGlmIG5lY2Vzc2FyeSwgZm9yIHN1YnNlcXVlbnQgdmFsdWVzIHN0b3JlZC4KICAgICBgbXB6X2luaXQyJyBtYWtlcyBpdCBwb3NzaWJsZSB0byBhdm9pZCBzdWNoIHJlYWxsb2NhdGlvbnMgaWYgYQogICAgIG1heGltdW0gc2l6ZSBpcyBrbm93biBpbiBhZHZhbmNlLgoKICAgICBJbiBwcmVwYXJhdGlvbiBmb3IgYW4gb3BlcmF0aW9uLCBHTVAgb2Z0ZW4gYWxsb2NhdGVzIG9uZSBsaW1iIG1vcmUKICAgICB0aGFuIHVsdGltYXRlbHkgbmVlZGVkLiAgVG8gbWFrZSBzdXJlIEdNUCB3aWxsIG5vdCBwZXJmb3JtCiAgICAgcmVhbGxvY2F0aW9uIGZvciBYLCB5b3UgbmVlZCB0byBhZGQgdGhlIG51bWJlciBvZiBiaXRzIGluCiAgICAgYG1wX2xpbWJfdCcgdG8gTi4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfY2xlYXIgKG1wel90IFgpCiAgICAgRnJlZSB0aGUgc3BhY2Ugb2NjdXBpZWQgYnkgWC4gIENhbGwgdGhpcyBmdW5jdGlvbiBmb3IgYWxsIGBtcHpfdCcKICAgICB2YXJpYWJsZXMgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGVtLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9jbGVhcnMgKG1wel90IFgsIC4uLikKICAgICBGcmVlIHRoZSBzcGFjZSBvY2N1cGllZCBieSBhIE5VTEwtdGVybWluYXRlZCBsaXN0IG9mIGBtcHpfdCcKICAgICB2YXJpYWJsZXMuCgogLS0gRnVuY3Rpb246IHZvaWQgbXB6X3JlYWxsb2MyIChtcHpfdCBYLCBtcF9iaXRjbnRfdCBOKQogICAgIENoYW5nZSB0aGUgc3BhY2UgYWxsb2NhdGVkIGZvciBYIHRvIE4gYml0cy4gIFRoZSB2YWx1ZSBpbiBYIGlzCiAgICAgcHJlc2VydmVkIGlmIGl0IGZpdHMsIG9yIGlzIHNldCB0byAwIGlmIG5vdC4KCiAgICAgQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIGlzIG5ldmVyIG5lY2Vzc2FyeTsgcmVhbGxvY2F0aW9uIGlzIGhhbmRsZWQKICAgICBhdXRvbWF0aWNhbGx5IGJ5IEdNUCB3aGVuIG5lZWRlZC4gIEJ1dCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkCiAgICAgdG8gaW5jcmVhc2UgdGhlIHNwYWNlIGZvciBhIHZhcmlhYmxlIGluIG9yZGVyIHRvIGF2b2lkIHJlcGVhdGVkCiAgICAgYXV0b21hdGljIHJlYWxsb2NhdGlvbnMsIG9yIHRvIGRlY3JlYXNlIGl0IHRvIGdpdmUgbWVtb3J5IGJhY2sgdG8KICAgICB0aGUgaGVhcC4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBBc3NpZ25pbmcgSW50ZWdlcnMsICBOZXh0OiBTaW11bHRhbmVvdXMgSW50ZWdlciBJbml0ICYgQXNzaWduLCAgUHJldjogSW5pdGlhbGl6aW5nIEludGVnZXJzLCAgVXA6IEludGVnZXIgRnVuY3Rpb25zCgo1LjIgQXNzaWdubWVudCBGdW5jdGlvbnMKPT09PT09PT09PT09PT09PT09PT09PT09CgpUaGVzZSBmdW5jdGlvbnMgYXNzaWduIG5ldyB2YWx1ZXMgdG8gYWxyZWFkeSBpbml0aWFsaXplZCBpbnRlZ2VycwooKm5vdGUgSW5pdGlhbGl6aW5nIEludGVnZXJzOjopLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9zZXQgKG1wel90IFJPUCwgY29uc3QgbXB6X3QgT1ApCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfc2V0X3VpIChtcHpfdCBST1AsIHVuc2lnbmVkIGxvbmcgaW50IE9QKQogLS0gRnVuY3Rpb246IHZvaWQgbXB6X3NldF9zaSAobXB6X3QgUk9QLCBzaWduZWQgbG9uZyBpbnQgT1ApCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfc2V0X2QgKG1wel90IFJPUCwgZG91YmxlIE9QKQogLS0gRnVuY3Rpb246IHZvaWQgbXB6X3NldF9xIChtcHpfdCBST1AsIGNvbnN0IG1wcV90IE9QKQogLS0gRnVuY3Rpb246IHZvaWQgbXB6X3NldF9mIChtcHpfdCBST1AsIGNvbnN0IG1wZl90IE9QKQogICAgIFNldCB0aGUgdmFsdWUgb2YgUk9QIGZyb20gT1AuCgogICAgIGBtcHpfc2V0X2QnLCBgbXB6X3NldF9xJyBhbmQgYG1wel9zZXRfZicgdHJ1bmNhdGUgT1AgdG8gbWFrZSBpdCBhbgogICAgIGludGVnZXIuCgogLS0gRnVuY3Rpb246IGludCBtcHpfc2V0X3N0ciAobXB6X3QgUk9QLCBjb25zdCBjaGFyICpTVFIsIGludCBCQVNFKQogICAgIFNldCB0aGUgdmFsdWUgb2YgUk9QIGZyb20gU1RSLCBhIG51bGwtdGVybWluYXRlZCBDIHN0cmluZyBpbiBiYXNlCiAgICAgQkFTRS4gIFdoaXRlIHNwYWNlIGlzIGFsbG93ZWQgaW4gdGhlIHN0cmluZywgYW5kIGlzIHNpbXBseSBpZ25vcmVkLgoKICAgICBUaGUgQkFTRSBtYXkgdmFyeSBmcm9tIDIgdG8gNjIsIG9yIGlmIEJBU0UgaXMgMCwgdGhlbiB0aGUgbGVhZGluZwogICAgIGNoYXJhY3RlcnMgYXJlIHVzZWQ6IGAweCcgYW5kIGAwWCcgZm9yIGhleGFkZWNpbWFsLCBgMGInIGFuZCBgMEInCiAgICAgZm9yIGJpbmFyeSwgYDAnIGZvciBvY3RhbCwgb3IgZGVjaW1hbCBvdGhlcndpc2UuCgogICAgIEZvciBiYXNlcyB1cCB0byAzNiwgY2FzZSBpcyBpZ25vcmVkOyB1cHBlci1jYXNlIGFuZCBsb3dlci1jYXNlCiAgICAgbGV0dGVycyBoYXZlIHRoZSBzYW1lIHZhbHVlLiAgRm9yIGJhc2VzIDM3IHRvIDYyLCB1cHBlci1jYXNlCiAgICAgbGV0dGVyIHJlcHJlc2VudCB0aGUgdXN1YWwgMTAuLjM1IHdoaWxlIGxvd2VyLWNhc2UgbGV0dGVyCiAgICAgcmVwcmVzZW50IDM2Li42MS4KCiAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgaWYgdGhlIGVudGlyZSBzdHJpbmcgaXMgYSB2YWxpZCBudW1iZXIgaW4KICAgICBiYXNlIEJBU0UuICBPdGhlcndpc2UgaXQgcmV0dXJucyAtMS4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfc3dhcCAobXB6X3QgUk9QMSwgbXB6X3QgUk9QMikKICAgICBTd2FwIHRoZSB2YWx1ZXMgUk9QMSBhbmQgUk9QMiBlZmZpY2llbnRseS4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBTaW11bHRhbmVvdXMgSW50ZWdlciBJbml0ICYgQXNzaWduLCAgTmV4dDogQ29udmVydGluZyBJbnRlZ2VycywgIFByZXY6IEFzc2lnbmluZyBJbnRlZ2VycywgIFVwOiBJbnRlZ2VyIEZ1bmN0aW9ucwoKNS4zIENvbWJpbmVkIEluaXRpYWxpemF0aW9uIGFuZCBBc3NpZ25tZW50IEZ1bmN0aW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpGb3IgY29udmVuaWVuY2UsIEdNUCBwcm92aWRlcyBhIHBhcmFsbGVsIHNlcmllcyBvZiBpbml0aWFsaXplLWFuZC1zZXQKZnVuY3Rpb25zIHdoaWNoIGluaXRpYWxpemUgdGhlIG91dHB1dCBhbmQgdGhlbiBzdG9yZSB0aGUgdmFsdWUgdGhlcmUuClRoZXNlIGZ1bmN0aW9ucycgbmFtZXMgaGF2ZSB0aGUgZm9ybSBgbXB6X2luaXRfc2V0Li4uJwoKICAgSGVyZSBpcyBhbiBleGFtcGxlIG9mIHVzaW5nIG9uZToKCiAgICAgewogICAgICAgbXB6X3QgcGllOwogICAgICAgbXB6X2luaXRfc2V0X3N0ciAocGllLCAiMzE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUwMjg4NCIsIDEwKTsKICAgICAgIC4uLgogICAgICAgbXB6X3N1YiAocGllLCAuLi4pOwogICAgICAgLi4uCiAgICAgICBtcHpfY2xlYXIgKHBpZSk7CiAgICAgfQoKT25jZSB0aGUgaW50ZWdlciBoYXMgYmVlbiBpbml0aWFsaXplZCBieSBhbnkgb2YgdGhlIGBtcHpfaW5pdF9zZXQuLi4nCmZ1bmN0aW9ucywgaXQgY2FuIGJlIHVzZWQgYXMgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBvcGVyYW5kIGZvciB0aGUKb3JkaW5hcnkgaW50ZWdlciBmdW5jdGlvbnMuICBEb24ndCB1c2UgYW4gaW5pdGlhbGl6ZS1hbmQtc2V0IGZ1bmN0aW9uCm9uIGEgdmFyaWFibGUgYWxyZWFkeSBpbml0aWFsaXplZCEKCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfaW5pdF9zZXQgKG1wel90IFJPUCwgY29uc3QgbXB6X3QgT1ApCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfaW5pdF9zZXRfdWkgKG1wel90IFJPUCwgdW5zaWduZWQgbG9uZyBpbnQgT1ApCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfaW5pdF9zZXRfc2kgKG1wel90IFJPUCwgc2lnbmVkIGxvbmcgaW50IE9QKQogLS0gRnVuY3Rpb246IHZvaWQgbXB6X2luaXRfc2V0X2QgKG1wel90IFJPUCwgZG91YmxlIE9QKQogICAgIEluaXRpYWxpemUgUk9QIHdpdGggbGltYiBzcGFjZSBhbmQgc2V0IHRoZSBpbml0aWFsIG51bWVyaWMgdmFsdWUKICAgICBmcm9tIE9QLgoKIC0tIEZ1bmN0aW9uOiBpbnQgbXB6X2luaXRfc2V0X3N0ciAobXB6X3QgUk9QLCBjb25zdCBjaGFyICpTVFIsIGludAogICAgICAgICAgQkFTRSkKICAgICBJbml0aWFsaXplIFJPUCBhbmQgc2V0IGl0cyB2YWx1ZSBsaWtlIGBtcHpfc2V0X3N0cicgKHNlZSBpdHMKICAgICBkb2N1bWVudGF0aW9uIGFib3ZlIGZvciBkZXRhaWxzKS4KCiAgICAgSWYgdGhlIHN0cmluZyBpcyBhIGNvcnJlY3QgYmFzZSBCQVNFIG51bWJlciwgdGhlIGZ1bmN0aW9uIHJldHVybnMKICAgICAwOyBpZiBhbiBlcnJvciBvY2N1cnMgaXQgcmV0dXJucyAtMS4gIFJPUCBpcyBpbml0aWFsaXplZCBldmVuIGlmCiAgICAgYW4gZXJyb3Igb2NjdXJzLiAgKEkuZS4sIHlvdSBoYXZlIHRvIGNhbGwgYG1wel9jbGVhcicgZm9yIGl0LikKCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBDb252ZXJ0aW5nIEludGVnZXJzLCAgTmV4dDogSW50ZWdlciBBcml0aG1ldGljLCAgUHJldjogU2ltdWx0YW5lb3VzIEludGVnZXIgSW5pdCAmIEFzc2lnbiwgIFVwOiBJbnRlZ2VyIEZ1bmN0aW9ucwoKNS40IENvbnZlcnNpb24gRnVuY3Rpb25zCj09PT09PT09PT09PT09PT09PT09PT09PQoKVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBmdW5jdGlvbnMgZm9yIGNvbnZlcnRpbmcgR01QIGludGVnZXJzIHRvCnN0YW5kYXJkIEMgdHlwZXMuICBGdW5jdGlvbnMgZm9yIGNvbnZlcnRpbmcgX3RvXyBHTVAgaW50ZWdlcnMgYXJlCmRlc2NyaWJlZCBpbiAqbm90ZSBBc3NpZ25pbmcgSW50ZWdlcnM6OiBhbmQgKm5vdGUgSS9PIG9mIEludGVnZXJzOjouCgogLS0gRnVuY3Rpb246IHVuc2lnbmVkIGxvbmcgaW50IG1wel9nZXRfdWkgKGNvbnN0IG1wel90IE9QKQogICAgIFJldHVybiB0aGUgdmFsdWUgb2YgT1AgYXMgYW4gYHVuc2lnbmVkIGxvbmcnLgoKICAgICBJZiBPUCBpcyB0b28gYmlnIHRvIGZpdCBhbiBgdW5zaWduZWQgbG9uZycgdGhlbiBqdXN0IHRoZSBsZWFzdAogICAgIHNpZ25pZmljYW50IGJpdHMgdGhhdCBkbyBmaXQgYXJlIHJldHVybmVkLiAgVGhlIHNpZ24gb2YgT1AgaXMKICAgICBpZ25vcmVkLCBvbmx5IHRoZSBhYnNvbHV0ZSB2YWx1ZSBpcyB1c2VkLgoKIC0tIEZ1bmN0aW9uOiBzaWduZWQgbG9uZyBpbnQgbXB6X2dldF9zaSAoY29uc3QgbXB6X3QgT1ApCiAgICAgSWYgT1AgZml0cyBpbnRvIGEgYHNpZ25lZCBsb25nIGludCcgcmV0dXJuIHRoZSB2YWx1ZSBvZiBPUC4KICAgICBPdGhlcndpc2UgcmV0dXJuIHRoZSBsZWFzdCBzaWduaWZpY2FudCBwYXJ0IG9mIE9QLCB3aXRoIHRoZSBzYW1lCiAgICAgc2lnbiBhcyBPUC4KCiAgICAgSWYgT1AgaXMgdG9vIGJpZyB0byBmaXQgaW4gYSBgc2lnbmVkIGxvbmcgaW50JywgdGhlIHJldHVybmVkCiAgICAgcmVzdWx0IGlzIHByb2JhYmx5IG5vdCB2ZXJ5IHVzZWZ1bC4gIFRvIGZpbmQgb3V0IGlmIHRoZSB2YWx1ZSB3aWxsCiAgICAgZml0LCB1c2UgdGhlIGZ1bmN0aW9uIGBtcHpfZml0c19zbG9uZ19wJy4KCiAtLSBGdW5jdGlvbjogZG91YmxlIG1wel9nZXRfZCAoY29uc3QgbXB6X3QgT1ApCiAgICAgQ29udmVydCBPUCB0byBhIGBkb3VibGUnLCB0cnVuY2F0aW5nIGlmIG5lY2Vzc2FyeSAoaS5lLiByb3VuZGluZwogICAgIHRvd2FyZHMgemVybykuCgogICAgIElmIHRoZSBleHBvbmVudCBmcm9tIHRoZSBjb252ZXJzaW9uIGlzIHRvbyBiaWcsIHRoZSByZXN1bHQgaXMKICAgICBzeXN0ZW0gZGVwZW5kZW50LiAgQW4gaW5maW5pdHkgaXMgcmV0dXJuZWQgd2hlcmUgYXZhaWxhYmxlLiAgQQogICAgIGhhcmR3YXJlIG92ZXJmbG93IHRyYXAgbWF5IG9yIG1heSBub3Qgb2NjdXIuCgogLS0gRnVuY3Rpb246IGRvdWJsZSBtcHpfZ2V0X2RfMmV4cCAoc2lnbmVkIGxvbmcgaW50ICpFWFAsIGNvbnN0IG1wel90CiAgICAgICAgICBPUCkKICAgICBDb252ZXJ0IE9QIHRvIGEgYGRvdWJsZScsIHRydW5jYXRpbmcgaWYgbmVjZXNzYXJ5IChpLmUuIHJvdW5kaW5nCiAgICAgdG93YXJkcyB6ZXJvKSwgYW5kIHJldHVybmluZyB0aGUgZXhwb25lbnQgc2VwYXJhdGVseS4KCiAgICAgVGhlIHJldHVybiB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC41PD1hYnMoRCk8MSBhbmQgdGhlIGV4cG9uZW50IGlzCiAgICAgc3RvcmVkIHRvIGAqRVhQJy4gIEQgKiAyXkVYUCBpcyB0aGUgKHRydW5jYXRlZCkgT1AgdmFsdWUuICBJZiBPUAogICAgIGlzIHplcm8sIHRoZSByZXR1cm4gaXMgMC4wIGFuZCAwIGlzIHN0b3JlZCB0byBgKkVYUCcuCgogICAgIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgc3RhbmRhcmQgQyBgZnJleHAnIGZ1bmN0aW9uICgqbm90ZQogICAgIE5vcm1hbGl6YXRpb24gRnVuY3Rpb25zOiAobGliYylOb3JtYWxpemF0aW9uIEZ1bmN0aW9ucy4pLgoKIC0tIEZ1bmN0aW9uOiBjaGFyICogbXB6X2dldF9zdHIgKGNoYXIgKlNUUiwgaW50IEJBU0UsIGNvbnN0IG1wel90IE9QKQogICAgIENvbnZlcnQgT1AgdG8gYSBzdHJpbmcgb2YgZGlnaXRzIGluIGJhc2UgQkFTRS4gIFRoZSBiYXNlIGFyZ3VtZW50CiAgICAgbWF5IHZhcnkgZnJvbSAyIHRvIDYyIG9yIGZyb20gLTIgdG8gLTM2LgoKICAgICBGb3IgQkFTRSBpbiB0aGUgcmFuZ2UgMi4uMzYsIGRpZ2l0cyBhbmQgbG93ZXItY2FzZSBsZXR0ZXJzIGFyZQogICAgIHVzZWQ7IGZvciAtMi4uLTM2LCBkaWdpdHMgYW5kIHVwcGVyLWNhc2UgbGV0dGVycyBhcmUgdXNlZDsgZm9yCiAgICAgMzcuLjYyLCBkaWdpdHMsIHVwcGVyLWNhc2UgbGV0dGVycywgYW5kIGxvd2VyLWNhc2UgbGV0dGVycyAoaW4KICAgICB0aGF0IHNpZ25pZmljYW5jZSBvcmRlcikgYXJlIHVzZWQuCgogICAgIElmIFNUUiBpcyBgTlVMTCcsIHRoZSByZXN1bHQgc3RyaW5nIGlzIGFsbG9jYXRlZCB1c2luZyB0aGUgY3VycmVudAogICAgIGFsbG9jYXRpb24gZnVuY3Rpb24gKCpub3RlIEN1c3RvbSBBbGxvY2F0aW9uOjopLiAgVGhlIGJsb2NrIHdpbGwgYmUKICAgICBgc3RybGVuKHN0cikrMScgYnl0ZXMsIHRoYXQgYmVpbmcgZXhhY3RseSBlbm91Z2ggZm9yIHRoZSBzdHJpbmcgYW5kCiAgICAgbnVsbC10ZXJtaW5hdG9yLgoKICAgICBJZiBTVFIgaXMgbm90IGBOVUxMJywgaXQgc2hvdWxkIHBvaW50IHRvIGEgYmxvY2sgb2Ygc3RvcmFnZSBsYXJnZQogICAgIGVub3VnaCBmb3IgdGhlIHJlc3VsdCwgdGhhdCBiZWluZyBgbXB6X3NpemVpbmJhc2UgKE9QLCBCQVNFKSArIDInLgogICAgIFRoZSB0d28gZXh0cmEgYnl0ZXMgYXJlIGZvciBhIHBvc3NpYmxlIG1pbnVzIHNpZ24sIGFuZCB0aGUKICAgICBudWxsLXRlcm1pbmF0b3IuCgogICAgIEEgcG9pbnRlciB0byB0aGUgcmVzdWx0IHN0cmluZyBpcyByZXR1cm5lZCwgYmVpbmcgZWl0aGVyIHRoZQogICAgIGFsbG9jYXRlZCBibG9jaywgb3IgdGhlIGdpdmVuIFNUUi4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBJbnRlZ2VyIEFyaXRobWV0aWMsICBOZXh0OiBJbnRlZ2VyIERpdmlzaW9uLCAgUHJldjogQ29udmVydGluZyBJbnRlZ2VycywgIFVwOiBJbnRlZ2VyIEZ1bmN0aW9ucwoKNS41IEFyaXRobWV0aWMgRnVuY3Rpb25zCj09PT09PT09PT09PT09PT09PT09PT09PQoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9hZGQgKG1wel90IFJPUCwgY29uc3QgbXB6X3QgT1AxLCBjb25zdCBtcHpfdCBPUDIpCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfYWRkX3VpIChtcHpfdCBST1AsIGNvbnN0IG1wel90IE9QMSwgdW5zaWduZWQKICAgICAgICAgIGxvbmcgaW50IE9QMikKICAgICBTZXQgUk9QIHRvIE9QMSArIE9QMi4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfc3ViIChtcHpfdCBST1AsIGNvbnN0IG1wel90IE9QMSwgY29uc3QgbXB6X3QgT1AyKQogLS0gRnVuY3Rpb246IHZvaWQgbXB6X3N1Yl91aSAobXB6X3QgUk9QLCBjb25zdCBtcHpfdCBPUDEsIHVuc2lnbmVkCiAgICAgICAgICBsb25nIGludCBPUDIpCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfdWlfc3ViIChtcHpfdCBST1AsIHVuc2lnbmVkIGxvbmcgaW50IE9QMSwgY29uc3QKICAgICAgICAgIG1wel90IE9QMikKICAgICBTZXQgUk9QIHRvIE9QMSAtIE9QMi4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfbXVsIChtcHpfdCBST1AsIGNvbnN0IG1wel90IE9QMSwgY29uc3QgbXB6X3QgT1AyKQogLS0gRnVuY3Rpb246IHZvaWQgbXB6X211bF9zaSAobXB6X3QgUk9QLCBjb25zdCBtcHpfdCBPUDEsIGxvbmcgaW50IE9QMikKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9tdWxfdWkgKG1wel90IFJPUCwgY29uc3QgbXB6X3QgT1AxLCB1bnNpZ25lZAogICAgICAgICAgbG9uZyBpbnQgT1AyKQogICAgIFNldCBST1AgdG8gT1AxIHRpbWVzIE9QMi4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfYWRkbXVsIChtcHpfdCBST1AsIGNvbnN0IG1wel90IE9QMSwgY29uc3QgbXB6X3QKICAgICAgICAgIE9QMikKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9hZGRtdWxfdWkgKG1wel90IFJPUCwgY29uc3QgbXB6X3QgT1AxLCB1bnNpZ25lZAogICAgICAgICAgbG9uZyBpbnQgT1AyKQogICAgIFNldCBST1AgdG8gUk9QICsgT1AxIHRpbWVzIE9QMi4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfc3VibXVsIChtcHpfdCBST1AsIGNvbnN0IG1wel90IE9QMSwgY29uc3QgbXB6X3QKICAgICAgICAgIE9QMikKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9zdWJtdWxfdWkgKG1wel90IFJPUCwgY29uc3QgbXB6X3QgT1AxLCB1bnNpZ25lZAogICAgICAgICAgbG9uZyBpbnQgT1AyKQogICAgIFNldCBST1AgdG8gUk9QIC0gT1AxIHRpbWVzIE9QMi4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfbXVsXzJleHAgKG1wel90IFJPUCwgY29uc3QgbXB6X3QgT1AxLAogICAgICAgICAgbXBfYml0Y250X3QgT1AyKQogICAgIFNldCBST1AgdG8gT1AxIHRpbWVzIDIgcmFpc2VkIHRvIE9QMi4gIFRoaXMgb3BlcmF0aW9uIGNhbiBhbHNvIGJlCiAgICAgZGVmaW5lZCBhcyBhIGxlZnQgc2hpZnQgYnkgT1AyIGJpdHMuCgogLS0gRnVuY3Rpb246IHZvaWQgbXB6X25lZyAobXB6X3QgUk9QLCBjb25zdCBtcHpfdCBPUCkKICAgICBTZXQgUk9QIHRvIC1PUC4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfYWJzIChtcHpfdCBST1AsIGNvbnN0IG1wel90IE9QKQogICAgIFNldCBST1AgdG8gdGhlIGFic29sdXRlIHZhbHVlIG9mIE9QLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEludGVnZXIgRGl2aXNpb24sICBOZXh0OiBJbnRlZ2VyIEV4cG9uZW50aWF0aW9uLCAgUHJldjogSW50ZWdlciBBcml0aG1ldGljLCAgVXA6IEludGVnZXIgRnVuY3Rpb25zCgo1LjYgRGl2aXNpb24gRnVuY3Rpb25zCj09PT09PT09PT09PT09PT09PT09PT0KCkRpdmlzaW9uIGlzIHVuZGVmaW5lZCBpZiB0aGUgZGl2aXNvciBpcyB6ZXJvLiAgUGFzc2luZyBhIHplcm8gZGl2aXNvcgp0byB0aGUgZGl2aXNpb24gb3IgbW9kdWxvIGZ1bmN0aW9ucyAoaW5jbHVkaW5nIHRoZSBtb2R1bGFyIHBvd2VyaW5nCmZ1bmN0aW9ucyBgbXB6X3Bvd20nIGFuZCBgbXB6X3Bvd21fdWknKSwgd2lsbCBjYXVzZSBhbiBpbnRlbnRpb25hbApkaXZpc2lvbiBieSB6ZXJvLiAgVGhpcyBsZXRzIGEgcHJvZ3JhbSBoYW5kbGUgYXJpdGhtZXRpYyBleGNlcHRpb25zIGluCnRoZXNlIGZ1bmN0aW9ucyB0aGUgc2FtZSB3YXkgYXMgZm9yIG5vcm1hbCBDIGBpbnQnIGFyaXRobWV0aWMuCgogLS0gRnVuY3Rpb246IHZvaWQgbXB6X2NkaXZfcSAobXB6X3QgUSwgY29uc3QgbXB6X3QgTiwgY29uc3QgbXB6X3QgRCkKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9jZGl2X3IgKG1wel90IFIsIGNvbnN0IG1wel90IE4sIGNvbnN0IG1wel90IEQpCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfY2Rpdl9xciAobXB6X3QgUSwgbXB6X3QgUiwgY29uc3QgbXB6X3QgTiwgY29uc3QKICAgICAgICAgIG1wel90IEQpCiAtLSBGdW5jdGlvbjogdW5zaWduZWQgbG9uZyBpbnQgbXB6X2NkaXZfcV91aSAobXB6X3QgUSwgY29uc3QgbXB6X3QgTiwKICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IEQpCiAtLSBGdW5jdGlvbjogdW5zaWduZWQgbG9uZyBpbnQgbXB6X2NkaXZfcl91aSAobXB6X3QgUiwgY29uc3QgbXB6X3QgTiwKICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IEQpCiAtLSBGdW5jdGlvbjogdW5zaWduZWQgbG9uZyBpbnQgbXB6X2NkaXZfcXJfdWkgKG1wel90IFEsIG1wel90IFIsCiAgICAgICAgICBjb25zdCBtcHpfdCBOLCB1bnNpZ25lZCBsb25nIGludCBEKQogLS0gRnVuY3Rpb246IHVuc2lnbmVkIGxvbmcgaW50IG1wel9jZGl2X3VpIChjb25zdCBtcHpfdCBOLAogICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgRCkKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9jZGl2X3FfMmV4cCAobXB6X3QgUSwgY29uc3QgbXB6X3QgTiwKICAgICAgICAgIG1wX2JpdGNudF90IEIpCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfY2Rpdl9yXzJleHAgKG1wel90IFIsIGNvbnN0IG1wel90IE4sCiAgICAgICAgICBtcF9iaXRjbnRfdCBCKQoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9mZGl2X3EgKG1wel90IFEsIGNvbnN0IG1wel90IE4sIGNvbnN0IG1wel90IEQpCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfZmRpdl9yIChtcHpfdCBSLCBjb25zdCBtcHpfdCBOLCBjb25zdCBtcHpfdCBEKQogLS0gRnVuY3Rpb246IHZvaWQgbXB6X2ZkaXZfcXIgKG1wel90IFEsIG1wel90IFIsIGNvbnN0IG1wel90IE4sIGNvbnN0CiAgICAgICAgICBtcHpfdCBEKQogLS0gRnVuY3Rpb246IHVuc2lnbmVkIGxvbmcgaW50IG1wel9mZGl2X3FfdWkgKG1wel90IFEsIGNvbnN0IG1wel90IE4sCiAgICAgICAgICB1bnNpZ25lZCBsb25nIGludCBEKQogLS0gRnVuY3Rpb246IHVuc2lnbmVkIGxvbmcgaW50IG1wel9mZGl2X3JfdWkgKG1wel90IFIsIGNvbnN0IG1wel90IE4sCiAgICAgICAgICB1bnNpZ25lZCBsb25nIGludCBEKQogLS0gRnVuY3Rpb246IHVuc2lnbmVkIGxvbmcgaW50IG1wel9mZGl2X3FyX3VpIChtcHpfdCBRLCBtcHpfdCBSLAogICAgICAgICAgY29uc3QgbXB6X3QgTiwgdW5zaWduZWQgbG9uZyBpbnQgRCkKIC0tIEZ1bmN0aW9uOiB1bnNpZ25lZCBsb25nIGludCBtcHpfZmRpdl91aSAoY29uc3QgbXB6X3QgTiwKICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IEQpCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfZmRpdl9xXzJleHAgKG1wel90IFEsIGNvbnN0IG1wel90IE4sCiAgICAgICAgICBtcF9iaXRjbnRfdCBCKQogLS0gRnVuY3Rpb246IHZvaWQgbXB6X2ZkaXZfcl8yZXhwIChtcHpfdCBSLCBjb25zdCBtcHpfdCBOLAogICAgICAgICAgbXBfYml0Y250X3QgQikKCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfdGRpdl9xIChtcHpfdCBRLCBjb25zdCBtcHpfdCBOLCBjb25zdCBtcHpfdCBEKQogLS0gRnVuY3Rpb246IHZvaWQgbXB6X3RkaXZfciAobXB6X3QgUiwgY29uc3QgbXB6X3QgTiwgY29uc3QgbXB6X3QgRCkKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel90ZGl2X3FyIChtcHpfdCBRLCBtcHpfdCBSLCBjb25zdCBtcHpfdCBOLCBjb25zdAogICAgICAgICAgbXB6X3QgRCkKIC0tIEZ1bmN0aW9uOiB1bnNpZ25lZCBsb25nIGludCBtcHpfdGRpdl9xX3VpIChtcHpfdCBRLCBjb25zdCBtcHpfdCBOLAogICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgRCkKIC0tIEZ1bmN0aW9uOiB1bnNpZ25lZCBsb25nIGludCBtcHpfdGRpdl9yX3VpIChtcHpfdCBSLCBjb25zdCBtcHpfdCBOLAogICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgRCkKIC0tIEZ1bmN0aW9uOiB1bnNpZ25lZCBsb25nIGludCBtcHpfdGRpdl9xcl91aSAobXB6X3QgUSwgbXB6X3QgUiwKICAgICAgICAgIGNvbnN0IG1wel90IE4sIHVuc2lnbmVkIGxvbmcgaW50IEQpCiAtLSBGdW5jdGlvbjogdW5zaWduZWQgbG9uZyBpbnQgbXB6X3RkaXZfdWkgKGNvbnN0IG1wel90IE4sCiAgICAgICAgICB1bnNpZ25lZCBsb25nIGludCBEKQogLS0gRnVuY3Rpb246IHZvaWQgbXB6X3RkaXZfcV8yZXhwIChtcHpfdCBRLCBjb25zdCBtcHpfdCBOLAogICAgICAgICAgbXBfYml0Y250X3QgQikKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel90ZGl2X3JfMmV4cCAobXB6X3QgUiwgY29uc3QgbXB6X3QgTiwKICAgICAgICAgIG1wX2JpdGNudF90IEIpCgogICAgIERpdmlkZSBOIGJ5IEQsIGZvcm1pbmcgYSBxdW90aWVudCBRIGFuZC9vciByZW1haW5kZXIgUi4gIEZvciB0aGUKICAgICBgMmV4cCcgZnVuY3Rpb25zLCBEPTJeQi4gIFRoZSByb3VuZGluZyBpcyBpbiB0aHJlZSBzdHlsZXMsIGVhY2gKICAgICBzdWl0aW5nIGRpZmZlcmVudCBhcHBsaWNhdGlvbnMuCgogICAgICAgICogYGNkaXYnIHJvdW5kcyBRIHVwIHRvd2FyZHMgK2luZmluaXR5LCBhbmQgUiB3aWxsIGhhdmUgdGhlCiAgICAgICAgICBvcHBvc2l0ZSBzaWduIHRvIEQuICBUaGUgYGMnIHN0YW5kcyBmb3IgImNlaWwiLgoKICAgICAgICAqIGBmZGl2JyByb3VuZHMgUSBkb3duIHRvd2FyZHMgLWluZmluaXR5LCBhbmQgUiB3aWxsIGhhdmUgdGhlCiAgICAgICAgICBzYW1lIHNpZ24gYXMgRC4gIFRoZSBgZicgc3RhbmRzIGZvciAiZmxvb3IiLgoKICAgICAgICAqIGB0ZGl2JyByb3VuZHMgUSB0b3dhcmRzIHplcm8sIGFuZCBSIHdpbGwgaGF2ZSB0aGUgc2FtZSBzaWduCiAgICAgICAgICBhcyBOLiAgVGhlIGB0JyBzdGFuZHMgZm9yICJ0cnVuY2F0ZSIuCgogICAgIEluIGFsbCBjYXNlcyBRIGFuZCBSIHdpbGwgc2F0aXNmeSBOPVEqRCtSLCBhbmQgUiB3aWxsIHNhdGlzZnkKICAgICAwPD1hYnMoUik8YWJzKEQpLgoKICAgICBUaGUgYHEnIGZ1bmN0aW9ucyBjYWxjdWxhdGUgb25seSB0aGUgcXVvdGllbnQsIHRoZSBgcicgZnVuY3Rpb25zCiAgICAgb25seSB0aGUgcmVtYWluZGVyLCBhbmQgdGhlIGBxcicgZnVuY3Rpb25zIGNhbGN1bGF0ZSBib3RoLiAgTm90ZQogICAgIHRoYXQgZm9yIGBxcicgdGhlIHNhbWUgdmFyaWFibGUgY2Fubm90IGJlIHBhc3NlZCBmb3IgYm90aCBRIGFuZCBSLAogICAgIG9yIHJlc3VsdHMgd2lsbCBiZSB1bnByZWRpY3RhYmxlLgoKICAgICBGb3IgdGhlIGB1aScgdmFyaWFudHMgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgcmVtYWluZGVyLCBhbmQgaW4KICAgICBmYWN0IHJldHVybmluZyB0aGUgcmVtYWluZGVyIGlzIGFsbCB0aGUgYGRpdl91aScgZnVuY3Rpb25zIGRvLiAgRm9yCiAgICAgYHRkaXYnIGFuZCBgY2RpdicgdGhlIHJlbWFpbmRlciBjYW4gYmUgbmVnYXRpdmUsIHNvIGZvciB0aG9zZSB0aGUKICAgICByZXR1cm4gdmFsdWUgaXMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSByZW1haW5kZXIuCgogICAgIEZvciB0aGUgYDJleHAnIHZhcmlhbnRzIHRoZSBkaXZpc29yIGlzIDJeQi4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUKICAgICBpbXBsZW1lbnRlZCBhcyByaWdodCBzaGlmdHMgYW5kIGJpdCBtYXNrcywgYnV0IG9mIGNvdXJzZSB0aGV5CiAgICAgcm91bmQgdGhlIHNhbWUgYXMgdGhlIG90aGVyIGZ1bmN0aW9ucy4KCiAgICAgRm9yIHBvc2l0aXZlIE4gYm90aCBgbXB6X2ZkaXZfcV8yZXhwJyBhbmQgYG1wel90ZGl2X3FfMmV4cCcgYXJlCiAgICAgc2ltcGxlIGJpdHdpc2UgcmlnaHQgc2hpZnRzLiAgRm9yIG5lZ2F0aXZlIE4sIGBtcHpfZmRpdl9xXzJleHAnIGlzCiAgICAgZWZmZWN0aXZlbHkgYW4gYXJpdGhtZXRpYyByaWdodCBzaGlmdCB0cmVhdGluZyBOIGFzIHR3b3MgY29tcGxlbWVudAogICAgIHRoZSBzYW1lIGFzIHRoZSBiaXR3aXNlIGxvZ2ljYWwgZnVuY3Rpb25zIGRvLCB3aGVyZWFzCiAgICAgYG1wel90ZGl2X3FfMmV4cCcgZWZmZWN0aXZlbHkgdHJlYXRzIE4gYXMgc2lnbiBhbmQgbWFnbml0dWRlLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9tb2QgKG1wel90IFIsIGNvbnN0IG1wel90IE4sIGNvbnN0IG1wel90IEQpCiAtLSBGdW5jdGlvbjogdW5zaWduZWQgbG9uZyBpbnQgbXB6X21vZF91aSAobXB6X3QgUiwgY29uc3QgbXB6X3QgTiwKICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IEQpCiAgICAgU2V0IFIgdG8gTiBgbW9kJyBELiAgVGhlIHNpZ24gb2YgdGhlIGRpdmlzb3IgaXMgaWdub3JlZDsgdGhlCiAgICAgcmVzdWx0IGlzIGFsd2F5cyBub24tbmVnYXRpdmUuCgogICAgIGBtcHpfbW9kX3VpJyBpcyBpZGVudGljYWwgdG8gYG1wel9mZGl2X3JfdWknIGFib3ZlLCByZXR1cm5pbmcgdGhlCiAgICAgcmVtYWluZGVyIGFzIHdlbGwgYXMgc2V0dGluZyBSLiAgU2VlIGBtcHpfZmRpdl91aScgYWJvdmUgaWYgb25seQogICAgIHRoZSByZXR1cm4gdmFsdWUgaXMgd2FudGVkLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9kaXZleGFjdCAobXB6X3QgUSwgY29uc3QgbXB6X3QgTiwgY29uc3QgbXB6X3QgRCkKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9kaXZleGFjdF91aSAobXB6X3QgUSwgY29uc3QgbXB6X3QgTiwgdW5zaWduZWQKICAgICAgICAgIGxvbmcgRCkKICAgICBTZXQgUSB0byBOL0QuICBUaGVzZSBmdW5jdGlvbnMgcHJvZHVjZSBjb3JyZWN0IHJlc3VsdHMgb25seSB3aGVuCiAgICAgaXQgaXMga25vd24gaW4gYWR2YW5jZSB0aGF0IEQgZGl2aWRlcyBOLgoKICAgICBUaGVzZSByb3V0aW5lcyBhcmUgbXVjaCBmYXN0ZXIgdGhhbiB0aGUgb3RoZXIgZGl2aXNpb24gZnVuY3Rpb25zLAogICAgIGFuZCBhcmUgdGhlIGJlc3QgY2hvaWNlIHdoZW4gZXhhY3QgZGl2aXNpb24gaXMga25vd24gdG8gb2NjdXIsIGZvcgogICAgIGV4YW1wbGUgcmVkdWNpbmcgYSByYXRpb25hbCB0byBsb3dlc3QgdGVybXMuCgogLS0gRnVuY3Rpb246IGludCBtcHpfZGl2aXNpYmxlX3AgKGNvbnN0IG1wel90IE4sIGNvbnN0IG1wel90IEQpCiAtLSBGdW5jdGlvbjogaW50IG1wel9kaXZpc2libGVfdWlfcCAoY29uc3QgbXB6X3QgTiwgdW5zaWduZWQgbG9uZyBpbnQKICAgICAgICAgIEQpCiAtLSBGdW5jdGlvbjogaW50IG1wel9kaXZpc2libGVfMmV4cF9wIChjb25zdCBtcHpfdCBOLCBtcF9iaXRjbnRfdCBCKQogICAgIFJldHVybiBub24temVybyBpZiBOIGlzIGV4YWN0bHkgZGl2aXNpYmxlIGJ5IEQsIG9yIGluIHRoZSBjYXNlIG9mCiAgICAgYG1wel9kaXZpc2libGVfMmV4cF9wJyBieSAyXkIuCgogICAgIE4gaXMgZGl2aXNpYmxlIGJ5IEQgaWYgdGhlcmUgZXhpc3RzIGFuIGludGVnZXIgUSBzYXRpc2Z5aW5nIE4gPQogICAgIFEqRC4gIFVubGlrZSB0aGUgb3RoZXIgZGl2aXNpb24gZnVuY3Rpb25zLCBEPTAgaXMgYWNjZXB0ZWQgYW5kCiAgICAgZm9sbG93aW5nIHRoZSBydWxlIGl0IGNhbiBiZSBzZWVuIHRoYXQgb25seSAwIGlzIGNvbnNpZGVyZWQKICAgICBkaXZpc2libGUgYnkgMC4KCiAtLSBGdW5jdGlvbjogaW50IG1wel9jb25ncnVlbnRfcCAoY29uc3QgbXB6X3QgTiwgY29uc3QgbXB6X3QgQywgY29uc3QKICAgICAgICAgIG1wel90IEQpCiAtLSBGdW5jdGlvbjogaW50IG1wel9jb25ncnVlbnRfdWlfcCAoY29uc3QgbXB6X3QgTiwgdW5zaWduZWQgbG9uZyBpbnQKICAgICAgICAgIEMsIHVuc2lnbmVkIGxvbmcgaW50IEQpCiAtLSBGdW5jdGlvbjogaW50IG1wel9jb25ncnVlbnRfMmV4cF9wIChjb25zdCBtcHpfdCBOLCBjb25zdCBtcHpfdCBDLAogICAgICAgICAgbXBfYml0Y250X3QgQikKICAgICBSZXR1cm4gbm9uLXplcm8gaWYgTiBpcyBjb25ncnVlbnQgdG8gQyBtb2R1bG8gRCwgb3IgaW4gdGhlIGNhc2Ugb2YKICAgICBgbXB6X2NvbmdydWVudF8yZXhwX3AnIG1vZHVsbyAyXkIuCgogICAgIE4gaXMgY29uZ3J1ZW50IHRvIEMgbW9kIEQgaWYgdGhlcmUgZXhpc3RzIGFuIGludGVnZXIgUSBzYXRpc2Z5aW5nCiAgICAgTiA9IEMgKyBRKkQuICBVbmxpa2UgdGhlIG90aGVyIGRpdmlzaW9uIGZ1bmN0aW9ucywgRD0wIGlzIGFjY2VwdGVkCiAgICAgYW5kIGZvbGxvd2luZyB0aGUgcnVsZSBpdCBjYW4gYmUgc2VlbiB0aGF0IE4gYW5kIEMgYXJlIGNvbnNpZGVyZWQKICAgICBjb25ncnVlbnQgbW9kIDAgb25seSB3aGVuIGV4YWN0bHkgZXF1YWwuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogSW50ZWdlciBFeHBvbmVudGlhdGlvbiwgIE5leHQ6IEludGVnZXIgUm9vdHMsICBQcmV2OiBJbnRlZ2VyIERpdmlzaW9uLCAgVXA6IEludGVnZXIgRnVuY3Rpb25zCgo1LjcgRXhwb25lbnRpYXRpb24gRnVuY3Rpb25zCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfcG93bSAobXB6X3QgUk9QLCBjb25zdCBtcHpfdCBCQVNFLCBjb25zdCBtcHpfdAogICAgICAgICAgRVhQLCBjb25zdCBtcHpfdCBNT0QpCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfcG93bV91aSAobXB6X3QgUk9QLCBjb25zdCBtcHpfdCBCQVNFLCB1bnNpZ25lZAogICAgICAgICAgbG9uZyBpbnQgRVhQLCBjb25zdCBtcHpfdCBNT0QpCiAgICAgU2V0IFJPUCB0byAoQkFTRSByYWlzZWQgdG8gRVhQKSBtb2R1bG8gTU9ELgoKICAgICBOZWdhdGl2ZSBFWFAgaXMgc3VwcG9ydGVkIGlmIGFuIGludmVyc2UgQkFTRV4tMSBtb2QgTU9EIGV4aXN0cwogICAgIChzZWUgYG1wel9pbnZlcnQnIGluICpub3RlIE51bWJlciBUaGVvcmV0aWMgRnVuY3Rpb25zOjopLiAgSWYgYW4KICAgICBpbnZlcnNlIGRvZXNuJ3QgZXhpc3QgdGhlbiBhIGRpdmlkZSBieSB6ZXJvIGlzIHJhaXNlZC4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfcG93bV9zZWMgKG1wel90IFJPUCwgY29uc3QgbXB6X3QgQkFTRSwgY29uc3QKICAgICAgICAgIG1wel90IEVYUCwgY29uc3QgbXB6X3QgTU9EKQogICAgIFNldCBST1AgdG8gKEJBU0UgcmFpc2VkIHRvIEVYUCkgbW9kdWxvIE1PRC4KCiAgICAgSXQgaXMgcmVxdWlyZWQgdGhhdCBFWFAgPiAwIGFuZCB0aGF0IE1PRCBpcyBvZGQuCgogICAgIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gdGFrZSB0aGUgc2FtZSB0aW1lIGFuZCBoYXZlIHRoZSBzYW1lCiAgICAgY2FjaGUgYWNjZXNzIHBhdHRlcm5zIGZvciBhbnkgdHdvIHNhbWUtc2l6ZSBhcmd1bWVudHMsIGFzc3VtaW5nCiAgICAgdGhhdCBmdW5jdGlvbiBhcmd1bWVudHMgYXJlIHBsYWNlZCBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhbmQgdGhhdAogICAgIHRoZSBtYWNoaW5lIHN0YXRlIGlzIGlkZW50aWNhbCB1cG9uIGZ1bmN0aW9uIGVudHJ5LiAgVGhpcyBmdW5jdGlvbgogICAgIGlzIGludGVuZGVkIGZvciBjcnlwdG9ncmFwaGljIHB1cnBvc2VzLCB3aGVyZSByZXNpbGllbmNlIHRvCiAgICAgc2lkZS1jaGFubmVsIGF0dGFja3MgaXMgZGVzaXJlZC4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfcG93X3VpIChtcHpfdCBST1AsIGNvbnN0IG1wel90IEJBU0UsIHVuc2lnbmVkCiAgICAgICAgICBsb25nIGludCBFWFApCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfdWlfcG93X3VpIChtcHpfdCBST1AsIHVuc2lnbmVkIGxvbmcgaW50IEJBU0UsCiAgICAgICAgICB1bnNpZ25lZCBsb25nIGludCBFWFApCiAgICAgU2V0IFJPUCB0byBCQVNFIHJhaXNlZCB0byBFWFAuICBUaGUgY2FzZSAwXjAgeWllbGRzIDEuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogSW50ZWdlciBSb290cywgIE5leHQ6IE51bWJlciBUaGVvcmV0aWMgRnVuY3Rpb25zLCAgUHJldjogSW50ZWdlciBFeHBvbmVudGlhdGlvbiwgIFVwOiBJbnRlZ2VyIEZ1bmN0aW9ucwoKNS44IFJvb3QgRXh0cmFjdGlvbiBGdW5jdGlvbnMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAtLSBGdW5jdGlvbjogaW50IG1wel9yb290IChtcHpfdCBST1AsIGNvbnN0IG1wel90IE9QLCB1bnNpZ25lZCBsb25nCiAgICAgICAgICBpbnQgTikKICAgICBTZXQgUk9QIHRvICB0aGUgdHJ1bmNhdGVkIGludGVnZXIgcGFydCBvZiB0aGUgTnRoIHJvb3Qgb2YgT1AuCiAgICAgUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBjb21wdXRhdGlvbiB3YXMgZXhhY3QsIGkuZS4sIGlmIE9QIGlzIFJPUAogICAgIHRvIHRoZSBOdGggcG93ZXIuCgogLS0gRnVuY3Rpb246IHZvaWQgbXB6X3Jvb3RyZW0gKG1wel90IFJPT1QsIG1wel90IFJFTSwgY29uc3QgbXB6X3QgVSwKICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IE4pCiAgICAgU2V0IFJPT1QgdG8gIHRoZSB0cnVuY2F0ZWQgaW50ZWdlciBwYXJ0IG9mIHRoZSBOdGggcm9vdCBvZiBVLiAgU2V0CiAgICAgUkVNIHRvIHRoZSByZW1haW5kZXIsIFUtUk9PVCoqTi4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfc3FydCAobXB6X3QgUk9QLCBjb25zdCBtcHpfdCBPUCkKICAgICBTZXQgUk9QIHRvICB0aGUgdHJ1bmNhdGVkIGludGVnZXIgcGFydCBvZiB0aGUgc3F1YXJlIHJvb3Qgb2YgT1AuCgogLS0gRnVuY3Rpb246IHZvaWQgbXB6X3NxcnRyZW0gKG1wel90IFJPUDEsIG1wel90IFJPUDIsIGNvbnN0IG1wel90IE9QKQogICAgIFNldCBST1AxIHRvIHRoZSB0cnVuY2F0ZWQgaW50ZWdlciBwYXJ0IG9mIHRoZSBzcXVhcmUgcm9vdCBvZiBPUCwKICAgICBsaWtlIGBtcHpfc3FydCcuICBTZXQgUk9QMiB0byB0aGUgcmVtYWluZGVyIE9QLVJPUDEqUk9QMSwgd2hpY2gKICAgICB3aWxsIGJlIHplcm8gaWYgT1AgaXMgYSBwZXJmZWN0IHNxdWFyZS4KCiAgICAgSWYgUk9QMSBhbmQgUk9QMiBhcmUgdGhlIHNhbWUgdmFyaWFibGUsIHRoZSByZXN1bHRzIGFyZSB1bmRlZmluZWQuCgogLS0gRnVuY3Rpb246IGludCBtcHpfcGVyZmVjdF9wb3dlcl9wIChjb25zdCBtcHpfdCBPUCkKICAgICBSZXR1cm4gbm9uLXplcm8gaWYgT1AgaXMgYSBwZXJmZWN0IHBvd2VyLCBpLmUuLCBpZiB0aGVyZSBleGlzdAogICAgIGludGVnZXJzIEEgYW5kIEIsIHdpdGggQj4xLCBzdWNoIHRoYXQgT1AgZXF1YWxzIEEgcmFpc2VkIHRvIHRoZQogICAgIHBvd2VyIEIuCgogICAgIFVuZGVyIHRoaXMgZGVmaW5pdGlvbiBib3RoIDAgYW5kIDEgYXJlIGNvbnNpZGVyZWQgdG8gYmUgcGVyZmVjdAogICAgIHBvd2Vycy4gIE5lZ2F0aXZlIHZhbHVlcyBvZiBPUCBhcmUgYWNjZXB0ZWQsIGJ1dCBvZiBjb3Vyc2UgY2FuCiAgICAgb25seSBiZSBvZGQgcGVyZmVjdCBwb3dlcnMuCgogLS0gRnVuY3Rpb246IGludCBtcHpfcGVyZmVjdF9zcXVhcmVfcCAoY29uc3QgbXB6X3QgT1ApCiAgICAgUmV0dXJuIG5vbi16ZXJvIGlmIE9QIGlzIGEgcGVyZmVjdCBzcXVhcmUsIGkuZS4sIGlmIHRoZSBzcXVhcmUKICAgICByb290IG9mIE9QIGlzIGFuIGludGVnZXIuICBVbmRlciB0aGlzIGRlZmluaXRpb24gYm90aCAwIGFuZCAxIGFyZQogICAgIGNvbnNpZGVyZWQgdG8gYmUgcGVyZmVjdCBzcXVhcmVzLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IE51bWJlciBUaGVvcmV0aWMgRnVuY3Rpb25zLCAgTmV4dDogSW50ZWdlciBDb21wYXJpc29ucywgIFByZXY6IEludGVnZXIgUm9vdHMsICBVcDogSW50ZWdlciBGdW5jdGlvbnMKCjUuOSBOdW1iZXIgVGhlb3JldGljIEZ1bmN0aW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAtLSBGdW5jdGlvbjogaW50IG1wel9wcm9iYWJfcHJpbWVfcCAoY29uc3QgbXB6X3QgTiwgaW50IFJFUFMpCiAgICAgRGV0ZXJtaW5lIHdoZXRoZXIgTiBpcyBwcmltZS4gIFJldHVybiAyIGlmIE4gaXMgZGVmaW5pdGVseSBwcmltZSwKICAgICByZXR1cm4gMSBpZiBOIGlzIHByb2JhYmx5IHByaW1lICh3aXRob3V0IGJlaW5nIGNlcnRhaW4pLCBvciByZXR1cm4KICAgICAwIGlmIE4gaXMgZGVmaW5pdGVseSBjb21wb3NpdGUuCgogICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBzb21lIHRyaWFsIGRpdmlzaW9ucywgdGhlbiBzb21lIE1pbGxlci1SYWJpbgogICAgIHByb2JhYmlsaXN0aWMgcHJpbWFsaXR5IHRlc3RzLiAgVGhlIGFyZ3VtZW50IFJFUFMgY29udHJvbHMgaG93CiAgICAgbWFueSBzdWNoIHRlc3RzIGFyZSBkb25lOyBhIGhpZ2hlciB2YWx1ZSB3aWxsIHJlZHVjZSB0aGUgY2hhbmNlcwogICAgIG9mIGEgY29tcG9zaXRlIGJlaW5nIHJldHVybmVkIGFzICJwcm9iYWJseSBwcmltZSIuICAyNSBpcyBhCiAgICAgcmVhc29uYWJsZSBudW1iZXI7IGEgY29tcG9zaXRlIG51bWJlciB3aWxsIHRoZW4gYmUgaWRlbnRpZmllZCBhcyBhCiAgICAgcHJpbWUgd2l0aCBhIHByb2JhYmlsaXR5IG9mIGxlc3MgdGhhbiAyXigtNTApLgoKICAgICBNaWxsZXItUmFiaW4gYW5kIHNpbWlsYXIgdGVzdHMgY2FuIGJlIG1vcmUgcHJvcGVybHkgY2FsbGVkCiAgICAgY29tcG9zaXRlbmVzcyB0ZXN0cy4gIE51bWJlcnMgd2hpY2ggZmFpbCBhcmUga25vd24gdG8gYmUgY29tcG9zaXRlCiAgICAgYnV0IHRob3NlIHdoaWNoIHBhc3MgbWlnaHQgYmUgcHJpbWUgb3IgbWlnaHQgYmUgY29tcG9zaXRlLiAgT25seSBhCiAgICAgZmV3IGNvbXBvc2l0ZXMgcGFzcywgaGVuY2UgdGhvc2Ugd2hpY2ggcGFzcyBhcmUgY29uc2lkZXJlZAogICAgIHByb2JhYmx5IHByaW1lLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9uZXh0cHJpbWUgKG1wel90IFJPUCwgY29uc3QgbXB6X3QgT1ApCiAgICAgU2V0IFJPUCB0byB0aGUgbmV4dCBwcmltZSBncmVhdGVyIHRoYW4gT1AuCgogICAgIFRoaXMgZnVuY3Rpb24gdXNlcyBhIHByb2JhYmlsaXN0aWMgYWxnb3JpdGhtIHRvIGlkZW50aWZ5IHByaW1lcy4KICAgICBGb3IgcHJhY3RpY2FsIHB1cnBvc2VzIGl0J3MgYWRlcXVhdGUsIHRoZSBjaGFuY2Ugb2YgYSBjb21wb3NpdGUKICAgICBwYXNzaW5nIHdpbGwgYmUgZXh0cmVtZWx5IHNtYWxsLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9nY2QgKG1wel90IFJPUCwgY29uc3QgbXB6X3QgT1AxLCBjb25zdCBtcHpfdCBPUDIpCiAgICAgU2V0IFJPUCB0byB0aGUgZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3Igb2YgT1AxIGFuZCBPUDIuICBUaGUgcmVzdWx0CiAgICAgaXMgYWx3YXlzIHBvc2l0aXZlIGV2ZW4gaWYgb25lIG9yIGJvdGggaW5wdXQgb3BlcmFuZHMgYXJlIG5lZ2F0aXZlLgogICAgIEV4Y2VwdCBpZiBib3RoIGlucHV0cyBhcmUgemVybzsgdGhlbiB0aGlzIGZ1bmN0aW9uIGRlZmluZXMKICAgICBnY2QoMCwwKSA9IDAuCgogLS0gRnVuY3Rpb246IHVuc2lnbmVkIGxvbmcgaW50IG1wel9nY2RfdWkgKG1wel90IFJPUCwgY29uc3QgbXB6X3QgT1AxLAogICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgT1AyKQogICAgIENvbXB1dGUgdGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIE9QMSBhbmQgT1AyLiAgSWYgUk9QIGlzIG5vdAogICAgIGBOVUxMJywgc3RvcmUgdGhlIHJlc3VsdCB0aGVyZS4KCiAgICAgSWYgdGhlIHJlc3VsdCBpcyBzbWFsbCBlbm91Z2ggdG8gZml0IGluIGFuIGB1bnNpZ25lZCBsb25nIGludCcsIGl0CiAgICAgaXMgcmV0dXJuZWQuICBJZiB0aGUgcmVzdWx0IGRvZXMgbm90IGZpdCwgMCBpcyByZXR1cm5lZCwgYW5kIHRoZQogICAgIHJlc3VsdCBpcyBlcXVhbCB0byB0aGUgYXJndW1lbnQgT1AxLiAgTm90ZSB0aGF0IHRoZSByZXN1bHQgd2lsbAogICAgIGFsd2F5cyBmaXQgaWYgT1AyIGlzIG5vbi16ZXJvLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9nY2RleHQgKG1wel90IEcsIG1wel90IFMsIG1wel90IFQsIGNvbnN0IG1wel90CiAgICAgICAgICBBLCBjb25zdCBtcHpfdCBCKQogICAgIFNldCBHIHRvIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiBBIGFuZCBCLCBhbmQgaW4gYWRkaXRpb24KICAgICBzZXQgUyBhbmQgVCB0byBjb2VmZmljaWVudHMgc2F0aXNmeWluZyBBKlMgKyBCKlQgPSBHLiAgVGhlIHZhbHVlCiAgICAgaW4gRyBpcyBhbHdheXMgcG9zaXRpdmUsIGV2ZW4gaWYgb25lIG9yIGJvdGggb2YgQSBhbmQgQiBhcmUKICAgICBuZWdhdGl2ZSAob3IgemVybyBpZiBib3RoIGlucHV0cyBhcmUgemVybykuICBUaGUgdmFsdWVzIGluIFMgYW5kIFQKICAgICBhcmUgY2hvc2VuIHN1Y2ggdGhhdCBub3JtYWxseSwgYWJzKFMpIDwgYWJzKEIpIC8gKDIgRykgYW5kIGFicyhUKQogICAgIDwgYWJzKEEpIC8gKDIgRyksIGFuZCB0aGVzZSByZWxhdGlvbnMgZGVmaW5lIFMgYW5kIFQgdW5pcXVlbHkuCiAgICAgVGhlcmUgYXJlIGEgZmV3IGV4Y2VwdGlvbmFsIGNhc2VzOgoKICAgICBJZiBhYnMoQSkgPSBhYnMoQiksIHRoZW4gUyA9IDAsIFQgPSBzZ24oQikuCgogICAgIE90aGVyd2lzZSwgUyA9IHNnbihBKSBpZiBCID0gMCBvciBhYnMoQikgPSAyIEcsIGFuZCBUID0gc2duKEIpIGlmCiAgICAgQSA9IDAgb3IgYWJzKEEpID0gMiBHLgoKICAgICBJbiBhbGwgY2FzZXMsIFMgPSAwIGlmIGFuZCBvbmx5IGlmIEcgPSBhYnMoQiksIGkuZS4sIGlmIEIgZGl2aWRlcwogICAgIEEgb3IgQSA9IEIgPSAwLgoKICAgICBJZiBUIGlzIGBOVUxMJyB0aGVuIHRoYXQgdmFsdWUgaXMgbm90IGNvbXB1dGVkLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9sY20gKG1wel90IFJPUCwgY29uc3QgbXB6X3QgT1AxLCBjb25zdCBtcHpfdCBPUDIpCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfbGNtX3VpIChtcHpfdCBST1AsIGNvbnN0IG1wel90IE9QMSwgdW5zaWduZWQKICAgICAgICAgIGxvbmcgT1AyKQogICAgIFNldCBST1AgdG8gdGhlIGxlYXN0IGNvbW1vbiBtdWx0aXBsZSBvZiBPUDEgYW5kIE9QMi4gIFJPUCBpcwogICAgIGFsd2F5cyBwb3NpdGl2ZSwgaXJyZXNwZWN0aXZlIG9mIHRoZSBzaWducyBvZiBPUDEgYW5kIE9QMi4gIFJPUAogICAgIHdpbGwgYmUgemVybyBpZiBlaXRoZXIgT1AxIG9yIE9QMiBpcyB6ZXJvLgoKIC0tIEZ1bmN0aW9uOiBpbnQgbXB6X2ludmVydCAobXB6X3QgUk9QLCBjb25zdCBtcHpfdCBPUDEsIGNvbnN0IG1wel90CiAgICAgICAgICBPUDIpCiAgICAgQ29tcHV0ZSB0aGUgaW52ZXJzZSBvZiBPUDEgbW9kdWxvIE9QMiBhbmQgcHV0IHRoZSByZXN1bHQgaW4gUk9QLgogICAgIElmIHRoZSBpbnZlcnNlIGV4aXN0cywgdGhlIHJldHVybiB2YWx1ZSBpcyBub24temVybyBhbmQgUk9QIHdpbGwKICAgICBzYXRpc2Z5IDAgPCBST1AgPCBhYnMoT1AyKS4gIElmIGFuIGludmVyc2UgZG9lc24ndCBleGlzdCB0aGUKICAgICByZXR1cm4gdmFsdWUgaXMgemVybyBhbmQgUk9QIGlzIHVuZGVmaW5lZC4gIFRoZSBiZWhhdmlvdXIgb2YgdGhpcwogICAgIGZ1bmN0aW9uIGlzIHVuZGVmaW5lZCB3aGVuIE9QMiBpcyB6ZXJvLgoKIC0tIEZ1bmN0aW9uOiBpbnQgbXB6X2phY29iaSAoY29uc3QgbXB6X3QgQSwgY29uc3QgbXB6X3QgQikKICAgICBDYWxjdWxhdGUgdGhlIEphY29iaSBzeW1ib2wgKEEvQikuICBUaGlzIGlzIGRlZmluZWQgb25seSBmb3IgQiBvZGQuCgogLS0gRnVuY3Rpb246IGludCBtcHpfbGVnZW5kcmUgKGNvbnN0IG1wel90IEEsIGNvbnN0IG1wel90IFApCiAgICAgQ2FsY3VsYXRlIHRoZSBMZWdlbmRyZSBzeW1ib2wgKEEvUCkuICBUaGlzIGlzIGRlZmluZWQgb25seSBmb3IgUAogICAgIGFuIG9kZCBwb3NpdGl2ZSBwcmltZSwgYW5kIGZvciBzdWNoIFAgaXQncyBpZGVudGljYWwgdG8gdGhlIEphY29iaQogICAgIHN5bWJvbC4KCiAtLSBGdW5jdGlvbjogaW50IG1wel9rcm9uZWNrZXIgKGNvbnN0IG1wel90IEEsIGNvbnN0IG1wel90IEIpCiAtLSBGdW5jdGlvbjogaW50IG1wel9rcm9uZWNrZXJfc2kgKGNvbnN0IG1wel90IEEsIGxvbmcgQikKIC0tIEZ1bmN0aW9uOiBpbnQgbXB6X2tyb25lY2tlcl91aSAoY29uc3QgbXB6X3QgQSwgdW5zaWduZWQgbG9uZyBCKQogLS0gRnVuY3Rpb246IGludCBtcHpfc2lfa3JvbmVja2VyIChsb25nIEEsIGNvbnN0IG1wel90IEIpCiAtLSBGdW5jdGlvbjogaW50IG1wel91aV9rcm9uZWNrZXIgKHVuc2lnbmVkIGxvbmcgQSwgY29uc3QgbXB6X3QgQikKICAgICBDYWxjdWxhdGUgdGhlIEphY29iaSBzeW1ib2wgKEEvQikgd2l0aCB0aGUgS3JvbmVja2VyIGV4dGVuc2lvbgogICAgIChhLzIpPSgyL2EpIHdoZW4gYSBvZGQsIG9yIChhLzIpPTAgd2hlbiBhIGV2ZW4uCgogICAgIFdoZW4gQiBpcyBvZGQgdGhlIEphY29iaSBzeW1ib2wgYW5kIEtyb25lY2tlciBzeW1ib2wgYXJlCiAgICAgaWRlbnRpY2FsLCBzbyBgbXB6X2tyb25lY2tlcl91aScgZXRjIGNhbiBiZSB1c2VkIGZvciBtaXhlZAogICAgIHByZWNpc2lvbiBKYWNvYmkgc3ltYm9scyB0b28uCgogICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBIZW5yaSBDb2hlbiBzZWN0aW9uIDEuNC4yICgqbm90ZQogICAgIFJlZmVyZW5jZXM6OiksIG9yIGFueSBudW1iZXIgdGhlb3J5IHRleHRib29rLiAgU2VlIGFsc28gdGhlCiAgICAgZXhhbXBsZSBwcm9ncmFtIGBkZW1vcy9xY24uYycgd2hpY2ggdXNlcyBgbXB6X2tyb25lY2tlcl91aScuCgogLS0gRnVuY3Rpb246IG1wX2JpdGNudF90IG1wel9yZW1vdmUgKG1wel90IFJPUCwgY29uc3QgbXB6X3QgT1AsIGNvbnN0CiAgICAgICAgICBtcHpfdCBGKQogICAgIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIGZhY3RvciBGIGZyb20gT1AgYW5kIHN0b3JlIHRoZQogICAgIHJlc3VsdCBpbiBST1AuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGhvdyBtYW55IHN1Y2ggb2NjdXJyZW5jZXMgd2VyZQogICAgIHJlbW92ZWQuCgogLS0gRnVuY3Rpb246IHZvaWQgbXB6X2ZhY191aSAobXB6X3QgUk9QLCB1bnNpZ25lZCBsb25nIGludCBOKQogLS0gRnVuY3Rpb246IHZvaWQgbXB6XzJmYWNfdWkgKG1wel90IFJPUCwgdW5zaWduZWQgbG9uZyBpbnQgTikKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9tZmFjX3VpdWkgKG1wel90IFJPUCwgdW5zaWduZWQgbG9uZyBpbnQgTiwKICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IE0pCiAgICAgU2V0IFJPUCB0byB0aGUgZmFjdG9yaWFsIG9mIE46IGBtcHpfZmFjX3VpJyBjb21wdXRlcyB0aGUgcGxhaW4KICAgICBmYWN0b3JpYWwgTiEsIGBtcHpfMmZhY191aScgY29tcHV0ZXMgdGhlIGRvdWJsZS1mYWN0b3JpYWwgTiEhLCBhbmQKICAgICBgbXB6X21mYWNfdWl1aScgdGhlIE0tbXVsdGktZmFjdG9yaWFsIE4hXihNKS4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfcHJpbW9yaWFsX3VpIChtcHpfdCBST1AsIHVuc2lnbmVkIGxvbmcgaW50IE4pCiAgICAgU2V0IFJPUCB0byB0aGUgcHJpbW9yaWFsIG9mIE4sIGkuZS4gdGhlIHByb2R1Y3Qgb2YgYWxsIHBvc2l0aXZlCiAgICAgcHJpbWUgbnVtYmVycyA8PU4uCgogLS0gRnVuY3Rpb246IHZvaWQgbXB6X2Jpbl91aSAobXB6X3QgUk9QLCBjb25zdCBtcHpfdCBOLCB1bnNpZ25lZCBsb25nCiAgICAgICAgICBpbnQgSykKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9iaW5fdWl1aSAobXB6X3QgUk9QLCB1bnNpZ25lZCBsb25nIGludCBOLAogICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgSykKICAgICBDb21wdXRlIHRoZSBiaW5vbWlhbCBjb2VmZmljaWVudCBOIG92ZXIgSyBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbgogICAgIFJPUC4gIE5lZ2F0aXZlIHZhbHVlcyBvZiBOIGFyZSBzdXBwb3J0ZWQgYnkgYG1wel9iaW5fdWknLCB1c2luZwogICAgIHRoZSBpZGVudGl0eSBiaW4oLW4saykgPSAoLTEpXmsgKiBiaW4obitrLTEsayksIHNlZSBLbnV0aCB2b2x1bWUgMQogICAgIHNlY3Rpb24gMS4yLjYgcGFydCBHLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9maWJfdWkgKG1wel90IEZOLCB1bnNpZ25lZCBsb25nIGludCBOKQogLS0gRnVuY3Rpb246IHZvaWQgbXB6X2ZpYjJfdWkgKG1wel90IEZOLCBtcHpfdCBGTlNVQjEsIHVuc2lnbmVkIGxvbmcKICAgICAgICAgIGludCBOKQogICAgIGBtcHpfZmliX3VpJyBzZXRzIEZOIHRvIHRvIEZbbl0sIHRoZSBOJ3RoIEZpYm9uYWNjaSBudW1iZXIuCiAgICAgYG1wel9maWIyX3VpJyBzZXRzIEZOIHRvIEZbbl0sIGFuZCBGTlNVQjEgdG8gRltuLTFdLgoKICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIGRlc2lnbmVkIGZvciBjYWxjdWxhdGluZyBpc29sYXRlZCBGaWJvbmFjY2kKICAgICBudW1iZXJzLiAgV2hlbiBhIHNlcXVlbmNlIG9mIHZhbHVlcyBpcyB3YW50ZWQgaXQncyBiZXN0IHRvIHN0YXJ0CiAgICAgd2l0aCBgbXB6X2ZpYjJfdWknIGFuZCBpdGVyYXRlIHRoZSBkZWZpbmluZyBGW24rMV09RltuXStGW24tMV0gb3IKICAgICBzaW1pbGFyLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9sdWNudW1fdWkgKG1wel90IExOLCB1bnNpZ25lZCBsb25nIGludCBOKQogLS0gRnVuY3Rpb246IHZvaWQgbXB6X2x1Y251bTJfdWkgKG1wel90IExOLCBtcHpfdCBMTlNVQjEsIHVuc2lnbmVkCiAgICAgICAgICBsb25nIGludCBOKQogICAgIGBtcHpfbHVjbnVtX3VpJyBzZXRzIExOIHRvIHRvIExbbl0sIHRoZSBOJ3RoIEx1Y2FzIG51bWJlci4KICAgICBgbXB6X2x1Y251bTJfdWknIHNldHMgTE4gdG8gTFtuXSwgYW5kIExOU1VCMSB0byBMW24tMV0uCgogICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZGVzaWduZWQgZm9yIGNhbGN1bGF0aW5nIGlzb2xhdGVkIEx1Y2FzCiAgICAgbnVtYmVycy4gIFdoZW4gYSBzZXF1ZW5jZSBvZiB2YWx1ZXMgaXMgd2FudGVkIGl0J3MgYmVzdCB0byBzdGFydAogICAgIHdpdGggYG1wel9sdWNudW0yX3VpJyBhbmQgaXRlcmF0ZSB0aGUgZGVmaW5pbmcgTFtuKzFdPUxbbl0rTFtuLTFdCiAgICAgb3Igc2ltaWxhci4KCiAgICAgVGhlIEZpYm9uYWNjaSBudW1iZXJzIGFuZCBMdWNhcyBudW1iZXJzIGFyZSByZWxhdGVkIHNlcXVlbmNlcywgc28KICAgICBpdCdzIG5ldmVyIG5lY2Vzc2FyeSB0byBjYWxsIGJvdGggYG1wel9maWIyX3VpJyBhbmQKICAgICBgbXB6X2x1Y251bTJfdWknLiAgVGhlIGZvcm11bGFzIGZvciBnb2luZyBmcm9tIEZpYm9uYWNjaSB0byBMdWNhcwogICAgIGNhbiBiZSBmb3VuZCBpbiAqbm90ZSBMdWNhcyBOdW1iZXJzIEFsZ29yaXRobTo6LCB0aGUgcmV2ZXJzZSBpcwogICAgIHN0cmFpZ2h0Zm9yd2FyZCB0b28uCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogSW50ZWdlciBDb21wYXJpc29ucywgIE5leHQ6IEludGVnZXIgTG9naWMgYW5kIEJpdCBGaWRkbGluZywgIFByZXY6IE51bWJlciBUaGVvcmV0aWMgRnVuY3Rpb25zLCAgVXA6IEludGVnZXIgRnVuY3Rpb25zCgo1LjEwIENvbXBhcmlzb24gRnVuY3Rpb25zCj09PT09PT09PT09PT09PT09PT09PT09PT0KCiAtLSBGdW5jdGlvbjogaW50IG1wel9jbXAgKGNvbnN0IG1wel90IE9QMSwgY29uc3QgbXB6X3QgT1AyKQogLS0gRnVuY3Rpb246IGludCBtcHpfY21wX2QgKGNvbnN0IG1wel90IE9QMSwgZG91YmxlIE9QMikKIC0tIE1hY3JvOiBpbnQgbXB6X2NtcF9zaSAoY29uc3QgbXB6X3QgT1AxLCBzaWduZWQgbG9uZyBpbnQgT1AyKQogLS0gTWFjcm86IGludCBtcHpfY21wX3VpIChjb25zdCBtcHpfdCBPUDEsIHVuc2lnbmVkIGxvbmcgaW50IE9QMikKICAgICBDb21wYXJlIE9QMSBhbmQgT1AyLiAgUmV0dXJuIGEgcG9zaXRpdmUgdmFsdWUgaWYgT1AxID4gT1AyLCB6ZXJvCiAgICAgaWYgT1AxID0gT1AyLCBvciBhIG5lZ2F0aXZlIHZhbHVlIGlmIE9QMSA8IE9QMi4KCiAgICAgYG1wel9jbXBfdWknIGFuZCBgbXB6X2NtcF9zaScgYXJlIG1hY3JvcyBhbmQgd2lsbCBldmFsdWF0ZSB0aGVpcgogICAgIGFyZ3VtZW50cyBtb3JlIHRoYW4gb25jZS4gIGBtcHpfY21wX2QnIGNhbiBiZSBjYWxsZWQgd2l0aCBhbgogICAgIGluZmluaXR5LCBidXQgcmVzdWx0cyBhcmUgdW5kZWZpbmVkIGZvciBhIE5hTi4KCiAtLSBGdW5jdGlvbjogaW50IG1wel9jbXBhYnMgKGNvbnN0IG1wel90IE9QMSwgY29uc3QgbXB6X3QgT1AyKQogLS0gRnVuY3Rpb246IGludCBtcHpfY21wYWJzX2QgKGNvbnN0IG1wel90IE9QMSwgZG91YmxlIE9QMikKIC0tIEZ1bmN0aW9uOiBpbnQgbXB6X2NtcGFic191aSAoY29uc3QgbXB6X3QgT1AxLCB1bnNpZ25lZCBsb25nIGludCBPUDIpCiAgICAgQ29tcGFyZSB0aGUgYWJzb2x1dGUgdmFsdWVzIG9mIE9QMSBhbmQgT1AyLiAgUmV0dXJuIGEgcG9zaXRpdmUKICAgICB2YWx1ZSBpZiBhYnMoT1AxKSA+IGFicyhPUDIpLCB6ZXJvIGlmIGFicyhPUDEpID0gYWJzKE9QMiksIG9yIGEKICAgICBuZWdhdGl2ZSB2YWx1ZSBpZiBhYnMoT1AxKSA8IGFicyhPUDIpLgoKICAgICBgbXB6X2NtcGFic19kJyBjYW4gYmUgY2FsbGVkIHdpdGggYW4gaW5maW5pdHksIGJ1dCByZXN1bHRzIGFyZQogICAgIHVuZGVmaW5lZCBmb3IgYSBOYU4uCgogLS0gTWFjcm86IGludCBtcHpfc2duIChjb25zdCBtcHpfdCBPUCkKICAgICBSZXR1cm4gKzEgaWYgT1AgPiAwLCAwIGlmIE9QID0gMCwgYW5kIC0xIGlmIE9QIDwgMC4KCiAgICAgVGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvLiAgSXQgZXZhbHVhdGVzCiAgICAgaXRzIGFyZ3VtZW50IG11bHRpcGxlIHRpbWVzLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEludGVnZXIgTG9naWMgYW5kIEJpdCBGaWRkbGluZywgIE5leHQ6IEkvTyBvZiBJbnRlZ2VycywgIFByZXY6IEludGVnZXIgQ29tcGFyaXNvbnMsICBVcDogSW50ZWdlciBGdW5jdGlvbnMKCjUuMTEgTG9naWNhbCBhbmQgQml0IE1hbmlwdWxhdGlvbiBGdW5jdGlvbnMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlc2UgZnVuY3Rpb25zIGJlaGF2ZSBhcyBpZiB0d29zIGNvbXBsZW1lbnQgYXJpdGhtZXRpYyB3ZXJlIHVzZWQKKGFsdGhvdWdoIHNpZ24tbWFnbml0dWRlIGlzIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24pLiAgVGhlIGxlYXN0CnNpZ25pZmljYW50IGJpdCBpcyBudW1iZXIgMC4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfYW5kIChtcHpfdCBST1AsIGNvbnN0IG1wel90IE9QMSwgY29uc3QgbXB6X3QgT1AyKQogICAgIFNldCBST1AgdG8gT1AxIGJpdHdpc2UtYW5kIE9QMi4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfaW9yIChtcHpfdCBST1AsIGNvbnN0IG1wel90IE9QMSwgY29uc3QgbXB6X3QgT1AyKQogICAgIFNldCBST1AgdG8gT1AxIGJpdHdpc2UgaW5jbHVzaXZlLW9yIE9QMi4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfeG9yIChtcHpfdCBST1AsIGNvbnN0IG1wel90IE9QMSwgY29uc3QgbXB6X3QgT1AyKQogICAgIFNldCBST1AgdG8gT1AxIGJpdHdpc2UgZXhjbHVzaXZlLW9yIE9QMi4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfY29tIChtcHpfdCBST1AsIGNvbnN0IG1wel90IE9QKQogICAgIFNldCBST1AgdG8gdGhlIG9uZSdzIGNvbXBsZW1lbnQgb2YgT1AuCgogLS0gRnVuY3Rpb246IG1wX2JpdGNudF90IG1wel9wb3Bjb3VudCAoY29uc3QgbXB6X3QgT1ApCiAgICAgSWYgT1A+PTAsIHJldHVybiB0aGUgcG9wdWxhdGlvbiBjb3VudCBvZiBPUCwgd2hpY2ggaXMgdGhlIG51bWJlcgogICAgIG9mIDEgYml0cyBpbiB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uLiAgSWYgT1A8MCwgdGhlIG51bWJlciBvZiAxcwogICAgIGlzIGluZmluaXRlLCBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbGFyZ2VzdCBwb3NzaWJsZQogICAgIGBtcF9iaXRjbnRfdCcuCgogLS0gRnVuY3Rpb246IG1wX2JpdGNudF90IG1wel9oYW1kaXN0IChjb25zdCBtcHpfdCBPUDEsIGNvbnN0IG1wel90IE9QMikKICAgICBJZiBPUDEgYW5kIE9QMiBhcmUgYm90aCA+PTAgb3IgYm90aCA8MCwgcmV0dXJuIHRoZSBoYW1taW5nCiAgICAgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIG9wZXJhbmRzLCB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIGJpdAogICAgIHBvc2l0aW9ucyB3aGVyZSBPUDEgYW5kIE9QMiBoYXZlIGRpZmZlcmVudCBiaXQgdmFsdWVzLiAgSWYgb25lCiAgICAgb3BlcmFuZCBpcyA+PTAgYW5kIHRoZSBvdGhlciA8MCB0aGVuIHRoZSBudW1iZXIgb2YgYml0cyBkaWZmZXJlbnQKICAgICBpcyBpbmZpbml0ZSwgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGxhcmdlc3QgcG9zc2libGUKICAgICBgbXBfYml0Y250X3QnLgoKIC0tIEZ1bmN0aW9uOiBtcF9iaXRjbnRfdCBtcHpfc2NhbjAgKGNvbnN0IG1wel90IE9QLCBtcF9iaXRjbnRfdAogICAgICAgICAgU1RBUlRJTkdfQklUKQogLS0gRnVuY3Rpb246IG1wX2JpdGNudF90IG1wel9zY2FuMSAoY29uc3QgbXB6X3QgT1AsIG1wX2JpdGNudF90CiAgICAgICAgICBTVEFSVElOR19CSVQpCiAgICAgU2NhbiBPUCwgc3RhcnRpbmcgZnJvbSBiaXQgU1RBUlRJTkdfQklULCB0b3dhcmRzIG1vcmUgc2lnbmlmaWNhbnQKICAgICBiaXRzLCB1bnRpbCB0aGUgZmlyc3QgMCBvciAxIGJpdCAocmVzcGVjdGl2ZWx5KSBpcyBmb3VuZC4gIFJldHVybgogICAgIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgYml0LgoKICAgICBJZiB0aGUgYml0IGF0IFNUQVJUSU5HX0JJVCBpcyBhbHJlYWR5IHdoYXQncyBzb3VnaHQsIHRoZW4KICAgICBTVEFSVElOR19CSVQgaXMgcmV0dXJuZWQuCgogICAgIElmIHRoZXJlJ3Mgbm8gYml0IGZvdW5kLCB0aGVuIHRoZSBsYXJnZXN0IHBvc3NpYmxlIGBtcF9iaXRjbnRfdCcgaXMKICAgICByZXR1cm5lZC4gIFRoaXMgd2lsbCBoYXBwZW4gaW4gYG1wel9zY2FuMCcgcGFzdCB0aGUgZW5kIG9mIGEKICAgICBuZWdhdGl2ZSBudW1iZXIsIG9yIGBtcHpfc2NhbjEnIHBhc3QgdGhlIGVuZCBvZiBhIG5vbm5lZ2F0aXZlCiAgICAgbnVtYmVyLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9zZXRiaXQgKG1wel90IFJPUCwgbXBfYml0Y250X3QgQklUX0lOREVYKQogICAgIFNldCBiaXQgQklUX0lOREVYIGluIFJPUC4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfY2xyYml0IChtcHpfdCBST1AsIG1wX2JpdGNudF90IEJJVF9JTkRFWCkKICAgICBDbGVhciBiaXQgQklUX0lOREVYIGluIFJPUC4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfY29tYml0IChtcHpfdCBST1AsIG1wX2JpdGNudF90IEJJVF9JTkRFWCkKICAgICBDb21wbGVtZW50IGJpdCBCSVRfSU5ERVggaW4gUk9QLgoKIC0tIEZ1bmN0aW9uOiBpbnQgbXB6X3RzdGJpdCAoY29uc3QgbXB6X3QgT1AsIG1wX2JpdGNudF90IEJJVF9JTkRFWCkKICAgICBUZXN0IGJpdCBCSVRfSU5ERVggaW4gT1AgYW5kIHJldHVybiAwIG9yIDEgYWNjb3JkaW5nbHkuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogSS9PIG9mIEludGVnZXJzLCAgTmV4dDogSW50ZWdlciBSYW5kb20gTnVtYmVycywgIFByZXY6IEludGVnZXIgTG9naWMgYW5kIEJpdCBGaWRkbGluZywgIFVwOiBJbnRlZ2VyIEZ1bmN0aW9ucwoKNS4xMiBJbnB1dCBhbmQgT3V0cHV0IEZ1bmN0aW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpGdW5jdGlvbnMgdGhhdCBwZXJmb3JtIGlucHV0IGZyb20gYSBzdGRpbyBzdHJlYW0sIGFuZCBmdW5jdGlvbnMgdGhhdApvdXRwdXQgdG8gYSBzdGRpbyBzdHJlYW0sIG9mIGBtcHonIG51bWJlcnMuICBQYXNzaW5nIGEgYE5VTEwnIHBvaW50ZXIKZm9yIGEgU1RSRUFNIGFyZ3VtZW50IHRvIGFueSBvZiB0aGVzZSBmdW5jdGlvbnMgd2lsbCBtYWtlIHRoZW0gcmVhZCBmcm9tCmBzdGRpbicgYW5kIHdyaXRlIHRvIGBzdGRvdXQnLCByZXNwZWN0aXZlbHkuCgogICBXaGVuIHVzaW5nIGFueSBvZiB0aGVzZSBmdW5jdGlvbnMsIGl0IGlzIGEgZ29vZCBpZGVhIHRvIGluY2x1ZGUKYHN0ZGlvLmgnIGJlZm9yZSBgZ21wLmgnLCBzaW5jZSB0aGF0IHdpbGwgYWxsb3cgYGdtcC5oJyB0byBkZWZpbmUKcHJvdG90eXBlcyBmb3IgdGhlc2UgZnVuY3Rpb25zLgoKICAgU2VlIGFsc28gKm5vdGUgRm9ybWF0dGVkIE91dHB1dDo6IGFuZCAqbm90ZSBGb3JtYXR0ZWQgSW5wdXQ6Oi4KCiAtLSBGdW5jdGlvbjogc2l6ZV90IG1wel9vdXRfc3RyIChGSUxFICpTVFJFQU0sIGludCBCQVNFLCBjb25zdCBtcHpfdAogICAgICAgICAgT1ApCiAgICAgT3V0cHV0IE9QIG9uIHN0ZGlvIHN0cmVhbSBTVFJFQU0sIGFzIGEgc3RyaW5nIG9mIGRpZ2l0cyBpbiBiYXNlCiAgICAgQkFTRS4gIFRoZSBiYXNlIGFyZ3VtZW50IG1heSB2YXJ5IGZyb20gMiB0byA2MiBvciBmcm9tIC0yIHRvIC0zNi4KCiAgICAgRm9yIEJBU0UgaW4gdGhlIHJhbmdlIDIuLjM2LCBkaWdpdHMgYW5kIGxvd2VyLWNhc2UgbGV0dGVycyBhcmUKICAgICB1c2VkOyBmb3IgLTIuLi0zNiwgZGlnaXRzIGFuZCB1cHBlci1jYXNlIGxldHRlcnMgYXJlIHVzZWQ7IGZvcgogICAgIDM3Li42MiwgZGlnaXRzLCB1cHBlci1jYXNlIGxldHRlcnMsIGFuZCBsb3dlci1jYXNlIGxldHRlcnMgKGluCiAgICAgdGhhdCBzaWduaWZpY2FuY2Ugb3JkZXIpIGFyZSB1c2VkLgoKICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLCBvciBpZiBhbiBlcnJvciBvY2N1cnJlZCwKICAgICByZXR1cm4gMC4KCiAtLSBGdW5jdGlvbjogc2l6ZV90IG1wel9pbnBfc3RyIChtcHpfdCBST1AsIEZJTEUgKlNUUkVBTSwgaW50IEJBU0UpCiAgICAgSW5wdXQgYSBwb3NzaWJseSB3aGl0ZS1zcGFjZSBwcmVjZWRlZCBzdHJpbmcgaW4gYmFzZSBCQVNFIGZyb20KICAgICBzdGRpbyBzdHJlYW0gU1RSRUFNLCBhbmQgcHV0IHRoZSByZWFkIGludGVnZXIgaW4gUk9QLgoKICAgICBUaGUgQkFTRSBtYXkgdmFyeSBmcm9tIDIgdG8gNjIsIG9yIGlmIEJBU0UgaXMgMCwgdGhlbiB0aGUgbGVhZGluZwogICAgIGNoYXJhY3RlcnMgYXJlIHVzZWQ6IGAweCcgYW5kIGAwWCcgZm9yIGhleGFkZWNpbWFsLCBgMGInIGFuZCBgMEInCiAgICAgZm9yIGJpbmFyeSwgYDAnIGZvciBvY3RhbCwgb3IgZGVjaW1hbCBvdGhlcndpc2UuCgogICAgIEZvciBiYXNlcyB1cCB0byAzNiwgY2FzZSBpcyBpZ25vcmVkOyB1cHBlci1jYXNlIGFuZCBsb3dlci1jYXNlCiAgICAgbGV0dGVycyBoYXZlIHRoZSBzYW1lIHZhbHVlLiAgRm9yIGJhc2VzIDM3IHRvIDYyLCB1cHBlci1jYXNlCiAgICAgbGV0dGVyIHJlcHJlc2VudCB0aGUgdXN1YWwgMTAuLjM1IHdoaWxlIGxvd2VyLWNhc2UgbGV0dGVyCiAgICAgcmVwcmVzZW50IDM2Li42MS4KCiAgICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIHJldHVybiAwLgoKIC0tIEZ1bmN0aW9uOiBzaXplX3QgbXB6X291dF9yYXcgKEZJTEUgKlNUUkVBTSwgY29uc3QgbXB6X3QgT1ApCiAgICAgT3V0cHV0IE9QIG9uIHN0ZGlvIHN0cmVhbSBTVFJFQU0sIGluIHJhdyBiaW5hcnkgZm9ybWF0LiAgVGhlCiAgICAgaW50ZWdlciBpcyB3cml0dGVuIGluIGEgcG9ydGFibGUgZm9ybWF0LCB3aXRoIDQgYnl0ZXMgb2Ygc2l6ZQogICAgIGluZm9ybWF0aW9uLCBhbmQgdGhhdCBtYW55IGJ5dGVzIG9mIGxpbWJzLiAgQm90aCB0aGUgc2l6ZSBhbmQgdGhlCiAgICAgbGltYnMgYXJlIHdyaXR0ZW4gaW4gZGVjcmVhc2luZyBzaWduaWZpY2FuY2Ugb3JkZXIgKGkuZS4sIGluCiAgICAgYmlnLWVuZGlhbikuCgogICAgIFRoZSBvdXRwdXQgY2FuIGJlIHJlYWQgd2l0aCBgbXB6X2lucF9yYXcnLgoKICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLCBvciBpZiBhbiBlcnJvciBvY2N1cnJlZCwKICAgICByZXR1cm4gMC4KCiAgICAgVGhlIG91dHB1dCBvZiB0aGlzIGNhbiBub3QgYmUgcmVhZCBieSBgbXB6X2lucF9yYXcnIGZyb20gR01QIDEsCiAgICAgYmVjYXVzZSBvZiBjaGFuZ2VzIG5lY2Vzc2FyeSBmb3IgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIDMyLWJpdCBhbmQKICAgICA2NC1iaXQgbWFjaGluZXMuCgogLS0gRnVuY3Rpb246IHNpemVfdCBtcHpfaW5wX3JhdyAobXB6X3QgUk9QLCBGSUxFICpTVFJFQU0pCiAgICAgSW5wdXQgZnJvbSBzdGRpbyBzdHJlYW0gU1RSRUFNIGluIHRoZSBmb3JtYXQgd3JpdHRlbiBieQogICAgIGBtcHpfb3V0X3JhdycsIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiBST1AuICBSZXR1cm4gdGhlIG51bWJlciBvZgogICAgIGJ5dGVzIHJlYWQsIG9yIGlmIGFuIGVycm9yIG9jY3VycmVkLCByZXR1cm4gMC4KCiAgICAgVGhpcyByb3V0aW5lIGNhbiByZWFkIHRoZSBvdXRwdXQgZnJvbSBgbXB6X291dF9yYXcnIGFsc28gZnJvbSBHTVAKICAgICAxLCBpbiBzcGl0ZSBvZiBjaGFuZ2VzIG5lY2Vzc2FyeSBmb3IgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIDMyLWJpdAogICAgIGFuZCA2NC1iaXQgbWFjaGluZXMuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogSW50ZWdlciBSYW5kb20gTnVtYmVycywgIE5leHQ6IEludGVnZXIgSW1wb3J0IGFuZCBFeHBvcnQsICBQcmV2OiBJL08gb2YgSW50ZWdlcnMsICBVcDogSW50ZWdlciBGdW5jdGlvbnMKCjUuMTMgUmFuZG9tIE51bWJlciBGdW5jdGlvbnMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIHJhbmRvbSBudW1iZXIgZnVuY3Rpb25zIG9mIEdNUCBjb21lIGluIHR3byBncm91cHM7IG9sZGVyIGZ1bmN0aW9uCnRoYXQgcmVseSBvbiBhIGdsb2JhbCBzdGF0ZSwgYW5kIG5ld2VyIGZ1bmN0aW9ucyB0aGF0IGFjY2VwdCBhIHN0YXRlCnBhcmFtZXRlciB0aGF0IGlzIHJlYWQgYW5kIG1vZGlmaWVkLiAgUGxlYXNlIHNlZSB0aGUgKm5vdGUgUmFuZG9tCk51bWJlciBGdW5jdGlvbnM6OiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIGFuZCBub3QgdG8gdXNlCnJhbmRvbSBudW1iZXIgZnVuY3Rpb25zLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel91cmFuZG9tYiAobXB6X3QgUk9QLCBnbXBfcmFuZHN0YXRlX3QgU1RBVEUsCiAgICAgICAgICBtcF9iaXRjbnRfdCBOKQogICAgIEdlbmVyYXRlIGEgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIHJhbmRvbSBpbnRlZ2VyIGluIHRoZSByYW5nZSAwIHRvCiAgICAgMl5OLTEsIGluY2x1c2l2ZS4KCiAgICAgVGhlIHZhcmlhYmxlIFNUQVRFIG11c3QgYmUgaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyBvbmUgb2YgdGhlCiAgICAgYGdtcF9yYW5kaW5pdCcgZnVuY3Rpb25zICgqbm90ZSBSYW5kb20gU3RhdGUgSW5pdGlhbGl6YXRpb246OikKICAgICBiZWZvcmUgaW52b2tpbmcgdGhpcyBmdW5jdGlvbi4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfdXJhbmRvbW0gKG1wel90IFJPUCwgZ21wX3JhbmRzdGF0ZV90IFNUQVRFLAogICAgICAgICAgY29uc3QgbXB6X3QgTikKICAgICBHZW5lcmF0ZSBhIHVuaWZvcm0gcmFuZG9tIGludGVnZXIgaW4gdGhlIHJhbmdlIDAgdG8gTi0xLCBpbmNsdXNpdmUuCgogICAgIFRoZSB2YXJpYWJsZSBTVEFURSBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgb25lIG9mIHRoZQogICAgIGBnbXBfcmFuZGluaXQnIGZ1bmN0aW9ucyAoKm5vdGUgUmFuZG9tIFN0YXRlIEluaXRpYWxpemF0aW9uOjopCiAgICAgYmVmb3JlIGludm9raW5nIHRoaXMgZnVuY3Rpb24uCgogLS0gRnVuY3Rpb246IHZvaWQgbXB6X3JyYW5kb21iIChtcHpfdCBST1AsIGdtcF9yYW5kc3RhdGVfdCBTVEFURSwKICAgICAgICAgIG1wX2JpdGNudF90IE4pCiAgICAgR2VuZXJhdGUgYSByYW5kb20gaW50ZWdlciB3aXRoIGxvbmcgc3RyaW5ncyBvZiB6ZXJvcyBhbmQgb25lcyBpbgogICAgIHRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24uICBVc2VmdWwgZm9yIHRlc3RpbmcgZnVuY3Rpb25zIGFuZAogICAgIGFsZ29yaXRobXMsIHNpbmNlIHRoaXMga2luZCBvZiByYW5kb20gbnVtYmVycyBoYXZlIHByb3ZlbiB0byBiZQogICAgIG1vcmUgbGlrZWx5IHRvIHRyaWdnZXIgY29ybmVyLWNhc2UgYnVncy4gIFRoZSByYW5kb20gbnVtYmVyIHdpbGwKICAgICBiZSBpbiB0aGUgcmFuZ2UgMCB0byAyXk4tMSwgaW5jbHVzaXZlLgoKICAgICBUaGUgdmFyaWFibGUgU1RBVEUgbXVzdCBiZSBpbml0aWFsaXplZCBieSBjYWxsaW5nIG9uZSBvZiB0aGUKICAgICBgZ21wX3JhbmRpbml0JyBmdW5jdGlvbnMgKCpub3RlIFJhbmRvbSBTdGF0ZSBJbml0aWFsaXphdGlvbjo6KQogICAgIGJlZm9yZSBpbnZva2luZyB0aGlzIGZ1bmN0aW9uLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9yYW5kb20gKG1wel90IFJPUCwgbXBfc2l6ZV90IE1BWF9TSVpFKQogICAgIEdlbmVyYXRlIGEgcmFuZG9tIGludGVnZXIgb2YgYXQgbW9zdCBNQVhfU0laRSBsaW1icy4gIFRoZSBnZW5lcmF0ZWQKICAgICByYW5kb20gbnVtYmVyIGRvZXNuJ3Qgc2F0aXNmeSBhbnkgcGFydGljdWxhciByZXF1aXJlbWVudHMgb2YKICAgICByYW5kb21uZXNzLiAgTmVnYXRpdmUgcmFuZG9tIG51bWJlcnMgYXJlIGdlbmVyYXRlZCB3aGVuIE1BWF9TSVpFCiAgICAgaXMgbmVnYXRpdmUuCgogICAgIFRoaXMgZnVuY3Rpb24gaXMgb2Jzb2xldGUuICBVc2UgYG1wel91cmFuZG9tYicgb3IgYG1wel91cmFuZG9tbScKICAgICBpbnN0ZWFkLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9yYW5kb20yIChtcHpfdCBST1AsIG1wX3NpemVfdCBNQVhfU0laRSkKICAgICBHZW5lcmF0ZSBhIHJhbmRvbSBpbnRlZ2VyIG9mIGF0IG1vc3QgTUFYX1NJWkUgbGltYnMsIHdpdGggbG9uZwogICAgIHN0cmluZ3Mgb2YgemVyb3MgYW5kIG9uZXMgaW4gdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbi4gIFVzZWZ1bAogICAgIGZvciB0ZXN0aW5nIGZ1bmN0aW9ucyBhbmQgYWxnb3JpdGhtcywgc2luY2UgdGhpcyBraW5kIG9mIHJhbmRvbQogICAgIG51bWJlcnMgaGF2ZSBwcm92ZW4gdG8gYmUgbW9yZSBsaWtlbHkgdG8gdHJpZ2dlciBjb3JuZXItY2FzZSBidWdzLgogICAgIE5lZ2F0aXZlIHJhbmRvbSBudW1iZXJzIGFyZSBnZW5lcmF0ZWQgd2hlbiBNQVhfU0laRSBpcyBuZWdhdGl2ZS4KCiAgICAgVGhpcyBmdW5jdGlvbiBpcyBvYnNvbGV0ZS4gIFVzZSBgbXB6X3JyYW5kb21iJyBpbnN0ZWFkLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEludGVnZXIgSW1wb3J0IGFuZCBFeHBvcnQsICBOZXh0OiBNaXNjZWxsYW5lb3VzIEludGVnZXIgRnVuY3Rpb25zLCAgUHJldjogSW50ZWdlciBSYW5kb20gTnVtYmVycywgIFVwOiBJbnRlZ2VyIEZ1bmN0aW9ucwoKNS4xNCBJbnRlZ2VyIEltcG9ydCBhbmQgRXhwb3J0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKYG1wel90JyB2YXJpYWJsZXMgY2FuIGJlIGNvbnZlcnRlZCB0byBhbmQgZnJvbSBhcmJpdHJhcnkgd29yZHMgb2YgYmluYXJ5CmRhdGEgd2l0aCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucy4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfaW1wb3J0IChtcHpfdCBST1AsIHNpemVfdCBDT1VOVCwgaW50IE9SREVSLAogICAgICAgICAgc2l6ZV90IFNJWkUsIGludCBFTkRJQU4sIHNpemVfdCBOQUlMUywgY29uc3Qgdm9pZCAqT1ApCiAgICAgU2V0IFJPUCBmcm9tIGFuIGFycmF5IG9mIHdvcmQgZGF0YSBhdCBPUC4KCiAgICAgVGhlIHBhcmFtZXRlcnMgc3BlY2lmeSB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhLiAgQ09VTlQgbWFueSB3b3JkcwogICAgIGFyZSByZWFkLCBlYWNoIFNJWkUgYnl0ZXMuICBPUkRFUiBjYW4gYmUgMSBmb3IgbW9zdCBzaWduaWZpY2FudAogICAgIHdvcmQgZmlyc3Qgb3IgLTEgZm9yIGxlYXN0IHNpZ25pZmljYW50IGZpcnN0LiAgV2l0aGluIGVhY2ggd29yZAogICAgIEVORElBTiBjYW4gYmUgMSBmb3IgbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0LCAtMSBmb3IgbGVhc3QKICAgICBzaWduaWZpY2FudCBmaXJzdCwgb3IgMCBmb3IgdGhlIG5hdGl2ZSBlbmRpYW5uZXNzIG9mIHRoZSBob3N0IENQVS4KICAgICBUaGUgbW9zdCBzaWduaWZpY2FudCBOQUlMUyBiaXRzIG9mIGVhY2ggd29yZCBhcmUgc2tpcHBlZCwgdGhpcyBjYW4KICAgICBiZSAwIHRvIHVzZSB0aGUgZnVsbCB3b3Jkcy4KCiAgICAgVGhlcmUgaXMgbm8gc2lnbiB0YWtlbiBmcm9tIHRoZSBkYXRhLCBST1Agd2lsbCBzaW1wbHkgYmUgYSBwb3NpdGl2ZQogICAgIGludGVnZXIuICBBbiBhcHBsaWNhdGlvbiBjYW4gaGFuZGxlIGFueSBzaWduIGl0c2VsZiwgYW5kIGFwcGx5IGl0CiAgICAgZm9yIGluc3RhbmNlIHdpdGggYG1wel9uZWcnLgoKICAgICBUaGVyZSBhcmUgbm8gZGF0YSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIG9uIE9QLCBhbnkgYWRkcmVzcyBpcwogICAgIGFsbG93ZWQuCgogICAgIEhlcmUncyBhbiBleGFtcGxlIGNvbnZlcnRpbmcgYW4gYXJyYXkgb2YgYHVuc2lnbmVkIGxvbmcnIGRhdGEsIG1vc3QKICAgICBzaWduaWZpY2FudCBlbGVtZW50IGZpcnN0LCBhbmQgaG9zdCBieXRlIG9yZGVyIHdpdGhpbiBlYWNoIHZhbHVlLgoKICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGFbMjBdOwogICAgICAgICAgLyogSW5pdGlhbGl6ZSBaIGFuZCBBICovCiAgICAgICAgICBtcHpfaW1wb3J0ICh6LCAyMCwgMSwgc2l6ZW9mKGFbMF0pLCAwLCAwLCBhKTsKCiAgICAgVGhpcyBleGFtcGxlIGFzc3VtZXMgdGhlIGZ1bGwgYHNpemVvZicgYnl0ZXMgYXJlIHVzZWQgZm9yIGRhdGEgaW4KICAgICB0aGUgZ2l2ZW4gdHlwZSwgd2hpY2ggaXMgdXN1YWxseSB0cnVlLCBhbmQgY2VydGFpbmx5IHRydWUgZm9yCiAgICAgYHVuc2lnbmVkIGxvbmcnIGV2ZXJ5d2hlcmUgd2Uga25vdyBvZi4gIEhvd2V2ZXIgb24gQ3JheSB2ZWN0b3IKICAgICBzeXN0ZW1zIGl0IG1heSBiZSBub3RlZCB0aGF0IGBzaG9ydCcgYW5kIGBpbnQnIGFyZSBhbHdheXMgc3RvcmVkCiAgICAgaW4gOCBieXRlcyAoYW5kIHdpdGggYHNpemVvZicgaW5kaWNhdGluZyB0aGF0KSBidXQgdXNlIG9ubHkgMzIgb3IKICAgICA0NiBiaXRzLiAgVGhlIE5BSUxTIGZlYXR1cmUgY2FuIGFjY291bnQgZm9yIHRoaXMsIGJ5IHBhc3NpbmcgZm9yCiAgICAgaW5zdGFuY2UgYDgqc2l6ZW9mKGludCktSU5UX0JJVCcuCgogLS0gRnVuY3Rpb246IHZvaWQgKiBtcHpfZXhwb3J0ICh2b2lkICpST1AsIHNpemVfdCAqQ09VTlRQLCBpbnQgT1JERVIsCiAgICAgICAgICBzaXplX3QgU0laRSwgaW50IEVORElBTiwgc2l6ZV90IE5BSUxTLCBjb25zdCBtcHpfdCBPUCkKICAgICBGaWxsIFJPUCB3aXRoIHdvcmQgZGF0YSBmcm9tIE9QLgoKICAgICBUaGUgcGFyYW1ldGVycyBzcGVjaWZ5IHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgcHJvZHVjZWQuICBFYWNoIHdvcmQKICAgICB3aWxsIGJlIFNJWkUgYnl0ZXMgYW5kIE9SREVSIGNhbiBiZSAxIGZvciBtb3N0IHNpZ25pZmljYW50IHdvcmQKICAgICBmaXJzdCBvciAtMSBmb3IgbGVhc3Qgc2lnbmlmaWNhbnQgZmlyc3QuICBXaXRoaW4gZWFjaCB3b3JkIEVORElBTgogICAgIGNhbiBiZSAxIGZvciBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QsIC0xIGZvciBsZWFzdCBzaWduaWZpY2FudAogICAgIGZpcnN0LCBvciAwIGZvciB0aGUgbmF0aXZlIGVuZGlhbm5lc3Mgb2YgdGhlIGhvc3QgQ1BVLiAgVGhlIG1vc3QKICAgICBzaWduaWZpY2FudCBOQUlMUyBiaXRzIG9mIGVhY2ggd29yZCBhcmUgdW51c2VkIGFuZCBzZXQgdG8gemVybywKICAgICB0aGlzIGNhbiBiZSAwIHRvIHByb2R1Y2UgZnVsbCB3b3Jkcy4KCiAgICAgVGhlIG51bWJlciBvZiB3b3JkcyBwcm9kdWNlZCBpcyB3cml0dGVuIHRvIGAqQ09VTlRQJywgb3IgQ09VTlRQCiAgICAgY2FuIGJlIGBOVUxMJyB0byBkaXNjYXJkIHRoZSBjb3VudC4gIFJPUCBtdXN0IGhhdmUgZW5vdWdoIHNwYWNlCiAgICAgZm9yIHRoZSBkYXRhLCBvciBpZiBST1AgaXMgYE5VTEwnIHRoZW4gYSByZXN1bHQgYXJyYXkgb2YgdGhlCiAgICAgbmVjZXNzYXJ5IHNpemUgaXMgYWxsb2NhdGVkIHVzaW5nIHRoZSBjdXJyZW50IEdNUCBhbGxvY2F0aW9uCiAgICAgZnVuY3Rpb24gKCpub3RlIEN1c3RvbSBBbGxvY2F0aW9uOjopLiAgSW4gZWl0aGVyIGNhc2UgdGhlIHJldHVybgogICAgIHZhbHVlIGlzIHRoZSBkZXN0aW5hdGlvbiB1c2VkLCBlaXRoZXIgUk9QIG9yIHRoZSBhbGxvY2F0ZWQgYmxvY2suCgogICAgIElmIE9QIGlzIG5vbi16ZXJvIHRoZW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgd29yZCBwcm9kdWNlZCB3aWxsIGJlCiAgICAgbm9uLXplcm8uICBJZiBPUCBpcyB6ZXJvIHRoZW4gdGhlIGNvdW50IHJldHVybmVkIHdpbGwgYmUgemVybyBhbmQKICAgICBub3RoaW5nIHdyaXR0ZW4gdG8gUk9QLiAgSWYgUk9QIGlzIGBOVUxMJyBpbiB0aGlzIGNhc2UsIG5vIGJsb2NrCiAgICAgaXMgYWxsb2NhdGVkLCBqdXN0IGBOVUxMJyBpcyByZXR1cm5lZC4KCiAgICAgVGhlIHNpZ24gb2YgT1AgaXMgaWdub3JlZCwganVzdCB0aGUgYWJzb2x1dGUgdmFsdWUgaXMgZXhwb3J0ZWQuICBBbgogICAgIGFwcGxpY2F0aW9uIGNhbiB1c2UgYG1wel9zZ24nIHRvIGdldCB0aGUgc2lnbiBhbmQgaGFuZGxlIGl0IGFzCiAgICAgZGVzaXJlZC4gICgqbm90ZSBJbnRlZ2VyIENvbXBhcmlzb25zOjopCgogICAgIFRoZXJlIGFyZSBubyBkYXRhIGFsaWdubWVudCByZXN0cmljdGlvbnMgb24gUk9QLCBhbnkgYWRkcmVzcyBpcwogICAgIGFsbG93ZWQuCgogICAgIFdoZW4gYW4gYXBwbGljYXRpb24gaXMgYWxsb2NhdGluZyBzcGFjZSBpdHNlbGYgdGhlIHJlcXVpcmVkIHNpemUKICAgICBjYW4gYmUgZGV0ZXJtaW5lZCB3aXRoIGEgY2FsY3VsYXRpb24gbGlrZSB0aGUgZm9sbG93aW5nLiAgU2luY2UKICAgICBgbXB6X3NpemVpbmJhc2UnIGFsd2F5cyByZXR1cm5zIGF0IGxlYXN0IDEsIGBjb3VudCcgaGVyZSB3aWxsIGJlCiAgICAgYXQgbGVhc3Qgb25lLCB3aGljaCBhdm9pZHMgYW55IHBvcnRhYmlsaXR5IHByb2JsZW1zIHdpdGgKICAgICBgbWFsbG9jKDApJywgdGhvdWdoIGlmIGB6JyBpcyB6ZXJvIG5vIHNwYWNlIGF0IGFsbCBpcyBhY3R1YWxseQogICAgIG5lZWRlZCAob3Igd3JpdHRlbikuCgogICAgICAgICAgbnVtYiA9IDgqc2l6ZSAtIG5haWw7CiAgICAgICAgICBjb3VudCA9IChtcHpfc2l6ZWluYmFzZSAoeiwgMikgKyBudW1iLTEpIC8gbnVtYjsKICAgICAgICAgIHAgPSBtYWxsb2MgKGNvdW50ICogc2l6ZSk7CgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogTWlzY2VsbGFuZW91cyBJbnRlZ2VyIEZ1bmN0aW9ucywgIE5leHQ6IEludGVnZXIgU3BlY2lhbCBGdW5jdGlvbnMsICBQcmV2OiBJbnRlZ2VyIEltcG9ydCBhbmQgRXhwb3J0LCAgVXA6IEludGVnZXIgRnVuY3Rpb25zCgo1LjE1IE1pc2NlbGxhbmVvdXMgRnVuY3Rpb25zCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAtLSBGdW5jdGlvbjogaW50IG1wel9maXRzX3Vsb25nX3AgKGNvbnN0IG1wel90IE9QKQogLS0gRnVuY3Rpb246IGludCBtcHpfZml0c19zbG9uZ19wIChjb25zdCBtcHpfdCBPUCkKIC0tIEZ1bmN0aW9uOiBpbnQgbXB6X2ZpdHNfdWludF9wIChjb25zdCBtcHpfdCBPUCkKIC0tIEZ1bmN0aW9uOiBpbnQgbXB6X2ZpdHNfc2ludF9wIChjb25zdCBtcHpfdCBPUCkKIC0tIEZ1bmN0aW9uOiBpbnQgbXB6X2ZpdHNfdXNob3J0X3AgKGNvbnN0IG1wel90IE9QKQogLS0gRnVuY3Rpb246IGludCBtcHpfZml0c19zc2hvcnRfcCAoY29uc3QgbXB6X3QgT1ApCiAgICAgUmV0dXJuIG5vbi16ZXJvIGlmZiB0aGUgdmFsdWUgb2YgT1AgZml0cyBpbiBhbiBgdW5zaWduZWQgbG9uZyBpbnQnLAogICAgIGBzaWduZWQgbG9uZyBpbnQnLCBgdW5zaWduZWQgaW50JywgYHNpZ25lZCBpbnQnLCBgdW5zaWduZWQgc2hvcnQKICAgICBpbnQnLCBvciBgc2lnbmVkIHNob3J0IGludCcsIHJlc3BlY3RpdmVseS4gIE90aGVyd2lzZSwgcmV0dXJuIHplcm8uCgogLS0gTWFjcm86IGludCBtcHpfb2RkX3AgKGNvbnN0IG1wel90IE9QKQogLS0gTWFjcm86IGludCBtcHpfZXZlbl9wIChjb25zdCBtcHpfdCBPUCkKICAgICBEZXRlcm1pbmUgd2hldGhlciBPUCBpcyBvZGQgb3IgZXZlbiwgcmVzcGVjdGl2ZWx5LiAgUmV0dXJuCiAgICAgbm9uLXplcm8gaWYgeWVzLCB6ZXJvIGlmIG5vLiAgVGhlc2UgbWFjcm9zIGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50CiAgICAgbW9yZSB0aGFuIG9uY2UuCgogLS0gRnVuY3Rpb246IHNpemVfdCBtcHpfc2l6ZWluYmFzZSAoY29uc3QgbXB6X3QgT1AsIGludCBCQVNFKQogICAgIFJldHVybiB0aGUgc2l6ZSBvZiBPUCBtZWFzdXJlZCBpbiBudW1iZXIgb2YgZGlnaXRzIGluIHRoZSBnaXZlbgogICAgIEJBU0UuICBCQVNFIGNhbiB2YXJ5IGZyb20gMiB0byA2Mi4gIFRoZSBzaWduIG9mIE9QIGlzIGlnbm9yZWQsCiAgICAganVzdCB0aGUgYWJzb2x1dGUgdmFsdWUgaXMgdXNlZC4gIFRoZSByZXN1bHQgd2lsbCBiZSBlaXRoZXIgZXhhY3QKICAgICBvciAxIHRvbyBiaWcuICBJZiBCQVNFIGlzIGEgcG93ZXIgb2YgMiwgdGhlIHJlc3VsdCBpcyBhbHdheXMKICAgICBleGFjdC4gIElmIE9QIGlzIHplcm8gdGhlIHJldHVybiB2YWx1ZSBpcyBhbHdheXMgMS4KCiAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHNwYWNlIHJlcXVpcmVkIHdoZW4KICAgICBjb252ZXJ0aW5nIE9QIHRvIGEgc3RyaW5nLiAgVGhlIHJpZ2h0IGFtb3VudCBvZiBhbGxvY2F0aW9uIGlzCiAgICAgbm9ybWFsbHkgdHdvIG1vcmUgdGhhbiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgYG1wel9zaXplaW5iYXNlJywgb25lCiAgICAgZXh0cmEgZm9yIGEgbWludXMgc2lnbiBhbmQgb25lIGZvciB0aGUgbnVsbC10ZXJtaW5hdG9yLgoKICAgICBJdCB3aWxsIGJlIG5vdGVkIHRoYXQgYG1wel9zaXplaW5iYXNlKE9QLDIpJyBjYW4gYmUgdXNlZCB0byBsb2NhdGUKICAgICB0aGUgbW9zdCBzaWduaWZpY2FudCAxIGJpdCBpbiBPUCwgY291bnRpbmcgZnJvbSAxLiAgKFVubGlrZSB0aGUKICAgICBiaXR3aXNlIGZ1bmN0aW9ucyB3aGljaCBzdGFydCBmcm9tIDAsICpOb3RlIExvZ2ljYWwgYW5kIEJpdAogICAgIE1hbmlwdWxhdGlvbiBGdW5jdGlvbnM6IEludGVnZXIgTG9naWMgYW5kIEJpdCBGaWRkbGluZy4pCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogSW50ZWdlciBTcGVjaWFsIEZ1bmN0aW9ucywgIFByZXY6IE1pc2NlbGxhbmVvdXMgSW50ZWdlciBGdW5jdGlvbnMsICBVcDogSW50ZWdlciBGdW5jdGlvbnMKCjUuMTYgU3BlY2lhbCBGdW5jdGlvbnMKPT09PT09PT09PT09PT09PT09PT09PQoKVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIHNlY3Rpb24gYXJlIGZvciB2YXJpb3VzIHNwZWNpYWwgcHVycG9zZXMuICBNb3N0CmFwcGxpY2F0aW9ucyB3aWxsIG5vdCBuZWVkIHRoZW0uCgogLS0gRnVuY3Rpb246IHZvaWQgbXB6X2FycmF5X2luaXQgKG1wel90IElOVEVHRVJfQVJSQVksIG1wX3NpemVfdAogICAgICAgICAgQVJSQVlfU0laRSwgbXBfc2l6ZV90IEZJWEVEX05VTV9CSVRTKQogICAgICpUaGlzIGlzIGFuIG9ic29sZXRlIGZ1bmN0aW9uLiAgRG8gbm90IHVzZSBpdC4qCgogLS0gRnVuY3Rpb246IHZvaWQgKiBfbXB6X3JlYWxsb2MgKG1wel90IElOVEVHRVIsIG1wX3NpemVfdCBORVdfQUxMT0MpCiAgICAgQ2hhbmdlIHRoZSBzcGFjZSBmb3IgSU5URUdFUiB0byBORVdfQUxMT0MgbGltYnMuICBUaGUgdmFsdWUgaW4KICAgICBJTlRFR0VSIGlzIHByZXNlcnZlZCBpZiBpdCBmaXRzLCBvciBpcyBzZXQgdG8gMCBpZiBub3QuICBUaGUgcmV0dXJuCiAgICAgdmFsdWUgaXMgbm90IHVzZWZ1bCB0byBhcHBsaWNhdGlvbnMgYW5kIHNob3VsZCBiZSBpZ25vcmVkLgoKICAgICBgbXB6X3JlYWxsb2MyJyBpcyB0aGUgcHJlZmVycmVkIHdheSB0byBhY2NvbXBsaXNoIGFsbG9jYXRpb24KICAgICBjaGFuZ2VzIGxpa2UgdGhpcy4gIGBtcHpfcmVhbGxvYzInIGFuZCBgX21wel9yZWFsbG9jJyBhcmUgdGhlIHNhbWUKICAgICBleGNlcHQgdGhhdCBgX21wel9yZWFsbG9jJyB0YWtlcyBpdHMgc2l6ZSBpbiBsaW1icy4KCiAtLSBGdW5jdGlvbjogbXBfbGltYl90IG1wel9nZXRsaW1ibiAoY29uc3QgbXB6X3QgT1AsIG1wX3NpemVfdCBOKQogICAgIFJldHVybiBsaW1iIG51bWJlciBOIGZyb20gT1AuICBUaGUgc2lnbiBvZiBPUCBpcyBpZ25vcmVkLCBqdXN0IHRoZQogICAgIGFic29sdXRlIHZhbHVlIGlzIHVzZWQuICBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYiBpcyBudW1iZXIgMC4KCiAgICAgYG1wel9zaXplJyBjYW4gYmUgdXNlZCB0byBmaW5kIGhvdyBtYW55IGxpbWJzIG1ha2UgdXAgT1AuCiAgICAgYG1wel9nZXRsaW1ibicgcmV0dXJucyB6ZXJvIGlmIE4gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgMCB0bwogICAgIGBtcHpfc2l6ZShPUCktMScuCgogLS0gRnVuY3Rpb246IHNpemVfdCBtcHpfc2l6ZSAoY29uc3QgbXB6X3QgT1ApCiAgICAgUmV0dXJuIHRoZSBzaXplIG9mIE9QIG1lYXN1cmVkIGluIG51bWJlciBvZiBsaW1icy4gIElmIE9QIGlzIHplcm8sCiAgICAgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgemVyby4KCiAtLSBGdW5jdGlvbjogY29uc3QgbXBfbGltYl90ICogbXB6X2xpbWJzX3JlYWQgKGNvbnN0IG1wel90IFgpCiAgICAgUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbGltYiBhcnJheSByZXByZXNlbnRpbmcgdGhlIGFic29sdXRlIHZhbHVlCiAgICAgb2YgWC4gIFRoZSBzaXplIG9mIHRoZSBhcnJheSBpcyBgbXB6X3NpemUoWCknLiBJbnRlbmRlZCBmb3IgcmVhZAogICAgIGFjY2VzcyBvbmx5LgoKIC0tIEZ1bmN0aW9uOiBtcF9saW1iX3QgKiBtcHpfbGltYnNfd3JpdGUgKG1wel90IFgsIG1wX3NpemVfdCBOKQogLS0gRnVuY3Rpb246IG1wX2xpbWJfdCAqIG1wel9saW1ic19tb2RpZnkgKG1wel90IFgsIG1wX3NpemVfdCBOKQogICAgIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGxpbWIgYXJyYXksIGludGVuZGVkIGZvciB3cml0ZSBhY2Nlc3MuIFRoZQogICAgIGFycmF5IGlzIHJlYWxsb2NhdGVkIGFzIG5lZWRlZCwgdG8gbWFrZSByb29tIGZvciBOIGxpbWJzLiBSZXF1aXJlcwogICAgIE4gPiAwLiBUaGUgYG1wel9saW1ic19tb2RpZnknIGZ1bmN0aW9uIHJldHVybnMgYW4gYXJyYXkgdGhhdCBob2xkcwogICAgIHRoZSBvbGQgYWJzb2x1dGUgdmFsdWUgb2YgWCwgd2hpbGUgYG1wel9saW1ic193cml0ZScgbWF5IGRlc3Ryb3kKICAgICB0aGUgb2xkIHZhbHVlIGFuZCByZXR1cm4gYW4gYXJyYXkgd2l0aCB1bnNwZWNpZmllZCBjb250ZW50cy4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHpfbGltYnNfZmluaXNoIChtcHpfdCBYLCBtcF9zaXplX3QgUykKICAgICBVcGRhdGVzIHRoZSBpbnRlcm5hbCBzaXplIGZpZWxkIG9mIFguIFVzZWQgYWZ0ZXIgd3JpdGluZyB0byB0aGUKICAgICBsaW1iIGFycmF5IHBvaW50ZXIgcmV0dXJuZWQgYnkgYG1wel9saW1ic193cml0ZScgb3IKICAgICBgbXB6X2xpbWJzX21vZGlmeScgaXMgY29tcGxldGVkLiBUaGUgYXJyYXkgc2hvdWxkIGNvbnRhaW4gYWJzKFMpCiAgICAgdmFsaWQgbGltYnMsIHJlcHJlc2VudGluZyB0aGUgbmV3IGFic29sdXRlIHZhbHVlIGZvciBYLCBhbmQgdGhlCiAgICAgc2lnbiBvZiBYIGlzIHRha2VuIGZyb20gdGhlIHNpZ24gb2YgUy4gVGhpcyBmdW5jdGlvbiBuZXZlcgogICAgIHJlYWxsb2NhdGVzIFgsIHNvIHRoZSBsaW1iIHBvaW50ZXIgcmVtYWlucyB2YWxpZC4KCiAgICAgdm9pZCBmb28gKG1wel90IHgpCiAgICAgewogICAgICAgbXBfc2l6ZV90IG4sIGk7CiAgICAgICBtcF9saW1iX3QgKnhwOwoKICAgICAgIG4gPSBtcHpfc2l6ZSAoeCk7CiAgICAgICB4cCA9IG1wel9saW1ic19tb2RpZnkoeCwgMipuKTsKICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCiAgICAgICAgIHhwW24raV0gPSB4cFtuLTEtaV07CiAgICAgICBtcHpfbGltYnNfZmluaXNoICh4LCBtcHpfc2duICh4KSA8IDAgPyAtIDIqbiA6IDIqbik7CiAgICAgfQoKIC0tIEZ1bmN0aW9uOiBtcHpfc3JjcHRyIG1wel9yb2luaXRfbiAobXB6X3QgWCwgY29uc3QgbXBfbGltYl90ICpYUCwKICAgICAgICAgIG1wX3NpemVfdCBYUykKICAgICBTcGVjaWFsIGluaXRpYWxpemF0aW9uIG9mIFgsIHVzaW5nIHRoZSBnaXZlbiBsaW1iIGFycmF5IGFuZCBzaXplLgogICAgIFggc2hvdWxkIGJlIHRyZWF0ZWQgYXMgcmVhZC1vbmx5OiBpdCBjYW4gYmUgcGFzc2VkIHNhZmVseSBhcyBpbnB1dAogICAgIHRvIGFueSBtcHogZnVuY3Rpb24sIGJ1dCBub3QgYXMgYW4gb3V0cHV0LiBUaGUgYXJyYXkgWFAgbXVzdCBwb2ludAogICAgIHRvIGF0IGxlYXN0IGEgcmVhZGFibGUgbGltYiwgaXRzIHNpemUgaXMgYWJzKFhTKSwgYW5kIHRoZSBzaWduIG9mCiAgICAgWCBpcyB0aGUgc2lnbiBvZiBYUy4gRm9yIGNvbnZlbmllbmNlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBYLCBidXQKICAgICBjYXN0IHRvIGEgY29uc3QgcG9pbnRlciB0eXBlLgoKICAgICB2b2lkIGZvbyAobXB6X3QgeCkKICAgICB7CiAgICAgICBzdGF0aWMgY29uc3QgbXBfbGltYl90IHlbM10gPSB7IDB4MSwgMHgyLCAweDMgfTsKICAgICAgIG1wel90IHRtcDsKICAgICAgIG1wel9hZGQgKHgsIHgsIG1wel9yb2luaXRfbiAodG1wLCB5LCAzKSk7CiAgICAgfQoKIC0tIE1hY3JvOiBtcHpfdCBNUFpfUk9JTklUX04gKG1wX2xpbWJfdCAqWFAsIG1wX3NpemVfdCBYUykKICAgICBUaGlzIG1hY3JvIGV4cGFuZHMgdG8gYW4gaW5pdGlhbGl6ZXIgd2hpY2ggY2FuIGJlIGFzc2lnbmVkIHRvIGFuCiAgICAgbXB6X3QgdmFyaWFibGUuIFRoZSBsaW1iIGFycmF5IFhQIG11c3QgcG9pbnQgdG8gYXQgbGVhc3QgYQogICAgIHJlYWRhYmxlIGxpbWIsIG1vcmVvdmVyLCB1bmxpa2UgdGhlIGBtcHpfcm9pbml0X24nIGZ1bmN0aW9uLCB0aGUKICAgICBhcnJheSBtdXN0IGJlIG5vcm1hbGl6ZWQ6IGlmIFhTIGlzIG5vbi16ZXJvLCB0aGVuIGBYUFthYnMoWFMpLTFdJwogICAgIG11c3QgYmUgbm9uLXplcm8uIEludGVuZGVkIHByaW1hcmlseSBmb3IgY29uc3RhbnQgdmFsdWVzLiBVc2luZyBpdAogICAgIGZvciBub24tY29uc3RhbnQgdmFsdWVzIHJlcXVpcmVzIGEgQyBjb21waWxlciBzdXBwb3J0aW5nIEM5OS4KCiAgICAgdm9pZCBmb28gKG1wel90IHgpCiAgICAgewogICAgICAgc3RhdGljIGNvbnN0IG1wX2xpbWJfdCB5YVszXSA9IHsgMHgxLCAweDIsIDB4MyB9OwogICAgICAgc3RhdGljIGNvbnN0IG1wel90IHkgPSBNUFpfUk9JTklUX04gKChtcF9saW1iX3QgKikgeWEsIDMpOwoKICAgICAgIG1wel9hZGQgKHgsIHgsIHkpOwogICAgIH0KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBSYXRpb25hbCBOdW1iZXIgRnVuY3Rpb25zLCAgTmV4dDogRmxvYXRpbmctcG9pbnQgRnVuY3Rpb25zLCAgUHJldjogSW50ZWdlciBGdW5jdGlvbnMsICBVcDogVG9wCgo2IFJhdGlvbmFsIE51bWJlciBGdW5jdGlvbnMKKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpUaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIHRoZSBHTVAgZnVuY3Rpb25zIGZvciBwZXJmb3JtaW5nIGFyaXRobWV0aWMgb24KcmF0aW9uYWwgbnVtYmVycy4gIFRoZXNlIGZ1bmN0aW9ucyBzdGFydCB3aXRoIHRoZSBwcmVmaXggYG1wcV8nLgoKICAgUmF0aW9uYWwgbnVtYmVycyBhcmUgc3RvcmVkIGluIG9iamVjdHMgb2YgdHlwZSBgbXBxX3QnLgoKICAgQWxsIHJhdGlvbmFsIGFyaXRobWV0aWMgZnVuY3Rpb25zIGFzc3VtZSBvcGVyYW5kcyBoYXZlIGEgY2Fub25pY2FsCmZvcm0sIGFuZCBjYW5vbmljYWxpemUgdGhlaXIgcmVzdWx0LiAgVGhlIGNhbm9uaWNhbCBmcm9tIG1lYW5zIHRoYXQgdGhlCmRlbm9taW5hdG9yIGFuZCB0aGUgbnVtZXJhdG9yIGhhdmUgbm8gY29tbW9uIGZhY3RvcnMsIGFuZCB0aGF0IHRoZQpkZW5vbWluYXRvciBpcyBwb3NpdGl2ZS4gIFplcm8gaGFzIHRoZSB1bmlxdWUgcmVwcmVzZW50YXRpb24gMC8xLgoKICAgUHVyZSBhc3NpZ25tZW50IGZ1bmN0aW9ucyBkbyBub3QgY2Fub25pY2FsaXplIHRoZSBhc3NpZ25lZCB2YXJpYWJsZS4KSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB1c2VyIHRvIGNhbm9uaWNhbGl6ZSB0aGUgYXNzaWduZWQKdmFyaWFibGUgYmVmb3JlIGFueSBhcml0aG1ldGljIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiB0aGF0CnZhcmlhYmxlLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wcV9jYW5vbmljYWxpemUgKG1wcV90IE9QKQogICAgIFJlbW92ZSBhbnkgZmFjdG9ycyB0aGF0IGFyZSBjb21tb24gdG8gdGhlIG51bWVyYXRvciBhbmQKICAgICBkZW5vbWluYXRvciBvZiBPUCwgYW5kIG1ha2UgdGhlIGRlbm9taW5hdG9yIHBvc2l0aXZlLgoKKiBNZW51OgoKKiBJbml0aWFsaXppbmcgUmF0aW9uYWxzOjoKKiBSYXRpb25hbCBDb252ZXJzaW9uczo6CiogUmF0aW9uYWwgQXJpdGhtZXRpYzo6CiogQ29tcGFyaW5nIFJhdGlvbmFsczo6CiogQXBwbHlpbmcgSW50ZWdlciBGdW5jdGlvbnM6OgoqIEkvTyBvZiBSYXRpb25hbHM6OgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEluaXRpYWxpemluZyBSYXRpb25hbHMsICBOZXh0OiBSYXRpb25hbCBDb252ZXJzaW9ucywgIFByZXY6IFJhdGlvbmFsIE51bWJlciBGdW5jdGlvbnMsICBVcDogUmF0aW9uYWwgTnVtYmVyIEZ1bmN0aW9ucwoKNi4xIEluaXRpYWxpemF0aW9uIGFuZCBBc3NpZ25tZW50IEZ1bmN0aW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogLS0gRnVuY3Rpb246IHZvaWQgbXBxX2luaXQgKG1wcV90IFgpCiAgICAgSW5pdGlhbGl6ZSBYIGFuZCBzZXQgaXQgdG8gMC8xLiAgRWFjaCB2YXJpYWJsZSBzaG91bGQgbm9ybWFsbHkKICAgICBvbmx5IGJlIGluaXRpYWxpemVkIG9uY2UsIG9yIGF0IGxlYXN0IGNsZWFyZWQgb3V0ICh1c2luZyB0aGUKICAgICBmdW5jdGlvbiBgbXBxX2NsZWFyJykgYmV0d2VlbiBlYWNoIGluaXRpYWxpemF0aW9uLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wcV9pbml0cyAobXBxX3QgWCwgLi4uKQogICAgIEluaXRpYWxpemUgYSBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBgbXBxX3QnIHZhcmlhYmxlcywgYW5kIHNldAogICAgIHRoZWlyIHZhbHVlcyB0byAwLzEuCgogLS0gRnVuY3Rpb246IHZvaWQgbXBxX2NsZWFyIChtcHFfdCBYKQogICAgIEZyZWUgdGhlIHNwYWNlIG9jY3VwaWVkIGJ5IFguICBNYWtlIHN1cmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGZvcgogICAgIGFsbCBgbXBxX3QnIHZhcmlhYmxlcyB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoZW0uCgogLS0gRnVuY3Rpb246IHZvaWQgbXBxX2NsZWFycyAobXBxX3QgWCwgLi4uKQogICAgIEZyZWUgdGhlIHNwYWNlIG9jY3VwaWVkIGJ5IGEgTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2YgYG1wcV90JwogICAgIHZhcmlhYmxlcy4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHFfc2V0IChtcHFfdCBST1AsIGNvbnN0IG1wcV90IE9QKQogLS0gRnVuY3Rpb246IHZvaWQgbXBxX3NldF96IChtcHFfdCBST1AsIGNvbnN0IG1wel90IE9QKQogICAgIEFzc2lnbiBST1AgZnJvbSBPUC4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHFfc2V0X3VpIChtcHFfdCBST1AsIHVuc2lnbmVkIGxvbmcgaW50IE9QMSwKICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IE9QMikKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wcV9zZXRfc2kgKG1wcV90IFJPUCwgc2lnbmVkIGxvbmcgaW50IE9QMSwgdW5zaWduZWQKICAgICAgICAgIGxvbmcgaW50IE9QMikKICAgICBTZXQgdGhlIHZhbHVlIG9mIFJPUCB0byBPUDEvT1AyLiAgTm90ZSB0aGF0IGlmIE9QMSBhbmQgT1AyIGhhdmUKICAgICBjb21tb24gZmFjdG9ycywgUk9QIGhhcyB0byBiZSBwYXNzZWQgdG8gYG1wcV9jYW5vbmljYWxpemUnIGJlZm9yZQogICAgIGFueSBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgb24gUk9QLgoKIC0tIEZ1bmN0aW9uOiBpbnQgbXBxX3NldF9zdHIgKG1wcV90IFJPUCwgY29uc3QgY2hhciAqU1RSLCBpbnQgQkFTRSkKICAgICBTZXQgUk9QIGZyb20gYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIFNUUiBpbiB0aGUgZ2l2ZW4gQkFTRS4KCiAgICAgVGhlIHN0cmluZyBjYW4gYmUgYW4gaW50ZWdlciBsaWtlICI0MSIgb3IgYSBmcmFjdGlvbiBsaWtlCiAgICAgIjQxLzE1MiIuICBUaGUgZnJhY3Rpb24gbXVzdCBiZSBpbiBjYW5vbmljYWwgZm9ybSAoKm5vdGUgUmF0aW9uYWwKICAgICBOdW1iZXIgRnVuY3Rpb25zOjopLCBvciBpZiBub3QgdGhlbiBgbXBxX2Nhbm9uaWNhbGl6ZScgbXVzdCBiZQogICAgIGNhbGxlZC4KCiAgICAgVGhlIG51bWVyYXRvciBhbmQgb3B0aW9uYWwgZGVub21pbmF0b3IgYXJlIHBhcnNlZCB0aGUgc2FtZSBhcyBpbgogICAgIGBtcHpfc2V0X3N0cicgKCpub3RlIEFzc2lnbmluZyBJbnRlZ2Vyczo6KS4gIFdoaXRlIHNwYWNlIGlzCiAgICAgYWxsb3dlZCBpbiB0aGUgc3RyaW5nLCBhbmQgaXMgc2ltcGx5IGlnbm9yZWQuICBUaGUgQkFTRSBjYW4gdmFyeQogICAgIGZyb20gMiB0byA2Miwgb3IgaWYgQkFTRSBpcyAwIHRoZW4gdGhlIGxlYWRpbmcgY2hhcmFjdGVycyBhcmUKICAgICB1c2VkOiBgMHgnIG9yIGAwWCcgZm9yIGhleCwgYDBiJyBvciBgMEInIGZvciBiaW5hcnksIGAwJyBmb3IKICAgICBvY3RhbCwgb3IgZGVjaW1hbCBvdGhlcndpc2UuICBOb3RlIHRoYXQgdGhpcyBpcyBkb25lIHNlcGFyYXRlbHkKICAgICBmb3IgdGhlIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3IsIHNvIGZvciBpbnN0YW5jZSBgMHhFRi8xMDAnIGlzCiAgICAgMjM5LzEwMCwgd2hlcmVhcyBgMHhFRi8weDEwMCcgaXMgMjM5LzI1Ni4KCiAgICAgVGhlIHJldHVybiB2YWx1ZSBpcyAwIGlmIHRoZSBlbnRpcmUgc3RyaW5nIGlzIGEgdmFsaWQgbnVtYmVyLCBvcgogICAgIC0xIGlmIG5vdC4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHFfc3dhcCAobXBxX3QgUk9QMSwgbXBxX3QgUk9QMikKICAgICBTd2FwIHRoZSB2YWx1ZXMgUk9QMSBhbmQgUk9QMiBlZmZpY2llbnRseS4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBSYXRpb25hbCBDb252ZXJzaW9ucywgIE5leHQ6IFJhdGlvbmFsIEFyaXRobWV0aWMsICBQcmV2OiBJbml0aWFsaXppbmcgUmF0aW9uYWxzLCAgVXA6IFJhdGlvbmFsIE51bWJlciBGdW5jdGlvbnMKCjYuMiBDb252ZXJzaW9uIEZ1bmN0aW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT0KCiAtLSBGdW5jdGlvbjogZG91YmxlIG1wcV9nZXRfZCAoY29uc3QgbXBxX3QgT1ApCiAgICAgQ29udmVydCBPUCB0byBhIGBkb3VibGUnLCB0cnVuY2F0aW5nIGlmIG5lY2Vzc2FyeSAoaS5lLiByb3VuZGluZwogICAgIHRvd2FyZHMgemVybykuCgogICAgIElmIHRoZSBleHBvbmVudCBmcm9tIHRoZSBjb252ZXJzaW9uIGlzIHRvbyBiaWcgb3IgdG9vIHNtYWxsIHRvIGZpdAogICAgIGEgYGRvdWJsZScgdGhlbiB0aGUgcmVzdWx0IGlzIHN5c3RlbSBkZXBlbmRlbnQuICBGb3IgdG9vIGJpZyBhbgogICAgIGluZmluaXR5IGlzIHJldHVybmVkIHdoZW4gYXZhaWxhYmxlLiAgRm9yIHRvbyBzbWFsbCAwLjAgaXMKICAgICBub3JtYWxseSByZXR1cm5lZC4gIEhhcmR3YXJlIG92ZXJmbG93LCB1bmRlcmZsb3cgYW5kIGRlbm9ybSB0cmFwcwogICAgIG1heSBvciBtYXkgbm90IG9jY3VyLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wcV9zZXRfZCAobXBxX3QgUk9QLCBkb3VibGUgT1ApCiAtLSBGdW5jdGlvbjogdm9pZCBtcHFfc2V0X2YgKG1wcV90IFJPUCwgY29uc3QgbXBmX3QgT1ApCiAgICAgU2V0IFJPUCB0byB0aGUgdmFsdWUgb2YgT1AuICBUaGVyZSBpcyBubyByb3VuZGluZywgdGhpcyBjb252ZXJzaW9uCiAgICAgaXMgZXhhY3QuCgogLS0gRnVuY3Rpb246IGNoYXIgKiBtcHFfZ2V0X3N0ciAoY2hhciAqU1RSLCBpbnQgQkFTRSwgY29uc3QgbXBxX3QgT1ApCiAgICAgQ29udmVydCBPUCB0byBhIHN0cmluZyBvZiBkaWdpdHMgaW4gYmFzZSBCQVNFLiAgVGhlIGJhc2UgbWF5IHZhcnkKICAgICBmcm9tIDIgdG8gMzYuICBUaGUgc3RyaW5nIHdpbGwgYmUgb2YgdGhlIGZvcm0gYG51bS9kZW4nLCBvciBpZiB0aGUKICAgICBkZW5vbWluYXRvciBpcyAxIHRoZW4ganVzdCBgbnVtJy4KCiAgICAgSWYgU1RSIGlzIGBOVUxMJywgdGhlIHJlc3VsdCBzdHJpbmcgaXMgYWxsb2NhdGVkIHVzaW5nIHRoZSBjdXJyZW50CiAgICAgYWxsb2NhdGlvbiBmdW5jdGlvbiAoKm5vdGUgQ3VzdG9tIEFsbG9jYXRpb246OikuICBUaGUgYmxvY2sgd2lsbCBiZQogICAgIGBzdHJsZW4oc3RyKSsxJyBieXRlcywgdGhhdCBiZWluZyBleGFjdGx5IGVub3VnaCBmb3IgdGhlIHN0cmluZyBhbmQKICAgICBudWxsLXRlcm1pbmF0b3IuCgogICAgIElmIFNUUiBpcyBub3QgYE5VTEwnLCBpdCBzaG91bGQgcG9pbnQgdG8gYSBibG9jayBvZiBzdG9yYWdlIGxhcmdlCiAgICAgZW5vdWdoIGZvciB0aGUgcmVzdWx0LCB0aGF0IGJlaW5nCgogICAgICAgICAgbXB6X3NpemVpbmJhc2UgKG1wcV9udW1yZWYoT1ApLCBCQVNFKQogICAgICAgICAgKyBtcHpfc2l6ZWluYmFzZSAobXBxX2RlbnJlZihPUCksIEJBU0UpICsgMwoKICAgICBUaGUgdGhyZWUgZXh0cmEgYnl0ZXMgYXJlIGZvciBhIHBvc3NpYmxlIG1pbnVzIHNpZ24sIHBvc3NpYmxlCiAgICAgc2xhc2gsIGFuZCB0aGUgbnVsbC10ZXJtaW5hdG9yLgoKICAgICBBIHBvaW50ZXIgdG8gdGhlIHJlc3VsdCBzdHJpbmcgaXMgcmV0dXJuZWQsIGJlaW5nIGVpdGhlciB0aGUKICAgICBhbGxvY2F0ZWQgYmxvY2ssIG9yIHRoZSBnaXZlbiBTVFIuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogUmF0aW9uYWwgQXJpdGhtZXRpYywgIE5leHQ6IENvbXBhcmluZyBSYXRpb25hbHMsICBQcmV2OiBSYXRpb25hbCBDb252ZXJzaW9ucywgIFVwOiBSYXRpb25hbCBOdW1iZXIgRnVuY3Rpb25zCgo2LjMgQXJpdGhtZXRpYyBGdW5jdGlvbnMKPT09PT09PT09PT09PT09PT09PT09PT09CgogLS0gRnVuY3Rpb246IHZvaWQgbXBxX2FkZCAobXBxX3QgU1VNLCBjb25zdCBtcHFfdCBBRERFTkQxLCBjb25zdCBtcHFfdAogICAgICAgICAgQURERU5EMikKICAgICBTZXQgU1VNIHRvIEFEREVORDEgKyBBRERFTkQyLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wcV9zdWIgKG1wcV90IERJRkZFUkVOQ0UsIGNvbnN0IG1wcV90IE1JTlVFTkQsCiAgICAgICAgICBjb25zdCBtcHFfdCBTVUJUUkFIRU5EKQogICAgIFNldCBESUZGRVJFTkNFIHRvIE1JTlVFTkQgLSBTVUJUUkFIRU5ELgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wcV9tdWwgKG1wcV90IFBST0RVQ1QsIGNvbnN0IG1wcV90IE1VTFRJUExJRVIsCiAgICAgICAgICBjb25zdCBtcHFfdCBNVUxUSVBMSUNBTkQpCiAgICAgU2V0IFBST0RVQ1QgdG8gTVVMVElQTElFUiB0aW1lcyBNVUxUSVBMSUNBTkQuCgogLS0gRnVuY3Rpb246IHZvaWQgbXBxX211bF8yZXhwIChtcHFfdCBST1AsIGNvbnN0IG1wcV90IE9QMSwKICAgICAgICAgIG1wX2JpdGNudF90IE9QMikKICAgICBTZXQgUk9QIHRvIE9QMSB0aW1lcyAyIHJhaXNlZCB0byBPUDIuCgogLS0gRnVuY3Rpb246IHZvaWQgbXBxX2RpdiAobXBxX3QgUVVPVElFTlQsIGNvbnN0IG1wcV90IERJVklERU5ELCBjb25zdAogICAgICAgICAgbXBxX3QgRElWSVNPUikKICAgICBTZXQgUVVPVElFTlQgdG8gRElWSURFTkQvRElWSVNPUi4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHFfZGl2XzJleHAgKG1wcV90IFJPUCwgY29uc3QgbXBxX3QgT1AxLAogICAgICAgICAgbXBfYml0Y250X3QgT1AyKQogICAgIFNldCBST1AgdG8gT1AxIGRpdmlkZWQgYnkgMiByYWlzZWQgdG8gT1AyLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wcV9uZWcgKG1wcV90IE5FR0FURURfT1BFUkFORCwgY29uc3QgbXBxX3QgT1BFUkFORCkKICAgICBTZXQgTkVHQVRFRF9PUEVSQU5EIHRvIC1PUEVSQU5ELgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wcV9hYnMgKG1wcV90IFJPUCwgY29uc3QgbXBxX3QgT1ApCiAgICAgU2V0IFJPUCB0byB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgT1AuCgogLS0gRnVuY3Rpb246IHZvaWQgbXBxX2ludiAobXBxX3QgSU5WRVJURURfTlVNQkVSLCBjb25zdCBtcHFfdCBOVU1CRVIpCiAgICAgU2V0IElOVkVSVEVEX05VTUJFUiB0byAxL05VTUJFUi4gIElmIHRoZSBuZXcgZGVub21pbmF0b3IgaXMgemVybywKICAgICB0aGlzIHJvdXRpbmUgd2lsbCBkaXZpZGUgYnkgemVyby4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBDb21wYXJpbmcgUmF0aW9uYWxzLCAgTmV4dDogQXBwbHlpbmcgSW50ZWdlciBGdW5jdGlvbnMsICBQcmV2OiBSYXRpb25hbCBBcml0aG1ldGljLCAgVXA6IFJhdGlvbmFsIE51bWJlciBGdW5jdGlvbnMKCjYuNCBDb21wYXJpc29uIEZ1bmN0aW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT0KCiAtLSBGdW5jdGlvbjogaW50IG1wcV9jbXAgKGNvbnN0IG1wcV90IE9QMSwgY29uc3QgbXBxX3QgT1AyKQogICAgIENvbXBhcmUgT1AxIGFuZCBPUDIuICBSZXR1cm4gYSBwb3NpdGl2ZSB2YWx1ZSBpZiBPUDEgPiBPUDIsIHplcm8KICAgICBpZiBPUDEgPSBPUDIsIGFuZCBhIG5lZ2F0aXZlIHZhbHVlIGlmIE9QMSA8IE9QMi4KCiAgICAgVG8gZGV0ZXJtaW5lIGlmIHR3byByYXRpb25hbHMgYXJlIGVxdWFsLCBgbXBxX2VxdWFsJyBpcyBmYXN0ZXIgdGhhbgogICAgIGBtcHFfY21wJy4KCiAtLSBNYWNybzogaW50IG1wcV9jbXBfdWkgKGNvbnN0IG1wcV90IE9QMSwgdW5zaWduZWQgbG9uZyBpbnQgTlVNMiwKICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IERFTjIpCiAtLSBNYWNybzogaW50IG1wcV9jbXBfc2kgKGNvbnN0IG1wcV90IE9QMSwgbG9uZyBpbnQgTlVNMiwgdW5zaWduZWQKICAgICAgICAgIGxvbmcgaW50IERFTjIpCiAgICAgQ29tcGFyZSBPUDEgYW5kIE5VTTIvREVOMi4gIFJldHVybiBhIHBvc2l0aXZlIHZhbHVlIGlmIE9QMSA+CiAgICAgTlVNMi9ERU4yLCB6ZXJvIGlmIE9QMSA9IE5VTTIvREVOMiwgYW5kIGEgbmVnYXRpdmUgdmFsdWUgaWYgT1AxIDwKICAgICBOVU0yL0RFTjIuCgogICAgIE5VTTIgYW5kIERFTjIgYXJlIGFsbG93ZWQgdG8gaGF2ZSBjb21tb24gZmFjdG9ycy4KCiAgICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvcyBhbmQgZXZhbHVhdGUgdGhlaXIKICAgICBhcmd1bWVudHMgbXVsdGlwbGUgdGltZXMuCgogLS0gTWFjcm86IGludCBtcHFfc2duIChjb25zdCBtcHFfdCBPUCkKICAgICBSZXR1cm4gKzEgaWYgT1AgPiAwLCAwIGlmIE9QID0gMCwgYW5kIC0xIGlmIE9QIDwgMC4KCiAgICAgVGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvLiAgSXQgZXZhbHVhdGVzIGl0cwogICAgIGFyZ3VtZW50IG11bHRpcGxlIHRpbWVzLgoKIC0tIEZ1bmN0aW9uOiBpbnQgbXBxX2VxdWFsIChjb25zdCBtcHFfdCBPUDEsIGNvbnN0IG1wcV90IE9QMikKICAgICBSZXR1cm4gbm9uLXplcm8gaWYgT1AxIGFuZCBPUDIgYXJlIGVxdWFsLCB6ZXJvIGlmIHRoZXkgYXJlCiAgICAgbm9uLWVxdWFsLiAgQWx0aG91Z2ggYG1wcV9jbXAnIGNhbiBiZSB1c2VkIGZvciB0aGUgc2FtZSBwdXJwb3NlLAogICAgIHRoaXMgZnVuY3Rpb24gaXMgbXVjaCBmYXN0ZXIuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogQXBwbHlpbmcgSW50ZWdlciBGdW5jdGlvbnMsICBOZXh0OiBJL08gb2YgUmF0aW9uYWxzLCAgUHJldjogQ29tcGFyaW5nIFJhdGlvbmFscywgIFVwOiBSYXRpb25hbCBOdW1iZXIgRnVuY3Rpb25zCgo2LjUgQXBwbHlpbmcgSW50ZWdlciBGdW5jdGlvbnMgdG8gUmF0aW9uYWxzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSBzZXQgb2YgYG1wcScgZnVuY3Rpb25zIGlzIHF1aXRlIHNtYWxsLiAgSW4gcGFydGljdWxhciwgdGhlcmUgYXJlIGZldwpmdW5jdGlvbnMgZm9yIGVpdGhlciBpbnB1dCBvciBvdXRwdXQuICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBnaXZlCmRpcmVjdCBhY2Nlc3MgdG8gdGhlIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3Igb2YgYW4gYG1wcV90Jy4KCiAgIE5vdGUgdGhhdCBpZiBhbiBhc3NpZ25tZW50IHRvIHRoZSBudW1lcmF0b3IgYW5kL29yIGRlbm9taW5hdG9yIGNvdWxkCnRha2UgYW4gYG1wcV90JyBvdXQgb2YgdGhlIGNhbm9uaWNhbCBmb3JtIGRlc2NyaWJlZCBhdCB0aGUgc3RhcnQgb2YKdGhpcyBjaGFwdGVyICgqbm90ZSBSYXRpb25hbCBOdW1iZXIgRnVuY3Rpb25zOjopIHRoZW4KYG1wcV9jYW5vbmljYWxpemUnIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgYG1wcScgZnVuY3Rpb25zIGFyZQphcHBsaWVkIHRvIHRoYXQgYG1wcV90Jy4KCiAtLSBNYWNybzogbXB6X3QgbXBxX251bXJlZiAoY29uc3QgbXBxX3QgT1ApCiAtLSBNYWNybzogbXB6X3QgbXBxX2RlbnJlZiAoY29uc3QgbXBxX3QgT1ApCiAgICAgUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIG9mIE9QLAogICAgIHJlc3BlY3RpdmVseS4gIFRoZSBgbXB6JyBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgb24gdGhlIHJlc3VsdCBvZgogICAgIHRoZXNlIG1hY3Jvcy4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHFfZ2V0X251bSAobXB6X3QgTlVNRVJBVE9SLCBjb25zdCBtcHFfdCBSQVRJT05BTCkKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wcV9nZXRfZGVuIChtcHpfdCBERU5PTUlOQVRPUiwgY29uc3QgbXBxX3QgUkFUSU9OQUwpCiAtLSBGdW5jdGlvbjogdm9pZCBtcHFfc2V0X251bSAobXBxX3QgUkFUSU9OQUwsIGNvbnN0IG1wel90IE5VTUVSQVRPUikKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wcV9zZXRfZGVuIChtcHFfdCBSQVRJT05BTCwgY29uc3QgbXB6X3QgREVOT01JTkFUT1IpCiAgICAgR2V0IG9yIHNldCB0aGUgbnVtZXJhdG9yIG9yIGRlbm9taW5hdG9yIG9mIGEgcmF0aW9uYWwuICBUaGVzZQogICAgIGZ1bmN0aW9ucyBhcmUgZXF1aXZhbGVudCB0byBjYWxsaW5nIGBtcHpfc2V0JyB3aXRoIGFuIGFwcHJvcHJpYXRlCiAgICAgYG1wcV9udW1yZWYnIG9yIGBtcHFfZGVucmVmJy4gIERpcmVjdCB1c2Ugb2YgYG1wcV9udW1yZWYnIG9yCiAgICAgYG1wcV9kZW5yZWYnIGlzIHJlY29tbWVuZGVkIGluc3RlYWQgb2YgdGhlc2UgZnVuY3Rpb25zLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEkvTyBvZiBSYXRpb25hbHMsICBQcmV2OiBBcHBseWluZyBJbnRlZ2VyIEZ1bmN0aW9ucywgIFVwOiBSYXRpb25hbCBOdW1iZXIgRnVuY3Rpb25zCgo2LjYgSW5wdXQgYW5kIE91dHB1dCBGdW5jdGlvbnMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpGdW5jdGlvbnMgdGhhdCBwZXJmb3JtIGlucHV0IGZyb20gYSBzdGRpbyBzdHJlYW0sIGFuZCBmdW5jdGlvbnMgdGhhdApvdXRwdXQgdG8gYSBzdGRpbyBzdHJlYW0sIG9mIGBtcHEnIG51bWJlcnMuICBQYXNzaW5nIGEgYE5VTEwnIHBvaW50ZXIKZm9yIGEgU1RSRUFNIGFyZ3VtZW50IHRvIGFueSBvZiB0aGVzZSBmdW5jdGlvbnMgd2lsbCBtYWtlIHRoZW0gcmVhZCBmcm9tCmBzdGRpbicgYW5kIHdyaXRlIHRvIGBzdGRvdXQnLCByZXNwZWN0aXZlbHkuCgogICBXaGVuIHVzaW5nIGFueSBvZiB0aGVzZSBmdW5jdGlvbnMsIGl0IGlzIGEgZ29vZCBpZGVhIHRvIGluY2x1ZGUKYHN0ZGlvLmgnIGJlZm9yZSBgZ21wLmgnLCBzaW5jZSB0aGF0IHdpbGwgYWxsb3cgYGdtcC5oJyB0byBkZWZpbmUKcHJvdG90eXBlcyBmb3IgdGhlc2UgZnVuY3Rpb25zLgoKICAgU2VlIGFsc28gKm5vdGUgRm9ybWF0dGVkIE91dHB1dDo6IGFuZCAqbm90ZSBGb3JtYXR0ZWQgSW5wdXQ6Oi4KCiAtLSBGdW5jdGlvbjogc2l6ZV90IG1wcV9vdXRfc3RyIChGSUxFICpTVFJFQU0sIGludCBCQVNFLCBjb25zdCBtcHFfdAogICAgICAgICAgT1ApCiAgICAgT3V0cHV0IE9QIG9uIHN0ZGlvIHN0cmVhbSBTVFJFQU0sIGFzIGEgc3RyaW5nIG9mIGRpZ2l0cyBpbiBiYXNlCiAgICAgQkFTRS4gIFRoZSBiYXNlIG1heSB2YXJ5IGZyb20gMiB0byAzNi4gIE91dHB1dCBpcyBpbiB0aGUgZm9ybQogICAgIGBudW0vZGVuJyBvciBpZiB0aGUgZGVub21pbmF0b3IgaXMgMSB0aGVuIGp1c3QgYG51bScuCgogICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIG9yIGlmIGFuIGVycm9yIG9jY3VycmVkLAogICAgIHJldHVybiAwLgoKIC0tIEZ1bmN0aW9uOiBzaXplX3QgbXBxX2lucF9zdHIgKG1wcV90IFJPUCwgRklMRSAqU1RSRUFNLCBpbnQgQkFTRSkKICAgICBSZWFkIGEgc3RyaW5nIG9mIGRpZ2l0cyBmcm9tIFNUUkVBTSBhbmQgY29udmVydCB0aGVtIHRvIGEgcmF0aW9uYWwKICAgICBpbiBST1AuICBBbnkgaW5pdGlhbCB3aGl0ZS1zcGFjZSBjaGFyYWN0ZXJzIGFyZSByZWFkIGFuZAogICAgIGRpc2NhcmRlZC4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCAoaW5jbHVkaW5nIHdoaXRlCiAgICAgc3BhY2UpLCBvciAwIGlmIGEgcmF0aW9uYWwgY291bGQgbm90IGJlIHJlYWQuCgogICAgIFRoZSBpbnB1dCBjYW4gYmUgYSBmcmFjdGlvbiBsaWtlIGAxNy82Mycgb3IganVzdCBhbiBpbnRlZ2VyIGxpa2UKICAgICBgMTIzJy4gIFJlYWRpbmcgc3RvcHMgYXQgdGhlIGZpcnN0IGNoYXJhY3RlciBub3QgaW4gdGhpcyBmb3JtLCBhbmQKICAgICB3aGl0ZSBzcGFjZSBpcyBub3QgcGVybWl0dGVkIHdpdGhpbiB0aGUgc3RyaW5nLiAgSWYgdGhlIGlucHV0CiAgICAgbWlnaHQgbm90IGJlIGluIGNhbm9uaWNhbCBmb3JtLCB0aGVuIGBtcHFfY2Fub25pY2FsaXplJyBtdXN0IGJlCiAgICAgY2FsbGVkICgqbm90ZSBSYXRpb25hbCBOdW1iZXIgRnVuY3Rpb25zOjopLgoKICAgICBUaGUgQkFTRSBjYW4gYmUgYmV0d2VlbiAyIGFuZCAzNiwgb3IgY2FuIGJlIDAgaW4gd2hpY2ggY2FzZSB0aGUKICAgICBsZWFkaW5nIGNoYXJhY3RlcnMgb2YgdGhlIHN0cmluZyBkZXRlcm1pbmUgdGhlIGJhc2UsIGAweCcgb3IgYDBYJwogICAgIGZvciBoZXhhZGVjaW1hbCwgYDAnIGZvciBvY3RhbCwgb3IgZGVjaW1hbCBvdGhlcndpc2UuICBUaGUgbGVhZGluZwogICAgIGNoYXJhY3RlcnMgYXJlIGV4YW1pbmVkIHNlcGFyYXRlbHkgZm9yIHRoZSBudW1lcmF0b3IgYW5kCiAgICAgZGVub21pbmF0b3Igb2YgYSBmcmFjdGlvbiwgc28gZm9yIGluc3RhbmNlIGAweDEwLzExJyBpcyAxNi8xMSwKICAgICB3aGVyZWFzIGAweDEwLzB4MTEnIGlzIDE2LzE3LgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEZsb2F0aW5nLXBvaW50IEZ1bmN0aW9ucywgIE5leHQ6IExvdy1sZXZlbCBGdW5jdGlvbnMsICBQcmV2OiBSYXRpb25hbCBOdW1iZXIgRnVuY3Rpb25zLCAgVXA6IFRvcAoKNyBGbG9hdGluZy1wb2ludCBGdW5jdGlvbnMKKioqKioqKioqKioqKioqKioqKioqKioqKioKCkdNUCBmbG9hdGluZyBwb2ludCBudW1iZXJzIGFyZSBzdG9yZWQgaW4gb2JqZWN0cyBvZiB0eXBlIGBtcGZfdCcgYW5kCmZ1bmN0aW9ucyBvcGVyYXRpbmcgb24gdGhlbSBoYXZlIGFuIGBtcGZfJyBwcmVmaXguCgogICBUaGUgbWFudGlzc2Egb2YgZWFjaCBmbG9hdCBoYXMgYSB1c2VyLXNlbGVjdGFibGUgcHJlY2lzaW9uLCBsaW1pdGVkCm9ubHkgYnkgYXZhaWxhYmxlIG1lbW9yeS4gIEVhY2ggdmFyaWFibGUgaGFzIGl0cyBvd24gcHJlY2lzaW9uLCBhbmQKdGhhdCBjYW4gYmUgaW5jcmVhc2VkIG9yIGRlY3JlYXNlZCBhdCBhbnkgdGltZS4KCiAgIFRoZSBleHBvbmVudCBvZiBlYWNoIGZsb2F0IGlzIGEgZml4ZWQgcHJlY2lzaW9uLCBvbmUgbWFjaGluZSB3b3JkIG9uCm1vc3Qgc3lzdGVtcy4gIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHRoZSBleHBvbmVudCBpcyBhIGNvdW50IG9mCmxpbWJzLCBzbyBmb3IgZXhhbXBsZSBvbiBhIDMyLWJpdCBzeXN0ZW0gdGhpcyBtZWFucyBhIHJhbmdlIG9mIHJvdWdobHkKMl4tNjg3MTk0NzY3NjggdG8gMl42ODcxOTQ3NjczNiwgb3Igb24gYSA2NC1iaXQgc3lzdGVtIHRoaXMgd2lsbCBiZQpncmVhdGVyLiAgTm90ZSBob3dldmVyIHRoYXQgYG1wZl9nZXRfc3RyJyBjYW4gb25seSByZXR1cm4gYW4gZXhwb25lbnQKd2hpY2ggZml0cyBhbiBgbXBfZXhwX3QnIGFuZCBjdXJyZW50bHkgYG1wZl9zZXRfc3RyJyBkb2Vzbid0IGFjY2VwdApleHBvbmVudHMgYmlnZ2VyIHRoYW4gYSBgbG9uZycuCgogICBFYWNoIHZhcmlhYmxlIGtlZXBzIGEgc2l6ZSBmb3IgdGhlIG1hbnRpc3NhIGRhdGEgYWN0dWFsbHkgaW4gdXNlLgpUaGlzIG1lYW5zIHRoYXQgaWYgYSBmbG9hdCBpcyBleGFjdGx5IHJlcHJlc2VudGVkIGluIG9ubHkgYSBmZXcgYml0cwp0aGVuIG9ubHkgdGhvc2UgYml0cyB3aWxsIGJlIHVzZWQgaW4gYSBjYWxjdWxhdGlvbiwgZXZlbiBpZiB0aGUKc2VsZWN0ZWQgcHJlY2lzaW9uIGlzIGhpZ2guCgogICBBbGwgY2FsY3VsYXRpb25zIGFyZSBwZXJmb3JtZWQgdG8gdGhlIHByZWNpc2lvbiBvZiB0aGUgZGVzdGluYXRpb24KdmFyaWFibGUuICBFYWNoIGZ1bmN0aW9uIGlzIGRlZmluZWQgdG8gY2FsY3VsYXRlIHdpdGggImluZmluaXRlCnByZWNpc2lvbiIgZm9sbG93ZWQgYnkgYSB0cnVuY2F0aW9uIHRvIHRoZSBkZXN0aW5hdGlvbiBwcmVjaXNpb24sIGJ1dApvZiBjb3Vyc2UgdGhlIHdvcmsgZG9uZSBpcyBvbmx5IHdoYXQncyBuZWVkZWQgdG8gZGV0ZXJtaW5lIGEgcmVzdWx0CnVuZGVyIHRoYXQgZGVmaW5pdGlvbi4KCiAgIFRoZSBwcmVjaXNpb24gc2VsZWN0ZWQgYnkgdGhlIHVzZXIgZm9yIGEgdmFyaWFibGUgaXMgYSBtaW5pbXVtCnZhbHVlLCBHTVAgbWF5IGluY3JlYXNlIGl0IHRvIGZhY2lsaXRhdGUgZWZmaWNpZW50IGNhbGN1bGF0aW9uLgpDdXJyZW50bHkgdGhpcyBtZWFucyByb3VuZGluZyB1cCB0byBhIHdob2xlIGxpbWIsIGFuZCB0aGVuIHNvbWV0aW1lcwpoYXZpbmcgYSBmdXJ0aGVyIHBhcnRpYWwgbGltYiwgZGVwZW5kaW5nIG9uIHRoZSBoaWdoIGxpbWIgb2YgdGhlCm1hbnRpc3NhLgoKICAgVGhlIG1hbnRpc3NhIGlzIHN0b3JlZCBpbiBiaW5hcnkuICBPbmUgY29uc2VxdWVuY2Ugb2YgdGhpcyBpcyB0aGF0CmRlY2ltYWwgZnJhY3Rpb25zIGxpa2UgMC4xIGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5LiAgVGhlIHNhbWUgaXMKdHJ1ZSBvZiBwbGFpbiBJRUVFIGBkb3VibGUnIGZsb2F0cy4gIFRoaXMgbWFrZXMgYm90aCBoaWdobHkgdW5zdWl0YWJsZQpmb3IgY2FsY3VsYXRpb25zIGludm9sdmluZyBtb25leSBvciBvdGhlciB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgZXhhY3QKZGVjaW1hbCBmcmFjdGlvbnMuICAoU3VpdGFibHkgc2NhbGVkIGludGVnZXJzLCBvciBwZXJoYXBzIHJhdGlvbmFscywKYXJlIGJldHRlciBjaG9pY2VzLikKCiAgIFRoZSBgbXBmJyBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBoYXZlIG5vIHNwZWNpYWwgbm90aW9uIG9mIGluZmluaXR5Cm9yIG5vdC1hLW51bWJlciwgYW5kIGFwcGxpY2F0aW9ucyBtdXN0IHRha2UgY2FyZSBub3QgdG8gb3ZlcmZsb3cgdGhlCmV4cG9uZW50IG9yIHJlc3VsdHMgd2lsbCBiZSB1bnByZWRpY3RhYmxlLiAgVGhpcyBtaWdodCBjaGFuZ2UgaW4gYQpmdXR1cmUgcmVsZWFzZS4KCiAgIE5vdGUgdGhhdCB0aGUgYG1wZicgZnVuY3Rpb25zIGFyZSBfbm90XyBpbnRlbmRlZCBhcyBhIHNtb290aApleHRlbnNpb24gdG8gSUVFRSBQNzU0IGFyaXRobWV0aWMuICBJbiBwYXJ0aWN1bGFyIHJlc3VsdHMgb2J0YWluZWQgb24Kb25lIGNvbXB1dGVyIG9mdGVuIGRpZmZlciBmcm9tIHRoZSByZXN1bHRzIG9uIGEgY29tcHV0ZXIgd2l0aCBhCmRpZmZlcmVudCB3b3JkIHNpemUuCgogICBUaGUgR01QIGV4dGVuc2lvbiBsaWJyYXJ5IE1QRlIgKGBodHRwOi8vbXBmci5vcmcnKSBpcyBhbiBhbHRlcm5hdGl2ZQp0byBHTVAncyBgbXBmJyBmdW5jdGlvbnMuICBNUEZSIHByb3ZpZGVzIHdlbGwtZGVmaW5lZCBwcmVjaXNpb24gYW5kCmFjY3VyYXRlIHJvdW5kaW5nLCBhbmQgdGhlcmVieSBuYXR1cmFsbHkgZXh0ZW5kcyBJRUVFIFA3NTQuCgoqIE1lbnU6CgoqIEluaXRpYWxpemluZyBGbG9hdHM6OgoqIEFzc2lnbmluZyBGbG9hdHM6OgoqIFNpbXVsdGFuZW91cyBGbG9hdCBJbml0ICYgQXNzaWduOjoKKiBDb252ZXJ0aW5nIEZsb2F0czo6CiogRmxvYXQgQXJpdGhtZXRpYzo6CiogRmxvYXQgQ29tcGFyaXNvbjo6CiogSS9PIG9mIEZsb2F0czo6CiogTWlzY2VsbGFuZW91cyBGbG9hdCBGdW5jdGlvbnM6OgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEluaXRpYWxpemluZyBGbG9hdHMsICBOZXh0OiBBc3NpZ25pbmcgRmxvYXRzLCAgUHJldjogRmxvYXRpbmctcG9pbnQgRnVuY3Rpb25zLCAgVXA6IEZsb2F0aW5nLXBvaW50IEZ1bmN0aW9ucwoKNy4xIEluaXRpYWxpemF0aW9uIEZ1bmN0aW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogLS0gRnVuY3Rpb246IHZvaWQgbXBmX3NldF9kZWZhdWx0X3ByZWMgKG1wX2JpdGNudF90IFBSRUMpCiAgICAgU2V0IHRoZSBkZWZhdWx0IHByZWNpc2lvbiB0byBiZSAqYXQgbGVhc3QqIFBSRUMgYml0cy4gIEFsbAogICAgIHN1YnNlcXVlbnQgY2FsbHMgdG8gYG1wZl9pbml0JyB3aWxsIHVzZSB0aGlzIHByZWNpc2lvbiwgYnV0CiAgICAgcHJldmlvdXNseSBpbml0aWFsaXplZCB2YXJpYWJsZXMgYXJlIHVuYWZmZWN0ZWQuCgogLS0gRnVuY3Rpb246IG1wX2JpdGNudF90IG1wZl9nZXRfZGVmYXVsdF9wcmVjICh2b2lkKQogICAgIFJldHVybiB0aGUgZGVmYXVsdCBwcmVjaXNpb24gYWN0dWFsbHkgdXNlZC4KCiAgIEFuIGBtcGZfdCcgb2JqZWN0IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHN0b3JpbmcgdGhlIGZpcnN0IHZhbHVlCmluIGl0LiAgVGhlIGZ1bmN0aW9ucyBgbXBmX2luaXQnIGFuZCBgbXBmX2luaXQyJyBhcmUgdXNlZCBmb3IgdGhhdApwdXJwb3NlLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wZl9pbml0IChtcGZfdCBYKQogICAgIEluaXRpYWxpemUgWCB0byAwLiAgTm9ybWFsbHksIGEgdmFyaWFibGUgc2hvdWxkIGJlIGluaXRpYWxpemVkCiAgICAgb25jZSBvbmx5IG9yIGF0IGxlYXN0IGJlIGNsZWFyZWQsIHVzaW5nIGBtcGZfY2xlYXInLCBiZXR3ZWVuCiAgICAgaW5pdGlhbGl6YXRpb25zLiAgVGhlIHByZWNpc2lvbiBvZiBYIGlzIHVuZGVmaW5lZCB1bmxlc3MgYSBkZWZhdWx0CiAgICAgcHJlY2lzaW9uIGhhcyBhbHJlYWR5IGJlZW4gZXN0YWJsaXNoZWQgYnkgYSBjYWxsIHRvCiAgICAgYG1wZl9zZXRfZGVmYXVsdF9wcmVjJy4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcGZfaW5pdDIgKG1wZl90IFgsIG1wX2JpdGNudF90IFBSRUMpCiAgICAgSW5pdGlhbGl6ZSBYIHRvIDAgYW5kIHNldCBpdHMgcHJlY2lzaW9uIHRvIGJlICphdCBsZWFzdCogUFJFQwogICAgIGJpdHMuICBOb3JtYWxseSwgYSB2YXJpYWJsZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgb25jZSBvbmx5IG9yIGF0CiAgICAgbGVhc3QgYmUgY2xlYXJlZCwgdXNpbmcgYG1wZl9jbGVhcicsIGJldHdlZW4gaW5pdGlhbGl6YXRpb25zLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wZl9pbml0cyAobXBmX3QgWCwgLi4uKQogICAgIEluaXRpYWxpemUgYSBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBgbXBmX3QnIHZhcmlhYmxlcywgYW5kIHNldAogICAgIHRoZWlyIHZhbHVlcyB0byAwLiAgVGhlIHByZWNpc2lvbiBvZiB0aGUgaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGlzCiAgICAgdW5kZWZpbmVkIHVubGVzcyBhIGRlZmF1bHQgcHJlY2lzaW9uIGhhcyBhbHJlYWR5IGJlZW4gZXN0YWJsaXNoZWQKICAgICBieSBhIGNhbGwgdG8gYG1wZl9zZXRfZGVmYXVsdF9wcmVjJy4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcGZfY2xlYXIgKG1wZl90IFgpCiAgICAgRnJlZSB0aGUgc3BhY2Ugb2NjdXBpZWQgYnkgWC4gIE1ha2Ugc3VyZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gZm9yCiAgICAgYWxsIGBtcGZfdCcgdmFyaWFibGVzIHdoZW4geW91IGFyZSBkb25lIHdpdGggdGhlbS4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcGZfY2xlYXJzIChtcGZfdCBYLCAuLi4pCiAgICAgRnJlZSB0aGUgc3BhY2Ugb2NjdXBpZWQgYnkgYSBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBgbXBmX3QnCiAgICAgdmFyaWFibGVzLgoKICAgSGVyZSBpcyBhbiBleGFtcGxlIG9uIGhvdyB0byBpbml0aWFsaXplIGZsb2F0aW5nLXBvaW50IHZhcmlhYmxlczoKICAgICB7CiAgICAgICBtcGZfdCB4LCB5OwogICAgICAgbXBmX2luaXQgKHgpOyAgICAgICAgICAgLyogdXNlIGRlZmF1bHQgcHJlY2lzaW9uICovCiAgICAgICBtcGZfaW5pdDIgKHksIDI1Nik7ICAgICAvKiBwcmVjaXNpb24gX2F0IGxlYXN0XyAyNTYgYml0cyAqLwogICAgICAgLi4uCiAgICAgICAvKiBVbmxlc3MgdGhlIHByb2dyYW0gaXMgYWJvdXQgdG8gZXhpdCwgZG8gLi4uICovCiAgICAgICBtcGZfY2xlYXIgKHgpOwogICAgICAgbXBmX2NsZWFyICh5KTsKICAgICB9CgogICBUaGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucyBhcmUgdXNlZnVsIGZvciBjaGFuZ2luZyB0aGUgcHJlY2lzaW9uCmR1cmluZyBhIGNhbGN1bGF0aW9uLiAgQSB0eXBpY2FsIHVzZSB3b3VsZCBiZSBmb3IgYWRqdXN0aW5nIHRoZQpwcmVjaXNpb24gZ3JhZHVhbGx5IGluIGl0ZXJhdGl2ZSBhbGdvcml0aG1zIGxpa2UgTmV3dG9uLVJhcGhzb24sIG1ha2luZwp0aGUgY29tcHV0YXRpb24gcHJlY2lzaW9uIGNsb3NlbHkgbWF0Y2ggdGhlIGFjdHVhbCBhY2N1cmF0ZSBwYXJ0IG9mIHRoZQpudW1iZXJzLgoKIC0tIEZ1bmN0aW9uOiBtcF9iaXRjbnRfdCBtcGZfZ2V0X3ByZWMgKGNvbnN0IG1wZl90IE9QKQogICAgIFJldHVybiB0aGUgY3VycmVudCBwcmVjaXNpb24gb2YgT1AsIGluIGJpdHMuCgogLS0gRnVuY3Rpb246IHZvaWQgbXBmX3NldF9wcmVjIChtcGZfdCBST1AsIG1wX2JpdGNudF90IFBSRUMpCiAgICAgU2V0IHRoZSBwcmVjaXNpb24gb2YgUk9QIHRvIGJlICphdCBsZWFzdCogUFJFQyBiaXRzLiAgVGhlIHZhbHVlIGluCiAgICAgUk9QIHdpbGwgYmUgdHJ1bmNhdGVkIHRvIHRoZSBuZXcgcHJlY2lzaW9uLgoKICAgICBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIGEgY2FsbCB0byBgcmVhbGxvYycsIGFuZCBzbyBzaG91bGQgbm90IGJlCiAgICAgdXNlZCBpbiBhIHRpZ2h0IGxvb3AuCgogLS0gRnVuY3Rpb246IHZvaWQgbXBmX3NldF9wcmVjX3JhdyAobXBmX3QgUk9QLCBtcF9iaXRjbnRfdCBQUkVDKQogICAgIFNldCB0aGUgcHJlY2lzaW9uIG9mIFJPUCB0byBiZSAqYXQgbGVhc3QqIFBSRUMgYml0cywgd2l0aG91dAogICAgIGNoYW5naW5nIHRoZSBtZW1vcnkgYWxsb2NhdGVkLgoKICAgICBQUkVDIG11c3QgYmUgbm8gbW9yZSB0aGFuIHRoZSBhbGxvY2F0ZWQgcHJlY2lzaW9uIGZvciBST1AsIHRoYXQKICAgICBiZWluZyB0aGUgcHJlY2lzaW9uIHdoZW4gUk9QIHdhcyBpbml0aWFsaXplZCwgb3IgaW4gdGhlIG1vc3QgcmVjZW50CiAgICAgYG1wZl9zZXRfcHJlYycuCgogICAgIFRoZSB2YWx1ZSBpbiBST1AgaXMgdW5jaGFuZ2VkLCBhbmQgaW4gcGFydGljdWxhciBpZiBpdCBoYWQgYSBoaWdoZXIKICAgICBwcmVjaXNpb24gdGhhbiBQUkVDIGl0IHdpbGwgcmV0YWluIHRoYXQgaGlnaGVyIHByZWNpc2lvbi4gIE5ldwogICAgIHZhbHVlcyB3cml0dGVuIHRvIFJPUCB3aWxsIHVzZSB0aGUgbmV3IFBSRUMuCgogICAgIEJlZm9yZSBjYWxsaW5nIGBtcGZfY2xlYXInIG9yIHRoZSBmdWxsIGBtcGZfc2V0X3ByZWMnLCBhbm90aGVyCiAgICAgYG1wZl9zZXRfcHJlY19yYXcnIGNhbGwgbXVzdCBiZSBtYWRlIHRvIHJlc3RvcmUgUk9QIHRvIGl0cyBvcmlnaW5hbAogICAgIGFsbG9jYXRlZCBwcmVjaXNpb24uICBGYWlsaW5nIHRvIGRvIHNvIHdpbGwgaGF2ZSB1bnByZWRpY3RhYmxlCiAgICAgcmVzdWx0cy4KCiAgICAgYG1wZl9nZXRfcHJlYycgY2FuIGJlIHVzZWQgYmVmb3JlIGBtcGZfc2V0X3ByZWNfcmF3JyB0byBnZXQgdGhlCiAgICAgb3JpZ2luYWwgYWxsb2NhdGVkIHByZWNpc2lvbi4gIEFmdGVyIGBtcGZfc2V0X3ByZWNfcmF3JyBpdAogICAgIHJlZmxlY3RzIHRoZSBQUkVDIHZhbHVlIHNldC4KCiAgICAgYG1wZl9zZXRfcHJlY19yYXcnIGlzIGFuIGVmZmljaWVudCB3YXkgdG8gdXNlIGFuIGBtcGZfdCcgdmFyaWFibGUKICAgICBhdCBkaWZmZXJlbnQgcHJlY2lzaW9ucyBkdXJpbmcgYSBjYWxjdWxhdGlvbiwgcGVyaGFwcyB0byBncmFkdWFsbHkKICAgICBpbmNyZWFzZSBwcmVjaXNpb24gaW4gYW4gaXRlcmF0aW9uLCBvciBqdXN0IHRvIHVzZSB2YXJpb3VzCiAgICAgZGlmZmVyZW50IHByZWNpc2lvbnMgZm9yIGRpZmZlcmVudCBwdXJwb3NlcyBkdXJpbmcgYSBjYWxjdWxhdGlvbi4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBBc3NpZ25pbmcgRmxvYXRzLCAgTmV4dDogU2ltdWx0YW5lb3VzIEZsb2F0IEluaXQgJiBBc3NpZ24sICBQcmV2OiBJbml0aWFsaXppbmcgRmxvYXRzLCAgVXA6IEZsb2F0aW5nLXBvaW50IEZ1bmN0aW9ucwoKNy4yIEFzc2lnbm1lbnQgRnVuY3Rpb25zCj09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlc2UgZnVuY3Rpb25zIGFzc2lnbiBuZXcgdmFsdWVzIHRvIGFscmVhZHkgaW5pdGlhbGl6ZWQgZmxvYXRzICgqbm90ZQpJbml0aWFsaXppbmcgRmxvYXRzOjopLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wZl9zZXQgKG1wZl90IFJPUCwgY29uc3QgbXBmX3QgT1ApCiAtLSBGdW5jdGlvbjogdm9pZCBtcGZfc2V0X3VpIChtcGZfdCBST1AsIHVuc2lnbmVkIGxvbmcgaW50IE9QKQogLS0gRnVuY3Rpb246IHZvaWQgbXBmX3NldF9zaSAobXBmX3QgUk9QLCBzaWduZWQgbG9uZyBpbnQgT1ApCiAtLSBGdW5jdGlvbjogdm9pZCBtcGZfc2V0X2QgKG1wZl90IFJPUCwgZG91YmxlIE9QKQogLS0gRnVuY3Rpb246IHZvaWQgbXBmX3NldF96IChtcGZfdCBST1AsIGNvbnN0IG1wel90IE9QKQogLS0gRnVuY3Rpb246IHZvaWQgbXBmX3NldF9xIChtcGZfdCBST1AsIGNvbnN0IG1wcV90IE9QKQogICAgIFNldCB0aGUgdmFsdWUgb2YgUk9QIGZyb20gT1AuCgogLS0gRnVuY3Rpb246IGludCBtcGZfc2V0X3N0ciAobXBmX3QgUk9QLCBjb25zdCBjaGFyICpTVFIsIGludCBCQVNFKQogICAgIFNldCB0aGUgdmFsdWUgb2YgUk9QIGZyb20gdGhlIHN0cmluZyBpbiBTVFIuICBUaGUgc3RyaW5nIGlzIG9mIHRoZQogICAgIGZvcm0gYE1ATicgb3IsIGlmIHRoZSBiYXNlIGlzIDEwIG9yIGxlc3MsIGFsdGVybmF0aXZlbHkgYE1lTicuCiAgICAgYE0nIGlzIHRoZSBtYW50aXNzYSBhbmQgYE4nIGlzIHRoZSBleHBvbmVudC4gIFRoZSBtYW50aXNzYSBpcwogICAgIGFsd2F5cyBpbiB0aGUgc3BlY2lmaWVkIGJhc2UuICBUaGUgZXhwb25lbnQgaXMgZWl0aGVyIGluIHRoZQogICAgIHNwZWNpZmllZCBiYXNlIG9yLCBpZiBCQVNFIGlzIG5lZ2F0aXZlLCBpbiBkZWNpbWFsLiAgVGhlIGRlY2ltYWwKICAgICBwb2ludCBleHBlY3RlZCBpcyB0YWtlbiBmcm9tIHRoZSBjdXJyZW50IGxvY2FsZSwgb24gc3lzdGVtcwogICAgIHByb3ZpZGluZyBgbG9jYWxlY29udicuCgogICAgIFRoZSBhcmd1bWVudCBCQVNFIG1heSBiZSBpbiB0aGUgcmFuZ2VzIDIgdG8gNjIsIG9yIC02MiB0byAtMi4KICAgICBOZWdhdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgdG8gc3BlY2lmeSB0aGF0IHRoZSBleHBvbmVudCBpcyBpbgogICAgIGRlY2ltYWwuCgogICAgIEZvciBiYXNlcyB1cCB0byAzNiwgY2FzZSBpcyBpZ25vcmVkOyB1cHBlci1jYXNlIGFuZCBsb3dlci1jYXNlCiAgICAgbGV0dGVycyBoYXZlIHRoZSBzYW1lIHZhbHVlOyBmb3IgYmFzZXMgMzcgdG8gNjIsIHVwcGVyLWNhc2UgbGV0dGVyCiAgICAgcmVwcmVzZW50IHRoZSB1c3VhbCAxMC4uMzUgd2hpbGUgbG93ZXItY2FzZSBsZXR0ZXIgcmVwcmVzZW50CiAgICAgMzYuLjYxLgoKICAgICBVbmxpa2UgdGhlIGNvcnJlc3BvbmRpbmcgYG1weicgZnVuY3Rpb24sIHRoZSBiYXNlIHdpbGwgbm90IGJlCiAgICAgZGV0ZXJtaW5lZCBmcm9tIHRoZSBsZWFkaW5nIGNoYXJhY3RlcnMgb2YgdGhlIHN0cmluZyBpZiBCQVNFIGlzIDAuCiAgICAgVGhpcyBpcyBzbyB0aGF0IG51bWJlcnMgbGlrZSBgMC4yMycgYXJlIG5vdCBpbnRlcnByZXRlZCBhcyBvY3RhbC4KCiAgICAgV2hpdGUgc3BhY2UgaXMgYWxsb3dlZCBpbiB0aGUgc3RyaW5nLCBhbmQgaXMgc2ltcGx5IGlnbm9yZWQuCiAgICAgW1RoaXMgaXMgbm90IHJlYWxseSB0cnVlOyB3aGl0ZS1zcGFjZSBpcyBpZ25vcmVkIGluIHRoZSBiZWdpbm5pbmcKICAgICBvZiB0aGUgc3RyaW5nIGFuZCB3aXRoaW4gdGhlIG1hbnRpc3NhLCBidXQgbm90IGluIG90aGVyIHBsYWNlcywKICAgICBzdWNoIGFzIGFmdGVyIGEgbWludXMgc2lnbiBvciBpbiB0aGUgZXhwb25lbnQuICBXZSBhcmUgY29uc2lkZXJpbmcKICAgICBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLCBtYWtpbmcgaXQgZmFpbCB3aGVuCiAgICAgdGhlcmUgaXMgYW55IHdoaXRlLXNwYWNlIGluIHRoZSBpbnB1dCwgc2luY2UgdGhhdCBtYWtlcyBhIGxvdCBvZgogICAgIHNlbnNlLiAgUGxlYXNlIHRlbGwgdXMgeW91ciBvcGluaW9uIGFib3V0IHRoaXMgY2hhbmdlLiAgRG8geW91CiAgICAgcmVhbGx5IHdhbnQgaXQgdG8gYWNjZXB0ICIzIDE0IiBhcyBtZWFuaW5nIDMxNCBhcyBpdCBkb2VzIG5vdz9dCgogICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAwIGlmIHRoZSBlbnRpcmUgc3RyaW5nIGlzIGEgdmFsaWQgbnVtYmVyIGluCiAgICAgYmFzZSBCQVNFLiAgT3RoZXJ3aXNlIGl0IHJldHVybnMgLTEuCgogLS0gRnVuY3Rpb246IHZvaWQgbXBmX3N3YXAgKG1wZl90IFJPUDEsIG1wZl90IFJPUDIpCiAgICAgU3dhcCBST1AxIGFuZCBST1AyIGVmZmljaWVudGx5LiAgQm90aCB0aGUgdmFsdWVzIGFuZCB0aGUKICAgICBwcmVjaXNpb25zIG9mIHRoZSB0d28gdmFyaWFibGVzIGFyZSBzd2FwcGVkLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IFNpbXVsdGFuZW91cyBGbG9hdCBJbml0ICYgQXNzaWduLCAgTmV4dDogQ29udmVydGluZyBGbG9hdHMsICBQcmV2OiBBc3NpZ25pbmcgRmxvYXRzLCAgVXA6IEZsb2F0aW5nLXBvaW50IEZ1bmN0aW9ucwoKNy4zIENvbWJpbmVkIEluaXRpYWxpemF0aW9uIGFuZCBBc3NpZ25tZW50IEZ1bmN0aW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpGb3IgY29udmVuaWVuY2UsIEdNUCBwcm92aWRlcyBhIHBhcmFsbGVsIHNlcmllcyBvZiBpbml0aWFsaXplLWFuZC1zZXQKZnVuY3Rpb25zIHdoaWNoIGluaXRpYWxpemUgdGhlIG91dHB1dCBhbmQgdGhlbiBzdG9yZSB0aGUgdmFsdWUgdGhlcmUuClRoZXNlIGZ1bmN0aW9ucycgbmFtZXMgaGF2ZSB0aGUgZm9ybSBgbXBmX2luaXRfc2V0Li4uJwoKICAgT25jZSB0aGUgZmxvYXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYnkgYW55IG9mIHRoZSBgbXBmX2luaXRfc2V0Li4uJwpmdW5jdGlvbnMsIGl0IGNhbiBiZSB1c2VkIGFzIHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gb3BlcmFuZCBmb3IgdGhlCm9yZGluYXJ5IGZsb2F0IGZ1bmN0aW9ucy4gIERvbid0IHVzZSBhbiBpbml0aWFsaXplLWFuZC1zZXQgZnVuY3Rpb24gb24KYSB2YXJpYWJsZSBhbHJlYWR5IGluaXRpYWxpemVkIQoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wZl9pbml0X3NldCAobXBmX3QgUk9QLCBjb25zdCBtcGZfdCBPUCkKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wZl9pbml0X3NldF91aSAobXBmX3QgUk9QLCB1bnNpZ25lZCBsb25nIGludCBPUCkKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wZl9pbml0X3NldF9zaSAobXBmX3QgUk9QLCBzaWduZWQgbG9uZyBpbnQgT1ApCiAtLSBGdW5jdGlvbjogdm9pZCBtcGZfaW5pdF9zZXRfZCAobXBmX3QgUk9QLCBkb3VibGUgT1ApCiAgICAgSW5pdGlhbGl6ZSBST1AgYW5kIHNldCBpdHMgdmFsdWUgZnJvbSBPUC4KCiAgICAgVGhlIHByZWNpc2lvbiBvZiBST1Agd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBhY3RpdmUgZGVmYXVsdAogICAgIHByZWNpc2lvbiwgYXMgc2V0IGJ5IGBtcGZfc2V0X2RlZmF1bHRfcHJlYycuCgogLS0gRnVuY3Rpb246IGludCBtcGZfaW5pdF9zZXRfc3RyIChtcGZfdCBST1AsIGNvbnN0IGNoYXIgKlNUUiwgaW50CiAgICAgICAgICBCQVNFKQogICAgIEluaXRpYWxpemUgUk9QIGFuZCBzZXQgaXRzIHZhbHVlIGZyb20gdGhlIHN0cmluZyBpbiBTVFIuICBTZWUKICAgICBgbXBmX3NldF9zdHInIGFib3ZlIGZvciBkZXRhaWxzIG9uIHRoZSBhc3NpZ25tZW50IG9wZXJhdGlvbi4KCiAgICAgTm90ZSB0aGF0IFJPUCBpcyBpbml0aWFsaXplZCBldmVuIGlmIGFuIGVycm9yIG9jY3Vycy4gIChJLmUuLCB5b3UKICAgICBoYXZlIHRvIGNhbGwgYG1wZl9jbGVhcicgZm9yIGl0LikKCiAgICAgVGhlIHByZWNpc2lvbiBvZiBST1Agd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBhY3RpdmUgZGVmYXVsdAogICAgIHByZWNpc2lvbiwgYXMgc2V0IGJ5IGBtcGZfc2V0X2RlZmF1bHRfcHJlYycuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogQ29udmVydGluZyBGbG9hdHMsICBOZXh0OiBGbG9hdCBBcml0aG1ldGljLCAgUHJldjogU2ltdWx0YW5lb3VzIEZsb2F0IEluaXQgJiBBc3NpZ24sICBVcDogRmxvYXRpbmctcG9pbnQgRnVuY3Rpb25zCgo3LjQgQ29udmVyc2lvbiBGdW5jdGlvbnMKPT09PT09PT09PT09PT09PT09PT09PT09CgogLS0gRnVuY3Rpb246IGRvdWJsZSBtcGZfZ2V0X2QgKGNvbnN0IG1wZl90IE9QKQogICAgIENvbnZlcnQgT1AgdG8gYSBgZG91YmxlJywgdHJ1bmNhdGluZyBpZiBuZWNlc3NhcnkgKGkuZS4gcm91bmRpbmcKICAgICB0b3dhcmRzIHplcm8pLgoKICAgICBJZiB0aGUgZXhwb25lbnQgaW4gT1AgaXMgdG9vIGJpZyBvciB0b28gc21hbGwgdG8gZml0IGEgYGRvdWJsZScKICAgICB0aGVuIHRoZSByZXN1bHQgaXMgc3lzdGVtIGRlcGVuZGVudC4gIEZvciB0b28gYmlnIGFuIGluZmluaXR5IGlzCiAgICAgcmV0dXJuZWQgd2hlbiBhdmFpbGFibGUuICBGb3IgdG9vIHNtYWxsIDAuMCBpcyBub3JtYWxseSByZXR1cm5lZC4KICAgICBIYXJkd2FyZSBvdmVyZmxvdywgdW5kZXJmbG93IGFuZCBkZW5vcm0gdHJhcHMgbWF5IG9yIG1heSBub3Qgb2NjdXIuCgogLS0gRnVuY3Rpb246IGRvdWJsZSBtcGZfZ2V0X2RfMmV4cCAoc2lnbmVkIGxvbmcgaW50ICpFWFAsIGNvbnN0IG1wZl90CiAgICAgICAgICBPUCkKICAgICBDb252ZXJ0IE9QIHRvIGEgYGRvdWJsZScsIHRydW5jYXRpbmcgaWYgbmVjZXNzYXJ5IChpLmUuIHJvdW5kaW5nCiAgICAgdG93YXJkcyB6ZXJvKSwgYW5kIHdpdGggYW4gZXhwb25lbnQgcmV0dXJuZWQgc2VwYXJhdGVseS4KCiAgICAgVGhlIHJldHVybiB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC41PD1hYnMoRCk8MSBhbmQgdGhlIGV4cG9uZW50IGlzCiAgICAgc3RvcmVkIHRvIGAqRVhQJy4gIEQgKiAyXkVYUCBpcyB0aGUgKHRydW5jYXRlZCkgT1AgdmFsdWUuICBJZiBPUAogICAgIGlzIHplcm8sIHRoZSByZXR1cm4gaXMgMC4wIGFuZCAwIGlzIHN0b3JlZCB0byBgKkVYUCcuCgogICAgIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgc3RhbmRhcmQgQyBgZnJleHAnIGZ1bmN0aW9uICgqbm90ZQogICAgIE5vcm1hbGl6YXRpb24gRnVuY3Rpb25zOiAobGliYylOb3JtYWxpemF0aW9uIEZ1bmN0aW9ucy4pLgoKIC0tIEZ1bmN0aW9uOiBsb25nIG1wZl9nZXRfc2kgKGNvbnN0IG1wZl90IE9QKQogLS0gRnVuY3Rpb246IHVuc2lnbmVkIGxvbmcgbXBmX2dldF91aSAoY29uc3QgbXBmX3QgT1ApCiAgICAgQ29udmVydCBPUCB0byBhIGBsb25nJyBvciBgdW5zaWduZWQgbG9uZycsIHRydW5jYXRpbmcgYW55IGZyYWN0aW9uCiAgICAgcGFydC4gIElmIE9QIGlzIHRvbyBiaWcgZm9yIHRoZSByZXR1cm4gdHlwZSwgdGhlIHJlc3VsdCBpcwogICAgIHVuZGVmaW5lZC4KCiAgICAgU2VlIGFsc28gYG1wZl9maXRzX3Nsb25nX3AnIGFuZCBgbXBmX2ZpdHNfdWxvbmdfcCcgKCpub3RlCiAgICAgTWlzY2VsbGFuZW91cyBGbG9hdCBGdW5jdGlvbnM6OikuCgogLS0gRnVuY3Rpb246IGNoYXIgKiBtcGZfZ2V0X3N0ciAoY2hhciAqU1RSLCBtcF9leHBfdCAqRVhQUFRSLCBpbnQKICAgICAgICAgIEJBU0UsIHNpemVfdCBOX0RJR0lUUywgY29uc3QgbXBmX3QgT1ApCiAgICAgQ29udmVydCBPUCB0byBhIHN0cmluZyBvZiBkaWdpdHMgaW4gYmFzZSBCQVNFLiAgVGhlIGJhc2UgYXJndW1lbnQKICAgICBtYXkgdmFyeSBmcm9tIDIgdG8gNjIgb3IgZnJvbSAtMiB0byAtMzYuICBVcCB0byBOX0RJR0lUUyBkaWdpdHMKICAgICB3aWxsIGJlIGdlbmVyYXRlZC4gIFRyYWlsaW5nIHplcm9zIGFyZSBub3QgcmV0dXJuZWQuICBObyBtb3JlCiAgICAgZGlnaXRzIHRoYW4gY2FuIGJlIGFjY3VyYXRlbHkgcmVwcmVzZW50ZWQgYnkgT1AgYXJlIGV2ZXIKICAgICBnZW5lcmF0ZWQuICBJZiBOX0RJR0lUUyBpcyAwIHRoZW4gdGhhdCBhY2N1cmF0ZSBtYXhpbXVtIG51bWJlciBvZgogICAgIGRpZ2l0cyBhcmUgZ2VuZXJhdGVkLgoKICAgICBGb3IgQkFTRSBpbiB0aGUgcmFuZ2UgMi4uMzYsIGRpZ2l0cyBhbmQgbG93ZXItY2FzZSBsZXR0ZXJzIGFyZQogICAgIHVzZWQ7IGZvciAtMi4uLTM2LCBkaWdpdHMgYW5kIHVwcGVyLWNhc2UgbGV0dGVycyBhcmUgdXNlZDsgZm9yCiAgICAgMzcuLjYyLCBkaWdpdHMsIHVwcGVyLWNhc2UgbGV0dGVycywgYW5kIGxvd2VyLWNhc2UgbGV0dGVycyAoaW4KICAgICB0aGF0IHNpZ25pZmljYW5jZSBvcmRlcikgYXJlIHVzZWQuCgogICAgIElmIFNUUiBpcyBgTlVMTCcsIHRoZSByZXN1bHQgc3RyaW5nIGlzIGFsbG9jYXRlZCB1c2luZyB0aGUgY3VycmVudAogICAgIGFsbG9jYXRpb24gZnVuY3Rpb24gKCpub3RlIEN1c3RvbSBBbGxvY2F0aW9uOjopLiAgVGhlIGJsb2NrIHdpbGwgYmUKICAgICBgc3RybGVuKHN0cikrMScgYnl0ZXMsIHRoYXQgYmVpbmcgZXhhY3RseSBlbm91Z2ggZm9yIHRoZSBzdHJpbmcgYW5kCiAgICAgbnVsbC10ZXJtaW5hdG9yLgoKICAgICBJZiBTVFIgaXMgbm90IGBOVUxMJywgaXQgc2hvdWxkIHBvaW50IHRvIGEgYmxvY2sgb2YgTl9ESUdJVFMgKyAyCiAgICAgYnl0ZXMsIHRoYXQgYmVpbmcgZW5vdWdoIGZvciB0aGUgbWFudGlzc2EsIGEgcG9zc2libGUgbWludXMgc2lnbiwKICAgICBhbmQgYSBudWxsLXRlcm1pbmF0b3IuICBXaGVuIE5fRElHSVRTIGlzIDAgdG8gZ2V0IGFsbCBzaWduaWZpY2FudAogICAgIGRpZ2l0cywgYW4gYXBwbGljYXRpb24gd29uJ3QgYmUgYWJsZSB0byBrbm93IHRoZSBzcGFjZSByZXF1aXJlZCwKICAgICBhbmQgU1RSIHNob3VsZCBiZSBgTlVMTCcgaW4gdGhhdCBjYXNlLgoKICAgICBUaGUgZ2VuZXJhdGVkIHN0cmluZyBpcyBhIGZyYWN0aW9uLCB3aXRoIGFuIGltcGxpY2l0IHJhZGl4IHBvaW50CiAgICAgaW1tZWRpYXRlbHkgdG8gdGhlIGxlZnQgb2YgdGhlIGZpcnN0IGRpZ2l0LiAgVGhlIGFwcGxpY2FibGUKICAgICBleHBvbmVudCBpcyB3cml0dGVuIHRocm91Z2ggdGhlIEVYUFBUUiBwb2ludGVyLiAgRm9yIGV4YW1wbGUsIHRoZQogICAgIG51bWJlciAzLjE0MTYgd291bGQgYmUgcmV0dXJuZWQgYXMgc3RyaW5nICIzMTQxNiIgYW5kIGV4cG9uZW50IDEuCgogICAgIFdoZW4gT1AgaXMgemVybywgYW4gZW1wdHkgc3RyaW5nIGlzIHByb2R1Y2VkIGFuZCB0aGUgZXhwb25lbnQKICAgICByZXR1cm5lZCBpcyAwLgoKICAgICBBIHBvaW50ZXIgdG8gdGhlIHJlc3VsdCBzdHJpbmcgaXMgcmV0dXJuZWQsIGJlaW5nIGVpdGhlciB0aGUKICAgICBhbGxvY2F0ZWQgYmxvY2sgb3IgdGhlIGdpdmVuIFNUUi4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBGbG9hdCBBcml0aG1ldGljLCAgTmV4dDogRmxvYXQgQ29tcGFyaXNvbiwgIFByZXY6IENvbnZlcnRpbmcgRmxvYXRzLCAgVXA6IEZsb2F0aW5nLXBvaW50IEZ1bmN0aW9ucwoKNy41IEFyaXRobWV0aWMgRnVuY3Rpb25zCj09PT09PT09PT09PT09PT09PT09PT09PQoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wZl9hZGQgKG1wZl90IFJPUCwgY29uc3QgbXBmX3QgT1AxLCBjb25zdCBtcGZfdCBPUDIpCiAtLSBGdW5jdGlvbjogdm9pZCBtcGZfYWRkX3VpIChtcGZfdCBST1AsIGNvbnN0IG1wZl90IE9QMSwgdW5zaWduZWQKICAgICAgICAgIGxvbmcgaW50IE9QMikKICAgICBTZXQgUk9QIHRvIE9QMSArIE9QMi4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcGZfc3ViIChtcGZfdCBST1AsIGNvbnN0IG1wZl90IE9QMSwgY29uc3QgbXBmX3QgT1AyKQogLS0gRnVuY3Rpb246IHZvaWQgbXBmX3VpX3N1YiAobXBmX3QgUk9QLCB1bnNpZ25lZCBsb25nIGludCBPUDEsIGNvbnN0CiAgICAgICAgICBtcGZfdCBPUDIpCiAtLSBGdW5jdGlvbjogdm9pZCBtcGZfc3ViX3VpIChtcGZfdCBST1AsIGNvbnN0IG1wZl90IE9QMSwgdW5zaWduZWQKICAgICAgICAgIGxvbmcgaW50IE9QMikKICAgICBTZXQgUk9QIHRvIE9QMSAtIE9QMi4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcGZfbXVsIChtcGZfdCBST1AsIGNvbnN0IG1wZl90IE9QMSwgY29uc3QgbXBmX3QgT1AyKQogLS0gRnVuY3Rpb246IHZvaWQgbXBmX211bF91aSAobXBmX3QgUk9QLCBjb25zdCBtcGZfdCBPUDEsIHVuc2lnbmVkCiAgICAgICAgICBsb25nIGludCBPUDIpCiAgICAgU2V0IFJPUCB0byBPUDEgdGltZXMgT1AyLgoKICAgRGl2aXNpb24gaXMgdW5kZWZpbmVkIGlmIHRoZSBkaXZpc29yIGlzIHplcm8sIGFuZCBwYXNzaW5nIGEgemVybwpkaXZpc29yIHRvIHRoZSBkaXZpZGUgZnVuY3Rpb25zIHdpbGwgbWFrZSB0aGVzZSBmdW5jdGlvbnMgaW50ZW50aW9uYWxseQpkaXZpZGUgYnkgemVyby4gIFRoaXMgbGV0cyB0aGUgdXNlciBoYW5kbGUgYXJpdGhtZXRpYyBleGNlcHRpb25zIGluCnRoZXNlIGZ1bmN0aW9ucyBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgb3RoZXIgYXJpdGhtZXRpYyBleGNlcHRpb25zLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wZl9kaXYgKG1wZl90IFJPUCwgY29uc3QgbXBmX3QgT1AxLCBjb25zdCBtcGZfdCBPUDIpCiAtLSBGdW5jdGlvbjogdm9pZCBtcGZfdWlfZGl2IChtcGZfdCBST1AsIHVuc2lnbmVkIGxvbmcgaW50IE9QMSwgY29uc3QKICAgICAgICAgIG1wZl90IE9QMikKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wZl9kaXZfdWkgKG1wZl90IFJPUCwgY29uc3QgbXBmX3QgT1AxLCB1bnNpZ25lZAogICAgICAgICAgbG9uZyBpbnQgT1AyKQogICAgIFNldCBST1AgdG8gT1AxL09QMi4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcGZfc3FydCAobXBmX3QgUk9QLCBjb25zdCBtcGZfdCBPUCkKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wZl9zcXJ0X3VpIChtcGZfdCBST1AsIHVuc2lnbmVkIGxvbmcgaW50IE9QKQogICAgIFNldCBST1AgdG8gdGhlIHNxdWFyZSByb290IG9mIE9QLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wZl9wb3dfdWkgKG1wZl90IFJPUCwgY29uc3QgbXBmX3QgT1AxLCB1bnNpZ25lZAogICAgICAgICAgbG9uZyBpbnQgT1AyKQogICAgIFNldCBST1AgdG8gT1AxIHJhaXNlZCB0byB0aGUgcG93ZXIgT1AyLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wZl9uZWcgKG1wZl90IFJPUCwgY29uc3QgbXBmX3QgT1ApCiAgICAgU2V0IFJPUCB0byAtT1AuCgogLS0gRnVuY3Rpb246IHZvaWQgbXBmX2FicyAobXBmX3QgUk9QLCBjb25zdCBtcGZfdCBPUCkKICAgICBTZXQgUk9QIHRvIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBPUC4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcGZfbXVsXzJleHAgKG1wZl90IFJPUCwgY29uc3QgbXBmX3QgT1AxLAogICAgICAgICAgbXBfYml0Y250X3QgT1AyKQogICAgIFNldCBST1AgdG8gT1AxIHRpbWVzIDIgcmFpc2VkIHRvIE9QMi4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcGZfZGl2XzJleHAgKG1wZl90IFJPUCwgY29uc3QgbXBmX3QgT1AxLAogICAgICAgICAgbXBfYml0Y250X3QgT1AyKQogICAgIFNldCBST1AgdG8gT1AxIGRpdmlkZWQgYnkgMiByYWlzZWQgdG8gT1AyLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEZsb2F0IENvbXBhcmlzb24sICBOZXh0OiBJL08gb2YgRmxvYXRzLCAgUHJldjogRmxvYXQgQXJpdGhtZXRpYywgIFVwOiBGbG9hdGluZy1wb2ludCBGdW5jdGlvbnMKCjcuNiBDb21wYXJpc29uIEZ1bmN0aW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT0KCiAtLSBGdW5jdGlvbjogaW50IG1wZl9jbXAgKGNvbnN0IG1wZl90IE9QMSwgY29uc3QgbXBmX3QgT1AyKQogLS0gRnVuY3Rpb246IGludCBtcGZfY21wX2QgKGNvbnN0IG1wZl90IE9QMSwgZG91YmxlIE9QMikKIC0tIEZ1bmN0aW9uOiBpbnQgbXBmX2NtcF91aSAoY29uc3QgbXBmX3QgT1AxLCB1bnNpZ25lZCBsb25nIGludCBPUDIpCiAtLSBGdW5jdGlvbjogaW50IG1wZl9jbXBfc2kgKGNvbnN0IG1wZl90IE9QMSwgc2lnbmVkIGxvbmcgaW50IE9QMikKICAgICBDb21wYXJlIE9QMSBhbmQgT1AyLiAgUmV0dXJuIGEgcG9zaXRpdmUgdmFsdWUgaWYgT1AxID4gT1AyLCB6ZXJvCiAgICAgaWYgT1AxID0gT1AyLCBhbmQgYSBuZWdhdGl2ZSB2YWx1ZSBpZiBPUDEgPCBPUDIuCgogICAgIGBtcGZfY21wX2QnIGNhbiBiZSBjYWxsZWQgd2l0aCBhbiBpbmZpbml0eSwgYnV0IHJlc3VsdHMgYXJlCiAgICAgdW5kZWZpbmVkIGZvciBhIE5hTi4KCiAtLSBGdW5jdGlvbjogaW50IG1wZl9lcSAoY29uc3QgbXBmX3QgT1AxLCBjb25zdCBtcGZfdCBPUDIsIG1wX2JpdGNudF90CiAgICAgICAgICBvcDMpCiAgICAgUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBmaXJzdCBPUDMgYml0cyBvZiBPUDEgYW5kIE9QMiBhcmUgZXF1YWwsCiAgICAgemVybyBvdGhlcndpc2UuICBJLmUuLCB0ZXN0IGlmIE9QMSBhbmQgT1AyIGFyZSBhcHByb3hpbWF0ZWx5IGVxdWFsLgoKICAgICBDYXV0aW9uIDE6IEFsbCB2ZXJzaW9uIG9mIEdNUCB1cCB0byB2ZXJzaW9uIDQuMi40IGNvbXBhcmVkIGp1c3QKICAgICB3aG9sZSBsaW1icywgbWVhbmluZyBzb21ldGltZXMgbW9yZSB0aGFuIE9QMyBiaXRzLCBzb21ldGltZXMgZmV3ZXIuCgogICAgIENhdXRpb24gMjogVGhpcyBmdW5jdGlvbiB3aWxsIGNvbnNpZGVyIFhYWDExLi4uMTExIGFuZCBYWDEwMC4uLjAwMAogICAgIGRpZmZlcmVudCwgZXZlbiBpZiAuLi4gaXMgcmVwbGFjZWQgYnkgYSBzZW1pLWluZmluaXRlIG51bWJlciBvZgogICAgIGJpdHMuICBTdWNoIG51bWJlcnMgYXJlIHJlYWxseSBqdXN0IG9uZSB1bHAgb2ZmLCBhbmQgc2hvdWxkIGJlCiAgICAgY29uc2lkZXJlZCBlcXVhbC4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcGZfcmVsZGlmZiAobXBmX3QgUk9QLCBjb25zdCBtcGZfdCBPUDEsIGNvbnN0IG1wZl90CiAgICAgICAgICBPUDIpCiAgICAgQ29tcHV0ZSB0aGUgcmVsYXRpdmUgZGlmZmVyZW5jZSBiZXR3ZWVuIE9QMSBhbmQgT1AyIGFuZCBzdG9yZSB0aGUKICAgICByZXN1bHQgaW4gUk9QLiAgVGhpcyBpcyBhYnMoT1AxLU9QMikvT1AxLgoKIC0tIE1hY3JvOiBpbnQgbXBmX3NnbiAoY29uc3QgbXBmX3QgT1ApCiAgICAgUmV0dXJuICsxIGlmIE9QID4gMCwgMCBpZiBPUCA9IDAsIGFuZCAtMSBpZiBPUCA8IDAuCgogICAgIFRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgaW1wbGVtZW50ZWQgYXMgYSBtYWNyby4gIEl0IGV2YWx1YXRlcwogICAgIGl0cyBhcmd1bWVudCBtdWx0aXBsZSB0aW1lcy4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBJL08gb2YgRmxvYXRzLCAgTmV4dDogTWlzY2VsbGFuZW91cyBGbG9hdCBGdW5jdGlvbnMsICBQcmV2OiBGbG9hdCBDb21wYXJpc29uLCAgVXA6IEZsb2F0aW5nLXBvaW50IEZ1bmN0aW9ucwoKNy43IElucHV0IGFuZCBPdXRwdXQgRnVuY3Rpb25zCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKRnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBpbnB1dCBmcm9tIGEgc3RkaW8gc3RyZWFtLCBhbmQgZnVuY3Rpb25zIHRoYXQKb3V0cHV0IHRvIGEgc3RkaW8gc3RyZWFtLCBvZiBgbXBmJyBudW1iZXJzLiAgUGFzc2luZyBhIGBOVUxMJyBwb2ludGVyCmZvciBhIFNUUkVBTSBhcmd1bWVudCB0byBhbnkgb2YgdGhlc2UgZnVuY3Rpb25zIHdpbGwgbWFrZSB0aGVtIHJlYWQgZnJvbQpgc3RkaW4nIGFuZCB3cml0ZSB0byBgc3Rkb3V0JywgcmVzcGVjdGl2ZWx5LgoKICAgV2hlbiB1c2luZyBhbnkgb2YgdGhlc2UgZnVuY3Rpb25zLCBpdCBpcyBhIGdvb2QgaWRlYSB0byBpbmNsdWRlCmBzdGRpby5oJyBiZWZvcmUgYGdtcC5oJywgc2luY2UgdGhhdCB3aWxsIGFsbG93IGBnbXAuaCcgdG8gZGVmaW5lCnByb3RvdHlwZXMgZm9yIHRoZXNlIGZ1bmN0aW9ucy4KCiAgIFNlZSBhbHNvICpub3RlIEZvcm1hdHRlZCBPdXRwdXQ6OiBhbmQgKm5vdGUgRm9ybWF0dGVkIElucHV0OjouCgogLS0gRnVuY3Rpb246IHNpemVfdCBtcGZfb3V0X3N0ciAoRklMRSAqU1RSRUFNLCBpbnQgQkFTRSwgc2l6ZV90CiAgICAgICAgICBOX0RJR0lUUywgY29uc3QgbXBmX3QgT1ApCiAgICAgUHJpbnQgT1AgdG8gU1RSRUFNLCBhcyBhIHN0cmluZyBvZiBkaWdpdHMuICBSZXR1cm4gdGhlIG51bWJlciBvZgogICAgIGJ5dGVzIHdyaXR0ZW4sIG9yIGlmIGFuIGVycm9yIG9jY3VycmVkLCByZXR1cm4gMC4KCiAgICAgVGhlIG1hbnRpc3NhIGlzIHByZWZpeGVkIHdpdGggYW4gYDAuJyBhbmQgaXMgaW4gdGhlIGdpdmVuIEJBU0UsCiAgICAgd2hpY2ggbWF5IHZhcnkgZnJvbSAyIHRvIDYyIG9yIGZyb20gLTIgdG8gLTM2LiAgQW4gZXhwb25lbnQgaXMKICAgICB0aGVuIHByaW50ZWQsIHNlcGFyYXRlZCBieSBhbiBgZScsIG9yIGlmIHRoZSBiYXNlIGlzIGdyZWF0ZXIgdGhhbgogICAgIDEwIHRoZW4gYnkgYW4gYEAnLiAgVGhlIGV4cG9uZW50IGlzIGFsd2F5cyBpbiBkZWNpbWFsLiAgVGhlCiAgICAgZGVjaW1hbCBwb2ludCBmb2xsb3dzIHRoZSBjdXJyZW50IGxvY2FsZSwgb24gc3lzdGVtcyBwcm92aWRpbmcKICAgICBgbG9jYWxlY29udicuCgogICAgIEZvciBCQVNFIGluIHRoZSByYW5nZSAyLi4zNiwgZGlnaXRzIGFuZCBsb3dlci1jYXNlIGxldHRlcnMgYXJlCiAgICAgdXNlZDsgZm9yIC0yLi4tMzYsIGRpZ2l0cyBhbmQgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZSB1c2VkOyBmb3IKICAgICAzNy4uNjIsIGRpZ2l0cywgdXBwZXItY2FzZSBsZXR0ZXJzLCBhbmQgbG93ZXItY2FzZSBsZXR0ZXJzIChpbgogICAgIHRoYXQgc2lnbmlmaWNhbmNlIG9yZGVyKSBhcmUgdXNlZC4KCiAgICAgVXAgdG8gTl9ESUdJVFMgd2lsbCBiZSBwcmludGVkIGZyb20gdGhlIG1hbnRpc3NhLCBleGNlcHQgdGhhdCBubwogICAgIG1vcmUgZGlnaXRzIHRoYW4gYXJlIGFjY3VyYXRlbHkgcmVwcmVzZW50YWJsZSBieSBPUCB3aWxsIGJlCiAgICAgcHJpbnRlZC4gIE5fRElHSVRTIGNhbiBiZSAwIHRvIHNlbGVjdCB0aGF0IGFjY3VyYXRlIG1heGltdW0uCgogLS0gRnVuY3Rpb246IHNpemVfdCBtcGZfaW5wX3N0ciAobXBmX3QgUk9QLCBGSUxFICpTVFJFQU0sIGludCBCQVNFKQogICAgIFJlYWQgYSBzdHJpbmcgaW4gYmFzZSBCQVNFIGZyb20gU1RSRUFNLCBhbmQgcHV0IHRoZSByZWFkIGZsb2F0IGluCiAgICAgUk9QLiAgVGhlIHN0cmluZyBpcyBvZiB0aGUgZm9ybSBgTUBOJyBvciwgaWYgdGhlIGJhc2UgaXMgMTAgb3IKICAgICBsZXNzLCBhbHRlcm5hdGl2ZWx5IGBNZU4nLiAgYE0nIGlzIHRoZSBtYW50aXNzYSBhbmQgYE4nIGlzIHRoZQogICAgIGV4cG9uZW50LiAgVGhlIG1hbnRpc3NhIGlzIGFsd2F5cyBpbiB0aGUgc3BlY2lmaWVkIGJhc2UuICBUaGUKICAgICBleHBvbmVudCBpcyBlaXRoZXIgaW4gdGhlIHNwZWNpZmllZCBiYXNlIG9yLCBpZiBCQVNFIGlzIG5lZ2F0aXZlLAogICAgIGluIGRlY2ltYWwuICBUaGUgZGVjaW1hbCBwb2ludCBleHBlY3RlZCBpcyB0YWtlbiBmcm9tIHRoZSBjdXJyZW50CiAgICAgbG9jYWxlLCBvbiBzeXN0ZW1zIHByb3ZpZGluZyBgbG9jYWxlY29udicuCgogICAgIFRoZSBhcmd1bWVudCBCQVNFIG1heSBiZSBpbiB0aGUgcmFuZ2VzIDIgdG8gMzYsIG9yIC0zNiB0byAtMi4KICAgICBOZWdhdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgdG8gc3BlY2lmeSB0aGF0IHRoZSBleHBvbmVudCBpcyBpbgogICAgIGRlY2ltYWwuCgogICAgIFVubGlrZSB0aGUgY29ycmVzcG9uZGluZyBgbXB6JyBmdW5jdGlvbiwgdGhlIGJhc2Ugd2lsbCBub3QgYmUKICAgICBkZXRlcm1pbmVkIGZyb20gdGhlIGxlYWRpbmcgY2hhcmFjdGVycyBvZiB0aGUgc3RyaW5nIGlmIEJBU0UgaXMgMC4KICAgICBUaGlzIGlzIHNvIHRoYXQgbnVtYmVycyBsaWtlIGAwLjIzJyBhcmUgbm90IGludGVycHJldGVkIGFzIG9jdGFsLgoKICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciBpZiBhbiBlcnJvciBvY2N1cnJlZCwgcmV0dXJuIDAuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogTWlzY2VsbGFuZW91cyBGbG9hdCBGdW5jdGlvbnMsICBQcmV2OiBJL08gb2YgRmxvYXRzLCAgVXA6IEZsb2F0aW5nLXBvaW50IEZ1bmN0aW9ucwoKNy44IE1pc2NlbGxhbmVvdXMgRnVuY3Rpb25zCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wZl9jZWlsIChtcGZfdCBST1AsIGNvbnN0IG1wZl90IE9QKQogLS0gRnVuY3Rpb246IHZvaWQgbXBmX2Zsb29yIChtcGZfdCBST1AsIGNvbnN0IG1wZl90IE9QKQogLS0gRnVuY3Rpb246IHZvaWQgbXBmX3RydW5jIChtcGZfdCBST1AsIGNvbnN0IG1wZl90IE9QKQogICAgIFNldCBST1AgdG8gT1Agcm91bmRlZCB0byBhbiBpbnRlZ2VyLiAgYG1wZl9jZWlsJyByb3VuZHMgdG8gdGhlCiAgICAgbmV4dCBoaWdoZXIgaW50ZWdlciwgYG1wZl9mbG9vcicgdG8gdGhlIG5leHQgbG93ZXIsIGFuZCBgbXBmX3RydW5jJwogICAgIHRvIHRoZSBpbnRlZ2VyIHRvd2FyZHMgemVyby4KCiAtLSBGdW5jdGlvbjogaW50IG1wZl9pbnRlZ2VyX3AgKGNvbnN0IG1wZl90IE9QKQogICAgIFJldHVybiBub24temVybyBpZiBPUCBpcyBhbiBpbnRlZ2VyLgoKIC0tIEZ1bmN0aW9uOiBpbnQgbXBmX2ZpdHNfdWxvbmdfcCAoY29uc3QgbXBmX3QgT1ApCiAtLSBGdW5jdGlvbjogaW50IG1wZl9maXRzX3Nsb25nX3AgKGNvbnN0IG1wZl90IE9QKQogLS0gRnVuY3Rpb246IGludCBtcGZfZml0c191aW50X3AgKGNvbnN0IG1wZl90IE9QKQogLS0gRnVuY3Rpb246IGludCBtcGZfZml0c19zaW50X3AgKGNvbnN0IG1wZl90IE9QKQogLS0gRnVuY3Rpb246IGludCBtcGZfZml0c191c2hvcnRfcCAoY29uc3QgbXBmX3QgT1ApCiAtLSBGdW5jdGlvbjogaW50IG1wZl9maXRzX3NzaG9ydF9wIChjb25zdCBtcGZfdCBPUCkKICAgICBSZXR1cm4gbm9uLXplcm8gaWYgT1Agd291bGQgZml0IGluIHRoZSByZXNwZWN0aXZlIEMgZGF0YSB0eXBlLCB3aGVuCiAgICAgdHJ1bmNhdGVkIHRvIGFuIGludGVnZXIuCgogLS0gRnVuY3Rpb246IHZvaWQgbXBmX3VyYW5kb21iIChtcGZfdCBST1AsIGdtcF9yYW5kc3RhdGVfdCBTVEFURSwKICAgICAgICAgIG1wX2JpdGNudF90IE5CSVRTKQogICAgIEdlbmVyYXRlIGEgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIHJhbmRvbSBmbG9hdCBpbiBST1AsIHN1Y2ggdGhhdCAwCiAgICAgPD0gUk9QIDwgMSwgd2l0aCBOQklUUyBzaWduaWZpY2FudCBiaXRzIGluIHRoZSBtYW50aXNzYSBvciBsZXNzIGlmCiAgICAgdGhlIHByZWNpc2lvbiBvZiBST1AgaXMgc21hbGxlci4KCiAgICAgVGhlIHZhcmlhYmxlIFNUQVRFIG11c3QgYmUgaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyBvbmUgb2YgdGhlCiAgICAgYGdtcF9yYW5kaW5pdCcgZnVuY3Rpb25zICgqbm90ZSBSYW5kb20gU3RhdGUgSW5pdGlhbGl6YXRpb246OikKICAgICBiZWZvcmUgaW52b2tpbmcgdGhpcyBmdW5jdGlvbi4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcGZfcmFuZG9tMiAobXBmX3QgUk9QLCBtcF9zaXplX3QgTUFYX1NJWkUsIG1wX2V4cF90CiAgICAgICAgICBFWFApCiAgICAgR2VuZXJhdGUgYSByYW5kb20gZmxvYXQgb2YgYXQgbW9zdCBNQVhfU0laRSBsaW1icywgd2l0aCBsb25nCiAgICAgc3RyaW5ncyBvZiB6ZXJvcyBhbmQgb25lcyBpbiB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uLiAgVGhlCiAgICAgZXhwb25lbnQgb2YgdGhlIG51bWJlciBpcyBpbiB0aGUgaW50ZXJ2YWwgLUVYUCB0byBFWFAgKGluIGxpbWJzKS4KICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBmdW5jdGlvbnMgYW5kIGFsZ29yaXRobXMsCiAgICAgc2luY2UgdGhlc2Uga2luZCBvZiByYW5kb20gbnVtYmVycyBoYXZlIHByb3ZlbiB0byBiZSBtb3JlIGxpa2VseQogICAgIHRvIHRyaWdnZXIgY29ybmVyLWNhc2UgYnVncy4gIE5lZ2F0aXZlIHJhbmRvbSBudW1iZXJzIGFyZQogICAgIGdlbmVyYXRlZCB3aGVuIE1BWF9TSVpFIGlzIG5lZ2F0aXZlLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IExvdy1sZXZlbCBGdW5jdGlvbnMsICBOZXh0OiBSYW5kb20gTnVtYmVyIEZ1bmN0aW9ucywgIFByZXY6IEZsb2F0aW5nLXBvaW50IEZ1bmN0aW9ucywgIFVwOiBUb3AKCjggTG93LWxldmVsIEZ1bmN0aW9ucwoqKioqKioqKioqKioqKioqKioqKioKClRoaXMgY2hhcHRlciBkZXNjcmliZXMgbG93LWxldmVsIEdNUCBmdW5jdGlvbnMsIHVzZWQgdG8gaW1wbGVtZW50IHRoZQpoaWdoLWxldmVsIEdNUCBmdW5jdGlvbnMsIGJ1dCBhbHNvIGludGVuZGVkIGZvciB0aW1lLWNyaXRpY2FsIHVzZXIgY29kZS4KCiAgIFRoZXNlIGZ1bmN0aW9ucyBzdGFydCB3aXRoIHRoZSBwcmVmaXggYG1wbl8nLgoKICAgVGhlIGBtcG4nIGZ1bmN0aW9ucyBhcmUgZGVzaWduZWQgdG8gYmUgYXMgZmFzdCBhcyBwb3NzaWJsZSwgKm5vdCogdG8KcHJvdmlkZSBhIGNvaGVyZW50IGNhbGxpbmcgaW50ZXJmYWNlLiAgVGhlIGRpZmZlcmVudCBmdW5jdGlvbnMgaGF2ZQpzb21ld2hhdCBzaW1pbGFyIGludGVyZmFjZXMsIGJ1dCB0aGVyZSBhcmUgdmFyaWF0aW9ucyB0aGF0IG1ha2UgdGhlbQpoYXJkIHRvIHVzZS4gIFRoZXNlIGZ1bmN0aW9ucyBkbyBhcyBsaXR0bGUgYXMgcG9zc2libGUgYXBhcnQgZnJvbSB0aGUKcmVhbCBtdWx0aXBsZSBwcmVjaXNpb24gY29tcHV0YXRpb24sIHNvIHRoYXQgbm8gdGltZSBpcyBzcGVudCBvbiB0aGluZ3MKdGhhdCBub3QgYWxsIGNhbGxlcnMgbmVlZC4KCiAgIEEgc291cmNlIG9wZXJhbmQgaXMgc3BlY2lmaWVkIGJ5IGEgcG9pbnRlciB0byB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQKbGltYiBhbmQgYSBsaW1iIGNvdW50LiAgQSBkZXN0aW5hdGlvbiBvcGVyYW5kIGlzIHNwZWNpZmllZCBieSBqdXN0IGEKcG9pbnRlci4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIGVuc3VyZSB0aGF0IHRoZQpkZXN0aW5hdGlvbiBoYXMgZW5vdWdoIHNwYWNlIGZvciBzdG9yaW5nIHRoZSByZXN1bHQuCgogICBXaXRoIHRoaXMgd2F5IG9mIHNwZWNpZnlpbmcgb3BlcmFuZHMsIGl0IGlzIHBvc3NpYmxlIHRvIHBlcmZvcm0KY29tcHV0YXRpb25zIG9uIHN1YnJhbmdlcyBvZiBhbiBhcmd1bWVudCwgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW50byBhCnN1YnJhbmdlIG9mIGEgZGVzdGluYXRpb24uCgogICBBIGNvbW1vbiByZXF1aXJlbWVudCBmb3IgYWxsIGZ1bmN0aW9ucyBpcyB0aGF0IGVhY2ggc291cmNlIGFyZWEKbmVlZHMgYXQgbGVhc3Qgb25lIGxpbWIuICBObyBzaXplIGFyZ3VtZW50IG1heSBiZSB6ZXJvLiAgVW5sZXNzCm90aGVyd2lzZSBzdGF0ZWQsIGluLXBsYWNlIG9wZXJhdGlvbnMgYXJlIGFsbG93ZWQgd2hlcmUgc291cmNlIGFuZApkZXN0aW5hdGlvbiBhcmUgdGhlIHNhbWUsIGJ1dCBub3Qgd2hlcmUgdGhleSBvbmx5IHBhcnRseSBvdmVybGFwLgoKICAgVGhlIGBtcG4nIGZ1bmN0aW9ucyBhcmUgdGhlIGJhc2UgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKYG1wel8nLCBgbXBmXycsIGFuZCBgbXBxXycgZnVuY3Rpb25zLgoKICAgVGhpcyBleGFtcGxlIGFkZHMgdGhlIG51bWJlciBiZWdpbm5pbmcgYXQgUzFQIGFuZCB0aGUgbnVtYmVyCmJlZ2lubmluZyBhdCBTMlAgYW5kIHdyaXRlcyB0aGUgc3VtIGF0IERFU1RQLiAgQWxsIGFyZWFzIGhhdmUgTiBsaW1icy4KCiAgICAgY3kgPSBtcG5fYWRkX24gKGRlc3RwLCBzMXAsIHMycCwgbikKCiAgIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoZSBgbXBuJyBmdW5jdGlvbnMgbWFrZSBubyBhdHRlbXB0IHRvCmlkZW50aWZ5IGhpZ2ggb3IgbG93IHplcm8gbGltYnMgb24gdGhlaXIgb3BlcmFuZHMsIG9yIG90aGVyIHNwZWNpYWwKZm9ybXMuICBPbiByYW5kb20gZGF0YSBzdWNoIGNhc2VzIHdpbGwgYmUgdW5saWtlbHkgYW5kIGl0J2QgYmUgd2FzdGVmdWwKZm9yIGV2ZXJ5IGZ1bmN0aW9uIHRvIGNoZWNrIGV2ZXJ5IHRpbWUuICBBbiBhcHBsaWNhdGlvbiBrbm93aW5nCnNvbWV0aGluZyBhYm91dCBpdHMgZGF0YSBjYW4gdGFrZSBzdGVwcyB0byB0cmltIG9yIHBlcmhhcHMgc3BsaXQgaXRzCmNhbGN1bGF0aW9ucy4KCgpJbiB0aGUgbm90YXRpb24gdXNlZCBiZWxvdywgYSBzb3VyY2Ugb3BlcmFuZCBpcyBpZGVudGlmaWVkIGJ5IHRoZQpwb2ludGVyIHRvIHRoZSBsZWFzdCBzaWduaWZpY2FudCBsaW1iLCBhbmQgdGhlIGxpbWIgY291bnQgaW4gYnJhY2VzLgpGb3IgZXhhbXBsZSwge1MxUCwgUzFOfS4KCiAtLSBGdW5jdGlvbjogbXBfbGltYl90IG1wbl9hZGRfbiAobXBfbGltYl90ICpSUCwgY29uc3QgbXBfbGltYl90ICpTMVAsCiAgICAgICAgICBjb25zdCBtcF9saW1iX3QgKlMyUCwgbXBfc2l6ZV90IE4pCiAgICAgQWRkIHtTMVAsIE59IGFuZCB7UzJQLCBOfSwgYW5kIHdyaXRlIHRoZSBOIGxlYXN0IHNpZ25pZmljYW50IGxpbWJzCiAgICAgb2YgdGhlIHJlc3VsdCB0byBSUC4gIFJldHVybiBjYXJyeSwgZWl0aGVyIDAgb3IgMS4KCiAgICAgVGhpcyBpcyB0aGUgbG93ZXN0LWxldmVsIGZ1bmN0aW9uIGZvciBhZGRpdGlvbi4gIEl0IGlzIHRoZQogICAgIHByZWZlcnJlZCBmdW5jdGlvbiBmb3IgYWRkaXRpb24sIHNpbmNlIGl0IGlzIHdyaXR0ZW4gaW4gYXNzZW1ibHkKICAgICBmb3IgbW9zdCBDUFVzLiAgRm9yIGFkZGl0aW9uIG9mIGEgdmFyaWFibGUgdG8gaXRzZWxmIChpLmUuLCBTMVAKICAgICBlcXVhbHMgUzJQKSB1c2UgYG1wbl9sc2hpZnQnIHdpdGggYSBjb3VudCBvZiAxIGZvciBvcHRpbWFsIHNwZWVkLgoKIC0tIEZ1bmN0aW9uOiBtcF9saW1iX3QgbXBuX2FkZF8xIChtcF9saW1iX3QgKlJQLCBjb25zdCBtcF9saW1iX3QgKlMxUCwKICAgICAgICAgIG1wX3NpemVfdCBOLCBtcF9saW1iX3QgUzJMSU1CKQogICAgIEFkZCB7UzFQLCBOfSBhbmQgUzJMSU1CLCBhbmQgd3JpdGUgdGhlIE4gbGVhc3Qgc2lnbmlmaWNhbnQgbGltYnMKICAgICBvZiB0aGUgcmVzdWx0IHRvIFJQLiAgUmV0dXJuIGNhcnJ5LCBlaXRoZXIgMCBvciAxLgoKIC0tIEZ1bmN0aW9uOiBtcF9saW1iX3QgbXBuX2FkZCAobXBfbGltYl90ICpSUCwgY29uc3QgbXBfbGltYl90ICpTMVAsCiAgICAgICAgICBtcF9zaXplX3QgUzFOLCBjb25zdCBtcF9saW1iX3QgKlMyUCwgbXBfc2l6ZV90IFMyTikKICAgICBBZGQge1MxUCwgUzFOfSBhbmQge1MyUCwgUzJOfSwgYW5kIHdyaXRlIHRoZSBTMU4gbGVhc3Qgc2lnbmlmaWNhbnQKICAgICBsaW1icyBvZiB0aGUgcmVzdWx0IHRvIFJQLiAgUmV0dXJuIGNhcnJ5LCBlaXRoZXIgMCBvciAxLgoKICAgICBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoYXQgUzFOIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBTMk4uCgogLS0gRnVuY3Rpb246IG1wX2xpbWJfdCBtcG5fc3ViX24gKG1wX2xpbWJfdCAqUlAsIGNvbnN0IG1wX2xpbWJfdCAqUzFQLAogICAgICAgICAgY29uc3QgbXBfbGltYl90ICpTMlAsIG1wX3NpemVfdCBOKQogICAgIFN1YnRyYWN0IHtTMlAsIE59IGZyb20ge1MxUCwgTn0sIGFuZCB3cml0ZSB0aGUgTiBsZWFzdCBzaWduaWZpY2FudAogICAgIGxpbWJzIG9mIHRoZSByZXN1bHQgdG8gUlAuICBSZXR1cm4gYm9ycm93LCBlaXRoZXIgMCBvciAxLgoKICAgICBUaGlzIGlzIHRoZSBsb3dlc3QtbGV2ZWwgZnVuY3Rpb24gZm9yIHN1YnRyYWN0aW9uLiAgSXQgaXMgdGhlCiAgICAgcHJlZmVycmVkIGZ1bmN0aW9uIGZvciBzdWJ0cmFjdGlvbiwgc2luY2UgaXQgaXMgd3JpdHRlbiBpbgogICAgIGFzc2VtYmx5IGZvciBtb3N0IENQVXMuCgogLS0gRnVuY3Rpb246IG1wX2xpbWJfdCBtcG5fc3ViXzEgKG1wX2xpbWJfdCAqUlAsIGNvbnN0IG1wX2xpbWJfdCAqUzFQLAogICAgICAgICAgbXBfc2l6ZV90IE4sIG1wX2xpbWJfdCBTMkxJTUIpCiAgICAgU3VidHJhY3QgUzJMSU1CIGZyb20ge1MxUCwgTn0sIGFuZCB3cml0ZSB0aGUgTiBsZWFzdCBzaWduaWZpY2FudAogICAgIGxpbWJzIG9mIHRoZSByZXN1bHQgdG8gUlAuICBSZXR1cm4gYm9ycm93LCBlaXRoZXIgMCBvciAxLgoKIC0tIEZ1bmN0aW9uOiBtcF9saW1iX3QgbXBuX3N1YiAobXBfbGltYl90ICpSUCwgY29uc3QgbXBfbGltYl90ICpTMVAsCiAgICAgICAgICBtcF9zaXplX3QgUzFOLCBjb25zdCBtcF9saW1iX3QgKlMyUCwgbXBfc2l6ZV90IFMyTikKICAgICBTdWJ0cmFjdCB7UzJQLCBTMk59IGZyb20ge1MxUCwgUzFOfSwgYW5kIHdyaXRlIHRoZSBTMU4gbGVhc3QKICAgICBzaWduaWZpY2FudCBsaW1icyBvZiB0aGUgcmVzdWx0IHRvIFJQLiAgUmV0dXJuIGJvcnJvdywgZWl0aGVyIDAgb3IKICAgICAxLgoKICAgICBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoYXQgUzFOIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBTMk4uCgogLS0gRnVuY3Rpb246IG1wX2xpbWJfdCBtcG5fbmVnIChtcF9saW1iX3QgKlJQLCBjb25zdCBtcF9saW1iX3QgKlNQLAogICAgICAgICAgbXBfc2l6ZV90IE4pCiAgICAgUGVyZm9ybSB0aGUgbmVnYXRpb24gb2Yge1NQLCBOfSwgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8ge1JQLCBOfS4KICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBgbXBuX3N1Yl9uJyB3aXRoIGEgTi1saW1iIHplcm8KICAgICBtaW51ZW5kIGFuZCBwYXNzaW5nIHtTUCwgTn0gYXMgc3VidHJhaGVuZC4gIFJldHVybiBib3Jyb3csIGVpdGhlcgogICAgIDAgb3IgMS4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcG5fbXVsX24gKG1wX2xpbWJfdCAqUlAsIGNvbnN0IG1wX2xpbWJfdCAqUzFQLAogICAgICAgICAgY29uc3QgbXBfbGltYl90ICpTMlAsIG1wX3NpemVfdCBOKQogICAgIE11bHRpcGx5IHtTMVAsIE59IGFuZCB7UzJQLCBOfSwgYW5kIHdyaXRlIHRoZSAyKk4tbGltYiByZXN1bHQgdG8KICAgICBSUC4KCiAgICAgVGhlIGRlc3RpbmF0aW9uIGhhcyB0byBoYXZlIHNwYWNlIGZvciAyKk4gbGltYnMsIGV2ZW4gaWYgdGhlCiAgICAgcHJvZHVjdCdzIG1vc3Qgc2lnbmlmaWNhbnQgbGltYiBpcyB6ZXJvLiAgTm8gb3ZlcmxhcCBpcyBwZXJtaXR0ZWQKICAgICBiZXR3ZWVuIHRoZSBkZXN0aW5hdGlvbiBhbmQgZWl0aGVyIHNvdXJjZS4KCiAgICAgSWYgdGhlIHR3byBpbnB1dCBvcGVyYW5kcyBhcmUgdGhlIHNhbWUsIHVzZSBgbXBuX3NxcicuCgogLS0gRnVuY3Rpb246IG1wX2xpbWJfdCBtcG5fbXVsIChtcF9saW1iX3QgKlJQLCBjb25zdCBtcF9saW1iX3QgKlMxUCwKICAgICAgICAgIG1wX3NpemVfdCBTMU4sIGNvbnN0IG1wX2xpbWJfdCAqUzJQLCBtcF9zaXplX3QgUzJOKQogICAgIE11bHRpcGx5IHtTMVAsIFMxTn0gYW5kIHtTMlAsIFMyTn0sIGFuZCB3cml0ZSB0aGUgKFMxTitTMk4pLWxpbWIKICAgICByZXN1bHQgdG8gUlAuICBSZXR1cm4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgbGltYiBvZiB0aGUgcmVzdWx0LgoKICAgICBUaGUgZGVzdGluYXRpb24gaGFzIHRvIGhhdmUgc3BhY2UgZm9yIFMxTiArIFMyTiBsaW1icywgZXZlbiBpZiB0aGUKICAgICBwcm9kdWN0J3MgbW9zdCBzaWduaWZpY2FudCBsaW1iIGlzIHplcm8uICBObyBvdmVybGFwIGlzIHBlcm1pdHRlZAogICAgIGJldHdlZW4gdGhlIGRlc3RpbmF0aW9uIGFuZCBlaXRoZXIgc291cmNlLgoKICAgICBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoYXQgUzFOIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBTMk4uCgogLS0gRnVuY3Rpb246IHZvaWQgbXBuX3NxciAobXBfbGltYl90ICpSUCwgY29uc3QgbXBfbGltYl90ICpTMVAsCiAgICAgICAgICBtcF9zaXplX3QgTikKICAgICBDb21wdXRlIHRoZSBzcXVhcmUgb2Yge1MxUCwgTn0gYW5kIHdyaXRlIHRoZSAyKk4tbGltYiByZXN1bHQgdG8gUlAuCgogICAgIFRoZSBkZXN0aW5hdGlvbiBoYXMgdG8gaGF2ZSBzcGFjZSBmb3IgMk4gbGltYnMsIGV2ZW4gaWYgdGhlCiAgICAgcmVzdWx0J3MgbW9zdCBzaWduaWZpY2FudCBsaW1iIGlzIHplcm8uICBObyBvdmVybGFwIGlzIHBlcm1pdHRlZAogICAgIGJldHdlZW4gdGhlIGRlc3RpbmF0aW9uIGFuZCB0aGUgc291cmNlLgoKIC0tIEZ1bmN0aW9uOiBtcF9saW1iX3QgbXBuX211bF8xIChtcF9saW1iX3QgKlJQLCBjb25zdCBtcF9saW1iX3QgKlMxUCwKICAgICAgICAgIG1wX3NpemVfdCBOLCBtcF9saW1iX3QgUzJMSU1CKQogICAgIE11bHRpcGx5IHtTMVAsIE59IGJ5IFMyTElNQiwgYW5kIHdyaXRlIHRoZSBOIGxlYXN0IHNpZ25pZmljYW50CiAgICAgbGltYnMgb2YgdGhlIHByb2R1Y3QgdG8gUlAuICBSZXR1cm4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgbGltYiBvZgogICAgIHRoZSBwcm9kdWN0LiAge1MxUCwgTn0gYW5kIHtSUCwgTn0gYXJlIGFsbG93ZWQgdG8gb3ZlcmxhcCBwcm92aWRlZAogICAgIFJQIDw9IFMxUC4KCiAgICAgVGhpcyBpcyBhIGxvdy1sZXZlbCBmdW5jdGlvbiB0aGF0IGlzIGEgYnVpbGRpbmcgYmxvY2sgZm9yIGdlbmVyYWwKICAgICBtdWx0aXBsaWNhdGlvbiBhcyB3ZWxsIGFzIG90aGVyIG9wZXJhdGlvbnMgaW4gR01QLiAgSXQgaXMgd3JpdHRlbgogICAgIGluIGFzc2VtYmx5IGZvciBtb3N0IENQVXMuCgogICAgIERvbid0IGNhbGwgdGhpcyBmdW5jdGlvbiBpZiBTMkxJTUIgaXMgYSBwb3dlciBvZiAyOyB1c2UKICAgICBgbXBuX2xzaGlmdCcgd2l0aCBhIGNvdW50IGVxdWFsIHRvIHRoZSBsb2dhcml0aG0gb2YgUzJMSU1CCiAgICAgaW5zdGVhZCwgZm9yIG9wdGltYWwgc3BlZWQuCgogLS0gRnVuY3Rpb246IG1wX2xpbWJfdCBtcG5fYWRkbXVsXzEgKG1wX2xpbWJfdCAqUlAsIGNvbnN0IG1wX2xpbWJfdAogICAgICAgICAgKlMxUCwgbXBfc2l6ZV90IE4sIG1wX2xpbWJfdCBTMkxJTUIpCiAgICAgTXVsdGlwbHkge1MxUCwgTn0gYW5kIFMyTElNQiwgYW5kIGFkZCB0aGUgTiBsZWFzdCBzaWduaWZpY2FudAogICAgIGxpbWJzIG9mIHRoZSBwcm9kdWN0IHRvIHtSUCwgTn0gYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gUlAuCiAgICAgUmV0dXJuIHRoZSBtb3N0IHNpZ25pZmljYW50IGxpbWIgb2YgdGhlIHByb2R1Y3QsIHBsdXMgY2Fycnktb3V0CiAgICAgZnJvbSB0aGUgYWRkaXRpb24uCgogICAgIFRoaXMgaXMgYSBsb3ctbGV2ZWwgZnVuY3Rpb24gdGhhdCBpcyBhIGJ1aWxkaW5nIGJsb2NrIGZvciBnZW5lcmFsCiAgICAgbXVsdGlwbGljYXRpb24gYXMgd2VsbCBhcyBvdGhlciBvcGVyYXRpb25zIGluIEdNUC4gIEl0IGlzIHdyaXR0ZW4KICAgICBpbiBhc3NlbWJseSBmb3IgbW9zdCBDUFVzLgoKIC0tIEZ1bmN0aW9uOiBtcF9saW1iX3QgbXBuX3N1Ym11bF8xIChtcF9saW1iX3QgKlJQLCBjb25zdCBtcF9saW1iX3QKICAgICAgICAgICpTMVAsIG1wX3NpemVfdCBOLCBtcF9saW1iX3QgUzJMSU1CKQogICAgIE11bHRpcGx5IHtTMVAsIE59IGFuZCBTMkxJTUIsIGFuZCBzdWJ0cmFjdCB0aGUgTiBsZWFzdCBzaWduaWZpY2FudAogICAgIGxpbWJzIG9mIHRoZSBwcm9kdWN0IGZyb20ge1JQLCBOfSBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byBSUC4KICAgICBSZXR1cm4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgbGltYiBvZiB0aGUgcHJvZHVjdCwgcGx1cyBib3Jyb3ctb3V0CiAgICAgZnJvbSB0aGUgc3VidHJhY3Rpb24uCgogICAgIFRoaXMgaXMgYSBsb3ctbGV2ZWwgZnVuY3Rpb24gdGhhdCBpcyBhIGJ1aWxkaW5nIGJsb2NrIGZvciBnZW5lcmFsCiAgICAgbXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uIGFzIHdlbGwgYXMgb3RoZXIgb3BlcmF0aW9ucyBpbiBHTVAuCiAgICAgSXQgaXMgd3JpdHRlbiBpbiBhc3NlbWJseSBmb3IgbW9zdCBDUFVzLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wbl90ZGl2X3FyIChtcF9saW1iX3QgKlFQLCBtcF9saW1iX3QgKlJQLCBtcF9zaXplX3QKICAgICAgICAgIFFYTiwgY29uc3QgbXBfbGltYl90ICpOUCwgbXBfc2l6ZV90IE5OLCBjb25zdCBtcF9saW1iX3QgKkRQLAogICAgICAgICAgbXBfc2l6ZV90IEROKQogICAgIERpdmlkZSB7TlAsIE5OfSBieSB7RFAsIEROfSBhbmQgcHV0IHRoZSBxdW90aWVudCBhdCB7UVAsIE5OLUROKzF9CiAgICAgYW5kIHRoZSByZW1haW5kZXIgYXQge1JQLCBETn0uICBUaGUgcXVvdGllbnQgaXMgcm91bmRlZCB0b3dhcmRzIDAuCgogICAgIE5vIG92ZXJsYXAgaXMgcGVybWl0dGVkIGJldHdlZW4gYXJndW1lbnRzLCBleGNlcHQgdGhhdCBOUCBtaWdodAogICAgIGVxdWFsIFJQLiAgVGhlIGRpdmlkZW5kIHNpemUgTk4gbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KICAgICBkaXZpc29yIHNpemUgRE4uICBUaGUgbW9zdCBzaWduaWZpY2FudCBsaW1iIG9mIHRoZSBkaXZpc29yIG11c3QgYmUKICAgICBub24temVyby4gIFRoZSBRWE4gb3BlcmFuZCBtdXN0IGJlIHplcm8uCgogLS0gRnVuY3Rpb246IG1wX2xpbWJfdCBtcG5fZGl2cmVtIChtcF9saW1iX3QgKlIxUCwgbXBfc2l6ZV90IFFYTiwKICAgICAgICAgIG1wX2xpbWJfdCAqUlMyUCwgbXBfc2l6ZV90IFJTMk4sIGNvbnN0IG1wX2xpbWJfdCAqUzNQLAogICAgICAgICAgbXBfc2l6ZV90IFMzTikKICAgICBbVGhpcyBmdW5jdGlvbiBpcyBvYnNvbGV0ZS4gIFBsZWFzZSBjYWxsIGBtcG5fdGRpdl9xcicgaW5zdGVhZCBmb3IKICAgICBiZXN0IHBlcmZvcm1hbmNlLl0KCiAgICAgRGl2aWRlIHtSUzJQLCBSUzJOfSBieSB7UzNQLCBTM059LCBhbmQgd3JpdGUgdGhlIHF1b3RpZW50IGF0IFIxUCwKICAgICB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgbGltYiwgd2hpY2ggaXMKICAgICByZXR1cm5lZC4gIFRoZSByZW1haW5kZXIgcmVwbGFjZXMgdGhlIGRpdmlkZW5kIGF0IFJTMlA7IGl0IHdpbGwgYmUKICAgICBTM04gbGltYnMgbG9uZyAoaS5lLiwgYXMgbWFueSBsaW1icyBhcyB0aGUgZGl2aXNvcikuCgogICAgIEluIGFkZGl0aW9uIHRvIGFuIGludGVnZXIgcXVvdGllbnQsIFFYTiBmcmFjdGlvbiBsaW1icyBhcmUKICAgICBkZXZlbG9wZWQsIGFuZCBzdG9yZWQgYWZ0ZXIgdGhlIGludGVncmFsIGxpbWJzLiAgRm9yIG1vc3QgdXNhZ2VzLAogICAgIFFYTiB3aWxsIGJlIHplcm8uCgogICAgIEl0IGlzIHJlcXVpcmVkIHRoYXQgUlMyTiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gUzNOLiAgSXQgaXMKICAgICByZXF1aXJlZCB0aGF0IHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgZGl2aXNvciBpcyBzZXQuCgogICAgIElmIHRoZSBxdW90aWVudCBpcyBub3QgbmVlZGVkLCBwYXNzIFJTMlAgKyBTM04gYXMgUjFQLiAgQXNpZGUgZnJvbQogICAgIHRoYXQgc3BlY2lhbCBjYXNlLCBubyBvdmVybGFwIGJldHdlZW4gYXJndW1lbnRzIGlzIHBlcm1pdHRlZC4KCiAgICAgUmV0dXJuIHRoZSBtb3N0IHNpZ25pZmljYW50IGxpbWIgb2YgdGhlIHF1b3RpZW50LCBlaXRoZXIgMCBvciAxLgoKICAgICBUaGUgYXJlYSBhdCBSMVAgbmVlZHMgdG8gYmUgUlMyTiAtIFMzTiArIFFYTiBsaW1icyBsYXJnZS4KCiAtLSBGdW5jdGlvbjogbXBfbGltYl90IG1wbl9kaXZyZW1fMSAobXBfbGltYl90ICpSMVAsIG1wX3NpemVfdCBRWE4sCiAgICAgICAgICBtcF9saW1iX3QgKlMyUCwgbXBfc2l6ZV90IFMyTiwgbXBfbGltYl90IFMzTElNQikKIC0tIE1hY3JvOiBtcF9saW1iX3QgbXBuX2Rpdm1vZF8xIChtcF9saW1iX3QgKlIxUCwgbXBfbGltYl90ICpTMlAsCiAgICAgICAgICBtcF9zaXplX3QgUzJOLCBtcF9saW1iX3QgUzNMSU1CKQogICAgIERpdmlkZSB7UzJQLCBTMk59IGJ5IFMzTElNQiwgYW5kIHdyaXRlIHRoZSBxdW90aWVudCBhdCBSMVAuCiAgICAgUmV0dXJuIHRoZSByZW1haW5kZXIuCgogICAgIFRoZSBpbnRlZ2VyIHF1b3RpZW50IGlzIHdyaXR0ZW4gdG8ge1IxUCtRWE4sIFMyTn0gYW5kIGluIGFkZGl0aW9uCiAgICAgUVhOIGZyYWN0aW9uIGxpbWJzIGFyZSBkZXZlbG9wZWQgYW5kIHdyaXR0ZW4gdG8ge1IxUCwgUVhOfS4KICAgICBFaXRoZXIgb3IgYm90aCBTMk4gYW5kIFFYTiBjYW4gYmUgemVyby4gIEZvciBtb3N0IHVzYWdlcywgUVhOIHdpbGwKICAgICBiZSB6ZXJvLgoKICAgICBgbXBuX2Rpdm1vZF8xJyBleGlzdHMgZm9yIHVwd2FyZCBzb3VyY2UgY29tcGF0aWJpbGl0eSBhbmQgaXMKICAgICBzaW1wbHkgYSBtYWNybyBjYWxsaW5nIGBtcG5fZGl2cmVtXzEnIHdpdGggYSBRWE4gb2YgMC4KCiAgICAgVGhlIGFyZWFzIGF0IFIxUCBhbmQgUzJQIGhhdmUgdG8gYmUgaWRlbnRpY2FsIG9yIGNvbXBsZXRlbHkKICAgICBzZXBhcmF0ZSwgbm90IHBhcnRpYWxseSBvdmVybGFwcGluZy4KCiAtLSBGdW5jdGlvbjogbXBfbGltYl90IG1wbl9kaXZtb2QgKG1wX2xpbWJfdCAqUjFQLCBtcF9saW1iX3QgKlJTMlAsCiAgICAgICAgICBtcF9zaXplX3QgUlMyTiwgY29uc3QgbXBfbGltYl90ICpTM1AsIG1wX3NpemVfdCBTM04pCiAgICAgW1RoaXMgZnVuY3Rpb24gaXMgb2Jzb2xldGUuICBQbGVhc2UgY2FsbCBgbXBuX3RkaXZfcXInIGluc3RlYWQgZm9yCiAgICAgYmVzdCBwZXJmb3JtYW5jZS5dCgogLS0gTWFjcm86IG1wX2xpbWJfdCBtcG5fZGl2ZXhhY3RfYnkzIChtcF9saW1iX3QgKlJQLCBtcF9saW1iX3QgKlNQLAogICAgICAgICAgbXBfc2l6ZV90IE4pCiAtLSBGdW5jdGlvbjogbXBfbGltYl90IG1wbl9kaXZleGFjdF9ieTNjIChtcF9saW1iX3QgKlJQLCBtcF9saW1iX3QKICAgICAgICAgICpTUCwgbXBfc2l6ZV90IE4sIG1wX2xpbWJfdCBDQVJSWSkKICAgICBEaXZpZGUge1NQLCBOfSBieSAzLCBleHBlY3RpbmcgaXQgdG8gZGl2aWRlIGV4YWN0bHksIGFuZCB3cml0aW5nCiAgICAgdGhlIHJlc3VsdCB0byB7UlAsIE59LiAgSWYgMyBkaXZpZGVzIGV4YWN0bHksIHRoZSByZXR1cm4gdmFsdWUgaXMKICAgICB6ZXJvIGFuZCB0aGUgcmVzdWx0IGlzIHRoZSBxdW90aWVudC4gIElmIG5vdCwgdGhlIHJldHVybiB2YWx1ZSBpcwogICAgIG5vbi16ZXJvIGFuZCB0aGUgcmVzdWx0IHdvbid0IGJlIGFueXRoaW5nIHVzZWZ1bC4KCiAgICAgYG1wbl9kaXZleGFjdF9ieTNjJyB0YWtlcyBhbiBpbml0aWFsIGNhcnJ5IHBhcmFtZXRlciwgd2hpY2ggY2FuIGJlCiAgICAgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGEgcHJldmlvdXMgY2FsbCwgc28gYSBsYXJnZSBjYWxjdWxhdGlvbiBjYW4KICAgICBiZSBkb25lIHBpZWNlIGJ5IHBpZWNlIGZyb20gbG93IHRvIGhpZ2guICBgbXBuX2RpdmV4YWN0X2J5MycgaXMKICAgICBzaW1wbHkgYSBtYWNybyBjYWxsaW5nIGBtcG5fZGl2ZXhhY3RfYnkzYycgd2l0aCBhIDAgY2FycnkKICAgICBwYXJhbWV0ZXIuCgogICAgIFRoZXNlIHJvdXRpbmVzIHVzZSBhIG11bHRpcGx5LWJ5LWludmVyc2UgYW5kIHdpbGwgYmUgZmFzdGVyIHRoYW4KICAgICBgbXBuX2RpdnJlbV8xJyBvbiBDUFVzIHdpdGggZmFzdCBtdWx0aXBsaWNhdGlvbiBidXQgc2xvdyBkaXZpc2lvbi4KCiAgICAgVGhlIHNvdXJjZSBhLCByZXN1bHQgcSwgc2l6ZSBuLCBpbml0aWFsIGNhcnJ5IGksIGFuZCByZXR1cm4gdmFsdWUKICAgICBjIHNhdGlzZnkgYypiXm4gKyBhLWkgPSAzKnEsIHdoZXJlIGI9Ml5HTVBfTlVNQl9CSVRTLiAgVGhlIHJldHVybgogICAgIGMgaXMgYWx3YXlzIDAsIDEgb3IgMiwgYW5kIHRoZSBpbml0aWFsIGNhcnJ5IGkgbXVzdCBhbHNvIGJlIDAsIDEKICAgICBvciAyICh0aGVzZSBhcmUgYm90aCBib3Jyb3dzIHJlYWxseSkuICBXaGVuIGM9MCBjbGVhcmx5IHE9KGEtaSkvMy4KICAgICBXaGVuIGMhPTAsIHRoZSByZW1haW5kZXIgKGEtaSkgbW9kIDMgaXMgZ2l2ZW4gYnkgMy1jLCBiZWNhdXNlIGIgPT0KICAgICAxIG1vZCAzICh3aGVuIGBtcF9iaXRzX3Blcl9saW1iJyBpcyBldmVuLCB3aGljaCBpcyBhbHdheXMgc28KICAgICBjdXJyZW50bHkpLgoKIC0tIEZ1bmN0aW9uOiBtcF9saW1iX3QgbXBuX21vZF8xIChjb25zdCBtcF9saW1iX3QgKlMxUCwgbXBfc2l6ZV90IFMxTiwKICAgICAgICAgIG1wX2xpbWJfdCBTMkxJTUIpCiAgICAgRGl2aWRlIHtTMVAsIFMxTn0gYnkgUzJMSU1CLCBhbmQgcmV0dXJuIHRoZSByZW1haW5kZXIuICBTMU4gY2FuIGJlCiAgICAgemVyby4KCiAtLSBGdW5jdGlvbjogbXBfbGltYl90IG1wbl9sc2hpZnQgKG1wX2xpbWJfdCAqUlAsIGNvbnN0IG1wX2xpbWJfdCAqU1AsCiAgICAgICAgICBtcF9zaXplX3QgTiwgdW5zaWduZWQgaW50IENPVU5UKQogICAgIFNoaWZ0IHtTUCwgTn0gbGVmdCBieSBDT1VOVCBiaXRzLCBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB7UlAsIE59LgogICAgIFRoZSBiaXRzIHNoaWZ0ZWQgb3V0IGF0IHRoZSBsZWZ0IGFyZSByZXR1cm5lZCBpbiB0aGUgbGVhc3QKICAgICBzaWduaWZpY2FudCBDT1VOVCBiaXRzIG9mIHRoZSByZXR1cm4gdmFsdWUgKHRoZSByZXN0IG9mIHRoZSByZXR1cm4KICAgICB2YWx1ZSBpcyB6ZXJvKS4KCiAgICAgQ09VTlQgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMSB0byBtcF9iaXRzX3Blcl9saW1iLTEuICBUaGUgcmVnaW9ucwogICAgIHtTUCwgTn0gYW5kIHtSUCwgTn0gbWF5IG92ZXJsYXAsIHByb3ZpZGVkIFJQID49IFNQLgoKICAgICBUaGlzIGZ1bmN0aW9uIGlzIHdyaXR0ZW4gaW4gYXNzZW1ibHkgZm9yIG1vc3QgQ1BVcy4KCiAtLSBGdW5jdGlvbjogbXBfbGltYl90IG1wbl9yc2hpZnQgKG1wX2xpbWJfdCAqUlAsIGNvbnN0IG1wX2xpbWJfdCAqU1AsCiAgICAgICAgICBtcF9zaXplX3QgTiwgdW5zaWduZWQgaW50IENPVU5UKQogICAgIFNoaWZ0IHtTUCwgTn0gcmlnaHQgYnkgQ09VTlQgYml0cywgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8ge1JQLAogICAgIE59LiAgVGhlIGJpdHMgc2hpZnRlZCBvdXQgYXQgdGhlIHJpZ2h0IGFyZSByZXR1cm5lZCBpbiB0aGUgbW9zdAogICAgIHNpZ25pZmljYW50IENPVU5UIGJpdHMgb2YgdGhlIHJldHVybiB2YWx1ZSAodGhlIHJlc3Qgb2YgdGhlIHJldHVybgogICAgIHZhbHVlIGlzIHplcm8pLgoKICAgICBDT1VOVCBtdXN0IGJlIGluIHRoZSByYW5nZSAxIHRvIG1wX2JpdHNfcGVyX2xpbWItMS4gIFRoZSByZWdpb25zCiAgICAge1NQLCBOfSBhbmQge1JQLCBOfSBtYXkgb3ZlcmxhcCwgcHJvdmlkZWQgUlAgPD0gU1AuCgogICAgIFRoaXMgZnVuY3Rpb24gaXMgd3JpdHRlbiBpbiBhc3NlbWJseSBmb3IgbW9zdCBDUFVzLgoKIC0tIEZ1bmN0aW9uOiBpbnQgbXBuX2NtcCAoY29uc3QgbXBfbGltYl90ICpTMVAsIGNvbnN0IG1wX2xpbWJfdCAqUzJQLAogICAgICAgICAgbXBfc2l6ZV90IE4pCiAgICAgQ29tcGFyZSB7UzFQLCBOfSBhbmQge1MyUCwgTn0gYW5kIHJldHVybiBhIHBvc2l0aXZlIHZhbHVlIGlmIFMxID4KICAgICBTMiwgMCBpZiB0aGV5IGFyZSBlcXVhbCwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpZiBTMSA8IFMyLgoKIC0tIEZ1bmN0aW9uOiBtcF9zaXplX3QgbXBuX2djZCAobXBfbGltYl90ICpSUCwgbXBfbGltYl90ICpYUCwKICAgICAgICAgIG1wX3NpemVfdCBYTiwgbXBfbGltYl90ICpZUCwgbXBfc2l6ZV90IFlOKQogICAgIFNldCB7UlAsIFJFVFZBTH0gdG8gdGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIHtYUCwgWE59IGFuZAogICAgIHtZUCwgWU59LiAgVGhlIHJlc3VsdCBjYW4gYmUgdXAgdG8gWU4gbGltYnMsIHRoZSByZXR1cm4gdmFsdWUgaXMKICAgICB0aGUgYWN0dWFsIG51bWJlciBwcm9kdWNlZC4gIEJvdGggc291cmNlIG9wZXJhbmRzIGFyZSBkZXN0cm95ZWQuCgogICAgIEl0IGlzIHJlcXVpcmVkIHRoYXQgWE4gPj0gWU4gPiAwLCBhbmQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgbGltYiBvZgogICAgIHtZUCwgWU59IG11c3QgYmUgbm9uLXplcm8uICBObyBvdmVybGFwIGlzIHBlcm1pdHRlZCBiZXR3ZWVuIHtYUCwKICAgICBYTn0gYW5kIHtZUCwgWU59LgoKIC0tIEZ1bmN0aW9uOiBtcF9saW1iX3QgbXBuX2djZF8xIChjb25zdCBtcF9saW1iX3QgKlhQLCBtcF9zaXplX3QgWE4sCiAgICAgICAgICBtcF9saW1iX3QgWUxJTUIpCiAgICAgUmV0dXJuIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiB7WFAsIFhOfSBhbmQgWUxJTUIuICBCb3RoCiAgICAgb3BlcmFuZHMgbXVzdCBiZSBub24temVyby4KCiAtLSBGdW5jdGlvbjogbXBfc2l6ZV90IG1wbl9nY2RleHQgKG1wX2xpbWJfdCAqR1AsIG1wX2xpbWJfdCAqU1AsCiAgICAgICAgICBtcF9zaXplX3QgKlNOLCBtcF9saW1iX3QgKlVQLCBtcF9zaXplX3QgVU4sIG1wX2xpbWJfdCAqVlAsCiAgICAgICAgICBtcF9zaXplX3QgVk4pCiAgICAgTGV0IFUgYmUgZGVmaW5lZCBieSB7VVAsIFVOfSBhbmQgbGV0IFYgYmUgZGVmaW5lZCBieSB7VlAsIFZOfS4KCiAgICAgQ29tcHV0ZSB0aGUgZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3IgRyBvZiBVIGFuZCBWLiAgQ29tcHV0ZSBhCiAgICAgY29mYWN0b3IgUyBzdWNoIHRoYXQgRyA9IFVTICsgVlQuICBUaGUgc2Vjb25kIGNvZmFjdG9yIFQgaXMgbm90CiAgICAgY29tcHV0ZWQgYnV0IGNhbiBlYXNpbHkgYmUgb2J0YWluZWQgZnJvbSAoRyAtIFUqUykgLyBWICh0aGUKICAgICBkaXZpc2lvbiB3aWxsIGJlIGV4YWN0KS4gIEl0IGlzIHJlcXVpcmVkIHRoYXQgVU4gPj0gVk4gPiAwLCBhbmQKICAgICB0aGUgbW9zdCBzaWduaWZpY2FudCBsaW1iIG9mIHtWUCwgVk59IG11c3QgYmUgbm9uLXplcm8uCgogICAgIFMgc2F0aXNmaWVzIFMgPSAxIG9yIGFicyhTKSA8IFYgLyAoMiBHKS4gUyA9IDAgaWYgYW5kIG9ubHkgaWYgVgogICAgIGRpdmlkZXMgVSAoaS5lLiwgRyA9IFYpLgoKICAgICBTdG9yZSBHIGF0IEdQIGFuZCBsZXQgdGhlIHJldHVybiB2YWx1ZSBkZWZpbmUgaXRzIGxpbWIgY291bnQuCiAgICAgU3RvcmUgUyBhdCBTUCBhbmQgbGV0IHwqU058IGRlZmluZSBpdHMgbGltYiBjb3VudC4gIFMgY2FuIGJlCiAgICAgbmVnYXRpdmU7IHdoZW4gdGhpcyBoYXBwZW5zICpTTiB3aWxsIGJlIG5lZ2F0aXZlLiAgVGhlIGFyZWEgYXQgR1AKICAgICBzaG91bGQgaGF2ZSByb29tIGZvciBWTiBsaW1icyBhbmQgdGhlIGFyZWEgYXQgU1Agc2hvdWxkIGhhdmUgcm9vbQogICAgIGZvciBWTisxIGxpbWJzLgoKICAgICBCb3RoIHNvdXJjZSBvcGVyYW5kcyBhcmUgZGVzdHJveWVkLgoKICAgICBDb21wYXRpYmlsaXR5IG5vdGVzOiBHTVAgNC4zLjAgYW5kIDQuMy4xIGRlZmluZWQgUyBsZXNzIHN0cmljdGx5LgogICAgIEVhcmxpZXIgYXMgd2VsbCBhcyBsYXRlciBHTVAgcmVsZWFzZXMgZGVmaW5lIFMgYXMgZGVzY3JpYmVkIGhlcmUuCiAgICAgR01QIHJlbGVhc2VzIGJlZm9yZSBHTVAgNC4zLjAgcmVxdWlyZWQgYWRkaXRpb25hbCBzcGFjZSBmb3IgYm90aAogICAgIGlucHV0IGFuZCBvdXRwdXQgYXJlYXMuIE1vcmUgcHJlY2lzZWx5LCB0aGUgYXJlYXMge1VQLCBVTisxfSBhbmQKICAgICB7VlAsIFZOKzF9IHdlcmUgZGVzdHJveWVkIChpLmUuIHRoZSBvcGVyYW5kcyBwbHVzIGFuIGV4dHJhIGxpbWIKICAgICBwYXN0IHRoZSBlbmQgb2YgZWFjaCksIGFuZCB0aGUgYXJlYXMgcG9pbnRlZCB0byBieSBHUCBhbmQgU1AKICAgICBzaG91bGQgZWFjaCBoYXZlIHJvb20gZm9yIFVOKzEgbGltYnMuCgogLS0gRnVuY3Rpb246IG1wX3NpemVfdCBtcG5fc3FydHJlbSAobXBfbGltYl90ICpSMVAsIG1wX2xpbWJfdCAqUjJQLAogICAgICAgICAgY29uc3QgbXBfbGltYl90ICpTUCwgbXBfc2l6ZV90IE4pCiAgICAgQ29tcHV0ZSB0aGUgc3F1YXJlIHJvb3Qgb2Yge1NQLCBOfSBhbmQgcHV0IHRoZSByZXN1bHQgYXQge1IxUCwKICAgICBjZWlsKE4vMil9IGFuZCB0aGUgcmVtYWluZGVyIGF0IHtSMlAsIFJFVFZBTH0uICBSMlAgbmVlZHMgc3BhY2UKICAgICBmb3IgTiBsaW1icywgYnV0IHRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIGhvdyBtYW55IGFyZSBwcm9kdWNlZC4KCiAgICAgVGhlIG1vc3Qgc2lnbmlmaWNhbnQgbGltYiBvZiB7U1AsIE59IG11c3QgYmUgbm9uLXplcm8uICBUaGUgYXJlYXMKICAgICB7UjFQLCBjZWlsKE4vMil9IGFuZCB7U1AsIE59IG11c3QgYmUgY29tcGxldGVseSBzZXBhcmF0ZS4gIFRoZQogICAgIGFyZWFzIHtSMlAsIE59IGFuZCB7U1AsIE59IG11c3QgYmUgZWl0aGVyIGlkZW50aWNhbCBvciBjb21wbGV0ZWx5CiAgICAgc2VwYXJhdGUuCgogICAgIElmIHRoZSByZW1haW5kZXIgaXMgbm90IHdhbnRlZCB0aGVuIFIyUCBjYW4gYmUgYE5VTEwnLCBhbmQgaW4gdGhpcwogICAgIGNhc2UgdGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvIG9yIG5vbi16ZXJvIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZQogICAgIHJlbWFpbmRlciB3b3VsZCBoYXZlIGJlZW4gemVybyBvciBub24temVyby4KCiAgICAgQSByZXR1cm4gdmFsdWUgb2YgemVybyBpbmRpY2F0ZXMgYSBwZXJmZWN0IHNxdWFyZS4gIFNlZSBhbHNvCiAgICAgYG1wbl9wZXJmZWN0X3NxdWFyZV9wJy4KCiAtLSBGdW5jdGlvbjogc2l6ZV90IG1wbl9zaXplaW5iYXNlIChjb25zdCBtcF9saW1iX3QgKlhQLCBtcF9zaXplX3QgTiwKICAgICAgICAgIGludCBCQVNFKQogICAgIFJldHVybiB0aGUgc2l6ZSBvZiB7WFAsTn0gbWVhc3VyZWQgaW4gbnVtYmVyIG9mIGRpZ2l0cyBpbiB0aGUKICAgICBnaXZlbiBCQVNFLiAgQkFTRSBjYW4gdmFyeSBmcm9tIDIgdG8gNjIuICBSZXF1aXJlcyBOID4gMCBhbmQKICAgICBYUFtOLTFdID4gMC4gIFRoZSByZXN1bHQgd2lsbCBiZSBlaXRoZXIgZXhhY3Qgb3IgMSB0b28gYmlnLiAgSWYKICAgICBCQVNFIGlzIGEgcG93ZXIgb2YgMiwgdGhlIHJlc3VsdCBpcyBhbHdheXMgZXhhY3QuCgogLS0gRnVuY3Rpb246IG1wX3NpemVfdCBtcG5fZ2V0X3N0ciAodW5zaWduZWQgY2hhciAqU1RSLCBpbnQgQkFTRSwKICAgICAgICAgIG1wX2xpbWJfdCAqUzFQLCBtcF9zaXplX3QgUzFOKQogICAgIENvbnZlcnQge1MxUCwgUzFOfSB0byBhIHJhdyB1bnNpZ25lZCBjaGFyIGFycmF5IGF0IFNUUiBpbiBiYXNlCiAgICAgQkFTRSwgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJvZHVjZWQuICBUaGVyZSBtYXkgYmUKICAgICBsZWFkaW5nIHplcm9zIGluIHRoZSBzdHJpbmcuICBUaGUgc3RyaW5nIGlzIG5vdCBpbiBBU0NJSTsgdG8KICAgICBjb252ZXJ0IGl0IHRvIHByaW50YWJsZSBmb3JtYXQsIGFkZCB0aGUgQVNDSUkgY29kZXMgZm9yIGAwJyBvcgogICAgIGBBJywgZGVwZW5kaW5nIG9uIHRoZSBiYXNlIGFuZCByYW5nZS4gIEJBU0UgY2FuIHZhcnkgZnJvbSAyIHRvIDI1Ni4KCiAgICAgVGhlIG1vc3Qgc2lnbmlmaWNhbnQgbGltYiBvZiB0aGUgaW5wdXQge1MxUCwgUzFOfSBtdXN0IGJlCiAgICAgbm9uLXplcm8uICBUaGUgaW5wdXQge1MxUCwgUzFOfSBpcyBjbG9iYmVyZWQsIGV4Y2VwdCB3aGVuIEJBU0UgaXMKICAgICBhIHBvd2VyIG9mIDIsIGluIHdoaWNoIGNhc2UgaXQncyB1bmNoYW5nZWQuCgogICAgIFRoZSBhcmVhIGF0IFNUUiBoYXMgdG8gaGF2ZSBzcGFjZSBmb3IgdGhlIGxhcmdlc3QgcG9zc2libGUgbnVtYmVyCiAgICAgcmVwcmVzZW50ZWQgYnkgYSBTMU4gbG9uZyBsaW1iIGFycmF5LCBwbHVzIG9uZSBleHRyYSBjaGFyYWN0ZXIuCgogLS0gRnVuY3Rpb246IG1wX3NpemVfdCBtcG5fc2V0X3N0ciAobXBfbGltYl90ICpSUCwgY29uc3QgdW5zaWduZWQgY2hhcgogICAgICAgICAgKlNUUiwgc2l6ZV90IFNUUlNJWkUsIGludCBCQVNFKQogICAgIENvbnZlcnQgYnl0ZXMge1NUUixTVFJTSVpFfSBpbiB0aGUgZ2l2ZW4gQkFTRSB0byBsaW1icyBhdCBSUC4KCiAgICAgU1RSWzBdIGlzIHRoZSBtb3N0IHNpZ25pZmljYW50IGlucHV0IGJ5dGUgYW5kIFNUUltTVFJTSVpFLTFdIGlzCiAgICAgdGhlIGxlYXN0IHNpZ25pZmljYW50IGlucHV0IGJ5dGUuICBFYWNoIGJ5dGUgc2hvdWxkIGJlIGEgdmFsdWUgaW4KICAgICB0aGUgcmFuZ2UgMCB0byBCQVNFLTEsIG5vdCBhbiBBU0NJSSBjaGFyYWN0ZXIuICBCQVNFIGNhbiB2YXJ5IGZyb20KICAgICAyIHRvIDI1Ni4KCiAgICAgVGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyB7UlAsUk59IHdoZXJlIFJOIGlzIHRoZSByZXR1cm4gdmFsdWUuICBJZgogICAgIHRoZSBtb3N0IHNpZ25pZmljYW50IGlucHV0IGJ5dGUgU1RSWzBdIGlzIG5vbi16ZXJvLCB0aGVuIFJQW1JOLTFdCiAgICAgd2lsbCBiZSBub24temVybywgZWxzZSBSUFtSTi0xXSBhbmQgc29tZSBudW1iZXIgb2Ygc3Vic2VxdWVudAogICAgIGxpbWJzIG1heSBiZSB6ZXJvLgoKICAgICBUaGUgYXJlYSBhdCBSUCBoYXMgdG8gaGF2ZSBzcGFjZSBmb3IgdGhlIGxhcmdlc3QgcG9zc2libGUgbnVtYmVyCiAgICAgd2l0aCBTVFJTSVpFIGRpZ2l0cyBpbiB0aGUgY2hvc2VuIGJhc2UsIHBsdXMgb25lIGV4dHJhIGxpbWIuCgogICAgIFRoZSBpbnB1dCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGJ5dGUsIGFuZCBubyBvdmVybGFwIGlzIHBlcm1pdHRlZAogICAgIGJldHdlZW4ge1NUUixTVFJTSVpFfSBhbmQgdGhlIHJlc3VsdCBhdCBSUC4KCiAtLSBGdW5jdGlvbjogbXBfYml0Y250X3QgbXBuX3NjYW4wIChjb25zdCBtcF9saW1iX3QgKlMxUCwgbXBfYml0Y250X3QKICAgICAgICAgIEJJVCkKICAgICBTY2FuIFMxUCBmcm9tIGJpdCBwb3NpdGlvbiBCSVQgZm9yIHRoZSBuZXh0IGNsZWFyIGJpdC4KCiAgICAgSXQgaXMgcmVxdWlyZWQgdGhhdCB0aGVyZSBiZSBhIGNsZWFyIGJpdCB3aXRoaW4gdGhlIGFyZWEgYXQgUzFQIGF0CiAgICAgb3IgYmV5b25kIGJpdCBwb3NpdGlvbiBCSVQsIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIGhhcyBzb21ldGhpbmcgdG8KICAgICByZXR1cm4uCgogLS0gRnVuY3Rpb246IG1wX2JpdGNudF90IG1wbl9zY2FuMSAoY29uc3QgbXBfbGltYl90ICpTMVAsIG1wX2JpdGNudF90CiAgICAgICAgICBCSVQpCiAgICAgU2NhbiBTMVAgZnJvbSBiaXQgcG9zaXRpb24gQklUIGZvciB0aGUgbmV4dCBzZXQgYml0LgoKICAgICBJdCBpcyByZXF1aXJlZCB0aGF0IHRoZXJlIGJlIGEgc2V0IGJpdCB3aXRoaW4gdGhlIGFyZWEgYXQgUzFQIGF0IG9yCiAgICAgYmV5b25kIGJpdCBwb3NpdGlvbiBCSVQsIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIGhhcyBzb21ldGhpbmcgdG8KICAgICByZXR1cm4uCgogLS0gRnVuY3Rpb246IHZvaWQgbXBuX3JhbmRvbSAobXBfbGltYl90ICpSMVAsIG1wX3NpemVfdCBSMU4pCiAtLSBGdW5jdGlvbjogdm9pZCBtcG5fcmFuZG9tMiAobXBfbGltYl90ICpSMVAsIG1wX3NpemVfdCBSMU4pCiAgICAgR2VuZXJhdGUgYSByYW5kb20gbnVtYmVyIG9mIGxlbmd0aCBSMU4gYW5kIHN0b3JlIGl0IGF0IFIxUC4gIFRoZQogICAgIG1vc3Qgc2lnbmlmaWNhbnQgbGltYiBpcyBhbHdheXMgbm9uLXplcm8uICBgbXBuX3JhbmRvbScgZ2VuZXJhdGVzCiAgICAgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIGxpbWIgZGF0YSwgYG1wbl9yYW5kb20yJyBnZW5lcmF0ZXMgbG9uZwogICAgIHN0cmluZ3Mgb2YgemVyb3MgYW5kIG9uZXMgaW4gdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbi4KCiAgICAgYG1wbl9yYW5kb20yJyBpcyBpbnRlbmRlZCBmb3IgdGVzdGluZyB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGBtcG4nCiAgICAgcm91dGluZXMuCgogLS0gRnVuY3Rpb246IG1wX2JpdGNudF90IG1wbl9wb3Bjb3VudCAoY29uc3QgbXBfbGltYl90ICpTMVAsIG1wX3NpemVfdAogICAgICAgICAgTikKICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIHNldCBiaXRzIGluIHtTMVAsIE59LgoKIC0tIEZ1bmN0aW9uOiBtcF9iaXRjbnRfdCBtcG5faGFtZGlzdCAoY29uc3QgbXBfbGltYl90ICpTMVAsIGNvbnN0CiAgICAgICAgICBtcF9saW1iX3QgKlMyUCwgbXBfc2l6ZV90IE4pCiAgICAgQ29tcHV0ZSB0aGUgaGFtbWluZyBkaXN0YW5jZSBiZXR3ZWVuIHtTMVAsIE59IGFuZCB7UzJQLCBOfSwgd2hpY2gKICAgICBpcyB0aGUgbnVtYmVyIG9mIGJpdCBwb3NpdGlvbnMgd2hlcmUgdGhlIHR3byBvcGVyYW5kcyBoYXZlCiAgICAgZGlmZmVyZW50IGJpdCB2YWx1ZXMuCgogLS0gRnVuY3Rpb246IGludCBtcG5fcGVyZmVjdF9zcXVhcmVfcCAoY29uc3QgbXBfbGltYl90ICpTMVAsIG1wX3NpemVfdAogICAgICAgICAgTikKICAgICBSZXR1cm4gbm9uLXplcm8gaWZmIHtTMVAsIE59IGlzIGEgcGVyZmVjdCBzcXVhcmUuICBUaGUgbW9zdAogICAgIHNpZ25pZmljYW50IGxpbWIgb2YgdGhlIGlucHV0IHtTMVAsIE59IG11c3QgYmUgbm9uLXplcm8uCgogLS0gRnVuY3Rpb246IHZvaWQgbXBuX2FuZF9uIChtcF9saW1iX3QgKlJQLCBjb25zdCBtcF9saW1iX3QgKlMxUCwKICAgICAgICAgIGNvbnN0IG1wX2xpbWJfdCAqUzJQLCBtcF9zaXplX3QgTikKICAgICBQZXJmb3JtIHRoZSBiaXR3aXNlIGxvZ2ljYWwgYW5kIG9mIHtTMVAsIE59IGFuZCB7UzJQLCBOfSwgYW5kCiAgICAgd3JpdGUgdGhlIHJlc3VsdCB0byB7UlAsIE59LgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wbl9pb3JfbiAobXBfbGltYl90ICpSUCwgY29uc3QgbXBfbGltYl90ICpTMVAsCiAgICAgICAgICBjb25zdCBtcF9saW1iX3QgKlMyUCwgbXBfc2l6ZV90IE4pCiAgICAgUGVyZm9ybSB0aGUgYml0d2lzZSBsb2dpY2FsIGluY2x1c2l2ZSBvciBvZiB7UzFQLCBOfSBhbmQge1MyUCwgTn0sCiAgICAgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8ge1JQLCBOfS4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcG5feG9yX24gKG1wX2xpbWJfdCAqUlAsIGNvbnN0IG1wX2xpbWJfdCAqUzFQLAogICAgICAgICAgY29uc3QgbXBfbGltYl90ICpTMlAsIG1wX3NpemVfdCBOKQogICAgIFBlcmZvcm0gdGhlIGJpdHdpc2UgbG9naWNhbCBleGNsdXNpdmUgb3Igb2Yge1MxUCwgTn0gYW5kIHtTMlAsIE59LAogICAgIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHtSUCwgTn0uCgogLS0gRnVuY3Rpb246IHZvaWQgbXBuX2FuZG5fbiAobXBfbGltYl90ICpSUCwgY29uc3QgbXBfbGltYl90ICpTMVAsCiAgICAgICAgICBjb25zdCBtcF9saW1iX3QgKlMyUCwgbXBfc2l6ZV90IE4pCiAgICAgUGVyZm9ybSB0aGUgYml0d2lzZSBsb2dpY2FsIGFuZCBvZiB7UzFQLCBOfSBhbmQgdGhlIGJpdHdpc2UKICAgICBjb21wbGVtZW50IG9mIHtTMlAsIE59LCBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB7UlAsIE59LgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wbl9pb3JuX24gKG1wX2xpbWJfdCAqUlAsIGNvbnN0IG1wX2xpbWJfdCAqUzFQLAogICAgICAgICAgY29uc3QgbXBfbGltYl90ICpTMlAsIG1wX3NpemVfdCBOKQogICAgIFBlcmZvcm0gdGhlIGJpdHdpc2UgbG9naWNhbCBpbmNsdXNpdmUgb3Igb2Yge1MxUCwgTn0gYW5kIHRoZQogICAgIGJpdHdpc2UgY29tcGxlbWVudCBvZiB7UzJQLCBOfSwgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8ge1JQLCBOfS4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcG5fbmFuZF9uIChtcF9saW1iX3QgKlJQLCBjb25zdCBtcF9saW1iX3QgKlMxUCwKICAgICAgICAgIGNvbnN0IG1wX2xpbWJfdCAqUzJQLCBtcF9zaXplX3QgTikKICAgICBQZXJmb3JtIHRoZSBiaXR3aXNlIGxvZ2ljYWwgYW5kIG9mIHtTMVAsIE59IGFuZCB7UzJQLCBOfSwgYW5kCiAgICAgd3JpdGUgdGhlIGJpdHdpc2UgY29tcGxlbWVudCBvZiB0aGUgcmVzdWx0IHRvIHtSUCwgTn0uCgogLS0gRnVuY3Rpb246IHZvaWQgbXBuX25pb3JfbiAobXBfbGltYl90ICpSUCwgY29uc3QgbXBfbGltYl90ICpTMVAsCiAgICAgICAgICBjb25zdCBtcF9saW1iX3QgKlMyUCwgbXBfc2l6ZV90IE4pCiAgICAgUGVyZm9ybSB0aGUgYml0d2lzZSBsb2dpY2FsIGluY2x1c2l2ZSBvciBvZiB7UzFQLCBOfSBhbmQge1MyUCwgTn0sCiAgICAgYW5kIHdyaXRlIHRoZSBiaXR3aXNlIGNvbXBsZW1lbnQgb2YgdGhlIHJlc3VsdCB0byB7UlAsIE59LgoKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wbl94bm9yX24gKG1wX2xpbWJfdCAqUlAsIGNvbnN0IG1wX2xpbWJfdCAqUzFQLAogICAgICAgICAgY29uc3QgbXBfbGltYl90ICpTMlAsIG1wX3NpemVfdCBOKQogICAgIFBlcmZvcm0gdGhlIGJpdHdpc2UgbG9naWNhbCBleGNsdXNpdmUgb3Igb2Yge1MxUCwgTn0gYW5kIHtTMlAsIE59LAogICAgIGFuZCB3cml0ZSB0aGUgYml0d2lzZSBjb21wbGVtZW50IG9mIHRoZSByZXN1bHQgdG8ge1JQLCBOfS4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcG5fY29tIChtcF9saW1iX3QgKlJQLCBjb25zdCBtcF9saW1iX3QgKlNQLAogICAgICAgICAgbXBfc2l6ZV90IE4pCiAgICAgUGVyZm9ybSB0aGUgYml0d2lzZSBjb21wbGVtZW50IG9mIHtTUCwgTn0sIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvCiAgICAge1JQLCBOfS4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcG5fY29weWkgKG1wX2xpbWJfdCAqUlAsIGNvbnN0IG1wX2xpbWJfdCAqUzFQLAogICAgICAgICAgbXBfc2l6ZV90IE4pCiAgICAgQ29weSBmcm9tIHtTMVAsIE59IHRvIHtSUCwgTn0sIGluY3JlYXNpbmdseS4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcG5fY29weWQgKG1wX2xpbWJfdCAqUlAsIGNvbnN0IG1wX2xpbWJfdCAqUzFQLAogICAgICAgICAgbXBfc2l6ZV90IE4pCiAgICAgQ29weSBmcm9tIHtTMVAsIE59IHRvIHtSUCwgTn0sIGRlY3JlYXNpbmdseS4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcG5femVybyAobXBfbGltYl90ICpSUCwgbXBfc2l6ZV90IE4pCiAgICAgWmVybyB7UlAsIE59LgoKCjguMSBMb3ctbGV2ZWwgZnVuY3Rpb25zIGZvciBjcnlwdG9ncmFwaHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIGZ1bmN0aW9ucyBwcmVmaXhlZCB3aXRoIGBtcG5fc2VjXycgYW5kIGBtcG5fY25kXycgYXJlIGRlc2lnbmVkIHRvCnBlcmZvcm0gdGhlIGV4YWN0IHNhbWUgbG93LWxldmVsIG9wZXJhdGlvbnMgYW5kIGhhdmUgdGhlIHNhbWUgY2FjaGUKYWNjZXNzIHBhdHRlcm5zIGZvciBhbnkgdHdvIHNhbWUtc2l6ZSBhcmd1bWVudHMsIGFzc3VtaW5nIHRoYXQgZnVuY3Rpb24KYXJndW1lbnRzIGFyZSBwbGFjZWQgYXQgdGhlIHNhbWUgcG9zaXRpb24gYW5kIHRoYXQgdGhlIG1hY2hpbmUgc3RhdGUgaXMKaWRlbnRpY2FsIHVwb24gZnVuY3Rpb24gZW50cnkuICBUaGVzZSBmdW5jdGlvbnMgYXJlIGludGVuZGVkIGZvcgpjcnlwdG9ncmFwaGljIHB1cnBvc2VzLCB3aGVyZSByZXNpbGllbmNlIHRvIHNpZGUtY2hhbm5lbCBhdHRhY2tzIGlzCmRlc2lyZWQuCgogICBUaGVzZSBmdW5jdGlvbnMgYXJlIGxlc3MgZWZmaWNpZW50IHRoYW4gdGhlaXIgImxlYWt5IiBjb3VudGVycGFydHM7CnRoZWlyIHBlcmZvcm1hbmNlIGZvciBvcGVyYW5kcyBvZiB0aGUgc2l6ZXMgdHlwaWNhbGx5IHVzZWQgZm9yCmNyeXB0b2dyYXBoaWMgYXBwbGljYXRpb25zIGlzIGJldHdlZW4gMTUlIGFuZCAxMDAlIHdvcnNlLiAgRm9yIGxhcmdlcgpvcGVyYW5kcywgdGhlc2UgZnVuY3Rpb25zIG1pZ2h0IGJlIGluYWRlcXVhdGUsIHNpbmNlIHRoZXkgcmVseSBvbgphc3ltcHRvdGljYWxseSBlbGVtZW50YXJ5IGFsZ29yaXRobXMuCgogICBUaGVzZSBmdW5jdGlvbnMgZG8gbm90IG1ha2UgYW55IGV4cGxpY2l0IGFsbG9jYXRpb25zLiAgVGhvc2Ugb2YKdGhlc2UgZnVuY3Rpb25zIHRoYXQgbmVlZCBzY3JhdGNoIHNwYWNlIGFjY2VwdCBhIHNjcmF0Y2ggc3BhY2Ugb3BlcmFuZC4KVGhpcyBjb252ZW50aW9uIGFsbG93cyBjYWxsZXJzIHRvIGtlZXAgc2Vuc2l0aXZlIGRhdGEgaW4gZGVzaWduYXRlZAptZW1vcnkgYXJlYXMuICBOb3RlIGhvd2V2ZXIgdGhhdCBjb21waWxlcnMgbWF5IGNob29zZSB0byBzcGlsbCBzY2FsYXIKdmFsdWVzIHVzZWQgd2l0aGluIHRoZXNlIGZ1bmN0aW9ucyB0byB0aGVpciBzdGFjayBmcmFtZSBhbmQgdGhhdCBzdWNoCnNjYWxhcnMgbWF5IGNvbnRhaW4gc2Vuc2l0aXZlIGRhdGEuCgogICBJbiBhZGRpdGlvbiB0byB0aGVzZSBzcGVjaWFsbHkgY3JhZnRlZCBmdW5jdGlvbnMsIHRoZSBmb2xsb3dpbmcgYG1wbicKZnVuY3Rpb25zIGFyZSBuYXR1cmFsbHkgc2lkZS1jaGFubmVsIHJlc2lzdGFudDogYG1wbl9hZGRfbicsCmBtcG5fc3ViX24nLCBgbXBuX2xzaGlmdCcsIGBtcG5fcnNoaWZ0JywgYG1wbl96ZXJvJywgYG1wbl9jb3B5aScsCmBtcG5fY29weWQnLCBgbXBuX2NvbScsIGFuZCB0aGUgbG9naWNhbCBmdW5jdGlvbiAoYG1wbl9hbmRfbicsIGV0YykuCgogICBUaGVyZSBhcmUgc29tZSBleGNlcHRpb25zIGZyb20gdGhlIHNpZGUtY2hhbm5lbCByZXNpbGllbmNlOiAoMSkgU29tZQphc3NlbWJseSBpbXBsZW1lbnRhdGlvbnMgb2YgYG1wbl9sc2hpZnQnIGlkZW50aWZ5IHNoaWZ0LWJ5LW9uZSBhcyBhCnNwZWNpYWwgY2FzZS4gIFRoaXMgaXMgYSBwcm9ibGVtIGlmZiB0aGUgc2hpZnQgY291bnQgaXMgYSBmdW5jdGlvbiBvZgpzZW5zaXRpdmUgZGF0YS4gICgyKSBBbHBoYSBldjYgYW5kIFBlbnRpdW00IHVzaW5nIDY0LWJpdCBsaW1icyBoYXZlCmxlYWt5IGBtcG5fYWRkX24nIGFuZCBgbXBuX3N1Yl9uJy4gICgzKSBBbHBoYSBldjYgaGFzIGEgbGVha3kKYG1wbl9tdWxfMScgd2hpY2ggYWxzbyBtYWtlcyBgbXBuX3NlY19tdWwnIG9uIHRob3NlIHN5c3RlbXMgdW5zYWZlLgoKIC0tIEZ1bmN0aW9uOiBtcF9saW1iX3QgbXBuX2NuZF9hZGRfbiAobXBfbGltYl90IENORCwgbXBfbGltYl90ICpSUCwKICAgICAgICAgIGNvbnN0IG1wX2xpbWJfdCAqUzFQLCBjb25zdCBtcF9saW1iX3QgKlMyUCwgbXBfc2l6ZV90IE4pCiAtLSBGdW5jdGlvbjogbXBfbGltYl90IG1wbl9jbmRfc3ViX24gKG1wX2xpbWJfdCBDTkQsIG1wX2xpbWJfdCAqUlAsCiAgICAgICAgICBjb25zdCBtcF9saW1iX3QgKlMxUCwgY29uc3QgbXBfbGltYl90ICpTMlAsIG1wX3NpemVfdCBOKQogICAgIFRoZXNlIGZ1bmN0aW9ucyBkbyBjb25kaXRpb25hbCBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24uICBJZiBDTkQgaXMKICAgICBub24temVybywgdGhleSBwcm9kdWNlIHRoZSBzYW1lIHJlc3VsdCBhcyBhIHJlZ3VsYXIgYG1wbl9hZGRfbicgb3IKICAgICBgbXBuX3N1Yl9uJywgYW5kIGlmIENORCBpcyB6ZXJvLCB0aGV5IGNvcHkge1MxUCxOfSB0byB0aGUgcmVzdWx0CiAgICAgYXJlYSBhbmQgcmV0dXJuIHplcm8uICBUaGUgZnVuY3Rpb25zIGFyZSBkZXNpZ25lZCB0byBoYXZlIHRpbWluZwogICAgIGFuZCBtZW1vcnkgYWNjZXNzIHBhdHRlcm5zIGRlcGVuZGluZyBvbmx5IG9uIHNpemUgYW5kIGxvY2F0aW9uIG9mCiAgICAgdGhlIGRhdGEgYXJlYXMsIGJ1dCBpbmRlcGVuZGVudCBvZiB0aGUgY29uZGl0aW9uIENORC4gIExpa2UgZm9yCiAgICAgYG1wbl9hZGRfbicgYW5kIGBtcG5fc3ViX24nLCBvbiBtb3N0IG1hY2hpbmVzLCB0aGUgdGltaW5nIHdpbGwKICAgICBhbHNvIGJlIGluZGVwZW5kZW50IG9mIHRoZSBhY3R1YWwgbGltYiB2YWx1ZXMuCgogLS0gRnVuY3Rpb246IG1wX2xpbWJfdCBtcG5fc2VjX2FkZF8xIChtcF9saW1iX3QgKlJQLCBjb25zdCBtcF9saW1iX3QKICAgICAgICAgICpBUCwgbXBfc2l6ZV90IE4sIG1wX2xpbWJfdCBCLCBtcF9saW1iX3QgKlRQKQogLS0gRnVuY3Rpb246IG1wX2xpbWJfdCBtcG5fc2VjX3N1Yl8xIChtcF9saW1iX3QgKlJQLCBjb25zdCBtcF9saW1iX3QKICAgICAgICAgICpBUCwgbXBfc2l6ZV90IE4sIG1wX2xpbWJfdCBCLCBtcF9saW1iX3QgKlRQKQogICAgIFNldCBSIHRvIEEgKyBCIG9yIEEgLSBCLCByZXNwZWN0aXZlbHksIHdoZXJlIFIgPSB7UlAsTn0sIEEgPQogICAgIHtBUCxOfSwgYW5kIEIgaXMgYSBzaW5nbGUgbGltYi4gUmV0dXJucyBjYXJyeS4KCiAgICAgVGhlc2UgZnVuY3Rpb25zIHRha2UgTyhOKSB0aW1lLCB1bmxpa2UgdGhlIGxlYWt5IGZ1bmN0aW9ucwogICAgIGBtcG5fYWRkXzEnIHdoaWNoIGFyZSBPKDEpIG9uIGF2ZXJhZ2UuIFRoZXkgcmVxdWlyZSBzY3JhdGNoIHNwYWNlCiAgICAgb2YgYG1wbl9zZWNfYWRkXzFfaXRjaChOKScgYW5kIGBtcG5fc2VjX3N1Yl8xX2l0Y2goTiknIGxpbWJzLAogICAgIHJlc3BlY3RpdmVseSwgdG8gYmUgcGFzc2VkIGluIHRoZSBUUCBwYXJhbWV0ZXIuIFRoZSBzY3JhdGNoIHNwYWNlCiAgICAgcmVxdWlyZW1lbnRzIGFyZSBndWFyYW50ZWVkIHRvIGluY3JlYXNlIG1vbm90b25vdXNseSBpbiB0aGUKICAgICBvcGVyYW5kIHNpemUuCgogLS0gRnVuY3Rpb246IHZvaWQgbXBuX3NlY19tdWwgKG1wX2xpbWJfdCAqUlAsIGNvbnN0IG1wX2xpbWJfdCAqQVAsCiAgICAgICAgICBtcF9zaXplX3QgQU4sIGNvbnN0IG1wX2xpbWJfdCAqQlAsIG1wX3NpemVfdCBCTiwgbXBfbGltYl90CiAgICAgICAgICAqVFApCiAtLSBGdW5jdGlvbjogbXBfc2l6ZV90IG1wbl9zZWNfbXVsX2l0Y2ggKG1wX3NpemVfdCBBTiwgbXBfc2l6ZV90IEJOKQogICAgIFNldCBSIHRvIEEgKiBCLCB3aGVyZSBBID0ge0FQLEFOfSwgQiA9IHtCUCxCTn0sIGFuZCBSID0ge1JQLEFOK0JOfS4KCiAgICAgSXQgaXMgcmVxdWlyZWQgdGhhdCBBTiA+PSBCTiA+IDAuCgogICAgIE5vIG92ZXJsYXBwaW5nIGJldHdlZW4gUiBhbmQgdGhlIGlucHV0IG9wZXJhbmRzIGlzIGFsbG93ZWQuICBGb3IgQQogICAgID0gQiwgdXNlIGBtcG5fc2VjX3NxcicgZm9yIG9wdGltYWwgcGVyZm9ybWFuY2UuCgogICAgIFRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgc2NyYXRjaCBzcGFjZSBvZiBgbXBuX3NlY19tdWxfaXRjaChBTiwgQk4pJwogICAgIGxpbWJzIHRvIGJlIHBhc3NlZCBpbiB0aGUgVFAgcGFyYW1ldGVyLiAgVGhlIHNjcmF0Y2ggc3BhY2UKICAgICByZXF1aXJlbWVudHMgYXJlIGd1YXJhbnRlZWQgdG8gaW5jcmVhc2UgbW9ub3Rvbm91c2x5IGluIHRoZQogICAgIG9wZXJhbmQgc2l6ZXMuCgogLS0gRnVuY3Rpb246IHZvaWQgbXBuX3NlY19zcXIgKG1wX2xpbWJfdCAqUlAsIGNvbnN0IG1wX2xpbWJfdCAqQVAsCiAgICAgICAgICBtcF9zaXplX3QgQU4sIG1wX2xpbWJfdCAqVFApCiAtLSBGdW5jdGlvbjogbXBfc2l6ZV90IG1wbl9zZWNfc3FyX2l0Y2ggKG1wX3NpemVfdCBBTikKICAgICBTZXQgUiB0byBBXjIsIHdoZXJlIEEgPSB7QVAsQU59LCBhbmQgUiA9IHtSUCwyQU59LgoKICAgICBJdCBpcyByZXF1aXJlZCB0aGF0IEFOID4gMC4KCiAgICAgTm8gb3ZlcmxhcHBpbmcgYmV0d2VlbiBSIGFuZCB0aGUgaW5wdXQgb3BlcmFuZHMgaXMgYWxsb3dlZC4KCiAgICAgVGhpcyBmdW5jdGlvbiByZXF1aXJlcyBzY3JhdGNoIHNwYWNlIG9mIGBtcG5fc2VjX3Nxcl9pdGNoKEFOKScKICAgICBsaW1icyB0byBiZSBwYXNzZWQgaW4gdGhlIFRQIHBhcmFtZXRlci4gIFRoZSBzY3JhdGNoIHNwYWNlCiAgICAgcmVxdWlyZW1lbnRzIGFyZSBndWFyYW50ZWVkIHRvIGluY3JlYXNlIG1vbm90b25vdXNseSBpbiB0aGUKICAgICBvcGVyYW5kIHNpemUuCgogLS0gRnVuY3Rpb246IHZvaWQgbXBuX3NlY19wb3dtIChtcF9saW1iX3QgKlJQLCBjb25zdCBtcF9saW1iX3QgKkJQLAogICAgICAgICAgbXBfc2l6ZV90IEJOLCBjb25zdCBtcF9saW1iX3QgKkVQLCBtcF9iaXRjbnRfdCBFTkIsIGNvbnN0CiAgICAgICAgICBtcF9saW1iX3QgKk1QLCBtcF9zaXplX3QgTiwgbXBfbGltYl90ICpUUCkKIC0tIEZ1bmN0aW9uOiBtcF9zaXplX3QgbXBuX3NlY19wb3dtX2l0Y2ggKG1wX3NpemVfdCBCTiwgbXBfYml0Y250X3QKICAgICAgICAgIEVOQiwgc2l6ZV90IE4pCiAgICAgU2V0IFIgdG8gKEIgcmFpc2VkIHRvIEUpIG1vZHVsbyBNLCB3aGVyZSBSID0ge1JQLE59LCBNID0ge01QLE59LAogICAgIGFuZCBFID0ge0VQLGNlaWwoRU5CIC8gYEdNUF9OVU1CX0JJVFMnKX0uCgogICAgIEl0IGlzIHJlcXVpcmVkIHRoYXQgQiA+IDAsIHRoYXQgTSA+IDAgaXMgb2RkLCBhbmQgdGhhdCBFIDwgMl5FTkIuCgogICAgIE5vIG92ZXJsYXBwaW5nIGJldHdlZW4gUiBhbmQgdGhlIGlucHV0IG9wZXJhbmRzIGlzIGFsbG93ZWQuCgogICAgIFRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgc2NyYXRjaCBzcGFjZSBvZiBgbXBuX3NlY19wb3dtX2l0Y2goQk4sCiAgICAgRU5CLCBOKScgbGltYnMgdG8gYmUgcGFzc2VkIGluIHRoZSBUUCBwYXJhbWV0ZXIuICBUaGUgc2NyYXRjaAogICAgIHNwYWNlIHJlcXVpcmVtZW50cyBhcmUgZ3VhcmFudGVlZCB0byBpbmNyZWFzZSBtb25vdG9ub3VzbHkgaW4gdGhlCiAgICAgb3BlcmFuZCBzaXplcy4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcG5fc2VjX3RhYnNlbGVjdCAobXBfbGltYl90ICpSUCwgY29uc3QgbXBfbGltYl90CiAgICAgICAgICAqVEFCLCBtcF9zaXplX3QgTiwgbXBfc2l6ZV90IE5FTlRTLCBtcF9zaXplX3QgV0hJQ0gpCiAgICAgU2VsZWN0IGVudHJ5IFdISUNIIGZyb20gdGFibGUgVEFCLCB3aGljaCBoYXMgTkVOVFMgZW50cmllcywgZWFjaCBOCiAgICAgbGltYnMuICBTdG9yZSB0aGUgc2VsZWN0ZWQgZW50cnkgYXQgUlAuCgogICAgIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGVudGlyZSB0YWJsZSB0byBhdm9pZCBzaWRlLWNoYW5uZWwKICAgICBpbmZvcm1hdGlvbiBsZWFrcy4KCiAtLSBGdW5jdGlvbjogbXBfbGltYl90IG1wbl9zZWNfZGl2X3FyIChtcF9saW1iX3QgKlFQLCBtcF9saW1iX3QgKk5QLAogICAgICAgICAgbXBfc2l6ZV90IE5OLCBjb25zdCBtcF9saW1iX3QgKkRQLCBtcF9zaXplX3QgRE4sIG1wX2xpbWJfdAogICAgICAgICAgKlRQKQogLS0gRnVuY3Rpb246IG1wX3NpemVfdCBtcG5fc2VjX2Rpdl9xcl9pdGNoIChtcF9zaXplX3QgTk4sIG1wX3NpemVfdCBETikKICAgICBTZXQgUSB0byB0aGUgdHJ1bmNhdGVkIHF1b3RpZW50IE4gLyBEIGFuZCBSIHRvIE4gbW9kdWxvIEQsIHdoZXJlIE4KICAgICA9IHtOUCxOTn0sIEQgPSB7RFAsRE59LCBRJ3MgbW9zdCBzaWduaWZpY2FudCBsaW1iIGlzIHRoZSBmdW5jdGlvbgogICAgIHJldHVybiB2YWx1ZSBhbmQgdGhlIHJlbWFpbmluZyBsaW1icyBhcmUge1FQLE5OLUROfSwgYW5kIFIgPQogICAgIHtOUCxETn0uCgogICAgIEl0IGlzIHJlcXVpcmVkIHRoYXQgTk4gPj0gRE4gPj0gMSwgYW5kIHRoYXQgRFBbRE4tMV0gIT0gMC4gIFRoaXMKICAgICBkb2VzIG5vdCBpbXBseSB0aGF0IE4gPj0gRCBzaW5jZSBOIG1pZ2h0IGJlIHplcm8tcGFkZGVkLgoKICAgICBOb3RlIHRoZSBvdmVybGFwcGluZyBiZXR3ZWVuIE4gYW5kIFIuICBObyBvdGhlciBvcGVyYW5kIG92ZXJsYXBwaW5nCiAgICAgaXMgYWxsb3dlZC4gIFRoZSBlbnRpcmUgc3BhY2Ugb2NjdXBpZWQgYnkgTiBpcyBvdmVyd3JpdHRlbi4KCiAgICAgVGhpcyBmdW5jdGlvbiByZXF1aXJlcyBzY3JhdGNoIHNwYWNlIG9mIGBtcG5fc2VjX2Rpdl9xcl9pdGNoKE5OLAogICAgIEROKScgbGltYnMgdG8gYmUgcGFzc2VkIGluIHRoZSBUUCBwYXJhbWV0ZXIuCgogLS0gRnVuY3Rpb246IHZvaWQgbXBuX3NlY19kaXZfciAobXBfbGltYl90ICpOUCwgbXBfc2l6ZV90IE5OLCBjb25zdAogICAgICAgICAgbXBfbGltYl90ICpEUCwgbXBfc2l6ZV90IEROLCBtcF9saW1iX3QgKlRQKQogLS0gRnVuY3Rpb246IG1wX3NpemVfdCBtcG5fc2VjX2Rpdl9yX2l0Y2ggKG1wX3NpemVfdCBOTiwgbXBfc2l6ZV90IEROKQogICAgIFNldCBSIHRvIE4gbW9kdWxvIEQsIHdoZXJlIE4gPSB7TlAsTk59LCBEID0ge0RQLEROfSwgYW5kIFIgPQogICAgIHtOUCxETn0uCgogICAgIEl0IGlzIHJlcXVpcmVkIHRoYXQgTk4gPj0gRE4gPj0gMSwgYW5kIHRoYXQgRFBbRE4tMV0gIT0gMC4gIFRoaXMKICAgICBkb2VzIG5vdCBpbXBseSB0aGF0IE4gPj0gRCBzaW5jZSBOIG1pZ2h0IGJlIHplcm8tcGFkZGVkLgoKICAgICBOb3RlIHRoZSBvdmVybGFwcGluZyBiZXR3ZWVuIE4gYW5kIFIuICBObyBvdGhlciBvcGVyYW5kIG92ZXJsYXBwaW5nCiAgICAgaXMgYWxsb3dlZC4gIFRoZSBlbnRpcmUgc3BhY2Ugb2NjdXBpZWQgYnkgTiBpcyBvdmVyd3JpdHRlbi4KCiAgICAgVGhpcyBmdW5jdGlvbiByZXF1aXJlcyBzY3JhdGNoIHNwYWNlIG9mIGBtcG5fc2VjX2Rpdl9yX2l0Y2goTk4sCiAgICAgRE4pJyBsaW1icyB0byBiZSBwYXNzZWQgaW4gdGhlIFRQIHBhcmFtZXRlci4KCiAtLSBGdW5jdGlvbjogaW50IG1wbl9zZWNfaW52ZXJ0IChtcF9saW1iX3QgKlJQLCBtcF9saW1iX3QgKkFQLCBjb25zdAogICAgICAgICAgbXBfbGltYl90ICpNUCwgbXBfc2l6ZV90IE4sIG1wX2JpdGNudF90IE5CQ05ULCBtcF9saW1iX3QgKlRQKQogLS0gRnVuY3Rpb246IG1wX3NpemVfdCBtcG5fc2VjX2ludmVydF9pdGNoIChtcF9zaXplX3QgTikKICAgICBTZXQgUiB0byB0aGUgaW52ZXJzZSBvZiBBIG1vZHVsbyBNLCB3aGVyZSBSID0ge1JQLE59LCBBID0ge0FQLE59LAogICAgIGFuZCBNID0ge01QLE59LiAgKlRoaXMgZnVuY3Rpb24ncyBpbnRlcmZhY2UgaXMgcHJlbGltaW5hcnkuKgoKICAgICBJZiBhbiBpbnZlcnNlIGV4aXN0cywgcmV0dXJuIDEsIG90aGVyd2lzZSByZXR1cm4gMCBhbmQgbGVhdmUgUgogICAgIHVuZGVmaW5lZC4gSW4gZWl0aGVyIGNhc2UsIHRoZSBpbnB1dCBBIGlzIGRlc3Ryb3llZC4KCiAgICAgSXQgaXMgcmVxdWlyZWQgdGhhdCBNIGlzIG9kZCwgYW5kIHRoYXQgTkJDTlQgPj0gY2VpbChsb2coQSsxKSkgKwogICAgIGNlaWwobG9nKE0rMSkpLiAgQSBzYWZlIGNob2ljZSBpcyBOQkNOVCA9IDIgKiBOICogR01QX05VTUJfQklUUywKICAgICBidXQgYSBzbWFsbGVyIHZhbHVlIG1pZ2h0IGltcHJvdmUgcGVyZm9ybWFuY2UgaWYgTSBvciBBIGFyZSBrbm93bgogICAgIHRvIGhhdmUgbGVhZGluZyB6ZXJvIGJpdHMuCgogICAgIFRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgc2NyYXRjaCBzcGFjZSBvZiBgbXBuX3NlY19pbnZlcnRfaXRjaChOKScKICAgICBsaW1icyB0byBiZSBwYXNzZWQgaW4gdGhlIFRQIHBhcmFtZXRlci4KCgo4LjIgTmFpbHMKPT09PT09PT09CgoqRXZlcnl0aGluZyBpbiB0aGlzIHNlY3Rpb24gaXMgaGlnaGx5IGV4cGVyaW1lbnRhbCBhbmQgbWF5IGRpc2FwcGVhciBvcgpiZSBzdWJqZWN0IHRvIGluY29tcGF0aWJsZSBjaGFuZ2VzIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgR01QLioKCiAgIE5haWxzIGFyZSBhbiBleHBlcmltZW50YWwgZmVhdHVyZSB3aGVyZWJ5IGEgZmV3IGJpdHMgYXJlIGxlZnQgdW51c2VkCmF0IHRoZSB0b3Agb2YgZWFjaCBgbXBfbGltYl90Jy4gIFRoaXMgY2FuIHNpZ25pZmljYW50bHkgaW1wcm92ZSBjYXJyeQpoYW5kbGluZyBvbiBzb21lIHByb2Nlc3NvcnMuCgogICBBbGwgdGhlIGBtcG4nIGZ1bmN0aW9ucyBhY2NlcHRpbmcgbGltYiBkYXRhIHdpbGwgZXhwZWN0IHRoZSBuYWlsCmJpdHMgdG8gYmUgemVybyBvbiBlbnRyeSwgYW5kIHdpbGwgcmV0dXJuIGRhdGEgd2l0aCB0aGUgbmFpbHMgc2ltaWxhcmx5CmFsbCB6ZXJvLiAgVGhpcyBhcHBsaWVzIGJvdGggdG8gbGltYiB2ZWN0b3JzIGFuZCB0byBzaW5nbGUgbGltYgphcmd1bWVudHMuCgogICBOYWlscyBjYW4gYmUgZW5hYmxlZCBieSBjb25maWd1cmluZyB3aXRoIGAtLWVuYWJsZS1uYWlscycuICBCeQpkZWZhdWx0IHRoZSBudW1iZXIgb2YgYml0cyB3aWxsIGJlIGNob3NlbiBhY2NvcmRpbmcgdG8gd2hhdCBzdWl0cyB0aGUKaG9zdCBwcm9jZXNzb3IsIGJ1dCBhIHBhcnRpY3VsYXIgbnVtYmVyIGNhbiBiZSBzZWxlY3RlZCB3aXRoCmAtLWVuYWJsZS1uYWlscz1OJy4KCiAgIEF0IHRoZSBtcG4gbGV2ZWwsIGEgbmFpbCBidWlsZCBpcyBuZWl0aGVyIHNvdXJjZSBub3IgYmluYXJ5CmNvbXBhdGlibGUgd2l0aCBhIG5vbi1uYWlsIGJ1aWxkLCBzdHJpY3RseSBzcGVha2luZy4gIEJ1dCBwcm9ncmFtcwphY3Rpbmcgb24gbGltYnMgb25seSB0aHJvdWdoIHRoZSBtcG4gZnVuY3Rpb25zIGFyZSBsaWtlbHkgdG8gd29yawplcXVhbGx5IHdlbGwgd2l0aCBlaXRoZXIgYnVpbGQsIGFuZCBqdWRpY2lvdXMgdXNlIG9mIHRoZSBkZWZpbml0aW9ucwpiZWxvdyBzaG91bGQgbWFrZSBhbnkgcHJvZ3JhbSBjb21wYXRpYmxlIHdpdGggZWl0aGVyIGJ1aWxkLCBhdCB0aGUKc291cmNlIGxldmVsLgoKICAgRm9yIHRoZSBoaWdoZXIgbGV2ZWwgcm91dGluZXMsIG1lYW5pbmcgYG1weicgZXRjLCBhIG5haWwgYnVpbGQKc2hvdWxkIGJlIGZ1bGx5IHNvdXJjZSBhbmQgYmluYXJ5IGNvbXBhdGlibGUgd2l0aCBhIG5vbi1uYWlsIGJ1aWxkLgoKIC0tIE1hY3JvOiBHTVBfTkFJTF9CSVRTCiAtLSBNYWNybzogR01QX05VTUJfQklUUwogLS0gTWFjcm86IEdNUF9MSU1CX0JJVFMKICAgICBgR01QX05BSUxfQklUUycgaXMgdGhlIG51bWJlciBvZiBuYWlsIGJpdHMsIG9yIDAgd2hlbiBuYWlscyBhcmUKICAgICBub3QgaW4gdXNlLiAgYEdNUF9OVU1CX0JJVFMnIGlzIHRoZSBudW1iZXIgb2YgZGF0YSBiaXRzIGluIGEgbGltYi4KICAgICBgR01QX0xJTUJfQklUUycgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBiaXRzIGluIGFuIGBtcF9saW1iX3QnLiAgSW4KICAgICBhbGwgY2FzZXMKCiAgICAgICAgICBHTVBfTElNQl9CSVRTID09IEdNUF9OQUlMX0JJVFMgKyBHTVBfTlVNQl9CSVRTCgogLS0gTWFjcm86IEdNUF9OQUlMX01BU0sKIC0tIE1hY3JvOiBHTVBfTlVNQl9NQVNLCiAgICAgQml0IG1hc2tzIGZvciB0aGUgbmFpbCBhbmQgbnVtYmVyIHBhcnRzIG9mIGEgbGltYi4KICAgICBgR01QX05BSUxfTUFTSycgaXMgMCB3aGVuIG5haWxzIGFyZSBub3QgaW4gdXNlLgoKICAgICBgR01QX05BSUxfTUFTSycgaXMgbm90IG9mdGVuIG5lZWRlZCwgc2luY2UgdGhlIG5haWwgcGFydCBjYW4gYmUKICAgICBvYnRhaW5lZCB3aXRoIGB4ID4+IEdNUF9OVU1CX0JJVFMnLCBhbmQgdGhhdCBtZWFucyBvbmUgbGVzcyBsYXJnZQogICAgIGNvbnN0YW50LCB3aGljaCBjYW4gaGVscCB2YXJpb3VzIFJJU0MgY2hpcHMuCgogLS0gTWFjcm86IEdNUF9OVU1CX01BWAogICAgIFRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgY2FuIGJlIHN0b3JlZCBpbiB0aGUgbnVtYmVyIHBhcnQgb2YgYSBsaW1iLgogICAgIFRoaXMgaXMgdGhlIHNhbWUgYXMgYEdNUF9OVU1CX01BU0snLCBidXQgY2FuIGJlIHVzZWQgZm9yIGNsYXJpdHkKICAgICB3aGVuIGRvaW5nIGNvbXBhcmlzb25zIHJhdGhlciB0aGFuIGJpdC13aXNlIG9wZXJhdGlvbnMuCgogICBUaGUgdGVybSAibmFpbHMiIGNvbWVzIGZyb20gZmluZ2VyIG9yIHRvZSBuYWlscywgd2hpY2ggYXJlIGF0IHRoZQplbmRzIG9mIGEgbGltYiAoYXJtIG9yIGxlZykuICAibnVtYiIgaXMgc2hvcnQgZm9yIG51bWJlciwgYnV0IGlzIGFsc28KaG93IHRoZSBkZXZlbG9wZXJzIGZlbHQgYWZ0ZXIgdHJ5aW5nIGZvciBhIGxvbmcgdGltZSB0byBjb21lIHVwIHdpdGgKc2Vuc2libGUgbmFtZXMgZm9yIHRoZXNlIHRoaW5ncy4KCiAgIEluIHRoZSBmdXR1cmUgKHRoZSBkaXN0YW50IGZ1dHVyZSBtb3N0IGxpa2VseSkgYSBub24temVybyBuYWlsIG1pZ2h0CmJlIHBlcm1pdHRlZCwgZ2l2aW5nIG5vbi11bmlxdWUgcmVwcmVzZW50YXRpb25zIGZvciBudW1iZXJzIGluIGEgbGltYgp2ZWN0b3IuICBUaGlzIHdvdWxkIGhlbHAgdmVjdG9yIHByb2Nlc3NvcnMgc2luY2UgY2FycmllcyB3b3VsZCBvbmx5CmV2ZXIgbmVlZCB0byBwcm9wYWdhdGUgb25lIG9yIHR3byBsaW1icy4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBSYW5kb20gTnVtYmVyIEZ1bmN0aW9ucywgIE5leHQ6IEZvcm1hdHRlZCBPdXRwdXQsICBQcmV2OiBMb3ctbGV2ZWwgRnVuY3Rpb25zLCAgVXA6IFRvcAoKOSBSYW5kb20gTnVtYmVyIEZ1bmN0aW9ucwoqKioqKioqKioqKioqKioqKioqKioqKioqCgpTZXF1ZW5jZXMgb2YgcHNldWRvLXJhbmRvbSBudW1iZXJzIGluIEdNUCBhcmUgZ2VuZXJhdGVkIHVzaW5nIGEKdmFyaWFibGUgb2YgdHlwZSBgZ21wX3JhbmRzdGF0ZV90Jywgd2hpY2ggaG9sZHMgYW4gYWxnb3JpdGhtIHNlbGVjdGlvbgphbmQgYSBjdXJyZW50IHN0YXRlLiAgU3VjaCBhIHZhcmlhYmxlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYnkgYSBjYWxsIHRvCm9uZSBvZiB0aGUgYGdtcF9yYW5kaW5pdCcgZnVuY3Rpb25zLCBhbmQgY2FuIGJlIHNlZWRlZCB3aXRoIG9uZSBvZiB0aGUKYGdtcF9yYW5kc2VlZCcgZnVuY3Rpb25zLgoKICAgVGhlIGZ1bmN0aW9ucyBhY3R1YWxseSBnZW5lcmF0aW5nIHJhbmRvbSBudW1iZXJzIGFyZSBkZXNjcmliZWQgaW4KKm5vdGUgSW50ZWdlciBSYW5kb20gTnVtYmVyczo6LCBhbmQgKm5vdGUgTWlzY2VsbGFuZW91cyBGbG9hdApGdW5jdGlvbnM6Oi4KCiAgIFRoZSBvbGRlciBzdHlsZSByYW5kb20gbnVtYmVyIGZ1bmN0aW9ucyBkb24ndCBhY2NlcHQgYQpgZ21wX3JhbmRzdGF0ZV90JyBwYXJhbWV0ZXIgYnV0IGluc3RlYWQgc2hhcmUgYSBnbG9iYWwgdmFyaWFibGUgb2YgdGhhdAp0eXBlLiAgVGhleSB1c2UgYSBkZWZhdWx0IGFsZ29yaXRobSBhbmQgYXJlIGN1cnJlbnRseSBub3Qgc2VlZGVkCih0aG91Z2ggcGVyaGFwcyB0aGF0IHdpbGwgY2hhbmdlIGluIHRoZSBmdXR1cmUpLiAgVGhlIG5ldyBmdW5jdGlvbnMKYWNjZXB0aW5nIGEgYGdtcF9yYW5kc3RhdGVfdCcgYXJlIHJlY29tbWVuZGVkIGZvciBhcHBsaWNhdGlvbnMgdGhhdApjYXJlIGFib3V0IHJhbmRvbW5lc3MuCgoqIE1lbnU6CgoqIFJhbmRvbSBTdGF0ZSBJbml0aWFsaXphdGlvbjo6CiogUmFuZG9tIFN0YXRlIFNlZWRpbmc6OgoqIFJhbmRvbSBTdGF0ZSBNaXNjZWxsYW5lb3VzOjoKCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBSYW5kb20gU3RhdGUgSW5pdGlhbGl6YXRpb24sICBOZXh0OiBSYW5kb20gU3RhdGUgU2VlZGluZywgIFByZXY6IFJhbmRvbSBOdW1iZXIgRnVuY3Rpb25zLCAgVXA6IFJhbmRvbSBOdW1iZXIgRnVuY3Rpb25zCgo5LjEgUmFuZG9tIFN0YXRlIEluaXRpYWxpemF0aW9uCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAtLSBGdW5jdGlvbjogdm9pZCBnbXBfcmFuZGluaXRfZGVmYXVsdCAoZ21wX3JhbmRzdGF0ZV90IFNUQVRFKQogICAgIEluaXRpYWxpemUgU1RBVEUgd2l0aCBhIGRlZmF1bHQgYWxnb3JpdGhtLiAgVGhpcyB3aWxsIGJlIGEKICAgICBjb21wcm9taXNlIGJldHdlZW4gc3BlZWQgYW5kIHJhbmRvbW5lc3MsIGFuZCBpcyByZWNvbW1lbmRlZCBmb3IKICAgICBhcHBsaWNhdGlvbnMgd2l0aCBubyBzcGVjaWFsIHJlcXVpcmVtZW50cy4gIEN1cnJlbnRseSB0aGlzIGlzCiAgICAgYGdtcF9yYW5kaW5pdF9tdCcuCgogLS0gRnVuY3Rpb246IHZvaWQgZ21wX3JhbmRpbml0X210IChnbXBfcmFuZHN0YXRlX3QgU1RBVEUpCiAgICAgSW5pdGlhbGl6ZSBTVEFURSBmb3IgYSBNZXJzZW5uZSBUd2lzdGVyIGFsZ29yaXRobS4gIFRoaXMgYWxnb3JpdGhtCiAgICAgaXMgZmFzdCBhbmQgaGFzIGdvb2QgcmFuZG9tbmVzcyBwcm9wZXJ0aWVzLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIGdtcF9yYW5kaW5pdF9sY18yZXhwIChnbXBfcmFuZHN0YXRlX3QgU1RBVEUsIGNvbnN0CiAgICAgICAgICBtcHpfdCBBLCB1bnNpZ25lZCBsb25nIEMsIG1wX2JpdGNudF90IE0yRVhQKQogICAgIEluaXRpYWxpemUgU1RBVEUgd2l0aCBhIGxpbmVhciBjb25ncnVlbnRpYWwgYWxnb3JpdGhtIFggPSAoQSpYICsKICAgICBDKSBtb2QgMl5NMkVYUC4KCiAgICAgVGhlIGxvdyBiaXRzIG9mIFggaW4gdGhpcyBhbGdvcml0aG0gYXJlIG5vdCB2ZXJ5IHJhbmRvbS4gIFRoZSBsZWFzdAogICAgIHNpZ25pZmljYW50IGJpdCB3aWxsIGhhdmUgYSBwZXJpb2Qgbm8gbW9yZSB0aGFuIDIsIGFuZCB0aGUgc2Vjb25kCiAgICAgYml0IG5vIG1vcmUgdGhhbiA0LCBldGMuICBGb3IgdGhpcyByZWFzb24gb25seSB0aGUgaGlnaCBoYWxmIG9mCiAgICAgZWFjaCBYIGlzIGFjdHVhbGx5IHVzZWQuCgogICAgIFdoZW4gYSByYW5kb20gbnVtYmVyIG9mIG1vcmUgdGhhbiBNMkVYUC8yIGJpdHMgaXMgdG8gYmUgZ2VuZXJhdGVkLAogICAgIG11bHRpcGxlIGl0ZXJhdGlvbnMgb2YgdGhlIHJlY3VycmVuY2UgYXJlIHVzZWQgYW5kIHRoZSByZXN1bHRzCiAgICAgY29uY2F0ZW5hdGVkLgoKIC0tIEZ1bmN0aW9uOiBpbnQgZ21wX3JhbmRpbml0X2xjXzJleHBfc2l6ZSAoZ21wX3JhbmRzdGF0ZV90IFNUQVRFLAogICAgICAgICAgbXBfYml0Y250X3QgU0laRSkKICAgICBJbml0aWFsaXplIFNUQVRFIGZvciBhIGxpbmVhciBjb25ncnVlbnRpYWwgYWxnb3JpdGhtIGFzIHBlcgogICAgIGBnbXBfcmFuZGluaXRfbGNfMmV4cCcuICBBLCBDIGFuZCBNMkVYUCBhcmUgc2VsZWN0ZWQgZnJvbSBhIHRhYmxlLAogICAgIGNob3NlbiBzbyB0aGF0IFNJWkUgYml0cyAob3IgbW9yZSkgb2YgZWFjaCBYIHdpbGwgYmUgdXNlZCwgaS5lLgogICAgIE0yRVhQLzIgPj0gU0laRS4KCiAgICAgSWYgc3VjY2Vzc2Z1bCB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vbi16ZXJvLiAgSWYgU0laRSBpcyBiaWdnZXIKICAgICB0aGFuIHRoZSB0YWJsZSBkYXRhIHByb3ZpZGVzIHRoZW4gdGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvLiAgVGhlCiAgICAgbWF4aW11bSBTSVpFIGN1cnJlbnRseSBzdXBwb3J0ZWQgaXMgMTI4LgoKIC0tIEZ1bmN0aW9uOiB2b2lkIGdtcF9yYW5kaW5pdF9zZXQgKGdtcF9yYW5kc3RhdGVfdCBST1AsCiAgICAgICAgICBnbXBfcmFuZHN0YXRlX3QgT1ApCiAgICAgSW5pdGlhbGl6ZSBST1Agd2l0aCBhIGNvcHkgb2YgdGhlIGFsZ29yaXRobSBhbmQgc3RhdGUgZnJvbSBPUC4KCiAtLSBGdW5jdGlvbjogdm9pZCBnbXBfcmFuZGluaXQgKGdtcF9yYW5kc3RhdGVfdCBTVEFURSwKICAgICAgICAgIGdtcF9yYW5kYWxnX3QgQUxHLCAuLi4pCiAgICAgKlRoaXMgZnVuY3Rpb24gaXMgb2Jzb2xldGUuKgoKICAgICBJbml0aWFsaXplIFNUQVRFIHdpdGggYW4gYWxnb3JpdGhtIHNlbGVjdGVkIGJ5IEFMRy4gIFRoZSBvbmx5CiAgICAgY2hvaWNlIGlzIGBHTVBfUkFORF9BTEdfTEMnLCB3aGljaCBpcyBgZ21wX3JhbmRpbml0X2xjXzJleHBfc2l6ZScKICAgICBkZXNjcmliZWQgYWJvdmUuICBBIHRoaXJkIHBhcmFtZXRlciBvZiB0eXBlIGB1bnNpZ25lZCBsb25nJyBpcwogICAgIHJlcXVpcmVkLCB0aGlzIGlzIHRoZSBTSVpFIGZvciB0aGF0IGZ1bmN0aW9uLgogICAgIGBHTVBfUkFORF9BTEdfREVGQVVMVCcgb3IgMCBhcmUgdGhlIHNhbWUgYXMgYEdNUF9SQU5EX0FMR19MQycuCgogICAgIGBnbXBfcmFuZGluaXQnIHNldHMgYml0cyBpbiB0aGUgZ2xvYmFsIHZhcmlhYmxlIGBnbXBfZXJybm8nIHRvCiAgICAgaW5kaWNhdGUgYW4gZXJyb3IuICBgR01QX0VSUk9SX1VOU1VQUE9SVEVEX0FSR1VNRU5UJyBpZiBBTEcgaXMKICAgICB1bnN1cHBvcnRlZCwgb3IgYEdNUF9FUlJPUl9JTlZBTElEX0FSR1VNRU5UJyBpZiB0aGUgU0laRSBwYXJhbWV0ZXIKICAgICBpcyB0b28gYmlnLiAgSXQgbWF5IGJlIG5vdGVkIHRoaXMgZXJyb3IgcmVwb3J0aW5nIGlzIG5vdCB0aHJlYWQKICAgICBzYWZlIChhIGdvb2QgcmVhc29uIHRvIHVzZSBgZ21wX3JhbmRpbml0X2xjXzJleHBfc2l6ZScgaW5zdGVhZCkuCgogLS0gRnVuY3Rpb246IHZvaWQgZ21wX3JhbmRjbGVhciAoZ21wX3JhbmRzdGF0ZV90IFNUQVRFKQogICAgIEZyZWUgYWxsIG1lbW9yeSBvY2N1cGllZCBieSBTVEFURS4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBSYW5kb20gU3RhdGUgU2VlZGluZywgIE5leHQ6IFJhbmRvbSBTdGF0ZSBNaXNjZWxsYW5lb3VzLCAgUHJldjogUmFuZG9tIFN0YXRlIEluaXRpYWxpemF0aW9uLCAgVXA6IFJhbmRvbSBOdW1iZXIgRnVuY3Rpb25zCgo5LjIgUmFuZG9tIFN0YXRlIFNlZWRpbmcKPT09PT09PT09PT09PT09PT09PT09PT09CgogLS0gRnVuY3Rpb246IHZvaWQgZ21wX3JhbmRzZWVkIChnbXBfcmFuZHN0YXRlX3QgU1RBVEUsIGNvbnN0IG1wel90CiAgICAgICAgICBTRUVEKQogLS0gRnVuY3Rpb246IHZvaWQgZ21wX3JhbmRzZWVkX3VpIChnbXBfcmFuZHN0YXRlX3QgU1RBVEUsCiAgICAgICAgICB1bnNpZ25lZCBsb25nIGludCBTRUVEKQogICAgIFNldCBhbiBpbml0aWFsIHNlZWQgdmFsdWUgaW50byBTVEFURS4KCiAgICAgVGhlIHNpemUgb2YgYSBzZWVkIGRldGVybWluZXMgaG93IG1hbnkgZGlmZmVyZW50IHNlcXVlbmNlcyBvZgogICAgIHJhbmRvbSBudW1iZXJzIHRoYXQgaXQncyBwb3NzaWJsZSB0byBnZW5lcmF0ZS4gIFRoZSAicXVhbGl0eSIgb2YKICAgICB0aGUgc2VlZCBpcyB0aGUgcmFuZG9tbmVzcyBvZiBhIGdpdmVuIHNlZWQgY29tcGFyZWQgdG8gdGhlCiAgICAgcHJldmlvdXMgc2VlZCB1c2VkLCBhbmQgdGhpcyBhZmZlY3RzIHRoZSByYW5kb21uZXNzIG9mIHNlcGFyYXRlCiAgICAgbnVtYmVyIHNlcXVlbmNlcy4gIFRoZSBtZXRob2QgZm9yIGNob29zaW5nIGEgc2VlZCBpcyBjcml0aWNhbCBpZgogICAgIHRoZSBnZW5lcmF0ZWQgbnVtYmVycyBhcmUgdG8gYmUgdXNlZCBmb3IgaW1wb3J0YW50IGFwcGxpY2F0aW9ucywKICAgICBzdWNoIGFzIGdlbmVyYXRpbmcgY3J5cHRvZ3JhcGhpYyBrZXlzLgoKICAgICBUcmFkaXRpb25hbGx5IHRoZSBzeXN0ZW0gdGltZSBoYXMgYmVlbiB1c2VkIHRvIHNlZWQsIGJ1dCBjYXJlCiAgICAgbmVlZHMgdG8gYmUgdGFrZW4gd2l0aCB0aGlzLiAgSWYgYW4gYXBwbGljYXRpb24gc2VlZHMgb2Z0ZW4gYW5kCiAgICAgdGhlIHJlc29sdXRpb24gb2YgdGhlIHN5c3RlbSBjbG9jayBpcyBsb3csIHRoZW4gdGhlIHNhbWUgc2VxdWVuY2UKICAgICBvZiBudW1iZXJzIG1pZ2h0IGJlIHJlcGVhdGVkLiAgQWxzbywgdGhlIHN5c3RlbSB0aW1lIGlzIHF1aXRlIGVhc3kKICAgICB0byBndWVzcywgc28gaWYgdW5wcmVkaWN0YWJpbGl0eSBpcyByZXF1aXJlZCB0aGVuIGl0IHNob3VsZAogICAgIGRlZmluaXRlbHkgbm90IGJlIHRoZSBvbmx5IHNvdXJjZSBmb3IgdGhlIHNlZWQgdmFsdWUuICBPbiBzb21lCiAgICAgc3lzdGVtcyB0aGVyZSdzIGEgc3BlY2lhbCBkZXZpY2UgYC9kZXYvcmFuZG9tJyB3aGljaCBwcm92aWRlcwogICAgIHJhbmRvbSBkYXRhIGJldHRlciBzdWl0ZWQgZm9yIHVzZSBhcyBhIHNlZWQuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogUmFuZG9tIFN0YXRlIE1pc2NlbGxhbmVvdXMsICBQcmV2OiBSYW5kb20gU3RhdGUgU2VlZGluZywgIFVwOiBSYW5kb20gTnVtYmVyIEZ1bmN0aW9ucwoKOS4zIFJhbmRvbSBTdGF0ZSBNaXNjZWxsYW5lb3VzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKIC0tIEZ1bmN0aW9uOiB1bnNpZ25lZCBsb25nIGdtcF91cmFuZG9tYl91aSAoZ21wX3JhbmRzdGF0ZV90IFNUQVRFLAogICAgICAgICAgdW5zaWduZWQgbG9uZyBOKQogICAgIFJldHVybiBhIHVuaWZvcm1seSBkaXN0cmlidXRlZCByYW5kb20gbnVtYmVyIG9mIE4gYml0cywgaS5lLiBpbiB0aGUKICAgICByYW5nZSAwIHRvIDJeTi0xIGluY2x1c2l2ZS4gIE4gbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlCiAgICAgbnVtYmVyIG9mIGJpdHMgaW4gYW4gYHVuc2lnbmVkIGxvbmcnLgoKIC0tIEZ1bmN0aW9uOiB1bnNpZ25lZCBsb25nIGdtcF91cmFuZG9tbV91aSAoZ21wX3JhbmRzdGF0ZV90IFNUQVRFLAogICAgICAgICAgdW5zaWduZWQgbG9uZyBOKQogICAgIFJldHVybiBhIHVuaWZvcm1seSBkaXN0cmlidXRlZCByYW5kb20gbnVtYmVyIGluIHRoZSByYW5nZSAwIHRvCiAgICAgTi0xLCBpbmNsdXNpdmUuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogRm9ybWF0dGVkIE91dHB1dCwgIE5leHQ6IEZvcm1hdHRlZCBJbnB1dCwgIFByZXY6IFJhbmRvbSBOdW1iZXIgRnVuY3Rpb25zLCAgVXA6IFRvcAoKMTAgRm9ybWF0dGVkIE91dHB1dAoqKioqKioqKioqKioqKioqKioqCgoqIE1lbnU6CgoqIEZvcm1hdHRlZCBPdXRwdXQgU3RyaW5nczo6CiogRm9ybWF0dGVkIE91dHB1dCBGdW5jdGlvbnM6OgoqIEMrKyBGb3JtYXR0ZWQgT3V0cHV0OjoKCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBGb3JtYXR0ZWQgT3V0cHV0IFN0cmluZ3MsICBOZXh0OiBGb3JtYXR0ZWQgT3V0cHV0IEZ1bmN0aW9ucywgIFByZXY6IEZvcm1hdHRlZCBPdXRwdXQsICBVcDogRm9ybWF0dGVkIE91dHB1dAoKMTAuMSBGb3JtYXQgU3RyaW5ncwo9PT09PT09PT09PT09PT09PT09CgpgZ21wX3ByaW50ZicgYW5kIGZyaWVuZHMgYWNjZXB0IGZvcm1hdCBzdHJpbmdzIHNpbWlsYXIgdG8gdGhlIHN0YW5kYXJkIEMKYHByaW50ZicgKCpub3RlIEZvcm1hdHRlZCBPdXRwdXQ6IChsaWJjKUZvcm1hdHRlZCBPdXRwdXQuKS4gIEEgZm9ybWF0CnNwZWNpZmljYXRpb24gaXMgb2YgdGhlIGZvcm0KCiAgICAgJSBbZmxhZ3NdIFt3aWR0aF0gWy5bcHJlY2lzaW9uXV0gW3R5cGVdIGNvbnYKCiAgIEdNUCBhZGRzIHR5cGVzIGBaJywgYFEnIGFuZCBgRicgZm9yIGBtcHpfdCcsIGBtcHFfdCcgYW5kIGBtcGZfdCcKcmVzcGVjdGl2ZWx5LCBgTScgZm9yIGBtcF9saW1iX3QnLCBhbmQgYE4nIGZvciBhbiBgbXBfbGltYl90JyBhcnJheS4KYFonLCBgUScsIGBNJyBhbmQgYE4nIGJlaGF2ZSBsaWtlIGludGVnZXJzLiAgYFEnIHdpbGwgcHJpbnQgYSBgLycgYW5kIGEKZGVub21pbmF0b3IsIGlmIG5lZWRlZC4gIGBGJyBiZWhhdmVzIGxpa2UgYSBmbG9hdC4gIEZvciBleGFtcGxlLAoKICAgICBtcHpfdCB6OwogICAgIGdtcF9wcmludGYgKCIlcyBpcyBhbiBtcHogJVpkXG4iLCAiaGVyZSIsIHopOwoKICAgICBtcHFfdCBxOwogICAgIGdtcF9wcmludGYgKCJhIGhleCByYXRpb25hbDogJSM0MFF4XG4iLCBxKTsKCiAgICAgbXBmX3QgZjsKICAgICBpbnQgICBuOwogICAgIGdtcF9wcmludGYgKCJmaXhlZCBwb2ludCBtcGYgJS4qRmYgd2l0aCAlZCBkaWdpdHNcbiIsIG4sIGYsIG4pOwoKICAgICBtcF9saW1iX3QgbDsKICAgICBnbXBfcHJpbnRmICgibGltYiAlTXVcbiIsIGwpOwoKICAgICBjb25zdCBtcF9saW1iX3QgKnB0cjsKICAgICBtcF9zaXplX3QgICAgICAgc2l6ZTsKICAgICBnbXBfcHJpbnRmICgibGltYiBhcnJheSAlTnhcbiIsIHB0ciwgc2l6ZSk7CgogICBGb3IgYE4nIHRoZSBsaW1icyBhcmUgZXhwZWN0ZWQgbGVhc3Qgc2lnbmlmaWNhbnQgZmlyc3QsIGFzIHBlciB0aGUKYG1wbicgZnVuY3Rpb25zICgqbm90ZSBMb3ctbGV2ZWwgRnVuY3Rpb25zOjopLiAgQSBuZWdhdGl2ZSBzaXplIGNhbiBiZQpnaXZlbiB0byBwcmludCB0aGUgdmFsdWUgYXMgYSBuZWdhdGl2ZS4KCiAgIEFsbCB0aGUgc3RhbmRhcmQgQyBgcHJpbnRmJyB0eXBlcyBiZWhhdmUgdGhlIHNhbWUgYXMgdGhlIEMgbGlicmFyeQpgcHJpbnRmJywgYW5kIGNhbiBiZSBmcmVlbHkgaW50ZXJtaXhlZCB3aXRoIHRoZSBHTVAgZXh0ZW5zaW9ucy4gIEluIHRoZQpjdXJyZW50IGltcGxlbWVudGF0aW9uIHRoZSBzdGFuZGFyZCBwYXJ0cyBvZiB0aGUgZm9ybWF0IHN0cmluZyBhcmUKc2ltcGx5IGhhbmRlZCB0byBgcHJpbnRmJyBhbmQgb25seSB0aGUgR01QIGV4dGVuc2lvbnMgaGFuZGxlZCBkaXJlY3RseS4KCiAgIFRoZSBmbGFncyBhY2NlcHRlZCBhcmUgYXMgZm9sbG93cy4gIEdMSUJDIHN0eWxlICcgaXMgb25seSBmb3IgdGhlCnN0YW5kYXJkIEMgdHlwZXMgKG5vdCB0aGUgR01QIHR5cGVzKSwgYW5kIG9ubHkgaWYgdGhlIEMgbGlicmFyeQpzdXBwb3J0cyBpdC4KCiAgICAgMCAgICAgICAgIHBhZCB3aXRoIHplcm9zIChyYXRoZXIgdGhhbiBzcGFjZXMpCiAgICAgIyAgICAgICAgIHNob3cgdGhlIGJhc2Ugd2l0aCBgMHgnLCBgMFgnIG9yIGAwJwogICAgICsgICAgICAgICBhbHdheXMgc2hvdyBhIHNpZ24KICAgICAoc3BhY2UpICAgc2hvdyBhIHNwYWNlIG9yIGEgYC0nIHNpZ24KICAgICAnICAgICAgICAgZ3JvdXAgZGlnaXRzLCBHTElCQyBzdHlsZSAobm90IEdNUCB0eXBlcykKCiAgIFRoZSBvcHRpb25hbCB3aWR0aCBhbmQgcHJlY2lzaW9uIGNhbiBiZSBnaXZlbiBhcyBhIG51bWJlciB3aXRoaW4gdGhlCmZvcm1hdCBzdHJpbmcsIG9yIGFzIGEgYConIHRvIHRha2UgYW4gZXh0cmEgcGFyYW1ldGVyIG9mIHR5cGUgYGludCcsIHRoZQpzYW1lIGFzIHRoZSBzdGFuZGFyZCBgcHJpbnRmJy4KCiAgIFRoZSBzdGFuZGFyZCB0eXBlcyBhY2NlcHRlZCBhcmUgYXMgZm9sbG93cy4gIGBoJyBhbmQgYGwnIGFyZQpwb3J0YWJsZSwgdGhlIHJlc3Qgd2lsbCBkZXBlbmQgb24gdGhlIGNvbXBpbGVyIChvciBpbmNsdWRlIGZpbGVzKSBmb3IKdGhlIHR5cGUgYW5kIHRoZSBDIGxpYnJhcnkgZm9yIHRoZSBvdXRwdXQuCgogICAgIGggICAgICAgICBzaG9ydAogICAgIGhoICAgICAgICBjaGFyCiAgICAgaiAgICAgICAgIGludG1heF90IG9yIHVpbnRtYXhfdAogICAgIGwgICAgICAgICBsb25nIG9yIHdjaGFyX3QKICAgICBsbCAgICAgICAgbG9uZyBsb25nCiAgICAgTCAgICAgICAgIGxvbmcgZG91YmxlCiAgICAgcSAgICAgICAgIHF1YWRfdCBvciB1X3F1YWRfdAogICAgIHQgICAgICAgICBwdHJkaWZmX3QKICAgICB6ICAgICAgICAgc2l6ZV90CgpUaGUgR01QIHR5cGVzIGFyZQoKICAgICBGICAgICAgICAgbXBmX3QsIGZsb2F0IGNvbnZlcnNpb25zCiAgICAgUSAgICAgICAgIG1wcV90LCBpbnRlZ2VyIGNvbnZlcnNpb25zCiAgICAgTSAgICAgICAgIG1wX2xpbWJfdCwgaW50ZWdlciBjb252ZXJzaW9ucwogICAgIE4gICAgICAgICBtcF9saW1iX3QgYXJyYXksIGludGVnZXIgY29udmVyc2lvbnMKICAgICBaICAgICAgICAgbXB6X3QsIGludGVnZXIgY29udmVyc2lvbnMKCiAgIFRoZSBjb252ZXJzaW9ucyBhY2NlcHRlZCBhcmUgYXMgZm9sbG93cy4gIGBhJyBhbmQgYEEnIGFyZSBhbHdheXMKc3VwcG9ydGVkIGZvciBgbXBmX3QnIGJ1dCBkZXBlbmQgb24gdGhlIEMgbGlicmFyeSBmb3Igc3RhbmRhcmQgQyBmbG9hdAp0eXBlcy4gIGBtJyBhbmQgYHAnIGRlcGVuZCBvbiB0aGUgQyBsaWJyYXJ5LgoKICAgICBhIEEgICAgICAgaGV4IGZsb2F0cywgQzk5IHN0eWxlCiAgICAgYyAgICAgICAgIGNoYXJhY3RlcgogICAgIGQgICAgICAgICBkZWNpbWFsIGludGVnZXIKICAgICBlIEUgICAgICAgc2NpZW50aWZpYyBmb3JtYXQgZmxvYXQKICAgICBmICAgICAgICAgZml4ZWQgcG9pbnQgZmxvYXQKICAgICBpICAgICAgICAgc2FtZSBhcyBkCiAgICAgZyBHICAgICAgIGZpeGVkIG9yIHNjaWVudGlmaWMgZmxvYXQKICAgICBtICAgICAgICAgYHN0cmVycm9yJyBzdHJpbmcsIEdMSUJDIHN0eWxlCiAgICAgbiAgICAgICAgIHN0b3JlIGNoYXJhY3RlcnMgd3JpdHRlbiBzbyBmYXIKICAgICBvICAgICAgICAgb2N0YWwgaW50ZWdlcgogICAgIHAgICAgICAgICBwb2ludGVyCiAgICAgcyAgICAgICAgIHN0cmluZwogICAgIHUgICAgICAgICB1bnNpZ25lZCBpbnRlZ2VyCiAgICAgeCBYICAgICAgIGhleCBpbnRlZ2VyCgogICBgbycsIGB4JyBhbmQgYFgnIGFyZSB1bnNpZ25lZCBmb3IgdGhlIHN0YW5kYXJkIEMgdHlwZXMsIGJ1dCBmb3IKdHlwZXMgYFonLCBgUScgYW5kIGBOJyB0aGV5IGFyZSBzaWduZWQuICBgdScgaXMgbm90IG1lYW5pbmdmdWwgZm9yIGBaJywKYFEnIGFuZCBgTicuCgogICBgTScgaXMgYSBwcm94eSBmb3IgdGhlIEMgbGlicmFyeSBgbCcgb3IgYEwnLCBhY2NvcmRpbmcgdG8gdGhlIHNpemUKb2YgYG1wX2xpbWJfdCcuICBVbnNpZ25lZCBjb252ZXJzaW9ucyB3aWxsIGJlIHVzdWFsLCBidXQgYSBzaWduZWQKY29udmVyc2lvbiBjYW4gYmUgdXNlZCBhbmQgd2lsbCBpbnRlcnByZXQgdGhlIHZhbHVlIGFzIGEgdHdvcyBjb21wbGVtZW50Cm5lZ2F0aXZlLgoKICAgYG4nIGNhbiBiZSB1c2VkIHdpdGggYW55IHR5cGUsIGV2ZW4gdGhlIEdNUCB0eXBlcy4KCiAgIE90aGVyIHR5cGVzIG9yIGNvbnZlcnNpb25zIHRoYXQgbWlnaHQgYmUgYWNjZXB0ZWQgYnkgdGhlIEMgbGlicmFyeQpgcHJpbnRmJyBjYW5ub3QgYmUgdXNlZCB0aHJvdWdoIGBnbXBfcHJpbnRmJywgdGhpcyBpbmNsdWRlcyBmb3IKaW5zdGFuY2UgZXh0ZW5zaW9ucyByZWdpc3RlcmVkIHdpdGggR0xJQkMgYHJlZ2lzdGVyX3ByaW50Zl9mdW5jdGlvbicuCkFsc28gY3VycmVudGx5IHRoZXJlJ3Mgbm8gc3VwcG9ydCBmb3IgUE9TSVggYCQnIHN0eWxlIG51bWJlcmVkIGFyZ3VtZW50cwoocGVyaGFwcyB0aGlzIHdpbGwgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZSkuCgogICBUaGUgcHJlY2lzaW9uIGZpZWxkIGhhcyBpdHMgdXN1YWwgbWVhbmluZyBmb3IgaW50ZWdlciBgWicgYW5kIGZsb2F0CmBGJyB0eXBlcywgYnV0IGlzIGN1cnJlbnRseSB1bmRlZmluZWQgZm9yIGBRJyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkCndpdGggdGhhdC4KCiAgIGBtcGZfdCcgY29udmVyc2lvbnMgb25seSBldmVyIGdlbmVyYXRlIGFzIG1hbnkgZGlnaXRzIGFzIGNhbiBiZQphY2N1cmF0ZWx5IHJlcHJlc2VudGVkIGJ5IHRoZSBvcGVyYW5kLCB0aGUgc2FtZSBhcyBgbXBmX2dldF9zdHInIGRvZXMuClplcm9zIHdpbGwgYmUgdXNlZCBpZiBuZWNlc3NhcnkgdG8gcGFkIHRvIHRoZSByZXF1ZXN0ZWQgcHJlY2lzaW9uLiAgVGhpcwpoYXBwZW5zIGV2ZW4gZm9yIGFuIGBmJyBjb252ZXJzaW9uIG9mIGFuIGBtcGZfdCcgd2hpY2ggaXMgYW4gaW50ZWdlciwKZm9yIGluc3RhbmNlIDJeMTAyNCBpbiBhbiBgbXBmX3QnIG9mIDEyOCBiaXRzIHByZWNpc2lvbiB3aWxsIG9ubHkKcHJvZHVjZSBhYm91dCA0MCBkaWdpdHMsIHRoZW4gcGFkIHdpdGggemVyb3MgdG8gdGhlIGRlY2ltYWwgcG9pbnQuICBBbgplbXB0eSBwcmVjaXNpb24gZmllbGQgbGlrZSBgJS5GZScgb3IgYCUuRmYnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZmljYWxseQpyZXF1ZXN0IGp1c3QgdGhlIHNpZ25pZmljYW50IGRpZ2l0cy4gIFdpdGhvdXQgYW55IGRvdCBhbmQgdGh1cyBubwpwcmVjaXNpb24gZmllbGQsIGEgcHJlY2lzaW9uIHZhbHVlIG9mIDYgd2lsbCBiZSB1c2VkLiAgTm90ZSB0aGF0IHRoZXNlCnJ1bGVzIG1lYW4gdGhhdCBgJUZmJywgYCUuRmYnLCBhbmQgYCUuMEZmJyB3aWxsIGFsbCBiZSBkaWZmZXJlbnQuCgogICBUaGUgZGVjaW1hbCBwb2ludCBjaGFyYWN0ZXIgKG9yIHN0cmluZykgaXMgdGFrZW4gZnJvbSB0aGUgY3VycmVudApsb2NhbGUgc2V0dGluZ3Mgb24gc3lzdGVtcyB3aGljaCBwcm92aWRlIGBsb2NhbGVjb252JyAoKm5vdGUgTG9jYWxlcwphbmQgSW50ZXJuYXRpb25hbGl6YXRpb246IChsaWJjKUxvY2FsZXMuKS4gIFRoZSBDIGxpYnJhcnkgd2lsbCBub3JtYWxseQpkbyB0aGUgc2FtZSBmb3Igc3RhbmRhcmQgZmxvYXQgb3V0cHV0LgoKICAgVGhlIGZvcm1hdCBzdHJpbmcgaXMgb25seSBpbnRlcnByZXRlZCBhcyBwbGFpbiBgY2hhcidzLCBtdWx0aWJ5dGUKY2hhcmFjdGVycyBhcmUgbm90IHJlY29nbmlzZWQuICBQZXJoYXBzIHRoaXMgd2lsbCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBGb3JtYXR0ZWQgT3V0cHV0IEZ1bmN0aW9ucywgIE5leHQ6IEMrKyBGb3JtYXR0ZWQgT3V0cHV0LCAgUHJldjogRm9ybWF0dGVkIE91dHB1dCBTdHJpbmdzLCAgVXA6IEZvcm1hdHRlZCBPdXRwdXQKCjEwLjIgRnVuY3Rpb25zCj09PT09PT09PT09PT09CgpFYWNoIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGlzIHNpbWlsYXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgQwpsaWJyYXJ5IGZ1bmN0aW9uLiAgVGhlIGJhc2ljIGBwcmludGYnIGZvcm1zIHRha2UgYSB2YXJpYWJsZSBhcmd1bWVudApsaXN0LiAgVGhlIGB2cHJpbnRmJyBmb3JtcyB0YWtlIGFuIGFyZ3VtZW50IHBvaW50ZXIsIHNlZSAqbm90ZSBWYXJpYWRpYwpGdW5jdGlvbnM6IChsaWJjKVZhcmlhZGljIEZ1bmN0aW9ucywgb3IgYG1hbiAzIHZhX3N0YXJ0Jy4KCiAgIEl0IHNob3VsZCBiZSBlbXBoYXNpc2VkIHRoYXQgaWYgYSBmb3JtYXQgc3RyaW5nIGlzIGludmFsaWQsIG9yIHRoZQphcmd1bWVudHMgZG9uJ3QgbWF0Y2ggd2hhdCB0aGUgZm9ybWF0IHNwZWNpZmllcywgdGhlbiB0aGUgYmVoYXZpb3VyIG9mCmFueSBvZiB0aGVzZSBmdW5jdGlvbnMgd2lsbCBiZSB1bnByZWRpY3RhYmxlLiAgR0NDIGZvcm1hdCBzdHJpbmcKY2hlY2tpbmcgaXMgbm90IGF2YWlsYWJsZSwgc2luY2UgaXQgZG9lc24ndCByZWNvZ25pc2UgdGhlIEdNUApleHRlbnNpb25zLgoKICAgVGhlIGZpbGUgYmFzZWQgZnVuY3Rpb25zIGBnbXBfcHJpbnRmJyBhbmQgYGdtcF9mcHJpbnRmJyB3aWxsIHJldHVybgotMSB0byBpbmRpY2F0ZSBhIHdyaXRlIGVycm9yLiAgT3V0cHV0IGlzIG5vdCAiYXRvbWljIiwgc28gcGFydGlhbApvdXRwdXQgbWF5IGJlIHByb2R1Y2VkIGlmIGEgd3JpdGUgZXJyb3Igb2NjdXJzLiAgQWxsIHRoZSBmdW5jdGlvbnMgY2FuCnJldHVybiAtMSBpZiB0aGUgQyBsaWJyYXJ5IGBwcmludGYnIHZhcmlhbnQgaW4gdXNlIHJldHVybnMgLTEsIGJ1dCB0aGlzCnNob3VsZG4ndCBub3JtYWxseSBvY2N1ci4KCiAtLSBGdW5jdGlvbjogaW50IGdtcF9wcmludGYgKGNvbnN0IGNoYXIgKkZNVCwgLi4uKQogLS0gRnVuY3Rpb246IGludCBnbXBfdnByaW50ZiAoY29uc3QgY2hhciAqRk1ULCB2YV9saXN0IEFQKQogICAgIFByaW50IHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgYHN0ZG91dCcuICBSZXR1cm4gdGhlIG51bWJlciBvZgogICAgIGNoYXJhY3RlcnMgd3JpdHRlbiwgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCgogLS0gRnVuY3Rpb246IGludCBnbXBfZnByaW50ZiAoRklMRSAqRlAsIGNvbnN0IGNoYXIgKkZNVCwgLi4uKQogLS0gRnVuY3Rpb246IGludCBnbXBfdmZwcmludGYgKEZJTEUgKkZQLCBjb25zdCBjaGFyICpGTVQsIHZhX2xpc3QgQVApCiAgICAgUHJpbnQgdG8gdGhlIHN0cmVhbSBGUC4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiwKICAgICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KCiAtLSBGdW5jdGlvbjogaW50IGdtcF9zcHJpbnRmIChjaGFyICpCVUYsIGNvbnN0IGNoYXIgKkZNVCwgLi4uKQogLS0gRnVuY3Rpb246IGludCBnbXBfdnNwcmludGYgKGNoYXIgKkJVRiwgY29uc3QgY2hhciAqRk1ULCB2YV9saXN0IEFQKQogICAgIEZvcm0gYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGluIEJVRi4gIFJldHVybiB0aGUgbnVtYmVyIG9mCiAgICAgY2hhcmFjdGVycyB3cml0dGVuLCBleGNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIG51bGwuCgogICAgIE5vIG92ZXJsYXAgaXMgcGVybWl0dGVkIGJldHdlZW4gdGhlIHNwYWNlIGF0IEJVRiBhbmQgdGhlIHN0cmluZwogICAgIEZNVC4KCiAgICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcmVjb21tZW5kZWQsIHNpbmNlIHRoZXJlJ3Mgbm8gcHJvdGVjdGlvbgogICAgIGFnYWluc3QgZXhjZWVkaW5nIHRoZSBzcGFjZSBhdmFpbGFibGUgYXQgQlVGLgoKIC0tIEZ1bmN0aW9uOiBpbnQgZ21wX3NucHJpbnRmIChjaGFyICpCVUYsIHNpemVfdCBTSVpFLCBjb25zdCBjaGFyCiAgICAgICAgICAqRk1ULCAuLi4pCiAtLSBGdW5jdGlvbjogaW50IGdtcF92c25wcmludGYgKGNoYXIgKkJVRiwgc2l6ZV90IFNJWkUsIGNvbnN0IGNoYXIKICAgICAgICAgICpGTVQsIHZhX2xpc3QgQVApCiAgICAgRm9ybSBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgaW4gQlVGLiAgTm8gbW9yZSB0aGFuIFNJWkUgYnl0ZXMKICAgICB3aWxsIGJlIHdyaXR0ZW4uICBUbyBnZXQgdGhlIGZ1bGwgb3V0cHV0LCBTSVpFIG11c3QgYmUgZW5vdWdoIGZvcgogICAgIHRoZSBzdHJpbmcgYW5kIG51bGwtdGVybWluYXRvci4KCiAgICAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2hpY2ggb3VnaHQgdG8KICAgICBoYXZlIGJlZW4gcHJvZHVjZWQsIGV4Y2x1ZGluZyB0aGUgdGVybWluYXRpbmcgbnVsbC4gIElmIFJFVFZBTCA+PQogICAgIFNJWkUgdGhlbiB0aGUgYWN0dWFsIG91dHB1dCBoYXMgYmVlbiB0cnVuY2F0ZWQgdG8gdGhlIGZpcnN0IFNJWkUtMQogICAgIGNoYXJhY3RlcnMsIGFuZCBhIG51bGwgYXBwZW5kZWQuCgogICAgIE5vIG92ZXJsYXAgaXMgcGVybWl0dGVkIGJldHdlZW4gdGhlIHJlZ2lvbiB7QlVGLFNJWkV9IGFuZCB0aGUgRk1UCiAgICAgc3RyaW5nLgoKICAgICBOb3RpY2UgdGhlIHJldHVybiB2YWx1ZSBpcyBpbiBJU08gQzk5IGBzbnByaW50Zicgc3R5bGUuICBUaGlzIGlzCiAgICAgc28gZXZlbiBpZiB0aGUgQyBsaWJyYXJ5IGB2c25wcmludGYnIGlzIHRoZSBvbGRlciBHTElCQyAyLjAueAogICAgIHN0eWxlLgoKIC0tIEZ1bmN0aW9uOiBpbnQgZ21wX2FzcHJpbnRmIChjaGFyICoqUFAsIGNvbnN0IGNoYXIgKkZNVCwgLi4uKQogLS0gRnVuY3Rpb246IGludCBnbXBfdmFzcHJpbnRmIChjaGFyICoqUFAsIGNvbnN0IGNoYXIgKkZNVCwgdmFfbGlzdCBBUCkKICAgICBGb3JtIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBpbiBhIGJsb2NrIG9mIG1lbW9yeSBvYnRhaW5lZCBmcm9tCiAgICAgdGhlIGN1cnJlbnQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb24gKCpub3RlIEN1c3RvbQogICAgIEFsbG9jYXRpb246OikuICBUaGUgYmxvY2sgd2lsbCBiZSB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nIGFuZAogICAgIG51bGwtdGVybWluYXRvci4gIFRoZSBhZGRyZXNzIG9mIHRoZSBibG9jayBpbiBzdG9yZWQgdG8gKlBQLiAgVGhlCiAgICAgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcm9kdWNlZCwgZXhjbHVkaW5nIHRoZQogICAgIG51bGwtdGVybWluYXRvci4KCiAgICAgVW5saWtlIHRoZSBDIGxpYnJhcnkgYGFzcHJpbnRmJywgYGdtcF9hc3ByaW50ZicgZG9lc24ndCByZXR1cm4gLTEKICAgICBpZiB0aGVyZSdzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZSwgaXQgbGV0cyB0aGUgY3VycmVudCBhbGxvY2F0aW9uCiAgICAgZnVuY3Rpb24gaGFuZGxlIHRoYXQuCgogLS0gRnVuY3Rpb246IGludCBnbXBfb2JzdGFja19wcmludGYgKHN0cnVjdCBvYnN0YWNrICpPQiwgY29uc3QgY2hhcgogICAgICAgICAgKkZNVCwgLi4uKQogLS0gRnVuY3Rpb246IGludCBnbXBfb2JzdGFja192cHJpbnRmIChzdHJ1Y3Qgb2JzdGFjayAqT0IsIGNvbnN0IGNoYXIKICAgICAgICAgICpGTVQsIHZhX2xpc3QgQVApCiAgICAgQXBwZW5kIHRvIHRoZSBjdXJyZW50IG9iamVjdCBpbiBPQi4gIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlCiAgICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbi4gIEEgbnVsbC10ZXJtaW5hdG9yIGlzIG5vdCB3cml0dGVuLgoKICAgICBGTVQgY2Fubm90IGJlIHdpdGhpbiB0aGUgY3VycmVudCBvYmplY3QgaW4gT0IsIHNpbmNlIHRoYXQgb2JqZWN0CiAgICAgbWlnaHQgbW92ZSBhcyBpdCBncm93cy4KCiAgICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgb25seSB3aGVuIHRoZSBDIGxpYnJhcnkgcHJvdmlkZXMgdGhlCiAgICAgb2JzdGFjayBmZWF0dXJlLCB3aGljaCBwcm9iYWJseSBtZWFucyBvbmx5IG9uIEdOVSBzeXN0ZW1zLCBzZWUKICAgICAqbm90ZSBPYnN0YWNrczogKGxpYmMpT2JzdGFja3MuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogQysrIEZvcm1hdHRlZCBPdXRwdXQsICBQcmV2OiBGb3JtYXR0ZWQgT3V0cHV0IEZ1bmN0aW9ucywgIFVwOiBGb3JtYXR0ZWQgT3V0cHV0CgoxMC4zIEMrKyBGb3JtYXR0ZWQgT3V0cHV0Cj09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCBpbiBgbGliZ21weHgnICgqbm90ZSBIZWFkZXJzIGFuZApMaWJyYXJpZXM6OiksIHdoaWNoIGlzIGJ1aWx0IGlmIEMrKyBzdXBwb3J0IGlzIGVuYWJsZWQgKCpub3RlIEJ1aWxkCk9wdGlvbnM6OikuICBQcm90b3R5cGVzIGFyZSBhdmFpbGFibGUgZnJvbSBgPGdtcC5oPicuCgogLS0gRnVuY3Rpb246IG9zdHJlYW0mIG9wZXJhdG9yPDwgKG9zdHJlYW0mIFNUUkVBTSwgY29uc3QgbXB6X3QgT1ApCiAgICAgUHJpbnQgT1AgdG8gU1RSRUFNLCB1c2luZyBpdHMgYGlvcycgZm9ybWF0dGluZyBzZXR0aW5ncy4KICAgICBgaW9zOjp3aWR0aCcgaXMgcmVzZXQgdG8gMCBhZnRlciBvdXRwdXQsIHRoZSBzYW1lIGFzIHRoZSBzdGFuZGFyZAogICAgIGBvc3RyZWFtIG9wZXJhdG9yPDwnIHJvdXRpbmVzIGRvLgoKICAgICBJbiBoZXggb3Igb2N0YWwsIE9QIGlzIHByaW50ZWQgYXMgYSBzaWduZWQgbnVtYmVyLCB0aGUgc2FtZSBhcyBmb3IKICAgICBkZWNpbWFsLiAgVGhpcyBpcyB1bmxpa2UgdGhlIHN0YW5kYXJkIGBvcGVyYXRvcjw8JyByb3V0aW5lcyBvbgogICAgIGBpbnQnIGV0Yywgd2hpY2ggaW5zdGVhZCBnaXZlIHR3b3MgY29tcGxlbWVudC4KCiAtLSBGdW5jdGlvbjogb3N0cmVhbSYgb3BlcmF0b3I8PCAob3N0cmVhbSYgU1RSRUFNLCBjb25zdCBtcHFfdCBPUCkKICAgICBQcmludCBPUCB0byBTVFJFQU0sIHVzaW5nIGl0cyBgaW9zJyBmb3JtYXR0aW5nIHNldHRpbmdzLgogICAgIGBpb3M6OndpZHRoJyBpcyByZXNldCB0byAwIGFmdGVyIG91dHB1dCwgdGhlIHNhbWUgYXMgdGhlIHN0YW5kYXJkCiAgICAgYG9zdHJlYW0gb3BlcmF0b3I8PCcgcm91dGluZXMgZG8uCgogICAgIE91dHB1dCB3aWxsIGJlIGEgZnJhY3Rpb24gbGlrZSBgNS85Jywgb3IgaWYgdGhlIGRlbm9taW5hdG9yIGlzIDEKICAgICB0aGVuIGp1c3QgYSBwbGFpbiBpbnRlZ2VyIGxpa2UgYDEyMycuCgogICAgIEluIGhleCBvciBvY3RhbCwgT1AgaXMgcHJpbnRlZCBhcyBhIHNpZ25lZCB2YWx1ZSwgdGhlIHNhbWUgYXMgZm9yCiAgICAgZGVjaW1hbC4gIElmIGBpb3M6OnNob3diYXNlJyBpcyBzZXQgdGhlbiBhIGJhc2UgaW5kaWNhdG9yIGlzIHNob3duCiAgICAgb24gYm90aCB0aGUgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciAoaWYgdGhlIGRlbm9taW5hdG9yIGlzCiAgICAgcmVxdWlyZWQpLgoKIC0tIEZ1bmN0aW9uOiBvc3RyZWFtJiBvcGVyYXRvcjw8IChvc3RyZWFtJiBTVFJFQU0sIGNvbnN0IG1wZl90IE9QKQogICAgIFByaW50IE9QIHRvIFNUUkVBTSwgdXNpbmcgaXRzIGBpb3MnIGZvcm1hdHRpbmcgc2V0dGluZ3MuCiAgICAgYGlvczo6d2lkdGgnIGlzIHJlc2V0IHRvIDAgYWZ0ZXIgb3V0cHV0LCB0aGUgc2FtZSBhcyB0aGUgc3RhbmRhcmQKICAgICBgb3N0cmVhbSBvcGVyYXRvcjw8JyByb3V0aW5lcyBkby4KCiAgICAgVGhlIGRlY2ltYWwgcG9pbnQgZm9sbG93cyB0aGUgc3RhbmRhcmQgbGlicmFyeSBmbG9hdCBgb3BlcmF0b3I8PCcsCiAgICAgd2hpY2ggb24gcmVjZW50IHN5c3RlbXMgbWVhbnMgdGhlIGBzdGQ6OmxvY2FsZScgaW1idWVkIG9uIFNUUkVBTS4KCiAgICAgSGV4IGFuZCBvY3RhbCBhcmUgc3VwcG9ydGVkLCB1bmxpa2UgdGhlIHN0YW5kYXJkIGBvcGVyYXRvcjw8JyBvbgogICAgIGBkb3VibGUnLiAgVGhlIG1hbnRpc3NhIHdpbGwgYmUgaW4gaGV4IG9yIG9jdGFsLCB0aGUgZXhwb25lbnQgd2lsbAogICAgIGJlIGluIGRlY2ltYWwuICBGb3IgaGV4IHRoZSBleHBvbmVudCBkZWxpbWl0ZXIgaXMgYW4gYEAnLiAgVGhpcyBpcwogICAgIGFzIHBlciBgbXBmX291dF9zdHInLgoKICAgICBgaW9zOjpzaG93YmFzZScgaXMgc3VwcG9ydGVkLCBhbmQgd2lsbCBwdXQgYSBiYXNlIG9uIHRoZSBtYW50aXNzYSwKICAgICBmb3IgZXhhbXBsZSBoZXggYDB4MS44JyBvciBgMHgwLjgnLCBvciBvY3RhbCBgMDEuNCcgb3IgYDAwLjQnLgogICAgIFRoaXMgbGFzdCBmb3JtIGlzIHNsaWdodGx5IHN0cmFuZ2UsIGJ1dCBhdCBsZWFzdCBkaWZmZXJlbnRpYXRlcwogICAgIGl0c2VsZiBmcm9tIGRlY2ltYWwuCgogICBUaGVzZSBvcGVyYXRvcnMgbWVhbiB0aGF0IEdNUCB0eXBlcyBjYW4gYmUgcHJpbnRlZCBpbiB0aGUgdXN1YWwgQysrCndheSwgZm9yIGV4YW1wbGUsCgogICAgIG1wel90ICB6OwogICAgIGludCAgICBuOwogICAgIC4uLgogICAgIGNvdXQgPDwgIml0ZXJhdGlvbiAiIDw8IG4gPDwgIiB2YWx1ZSAiIDw8IHogPDwgIlxuIjsKCiAgIEJ1dCBub3RlIHRoYXQgYG9zdHJlYW0nIG91dHB1dCAoYW5kIGBpc3RyZWFtJyBpbnB1dCwgKm5vdGUgQysrCkZvcm1hdHRlZCBJbnB1dDo6KSBpcyB0aGUgb25seSBvdmVybG9hZGluZyBhdmFpbGFibGUgZm9yIHRoZSBHTVAgdHlwZXMKYW5kIHRoYXQgZm9yIGluc3RhbmNlIHVzaW5nIGArJyB3aXRoIGFuIGBtcHpfdCcgd2lsbCBoYXZlIHVucHJlZGljdGFibGUKcmVzdWx0cy4gIEZvciBjbGFzc2VzIHdpdGggb3ZlcmxvYWRpbmcsIHNlZSAqbm90ZSBDKysgQ2xhc3MgSW50ZXJmYWNlOjouCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogRm9ybWF0dGVkIElucHV0LCAgTmV4dDogQysrIENsYXNzIEludGVyZmFjZSwgIFByZXY6IEZvcm1hdHRlZCBPdXRwdXQsICBVcDogVG9wCgoxMSBGb3JtYXR0ZWQgSW5wdXQKKioqKioqKioqKioqKioqKioqCgoqIE1lbnU6CgoqIEZvcm1hdHRlZCBJbnB1dCBTdHJpbmdzOjoKKiBGb3JtYXR0ZWQgSW5wdXQgRnVuY3Rpb25zOjoKKiBDKysgRm9ybWF0dGVkIElucHV0OjoKCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBGb3JtYXR0ZWQgSW5wdXQgU3RyaW5ncywgIE5leHQ6IEZvcm1hdHRlZCBJbnB1dCBGdW5jdGlvbnMsICBQcmV2OiBGb3JtYXR0ZWQgSW5wdXQsICBVcDogRm9ybWF0dGVkIElucHV0CgoxMS4xIEZvcm1hdHRlZCBJbnB1dCBTdHJpbmdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmBnbXBfc2NhbmYnIGFuZCBmcmllbmRzIGFjY2VwdCBmb3JtYXQgc3RyaW5ncyBzaW1pbGFyIHRvIHRoZSBzdGFuZGFyZCBDCmBzY2FuZicgKCpub3RlIEZvcm1hdHRlZCBJbnB1dDogKGxpYmMpRm9ybWF0dGVkIElucHV0LikuICBBIGZvcm1hdApzcGVjaWZpY2F0aW9uIGlzIG9mIHRoZSBmb3JtCgogICAgICUgW2ZsYWdzXSBbd2lkdGhdIFt0eXBlXSBjb252CgogICBHTVAgYWRkcyB0eXBlcyBgWicsIGBRJyBhbmQgYEYnIGZvciBgbXB6X3QnLCBgbXBxX3QnIGFuZCBgbXBmX3QnCnJlc3BlY3RpdmVseS4gIGBaJyBhbmQgYFEnIGJlaGF2ZSBsaWtlIGludGVnZXJzLiAgYFEnIHdpbGwgcmVhZCBhIGAvJwphbmQgYSBkZW5vbWluYXRvciwgaWYgcHJlc2VudC4gIGBGJyBiZWhhdmVzIGxpa2UgYSBmbG9hdC4KCiAgIEdNUCB2YXJpYWJsZXMgZG9uJ3QgcmVxdWlyZSBhbiBgJicgd2hlbiBwYXNzZWQgdG8gYGdtcF9zY2FuZicsIHNpbmNlCnRoZXkncmUgYWxyZWFkeSAiY2FsbC1ieS1yZWZlcmVuY2UiLiAgRm9yIGV4YW1wbGUsCgogICAgIC8qIHRvIHJlYWQgc2F5ICJhKDUpID0gMTIzNCIgKi8KICAgICBpbnQgICBuOwogICAgIG1wel90IHo7CiAgICAgZ21wX3NjYW5mICgiYSglZCkgPSAlWmRcbiIsICZuLCB6KTsKCiAgICAgbXBxX3QgcTEsIHEyOwogICAgIGdtcF9zc2NhbmYgKCIwMzc3ICsgMHgxMC8weDExIiwgIiVRaSArICVRaSIsIHExLCBxMik7CgogICAgIC8qIHRvIHJlYWQgc2F5ICJ0b3BsZWZ0ICgxLjU1LC0yLjY2KSIgKi8KICAgICBtcGZfdCB4LCB5OwogICAgIGNoYXIgIGJ1ZlszMl07CiAgICAgZ21wX3NjYW5mICgiJTMxcyAoJUZmLCVGZikiLCBidWYsIHgsIHkpOwoKICAgQWxsIHRoZSBzdGFuZGFyZCBDIGBzY2FuZicgdHlwZXMgYmVoYXZlIHRoZSBzYW1lIGFzIGluIHRoZSBDIGxpYnJhcnkKYHNjYW5mJywgYW5kIGNhbiBiZSBmcmVlbHkgaW50ZXJtaXhlZCB3aXRoIHRoZSBHTVAgZXh0ZW5zaW9ucy4gIEluIHRoZQpjdXJyZW50IGltcGxlbWVudGF0aW9uIHRoZSBzdGFuZGFyZCBwYXJ0cyBvZiB0aGUgZm9ybWF0IHN0cmluZyBhcmUKc2ltcGx5IGhhbmRlZCB0byBgc2NhbmYnIGFuZCBvbmx5IHRoZSBHTVAgZXh0ZW5zaW9ucyBoYW5kbGVkIGRpcmVjdGx5LgoKICAgVGhlIGZsYWdzIGFjY2VwdGVkIGFyZSBhcyBmb2xsb3dzLiAgYGEnIGFuZCBgJycgd2lsbCBkZXBlbmQgb24Kc3VwcG9ydCBmcm9tIHRoZSBDIGxpYnJhcnksIGFuZCBgJycgY2Fubm90IGJlIHVzZWQgd2l0aCBHTVAgdHlwZXMuCgogICAgICogICAgICAgICByZWFkIGJ1dCBkb24ndCBzdG9yZQogICAgIGEgICAgICAgICBhbGxvY2F0ZSBhIGJ1ZmZlciAoc3RyaW5nIGNvbnZlcnNpb25zKQogICAgICcgICAgICAgICBncm91cGVkIGRpZ2l0cywgR0xJQkMgc3R5bGUgKG5vdCBHTVAKICAgICAgICAgICAgICAgdHlwZXMpCgogICBUaGUgc3RhbmRhcmQgdHlwZXMgYWNjZXB0ZWQgYXJlIGFzIGZvbGxvd3MuICBgaCcgYW5kIGBsJyBhcmUKcG9ydGFibGUsIHRoZSByZXN0IHdpbGwgZGVwZW5kIG9uIHRoZSBjb21waWxlciAob3IgaW5jbHVkZSBmaWxlcykgZm9yCnRoZSB0eXBlIGFuZCB0aGUgQyBsaWJyYXJ5IGZvciB0aGUgaW5wdXQuCgogICAgIGggICAgICAgICBzaG9ydAogICAgIGhoICAgICAgICBjaGFyCiAgICAgaiAgICAgICAgIGludG1heF90IG9yIHVpbnRtYXhfdAogICAgIGwgICAgICAgICBsb25nIGludCwgZG91YmxlIG9yIHdjaGFyX3QKICAgICBsbCAgICAgICAgbG9uZyBsb25nCiAgICAgTCAgICAgICAgIGxvbmcgZG91YmxlCiAgICAgcSAgICAgICAgIHF1YWRfdCBvciB1X3F1YWRfdAogICAgIHQgICAgICAgICBwdHJkaWZmX3QKICAgICB6ICAgICAgICAgc2l6ZV90CgpUaGUgR01QIHR5cGVzIGFyZQoKICAgICBGICAgICAgICAgbXBmX3QsIGZsb2F0IGNvbnZlcnNpb25zCiAgICAgUSAgICAgICAgIG1wcV90LCBpbnRlZ2VyIGNvbnZlcnNpb25zCiAgICAgWiAgICAgICAgIG1wel90LCBpbnRlZ2VyIGNvbnZlcnNpb25zCgogICBUaGUgY29udmVyc2lvbnMgYWNjZXB0ZWQgYXJlIGFzIGZvbGxvd3MuICBgcCcgYW5kIGBbJyB3aWxsIGRlcGVuZCBvbgpzdXBwb3J0IGZyb20gdGhlIEMgbGlicmFyeSwgdGhlIHJlc3QgYXJlIHN0YW5kYXJkLgoKICAgICBjICAgICAgICAgY2hhcmFjdGVyIG9yIGNoYXJhY3RlcnMKICAgICBkICAgICAgICAgZGVjaW1hbCBpbnRlZ2VyCiAgICAgZSBFIGYgZyBHIGZsb2F0CiAgICAgaSAgICAgICAgIGludGVnZXIgd2l0aCBiYXNlIGluZGljYXRvcgogICAgIG4gICAgICAgICBjaGFyYWN0ZXJzIHJlYWQgc28gZmFyCiAgICAgbyAgICAgICAgIG9jdGFsIGludGVnZXIKICAgICBwICAgICAgICAgcG9pbnRlcgogICAgIHMgICAgICAgICBzdHJpbmcgb2Ygbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycwogICAgIHUgICAgICAgICBkZWNpbWFsIGludGVnZXIKICAgICB4IFggICAgICAgaGV4IGludGVnZXIKICAgICBbICAgICAgICAgc3RyaW5nIG9mIGNoYXJhY3RlcnMgaW4gYSBzZXQKCiAgIGBlJywgYEUnLCBgZicsIGBnJyBhbmQgYEcnIGFyZSBpZGVudGljYWwsIHRoZXkgYWxsIHJlYWQgZWl0aGVyIGZpeGVkCnBvaW50IG9yIHNjaWVudGlmaWMgZm9ybWF0LCBhbmQgZWl0aGVyIHVwcGVyIG9yIGxvd2VyIGNhc2UgYGUnIGZvciB0aGUKZXhwb25lbnQgaW4gc2NpZW50aWZpYyBmb3JtYXQuCgogICBDOTkgc3R5bGUgaGV4IGZsb2F0IGZvcm1hdCAoYHByaW50ZiAlYScsICpub3RlIEZvcm1hdHRlZCBPdXRwdXQKU3RyaW5nczo6KSBpcyBhbHdheXMgYWNjZXB0ZWQgZm9yIGBtcGZfdCcsIGJ1dCBmb3IgdGhlIHN0YW5kYXJkIGZsb2F0CnR5cGVzIGl0IHdpbGwgZGVwZW5kIG9uIHRoZSBDIGxpYnJhcnkuCgogICBgeCcgYW5kIGBYJyBhcmUgaWRlbnRpY2FsLCBib3RoIGFjY2VwdCBib3RoIHVwcGVyIGFuZCBsb3dlciBjYXNlCmhleGFkZWNpbWFsLgoKICAgYG8nLCBgdScsIGB4JyBhbmQgYFgnIGFsbCByZWFkIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIHZhbHVlcy4gIEZvciB0aGUKc3RhbmRhcmQgQyB0eXBlcyB0aGVzZSBhcmUgZGVzY3JpYmVkIGFzICJ1bnNpZ25lZCIgY29udmVyc2lvbnMsIGJ1dAp0aGF0IG1lcmVseSBhZmZlY3RzIGNlcnRhaW4gb3ZlcmZsb3cgaGFuZGxpbmcsIG5lZ2F0aXZlcyBhcmUgc3RpbGwKYWxsb3dlZCAocGVyIGBzdHJ0b3VsJywgKm5vdGUgUGFyc2luZyBvZiBJbnRlZ2VyczogKGxpYmMpUGFyc2luZyBvZgpJbnRlZ2Vycy4pLiAgRm9yIEdNUCB0eXBlcyB0aGVyZSBhcmUgbm8gb3ZlcmZsb3dzLCBzbyBgZCcgYW5kIGB1JyBhcmUKaWRlbnRpY2FsLgoKICAgYFEnIHR5cGUgcmVhZHMgdGhlIG51bWVyYXRvciBhbmQgKG9wdGlvbmFsKSBkZW5vbWluYXRvciBhcyBnaXZlbi4KSWYgdGhlIHZhbHVlIG1pZ2h0IG5vdCBiZSBpbiBjYW5vbmljYWwgZm9ybSB0aGVuIGBtcHFfY2Fub25pY2FsaXplJwptdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXNpbmcgaXQgaW4gYW55IGNhbGN1bGF0aW9ucyAoKm5vdGUgUmF0aW9uYWwKTnVtYmVyIEZ1bmN0aW9uczo6KS4KCiAgIGBRaScgd2lsbCByZWFkIGEgYmFzZSBzcGVjaWZpY2F0aW9uIHNlcGFyYXRlbHkgZm9yIHRoZSBudW1lcmF0b3IgYW5kCmRlbm9taW5hdG9yLiAgRm9yIGV4YW1wbGUgYDB4MTAvMTEnIHdvdWxkIGJlIDE2LzExLCB3aGVyZWFzIGAweDEwLzB4MTEnCndvdWxkIGJlIDE2LzE3LgoKICAgYG4nIGNhbiBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSB0eXBlcyBhYm92ZSwgZXZlbiB0aGUgR01QIHR5cGVzLgpgKicgdG8gc3VwcHJlc3MgYXNzaWdubWVudCBpcyBhbGxvd2VkLCB0aG91Z2ggaW4gdGhhdCBjYXNlIGl0IHdvdWxkIGRvCm5vdGhpbmcgYXQgYWxsLgoKICAgT3RoZXIgY29udmVyc2lvbnMgb3IgdHlwZXMgdGhhdCBtaWdodCBiZSBhY2NlcHRlZCBieSB0aGUgQyBsaWJyYXJ5CmBzY2FuZicgY2Fubm90IGJlIHVzZWQgdGhyb3VnaCBgZ21wX3NjYW5mJy4KCiAgIFdoaXRlc3BhY2UgaXMgcmVhZCBhbmQgZGlzY2FyZGVkIGJlZm9yZSBhIGZpZWxkLCBleGNlcHQgZm9yIGBjJyBhbmQKYFsnIGNvbnZlcnNpb25zLgoKICAgRm9yIGZsb2F0IGNvbnZlcnNpb25zLCB0aGUgZGVjaW1hbCBwb2ludCBjaGFyYWN0ZXIgKG9yIHN0cmluZykKZXhwZWN0ZWQgaXMgdGFrZW4gZnJvbSB0aGUgY3VycmVudCBsb2NhbGUgc2V0dGluZ3Mgb24gc3lzdGVtcyB3aGljaApwcm92aWRlIGBsb2NhbGVjb252JyAoKm5vdGUgTG9jYWxlcyBhbmQgSW50ZXJuYXRpb25hbGl6YXRpb246CihsaWJjKUxvY2FsZXMuKS4gIFRoZSBDIGxpYnJhcnkgd2lsbCBub3JtYWxseSBkbyB0aGUgc2FtZSBmb3Igc3RhbmRhcmQKZmxvYXQgaW5wdXQuCgogICBUaGUgZm9ybWF0IHN0cmluZyBpcyBvbmx5IGludGVycHJldGVkIGFzIHBsYWluIGBjaGFyJ3MsIG11bHRpYnl0ZQpjaGFyYWN0ZXJzIGFyZSBub3QgcmVjb2duaXNlZC4gIFBlcmhhcHMgdGhpcyB3aWxsIGNoYW5nZSBpbiB0aGUgZnV0dXJlLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEZvcm1hdHRlZCBJbnB1dCBGdW5jdGlvbnMsICBOZXh0OiBDKysgRm9ybWF0dGVkIElucHV0LCAgUHJldjogRm9ybWF0dGVkIElucHV0IFN0cmluZ3MsICBVcDogRm9ybWF0dGVkIElucHV0CgoxMS4yIEZvcm1hdHRlZCBJbnB1dCBGdW5jdGlvbnMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpFYWNoIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGlzIHNpbWlsYXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgQwpsaWJyYXJ5IGZ1bmN0aW9uLiAgVGhlIHBsYWluIGBzY2FuZicgZm9ybXMgdGFrZSBhIHZhcmlhYmxlIGFyZ3VtZW50Cmxpc3QuICBUaGUgYHZzY2FuZicgZm9ybXMgdGFrZSBhbiBhcmd1bWVudCBwb2ludGVyLCBzZWUgKm5vdGUgVmFyaWFkaWMKRnVuY3Rpb25zOiAobGliYylWYXJpYWRpYyBGdW5jdGlvbnMsIG9yIGBtYW4gMyB2YV9zdGFydCcuCgogICBJdCBzaG91bGQgYmUgZW1waGFzaXNlZCB0aGF0IGlmIGEgZm9ybWF0IHN0cmluZyBpcyBpbnZhbGlkLCBvciB0aGUKYXJndW1lbnRzIGRvbid0IG1hdGNoIHdoYXQgdGhlIGZvcm1hdCBzcGVjaWZpZXMsIHRoZW4gdGhlIGJlaGF2aW91ciBvZgphbnkgb2YgdGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgdW5wcmVkaWN0YWJsZS4gIEdDQyBmb3JtYXQgc3RyaW5nCmNoZWNraW5nIGlzIG5vdCBhdmFpbGFibGUsIHNpbmNlIGl0IGRvZXNuJ3QgcmVjb2duaXNlIHRoZSBHTVAKZXh0ZW5zaW9ucy4KCiAgIE5vIG92ZXJsYXAgaXMgcGVybWl0dGVkIGJldHdlZW4gdGhlIEZNVCBzdHJpbmcgYW5kIGFueSBvZiB0aGUgcmVzdWx0cwpwcm9kdWNlZC4KCiAtLSBGdW5jdGlvbjogaW50IGdtcF9zY2FuZiAoY29uc3QgY2hhciAqRk1ULCAuLi4pCiAtLSBGdW5jdGlvbjogaW50IGdtcF92c2NhbmYgKGNvbnN0IGNoYXIgKkZNVCwgdmFfbGlzdCBBUCkKICAgICBSZWFkIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0IGBzdGRpbicuCgogLS0gRnVuY3Rpb246IGludCBnbXBfZnNjYW5mIChGSUxFICpGUCwgY29uc3QgY2hhciAqRk1ULCAuLi4pCiAtLSBGdW5jdGlvbjogaW50IGdtcF92ZnNjYW5mIChGSUxFICpGUCwgY29uc3QgY2hhciAqRk1ULCB2YV9saXN0IEFQKQogICAgIFJlYWQgZnJvbSB0aGUgc3RyZWFtIEZQLgoKIC0tIEZ1bmN0aW9uOiBpbnQgZ21wX3NzY2FuZiAoY29uc3QgY2hhciAqUywgY29uc3QgY2hhciAqRk1ULCAuLi4pCiAtLSBGdW5jdGlvbjogaW50IGdtcF92c3NjYW5mIChjb25zdCBjaGFyICpTLCBjb25zdCBjaGFyICpGTVQsIHZhX2xpc3QKICAgICAgICAgIEFQKQogICAgIFJlYWQgZnJvbSBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgUy4KCiAgIFRoZSByZXR1cm4gdmFsdWUgZnJvbSBlYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyB0aGUgc2FtZSBhcyB0aGUKc3RhbmRhcmQgQzk5IGBzY2FuZicsIG5hbWVseSB0aGUgbnVtYmVyIG9mIGZpZWxkcyBzdWNjZXNzZnVsbHkgcGFyc2VkCmFuZCBzdG9yZWQuICBgJW4nIGZpZWxkcyBhbmQgZmllbGRzIHJlYWQgYnV0IHN1cHByZXNzZWQgYnkgYConIGRvbid0CmNvdW50IHRvd2FyZHMgdGhlIHJldHVybiB2YWx1ZS4KCiAgIElmIGVuZCBvZiBpbnB1dCAob3IgYSBmaWxlIGVycm9yKSBpcyByZWFjaGVkIGJlZm9yZSBhIGNoYXJhY3RlciBmb3IKYSBmaWVsZCBvciBhIGxpdGVyYWwsIGFuZCBpZiBubyBwcmV2aW91cyBub24tc3VwcHJlc3NlZCBmaWVsZHMgaGF2ZQptYXRjaGVkLCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgaXMgYEVPRicgaW5zdGVhZCBvZiAwLiAgQSB3aGl0ZXNwYWNlCmNoYXJhY3RlciBpbiB0aGUgZm9ybWF0IHN0cmluZyBpcyBvbmx5IGFuIG9wdGlvbmFsIG1hdGNoIGFuZCBkb2Vzbid0CmluZHVjZSBhbiBgRU9GJyBpbiB0aGlzIGZhc2hpb24uICBMZWFkaW5nIHdoaXRlc3BhY2UgcmVhZCBhbmQgZGlzY2FyZGVkCmZvciBhIGZpZWxkIGRvbid0IGNvdW50IGFzIGNoYXJhY3RlcnMgZm9yIHRoYXQgZmllbGQuCgogICBGb3IgdGhlIEdNUCB0eXBlcywgaW5wdXQgcGFyc2luZyBmb2xsb3dzIEM5OSBydWxlcywgbmFtZWx5IG9uZQpjaGFyYWN0ZXIgb2YgbG9va2FoZWFkIGlzIHVzZWQgYW5kIGNoYXJhY3RlcnMgYXJlIHJlYWQgd2hpbGUgdGhleQpjb250aW51ZSB0byBtZWV0IHRoZSBmb3JtYXQgcmVxdWlyZW1lbnRzLiAgSWYgdGhpcyBkb2Vzbid0IHByb3ZpZGUgYQpjb21wbGV0ZSBudW1iZXIgdGhlbiB0aGUgZnVuY3Rpb24gdGVybWluYXRlcywgd2l0aCB0aGF0IGZpZWxkIG5vdApzdG9yZWQgbm9yIGNvdW50ZWQgdG93YXJkcyB0aGUgcmV0dXJuIHZhbHVlLiAgRm9yIGluc3RhbmNlIHdpdGggYG1wZl90JwphbiBpbnB1dCBgMS4yM2UtWFlaJyB3b3VsZCBiZSByZWFkIHVwIHRvIHRoZSBgWCcgYW5kIHRoYXQgY2hhcmFjdGVyCnB1c2hlZCBiYWNrIHNpbmNlIGl0J3Mgbm90IGEgZGlnaXQuICBUaGUgc3RyaW5nIGAxLjIzZS0nIHdvdWxkIHRoZW4gYmUKY29uc2lkZXJlZCBpbnZhbGlkIHNpbmNlIGFuIGBlJyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGF0IGxlYXN0IG9uZSBkaWdpdC4KCiAgIEZvciB0aGUgc3RhbmRhcmQgQyB0eXBlcywgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gR01QIGNhbGxzCnRoZSBDIGxpYnJhcnkgYHNjYW5mJyBmdW5jdGlvbnMsIHdoaWNoIG1pZ2h0IGhhdmUgbG9vc2VyIHJ1bGVzIGFib3V0CndoYXQgY29uc3RpdHV0ZXMgYSB2YWxpZCBpbnB1dC4KCiAgIE5vdGUgdGhhdCBgZ21wX3NzY2FuZicgaXMgdGhlIHNhbWUgYXMgYGdtcF9mc2NhbmYnIGFuZCBvbmx5IGRvZXMgb25lCmNoYXJhY3RlciBvZiBsb29rYWhlYWQgd2hlbiBwYXJzaW5nLiAgQWx0aG91Z2ggY2xlYXJseSBpdCBjb3VsZCBsb29rIGF0Cml0cyBlbnRpcmUgaW5wdXQsIGl0IGlzIGRlbGliZXJhdGVseSBtYWRlIGlkZW50aWNhbCB0byBgZ21wX2ZzY2FuZicsCnRoZSBzYW1lIHdheSBDOTkgYHNzY2FuZicgaXMgdGhlIHNhbWUgYXMgYGZzY2FuZicuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogQysrIEZvcm1hdHRlZCBJbnB1dCwgIFByZXY6IEZvcm1hdHRlZCBJbnB1dCBGdW5jdGlvbnMsICBVcDogRm9ybWF0dGVkIElucHV0CgoxMS4zIEMrKyBGb3JtYXR0ZWQgSW5wdXQKPT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgaW4gYGxpYmdtcHh4JyAoKm5vdGUgSGVhZGVycyBhbmQKTGlicmFyaWVzOjopLCB3aGljaCBpcyBidWlsdCBvbmx5IGlmIEMrKyBzdXBwb3J0IGlzIGVuYWJsZWQgKCpub3RlCkJ1aWxkIE9wdGlvbnM6OikuICBQcm90b3R5cGVzIGFyZSBhdmFpbGFibGUgZnJvbSBgPGdtcC5oPicuCgogLS0gRnVuY3Rpb246IGlzdHJlYW0mIG9wZXJhdG9yPj4gKGlzdHJlYW0mIFNUUkVBTSwgbXB6X3QgUk9QKQogICAgIFJlYWQgUk9QIGZyb20gU1RSRUFNLCB1c2luZyBpdHMgYGlvcycgZm9ybWF0dGluZyBzZXR0aW5ncy4KCiAtLSBGdW5jdGlvbjogaXN0cmVhbSYgb3BlcmF0b3I+PiAoaXN0cmVhbSYgU1RSRUFNLCBtcHFfdCBST1ApCiAgICAgQW4gaW50ZWdlciBsaWtlIGAxMjMnIHdpbGwgYmUgcmVhZCwgb3IgYSBmcmFjdGlvbiBsaWtlIGA1LzknLiAgTm8KICAgICB3aGl0ZXNwYWNlIGlzIGFsbG93ZWQgYXJvdW5kIHRoZSBgLycuICBJZiB0aGUgZnJhY3Rpb24gaXMgbm90IGluCiAgICAgY2Fub25pY2FsIGZvcm0gdGhlbiBgbXBxX2Nhbm9uaWNhbGl6ZScgbXVzdCBiZSBjYWxsZWQgKCpub3RlCiAgICAgUmF0aW9uYWwgTnVtYmVyIEZ1bmN0aW9uczo6KSBiZWZvcmUgb3BlcmF0aW5nIG9uIGl0LgoKICAgICBBcyBwZXIgaW50ZWdlciBpbnB1dCwgYW4gYDAnIG9yIGAweCcgYmFzZSBpbmRpY2F0b3IgaXMgcmVhZCB3aGVuCiAgICAgbm9uZSBvZiBgaW9zOjpkZWMnLCBgaW9zOjpvY3QnIG9yIGBpb3M6OmhleCcgYXJlIHNldC4gIFRoaXMgaXMKICAgICBkb25lIHNlcGFyYXRlbHkgZm9yIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3IsIHNvIHRoYXQgZm9yIGluc3RhbmNlCiAgICAgYDB4MTAvMTEnIGlzIDE2LzExIGFuZCBgMHgxMC8weDExJyBpcyAxNi8xNy4KCiAtLSBGdW5jdGlvbjogaXN0cmVhbSYgb3BlcmF0b3I+PiAoaXN0cmVhbSYgU1RSRUFNLCBtcGZfdCBST1ApCiAgICAgUmVhZCBST1AgZnJvbSBTVFJFQU0sIHVzaW5nIGl0cyBgaW9zJyBmb3JtYXR0aW5nIHNldHRpbmdzLgoKICAgICBIZXggb3Igb2N0YWwgZmxvYXRzIGFyZSBub3Qgc3VwcG9ydGVkLCBidXQgbWlnaHQgYmUgaW4gdGhlIGZ1dHVyZSwKICAgICBvciBwZXJoYXBzIGl0J3MgYmVzdCB0byBhY2NlcHQgb25seSB3aGF0IHRoZSBzdGFuZGFyZCBmbG9hdAogICAgIGBvcGVyYXRvcj4+JyBkb2VzLgoKICAgTm90ZSB0aGF0IGRpZ2l0IGdyb3VwaW5nIHNwZWNpZmllZCBieSB0aGUgYGlzdHJlYW0nIGxvY2FsZSBpcwpjdXJyZW50bHkgbm90IGFjY2VwdGVkLiAgUGVyaGFwcyB0aGlzIHdpbGwgY2hhbmdlIGluIHRoZSBmdXR1cmUuCgoKICAgVGhlc2Ugb3BlcmF0b3JzIG1lYW4gdGhhdCBHTVAgdHlwZXMgY2FuIGJlIHJlYWQgaW4gdGhlIHVzdWFsIEMrKwp3YXksIGZvciBleGFtcGxlLAoKICAgICBtcHpfdCAgejsKICAgICAuLi4KICAgICBjaW4gPj4gejsKCiAgIEJ1dCBub3RlIHRoYXQgYGlzdHJlYW0nIGlucHV0IChhbmQgYG9zdHJlYW0nIG91dHB1dCwgKm5vdGUgQysrCkZvcm1hdHRlZCBPdXRwdXQ6OikgaXMgdGhlIG9ubHkgb3ZlcmxvYWRpbmcgYXZhaWxhYmxlIGZvciB0aGUgR01QIHR5cGVzCmFuZCB0aGF0IGZvciBpbnN0YW5jZSB1c2luZyBgKycgd2l0aCBhbiBgbXB6X3QnIHdpbGwgaGF2ZSB1bnByZWRpY3RhYmxlCnJlc3VsdHMuICBGb3IgY2xhc3NlcyB3aXRoIG92ZXJsb2FkaW5nLCBzZWUgKm5vdGUgQysrIENsYXNzIEludGVyZmFjZTo6LgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEMrKyBDbGFzcyBJbnRlcmZhY2UsICBOZXh0OiBDdXN0b20gQWxsb2NhdGlvbiwgIFByZXY6IEZvcm1hdHRlZCBJbnB1dCwgIFVwOiBUb3AKCjEyIEMrKyBDbGFzcyBJbnRlcmZhY2UKKioqKioqKioqKioqKioqKioqKioqKgoKVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyB0aGUgQysrIGNsYXNzIGJhc2VkIGludGVyZmFjZSB0byBHTVAuCgogICBBbGwgR01QIEMgbGFuZ3VhZ2UgdHlwZXMgYW5kIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBpbiBDKysgcHJvZ3JhbXMsCnNpbmNlIGBnbXAuaCcgaGFzIGBleHRlcm4gIkMiJyBxdWFsaWZpZXJzLCBidXQgdGhlIGNsYXNzIGludGVyZmFjZQpvZmZlcnMgb3ZlcmxvYWRlZCBmdW5jdGlvbnMgYW5kIG9wZXJhdG9ycyB3aGljaCBtYXkgYmUgbW9yZSBjb252ZW5pZW50LgoKICAgRHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSwgYSByZWFzb25hYmx5IHJlY2VudCBDKysKY29tcGlsZXIgaXMgcmVxdWlyZWQsIG9uZSBzdXBwb3J0aW5nIG5hbWVzcGFjZXMsIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24Kb2YgdGVtcGxhdGVzIGFuZCBtZW1iZXIgdGVtcGxhdGVzLgoKICAgKkV2ZXJ5dGhpbmcgZGVzY3JpYmVkIGluIHRoaXMgY2hhcHRlciBpcyB0byBiZSBjb25zaWRlcmVkIHByZWxpbWluYXJ5CmFuZCBtaWdodCBiZSBzdWJqZWN0IHRvIGluY29tcGF0aWJsZSBjaGFuZ2VzIGlmIHNvbWUgdW5mb3Jlc2VlbgpkaWZmaWN1bHR5IHJldmVhbHMgaXRzZWxmLioKCiogTWVudToKCiogQysrIEludGVyZmFjZSBHZW5lcmFsOjoKKiBDKysgSW50ZXJmYWNlIEludGVnZXJzOjoKKiBDKysgSW50ZXJmYWNlIFJhdGlvbmFsczo6CiogQysrIEludGVyZmFjZSBGbG9hdHM6OgoqIEMrKyBJbnRlcmZhY2UgUmFuZG9tIE51bWJlcnM6OgoqIEMrKyBJbnRlcmZhY2UgTGltaXRhdGlvbnM6OgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEMrKyBJbnRlcmZhY2UgR2VuZXJhbCwgIE5leHQ6IEMrKyBJbnRlcmZhY2UgSW50ZWdlcnMsICBQcmV2OiBDKysgQ2xhc3MgSW50ZXJmYWNlLCAgVXA6IEMrKyBDbGFzcyBJbnRlcmZhY2UKCjEyLjEgQysrIEludGVyZmFjZSBHZW5lcmFsCj09PT09PT09PT09PT09PT09PT09PT09PT09CgpBbGwgdGhlIEMrKyBjbGFzc2VzIGFuZCBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSB3aXRoCgogICAgICNpbmNsdWRlIDxnbXB4eC5oPgoKICAgUHJvZ3JhbXMgc2hvdWxkIGJlIGxpbmtlZCB3aXRoIHRoZSBgbGliZ21weHgnIGFuZCBgbGliZ21wJwpsaWJyYXJpZXMuICBGb3IgZXhhbXBsZSwKCiAgICAgZysrIG15Y3h4cHJvZy5jYyAtbGdtcHh4IC1sZ21wCgpUaGUgY2xhc3NlcyBkZWZpbmVkIGFyZQoKIC0tIENsYXNzOiBtcHpfY2xhc3MKIC0tIENsYXNzOiBtcHFfY2xhc3MKIC0tIENsYXNzOiBtcGZfY2xhc3MKCiAgIFRoZSBzdGFuZGFyZCBvcGVyYXRvcnMgYW5kIHZhcmlvdXMgc3RhbmRhcmQgZnVuY3Rpb25zIGFyZSBvdmVybG9hZGVkCnRvIGFsbG93IGFyaXRobWV0aWMgd2l0aCB0aGVzZSBjbGFzc2VzLiAgRm9yIGV4YW1wbGUsCgogICAgIGludAogICAgIG1haW4gKHZvaWQpCiAgICAgewogICAgICAgbXB6X2NsYXNzIGEsIGIsIGM7CgogICAgICAgYSA9IDEyMzQ7CiAgICAgICBiID0gIi01Njc4IjsKICAgICAgIGMgPSBhK2I7CiAgICAgICBjb3V0IDw8ICJzdW0gaXMgIiA8PCBjIDw8ICJcbiI7CiAgICAgICBjb3V0IDw8ICJhYnNvbHV0ZSB2YWx1ZSBpcyAiIDw8IGFicyhjKSA8PCAiXG4iOwoKICAgICAgIHJldHVybiAwOwogICAgIH0KCiAgIEFuIGltcG9ydGFudCBmZWF0dXJlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyB0aGF0IGFuIGV4cHJlc3Npb24gbGlrZQpgYT1iK2MnIHJlc3VsdHMgaW4gYSBzaW5nbGUgY2FsbCB0byB0aGUgY29ycmVzcG9uZGluZyBgbXB6X2FkZCcsCndpdGhvdXQgdXNpbmcgYSB0ZW1wb3JhcnkgZm9yIHRoZSBgYitjJyBwYXJ0LiAgRXhwcmVzc2lvbnMgd2hpY2ggYnkKdGhlaXIgbmF0dXJlIGltcGx5IGludGVybWVkaWF0ZSB2YWx1ZXMsIGxpa2UgYGE9YipjK2QqZScsIHN0aWxsIHVzZQp0ZW1wb3JhcmllcyB0aG91Z2guCgogICBUaGUgY2xhc3NlcyBjYW4gYmUgZnJlZWx5IGludGVybWl4ZWQgaW4gZXhwcmVzc2lvbnMsIGFzIGNhbiB0aGUKY2xhc3NlcyBhbmQgdGhlIHN0YW5kYXJkIHR5cGVzIGBsb25nJywgYHVuc2lnbmVkIGxvbmcnIGFuZCBgZG91YmxlJy4KU21hbGxlciB0eXBlcyBsaWtlIGBpbnQnIG9yIGBmbG9hdCcgY2FuIGFsc28gYmUgaW50ZXJtaXhlZCwgc2luY2UgQysrCndpbGwgcHJvbW90ZSB0aGVtLgoKICAgTm90ZSB0aGF0IGBib29sJyBpcyBub3QgYWNjZXB0ZWQgZGlyZWN0bHksIGJ1dCBtdXN0IGJlIGV4cGxpY2l0bHkKY2FzdCB0byBhbiBgaW50JyBmaXJzdC4gIFRoaXMgaXMgYmVjYXVzZSBDKysgd2lsbCBhdXRvbWF0aWNhbGx5IGNvbnZlcnQKYW55IHBvaW50ZXIgdG8gYSBgYm9vbCcsIHNvIGlmIEdNUCBhY2NlcHRlZCBgYm9vbCcgaXQgd291bGQgbWFrZSBhbGwKc29ydHMgb2YgaW52YWxpZCBjbGFzcyBhbmQgcG9pbnRlciBjb21iaW5hdGlvbnMgY29tcGlsZSBidXQgYWxtb3N0CmNlcnRhaW5seSBub3QgZG8gYW55dGhpbmcgc2Vuc2libGUuCgogICBDb252ZXJzaW9ucyBiYWNrIGZyb20gdGhlIGNsYXNzZXMgdG8gc3RhbmRhcmQgQysrIHR5cGVzIGFyZW4ndCBkb25lCmF1dG9tYXRpY2FsbHksIGluc3RlYWQgbWVtYmVyIGZ1bmN0aW9ucyBsaWtlIGBnZXRfc2knIGFyZSBwcm92aWRlZCAoc2VlCnRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgZm9yIGRldGFpbHMpLgoKICAgQWxzbyB0aGVyZSBhcmUgbm8gYXV0b21hdGljIGNvbnZlcnNpb25zIGZyb20gdGhlIGNsYXNzZXMgdG8gdGhlCmNvcnJlc3BvbmRpbmcgR01QIEMgdHlwZXMsIGluc3RlYWQgYSByZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgQwpvYmplY3QgY2FuIGJlIG9idGFpbmVkIHdpdGggdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMsCgogLS0gRnVuY3Rpb246IG1wel90IG1wel9jbGFzczo6Z2V0X21wel90ICgpCiAtLSBGdW5jdGlvbjogbXBxX3QgbXBxX2NsYXNzOjpnZXRfbXBxX3QgKCkKIC0tIEZ1bmN0aW9uOiBtcGZfdCBtcGZfY2xhc3M6OmdldF9tcGZfdCAoKQoKICAgVGhlc2UgY2FuIGJlIHVzZWQgdG8gY2FsbCBhIEMgZnVuY3Rpb24gd2hpY2ggZG9lc24ndCBoYXZlIGEgQysrIGNsYXNzCmludGVyZmFjZS4gIEZvciBleGFtcGxlIHRvIHNldCBgYScgdG8gdGhlIEdDRCBvZiBgYicgYW5kIGBjJywKCiAgICAgbXB6X2NsYXNzIGEsIGIsIGM7CiAgICAgLi4uCiAgICAgbXB6X2djZCAoYS5nZXRfbXB6X3QoKSwgYi5nZXRfbXB6X3QoKSwgYy5nZXRfbXB6X3QoKSk7CgogICBJbiB0aGUgb3RoZXIgZGlyZWN0aW9uLCBhIGNsYXNzIGNhbiBiZSBpbml0aWFsaXplZCBmcm9tIHRoZQpjb3JyZXNwb25kaW5nIEdNUCBDIHR5cGUsIG9yIGFzc2lnbmVkIHRvIGlmIGFuIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGlzCnVzZWQuICBJbiBib3RoIGNhc2VzIHRoaXMgbWFrZXMgYSBjb3B5IG9mIHRoZSB2YWx1ZSwgaXQgZG9lc24ndCBjcmVhdGUKYW55IHNvcnQgb2YgYXNzb2NpYXRpb24uICBGb3IgZXhhbXBsZSwKCiAgICAgbXB6X3QgejsKICAgICAvLyAuLi4gaW5pdCBhbmQgY2FsY3VsYXRlIHogLi4uCiAgICAgbXB6X2NsYXNzIHgoeik7CiAgICAgbXB6X2NsYXNzIHk7CiAgICAgeSA9IG1wel9jbGFzcyAoeik7CgogICBUaGVyZSBhcmUgbm8gbmFtZXNwYWNlIHNldHVwcyBpbiBgZ21weHguaCcsIGFsbCB0eXBlcyBhbmQgZnVuY3Rpb25zCmFyZSBzaW1wbHkgcHV0IGludG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICBUaGlzIGlzIHdoYXQgYGdtcC5oJyBoYXMKZG9uZSBpbiB0aGUgcGFzdCwgYW5kIGNvbnRpbnVlcyB0byBkbyBmb3IgY29tcGF0aWJpbGl0eS4gIFRoZSBleHRyYXMKcHJvdmlkZWQgYnkgYGdtcHh4LmgnIGZvbGxvdyBHTVAgbmFtaW5nIGNvbnZlbnRpb25zIGFuZCBhcmUgdW5saWtlbHkgdG8KY2xhc2ggd2l0aCBhbnl0aGluZy4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBDKysgSW50ZXJmYWNlIEludGVnZXJzLCAgTmV4dDogQysrIEludGVyZmFjZSBSYXRpb25hbHMsICBQcmV2OiBDKysgSW50ZXJmYWNlIEdlbmVyYWwsICBVcDogQysrIENsYXNzIEludGVyZmFjZQoKMTIuMiBDKysgSW50ZXJmYWNlIEludGVnZXJzCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKIC0tIEZ1bmN0aW9uOiAgbXB6X2NsYXNzOjptcHpfY2xhc3MgKHR5cGUgTikKICAgICBDb25zdHJ1Y3QgYW4gYG1wel9jbGFzcycuICBBbGwgdGhlIHN0YW5kYXJkIEMrKyB0eXBlcyBtYXkgYmUgdXNlZCwKICAgICBleGNlcHQgYGxvbmcgbG9uZycgYW5kIGBsb25nIGRvdWJsZScsIGFuZCBhbGwgdGhlIEdNUCBDKysgY2xhc3NlcwogICAgIGNhbiBiZSB1c2VkLCBhbHRob3VnaCBjb252ZXJzaW9ucyBmcm9tIGBtcHFfY2xhc3MnIGFuZCBgbXBmX2NsYXNzJwogICAgIGFyZSBgZXhwbGljaXQnLiAgQW55IG5lY2Vzc2FyeSBjb252ZXJzaW9uIGZvbGxvd3MgdGhlCiAgICAgY29ycmVzcG9uZGluZyBDIGZ1bmN0aW9uLCBmb3IgZXhhbXBsZSBgZG91YmxlJyBmb2xsb3dzIGBtcHpfc2V0X2QnCiAgICAgKCpub3RlIEFzc2lnbmluZyBJbnRlZ2Vyczo6KS4KCiAtLSBGdW5jdGlvbjogZXhwbGljaXQgbXB6X2NsYXNzOjptcHpfY2xhc3MgKGNvbnN0IG1wel90IFopCiAgICAgQ29uc3RydWN0IGFuIGBtcHpfY2xhc3MnIGZyb20gYW4gYG1wel90Jy4gIFRoZSB2YWx1ZSBpbiBaIGlzCiAgICAgY29waWVkIGludG8gdGhlIG5ldyBgbXB6X2NsYXNzJywgdGhlcmUgd29uJ3QgYmUgYW55IHBlcm1hbmVudAogICAgIGFzc29jaWF0aW9uIGJldHdlZW4gaXQgYW5kIFouCgogLS0gRnVuY3Rpb246IGV4cGxpY2l0IG1wel9jbGFzczo6bXB6X2NsYXNzIChjb25zdCBjaGFyICpTLCBpbnQgQkFTRSA9CiAgICAgICAgICAwKQogLS0gRnVuY3Rpb246IGV4cGxpY2l0IG1wel9jbGFzczo6bXB6X2NsYXNzIChjb25zdCBzdHJpbmcmIFMsIGludCBCQVNFCiAgICAgICAgICA9IDApCiAgICAgQ29uc3RydWN0IGFuIGBtcHpfY2xhc3MnIGNvbnZlcnRlZCBmcm9tIGEgc3RyaW5nIHVzaW5nCiAgICAgYG1wel9zZXRfc3RyJyAoKm5vdGUgQXNzaWduaW5nIEludGVnZXJzOjopLgoKICAgICBJZiB0aGUgc3RyaW5nIGlzIG5vdCBhIHZhbGlkIGludGVnZXIsIGFuIGBzdGQ6OmludmFsaWRfYXJndW1lbnQnCiAgICAgZXhjZXB0aW9uIGlzIHRocm93bi4gIFRoZSBzYW1lIGFwcGxpZXMgdG8gYG9wZXJhdG9yPScuCgogLS0gRnVuY3Rpb246IG1wel9jbGFzcyBvcGVyYXRvciIiIF9tcHogKGNvbnN0IGNoYXIgKlNUUikKICAgICBXaXRoIEMrKzExIGNvbXBpbGVycywgaW50ZWdlcnMgY2FuIGJlIGNvbnN0cnVjdGVkIHdpdGggdGhlIHN5bnRheAogICAgIGAxMjNfbXB6JyB3aGljaCBpcyBlcXVpdmFsZW50IHRvIGBtcHpfY2xhc3MoIjEyMyIpJy4KCiAtLSBGdW5jdGlvbjogbXB6X2NsYXNzIG9wZXJhdG9yLyAobXB6X2NsYXNzIEEsIG1wel9jbGFzcyBEKQogLS0gRnVuY3Rpb246IG1wel9jbGFzcyBvcGVyYXRvciUgKG1wel9jbGFzcyBBLCBtcHpfY2xhc3MgRCkKICAgICBEaXZpc2lvbnMgaW52b2x2aW5nIGBtcHpfY2xhc3MnIHJvdW5kIHRvd2FyZHMgemVybywgYXMgcGVyIHRoZQogICAgIGBtcHpfdGRpdl9xJyBhbmQgYG1wel90ZGl2X3InIGZ1bmN0aW9ucyAoKm5vdGUgSW50ZWdlciBEaXZpc2lvbjo6KS4KICAgICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBDOTkgYC8nIGFuZCBgJScgb3BlcmF0b3JzLgoKICAgICBUaGUgYG1wel9mZGl2Li4uJyBvciBgbXB6X2NkaXYuLi4nIGZ1bmN0aW9ucyBjYW4gYWx3YXlzIGJlIGNhbGxlZAogICAgIGRpcmVjdGx5IGlmIGRlc2lyZWQuICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICBtcHpfY2xhc3MgcSwgYSwgZDsKICAgICAgICAgIC4uLgogICAgICAgICAgbXB6X2ZkaXZfcSAocS5nZXRfbXB6X3QoKSwgYS5nZXRfbXB6X3QoKSwgZC5nZXRfbXB6X3QoKSk7CgogLS0gRnVuY3Rpb246IG1wel9jbGFzcyBhYnMgKG1wel9jbGFzcyBPUCkKIC0tIEZ1bmN0aW9uOiBpbnQgY21wIChtcHpfY2xhc3MgT1AxLCB0eXBlIE9QMikKIC0tIEZ1bmN0aW9uOiBpbnQgY21wICh0eXBlIE9QMSwgbXB6X2NsYXNzIE9QMikKIC0tIEZ1bmN0aW9uOiBib29sIG1wel9jbGFzczo6Zml0c19zaW50X3AgKHZvaWQpCiAtLSBGdW5jdGlvbjogYm9vbCBtcHpfY2xhc3M6OmZpdHNfc2xvbmdfcCAodm9pZCkKIC0tIEZ1bmN0aW9uOiBib29sIG1wel9jbGFzczo6Zml0c19zc2hvcnRfcCAodm9pZCkKIC0tIEZ1bmN0aW9uOiBib29sIG1wel9jbGFzczo6Zml0c191aW50X3AgKHZvaWQpCiAtLSBGdW5jdGlvbjogYm9vbCBtcHpfY2xhc3M6OmZpdHNfdWxvbmdfcCAodm9pZCkKIC0tIEZ1bmN0aW9uOiBib29sIG1wel9jbGFzczo6Zml0c191c2hvcnRfcCAodm9pZCkKIC0tIEZ1bmN0aW9uOiBkb3VibGUgbXB6X2NsYXNzOjpnZXRfZCAodm9pZCkKIC0tIEZ1bmN0aW9uOiBsb25nIG1wel9jbGFzczo6Z2V0X3NpICh2b2lkKQogLS0gRnVuY3Rpb246IHN0cmluZyBtcHpfY2xhc3M6OmdldF9zdHIgKGludCBCQVNFID0gMTApCiAtLSBGdW5jdGlvbjogdW5zaWduZWQgbG9uZyBtcHpfY2xhc3M6OmdldF91aSAodm9pZCkKIC0tIEZ1bmN0aW9uOiBpbnQgbXB6X2NsYXNzOjpzZXRfc3RyIChjb25zdCBjaGFyICpTVFIsIGludCBCQVNFKQogLS0gRnVuY3Rpb246IGludCBtcHpfY2xhc3M6OnNldF9zdHIgKGNvbnN0IHN0cmluZyYgU1RSLCBpbnQgQkFTRSkKIC0tIEZ1bmN0aW9uOiBpbnQgc2duIChtcHpfY2xhc3MgT1ApCiAtLSBGdW5jdGlvbjogbXB6X2NsYXNzIHNxcnQgKG1wel9jbGFzcyBPUCkKIC0tIEZ1bmN0aW9uOiB2b2lkIG1wel9jbGFzczo6c3dhcCAobXB6X2NsYXNzJiBPUCkKIC0tIEZ1bmN0aW9uOiB2b2lkIHN3YXAgKG1wel9jbGFzcyYgT1AxLCBtcHpfY2xhc3MmIE9QMikKICAgICBUaGVzZSBmdW5jdGlvbnMgcHJvdmlkZSBhIEMrKyBjbGFzcyBpbnRlcmZhY2UgdG8gdGhlIGNvcnJlc3BvbmRpbmcKICAgICBHTVAgQyByb3V0aW5lcy4KCiAgICAgYGNtcCcgY2FuIGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIGNsYXNzZXMgb3IgdGhlIHN0YW5kYXJkIEMrKwogICAgIHR5cGVzLCBleGNlcHQgYGxvbmcgbG9uZycgYW5kIGBsb25nIGRvdWJsZScuCgoKICAgT3ZlcmxvYWRlZCBvcGVyYXRvcnMgZm9yIGNvbWJpbmF0aW9ucyBvZiBgbXB6X2NsYXNzJyBhbmQgYGRvdWJsZScKYXJlIHByb3ZpZGVkIGZvciBjb21wbGV0ZW5lc3MsIGJ1dCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBpZiB0aGUgZ2l2ZW4KYGRvdWJsZScgaXMgbm90IGFuIGludGVnZXIgdGhlbiB0aGUgd2F5IGFueSByb3VuZGluZyBpcyBkb25lIGlzCmN1cnJlbnRseSB1bnNwZWNpZmllZC4gIFRoZSByb3VuZGluZyBtaWdodCB0YWtlIHBsYWNlIGF0IHRoZSBzdGFydCwgaW4KdGhlIG1pZGRsZSwgb3IgYXQgdGhlIGVuZCBvZiB0aGUgb3BlcmF0aW9uLCBhbmQgaXQgbWlnaHQgY2hhbmdlIGluIHRoZQpmdXR1cmUuCgogICBDb252ZXJzaW9ucyBiZXR3ZWVuIGBtcHpfY2xhc3MnIGFuZCBgZG91YmxlJywgaG93ZXZlciwgYXJlIGRlZmluZWQKdG8gZm9sbG93IHRoZSBjb3JyZXNwb25kaW5nIEMgZnVuY3Rpb25zIGBtcHpfZ2V0X2QnIGFuZCBgbXB6X3NldF9kJy4KQW5kIGNvbXBhcmlzb25zIGFyZSBhbHdheXMgbWFkZSBleGFjdGx5LCBhcyBwZXIgYG1wel9jbXBfZCcuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogQysrIEludGVyZmFjZSBSYXRpb25hbHMsICBOZXh0OiBDKysgSW50ZXJmYWNlIEZsb2F0cywgIFByZXY6IEMrKyBJbnRlcmZhY2UgSW50ZWdlcnMsICBVcDogQysrIENsYXNzIEludGVyZmFjZQoKMTIuMyBDKysgSW50ZXJmYWNlIFJhdGlvbmFscwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpJbiBhbGwgdGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RvcnMsIGlmIGEgZnJhY3Rpb24gaXMgZ2l2ZW4gdGhlbiBpdApzaG91bGQgYmUgaW4gY2Fub25pY2FsIGZvcm0sIG9yIGlmIG5vdCB0aGVuIGBtcHFfY2xhc3M6OmNhbm9uaWNhbGl6ZScKY2FsbGVkLgoKIC0tIEZ1bmN0aW9uOiAgbXBxX2NsYXNzOjptcHFfY2xhc3MgKHR5cGUgT1ApCiAtLSBGdW5jdGlvbjogIG1wcV9jbGFzczo6bXBxX2NsYXNzIChpbnRlZ2VyIE5VTSwgaW50ZWdlciBERU4pCiAgICAgQ29uc3RydWN0IGFuIGBtcHFfY2xhc3MnLiAgVGhlIGluaXRpYWwgdmFsdWUgY2FuIGJlIGEgc2luZ2xlIHZhbHVlCiAgICAgb2YgYW55IHR5cGUgKGNvbnZlcnNpb24gZnJvbSBgbXBmX2NsYXNzJyBpcyBgZXhwbGljaXQnKSwgb3IgYSBwYWlyCiAgICAgb2YgaW50ZWdlcnMgKGBtcHpfY2xhc3MnIG9yIHN0YW5kYXJkIEMrKyBpbnRlZ2VyIHR5cGVzKQogICAgIHJlcHJlc2VudGluZyBhIGZyYWN0aW9uLCBleGNlcHQgdGhhdCBgbG9uZyBsb25nJyBhbmQgYGxvbmcgZG91YmxlJwogICAgIGFyZSBub3Qgc3VwcG9ydGVkLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgbXBxX2NsYXNzIHEgKDk5KTsKICAgICAgICAgIG1wcV9jbGFzcyBxICgxLjc1KTsKICAgICAgICAgIG1wcV9jbGFzcyBxICgxLCAzKTsKCiAtLSBGdW5jdGlvbjogZXhwbGljaXQgbXBxX2NsYXNzOjptcHFfY2xhc3MgKGNvbnN0IG1wcV90IFEpCiAgICAgQ29uc3RydWN0IGFuIGBtcHFfY2xhc3MnIGZyb20gYW4gYG1wcV90Jy4gIFRoZSB2YWx1ZSBpbiBRIGlzCiAgICAgY29waWVkIGludG8gdGhlIG5ldyBgbXBxX2NsYXNzJywgdGhlcmUgd29uJ3QgYmUgYW55IHBlcm1hbmVudAogICAgIGFzc29jaWF0aW9uIGJldHdlZW4gaXQgYW5kIFEuCgogLS0gRnVuY3Rpb246IGV4cGxpY2l0IG1wcV9jbGFzczo6bXBxX2NsYXNzIChjb25zdCBjaGFyICpTLCBpbnQgQkFTRSA9CiAgICAgICAgICAwKQogLS0gRnVuY3Rpb246IGV4cGxpY2l0IG1wcV9jbGFzczo6bXBxX2NsYXNzIChjb25zdCBzdHJpbmcmIFMsIGludCBCQVNFCiAgICAgICAgICA9IDApCiAgICAgQ29uc3RydWN0IGFuIGBtcHFfY2xhc3MnIGNvbnZlcnRlZCBmcm9tIGEgc3RyaW5nIHVzaW5nCiAgICAgYG1wcV9zZXRfc3RyJyAoKm5vdGUgSW5pdGlhbGl6aW5nIFJhdGlvbmFsczo6KS4KCiAgICAgSWYgdGhlIHN0cmluZyBpcyBub3QgYSB2YWxpZCByYXRpb25hbCwgYW4gYHN0ZDo6aW52YWxpZF9hcmd1bWVudCcKICAgICBleGNlcHRpb24gaXMgdGhyb3duLiAgVGhlIHNhbWUgYXBwbGllcyB0byBgb3BlcmF0b3I9Jy4KCiAtLSBGdW5jdGlvbjogbXBxX2NsYXNzIG9wZXJhdG9yIiIgX21wcSAoY29uc3QgY2hhciAqU1RSKQogICAgIFdpdGggQysrMTEgY29tcGlsZXJzLCBpbnRlZ3JhbCByYXRpb25hbHMgY2FuIGJlIGNvbnN0cnVjdGVkIHdpdGgKICAgICB0aGUgc3ludGF4IGAxMjNfbXBxJyB3aGljaCBpcyBlcXVpdmFsZW50IHRvIGBtcHFfY2xhc3MoMTIzX21weiknLgogICAgIE90aGVyIHJhdGlvbmFscyBjYW4gYmUgYnVpbHQgYXMgYC0xX21wcS8yJyBvciBgMHhiX21wcS8xMjM0NTZfbXB6Jy4KCiAtLSBGdW5jdGlvbjogdm9pZCBtcHFfY2xhc3M6OmNhbm9uaWNhbGl6ZSAoKQogICAgIFB1dCBhbiBgbXBxX2NsYXNzJyBpbnRvIGNhbm9uaWNhbCBmb3JtLCBhcyBwZXIgKm5vdGUgUmF0aW9uYWwKICAgICBOdW1iZXIgRnVuY3Rpb25zOjouICBBbGwgYXJpdGhtZXRpYyBvcGVyYXRvcnMgcmVxdWlyZSB0aGVpcgogICAgIG9wZXJhbmRzIGluIGNhbm9uaWNhbCBmb3JtLCBhbmQgd2lsbCByZXR1cm4gcmVzdWx0cyBpbiBjYW5vbmljYWwKICAgICBmb3JtLgoKIC0tIEZ1bmN0aW9uOiBtcHFfY2xhc3MgYWJzIChtcHFfY2xhc3MgT1ApCiAtLSBGdW5jdGlvbjogaW50IGNtcCAobXBxX2NsYXNzIE9QMSwgdHlwZSBPUDIpCiAtLSBGdW5jdGlvbjogaW50IGNtcCAodHlwZSBPUDEsIG1wcV9jbGFzcyBPUDIpCiAtLSBGdW5jdGlvbjogZG91YmxlIG1wcV9jbGFzczo6Z2V0X2QgKHZvaWQpCiAtLSBGdW5jdGlvbjogc3RyaW5nIG1wcV9jbGFzczo6Z2V0X3N0ciAoaW50IEJBU0UgPSAxMCkKIC0tIEZ1bmN0aW9uOiBpbnQgbXBxX2NsYXNzOjpzZXRfc3RyIChjb25zdCBjaGFyICpTVFIsIGludCBCQVNFKQogLS0gRnVuY3Rpb246IGludCBtcHFfY2xhc3M6OnNldF9zdHIgKGNvbnN0IHN0cmluZyYgU1RSLCBpbnQgQkFTRSkKIC0tIEZ1bmN0aW9uOiBpbnQgc2duIChtcHFfY2xhc3MgT1ApCiAtLSBGdW5jdGlvbjogdm9pZCBtcHFfY2xhc3M6OnN3YXAgKG1wcV9jbGFzcyYgT1ApCiAtLSBGdW5jdGlvbjogdm9pZCBzd2FwIChtcHFfY2xhc3MmIE9QMSwgbXBxX2NsYXNzJiBPUDIpCiAgICAgVGhlc2UgZnVuY3Rpb25zIHByb3ZpZGUgYSBDKysgY2xhc3MgaW50ZXJmYWNlIHRvIHRoZSBjb3JyZXNwb25kaW5nCiAgICAgR01QIEMgcm91dGluZXMuCgogICAgIGBjbXAnIGNhbiBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBjbGFzc2VzIG9yIHRoZSBzdGFuZGFyZCBDKysKICAgICB0eXBlcywgZXhjZXB0IGBsb25nIGxvbmcnIGFuZCBgbG9uZyBkb3VibGUnLgoKIC0tIEZ1bmN0aW9uOiBtcHpfY2xhc3MmIG1wcV9jbGFzczo6Z2V0X251bSAoKQogLS0gRnVuY3Rpb246IG1wel9jbGFzcyYgbXBxX2NsYXNzOjpnZXRfZGVuICgpCiAgICAgR2V0IGEgcmVmZXJlbmNlIHRvIGFuIGBtcHpfY2xhc3MnIHdoaWNoIGlzIHRoZSBudW1lcmF0b3Igb3IKICAgICBkZW5vbWluYXRvciBvZiBhbiBgbXBxX2NsYXNzJy4gIFRoaXMgY2FuIGJlIHVzZWQgYm90aCBmb3IgcmVhZCBhbmQKICAgICB3cml0ZSBhY2Nlc3MuICBJZiB0aGUgb2JqZWN0IHJldHVybmVkIGlzIG1vZGlmaWVkLCBpdCBtb2RpZmllcyB0aGUKICAgICBvcmlnaW5hbCBgbXBxX2NsYXNzJy4KCiAgICAgSWYgZGlyZWN0IG1hbmlwdWxhdGlvbiBtaWdodCBwcm9kdWNlIGEgbm9uLWNhbm9uaWNhbCB2YWx1ZSwgdGhlbgogICAgIGBtcHFfY2xhc3M6OmNhbm9uaWNhbGl6ZScgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGZ1cnRoZXIgb3BlcmF0aW9ucy4KCiAtLSBGdW5jdGlvbjogbXB6X3QgbXBxX2NsYXNzOjpnZXRfbnVtX21wel90ICgpCiAtLSBGdW5jdGlvbjogbXB6X3QgbXBxX2NsYXNzOjpnZXRfZGVuX21wel90ICgpCiAgICAgR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIGBtcHpfdCcgbnVtZXJhdG9yIG9yIGRlbm9taW5hdG9yCiAgICAgb2YgYW4gYG1wcV9jbGFzcycuICBUaGlzIGNhbiBiZSBwYXNzZWQgdG8gQyBmdW5jdGlvbnMgZXhwZWN0aW5nIGFuCiAgICAgYG1wel90Jy4gIEFueSBtb2RpZmljYXRpb25zIG1hZGUgdG8gdGhlIGBtcHpfdCcgd2lsbCBtb2RpZnkgdGhlCiAgICAgb3JpZ2luYWwgYG1wcV9jbGFzcycuCgogICAgIElmIGRpcmVjdCBtYW5pcHVsYXRpb24gbWlnaHQgcHJvZHVjZSBhIG5vbi1jYW5vbmljYWwgdmFsdWUsIHRoZW4KICAgICBgbXBxX2NsYXNzOjpjYW5vbmljYWxpemUnIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBmdXJ0aGVyIG9wZXJhdGlvbnMuCgogLS0gRnVuY3Rpb246IGlzdHJlYW0mIG9wZXJhdG9yPj4gKGlzdHJlYW0mIFNUUkVBTSwgbXBxX2NsYXNzJiBST1ApOwogICAgIFJlYWQgUk9QIGZyb20gU1RSRUFNLCB1c2luZyBpdHMgYGlvcycgZm9ybWF0dGluZyBzZXR0aW5ncywgdGhlCiAgICAgc2FtZSBhcyBgbXBxX3Qgb3BlcmF0b3I+PicgKCpub3RlIEMrKyBGb3JtYXR0ZWQgSW5wdXQ6OikuCgogICAgIElmIHRoZSBST1AgcmVhZCBtaWdodCBub3QgYmUgaW4gY2Fub25pY2FsIGZvcm0gdGhlbgogICAgIGBtcHFfY2xhc3M6OmNhbm9uaWNhbGl6ZScgbXVzdCBiZSBjYWxsZWQuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogQysrIEludGVyZmFjZSBGbG9hdHMsICBOZXh0OiBDKysgSW50ZXJmYWNlIFJhbmRvbSBOdW1iZXJzLCAgUHJldjogQysrIEludGVyZmFjZSBSYXRpb25hbHMsICBVcDogQysrIENsYXNzIEludGVyZmFjZQoKMTIuNCBDKysgSW50ZXJmYWNlIEZsb2F0cwo9PT09PT09PT09PT09PT09PT09PT09PT09CgpXaGVuIGFuIGV4cHJlc3Npb24gcmVxdWlyZXMgdGhlIHVzZSBvZiB0ZW1wb3JhcnkgaW50ZXJtZWRpYXRlCmBtcGZfY2xhc3MnIHZhbHVlcywgbGlrZSBgZj1nKmgreCp5JywgdGhvc2UgdGVtcG9yYXJpZXMgd2lsbCBoYXZlIHRoZQpzYW1lIHByZWNpc2lvbiBhcyB0aGUgZGVzdGluYXRpb24gYGYnLiAgRXhwbGljaXQgY29uc3RydWN0b3JzIGNhbiBiZQp1c2VkIGlmIHRoaXMgZG9lc24ndCBzdWl0LgoKIC0tIEZ1bmN0aW9uOiAgbXBmX2NsYXNzOjptcGZfY2xhc3MgKHR5cGUgT1ApCiAtLSBGdW5jdGlvbjogIG1wZl9jbGFzczo6bXBmX2NsYXNzICh0eXBlIE9QLCBtcF9iaXRjbnRfdCBQUkVDKQogICAgIENvbnN0cnVjdCBhbiBgbXBmX2NsYXNzJy4gIEFueSBzdGFuZGFyZCBDKysgdHlwZSBjYW4gYmUgdXNlZCwKICAgICBleGNlcHQgYGxvbmcgbG9uZycgYW5kIGBsb25nIGRvdWJsZScsIGFuZCBhbnkgb2YgdGhlIEdNUCBDKysKICAgICBjbGFzc2VzIGNhbiBiZSB1c2VkLgoKICAgICBJZiBQUkVDIGlzIGdpdmVuLCB0aGUgaW5pdGlhbCBwcmVjaXNpb24gaXMgdGhhdCB2YWx1ZSwgaW4gYml0cy4gIElmCiAgICAgUFJFQyBpcyBub3QgZ2l2ZW4sIHRoZW4gdGhlIGluaXRpYWwgcHJlY2lzaW9uIGlzIGRldGVybWluZWQgYnkgdGhlCiAgICAgdHlwZSBvZiBPUCBnaXZlbi4gIEFuIGBtcHpfY2xhc3MnLCBgbXBxX2NsYXNzJywgb3IgQysrIGJ1aWx0aW4KICAgICB0eXBlIHdpbGwgZ2l2ZSB0aGUgZGVmYXVsdCBgbXBmJyBwcmVjaXNpb24gKCpub3RlIEluaXRpYWxpemluZwogICAgIEZsb2F0czo6KS4gIEFuIGBtcGZfY2xhc3MnIG9yIGV4cHJlc3Npb24gd2lsbCBnaXZlIHRoZSBwcmVjaXNpb24KICAgICBvZiB0aGF0IHZhbHVlLiAgVGhlIHByZWNpc2lvbiBvZiBhIGJpbmFyeSBleHByZXNzaW9uIGlzIHRoZSBoaWdoZXIKICAgICBvZiB0aGUgdHdvIG9wZXJhbmRzLgoKICAgICAgICAgIG1wZl9jbGFzcyBmKDEuNSk7ICAgICAgICAvLyBkZWZhdWx0IHByZWNpc2lvbgogICAgICAgICAgbXBmX2NsYXNzIGYoMS41LCA1MDApOyAgIC8vIDUwMCBiaXRzIChhdCBsZWFzdCkKICAgICAgICAgIG1wZl9jbGFzcyBmKHgpOyAgICAgICAgICAvLyBwcmVjaXNpb24gb2YgeAogICAgICAgICAgbXBmX2NsYXNzIGYoYWJzKHgpKTsgICAgIC8vIHByZWNpc2lvbiBvZiB4CiAgICAgICAgICBtcGZfY2xhc3MgZigtZywgMTAwMCk7ICAgLy8gMTAwMCBiaXRzIChhdCBsZWFzdCkKICAgICAgICAgIG1wZl9jbGFzcyBmKHgreSk7ICAgICAgICAvLyBncmVhdGVyIG9mIHByZWNpc2lvbnMgb2YgeCBhbmQgeQoKIC0tIEZ1bmN0aW9uOiBleHBsaWNpdCBtcGZfY2xhc3M6Om1wZl9jbGFzcyAoY29uc3QgbXBmX3QgRikKIC0tIEZ1bmN0aW9uOiAgbXBmX2NsYXNzOjptcGZfY2xhc3MgKGNvbnN0IG1wZl90IEYsIG1wX2JpdGNudF90IFBSRUMpCiAgICAgQ29uc3RydWN0IGFuIGBtcGZfY2xhc3MnIGZyb20gYW4gYG1wZl90Jy4gIFRoZSB2YWx1ZSBpbiBGIGlzCiAgICAgY29waWVkIGludG8gdGhlIG5ldyBgbXBmX2NsYXNzJywgdGhlcmUgd29uJ3QgYmUgYW55IHBlcm1hbmVudAogICAgIGFzc29jaWF0aW9uIGJldHdlZW4gaXQgYW5kIEYuCgogICAgIElmIFBSRUMgaXMgZ2l2ZW4sIHRoZSBpbml0aWFsIHByZWNpc2lvbiBpcyB0aGF0IHZhbHVlLCBpbiBiaXRzLiAgSWYKICAgICBQUkVDIGlzIG5vdCBnaXZlbiwgdGhlbiB0aGUgaW5pdGlhbCBwcmVjaXNpb24gaXMgdGhhdCBvZiBGLgoKIC0tIEZ1bmN0aW9uOiBleHBsaWNpdCBtcGZfY2xhc3M6Om1wZl9jbGFzcyAoY29uc3QgY2hhciAqUykKIC0tIEZ1bmN0aW9uOiAgbXBmX2NsYXNzOjptcGZfY2xhc3MgKGNvbnN0IGNoYXIgKlMsIG1wX2JpdGNudF90IFBSRUMsCiAgICAgICAgICBpbnQgQkFTRSA9IDApCiAtLSBGdW5jdGlvbjogZXhwbGljaXQgbXBmX2NsYXNzOjptcGZfY2xhc3MgKGNvbnN0IHN0cmluZyYgUykKIC0tIEZ1bmN0aW9uOiAgbXBmX2NsYXNzOjptcGZfY2xhc3MgKGNvbnN0IHN0cmluZyYgUywgbXBfYml0Y250X3QgUFJFQywKICAgICAgICAgIGludCBCQVNFID0gMCkKICAgICBDb25zdHJ1Y3QgYW4gYG1wZl9jbGFzcycgY29udmVydGVkIGZyb20gYSBzdHJpbmcgdXNpbmcKICAgICBgbXBmX3NldF9zdHInICgqbm90ZSBBc3NpZ25pbmcgRmxvYXRzOjopLiAgSWYgUFJFQyBpcyBnaXZlbiwgdGhlCiAgICAgaW5pdGlhbCBwcmVjaXNpb24gaXMgdGhhdCB2YWx1ZSwgaW4gYml0cy4gIElmIG5vdCwgdGhlIGRlZmF1bHQKICAgICBgbXBmJyBwcmVjaXNpb24gKCpub3RlIEluaXRpYWxpemluZyBGbG9hdHM6OikgaXMgdXNlZC4KCiAgICAgSWYgdGhlIHN0cmluZyBpcyBub3QgYSB2YWxpZCBmbG9hdCwgYW4gYHN0ZDo6aW52YWxpZF9hcmd1bWVudCcKICAgICBleGNlcHRpb24gaXMgdGhyb3duLiAgVGhlIHNhbWUgYXBwbGllcyB0byBgb3BlcmF0b3I9Jy4KCiAtLSBGdW5jdGlvbjogbXBmX2NsYXNzIG9wZXJhdG9yIiIgX21wZiAoY29uc3QgY2hhciAqU1RSKQogICAgIFdpdGggQysrMTEgY29tcGlsZXJzLCBmbG9hdHMgY2FuIGJlIGNvbnN0cnVjdGVkIHdpdGggdGhlIHN5bnRheAogICAgIGAxLjIzZS0xX21wZicgd2hpY2ggaXMgZXF1aXZhbGVudCB0byBgbXBmX2NsYXNzKCIxLjIzZS0xIiknLgoKIC0tIEZ1bmN0aW9uOiBtcGZfY2xhc3MmIG1wZl9jbGFzczo6b3BlcmF0b3I9ICh0eXBlIE9QKQogICAgIENvbnZlcnQgYW5kIHN0b3JlIHRoZSBnaXZlbiBPUCB2YWx1ZSB0byBhbiBgbXBmX2NsYXNzJyBvYmplY3QuICBUaGUKICAgICBzYW1lIHR5cGVzIGFyZSBhY2NlcHRlZCBhcyBmb3IgdGhlIGNvbnN0cnVjdG9ycyBhYm92ZS4KCiAgICAgTm90ZSB0aGF0IGBvcGVyYXRvcj0nIG9ubHkgc3RvcmVzIGEgbmV3IHZhbHVlLCBpdCBkb2Vzbid0IGNvcHkgb3IKICAgICBjaGFuZ2UgdGhlIHByZWNpc2lvbiBvZiB0aGUgZGVzdGluYXRpb24sIGluc3RlYWQgdGhlIHZhbHVlIGlzCiAgICAgdHJ1bmNhdGVkIGlmIG5lY2Vzc2FyeS4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgYG1wZl9zZXQnIGV0Yy4gIE5vdGUKICAgICBpbiBwYXJ0aWN1bGFyIHRoaXMgbWVhbnMgZm9yIGBtcGZfY2xhc3MnIGEgY29weSBjb25zdHJ1Y3RvciBpcyBub3QKICAgICB0aGUgc2FtZSBhcyBhIGRlZmF1bHQgY29uc3RydWN0b3IgcGx1cyBhc3NpZ25tZW50LgoKICAgICAgICAgIG1wZl9jbGFzcyB4ICh5KTsgICAvLyB4IGNyZWF0ZWQgd2l0aCBwcmVjaXNpb24gb2YgeQoKICAgICAgICAgIG1wZl9jbGFzcyB4OyAgICAgICAvLyB4IGNyZWF0ZWQgd2l0aCBkZWZhdWx0IHByZWNpc2lvbgogICAgICAgICAgeCA9IHk7ICAgICAgICAgICAgIC8vIHZhbHVlIHRydW5jYXRlZCB0byB0aGF0IHByZWNpc2lvbgoKICAgICBBcHBsaWNhdGlvbnMgdXNpbmcgdGVtcGxhdGVkIGNvZGUgbWF5IG5lZWQgdG8gYmUgY2FyZWZ1bCBhYm91dCB0aGUKICAgICBhc3N1bXB0aW9ucyB0aGUgY29kZSBtYWtlcyBpbiB0aGlzIGFyZWEsIHdoZW4gd29ya2luZyB3aXRoCiAgICAgYG1wZl9jbGFzcycgdmFsdWVzIG9mIHZhcmlvdXMgZGlmZmVyZW50IG9yIG5vbi1kZWZhdWx0IHByZWNpc2lvbnMuCiAgICAgRm9yIGluc3RhbmNlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgc3RhbmRhcmQgYGNvbXBsZXgnIHRlbXBsYXRlCiAgICAgaGF2ZSBiZWVuIHNlZW4gaW4gYm90aCBzdHlsZXMgYWJvdmUsIHRob3VnaCBvZiBjb3Vyc2UgYGNvbXBsZXgnIGlzCiAgICAgbm9ybWFsbHkgb25seSBhY3R1YWxseSBzcGVjaWZpZWQgZm9yIHVzZSB3aXRoIHRoZSBidWlsdGluIGZsb2F0CiAgICAgdHlwZXMuCgogLS0gRnVuY3Rpb246IG1wZl9jbGFzcyBhYnMgKG1wZl9jbGFzcyBPUCkKIC0tIEZ1bmN0aW9uOiBtcGZfY2xhc3MgY2VpbCAobXBmX2NsYXNzIE9QKQogLS0gRnVuY3Rpb246IGludCBjbXAgKG1wZl9jbGFzcyBPUDEsIHR5cGUgT1AyKQogLS0gRnVuY3Rpb246IGludCBjbXAgKHR5cGUgT1AxLCBtcGZfY2xhc3MgT1AyKQogLS0gRnVuY3Rpb246IGJvb2wgbXBmX2NsYXNzOjpmaXRzX3NpbnRfcCAodm9pZCkKIC0tIEZ1bmN0aW9uOiBib29sIG1wZl9jbGFzczo6Zml0c19zbG9uZ19wICh2b2lkKQogLS0gRnVuY3Rpb246IGJvb2wgbXBmX2NsYXNzOjpmaXRzX3NzaG9ydF9wICh2b2lkKQogLS0gRnVuY3Rpb246IGJvb2wgbXBmX2NsYXNzOjpmaXRzX3VpbnRfcCAodm9pZCkKIC0tIEZ1bmN0aW9uOiBib29sIG1wZl9jbGFzczo6Zml0c191bG9uZ19wICh2b2lkKQogLS0gRnVuY3Rpb246IGJvb2wgbXBmX2NsYXNzOjpmaXRzX3VzaG9ydF9wICh2b2lkKQogLS0gRnVuY3Rpb246IG1wZl9jbGFzcyBmbG9vciAobXBmX2NsYXNzIE9QKQogLS0gRnVuY3Rpb246IG1wZl9jbGFzcyBoeXBvdCAobXBmX2NsYXNzIE9QMSwgbXBmX2NsYXNzIE9QMikKIC0tIEZ1bmN0aW9uOiBkb3VibGUgbXBmX2NsYXNzOjpnZXRfZCAodm9pZCkKIC0tIEZ1bmN0aW9uOiBsb25nIG1wZl9jbGFzczo6Z2V0X3NpICh2b2lkKQogLS0gRnVuY3Rpb246IHN0cmluZyBtcGZfY2xhc3M6OmdldF9zdHIgKG1wX2V4cF90JiBFWFAsIGludCBCQVNFID0gMTAsCiAgICAgICAgICBzaXplX3QgRElHSVRTID0gMCkKIC0tIEZ1bmN0aW9uOiB1bnNpZ25lZCBsb25nIG1wZl9jbGFzczo6Z2V0X3VpICh2b2lkKQogLS0gRnVuY3Rpb246IGludCBtcGZfY2xhc3M6OnNldF9zdHIgKGNvbnN0IGNoYXIgKlNUUiwgaW50IEJBU0UpCiAtLSBGdW5jdGlvbjogaW50IG1wZl9jbGFzczo6c2V0X3N0ciAoY29uc3Qgc3RyaW5nJiBTVFIsIGludCBCQVNFKQogLS0gRnVuY3Rpb246IGludCBzZ24gKG1wZl9jbGFzcyBPUCkKIC0tIEZ1bmN0aW9uOiBtcGZfY2xhc3Mgc3FydCAobXBmX2NsYXNzIE9QKQogLS0gRnVuY3Rpb246IHZvaWQgbXBmX2NsYXNzOjpzd2FwIChtcGZfY2xhc3MmIE9QKQogLS0gRnVuY3Rpb246IHZvaWQgc3dhcCAobXBmX2NsYXNzJiBPUDEsIG1wZl9jbGFzcyYgT1AyKQogLS0gRnVuY3Rpb246IG1wZl9jbGFzcyB0cnVuYyAobXBmX2NsYXNzIE9QKQogICAgIFRoZXNlIGZ1bmN0aW9ucyBwcm92aWRlIGEgQysrIGNsYXNzIGludGVyZmFjZSB0byB0aGUgY29ycmVzcG9uZGluZwogICAgIEdNUCBDIHJvdXRpbmVzLgoKICAgICBgY21wJyBjYW4gYmUgdXNlZCB3aXRoIGFueSBvZiB0aGUgY2xhc3NlcyBvciB0aGUgc3RhbmRhcmQgQysrCiAgICAgdHlwZXMsIGV4Y2VwdCBgbG9uZyBsb25nJyBhbmQgYGxvbmcgZG91YmxlJy4KCiAgICAgVGhlIGFjY3VyYWN5IHByb3ZpZGVkIGJ5IGBoeXBvdCcgaXMgbm90IGN1cnJlbnRseSBndWFyYW50ZWVkLgoKIC0tIEZ1bmN0aW9uOiBtcF9iaXRjbnRfdCBtcGZfY2xhc3M6OmdldF9wcmVjICgpCiAtLSBGdW5jdGlvbjogdm9pZCBtcGZfY2xhc3M6OnNldF9wcmVjIChtcF9iaXRjbnRfdCBQUkVDKQogLS0gRnVuY3Rpb246IHZvaWQgbXBmX2NsYXNzOjpzZXRfcHJlY19yYXcgKG1wX2JpdGNudF90IFBSRUMpCiAgICAgR2V0IG9yIHNldCB0aGUgY3VycmVudCBwcmVjaXNpb24gb2YgYW4gYG1wZl9jbGFzcycuCgogICAgIFRoZSByZXN0cmljdGlvbnMgZGVzY3JpYmVkIGZvciBgbXBmX3NldF9wcmVjX3JhdycgKCpub3RlCiAgICAgSW5pdGlhbGl6aW5nIEZsb2F0czo6KSBhcHBseSB0byBgbXBmX2NsYXNzOjpzZXRfcHJlY19yYXcnLiAgTm90ZQogICAgIGluIHBhcnRpY3VsYXIgdGhhdCB0aGUgYG1wZl9jbGFzcycgbXVzdCBiZSByZXN0b3JlZCB0byBpdCdzCiAgICAgYWxsb2NhdGVkIHByZWNpc2lvbiBiZWZvcmUgYmVpbmcgZGVzdHJveWVkLiAgVGhpcyBtdXN0IGJlIGRvbmUgYnkKICAgICBhcHBsaWNhdGlvbiBjb2RlLCB0aGVyZSdzIG5vIGF1dG9tYXRpYyBtZWNoYW5pc20gZm9yIGl0LgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEMrKyBJbnRlcmZhY2UgUmFuZG9tIE51bWJlcnMsICBOZXh0OiBDKysgSW50ZXJmYWNlIExpbWl0YXRpb25zLCAgUHJldjogQysrIEludGVyZmFjZSBGbG9hdHMsICBVcDogQysrIENsYXNzIEludGVyZmFjZQoKMTIuNSBDKysgSW50ZXJmYWNlIFJhbmRvbSBOdW1iZXJzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKIC0tIENsYXNzOiBnbXBfcmFuZGNsYXNzCiAgICAgVGhlIEMrKyBjbGFzcyBpbnRlcmZhY2UgdG8gdGhlIEdNUCByYW5kb20gbnVtYmVyIGZ1bmN0aW9ucyB1c2VzCiAgICAgYGdtcF9yYW5kY2xhc3MnIHRvIGhvbGQgYW4gYWxnb3JpdGhtIHNlbGVjdGlvbiBhbmQgY3VycmVudCBzdGF0ZSwKICAgICBhcyBwZXIgYGdtcF9yYW5kc3RhdGVfdCcuCgogLS0gRnVuY3Rpb246ICBnbXBfcmFuZGNsYXNzOjpnbXBfcmFuZGNsYXNzICh2b2lkICgqUkFORElOSVQpCiAgICAgICAgICAoZ21wX3JhbmRzdGF0ZV90LCAuLi4pLCAuLi4pCiAgICAgQ29uc3RydWN0IGEgYGdtcF9yYW5kY2xhc3MnLCB1c2luZyBhIGNhbGwgdG8gdGhlIGdpdmVuIFJBTkRJTklUCiAgICAgZnVuY3Rpb24gKCpub3RlIFJhbmRvbSBTdGF0ZSBJbml0aWFsaXphdGlvbjo6KS4gIFRoZSBhcmd1bWVudHMKICAgICBleHBlY3RlZCBhcmUgdGhlIHNhbWUgYXMgUkFORElOSVQsIGJ1dCB3aXRoIGBtcHpfY2xhc3MnIGluc3RlYWQgb2YKICAgICBgbXB6X3QnLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgZ21wX3JhbmRjbGFzcyByMSAoZ21wX3JhbmRpbml0X2RlZmF1bHQpOwogICAgICAgICAgZ21wX3JhbmRjbGFzcyByMiAoZ21wX3JhbmRpbml0X2xjXzJleHBfc2l6ZSwgMzIpOwogICAgICAgICAgZ21wX3JhbmRjbGFzcyByMyAoZ21wX3JhbmRpbml0X2xjXzJleHAsIGEsIGMsIG0yZXhwKTsKICAgICAgICAgIGdtcF9yYW5kY2xhc3MgcjQgKGdtcF9yYW5kaW5pdF9tdCk7CgogICAgIGBnbXBfcmFuZGluaXRfbGNfMmV4cF9zaXplJyB3aWxsIGZhaWwgaWYgdGhlIHNpemUgcmVxdWVzdGVkIGlzIHRvbwogICAgIGJpZywgYW4gYHN0ZDo6bGVuZ3RoX2Vycm9yJyBleGNlcHRpb24gaXMgdGhyb3duIGluIHRoYXQgY2FzZS4KCiAtLSBGdW5jdGlvbjogIGdtcF9yYW5kY2xhc3M6OmdtcF9yYW5kY2xhc3MgKGdtcF9yYW5kYWxnX3QgQUxHLCAuLi4pCiAgICAgQ29uc3RydWN0IGEgYGdtcF9yYW5kY2xhc3MnIHVzaW5nIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMKICAgICBgZ21wX3JhbmRpbml0JyAoKm5vdGUgUmFuZG9tIFN0YXRlIEluaXRpYWxpemF0aW9uOjopLiAgVGhpcwogICAgIGZ1bmN0aW9uIGlzIG9ic29sZXRlIGFuZCB0aGUgYWJvdmUgUkFORElOSVQgc3R5bGUgc2hvdWxkIGJlCiAgICAgcHJlZmVycmVkLgoKIC0tIEZ1bmN0aW9uOiB2b2lkIGdtcF9yYW5kY2xhc3M6OnNlZWQgKHVuc2lnbmVkIGxvbmcgaW50IFMpCiAtLSBGdW5jdGlvbjogdm9pZCBnbXBfcmFuZGNsYXNzOjpzZWVkIChtcHpfY2xhc3MgUykKICAgICBTZWVkIGEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuICBTZWUgKm5vdGUgUmFuZG9tIE51bWJlcgogICAgIEZ1bmN0aW9uczo6LCBmb3IgaG93IHRvIGNob29zZSBhIGdvb2Qgc2VlZC4KCiAtLSBGdW5jdGlvbjogbXB6X2NsYXNzIGdtcF9yYW5kY2xhc3M6OmdldF96X2JpdHMgKG1wX2JpdGNudF90IEJJVFMpCiAtLSBGdW5jdGlvbjogbXB6X2NsYXNzIGdtcF9yYW5kY2xhc3M6OmdldF96X2JpdHMgKG1wel9jbGFzcyBCSVRTKQogICAgIEdlbmVyYXRlIGEgcmFuZG9tIGludGVnZXIgd2l0aCBhIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cy4KCiAtLSBGdW5jdGlvbjogbXB6X2NsYXNzIGdtcF9yYW5kY2xhc3M6OmdldF96X3JhbmdlIChtcHpfY2xhc3MgTikKICAgICBHZW5lcmF0ZSBhIHJhbmRvbSBpbnRlZ2VyIGluIHRoZSByYW5nZSAwIHRvIE4tMSBpbmNsdXNpdmUuCgogLS0gRnVuY3Rpb246IG1wZl9jbGFzcyBnbXBfcmFuZGNsYXNzOjpnZXRfZiAoKQogLS0gRnVuY3Rpb246IG1wZl9jbGFzcyBnbXBfcmFuZGNsYXNzOjpnZXRfZiAobXBfYml0Y250X3QgUFJFQykKICAgICBHZW5lcmF0ZSBhIHJhbmRvbSBmbG9hdCBGIGluIHRoZSByYW5nZSAwIDw9IEYgPCAxLiAgRiB3aWxsIGJlIHRvCiAgICAgUFJFQyBiaXRzIHByZWNpc2lvbiwgb3IgaWYgUFJFQyBpcyBub3QgZ2l2ZW4gdGhlbiB0byB0aGUgcHJlY2lzaW9uCiAgICAgb2YgdGhlIGRlc3RpbmF0aW9uLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgZ21wX3JhbmRjbGFzcyAgcjsKICAgICAgICAgIC4uLgogICAgICAgICAgbXBmX2NsYXNzICBmICgwLCA1MTIpOyAgIC8vIDUxMiBiaXRzIHByZWNpc2lvbgogICAgICAgICAgZiA9IHIuZ2V0X2YoKTsgICAgICAgICAgIC8vIHJhbmRvbSBudW1iZXIsIDUxMiBiaXRzCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogQysrIEludGVyZmFjZSBMaW1pdGF0aW9ucywgIFByZXY6IEMrKyBJbnRlcmZhY2UgUmFuZG9tIE51bWJlcnMsICBVcDogQysrIENsYXNzIEludGVyZmFjZQoKMTIuNiBDKysgSW50ZXJmYWNlIExpbWl0YXRpb25zCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKYG1wcV9jbGFzcycgYW5kIFRlbXBsYXRlZCBSZWFkaW5nCiAgICAgQSBnZW5lcmljIHBpZWNlIG9mIHRlbXBsYXRlIGNvZGUgcHJvYmFibHkgd29uJ3Qga25vdyB0aGF0CiAgICAgYG1wcV9jbGFzcycgcmVxdWlyZXMgYSBgY2Fub25pY2FsaXplJyBjYWxsIGlmIGlucHV0cyByZWFkIHdpdGgKICAgICBgb3BlcmF0b3I+PicgbWlnaHQgYmUgbm9uLWNhbm9uaWNhbC4gIFRoaXMgY2FuIGxlYWQgdG8gaW5jb3JyZWN0CiAgICAgcmVzdWx0cy4KCiAgICAgYG9wZXJhdG9yPj4nIGJlaGF2ZXMgYXMgaXQgZG9lcyBmb3IgcmVhc29ucyBvZiBlZmZpY2llbmN5LiAgQQogICAgIGNhbm9uaWNhbGl6ZSBjYW4gYmUgcXVpdGUgdGltZSBjb25zdW1pbmcgb24gbGFyZ2Ugb3BlcmFuZHMsIGFuZCBpcwogICAgIGJlc3QgYXZvaWRlZCBpZiBpdCdzIG5vdCBuZWNlc3NhcnkuCgogICAgIEJ1dCB0aGlzIHBvdGVudGlhbCBkaWZmaWN1bHR5IHJlZHVjZXMgdGhlIHVzZWZ1bG5lc3Mgb2YKICAgICBgbXBxX2NsYXNzJy4gIFBlcmhhcHMgYSBtZWNoYW5pc20gdG8gdGVsbCBgb3BlcmF0b3I+Picgd2hhdCB0byBkbwogICAgIHdpbGwgYmUgYWRvcHRlZCBpbiB0aGUgZnV0dXJlLCBtYXliZSBhIHByZXByb2Nlc3NvciBkZWZpbmUsIGEKICAgICBnbG9iYWwgZmxhZywgb3IgYW4gYGlvcycgZmxhZyBwcmVzc2VkIGludG8gc2VydmljZS4gIE9yIG1heWJlLCBhdAogICAgIHRoZSByaXNrIG9mIGluY29uc2lzdGVuY3ksIHRoZSBgbXBxX2NsYXNzJyBgb3BlcmF0b3I+PicgY291bGQKICAgICBjYW5vbmljYWxpemUgYW5kIGxlYXZlIGBtcHFfdCcgYG9wZXJhdG9yPj4nIG5vdCBkb2luZyBzbywgZm9yIHVzZQogICAgIG9uIHRob3NlIG9jY2FzaW9ucyB3aGVuIHRoYXQncyBhY2NlcHRhYmxlLiAgU2VuZCBmZWVkYmFjayBvcgogICAgIGFsdGVybmF0ZSBpZGVhcyB0byA8Z21wLWJ1Z3NAZ21wbGliLm9yZz4uCgpTdWJjbGFzc2luZwogICAgIFN1YmNsYXNzaW5nIHRoZSBHTVAgQysrIGNsYXNzZXMgd29ya3MsIGJ1dCBpcyBub3QgY3VycmVudGx5CiAgICAgcmVjb21tZW5kZWQuCgogICAgIEV4cHJlc3Npb25zIGludm9sdmluZyBzdWJjbGFzc2VzIHJlc29sdmUgY29ycmVjdGx5IChvciBzZWVtIHRvKSwKICAgICBidXQgaW4gbm9ybWFsIEMrKyBmYXNoaW9uIHRoZSBzdWJjbGFzcyBkb2Vzbid0IGluaGVyaXQKICAgICBjb25zdHJ1Y3RvcnMgYW5kIGFzc2lnbm1lbnRzLiAgVGhlcmUncyBtYW55IG9mIHRob3NlIGluIHRoZSBHTVAKICAgICBjbGFzc2VzLCBhbmQgYSBnb29kIHdheSB0byByZWVzdGFibGlzaCB0aGVtIGluIGEgc3ViY2xhc3MgaXMgbm90CiAgICAgeWV0IHByb3ZpZGVkLgoKVGVtcGxhdGVkIEV4cHJlc3Npb25zCiAgICAgQSBzdWJ0bGUgZGlmZmljdWx0eSBleGlzdHMgd2hlbiB1c2luZyBleHByZXNzaW9ucyB0b2dldGhlciB3aXRoCiAgICAgYXBwbGljYXRpb24tZGVmaW5lZCB0ZW1wbGF0ZSBmdW5jdGlvbnMuICBDb25zaWRlciB0aGUgZm9sbG93aW5nLAogICAgIHdpdGggYFQnIGludGVuZGVkIHRvIGJlIHNvbWUgbnVtZXJpYyB0eXBlLAoKICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgogICAgICAgICAgVCBmdW4gKGNvbnN0IFQgJiwgY29uc3QgVCAmKTsKCiAgICAgV2hlbiB1c2VkIHdpdGgsIHNheSwgcGxhaW4gYG1wel9jbGFzcycgdmFyaWFibGVzLCBpdCB3b3JrcyBmaW5lOgogICAgIGBUJyBpcyByZXNvbHZlZCBhcyBgbXB6X2NsYXNzJy4KCiAgICAgICAgICBtcHpfY2xhc3MgZigxKSwgZygyKTsKICAgICAgICAgIGZ1biAoZiwgZyk7ICAgIC8vIEdvb2QKCiAgICAgQnV0IHdoZW4gb25lIG9mIHRoZSBhcmd1bWVudHMgaXMgYW4gZXhwcmVzc2lvbiwgaXQgZG9lc24ndCB3b3JrLgoKICAgICAgICAgIG1wel9jbGFzcyBmKDEpLCBnKDIpLCBoKDMpOwogICAgICAgICAgZnVuIChmLCBnK2gpOyAgLy8gQmFkCgogICAgIFRoaXMgaXMgYmVjYXVzZSBgZytoJyBlbmRzIHVwIGJlaW5nIGEgY2VydGFpbiBleHByZXNzaW9uIHRlbXBsYXRlCiAgICAgdHlwZSBpbnRlcm5hbCB0byBgZ21weHguaCcsIHdoaWNoIHRoZSBDKysgdGVtcGxhdGUgcmVzb2x1dGlvbgogICAgIHJ1bGVzIGFyZSB1bmFibGUgdG8gYXV0b21hdGljYWxseSBjb252ZXJ0IHRvIGBtcHpfY2xhc3MnLiAgVGhlCiAgICAgd29ya2Fyb3VuZCBpcyBzaW1wbHkgdG8gYWRkIGFuIGV4cGxpY2l0IGNhc3QuCgogICAgICAgICAgbXB6X2NsYXNzIGYoMSksIGcoMiksIGgoMyk7CiAgICAgICAgICBmdW4gKGYsIG1wel9jbGFzcyhnK2gpKTsgIC8vIEdvb2QKCiAgICAgU2ltaWxhcmx5LCB3aXRoaW4gYGZ1bicgaXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBjYXN0IGFuIGV4cHJlc3Npb24KICAgICB0byB0eXBlIGBUJyB3aGVuIGNhbGxpbmcgYSB0ZW1wbGF0ZWQgYGZ1bjInLgoKICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgogICAgICAgICAgdm9pZCBmdW4gKFQgZiwgVCBnKQogICAgICAgICAgewogICAgICAgICAgICBmdW4yIChmLCBmK2cpOyAgICAgLy8gQmFkCiAgICAgICAgICB9CgogICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICAgICAgICB2b2lkIGZ1biAoVCBmLCBUIGcpCiAgICAgICAgICB7CiAgICAgICAgICAgIGZ1bjIgKGYsIFQoZitnKSk7ICAvLyBHb29kCiAgICAgICAgICB9CgpDKysxMQogICAgIEMrKzExIHByb3ZpZGVzIHNldmVyYWwgbmV3IHdheXMgaW4gd2hpY2ggdHlwZXMgY2FuIGJlIGluZmVycmVkOgogICAgIGBhdXRvJywgYGRlY2x0eXBlJywgZXRjLiBXaGlsZSB0aGV5IGNhbiBiZSB2ZXJ5IGNvbnZlbmllbnQsIHRoZXkKICAgICBkb24ndCBtaXggd2VsbCB3aXRoIGV4cHJlc3Npb24gdGVtcGxhdGVzLiBJbiB0aGlzIGV4YW1wbGUsIHRoZQogICAgIGFkZGl0aW9uIGlzIHBlcmZvcm1lZCB0d2ljZSwgYXMgaWYgd2UgaGFkIGRlZmluZWQgYHN1bScgYXMgYSBtYWNyby4KCiAgICAgICAgICBtcHpfY2xhc3MgeiA9IDMzOwogICAgICAgICAgYXV0byBzdW0gPSB6ICsgejsKICAgICAgICAgIG1wel9jbGFzcyBwcm9kID0gc3VtICogc3VtOwoKICAgICBUaGlzIG90aGVyIGV4YW1wbGUgbWF5IGNyYXNoLCB0aG91Z2ggc29tZSBjb21waWxlcnMgbWlnaHQgbWFrZSBpdAogICAgIGxvb2sgbGlrZSBpdCBpcyB3b3JraW5nLCBiZWNhdXNlIHRoZSBleHByZXNzaW9uIGB6K3onIGdvZXMgb3V0IG9mCiAgICAgc2NvcGUgYmVmb3JlIGl0IGlzIGV2YWx1YXRlZC4KCiAgICAgICAgICBtcHpfY2xhc3MgeiA9IDMzOwogICAgICAgICAgYXV0byBzdW0gPSB6ICsgeiArIHo7CiAgICAgICAgICBtcHpfY2xhc3MgcHJvZCA9IHN1bSAqIDI7CgogICAgIEl0IGlzIHRodXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gYXZvaWQgYGF1dG8nIGFueXdoZXJlIGEgR01QIEMrKwogICAgIGV4cHJlc3Npb24gbWF5IGFwcGVhci4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBDdXN0b20gQWxsb2NhdGlvbiwgIE5leHQ6IExhbmd1YWdlIEJpbmRpbmdzLCAgUHJldjogQysrIENsYXNzIEludGVyZmFjZSwgIFVwOiBUb3AKCjEzIEN1c3RvbSBBbGxvY2F0aW9uCioqKioqKioqKioqKioqKioqKioqCgpCeSBkZWZhdWx0IEdNUCB1c2VzIGBtYWxsb2MnLCBgcmVhbGxvYycgYW5kIGBmcmVlJyBmb3IgbWVtb3J5CmFsbG9jYXRpb24sIGFuZCBpZiB0aGV5IGZhaWwgR01QIHByaW50cyBhIG1lc3NhZ2UgdG8gdGhlIHN0YW5kYXJkIGVycm9yCm91dHB1dCBhbmQgdGVybWluYXRlcyB0aGUgcHJvZ3JhbS4KCiAgIEFsdGVybmF0ZSBmdW5jdGlvbnMgY2FuIGJlIHNwZWNpZmllZCwgdG8gYWxsb2NhdGUgbWVtb3J5IGluIGEKZGlmZmVyZW50IHdheSBvciB0byBoYXZlIGEgZGlmZmVyZW50IGVycm9yIGFjdGlvbiBvbiBydW5uaW5nIG91dCBvZgptZW1vcnkuCgogLS0gRnVuY3Rpb246IHZvaWQgbXBfc2V0X21lbW9yeV9mdW5jdGlvbnMgKAogICAgICAgICAgdm9pZCAqKCpBTExPQ19GVU5DX1BUUikgKHNpemVfdCksCiAgICAgICAgICB2b2lkICooKlJFQUxMT0NfRlVOQ19QVFIpICh2b2lkICosIHNpemVfdCwgc2l6ZV90KSwKICAgICAgICAgIHZvaWQgKCpGUkVFX0ZVTkNfUFRSKSAodm9pZCAqLCBzaXplX3QpKQogICAgIFJlcGxhY2UgdGhlIGN1cnJlbnQgYWxsb2NhdGlvbiBmdW5jdGlvbnMgZnJvbSB0aGUgYXJndW1lbnRzLiAgSWYKICAgICBhbiBhcmd1bWVudCBpcyBgTlVMTCcsIHRoZSBjb3JyZXNwb25kaW5nIGRlZmF1bHQgZnVuY3Rpb24gaXMgdXNlZC4KCiAgICAgVGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgdXNlZCBmb3IgYWxsIG1lbW9yeSBhbGxvY2F0aW9uIGRvbmUgYnkKICAgICBHTVAsIGFwYXJ0IGZyb20gdGVtcG9yYXJ5IHNwYWNlIGZyb20gYGFsbG9jYScgaWYgdGhhdCBmdW5jdGlvbiBpcwogICAgIGF2YWlsYWJsZSBhbmQgR01QIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIGl0ICgqbm90ZSBCdWlsZCBPcHRpb25zOjopLgoKICAgICAqQmUgc3VyZSB0byBjYWxsIGBtcF9zZXRfbWVtb3J5X2Z1bmN0aW9ucycgb25seSB3aGVuIHRoZXJlIGFyZSBubwogICAgIGFjdGl2ZSBHTVAgb2JqZWN0cyBhbGxvY2F0ZWQgdXNpbmcgdGhlIHByZXZpb3VzIG1lbW9yeSBmdW5jdGlvbnMhCiAgICAgVXN1YWxseSB0aGF0IG1lYW5zIGNhbGxpbmcgaXQgYmVmb3JlIGFueSBvdGhlciBHTVAgZnVuY3Rpb24uKgoKICAgVGhlIGZ1bmN0aW9ucyBzdXBwbGllZCBzaG91bGQgZml0IHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb25zOgoKIC0tIEZ1bmN0aW9uOiB2b2lkICogYWxsb2NhdGVfZnVuY3Rpb24gKHNpemVfdCBBTExPQ19TSVpFKQogICAgIFJldHVybiBhIHBvaW50ZXIgdG8gbmV3bHkgYWxsb2NhdGVkIHNwYWNlIHdpdGggYXQgbGVhc3QgQUxMT0NfU0laRQogICAgIGJ5dGVzLgoKIC0tIEZ1bmN0aW9uOiB2b2lkICogcmVhbGxvY2F0ZV9mdW5jdGlvbiAodm9pZCAqUFRSLCBzaXplX3QgT0xEX1NJWkUsCiAgICAgICAgICBzaXplX3QgTkVXX1NJWkUpCiAgICAgUmVzaXplIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgYmxvY2sgUFRSIG9mIE9MRF9TSVpFIGJ5dGVzIHRvIGJlCiAgICAgTkVXX1NJWkUgYnl0ZXMuCgogICAgIFRoZSBibG9jayBtYXkgYmUgbW92ZWQgaWYgbmVjZXNzYXJ5IG9yIGlmIGRlc2lyZWQsIGFuZCBpbiB0aGF0CiAgICAgY2FzZSB0aGUgc21hbGxlciBvZiBPTERfU0laRSBhbmQgTkVXX1NJWkUgYnl0ZXMgbXVzdCBiZSBjb3BpZWQgdG8KICAgICB0aGUgbmV3IGxvY2F0aW9uLiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIHJlc2l6ZWQKICAgICBibG9jaywgdGhhdCBiZWluZyB0aGUgbmV3IGxvY2F0aW9uIGlmIG1vdmVkIG9yIGp1c3QgUFRSIGlmIG5vdC4KCiAgICAgUFRSIGlzIG5ldmVyIGBOVUxMJywgaXQncyBhbHdheXMgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBibG9jay4KICAgICBORVdfU0laRSBtYXkgYmUgYmlnZ2VyIG9yIHNtYWxsZXIgdGhhbiBPTERfU0laRS4KCiAtLSBGdW5jdGlvbjogdm9pZCBmcmVlX2Z1bmN0aW9uICh2b2lkICpQVFIsIHNpemVfdCBTSVpFKQogICAgIERlLWFsbG9jYXRlIHRoZSBzcGFjZSBwb2ludGVkIHRvIGJ5IFBUUi4KCiAgICAgUFRSIGlzIG5ldmVyIGBOVUxMJywgaXQncyBhbHdheXMgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBibG9jayBvZgogICAgIFNJWkUgYnl0ZXMuCgogICBBICJieXRlIiBoZXJlIG1lYW5zIHRoZSB1bml0IHVzZWQgYnkgdGhlIGBzaXplb2YnIG9wZXJhdG9yLgoKICAgVGhlIFJFQUxMT0NBVEVfRlVOQ1RJT04gcGFyYW1ldGVyIE9MRF9TSVpFIGFuZCB0aGUgRlJFRV9GVU5DVElPTgpwYXJhbWV0ZXIgU0laRSBhcmUgcGFzc2VkIGZvciBjb252ZW5pZW5jZSwgYnV0IG9mIGNvdXJzZSB0aGV5IGNhbiBiZQppZ25vcmVkIGlmIG5vdCBuZWVkZWQgYnkgYW4gaW1wbGVtZW50YXRpb24uICBUaGUgZGVmYXVsdCBmdW5jdGlvbnMKdXNpbmcgYG1hbGxvYycgYW5kIGZyaWVuZHMgZm9yIGluc3RhbmNlIGRvbid0IHVzZSB0aGVtLgoKICAgTm8gZXJyb3IgcmV0dXJuIGlzIGFsbG93ZWQgZnJvbSBhbnkgb2YgdGhlc2UgZnVuY3Rpb25zLCBpZiB0aGV5CnJldHVybiB0aGVuIHRoZXkgbXVzdCBoYXZlIHBlcmZvcm1lZCB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbi4gIEluCnBhcnRpY3VsYXIgbm90ZSB0aGF0IEFMTE9DQVRFX0ZVTkNUSU9OIG9yIFJFQUxMT0NBVEVfRlVOQ1RJT04gbXVzdG4ndApyZXR1cm4gYE5VTEwnLgoKICAgR2V0dGluZyBhIGRpZmZlcmVudCBmYXRhbCBlcnJvciBhY3Rpb24gaXMgYSBnb29kIHVzZSBmb3IgY3VzdG9tCmFsbG9jYXRpb24gZnVuY3Rpb25zLCBmb3IgZXhhbXBsZSBnaXZpbmcgYSBncmFwaGljYWwgZGlhbG9nIHJhdGhlciB0aGFuCnRoZSBkZWZhdWx0IHByaW50IHRvIGBzdGRlcnInLiAgSG93IG11Y2ggaXMgcG9zc2libGUgd2hlbiBnZW51aW5lbHkgb3V0Cm9mIG1lbW9yeSBpcyBhbm90aGVyIHF1ZXN0aW9uIHRob3VnaC4KCiAgIFRoZXJlJ3MgY3VycmVudGx5IG5vIGRlZmluZWQgd2F5IGZvciB0aGUgYWxsb2NhdGlvbiBmdW5jdGlvbnMgdG8KcmVjb3ZlciBmcm9tIGFuIGVycm9yIHN1Y2ggYXMgb3V0IG9mIG1lbW9yeSwgdGhleSBtdXN0IHRlcm1pbmF0ZQpwcm9ncmFtIGV4ZWN1dGlvbi4gIEEgYGxvbmdqbXAnIG9yIHRocm93aW5nIGEgQysrIGV4Y2VwdGlvbiB3aWxsIGhhdmUKdW5kZWZpbmVkIHJlc3VsdHMuICBUaGlzIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KCiAgIEdNUCBtYXkgdXNlIGFsbG9jYXRlZCBibG9ja3MgdG8gaG9sZCBwb2ludGVycyB0byBvdGhlciBhbGxvY2F0ZWQKYmxvY2tzLiAgVGhpcyB3aWxsIGxpbWl0IHRoZSBhc3N1bXB0aW9ucyBhIGNvbnNlcnZhdGl2ZSBnYXJiYWdlCmNvbGxlY3Rpb24gc2NoZW1lIGNhbiBtYWtlLgoKICAgU2luY2UgdGhlIGRlZmF1bHQgR01QIGFsbG9jYXRpb24gdXNlcyBgbWFsbG9jJyBhbmQgZnJpZW5kcywgdGhvc2UKZnVuY3Rpb25zIHdpbGwgYmUgbGlua2VkIGluIGV2ZW4gaWYgdGhlIGZpcnN0IHRoaW5nIGEgcHJvZ3JhbSBkb2VzIGlzIGFuCmBtcF9zZXRfbWVtb3J5X2Z1bmN0aW9ucycuICBJdCdzIG5lY2Vzc2FyeSB0byBjaGFuZ2UgdGhlIEdNUCBzb3VyY2VzIGlmCnRoaXMgaXMgYSBwcm9ibGVtLgoKCiAtLSBGdW5jdGlvbjogdm9pZCBtcF9nZXRfbWVtb3J5X2Z1bmN0aW9ucyAoCiAgICAgICAgICB2b2lkICooKipBTExPQ19GVU5DX1BUUikgKHNpemVfdCksCiAgICAgICAgICB2b2lkICooKipSRUFMTE9DX0ZVTkNfUFRSKSAodm9pZCAqLCBzaXplX3QsIHNpemVfdCksCiAgICAgICAgICB2b2lkICgqKkZSRUVfRlVOQ19QVFIpICh2b2lkICosIHNpemVfdCkpCiAgICAgR2V0IHRoZSBjdXJyZW50IGFsbG9jYXRpb24gZnVuY3Rpb25zLCBzdG9yaW5nIGZ1bmN0aW9uIHBvaW50ZXJzIHRvCiAgICAgdGhlIGxvY2F0aW9ucyBnaXZlbiBieSB0aGUgYXJndW1lbnRzLiAgSWYgYW4gYXJndW1lbnQgaXMgYE5VTEwnLAogICAgIHRoYXQgZnVuY3Rpb24gcG9pbnRlciBpcyBub3Qgc3RvcmVkLgoKICAgICBGb3IgZXhhbXBsZSwgdG8gZ2V0IGp1c3QgdGhlIGN1cnJlbnQgZnJlZSBmdW5jdGlvbiwKCiAgICAgICAgICB2b2lkICgqZnJlZWZ1bmMpICh2b2lkICosIHNpemVfdCk7CgogICAgICAgICAgbXBfZ2V0X21lbW9yeV9mdW5jdGlvbnMgKE5VTEwsIE5VTEwsICZmcmVlZnVuYyk7CgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogTGFuZ3VhZ2UgQmluZGluZ3MsICBOZXh0OiBBbGdvcml0aG1zLCAgUHJldjogQ3VzdG9tIEFsbG9jYXRpb24sICBVcDogVG9wCgoxNCBMYW5ndWFnZSBCaW5kaW5ncwoqKioqKioqKioqKioqKioqKioqKgoKVGhlIGZvbGxvd2luZyBwYWNrYWdlcyBhbmQgcHJvamVjdHMgb2ZmZXIgYWNjZXNzIHRvIEdNUCBmcm9tIGxhbmd1YWdlcwpvdGhlciB0aGFuIEMsIHRob3VnaCBwZXJoYXBzIHdpdGggdmFyeWluZyBsZXZlbHMgb2YgZnVuY3Rpb25hbGl0eSBhbmQKZWZmaWNpZW5jeS4KCgpDKysKICAgICAgICAqIEdNUCBDKysgY2xhc3MgaW50ZXJmYWNlLCAqbm90ZSBDKysgQ2xhc3MgSW50ZXJmYWNlOjoKICAgICAgICAgIFN0cmFpZ2h0Zm9yd2FyZCBpbnRlcmZhY2UsIGV4cHJlc3Npb24gdGVtcGxhdGVzIHRvIGVsaW1pbmF0ZQogICAgICAgICAgdGVtcG9yYXJpZXMuCgogICAgICAgICogQUxQIGBodHRwczovL3d3dy1zb3AuaW5yaWEuZnIvc2FnYS9sb2dpY2llbHMvQUxQLycKICAgICAgICAgIExpbmVhciBhbGdlYnJhIGFuZCBwb2x5bm9taWFscyB1c2luZyB0ZW1wbGF0ZXMuCgogICAgICAgICogQXJpdGhtb3MgYGh0dHA6Ly9jYW50LnVhLmFjLmJlL29sZC9hcml0aG1vcy8nCiAgICAgICAgICBSYXRpb25hbHMgd2l0aCBpbmZpbml0aWVzIGFuZCBzcXVhcmUgcm9vdHMuCgogICAgICAgICogQ0xOIGBodHRwOi8vd3d3LmdpbmFjLmRlL0NMTi8nCiAgICAgICAgICBIaWdoIGxldmVsIGNsYXNzZXMgZm9yIGFyaXRobWV0aWMuCgogICAgICAgICogTGluYm94IGBodHRwOi8vd3d3LmxpbmFsZy5vcmcvJwogICAgICAgICAgU3BhcnNlIHZlY3RvcnMgYW5kIG1hdHJpY2VzLgoKICAgICAgICAqIE5UTCBgaHR0cDovL3d3dy5zaG91cC5uZXQvbnRsLycKICAgICAgICAgIEEgQysrIG51bWJlciB0aGVvcnkgbGlicmFyeS4KCkVpZmZlbAogICAgICAgICogRWlmZmVscm9vbSBgaHR0cDovL3d3dy5laWZmZWxyb29tLm9yZy9ub2RlLzQ0MicKCkhhc2tlbGwKICAgICAgICAqIEdsYXNnb3cgSGFza2VsbCBDb21waWxlciBgaHR0cHM6Ly93d3cuaGFza2VsbC5vcmcvZ2hjLycKCkphdmEKICAgICAgICAqIEthZmZlIGBodHRwczovL2dpdGh1Yi5jb20va2FmZmUva2FmZmUnCgpMaXNwCiAgICAgICAgKiBHTlUgQ29tbW9uIExpc3AgYGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2NsL2djbC5odG1sJwoKICAgICAgICAqIExpYnJlcCBgaHR0cDovL2xpYnJlcC5zb3VyY2Vmb3JnZS5uZXQvJwoKICAgICAgICAqIFhFbWFjcyAoMjEuNS4xOCBiZXRhIGFuZCB1cCkgYGh0dHA6Ly93d3cueGVtYWNzLm9yZycKICAgICAgICAgIE9wdGlvbmFsIGJpZyBpbnRlZ2VycywgcmF0aW9uYWxzIGFuZCBmbG9hdHMgdXNpbmcgR01QLgoKTTQKICAgICAgICAqIEdOVSBtNCBiZXRhcyBgaHR0cDovL3d3dy5zZWluZGFsLmRrL3JlbmUvZ251LycKICAgICAgICAgIE9wdGlvbmFsbHkgcHJvdmlkZXMgYW4gYXJiaXRyYXJ5IHByZWNpc2lvbiBgbXBldmFsJy4KCk1MCiAgICAgICAgKiBNTHRvbiBjb21waWxlciBgaHR0cDovL21sdG9uLm9yZy8nCgpPYmplY3RpdmUgQ2FtbAogICAgICAgICogTUxHTVAgYGh0dHA6Ly9vcGFtLm9jYW1scHJvLmNvbS9wa2cvbWxnbXAuMjAxMjAyMjQuaHRtbCcKCiAgICAgICAgKiBOdW1lcml4IGBodHRwOi8vcGF1aWxsYWMuaW5yaWEuZnIvfnF1ZXJjaWEvJwogICAgICAgICAgT3B0aW9uYWxseSB1c2luZyBHTVAuCgpPegogICAgICAgICogTW96YXJ0IGBodHRwOi8vbW96YXJ0LmdpdGh1Yi5pby8nCgpQYXNjYWwKICAgICAgICAqIEdOVSBQYXNjYWwgQ29tcGlsZXIgYGh0dHA6Ly93d3cuZ251LXBhc2NhbC5kZS8nCiAgICAgICAgICBHTVAgdW5pdC4KCiAgICAgICAgKiBOdW1lcml4IGBodHRwOi8vcGF1aWxsYWMuaW5yaWEuZnIvfnF1ZXJjaWEvJwogICAgICAgICAgRm9yIEZyZWUgUGFzY2FsLCBvcHRpb25hbGx5IHVzaW5nIEdNUC4KClBlcmwKICAgICAgICAqIEdNUCBtb2R1bGUsIHNlZSBgZGVtb3MvcGVybCcgaW4gdGhlIEdNUCBzb3VyY2VzICgqbm90ZQogICAgICAgICAgRGVtb25zdHJhdGlvbiBQcm9ncmFtczo6KS4KCiAgICAgICAgKiBNYXRoOjpHTVAgYGh0dHA6Ly93d3cuY3Bhbi5vcmcvJwogICAgICAgICAgQ29tcGF0aWJsZSB3aXRoIE1hdGg6OkJpZ0ludCwgYnV0IG5vdCBhcyBtYW55IGZ1bmN0aW9ucyBhcwogICAgICAgICAgdGhlIEdNUCBtb2R1bGUgYWJvdmUuCgogICAgICAgICogTWF0aDo6QmlnSW50OjpHTVAgYGh0dHA6Ly93d3cuY3Bhbi5vcmcvJwogICAgICAgICAgUGx1ZyBNYXRoOjpHTVAgaW50byBub3JtYWwgTWF0aDo6QmlnSW50IG9wZXJhdGlvbnMuCgpQaWtlCiAgICAgICAgKiBtcHogbW9kdWxlIGluIHRoZSBzdGFuZGFyZCBkaXN0cmlidXRpb24sCiAgICAgICAgICBgaHR0cDovL3Bpa2UuaWRhLmxpdS5zZS8nCgpQcm9sb2cKICAgICAgICAqIFNXSSBQcm9sb2cgYGh0dHA6Ly93d3cuc3dpLXByb2xvZy5vcmcvJwogICAgICAgICAgQXJiaXRyYXJ5IHByZWNpc2lvbiBmbG9hdHMuCgpQeXRob24KICAgICAgICAqIEdNUFkgYGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ21weS8nCgpSdWJ5CiAgICAgICAgKiBodHRwOi8vcnVieWdlbXMub3JnL2dlbXMvZ21wCgpTY2hlbWUKICAgICAgICAqIEdOVSBHdWlsZSBgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9ndWlsZS9ndWlsZS5odG1sJwoKICAgICAgICAqIFJTY2hlbWUgYGh0dHA6Ly93d3cucnNjaGVtZS5vcmcvJwoKICAgICAgICAqIFNUa2xvcyBgaHR0cDovL3d3dy5zdGtsb3MubmV0LycKClNtYWxsdGFsawogICAgICAgICogR05VIFNtYWxsdGFsawogICAgICAgICAgYGh0dHA6Ly93d3cuc21hbGx0YWxrLm9yZy92ZXJzaW9ucy9HTlVTbWFsbHRhbGsuaHRtbCcKCk90aGVyCiAgICAgICAgKiBBeGlvbSBgaHR0cHM6Ly9zYXZhbm5haC5ub25nbnUub3JnL3Byb2plY3RzL2F4aW9tJwogICAgICAgICAgQ29tcHV0ZXIgYWxnZWJyYSB1c2luZyBHQ0wuCgogICAgICAgICogRHJHZW5pdXMgYGh0dHA6Ly9kcmdlbml1cy5zZXVsLm9yZy8nCiAgICAgICAgICBHZW9tZXRyeSBzeXN0ZW0gYW5kIG1hdGhlbWF0aWNhbCBwcm9ncmFtbWluZyBsYW5ndWFnZS4KCiAgICAgICAgKiBHaU5hQyBgaHR0cDovL3d3dy5naW5hYy5kZS8nCiAgICAgICAgICBDKysgY29tcHV0ZXIgYWxnZWJyYSB1c2luZyBDTE4uCgogICAgICAgICogR09PIGBodHRwczovL3d3dy5lZWNzLmJlcmtlbGV5LmVkdS9+anJiL2dvby8nCiAgICAgICAgICBEeW5hbWljIG9iamVjdCBvcmllbnRlZCBsYW5ndWFnZS4KCiAgICAgICAgKiBNYXhpbWEgYGh0dHBzOi8vd3d3Lm1hLnV0ZXhhcy5lZHUvdXNlcnMvd2ZzL21heGltYS5odG1sJwogICAgICAgICAgTWFjc3ltYSBjb21wdXRlciBhbGdlYnJhIHVzaW5nIEdDTC4KCiAgICAgICAgKiBSZWdpbmEgYGh0dHA6Ly9yZWdpbmEuc291cmNlZm9yZ2UubmV0LycKICAgICAgICAgIFRvcG9sb2dpY2FsIGNhbGN1bGF0b3IuCgogICAgICAgICogWWFjYXMgYGh0dHA6Ly95YWNhcy5zb3VyY2Vmb3JnZS5uZXQnCiAgICAgICAgICBZZXQgYW5vdGhlciBjb21wdXRlciBhbGdlYnJhIHN5c3RlbS4KCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogQWxnb3JpdGhtcywgIE5leHQ6IEludGVybmFscywgIFByZXY6IExhbmd1YWdlIEJpbmRpbmdzLCAgVXA6IFRvcAoKMTUgQWxnb3JpdGhtcwoqKioqKioqKioqKioqCgpUaGlzIGNoYXB0ZXIgaXMgYW4gaW50cm9kdWN0aW9uIHRvIHNvbWUgb2YgdGhlIGFsZ29yaXRobXMgdXNlZCBmb3IKdmFyaW91cyBHTVAgb3BlcmF0aW9ucy4gIFRoZSBjb2RlIGlzIGxpa2VseSB0byBiZSBoYXJkIHRvIHVuZGVyc3RhbmQKd2l0aG91dCBrbm93aW5nIHNvbWV0aGluZyBhYm91dCB0aGUgYWxnb3JpdGhtcy4KCiAgIFNvbWUgR01QIGludGVybmFscyBhcmUgbWVudGlvbmVkLCBidXQgYXBwbGljYXRpb25zIHRoYXQgZXhwZWN0IHRvIGJlCmNvbXBhdGlibGUgd2l0aCBmdXR1cmUgR01QIHJlbGVhc2VzIHNob3VsZCB0YWtlIGNhcmUgdG8gdXNlIG9ubHkgdGhlCmRvY3VtZW50ZWQgZnVuY3Rpb25zLgoKKiBNZW51OgoKKiBNdWx0aXBsaWNhdGlvbiBBbGdvcml0aG1zOjoKKiBEaXZpc2lvbiBBbGdvcml0aG1zOjoKKiBHcmVhdGVzdCBDb21tb24gRGl2aXNvciBBbGdvcml0aG1zOjoKKiBQb3dlcmluZyBBbGdvcml0aG1zOjoKKiBSb290IEV4dHJhY3Rpb24gQWxnb3JpdGhtczo6CiogUmFkaXggQ29udmVyc2lvbiBBbGdvcml0aG1zOjoKKiBPdGhlciBBbGdvcml0aG1zOjoKKiBBc3NlbWJseSBDb2Rpbmc6OgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IE11bHRpcGxpY2F0aW9uIEFsZ29yaXRobXMsICBOZXh0OiBEaXZpc2lvbiBBbGdvcml0aG1zLCAgUHJldjogQWxnb3JpdGhtcywgIFVwOiBBbGdvcml0aG1zCgoxNS4xIE11bHRpcGxpY2F0aW9uCj09PT09PT09PT09PT09PT09PT0KCk54TiBsaW1iIG11bHRpcGxpY2F0aW9ucyBhbmQgc3F1YXJlcyBhcmUgZG9uZSB1c2luZyBvbmUgb2Ygc2V2ZW4KYWxnb3JpdGhtcywgYXMgdGhlIHNpemUgTiBpbmNyZWFzZXMuCgogICAgIEFsZ29yaXRobSAgICAgIFRocmVzaG9sZAogICAgIEJhc2VjYXNlICAgICAgIChub25lKQogICAgIEthcmF0c3ViYSAgICAgIGBNVUxfVE9PTTIyX1RIUkVTSE9MRCcKICAgICBUb29tLTMgICAgICAgICBgTVVMX1RPT00zM19USFJFU0hPTEQnCiAgICAgVG9vbS00ICAgICAgICAgYE1VTF9UT09NNDRfVEhSRVNIT0xEJwogICAgIFRvb20tNi41ICAgICAgIGBNVUxfVE9PTTZIX1RIUkVTSE9MRCcKICAgICBUb29tLTguNSAgICAgICBgTVVMX1RPT004SF9USFJFU0hPTEQnCiAgICAgRkZUICAgICAgICAgICAgYE1VTF9GRlRfVEhSRVNIT0xEJwoKICAgU2ltaWxhcmx5IGZvciBzcXVhcmluZywgd2l0aCB0aGUgYFNRUicgdGhyZXNob2xkcy4KCiAgIE54TSBtdWx0aXBsaWNhdGlvbnMgb2Ygb3BlcmFuZHMgd2l0aCBkaWZmZXJlbnQgc2l6ZXMgYWJvdmUKYE1VTF9UT09NMjJfVEhSRVNIT0xEJyBhcmUgY3VycmVudGx5IGRvbmUgYnkgc3BlY2lhbCBUb29tLWluc3BpcmVkCmFsZ29yaXRobXMgb3IgZGlyZWN0bHkgd2l0aCBGRlQsIGRlcGVuZGluZyBvbiBvcGVyYW5kIHNpemUgKCpub3RlClVuYmFsYW5jZWQgTXVsdGlwbGljYXRpb246OikuCgoqIE1lbnU6CgoqIEJhc2VjYXNlIE11bHRpcGxpY2F0aW9uOjoKKiBLYXJhdHN1YmEgTXVsdGlwbGljYXRpb246OgoqIFRvb20gMy1XYXkgTXVsdGlwbGljYXRpb246OgoqIFRvb20gNC1XYXkgTXVsdGlwbGljYXRpb246OgoqIEhpZ2hlciBkZWdyZWUgVG9vbSduJ2hhbGY6OgoqIEZGVCBNdWx0aXBsaWNhdGlvbjo6CiogT3RoZXIgTXVsdGlwbGljYXRpb246OgoqIFVuYmFsYW5jZWQgTXVsdGlwbGljYXRpb246OgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEJhc2VjYXNlIE11bHRpcGxpY2F0aW9uLCAgTmV4dDogS2FyYXRzdWJhIE11bHRpcGxpY2F0aW9uLCAgUHJldjogTXVsdGlwbGljYXRpb24gQWxnb3JpdGhtcywgIFVwOiBNdWx0aXBsaWNhdGlvbiBBbGdvcml0aG1zCgoxNS4xLjEgQmFzZWNhc2UgTXVsdGlwbGljYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpCYXNlY2FzZSBOeE0gbXVsdGlwbGljYXRpb24gaXMgYSBzdHJhaWdodGZvcndhcmQgcmVjdGFuZ3VsYXIgc2V0IG9mCmNyb3NzLXByb2R1Y3RzLCB0aGUgc2FtZSBhcyBsb25nIG11bHRpcGxpY2F0aW9uIGRvbmUgYnkgaGFuZCBhbmQgZm9yCnRoYXQgcmVhc29uIHNvbWV0aW1lcyBrbm93biBhcyB0aGUgc2Nob29sYm9vayBvciBncmFtbWFyIHNjaG9vbCBtZXRob2QuClRoaXMgaXMgYW4gTyhOKk0pIGFsZ29yaXRobS4gIFNlZSBLbnV0aCBzZWN0aW9uIDQuMy4xIGFsZ29yaXRobSBNCigqbm90ZSBSZWZlcmVuY2VzOjopLCBhbmQgdGhlIGBtcG4vZ2VuZXJpYy9tdWxfYmFzZWNhc2UuYycgY29kZS4KCiAgIEFzc2VtYmx5IGltcGxlbWVudGF0aW9ucyBvZiBgbXBuX211bF9iYXNlY2FzZScgYXJlIGVzc2VudGlhbGx5IHRoZQpzYW1lIGFzIHRoZSBnZW5lcmljIEMgY29kZSwgYnV0IGhhdmUgYWxsIHRoZSB1c3VhbCBhc3NlbWJseSB0cmlja3MgYW5kCm9ic2N1cml0aWVzIGludHJvZHVjZWQgZm9yIHNwZWVkLgoKICAgQSBzcXVhcmUgY2FuIGJlIGRvbmUgaW4gcm91Z2hseSBoYWxmIHRoZSB0aW1lIG9mIGEgbXVsdGlwbHksIGJ5CnVzaW5nIHRoZSBmYWN0IHRoYXQgdGhlIGNyb3NzIHByb2R1Y3RzIGFib3ZlIGFuZCBiZWxvdyB0aGUgZGlhZ29uYWwgYXJlCnRoZSBzYW1lLiAgQSB0cmlhbmdsZSBvZiBwcm9kdWN0cyBiZWxvdyB0aGUgZGlhZ29uYWwgaXMgZm9ybWVkLCBkb3VibGVkCihsZWZ0IHNoaWZ0IGJ5IG9uZSBiaXQpLCBhbmQgdGhlbiB0aGUgcHJvZHVjdHMgb24gdGhlIGRpYWdvbmFsIGFkZGVkLgpUaGlzIGNhbiBiZSBzZWVuIGluIGBtcG4vZ2VuZXJpYy9zcXJfYmFzZWNhc2UuYycuICBBZ2FpbiB0aGUgYXNzZW1ibHkKaW1wbGVtZW50YXRpb25zIHRha2UgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXBwcm9hY2guCgogICAgICAgICAgdTAgIHUxICB1MiAgdTMgIHU0CiAgICAgICAgKy0tLSstLS0rLS0tKy0tLSstLS0rCiAgICAgdTAgfCBkIHwgICB8ICAgfCAgIHwgICB8CiAgICAgICAgKy0tLSstLS0rLS0tKy0tLSstLS0rCiAgICAgdTEgfCAgIHwgZCB8ICAgfCAgIHwgICB8CiAgICAgICAgKy0tLSstLS0rLS0tKy0tLSstLS0rCiAgICAgdTIgfCAgIHwgICB8IGQgfCAgIHwgICB8CiAgICAgICAgKy0tLSstLS0rLS0tKy0tLSstLS0rCiAgICAgdTMgfCAgIHwgICB8ICAgfCBkIHwgICB8CiAgICAgICAgKy0tLSstLS0rLS0tKy0tLSstLS0rCiAgICAgdTQgfCAgIHwgICB8ICAgfCAgIHwgZCB8CiAgICAgICAgKy0tLSstLS0rLS0tKy0tLSstLS0rCgogICBJbiBwcmFjdGljZSBzcXVhcmluZyBpc24ndCBhIGZ1bGwgMnggZmFzdGVyIHRoYW4gbXVsdGlwbHlpbmcsIGl0J3MKdXN1YWxseSBhcm91bmQgMS41eC4gIExlc3MgdGhhbiAxLjV4IHByb2JhYmx5IGluZGljYXRlcwpgbXBuX3Nxcl9iYXNlY2FzZScgd2FudHMgaW1wcm92aW5nIG9uIHRoYXQgQ1BVLgoKICAgT24gc29tZSBDUFVzIGBtcG5fbXVsX2Jhc2VjYXNlJyBjYW4gYmUgZmFzdGVyIHRoYW4gdGhlIGdlbmVyaWMgQwpgbXBuX3Nxcl9iYXNlY2FzZScgb24gc29tZSBzbWFsbCBzaXplcy4gIGBTUVJfQkFTRUNBU0VfVEhSRVNIT0xEJyBpcwp0aGUgc2l6ZSBhdCB3aGljaCB0byB1c2UgYG1wbl9zcXJfYmFzZWNhc2UnLCB0aGlzIHdpbGwgYmUgemVybyBpZiB0aGF0CnJvdXRpbmUgc2hvdWxkIGJlIHVzZWQgYWx3YXlzLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEthcmF0c3ViYSBNdWx0aXBsaWNhdGlvbiwgIE5leHQ6IFRvb20gMy1XYXkgTXVsdGlwbGljYXRpb24sICBQcmV2OiBCYXNlY2FzZSBNdWx0aXBsaWNhdGlvbiwgIFVwOiBNdWx0aXBsaWNhdGlvbiBBbGdvcml0aG1zCgoxNS4xLjIgS2FyYXRzdWJhIE11bHRpcGxpY2F0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoZSBLYXJhdHN1YmEgbXVsdGlwbGljYXRpb24gYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiBLbnV0aCBzZWN0aW9uCjQuMy4zIHBhcnQgQSwgYW5kIHZhcmlvdXMgb3RoZXIgdGV4dGJvb2tzLiAgQSBicmllZiBkZXNjcmlwdGlvbiBpcwpnaXZlbiBoZXJlLgoKICAgVGhlIGlucHV0cyB4IGFuZCB5IGFyZSB0cmVhdGVkIGFzIGVhY2ggc3BsaXQgaW50byB0d28gcGFydHMgb2YgZXF1YWwKbGVuZ3RoIChvciB0aGUgbW9zdCBzaWduaWZpY2FudCBwYXJ0IG9uZSBsaW1iIHNob3J0ZXIgaWYgTiBpcyBvZGQpLgoKICAgICAgaGlnaCAgICAgICAgICAgICAgbG93CiAgICAgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKICAgICB8ICAgIHgxICAgIHwgICAgeDAgICAgfAogICAgICstLS0tLS0tLS0tKy0tLS0tLS0tLS0rCgogICAgICstLS0tLS0tLS0tKy0tLS0tLS0tLS0rCiAgICAgfCAgICB5MSAgICB8ICAgIHkwICAgIHwKICAgICArLS0tLS0tLS0tLSstLS0tLS0tLS0tKwoKICAgTGV0IGIgYmUgdGhlIHBvd2VyIG9mIDIgd2hlcmUgdGhlIHNwbGl0IG9jY3VycywgaS5lLiBpZiB4MCBpcyBrCmxpbWJzICh5MCB0aGUgc2FtZSkgdGhlbiBiPTJeKGsqbXBfYml0c19wZXJfbGltYikuICBXaXRoIHRoYXQgeD14MSpiK3gwCmFuZCB5PXkxKmIreTAsIGFuZCB0aGUgZm9sbG93aW5nIGhvbGRzLAoKICAgICB4KnkgPSAoYl4yK2IpKngxKnkxIC0gYiooeDEteDApKih5MS15MCkgKyAoYisxKSp4MCp5MAoKICAgVGhpcyBmb3JtdWxhIG1lYW5zIGRvaW5nIG9ubHkgdGhyZWUgbXVsdGlwbGllcyBvZiAoTi8yKXgoTi8yKSBsaW1icywKd2hlcmVhcyBhIGJhc2VjYXNlIG11bHRpcGx5IG9mIE54TiBsaW1icyBpcyBlcXVpdmFsZW50IHRvIGZvdXIKbXVsdGlwbGllcyBvZiAoTi8yKXgoTi8yKS4gIFRoZSBmYWN0b3JzIChiXjIrYikgZXRjIHJlcHJlc2VudCB0aGUKcG9zaXRpb25zIHdoZXJlIHRoZSB0aHJlZSBwcm9kdWN0cyBtdXN0IGJlIGFkZGVkLgoKICAgICAgaGlnaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvdwogICAgICstLS0tLS0tLSstLS0tLS0tLSsgKy0tLS0tLS0tKy0tLS0tLS0tKwogICAgIHwgICAgICB4MSp5MSAgICAgIHwgfCAgICAgIHgwKnkwICAgICAgfAogICAgICstLS0tLS0tLSstLS0tLS0tLSsgKy0tLS0tLS0tKy0tLS0tLS0tKwogICAgICAgICAgICAgICArLS0tLS0tLS0rLS0tLS0tLS0rCiAgICAgICAgICAgYWRkIHwgICAgICB4MSp5MSAgICAgIHwKICAgICAgICAgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0tKwogICAgICAgICAgICAgICArLS0tLS0tLS0rLS0tLS0tLS0rCiAgICAgICAgICAgYWRkIHwgICAgICB4MCp5MCAgICAgIHwKICAgICAgICAgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0tKwogICAgICAgICAgICAgICArLS0tLS0tLS0rLS0tLS0tLS0rCiAgICAgICAgICAgc3ViIHwgKHgxLXgwKSooeTEteTApIHwKICAgICAgICAgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0tKwoKICAgVGhlIHRlcm0gKHgxLXgwKSooeTEteTApIGlzIGJlc3QgY2FsY3VsYXRlZCBhcyBhbiBhYnNvbHV0ZSB2YWx1ZSwKYW5kIHRoZSBzaWduIHVzZWQgdG8gY2hvb3NlIHRvIGFkZCBvciBzdWJ0cmFjdC4gIE5vdGljZSB0aGUgc3VtCmhpZ2goeDAqeTApK2xvdyh4MSp5MSkgb2NjdXJzIHR3aWNlLCBzbyBpdCdzIHBvc3NpYmxlIHRvIGRvIDUqayBsaW1iCmFkZGl0aW9ucywgcmF0aGVyIHRoYW4gNiprLCBidXQgaW4gR01QIGV4dHJhIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWRzCm91dHdlaWdoIHRoZSBzYXZpbmcuCgogICBTcXVhcmluZyBpcyBzaW1pbGFyIHRvIG11bHRpcGx5aW5nLCBidXQgd2l0aCB4PXkgdGhlIGZvcm11bGEgcmVkdWNlcwp0byBhbiBlcXVpdmFsZW50IHdpdGggdGhyZWUgc3F1YXJlcywKCiAgICAgeF4yID0gKGJeMitiKSp4MV4yIC0gYiooeDEteDApXjIgKyAoYisxKSp4MF4yCgogICBUaGUgZmluYWwgcmVzdWx0IGlzIGFjY3VtdWxhdGVkIGZyb20gdGhvc2UgdGhyZWUgc3F1YXJlcyB0aGUgc2FtZQp3YXkgYXMgZm9yIHRoZSB0aHJlZSBtdWx0aXBsaWVzIGFib3ZlLiAgVGhlIG1pZGRsZSB0ZXJtICh4MS14MCleMiBpcyBub3cKYWx3YXlzIHBvc2l0aXZlLgoKICAgQSBzaW1pbGFyIGZvcm11bGEgZm9yIGJvdGggbXVsdGlwbHlpbmcgYW5kIHNxdWFyaW5nIGNhbiBiZQpjb25zdHJ1Y3RlZCB3aXRoIGEgbWlkZGxlIHRlcm0gKHgxK3gwKSooeTEreTApLiAgQnV0IHRob3NlIHN1bXMgY2FuCmV4Y2VlZCBrIGxpbWJzLCBsZWFkaW5nIHRvIG1vcmUgY2FycnkgaGFuZGxpbmcgYW5kIGFkZGl0aW9ucyB0aGFuIHRoZQpmb3JtIGFib3ZlLgoKICAgS2FyYXRzdWJhIG11bHRpcGxpY2F0aW9uIGlzIGFzeW1wdG90aWNhbGx5IGFuIE8oTl4xLjU4NSkgYWxnb3JpdGhtLAp0aGUgZXhwb25lbnQgYmVpbmcgbG9nKDMpL2xvZygyKSwgcmVwcmVzZW50aW5nIDMgbXVsdGlwbGllcyBlYWNoIDEvMgp0aGUgc2l6ZSBvZiB0aGUgaW5wdXRzLiAgVGhpcyBpcyBhIGJpZyBpbXByb3ZlbWVudCBvdmVyIHRoZSBiYXNlY2FzZQptdWx0aXBseSBhdCBPKE5eMikgYW5kIHRoZSBhZHZhbnRhZ2Ugc29vbiBvdmVyY29tZXMgdGhlIGV4dHJhIGFkZGl0aW9ucwpLYXJhdHN1YmEgcGVyZm9ybXMuICBgTVVMX1RPT00yMl9USFJFU0hPTEQnIGNhbiBiZSBhcyBsaXR0bGUgYXMgMTAKbGltYnMuICBUaGUgYFNRUicgdGhyZXNob2xkIGlzIHVzdWFsbHkgYWJvdXQgdHdpY2UgdGhlIGBNVUwnLgoKICAgVGhlIGJhc2VjYXNlIGFsZ29yaXRobSB3aWxsIHRha2UgYSB0aW1lIG9mIHRoZSBmb3JtIE0oTikgPSBhKk5eMiArCmIqTiArIGMgYW5kIHRoZSBLYXJhdHN1YmEgYWxnb3JpdGhtIEsoTikgPSAzKk0oTi8yKSArIGQqTiArIGUsIHdoaWNoCmV4cGFuZHMgdG8gSyhOKSA9IDMvNCphKk5eMiArIDMvMipiKk4gKyAzKmMgKyBkKk4gKyBlLiAgVGhlIGZhY3RvciAzLzQKZm9yIGEgbWVhbnMgcGVyLWNyb3NzcHJvZHVjdCBzcGVlZHVwcyBpbiB0aGUgYmFzZWNhc2UgY29kZSB3aWxsCmluY3JlYXNlIHRoZSB0aHJlc2hvbGQgc2luY2UgdGhleSBiZW5lZml0IE0oTikgbW9yZSB0aGFuIEsoTikuICBBbmQKY29udmVyc2VseSB0aGUgMy8yIGZvciBiIG1lYW5zIGxpbmVhciBzdHlsZSBzcGVlZHVwcyBvZiBiIHdpbGwgaW5jcmVhc2UKdGhlIHRocmVzaG9sZCBzaW5jZSB0aGV5IGJlbmVmaXQgSyhOKSBtb3JlIHRoYW4gTShOKS4gIFRoZSBsYXR0ZXIgY2FuCmJlIHNlZW4gZm9yIGluc3RhbmNlIHdoZW4gYWRkaW5nIGFuIG9wdGltaXplZCBgbXBuX3Nxcl9kaWFnb25hbCcgdG8KYG1wbl9zcXJfYmFzZWNhc2UnLiAgT2YgY291cnNlIGFsbCBzcGVlZHVwcyByZWR1Y2UgdG90YWwgdGltZSwgYW5kIGluCnRoYXQgc2Vuc2UgdGhlIGFsZ29yaXRobSB0aHJlc2hvbGRzIGFyZSBtZXJlbHkgb2YgYWNhZGVtaWMgaW50ZXJlc3QuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogVG9vbSAzLVdheSBNdWx0aXBsaWNhdGlvbiwgIE5leHQ6IFRvb20gNC1XYXkgTXVsdGlwbGljYXRpb24sICBQcmV2OiBLYXJhdHN1YmEgTXVsdGlwbGljYXRpb24sICBVcDogTXVsdGlwbGljYXRpb24gQWxnb3JpdGhtcwoKMTUuMS4zIFRvb20gMy1XYXkgTXVsdGlwbGljYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoZSBLYXJhdHN1YmEgZm9ybXVsYSBpcyB0aGUgc2ltcGxlc3QgY2FzZSBvZiBhIGdlbmVyYWwgYXBwcm9hY2ggdG8Kc3BsaXR0aW5nIGlucHV0cyB0aGF0IGxlYWRzIHRvIGJvdGggVG9vbSBhbmQgRkZUIGFsZ29yaXRobXMuICBBCmRlc2NyaXB0aW9uIG9mIFRvb20gY2FuIGJlIGZvdW5kIGluIEtudXRoIHNlY3Rpb24gNC4zLjMsIHdpdGggYW4KZXhhbXBsZSAzLXdheSBjYWxjdWxhdGlvbiBhZnRlciBUaGVvcmVtIEEuICBUaGUgMy13YXkgZm9ybSB1c2VkIGluIEdNUAppcyBkZXNjcmliZWQgaGVyZS4KCiAgIFRoZSBvcGVyYW5kcyBhcmUgZWFjaCBjb25zaWRlcmVkIHNwbGl0IGludG8gMyBwaWVjZXMgb2YgZXF1YWwgbGVuZ3RoCihvciB0aGUgbW9zdCBzaWduaWZpY2FudCBwYXJ0IDEgb3IgMiBsaW1icyBzaG9ydGVyIHRoYW4gdGhlIG90aGVyIHR3bykuCgogICAgICBoaWdoICAgICAgICAgICAgICAgICAgICAgICAgIGxvdwogICAgICstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKICAgICB8ICAgIHgyICAgIHwgICAgeDEgICAgfCAgICB4MCAgICB8CiAgICAgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKwoKICAgICArLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rCiAgICAgfCAgICB5MiAgICB8ICAgIHkxICAgIHwgICAgeTAgICAgfAogICAgICstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKClRoZXNlIHBhcnRzIGFyZSB0cmVhdGVkIGFzIHRoZSBjb2VmZmljaWVudHMgb2YgdHdvIHBvbHlub21pYWxzCgogICAgIFgodCkgPSB4Mip0XjIgKyB4MSp0ICsgeDAKICAgICBZKHQpID0geTIqdF4yICsgeTEqdCArIHkwCgogICBMZXQgYiBlcXVhbCB0aGUgcG93ZXIgb2YgMiB3aGljaCBpcyB0aGUgc2l6ZSBvZiB0aGUgeDAsIHgxLCB5MCBhbmQKeTEgcGllY2VzLCBpLmUuIGlmIHRoZXkncmUgayBsaW1icyBlYWNoIHRoZW4gYj0yXihrKm1wX2JpdHNfcGVyX2xpbWIpLgpXaXRoIHRoaXMgeD1YKGIpIGFuZCB5PVkoYikuCgogICBMZXQgYSBwb2x5bm9taWFsIFcodCk9WCh0KSpZKHQpIGFuZCBzdXBwb3NlIGl0cyBjb2VmZmljaWVudHMgYXJlCgogICAgIFcodCkgPSB3NCp0XjQgKyB3Myp0XjMgKyB3Mip0XjIgKyB3MSp0ICsgdzAKCiAgIFRoZSB3W2ldIGFyZSBnb2luZyB0byBiZSBkZXRlcm1pbmVkLCBhbmQgd2hlbiB0aGV5IGFyZSB0aGV5J2xsIGdpdmUKdGhlIGZpbmFsIHJlc3VsdCB1c2luZyB3PVcoYiksIHNpbmNlIHgqeT1YKGIpKlkoYik9VyhiKS4gIFRoZQpjb2VmZmljaWVudHMgd2lsbCBiZSByb3VnaGx5IGJeMiBlYWNoLCBhbmQgdGhlIGZpbmFsIFcoYikgd2lsbCBiZSBhbgphZGRpdGlvbiBsaWtlLAoKICAgICAgaGlnaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3cKICAgICArLS0tLS0tLSstLS0tLS0tKwogICAgIHwgICAgICAgdzQgICAgICB8CiAgICAgKy0tLS0tLS0rLS0tLS0tLSsKICAgICAgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0rCiAgICAgICAgICAgIHwgICAgICAgIHczICAgICAgfAogICAgICAgICAgICArLS0tLS0tLS0rLS0tLS0tLSsKICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0rLS0tLS0tLSsKICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB3MiAgICAgIHwKICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0rLS0tLS0tLSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLSstLS0tLS0tKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgdzEgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0rLS0tLS0tLSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKy0tLS0tLS0rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHcwICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rLS0tLS0tLSsKCiAgIFRoZSB3W2ldIGNvZWZmaWNpZW50cyBjb3VsZCBiZSBmb3JtZWQgYnkgYSBzaW1wbGUgc2V0IG9mIGNyb3NzCnByb2R1Y3RzLCBsaWtlIHc0PXgyKnkyLCB3Mz14Mip5MSt4MSp5MiwgdzI9eDIqeTAreDEqeTEreDAqeTIgZXRjLCBidXQKdGhpcyB3b3VsZCBuZWVkIGFsbCBuaW5lIHhbaV0qeVtqXSBmb3IgaSxqPTAsMSwyLCBhbmQgd291bGQgYmUKZXF1aXZhbGVudCBtZXJlbHkgdG8gYSBiYXNlY2FzZSBtdWx0aXBseS4gIEluc3RlYWQgdGhlIGZvbGxvd2luZwphcHByb2FjaCBpcyB1c2VkLgoKICAgWCh0KSBhbmQgWSh0KSBhcmUgZXZhbHVhdGVkIGFuZCBtdWx0aXBsaWVkIGF0IDUgcG9pbnRzLCBnaXZpbmcKdmFsdWVzIG9mIFcodCkgYXQgdGhvc2UgcG9pbnRzLiAgSW4gR01QIHRoZSBmb2xsb3dpbmcgcG9pbnRzIGFyZSB1c2VkLAoKICAgICBQb2ludCAgICBWYWx1ZQogICAgIHQ9MCAgICAgIHgwICogeTAsIHdoaWNoIGdpdmVzIHcwIGltbWVkaWF0ZWx5CiAgICAgdD0xICAgICAgKHgyK3gxK3gwKSAqICh5Mit5MSt5MCkKICAgICB0PS0xICAgICAoeDIteDEreDApICogKHkyLXkxK3kwKQogICAgIHQ9MiAgICAgICg0KngyKzIqeDEreDApICogKDQqeTIrMip5MSt5MCkKICAgICB0PWluZiAgICB4MiAqIHkyLCB3aGljaCBnaXZlcyB3NCBpbW1lZGlhdGVseQoKICAgQXQgdD0tMSB0aGUgdmFsdWVzIGNhbiBiZSBuZWdhdGl2ZSBhbmQgdGhhdCdzIGhhbmRsZWQgdXNpbmcgdGhlCmFic29sdXRlIHZhbHVlcyBhbmQgdHJhY2tpbmcgdGhlIHNpZ24gc2VwYXJhdGVseS4gIEF0IHQ9aW5mIHRoZSB2YWx1ZQppcyBhY3R1YWxseSBYKHQpKlkodCkvdF40IGluIHRoZSBsaW1pdCBhcyB0IGFwcHJvYWNoZXMgaW5maW5pdHksIGJ1dAppdCdzIG11Y2ggZWFzaWVyIHRvIHRoaW5rIG9mIGFzIHNpbXBseSB4Mip5MiBnaXZpbmcgdzQgaW1tZWRpYXRlbHkKKG11Y2ggbGlrZSB4MCp5MCBhdCB0PTAgZ2l2ZXMgdzAgaW1tZWRpYXRlbHkpLgoKICAgRWFjaCBvZiB0aGUgcG9pbnRzIHN1YnN0aXR1dGVkIGludG8gVyh0KT13NCp0XjQrLi4uK3cwIGdpdmVzIGEKbGluZWFyIGNvbWJpbmF0aW9uIG9mIHRoZSB3W2ldIGNvZWZmaWNpZW50cywgYW5kIHRoZSB2YWx1ZSBvZiB0aG9zZQpjb21iaW5hdGlvbnMgaGFzIGp1c3QgYmVlbiBjYWxjdWxhdGVkLgoKICAgICBXKDApICAgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcwCiAgICAgVygxKSAgID0gICAgdzQgKyAgIHczICsgICB3MiArICAgdzEgKyB3MAogICAgIFcoLTEpICA9ICAgIHc0IC0gICB3MyArICAgdzIgLSAgIHcxICsgdzAKICAgICBXKDIpICAgPSAxNip3NCArIDgqdzMgKyA0KncyICsgMip3MSArIHcwCiAgICAgVyhpbmYpID0gICAgdzQKCiAgIFRoaXMgaXMgYSBzZXQgb2YgZml2ZSBlcXVhdGlvbnMgaW4gZml2ZSB1bmtub3ducywgYW5kIHNvbWUKZWxlbWVudGFyeSBsaW5lYXIgYWxnZWJyYSBxdWlja2x5IGlzb2xhdGVzIGVhY2ggd1tpXS4gIFRoaXMgaW52b2x2ZXMKYWRkaW5nIG9yIHN1YnRyYWN0aW5nIG9uZSBXKHQpIHZhbHVlIGZyb20gYW5vdGhlciwgYW5kIGEgY291cGxlIG9mCmRpdmlzaW9ucyBieSBwb3dlcnMgb2YgMiBhbmQgb25lIGRpdmlzaW9uIGJ5IDMsIHRoZSBsYXR0ZXIgdXNpbmcgdGhlCnNwZWNpYWwgYG1wbl9kaXZleGFjdF9ieTMnICgqbm90ZSBFeGFjdCBEaXZpc2lvbjo6KS4KCiAgIFRoZSBjb252ZXJzaW9uIG9mIFcodCkgdmFsdWVzIHRvIHRoZSBjb2VmZmljaWVudHMgaXMgaW50ZXJwb2xhdGlvbi4KQSBwb2x5bm9taWFsIG9mIGRlZ3JlZSA0IGxpa2UgVyh0KSBpcyB1bmlxdWVseSBkZXRlcm1pbmVkIGJ5IHZhbHVlcwprbm93biBhdCA1IGRpZmZlcmVudCBwb2ludHMuICBUaGUgcG9pbnRzIGFyZSBhcmJpdHJhcnkgYW5kIGNhbiBiZQpjaG9zZW4gdG8gbWFrZSB0aGUgbGluZWFyIGVxdWF0aW9ucyBjb21lIG91dCB3aXRoIGEgY29udmVuaWVudCBzZXQgb2YKc3RlcHMgZm9yIHF1aWNrbHkgaXNvbGF0aW5nIHRoZSB3W2ldLgoKICAgU3F1YXJpbmcgZm9sbG93cyB0aGUgc2FtZSBwcm9jZWR1cmUgYXMgbXVsdGlwbGljYXRpb24sIGJ1dCB0aGVyZSdzCm9ubHkgb25lIFgodCkgYW5kIGl0J3MgZXZhbHVhdGVkIGF0IHRoZSA1IHBvaW50cywgYW5kIHRob3NlIHZhbHVlcwpzcXVhcmVkIHRvIGdpdmUgdmFsdWVzIG9mIFcodCkuICBUaGUgaW50ZXJwb2xhdGlvbiBpcyB0aGVuIGlkZW50aWNhbCwKYW5kIGluIGZhY3QgdGhlIHNhbWUgYHRvb21faW50ZXJwb2xhdGVfNXB0cycgc3Vicm91dGluZSBpcyB1c2VkIGZvcgpib3RoIHNxdWFyaW5nIGFuZCBtdWx0aXBseWluZy4KCiAgIFRvb20tMyBpcyBhc3ltcHRvdGljYWxseSBPKE5eMS40NjUpLCB0aGUgZXhwb25lbnQgYmVpbmcKbG9nKDUpL2xvZygzKSwgcmVwcmVzZW50aW5nIDUgcmVjdXJzaXZlIG11bHRpcGxpZXMgb2YgMS8zIHRoZSBvcmlnaW5hbApzaXplIGVhY2guICBUaGlzIGlzIGFuIGltcHJvdmVtZW50IG92ZXIgS2FyYXRzdWJhIGF0IE8oTl4xLjU4NSksIHRob3VnaApUb29tIGRvZXMgbW9yZSB3b3JrIGluIHRoZSBldmFsdWF0aW9uIGFuZCBpbnRlcnBvbGF0aW9uIGFuZCBzbyBpdCBvbmx5CnJlYWxpemVzIGl0cyBhZHZhbnRhZ2UgYWJvdmUgYSBjZXJ0YWluIHNpemUuCgogICBOZWFyIHRoZSBjcm9zc292ZXIgYmV0d2VlbiBUb29tLTMgYW5kIEthcmF0c3ViYSB0aGVyZSdzIGdlbmVyYWxseSBhCnJhbmdlIG9mIHNpemVzIHdoZXJlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBpcyBzbWFsbC4KYE1VTF9UT09NMzNfVEhSRVNIT0xEJyBpcyBhIHNvbWV3aGF0IGFyYml0cmFyeSBwb2ludCBpbiB0aGF0IHJhbmdlIGFuZApzdWNjZXNzaXZlIHJ1bnMgb2YgdGhlIHR1bmUgcHJvZ3JhbSBjYW4gZ2l2ZSBkaWZmZXJlbnQgdmFsdWVzIGR1ZSB0bwpzbWFsbCB2YXJpYXRpb25zIGluIG1lYXN1cmluZy4gIEEgZ3JhcGggb2YgdGltZSB2ZXJzdXMgc2l6ZSBmb3IgdGhlIHR3bwpzaG93cyB0aGUgZWZmZWN0LCBzZWUgYHR1bmUvUkVBRE1FJy4KCiAgIEF0IHRoZSBmYWlybHkgc21hbGwgc2l6ZXMgd2hlcmUgdGhlIFRvb20tMyB0aHJlc2hvbGRzIG9jY3VyIGl0J3MKd29ydGggcmVtZW1iZXJpbmcgdGhhdCB0aGUgYXN5bXB0b3RpYyBiZWhhdmlvdXIgZm9yIEthcmF0c3ViYSBhbmQKVG9vbS0zIGNhbid0IGJlIGV4cGVjdGVkIHRvIG1ha2UgYWNjdXJhdGUgcHJlZGljdGlvbnMsIGR1ZSBvZiBjb3Vyc2UgdG8KdGhlIGJpZyBpbmZsdWVuY2Ugb2YgYWxsIHNvcnRzIG9mIG92ZXJoZWFkcywgYW5kIHRoZSBmYWN0IHRoYXQgb25seSBhCmZldyByZWN1cnNpb25zIG9mIGVhY2ggYXJlIGJlaW5nIHBlcmZvcm1lZC4gIEV2ZW4gYXQgbGFyZ2Ugc2l6ZXMKdGhlcmUncyBhIGdvb2QgY2hhbmNlIG1hY2hpbmUgZGVwZW5kZW50IGVmZmVjdHMgbGlrZSBjYWNoZSBhcmNoaXRlY3R1cmUKd2lsbCBtZWFuIGFjdHVhbCBwZXJmb3JtYW5jZSBkZXZpYXRlcyBmcm9tIHdoYXQgbWlnaHQgYmUgcHJlZGljdGVkLgoKICAgVGhlIGZvcm11bGEgZ2l2ZW4gZm9yIHRoZSBLYXJhdHN1YmEgYWxnb3JpdGhtICgqbm90ZSBLYXJhdHN1YmEKTXVsdGlwbGljYXRpb246OikgaGFzIGFuIGVxdWl2YWxlbnQgZm9yIFRvb20tMyBpbnZvbHZpbmcgb25seSBmaXZlCm11bHRpcGxpZXMsIGJ1dCB0aGlzIHdvdWxkIGJlIGNvbXBsaWNhdGVkIGFuZCB1bmVubGlnaHRlbmluZy4KCiAgIEFuIGFsdGVybmF0ZSB2aWV3IG9mIFRvb20tMyBjYW4gYmUgZm91bmQgaW4gWnVyYXMgKCpub3RlClJlZmVyZW5jZXM6OiksIHVzaW5nIGEgdmVjdG9yIHRvIHJlcHJlc2VudCB0aGUgeCBhbmQgeSBzcGxpdHMgYW5kIGEKbWF0cml4IG11bHRpcGxpY2F0aW9uIGZvciB0aGUgZXZhbHVhdGlvbiBhbmQgaW50ZXJwb2xhdGlvbiBzdGFnZXMuICBUaGUKbWF0cml4IGludmVyc2VzIGFyZSBub3QgbWVhbnQgdG8gYmUgYWN0dWFsbHkgdXNlZCwgYW5kIHRoZXkgaGF2ZQplbGVtZW50cyB3aXRoIHZhbHVlcyBtdWNoIGdyZWF0ZXIgdGhhbiBpbiBmYWN0IGFyaXNlIGluIHRoZQppbnRlcnBvbGF0aW9uIHN0ZXBzLiAgVGhlIGRpYWdyYW0gc2hvd24gZm9yIHRoZSAzLXdheSBpcyBhdHRyYWN0aXZlLApidXQgYWdhaW4gZG9lc24ndCBoYXZlIHRvIGJlIGltcGxlbWVudGVkIHRoYXQgd2F5IGFuZCBmb3IgZXhhbXBsZSB3aXRoCmEgYml0IG9mIHJlYXJyYW5nZW1lbnQganVzdCBvbmUgZGl2aXNpb24gYnkgNiBjYW4gYmUgZG9uZS4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBUb29tIDQtV2F5IE11bHRpcGxpY2F0aW9uLCAgTmV4dDogSGlnaGVyIGRlZ3JlZSBUb29tJ24naGFsZiwgIFByZXY6IFRvb20gMy1XYXkgTXVsdGlwbGljYXRpb24sICBVcDogTXVsdGlwbGljYXRpb24gQWxnb3JpdGhtcwoKMTUuMS40IFRvb20gNC1XYXkgTXVsdGlwbGljYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkthcmF0c3ViYSBhbmQgVG9vbS0zIHNwbGl0IHRoZSBvcGVyYW5kcyBpbnRvIDIgYW5kIDMgY29lZmZpY2llbnRzLApyZXNwZWN0aXZlbHkuICBUb29tLTQgYW5hbG9nb3VzbHkgc3BsaXRzIHRoZSBvcGVyYW5kcyBpbnRvIDQKY29lZmZpY2llbnRzLiAgVXNpbmcgdGhlIG5vdGF0aW9uIGZyb20gdGhlIHNlY3Rpb24gb24gVG9vbS0zCm11bHRpcGxpY2F0aW9uLCB3ZSBmb3JtIHR3byBwb2x5bm9taWFsczoKCiAgICAgWCh0KSA9IHgzKnReMyArIHgyKnReMiArIHgxKnQgKyB4MAogICAgIFkodCkgPSB5Myp0XjMgKyB5Mip0XjIgKyB5MSp0ICsgeTAKCiAgIFgodCkgYW5kIFkodCkgYXJlIGV2YWx1YXRlZCBhbmQgbXVsdGlwbGllZCBhdCA3IHBvaW50cywgZ2l2aW5nCnZhbHVlcyBvZiBXKHQpIGF0IHRob3NlIHBvaW50cy4gIEluIEdNUCB0aGUgZm9sbG93aW5nIHBvaW50cyBhcmUgdXNlZCwKCiAgICAgUG9pbnQgICAgVmFsdWUKICAgICB0PTAgICAgICB4MCAqIHkwLCB3aGljaCBnaXZlcyB3MCBpbW1lZGlhdGVseQogICAgIHQ9MS8yICAgICh4MysyKngyKzQqeDErOCp4MCkgKiAoeTMrMip5Mis0KnkxKzgqeTApCiAgICAgdD0tMS8yICAgKC14MysyKngyLTQqeDErOCp4MCkgKiAoLXkzKzIqeTItNCp5MSs4KnkwKQogICAgIHQ9MSAgICAgICh4Myt4Mit4MSt4MCkgKiAoeTMreTIreTEreTApCiAgICAgdD0tMSAgICAgKC14Myt4Mi14MSt4MCkgKiAoLXkzK3kyLXkxK3kwKQogICAgIHQ9MiAgICAgICg4KngzKzQqeDIrMip4MSt4MCkgKiAoOCp5Mys0KnkyKzIqeTEreTApCiAgICAgdD1pbmYgICAgeDMgKiB5Mywgd2hpY2ggZ2l2ZXMgdzYgaW1tZWRpYXRlbHkKCiAgIFRoZSBudW1iZXIgb2YgYWRkaXRpb25zIGFuZCBzdWJ0cmFjdGlvbnMgZm9yIFRvb20tNCBpcyBtdWNoIGxhcmdlcgp0aGFuIGZvciBUb29tLTMuICBCdXQgc2V2ZXJhbCBzdWJleHByZXNzaW9ucyBvY2N1ciBtdWx0aXBsZSB0aW1lcywgZm9yCmV4YW1wbGUgeDIreDAsIG9jY3VycyBmb3IgYm90aCB0PTEgYW5kIHQ9LTEuCgogICBUb29tLTQgaXMgYXN5bXB0b3RpY2FsbHkgTyhOXjEuNDA0KSwgdGhlIGV4cG9uZW50IGJlaW5nCmxvZyg3KS9sb2coNCksIHJlcHJlc2VudGluZyA3IHJlY3Vyc2l2ZSBtdWx0aXBsaWVzIG9mIDEvNCB0aGUgb3JpZ2luYWwKc2l6ZSBlYWNoLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEhpZ2hlciBkZWdyZWUgVG9vbSduJ2hhbGYsICBOZXh0OiBGRlQgTXVsdGlwbGljYXRpb24sICBQcmV2OiBUb29tIDQtV2F5IE11bHRpcGxpY2F0aW9uLCAgVXA6IE11bHRpcGxpY2F0aW9uIEFsZ29yaXRobXMKCjE1LjEuNSBIaWdoZXIgZGVncmVlIFRvb20nbidoYWxmCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGUgVG9vbSBhbGdvcml0aG1zIGRlc2NyaWJlZCBhYm92ZSAoKm5vdGUgVG9vbSAzLVdheSBNdWx0aXBsaWNhdGlvbjo6LAoqbm90ZSBUb29tIDQtV2F5IE11bHRpcGxpY2F0aW9uOjopIGdlbmVyYWxpemVzIHRvIHNwbGl0IGludG8gYW4KYXJiaXRyYXJ5IG51bWJlciBvZiBwaWVjZXMuIEluIGdlbmVyYWwgYSBzcGxpdCBvZiB0d28gZXF1YWxseSBsb25nCm9wZXJhbmRzIGludG8gciBwaWVjZXMgbGVhZHMgdG8gZXZhbHVhdGlvbnMgYW5kIHBvaW50d2lzZQptdWx0aXBsaWNhdGlvbnMgZG9uZSBhdCAyKnItMSBwb2ludHMuIFRvIGZ1bGx5IGV4cGxvaXQgc3ltbWV0cmllcyBpdAp3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBhIG11bHRpcGxlIG9mIDQgcG9pbnRzLCB0aGF0J3Mgd2h5IGZvciBoaWdoZXIKZGVncmVlIFRvb20nbidoYWxmIGlzIHVzZWQuCgogICBUb29tJ24naGFsZiBtZWFucyB0aGF0IHRoZSBleGlzdGVuY2Ugb2Ygb25lIG1vcmUgcGllY2UgaXMgY29uc2lkZXJlZApmb3IgYSBzaW5nbGUgb3BlcmFuZC4gSXQgY2FuIGJlIHZpcnR1YWwsIGkuZS4gemVybywgb3IgcmVhbCwgd2hlbiB0aGUKdHdvIG9wZXJhbmQgYXJlIG5vdCBleGFjdGx5IGJhbGFuY2VkLiBCeSBjaG9vc2luZyBhbiBldmVuIHIsIFRvb20tcisxLzIKcmVxdWlyZXMgMnIgcG9pbnRzLCBhIG11bHRpcGxlIG9mIGZvdXIuCgogICBUaGUgZm91ci1wbGV0cyBvZiBwb2ludHMgaW5jbHVkZSAwLCBpbmYsICsxLCAtMSBhbmQgKy0yXmksICstMl4taSAuCkVhY2ggb2YgdGhlbSBnaXZpbmcgc2hvcnRjdXRzIGZvciB0aGUgZXZhbHVhdGlvbiBwaGFzZSBhbmQgZm9yIHNvbWUKc3RlcHMgaW4gdGhlIGludGVycG9sYXRpb24gcGhhc2UuIEZ1cnRoZXIgdHJpY2tzIGFyZSB1c2VkIHRvIHJlZHVjZSB0aGUKbWVtb3J5IGZvb3RwcmludCBvZiB0aGUgd2hvbGUgbXVsdGlwbGljYXRpb24gYWxnb3JpdGhtIHRvIGEgbWVtb3J5CmJ1ZmZlciBlcXVhbmwgaW4gc2l6ZSB0byB0aGUgcmVzdWx0IG9mIHRoZSBwcm9kdWN0LgoKICAgQ3VycmVudCBHTVAgdXNlcyBib3RoIFRvb20tNiduJ2hhbGYgYW5kIFRvb20tOCduJ2hhbGYuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogRkZUIE11bHRpcGxpY2F0aW9uLCAgTmV4dDogT3RoZXIgTXVsdGlwbGljYXRpb24sICBQcmV2OiBIaWdoZXIgZGVncmVlIFRvb20nbidoYWxmLCAgVXA6IE11bHRpcGxpY2F0aW9uIEFsZ29yaXRobXMKCjE1LjEuNiBGRlQgTXVsdGlwbGljYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQXQgbGFyZ2UgdG8gdmVyeSBsYXJnZSBzaXplcyBhIEZlcm1hdCBzdHlsZSBGRlQgbXVsdGlwbGljYXRpb24gaXMgdXNlZCwKZm9sbG93aW5nIFNjaPZuaGFnZSBhbmQgU3RyYXNzZW4gKCpub3RlIFJlZmVyZW5jZXM6OikuICBEZXNjcmlwdGlvbnMgb2YKRkZUcyBpbiB2YXJpb3VzIGZvcm1zIGNhbiBiZSBmb3VuZCBpbiBtYW55IHRleHRib29rcywgZm9yIGluc3RhbmNlCktudXRoIHNlY3Rpb24gNC4zLjMgcGFydCBDIG9yIExpcHNvbiBjaGFwdGVyIElYLiAgQSBicmllZiBkZXNjcmlwdGlvbgpvZiB0aGUgZm9ybSB1c2VkIGluIEdNUCBpcyBnaXZlbiBoZXJlLgoKICAgVGhlIG11bHRpcGxpY2F0aW9uIGRvbmUgaXMgeCp5IG1vZCAyXk4rMSwgZm9yIGEgZ2l2ZW4gTi4gIEEgZnVsbApwcm9kdWN0IHgqeSBpcyBvYnRhaW5lZCBieSBjaG9vc2luZyBOPj1iaXRzKHgpK2JpdHMoeSkgYW5kIHBhZGRpbmcgeAphbmQgeSB3aXRoIGhpZ2ggemVybyBsaW1icy4gIFRoZSBtb2R1bGFyIHByb2R1Y3QgaXMgdGhlIG5hdGl2ZSBmb3JtIGZvcgp0aGUgYWxnb3JpdGhtLCBzbyBwYWRkaW5nIHRvIGdldCBhIGZ1bGwgcHJvZHVjdCBpcyB1bmF2b2lkYWJsZS4KCiAgIFRoZSBhbGdvcml0aG0gZm9sbG93cyBhIHNwbGl0LCBldmFsdWF0ZSwgcG9pbnR3aXNlIG11bHRpcGx5LAppbnRlcnBvbGF0ZSBhbmQgY29tYmluZSBzaW1pbGFyIHRvIHRoYXQgZGVzY3JpYmVkIGFib3ZlIGZvciBLYXJhdHN1YmEKYW5kIFRvb20tMy4gIEEgayBwYXJhbWV0ZXIgY29udHJvbHMgdGhlIHNwbGl0LCB3aXRoIGFuIEZGVC1rIHNwbGl0dGluZwppbnRvIDJeayBwaWVjZXMgb2YgTT1OLzJeayBiaXRzIGVhY2guICBOIG11c3QgYmUgYSBtdWx0aXBsZSBvZgooMl5rKSptcF9iaXRzX3Blcl9saW1iIHNvIHRoZSBzcGxpdCBmYWxscyBvbiBsaW1iIGJvdW5kYXJpZXMsIGF2b2lkaW5nCmJpdCBzaGlmdHMgaW4gdGhlIHNwbGl0IGFuZCBjb21iaW5lIHN0YWdlcy4KCiAgIFRoZSBldmFsdWF0aW9ucywgcG9pbnR3aXNlIG11bHRpcGxpY2F0aW9ucywgYW5kIGludGVycG9sYXRpb24sIGFyZQphbGwgZG9uZSBtb2R1bG8gMl5OJysxIHdoZXJlIE4nIGlzIDJNK2srMyByb3VuZGVkIHVwIHRvIGEgbXVsdGlwbGUgb2YKMl5rIGFuZCBvZiBgbXBfYml0c19wZXJfbGltYicuICBUaGUgcmVzdWx0cyBvZiBpbnRlcnBvbGF0aW9uIHdpbGwgYmUKdGhlIGZvbGxvd2luZyBuZWdhY3ljbGljIGNvbnZvbHV0aW9uIG9mIHRoZSBpbnB1dCBwaWVjZXMsIGFuZCB0aGUKY2hvaWNlIG9mIE4nIGVuc3VyZXMgdGhlc2Ugc3VtcyBhcmVuJ3QgdHJ1bmNhdGVkLgoKICAgICAgICAgICAgICAgIC0tLQogICAgICAgICAgICAgICAgXCAgICAgICAgIGIKICAgICB3W25dID0gICAgIC8gICAgICgtMSkgKiB4W2ldICogeVtqXQogICAgICAgICAgICAgICAgLS0tCiAgICAgICAgICAgIGkraj09YioyXmsrbgogICAgICAgICAgICAgICBiPTAsMQoKICAgVGhlIHBvaW50cyB1c2VkIGZvciB0aGUgZXZhbHVhdGlvbiBhcmUgZ15pIGZvciBpPTAgdG8gMl5rLTEgd2hlcmUKZz0yXigyTicvMl5rKS4gIGcgaXMgYSAyXmsndGggcm9vdCBvZiB1bml0eSBtb2QgMl5OJysxLCB3aGljaCBwcm9kdWNlcwpuZWNlc3NhcnkgY2FuY2VsbGF0aW9ucyBhdCB0aGUgaW50ZXJwb2xhdGlvbiBzdGFnZSwgYW5kIGl0J3MgYWxzbyBhCnBvd2VyIG9mIDIgc28gdGhlIGZhc3QgRm91cmllciB0cmFuc2Zvcm1zIHVzZWQgZm9yIHRoZSBldmFsdWF0aW9uIGFuZAppbnRlcnBvbGF0aW9uIGRvIG9ubHkgc2hpZnRzLCBhZGRzIGFuZCBuZWdhdGlvbnMuCgogICBUaGUgcG9pbnR3aXNlIG11bHRpcGxpY2F0aW9ucyBhcmUgZG9uZSBtb2R1bG8gMl5OJysxIGFuZCBlaXRoZXIKcmVjdXJzZSBpbnRvIGEgZnVydGhlciBGRlQgb3IgdXNlIGEgcGxhaW4gbXVsdGlwbGljYXRpb24gKFRvb20tMywKS2FyYXRzdWJhIG9yIGJhc2VjYXNlKSwgd2hpY2hldmVyIGlzIG9wdGltYWwgYXQgdGhlIHNpemUgTicuICBUaGUKaW50ZXJwb2xhdGlvbiBpcyBhbiBpbnZlcnNlIGZhc3QgRm91cmllciB0cmFuc2Zvcm0uICBUaGUgcmVzdWx0aW5nIHNldApvZiBzdW1zIG9mIHhbaV0qeVtqXSBhcmUgYWRkZWQgYXQgYXBwcm9wcmlhdGUgb2Zmc2V0cyB0byBnaXZlIHRoZSBmaW5hbApyZXN1bHQuCgogICBTcXVhcmluZyBpcyB0aGUgc2FtZSwgYnV0IHggaXMgdGhlIG9ubHkgaW5wdXQgc28gaXQncyBvbmUgdHJhbnNmb3JtCmF0IHRoZSBldmFsdWF0ZSBzdGFnZSBhbmQgdGhlIHBvaW50d2lzZSBtdWx0aXBsaWVzIGFyZSBzcXVhcmVzLiAgVGhlCmludGVycG9sYXRpb24gaXMgdGhlIHNhbWUuCgogICBGb3IgYSBtb2QgMl5OKzEgcHJvZHVjdCwgYW4gRkZULWsgaXMgYW4gTyhOXihrLyhrLTEpKSkgYWxnb3JpdGhtLAp0aGUgZXhwb25lbnQgcmVwcmVzZW50aW5nIDJeayByZWN1cnNlZCBtb2R1bGFyIG11bHRpcGxpZXMgZWFjaAoxLzJeKGstMSkgdGhlIHNpemUgb2YgdGhlIG9yaWdpbmFsLiAgRWFjaCBzdWNjZXNzaXZlIGsgaXMgYW4gYXN5bXB0b3RpYwppbXByb3ZlbWVudCwgYnV0IG92ZXJoZWFkcyBtZWFuIGVhY2ggaXMgb25seSBmYXN0ZXIgYXQgYmlnZ2VyIGFuZApiaWdnZXIgc2l6ZXMuICBJbiB0aGUgY29kZSwgYE1VTF9GRlRfVEFCTEUnIGFuZCBgU1FSX0ZGVF9UQUJMRScgYXJlIHRoZQp0aHJlc2hvbGRzIHdoZXJlIGVhY2ggayBpcyB1c2VkLiAgRWFjaCBuZXcgayBlZmZlY3RpdmVseSBzd2FwcyBzb21lCm11bHRpcGx5aW5nIGZvciBzb21lIHNoaWZ0cywgYWRkcyBhbmQgb3ZlcmhlYWRzLgoKICAgQSBtb2QgMl5OKzEgcHJvZHVjdCBjYW4gYmUgZm9ybWVkIHdpdGggYSBub3JtYWwgTnhOLT4yTiBiaXQgbXVsdGlwbHkKcGx1cyBhIHN1YnRyYWN0aW9uLCBzbyBhbiBGRlQgYW5kIFRvb20tMyBldGMgY2FuIGJlIGNvbXBhcmVkIGRpcmVjdGx5LgpBIGs9NCBGRlQgYXQgTyhOXjEuMzMzKSBjYW4gYmUgZXhwZWN0ZWQgdG8gYmUgdGhlIGZpcnN0IGZhc3RlciB0aGFuClRvb20tMyBhdCBPKE5eMS40NjUpLiAgSW4gcHJhY3RpY2UgdGhpcyBpcyB3aGF0J3MgZm91bmQsIHdpdGgKYE1VTF9GRlRfTU9ERl9USFJFU0hPTEQnIGFuZCBgU1FSX0ZGVF9NT0RGX1RIUkVTSE9MRCcgYmVpbmcgYmV0d2VlbiAzMDAKYW5kIDEwMDAgbGltYnMsIGRlcGVuZGluZyBvbiB0aGUgQ1BVLiAgU28gZmFyIGl0J3MgYmVlbiBmb3VuZCB0aGF0IG9ubHkKdmVyeSBsYXJnZSBGRlRzIHJlY3Vyc2UgaW50byBwb2ludHdpc2UgbXVsdGlwbGllcyBhYm92ZSB0aGVzZSBzaXplcy4KCiAgIFdoZW4gYW4gRkZUIGlzIHRvIGdpdmUgYSBmdWxsIHByb2R1Y3QsIHRoZSBjaGFuZ2Ugb2YgTiB0byAyTiBkb2Vzbid0CmFsdGVyIHRoZSB0aGVvcmV0aWNhbCBjb21wbGV4aXR5IGZvciBhIGdpdmVuIGssIGJ1dCBmb3IgdGhlIHB1cnBvc2VzIG9mCmNvbnNpZGVyaW5nIHdoZXJlIGFuIEZGVCBtaWdodCBiZSBmaXJzdCB1c2VkIGl0IGNhbiBiZSBhc3N1bWVkIHRoYXQgdGhlCkZGVCBpcyByZWN1cnNpbmcgaW50byBhIG5vcm1hbCBtdWx0aXBseSBhbmQgdGhhdCBvbiB0aGF0IGJhc2lzIGl0J3MKZG9pbmcgMl5rIHJlY3Vyc2VkIG11bHRpcGxpZXMgZWFjaCAxLzJeKGstMikgdGhlIHNpemUgb2YgdGhlIGlucHV0cywKbWFraW5nIGl0IE8oTl4oay8oay0yKSkpLiAgVGhpcyB3b3VsZCBtZWFuIGs9NyBhdCBPKE5eMS40KSB3b3VsZCBiZSB0aGUKZmlyc3QgRkZUIGZhc3RlciB0aGFuIFRvb20tMy4gIEluIHByYWN0aWNlIGBNVUxfRkZUX1RIUkVTSE9MRCcgYW5kCmBTUVJfRkZUX1RIUkVTSE9MRCcgaGF2ZSBiZWVuIGZvdW5kIHRvIGJlIGluIHRoZSBrPTggcmFuZ2UsIHNvbWV3aGVyZQpiZXR3ZWVuIDMwMDAgYW5kIDEwMDAwIGxpbWJzLgoKICAgVGhlIHdheSBOIGlzIHNwbGl0IGludG8gMl5rIHBpZWNlcyBhbmQgdGhlbiAyTStrKzMgaXMgcm91bmRlZCB1cCB0bwphIG11bHRpcGxlIG9mIDJeayBhbmQgYG1wX2JpdHNfcGVyX2xpbWInIG1lYW5zIHRoYXQgd2hlbgoyXms+PW1wX2JpdHNfcGVyX2xpbWIgdGhlIGVmZmVjdGl2ZSBOIGlzIGEgbXVsdGlwbGUgb2YgMl4oMmstMSkgYml0cy4KVGhlICtrKzMgbWVhbnMgc29tZSB2YWx1ZXMgb2YgTiBqdXN0IHVuZGVyIHN1Y2ggYSBtdWx0aXBsZSB3aWxsIGJlCnJvdW5kZWQgdG8gdGhlIG5leHQuICBUaGUgY29tcGxleGl0eSBjYWxjdWxhdGlvbnMgYWJvdmUgYXNzdW1lIHRoYXQgYQpmYXZvdXJhYmxlIHNpemUgaXMgdXNlZCwgbWVhbmluZyBvbmUgd2hpY2ggaXNuJ3QgcGFkZGVkIHRocm91Z2gKcm91bmRpbmcsIGFuZCBpdCdzIGFsc28gYXNzdW1lZCB0aGF0IHRoZSBleHRyYSArayszIGJpdHMgYXJlIG5lZ2xpZ2libGUKYXQgdHlwaWNhbCBGRlQgc2l6ZXMuCgogICBUaGUgcHJhY3RpY2FsIGVmZmVjdCBvZiB0aGUgMl4oMmstMSkgY29uc3RyYWludCBpcyB0byBpbnRyb2R1Y2UgYQpzdGVwLWVmZmVjdCBpbnRvIG1lYXN1cmVkIHNwZWVkcy4gIEZvciBleGFtcGxlIGs9OCB3aWxsIHJvdW5kIE4gdXAgdG8gYQptdWx0aXBsZSBvZiAzMjc2OCBiaXRzLCBzbyBmb3IgYSAzMi1iaXQgbGltYiB0aGVyZSdsbCBiZSA1MTIgbGltYgpncm91cHMgb2Ygc2l6ZXMgZm9yIHdoaWNoIGBtcG5fbXVsX24nIHJ1bnMgYXQgdGhlIHNhbWUgc3BlZWQuICBPciBmb3IKaz05IGdyb3VwcyBvZiAyMDQ4IGxpbWJzLCBrPTEwIGdyb3VwcyBvZiA4MTkyIGxpbWJzLCBldGMuICBJbiBwcmFjdGljZQppdCdzIGJlZW4gZm91bmQgZWFjaCBrIGlzIHVzZWQgYXQgcXVpdGUgc21hbGwgbXVsdGlwbGVzIG9mIGl0cyBzaXplCmNvbnN0cmFpbnQgYW5kIHNvIHRoZSBzdGVwIGVmZmVjdCBpcyBxdWl0ZSBub3RpY2VhYmxlIGluIGEgdGltZSB2ZXJzdXMKc2l6ZSBncmFwaC4KCiAgIFRoZSB0aHJlc2hvbGQgZGV0ZXJtaW5hdGlvbnMgY3VycmVudGx5IG1lYXN1cmUgYXQgdGhlIG1pZC1wb2ludHMgb2YKc2l6ZSBzdGVwcywgYnV0IHRoaXMgaXMgc3ViLW9wdGltYWwgc2luY2UgYXQgdGhlIHN0YXJ0IG9mIGEgbmV3IHN0ZXAgaXQKY2FuIGhhcHBlbiB0aGF0IGl0J3MgYmV0dGVyIHRvIGdvIGJhY2sgdG8gdGhlIHByZXZpb3VzIGsgZm9yIGEgd2hpbGUuClNvbWV0aGluZyBtb3JlIHNvcGhpc3RpY2F0ZWQgZm9yIGBNVUxfRkZUX1RBQkxFJyBhbmQgYFNRUl9GRlRfVEFCTEUnCndpbGwgYmUgbmVlZGVkLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IE90aGVyIE11bHRpcGxpY2F0aW9uLCAgTmV4dDogVW5iYWxhbmNlZCBNdWx0aXBsaWNhdGlvbiwgIFByZXY6IEZGVCBNdWx0aXBsaWNhdGlvbiwgIFVwOiBNdWx0aXBsaWNhdGlvbiBBbGdvcml0aG1zCgoxNS4xLjcgT3RoZXIgTXVsdGlwbGljYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGUgVG9vbSBhbGdvcml0aG1zIGRlc2NyaWJlZCBhYm92ZSAoKm5vdGUgVG9vbSAzLVdheSBNdWx0aXBsaWNhdGlvbjo6LAoqbm90ZSBUb29tIDQtV2F5IE11bHRpcGxpY2F0aW9uOjopIGdlbmVyYWxpemVzIHRvIHNwbGl0IGludG8gYW4KYXJiaXRyYXJ5IG51bWJlciBvZiBwaWVjZXMsIGFzIHBlciBLbnV0aCBzZWN0aW9uIDQuMy4zIGFsZ29yaXRobSBDLgpUaGlzIGlzIG5vdCBjdXJyZW50bHkgdXNlZC4gIFRoZSBub3RlcyBoZXJlIGFyZSBtZXJlbHkgZm9yIGludGVyZXN0LgoKICAgSW4gZ2VuZXJhbCBhIHNwbGl0IGludG8gcisxIHBpZWNlcyBpcyBtYWRlLCBhbmQgZXZhbHVhdGlvbnMgYW5kCnBvaW50d2lzZSBtdWx0aXBsaWNhdGlvbnMgZG9uZSBhdCAyKnIrMSBwb2ludHMuICBBIDQtd2F5IHNwbGl0IGRvZXMgNwpwb2ludHdpc2UgbXVsdGlwbGllcywgNS13YXkgZG9lcyA5LCBldGMuICBBc3ltcHRvdGljYWxseSBhbiAocisxKS13YXkKYWxnb3JpdGhtIGlzIE8oTl4obG9nKDIqcisxKS9sb2cocisxKSkpLiAgT25seSB0aGUgcG9pbnR3aXNlCm11bHRpcGxpY2F0aW9ucyBjb3VudCB0b3dhcmRzIGJpZy1PIGNvbXBsZXhpdHksIGJ1dCB0aGUgdGltZSBzcGVudCBpbgp0aGUgZXZhbHVhdGUgYW5kIGludGVycG9sYXRlIHN0YWdlcyBncm93cyB3aXRoIHIgYW5kIGhhcyBhIHNpZ25pZmljYW50CnByYWN0aWNhbCBpbXBhY3QsIHdpdGggdGhlIGFzeW1wdG90aWMgYWR2YW50YWdlIG9mIGVhY2ggciByZWFsaXplZCBvbmx5CmF0IGJpZ2dlciBhbmQgYmlnZ2VyIHNpemVzLiAgVGhlIG92ZXJoZWFkcyBncm93IGFzIE8oTipyKSwgd2hlcmVhcyBpbgphbiByPTJeayBGRlQgdGhleSBncm93IG9ubHkgYXMgTyhOKmxvZyhyKSkuCgogICBLbnV0aCBhbGdvcml0aG0gQyBldmFsdWF0ZXMgYXQgcG9pbnRzIDAsMSwyLC4uLiwyKnIsIGJ1dCBleGVyY2lzZSA0CnVzZXMgLXIsLi4uLDAsLi4uLHIgYW5kIHRoZSBsYXR0ZXIgc2F2ZXMgc29tZSBzbWFsbCBtdWx0aXBsaWVzIGluIHRoZQpldmFsdWF0ZSBzdGFnZSAob3IgcmF0aGVyIHRyYWRlcyB0aGVtIGZvciBhZGRpdGlvbnMpLCBhbmQgaGFzIGEgZnVydGhlcgpzYXZpbmcgb2YgbmVhcmx5IGhhbGYgdGhlIGludGVycG9sYXRlIHN0ZXBzLiAgVGhlIGlkZWEgaXMgdG8gc2VwYXJhdGUKb2RkIGFuZCBldmVuIGZpbmFsIGNvZWZmaWNpZW50cyBhbmQgdGhlbiBwZXJmb3JtIGFsZ29yaXRobSBDIHN0ZXBzIEM3CmFuZCBDOCBvbiB0aGVtIHNlcGFyYXRlbHkuICBUaGUgZGl2aXNvcnMgYXQgc3RlcCBDNyBiZWNvbWUgal4yIGFuZCB0aGUKbXVsdGlwbGllcnMgYXQgQzggYmVjb21lIDIqdCpqLWpeMi4KCiAgIFNwbGl0dGluZyBvZGQgYW5kIGV2ZW4gcGFydHMgdGhyb3VnaCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgcG9pbnRzCmNhbiBiZSB0aG91Z2h0IG9mIGFzIHVzaW5nIC0xIGFzIGEgc3F1YXJlIHJvb3Qgb2YgdW5pdHkuICBJZiBhIDR0aCByb290Cm9mIHVuaXR5IHdhcyBhdmFpbGFibGUgdGhlbiBhIGZ1cnRoZXIgc3BsaXQgYW5kIHNwZWVkdXAgd291bGQgYmUKcG9zc2libGUsIGJ1dCBubyBzdWNoIHJvb3QgZXhpc3RzIGZvciBwbGFpbiBpbnRlZ2Vycy4gIEdvaW5nIHRvIGNvbXBsZXgKaW50ZWdlcnMgd2l0aCBpPXNxcnQoLTEpIGRvZXNuJ3QgaGVscCwgZXNzZW50aWFsbHkgYmVjYXVzZSBpbiBDYXJ0ZXNpYW4KZm9ybSBpdCB0YWtlcyB0aHJlZSByZWFsIG11bHRpcGxpZXMgdG8gZG8gYSBjb21wbGV4IG11bHRpcGx5LiAgVGhlCmV4aXN0ZW5jZSBvZiAyXmsndGggcm9vdHMgb2YgdW5pdHkgaW4gYSBzdWl0YWJsZSByaW5nIG9yIGZpZWxkIGxldHMgdGhlCmZhc3QgRm91cmllciB0cmFuc2Zvcm0ga2VlcCBzcGxpdHRpbmcgYW5kIGdldCB0byBPKE4qbG9nKHIpKS4KCiAgIEZsb2F0aW5nIHBvaW50IEZGVHMgdXNlIGNvbXBsZXggbnVtYmVycyBhcHByb3hpbWF0aW5nIE50aCByb290cyBvZgp1bml0eS4gIFNvbWUgcHJvY2Vzc29ycyBoYXZlIHNwZWNpYWwgc3VwcG9ydCBmb3Igc3VjaCBGRlRzLiAgQnV0IHRoZXNlCmFyZSBub3QgdXNlZCBpbiBHTVAgc2luY2UgaXQncyB2ZXJ5IGRpZmZpY3VsdCB0byBndWFyYW50ZWUgYW4gZXhhY3QKcmVzdWx0ICh0byBzb21lIG51bWJlciBvZiBiaXRzKS4gIEFuIG9jY2FzaW9uYWwgZGlmZmVyZW5jZSBvZiAxIGluIHRoZQpsYXN0IGJpdCBtaWdodCBub3QgbWF0dGVyIHRvIGEgdHlwaWNhbCBzaWduYWwgcHJvY2Vzc2luZyBhbGdvcml0aG0sIGJ1dAppcyBvZiBjb3Vyc2Ugb2Ygdml0YWwgaW1wb3J0YW5jZSB0byBHTVAuCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogVW5iYWxhbmNlZCBNdWx0aXBsaWNhdGlvbiwgIFByZXY6IE90aGVyIE11bHRpcGxpY2F0aW9uLCAgVXA6IE11bHRpcGxpY2F0aW9uIEFsZ29yaXRobXMKCjE1LjEuOCBVbmJhbGFuY2VkIE11bHRpcGxpY2F0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpNdWx0aXBsaWNhdGlvbiBvZiBvcGVyYW5kcyB3aXRoIGRpZmZlcmVudCBzaXplcywgYm90aCBiZWxvdwpgTVVMX1RPT00yMl9USFJFU0hPTEQnIGFyZSBkb25lIHdpdGggcGxhaW4gc2Nob29sYm9vayBtdWx0aXBsaWNhdGlvbgooKm5vdGUgQmFzZWNhc2UgTXVsdGlwbGljYXRpb246OikuCgogICBGb3IgcmVhbGx5IGxhcmdlIG9wZXJhbmRzLCB3ZSBpbnZva2UgRkZUIGRpcmVjdGx5LgoKICAgRm9yIG9wZXJhbmRzIGJldHdlZW4gdGhlc2Ugc2l6ZXMsIHdlIHVzZSBUb29tIGluc3BpcmVkIGFsZ29yaXRobXMKc3VnZ2VzdGVkIGJ5IEFsYmVydG8gWmFub25pIGFuZCBNYXJjbyBCb2RyYXRvLiAgVGhlIGlkZWEgaXMgdG8gc3BsaXQKdGhlIG9wZXJhbmRzIGludG8gcG9seW5vbWlhbHMgb2YgZGlmZmVyZW50IGRlZ3JlZS4gIEdNUCBjdXJyZW50bHkKc3BsaXRzIHRoZSBzbWFsbGVyIG9wZXJhbmQgb250byAyIGNvZWZmaWNpZW50cywgaS5lLiwgYSBwb2x5bm9taWFsIG9mCmRlZ3JlZSAxLCBidXQgdGhlIGxhcmdlciBvcGVyYW5kIGNhbiBiZSBzcGxpdCBpbnRvIDIsIDMsIG9yIDQKY29lZmZpY2llbnRzLCBpLmUuLCBhIHBvbHlub21pYWwgb2YgZGVncmVlIDEgdG8gMy4KCh8KRmlsZTogZ21wLmluZm8sICBOb2RlOiBEaXZpc2lvbiBBbGdvcml0aG1zLCAgTmV4dDogR3JlYXRlc3QgQ29tbW9uIERpdmlzb3IgQWxnb3JpdGhtcywgIFByZXY6IE11bHRpcGxpY2F0aW9uIEFsZ29yaXRobXMsICBVcDogQWxnb3JpdGhtcwoKMTUuMiBEaXZpc2lvbiBBbGdvcml0aG1zCj09PT09PT09PT09PT09PT09PT09PT09PQoKKiBNZW51OgoKKiBTaW5nbGUgTGltYiBEaXZpc2lvbjo6CiogQmFzZWNhc2UgRGl2aXNpb246OgoqIERpdmlkZSBhbmQgQ29ucXVlciBEaXZpc2lvbjo6CiogQmxvY2stV2lzZSBCYXJyZXR0IERpdmlzaW9uOjoKKiBFeGFjdCBEaXZpc2lvbjo6CiogRXhhY3QgUmVtYWluZGVyOjoKKiBTbWFsbCBRdW90aWVudCBEaXZpc2lvbjo6CgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogU2luZ2xlIExpbWIgRGl2aXNpb24sICBOZXh0OiBCYXNlY2FzZSBEaXZpc2lvbiwgIFByZXY6IERpdmlzaW9uIEFsZ29yaXRobXMsICBVcDogRGl2aXNpb24gQWxnb3JpdGhtcwoKMTUuMi4xIFNpbmdsZSBMaW1iIERpdmlzaW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKTngxIGRpdmlzaW9uIGlzIGltcGxlbWVudGVkIHVzaW5nIHJlcGVhdGVkIDJ4MSBkaXZpc2lvbnMgZnJvbSBoaWdoIHRvCmxvdywgZWl0aGVyIHdpdGggYSBoYXJkd2FyZSBkaXZpZGUgaW5zdHJ1Y3Rpb24gb3IgYSBtdWx0aXBsaWNhdGlvbiBieQppbnZlcnNlLCB3aGljaGV2ZXIgaXMgYmVzdCBvbiBhIGdpdmVuIENQVS4KCiAgIFRoZSBtdWx0aXBseSBieSBpbnZlcnNlIGZvbGxvd3MgIkltcHJvdmVkIGRpdmlzaW9uIGJ5IGludmFyaWFudAppbnRlZ2VycyIgYnkgTfZsbGVyIGFuZCBHcmFubHVuZCAoKm5vdGUgUmVmZXJlbmNlczo6KSBhbmQgaXMKaW1wbGVtZW50ZWQgYXMgYHVkaXZfcXJubmRfcHJlaW52JyBpbiBgZ21wLWltcGwuaCcuICBUaGUgaWRlYSBpcyB0bwpoYXZlIGEgZml4ZWQtcG9pbnQgYXBwcm94aW1hdGlvbiB0byAxL2QgKHNlZSBgaW52ZXJ0X2xpbWInKSBhbmQgdGhlbgptdWx0aXBseSBieSB0aGUgaGlnaCBsaW1iIChwbHVzIG9uZSBiaXQpIG9mIHRoZSBkaXZpZGVuZCB0byBnZXQgYQpxdW90aWVudCBxLiAgV2l0aCBkIG5vcm1hbGl6ZWQgKGhpZ2ggYml0IHNldCksIHEgaXMgbm8gbW9yZSB0aGFuIDEgdG9vCnNtYWxsLiAgU3VidHJhY3RpbmcgcSpkIGZyb20gdGhlIGRpdmlkZW5kIGdpdmVzIGEgcmVtYWluZGVyLCBhbmQKcmV2ZWFscyB3aGV0aGVyIHEgb3IgcS0xIGlzIGNvcnJlY3QuCgogICBUaGUgcmVzdWx0IGlzIGEgZGl2aXNpb24gZG9uZSB3aXRoIHR3byBtdWx0aXBsaWNhdGlvbnMgYW5kIGZvdXIgb3IKZml2ZSBhcml0aG1ldGljIG9wZXJhdGlvbnMuICBPbiBDUFVzIHdpdGggbG93IGxhdGVuY3kgbXVsdGlwbGllcnMgdGhpcwpjYW4gYmUgbXVjaCBmYXN0ZXIgdGhhbiBhIGhhcmR3YXJlIGRpdmlkZSwgdGhvdWdoIHRoZSBjb3N0IG9mCmNhbGN1bGF0aW5nIHRoZSBpbnZlcnNlIGF0IHRoZSBzdGFydCBtYXkgbWVhbiBpdCdzIG9ubHkgYmV0dGVyIG9uCmlucHV0cyBiaWdnZXIgdGhhbiBzYXkgNCBvciA1IGxpbWJzLgoKICAgV2hlbiBhIGRpdmlzb3IgbXVzdCBiZSBub3JtYWxpemVkLCBlaXRoZXIgZm9yIHRoZSBnZW5lcmljIEMKYF9fdWRpdl9xcm5uZF9jJyBvciB0aGUgbXVsdGlwbHkgYnkgaW52ZXJzZSwgdGhlIGRpdmlzaW9uIHBlcmZvcm1lZCBpcwphY3R1YWxseSBhKjJeayBieSBkKjJeayB3aGVyZSBhIGlzIHRoZSBkaXZpZGVuZCBhbmQgayBpcyB0aGUgcG93ZXIKbmVjZXNzYXJ5IHRvIGhhdmUgdGhlIGhpZ2ggYml0IG9mIGQqMl5rIHNldC4gIFRoZSBiaXQgc2hpZnRzIGZvciB0aGUKZGl2aWRlbmQgYXJlIHVzdWFsbHkgYWNjb21wbGlzaGVkICJvbiB0aGUgZmx5IiBtZWFuaW5nIGJ5IGV4dHJhY3RpbmcKdGhlIGFwcHJvcHJpYXRlIGJpdHMgYXQgZWFjaCBzdGVwLiAgRG9uZSB0aGlzIHdheSB0aGUgcXVvdGllbnQgbGltYnMKY29tZSBvdXQgYWxpZ25lZCByZWFkeSB0byBzdG9yZS4gIFdoZW4gb25seSB0aGUgcmVtYWluZGVyIGlzIHdhbnRlZCwgYW4KYWx0ZXJuYXRpdmUgaXMgdG8gdGFrZSB0aGUgZGl2aWRlbmQgbGltYnMgdW5zaGlmdGVkIGFuZCBjYWxjdWxhdGUgciA9IGEKbW9kIGQqMl5rIGZvbGxvd2VkIGJ5IGFuIGV4dHJhIGZpbmFsIHN0ZXAgcioyXmsgbW9kIGQqMl5rLiAgVGhpcyBjYW4KaGVscCBvbiBDUFVzIHdpdGggcG9vciBiaXQgc2hpZnRzIG9yIGZldyByZWdpc3RlcnMuCgogICBUaGUgbXVsdGlwbHkgYnkgaW52ZXJzZSBjYW4gYmUgZG9uZSB0d28gbGltYnMgYXQgYSB0aW1lLiAgVGhlCmNhbGN1bGF0aW9uIGlzIGJhc2ljYWxseSB0aGUgc2FtZSwgYnV0IHRoZSBpbnZlcnNlIGlzIHR3byBsaW1icyBhbmQgdGhlCmRpdmlzb3IgdHJlYXRlZCBhcyBpZiBwYWRkZWQgd2l0aCBhIGxvdyB6ZXJvIGxpbWIuICBUaGlzIG1lYW5zIG1vcmUKd29yaywgc2luY2UgdGhlIGludmVyc2Ugd2lsbCBuZWVkIGEgMngyIG11bHRpcGx5LCBidXQgdGhlIGZvdXIgMXgxcyB0bwpkbyB0aGF0IGFyZSBpbmRlcGVuZGVudCBhbmQgY2FuIHRoZXJlZm9yZSBiZSBkb25lIHBhcnRseSBvciB3aG9sbHkgaW4KcGFyYWxsZWwuICBMaWtld2lzZSBmb3IgYSAyeDEgY2FsY3VsYXRpbmcgcSpkLiAgVGhlIG5ldCBlZmZlY3QgaXMgdG8KcHJvY2VzcyB0d28gbGltYnMgd2l0aCByb3VnaGx5IHRoZSBzYW1lIHR3byBtdWx0aXBsaWVzIHdvcnRoIG9mIGxhdGVuY3kKdGhhdCBvbmUgbGltYiBhdCBhIHRpbWUgZ2l2ZXMuICBUaGlzIGV4dGVuZHMgdG8gMyBvciA0IGxpbWJzIGF0IGEgdGltZSwKdGhvdWdoIHRoZSBleHRyYSB3b3JrIHRvIGFwcGx5IHRoZSBpbnZlcnNlIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBzb29uCnJlYWNoIHRoZSBsaW1pdHMgb2YgbXVsdGlwbGllciB0aHJvdWdocHV0LgoKICAgQSBzaW1pbGFyIGFwcHJvYWNoIGluIHJldmVyc2UgY2FuIGJlIHRha2VuIHRvIHByb2Nlc3MganVzdCBoYWxmIGEKbGltYiBhdCBhIHRpbWUgaWYgdGhlIGRpdmlzb3IgaXMgb25seSBhIGhhbGYgbGltYi4gIEluIHRoaXMgY2FzZSB0aGUKMXgxIG11bHRpcGx5IGZvciB0aGUgaW52ZXJzZSBlZmZlY3RpdmVseSBiZWNvbWVzIHR3byAoMS8yKXgxIGZvciBlYWNoCmxpbWIsIHdoaWNoIGNhbiBiZSBhIHNhdmluZyBvbiBDUFVzIHdpdGggYSBmYXN0IGhhbGYgbGltYiBtdWx0aXBseSwgb3IKaW4gZmFjdCBpZiB0aGUgb25seSBtdWx0aXBseSBpcyBhIGhhbGYgbGltYiwgYW5kIGVzcGVjaWFsbHkgaWYgaXQncyBub3QKcGlwZWxpbmVkLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEJhc2VjYXNlIERpdmlzaW9uLCAgTmV4dDogRGl2aWRlIGFuZCBDb25xdWVyIERpdmlzaW9uLCAgUHJldjogU2luZ2xlIExpbWIgRGl2aXNpb24sICBVcDogRGl2aXNpb24gQWxnb3JpdGhtcwoKMTUuMi4yIEJhc2VjYXNlIERpdmlzaW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQmFzZWNhc2UgTnhNIGRpdmlzaW9uIGlzIGxpa2UgbG9uZyBkaXZpc2lvbiBkb25lIGJ5IGhhbmQsIGJ1dCBpbiBiYXNlCjJebXBfYml0c19wZXJfbGltYi4gIFNlZSBLbnV0aCBzZWN0aW9uIDQuMy4xIGFsZ29yaXRobSBELCBhbmQKYG1wbi9nZW5lcmljL3NiX2RpdnJlbV9tbi5jJy4KCiAgIEJyaWVmbHkgc3RhdGVkLCB3aGlsZSB0aGUgZGl2aWRlbmQgcmVtYWlucyBsYXJnZXIgdGhhbiB0aGUgZGl2aXNvciwKYSBoaWdoIHF1b3RpZW50IGxpbWIgaXMgZm9ybWVkIGFuZCB0aGUgTngxIHByb2R1Y3QgcSpkIHN1YnRyYWN0ZWQgYXQKdGhlIHRvcCBlbmQgb2YgdGhlIGRpdmlkZW5kLiAgV2l0aCBhIG5vcm1hbGl6ZWQgZGl2aXNvciAobW9zdApzaWduaWZpY2FudCBiaXQgc2V0KSwgZWFjaCBxdW90aWVudCBsaW1iIGNhbiBiZSBmb3JtZWQgd2l0aCBhIDJ4MQpkaXZpc2lvbiBhbmQgYSAxeDEgbXVsdGlwbGljYXRpb24gcGx1cyBzb21lIHN1YnRyYWN0aW9ucy4gIFRoZSAyeDEKZGl2aXNpb24gaXMgYnkgdGhlIGhpZ2ggbGltYiBvZiB0aGUgZGl2aXNvciBhbmQgaXMgZG9uZSBlaXRoZXIgd2l0aCBhCmhhcmR3YXJlIGRpdmlkZSBvciBhIG11bHRpcGx5IGJ5IGludmVyc2UgKHRoZSBzYW1lIGFzIGluICpub3RlIFNpbmdsZQpMaW1iIERpdmlzaW9uOjopIHdoaWNoZXZlciBpcyBmYXN0ZXIuICBTdWNoIGEgcXVvdGllbnQgaXMgc29tZXRpbWVzIG9uZQp0b28gYmlnLCByZXF1aXJpbmcgYW4gYWRkYmFjayBvZiB0aGUgZGl2aXNvciwgYnV0IHRoYXQgaGFwcGVucyByYXJlbHkuCgogICBXaXRoIFE9Ti1NIGJlaW5nIHRoZSBudW1iZXIgb2YgcXVvdGllbnQgbGltYnMsIHRoaXMgaXMgYW4gTyhRKk0pCmFsZ29yaXRobSBhbmQgd2lsbCBydW4gYXQgYSBzcGVlZCBzaW1pbGFyIHRvIGEgYmFzZWNhc2UgUXhNCm11bHRpcGxpY2F0aW9uLCBkaWZmZXJpbmcgaW4gZmFjdCBvbmx5IGluIHRoZSBleHRyYSBtdWx0aXBseSBhbmQgZGl2aWRlCmZvciBlYWNoIG9mIHRoZSBRIHF1b3RpZW50IGxpbWJzLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IERpdmlkZSBhbmQgQ29ucXVlciBEaXZpc2lvbiwgIE5leHQ6IEJsb2NrLVdpc2UgQmFycmV0dCBEaXZpc2lvbiwgIFByZXY6IEJhc2VjYXNlIERpdmlzaW9uLCAgVXA6IERpdmlzaW9uIEFsZ29yaXRobXMKCjE1LjIuMyBEaXZpZGUgYW5kIENvbnF1ZXIgRGl2aXNpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRm9yIGRpdmlzb3JzIGxhcmdlciB0aGFuIGBEQ19ESVZfUVJfVEhSRVNIT0xEJywgZGl2aXNpb24gaXMgZG9uZSBieQpkaXZpZGluZy4gIE9yIHRvIGJlIHByZWNpc2UgYnkgYSByZWN1cnNpdmUgZGl2aWRlIGFuZCBjb25xdWVyIGFsZ29yaXRobQpiYXNlZCBvbiB3b3JrIGJ5IE1vZW5jayBhbmQgQm9yb2RpbiwgSmViZWxlYW4sIGFuZCBCdXJuaWtlbCBhbmQgWmllZ2xlcgooKm5vdGUgUmVmZXJlbmNlczo6KS4KCiAgIFRoZSBhbGdvcml0aG0gY29uc2lzdHMgZXNzZW50aWFsbHkgb2YgcmVjb2duaXNpbmcgdGhhdCBhIDJOeE4KZGl2aXNpb24gY2FuIGJlIGRvbmUgd2l0aCB0aGUgYmFzZWNhc2UgZGl2aXNpb24gYWxnb3JpdGhtICgqbm90ZQpCYXNlY2FzZSBEaXZpc2lvbjo6KSwgYnV0IHVzaW5nIE4vMiBsaW1icyBhcyBhIGJhc2UsIG5vdCBqdXN0IGEgc2luZ2xlCmxpbWIuICBUaGlzIHdheSB0aGUgbXVsdGlwbGljYXRpb25zIHRoYXQgYXJpc2UgYXJlIChOLzIpeChOLzIpIGFuZCBjYW4KdGFrZSBhZHZhbnRhZ2Ugb2YgS2FyYXRzdWJhIGFuZCBoaWdoZXIgbXVsdGlwbGljYXRpb24gYWxnb3JpdGhtcyAoKm5vdGUKTXVsdGlwbGljYXRpb24gQWxnb3JpdGhtczo6KS4gIFRoZSB0d28gImRpZ2l0cyIgb2YgdGhlIHF1b3RpZW50IGFyZQpmb3JtZWQgYnkgcmVjdXJzaXZlIE54KE4vMikgZGl2aXNpb25zLgoKICAgSWYgdGhlIChOLzIpeChOLzIpIG11bHRpcGxpZXMgYXJlIGRvbmUgd2l0aCBhIGJhc2VjYXNlIG11bHRpcGxpY2F0aW9uCnRoZW4gdGhlIHdvcmsgaXMgYWJvdXQgdGhlIHNhbWUgYXMgYSBiYXNlY2FzZSBkaXZpc2lvbiwgYnV0IHdpdGggbW9yZQpmdW5jdGlvbiBjYWxsIG92ZXJoZWFkcyBhbmQgd2l0aCBzb21lIHN1YnRyYWN0aW9ucyBzZXBhcmF0ZWQgZnJvbSB0aGUKbXVsdGlwbGllcy4gIFRoZXNlIG92ZXJoZWFkcyBtZWFuIHRoYXQgaXQncyBvbmx5IHdoZW4gTi8yIGlzIGFib3ZlCmBNVUxfVE9PTTIyX1RIUkVTSE9MRCcgdGhhdCBkaXZpZGUgYW5kIGNvbnF1ZXIgaXMgb2YgdXNlLgoKICAgYERDX0RJVl9RUl9USFJFU0hPTEQnIGlzIGJhc2VkIG9uIHRoZSBkaXZpc29yIHNpemUgTiwgc28gaXQgd2lsbCBiZQpzb21ld2hlcmUgYWJvdmUgdHdpY2UgYE1VTF9UT09NMjJfVEhSRVNIT0xEJywgYnV0IGhvdyBtdWNoIGFib3ZlCmRlcGVuZHMgb24gdGhlIENQVS4gIEFuIG9wdGltaXplZCBgbXBuX211bF9iYXNlY2FzZScgY2FuIGxvd2VyCmBEQ19ESVZfUVJfVEhSRVNIT0xEJyBhIGxpdHRsZSBieSBvZmZlcmluZyBhIHJlYWR5LW1hZGUgYWR2YW50YWdlIG92ZXIKcmVwZWF0ZWQgYG1wbl9zdWJtdWxfMScgY2FsbHMuCgogICBEaXZpZGUgYW5kIGNvbnF1ZXIgaXMgYXN5bXB0b3RpY2FsbHkgTyhNKE4pKmxvZyhOKSkgd2hlcmUgTShOKSBpcwp0aGUgdGltZSBmb3IgYW4gTnhOIG11bHRpcGxpY2F0aW9uIGRvbmUgd2l0aCBGRlRzLiAgVGhlIGFjdHVhbCB0aW1lIGlzCmEgc3VtIG92ZXIgbXVsdGlwbGljYXRpb25zIG9mIHRoZSByZWN1cnNlZCBzaXplcywgYXMgY2FuIGJlIHNlZW4gbmVhcgp0aGUgZW5kIG9mIHNlY3Rpb24gMi4yIG9mIEJ1cm5pa2VsIGFuZCBaaWVnbGVyLiAgRm9yIGV4YW1wbGUsIHdpdGhpbgp0aGUgVG9vbS0zIHJhbmdlLCBkaXZpZGUgYW5kIGNvbnF1ZXIgaXMgMi42MypNKE4pLiAgV2l0aCBoaWdoZXIKYWxnb3JpdGhtcyB0aGUgTShOKSB0ZXJtIGltcHJvdmVzIGFuZCB0aGUgbXVsdGlwbGllciB0ZW5kcyB0byBsb2coTikuCkluIHByYWN0aWNlLCBhdCBtb2RlcmF0ZSB0byBsYXJnZSBzaXplcywgYSAyTnhOIGRpdmlzaW9uIGlzIGFib3V0IDIgdG8KNCB0aW1lcyBzbG93ZXIgdGhhbiBhbiBOeE4gbXVsdGlwbGljYXRpb24uCgofCkZpbGU6IGdtcC5pbmZvLCAgTm9kZTogQmxvY2stV2lzZSBCYXJyZXR0IERpdmlzaW9uLCAgTmV4dDogRXhhY3QgRGl2aXNpb24sICBQcmV2OiBEaXZpZGUgYW5kIENvbnF1ZXIgRGl2aXNpb24sICBVcDogRGl2aXNpb24gQWxnb3JpdGhtcwoKMTUuMi40IEJsb2NrLVdpc2UgQmFycmV0dCBEaXZpc2lvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb3IgdGhlIGxhcmdlc3QgZGl2aXNpb25zLCBhIGJsb2NrLXdpc2UgQmFycmV0dCBkaXZpc2lvbiBhbGdvcml0aG0gaXMKdXNlZC4gIEhlcmUsIHRoZSBkaXZpc29yIGlzIGludmVydGVkIHRvIGEgcHJlY2lzaW9uIGRldGVybWluZWQgYnkgdGhlCnJlbGF0aXZlIHNpemUgb2YgdGhlIGRpdmlkZW5kIGFuZCBkaXZpc29yLiAgQmxvY2tzIG9mIHF1b3RpZW50IGxpbWJzCmFyZSB0aGVuIGdlbmVyYXRlZCBieSBtdWx0aXBseWluZyBibG9ja3MgZnJvbSB0aGUgZGl2aWRlbmQgYnkgdGhlCmludmVyc2UuCgogICBPdXIgYmxvY2std2lzZSBhbGdvcml0aG0gY29tcHV0ZXMgYSBzbWFsbGVyIGludmVyc2UgdGhhbiBpbiB0aGUKcGxhaW4gQmFycmV0dCBhbGdvcml0aG0uICBGb3IgYSAybi9uIGRpdmlzaW9uLCB0aGUgaW52ZXJzZSB3aWxsIGJlIGp1c3QKY2VpbChuLzIpIGxpbWJzLgoKHwpGaWxlOiBnbXAuaW5mbywgIE5vZGU6IEV4YWN0IERpdmlzaW9uLCAgTmV4dDogRXhhY3QgUmVtYWluZGVyLCAgUHJldjogQmxvY2stV2lzZSBCYXJyZXR0IERpdmlzaW9uLCAgVXA6IERpdmlzaW9uIEFsZ29yaXRobXMKCjE1LjIuNSBFeGFjdCBEaXZpc2lvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkEgc28tY2FsbGVkIGV4YWN0IGRpdmlzaW9uIGlzIHdoZW4gdGhlIGRpdmlkZW5kIGlzIGtub3duIHRvIGJlIGFuIGV4YWN0Cm11bHRpcGxlIG9mIHRoZSBkaXZpc29yLiAgSmViZWxlYW4ncyBleGFjdCBkaXZpc2lvbiBhbGdvcml0aG0gdXNlcyB0aGlzCmtub3dsZWRnZSB0byBtYWtlIHNvbWUgc2lnbmlmaWNhbnQgb3B0aW1pemF0aW9ucyAoKm5vdGUgUmVmZXJlbmNlczo6KS4KCiAgIFRoZSBpZGVhIGNhbiBiZSBpbGx1c3RyYXRlZCBpbiBkZWNpbWFsIGZvciBleGFtcGxlIHdpdGggMzY4MTU0CmRpdmlkZWQgYnkgNTQzLiAgQmVjYXVzZSB0aGUgbG93IGRpZ2l0IG9mIHRoZSBkaXZpZGVuZCBpcyA0LCB0aGUgbG93CmRpZ2l0IG9mIHRoZSBxdW90aWVudCBtdXN0IGJlIDguICBUaGlzIGlzIGFycml2ZWQgYXQgZnJvbSA0KjcgbW9kIDEwLAp1c2luZyB0aGUgZmFjdCA3IGlzIHRoZSBtb2R1bGFyIGludmVyc2Ugb2YgMyAodGhlIGxvdyBkaWdpdCBvZiB0aGUKZGl2aXNvciksIHNpbmNlIDMqNyA9PSAxIG1vZCAxMC4gIFNvIDgqNTQzPTQzNDQgY2FuIGJlIHN1YnRyYWN0ZWQgZnJvbQp0aGUgZGl2aWRlbmQgbGVhdmluZyAzNjM4MTAuICBOb3RpY2UgdGhlIGxvdyBkaWdpdCBoYXMgYmVjb21lIHplcm8uCgogICBUaGUgcHJvY2VkdXJlIGlzIHJlcGVhdGVkIGF0IHRoZSBzZWNvbmQgZGlnaXQsIHdpdGggdGhlIG5leHQKcXVvdGllbnQgZGlnaXQgNyAoNyA9PSAxKjcgbW9kIDEwKSwgc3VidHJhY3RpbmcgNyo1NDM9MzgwMSwgbGVhdmluZwozMjU4MDAuICBBbmQgZmluYWxseSBhdCB0aGUgdGhpcmQgZGlnaXQgd2l0aCBxdW90aWVudCBkaWdpdCA2ICg4KjcgbW9kCjEwKSwgc3VidHJhY3RpbmcgNio1NDM9MzI1OCBsZWF2aW5nIDAuICBTbyB0aGUgcXVvdGllbnQgaXMgNjc4LgoKICAgTm90aWNlIGhvd2V2ZXIgdGhhdCB0aGUgbXVsdGlwbGllcyBhbmQgc3VidHJhY3Rpb25zIGRvbid0IG5lZWQgdG8KZXh0ZW5kIHBhc3QgdGhlIGxvdyB0aHJlZSBkaWdpdHMgb2YgdGhlIGRpdmlkZW5kLCBzaW5jZSB0aGF0J3MgZW5vdWdoCnRvIGRldGVybWluZSB0aGUgdGhyZWUgcXVvdGllbnQgZGlnaXRzLiAgRm9yIHRoZSBsYXN0IHF1b3RpZW50IGRpZ2l0IG5vCnN1YnRyYWN0aW9uIGlzIG5lZWRlZCBhdCBhbGwuICBPbiBhIDJOeE4gZGl2aXNpb24gbGlrZSB0aGlzIG9uZSwgb25seQphYm91dCBoYWxmIHRoZSB3b3JrIG9mIGEgbm9ybWFsIGJhc2VjYXNlIGRpdmlzaW9uIGlzIG5lY2Vzc2FyeS4KCiAgIEZvciBhbiBOeE0gZXhhY3QgZGl2aXNpb24gcHJvZHVjaW5nIFE9Ti1NIHF1b3RpZW50IGxpbWJzLCB0aGUgc2F2aW5nCm92ZXIgYSBub3JtYWwgYmFzZWNhc2UgZGl2aXNpb24gaXMgaW4gdHdvIHBhcnRzLiAgRmlyc3RseSwgZWFjaCBvZiB0aGUKUSBxdW90aWVudCBsaW1icyBuZWVkcyBvbmx5IG9uZSBtdWx0aXBseSwgbm90IGEgMngxIGRpdmlkZSBhbmQKbXVsdGlwbHkuICBTZWNvbmRseSwgdGhlIGNyb3NzcHJvZHVjdHMgYXJlIHJlZHVjZWQgd2hlbiBRPk0gdG8KUSpNLU0qKE0rMSkvMiwgb3Igd2hlbiBRPD1NIHRvIFEqKFEtMSkvMi4gIE5vdGljZSB0aGUgc2F2aW5ncyBhcmUKY29tcGxlbWVudGFyeS4gIElmIFEgaXMgYmlnIHRoZW4gbWFueSBkaXZpc2lvbnMgYXJlIHNhdmVkLCBvciBpZiBRIGlzCnNtYWxsIHRoZW4gdGhlIGNyb3NzcHJvZHVjdHMgcmVkdWNlIHRvIGEgc21hbGwgbnVtYmVyLgoKICAgVGhlIG1vZHVsYXIgaW52ZXJzZSB1c2VkIGlzIGNhbGN1bGF0ZWQgZWZmaWNpZW50bHkgYnkgYGJpbnZlcnRfbGltYicKaW4gYGdtcC1pbXBsLmgnLiAgVGhpcyBkb2VzIGZvdXIgbXVsdGlwbGllcyBmb3IgYSAzMi1iaXQgbGltYiwgb3Igc2l4CmZvciBhIDY0LWJpdCBsaW1iLiAgYHR1bmUvbW9kbGludi5jJyBoYXMgc29tZSBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb25zCnRoYXQgbWlnaHQgc3VpdCBwcm9jZXNzb3JzIGJldHRlciBhdCBiaXQgdHdpZGRsaW5nIHRoYW4gbXVsdGlwbHlpbmcuCgogICBUaGUgc3ViLXF1YWRyYXRpYyBleGFjdCBkaXZpc2lvbiBkZXNjcmliZWQgYnkgSmViZWxlYW4gaW4gIkV4YWN0CkRpdmlzaW9uIHdpdGggS2FyYXRzdWJhIENvbXBsZXhpdHkiIGlzIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuICBJdAp1c2VzIGEgcmVhcnJhbmdlbWVudCBzaW1pbGFyIHRvIHRoZSBkaXZpZGUgYW5kIGNvbnF1ZXIgZm9yIG5vcm1hbApkaXZpc2lvbiAoKm5vdGUgRGl2aWRlIGFuZCBDb25xdWVyIERpdmlzaW9uOjopLCBidXQgb3BlcmF0aW5nIGZyb20gbG93CnRvIGhpZ2guICBBIGZ1cnRoZXIgcG9zc2liaWxpdHkgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZCBpcwoiQmlkaXJlY3Rpb25hbCBFeGFjdCBJbnRlZ2VyIERpdmlzaW9uIiBieSBLcmFuZGljayBhbmQgSmViZWxlYW4gd2hpY2gKZm9ybXMgcXVvdGllbnQgbGltYnMgZnJvbSBib3RoIHRoZSBoaWdoIGFuZCBsb3cgZW5kcyBvZiB0aGUgZGl2aWRlbmQsCmFuZCBjYW4gaGFsdmUgb25jZSBtb3JlIHRoZSBudW1iZXIgb2YgY3Jvc3Nwcm9kdWN0cyBuZWVkZWQgaW4gYSAyTnhOCmRpdmlzaW9uLgoKICAgQSBzcGVjaWFsIGNhc2UgZXhhY3QgZGl2aXNpb24gYnkgMyBleGlzdHMgaW4gYG1wbl9kaXZleGFjdF9ieTMnLApzdXBwb3J0aW5nIFRvb20tMyBtdWx0aXBsaWNhdGlvbiBhbmQgYG1wcScgY2Fub25pY2FsaXphdGlvbnMuICBJdCBmb3JtcwpxdW90aWVudCBkaWdpdHMgd2l0aCBhIG11bHRpcGx5IGJ5IHRoZSBtb2R1bGFyIGludmVyc2Ugb2YgMyAod2hpY2ggaXMKYDB4QUEuLkFBQicpIGFuZCB1c2VzIHR3byBjb21wYXJpc29ucyB0byBkZXRlcm1pbmUgYSBib3Jyb3cgZm9yIHRoZSBuZXh0CmxpbWIuICBUaGUgbXVsdGlwbGljYXRpb25zIGRvbid0IG5lZWQgdG8gYmUgb24gdGhlIGRlcGVuZGVudCBjaGFpbiwgYXMKbG9uZyBhcyB0aGUgZWZmZWN0IG9mIHRoZSBib3Jyb3dzIGlzIGFwcGxpZWQsIHdoaWNoIGNhbiBoZWxwIGNoaXBzIHdpdGgKcGlwZWxpbmVkIG11bHRpcGxpZXJzLgoKCh8KTG9jYWwgVmFyaWFibGVzOgpjb2Rpbmc6IGlzby04ODU5LTEKRW5kOgo=