0x4774567d…5ac5sent to0x914d7fec…43d7·#25,346,460·view on Etherscan
PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubywgbWF4aW11bS1zY2FsZT0xLjAiPgogICAgPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIj4KICAgIDxtZXRhIG5hbWU9ImFwcGxlLW1vYmlsZS13ZWItYXBwLXN0YXR1cy1iYXItc3R5bGUiIGNvbnRlbnQ9ImJsYWNrLWZ1bGxzY3JlZW4iPgogICAgPG1ldGEgbmFtZT0ibW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIj4KICAgIAogICAgPHRpdGxlPkJyb2tlbiBMaW5rIGJ5IE15RmkgU3R1ZGlvPC90aXRsZT4KICAgIAogICAgPHN0eWxlPgoKICAgICAgICAvKiBSZXNldCBhbmQgcHJldmVudCBzY3JvbGxpbmcgKi8KICAgICAgICAqIHsKICAgICAgICAgICAgbWFyZ2luOiAwOwogICAgICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICB0b3VjaC1hY3Rpb246IG5vbmU7IC8qIFByZXZlbnQgdG91Y2ggc2Nyb2xsaW5nIGFuZCBnZXN0dXJlcyAqLwogICAgICAgICAgICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6IG5vbmU7IC8qIFByZXZlbnQgaU9TIGNhbGxvdXQgKi8KICAgICAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsgLyogUHJldmVudCB0ZXh0IHNlbGVjdGlvbiAqLwogICAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaHRtbCwgYm9keSB7CiAgICAgICAgICAgIHdpZHRoOiAxMDB2dzsKICAgICAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgcG9zaXRpb246IGZpeGVkOyAvKiBQcmV2ZW50IHNjcm9sbCBvbiBtb2JpbGUgKi8KICAgICAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLCBPeHlnZW4sIFVidW50dSwgQ2FudGFyZWxsLCBzYW5zLXNlcmlmOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBib2R5IHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8qIENhbnZhcyAtIGZ1bGxzY3JlZW4gd2l0aCBpT1MgU2FmYXJpIFdlYkdQVSBmaXhlcyAqLwogICAgICAgIGNhbnZhcyB7CiAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgICAgIGhlaWdodDogMTAwdmg7CiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsgLyogQ2hhbmdlZCBmcm9tIGZpeGVkIGZvciBpT1MgY29tcG9zaXRpbmcgKi8KICAgICAgICAgICAgdG9wOiAwOwogICAgICAgICAgICBsZWZ0OiAwOwogICAgICAgICAgICB0b3VjaC1hY3Rpb246IG5vbmU7IC8qIENyaXRpY2FsIGZvciBwcmV2ZW50aW5nIHNjcm9sbGluZyAqLwogICAgICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgICAgIG9wYWNpdHk6IDE7IC8qIEV4cGxpY2l0IGZvciBpT1MgKi8KICAgICAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTsgLyogRXhwbGljaXQgZm9yIGlPUyAqLwogICAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7IC8qIEZvcmNlIEdQVSBsYXllciBvbiBpT1MgKi8KICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTsKICAgICAgICAgICAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgICAgIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgICB9CiAgICAgICAgCiAgICAKICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+CiAgICA8Y2FudmFzIGlkPSJzdGF0aWNDYW52YXMiCiAgICAgICAgICAgIHJvbGU9ImltZyIKICAgICAgICAgICAgYXJpYS1sYWJlbD0iQnJva2VuIExpbmsgYnkgTXlGaSBTdHVkaW8uIFRoaXMgd2luZG93IGlzIGZpbGxlZCB3aXRoIGJsYWNrLWFuZC13aGl0ZSBUViBzdGF0aWMuIFRoZXJlIGlzIG5vIHNvdW5kIGF0IGZpcnN0LiBPbmNlIHlvdSB0b3VjaCB0aGUgcGFnZSwgcGVyY3Vzc2l2ZSBzdGF0aWMgaXMgaGVhcmQgdGhhdCByZWFjdHMgdG8gd2hlcmUgeW91IHRvdWNoLiBZb3VyIHRvdWNoIGFsc28gYWZmZWN0cyB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgc3RhdGljOiB0b3VjaGluZyB0aGUgbGVmdCBzaWRlIG9mIHRoZSBwYWdlIGNhdXNlcyBsYXJnZXIgcGl4ZWxzIHRvIGFwcGVhciBvbiB0aGUgc2NyZWVuLCB3aGlsZSB0b3VjaGluZyB0aGUgcmlnaHQgc2lkZSBjYXVzZXMgbWFueSBzbWFsbCBwaXhlbHMgdG8gYXBwZWFyLiBUb3VjaGluZyB0aGUgdG9wIG9mIHRoZSBzY3JlZW4gY2F1c2VzIHRoZSBwaXhlbHMgdG8gYmVjb21lIHNlZS10aHJvdWdoLCB3aGlsZSB0b3VjaGluZyB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4gY2F1c2VzIHRoZSBwaXhlbHMgdG8gYmUgb3BhcXVlLiI+QnJva2VuIExpbmsgYnkgTXlGaSBTdHVkaW8uIFRoaXMgd2luZG93IGlzIGZpbGxlZCB3aXRoIGJsYWNrLWFuZC13aGl0ZSBUViBzdGF0aWMuIFRoZXJlIGlzIG5vIHNvdW5kIGF0IGZpcnN0LiBPbmNlIHlvdSB0b3VjaCB0aGUgcGFnZSwgcGVyY3Vzc2l2ZSBzdGF0aWMgaXMgaGVhcmQgdGhhdCByZWFjdHMgdG8gd2hlcmUgeW91IHRvdWNoLiBZb3VyIHRvdWNoIGFsc28gYWZmZWN0cyB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgc3RhdGljOiB0b3VjaGluZyB0aGUgbGVmdCBzaWRlIG9mIHRoZSBwYWdlIGNhdXNlcyBsYXJnZXIgcGl4ZWxzIHRvIGFwcGVhciBvbiB0aGUgc2NyZWVuLCB3aGlsZSB0b3VjaGluZyB0aGUgcmlnaHQgc2lkZSBjYXVzZXMgbWFueSBzbWFsbCBwaXhlbHMgdG8gYXBwZWFyLiBUb3VjaGluZyB0aGUgdG9wIG9mIHRoZSBzY3JlZW4gY2F1c2VzIHRoZSBwaXhlbHMgdG8gYmVjb21lIHNlZS10aHJvdWdoLCB3aGlsZSB0b3VjaGluZyB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4gY2F1c2VzIHRoZSBwaXhlbHMgdG8gYmUgb3BhcXVlLjwvY2FudmFzPgogICAgCiAgICA8c2NyaXB0IHR5cGU9Im1vZHVsZSI+CiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAvLyBTSEFERVJTIChFbWJlZGRlZCBhcyB0ZW1wbGF0ZSBzdHJpbmdzKQogICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgCiAgICAgICAgY29uc3QgV0VCR1BVX1NIQURFUlMgPSB7CiAgICAgICAgICAgIHZlcnRleF9mdWxsc2NyZWVuOiBgLy8gRnVsbHNjcmVlbiBWZXJ0ZXggU2hhZGVyCi8vIEdlbmVyYXRlcyBhIGZ1bGxzY3JlZW4gdHJpYW5nbGUgd2l0aG91dCB2ZXJ0ZXggYnVmZmVycwovLyBFZmZpY2llbnQgdGVjaG5pcXVlIGZvciBmdWxsc2NyZWVuIHBvc3QtcHJvY2Vzc2luZyBlZmZlY3RzCgpzdHJ1Y3QgVmVydGV4T3V0cHV0IHsKICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LAogICAgQGxvY2F0aW9uKDApIHRleENvb3JkOiB2ZWMyPGYzMj4sCn0KCkB2ZXJ0ZXgKZm4gdnNfbWFpbihAYnVpbHRpbih2ZXJ0ZXhfaW5kZXgpIHZlcnRleEluZGV4OiB1MzIpIC0+IFZlcnRleE91dHB1dCB7CiAgICB2YXIgb3V0cHV0OiBWZXJ0ZXhPdXRwdXQ7CiAgICAKICAgIC8vIEdlbmVyYXRlIGZ1bGxzY3JlZW4gdHJpYW5nbGUKICAgIC8vIFZlcnRleCAwOiAoLTEsIC0xKSBib3R0b20tbGVmdAogICAgLy8gVmVydGV4IDE6ICggMywgLTEpIGJvdHRvbS1yaWdodCAob2ZmLXNjcmVlbikKICAgIC8vIFZlcnRleCAyOiAoLTEsICAzKSB0b3AtbGVmdCAob2ZmLXNjcmVlbikKICAgIC8vIFRoaXMgdHJpYW5nbGUgY292ZXJzIHRoZSBlbnRpcmUgc2NyZWVuIGVmZmljaWVudGx5CiAgICAKICAgIC8vIENvcnJlY3QgZnVsbHNjcmVlbiB0cmlhbmdsZSBnZW5lcmF0aW9uCiAgICBsZXQgeCA9IGYzMihpMzIodmVydGV4SW5kZXggJiAxdSkpICogNC4wIC0gMS4wOwogICAgbGV0IHkgPSBmMzIoaTMyKHZlcnRleEluZGV4ID4+IDF1KSkgKiA0LjAgLSAxLjA7CiAgICAKICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzQ8ZjMyPih4LCB5LCAwLjAsIDEuMCk7CiAgICAKICAgIC8vIENvbnZlcnQgZnJvbSBjbGlwIHNwYWNlICgtMSB0byAxKSB0byBVViBzcGFjZSAoMCB0byAxKQogICAgb3V0cHV0LnRleENvb3JkID0gdmVjMjxmMzI+KAogICAgICAgICh4ICsgMS4wKSAqIDAuNSwKICAgICAgICAoMS4wIC0geSkgKiAwLjUKICAgICk7CiAgICAKICAgIHJldHVybiBvdXRwdXQ7Cn0KCmAsCiAgICAgICAgICAgIHR2X3N0YXRpYzogYC8vIFRWIFN0YXRpYyBGcmFnbWVudCBTaGFkZXIKLy8gUHJvY2VkdXJhbGx5IGdlbmVyYXRlcyBhdXRoZW50aWMgYmxhY2sgJiB3aGl0ZSBUViBzdGF0aWMgc25vdwovLyBObyBDUlQgYXJ0aWZhY3RzIC0gcHVyZSBkaWdpdGFsIG5vaXNlIHJlcHJlc2VudGF0aW9uCi8vIE9wdGltaXplZCBmb3IgNjBmcHMrIG9uIGFsbCBkZXZpY2VzCgovLyBVbmlmb3JtcwpzdHJ1Y3QgU3RhdGljVW5pZm9ybXMgewogICAgdGltZTogZjMyLCAgICAgICAgICAgLy8gQ3VycmVudCB0aW1lIGZvciBhbmltYXRpb24KICAgIGludGVuc2l0eTogZjMyLCAgICAgIC8vIFN0YXRpYyBpbnRlbnNpdHkgKDAtMSkKICAgIF9wYWQyOiBmMzIsICAgICAgICAgIC8vIHJlc2VydmVkCiAgICBzcGVlZDogZjMyLCAgICAgICAgICAvLyBBbmltYXRpb24gc3BlZWQgbXVsdGlwbGllcgogICAgY29udHJhc3Q6IGYzMiwgICAgICAgLy8gQ29udHJhc3QgbXVsdGlwbGllcgogICAgX3BhZDU6IGYzMiwgICAgICAgICAgLy8gcmVzZXJ2ZWQKICAgIGJyaWdodG5lc3M6IGYzMiwgICAgIC8vIE92ZXJhbGwgYnJpZ2h0bmVzcyAoMC0xKQogICAgcGFkZGluZzE6IGYzMiwgICAgICAgLy8gQWxpZ25tZW50IHBhZGRpbmcKICAgIHJlc29sdXRpb246IHZlYzI8ZjMyPiwgLy8gU2NyZWVuIHJlc29sdXRpb24KICAgIHBhZGRpbmcyOiB2ZWMyPGYzMj4gICAgLy8gQWxpZ25tZW50IHBhZGRpbmcKfQoKQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjx1bmlmb3JtPiBwYXJhbXM6IFN0YXRpY1VuaWZvcm1zOwoKc3RydWN0IFZlcnRleE91dHB1dCB7CiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPiwKICAgIEBsb2NhdGlvbigwKSB0ZXhDb29yZDogdmVjMjxmMzI+LAp9CgovLyBJbnRlZ2VyLWJhc2VkIGhhc2ggZnVuY3Rpb24gKG5vIGZsb2F0aW5nIHBvaW50IGJpYXMpCi8vIFVzZXMgb25seSBpbnRlZ2VyIHBpeGVsIGNvb3JkaW5hdGVzIGZvciBwZXJmZWN0IHVuaWZvcm1pdHkKZm4gaGFzaEludCh4OiB1MzIsIHk6IHUzMiwgZnJhbWU6IHUzMikgLT4gZjMyIHsKICAgIC8vIFBDRyBoYXNoIC0gaW5kdXN0cnkgc3RhbmRhcmQgZm9yIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbgogICAgdmFyIHNlZWQgPSB4ICsgeSAqIDM3NDc2MTM5M3UgKyBmcmFtZSAqIDY2ODI2NTI2M3U7CiAgICBzZWVkID0gKHNlZWQgXiAoc2VlZCA+PiAxNXUpKSAqIDE1OTczMzQ2Nzd1OwogICAgc2VlZCA9IChzZWVkIF4gKHNlZWQgPj4gMTV1KSkgKiAzODEyMDE1ODAxdTsKICAgIHNlZWQgPSBzZWVkIF4gKHNlZWQgPj4gMTV1KTsKICAgIAogICAgLy8gQ29udmVydCB0byAwLTEgcmFuZ2UKICAgIHJldHVybiBmMzIoc2VlZCkgLyA0Mjk0OTY3Mjk1LjA7Cn0KCi8vIFJlbW92ZWQgbm9pc2UoKSBhbmQgZmJtKCkgZnVuY3Rpb25zIC0gbm90IG5lZWRlZCBmb3IgcHVyZSByYW5kb20gc3RhdGljCgovLyBIaWdoLWZyZXF1ZW5jeSBub2lzZSBmb3IgZmluZSBkZXRhaWwgKHBlci1waXhlbCByYW5kb21uZXNzKQovLyBVc2VzIGludGVnZXIgcGl4ZWwgY29vcmRpbmF0ZXMgLSBlbGltaW5hdGVzIEFMTCBmbG9hdGluZyBwb2ludCBhcnRpZmFjdHMKZm4gZmFzdE5vaXNlKHBpeGVsUG9zOiB2ZWMyPGYzMj4sIHRpbWU6IGYzMiwgc2NhbGU6IGYzMikgLT4gZjMyIHsKICAgIC8vIFNjYWxlIGRvd24gY29vcmRpbmF0ZXMgdG8gbWFrZSBlYWNoIG5vaXNlICJwaXhlbCIgbGFyZ2VyCiAgICAvLyBzY2FsZSA9IDEwLjAgbWVhbnMgZWFjaCByYW5kb20gdmFsdWUgY292ZXJzIGEgMTB4MTAgYmxvY2sgb2Ygc2NyZWVuIHBpeGVscwogICAgbGV0IHNjYWxlZFBvcyA9IHBpeGVsUG9zIC8gc2NhbGU7CiAgICAKICAgIC8vIENvbnZlcnQgdG8gaW50ZWdlciBwaXhlbCBjb29yZGluYXRlcwogICAgbGV0IHggPSB1MzIoc2NhbGVkUG9zLngpOwogICAgbGV0IHkgPSB1MzIoc2NhbGVkUG9zLnkpOwogICAgCiAgICAvLyBGcmFtZSBjb3VudGVyIGZvciBhbmltYXRpb24KICAgIGxldCBmcmFtZSA9IHUzMih0aW1lICogNjAuMCk7CiAgICAKICAgIC8vIFB1cmUgaW50ZWdlci1iYXNlZCBoYXNoIC0gbm8gaW50ZXJwb2xhdGlvbiwgbm8gcGF0dGVybnMKICAgIHJldHVybiBoYXNoSW50KHgsIHksIGZyYW1lKTsKfQoKQGZyYWdtZW50CmZuIGZzX21haW4oaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7CiAgICBsZXQgdXYgPSBpbnB1dC50ZXhDb29yZDsKICAgIAogICAgLy8gQW5pbWF0ZWQgdGltZSBmb3IgY2hhbmdpbmcgbm9pc2UgZWFjaCBmcmFtZQogICAgbGV0IHRpbWVBbmltYXRlZCA9IHBhcmFtcy50aW1lICogcGFyYW1zLnNwZWVkOwogICAgCiAgICAvLyBQdXJlIHBlci1waXhlbCByYW5kb20gbm9pc2UKICAgIC8vIENoYW5nZXMgY29tcGxldGVseSBldmVyeSBmcmFtZSAtIG5vIHBlcnNpc3RlbnQgcGF0dGVybnMKICAgIGxldCBwaXhlbFBvcyA9IHV2ICogcGFyYW1zLnJlc29sdXRpb247CiAgICAKICAgIC8vIEdyYWluIHNjYWxlOiAxMC4wID0gZWFjaCByYW5kb20gdmFsdWUgaXMgYSAxMHgxMCBwaXhlbCBibG9jawogICAgbGV0IGdyYWluU2NhbGUgPSAyLjA7CiAgICBsZXQgc3RhdGljVmFsdWUgPSBmYXN0Tm9pc2UocGl4ZWxQb3MsIHRpbWVBbmltYXRlZCwgZ3JhaW5TY2FsZSk7CiAgICAKICAgIC8vIEFwcGx5IGludGVuc2l0eQogICAgdmFyIHZhbHVlID0gc3RhdGljVmFsdWUgKiBwYXJhbXMuaW50ZW5zaXR5OwogICAgCiAgICAvLyBBcHBseSBjb250cmFzdCB0byBwdXNoIHRvd2FyZHMgYmxhY2sgYW5kIHdoaXRlIGV4dHJlbWVzCiAgICB2YWx1ZSA9ICh2YWx1ZSAtIDAuNSkgKiBwYXJhbXMuY29udHJhc3QgKyAwLjU7CiAgICAKICAgIC8vIEFwcGx5IGJyaWdodG5lc3MgYWRqdXN0bWVudAogICAgdmFsdWUgPSB2YWx1ZSAqIHBhcmFtcy5icmlnaHRuZXNzICsgKDEuMCAtIHBhcmFtcy5icmlnaHRuZXNzKSAqIDAuNTsKICAgIAogICAgLy8gQ2xhbXAgdG8gdmFsaWQgcmFuZ2UKICAgIHZhbHVlID0gY2xhbXAodmFsdWUsIDAuMCwgMS4wKTsKICAgIAogICAgLy8gUHVyZSBibGFjayAmIHdoaXRlIG91dHB1dCAobm8gY29sb3Igc2VwYXJhdGlvbikKICAgIGxldCBjb2xvciA9IHZlYzM8ZjMyPih2YWx1ZSk7CiAgICAKICAgIHJldHVybiB2ZWM0PGYzMj4oY29sb3IsIDEuMCk7Cn0KCmAsCiAgICAgICAgICAgIHBpeGVsaXphdGlvbjogYC8vIFBpeGVsaXphdGlvbiBFZmZlY3QgRnJhZ21lbnQgU2hhZGVyCi8vIENyZWF0ZXMgZHluYW1pYyBwaXhlbCBncmlkIG92ZXJsYXkgd2l0aCBjb25maWd1cmFibGUgZ3JhbnVsYXJpdHkKLy8gVGFrZXMgaW5wdXQgdGV4dHVyZSAoVFYgc3RhdGljKSBhbmQgcGl4ZWxpemVzIGl0CgovLyBJbnB1dCB0ZXh0dXJlIChmcm9tIHByZXZpb3VzIHJlbmRlciBwYXNzIC0gVFYgc3RhdGljKQpAZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyIGlucHV0VGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+OwpAZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIGlucHV0U2FtcGxlcjogc2FtcGxlcjsKCi8vIEVmZmVjdCBwYXJhbWV0ZXJzIHVuaWZvcm0gYnVmZmVyIChiaW5kIGdyb3VwIDEgLSBlZmZlY3Qtc3BlY2lmaWMpCnN0cnVjdCBFZmZlY3RVbmlmb3JtcyB7CiAgICBwaXhlbFJvd3M6IGYzMiwgICAgIC8vIE51bWJlciBvZiBwaXhlbCByb3dzICh2ZXJ0aWNhbCBncmFudWxhcml0eSkKICAgIHBpeGVsQ29sczogZjMyLCAgICAgLy8gTnVtYmVyIG9mIHBpeGVsIGNvbHVtbnMgKGhvcml6b250YWwgZ3JhbnVsYXJpdHkpIAogICAgY2FudmFzV2lkdGg6IGYzMiwgICAvLyBDYW52YXMgd2lkdGggaW4gcGl4ZWxzCiAgICBjYW52YXNIZWlnaHQ6IGYzMiwgIC8vIENhbnZhcyBoZWlnaHQgaW4gcGl4ZWxzCiAgICBibGVuZEZhY3RvcjogZjMyLCAgIC8vIEJsZW5kIGJldHdlZW4gc29saWQgKDAuMCkgYW5kIHRyYW5zcGFyZW50L2ZvZ2d5ICgxLjApCiAgICB0aW1lOiBmMzIsICAgICAgICAgIC8vIFRpbWUgZm9yIHN1YnRsZSBhbmltYXRpb24vdmFyaWF0aW9uCiAgICBfcGFkZGluZzE6IGYzMiwgICAgIC8vIFBhZGRpbmcgZm9yIGFsaWdubWVudAogICAgX3BhZGRpbmcyOiBmMzIsICAgICAvLyBQYWRkaW5nIGZvciBhbGlnbm1lbnQKfQpAZ3JvdXAoMSkgQGJpbmRpbmcoMCkgdmFyPHVuaWZvcm0+IGVmZmVjdFBhcmFtczogRWZmZWN0VW5pZm9ybXM7CgpzdHJ1Y3QgVmVydGV4T3V0cHV0IHsKICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LAogICAgQGxvY2F0aW9uKDApIHRleENvb3JkOiB2ZWMyPGYzMj4sCn0KCi8vIEhhc2ggZnVuY3Rpb24gZm9yIGdyaXR0aW5lc3Mvbm9pc2UKZm4gaGFzaChwOiB2ZWMyPGYzMj4pIC0+IGYzMiB7CiAgICBsZXQgcDMgPSBmcmFjdCh2ZWMzPGYzMj4ocC54LCBwLnksIHAueCkgKiAwLjEzKTsKICAgIGxldCBkcCA9IGRvdCh2ZWMzPGYzMj4ocC54LCBwLnksIHAueCkgKyB2ZWMzPGYzMj4ocDMueSwgcDMueiwgcDMueCksIHAzICsgdmVjMzxmMzI+KDMzLjMzKSk7CiAgICByZXR1cm4gZnJhY3QoKHAzLnggKyBwMy55KSAqIGRwKTsKfQoKLy8gU21vb3RoIG5vaXNlIGZvciBmb2dneSBlZmZlY3QKZm4gc21vb3RoTm9pc2UodXY6IHZlYzI8ZjMyPiwgc2NhbGU6IGYzMikgLT4gZjMyIHsKICAgIGxldCBzY2FsZWQgPSB1diAqIHNjYWxlOwogICAgbGV0IGkgPSBmbG9vcihzY2FsZWQpOwogICAgbGV0IGYgPSBmcmFjdChzY2FsZWQpOwogICAgCiAgICAvLyBTbW9vdGggaW50ZXJwb2xhdGlvbgogICAgbGV0IHUgPSBmICogZiAqICgzLjAgLSAyLjAgKiBmKTsKICAgIAogICAgLy8gU2FtcGxlIGNvcm5lcnMKICAgIGxldCBhID0gaGFzaChpKTsKICAgIGxldCBiID0gaGFzaChpICsgdmVjMjxmMzI+KDEuMCwgMC4wKSk7CiAgICBsZXQgYyA9IGhhc2goaSArIHZlYzI8ZjMyPigwLjAsIDEuMCkpOwogICAgbGV0IGQgPSBoYXNoKGkgKyB2ZWMyPGYzMj4oMS4wLCAxLjApKTsKICAgIAogICAgLy8gQmlsaW5lYXIgaW50ZXJwb2xhdGlvbgogICAgcmV0dXJuIG1peChtaXgoYSwgYiwgdS54KSwgbWl4KGMsIGQsIHUueCksIHUueSk7Cn0KCkBmcmFnbWVudApmbiBmc19tYWluKGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4gewogICAgbGV0IHRleENvb3JkID0gaW5wdXQudGV4Q29vcmQ7CiAgICAKICAgIC8vIENhbGN1bGF0ZSB3aGljaCBwaXhlbCBncmlkIGNlbGwgdGhpcyBmcmFnbWVudCBiZWxvbmdzIHRvCiAgICBsZXQgcGl4ZWxHcmlkUG9zID0gZmxvb3IodGV4Q29vcmQgKiB2ZWMyPGYzMj4oZWZmZWN0UGFyYW1zLnBpeGVsQ29scywgZWZmZWN0UGFyYW1zLnBpeGVsUm93cykpOwogICAgCiAgICAvLyBDYWxjdWxhdGUgdGhlIGNlbnRlciBvZiB0aGUgcGl4ZWwgY2VsbCBmb3Igc2FtcGxpbmcKICAgIC8vIEFkZGluZyAwLjUgY2VudGVycyB0aGUgc2FtcGxpbmcgcG9pbnQgd2l0aGluIGVhY2ggcGl4ZWwgY2VsbAogICAgbGV0IHBpeGVsQ2VudGVyID0gKHBpeGVsR3JpZFBvcyArIHZlYzI8ZjMyPigwLjUsIDAuNSkpIC8gdmVjMjxmMzI+KGVmZmVjdFBhcmFtcy5waXhlbENvbHMsIGVmZmVjdFBhcmFtcy5waXhlbFJvd3MpOwogICAgCiAgICAvLyBTYW1wbGUgdGhlIHBpeGVsYXRlZCBjb2xvciAoZnJvbSBwaXhlbCBjZW50ZXIgLSBzb2xpZCBibG9ja3MpCiAgICBsZXQgcGl4ZWxDb2xvciA9IHRleHR1cmVTYW1wbGUoaW5wdXRUZXh0dXJlLCBpbnB1dFNhbXBsZXIsIHBpeGVsQ2VudGVyKTsKICAgIAogICAgLy8gU2FtcGxlIHRoZSBvcmlnaW5hbCB0ZXh0dXJlIChmcm9tIGFjdHVhbCBwb3NpdGlvbiAtIHVuZGVybHlpbmcgc3RhdGljKQogICAgbGV0IG9yaWdpbmFsQ29sb3IgPSB0ZXh0dXJlU2FtcGxlKGlucHV0VGV4dHVyZSwgaW5wdXRTYW1wbGVyLCB0ZXhDb29yZCk7CiAgICAKICAgIC8vIEF0IGJsZW5kRmFjdG9yID0gMC4wOiBmdWxseSBvcGFxdWUgcGl4ZWxzIChsZWZ0IHNpZGUpCiAgICAvLyBBdCBibGVuZEZhY3RvciA9IDEuMDogZm9nZ3kvZ3JpdHR5IGJsZW5kIHNob3dpbmcgdW5kZXJseWluZyBzdGF0aWMgKHJpZ2h0IHNpZGUpCiAgICAKICAgIGlmIChlZmZlY3RQYXJhbXMuYmxlbmRGYWN0b3IgPD0gMC4wMSkgewogICAgICAgIC8vIEZ1bGx5IG9wYXF1ZSAtIGp1c3QgcmV0dXJuIHBpeGVsYXRlZCBjb2xvcgogICAgICAgIHJldHVybiBwaXhlbENvbG9yOwogICAgfQogICAgCiAgICAvLyBBZGQgZ3JpdHRpbmVzcyB1c2luZyBub2lzZSAtIHRoaXMgY3JlYXRlcyB0ZXh0dXJlIGluIHRoZSBibGVuZAogICAgbGV0IHBpeGVsUG9zID0gdGV4Q29vcmQgKiB2ZWMyPGYzMj4oZWZmZWN0UGFyYW1zLmNhbnZhc1dpZHRoLCBlZmZlY3RQYXJhbXMuY2FudmFzSGVpZ2h0KTsKICAgIGxldCBncml0dGluZXNzID0gc21vb3RoTm9pc2UocGl4ZWxQb3MsIDAuNSkgKiAwLjMgKyAwLjc7IC8vIFJhbmdlOiAwLjcgdG8gMS4wCiAgICAKICAgIC8vIENhbGN1bGF0ZSBibGVuZCBhbW91bnQgd2l0aCBncml0dGluZXNzCiAgICBsZXQgYmxlbmRBbW91bnQgPSBlZmZlY3RQYXJhbXMuYmxlbmRGYWN0b3IgKiBncml0dGluZXNzOwogICAgCiAgICAvLyBCbGVuZCBiZXR3ZWVuIHBpeGVsYXRlZCAoc29saWQpIGFuZCBvcmlnaW5hbCAoZm9nZ3kvdHJhbnNwYXJlbnQpCiAgICBsZXQgZmluYWxDb2xvciA9IG1peChwaXhlbENvbG9yLCBvcmlnaW5hbENvbG9yLCBibGVuZEFtb3VudCk7CiAgICAKICAgIHJldHVybiBmaW5hbENvbG9yOwp9CgpgCiAgICAgICAgfTsKICAgICAgICAKICAgICAgICBjb25zdCBXRUJHTF9TSEFERVJTID0gewogICAgICAgICAgICB2ZXJ0ZXhfZnVsbHNjcmVlbjogYCN2ZXJzaW9uIDMwMCBlcwovLyBGdWxsc2NyZWVuIHZlcnRleCBzaGFkZXIgLSBHTFNMIEVTIDMuMDAgKFdlYkdMIDIuMCkKLy8gQ29udmVydGVkIGZyb20gV0dTTCB2ZXJ0ZXhfZnVsbHNjcmVlbi53Z3NsCgpwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CgovLyBPdXRwdXRzIHRvIGZyYWdtZW50IHNoYWRlcgpvdXQgdmVjMiB2VVY7Cgp2b2lkIG1haW4oKSB7CiAgICAvLyBHZW5lcmF0ZSBmdWxsc2NyZWVuIHRyaWFuZ2xlIHVzaW5nIHZlcnRleCBJRAogICAgLy8gVmVydGV4IDA6ICgtMSwgLTEpIGJvdHRvbS1sZWZ0CiAgICAvLyBWZXJ0ZXggMTogKDMsIC0xKSBib3R0b20tcmlnaHQgKG9mZnNjcmVlbikKICAgIC8vIFZlcnRleCAyOiAoLTEsIDMpIHRvcC1sZWZ0IChvZmZzY3JlZW4pCiAgICAKICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBiYXNlZCBvbiB2ZXJ0ZXggSUQKICAgIC8vIGdsX1ZlcnRleElEIDAg4oaSIHg9LTEsIHk9LTEKICAgIC8vIGdsX1ZlcnRleElEIDEg4oaSIHg9MywgeT0tMQogICAgLy8gZ2xfVmVydGV4SUQgMiDihpIgeD0tMSwgeT0zCiAgICBmbG9hdCB4ID0gZmxvYXQoKGdsX1ZlcnRleElEICYgMSkgPDwgMikgLSAxLjA7CiAgICBmbG9hdCB5ID0gZmxvYXQoKGdsX1ZlcnRleElEICYgMikgPDwgMSkgLSAxLjA7CiAgICAKICAgIGdsX1Bvc2l0aW9uID0gdmVjNCh4LCB5LCAwLjAsIDEuMCk7CiAgICAKICAgIC8vIENhbGN1bGF0ZSBVViBjb29yZGluYXRlcyAoMCwwKSBhdCBib3R0b20tbGVmdCwgKDEsMSkgYXQgdG9wLXJpZ2h0CiAgICAvLyBGbGlwIFkgYmVjYXVzZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIGFyZSB0b3AtZG93biBpbiBXZWJHTAogICAgdlVWID0gdmVjMigKICAgICAgICAoeCArIDEuMCkgKiAwLjUsCiAgICAgICAgMS4wIC0gKHkgKyAxLjApICogMC41CiAgICApOwp9CgpgLAogICAgICAgICAgICB0dl9zdGF0aWM6IGAjdmVyc2lvbiAzMDAgZXMKLy8gVFYgU3RhdGljIEZyYWdtZW50IFNoYWRlciAtIEdMU0wgRVMgMy4wMCAoV2ViR0wgMi4wKQovLyBDb252ZXJ0ZWQgZnJvbSBXR1NMIHR2X3N0YXRpYy53Z3NsCi8vIFByb2NlZHVyYWxseSBnZW5lcmF0ZXMgYXV0aGVudGljIGJsYWNrICYgd2hpdGUgVFYgc3RhdGljIHNub3cKCnByZWNpc2lvbiBoaWdocCBmbG9hdDsKCi8vIFVuaWZvcm1zIChtYXRjaGVzIFdHU0wgU3RhdGljVW5pZm9ybXMgc3RydWN0KQp1bmlmb3JtIGZsb2F0IHRpbWU7ICAgICAgICAgICAvLyBDdXJyZW50IHRpbWUgZm9yIGFuaW1hdGlvbgp1bmlmb3JtIGZsb2F0IGludGVuc2l0eTsgICAgICAvLyBTdGF0aWMgaW50ZW5zaXR5ICgwLTEpCnVuaWZvcm0gZmxvYXQgc3BlZWQ7ICAgICAgICAgIC8vIEFuaW1hdGlvbiBzcGVlZCBtdWx0aXBsaWVyCnVuaWZvcm0gZmxvYXQgY29udHJhc3Q7ICAgICAgIC8vIENvbnRyYXN0IG11bHRpcGxpZXIKdW5pZm9ybSBmbG9hdCBicmlnaHRuZXNzOyAgICAgLy8gT3ZlcmFsbCBicmlnaHRuZXNzICgwLTEpCi8vIHBhZGRpbmcxIG5vdCBuZWVkZWQgaW4gR0xTTAp1bmlmb3JtIHZlYzIgcmVzb2x1dGlvbjsgICAgICAvLyBTY3JlZW4gcmVzb2x1dGlvbgovLyBwYWRkaW5nMiBub3QgbmVlZGVkIGluIEdMU0wKCi8vIElucHV0IGZyb20gdmVydGV4IHNoYWRlcgppbiB2ZWMyIHZVVjsKCi8vIE91dHB1dCBjb2xvcgpvdXQgdmVjNCBmcmFnQ29sb3I7CgovLyBJbnRlZ2VyLWJhc2VkIGhhc2ggZnVuY3Rpb24gKG5vIGZsb2F0aW5nIHBvaW50IGJpYXMpCi8vIFVzZXMgb25seSBpbnRlZ2VyIHBpeGVsIGNvb3JkaW5hdGVzIGZvciBwZXJmZWN0IHVuaWZvcm1pdHkKZmxvYXQgaGFzaEludCh1aW50IHgsIHVpbnQgeSwgdWludCBmcmFtZSkgewogICAgLy8gUENHIGhhc2ggLSBpbmR1c3RyeSBzdGFuZGFyZCBmb3IgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uCiAgICB1aW50IHNlZWQgPSB4ICsgeSAqIDM3NDc2MTM5M3UgKyBmcmFtZSAqIDY2ODI2NTI2M3U7CiAgICBzZWVkID0gKHNlZWQgXiAoc2VlZCA+PiAxNXUpKSAqIDE1OTczMzQ2Nzd1OwogICAgc2VlZCA9IChzZWVkIF4gKHNlZWQgPj4gMTV1KSkgKiAzODEyMDE1ODAxdTsKICAgIHNlZWQgPSBzZWVkIF4gKHNlZWQgPj4gMTV1KTsKICAgIAogICAgLy8gQ29udmVydCB0byAwLTEgcmFuZ2UKICAgIHJldHVybiBmbG9hdChzZWVkKSAvIDQyOTQ5NjcyOTUuMDsKfQoKLy8gSGlnaC1mcmVxdWVuY3kgbm9pc2UgZm9yIGZpbmUgZGV0YWlsIChwZXItcGl4ZWwgcmFuZG9tbmVzcykKLy8gVXNlcyBpbnRlZ2VyIHBpeGVsIGNvb3JkaW5hdGVzIC0gZWxpbWluYXRlcyBBTEwgZmxvYXRpbmcgcG9pbnQgYXJ0aWZhY3RzCmZsb2F0IGZhc3ROb2lzZSh2ZWMyIHBpeGVsUG9zLCBmbG9hdCB0LCBmbG9hdCBzY2FsZSkgewogICAgLy8gU2NhbGUgZG93biBjb29yZGluYXRlcyB0byBtYWtlIGVhY2ggbm9pc2UgInBpeGVsIiBsYXJnZXIKICAgIC8vIHNjYWxlID0gMTAuMCBtZWFucyBlYWNoIHJhbmRvbSB2YWx1ZSBjb3ZlcnMgYSAxMHgxMCBibG9jayBvZiBzY3JlZW4gcGl4ZWxzCiAgICB2ZWMyIHNjYWxlZFBvcyA9IHBpeGVsUG9zIC8gc2NhbGU7CiAgICAKICAgIC8vIENvbnZlcnQgdG8gaW50ZWdlciBwaXhlbCBjb29yZGluYXRlcwogICAgdWludCB4ID0gdWludChzY2FsZWRQb3MueCk7CiAgICB1aW50IHkgPSB1aW50KHNjYWxlZFBvcy55KTsKICAgIAogICAgLy8gRnJhbWUgY291bnRlciBmb3IgYW5pbWF0aW9uCiAgICB1aW50IGZyYW1lID0gdWludCh0ICogNjAuMCk7CiAgICAKICAgIC8vIFB1cmUgaW50ZWdlci1iYXNlZCBoYXNoIC0gbm8gaW50ZXJwb2xhdGlvbiwgbm8gcGF0dGVybnMKICAgIHJldHVybiBoYXNoSW50KHgsIHksIGZyYW1lKTsKfQoKdm9pZCBtYWluKCkgewogICAgdmVjMiB1diA9IHZVVjsKICAgIAogICAgLy8gQW5pbWF0ZWQgdGltZSBmb3IgY2hhbmdpbmcgbm9pc2UgZWFjaCBmcmFtZQogICAgZmxvYXQgdGltZUFuaW1hdGVkID0gdGltZSAqIHNwZWVkOwogICAgCiAgICAvLyBQdXJlIHBlci1waXhlbCByYW5kb20gbm9pc2UKICAgIC8vIENoYW5nZXMgY29tcGxldGVseSBldmVyeSBmcmFtZSAtIG5vIHBlcnNpc3RlbnQgcGF0dGVybnMKICAgIHZlYzIgcGl4ZWxQb3MgPSB1diAqIHJlc29sdXRpb247CiAgICAKICAgIC8vIEdyYWluIHNjYWxlOiAxMC4wID0gZWFjaCByYW5kb20gdmFsdWUgaXMgYSAxMHgxMCBwaXhlbCBibG9jawogICAgZmxvYXQgZ3JhaW5TY2FsZSA9IDIuMDsKICAgIGZsb2F0IHN0YXRpY1ZhbHVlID0gZmFzdE5vaXNlKHBpeGVsUG9zLCB0aW1lQW5pbWF0ZWQsIGdyYWluU2NhbGUpOwogICAgCiAgICAvLyBBcHBseSBpbnRlbnNpdHkKICAgIGZsb2F0IHZhbHVlID0gc3RhdGljVmFsdWUgKiBpbnRlbnNpdHk7CiAgICAKICAgIC8vIEFwcGx5IGNvbnRyYXN0IHRvIHB1c2ggdG93YXJkcyBibGFjayBhbmQgd2hpdGUgZXh0cmVtZXMKICAgIHZhbHVlID0gKHZhbHVlIC0gMC41KSAqIGNvbnRyYXN0ICsgMC41OwogICAgCiAgICAvLyBBcHBseSBicmlnaHRuZXNzIGFkanVzdG1lbnQKICAgIHZhbHVlID0gdmFsdWUgKiBicmlnaHRuZXNzICsgKDEuMCAtIGJyaWdodG5lc3MpICogMC41OwogICAgCiAgICAvLyBDbGFtcCB0byB2YWxpZCByYW5nZQogICAgdmFsdWUgPSBjbGFtcCh2YWx1ZSwgMC4wLCAxLjApOwogICAgCiAgICAvLyBQdXJlIGJsYWNrICYgd2hpdGUgb3V0cHV0IChubyBjb2xvciBzZXBhcmF0aW9uKQogICAgdmVjMyBjb2xvciA9IHZlYzModmFsdWUpOwogICAgCiAgICBmcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCAxLjApOwp9CgpgLAogICAgICAgICAgICBwaXhlbGl6YXRpb246IGAjdmVyc2lvbiAzMDAgZXMKLy8gUGl4ZWxpemF0aW9uIEVmZmVjdCBGcmFnbWVudCBTaGFkZXIgLSBHTFNMIEVTIDMuMDAgKFdlYkdMIDIuMCkKLy8gQ29udmVydGVkIGZyb20gV0dTTCBwaXhlbGl6YXRpb24ud2dzbAovLyBDcmVhdGVzIGR5bmFtaWMgcGl4ZWwgZ3JpZCBvdmVybGF5IHdpdGggY29uZmlndXJhYmxlIGdyYW51bGFyaXR5CgpwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CgovLyBJbnB1dCB0ZXh0dXJlIChmcm9tIHByZXZpb3VzIHJlbmRlciBwYXNzIC0gVFYgc3RhdGljKQp1bmlmb3JtIHNhbXBsZXIyRCBpbnB1dFRleHR1cmU7CgovLyBFZmZlY3QgcGFyYW1ldGVycyAobWF0Y2hlcyBXR1NMIEVmZmVjdFVuaWZvcm1zIHN0cnVjdCkKdW5pZm9ybSBmbG9hdCBwaXhlbFJvd3M7ICAgICAvLyBOdW1iZXIgb2YgcGl4ZWwgcm93cyAodmVydGljYWwgZ3JhbnVsYXJpdHkpCnVuaWZvcm0gZmxvYXQgcGl4ZWxDb2xzOyAgICAgLy8gTnVtYmVyIG9mIHBpeGVsIGNvbHVtbnMgKGhvcml6b250YWwgZ3JhbnVsYXJpdHkpCnVuaWZvcm0gZmxvYXQgY2FudmFzV2lkdGg7ICAgLy8gQ2FudmFzIHdpZHRoIGluIHBpeGVscwp1bmlmb3JtIGZsb2F0IGNhbnZhc0hlaWdodDsgIC8vIENhbnZhcyBoZWlnaHQgaW4gcGl4ZWxzCnVuaWZvcm0gZmxvYXQgYmxlbmRGYWN0b3I7ICAgLy8gQmxlbmQgYmV0d2VlbiBzb2xpZCAoMC4wKSBhbmQgdHJhbnNwYXJlbnQvZm9nZ3kgKDEuMCkKdW5pZm9ybSBmbG9hdCB0aW1lOyAgICAgICAgICAvLyBUaW1lIGZvciBzdWJ0bGUgYW5pbWF0aW9uL3ZhcmlhdGlvbgovLyBwYWRkaW5nIG5vdCBuZWVkZWQgaW4gR0xTTAoKLy8gSW5wdXQgZnJvbSB2ZXJ0ZXggc2hhZGVyCmluIHZlYzIgdlVWOwoKLy8gT3V0cHV0IGNvbG9yCm91dCB2ZWM0IGZyYWdDb2xvcjsKCi8vIEhhc2ggZnVuY3Rpb24gZm9yIGdyaXR0aW5lc3Mvbm9pc2UKZmxvYXQgaGFzaCh2ZWMyIHApIHsKICAgIHZlYzMgcDMgPSBmcmFjdCh2ZWMzKHAueCwgcC55LCBwLngpICogMC4xMyk7CiAgICBmbG9hdCBkcCA9IGRvdCh2ZWMzKHAueCwgcC55LCBwLngpICsgdmVjMyhwMy55LCBwMy56LCBwMy54KSwgcDMgKyB2ZWMzKDMzLjMzKSk7CiAgICByZXR1cm4gZnJhY3QoKHAzLnggKyBwMy55KSAqIGRwKTsKfQoKLy8gU21vb3RoIG5vaXNlIGZvciBmb2dneSBlZmZlY3QKZmxvYXQgc21vb3RoTm9pc2UodmVjMiB1diwgZmxvYXQgc2NhbGUpIHsKICAgIHZlYzIgc2NhbGVkID0gdXYgKiBzY2FsZTsKICAgIHZlYzIgaSA9IGZsb29yKHNjYWxlZCk7CiAgICB2ZWMyIGYgPSBmcmFjdChzY2FsZWQpOwogICAgCiAgICAvLyBTbW9vdGggaW50ZXJwb2xhdGlvbgogICAgdmVjMiB1ID0gZiAqIGYgKiAoMy4wIC0gMi4wICogZik7CiAgICAKICAgIC8vIFNhbXBsZSBjb3JuZXJzCiAgICBmbG9hdCBhID0gaGFzaChpKTsKICAgIGZsb2F0IGIgPSBoYXNoKGkgKyB2ZWMyKDEuMCwgMC4wKSk7CiAgICBmbG9hdCBjID0gaGFzaChpICsgdmVjMigwLjAsIDEuMCkpOwogICAgZmxvYXQgZCA9IGhhc2goaSArIHZlYzIoMS4wLCAxLjApKTsKICAgIAogICAgLy8gQmlsaW5lYXIgaW50ZXJwb2xhdGlvbgogICAgcmV0dXJuIG1peChtaXgoYSwgYiwgdS54KSwgbWl4KGMsIGQsIHUueCksIHUueSk7Cn0KCnZvaWQgbWFpbigpIHsKICAgIHZlYzIgdGV4Q29vcmQgPSB2VVY7CiAgICAKICAgIC8vIENhbGN1bGF0ZSB3aGljaCBwaXhlbCBncmlkIGNlbGwgdGhpcyBmcmFnbWVudCBiZWxvbmdzIHRvCiAgICB2ZWMyIHBpeGVsR3JpZFBvcyA9IGZsb29yKHRleENvb3JkICogdmVjMihwaXhlbENvbHMsIHBpeGVsUm93cykpOwogICAgCiAgICAvLyBDYWxjdWxhdGUgdGhlIGNlbnRlciBvZiB0aGUgcGl4ZWwgY2VsbCBmb3Igc2FtcGxpbmcKICAgIC8vIEFkZGluZyAwLjUgY2VudGVycyB0aGUgc2FtcGxpbmcgcG9pbnQgd2l0aGluIGVhY2ggcGl4ZWwgY2VsbAogICAgdmVjMiBwaXhlbENlbnRlciA9IChwaXhlbEdyaWRQb3MgKyB2ZWMyKDAuNSwgMC41KSkgLyB2ZWMyKHBpeGVsQ29scywgcGl4ZWxSb3dzKTsKICAgIAogICAgLy8gU2FtcGxlIHRoZSBwaXhlbGF0ZWQgY29sb3IgKGZyb20gcGl4ZWwgY2VudGVyIC0gc29saWQgYmxvY2tzKQogICAgdmVjNCBwaXhlbENvbG9yID0gdGV4dHVyZShpbnB1dFRleHR1cmUsIHBpeGVsQ2VudGVyKTsKICAgIAogICAgLy8gU2FtcGxlIHRoZSBvcmlnaW5hbCB0ZXh0dXJlIChmcm9tIGFjdHVhbCBwb3NpdGlvbiAtIHVuZGVybHlpbmcgc3RhdGljKQogICAgdmVjNCBvcmlnaW5hbENvbG9yID0gdGV4dHVyZShpbnB1dFRleHR1cmUsIHRleENvb3JkKTsKICAgIAogICAgLy8gQXQgYmxlbmRGYWN0b3IgPSAwLjA6IGZ1bGx5IG9wYXF1ZSBwaXhlbHMgKGxlZnQgc2lkZSkKICAgIC8vIEF0IGJsZW5kRmFjdG9yID0gMS4wOiBmb2dneS9ncml0dHkgYmxlbmQgc2hvd2luZyB1bmRlcmx5aW5nIHN0YXRpYyAocmlnaHQgc2lkZSkKICAgIAogICAgaWYgKGJsZW5kRmFjdG9yIDw9IDAuMDEpIHsKICAgICAgICAvLyBGdWxseSBvcGFxdWUgLSBqdXN0IHJldHVybiBwaXhlbGF0ZWQgY29sb3IKICAgICAgICBmcmFnQ29sb3IgPSBwaXhlbENvbG9yOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIAogICAgLy8gQWRkIGdyaXR0aW5lc3MgdXNpbmcgbm9pc2UgLSB0aGlzIGNyZWF0ZXMgdGV4dHVyZSBpbiB0aGUgYmxlbmQKICAgIHZlYzIgcGl4ZWxQb3MgPSB0ZXhDb29yZCAqIHZlYzIoY2FudmFzV2lkdGgsIGNhbnZhc0hlaWdodCk7CiAgICBmbG9hdCBncml0dGluZXNzID0gc21vb3RoTm9pc2UocGl4ZWxQb3MsIDAuNSkgKiAwLjMgKyAwLjc7IC8vIFJhbmdlOiAwLjcgdG8gMS4wCiAgICAKICAgIC8vIENhbGN1bGF0ZSBibGVuZCBhbW91bnQgd2l0aCBncml0dGluZXNzCiAgICBmbG9hdCBibGVuZEFtb3VudCA9IGJsZW5kRmFjdG9yICogZ3JpdHRpbmVzczsKICAgIAogICAgLy8gQmxlbmQgYmV0d2VlbiBwaXhlbGF0ZWQgKHNvbGlkKSBhbmQgb3JpZ2luYWwgKGZvZ2d5L3RyYW5zcGFyZW50KQogICAgdmVjNCBmaW5hbENvbG9yID0gbWl4KHBpeGVsQ29sb3IsIG9yaWdpbmFsQ29sb3IsIGJsZW5kQW1vdW50KTsKICAgIAogICAgZnJhZ0NvbG9yID0gZmluYWxDb2xvcjsKfQoKYAogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAvLyBKQVZBU0NSSVBUIE1PRFVMRVMgKEZsYXR0ZW5