From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/2495 Path: news.gmane.org!not-for-mail From: ojab Newsgroups: gmane.linux.lib.musl.general Subject: Re: LLVM testsuite, close-stderr.ll hangs Date: Tue, 18 Dec 2012 09:55:54 +0400 Message-ID: <50D0056A.4090303@ojab.ru> References: <50CEFC0B.70307@ojab.ru> <20121217165829.GT20323@brightrain.aerifal.cx> <20121217172227.GU20323@brightrain.aerifal.cx> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------060909020808080805020509" X-Trace: ger.gmane.org 1355810170 16663 80.91.229.3 (18 Dec 2012 05:56:10 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 18 Dec 2012 05:56:10 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-2496-gllmg-musl=m.gmane.org@lists.openwall.com Tue Dec 18 06:56:24 2012 Return-path: Envelope-to: gllmg-musl@plane.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1TkqAC-0008E9-0u for gllmg-musl@plane.gmane.org; Tue, 18 Dec 2012 06:56:24 +0100 Original-Received: (qmail 21572 invoked by uid 550); 18 Dec 2012 05:56:10 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 21561 invoked from network); 18 Dec 2012 05:56:09 -0000 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :references:in-reply-to:content-type:x-gm-message-state; bh=dinnwuVYkqQEwKpH9T6jpPyYDv87KNH6tgZbS5KRoBc=; b=Irn07SQsV3KOF6hcwuDPRV2ExPQ0fmqlI+GDf7dw9lSnCMwMNLsUKLl28MsdOGMAiD Voo1d19mbouD9u9wFfGrJT0c1e+g9iQSYUeI5qWW3b9X7ZunvJiBdLNJiII+O64L2VA/ M77odm4YoLlbYN2aozIEQTIWjaR9hOAGk3W5D9qHv1M3AanMcBdBDx6AQuGRmJUXB7Tw EaeBRLadBqufZ1fOXEw15gFF+lxr2Osa5MTUlduW/abMfxh0Yq0GoJ2OH8eRSMHMdqDo PuB0SuGlDW7/YEB75pJVYUOSK3k/o+IwNhWxFwf8ZjLwKsOuIxY69GIC/jZEr0qlXiJY 7OdA== X-Received: by 10.152.144.130 with SMTP id sm2mr732444lab.49.1355810158399; Mon, 17 Dec 2012 21:55:58 -0800 (PST) User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:20.0) Gecko/20100101 Thunderbird/20.0a1 In-Reply-To: <20121217172227.GU20323@brightrain.aerifal.cx> X-Gm-Message-State: ALoCoQkrhKpCGH/xw2/U7gNsPKRHlh8lLG8JUyXEE6WUbFTHnkw1+RBAkyXqqtUl5l2ew+Clfzva Xref: news.gmane.org gmane.linux.lib.musl.general:2495 Archived-At: This is a multi-part message in MIME format. --------------060909020808080805020509 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 17.12.2012 21:22, Rich Felker wrote: > On Mon, Dec 17, 2012 at 11:58:29AM -0500, Rich Felker wrote: > To track this down, you could run under gdb and just interrupt the > program and look at a backtrace once it hangs. This should make it > clear whether exit was called recursively. > > Rich > Looks something like that (gdb output in the attached file, `bt` while `opt` hangs in the bottom): I've set `break exit` and stepped till it hangs, first exit() happens in command line parsing (https://github.com/llvm-mirror/llvm/blob/master/lib/Support/CommandLine.cpp#L846), which calls report_fatal_error("IO failure on output stream.");, which calls exit itself. Looks like (note that I'm barely know C/C++) something wrong in ostream destruction: after changing ifdef to ifndef @ https://github.com/llvm-mirror/llvm/blob/master/lib/Support/raw_ostream.cpp#L501 all works as it should: > ~ # /root/llvm-build/Release+Asserts/bin/opt --reject-this-option 2>&- > ~ # echo $? > 1 //wbr ojab --------------060909020808080805020509 Content-Type: text/plain; charset=UTF-8; name="gdb_stderr.log" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="gdb_stderr.log" fiAjIA1+ICMgZ2RiIC0tYXJncyAvcm9vdC9sbHZtLWJ1aWxkL1JlbGVhc2UrQXNzZXJ0cy9i aW4vb3B0IC0tcmVqZWN0LXRoaXMtb3B0aW9uIDI+Ji0bW0oNCkdOVSBnZGIgKEdEQikgNy40 DQpDb3B5cmlnaHQgKEMpIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQpM aWNlbnNlIEdQTHYzKzogR05VIEdQTCB2ZXJzaW9uIDMgb3IgbGF0ZXIgPGh0dHA6Ly9nbnUu b3JnL2xpY2Vuc2VzL2dwbC5odG1sPg0KVGhpcyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgYXJl IGZyZWUgdG8gY2hhbmdlIGFuZCByZWRpc3RyaWJ1dGUgaXQuDQpUaGVyZSBpcyBOTyBXQVJS QU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3LiAgVHlwZSAic2hvdyBjb3B5 aW5nIg0KYW5kICJzaG93IHdhcnJhbnR5IiBmb3IgZGV0YWlscy4NClRoaXMgR0RCIHdhcyBj b25maWd1cmVkIGFzICJ4ODZfNjQtdW5rbm93bi1saW51eC1nbnUiLg0KRm9yIGJ1ZyByZXBv cnRpbmcgaW5zdHJ1Y3Rpb25zLCBwbGVhc2Ugc2VlOg0KPGh0dHA6Ly93d3cuZ251Lm9yZy9z b2Z0d2FyZS9nZGIvYnVncy8+Li4uDQpSZWFkaW5nIHN5bWJvbHMgZnJvbSAvcm9vdC9sbHZt LWJ1aWxkL1JlbGVhc2UrQXNzZXJ0cy9iaW4vb3B0Li4uZG9uZS4NCihnZGIpIGJyZWFrIGV4 aXQNCkJyZWFrcG9pbnQgMSBhdCAweDg0NGUzMA0KKGdkYikgcnVuDQpTdGFydGluZyBwcm9n cmFtOiAvcm9vdC9sbHZtLWJ1aWxkL1JlbGVhc2UrQXNzZXJ0cy9iaW4vb3B0IC0tcmVqZWN0 LXRoaXMtb3B0aW9uDQoNCkJyZWFrcG9pbnQgMSwgMHgwMDAwN2Y5NjYzNzc3N2U1IGluIGV4 aXQgKCkgZnJvbSAvbGliL2xkLW11c2wteDg2XzY0LnNvLjENCihnZGIpIGJ0DQojMCAgMHgw MDAwN2Y5NjYzNzc3N2U1IGluIGV4aXQgKCkgZnJvbSAvbGliL2xkLW11c2wteDg2XzY0LnNv LjENCiMxICAweDAwMDAwMDAwMDE0MDkxZjkgaW4gbGx2bTo6Y2w6OlBhcnNlQ29tbWFuZExp bmVPcHRpb25zIChhcmdjPTIsIGFyZ3Y9MHgzNGYwMWMwLCBPdmVydmlldz0weDE0NjA2Nzgg Imxsdm0gLmJjIC0+IC5iYyBtb2R1bGFyIG9wdGltaXplciBhbmQgYW5hbHlzaXMgcHJpbnRl clxuIikNCiAgICBhdCAvcm9vdC9sbHZtL2xpYi9TdXBwb3J0L0NvbW1hbmRMaW5lLmNwcDo4 NDYNCiMyICAweDAwMDAwMDAwMDA4NTQ2ZjYgaW4gbWFpbiAoYXJnYz0yLCBhcmd2PTB4N2Zm ZjkwYjZhMzQ4KSBhdCAvcm9vdC9sbHZtL3Rvb2xzL29wdC9vcHQuY3BwOjU4Ng0KKGdkYikg c3RlcA0KU2luZ2xlIHN0ZXBwaW5nIHVudGlsIGV4aXQgZnJvbSBmdW5jdGlvbiBleGl0LA0K d2hpY2ggaGFzIG5vIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLg0KbGx2bTo6cmF3X2ZkX29z dHJlYW06On5yYXdfZmRfb3N0cmVhbSAodGhpcz0weDdmZmY5MGI2OWU1OCwgX19pbl9jaHJn PTxvcHRpbWl6ZWQgb3V0PikgYXQgL3Jvb3QvbGx2bS9saWIvU3VwcG9ydC9yYXdfb3N0cmVh bS5jcHA6NDkwDQo0OTAJcmF3X2ZkX29zdHJlYW06On5yYXdfZmRfb3N0cmVhbSgpIHsNCihn ZGIpIA0KNDkxCSAgaWYgKEZEID49IDApIHsNCihnZGIpIA0KNDkyCSAgICBmbHVzaCgpOw0K KGdkYikgDQpsbHZtOjpyYXdfb3N0cmVhbTo6Zmx1c2ggKHRoaXM9MHgzNGVmYzIwKSBhdCAv cm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmg6MTI5DQoxMjkJ ICB2b2lkIGZsdXNoKCkgew0KKGdkYikgDQoxMzAJICAgIGlmIChPdXRCdWZDdXIgIT0gT3V0 QnVmU3RhcnQpDQooZ2RiKSANCjEzMgkgIH0NCihnZGIpIA0KbGx2bTo6cmF3X2ZkX29zdHJl YW06On5yYXdfZmRfb3N0cmVhbSAodGhpcz0weDFiNTA4ODAsIF9faW5fY2hyZz08b3B0aW1p emVkIG91dD4pIGF0IC9yb290L2xsdm0vbGliL1N1cHBvcnQvcmF3X29zdHJlYW0uY3BwOjQ5 Mw0KNDkzCSAgICBpZiAoU2hvdWxkQ2xvc2UpDQooZ2RiKSANCjUxMwkgIGlmIChoYXNfZXJy b3IoKSkNCihnZGIpIA0KbGx2bTo6cmF3X2ZkX29zdHJlYW06Omhhc19lcnJvciAodGhpcz0w eDIxKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmg6 NDA2DQo0MDYJICBib29sIGhhc19lcnJvcigpIGNvbnN0IHsNCihnZGIpIA0KNDA3CSAgICBy ZXR1cm4gRXJyb3I7DQooZ2RiKSANCjQwOAkgIH0NCihnZGIpIA0KbGx2bTo6cmF3X2ZkX29z dHJlYW06On5yYXdfZmRfb3N0cmVhbSAodGhpcz0weDFiNTA4ODAsIF9faW5fY2hyZz08b3B0 aW1pemVkIG91dD4pIGF0IC9yb290L2xsdm0vbGliL1N1cHBvcnQvcmF3X29zdHJlYW0uY3Bw OjUxNA0KNTE0CSAgICByZXBvcnRfZmF0YWxfZXJyb3IoIklPIGZhaWx1cmUgb24gb3V0cHV0 IHN0cmVhbS4iKTsNCihnZGIpIA0KbGx2bTo6cmVwb3J0X2ZhdGFsX2Vycm9yIChSZWFzb249 MHg0MCA8QWRkcmVzcyAweDQwIG91dCBvZiBib3VuZHM+KSBhdCAvcm9vdC9sbHZtL2xpYi9T dXBwb3J0L0Vycm9ySGFuZGxpbmcuY3BwOjUyDQo1Mgl2b2lkIGxsdm06OnJlcG9ydF9mYXRh bF9lcnJvcihjb25zdCBjaGFyICpSZWFzb24pIHsNCihnZGIpIA0KNTMJICByZXBvcnRfZmF0 YWxfZXJyb3IoVHdpbmUoUmVhc29uKSk7DQooZ2RiKSANCmxsdm06OlR3aW5lOjpUd2luZSAo dGhpcz0weDM0ZjAxZDAsIFN0cj0weDApIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FE VC9Ud2luZS5oOjI2Mw0KMjYzCSAgICAvKmltcGxpY2l0Ki8gVHdpbmUoY29uc3QgY2hhciAq U3RyKQ0KKGdkYikgDQoyNjQJICAgICAgOiBSSFNLaW5kKEVtcHR5S2luZCkgew0KKGdkYikg DQoyNjUJICAgICAgaWYgKFN0clswXSAhPSAnXDAnKSB7DQooZ2RiKSANCjI2NgkgICAgICAg IExIUy5jU3RyaW5nID0gU3RyOw0KKGdkYikgDQoyNjcJICAgICAgICBMSFNLaW5kID0gQ1N0 cmluZ0tpbmQ7DQooZ2RiKSANCjI3MQkgICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJJbnZh bGlkIHR3aW5lISIpOw0KKGdkYikgDQpsbHZtOjpUd2luZTo6aXNWYWxpZCAodGhpcz0weDdm OTY2Mzc3ZTE0OCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1R3aW5lLmg6MjEy DQoyMTIJICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsNCihnZGIpIA0KMjE0CSAgICAgIGlm IChpc051bGxhcnkoKSAmJiBnZXRSSFNLaW5kKCkgIT0gRW1wdHlLaW5kKQ0KKGdkYikgDQps bHZtOjpUd2luZTo6aXNOdWxsYXJ5ICh0aGlzPTB4ZGYwNDE4KSBhdCAvcm9vdC9sbHZtL2lu Y2x1ZGUvbGx2bS9BRFQvVHdpbmUuaDoxOTYNCjE5NgkgICAgYm9vbCBpc051bGxhcnkoKSBj b25zdCB7DQooZ2RiKSANCjE5NwkgICAgICByZXR1cm4gaXNOdWxsKCkgfHwgaXNFbXB0eSgp Ow0KKGdkYikgDQpsbHZtOjpUd2luZTo6aXNOdWxsICh0aGlzPTB4ZGYwN2IwKSBhdCAvcm9v dC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvVHdpbmUuaDoxODYNCjE4NgkgICAgYm9vbCBpc051 bGwoKSBjb25zdCB7DQooZ2RiKSANCjE4NwkgICAgICByZXR1cm4gZ2V0TEhTS2luZCgpID09 IE51bGxLaW5kOw0KKGdkYikgDQpsbHZtOjpUd2luZTo6Z2V0TEhTS2luZCAodGhpcz0weGZm ZmZmZmZmZmZmZmZmZmUpIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FEVC9Ud2luZS5o OjIzNw0KMjM3CSAgICBOb2RlS2luZCBnZXRMSFNLaW5kKCkgY29uc3QgeyByZXR1cm4gKE5v ZGVLaW5kKSBMSFNLaW5kOyB9DQooZ2RiKSANCmxsdm06OlR3aW5lOjppc051bGwgKHRoaXM9 MHg3ZmZmOTBiNjliZjApIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FEVC9Ud2luZS5o OjE4OA0KMTg4CSAgICB9DQooZ2RiKSANCmxsdm06OlR3aW5lOjppc0VtcHR5ICh0aGlzPTB4 N2ZmZjkwYjY5YmYwKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvVHdpbmUuaDox OTENCjE5MQkgICAgYm9vbCBpc0VtcHR5KCkgY29uc3Qgew0KKGdkYikgDQoxOTIJICAgICAg cmV0dXJuIGdldExIU0tpbmQoKSA9PSBFbXB0eUtpbmQ7DQooZ2RiKSANCmxsdm06OlR3aW5l OjpnZXRMSFNLaW5kICh0aGlzPTB4N2ZmZjkwYjY5YmYwKSBhdCAvcm9vdC9sbHZtL2luY2x1 ZGUvbGx2bS9BRFQvVHdpbmUuaDoyMzcNCjIzNwkgICAgTm9kZUtpbmQgZ2V0TEhTS2luZCgp IGNvbnN0IHsgcmV0dXJuIChOb2RlS2luZCkgTEhTS2luZDsgfQ0KKGdkYikgDQpsbHZtOjpU d2luZTo6aXNFbXB0eSAodGhpcz0weDdmZmY5MGI2OWJmMCkgYXQgL3Jvb3QvbGx2bS9pbmNs dWRlL2xsdm0vQURUL1R3aW5lLmg6MTkzDQoxOTMJICAgIH0NCihnZGIpIA0KbGx2bTo6VHdp bmU6OmlzTnVsbGFyeSAodGhpcz0weDdmZmY5MGI2OWJmMCkgYXQgL3Jvb3QvbGx2bS9pbmNs dWRlL2xsdm0vQURUL1R3aW5lLmg6MTk4DQoxOTgJICAgIH0NCihnZGIpIA0KbGx2bTo6VHdp bmU6OmlzVmFsaWQgKHRoaXM9MHg3ZmZmOTBiNjliZjApIGF0IC9yb290L2xsdm0vaW5jbHVk ZS9sbHZtL0FEVC9Ud2luZS5oOjIxOA0KMjE4CSAgICAgIGlmIChnZXRSSFNLaW5kKCkgPT0g TnVsbEtpbmQpDQooZ2RiKSANCmxsdm06OlR3aW5lOjpnZXRSSFNLaW5kICh0aGlzPTB4ODU0 NWNlKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvVHdpbmUuaDoyNDANCjI0MAkg ICAgTm9kZUtpbmQgZ2V0UkhTS2luZCgpIGNvbnN0IHsgcmV0dXJuIChOb2RlS2luZCkgUkhT S2luZDsgfQ0KKGdkYikgDQpsbHZtOjpUd2luZTo6aXNWYWxpZCAodGhpcz0weDdmZmY5MGI2 OWJmMCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1R3aW5lLmg6MjIyDQoyMjIJ ICAgICAgaWYgKGdldFJIU0tpbmQoKSAhPSBFbXB0eUtpbmQgJiYgZ2V0TEhTS2luZCgpID09 IEVtcHR5S2luZCkNCihnZGIpIA0KbGx2bTo6VHdpbmU6OmdldFJIU0tpbmQgKHRoaXM9MHg3 ZmZmOTBiNjliZjApIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FEVC9Ud2luZS5oOjI0 MA0KMjQwCSAgICBOb2RlS2luZCBnZXRSSFNLaW5kKCkgY29uc3QgeyByZXR1cm4gKE5vZGVL aW5kKSBSSFNLaW5kOyB9DQooZ2RiKSANCmxsdm06OlR3aW5lOjppc1ZhbGlkICh0aGlzPTB4 N2ZmZjkwYjY5YmYwKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvVHdpbmUuaDoy MjYNCjIyNgkgICAgICBpZiAoZ2V0TEhTS2luZCgpID09IFR3aW5lS2luZCAmJg0KKGdkYikg DQpsbHZtOjpUd2luZTo6Z2V0TEhTS2luZCAodGhpcz0weDdmZmY5MGI2OWJmMCkgYXQgL3Jv b3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1R3aW5lLmg6MjM3DQoyMzcJICAgIE5vZGVLaW5k IGdldExIU0tpbmQoKSBjb25zdCB7IHJldHVybiAoTm9kZUtpbmQpIExIU0tpbmQ7IH0NCihn ZGIpIA0KbGx2bTo6VHdpbmU6OmlzVmFsaWQgKHRoaXM9MHg3ZmZmOTBiNjliZjApIGF0IC9y b290L2xsdm0vaW5jbHVkZS9sbHZtL0FEVC9Ud2luZS5oOjIyOQ0KMjI5CSAgICAgIGlmIChn ZXRSSFNLaW5kKCkgPT0gVHdpbmVLaW5kICYmDQooZ2RiKSANCmxsdm06OlR3aW5lOjpnZXRS SFNLaW5kICh0aGlzPTB4N2ZmZjkwYjY5YmYwKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2 bS9BRFQvVHdpbmUuaDoyNDANCjI0MAkgICAgTm9kZUtpbmQgZ2V0UkhTS2luZCgpIGNvbnN0 IHsgcmV0dXJuIChOb2RlS2luZCkgUkhTS2luZDsgfQ0KKGdkYikgDQpsbHZtOjpUd2luZTo6 aXNWYWxpZCAodGhpcz0weDdmZmY5MGI2OWJmMCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xs dm0vQURUL1R3aW5lLmg6MjMzDQoyMzMJICAgICAgcmV0dXJuIHRydWU7DQooZ2RiKSANCjIz NAkgICAgfQ0KKGdkYikgDQpsbHZtOjpUd2luZTo6VHdpbmUgKHRoaXM9MHg3ZmZmOTBiNjli ZjAsIFN0cj0weDE2MjhkZDMgIklPIGZhaWx1cmUgb24gb3V0cHV0IHN0cmVhbS4iKSBhdCAv cm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvVHdpbmUuaDoyNzINCjI3MgkgICAgfQ0KKGdk YikgDQpsbHZtOjpyZXBvcnRfZmF0YWxfZXJyb3IgKFJlYXNvbj0uLi4pIGF0IC9yb290L2xs dm0vbGliL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5jcHA6NjQNCjY0CXZvaWQgbGx2bTo6cmVw b3J0X2ZhdGFsX2Vycm9yKGNvbnN0IFR3aW5lICZSZWFzb24pIHsNCihnZGIpIA0KNjUJICBp ZiAoRXJyb3JIYW5kbGVyKSB7DQooZ2RiKSANCjcxCSAgICBTbWFsbFZlY3RvcjxjaGFyLCA2 ND4gQnVmZmVyOw0KKGdkYikgDQpsbHZtOjpTbWFsbFZlY3RvcjxjaGFyLCA2NHU+OjpTbWFs bFZlY3RvciAodGhpcz0weDE0NjAxMjgpIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FE VC9TbWFsbFZlY3Rvci5oOjg3OA0KODc4CSAgU21hbGxWZWN0b3IoKSA6IFNtYWxsVmVjdG9y SW1wbDxUPihOKSB7DQooZ2RiKSANCmxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPjo6U21h bGxWZWN0b3JJbXBsICh0aGlzPTB4MTIsIE49MCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xs dm0vQURUL1NtYWxsVmVjdG9yLmg6Mzc1DQozNzUJICBleHBsaWNpdCBTbWFsbFZlY3Rvcklt cGwodW5zaWduZWQgTikNCihnZGIpIA0KMzc2CSAgICA6IFNtYWxsVmVjdG9yVGVtcGxhdGVC YXNlPFQsIGlzUG9kTGlrZTxUPjo6dmFsdWU+KE4qc2l6ZW9mKFQpKSB7DQooZ2RiKSANCmxs dm06OlNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlPGNoYXIsIHRydWU+OjpTbWFsbFZlY3RvclRl bXBsYXRlQmFzZSAodGhpcz0weDE0MDY2ZGMsIFNpemU9MTQwNzM1NjIxMjc0NTYwKSBhdCAv cm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxWZWN0b3IuaDoyOTINCjI5MgkgIFNt YWxsVmVjdG9yVGVtcGxhdGVCYXNlKHNpemVfdCBTaXplKSA6IFNtYWxsVmVjdG9yVGVtcGxh dGVDb21tb248VD4oU2l6ZSkge30NCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0b3JUZW1wbGF0 ZUNvbW1vbjxjaGFyLCB2b2lkPjo6U21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbiAodGhpcz0w eDE2MTRiNGYsIFNpemU9MjEwMzMxNzYpIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FE VC9TbWFsbFZlY3Rvci5oOjc3DQo3NwkgIFNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb24oc2l6 ZV90IFNpemUpIDogU21hbGxWZWN0b3JCYXNlKCZGaXJzdEVsLCBTaXplKSB7fQ0KKGdkYikg DQpsbHZtOjpTbWFsbFZlY3RvckJhc2U6OlNtYWxsVmVjdG9yQmFzZSAodGhpcz0weDdmZmY5 MGI2OWJjMCwgRmlyc3RFbD0weDE0MTA2OTcsIFNpemU9MjEwMzE5NDkpIGF0IC9yb290L2xs dm0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjM3DQozNwkgIFNtYWxsVmVjdG9y QmFzZSh2b2lkICpGaXJzdEVsLCBzaXplX3QgU2l6ZSkNCihnZGIpIA0KMzgJICAgIDogQmVn aW5YKEZpcnN0RWwpLCBFbmRYKEZpcnN0RWwpLCBDYXBhY2l0eVgoKGNoYXIqKUZpcnN0RWwr U2l6ZSkge30NCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+OjpTbWFsbFZl Y3RvckltcGwgKHRoaXM9MHg3ZmZmOTBiNjliMjAsIE49NjQpIGF0IC9yb290L2xsdm0vaW5j bHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjM3Nw0KMzc3CSAgfQ0KKGdkYikgDQpsbHZt OjpTbWFsbFZlY3RvcjxjaGFyLCA2NHU+OjpTbWFsbFZlY3RvciAodGhpcz0weDdmZmY5MGI2 OWIyMCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1NtYWxsVmVjdG9yLmg6ODc5 DQo4NzkJICB9DQooZ2RiKSANCmxsdm06OnJlcG9ydF9mYXRhbF9lcnJvciAoUmVhc29uPS4u LikgYXQgL3Jvb3QvbGx2bS9saWIvU3VwcG9ydC9FcnJvckhhbmRsaW5nLmNwcDo3Mg0KNzIJ ICAgIHJhd19zdmVjdG9yX29zdHJlYW0gT1MoQnVmZmVyKTsNCihnZGIpIA0KbGx2bTo6cmF3 X3N2ZWN0b3Jfb3N0cmVhbTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSAodGhpcz0weDdmZmY5MGI2 OWIyMCwgTz0uLi4pIGF0IC9yb290L2xsdm0vbGliL1N1cHBvcnQvcmF3X29zdHJlYW0uY3Bw OjcwOQ0KNzA5CXJhd19zdmVjdG9yX29zdHJlYW06OnJhd19zdmVjdG9yX29zdHJlYW0oU21h bGxWZWN0b3JJbXBsPGNoYXI+ICZPKSA6IE9TKE8pIHsNCihnZGIpIA0KbGx2bTo6cmF3X29z dHJlYW06OnJhd19vc3RyZWFtICh0aGlzPTB4MzRlM2EwMCwgdW5idWZmZXJlZD0yNTUpIGF0 IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaDo3Ng0KNzYJ ICBleHBsaWNpdCByYXdfb3N0cmVhbShib29sIHVuYnVmZmVyZWQ9ZmFsc2UpDQooZ2RiKSAN Cjc3CSAgICA6IEJ1ZmZlck1vZGUodW5idWZmZXJlZCA/IFVuYnVmZmVyZWQgOiBJbnRlcm5h bEJ1ZmZlcikgew0KKGdkYikgDQo3OQkgICAgT3V0QnVmU3RhcnQgPSBPdXRCdWZFbmQgPSBP dXRCdWZDdXIgPSAwOw0KKGdkYikgDQo4MAkgIH0NCihnZGIpIA0KbGx2bTo6cmF3X3N2ZWN0 b3Jfb3N0cmVhbTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSAodGhpcz0weDdmZmY5MGI2OWI4MCwg Tz0uLi4pIGF0IC9yb290L2xsdm0vbGliL1N1cHBvcnQvcmF3X29zdHJlYW0uY3BwOjcxNA0K NzE0CSAgT1MucmVzZXJ2ZShPUy5zaXplKCkgKyAxMjgpOw0KKGdkYikgDQpsbHZtOjpTbWFs bFZlY3RvclRlbXBsYXRlQ29tbW9uPGNoYXIsIHZvaWQ+OjpzaXplICh0aGlzPTB4N2YwMDkw YjY5YjIwKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxWZWN0b3IuaDox MjYNCjEyNgkgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gZW5kKCktYmVnaW4o KTsgfQ0KKGdkYikgDQpsbHZtOjpTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPGNoYXIsIHZv aWQ+OjplbmQgKHRoaXM9MHg3ZmZmOTBiNjllMzApIGF0IC9yb290L2xsdm0vaW5jbHVkZS9s bHZtL0FEVC9TbWFsbFZlY3Rvci5oOjExNA0KMTE0CSAgY29uc3RfaXRlcmF0b3IgZW5kKCkg Y29uc3QgeyByZXR1cm4gKGNvbnN0X2l0ZXJhdG9yKXRoaXMtPkVuZFg7IH0NCihnZGIpIA0K bGx2bTo6U21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxjaGFyLCB2b2lkPjo6YmVnaW4gKHRo aXM9MHg3ZmZmOTBiNjliMjApIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FEVC9TbWFs bFZlY3Rvci5oOjExMg0KMTEyCSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJl dHVybiAoY29uc3RfaXRlcmF0b3IpdGhpcy0+QmVnaW5YOyB9DQooZ2RiKSANCmxsdm06OlNt YWxsVmVjdG9ySW1wbDxjaGFyPjo6cmVzZXJ2ZSAodGhpcz0weDdmZmY5MGI2OWIyMCwgTj02 NCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1NtYWxsVmVjdG9yLmg6NDE5DQo0 MTkJICB2b2lkIHJlc2VydmUodW5zaWduZWQgTikgew0KKGdkYikgDQo0MjAJICAgIGlmICh0 aGlzLT5jYXBhY2l0eSgpIDwgTikNCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0b3JUZW1wbGF0 ZUNvbW1vbjxjaGFyLCB2b2lkPjo6Y2FwYWNpdHkgKHRoaXM9MHg3ZmZmOTBiNjliMjApIGF0 IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjEzMQ0KMTMxCSAg c2l6ZV90IGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gY2FwYWNpdHlfcHRyKCkgLSBiZWdp bigpOyB9DQooZ2RiKSANCmxsdm06OlNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248Y2hhciwg dm9pZD46OmNhcGFjaXR5X3B0ciAodGhpcz0weDdmZmY5MGI2OWIyMCkgYXQgL3Jvb3QvbGx2 bS9pbmNsdWRlL2xsdm0vQURUL1NtYWxsVmVjdG9yLmg6MTE3DQoxMTcJICBjb25zdF9pdGVy YXRvciBjYXBhY2l0eV9wdHIoKSBjb25zdCB7IHJldHVybiAoY29uc3RfaXRlcmF0b3IpdGhp cy0+Q2FwYWNpdHlYO30NCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1v bjxjaGFyLCB2b2lkPjo6YmVnaW4gKHRoaXM9MHg3ZmZmOTBiNjliMjApIGF0IC9yb290L2xs dm0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjExMg0KMTEyCSAgY29uc3RfaXRl cmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiAoY29uc3RfaXRlcmF0b3IpdGhpcy0+QmVn aW5YOyB9DQooZ2RiKSANCmxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPjo6cmVzZXJ2ZSAo dGhpcz0weDdmZmY5MGI2OWIyMCwgTj0xMjgpIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZt L0FEVC9TbWFsbFZlY3Rvci5oOjQyMQ0KNDIxCSAgICAgIHRoaXMtPmdyb3coTik7DQooZ2Ri KSANCmxsdm06OlNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlPGNoYXIsIHRydWU+Ojpncm93ICh0 aGlzPTB4N2ZmZjkwYjY5YjIwLCBNaW5TaXplPTY0KSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUv bGx2bS9BRFQvU21hbGxWZWN0b3IuaDozNDANCjM0MAkgIHZvaWQgZ3JvdyhzaXplX3QgTWlu U2l6ZSA9IDApIHsNCihnZGIpIA0KMzQxCSAgICB0aGlzLT5ncm93X3BvZChNaW5TaXplKnNp emVvZihUKSwgc2l6ZW9mKFQpKTsNCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0b3JUZW1wbGF0 ZUNvbW1vbjxjaGFyLCB2b2lkPjo6Z3Jvd19wb2QgKHRoaXM9MHg0MCwgTWluU2l6ZUluQnl0 ZXM9MTIzODc4MDgsIFRTaXplPTE0MDczNTYyMTI3NDQwMCkgYXQgL3Jvb3QvbGx2bS9pbmNs dWRlL2xsdm0vQURUL1NtYWxsVmVjdG9yLmg6NzkNCjc5CSAgdm9pZCBncm93X3BvZChzaXpl X3QgTWluU2l6ZUluQnl0ZXMsIHNpemVfdCBUU2l6ZSkgew0KKGdkYikgDQo4MAkgICAgU21h bGxWZWN0b3JCYXNlOjpncm93X3BvZCgmRmlyc3RFbCwgTWluU2l6ZUluQnl0ZXMsIFRTaXpl KTsNCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0b3JCYXNlOjpncm93X3BvZCAodGhpcz0weDM0 ZTNlYjgsIEZpcnN0RWw9MHgxNjE0YjRmLCBNaW5TaXplSW5CeXRlcz0xNDA3MzU2MjEyNzM4 NjgsIFRTaXplPTE0MDczNTYyMTI3Mzc5MikNCiAgICBhdCAvcm9vdC9sbHZtL2xpYi9TdXBw b3J0L1NtYWxsVmVjdG9yLmNwcDoyMA0KMjAJICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHNpemVfdCBUU2l6ZSkgew0KKGdkYikgDQoyMQkgIHNpemVfdCBDdXJTaXplQnl0ZXMg PSBzaXplX2luX2J5dGVzKCk7DQooZ2RiKSANCmxsdm06OlNtYWxsVmVjdG9yQmFzZTo6c2l6 ZV9pbl9ieXRlcyAodGhpcz0weDI3KSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQv U21hbGxWZWN0b3IuaDo0Ng0KNDYJICBzaXplX3Qgc2l6ZV9pbl9ieXRlcygpIGNvbnN0IHsN CihnZGIpIA0KNDcJICAgIHJldHVybiBzaXplX3QoKGNoYXIqKUVuZFggLSAoY2hhciopQmVn aW5YKTsNCihnZGIpIA0KNDgJICB9DQooZ2RiKSANCmxsdm06OlNtYWxsVmVjdG9yQmFzZTo6 Z3Jvd19wb2QgKHRoaXM9MHg3ZmZmOTBiNjliMjAsIEZpcnN0RWw9MHg3ZmZmOTBiNjliMzgs IE1pblNpemVJbkJ5dGVzPTEyOCwgVFNpemU9MSkgYXQgL3Jvb3QvbGx2bS9saWIvU3VwcG9y dC9TbWFsbFZlY3Rvci5jcHA6MjINCjIyCSAgc2l6ZV90IE5ld0NhcGFjaXR5SW5CeXRlcyA9 IDIgKiBjYXBhY2l0eV9pbl9ieXRlcygpICsgVFNpemU7IC8vIEFsd2F5cyBncm93Lg0KKGdk YikgDQpsbHZtOjpTbWFsbFZlY3RvckJhc2U6OmNhcGFjaXR5X2luX2J5dGVzICh0aGlzPTB4 N2ZmZjkwYjY5YjIwKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxWZWN0 b3IuaDo1MQ0KNTEJICBzaXplX3QgY2FwYWNpdHlfaW5fYnl0ZXMoKSBjb25zdCB7DQooZ2Ri KSANCjUyCSAgICByZXR1cm4gc2l6ZV90KChjaGFyKilDYXBhY2l0eVggLSAoY2hhciopQmVn aW5YKTsNCihnZGIpIA0KNTMJICB9DQooZ2RiKSANCmxsdm06OlNtYWxsVmVjdG9yQmFzZTo6 Z3Jvd19wb2QgKHRoaXM9MHg3ZmZmOTBiNjliMjAsIEZpcnN0RWw9MHg3ZmZmOTBiNjliMzgs IE1pblNpemVJbkJ5dGVzPTEyOCwgVFNpemU9MSkgYXQgL3Jvb3QvbGx2bS9saWIvU3VwcG9y dC9TbWFsbFZlY3Rvci5jcHA6MjMNCjIzCSAgaWYgKE5ld0NhcGFjaXR5SW5CeXRlcyA8IE1p blNpemVJbkJ5dGVzKQ0KKGdkYikgDQoyNwkgIGlmIChCZWdpblggPT0gRmlyc3RFbCkgew0K KGdkYikgDQoyOAkgICAgTmV3RWx0cyA9IG1hbGxvYyhOZXdDYXBhY2l0eUluQnl0ZXMpOw0K KGdkYikgDQozMQkgICAgbWVtY3B5KE5ld0VsdHMsIHRoaXMtPkJlZ2luWCwgQ3VyU2l6ZUJ5 dGVzKTsNCihnZGIpIA0KMzcJICB0aGlzLT5FbmRYID0gKGNoYXIqKU5ld0VsdHMrQ3VyU2l6 ZUJ5dGVzOw0KKGdkYikgDQozOAkgIHRoaXMtPkJlZ2luWCA9IE5ld0VsdHM7DQooZ2RiKSAN CjM5CSAgdGhpcy0+Q2FwYWNpdHlYID0gKGNoYXIqKXRoaXMtPkJlZ2luWCArIE5ld0NhcGFj aXR5SW5CeXRlczsNCihnZGIpIA0KNDAJfQ0KKGdkYikgDQpsbHZtOjpTbWFsbFZlY3RvclRl bXBsYXRlQ29tbW9uPGNoYXIsIHZvaWQ+Ojpncm93X3BvZCAodGhpcz0weDdmZmY5MGI2OWIy MCwgTWluU2l6ZUluQnl0ZXM9MTI4LCBUU2l6ZT0xKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUv bGx2bS9BRFQvU21hbGxWZWN0b3IuaDo4MQ0KODEJICB9DQooZ2RiKSANCmxsdm06OlNtYWxs VmVjdG9yVGVtcGxhdGVCYXNlPGNoYXIsIHRydWU+Ojpncm93ICh0aGlzPTB4N2ZmZjkwYjY5 YjIwLCBNaW5TaXplPTEyOCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1NtYWxs VmVjdG9yLmg6MzQyDQozNDIJICB9DQooZ2RiKSANCmxsdm06OlNtYWxsVmVjdG9ySW1wbDxj aGFyPjo6cmVzZXJ2ZSAodGhpcz0weDdmZmY5MGI2OWIyMCwgTj0xMjgpIGF0IC9yb290L2xs dm0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjQyMg0KNDIyCSAgfQ0KKGdkYikg DQpsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtICh0aGlz PTB4N2ZmZjkwYjY5YjgwLCBPPS4uLikgYXQgL3Jvb3QvbGx2bS9saWIvU3VwcG9ydC9yYXdf b3N0cmVhbS5jcHA6NzE1DQo3MTUJICBTZXRCdWZmZXIoT1MuZW5kKCksIE9TLmNhcGFjaXR5 KCkgLSBPUy5zaXplKCkpOw0KKGdkYikgDQpsbHZtOjpTbWFsbFZlY3RvclRlbXBsYXRlQ29t bW9uPGNoYXIsIHZvaWQ+OjpjYXBhY2l0eSAodGhpcz0weDdmZmY5MGI2OWIyMCkgYXQgL3Jv b3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1NtYWxsVmVjdG9yLmg6MTMxDQoxMzEJICBzaXpl X3QgY2FwYWNpdHkoKSBjb25zdCB7IHJldHVybiBjYXBhY2l0eV9wdHIoKSAtIGJlZ2luKCk7 IH0NCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxjaGFyLCB2b2lk Pjo6Y2FwYWNpdHlfcHRyICh0aGlzPTB4MWUpIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZt L0FEVC9TbWFsbFZlY3Rvci5oOjExNw0KMTE3CSAgY29uc3RfaXRlcmF0b3IgY2FwYWNpdHlf cHRyKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0X2l0ZXJhdG9yKXRoaXMtPkNhcGFjaXR5WDt9 DQooZ2RiKSANCmxsdm06OlNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248Y2hhciwgdm9pZD46 OmJlZ2luICh0aGlzPTB4N2ZmZjkwYjY5YjIwKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2 bS9BRFQvU21hbGxWZWN0b3IuaDoxMTINCjExMgkgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkg Y29uc3QgeyByZXR1cm4gKGNvbnN0X2l0ZXJhdG9yKXRoaXMtPkJlZ2luWDsgfQ0KKGdkYikg DQpsbHZtOjpTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPGNoYXIsIHZvaWQ+OjpzaXplICh0 aGlzPTB4N2ZmZjkwYjY5YjIwKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvU21h bGxWZWN0b3IuaDoxMjYNCjEyNgkgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4g ZW5kKCktYmVnaW4oKTsgfQ0KKGdkYikgDQpsbHZtOjpTbWFsbFZlY3RvclRlbXBsYXRlQ29t bW9uPGNoYXIsIHZvaWQ+OjplbmQgKHRoaXM9MHg3ZmZmOTBiNjliMjApIGF0IC9yb290L2xs dm0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjExNA0KMTE0CSAgY29uc3RfaXRl cmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0X2l0ZXJhdG9yKXRoaXMtPkVuZFg7 IH0NCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxjaGFyLCB2b2lk Pjo6YmVnaW4gKHRoaXM9MHg3ZmZmOTBiNjliMjApIGF0IC9yb290L2xsdm0vaW5jbHVkZS9s bHZtL0FEVC9TbWFsbFZlY3Rvci5oOjExMg0KMTEyCSAgY29uc3RfaXRlcmF0b3IgYmVnaW4o KSBjb25zdCB7IHJldHVybiAoY29uc3RfaXRlcmF0b3IpdGhpcy0+QmVnaW5YOyB9DQooZ2Ri KSANCmxsdm06OlNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248Y2hhciwgdm9pZD46OmVuZCAo dGhpcz0weDgxKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxWZWN0b3Iu aDoxMTMNCjExMwkgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIChpdGVyYXRvcil0aGlzLT5F bmRYOyB9DQooZ2RiKSANCmxsdm06OnJhd19vc3RyZWFtOjpTZXRCdWZmZXIgKHRoaXM9MHg3 ZmZmOTBiNjliMjAsIEJ1ZmZlclN0YXJ0PTB4ODAwMzRmMDc2MiA8QWRkcmVzcyAweDgwMDM0 ZjA3NjIgb3V0IG9mIGJvdW5kcz4sIFNpemU9MTIzNzM3NzcpDQogICAgYXQgL3Jvb3QvbGx2 bS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oOjI3NQ0KMjc1CSAgdm9pZCBT ZXRCdWZmZXIoY2hhciAqQnVmZmVyU3RhcnQsIHNpemVfdCBTaXplKSB7DQooZ2RiKSANCjI3 NgkgICAgU2V0QnVmZmVyQW5kTW9kZShCdWZmZXJTdGFydCwgU2l6ZSwgRXh0ZXJuYWxCdWZm ZXIpOw0KKGdkYikgDQpsbHZtOjpyYXdfb3N0cmVhbTo6U2V0QnVmZmVyQW5kTW9kZSAodGhp cz0weGNiYzVkYywgQnVmZmVyU3RhcnQ9MHgxZSA8QWRkcmVzcyAweDFlIG91dCBvZiBib3Vu ZHM+LCBTaXplPTE0MDczNTYyMTI3NDQwMCwgTW9kZT1sbHZtOjpyYXdfb3N0cmVhbTo6VW5i dWZmZXJlZCkNCiAgICBhdCAvcm9vdC9sbHZtL2xpYi9TdXBwb3J0L3Jhd19vc3RyZWFtLmNw cDo4OA0KODgJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJLaW5k IE1vZGUpIHsNCihnZGIpIA0KOTEJICAgICAgICAgInN0cmVhbSBtdXN0IGJlIHVuYnVmZmVy ZWQgb3IgaGF2ZSBhdCBsZWFzdCBvbmUgYnl0ZSIpOw0KKGdkYikgDQo5NAkgIGFzc2VydChH ZXROdW1CeXRlc0luQnVmZmVyKCkgPT0gMCAmJiAiQ3VycmVudCBidWZmZXIgaXMgbm9uLWVt cHR5ISIpOw0KKGdkYikgDQpsbHZtOjpyYXdfb3N0cmVhbTo6R2V0TnVtQnl0ZXNJbkJ1ZmZl ciAodGhpcz0weDdmZmY5MGI2OWIzOCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vU3Vw cG9ydC9yYXdfb3N0cmVhbS5oOjEyMQ0KMTIxCSAgc2l6ZV90IEdldE51bUJ5dGVzSW5CdWZm ZXIoKSBjb25zdCB7DQooZ2RiKSANCjEyMgkgICAgcmV0dXJuIE91dEJ1ZkN1ciAtIE91dEJ1 ZlN0YXJ0Ow0KKGdkYikgDQoxMjMJICB9DQooZ2RiKSANCmxsdm06OnJhd19vc3RyZWFtOjpT ZXRCdWZmZXJBbmRNb2RlICh0aGlzPTB4N2ZmZjkwYjY5YjgwLCBCdWZmZXJTdGFydD0weDM0 ZWZjNjAgIlwzMjBcMDAxT1wwMDMiLCBTaXplPTEyOSwgTW9kZT1sbHZtOjpyYXdfb3N0cmVh bTo6RXh0ZXJuYWxCdWZmZXIpDQogICAgYXQgL3Jvb3QvbGx2bS9saWIvU3VwcG9ydC9yYXdf b3N0cmVhbS5jcHA6OTYNCjk2CSAgaWYgKEJ1ZmZlck1vZGUgPT0gSW50ZXJuYWxCdWZmZXIp DQooZ2RiKSANCjk3CSAgICBkZWxldGUgW10gT3V0QnVmU3RhcnQ7DQooZ2RiKSANCjk4CSAg T3V0QnVmU3RhcnQgPSBCdWZmZXJTdGFydDsNCihnZGIpIA0KOTkJICBPdXRCdWZFbmQgPSBP dXRCdWZTdGFydCtTaXplOw0KKGdkYikgDQoxMDAJICBPdXRCdWZDdXIgPSBPdXRCdWZTdGFy dDsNCihnZGIpIA0KMTAxCSAgQnVmZmVyTW9kZSA9IE1vZGU7DQooZ2RiKSANCjEwMwkgIGFz c2VydChPdXRCdWZTdGFydCA8PSBPdXRCdWZFbmQgJiYgIkludmFsaWQgc2l6ZSEiKTsNCihn ZGIpIA0KMTA0CX0NCihnZGIpIA0KbGx2bTo6cmF3X29zdHJlYW06OlNldEJ1ZmZlciAodGhp cz0weDdmZmY5MGI2OWI4MCwgQnVmZmVyU3RhcnQ9MHgzNGVmYzYwICJcMzIwXDAwMU9cMDAz IiwgU2l6ZT0xMjkpIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvcmF3X29z dHJlYW0uaDoyNzcNCjI3NwkgIH0NCihnZGIpIA0KbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVh bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSAodGhpcz0weDdmZmY5MGI2OWI4MCwgTz0uLi4pIGF0 IC9yb290L2xsdm0vbGliL1N1cHBvcnQvcmF3X29zdHJlYW0uY3BwOjcxNg0KNzE2CX0NCihn ZGIpIA0KbGx2bTo6cmVwb3J0X2ZhdGFsX2Vycm9yIChSZWFzb249Li4uKSBhdCAvcm9vdC9s bHZtL2xpYi9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuY3BwOjczDQo3MwkgICAgT1MgPDwgIkxM Vk0gRVJST1I6ICIgPDwgUmVhc29uIDw8ICJcbiI7DQooZ2RiKSANCmxsdm06OnJhd19vc3Ry ZWFtOjpvcGVyYXRvcjw8ICh0aGlzPTB4MTQ1MjA1ZiwgU3RyPTB4ODEgPEFkZHJlc3MgMHg4 MSBvdXQgb2YgYm91bmRzPikgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9y YXdfb3N0cmVhbS5oOjE2OA0KMTY4CSAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwoY29uc3Qg Y2hhciAqU3RyKSB7DQooZ2RiKSANCjE3MgkgICAgcmV0dXJuIHRoaXMtPm9wZXJhdG9yPDwo U3RyaW5nUmVmKFN0cikpOw0KKGdkYikgDQpsbHZtOjpTdHJpbmdSZWY6OlN0cmluZ1JlZiAo dGhpcz0weDgxLCBTdHI9MHg3ZmZmOTBiNjliMjAgImBcMzc0TlwwMDMiKSBhdCAvcm9vdC9s bHZtL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nUmVmLmg6NzYNCjc2CSAgICAvKmltcGxpY2l0 Ki8gU3RyaW5nUmVmKGNvbnN0IGNoYXIgKlN0cikNCihnZGIpIA0KNzcJICAgICAgOiBEYXRh KFN0cikgew0KKGdkYikgDQo3OAkgICAgICAgIGFzc2VydChTdHIgJiYgIlN0cmluZ1JlZiBj YW5ub3QgYmUgYnVpbHQgZnJvbSBhIE5VTEwgYXJndW1lbnQiKTsNCihnZGIpIA0KNzkJICAg ICAgICBMZW5ndGggPSA6OnN0cmxlbihTdHIpOyAvLyBpbnZva2luZyBzdHJsZW4oTlVMTCkg aXMgdW5kZWZpbmVkIGJlaGF2aW9yDQooZ2RiKSANCjgwCSAgICAgIH0NCihnZGIpIA0KbGx2 bTo6cmF3X29zdHJlYW06Om9wZXJhdG9yPDwgKHRoaXM9MHg4NDU3MDcsIFN0cj0uLi4pIGF0 IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaDoxNTUNCjE1 NQkgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KFN0cmluZ1JlZiBTdHIpIHsNCihnZGIpIA0K MTU3CSAgICBzaXplX3QgU2l6ZSA9IFN0ci5zaXplKCk7DQooZ2RiKSANCmxsdm06OlN0cmlu Z1JlZjo6c2l6ZSAodGhpcz0weDIwMDAwMDA4MCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xs dm0vQURUL1N0cmluZ1JlZi5oOjExMw0KMTEzCSAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsg cmV0dXJuIExlbmd0aDsgfQ0KKGdkYikgDQpsbHZtOjpyYXdfb3N0cmVhbTo6b3BlcmF0b3I8 PCAodGhpcz0weDdmZmY5MGI2OWI4MCwgU3RyPS4uLikgYXQgL3Jvb3QvbGx2bS9pbmNsdWRl L2xsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oOjE2MA0KMTYwCSAgICBpZiAoT3V0QnVmQ3Vy K1NpemUgPiBPdXRCdWZFbmQpDQooZ2RiKSANCjE2MwkgICAgbWVtY3B5KE91dEJ1ZkN1ciwg U3RyLmRhdGEoKSwgU2l6ZSk7DQooZ2RiKSANCmxsdm06OlN0cmluZ1JlZjo6ZGF0YSAodGhp cz0weDdmZmY5MGI2OWE5OCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1N0cmlu Z1JlZi5oOjEwNw0KMTA3CSAgICBjb25zdCBjaGFyICpkYXRhKCkgY29uc3QgeyByZXR1cm4g RGF0YTsgfQ0KKGdkYikgDQpsbHZtOjpyYXdfb3N0cmVhbTo6b3BlcmF0b3I8PCAodGhpcz0w eDdmZmY5MGI2OWI4MCwgU3RyPS4uLikgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vU3Vw cG9ydC9yYXdfb3N0cmVhbS5oOjE2NA0KMTY0CSAgICBPdXRCdWZDdXIgKz0gU2l6ZTsNCihn ZGIpIA0KMTY1CSAgICByZXR1cm4gKnRoaXM7DQooZ2RiKSANCjE2NgkgIH0NCihnZGIpIA0K bGx2bTo6cmF3X29zdHJlYW06Om9wZXJhdG9yPDwgKHRoaXM9MHg3ZmZmOTBiNjliODAsIFN0 cj0weDE2MjNhYzcgIkxMVk0gRVJST1I6ICIpIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZt L1N1cHBvcnQvcmF3X29zdHJlYW0uaDoxNzMNCjE3MwkgIH0NCihnZGIpIA0KbGx2bTo6b3Bl cmF0b3I8PCAoT1M9Li4uLCBSSFM9Li4uKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9B RFQvVHdpbmUuaDo1MTYNCjUxNgkgIGlubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChy YXdfb3N0cmVhbSAmT1MsIGNvbnN0IFR3aW5lICZSSFMpIHsNCihnZGIpIA0KNTE3CSAgICBS SFMucHJpbnQoT1MpOw0KKGdkYikgDQpsbHZtOjpUd2luZTo6cHJpbnQgKHRoaXM9MHg4NDVj NWIsIE9TPS4uLikgYXQgL3Jvb3QvbGx2bS9saWIvU3VwcG9ydC9Ud2luZS5jcHA6MTUyDQox NTIJdm9pZCBUd2luZTo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7DQooZ2RiKSAN CjE1MwkgIHByaW50T25lQ2hpbGQoT1MsIExIUywgZ2V0TEhTS2luZCgpKTsNCihnZGIpIA0K bGx2bTo6VHdpbmU6OmdldExIU0tpbmQgKHRoaXM9MHgxNjIzYWM3KSBhdCAvcm9vdC9sbHZt L2luY2x1ZGUvbGx2bS9BRFQvVHdpbmUuaDoyMzcNCjIzNwkgICAgTm9kZUtpbmQgZ2V0TEhT S2luZCgpIGNvbnN0IHsgcmV0dXJuIChOb2RlS2luZCkgTEhTS2luZDsgfQ0KKGdkYikgDQps bHZtOjpUd2luZTo6cHJpbnRPbmVDaGlsZCAodGhpcz0weDdmZmY5MGI2OWI4MCwgT1M9Li4u LCBQdHI9Li4uLCBLaW5kPWxsdm06OlR3aW5lOjpOdWxsS2luZCkgYXQgL3Jvb3QvbGx2bS9s aWIvU3VwcG9ydC9Ud2luZS5jcHA6NTkNCjU5CSAgICAgICAgICAgICAgICAgICAgICAgICAg Tm9kZUtpbmQgS2luZCkgY29uc3Qgew0KKGdkYikgDQo2MAkgIHN3aXRjaCAoS2luZCkgew0K KGdkYikgDQo2NwkgICAgT1MgPDwgUHRyLmNTdHJpbmc7DQooZ2RiKSANCmxsdm06OnJhd19v c3RyZWFtOjpvcGVyYXRvcjw8ICh0aGlzPTB4ODEsIFN0cj0weDM0ZWZjNjAgIkxMVk0gRVJS T1I6IFwyMjZcMTc3IikgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9yYXdf b3N0cmVhbS5oOjE2OA0KMTY4CSAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwoY29uc3QgY2hh ciAqU3RyKSB7DQooZ2RiKSANCjE3MgkgICAgcmV0dXJuIHRoaXMtPm9wZXJhdG9yPDwoU3Ry aW5nUmVmKFN0cikpOw0KKGdkYikgDQpsbHZtOjpTdHJpbmdSZWY6OlN0cmluZ1JlZiAodGhp cz0weDdmZmY5MGI2OWIyMCwgU3RyPTB4N2ZmZjkwYjY5YjM4ICJAIikgYXQgL3Jvb3QvbGx2 bS9pbmNsdWRlL2xsdm0vQURUL1N0cmluZ1JlZi5oOjc2DQo3NgkgICAgLyppbXBsaWNpdCov IFN0cmluZ1JlZihjb25zdCBjaGFyICpTdHIpDQooZ2RiKSANCjc3CSAgICAgIDogRGF0YShT dHIpIHsNCihnZGIpIA0KNzgJICAgICAgICBhc3NlcnQoU3RyICYmICJTdHJpbmdSZWYgY2Fu bm90IGJlIGJ1aWx0IGZyb20gYSBOVUxMIGFyZ3VtZW50Iik7DQooZ2RiKSANCjc5CSAgICAg ICAgTGVuZ3RoID0gOjpzdHJsZW4oU3RyKTsgLy8gaW52b2tpbmcgc3RybGVuKE5VTEwpIGlz IHVuZGVmaW5lZCBiZWhhdmlvcg0KKGdkYikgDQo4MAkgICAgICB9DQooZ2RiKSANCmxsdm06 OnJhd19vc3RyZWFtOjpvcGVyYXRvcjw8ICh0aGlzPTB4ODQ1NzA3LCBTdHI9Li4uKSBhdCAv cm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmg6MTU1DQoxNTUJ ICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChTdHJpbmdSZWYgU3RyKSB7DQooZ2RiKSANCjE1 NwkgICAgc2l6ZV90IFNpemUgPSBTdHIuc2l6ZSgpOw0KKGdkYikgDQpsbHZtOjpTdHJpbmdS ZWY6OnNpemUgKHRoaXM9MHg4NDNmMTgpIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FE VC9TdHJpbmdSZWYuaDoxMTMNCjExMwkgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVy biBMZW5ndGg7IH0NCihnZGIpIA0KbGx2bTo6cmF3X29zdHJlYW06Om9wZXJhdG9yPDwgKHRo aXM9MHg3ZmZmOTBiNjliODAsIFN0cj0uLi4pIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZt L1N1cHBvcnQvcmF3X29zdHJlYW0uaDoxNjANCjE2MAkgICAgaWYgKE91dEJ1ZkN1citTaXpl ID4gT3V0QnVmRW5kKQ0KKGdkYikgDQoxNjMJICAgIG1lbWNweShPdXRCdWZDdXIsIFN0ci5k YXRhKCksIFNpemUpOw0KKGdkYikgDQpsbHZtOjpTdHJpbmdSZWY6OmRhdGEgKHRoaXM9MHg3 ZmZmOTBiNjlhMTgpIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FEVC9TdHJpbmdSZWYu aDoxMDcNCjEwNwkgICAgY29uc3QgY2hhciAqZGF0YSgpIGNvbnN0IHsgcmV0dXJuIERhdGE7 IH0NCihnZGIpIA0KbGx2bTo6cmF3X29zdHJlYW06Om9wZXJhdG9yPDwgKHRoaXM9MHg3ZmZm OTBiNjliODAsIFN0cj0uLi4pIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL1N1cHBvcnQv cmF3X29zdHJlYW0uaDoxNjQNCjE2NAkgICAgT3V0QnVmQ3VyICs9IFNpemU7DQooZ2RiKSAN CjE2NQkgICAgcmV0dXJuICp0aGlzOw0KKGdkYikgDQoxNjYJICB9DQooZ2RiKSANCmxsdm06 OnJhd19vc3RyZWFtOjpvcGVyYXRvcjw8ICh0aGlzPTB4N2ZmZjkwYjY5YjgwLCBTdHI9MHgx NjI4ZGQzICJJTyBmYWlsdXJlIG9uIG91dHB1dCBzdHJlYW0uIikgYXQgL3Jvb3QvbGx2bS9p bmNsdWRlL2xsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oOjE3Mw0KMTczCSAgfQ0KKGdkYikg DQpsbHZtOjpUd2luZTo6cHJpbnRPbmVDaGlsZCAodGhpcz0weDdmZmY5MGI2OWJmMCwgT1M9 Li4uLCBQdHI9Li4uLCBLaW5kPWxsdm06OlR3aW5lOjpDU3RyaW5nS2luZCkgYXQgL3Jvb3Qv bGx2bS9saWIvU3VwcG9ydC9Ud2luZS5jcHA6NjgNCjY4CSAgICBicmVhazsNCihnZGIpIA0K MTAwCX0NCihnZGIpIA0KbGx2bTo6VHdpbmU6OnByaW50ICh0aGlzPTB4N2ZmZjkwYjY5YmYw LCBPUz0uLi4pIGF0IC9yb290L2xsdm0vbGliL1N1cHBvcnQvVHdpbmUuY3BwOjE1NA0KMTU0 CSAgcHJpbnRPbmVDaGlsZChPUywgUkhTLCBnZXRSSFNLaW5kKCkpOw0KKGdkYikgDQpsbHZt OjpUd2luZTo6Z2V0UkhTS2luZCAodGhpcz0weDdmZmY5MGI2OWJmMCkgYXQgL3Jvb3QvbGx2 bS9pbmNsdWRlL2xsdm0vQURUL1R3aW5lLmg6MjQwDQoyNDAJICAgIE5vZGVLaW5kIGdldFJI U0tpbmQoKSBjb25zdCB7IHJldHVybiAoTm9kZUtpbmQpIFJIU0tpbmQ7IH0NCihnZGIpIA0K bGx2bTo6VHdpbmU6OnByaW50T25lQ2hpbGQgKHRoaXM9MHg3ZmZmOTBiNjliZjAsIE9TPS4u LiwgUHRyPS4uLiwgS2luZD1sbHZtOjpUd2luZTo6Q1N0cmluZ0tpbmQpIGF0IC9yb290L2xs dm0vbGliL1N1cHBvcnQvVHdpbmUuY3BwOjU5DQo1OQkgICAgICAgICAgICAgICAgICAgICAg ICAgIE5vZGVLaW5kIEtpbmQpIGNvbnN0IHsNCihnZGIpIA0KNjAJICBzd2l0Y2ggKEtpbmQp IHsNCihnZGIpIA0KNjEJICBjYXNlIFR3aW5lOjpOdWxsS2luZDogYnJlYWs7DQooZ2RiKSAN CjEwMAl9DQooZ2RiKSANCmxsdm06OlR3aW5lOjpwcmludCAodGhpcz0weDdmZmY5MGI2OWJm MCwgT1M9Li4uKSBhdCAvcm9vdC9sbHZtL2xpYi9TdXBwb3J0L1R3aW5lLmNwcDoxNTUNCjE1 NQl9DQooZ2RiKSANCmxsdm06Om9wZXJhdG9yPDwgKE9TPS4uLiwgUkhTPS4uLikgYXQgL3Jv b3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1R3aW5lLmg6NTE4DQo1MTgJICAgIHJldHVybiBP UzsNCihnZGIpIA0KNTE5CSAgfQ0KKGdkYikgDQpsbHZtOjpyYXdfb3N0cmVhbTo6b3BlcmF0 b3I8PCAodGhpcz0weGZjNjZhMywgU3RyPTB4MWUgPEFkZHJlc3MgMHgxZSBvdXQgb2YgYm91 bmRzPikgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5o OjE2OA0KMTY4CSAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwoY29uc3QgY2hhciAqU3RyKSB7 DQooZ2RiKSANCjE3MgkgICAgcmV0dXJuIHRoaXMtPm9wZXJhdG9yPDwoU3RyaW5nUmVmKFN0 cikpOw0KKGdkYikgDQpsbHZtOjpTdHJpbmdSZWY6OlN0cmluZ1JlZiAodGhpcz0weDE0NTAw M2QsIFN0cj0weDdmZmY5MGI2OWJmMCAiXDMyM1wyMTViXDAwMSIpIGF0IC9yb290L2xsdm0v aW5jbHVkZS9sbHZtL0FEVC9TdHJpbmdSZWYuaDo3Ng0KNzYJICAgIC8qaW1wbGljaXQqLyBT dHJpbmdSZWYoY29uc3QgY2hhciAqU3RyKQ0KKGdkYikgDQo3NwkgICAgICA6IERhdGEoU3Ry KSB7DQooZ2RiKSANCjc4CSAgICAgICAgYXNzZXJ0KFN0ciAmJiAiU3RyaW5nUmVmIGNhbm5v dCBiZSBidWlsdCBmcm9tIGEgTlVMTCBhcmd1bWVudCIpOw0KKGdkYikgDQo3OQkgICAgICAg IExlbmd0aCA9IDo6c3RybGVuKFN0cik7IC8vIGludm9raW5nIHN0cmxlbihOVUxMKSBpcyB1 bmRlZmluZWQgYmVoYXZpb3INCihnZGIpIA0KODAJICAgICAgfQ0KKGdkYikgDQpsbHZtOjpy YXdfb3N0cmVhbTo6b3BlcmF0b3I8PCAodGhpcz0weDg0NTcwNywgU3RyPS4uLikgYXQgL3Jv b3QvbGx2bS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oOjE1NQ0KMTU1CSAg cmF3X29zdHJlYW0gJm9wZXJhdG9yPDwoU3RyaW5nUmVmIFN0cikgew0KKGdkYikgDQoxNTcJ ICAgIHNpemVfdCBTaXplID0gU3RyLnNpemUoKTsNCihnZGIpIA0KbGx2bTo6U3RyaW5nUmVm OjpzaXplICh0aGlzPTB4N2ZmZjkwYjY5YTk4KSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2 bS9BRFQvU3RyaW5nUmVmLmg6MTEzDQoxMTMJICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyBy ZXR1cm4gTGVuZ3RoOyB9DQooZ2RiKSANCmxsdm06OnJhd19vc3RyZWFtOjpvcGVyYXRvcjw8 ICh0aGlzPTB4N2ZmZjkwYjY5YjgwLCBTdHI9Li4uKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUv bGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmg6MTYwDQoxNjAJICAgIGlmIChPdXRCdWZDdXIr U2l6ZSA+IE91dEJ1ZkVuZCkNCihnZGIpIA0KMTYzCSAgICBtZW1jcHkoT3V0QnVmQ3VyLCBT dHIuZGF0YSgpLCBTaXplKTsNCihnZGIpIA0KbGx2bTo6U3RyaW5nUmVmOjpkYXRhICh0aGlz PTB4N2ZmZjkwYjY5YTk4KSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5n UmVmLmg6MTA3DQoxMDcJICAgIGNvbnN0IGNoYXIgKmRhdGEoKSBjb25zdCB7IHJldHVybiBE YXRhOyB9DQooZ2RiKSANCmxsdm06OnJhd19vc3RyZWFtOjpvcGVyYXRvcjw8ICh0aGlzPTB4 N2ZmZjkwYjY5YjgwLCBTdHI9Li4uKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9TdXBw b3J0L3Jhd19vc3RyZWFtLmg6MTY0DQoxNjQJICAgIE91dEJ1ZkN1ciArPSBTaXplOw0KKGdk YikgDQoxNjUJICAgIHJldHVybiAqdGhpczsNCihnZGIpIA0KMTY2CSAgfQ0KKGdkYikgDQps bHZtOjpyYXdfb3N0cmVhbTo6b3BlcmF0b3I8PCAodGhpcz0weDdmZmY5MGI2OWI4MCwgU3Ry PTB4MTYyM2FkNCAiXG4iKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3Jh d19vc3RyZWFtLmg6MTczDQoxNzMJICB9DQooZ2RiKSANCmxsdm06OnJlcG9ydF9mYXRhbF9l cnJvciAoUmVhc29uPS4uLikgYXQgL3Jvb3QvbGx2bS9saWIvU3VwcG9ydC9FcnJvckhhbmRs aW5nLmNwcDo3NA0KNzQJICAgIFN0cmluZ1JlZiBNZXNzYWdlU3RyID0gT1Muc3RyKCk7DQoo Z2RiKSANCmxsdm06OnJhd19zdmVjdG9yX29zdHJlYW06OnN0ciAodGhpcz0weDg0NWM1Yikg YXQgL3Jvb3QvbGx2bS9saWIvU3VwcG9ydC9yYXdfb3N0cmVhbS5jcHA6NzYwDQo3NjAJU3Ry aW5nUmVmIHJhd19zdmVjdG9yX29zdHJlYW06OnN0cigpIHsNCihnZGIpIA0KNzYxCSAgZmx1 c2goKTsNCihnZGIpIA0KbGx2bTo6cmF3X29zdHJlYW06OmZsdXNoICh0aGlzPTB4MTYyM2Fk NCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oOjEy OQ0KMTI5CSAgdm9pZCBmbHVzaCgpIHsNCihnZGIpIA0KMTMwCSAgICBpZiAoT3V0QnVmQ3Vy ICE9IE91dEJ1ZlN0YXJ0KQ0KKGdkYikgDQoxMzEJICAgICAgZmx1c2hfbm9uZW1wdHkoKTsN CihnZGIpIA0KbGx2bTo6cmF3X29zdHJlYW06OmZsdXNoX25vbmVtcHR5ICh0aGlzPTB4MWMp IGF0IC9yb290L2xsdm0vbGliL1N1cHBvcnQvcmF3X29zdHJlYW0uY3BwOjI2MA0KMjYwCXZv aWQgcmF3X29zdHJlYW06OmZsdXNoX25vbmVtcHR5KCkgew0KKGdkYikgDQoyNjEJICBhc3Nl cnQoT3V0QnVmQ3VyID4gT3V0QnVmU3RhcnQgJiYgIkludmFsaWQgY2FsbCB0byBmbHVzaF9u b25lbXB0eS4iKTsNCihnZGIpIA0KMjYyCSAgc2l6ZV90IExlbmd0aCA9IE91dEJ1ZkN1ciAt IE91dEJ1ZlN0YXJ0Ow0KKGdkYikgDQoyNjMJICBPdXRCdWZDdXIgPSBPdXRCdWZTdGFydDsN CihnZGIpIA0KMjY0CSAgd3JpdGVfaW1wbChPdXRCdWZTdGFydCwgTGVuZ3RoKTsNCihnZGIp IA0KbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbTo6d3JpdGVfaW1wbCAodGhpcz0weDg0NWM1 YiwgUHRyPTB4MiA8QWRkcmVzcyAweDIgb3V0IG9mIGJvdW5kcz4sIFNpemU9MjgpIGF0IC9y b290L2xsdm0vbGliL1N1cHBvcnQvcmF3X29zdHJlYW0uY3BwOjczNA0KNzM0CXZvaWQgcmF3 X3N2ZWN0b3Jfb3N0cmVhbTo6d3JpdGVfaW1wbChjb25zdCBjaGFyICpQdHIsIHNpemVfdCBT aXplKSB7DQooZ2RiKSANCjczOAkgIGlmIChQdHIgPT0gT1MuZW5kKCkpIHsNCihnZGIpIA0K bGx2bTo6U21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxjaGFyLCB2b2lkPjo6ZW5kICh0aGlz PTB4MWMpIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjEx Mw0KMTEzCSAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gKGl0ZXJhdG9yKXRoaXMtPkVuZFg7 IH0NCihnZGIpIA0KbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbTo6d3JpdGVfaW1wbCAodGhp cz0weDdmZmY5MGI2OWI4MCwgUHRyPTB4MzRlZmM2MCAiTExWTSBFUlJPUjogSU8gZmFpbHVy ZSBvbiBvdXRwdXQgc3RyZWFtLlxuXDM3Nk5cMDAzIiwgU2l6ZT00MSkNCiAgICBhdCAvcm9v dC9sbHZtL2xpYi9TdXBwb3J0L3Jhd19vc3RyZWFtLmNwcDo3MzkNCjczOQkgICAgYXNzZXJ0 KE9TLnNpemUoKSArIFNpemUgPD0gT1MuY2FwYWNpdHkoKSAmJiAiSW52YWxpZCB3cml0ZV9p bXBsKCkgY2FsbCEiKTsNCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1v bjxjaGFyLCB2b2lkPjo6c2l6ZSAodGhpcz0weDE2MjhkZDMpIGF0IC9yb290L2xsdm0vaW5j bHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjEyNg0KMTI2CSAgc2l6ZV90eXBlIHNpemUo KSBjb25zdCB7IHJldHVybiBlbmQoKS1iZWdpbigpOyB9DQooZ2RiKSANCmxsdm06OlNtYWxs VmVjdG9yVGVtcGxhdGVDb21tb248Y2hhciwgdm9pZD46OmVuZCAodGhpcz0weDdmZmY5MGI2 OWExOCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1NtYWxsVmVjdG9yLmg6MTE0 DQoxMTQJICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiAoY29uc3RfaXRl cmF0b3IpdGhpcy0+RW5kWDsgfQ0KKGdkYikgDQpsbHZtOjpTbWFsbFZlY3RvclRlbXBsYXRl Q29tbW9uPGNoYXIsIHZvaWQ+OjpiZWdpbiAodGhpcz0weDdmZmY5MGI2OWIyMCkgYXQgL3Jv b3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1NtYWxsVmVjdG9yLmg6MTEyDQoxMTIJICBjb25z dF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIChjb25zdF9pdGVyYXRvcil0aGlz LT5CZWdpblg7IH0NCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxj aGFyLCB2b2lkPjo6Y2FwYWNpdHkgKHRoaXM9MHg3ZmZmOTBiNjliMjApIGF0IC9yb290L2xs dm0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjEzMQ0KMTMxCSAgc2l6ZV90IGNh cGFjaXR5KCkgY29uc3QgeyByZXR1cm4gY2FwYWNpdHlfcHRyKCkgLSBiZWdpbigpOyB9DQoo Z2RiKSANCmxsdm06OlNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248Y2hhciwgdm9pZD46OmNh cGFjaXR5X3B0ciAodGhpcz0weDdmZmY5MGI2OWIyMCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRl L2xsdm0vQURUL1NtYWxsVmVjdG9yLmg6MTE3DQoxMTcJICBjb25zdF9pdGVyYXRvciBjYXBh Y2l0eV9wdHIoKSBjb25zdCB7IHJldHVybiAoY29uc3RfaXRlcmF0b3IpdGhpcy0+Q2FwYWNp dHlYO30NCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxjaGFyLCB2 b2lkPjo6YmVnaW4gKHRoaXM9MHg3ZmZmOTBiNjliMjApIGF0IC9yb290L2xsdm0vaW5jbHVk ZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjExMg0KMTEyCSAgY29uc3RfaXRlcmF0b3IgYmVn aW4oKSBjb25zdCB7IHJldHVybiAoY29uc3RfaXRlcmF0b3IpdGhpcy0+QmVnaW5YOyB9DQoo Z2RiKSANCmxsdm06OnJhd19zdmVjdG9yX29zdHJlYW06OndyaXRlX2ltcGwgKHRoaXM9MHg3 ZmZmOTBiNjliODAsIFB0cj0weDM0ZWZjNjAgIkxMVk0gRVJST1I6IElPIGZhaWx1cmUgb24g b3V0cHV0IHN0cmVhbS5cblwzNzZOXDAwMyIsIFNpemU9NDEpDQogICAgYXQgL3Jvb3QvbGx2 bS9saWIvU3VwcG9ydC9yYXdfb3N0cmVhbS5jcHA6NzQwDQo3NDAJICAgIE9TLnNldF9zaXpl KE9TLnNpemUoKSArIFNpemUpOw0KKGdkYikgDQpsbHZtOjpTbWFsbFZlY3RvclRlbXBsYXRl Q29tbW9uPGNoYXIsIHZvaWQ+OjpzaXplICh0aGlzPTB4N2ZmZjkwYjY5YjIwKSBhdCAvcm9v dC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxWZWN0b3IuaDoxMjYNCjEyNgkgIHNpemVf dHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gZW5kKCktYmVnaW4oKTsgfQ0KKGdkYikgDQps bHZtOjpTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPGNoYXIsIHZvaWQ+OjplbmQgKHRoaXM9 MHg3ZmZmOTBiNjliMjApIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZl Y3Rvci5oOjExNA0KMTE0CSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4g KGNvbnN0X2l0ZXJhdG9yKXRoaXMtPkVuZFg7IH0NCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0 b3JUZW1wbGF0ZUNvbW1vbjxjaGFyLCB2b2lkPjo6YmVnaW4gKHRoaXM9MHg3ZmZmOTBiNjli MjApIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjExMg0K MTEyCSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiAoY29uc3RfaXRl cmF0b3IpdGhpcy0+QmVnaW5YOyB9DQooZ2RiKSANCmxsdm06OlNtYWxsVmVjdG9ySW1wbDxj aGFyPjo6c2V0X3NpemUgKHRoaXM9MHg3ZmZmOTBiNjliMjAsIE49MCkgYXQgL3Jvb3QvbGx2 bS9pbmNsdWRlL2xsdm0vQURUL1NtYWxsVmVjdG9yLmg6Njk2DQo2OTYJICB2b2lkIHNldF9z aXplKHVuc2lnbmVkIE4pIHsNCihnZGIpIA0KNjk3CSAgICBhc3NlcnQoTiA8PSB0aGlzLT5j YXBhY2l0eSgpKTsNCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxj aGFyLCB2b2lkPjo6Y2FwYWNpdHkgKHRoaXM9MHgxYjUwODgwKSBhdCAvcm9vdC9sbHZtL2lu Y2x1ZGUvbGx2bS9BRFQvU21hbGxWZWN0b3IuaDoxMzENCjEzMQkgIHNpemVfdCBjYXBhY2l0 eSgpIGNvbnN0IHsgcmV0dXJuIGNhcGFjaXR5X3B0cigpIC0gYmVnaW4oKTsgfQ0KKGdkYikg DQpsbHZtOjpTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPGNoYXIsIHZvaWQ+OjpjYXBhY2l0 eV9wdHIgKHRoaXM9MHgwKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxW ZWN0b3IuaDoxMTcNCjExNwkgIGNvbnN0X2l0ZXJhdG9yIGNhcGFjaXR5X3B0cigpIGNvbnN0 IHsgcmV0dXJuIChjb25zdF9pdGVyYXRvcil0aGlzLT5DYXBhY2l0eVg7fQ0KKGdkYikgDQps bHZtOjpTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPGNoYXIsIHZvaWQ+OjpiZWdpbiAodGhp cz0weDdmZmY5MGI2OWIyMCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1NtYWxs VmVjdG9yLmg6MTEyDQoxMTIJICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0 dXJuIChjb25zdF9pdGVyYXRvcil0aGlzLT5CZWdpblg7IH0NCihnZGIpIA0KbGx2bTo6U21h bGxWZWN0b3JJbXBsPGNoYXI+OjpzZXRfc2l6ZSAodGhpcz0weDdmZmY5MGI2OWIyMCwgTj00 MSkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1NtYWxsVmVjdG9yLmg6Njk4DQo2 OTgJICAgIHRoaXMtPnNldEVuZCh0aGlzLT5iZWdpbigpICsgTik7DQooZ2RiKSANCmxsdm06 OlNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248Y2hhciwgdm9pZD46OmJlZ2luICh0aGlzPTB4 MjkpIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjExMQ0K MTExCSAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiAoaXRlcmF0b3IpdGhpcy0+QmVnaW5Y OyB9DQooZ2RiKSANCmxsdm06OlNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248Y2hhciwgdm9p ZD46OnNldEVuZCAodGhpcz0weDdmZmY5MGI2OWIyMCwgUD0weDdmZmY5MGI2OWIyMCAiYFwz NzROXDAwMyIpIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5o Ojk0DQo5NAkgIHZvaWQgc2V0RW5kKFQgKlApIHsgdGhpcy0+RW5kWCA9IFA7IH0NCihnZGIp IA0KbGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+OjpzZXRfc2l6ZSAodGhpcz0weDdmZmY5 MGI2OWIyMCwgTj00MSkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1NtYWxsVmVj dG9yLmg6Njk5DQo2OTkJICB9DQooZ2RiKSANCmxsdm06OnJhd19zdmVjdG9yX29zdHJlYW06 OndyaXRlX2ltcGwgKHRoaXM9MHg3ZmZmOTBiNjliODAsIFB0cj0weDM0ZWZjNjAgIkxMVk0g RVJST1I6IElPIGZhaWx1cmUgb24gb3V0cHV0IHN0cmVhbS5cblwzNzZOXDAwMyIsIFNpemU9 NDEpDQogICAgYXQgL3Jvb3QvbGx2bS9saWIvU3VwcG9ydC9yYXdfb3N0cmVhbS5jcHA6NzQ5 DQo3NDkJICBpZiAoT1MuY2FwYWNpdHkoKSAtIE9TLnNpemUoKSA8IDY0KQ0KKGdkYikgDQps bHZtOjpTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPGNoYXIsIHZvaWQ+OjpjYXBhY2l0eSAo dGhpcz0weDdmZmY5MGI2OWIyMCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1Nt YWxsVmVjdG9yLmg6MTMxDQoxMzEJICBzaXplX3QgY2FwYWNpdHkoKSBjb25zdCB7IHJldHVy biBjYXBhY2l0eV9wdHIoKSAtIGJlZ2luKCk7IH0NCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0 b3JUZW1wbGF0ZUNvbW1vbjxjaGFyLCB2b2lkPjo6Y2FwYWNpdHlfcHRyICh0aGlzPTB4N2Zm ZjkwYjY5YjIwKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxWZWN0b3Iu aDoxMTcNCjExNwkgIGNvbnN0X2l0ZXJhdG9yIGNhcGFjaXR5X3B0cigpIGNvbnN0IHsgcmV0 dXJuIChjb25zdF9pdGVyYXRvcil0aGlzLT5DYXBhY2l0eVg7fQ0KKGdkYikgDQpsbHZtOjpT bWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPGNoYXIsIHZvaWQ+OjpiZWdpbiAodGhpcz0weDdm ZmY5MGI2OWIyMCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1NtYWxsVmVjdG9y Lmg6MTEyDQoxMTIJICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIChj b25zdF9pdGVyYXRvcil0aGlzLT5CZWdpblg7IH0NCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0 b3JUZW1wbGF0ZUNvbW1vbjxjaGFyLCB2b2lkPjo6c2l6ZSAodGhpcz0weDdmZmY5MGI2OWIy MCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1NtYWxsVmVjdG9yLmg6MTI2DQox MjYJICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGVuZCgpLWJlZ2luKCk7IH0N CihnZGIpIA0KbGx2bTo6U21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxjaGFyLCB2b2lkPjo6 ZW5kICh0aGlzPTB4N2ZmZjkwYjY5YjIwKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9B RFQvU21hbGxWZWN0b3IuaDoxMTQNCjExNAkgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0 IHsgcmV0dXJuIChjb25zdF9pdGVyYXRvcil0aGlzLT5FbmRYOyB9DQooZ2RiKSANCmxsdm06 OlNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248Y2hhciwgdm9pZD46OmJlZ2luICh0aGlzPTB4 N2ZmZjkwYjY5YjIwKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxWZWN0 b3IuaDoxMTINCjExMgkgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4g KGNvbnN0X2l0ZXJhdG9yKXRoaXMtPkJlZ2luWDsgfQ0KKGdkYikgDQpsbHZtOjpyYXdfc3Zl Y3Rvcl9vc3RyZWFtOjp3cml0ZV9pbXBsICh0aGlzPTB4N2ZmZjkwYjY5YjgwLCBQdHI9MHgz NGVmYzYwICJMTFZNIEVSUk9SOiBJTyBmYWlsdXJlIG9uIG91dHB1dCBzdHJlYW0uXG5cMzc2 TlwwMDMiLCBTaXplPTQxKQ0KICAgIGF0IC9yb290L2xsdm0vbGliL1N1cHBvcnQvcmF3X29z dHJlYW0uY3BwOjc1Mw0KNzUzCSAgU2V0QnVmZmVyKE9TLmVuZCgpLCBPUy5jYXBhY2l0eSgp IC0gT1Muc2l6ZSgpKTsNCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1v bjxjaGFyLCB2b2lkPjo6Y2FwYWNpdHkgKHRoaXM9MHg3ZmZmOTBiNjliMjApIGF0IC9yb290 L2xsdm0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjEzMQ0KMTMxCSAgc2l6ZV90 IGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gY2FwYWNpdHlfcHRyKCkgLSBiZWdpbigpOyB9 DQooZ2RiKSANCmxsdm06OlNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248Y2hhciwgdm9pZD46 OmNhcGFjaXR5X3B0ciAodGhpcz0weDdmZmY5MGI2OWIyMCkgYXQgL3Jvb3QvbGx2bS9pbmNs dWRlL2xsdm0vQURUL1NtYWxsVmVjdG9yLmg6MTE3DQoxMTcJICBjb25zdF9pdGVyYXRvciBj YXBhY2l0eV9wdHIoKSBjb25zdCB7IHJldHVybiAoY29uc3RfaXRlcmF0b3IpdGhpcy0+Q2Fw YWNpdHlYO30NCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxjaGFy LCB2b2lkPjo6YmVnaW4gKHRoaXM9MHg3ZmZmOTBiNjliMjApIGF0IC9yb290L2xsdm0vaW5j bHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjExMg0KMTEyCSAgY29uc3RfaXRlcmF0b3Ig YmVnaW4oKSBjb25zdCB7IHJldHVybiAoY29uc3RfaXRlcmF0b3IpdGhpcy0+QmVnaW5YOyB9 DQooZ2RiKSANCmxsdm06OlNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248Y2hhciwgdm9pZD46 OnNpemUgKHRoaXM9MHg3ZmZmOTBiNjliMjApIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZt L0FEVC9TbWFsbFZlY3Rvci5oOjEyNg0KMTI2CSAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7 IHJldHVybiBlbmQoKS1iZWdpbigpOyB9DQooZ2RiKSANCmxsdm06OlNtYWxsVmVjdG9yVGVt cGxhdGVDb21tb248Y2hhciwgdm9pZD46OmVuZCAodGhpcz0weDdmZmY5MGI2OWIyMCkgYXQg L3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1NtYWxsVmVjdG9yLmg6MTE0DQoxMTQJICBj b25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiAoY29uc3RfaXRlcmF0b3IpdGhp cy0+RW5kWDsgfQ0KKGdkYikgDQpsbHZtOjpTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPGNo YXIsIHZvaWQ+OjpiZWdpbiAodGhpcz0weDdmZmY5MGI2OWIyMCkgYXQgL3Jvb3QvbGx2bS9p bmNsdWRlL2xsdm0vQURUL1NtYWxsVmVjdG9yLmg6MTEyDQoxMTIJICBjb25zdF9pdGVyYXRv ciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIChjb25zdF9pdGVyYXRvcil0aGlzLT5CZWdpblg7 IH0NCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxjaGFyLCB2b2lk Pjo6ZW5kICh0aGlzPTB4ODEpIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FEVC9TbWFs bFZlY3Rvci5oOjExMw0KMTEzCSAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gKGl0ZXJhdG9y KXRoaXMtPkVuZFg7IH0NCihnZGIpIA0KbGx2bTo6cmF3X29zdHJlYW06OlNldEJ1ZmZlciAo dGhpcz0weDdmZmY5MGI2OWIyMCwgQnVmZmVyU3RhcnQ9MHgyOTAwMDAwMDAwIDxBZGRyZXNz IDB4MjkwMDAwMDAwMCBvdXQgb2YgYm91bmRzPiwgU2l6ZT0xMjM3Mzc3NykNCiAgICBhdCAv cm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmg6Mjc1DQoyNzUJ ICB2b2lkIFNldEJ1ZmZlcihjaGFyICpCdWZmZXJTdGFydCwgc2l6ZV90IFNpemUpIHsNCihn ZGIpIA0KMjc2CSAgICBTZXRCdWZmZXJBbmRNb2RlKEJ1ZmZlclN0YXJ0LCBTaXplLCBFeHRl cm5hbEJ1ZmZlcik7DQooZ2RiKSANCmxsdm06OnJhd19vc3RyZWFtOjpTZXRCdWZmZXJBbmRN b2RlICh0aGlzPTB4Y2JjNjNiLCBCdWZmZXJTdGFydD0weDdmZmY5MGI2OWIyMCAiYFwzNzRO XDAwMyIsIFNpemU9MTcxNzk4NzEzOTIsIE1vZGU9bGx2bTo6cmF3X29zdHJlYW06OlVuYnVm ZmVyZWQpDQogICAgYXQgL3Jvb3QvbGx2bS9saWIvU3VwcG9ydC9yYXdfb3N0cmVhbS5jcHA6 ODgNCjg4CSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyS2luZCBN b2RlKSB7DQooZ2RiKSANCjkxCSAgICAgICAgICJzdHJlYW0gbXVzdCBiZSB1bmJ1ZmZlcmVk IG9yIGhhdmUgYXQgbGVhc3Qgb25lIGJ5dGUiKTsNCihnZGIpIA0KOTQJICBhc3NlcnQoR2V0 TnVtQnl0ZXNJbkJ1ZmZlcigpID09IDAgJiYgIkN1cnJlbnQgYnVmZmVyIGlzIG5vbi1lbXB0 eSEiKTsNCihnZGIpIA0KbGx2bTo6cmF3X29zdHJlYW06OkdldE51bUJ5dGVzSW5CdWZmZXIg KHRoaXM9MHgyNykgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9yYXdfb3N0 cmVhbS5oOjEyMQ0KMTIxCSAgc2l6ZV90IEdldE51bUJ5dGVzSW5CdWZmZXIoKSBjb25zdCB7 DQooZ2RiKSANCjEyMgkgICAgcmV0dXJuIE91dEJ1ZkN1ciAtIE91dEJ1ZlN0YXJ0Ow0KKGdk YikgDQoxMjMJICB9DQooZ2RiKSANCmxsdm06OnJhd19vc3RyZWFtOjpTZXRCdWZmZXJBbmRN b2RlICh0aGlzPTB4N2ZmZjkwYjY5YjgwLCBCdWZmZXJTdGFydD0weDM0ZWZjODkgIlwzNzZO XDAwMyIsIFNpemU9ODgsIE1vZGU9bGx2bTo6cmF3X29zdHJlYW06OkV4dGVybmFsQnVmZmVy KQ0KICAgIGF0IC9yb290L2xsdm0vbGliL1N1cHBvcnQvcmF3X29zdHJlYW0uY3BwOjk2DQo5 NgkgIGlmIChCdWZmZXJNb2RlID09IEludGVybmFsQnVmZmVyKQ0KKGdkYikgDQo5OAkgIE91 dEJ1ZlN0YXJ0ID0gQnVmZmVyU3RhcnQ7DQooZ2RiKSANCjk5CSAgT3V0QnVmRW5kID0gT3V0 QnVmU3RhcnQrU2l6ZTsNCihnZGIpIA0KMTAwCSAgT3V0QnVmQ3VyID0gT3V0QnVmU3RhcnQ7 DQooZ2RiKSANCjEwMQkgIEJ1ZmZlck1vZGUgPSBNb2RlOw0KKGdkYikgDQoxMDMJICBhc3Nl cnQoT3V0QnVmU3RhcnQgPD0gT3V0QnVmRW5kICYmICJJbnZhbGlkIHNpemUhIik7DQooZ2Ri KSANCjEwNAl9DQooZ2RiKSANCmxsdm06OnJhd19vc3RyZWFtOjpTZXRCdWZmZXIgKHRoaXM9 MHg3ZmZmOTBiNjliODAsIEJ1ZmZlclN0YXJ0PTB4MzRlZmM4OSAiXDM3Nk5cMDAzIiwgU2l6 ZT04OCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5o OjI3Nw0KMjc3CSAgfQ0KKGdkYikgDQpsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtOjp3cml0 ZV9pbXBsICh0aGlzPTB4N2ZmZjkwYjY5YjgwLCBQdHI9MHgzNGVmYzYwICJMTFZNIEVSUk9S OiBJTyBmYWlsdXJlIG9uIG91dHB1dCBzdHJlYW0uXG5cMzc2TlwwMDMiLCBTaXplPTQxKQ0K ICAgIGF0IC9yb290L2xsdm0vbGliL1N1cHBvcnQvcmF3X29zdHJlYW0uY3BwOjc1NA0KNzU0 CX0NCihnZGIpIA0KbGx2bTo6cmF3X29zdHJlYW06OmZsdXNoX25vbmVtcHR5ICh0aGlzPTB4 N2ZmZjkwYjY5YjgwKSBhdCAvcm9vdC9sbHZtL2xpYi9TdXBwb3J0L3Jhd19vc3RyZWFtLmNw cDoyNjUNCjI2NQl9DQooZ2RiKSANCmxsdm06OnJhd19vc3RyZWFtOjpmbHVzaCAodGhpcz0w eDdmZmY5MGI2OWI4MCkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9yYXdf b3N0cmVhbS5oOjEzMg0KMTMyCSAgfQ0KKGdkYikgDQpsbHZtOjpyYXdfc3ZlY3Rvcl9vc3Ry ZWFtOjpzdHIgKHRoaXM9MHg3ZmZmOTBiNjliODApIGF0IC9yb290L2xsdm0vbGliL1N1cHBv cnQvcmF3X29zdHJlYW0uY3BwOjc2Mg0KNzYyCSAgcmV0dXJuIFN0cmluZ1JlZihPUy5iZWdp bigpLCBPUy5zaXplKCkpOw0KKGdkYikgDQpsbHZtOjpTbWFsbFZlY3RvclRlbXBsYXRlQ29t bW9uPGNoYXIsIHZvaWQ+OjpzaXplICh0aGlzPTB4N2ZmZjkwYjY5YjgwKSBhdCAvcm9vdC9s bHZtL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxWZWN0b3IuaDoxMjYNCjEyNgkgIHNpemVfdHlw ZSBzaXplKCkgY29uc3QgeyByZXR1cm4gZW5kKCktYmVnaW4oKTsgfQ0KKGdkYikgDQpsbHZt OjpTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPGNoYXIsIHZvaWQ+OjplbmQgKHRoaXM9MHgx ZSkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0vQURUL1NtYWxsVmVjdG9yLmg6MTE0DQox MTQJICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiAoY29uc3RfaXRlcmF0 b3IpdGhpcy0+RW5kWDsgfQ0KKGdkYikgDQpsbHZtOjpTbWFsbFZlY3RvclRlbXBsYXRlQ29t bW9uPGNoYXIsIHZvaWQ+OjpiZWdpbiAodGhpcz0weDdmZmY5MGI2OWIyMCkgYXQgL3Jvb3Qv bGx2bS9pbmNsdWRlL2xsdm0vQURUL1NtYWxsVmVjdG9yLmg6MTEyDQoxMTIJICBjb25zdF9p dGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIChjb25zdF9pdGVyYXRvcil0aGlzLT5C ZWdpblg7IH0NCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxjaGFy LCB2b2lkPjo6YmVnaW4gKHRoaXM9MHgxZSkgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xsdm0v QURUL1NtYWxsVmVjdG9yLmg6MTExDQoxMTEJICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJu IChpdGVyYXRvcil0aGlzLT5CZWdpblg7IH0NCihnZGIpIA0KbGx2bTo6U3RyaW5nUmVmOjpT dHJpbmdSZWYgKHRoaXM9MHg3ZmZmOTBiNjliMjAsIGRhdGE9MHg3Zjk2NjM3N2U1MDcgIlwy MTFEJFwwMjBcMjEzXDAwNVwyMTdcMjEwJSIsIGxlbmd0aD0xMjM3Mzc3NykgYXQgL3Jvb3Qv bGx2bS9pbmNsdWRlL2xsdm0vQURUL1N0cmluZ1JlZi5oOjgzDQo4MwkgICAgLyppbXBsaWNp dCovIFN0cmluZ1JlZihjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKQ0KKGdkYikg DQo4NAkgICAgICA6IERhdGEoZGF0YSksIExlbmd0aChsZW5ndGgpIHsNCihnZGIpIA0KODYJ ICAgICAgICAiU3RyaW5nUmVmIGNhbm5vdCBiZSBidWlsdCBmcm9tIGEgTlVMTCBhcmd1bWVu dCB3aXRoIG5vbi1udWxsIGxlbmd0aCIpOw0KKGdkYikgDQo4NwkgICAgICB9DQooZ2RiKSAN Cmxsdm06OnJhd19zdmVjdG9yX29zdHJlYW06OnN0ciAodGhpcz0weDdmZmY5MGI2OWI4MCkg YXQgL3Jvb3QvbGx2bS9saWIvU3VwcG9ydC9yYXdfb3N0cmVhbS5jcHA6NzYzDQo3NjMJfQ0K KGdkYikgDQpsbHZtOjpyZXBvcnRfZmF0YWxfZXJyb3IgKFJlYXNvbj0uLi4pIGF0IC9yb290 L2xsdm0vbGliL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5jcHA6NzUNCjc1CSAgICBzc2l6ZV90 IHdyaXR0ZW4gPSA6OndyaXRlKDIsIE1lc3NhZ2VTdHIuZGF0YSgpLCBNZXNzYWdlU3RyLnNp emUoKSk7DQooZ2RiKSANCmxsdm06OlN0cmluZ1JlZjo6c2l6ZSAodGhpcz0weDFlKSBhdCAv cm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nUmVmLmg6MTEzDQoxMTMJICAgIHNp emVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gTGVuZ3RoOyB9DQooZ2RiKSANCmxsdm06OlN0 cmluZ1JlZjo6ZGF0YSAodGhpcz0weDdmZmY5MGI2OWJiMCkgYXQgL3Jvb3QvbGx2bS9pbmNs dWRlL2xsdm0vQURUL1N0cmluZ1JlZi5oOjEwNw0KMTA3CSAgICBjb25zdCBjaGFyICpkYXRh KCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQ0KKGdkYikgDQpsbHZtOjpyZXBvcnRfZmF0YWxf ZXJyb3IgKFJlYXNvbj0uLi4pIGF0IC9yb290L2xsdm0vbGliL1N1cHBvcnQvRXJyb3JIYW5k bGluZy5jcHA6NzYNCjc2CSAgICAodm9pZCl3cml0dGVuOyAvLyBJZiBzb21ldGhpbmcgd2Vu dCB3cm9uZywgd2UgZGVsaWJlcmF0ZWx5IGp1c3QgZ2l2ZSB1cC4NCihnZGIpIA0KbGx2bTo6 cmF3X3N2ZWN0b3Jfb3N0cmVhbTo6fnJhd19zdmVjdG9yX29zdHJlYW0gKHRoaXM9MHg3Zjk2 NjM3NzkzYTQsIF9faW5fY2hyZz08b3B0aW1pemVkIG91dD4pIGF0IC9yb290L2xsdm0vbGli L1N1cHBvcnQvcmF3X29zdHJlYW0uY3BwOjcxOA0KNzE4CXJhd19zdmVjdG9yX29zdHJlYW06 On5yYXdfc3ZlY3Rvcl9vc3RyZWFtKCkgew0KKGdkYikgDQo3MjAJICBmbHVzaCgpOw0KKGdk YikgDQpsbHZtOjpyYXdfb3N0cmVhbTo6Zmx1c2ggKHRoaXM9MHgxNDUxN2NhKSBhdCAvcm9v dC9sbHZtL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmg6MTI5DQoxMjkJICB2 b2lkIGZsdXNoKCkgew0KKGdkYikgDQoxMzAJICAgIGlmIChPdXRCdWZDdXIgIT0gT3V0QnVm U3RhcnQpDQooZ2RiKSANCjEzMgkgIH0NCihnZGIpIA0KbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0 cmVhbTo6fnJhd19zdmVjdG9yX29zdHJlYW0gKHRoaXM9MHg3ZmZmOTBiNjliODAsIF9faW5f Y2hyZz08b3B0aW1pemVkIG91dD4pIGF0IC9yb290L2xsdm0vbGliL1N1cHBvcnQvcmF3X29z dHJlYW0uY3BwOjcxOA0KNzE4CXJhd19zdmVjdG9yX29zdHJlYW06On5yYXdfc3ZlY3Rvcl9v c3RyZWFtKCkgew0KKGdkYikgDQpsbHZtOjpyYXdfb3N0cmVhbTo6fnJhd19vc3RyZWFtICh0 aGlzPTB4N2ZmZjkwYjY5YjgwLCBfX2luX2Nocmc9PG9wdGltaXplZCBvdXQ+KSBhdCAvcm9v dC9sbHZtL2xpYi9TdXBwb3J0L3Jhd19vc3RyZWFtLmNwcDo2MA0KNjAJcmF3X29zdHJlYW06 On5yYXdfb3N0cmVhbSgpIHsNCihnZGIpIA0KNjQJICAgICAgICAgInJhd19vc3RyZWFtIGRl c3RydWN0b3IgY2FsbGVkIHdpdGggbm9uLWVtcHR5IGJ1ZmZlciEiKTsNCihnZGIpIA0KNjYJ ICBpZiAoQnVmZmVyTW9kZSA9PSBJbnRlcm5hbEJ1ZmZlcikNCihnZGIpIA0KNjgJfQ0KKGdk YikgDQpsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtOjp+cmF3X3N2ZWN0b3Jfb3N0cmVhbSAo dGhpcz0weDdmZmY5MGI2OWI4MCwgX19pbl9jaHJnPTxvcHRpbWl6ZWQgb3V0PikgYXQgL3Jv b3QvbGx2bS9saWIvU3VwcG9ydC9yYXdfb3N0cmVhbS5jcHA6NzIxDQo3MjEJfQ0KKGdkYikg DQpsbHZtOjpTbWFsbFZlY3RvcjxjaGFyLCA2NHU+Ojp+U21hbGxWZWN0b3IgKHRoaXM9MHg3 ZmZmOTBiNjliODAsIF9faW5fY2hyZz08b3B0aW1pemVkIG91dD4pIGF0IC9yb290L2xsdm0v aW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjg3NA0KODc0CWNsYXNzIFNtYWxsVmVj dG9yIDogcHVibGljIFNtYWxsVmVjdG9ySW1wbDxUPiB7DQooZ2RiKSANCmxsdm06OlNtYWxs VmVjdG9ySW1wbDxjaGFyPjo6flNtYWxsVmVjdG9ySW1wbCAodGhpcz0weDdmZmY5MGI2OWI4 MCwgX19pbl9jaHJnPTxvcHRpbWl6ZWQgb3V0PikgYXQgL3Jvb3QvbGx2bS9pbmNsdWRlL2xs dm0vQURUL1NtYWxsVmVjdG9yLmg6MzgwDQozODAJICB+U21hbGxWZWN0b3JJbXBsKCkgew0K KGdkYikgDQozODIJICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UodGhpcy0+YmVnaW4oKSwgdGhp cy0+ZW5kKCkpOw0KKGdkYikgDQpsbHZtOjpTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPGNo YXIsIHZvaWQ+OjplbmQgKHRoaXM9MHg3Zjk2NjM5Y2YwYzgpIGF0IC9yb290L2xsdm0vaW5j bHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjExMw0KMTEzCSAgaXRlcmF0b3IgZW5kKCkg eyByZXR1cm4gKGl0ZXJhdG9yKXRoaXMtPkVuZFg7IH0NCihnZGIpIA0KbGx2bTo6U21hbGxW ZWN0b3JUZW1wbGF0ZUNvbW1vbjxjaGFyLCB2b2lkPjo6YmVnaW4gKHRoaXM9MHg3ZmZmOTBi NjliMjApIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjEx MQ0KMTExCSAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiAoaXRlcmF0b3IpdGhpcy0+QmVn aW5YOyB9DQooZ2RiKSANCmxsdm06OlNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlPGNoYXIsIHRy dWU+OjpkZXN0cm95X3JhbmdlICgpIGF0IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FEVC9T bWFsbFZlY3Rvci5oOjI5NQ0KMjk1CSAgc3RhdGljIHZvaWQgZGVzdHJveV9yYW5nZShUICos IFQgKikge30NCihnZGIpIA0KbGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+Ojp+U21hbGxW ZWN0b3JJbXBsICh0aGlzPTB4N2ZmZjkwYjY5YjIwLCBfX2luX2Nocmc9PG9wdGltaXplZCBv dXQ+KSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxWZWN0b3IuaDozODUN CjM4NQkgICAgaWYgKCF0aGlzLT5pc1NtYWxsKCkpDQooZ2RiKSANCmxsdm06OlNtYWxsVmVj dG9yVGVtcGxhdGVDb21tb248Y2hhciwgdm9pZD46OmlzU21hbGwgKHRoaXM9MHgzNGVmYzYw KSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxWZWN0b3IuaDo4NQ0KODUJ ICBib29sIGlzU21hbGwoKSBjb25zdCB7DQooZ2RiKSANCjg2CSAgICByZXR1cm4gQmVnaW5Y ID09IHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPigmRmlyc3RFbCk7DQooZ2RiKSANCjg3CSAg fQ0KKGdkYikgDQpsbHZtOjpTbWFsbFZlY3RvckltcGw8Y2hhcj46On5TbWFsbFZlY3Rvcklt cGwgKHRoaXM9MHg3ZmZmOTBiNjliMjAsIF9faW5fY2hyZz08b3B0aW1pemVkIG91dD4pIGF0 IC9yb290L2xsdm0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjM4Ng0KMzg2CSAg ICAgIGZyZWUodGhpcy0+YmVnaW4oKSk7DQooZ2RiKSANCmxsdm06OlNtYWxsVmVjdG9yVGVt cGxhdGVDb21tb248Y2hhciwgdm9pZD46OmJlZ2luICh0aGlzPTB4N2ZmZjkwYjY5YjIwKSBh dCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxWZWN0b3IuaDoxMTENCjExMQkg IGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gKGl0ZXJhdG9yKXRoaXMtPkJlZ2luWDsgfQ0K KGdkYikgDQpsbHZtOjpTbWFsbFZlY3RvckltcGw8Y2hhcj46On5TbWFsbFZlY3RvckltcGwg KHRoaXM9MHg3ZmZmOTBiNjliMjAsIF9faW5fY2hyZz08b3B0aW1pemVkIG91dD4pIGF0IC9y b290L2xsdm0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oOjM4Nw0KMzg3CSAgfQ0K KGdkYikgDQpsbHZtOjpyZXBvcnRfZmF0YWxfZXJyb3IgKFJlYXNvbj0uLi4pIGF0IC9yb290 L2xsdm0vbGliL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5jcHA6ODINCjgyCSAgc3lzOjpSdW5J bnRlcnJ1cHRIYW5kbGVycygpOw0KKGdkYikgDQpsbHZtOjpzeXM6OlJ1bkludGVycnVwdEhh bmRsZXJzICgpIGF0IC9yb290L2xsdm0vbGliL1N1cHBvcnQvVW5peC9TaWduYWxzLmluYzox ODcNCjE4Nwl2b2lkIGxsdm06OnN5czo6UnVuSW50ZXJydXB0SGFuZGxlcnMoKSB7DQooZ2Ri KSANCjE4OAkgIFNpZ25hbHNNdXRleC5hY3F1aXJlKCk7DQooZ2RiKSANCmxsdm06OnN5czo6 U21hcnRNdXRleDx0cnVlPjo6YWNxdWlyZSAodGhpcz0weGNiYjU0NikgYXQgL3Jvb3QvbGx2 bS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NdXRleC5oOjk2DQo5NgkgICAgICBib29sIGFjcXVp cmUoKSB7DQooZ2RiKSANCjk3CSAgICAgICAgaWYgKCFtdF9vbmx5IHx8IGxsdm1faXNfbXVs dGl0aHJlYWRlZCgpKSB7DQooZ2RiKSANCmxsdm06Omxsdm1faXNfbXVsdGl0aHJlYWRlZCAo KSBhdCAvcm9vdC9sbHZtL2xpYi9TdXBwb3J0L1RocmVhZGluZy5jcHA6NTUNCjU1CSAgcmV0 dXJuIG11bHRpdGhyZWFkZWRfbW9kZTsNCihnZGIpIA0KNTYJfQ0KKGdkYikgDQpsbHZtOjpz eXM6OlNtYXJ0TXV0ZXg8dHJ1ZT46OmFjcXVpcmUgKHRoaXM9MHgxYjRmYjQwKSBhdCAvcm9v dC9sbHZtL2luY2x1ZGUvbGx2bS9TdXBwb3J0L011dGV4Lmg6MTAzDQoxMDMJICAgICAgICAg IGFzc2VydCgocmVjdXJzaXZlIHx8IGFjcXVpcmVkID09IDApICYmICJMb2NrIGFscmVhZHkg YWNxdWlyZWQhISIpOw0KKGdkYikgDQoxMDQJICAgICAgICAgICsrYWNxdWlyZWQ7DQooZ2Ri KSANCjEwNQkgICAgICAgICAgcmV0dXJuIHRydWU7DQooZ2RiKSANCjEwNwkgICAgICB9DQoo Z2RiKSANCmxsdm06OnN5czo6UnVuSW50ZXJydXB0SGFuZGxlcnMgKCkgYXQgL3Jvb3QvbGx2 bS9saWIvU3VwcG9ydC9Vbml4L1NpZ25hbHMuaW5jOjE4OQ0KMTg5CSAgUmVtb3ZlRmlsZXNU b1JlbW92ZSgpOw0KKGdkYikgDQpSZW1vdmVGaWxlc1RvUmVtb3ZlICgpIGF0IC9yb290L2xs dm0vbGliL1N1cHBvcnQvVW5peC9TaWduYWxzLmluYzoxMjMNCjEyMwlzdGF0aWMgdm9pZCBS ZW1vdmVGaWxlc1RvUmVtb3ZlKCkgew0KKGdkYikgDQoxMjYJICBmb3IgKHVuc2lnbmVkIGkg PSAwLCBlID0gRmlsZXNUb1JlbW92ZS5zaXplKCk7IGkgIT0gZTsgKytpKSB7DQooZ2RiKSAN CnN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nLCBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnN0cmluZz4g Pjo6c2l6ZSAodGhpcz0weDApDQogICAgYXQgL29wdC9nY2M0L2Jpbi8uLi9saWIvZ2NjL3g4 Nl82NC11bmtub3duLWxpbnV4LWdudS80LjUuNC8uLi8uLi8uLi8uLi9pbmNsdWRlL2MrKy80 LjUuNC9iaXRzL3N0bF92ZWN0b3IuaDo1MzMNCjUzMwkgICAgICBzaXplKCkgY29uc3QNCihn ZGIpIA0KNTM0CSAgICAgIHsgcmV0dXJuIHNpemVfdHlwZSh0aGlzLT5fTV9pbXBsLl9NX2Zp bmlzaCAtIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOyB9DQooZ2RiKSANClJlbW92ZUZpbGVz VG9SZW1vdmUgKCkgYXQgL3Jvb3QvbGx2bS9saWIvU3VwcG9ydC9Vbml4L1NpZ25hbHMuaW5j OjE0OA0KMTQ4CX0NCihnZGIpIA0KbGx2bTo6c3lzOjpSdW5JbnRlcnJ1cHRIYW5kbGVycyAo KSBhdCAvcm9vdC9sbHZtL2xpYi9TdXBwb3J0L1VuaXgvU2lnbmFscy5pbmM6MTkwDQoxOTAJ ICBTaWduYWxzTXV0ZXgucmVsZWFzZSgpOw0KKGdkYikgDQpsbHZtOjpzeXM6OlNtYXJ0TXV0 ZXg8dHJ1ZT46OnJlbGVhc2UgKHRoaXM9MHgwKSBhdCAvcm9vdC9sbHZtL2luY2x1ZGUvbGx2 bS9TdXBwb3J0L011dGV4Lmg6MTA5DQoxMDkJICAgICAgYm9vbCByZWxlYXNlKCkgew0KKGdk YikgDQoxMTAJICAgICAgICBpZiAoIW10X29ubHkgfHwgbGx2bV9pc19tdWx0aXRocmVhZGVk KCkpIHsNCihnZGIpIA0KbGx2bTo6bGx2bV9pc19tdWx0aXRocmVhZGVkICgpIGF0IC9yb290 L2xsdm0vbGliL1N1cHBvcnQvVGhyZWFkaW5nLmNwcDo1NQ0KNTUJICByZXR1cm4gbXVsdGl0 aHJlYWRlZF9tb2RlOw0KKGdkYikgDQo1Ngl9DQooZ2RiKSANCmxsdm06OnN5czo6U21hcnRN dXRleDx0cnVlPjo6cmVsZWFzZSAodGhpcz0weDFiNGZiNDApIGF0IC9yb290L2xsdm0vaW5j bHVkZS9sbHZtL1N1cHBvcnQvTXV0ZXguaDoxMTYNCjExNgkgICAgICAgICAgYXNzZXJ0KCgo cmVjdXJzaXZlICYmIGFjcXVpcmVkKSB8fCAoYWNxdWlyZWQgPT0gMSkpICYmDQooZ2RiKSAN CjExOAkgICAgICAgICAgLS1hY3F1aXJlZDsNCihnZGIpIA0KMTE5CSAgICAgICAgICByZXR1 cm4gdHJ1ZTsNCihnZGIpIA0KMTIxCSAgICAgIH0NCihnZGIpIA0KbGx2bTo6c3lzOjpSdW5J bnRlcnJ1cHRIYW5kbGVycyAoKSBhdCAvcm9vdC9sbHZtL2xpYi9TdXBwb3J0L1VuaXgvU2ln bmFscy5pbmM6MTkxDQoxOTEJfQ0KKGdkYikgDQpsbHZtOjpyZXBvcnRfZmF0YWxfZXJyb3Ig KFJlYXNvbj0uLi4pIGF0IC9yb290L2xsdm0vbGliL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5j cHA6ODQNCjg0CSAgZXhpdCgxKTsNCihnZGIpIA0KQnJlYWtwb2ludCAxLCAweDAwMDA3Zjk2 NjM3Nzc3ZTUgaW4gZXhpdCAoKSBmcm9tIC9saWIvbGQtbXVzbC14ODZfNjQuc28uMQ0KKGdk YikgDQpTaW5nbGUgc3RlcHBpbmcgdW50aWwgZXhpdCBmcm9tIGZ1bmN0aW9uIGV4aXQsDQp3 aGljaCBoYXMgbm8gbGluZSBudW1iZXIgaW5mb3JtYXRpb24uDQpeQw0KUHJvZ3JhbSByZWNl aXZlZCBzaWduYWwgU0lHSU5ULCBJbnRlcnJ1cHQuDQoweDAwMDA3Zjk2NjM3Nzc3ZjkgaW4g ZXhpdCAoKSBmcm9tIC9saWIvbGQtbXVzbC14ODZfNjQuc28uMQ0KKGdkYikgYnQNCiMwICAw eDAwMDA3Zjk2NjM3Nzc3ZjkgaW4gZXhpdCAoKSBmcm9tIC9saWIvbGQtbXVzbC14ODZfNjQu c28uMQ0KIzEgIDB4MDAwMDAwMDAwMDAwMDAyOSBpbiA/PyAoKQ0KIzIgIDB4MDAwMDAwMDAw MTQxYTdlYSBpbiBsbHZtOjpyZXBvcnRfZmF0YWxfZXJyb3IgKFJlYXNvbj0uLi4pIGF0IC9y b290L2xsdm0vbGliL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5jcHA6ODQNCiMzICAweDAwMDAw MDAwMDE0MWE2MmUgaW4gbGx2bTo6cmVwb3J0X2ZhdGFsX2Vycm9yIChSZWFzb249MHgxNjI4 ZGQzICJJTyBmYWlsdXJlIG9uIG91dHB1dCBzdHJlYW0uIikgYXQgL3Jvb3QvbGx2bS9saWIv U3VwcG9ydC9FcnJvckhhbmRsaW5nLmNwcDo1Mw0KIzQgIDB4MDAwMDAwMDAwMTQ1MTg1ZSBp biBsbHZtOjpyYXdfZmRfb3N0cmVhbTo6fnJhd19mZF9vc3RyZWFtICh0aGlzPTB4MWI1MDg4 MCwgX19pbl9jaHJnPTxvcHRpbWl6ZWQgb3V0PikgYXQgL3Jvb3QvbGx2bS9saWIvU3VwcG9y dC9yYXdfb3N0cmVhbS5jcHA6NTE0DQojNSAgMHgwMDAwN2Y5NjYzNzc3NmM3IGluIF9fZnVu Y3Nfb25fZXhpdCAoKSBmcm9tIC9saWIvbGQtbXVzbC14ODZfNjQuc28uMQ0KIzYgIDB4MDAw MDAwMDAwMDAwMDAwMSBpbiA/PyAoKQ0KIzcgIDB4MDAwMDAwMDAwMzRmMDc2MCBpbiA/PyAo KQ0KIzggIDB4MDAwMDAwMDAwMDg1NDVjZSBpbiBHZXRUYXJnZXRNYWNoaW5lIChUcmlwbGVT dHI9Li4uKSBhdCAvcm9vdC9sbHZtL3Rvb2xzL29wdC9vcHQuY3BwOjU1NA0KIzkgIDB4MDAw MDdmOTY2Mzc3NzgwYSBpbiBleGl0ICgpIGZyb20gL2xpYi9sZC1tdXNsLXg4Nl82NC5zby4x DQojMTAgMHgwMDAwMDAwMDAwMDAwMDAwIGluID8/ICgpDQooZ2RiKSBeRHF1aXQNCkEgZGVi dWdnaW5nIHNlc3Npb24gaXMgYWN0aXZlLg0KCUluZmVyaW9yIDEgW3Byb2Nlc3MgOTcxXSB3 aWxsIGJlIGtpbGxlZC4NClF1aXQgYW55d2F5PyAoeSBvciBuKSB5DQp+ICMgZA0KfiAjIA== --------------060909020808080805020509--