Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
8D52A7594278B0F6F2BFDA29B73B0EC175654C7872566C386EBDB755E8A8056B
Transaction overview
Execution summary
TX INDEX
1
Position in block
GAS WANTED
89,907,756
Requested gas limit
GAS USED
74,923,160
Gas consumed
FEE
89908ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1q5tjjv3kkslzwf2na9y9wk7e5a8ugph8xfsk04
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
Cq/kAwoML3ZtLm1fYWRkcGtnEp3kAwooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBLv4wMKCHBvc2l0aW9uEhtnbm8ubGFuZC9yL2dub3N3YXAvcG9zaXRpb24avDsKCVJFQURNRS5tZBKuOyMgUG9zaXRpb24KCk5GVC1iYXNlZCBsaXF1aWRpdHkgcG9zaXRpb24gbWFuYWdlbWVudCBmb3IgY29uY2VudHJhdGVkIGxpcXVpZGl0eS4KCiMjIE92ZXJ2aWV3CgpFYWNoIGxpcXVpZGl0eSBwb3NpdGlvbiBpcyBhIHVuaXF1ZSBHUkM3MjEgTkZULiBTdG9yZWQgc3RhdGUgaW5jbHVkZXMgdGhlIHBvb2wKa2V5LCBwcmljZSByYW5nZSwgbGlxdWlkaXR5LCBmZWUtZ3Jvd3RoIGNoZWNrcG9pbnRzLCB0b2tlbnMgb3dlZCwgYnVybmVkIG1hcmtlciwKYW5kIG9wZXJhdG9yLiBDdXJyZW50IHRva2VuIGJhbGFuY2VzIGFyZSBkZXJpdmVkIGZyb20gdGhlIGN1cnJlbnQgcG9vbCBwcmljZSwKcmFuZ2UsIGFuZCBsaXF1aWRpdHk7IHRoZXkgYXJlIG5vdCBwZXJtYW5lbnRseSBzdG9yZWQgYmFsYW5jZXMuCgpUaGUgcG9vbCBhY2NvdW50aW5nIGtleSBlbmNvZGVzIG9ubHkgdGhlIGxvd2VyL3VwcGVyIHRpY2sgcGFpciBhbmQgaXMgc2NvcGVkIGJ5CnBvb2wuIE5GVHMgd2l0aCB0aGUgc2FtZSByYW5nZSBpbiBvbmUgcG9vbCBzaGFyZSB0aGUgcG9vbC1sZXZlbCBhY2NvdW50aW5nIGVudHJ5LgoKIyMgR25vd2ViCgpUaGUgcm9vdCBgUmVuZGVyKCIiKWAgZGVsZWdhdGVzIHRvIHRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24gYW5kIHNob3dzIHJlYWxtIGlkZW50aXR5LCBoYWx0IGZsYWdzLCBzdG9yZWQgcG9zaXRpb24gY291bnQsIGFuZCB0aGUgbmV4dCBwb3NpdGlvbiBJRC4gU3RvcmVkIHJlY29yZHMgaW5jbHVkZSBidXJuZWQgcG9zaXRpb25zLCBzbyB0aGUgY291bnQgZG9lcyBub3QgcmVwcmVzZW50IGFjdGl2ZSBsaXF1aWRpdHkgcG9zaXRpb25zLgoKU3VwcG9ydGVkIHJvdXRlczoKCi0gYCIiYDogdGhlIHJvb3Qgc3VtbWFyeS4gSXQgcmVhZHMgb25seSBhZ2dyZWdhdGUgcG9zaXRpb24tc3RvcmUgbWV0YWRhdGEuCi0gYGlkLzxpZD5gOiBvbmUgcG9zaXRpb24gcmVjb3JkLCBzZWxlY3RlZCBieSBhIHNpbmdsZSBrZXllZCBsb29rdXAuIFRoZSBgPGlkPmAgbXVzdCBiZSBhbiB1bnNpZ25lZCBkZWNpbWFsIGB1aW50NjRgOyBtYWxmb3JtZWQsIG92ZXJmbG93aW5nLCBtaXNzaW5nLCBhbmQgZXh0cmEtc2VnbWVudCBwYXRocyByZXR1cm4gYDQwNGAuCgpGb3IgZXhhbXBsZSwgYC9yL2dub3N3YXAvcG9zaXRpb246aWQvMWAgc2hvd3MgcG9zaXRpb24gMS4gRGV0YWlsIHBhZ2VzIHNob3cKdGhlIElELCBidXJuIHN0YXR1cywgTkZUIG93bmVyIHdoZW4gYXZhaWxhYmxlLCB0b2tlbiByZWFsbSBsaW5rcywgZmVlIHRpZXIsIHRpY2sKcmFuZ2UsIGxpcXVpZGl0eSwgYW5kIHN0b3JlZCBmZWUgYWNjb3VudGluZy4KClRoZSBjb21wb3NpdGUgcG9vbCBrZXkgaXMgaW5saW5lIGNvZGU7IGVhY2ggdG9rZW4gcmVmZXJlbmNlIGxpbmtzIHRvIGl0cyBkZWZpbmluZwpyZWFsbSByYXRoZXIgdGhhbiBhIGAuU1lNQk9MYCBVUkwuIFJlbmRlcmluZyBkb2VzIG5vdCBlbnVtZXJhdGUgcG9zaXRpb25zIG9yCnJlY29tcHV0ZSBjbGFpbWFibGUgZmVlcyBhbmQgY3VycmVudCB0b2tlbiBiYWxhbmNlcy4gQnVybmVkIHJlY29yZHMgcmVtYWluCmFkZHJlc3NhYmxlIGV2ZW4gd2hlbiB0aGVpciBORlQgb3duZXIgaXMgdW5hdmFpbGFibGUuCgojIyBDb25maWd1cmF0aW9uCgotICoqV2l0aGRyYXdhbCBGZWUqKjogMSUgYnkgZGVmYXVsdCBvbiBmZWUtYmVhcmluZyBzd2FwLWZlZSBjb2xsZWN0aW9uCi0gKipNYXggUG9zaXRpb24gU2l6ZSoqOiBObyBzZXBhcmF0ZSBwb3NpdGlvbi1sZXZlbCBjYXA7IHBvb2wgdGljayBsaW1pdHMgYXBwbHkKLSAqKlRyYW5zZmVycyoqOiBVbnN0YWtlZCBORlRzIGZvbGxvdyBHUkM3MjEgb3duZXIvYXBwcm92YWwvb3BlcmF0b3IgcnVsZXM7CiAgc3Rha2VkIE5GVHMgYXJlIGxvY2tlZCB0byBzdGFrZXItbWVkaWF0ZWQgdHJhbnNmZXJzCgojIyBDb3JlIEZ1bmN0aW9ucwoKIyMjIGBNaW50YAoKQ3JlYXRlcyBuZXcgcG9zaXRpb24gTkZUIHdpdGggaW5pdGlhbCBsaXF1aWRpdHkuCgotIFZhbGlkYXRlcyB0aWNrIHJhbmdlIGFsaWdubWVudAotIENhbGN1bGF0ZXMgb3B0aW1hbCB0b2tlbiByYXRpbwotIFJldHVybnMgYWN0dWFsIGFtb3VudHMgdXNlZAoKIyMjIGBJbmNyZWFzZUxpcXVpZGl0eWAKCkFkZHMgbGlxdWlkaXR5IHRvIGFuIGV4aXN0aW5nIHBvc2l0aW9uLgoKLSBNYWludGFpbnMgdGhlIGV4aXN0aW5nIHByaWNlIHJhbmdlCi0gVXNlcyB0aGUgY3VycmVudC1wcmljZSB0b2tlbiByYXRpbwotIENhbiBjbGVhciBhIGJ1cm5lZCBtYXJrZXIgd2hlbiB0aGUgcG9zaXRpb24gaXMgdXNlZCBhZ2FpbgoKIyMjIGBEZWNyZWFzZUxpcXVpZGl0eWAKClJlbW92ZXMgbGlxdWlkaXR5IHdoaWxlIGtlZXBpbmcgdGhlIE5GVC4KCi0gT25lIGF0b21pYyBwdWJsaWMgb3BlcmF0aW9uOiBpbnRlcm5hbGx5IGNvbGxlY3RzIHN3YXAgZmVlcywgYnVybnMgbGlxdWlkaXR5LAogIHRoZW4gY29sbGVjdHMgcHJpbmNpcGFsIHRocm91Z2ggdGhlIHBvb2wncyBmZWUtZnJlZSBgQ29sbGVjdGAgcGF0aAotIFJldHVybnMgZmVlIGFtb3VudHMgbmV0IG9mIHRoZSB3aXRoZHJhd2FsIGZlZSBhbmQgY29sbGVjdGVkIHByaW5jaXBhbAotIEFtb3VudC1taW5pbXVtIGNoZWNrcyBhcHBseSB0byB0aGUgcHJpbmNpcGFsIGFjdHVhbGx5IGNvbGxlY3RlZAoKIyMjIGBDb2xsZWN0RmVlYAoKQ2xhaW1zIGFjY3VtdWxhdGVkIHN3YXAgZmVlcyB3aXRob3V0IHJlbW92aW5nIGxpcXVpZGl0eS4KCi0gTm8gbGlxdWlkaXR5IHJlbW92YWwgcmVxdWlyZWQKLSBSZXR1cm5zIG5ldCBjb2xsZWN0ZWQgYW1vdW50cyBwbHVzIHRoZSByYXcgcHJlLXdpdGhkcmF3YWwtZmVlIGFtb3VudHMKLSBUaGUgY29uZmlndXJlZCB3aXRoZHJhd2FsIGZlZSBhcHBsaWVzIG9ubHkgdG8gdGhpcyBmZWUtYmVhcmluZyBwYXRoCgojIyMgYFJlcG9zaXRpb25gCgpVcGRhdGVzIGFuIGV4aXN0aW5nIHBvc2l0aW9uJ3MgcHJpY2UgcmFuZ2UuCgotIFJlcXVpcmVzIHRoZSBwb3NpdGlvbiB0byBiZSBjbGVhciBmaXJzdCAoemVybyBsaXF1aWRpdHkgYW5kIHRva2VucyBvd2VkKQotIFJldXNlcyB0aGUgc2FtZSBwb3NpdGlvbiBJRCBhbmQgTkZUCi0gQWRkcyBuZXcgbGlxdWlkaXR5IHRvIHRoZSB1cGRhdGVkIHJhbmdlIGFuZCBjbGVhcnMgdGhlIGJ1cm5lZCBtYXJrZXIKCiMjIFRlY2huaWNhbCBEZXRhaWxzCgojIyMgVGljayBBbGlnbm1lbnQKClRpY2tzIG11c3QgYWxpZ24gd2l0aCBwb29sJ3MgdGljayBzcGFjaW5nOgoKYGBgCjAuMDElIGZlZTogZXZlcnkgMSB0aWNrCjAuMDUlIGZlZTogZXZlcnkgMTAgdGlja3MKMC4zJSBmZWU6IGV2ZXJ5IDYwIHRpY2tzCjElIGZlZTogZXZlcnkgMjAwIHRpY2tzCmBgYAoKIyMjIE9wdGltYWwgUmFuZ2UgV2lkdGgKCioqU3RhYmxlIFBhaXJzIChVU0RDL1VTRFQpKio6CgotIE5hcnJvdzogwrEwLjA1JSAobWF4IGVmZmljaWVuY3kpCi0gTWVkaXVtOiDCsTAuMSUgKGJhbGFuY2VkKQotIFdpZGU6IMKxMC41JSAoc2FmZXR5KQoKKipDb3JyZWxhdGVkIFBhaXJzIChXRVRIL3N0RVRIKSoqOgoKLSBOYXJyb3c6IMKxMC41JQotIE1lZGl1bTogwrExJQotIFdpZGU6IMKxMiUKCioqVm9sYXRpbGUgUGFpcnMgKFdFVEgvVVNEQykqKjoKCi0gTmFycm93OiDCsTUlCi0gTWVkaXVtOiDCsTEwJQotIFdpZGU6IMKxMjUlCgojIyMgQ2FwaXRhbCBFZmZpY2llbmN5CgpDb25jZW50cmF0aW9uIGZhY3RvciB2cyBpbmZpbml0ZSByYW5nZToKCmBgYApSYW5nZSDCsTAuMSUgIOKGkiAyMDAweCBlZmZpY2llbnQKUmFuZ2UgwrExJSAgICDihpIgMjAweCBlZmZpY2llbnQKUmFuZ2UgwrExMCUgICDihpIgMjB4IGVmZmljaWVudApSYW5nZSDCsTUwJSAgIOKGkiA0eCBlZmZpY2llbnQKYGBgCgojIyMgVG9rZW4gQ2FsY3VsYXRpb25zCgpGb3IgbGlxdWlkaXR5IGBMYCBhbmQgc3F1YXJlLXJvb3QgcHJpY2VzIGBzcXJ0TG93ZXJgLCBgc3FydEN1cnJlbnRgLCBhbmQKYHNxcnRVcHBlcmA6CgoqKkJlbG93IHJhbmdlIChgY3VycmVudCA8IGxvd2VyYCwgdG9rZW4wIG9ubHkpKio6CgpgYGAKYW1vdW50MCA9IEwgKiAoc3FydFVwcGVyIC0gc3FydExvd2VyKSAvIChzcXJ0VXBwZXIgKiBzcXJ0TG93ZXIpCmFtb3VudDEgPSAwCmBgYAoKKipJbiByYW5nZSAoYGxvd2VyIDw9IGN1cnJlbnQgPCB1cHBlcmAsIGJvdGggdG9rZW5zKSoqOgoKYGBgCmFtb3VudDAgPSBMICogKHNxcnRVcHBlciAtIHNxcnRDdXJyZW50KSAvIChzcXJ0VXBwZXIgKiBzcXJ0Q3VycmVudCkKYW1vdW50MSA9IEwgKiAoc3FydEN1cnJlbnQgLSBzcXJ0TG93ZXIpCmBgYAoKKipBYm92ZSByYW5nZSAoYGN1cnJlbnQgPj0gdXBwZXJgLCB0b2tlbjEgb25seSkqKjoKCmBgYAphbW91bnQwID0gMAphbW91bnQxID0gTCAqIChzcXJ0VXBwZXIgLSBzcXJ0TG93ZXIpCmBgYAoKIyMgQXBwcm92YWwgYW5kIFRyYW5zZmVyIFJlcXVpcmVtZW50cwoKYE1pbnRgLCBgSW5jcmVhc2VMaXF1aWRpdHlgLCBhbmQgYFJlcG9zaXRpb25gIHB1bGwgdG9rZW4wIGFuZCB0b2tlbjEgZnJvbSB0aGUKY2FsbGVyIGluc2lkZSB0aGUgKipwb29sKiogcmVhbG0sIHNvIHRoZSBhcHByb3ZlZCBzcGVuZGVyIGlzIHRoZSBwb29sIHJlYWxtCmFkZHJlc3MsIG5vdCB0aGUgcG9zaXRpb24gcmVhbG0uCgotIEFwcHJvdmUgdGhlIHBvb2wgcmVhbG0gZm9yIGJvdGggdG9rZW4gY29udHJhY3RzIGJlZm9yZSBjYWxsaW5nIGEKICBsaXF1aWRpdHktYWRkaW5nIGZ1bmN0aW9uLgotIEFwcHJvdmluZyB0aGUgcG9zaXRpb24gcmVhbG0gYWxvbmUgaXMgbm90IHN1ZmZpY2llbnQ7IHRoZSBwb3NpdGlvbiByZWFsbSBuZXZlcgogIGhvbGRzIG9yIHB1bGxzIHRoZSBwYWlyIHRva2VucyBpdHNlbGYuCi0gQXBwcm92ZSBhdCBsZWFzdCBgYW1vdW50MERlc2lyZWRgIC8gYGFtb3VudDFEZXNpcmVkYC4gQW55IGRlc2lyZWQgYW1vdW50IHRoZQogIHBvb2wgZG9lcyBub3QgY29uc3VtZSBzdGF5cyB3aXRoIHRoZSBjYWxsZXIuCi0gYERlY3JlYXNlTGlxdWlkaXR5YCBhbmQgYENvbGxlY3RGZWVgIHBheSBvdXQgdG8gdGhlIGNhbGxlciBhbmQgcmVxdWlyZSBubwogIGFwcHJvdmFsLgoKYGBgZ28KLy8gQXBwcm92ZSB0aGUgcG9vbCByZWFsbSBmb3IgYm90aCBwYWlyIHRva2VucyBiZWZvcmUgbWludGluZwpwb29sQWRkcmVzcyA6PSBhY2Nlc3MuTXVzdEdldEFkZHJlc3MocHJhYmMuUk9MRV9QT09MLlN0cmluZygpKQp3ZXRoLkFwcHJvdmUoY3Jvc3MoY3VyKSwgcG9vbEFkZHJlc3MsIDEwMDAwMDApCnVzZGMuQXBwcm92ZShjcm9zcyhjdXIpLCBwb29sQWRkcmVzcywgMjAwMDAwMDAwMCkKYGBgCgojIyBVc2FnZQoKVGhlc2Ugc25pcHBldHMgY2FsbCB0aGUgcHVibGljIGRvbWFpbiBwcm94eSBmcm9tIGEgcmVhbG0gZnVuY3Rpb24gd2l0aCBhIGN1cnJlbnQgYGN1cmAgdG9rZW4uCkltcG9ydCB0aGUgcHJveHkgcGFja2FnZSBhbmQgcXVhbGlmeSBpdHMgZnVuY3Rpb24gbmFtZXMgaW4gaW50ZWdyYXRpbmcgY29kZS4KCmBgYGdvCi8vIE1pbnQgbmV3IHBvc2l0aW9uCnRva2VuSWQsIGxpcXVpZGl0eSwgYW1vdW50MCwgYW1vdW50MSA6PSBNaW50KAogICAgY3Jvc3MoY3VyKSwKICAgICJnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdCIsIC8vIHRva2VuMAogICAgImduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TIiwgICAvLyB0b2tlbjEKICAgIDMwMDAsICAgICAgICAgICAgICAgICAgICAgIC8vIGZlZQogICAgLTg4NzIyMCwgICAgICAgICAgICAgICAgICAgLy8gdGlja0xvd2VyCiAgICA4ODcyMjAsICAgICAgICAgICAgICAgICAgICAvLyB0aWNrVXBwZXIKICAgICIxMDAwMDAwIiwgICAgICAgICAgICAgICAgIC8vIGFtb3VudDBEZXNpcmVkCiAgICAiMjAwMDAwMDAwMCIsICAgICAgICAgICAgICAvLyBhbW91bnQxRGVzaXJlZAogICAgIjk1MDAwMCIsICAgICAgICAgICAgICAgICAgLy8gYW1vdW50ME1pbgogICAgIjE5MDAwMDAwMDAiLCAgICAgICAgICAgICAgLy8gYW1vdW50MU1pbgogICAgZGVhZGxpbmUsCiAgICByZWNpcGllbnQsICAgICAgICAgICAgICAgICAvLyBtaW50VG8KICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVycmVyCikKCi8vIEFkZCBsaXF1aWRpdHkKcG9zaXRpb25JZCwgbGlxdWlkaXR5LCBhbW91bnQwLCBhbW91bnQxLCBwb29sUGF0aCA6PSBJbmNyZWFzZUxpcXVpZGl0eSgKICAgIGNyb3NzKGN1ciksCiAgICB0b2tlbklkLAogICAgIjUwMDAwMCIsCiAgICAiMTAwMDAwMDAwMCIsCiAgICAiNDc1MDAwIiwKICAgICI5NTAwMDAwMDAiLAogICAgZGVhZGxpbmUsCikKCi8vIENvbGxlY3QgZmVlcwpwb3NpdGlvbklkLCBjb2xsZWN0ZWQwLCBjb2xsZWN0ZWQxLCBwb29sUGF0aCwgcmF3QW1vdW50MCwgcmF3QW1vdW50MSA6PSBDb2xsZWN0RmVlKAogICAgY3Jvc3MoY3VyKSwKICAgIHRva2VuSWQsCikKCi8vIFJlcG9zaXRpb24gdG8gbmV3IHJhbmdlIChyZXF1aXJlcyBjbGVhcmVkIHBvc2l0aW9uKQpwb3NpdGlvbklkLCBsaXF1aWRpdHksIHRpY2tMb3dlciwgdGlja1VwcGVyLCBhbW91bnQwLCBhbW91bnQxIDo9IFJlcG9zaXRpb24oCiAgICBjcm9zcyhjdXIpLAogICAgdG9rZW5JZCwKICAgIC00NDM2MTAsICAgICAgICAgICAgICAgICAgIC8vIG5ldyB0aWNrTG93ZXIKICAgIDQ0MzYxMCwgICAgICAgICAgICAgICAgICAgIC8vIG5ldyB0aWNrVXBwZXIKICAgICIxMDAwMDAwIiwgICAgICAgICAgICAgICAgIC8vIGFtb3VudDBEZXNpcmVkCiAgICAiMjAwMDAwMDAwMCIsICAgICAgICAgICAgICAvLyBhbW91bnQxRGVzaXJlZAogICAgIjk1MDAwMCIsICAgICAgICAgICAgICAgICAgLy8gYW1vdW50ME1pbgogICAgIjE5MDAwMDAwMDAiLCAgICAgICAgICAgICAgLy8gYW1vdW50MU1pbgogICAgZGVhZGxpbmUsCikKYGBgCgojIyBMaWZlY3ljbGUKCkEgZnVsbCBkZWNyZWFzZSB0aGF0IGxlYXZlcyB6ZXJvIGxpcXVpZGl0eSBhbmQgemVybyB0b2tlbnMgb3dlZCBzZXRzIHRoZQpgYnVybmVkYCBtYXJrZXIgYnV0IGRvZXMgbm90IGRlc3Ryb3kgdGhlIE5GVC4gYEluY3JlYXNlTGlxdWlkaXR5YCBhbmQKYFJlcG9zaXRpb25gIGNsZWFyIHRoZSBtYXJrZXIgd2hlbiB0aGUgcG9zaXRpb24gaXMgdXNlZCBhZ2FpbjsgdGhlIG1hcmtlciBkb2VzCm5vdCBieSBpdHNlbGYgYmxvY2sgYW4gaW5jcmVhc2UuCgojIyBTZWN1cml0eQoKLSBUaWNrIHJhbmdlIHZhbGlkYXRpb24gcHJldmVudHMgaW52YWxpZCBwb3NpdGlvbnMKLSBTbGlwcGFnZSBwcm90ZWN0aW9uIGFwcGxpZXMgdG8gbGlxdWlkaXR5LWNoYW5naW5nIG9wZXJhdGlvbnM7IGZlZSBjb2xsZWN0aW9uCiAgaGFzIG5vIGFtb3VudC1taW5pbXVtIHBhcmFtZXRlcgotIERlYWRsaW5lcyBwcmV2ZW50IHN0YWxlIGxpcXVpZGl0eS1jaGFuZ2luZyB0cmFuc2FjdGlvbnMKLSBVbnN0YWtlZCBORlRzIGZvbGxvdyBzdGFuZGFyZCBHUkM3MjEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbjsgc3Rha2VkIE5GVHMKICBjYW4gbW92ZSBvbmx5IHRocm91Z2ggc3Rha2VyLW1lZGlhdGVkIGZsb3dzCi0gTGlxdWlkaXR5IGNoYW5nZXMgYW5kIHJlcG9zaXRpb25pbmcgcmVxdWlyZSB0aGUgb3duZXI7IGZlZSBjb2xsZWN0aW9uIGFsc28KICBwZXJtaXRzIHRoZSBwb3NpdGlvbidzIGFwcHJvdmVkIG9wZXJhdG9yIHdoZXJlIGFwcGxpY2FibGUKGmgKCmVycm9ycy5nbm8SWnBhY2thZ2UgcG9zaXRpb24KCmNvbnN0IEVyclNwb29mZWRSZWFsbSA9ICJybG0gZG9lcyBub3QgbWF0Y2ggdGhlIGN1cnJlbnQgY3Jvc3NpbmcgZnJhbWUiChqWSQoKZ2V0dGVyLmdubxKHSXBhY2thZ2UgcG9zaXRpb24KCmltcG9ydCAoCglyb3RyZWUgImduby5sYW5kL3AvbnQvYnB0cmVlL3JvdHJlZS92MCIKKQoKLy8gR2V0UG9zaXRpb25zIHJldHVybnMgYSByZWFkLW9ubHkgdmlldyBvZiBhbGwgcG9zaXRpb25zLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcG9zaXRpb25zOiByZWFkLW9ubHkgdHJlZSBrZXllZCBieSBkZWNpbWFsIHBvc2l0aW9uIElEOyBjYWxsZXJzIHBhZ2luYXRlIHdpdGggSXRlcmF0ZUJ5T2Zmc2V0CmZ1bmMgR2V0UG9zaXRpb25zKCkgKnJvdHJlZS5SZWFkT25seVRyZWUgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UG9zaXRpb25zKCkKfQoKLy8gSXNCdXJuZWQgcmVwb3J0cyB3aGV0aGVyIHRoZSBwb3NpdGlvbidzIGVtcHR5LXBvc2l0aW9uIG1hcmtlciBpcyBzZXQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQKLy8KLy8gUmV0dXJuczoKLy8gICAtIGJ1cm5lZDogd2hldGhlciB0aGUgcG9zaXRpb24ncyBlbXB0eS1wb3NpdGlvbiBtYXJrZXIgaXMgc2V0Ci8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwb3NpdGlvbklkIGNhbm5vdCBiZSByZXNvbHZlZApmdW5jIElzQnVybmVkKHBvc2l0aW9uSWQgdWludDY0KSAoYm9vbCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLklzQnVybmVkKHBvc2l0aW9uSWQpCn0KCi8vIElzSW5SYW5nZSByZXBvcnRzIHdoZXRoZXIgYSBwb3NpdGlvbidzIHRpY2tzIGNvbnRhaW4gdGhlIGN1cnJlbnQgcG9vbCB0aWNrLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElECi8vCi8vIFJldHVybnM6Ci8vICAgLSBpblJhbmdlOiB3aGV0aGVyIHRoZSBwb3NpdGlvbiBpcyBjdXJyZW50bHkgaW4gcmFuZ2UKLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHBvc2l0aW9uSWQgY2Fubm90IGJlIHJlc29sdmVkIG9yIHRoZSBhc3NvY2lhdGVkIHBvb2wgdGljayBjYW5ub3QgYmUgcmVhZApmdW5jIElzSW5SYW5nZShwb3NpdGlvbklkIHVpbnQ2NCkgKGJvb2wsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5Jc0luUmFuZ2UocG9zaXRpb25JZCkKfQoKLy8gR2V0UG9zaXRpb25Ub2tlbkJhbGFuY2VzIGNhbGN1bGF0ZXMgdGhlIGN1cnJlbnQgdG9rZW4wL3Rva2VuMSBiYWxhbmNlcyBmb3IKLy8gYSBwb3NpdGlvbiBmcm9tIGl0cyBsaXF1aWRpdHksIHRpY2sgcmFuZ2UsIGFuZCBwb29sIHByaWNlLgovLwovLyBUaGVzZSBhcmUgZGVyaXZlZCBiYWxhbmNlcywgbm90IHBlcm1hbmVudGx5IHN0b3JlZCB0b2tlbiBhbW91bnRzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElECi8vCi8vIFJldHVybnM6Ci8vICAgLSBiYWxhbmNlMDogY3VycmVudCB0b2tlbjAgYmFsYW5jZQovLyAgIC0gYmFsYW5jZTE6IGN1cnJlbnQgdG9rZW4xIGJhbGFuY2UKLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHBvc2l0aW9uSWQgY2Fubm90IGJlIHJlc29sdmVkCmZ1bmMgR2V0UG9zaXRpb25Ub2tlbkJhbGFuY2VzKHBvc2l0aW9uSWQgdWludDY0KSAoaW50NjQsIGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UG9zaXRpb25Ub2tlbkJhbGFuY2VzKHBvc2l0aW9uSWQpCn0KCi8vIEdldFBvc2l0aW9uVG9rZW4wQmFsYW5jZSByZXR1cm5zIHRoZSB0b2tlbjAgYmFsYW5jZSBhc3NvY2lhdGVkIHdpdGggYSBwb3NpdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRAovLwovLyBSZXR1cm5zOgovLyAgIC0gYmFsYW5jZTogdG9rZW4wIGJhbGFuY2UKLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHBvc2l0aW9uSWQgY2Fubm90IGJlIHJlc29sdmVkCmZ1bmMgR2V0UG9zaXRpb25Ub2tlbjBCYWxhbmNlKHBvc2l0aW9uSWQgdWludDY0KSAoaW50NjQsIGVycm9yKSB7CgliYWxhbmNlMCwgXywgZXJyIDo9IEdldFBvc2l0aW9uVG9rZW5CYWxhbmNlcyhwb3NpdGlvbklkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIGVycgoJfQoKCXJldHVybiBiYWxhbmNlMCwgbmlsCn0KCi8vIEdldFBvc2l0aW9uVG9rZW4xQmFsYW5jZSByZXR1cm5zIHRoZSB0b2tlbjEgYmFsYW5jZSBhc3NvY2lhdGVkIHdpdGggYSBwb3NpdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRAovLwovLyBSZXR1cm5zOgovLyAgIC0gYmFsYW5jZTogdG9rZW4xIGJhbGFuY2UKLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHBvc2l0aW9uSWQgY2Fubm90IGJlIHJlc29sdmVkCmZ1bmMgR2V0UG9zaXRpb25Ub2tlbjFCYWxhbmNlKHBvc2l0aW9uSWQgdWludDY0KSAoaW50NjQsIGVycm9yKSB7CglfLCBiYWxhbmNlMSwgZXJyIDo9IEdldFBvc2l0aW9uVG9rZW5CYWxhbmNlcyhwb3NpdGlvbklkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIGVycgoJfQoKCXJldHVybiBiYWxhbmNlMSwgbmlsCn0KCi8vIEdldFBvc2l0aW9uRmVlR3Jvd3RoSW5zaWRlMExhc3RYMTI4IHJldHVybnMgdGhlIGxhc3QgZmVlLWdyb3d0aCBjaGVja3BvaW50IGluc2lkZSB0aGUgcG9zaXRpb24ncyByYW5nZSBmb3IgdG9rZW4wLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElEIHdob3NlIHRva2VuMCBmZWUtZ3Jvd3RoIGNoZWNrcG9pbnQgaXMgcXVlcmllZAovLwovLyBSZXR1cm5zOgovLyAgIC0gZmVlR3Jvd3RoSW5zaWRlMExhc3RYMTI4OiB0b2tlbjAgZmVlLWdyb3d0aCBjaGVja3BvaW50LCByZXByZXNlbnRlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwb3NpdGlvbklkIGNhbm5vdCBiZSByZXNvbHZlZApmdW5jIEdldFBvc2l0aW9uRmVlR3Jvd3RoSW5zaWRlMExhc3RYMTI4KHBvc2l0aW9uSWQgdWludDY0KSAoc3RyaW5nLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UG9zaXRpb25GZWVHcm93dGhJbnNpZGUwTGFzdFgxMjgocG9zaXRpb25JZCkKfQoKLy8gR2V0UG9zaXRpb25GZWVHcm93dGhJbnNpZGUxTGFzdFgxMjggcmV0dXJucyB0aGUgbGFzdCBmZWUtZ3Jvd3RoIGNoZWNrcG9pbnQgaW5zaWRlIHRoZSBwb3NpdGlvbidzIHJhbmdlIGZvciB0b2tlbjEuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgd2hvc2UgdG9rZW4xIGZlZS1ncm93dGggY2hlY2twb2ludCBpcyBxdWVyaWVkCi8vCi8vIFJldHVybnM6Ci8vICAgLSBmZWVHcm93dGhJbnNpZGUxTGFzdFgxMjg6IHRva2VuMSBmZWUtZ3Jvd3RoIGNoZWNrcG9pbnQsIHJlcHJlc2VudGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHBvc2l0aW9uSWQgY2Fubm90IGJlIHJlc29sdmVkCmZ1bmMgR2V0UG9zaXRpb25GZWVHcm93dGhJbnNpZGUxTGFzdFgxMjgocG9zaXRpb25JZCB1aW50NjQpIChzdHJpbmcsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQb3NpdGlvbkZlZUdyb3d0aEluc2lkZTFMYXN0WDEyOChwb3NpdGlvbklkKQp9CgovLyBHZXRQb3NpdGlvbkZlZUdyb3d0aEluc2lkZUxhc3RYMTI4IHJldHVybnMgdGhlIGxhc3QgZmVlLWdyb3d0aCBjaGVja3BvaW50cyBpbnNpZGUgdGhlIHBvc2l0aW9uJ3MgcmFuZ2UgZm9yIGJvdGggdG9rZW5zLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElEIHdob3NlIGZlZS1ncm93dGggY2hlY2twb2ludHMgYXJlIHF1ZXJpZWQKLy8KLy8gUmV0dXJuczoKLy8gICAtIGZlZUdyb3d0aEluc2lkZTBMYXN0WDEyODogdG9rZW4wIGZlZS1ncm93dGggY2hlY2twb2ludCwgcmVwcmVzZW50ZWQgYXMgYSBkZWNpbWFsIHN0cmluZwovLyAgIC0gZmVlR3Jvd3RoSW5zaWRlMUxhc3RYMTI4OiB0b2tlbjEgZmVlLWdyb3d0aCBjaGVja3BvaW50LCByZXByZXNlbnRlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwb3NpdGlvbklkIGNhbm5vdCBiZSByZXNvbHZlZApmdW5jIEdldFBvc2l0aW9uRmVlR3Jvd3RoSW5zaWRlTGFzdFgxMjgocG9zaXRpb25JZCB1aW50NjQpIChzdHJpbmcsIHN0cmluZywgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFBvc2l0aW9uRmVlR3Jvd3RoSW5zaWRlTGFzdFgxMjgocG9zaXRpb25JZCkKfQoKLy8gR2V0UG9zaXRpb25MaXF1aWRpdHkgcmV0dXJucyB0aGUgc3RvcmVkIGxpcXVpZGl0eSBhbW91bnQgb2YgYSBwb3NpdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSBsaXF1aWRpdHkgaXMgcXVlcmllZAovLwovLyBSZXR1cm5zOgovLyAgIC0gbGlxdWlkaXR5OiBwb3NpdGlvbiBsaXF1aWRpdHksIHJlcHJlc2VudGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHBvc2l0aW9uSWQgY2Fubm90IGJlIHJlc29sdmVkCmZ1bmMgR2V0UG9zaXRpb25MaXF1aWRpdHkocG9zaXRpb25JZCB1aW50NjQpIChzdHJpbmcsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQb3NpdGlvbkxpcXVpZGl0eShwb3NpdGlvbklkKQp9CgovLyBHZXRQb3NpdGlvbk9wZXJhdG9yIHJldHVybnMgdGhlIGFwcHJvdmVkIG9wZXJhdG9yIGFkZHJlc3MgZm9yIGEgcG9zaXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgd2hvc2Ugb3BlcmF0b3IgaXMgcXVlcmllZAovLwovLyBSZXR1cm5zOgovLyAgIC0gb3BlcmF0b3I6IGFwcHJvdmVkIG9wZXJhdG9yIGFkZHJlc3M7IHRoZSB6ZXJvIGFkZHJlc3MgbWVhbnMgbm8gb3BlcmF0b3IgaXMgc2V0Ci8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwb3NpdGlvbklkIGNhbm5vdCBiZSByZXNvbHZlZApmdW5jIEdldFBvc2l0aW9uT3BlcmF0b3IocG9zaXRpb25JZCB1aW50NjQpIChhZGRyZXNzLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UG9zaXRpb25PcGVyYXRvcihwb3NpdGlvbklkKQp9CgovLyBHZXRQb3NpdGlvblBvb2xLZXkgcmV0dXJucyB0aGUgcG9vbCBrZXkgYXNzb2NpYXRlZCB3aXRoIGEgcG9zaXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgd2hvc2UgcG9vbCBhc3NvY2lhdGlvbiBpcyBxdWVyaWVkCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwb29sS2V5OiBjYW5vbmljYWwgcG9vbCBrZXkgdXNlZCBieSB0aGUgcG9zaXRpb24KLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHBvc2l0aW9uSWQgY2Fubm90IGJlIHJlc29sdmVkCmZ1bmMgR2V0UG9zaXRpb25Qb29sS2V5KHBvc2l0aW9uSWQgdWludDY0KSAoc3RyaW5nLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UG9zaXRpb25Qb29sS2V5KHBvc2l0aW9uSWQpCn0KCi8vIEdldFBvc2l0aW9uVGlja0xvd2VyIHJldHVybnMgdGhlIGxvd2VyIHRpY2sgYm91bmRhcnkgb2YgYSBwb3NpdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSBsb3dlciB0aWNrIGlzIHF1ZXJpZWQKLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpY2tMb3dlcjogbG93ZXIgdGljayBib3VuZGFyeSBvZiB0aGUgcG9zaXRpb24ncyBwcmljZSByYW5nZQovLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcG9zaXRpb25JZCBjYW5ub3QgYmUgcmVzb2x2ZWQKZnVuYyBHZXRQb3NpdGlvblRpY2tMb3dlcihwb3NpdGlvbklkIHVpbnQ2NCkgKGludDMyLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UG9zaXRpb25UaWNrTG93ZXIocG9zaXRpb25JZCkKfQoKLy8gR2V0UG9zaXRpb25UaWNrVXBwZXIgcmV0dXJucyB0aGUgdXBwZXIgdGljayBib3VuZGFyeSBvZiBhIHBvc2l0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElEIHdob3NlIHVwcGVyIHRpY2sgaXMgcXVlcmllZAovLwovLyBSZXR1cm5zOgovLyAgIC0gdGlja1VwcGVyOiB1cHBlciB0aWNrIGJvdW5kYXJ5IG9mIHRoZSBwb3NpdGlvbidzIHByaWNlIHJhbmdlCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwb3NpdGlvbklkIGNhbm5vdCBiZSByZXNvbHZlZApmdW5jIEdldFBvc2l0aW9uVGlja1VwcGVyKHBvc2l0aW9uSWQgdWludDY0KSAoaW50MzIsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQb3NpdGlvblRpY2tVcHBlcihwb3NpdGlvbklkKQp9CgovLyBHZXRQb3NpdGlvblRpY2tzIHJldHVybnMgdGhlIGxvd2VyIGFuZCB1cHBlciB0aWNrIGJvdW5kYXJpZXMgb2YgYSBwb3NpdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSB0aWNrIHJhbmdlIGlzIHF1ZXJpZWQKLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpY2tMb3dlcjogbG93ZXIgdGljayBib3VuZGFyeSBvZiB0aGUgcG9zaXRpb24ncyBwcmljZSByYW5nZQovLyAgIC0gdGlja1VwcGVyOiB1cHBlciB0aWNrIGJvdW5kYXJ5IG9mIHRoZSBwb3NpdGlvbidzIHByaWNlIHJhbmdlCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwb3NpdGlvbklkIGNhbm5vdCBiZSByZXNvbHZlZApmdW5jIEdldFBvc2l0aW9uVGlja3MocG9zaXRpb25JZCB1aW50NjQpIChpbnQzMiwgaW50MzIsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQb3NpdGlvblRpY2tzKHBvc2l0aW9uSWQpCn0KCi8vIEdldFBvc2l0aW9uVG9rZW5zT3dlZDAgcmV0dXJucyB0aGUgdG9rZW4wIGFtb3VudCBhY2NydWVkIGFuZCBvd2VkIHRvIGEgcG9zaXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgd2hvc2UgdG9rZW4wIGRlYnQgaXMgcXVlcmllZAovLwovLyBSZXR1cm5zOgovLyAgIC0gdG9rZW5zT3dlZDA6IHRva2VuMCBhbW91bnQgY3VycmVudGx5IG93ZWQgdG8gdGhlIHBvc2l0aW9uCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwb3NpdGlvbklkIGNhbm5vdCBiZSByZXNvbHZlZApmdW5jIEdldFBvc2l0aW9uVG9rZW5zT3dlZDAocG9zaXRpb25JZCB1aW50NjQpIChpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFBvc2l0aW9uVG9rZW5zT3dlZDAocG9zaXRpb25JZCkKfQoKLy8gR2V0UG9zaXRpb25Ub2tlbnNPd2VkMSByZXR1cm5zIHRoZSB0b2tlbjEgYW1vdW50IGFjY3J1ZWQgYW5kIG93ZWQgdG8gYSBwb3NpdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSB0b2tlbjEgZGVidCBpcyBxdWVyaWVkCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0b2tlbnNPd2VkMTogdG9rZW4xIGFtb3VudCBjdXJyZW50bHkgb3dlZCB0byB0aGUgcG9zaXRpb24KLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHBvc2l0aW9uSWQgY2Fubm90IGJlIHJlc29sdmVkCmZ1bmMgR2V0UG9zaXRpb25Ub2tlbnNPd2VkMShwb3NpdGlvbklkIHVpbnQ2NCkgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UG9zaXRpb25Ub2tlbnNPd2VkMShwb3NpdGlvbklkKQp9CgovLyBHZXRQb3NpdGlvblRva2Vuc093ZWQgcmV0dXJucyB0aGUgdG9rZW4wIGFuZCB0b2tlbjEgYW1vdW50cyBhY2NydWVkIGFuZCBvd2VkIHRvIGEgcG9zaXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgd2hvc2UgYWNjcnVlZCB0b2tlbiBkZWJ0IGlzIHF1ZXJpZWQKLy8KLy8gUmV0dXJuczoKLy8gICAtIHRva2Vuc093ZWQwOiB0b2tlbjAgYW1vdW50IGN1cnJlbnRseSBvd2VkIHRvIHRoZSBwb3NpdGlvbgovLyAgIC0gdG9rZW5zT3dlZDE6IHRva2VuMSBhbW91bnQgY3VycmVudGx5IG93ZWQgdG8gdGhlIHBvc2l0aW9uCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwb3NpdGlvbklkIGNhbm5vdCBiZSByZXNvbHZlZApmdW5jIEdldFBvc2l0aW9uVG9rZW5zT3dlZChwb3NpdGlvbklkIHVpbnQ2NCkgKGludDY0LCBpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFBvc2l0aW9uVG9rZW5zT3dlZChwb3NpdGlvbklkKQp9CgovLyBHZXRVbmNsYWltZWRGZWUgcmV0dXJucyB0aGUgdW5jbGFpbWVkIGZlZXMgZm9yIGJvdGggdG9rZW5zIG9mIGEgcG9zaXRpb24gYXMgZGVjaW1hbCBzdHJpbmdzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElEIHdob3NlIHVuY2xhaW1lZCBmZWVzIGFyZSBxdWVyaWVkCi8vCi8vIFJldHVybnM6Ci8vICAgLSBmZWUwOiB1bmNsYWltZWQgdG9rZW4wIGZlZSBhbW91bnQsIHJlcHJlc2VudGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKLy8gICAtIGZlZTE6IHVuY2xhaW1lZCB0b2tlbjEgZmVlIGFtb3VudCwgcmVwcmVzZW50ZWQgYXMgYSBkZWNpbWFsIHN0cmluZwovLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcG9zaXRpb25JZCBvciB0aGUgYXNzb2NpYXRlZCBwb29sIGZlZS1ncm93dGggZGF0YSBjYW5ub3QgYmUgcmVzb2x2ZWQKZnVuYyBHZXRVbmNsYWltZWRGZWUocG9zaXRpb25JZCB1aW50NjQpIChzdHJpbmcsIHN0cmluZywgZXJyb3IpIHsKCWZlZTAsIGZlZTEsIGVyciA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFVuY2xhaW1lZEZlZShwb3NpdGlvbklkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCAiIiwgZXJyCgl9CgoJcmV0dXJuIGZlZTAuVG9TdHJpbmcoKSwgZmVlMS5Ub1N0cmluZygpLCBuaWwKfQoKLy8gR2V0UG9zaXRpb25Pd25lciByZXR1cm5zIHRoZSBvd25lciBhZGRyZXNzIG9mIGEgcG9zaXRpb24gTkZULgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElEIHdob3NlIG93bmVyIGlzIHF1ZXJpZWQKLy8KLy8gUmV0dXJuczoKLy8gICAtIG93bmVyOiBhZGRyZXNzIHRoYXQgb3ducyB0aGUgcG9zaXRpb24gTkZUCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiB0aGUgTkZUIG93bmVyIGxvb2t1cCBmYWlscwpmdW5jIEdldFBvc2l0aW9uT3duZXIocG9zaXRpb25JZCB1aW50NjQpIChhZGRyZXNzLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UG9zaXRpb25Pd25lcihwb3NpdGlvbklkKQp9CholChBnZXR0ZXJfdXRpbHMuZ25vEhFwYWNrYWdlIHBvc2l0aW9uChpCCgtnbm9tb2QudG9tbBIzbW9kdWxlID0gImduby5sYW5kL3IvZ25vc3dhcC9wb3NpdGlvbiIKZ25vID0gIjAuOSIKGtBACgxwb3NpdGlvbi5nbm8Sv0BwYWNrYWdlIHBvc2l0aW9uCgppbXBvcnQgYnB0cmVlICJnbm8ubGFuZC9wL250L2JwdHJlZS92MCIKCi8vIFBvc2l0aW9uIHJlcHJlc2VudHMgYSBsaXF1aWRpdHkgcG9zaXRpb24gaW4gYSBwb29sLgovLyBFYWNoIHBvc2l0aW9uIHRyYWNrcyBsaXF1aWRpdHksIGZlZS1ncm93dGggY2hlY2twb2ludHMsIHRva2VucyBvd2VkLCBhbmQgYQovLyBidXJuZWQgbWFya2VyIGZvciB0aGUgcG9zaXRpb24gTkZULgovLyBBbGwgdWludDI1NiBmaWVsZHMgYXJlIHN0b3JlZCBhcyBkZWNpbWFsIHN0cmluZ3MgdG8gcmVkdWNlIHJlYWxtIG9iamVjdCBvdmVyaGVhZC4KdHlwZSBQb3NpdGlvbiBzdHJ1Y3QgewoJb3BlcmF0b3IgIGFkZHJlc3MgLy8gYWRkcmVzcyB0aGF0IGlzIGFwcHJvdmVkIGZvciBzcGVuZGluZyB0aGlzIHRva2VuCglwb29sS2V5ICAgc3RyaW5nICAvLyBwb29sUGF0aCBvZiB0aGUgcG9vbCB3aGljaCB0aGlzIGhhcyBscCB0b2tlbgoJdGlja0xvd2VyIGludDMyICAgLy8gdGhlIGxvd2VyIHRpY2sgb2YgdGhlIHBvc2l0aW9uLCBib3VuZHMgYXJlIGluY2x1ZGVkCgl0aWNrVXBwZXIgaW50MzIgICAvLyB0aGUgdXBwZXIgdGljayBvZiB0aGUgcG9zaXRpb24KCWxpcXVpZGl0eSBzdHJpbmcgIC8vIGxpcXVpZGl0eSBvZiB0aGUgcG9zaXRpb24KCgkvLyBmZWUgZ3Jvd3RoIG9mIHRoZSBhZ2dyZWdhdGUgcG9zaXRpb24gYXMgb2YgdGhlIGxhc3QgYWN0aW9uIG9uIHRoZSBpbmRpdmlkdWFsIHBvc2l0aW9uCglmZWVHcm93dGhJbnNpZGUwTGFzdFgxMjggc3RyaW5nCglmZWVHcm93dGhJbnNpZGUxTGFzdFgxMjggc3RyaW5nCgoJLy8gaG93IG1hbnkgdW5jb2xsZWN0ZWQgdG9rZW5zIGFyZSBvd2VkIHRvIHRoZSBwb3NpdGlvbiwgYXMgb2YgdGhlIGxhc3QgY29tcHV0YXRpb24KCXRva2Vuc093ZWQwIGludDY0Cgl0b2tlbnNPd2VkMSBpbnQ2NAoKCWJ1cm5lZCBib29sIC8vIGVtcHR5LXBvc2l0aW9uIG1hcmtlcjsgdGhlIE5GVCBpdHNlbGYgaXMgbm90IGJ1cm5lZAp9CgovLyBQb29sS2V5IHJldHVybnMgdGhlIHBvb2wgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIHBvc2l0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcG9vbEtleTogcG9vbCBrZXkgZW5jb2RpbmcgdGhlIHBvc2l0aW9uJ3MgdG9rZW4gcGFpciBhbmQgZmVlIHRpZXIKZnVuYyAocCAqUG9zaXRpb24pIFBvb2xLZXkoKSBzdHJpbmcgewoJcmV0dXJuIHAucG9vbEtleQp9CgovLyBTZXRQb29sS2V5IHN0b3JlcyB0aGUgcG9vbCBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9zaXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sS2V5OiBwb29sIGtleSBlbmNvZGluZyB0aGUgcG9zaXRpb24ncyB0b2tlbiBwYWlyIGFuZCBmZWUgdGllcgpmdW5jIChwICpQb3NpdGlvbikgU2V0UG9vbEtleShwb29sS2V5IHN0cmluZykgewoJcC5wb29sS2V5ID0gcG9vbEtleQp9CgovLyBMaXF1aWRpdHkgcmV0dXJucyB0aGUgcG9zaXRpb24ncyBzdG9yZWQgbGlxdWlkaXR5IGFtb3VudC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGxpcXVpZGl0eTogZGVjaW1hbC1lbmNvZGVkIGxpcXVpZGl0eSBjdXJyZW50bHkgaGVsZCBieSB0aGUgcG9zaXRpb24KZnVuYyAocCAqUG9zaXRpb24pIExpcXVpZGl0eSgpIHN0cmluZyB7CglyZXR1cm4gcC5saXF1aWRpdHkKfQoKLy8gU2V0TGlxdWlkaXR5IHN0b3JlcyB0aGUgcG9zaXRpb24ncyBsaXF1aWRpdHkgYW1vdW50LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gbGlxdWlkaXR5OiBkZWNpbWFsIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBvc2l0aW9uJ3MgbGlxdWlkaXR5CmZ1bmMgKHAgKlBvc2l0aW9uKSBTZXRMaXF1aWRpdHkobGlxdWlkaXR5IHN0cmluZykgewoJcC5saXF1aWRpdHkgPSBsaXF1aWRpdHkKfQoKLy8gVGlja0xvd2VyIHJldHVybnMgdGhlIGxvd2VyIHRpY2sgYm91bmRhcnkgb2YgdGhlIHBvc2l0aW9uJ3MgcmFuZ2UuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aWNrTG93ZXI6IGxvd2VyIHRpY2sgYm91bmRhcnksIGluY2x1c2l2ZSBpbiByYW5nZSBjaGVja3MKZnVuYyAocCAqUG9zaXRpb24pIFRpY2tMb3dlcigpIGludDMyIHsKCXJldHVybiBwLnRpY2tMb3dlcgp9CgovLyBTZXRUaWNrTG93ZXIgc3RvcmVzIHRoZSBsb3dlciB0aWNrIGJvdW5kYXJ5IG9mIHRoZSBwb3NpdGlvbidzIHJhbmdlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGlja0xvd2VyOiBsb3dlciB0aWNrIGJvdW5kYXJ5IHVzZWQgZm9yIHRoZSBwb3NpdGlvbidzIHJhbmdlCmZ1bmMgKHAgKlBvc2l0aW9uKSBTZXRUaWNrTG93ZXIodGlja0xvd2VyIGludDMyKSB7CglwLnRpY2tMb3dlciA9IHRpY2tMb3dlcgp9CgovLyBUaWNrVXBwZXIgcmV0dXJucyB0aGUgdXBwZXIgdGljayBib3VuZGFyeSBvZiB0aGUgcG9zaXRpb24ncyByYW5nZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpY2tVcHBlcjogdXBwZXIgdGljayBib3VuZGFyeSwgdXNlZCBhcyB0aGUgZXhjbHVzaXZlIGVuZCBpbiByYW5nZSBjaGVja3MKZnVuYyAocCAqUG9zaXRpb24pIFRpY2tVcHBlcigpIGludDMyIHsKCXJldHVybiBwLnRpY2tVcHBlcgp9CgovLyBTZXRUaWNrVXBwZXIgc3RvcmVzIHRoZSB1cHBlciB0aWNrIGJvdW5kYXJ5IG9mIHRoZSBwb3NpdGlvbidzIHJhbmdlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGlja1VwcGVyOiB1cHBlciB0aWNrIGJvdW5kYXJ5IHVzZWQgZm9yIHRoZSBwb3NpdGlvbidzIHJhbmdlCmZ1bmMgKHAgKlBvc2l0aW9uKSBTZXRUaWNrVXBwZXIodGlja1VwcGVyIGludDMyKSB7CglwLnRpY2tVcHBlciA9IHRpY2tVcHBlcgp9CgovLyBUb2tlbnNPd2VkMCByZXR1cm5zIHRoZSBzdG9yZWQgYW1vdW50IG9mIHRva2VuMCBvd2VkIHRvIHRoZSBwb3NpdGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRva2Vuc093ZWQwOiBhY2NydWVkIHRva2VuMCBhbW91bnQgYXdhaXRpbmcgY29sbGVjdGlvbiwgaW4gdG9rZW4gdW5pdHMKZnVuYyAocCAqUG9zaXRpb24pIFRva2Vuc093ZWQwKCkgaW50NjQgewoJcmV0dXJuIHAudG9rZW5zT3dlZDAKfQoKLy8gU2V0VG9rZW5zT3dlZDAgc3RvcmVzIHRoZSBhbW91bnQgb2YgdG9rZW4wIG93ZWQgdG8gdGhlIHBvc2l0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW5zT3dlZDA6IGFjY3J1ZWQgdG9rZW4wIGFtb3VudCBhd2FpdGluZyBjb2xsZWN0aW9uLCBpbiB0b2tlbiB1bml0cwpmdW5jIChwICpQb3NpdGlvbikgU2V0VG9rZW5zT3dlZDAodG9rZW5zT3dlZDAgaW50NjQpIHsKCXAudG9rZW5zT3dlZDAgPSB0b2tlbnNPd2VkMAp9CgovLyBUb2tlbnNPd2VkMSByZXR1cm5zIHRoZSBzdG9yZWQgYW1vdW50IG9mIHRva2VuMSBvd2VkIHRvIHRoZSBwb3NpdGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRva2Vuc093ZWQxOiBhY2NydWVkIHRva2VuMSBhbW91bnQgYXdhaXRpbmcgY29sbGVjdGlvbiwgaW4gdG9rZW4gdW5pdHMKZnVuYyAocCAqUG9zaXRpb24pIFRva2Vuc093ZWQxKCkgaW50NjQgewoJcmV0dXJuIHAudG9rZW5zT3dlZDEKfQoKLy8gU2V0VG9rZW5zT3dlZDEgc3RvcmVzIHRoZSBhbW91bnQgb2YgdG9rZW4xIG93ZWQgdG8gdGhlIHBvc2l0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW5zT3dlZDE6IGFjY3J1ZWQgdG9rZW4xIGFtb3VudCBhd2FpdGluZyBjb2xsZWN0aW9uLCBpbiB0b2tlbiB1bml0cwpmdW5jIChwICpQb3NpdGlvbikgU2V0VG9rZW5zT3dlZDEodG9rZW5zT3dlZDEgaW50NjQpIHsKCXAudG9rZW5zT3dlZDEgPSB0b2tlbnNPd2VkMQp9CgovLyBGZWVHcm93dGhJbnNpZGUwTGFzdFgxMjggcmV0dXJucyB0aGUgdG9rZW4wIGZlZS1ncm93dGggY2hlY2twb2ludC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGZlZUdyb3d0aEluc2lkZTBMYXN0WDEyODogZGVjaW1hbC1lbmNvZGVkIFExMjggZmVlIGdyb3d0aCBpbnNpZGUgdGhlIHBvc2l0aW9uJ3MgcmFuZ2UgYXQgaXRzIGxhc3QgdXBkYXRlCmZ1bmMgKHAgKlBvc2l0aW9uKSBGZWVHcm93dGhJbnNpZGUwTGFzdFgxMjgoKSBzdHJpbmcgewoJcmV0dXJuIHAuZmVlR3Jvd3RoSW5zaWRlMExhc3RYMTI4Cn0KCi8vIFNldEZlZUdyb3d0aEluc2lkZTBMYXN0WDEyOCBzdG9yZXMgdGhlIHRva2VuMCBmZWUtZ3Jvd3RoIGNoZWNrcG9pbnQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBmZWVHcm93dGhJbnNpZGUwTGFzdFgxMjg6IGRlY2ltYWwtZW5jb2RlZCBRMTI4IGZlZSBncm93dGggaW5zaWRlIHRoZSBwb3NpdGlvbidzIHJhbmdlCmZ1bmMgKHAgKlBvc2l0aW9uKSBTZXRGZWVHcm93dGhJbnNpZGUwTGFzdFgxMjgoZmVlR3Jvd3RoSW5zaWRlMExhc3RYMTI4IHN0cmluZykgewoJcC5mZWVHcm93dGhJbnNpZGUwTGFzdFgxMjggPSBmZWVHcm93dGhJbnNpZGUwTGFzdFgxMjgKfQoKLy8gRmVlR3Jvd3RoSW5zaWRlMUxhc3RYMTI4IHJldHVybnMgdGhlIHRva2VuMSBmZWUtZ3Jvd3RoIGNoZWNrcG9pbnQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBmZWVHcm93dGhJbnNpZGUxTGFzdFgxMjg6IGRlY2ltYWwtZW5jb2RlZCBRMTI4IGZlZSBncm93dGggaW5zaWRlIHRoZSBwb3NpdGlvbidzIHJhbmdlIGF0IGl0cyBsYXN0IHVwZGF0ZQpmdW5jIChwICpQb3NpdGlvbikgRmVlR3Jvd3RoSW5zaWRlMUxhc3RYMTI4KCkgc3RyaW5nIHsKCXJldHVybiBwLmZlZUdyb3d0aEluc2lkZTFMYXN0WDEyOAp9CgovLyBTZXRGZWVHcm93dGhJbnNpZGUxTGFzdFgxMjggc3RvcmVzIHRoZSB0b2tlbjEgZmVlLWdyb3d0aCBjaGVja3BvaW50LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZmVlR3Jvd3RoSW5zaWRlMUxhc3RYMTI4OiBkZWNpbWFsLWVuY29kZWQgUTEyOCBmZWUgZ3Jvd3RoIGluc2lkZSB0aGUgcG9zaXRpb24ncyByYW5nZQpmdW5jIChwICpQb3NpdGlvbikgU2V0RmVlR3Jvd3RoSW5zaWRlMUxhc3RYMTI4KGZlZUdyb3d0aEluc2lkZTFMYXN0WDEyOCBzdHJpbmcpIHsKCXAuZmVlR3Jvd3RoSW5zaWRlMUxhc3RYMTI4ID0gZmVlR3Jvd3RoSW5zaWRlMUxhc3RYMTI4Cn0KCi8vIEJ1cm5lZCByZXBvcnRzIHRoZSBwb3NpdGlvbidzIGVtcHR5LXBvc2l0aW9uIG1hcmtlci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJ1cm5lZDogdHJ1ZSB3aGVuIHRoZSBwb3NpdGlvbiBpcyBtYXJrZWQgZW1wdHkgYWZ0ZXIgaXRzIGJhbGFuY2VzIGNsZWFyOyB0aGUgcG9zaXRpb24gTkZUIGl0c2VsZiBpcyBub3QgYnVybmVkCmZ1bmMgKHAgKlBvc2l0aW9uKSBCdXJuZWQoKSBib29sIHsKCXJldHVybiBwLmJ1cm5lZAp9CgovLyBTZXRCdXJuZWQgc3RvcmVzIHRoZSBwb3NpdGlvbidzIGVtcHR5LXBvc2l0aW9uIG1hcmtlci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGJ1cm5lZDogbWFya2VyIGluZGljYXRpbmcgd2hldGhlciB0aGUgcG9zaXRpb24gaXMgY29uc2lkZXJlZCBlbXB0eQpmdW5jIChwICpQb3NpdGlvbikgU2V0QnVybmVkKGJ1cm5lZCBib29sKSB7CglwLmJ1cm5lZCA9IGJ1cm5lZAp9CgovLyBPcGVyYXRvciByZXR1cm5zIHRoZSBhZGRyZXNzIGFwcHJvdmVkIHRvIG9wZXJhdGUgb24gdGhlIHBvc2l0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gb3BlcmF0b3I6IGFwcHJvdmVkIG9wZXJhdG9yIGFkZHJlc3MsIG9yIHRoZSBlbXB0eSBhZGRyZXNzIHdoZW4gbm8gb3BlcmF0b3IgaXMgc2V0CmZ1bmMgKHAgKlBvc2l0aW9uKSBPcGVyYXRvcigpIGFkZHJlc3MgewoJcmV0dXJuIHAub3BlcmF0b3IKfQoKLy8gU2V0T3BlcmF0b3Igc3RvcmVzIHRoZSBhZGRyZXNzIGFwcHJvdmVkIHRvIG9wZXJhdGUgb24gdGhlIHBvc2l0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gb3BlcmF0b3I6IGFwcHJvdmVkIG9wZXJhdG9yIGFkZHJlc3M7IHRoZSBlbXB0eSBhZGRyZXNzIHJlbW92ZXMgdGhlIG9wZXJhdG9yCmZ1bmMgKHAgKlBvc2l0aW9uKSBTZXRPcGVyYXRvcihvcGVyYXRvciBhZGRyZXNzKSB7CglwLm9wZXJhdG9yID0gb3BlcmF0b3IKfQoKLy8gSXNDbGVhciByZXBvcnRzIHdoZXRoZXIgbGlxdWlkaXR5IGFuZCB0b2tlbnMgb3dlZCBhcmUgYWxsIHplcm87IGl0IGRvZXMgbm90Ci8vIGRlc2NyaWJlIHRoZSBidXJuZWQgbWFya2VyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gY2xlYXI6IHRydWUgd2hlbiBzdG9yZWQgbGlxdWlkaXR5IGFuZCBib3RoIHRva2VuLW93ZWQgY291bnRlcnMgYXJlIHplcm8sIHJlZ2FyZGxlc3Mgb2YgdGhlIGJ1cm5lZCBtYXJrZXIKZnVuYyAocCAqUG9zaXRpb24pIElzQ2xlYXIoKSBib29sIHsKCXJldHVybiBpc1plcm9TdHIocC5saXF1aWRpdHkpICYmIHAudG9rZW5zT3dlZDAgPT0gMCAmJiBwLnRva2Vuc093ZWQxID09IDAKfQoKZnVuYyBpc1plcm9TdHIocyBzdHJpbmcpIGJvb2wgewoJcmV0dXJuIHMgPT0gIiIgfHwgcyA9PSAiMCIKfQoKLy8gTmV3UG9zaXRpb24gY29uc3RydWN0cyBhIHBvc2l0aW9uIGZyb20gaXRzIHBlcnNpc3RlZCBwb29sLCByYW5nZSwgbGlxdWlkaXR5LAovLyBmZWUtZ3Jvd3RoLCBvd2VkLXRva2VuLCBtYXJrZXIsIGFuZCBvcGVyYXRvciB2YWx1ZXMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sS2V5OiBwb29sIGtleSBlbmNvZGluZyB0aGUgcG9zaXRpb24ncyB0b2tlbiBwYWlyIGFuZCBmZWUgdGllcgovLyAgIC0gdGlja0xvd2VyOiBsb3dlciB0aWNrIGJvdW5kYXJ5IG9mIHRoZSBwb3NpdGlvbidzIHJhbmdlCi8vICAgLSB0aWNrVXBwZXI6IHVwcGVyIHRpY2sgYm91bmRhcnkgb2YgdGhlIHBvc2l0aW9uJ3MgcmFuZ2UKLy8gICAtIGxpcXVpZGl0eTogZGVjaW1hbCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwb3NpdGlvbidzIGxpcXVpZGl0eQovLyAgIC0gZmVlR3Jvd3RoSW5zaWRlMExhc3RYMTI4OiBkZWNpbWFsLWVuY29kZWQgUTEyOCB0b2tlbjAgZmVlLWdyb3d0aCBjaGVja3BvaW50Ci8vICAgLSBmZWVHcm93dGhJbnNpZGUxTGFzdFgxMjg6IGRlY2ltYWwtZW5jb2RlZCBRMTI4IHRva2VuMSBmZWUtZ3Jvd3RoIGNoZWNrcG9pbnQKLy8gICAtIHRva2Vuc093ZWQwOiBhY2NydWVkIHRva2VuMCBhbW91bnQgYXdhaXRpbmcgY29sbGVjdGlvbiwgaW4gdG9rZW4gdW5pdHMKLy8gICAtIHRva2Vuc093ZWQxOiBhY2NydWVkIHRva2VuMSBhbW91bnQgYXdhaXRpbmcgY29sbGVjdGlvbiwgaW4gdG9rZW4gdW5pdHMKLy8gICAtIGJ1cm5lZDogZW1wdHktcG9zaXRpb24gbWFya2VyIHRvIHN0b3JlCi8vICAgLSBvcGVyYXRvcjogYXBwcm92ZWQgb3BlcmF0b3IgYWRkcmVzczsgdGhlIGVtcHR5IGFkZHJlc3MgbWVhbnMgbm8gb3BlcmF0b3IKLy8KLy8gUmV0dXJuczoKLy8gICAtIHBvc2l0aW9uOiBwb2ludGVyIHRvIGEgcG9zaXRpb24gaW5pdGlhbGl6ZWQgd2l0aCBhbGwgc3VwcGxpZWQgdmFsdWVzCmZ1bmMgTmV3UG9zaXRpb24oCglwb29sS2V5IHN0cmluZywKCXRpY2tMb3dlciBpbnQzMiwKCXRpY2tVcHBlciBpbnQzMiwKCWxpcXVpZGl0eSBzdHJpbmcsCglmZWVHcm93dGhJbnNpZGUwTGFzdFgxMjgsIGZlZUdyb3d0aEluc2lkZTFMYXN0WDEyOCBzdHJpbmcsCgl0b2tlbnNPd2VkMCwgdG9rZW5zT3dlZDEgaW50NjQsCglidXJuZWQgYm9vbCwKCW9wZXJhdG9yIGFkZHJlc3MsCikgKlBvc2l0aW9uIHsKCXJldHVybiAmUG9zaXRpb257CgkJcG9vbEtleTogICAgICAgICAgICAgICAgICBwb29sS2V5LAoJCXRpY2tMb3dlcjogICAgICAgICAgICAgICAgdGlja0xvd2VyLAoJCXRpY2tVcHBlcjogICAgICAgICAgICAgICAgdGlja1VwcGVyLAoJCWxpcXVpZGl0eTogICAgICAgICAgICAgICAgbGlxdWlkaXR5LAoJCWZlZUdyb3d0aEluc2lkZTBMYXN0WDEyODogZmVlR3Jvd3RoSW5zaWRlMExhc3RYMTI4LAoJCWZlZUdyb3d0aEluc2lkZTFMYXN0WDEyODogZmVlR3Jvd3RoSW5zaWRlMUxhc3RYMTI4LAoJCXRva2Vuc093ZWQwOiAgICAgICAgICAgICAgdG9rZW5zT3dlZDAsCgkJdG9rZW5zT3dlZDE6ICAgICAgICAgICAgICB0b2tlbnNPd2VkMSwKCQlidXJuZWQ6ICAgICAgICAgICAgICAgICAgIGJ1cm5lZCwKCQlvcGVyYXRvcjogICAgICAgICAgICAgICAgIG9wZXJhdG9yLAoJfQp9CgovLyBOZXdQb3NpdGlvbnNUcmVlIGFsbG9jYXRlcyBhbiBlbXB0eSBCUC10cmVlIGZvciBwb3NpdGlvbiBlbnRyaWVzIHVuZGVyIHRoZQovLyBwb3NpdGlvbiByZWFsbSBjb250ZXh0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gcG9zaXRpb25zVHJlZTogZW1wdHkgcG9zaXRpb24gQlAtdHJlZSBhbGxvY2F0ZWQgd2l0aCBmYW5vdXQgMTYKZnVuYyBOZXdQb3NpdGlvbnNUcmVlKCkgKmJwdHJlZS5CUFRyZWUgewoJcmV0dXJuIGJwdHJlZS5OZXdCUFRyZWVOKDE2KQp9ChrcPAoJcHJveHkuZ25vEs48cGFja2FnZSBwb3NpdGlvbgoKLy8gTWludCBjcmVhdGVzIGEgbmV3IGxpcXVpZGl0eSBwb3NpdGlvbiBORlQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IGN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbQovLyAgIC0gdG9rZW4wOiBwYXRoIG9mIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgcG9vbAovLyAgIC0gdG9rZW4xOiBwYXRoIG9mIHRoZSBzZWNvbmQgdG9rZW4gaW4gdGhlIHBvb2wKLy8gICAtIGZlZTogcG9vbCBmZWUgdGllciB1c2VkIHRvIGlkZW50aWZ5IHRoZSBwb29sCi8vICAgLSB0aWNrTG93ZXI6IGxvd2VyIHRpY2sgYm91bmRhcnkgb2YgdGhlIHBvc2l0aW9uJ3MgcHJpY2UgcmFuZ2UKLy8gICAtIHRpY2tVcHBlcjogdXBwZXIgdGljayBib3VuZGFyeSBvZiB0aGUgcG9zaXRpb24ncyBwcmljZSByYW5nZQovLyAgIC0gYW1vdW50MERlc2lyZWQ6IGRlc2lyZWQgYW1vdW50IG9mIHRva2VuMCB0byBwcm92aWRlCi8vICAgLSBhbW91bnQxRGVzaXJlZDogZGVzaXJlZCBhbW91bnQgb2YgdG9rZW4xIHRvIHByb3ZpZGUKLy8gICAtIGFtb3VudDBNaW46IG1pbmltdW0gYWNjZXB0YWJsZSBhbW91bnQgb2YgdG9rZW4wIGFmdGVyIHByaWNlL3NsaXBwYWdlIGNhbGN1bGF0aW9uCi8vICAgLSBhbW91bnQxTWluOiBtaW5pbXVtIGFjY2VwdGFibGUgYW1vdW50IG9mIHRva2VuMSBhZnRlciBwcmljZS9zbGlwcGFnZSBjYWxjdWxhdGlvbgovLyAgIC0gZGVhZGxpbmU6IHRyYW5zYWN0aW9uIGV4cGlyYXRpb24gdGltZXN0YW1wCi8vICAgLSBtaW50VG86IHJlY2lwaWVudCBhZGRyZXNzIG9mIHRoZSBwb3NpdGlvbiBORlQKLy8gICAtIHJlZmVycmVyOiByZWZlcnJlciBpZGVudGlmaWVyIHVzZWQgZm9yIHJld2FyZCB0cmFja2luZwovLwovLyBSZXR1cm5zOgovLyAgIC0gcG9zaXRpb25JZDogbmV3bHkgbWludGVkIHBvc2l0aW9uIE5GVCB0b2tlbiBJRAovLyAgIC0gbGlxdWlkaXR5OiBsaXF1aWRpdHkgbWludGVkIGludG8gdGhlIHBvc2l0aW9uLCByZXByZXNlbnRlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCi8vICAgLSBhbW91bnQwOiBhY3R1YWwgYW1vdW50IG9mIHRva2VuMCBhZGRlZCB0byB0aGUgcG9zaXRpb24sIHJlcHJlc2VudGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKLy8gICAtIGFtb3VudDE6IGFjdHVhbCBhbW91bnQgb2YgdG9rZW4xIGFkZGVkIHRvIHRoZSBwb3NpdGlvbiwgcmVwcmVzZW50ZWQgYXMgYSBkZWNpbWFsIHN0cmluZwovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBQb3NpdGlvbiBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBNaW50KAoJY3VyIHJlYWxtLAoJdG9rZW4wIHN0cmluZywKCXRva2VuMSBzdHJpbmcsCglmZWUgdWludDMyLAoJdGlja0xvd2VyIGludDMyLAoJdGlja1VwcGVyIGludDMyLAoJYW1vdW50MERlc2lyZWQgc3RyaW5nLAoJYW1vdW50MURlc2lyZWQgc3RyaW5nLAoJYW1vdW50ME1pbiBzdHJpbmcsCglhbW91bnQxTWluIHN0cmluZywKCWRlYWRsaW5lIGludDY0LAoJbWludFRvIGFkZHJlc3MsCglyZWZlcnJlciBzdHJpbmcsCikgKHVpbnQ2NCwgc3RyaW5nLCBzdHJpbmcsIHN0cmluZykgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuTWludCgwLCBjdXIsIHRva2VuMCwgdG9rZW4xLCBmZWUsIHRpY2tMb3dlciwgdGlja1VwcGVyLCBhbW91bnQwRGVzaXJlZCwgYW1vdW50MURlc2lyZWQsIGFtb3VudDBNaW4sIGFtb3VudDFNaW4sIGRlYWRsaW5lLCBtaW50VG8sIHJlZmVycmVyKQp9CgovLyBJbmNyZWFzZUxpcXVpZGl0eSBhZGRzIGxpcXVpZGl0eSB0byBhbiBleGlzdGluZyBwb3NpdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogY3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtCi8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgdG8gaW5jcmVhc2UKLy8gICAtIGFtb3VudDBEZXNpcmVkU3RyOiBkZXNpcmVkIHRva2VuMCBhbW91bnQsIHJlcHJlc2VudGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKLy8gICAtIGFtb3VudDFEZXNpcmVkU3RyOiBkZXNpcmVkIHRva2VuMSBhbW91bnQsIHJlcHJlc2VudGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKLy8gICAtIGFtb3VudDBNaW5TdHI6IG1pbmltdW0gYWNjZXB0YWJsZSB0b2tlbjAgYW1vdW50IGZvciBzbGlwcGFnZSBwcm90ZWN0aW9uCi8vICAgLSBhbW91bnQxTWluU3RyOiBtaW5pbXVtIGFjY2VwdGFibGUgdG9rZW4xIGFtb3VudCBmb3Igc2xpcHBhZ2UgcHJvdGVjdGlvbgovLyAgIC0gZGVhZGxpbmU6IHRyYW5zYWN0aW9uIGV4cGlyYXRpb24gdGltZXN0YW1wCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgdGhhdCByZWNlaXZlZCB0aGUgbGlxdWlkaXR5Ci8vICAgLSBsaXF1aWRpdHk6IGxpcXVpZGl0eSBhbW91bnQgYWRkZWQgdG8gdGhlIHBvc2l0aW9uICh0aGUgZGVsdGEpLCByZXByZXNlbnRlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCi8vICAgLSBhbW91bnQwOiBhY3R1YWwgdG9rZW4wIGFtb3VudCBhZGRlZCwgcmVwcmVzZW50ZWQgYXMgYSBkZWNpbWFsIHN0cmluZwovLyAgIC0gYW1vdW50MTogYWN0dWFsIHRva2VuMSBhbW91bnQgYWRkZWQsIHJlcHJlc2VudGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKLy8gICAtIHBvb2xLZXk6IGNhbm9uaWNhbCBwb29sIGtleSBmb3IgdGhlIHBvc2l0aW9uCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFBvc2l0aW9uIGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIEluY3JlYXNlTGlxdWlkaXR5KAoJY3VyIHJlYWxtLAoJcG9zaXRpb25JZCB1aW50NjQsCglhbW91bnQwRGVzaXJlZFN0ciBzdHJpbmcsCglhbW91bnQxRGVzaXJlZFN0ciBzdHJpbmcsCglhbW91bnQwTWluU3RyIHN0cmluZywKCWFtb3VudDFNaW5TdHIgc3RyaW5nLAoJZGVhZGxpbmUgaW50NjQsCikgKHVpbnQ2NCwgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgc3RyaW5nKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5JbmNyZWFzZUxpcXVpZGl0eSgwLCBjdXIsIHBvc2l0aW9uSWQsIGFtb3VudDBEZXNpcmVkU3RyLCBhbW91bnQxRGVzaXJlZFN0ciwgYW1vdW50ME1pblN0ciwgYW1vdW50MU1pblN0ciwgZGVhZGxpbmUpCn0KCi8vIERlY3JlYXNlTGlxdWlkaXR5IHJlbW92ZXMgbGlxdWlkaXR5IGZyb20gYSBwb3NpdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogY3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtCi8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgdG8gZGVjcmVhc2UKLy8gICAtIGxpcXVpZGl0eVN0cjogbGlxdWlkaXR5IGFtb3VudCB0byByZW1vdmUsIHJlcHJlc2VudGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKLy8gICAtIGFtb3VudDBNaW5TdHI6IG1pbmltdW0gYWNjZXB0YWJsZSB0b2tlbjAgYW1vdW50IGZvciBzbGlwcGFnZSBwcm90ZWN0aW9uCi8vICAgLSBhbW91bnQxTWluU3RyOiBtaW5pbXVtIGFjY2VwdGFibGUgdG9rZW4xIGFtb3VudCBmb3Igc2xpcHBhZ2UgcHJvdGVjdGlvbgovLyAgIC0gZGVhZGxpbmU6IHRyYW5zYWN0aW9uIGV4cGlyYXRpb24gdGltZXN0YW1wCi8vCi8vIFRoZSBhY2NydWVkIHN3YXAgZmVlcyBhcmUgY29sbGVjdGVkIGZpcnN0LCBzbyB0aGUgcmV0dXJuZWQgZmVlIGFtb3VudHMgYXJlCi8vIG5ldCBvZiB0aGUgd2l0aGRyYXdhbCBmZWUgd2hpbGUgdGhlIHJldHVybmVkIHByaW5jaXBhbCBpcyBub3Qgc3ViamVjdCB0byBpdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB0aGF0IGhhZCBsaXF1aWRpdHkgcmVtb3ZlZAovLyAgIC0gbGlxdWlkaXR5OiByZW1vdmVkIGxpcXVpZGl0eSBhbW91bnQsIHJlcHJlc2VudGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKLy8gICAtIGZlZTA6IHRva2VuMCBmZWVzIGNvbGxlY3RlZCwgbmV0IG9mIHRoZSB3aXRoZHJhd2FsIGZlZQovLyAgIC0gZmVlMTogdG9rZW4xIGZlZXMgY29sbGVjdGVkLCBuZXQgb2YgdGhlIHdpdGhkcmF3YWwgZmVlCi8vICAgLSBhbW91bnQwOiBwcmluY2lwYWwgYW1vdW50IG9mIHRva2VuMCByZXR1cm5lZCB0byB0aGUgY2FsbGVyCi8vICAgLSBhbW91bnQxOiBwcmluY2lwYWwgYW1vdW50IG9mIHRva2VuMSByZXR1cm5lZCB0byB0aGUgY2FsbGVyCi8vICAgLSBwb29sS2V5OiBjYW5vbmljYWwgcG9vbCBrZXkgZm9yIHRoZSBwb3NpdGlvbgovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBXaXRoZHJhdyBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBEZWNyZWFzZUxpcXVpZGl0eSgKCWN1ciByZWFsbSwKCXBvc2l0aW9uSWQgdWludDY0LAoJbGlxdWlkaXR5U3RyIHN0cmluZywKCWFtb3VudDBNaW5TdHIgc3RyaW5nLAoJYW1vdW50MU1pblN0ciBzdHJpbmcsCglkZWFkbGluZSBpbnQ2NCwKKSAodWludDY0LCBzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgc3RyaW5nKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5EZWNyZWFzZUxpcXVpZGl0eSgwLCBjdXIsIHBvc2l0aW9uSWQsIGxpcXVpZGl0eVN0ciwgYW1vdW50ME1pblN0ciwgYW1vdW50MU1pblN0ciwgZGVhZGxpbmUpCn0KCi8vIFJlcG9zaXRpb24gY2hhbmdlcyB0aGUgdGljayByYW5nZSBvZiBhIHBvc2l0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0KLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB0byByZXBvc2l0aW9uCi8vICAgLSB0aWNrTG93ZXI6IG5ldyBsb3dlciB0aWNrIGJvdW5kYXJ5IG9mIHRoZSBwb3NpdGlvbidzIHByaWNlIHJhbmdlCi8vICAgLSB0aWNrVXBwZXI6IG5ldyB1cHBlciB0aWNrIGJvdW5kYXJ5IG9mIHRoZSBwb3NpdGlvbidzIHByaWNlIHJhbmdlCi8vICAgLSBhbW91bnQwRGVzaXJlZFN0cjogZGVzaXJlZCB0b2tlbjAgYW1vdW50IGZvciB0aGUgbmV3IHJhbmdlLCByZXByZXNlbnRlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCi8vICAgLSBhbW91bnQxRGVzaXJlZFN0cjogZGVzaXJlZCB0b2tlbjEgYW1vdW50IGZvciB0aGUgbmV3IHJhbmdlLCByZXByZXNlbnRlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCi8vICAgLSBhbW91bnQwTWluU3RyOiBtaW5pbXVtIGFjY2VwdGFibGUgdG9rZW4wIGFtb3VudCBmb3Igc2xpcHBhZ2UgcHJvdGVjdGlvbgovLyAgIC0gYW1vdW50MU1pblN0cjogbWluaW11bSBhY2NlcHRhYmxlIHRva2VuMSBhbW91bnQgZm9yIHNsaXBwYWdlIHByb3RlY3Rpb24KLy8gICAtIGRlYWRsaW5lOiB0cmFuc2FjdGlvbiBleHBpcmF0aW9uIHRpbWVzdGFtcAovLwovLyBSZXR1cm5zOgovLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElEIHRoYXQgd2FzIHJlcG9zaXRpb25lZAovLyAgIC0gbGlxdWlkaXR5OiBuZXcgbGlxdWlkaXR5IGFtb3VudCwgcmVwcmVzZW50ZWQgYXMgYSBkZWNpbWFsIHN0cmluZwovLyAgIC0gdGlja0xvd2VyOiBuZXcgbG93ZXIgdGljayBib3VuZGFyeQovLyAgIC0gdGlja1VwcGVyOiBuZXcgdXBwZXIgdGljayBib3VuZGFyeQovLyAgIC0gYW1vdW50MDogYWN0dWFsIHRva2VuMCBhbW91bnQgYWRkZWQgdG8gdGhlIG5ldyByYW5nZSwgcmVwcmVzZW50ZWQgYXMgYSBkZWNpbWFsIHN0cmluZwovLyAgIC0gYW1vdW50MTogYWN0dWFsIHRva2VuMSBhbW91bnQgYWRkZWQgdG8gdGhlIG5ldyByYW5nZSwgcmVwcmVzZW50ZWQgYXMgYSBkZWNpbWFsIHN0cmluZwovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBQb3NpdGlvbiBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBSZXBvc2l0aW9uKAoJY3VyIHJlYWxtLAoJcG9zaXRpb25JZCB1aW50NjQsCgl0aWNrTG93ZXIgaW50MzIsCgl0aWNrVXBwZXIgaW50MzIsCglhbW91bnQwRGVzaXJlZFN0ciBzdHJpbmcsCglhbW91bnQxRGVzaXJlZFN0ciBzdHJpbmcsCglhbW91bnQwTWluU3RyIHN0cmluZywKCWFtb3VudDFNaW5TdHIgc3RyaW5nLAoJZGVhZGxpbmUgaW50NjQsCikgKHVpbnQ2NCwgc3RyaW5nLCBpbnQzMiwgaW50MzIsIHN0cmluZywgc3RyaW5nKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5SZXBvc2l0aW9uKDAsIGN1ciwgcG9zaXRpb25JZCwgdGlja0xvd2VyLCB0aWNrVXBwZXIsIGFtb3VudDBEZXNpcmVkU3RyLCBhbW91bnQxRGVzaXJlZFN0ciwgYW1vdW50ME1pblN0ciwgYW1vdW50MU1pblN0ciwgZGVhZGxpbmUpCn0KCi8vIENvbGxlY3RGZWUgY29sbGVjdHMgYWNjdW11bGF0ZWQgZmVlcyBmcm9tIGEgcG9zaXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IGN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbQovLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElEIHdob3NlIGZlZXMgYXJlIGNvbGxlY3RlZAovLwovLyBSZXR1cm5zOgovLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElEIHdob3NlIGZlZXMgd2VyZSBjb2xsZWN0ZWQKLy8gICAtIHRva2Vuc0NvbGxlY3RlZDA6IHRva2VuMCBmZWVzIHBhaWQgb3V0IHRvIHRoZSBjYWxsZXIsIG5ldCBvZiB0aGUgd2l0aGRyYXdhbCBmZWUKLy8gICAtIHRva2Vuc0NvbGxlY3RlZDE6IHRva2VuMSBmZWVzIHBhaWQgb3V0IHRvIHRoZSBjYWxsZXIsIG5ldCBvZiB0aGUgd2l0aGRyYXdhbCBmZWUKLy8gICAtIHBvb2xLZXk6IGNhbm9uaWNhbCBwb29sIGtleSBmb3IgdGhlIHBvc2l0aW9uCi8vICAgLSB0b3RhbEFtb3VudDA6IHRva2VuMCBmZWVzIGNvbGxlY3RlZCBiZWZvcmUgdGhlIHdpdGhkcmF3YWwgZmVlCi8vICAgLSB0b3RhbEFtb3VudDE6IHRva2VuMSBmZWVzIGNvbGxlY3RlZCBiZWZvcmUgdGhlIHdpdGhkcmF3YWwgZmVlCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFdpdGhkcmF3IGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIENvbGxlY3RGZWUoCgljdXIgcmVhbG0sCglwb3NpdGlvbklkIHVpbnQ2NCwKKSAodWludDY0LCBzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZykgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuQ29sbGVjdEZlZSgwLCBjdXIsIHBvc2l0aW9uSWQpCn0KCi8vIFNldFBvc2l0aW9uT3BlcmF0b3Igc2V0cyBhbiBvcGVyYXRvciBmb3IgYSBwb3NpdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogY3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtCi8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgd2hvc2Ugb3BlcmF0b3IgaXMgY2hhbmdlZAovLyAgIC0gb3BlcmF0b3I6IG9wZXJhdG9yIGFkZHJlc3MgdG8gYXBwcm92ZTsgdGhlIHplcm8gYWRkcmVzcyByZW1vdmVzIHRoZSBvcGVyYXRvcgpmdW5jIFNldFBvc2l0aW9uT3BlcmF0b3IoCgljdXIgcmVhbG0sCglwb3NpdGlvbklkIHVpbnQ2NCwKCW9wZXJhdG9yIGFkZHJlc3MsCikgewoJZ2V0SW1wbGVtZW50YXRpb24oKS5TZXRQb3NpdGlvbk9wZXJhdG9yKDAsIGN1ciwgcG9zaXRpb25JZCwgb3BlcmF0b3IpCn0KGq4BCgpyZW5kZXIuZ25vEp8BcGFja2FnZSBwb3NpdGlvbgoKLy8gUmVuZGVyIGRlbGVnYXRlcyB3ZWIgcmVuZGVyaW5nIHRvIHRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24uCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuUmVuZGVyKHBhdGgpCn0KGtgJCglzdGF0ZS5nbm8SyglwYWNrYWdlIHBvc2l0aW9uCgppbXBvcnQgKAoJImVycm9ycyIKCglfICJnbm8ubGFuZC9yL2dub3N3YXAvcmJhYy92MSIgLy8gaW5pdGlhbGl6ZSByZWFkYWJsZSBjb250cmFjdCByb2xlKHMpCgoJImduby5sYW5kL3AvZ25vc3dhcC9zdG9yZS92MSIKCSJnbm8ubGFuZC9wL2dub3N3YXAvdmVyc2lvbl9tYW5hZ2VyL3YxIgopCgp2YXIgKAoJZG9tYWluUGF0aCA9ICJnbm8ubGFuZC9yL2dub3N3YXAvcG9zaXRpb24iCgoJa3ZTdG9yZSBzdG9yZS5LVlN0b3JlCgoJdmVyc2lvbk1hbmFnZXIgdmVyc2lvbl9tYW5hZ2VyLlZlcnNpb25NYW5hZ2VyCglpbXBsZW1lbnRhdGlvbiBJUG9zaXRpb24KKQoKZnVuYyBpbml0KGN1ciByZWFsbSkgewoJLy8gQ3JlYXRlIGEgbmV3IEtWIHN0b3JlIGluc3RhbmNlIGZvciB0aGlzIGRvbWFpbgoJa3ZTdG9yZSA9IHN0b3JlLk5ld0tWU3RvcmUoY3VyLkFkZHJlc3MoKSkKCgkvLyBJbml0aWFsaXplIHRoZSBpbml0aWFsaXplcnMgbWFwIHRvIHN0b3JlIGltcGxlbWVudGF0aW9uIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbnMKCXZlcnNpb25NYW5hZ2VyID0gdmVyc2lvbl9tYW5hZ2VyLk5ld1ZlcnNpb25NYW5hZ2VyKAoJCWN1ci5Qa2dQYXRoKCksCgkJa3ZTdG9yZSwKCQlpbml0aWFsaXplRG9tYWluU3RvcmUsCgkpCgoJaW1wbGVtZW50YXRpb24gPSBuaWwKfQoKZnVuYyBpbml0aWFsaXplRG9tYWluU3RvcmUoXyBpbnQsIHJsbSByZWFsbSwga3ZTdG9yZSBzdG9yZS5LVlN0b3JlKSBhbnkgewoJcmV0dXJuIE5ld1Bvc2l0aW9uU3RvcmUoa3ZTdG9yZSkKfQoKZnVuYyBnZXRJbXBsZW1lbnRhdGlvbigpIElQb3NpdGlvbiB7CglpZiBpbXBsZW1lbnRhdGlvbiA9PSBuaWwgewoJCXBhbmljKCJpbXBsZW1lbnRhdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQiKQoJfQoKCXJldHVybiBpbXBsZW1lbnRhdGlvbgp9CgpmdW5jIHVwZGF0ZUltcGxlbWVudGF0aW9uKCkgZXJyb3IgewoJcmVzdWx0IDo9IHZlcnNpb25NYW5hZ2VyLkdldEN1cnJlbnRJbXBsZW1lbnRhdGlvbigpCglpZiByZXN1bHQgPT0gbmlsIHsKCQlyZXR1cm4gZXJyb3JzLk5ldygiaW1wbGVtZW50YXRpb24gaXMgbm90IGluaXRpYWxpemVkIikKCX0KCglpbXBsLCBvayA6PSByZXN1bHQuKElQb3NpdGlvbikKCWlmICFvayB7CgkJcmV0dXJuIGVycm9ycy5OZXcoImltcGwgaXMgbm90IGFuIElQb3NpdGlvbiIpCgl9CgoJaW1wbGVtZW50YXRpb24gPSBpbXBsCgoJcmV0dXJuIG5pbAp9ChqzNAoJc3RvcmUuZ25vEqU0cGFja2FnZSBwb3NpdGlvbgoKaW1wb3J0ICgKCSJlcnJvcnMiCgoJImduby5sYW5kL3AvZ25vc3dhcC9zdG9yZS92MSIKCSJnbm8ubGFuZC9wL2dub3N3YXAvdXRpbHMvdjEiCglicHRyZWUgImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgp0eXBlIFN0b3JlS2V5IHN0cmluZwoKLy8gU3RyaW5nIHJldHVybnMgdGhlIHRleHR1YWwgc3RvcmFnZS1rZXkgdmFsdWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBrZXk6IHN0b3JhZ2Uga2V5IHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nCmZ1bmMgKHMgU3RvcmVLZXkpIFN0cmluZygpIHN0cmluZyB7CglyZXR1cm4gc3RyaW5nKHMpCn0KCmNvbnN0ICgKCVN0b3JlS2V5UG9zaXRpb25zICAgICAgU3RvcmVLZXkgPSAicG9zaXRpb25zIiAgICAgIC8vIFBvc2l0aW9ucwoJU3RvcmVLZXlQb3NpdGlvbk5leHRJRCBTdG9yZUtleSA9ICJwb3NpdGlvbk5leHRJRCIgLy8gUG9zaXRpb24gbmV4dCBJRAopCgp0eXBlIHBvc2l0aW9uU3RvcmUgc3RydWN0IHsKCWt2U3RvcmUgc3RvcmUuS1ZTdG9yZQp9CgovLyBIYXNQb3NpdGlvbnNTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIHBvc2l0aW9ucyB0cmVlIGlzIHByZXNlbnQgaW4gdGhlIEtWIHN0b3JlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gdGhlIHBvc2l0aW9ucyBzdG9yYWdlIGtleSBpcyBwcmVzZW50CmZ1bmMgKHMgKnBvc2l0aW9uU3RvcmUpIEhhc1Bvc2l0aW9uc1N0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleVBvc2l0aW9ucy5TdHJpbmcoKSkKfQoKLy8gR2V0UG9zaXRpb25zIGxvYWRzIHRoZSBzdG9yZWQgdHJlZSBjb250YWluaW5nIGFsbCBwb3NpdGlvbnMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwb3NpdGlvbnM6IG11dGFibGUgcG9zaXRpb25zIHRyZWUga2V5ZWQgYnkgZGVjaW1hbCBwb3NpdGlvbiBJRDsgcGFuaWNzIHdoZW4gdGhlIGtleSBpcyBtaXNzaW5nIG9yIGhhcyBhbiB1bmV4cGVjdGVkIHR5cGUKZnVuYyAocyAqcG9zaXRpb25TdG9yZSkgR2V0UG9zaXRpb25zKCkgKmJwdHJlZS5CUFRyZWUgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleVBvc2l0aW9ucy5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglwb3NpdGlvbnMsIG9rIDo9IHJlc3VsdC4oKmJwdHJlZS5CUFRyZWUpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvICpicHRyZWUuQlBUcmVlOiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIHBvc2l0aW9ucwp9CgovLyBTZXRQb3NpdGlvbnMgc3RvcmVzIHRoZSBwb3NpdGlvbnMgdHJlZSBhZnRlciB2YWxpZGF0aW5nIHRoZSByZWFsbSBjb250ZXh0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogbGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCi8vICAgLSBybG06IHByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgdGhlIHN0b3JlIHJlcXVpcmVzIGl0IHRvIGJlIHRoZSBjdXJyZW50IHJlYWxtCi8vICAgLSBwb3NpdGlvbnM6IHBvc2l0aW9ucyB0cmVlIHRvIHBlcnNpc3QgdW5kZXIgdGhlIHBvc2l0aW9ucyBzdG9yYWdlIGtleQovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyOiBuaWwgd2hlbiB0aGUgdHJlZSBpcyBzdG9yZWQ7IG5vbi1uaWwgd2hlbiBybG0gaXMgc3Bvb2ZlZCBvciB0aGUgS1Ygd3JpdGUgZmFpbHMKZnVuYyAocyAqcG9zaXRpb25TdG9yZSkgU2V0UG9zaXRpb25zKF8gaW50LCBybG0gcmVhbG0sIHBvc2l0aW9ucyAqYnB0cmVlLkJQVHJlZSkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlQb3NpdGlvbnMuU3RyaW5nKCksIHBvc2l0aW9ucykKfQoKLy8gSGFzUG9zaXRpb25OZXh0SURTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIG5leHQtcG9zaXRpb24tSUQgdmFsdWUgaXMgcHJlc2VudCBpbiB0aGUgS1Ygc3RvcmUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBleGlzdHM6IHRydWUgd2hlbiB0aGUgbmV4dC1wb3NpdGlvbi1JRCBzdG9yYWdlIGtleSBpcyBwcmVzZW50CmZ1bmMgKHMgKnBvc2l0aW9uU3RvcmUpIEhhc1Bvc2l0aW9uTmV4dElEU3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5UG9zaXRpb25OZXh0SUQuU3RyaW5nKCkpCn0KCi8vIEdldFBvc2l0aW9uTmV4dElEIGxvYWRzIHRoZSBuZXh0IHBvc2l0aW9uIE5GVCBJRCB0byBhbGxvY2F0ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIG5leHRJRDogbmV4dCBwb3NpdGlvbiBJRCBzdG9yZWQgYnkgdGhlIHBvc2l0aW9uIG1hbmFnZXI7IHBhbmljcyB3aGVuIHRoZSBrZXkgaXMgbWlzc2luZyBvciBoYXMgYW4gdW5leHBlY3RlZCB0eXBlCmZ1bmMgKHMgKnBvc2l0aW9uU3RvcmUpIEdldFBvc2l0aW9uTmV4dElEKCkgdWludDY0IHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlQb3NpdGlvbk5leHRJRC5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgluZXh0SUQsIG9rIDo9IHJlc3VsdC4odWludDY0KQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byB1aW50NjQ6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gbmV4dElECn0KCi8vIFNldFBvc2l0aW9uTmV4dElEIHN0b3JlcyB0aGUgbmV4dCBwb3NpdGlvbiBORlQgSUQgYWZ0ZXIgdmFsaWRhdGluZyB0aGUgcmVhbG0gY29udGV4dC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGxlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAovLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IHRoZSBzdG9yZSByZXF1aXJlcyBpdCB0byBiZSB0aGUgY3VycmVudCByZWFsbQovLyAgIC0gbmV4dElEOiBuZXh0IHBvc2l0aW9uIElEIHRvIHBlcnNpc3QgZm9yIHRoZSBuZXh0IG1pbnQKLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogbmlsIHdoZW4gbmV4dElEIGlzIHN0b3JlZDsgbm9uLW5pbCB3aGVuIHJsbSBpcyBzcG9vZmVkIG9yIHRoZSBLViB3cml0ZSBmYWlscwpmdW5jIChzICpwb3NpdGlvblN0b3JlKSBTZXRQb3NpdGlvbk5leHRJRChfIGludCwgcmxtIHJlYWxtLCBuZXh0SUQgdWludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVBvc2l0aW9uTmV4dElELlN0cmluZygpLCBuZXh0SUQpCn0KCi8vIEhhc1Bvc2l0aW9uIHJlcG9ydHMgd2hldGhlciBhIHBvc2l0aW9uIGlzIHN0b3JlZCBmb3IgdGhlIHN1cHBsaWVkIE5GVCBJRC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB0byBsb29rIHVwCi8vCi8vIFJldHVybnM6Ci8vICAgLSBleGlzdHM6IHRydWUgd2hlbiB0aGUgZGVjaW1hbCBwb3NpdGlvbklkIGtleSBleGlzdHMgaW4gdGhlIHBvc2l0aW9ucyB0cmVlCmZ1bmMgKHMgKnBvc2l0aW9uU3RvcmUpIEhhc1Bvc2l0aW9uKHBvc2l0aW9uSWQgdWludDY0KSBib29sIHsKCXBvc2l0aW9ucyA6PSBzLkdldFBvc2l0aW9ucygpCgoJcmV0dXJuIHBvc2l0aW9ucy5IYXModXRpbHMuVWludDY0VG9TdHJpbmcocG9zaXRpb25JZCkpCn0KCi8vIEdldFBvc2l0aW9uIGxvYWRzIGEgcG9zaXRpb24gYnkgTkZUIElELgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElEIHRvIGxvb2sgdXAKLy8KLy8gUmV0dXJuczoKLy8gICAtIHBvc2l0aW9uOiBzdG9yZWQgcG9zaXRpb24gdmFsdWUgd2hlbiBwcmVzZW50LCBvciB0aGUgemVybyBQb3NpdGlvbiB3aGVuIGFic2VudAovLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gcG9zaXRpb25JZCBpcyBwcmVzZW50OyBmYWxzZSB3aGVuIG5vIHBvc2l0aW9uIGlzIHN0b3JlZCBmb3IgdGhhdCBJRApmdW5jIChzICpwb3NpdGlvblN0b3JlKSBHZXRQb3NpdGlvbihwb3NpdGlvbklkIHVpbnQ2NCkgKFBvc2l0aW9uLCBib29sKSB7Cglwb3NpdGlvbnMgOj0gcy5HZXRQb3NpdGlvbnMoKQoKCXJlc3VsdCA6PSBwb3NpdGlvbnMuR2V0KHV0aWxzLlVpbnQ2NFRvU3RyaW5nKHBvc2l0aW9uSWQpKQoJaWYgcmVzdWx0ID09IG5pbCB7CgkJcmV0dXJuIFBvc2l0aW9ue30sIGZhbHNlCgl9CgoJcG9zaXRpb24sIG9rIDo9IHJlc3VsdC4oUG9zaXRpb24pCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvIFBvc2l0aW9uOiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIHBvc2l0aW9uLCB0cnVlCn0KCi8vIFNldFBvc2l0aW9uIGluc2VydHMgb3IgcmVwbGFjZXMgYSBwb3NpdGlvbiBhZnRlciB2YWxpZGF0aW5nIHRoZSByZWFsbSBjb250ZXh0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogbGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCi8vICAgLSBybG06IHByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgdGhlIHN0b3JlIHJlcXVpcmVzIGl0IHRvIGJlIHRoZSBjdXJyZW50IHJlYWxtCi8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgdXNlZCBhcyB0aGUgdHJlZSBrZXkKLy8gICAtIHBvc2l0aW9uOiBwb3NpdGlvbiB2YWx1ZSB0byBwZXJzaXN0Ci8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IG5pbCB3aGVuIHRoZSBwb3NpdGlvbiBpcyBzdG9yZWQ7IG5vbi1uaWwgd2hlbiBybG0gaXMgc3Bvb2ZlZCwgdGhlIHBvc2l0aW9ucyBrZXkgaXMgbWlzc2luZywgb3IgdGhlIEtWIHdyaXRlIGZhaWxzCmZ1bmMgKHMgKnBvc2l0aW9uU3RvcmUpIFNldFBvc2l0aW9uKF8gaW50LCBybG0gcmVhbG0sIHBvc2l0aW9uSWQgdWludDY0LCBwb3NpdGlvbiBQb3NpdGlvbikgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCWlmICFzLkhhc1Bvc2l0aW9uc1N0b3JlS2V5KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KCJwb3NpdGlvbnMgc3RvcmUga2V5IG5vdCBmb3VuZCIpCgl9CgoJcG9zaXRpb25zIDo9IHMuR2V0UG9zaXRpb25zKCkKCglwb3NpdGlvbnMuU2V0KHV0aWxzLlVpbnQ2NFRvU3RyaW5nKHBvc2l0aW9uSWQpLCBwb3NpdGlvbikKCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5UG9zaXRpb25zLlN0cmluZygpLCBwb3NpdGlvbnMpCn0KCi8vIFJlbW92ZVBvc2l0aW9uIGRlbGV0ZXMgYSBwb3NpdGlvbiBhZnRlciB2YWxpZGF0aW5nIHRoZSByZWFsbSBjb250ZXh0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogbGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCi8vICAgLSBybG06IHByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgdGhlIHN0b3JlIHJlcXVpcmVzIGl0IHRvIGJlIHRoZSBjdXJyZW50IHJlYWxtCi8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgdG8gcmVtb3ZlIGZyb20gdGhlIHBvc2l0aW9ucyB0cmVlCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IG5pbCB3aGVuIHRoZSBwb3NpdGlvbiBpcyByZW1vdmVkIGFuZCB0aGUgdHJlZSBpcyBzdG9yZWQ7IG5vbi1uaWwgd2hlbiBybG0gaXMgc3Bvb2ZlZCwgdGhlIHBvc2l0aW9ucyBrZXkgaXMgbWlzc2luZywgb3IgdGhlIEtWIHdyaXRlIGZhaWxzCmZ1bmMgKHMgKnBvc2l0aW9uU3RvcmUpIFJlbW92ZVBvc2l0aW9uKF8gaW50LCBybG0gcmVhbG0sIHBvc2l0aW9uSWQgdWludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJaWYgIXMuSGFzUG9zaXRpb25zU3RvcmVLZXkoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoInBvc2l0aW9ucyBzdG9yZSBrZXkgbm90IGZvdW5kIikKCX0KCglwb3NpdGlvbnMgOj0gcy5HZXRQb3NpdGlvbnMoKQoKCXBvc2l0aW9ucy5SZW1vdmUodXRpbHMuVWludDY0VG9TdHJpbmcocG9zaXRpb25JZCkpCgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVBvc2l0aW9ucy5TdHJpbmcoKSwgcG9zaXRpb25zKQp9CgovLyBOZXdQb3NpdGlvblN0b3JlIGNyZWF0ZXMgYSBwb3NpdGlvbiBzdG9yZSBiYWNrZWQgYnkgdGhlIHByb3ZpZGVkIEtWIHN0b3JlLgovLyBUaGUgdXBncmFkZSBzeXN0ZW0gdXNlcyBpdCB0byBjb25zdHJ1Y3Qgc3RvcmFnZSBpbnN0YW5jZXMgZm9yIGVhY2ggaW1wbGVtZW50YXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBrdlN0b3JlOiBEb21haW4tb3duZWQgS1Ygc3RvcmUgc2hhcmVkIGJ5IHBvc2l0aW9uIGltcGxlbWVudGF0aW9ucy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIElQb3NpdGlvblN0b3JlOiBQb3NpdGlvbiBzdG9yYWdlIHdyYXBwZXIgYmFja2VkIGJ5IHRoZSBzdXBwbGllZCBzdG9yZS4KZnVuYyBOZXdQb3NpdGlvblN0b3JlKGt2U3RvcmUgc3RvcmUuS1ZTdG9yZSkgSVBvc2l0aW9uU3RvcmUgewoJcmV0dXJuICZwb3NpdGlvblN0b3JlewoJCWt2U3RvcmU6IGt2U3RvcmUsCgl9Cn0KGvmLAQoJdHlwZXMuZ25vEuqLAXBhY2thZ2UgcG9zaXRpb24KCmltcG9ydCAoCgl1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKCXJvdHJlZSAiZ25vLmxhbmQvcC9udC9icHRyZWUvcm90cmVlL3YwIgoJYnB0cmVlICJnbm8ubGFuZC9wL250L2JwdHJlZS92MCIKKQoKdHlwZSBJUG9zaXRpb24gaW50ZXJmYWNlIHsKCUlQb3NpdGlvbk1hbmFnZXIKCUlQb3NpdGlvbkdldHRlcgoJUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcKfQoKdHlwZSBJUG9zaXRpb25NYW5hZ2VyIGludGVyZmFjZSB7CgkvLyBNaW50IGNyZWF0ZXMgYSBuZXcgbGlxdWlkaXR5IHBvc2l0aW9uIE5GVC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGxlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpbXBsZW1lbnRhdGlvbnMgdmFsaWRhdGUgaXQgYXMgY3VycmVudCBiZWZvcmUgY2hhbmdpbmcgc3RhdGUKCS8vICAgLSB0b2tlbjA6IHBhdGggb2YgdGhlIGZpcnN0IHRva2VuIGluIHRoZSBwb29sCgkvLyAgIC0gdG9rZW4xOiBwYXRoIG9mIHRoZSBzZWNvbmQgdG9rZW4gaW4gdGhlIHBvb2wKCS8vICAgLSBmZWU6IHBvb2wgZmVlIHRpZXIgdXNlZCB0byBpZGVudGlmeSB0aGUgcG9vbAoJLy8gICAtIHRpY2tMb3dlcjogbG93ZXIgdGljayBib3VuZGFyeSBvZiB0aGUgcG9zaXRpb24ncyBwcmljZSByYW5nZQoJLy8gICAtIHRpY2tVcHBlcjogdXBwZXIgdGljayBib3VuZGFyeSBvZiB0aGUgcG9zaXRpb24ncyBwcmljZSByYW5nZQoJLy8gICAtIGFtb3VudDBEZXNpcmVkOiBkZXNpcmVkIGFtb3VudCBvZiB0b2tlbjAgdG8gcHJvdmlkZQoJLy8gICAtIGFtb3VudDFEZXNpcmVkOiBkZXNpcmVkIGFtb3VudCBvZiB0b2tlbjEgdG8gcHJvdmlkZQoJLy8gICAtIGFtb3VudDBNaW46IG1pbmltdW0gYWNjZXB0YWJsZSB0b2tlbjAgYW1vdW50IGZvciBzbGlwcGFnZSBwcm90ZWN0aW9uCgkvLyAgIC0gYW1vdW50MU1pbjogbWluaW11bSBhY2NlcHRhYmxlIHRva2VuMSBhbW91bnQgZm9yIHNsaXBwYWdlIHByb3RlY3Rpb24KCS8vICAgLSBkZWFkbGluZTogdHJhbnNhY3Rpb24gZXhwaXJhdGlvbiB0aW1lc3RhbXAKCS8vICAgLSBtaW50VG86IHJlY2lwaWVudCBhZGRyZXNzIG9mIHRoZSBwb3NpdGlvbiBORlQKCS8vICAgLSByZWZlcnJlcjogcmVmZXJyZXIgaWRlbnRpZmllciB1c2VkIGZvciByZXdhcmQgdHJhY2tpbmcKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHBvc2l0aW9uSWQ6IG5ld2x5IG1pbnRlZCBwb3NpdGlvbiBORlQgdG9rZW4gSUQKCS8vICAgLSBsaXF1aWRpdHk6IGxpcXVpZGl0eSBtaW50ZWQgaW50byB0aGUgcG9zaXRpb24sIHJlcHJlc2VudGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKCS8vICAgLSBhbW91bnQwOiBhY3R1YWwgYW1vdW50IG9mIHRva2VuMCBhZGRlZCwgcmVwcmVzZW50ZWQgYXMgYSBkZWNpbWFsIHN0cmluZwoJLy8gICAtIGFtb3VudDE6IGFjdHVhbCBhbW91bnQgb2YgdG9rZW4xIGFkZGVkLCByZXByZXNlbnRlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCglNaW50KAoJCV8gaW50LAoJCXJsbSByZWFsbSwKCQl0b2tlbjAgc3RyaW5nLAoJCXRva2VuMSBzdHJpbmcsCgkJZmVlIHVpbnQzMiwKCQl0aWNrTG93ZXIgaW50MzIsCgkJdGlja1VwcGVyIGludDMyLAoJCWFtb3VudDBEZXNpcmVkIHN0cmluZywKCQlhbW91bnQxRGVzaXJlZCBzdHJpbmcsCgkJYW1vdW50ME1pbiBzdHJpbmcsCgkJYW1vdW50MU1pbiBzdHJpbmcsCgkJZGVhZGxpbmUgaW50NjQsCgkJbWludFRvIGFkZHJlc3MsCgkJcmVmZXJyZXIgc3RyaW5nLAoJKSAodWludDY0LCBzdHJpbmcsIHN0cmluZywgc3RyaW5nKQoKCS8vIEluY3JlYXNlTGlxdWlkaXR5IGFkZHMgbGlxdWlkaXR5IHRvIGFuIGV4aXN0aW5nIHBvc2l0aW9uLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogbGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IGltcGxlbWVudGF0aW9ucyB2YWxpZGF0ZSBpdCBhcyBjdXJyZW50IGJlZm9yZSBjaGFuZ2luZyBzdGF0ZQoJLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB0byBpbmNyZWFzZQoJLy8gICAtIGFtb3VudDBEZXNpcmVkU3RyOiBkZXNpcmVkIHRva2VuMCBhbW91bnQsIHJlcHJlc2VudGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKCS8vICAgLSBhbW91bnQxRGVzaXJlZFN0cjogZGVzaXJlZCB0b2tlbjEgYW1vdW50LCByZXByZXNlbnRlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCgkvLyAgIC0gYW1vdW50ME1pblN0cjogbWluaW11bSBhY2NlcHRhYmxlIHRva2VuMCBhbW91bnQgZm9yIHNsaXBwYWdlIHByb3RlY3Rpb24KCS8vICAgLSBhbW91bnQxTWluU3RyOiBtaW5pbXVtIGFjY2VwdGFibGUgdG9rZW4xIGFtb3VudCBmb3Igc2xpcHBhZ2UgcHJvdGVjdGlvbgoJLy8gICAtIGRlYWRsaW5lOiB0cmFuc2FjdGlvbiBleHBpcmF0aW9uIHRpbWVzdGFtcAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElEIHRoYXQgcmVjZWl2ZWQgdGhlIGxpcXVpZGl0eQoJLy8gICAtIGxpcXVpZGl0eTogbGlxdWlkaXR5IGFtb3VudCBhZGRlZCB0byB0aGUgcG9zaXRpb24gKHRoZSBkZWx0YSksIHJlcHJlc2VudGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKCS8vICAgLSBhbW91bnQwOiBhY3R1YWwgdG9rZW4wIGFtb3VudCBhZGRlZCwgcmVwcmVzZW50ZWQgYXMgYSBkZWNpbWFsIHN0cmluZwoJLy8gICAtIGFtb3VudDE6IGFjdHVhbCB0b2tlbjEgYW1vdW50IGFkZGVkLCByZXByZXNlbnRlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCgkvLyAgIC0gcG9vbEtleTogY2Fub25pY2FsIHBvb2wga2V5IGZvciB0aGUgcG9zaXRpb24KCUluY3JlYXNlTGlxdWlkaXR5KAoJCV8gaW50LAoJCXJsbSByZWFsbSwKCQlwb3NpdGlvbklkIHVpbnQ2NCwKCQlhbW91bnQwRGVzaXJlZFN0ciBzdHJpbmcsCgkJYW1vdW50MURlc2lyZWRTdHIgc3RyaW5nLAoJCWFtb3VudDBNaW5TdHIgc3RyaW5nLAoJCWFtb3VudDFNaW5TdHIgc3RyaW5nLAoJCWRlYWRsaW5lIGludDY0LAoJKSAodWludDY0LCBzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmcpCgoJLy8gRGVjcmVhc2VMaXF1aWRpdHkgcmVtb3ZlcyBsaXF1aWRpdHkgZnJvbSBhIHBvc2l0aW9uLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogbGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IGltcGxlbWVudGF0aW9ucyB2YWxpZGF0ZSBpdCBhcyBjdXJyZW50IGJlZm9yZSBjaGFuZ2luZyBzdGF0ZQoJLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB0byBkZWNyZWFzZQoJLy8gICAtIGxpcXVpZGl0eVN0cjogbGlxdWlkaXR5IGFtb3VudCB0byByZW1vdmUsIHJlcHJlc2VudGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKCS8vICAgLSBhbW91bnQwTWluU3RyOiBtaW5pbXVtIGFjY2VwdGFibGUgdG9rZW4wIGFtb3VudCBmb3Igc2xpcHBhZ2UgcHJvdGVjdGlvbgoJLy8gICAtIGFtb3VudDFNaW5TdHI6IG1pbmltdW0gYWNjZXB0YWJsZSB0b2tlbjEgYW1vdW50IGZvciBzbGlwcGFnZSBwcm90ZWN0aW9uCgkvLyAgIC0gZGVhZGxpbmU6IHRyYW5zYWN0aW9uIGV4cGlyYXRpb24gdGltZXN0YW1wCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgdGhhdCBoYWQgbGlxdWlkaXR5IHJlbW92ZWQKCS8vICAgLSBsaXF1aWRpdHk6IHJlbW92ZWQgbGlxdWlkaXR5IGFtb3VudCwgcmVwcmVzZW50ZWQgYXMgYSBkZWNpbWFsIHN0cmluZwoJLy8gICAtIGZlZTA6IHRva2VuMCBmZWVzIGNvbGxlY3RlZCwgbmV0IG9mIHRoZSB3aXRoZHJhd2FsIGZlZQoJLy8gICAtIGZlZTE6IHRva2VuMSBmZWVzIGNvbGxlY3RlZCwgbmV0IG9mIHRoZSB3aXRoZHJhd2FsIGZlZQoJLy8gICAtIGFtb3VudDA6IHByaW5jaXBhbCBhbW91bnQgb2YgdG9rZW4wIHJldHVybmVkIHRvIHRoZSBjYWxsZXIKCS8vICAgLSBhbW91bnQxOiBwcmluY2lwYWwgYW1vdW50IG9mIHRva2VuMSByZXR1cm5lZCB0byB0aGUgY2FsbGVyCgkvLyAgIC0gcG9vbEtleTogY2Fub25pY2FsIHBvb2wga2V5IGZvciB0aGUgcG9zaXRpb24KCURlY3JlYXNlTGlxdWlkaXR5KAoJCV8gaW50LAoJCXJsbSByZWFsbSwKCQlwb3NpdGlvbklkIHVpbnQ2NCwKCQlsaXF1aWRpdHlTdHIgc3RyaW5nLAoJCWFtb3VudDBNaW5TdHIgc3RyaW5nLAoJCWFtb3VudDFNaW5TdHIgc3RyaW5nLAoJCWRlYWRsaW5lIGludDY0LAoJKSAodWludDY0LCBzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgc3RyaW5nKQoKCS8vIFJlcG9zaXRpb24gY2hhbmdlcyB0aGUgdGljayByYW5nZSBvZiBhbiBleGlzdGluZyBwb3NpdGlvbi4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGxlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpbXBsZW1lbnRhdGlvbnMgdmFsaWRhdGUgaXQgYXMgY3VycmVudCBiZWZvcmUgY2hhbmdpbmcgc3RhdGUKCS8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgdG8gcmVwb3NpdGlvbgoJLy8gICAtIHRpY2tMb3dlcjogbmV3IGxvd2VyIHRpY2sgYm91bmRhcnkgb2YgdGhlIHBvc2l0aW9uJ3MgcHJpY2UgcmFuZ2UKCS8vICAgLSB0aWNrVXBwZXI6IG5ldyB1cHBlciB0aWNrIGJvdW5kYXJ5IG9mIHRoZSBwb3NpdGlvbidzIHByaWNlIHJhbmdlCgkvLyAgIC0gYW1vdW50MERlc2lyZWRTdHI6IGRlc2lyZWQgdG9rZW4wIGFtb3VudCBmb3IgdGhlIG5ldyByYW5nZSwgcmVwcmVzZW50ZWQgYXMgYSBkZWNpbWFsIHN0cmluZwoJLy8gICAtIGFtb3VudDFEZXNpcmVkU3RyOiBkZXNpcmVkIHRva2VuMSBhbW91bnQgZm9yIHRoZSBuZXcgcmFuZ2UsIHJlcHJlc2VudGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKCS8vICAgLSBhbW91bnQwTWluU3RyOiBtaW5pbXVtIGFjY2VwdGFibGUgdG9rZW4wIGFtb3VudCBmb3Igc2xpcHBhZ2UgcHJvdGVjdGlvbgoJLy8gICAtIGFtb3VudDFNaW5TdHI6IG1pbmltdW0gYWNjZXB0YWJsZSB0b2tlbjEgYW1vdW50IGZvciBzbGlwcGFnZSBwcm90ZWN0aW9uCgkvLyAgIC0gZGVhZGxpbmU6IHRyYW5zYWN0aW9uIGV4cGlyYXRpb24gdGltZXN0YW1wCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgdGhhdCB3YXMgcmVwb3NpdGlvbmVkCgkvLyAgIC0gbGlxdWlkaXR5OiBuZXcgbGlxdWlkaXR5IGFtb3VudCwgcmVwcmVzZW50ZWQgYXMgYSBkZWNpbWFsIHN0cmluZwoJLy8gICAtIHRpY2tMb3dlcjogbG93ZXIgdGljayBib3VuZGFyeSBhcHBsaWVkIHRvIHRoZSBwb3NpdGlvbgoJLy8gICAtIHRpY2tVcHBlcjogdXBwZXIgdGljayBib3VuZGFyeSBhcHBsaWVkIHRvIHRoZSBwb3NpdGlvbgoJLy8gICAtIGFtb3VudDA6IGFjdHVhbCB0b2tlbjAgYW1vdW50IGFkZGVkIHRvIHRoZSBuZXcgcmFuZ2UsIHJlcHJlc2VudGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKCS8vICAgLSBhbW91bnQxOiBhY3R1YWwgdG9rZW4xIGFtb3VudCBhZGRlZCB0byB0aGUgbmV3IHJhbmdlLCByZXByZXNlbnRlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCglSZXBvc2l0aW9uKAoJCV8gaW50LAoJCXJsbSByZWFsbSwKCQlwb3NpdGlvbklkIHVpbnQ2NCwKCQl0aWNrTG93ZXIgaW50MzIsCgkJdGlja1VwcGVyIGludDMyLAoJCWFtb3VudDBEZXNpcmVkU3RyIHN0cmluZywKCQlhbW91bnQxRGVzaXJlZFN0ciBzdHJpbmcsCgkJYW1vdW50ME1pblN0ciBzdHJpbmcsCgkJYW1vdW50MU1pblN0ciBzdHJpbmcsCgkJZGVhZGxpbmUgaW50NjQsCgkpICh1aW50NjQsIHN0cmluZywgaW50MzIsIGludDMyLCBzdHJpbmcsIHN0cmluZykKCgkvLyBDb2xsZWN0RmVlIGNvbGxlY3RzIGFjY3VtdWxhdGVkIGZlZXMgZnJvbSBhIHBvc2l0aW9uLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogbGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IGltcGxlbWVudGF0aW9ucyB2YWxpZGF0ZSBpdCBhcyBjdXJyZW50IGJlZm9yZSBjaGFuZ2luZyBzdGF0ZQoJLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSBmZWVzIGFyZSBjb2xsZWN0ZWQKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSBmZWVzIHdlcmUgY29sbGVjdGVkCgkvLyAgIC0gdG9rZW5zQ29sbGVjdGVkMDogdG9rZW4wIGZlZXMgcGFpZCBvdXQgdG8gdGhlIGNhbGxlciwgbmV0IG9mIHRoZSB3aXRoZHJhd2FsIGZlZQoJLy8gICAtIHRva2Vuc0NvbGxlY3RlZDE6IHRva2VuMSBmZWVzIHBhaWQgb3V0IHRvIHRoZSBjYWxsZXIsIG5ldCBvZiB0aGUgd2l0aGRyYXdhbCBmZWUKCS8vICAgLSBwb29sS2V5OiBjYW5vbmljYWwgcG9vbCBrZXkgZm9yIHRoZSBwb3NpdGlvbgoJLy8gICAtIHRvdGFsQW1vdW50MDogdG9rZW4wIGZlZXMgY29sbGVjdGVkIGJlZm9yZSB0aGUgd2l0aGRyYXdhbCBmZWUKCS8vICAgLSB0b3RhbEFtb3VudDE6IHRva2VuMSBmZWVzIGNvbGxlY3RlZCBiZWZvcmUgdGhlIHdpdGhkcmF3YWwgZmVlCglDb2xsZWN0RmVlKAoJCV8gaW50LAoJCXJsbSByZWFsbSwKCQlwb3NpdGlvbklkIHVpbnQ2NCwKCSkgKHVpbnQ2NCwgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmcpCgoJLy8gU2V0UG9zaXRpb25PcGVyYXRvciBzZXRzIG9yIHJlbW92ZXMgdGhlIGFwcHJvdmVkIG9wZXJhdG9yIGZvciBhIHBvc2l0aW9uLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogbGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IGltcGxlbWVudGF0aW9ucyB2YWxpZGF0ZSBpdCBhcyBjdXJyZW50IGJlZm9yZSBjaGFuZ2luZyBzdGF0ZQoJLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSBvcGVyYXRvciBpcyBjaGFuZ2VkCgkvLyAgIC0gb3BlcmF0b3I6IG9wZXJhdG9yIGFkZHJlc3MgdG8gYXBwcm92ZTsgdGhlIHplcm8gYWRkcmVzcyByZW1vdmVzIHRoZSBvcGVyYXRvcgoJU2V0UG9zaXRpb25PcGVyYXRvcigKCQlfIGludCwKCQlybG0gcmVhbG0sCgkJcG9zaXRpb25JZCB1aW50NjQsCgkJb3BlcmF0b3IgYWRkcmVzcywKCSkKfQoKdHlwZSBJUG9zaXRpb25HZXR0ZXIgaW50ZXJmYWNlIHsKCS8vIEdldFBvc2l0aW9ucyByZXR1cm5zIGEgcmVhZC1vbmx5IHZpZXcgb2YgYWxsIHBvc2l0aW9ucy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHBvc2l0aW9uczogcmVhZC1vbmx5IHRyZWUga2V5ZWQgYnkgZGVjaW1hbCBwb3NpdGlvbiBJRAoJR2V0UG9zaXRpb25zKCkgKnJvdHJlZS5SZWFkT25seVRyZWUKCS8vIElzQnVybmVkIHJlcG9ydHMgd2hldGhlciBhIHBvc2l0aW9uJ3MgZW1wdHktcG9zaXRpb24gbWFya2VyIGlzIHNldC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSBidXJuZWQgbWFya2VyIGlzIHF1ZXJpZWQKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGJ1cm5lZDogdHJ1ZSB3aGVuIHRoZSBwb3NpdGlvbidzIGVtcHR5LXBvc2l0aW9uIG1hcmtlciBpcyBzZXQKCS8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwb3NpdGlvbklkIGNhbm5vdCBiZSByZXNvbHZlZAoJSXNCdXJuZWQocG9zaXRpb25JZCB1aW50NjQpIChib29sLCBlcnJvcikKCS8vIElzSW5SYW5nZSByZXBvcnRzIHdoZXRoZXIgYSBwb3NpdGlvbidzIHRpY2sgcmFuZ2UgY29udGFpbnMgdGhlIGN1cnJlbnQgcG9vbCB0aWNrLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElEIHdob3NlIHJhbmdlIGlzIGNoZWNrZWQKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGluUmFuZ2U6IHRydWUgd2hlbiB0aGUgY3VycmVudCBwb29sIHRpY2sgbGllcyB3aXRoaW4gdGhlIHBvc2l0aW9uJ3MgdGljayByYW5nZQoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHBvc2l0aW9uSWQgY2Fubm90IGJlIHJlc29sdmVkIG9yIHRoZSBhc3NvY2lhdGVkIHBvb2wgdGljayBjYW5ub3QgYmUgcmVhZAoJSXNJblJhbmdlKHBvc2l0aW9uSWQgdWludDY0KSAoYm9vbCwgZXJyb3IpCgkvLyBHZXRQb3NpdGlvbk9wZXJhdG9yIHJldHVybnMgdGhlIGFwcHJvdmVkIG9wZXJhdG9yIGFkZHJlc3MgZm9yIGEgcG9zaXRpb24uCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgd2hvc2Ugb3BlcmF0b3IgaXMgcXVlcmllZAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gb3BlcmF0b3I6IGFwcHJvdmVkIG9wZXJhdG9yIGFkZHJlc3M7IHRoZSB6ZXJvIGFkZHJlc3MgbWVhbnMgbm8gb3BlcmF0b3IgaXMgc2V0CgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcG9zaXRpb25JZCBjYW5ub3QgYmUgcmVzb2x2ZWQKCUdldFBvc2l0aW9uT3BlcmF0b3IocG9zaXRpb25JZCB1aW50NjQpIChhZGRyZXNzLCBlcnJvcikKCS8vIEdldFBvc2l0aW9uUG9vbEtleSByZXR1cm5zIHRoZSBwb29sIGtleSBhc3NvY2lhdGVkIHdpdGggYSBwb3NpdGlvbi4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSBwb29sIGlzIHF1ZXJpZWQKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHBvb2xLZXk6IGNhbm9uaWNhbCBwb29sIGtleSB1c2VkIGJ5IHRoZSBwb3NpdGlvbgoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHBvc2l0aW9uSWQgY2Fubm90IGJlIHJlc29sdmVkCglHZXRQb3NpdGlvblBvb2xLZXkocG9zaXRpb25JZCB1aW50NjQpIChzdHJpbmcsIGVycm9yKQoJLy8gR2V0UG9zaXRpb25UaWNrTG93ZXIgcmV0dXJucyB0aGUgbG93ZXIgdGljayBib3VuZGFyeSBvZiBhIHBvc2l0aW9uLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElEIHdob3NlIGxvd2VyIHRpY2sgaXMgcXVlcmllZAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdGlja0xvd2VyOiBsb3dlciB0aWNrIGJvdW5kYXJ5IG9mIHRoZSBwb3NpdGlvbidzIHByaWNlIHJhbmdlCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcG9zaXRpb25JZCBjYW5ub3QgYmUgcmVzb2x2ZWQKCUdldFBvc2l0aW9uVGlja0xvd2VyKHBvc2l0aW9uSWQgdWludDY0KSAoaW50MzIsIGVycm9yKQoJLy8gR2V0UG9zaXRpb25UaWNrVXBwZXIgcmV0dXJucyB0aGUgdXBwZXIgdGljayBib3VuZGFyeSBvZiBhIHBvc2l0aW9uLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElEIHdob3NlIHVwcGVyIHRpY2sgaXMgcXVlcmllZAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdGlja1VwcGVyOiB1cHBlciB0aWNrIGJvdW5kYXJ5IG9mIHRoZSBwb3NpdGlvbidzIHByaWNlIHJhbmdlCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcG9zaXRpb25JZCBjYW5ub3QgYmUgcmVzb2x2ZWQKCUdldFBvc2l0aW9uVGlja1VwcGVyKHBvc2l0aW9uSWQgdWludDY0KSAoaW50MzIsIGVycm9yKQoJLy8gR2V0UG9zaXRpb25MaXF1aWRpdHkgcmV0dXJucyB0aGUgc3RvcmVkIGxpcXVpZGl0eSBhbW91bnQgb2YgYSBwb3NpdGlvbi4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSBsaXF1aWRpdHkgaXMgcXVlcmllZAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gbGlxdWlkaXR5OiBwb3NpdGlvbiBsaXF1aWRpdHkgcmVwcmVzZW50ZWQgYXMgYSBkZWNpbWFsIHN0cmluZwoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHBvc2l0aW9uSWQgY2Fubm90IGJlIHJlc29sdmVkCglHZXRQb3NpdGlvbkxpcXVpZGl0eShwb3NpdGlvbklkIHVpbnQ2NCkgKHN0cmluZywgZXJyb3IpCgkvLyBHZXRQb3NpdGlvblRva2VuQmFsYW5jZXMgcmV0dXJucyBjdXJyZW50IHRva2VuMCBhbmQgdG9rZW4xIGJhbGFuY2VzIGRlcml2ZWQgZm9yIGEgcG9zaXRpb24uCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgd2hvc2UgYmFsYW5jZXMgYXJlIHF1ZXJpZWQKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGJhbGFuY2UwOiBjdXJyZW50IHRva2VuMCBiYWxhbmNlIGRlcml2ZWQgZnJvbSBsaXF1aWRpdHksIHRpY2tzLCBhbmQgcG9vbCBwcmljZQoJLy8gICAtIGJhbGFuY2UxOiBjdXJyZW50IHRva2VuMSBiYWxhbmNlIGRlcml2ZWQgZnJvbSBsaXF1aWRpdHksIHRpY2tzLCBhbmQgcG9vbCBwcmljZQoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHBvc2l0aW9uSWQgY2Fubm90IGJlIHJlc29sdmVkCglHZXRQb3NpdGlvblRva2VuQmFsYW5jZXMocG9zaXRpb25JZCB1aW50NjQpIChpbnQ2NCwgaW50NjQsIGVycm9yKQoJLy8gR2V0UG9zaXRpb25GZWVHcm93dGhJbnNpZGUwTGFzdFgxMjggcmV0dXJucyB0aGUgbGFzdCBmZWUtZ3Jvd3RoIGNoZWNrcG9pbnQgaW5zaWRlIGEgcG9zaXRpb24ncyByYW5nZSBmb3IgdG9rZW4wLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElEIHdob3NlIHRva2VuMCBmZWUtZ3Jvd3RoIGNoZWNrcG9pbnQgaXMgcXVlcmllZAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZmVlR3Jvd3RoSW5zaWRlMExhc3RYMTI4OiB0b2tlbjAgZmVlLWdyb3d0aCBjaGVja3BvaW50IGFzIGEgZGVjaW1hbCBzdHJpbmcKCS8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwb3NpdGlvbklkIGNhbm5vdCBiZSByZXNvbHZlZAoJR2V0UG9zaXRpb25GZWVHcm93dGhJbnNpZGUwTGFzdFgxMjgocG9zaXRpb25JZCB1aW50NjQpIChzdHJpbmcsIGVycm9yKQoJLy8gR2V0UG9zaXRpb25GZWVHcm93dGhJbnNpZGUxTGFzdFgxMjggcmV0dXJucyB0aGUgbGFzdCBmZWUtZ3Jvd3RoIGNoZWNrcG9pbnQgaW5zaWRlIGEgcG9zaXRpb24ncyByYW5nZSBmb3IgdG9rZW4xLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElEIHdob3NlIHRva2VuMSBmZWUtZ3Jvd3RoIGNoZWNrcG9pbnQgaXMgcXVlcmllZAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZmVlR3Jvd3RoSW5zaWRlMUxhc3RYMTI4OiB0b2tlbjEgZmVlLWdyb3d0aCBjaGVja3BvaW50IGFzIGEgZGVjaW1hbCBzdHJpbmcKCS8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwb3NpdGlvbklkIGNhbm5vdCBiZSByZXNvbHZlZAoJR2V0UG9zaXRpb25GZWVHcm93dGhJbnNpZGUxTGFzdFgxMjgocG9zaXRpb25JZCB1aW50NjQpIChzdHJpbmcsIGVycm9yKQoJLy8gR2V0UG9zaXRpb25GZWVHcm93dGhJbnNpZGVMYXN0WDEyOCByZXR1cm5zIHRoZSBsYXN0IGZlZS1ncm93dGggY2hlY2twb2ludHMgaW5zaWRlIGEgcG9zaXRpb24ncyByYW5nZSBmb3IgYm90aCB0b2tlbnMuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgd2hvc2UgZmVlLWdyb3d0aCBjaGVja3BvaW50cyBhcmUgcXVlcmllZAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZmVlR3Jvd3RoSW5zaWRlMExhc3RYMTI4OiB0b2tlbjAgZmVlLWdyb3d0aCBjaGVja3BvaW50IGFzIGEgZGVjaW1hbCBzdHJpbmcKCS8vICAgLSBmZWVHcm93dGhJbnNpZGUxTGFzdFgxMjg6IHRva2VuMSBmZWUtZ3Jvd3RoIGNoZWNrcG9pbnQgYXMgYSBkZWNpbWFsIHN0cmluZwoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHBvc2l0aW9uSWQgY2Fubm90IGJlIHJlc29sdmVkCglHZXRQb3NpdGlvbkZlZUdyb3d0aEluc2lkZUxhc3RYMTI4KHBvc2l0aW9uSWQgdWludDY0KSAoc3RyaW5nLCBzdHJpbmcsIGVycm9yKQoJLy8gR2V0UG9zaXRpb25UaWNrcyByZXR1cm5zIHRoZSBsb3dlciBhbmQgdXBwZXIgdGljayBib3VuZGFyaWVzIG9mIGEgcG9zaXRpb24uCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgd2hvc2UgdGljayByYW5nZSBpcyBxdWVyaWVkCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0aWNrTG93ZXI6IGxvd2VyIHRpY2sgYm91bmRhcnkgb2YgdGhlIHBvc2l0aW9uJ3MgcHJpY2UgcmFuZ2UKCS8vICAgLSB0aWNrVXBwZXI6IHVwcGVyIHRpY2sgYm91bmRhcnkgb2YgdGhlIHBvc2l0aW9uJ3MgcHJpY2UgcmFuZ2UKCS8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwb3NpdGlvbklkIGNhbm5vdCBiZSByZXNvbHZlZAoJR2V0UG9zaXRpb25UaWNrcyhwb3NpdGlvbklkIHVpbnQ2NCkgKGludDMyLCBpbnQzMiwgZXJyb3IpCgkvLyBHZXRQb3NpdGlvblRva2Vuc093ZWQwIHJldHVybnMgdGhlIHRva2VuMCBhbW91bnQgYWNjcnVlZCBhbmQgb3dlZCB0byBhIHBvc2l0aW9uLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElEIHdob3NlIHRva2VuMCBkZWJ0IGlzIHF1ZXJpZWQKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHRva2Vuc093ZWQwOiB0b2tlbjAgYW1vdW50IGN1cnJlbnRseSBvd2VkIHRvIHRoZSBwb3NpdGlvbgoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHBvc2l0aW9uSWQgY2Fubm90IGJlIHJlc29sdmVkCglHZXRQb3NpdGlvblRva2Vuc093ZWQwKHBvc2l0aW9uSWQgdWludDY0KSAoaW50NjQsIGVycm9yKQoJLy8gR2V0UG9zaXRpb25Ub2tlbnNPd2VkMSByZXR1cm5zIHRoZSB0b2tlbjEgYW1vdW50IGFjY3J1ZWQgYW5kIG93ZWQgdG8gYSBwb3NpdGlvbi4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSB0b2tlbjEgZGVidCBpcyBxdWVyaWVkCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0b2tlbnNPd2VkMTogdG9rZW4xIGFtb3VudCBjdXJyZW50bHkgb3dlZCB0byB0aGUgcG9zaXRpb24KCS8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwb3NpdGlvbklkIGNhbm5vdCBiZSByZXNvbHZlZAoJR2V0UG9zaXRpb25Ub2tlbnNPd2VkMShwb3NpdGlvbklkIHVpbnQ2NCkgKGludDY0LCBlcnJvcikKCS8vIEdldFBvc2l0aW9uVG9rZW5zT3dlZCByZXR1cm5zIHRva2VuMCBhbmQgdG9rZW4xIGFtb3VudHMgYWNjcnVlZCBhbmQgb3dlZCB0byBhIHBvc2l0aW9uLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElEIHdob3NlIGFjY3J1ZWQgdG9rZW4gZGVidCBpcyBxdWVyaWVkCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0b2tlbnNPd2VkMDogdG9rZW4wIGFtb3VudCBjdXJyZW50bHkgb3dlZCB0byB0aGUgcG9zaXRpb24KCS8vICAgLSB0b2tlbnNPd2VkMTogdG9rZW4xIGFtb3VudCBjdXJyZW50bHkgb3dlZCB0byB0aGUgcG9zaXRpb24KCS8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwb3NpdGlvbklkIGNhbm5vdCBiZSByZXNvbHZlZAoJR2V0UG9zaXRpb25Ub2tlbnNPd2VkKHBvc2l0aW9uSWQgdWludDY0KSAoaW50NjQsIGludDY0LCBlcnJvcikKCS8vIEdldFVuY2xhaW1lZEZlZSByZXR1cm5zIHVuY2xhaW1lZCBmZWVzIGZvciBib3RoIHRva2VucyBvZiBhIHBvc2l0aW9uLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9zaXRpb25JZDogcG9zaXRpb24gTkZUIHRva2VuIElEIHdob3NlIHVuY2xhaW1lZCBmZWVzIGFyZSBxdWVyaWVkCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBmZWUwOiB1bmNsYWltZWQgdG9rZW4wIGZlZSBhbW91bnQgYXMgYSB1aW50MjU2IHZhbHVlCgkvLyAgIC0gZmVlMTogdW5jbGFpbWVkIHRva2VuMSBmZWUgYW1vdW50IGFzIGEgdWludDI1NiB2YWx1ZQoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHBvc2l0aW9uSWQgb3IgdGhlIGFzc29jaWF0ZWQgcG9vbCBmZWUtZ3Jvd3RoIGRhdGEgY2Fubm90IGJlIHJlc29sdmVkCglHZXRVbmNsYWltZWRGZWUocG9zaXRpb25JZCB1aW50NjQpICgqdTI1Ni5VaW50LCAqdTI1Ni5VaW50LCBlcnJvcikKCS8vIEdldFBvc2l0aW9uT3duZXIgcmV0dXJucyB0aGUgb3duZXIgYWRkcmVzcyBvZiBhIHBvc2l0aW9uIE5GVC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSBvd25lciBpcyBxdWVyaWVkCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBvd25lcjogYWRkcmVzcyB0aGF0IG93bnMgdGhlIHBvc2l0aW9uIE5GVAoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHRoZSBORlQgb3duZXIgbG9va3VwIGZhaWxzCglHZXRQb3NpdGlvbk93bmVyKHBvc2l0aW9uSWQgdWludDY0KSAoYWRkcmVzcywgZXJyb3IpCn0KCnR5cGUgSVBvc2l0aW9uU3RvcmUgaW50ZXJmYWNlIHsKCS8vIEhhc1Bvc2l0aW9uc1N0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgcG9zaXRpb25zIHRyZWUgZXhpc3RzIGluIHN0b3JhZ2UuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IHRydWUgd2hlbiB0aGUgcG9zaXRpb25zIHN0b3JhZ2Uga2V5IGlzIHByZXNlbnQKCUhhc1Bvc2l0aW9uc1N0b3JlS2V5KCkgYm9vbAoJLy8gR2V0UG9zaXRpb25zIHJldHVybnMgdGhlIG11dGFibGUgcG9zaXRpb25zIHRyZWUuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBwb3NpdGlvbnM6IHBvc2l0aW9ucyB0cmVlIGtleWVkIGJ5IGRlY2ltYWwgcG9zaXRpb24gSUQKCUdldFBvc2l0aW9ucygpICpicHRyZWUuQlBUcmVlCgkvLyBTZXRQb3NpdGlvbnMgc3RvcmVzIHRoZSBjb21wbGV0ZSBwb3NpdGlvbnMgdHJlZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGxlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpbXBsZW1lbnRhdGlvbnMgcmVxdWlyZSBpdCB0byBiZSBjdXJyZW50IGZvciBzdG9yYWdlIHdyaXRlcwoJLy8gICAtIHBvc2l0aW9uczogcG9zaXRpb25zIHRyZWUgdG8gcGVyc2lzdCwga2V5ZWQgYnkgZGVjaW1hbCBwb3NpdGlvbiBJRAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBuaWwgd2hlbiB0aGUgdHJlZSBpcyBzdG9yZWQ7IG5vbi1uaWwgd2hlbiB0aGUgcmVhbG0gaXMgc3Bvb2ZlZCBvciB0aGUgd3JpdGUgZmFpbHMKCVNldFBvc2l0aW9ucyhfIGludCwgcmxtIHJlYWxtLCBwb3NpdGlvbnMgKmJwdHJlZS5CUFRyZWUpIGVycm9yCgoJLy8gSGFzUG9zaXRpb25OZXh0SURTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIG5leHQtcG9zaXRpb24tSUQgdmFsdWUgZXhpc3RzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gdGhlIG5leHQtcG9zaXRpb24tSUQgc3RvcmFnZSBrZXkgaXMgcHJlc2VudAoJSGFzUG9zaXRpb25OZXh0SURTdG9yZUtleSgpIGJvb2wKCS8vIEdldFBvc2l0aW9uTmV4dElEIHJldHVybnMgdGhlIG5leHQgcG9zaXRpb24gTkZUIElEIHRvIGFsbG9jYXRlLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gbmV4dElEOiBuZXh0IHBvc2l0aW9uIElEIHN0b3JlZCBmb3IgbWludGluZwoJR2V0UG9zaXRpb25OZXh0SUQoKSB1aW50NjQKCS8vIFNldFBvc2l0aW9uTmV4dElEIHN0b3JlcyB0aGUgbmV4dCBwb3NpdGlvbiBORlQgSUQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgaW1wbGVtZW50YXRpb25zIHJlcXVpcmUgaXQgdG8gYmUgY3VycmVudCBmb3Igc3RvcmFnZSB3cml0ZXMKCS8vICAgLSBuZXh0SUQ6IG5leHQgcG9zaXRpb24gSUQgdG8gcGVyc2lzdCBmb3IgdGhlIG5leHQgbWludAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBuaWwgd2hlbiBuZXh0SUQgaXMgc3RvcmVkOyBub24tbmlsIHdoZW4gdGhlIHJlYWxtIGlzIHNwb29mZWQgb3IgdGhlIHdyaXRlIGZhaWxzCglTZXRQb3NpdGlvbk5leHRJRChfIGludCwgcmxtIHJlYWxtLCBuZXh0SUQgdWludDY0KSBlcnJvcgoKCS8vIEhhc1Bvc2l0aW9uIHJlcG9ydHMgd2hldGhlciBhbiBORlQgSUQgaXMgcHJlc2VudCBpbiB0aGUgcG9zaXRpb25zIHRyZWUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgdG8gbG9vayB1cAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gcG9zaXRpb25JZCBoYXMgYSBzdG9yZWQgcG9zaXRpb24KCUhhc1Bvc2l0aW9uKHBvc2l0aW9uSWQgdWludDY0KSBib29sCgkvLyBHZXRQb3NpdGlvbiBsb2FkcyBhIHBvc2l0aW9uIGJ5IE5GVCBJRC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB0byBsb29rIHVwCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBwb3NpdGlvbjogc3RvcmVkIHBvc2l0aW9uIHZhbHVlLCBvciB0aGUgemVybyBQb3NpdGlvbiB3aGVuIGFic2VudAoJLy8gICAtIGV4aXN0czogdHJ1ZSB3aGVuIHBvc2l0aW9uSWQgaXMgcHJlc2VudDsgZmFsc2Ugd2hlbiBubyBwb3NpdGlvbiBpcyBzdG9yZWQKCUdldFBvc2l0aW9uKHBvc2l0aW9uSWQgdWludDY0KSAoUG9zaXRpb24sIGJvb2wpCgkvLyBTZXRQb3NpdGlvbiBpbnNlcnRzIG9yIHJlcGxhY2VzIGEgcG9zaXRpb24gaW4gc3RvcmFnZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGxlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpbXBsZW1lbnRhdGlvbnMgcmVxdWlyZSBpdCB0byBiZSBjdXJyZW50IGZvciBzdG9yYWdlIHdyaXRlcwoJLy8gICAtIHBvc2l0aW9uSWQ6IHBvc2l0aW9uIE5GVCB0b2tlbiBJRCB1c2VkIGFzIHRoZSBzdG9yYWdlIGtleQoJLy8gICAtIHBvc2l0aW9uOiBjb21wbGV0ZSBwb3NpdGlvbiB2YWx1ZSB0byBwZXJzaXN0CgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IG5pbCB3aGVuIHRoZSBwb3NpdGlvbiB0cmVlIGlzIHVwZGF0ZWQ7IG5vbi1uaWwgd2hlbiB0aGUgcmVhbG0gaXMgc3Bvb2ZlZCwgc3RvcmFnZSBpcyBtaXNzaW5nLCBvciB0aGUgd3JpdGUgZmFpbHMKCVNldFBvc2l0aW9uKF8gaW50LCBybG0gcmVhbG0sIHBvc2l0aW9uSWQgdWludDY0LCBwb3NpdGlvbiBQb3NpdGlvbikgZXJyb3IKCS8vIFJlbW92ZVBvc2l0aW9uIGRlbGV0ZXMgYSBwb3NpdGlvbiBmcm9tIHN0b3JhZ2UuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgaW1wbGVtZW50YXRpb25zIHJlcXVpcmUgaXQgdG8gYmUgY3VycmVudCBmb3Igc3RvcmFnZSB3cml0ZXMKCS8vICAgLSBwb3NpdGlvbklkOiBwb3NpdGlvbiBORlQgdG9rZW4gSUQgdG8gcmVtb3ZlCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IG5pbCB3aGVuIHRoZSBwb3NpdGlvbiB0cmVlIGlzIHVwZGF0ZWQ7IG5vbi1uaWwgd2hlbiB0aGUgcmVhbG0gaXMgc3Bvb2ZlZCwgc3RvcmFnZSBpcyBtaXNzaW5nLCBvciB0aGUgd3JpdGUgZmFpbHMKCVJlbW92ZVBvc2l0aW9uKF8gaW50LCBybG0gcmVhbG0sIHBvc2l0aW9uSWQgdWludDY0KSBlcnJvcgp9ChqDFAoLdXBncmFkZS5nbm8S8xNwYWNrYWdlIHBvc2l0aW9uCgppbXBvcnQgKAoJImduby5sYW5kL3IvZ25vc3dhcC9hY2Nlc3MvdjEiCikKCi8vIFJlZ2lzdGVySW5pdGlhbGl6ZXIgcmVnaXN0ZXJzIGEgbmV3IHBvc2l0aW9uIGltcGxlbWVudGF0aW9uIHZlcnNpb24uCi8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGVhY2ggdmVyc2lvbiAodjEsIHYyLCBldGMuKSBkdXJpbmcgaW5pdGlhbGl6YXRpb24KLy8gdG8gcmVnaXN0ZXIgdGhlaXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGUgcHJveHkgc3lzdGVtLgovLwovLyBUaGUgaW5pdGlhbGl6ZXIgZnVuY3Rpb24gY3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgaW1wbGVtZW50YXRpb24KLy8gdXNpbmcgdGhlIHByb3ZpZGVkIHBvc2l0aW9uU3RvcmUgaW50ZXJmYWNlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0KLy8gICAtIGluaXRpYWxpemVyOiBjYWxsYmFjayB0aGF0IHJlY2VpdmVzIHRoZSBpbXBsZW1lbnRhdGlvbiByZWFsbSBjb250ZXh0IGFuZCBwb3NpdGlvbiBzdG9yZSwgdGhlbiByZXR1cm5zIHRoYXQgdmVyc2lvbidzIElQb3NpdGlvbiBpbXBsZW1lbnRhdGlvbgovLwovLyBTZWN1cml0eTogT25seSBjb250cmFjdHMgd2l0aGluIHRoZSBkb21haW4gcGF0aCBjYW4gcmVnaXN0ZXIgaW5pdGlhbGl6ZXJzLgovLyBFYWNoIHBhY2thZ2UgcGF0aCBjYW4gb25seSByZWdpc3RlciBvbmNlIHRvIHByZXZlbnQgZHVwbGljYXRlIHJlZ2lzdHJhdGlvbnMuCmZ1bmMgUmVnaXN0ZXJJbml0aWFsaXplcihjdXIgcmVhbG0sIGluaXRpYWxpemVyIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSwgcG9zaXRpb25TdG9yZSBJUG9zaXRpb25TdG9yZSkgSVBvc2l0aW9uKSB7Cglpbml0aWFsaXplckZ1bmMgOj0gZnVuYyhfIGludCwgcmxtIHJlYWxtLCBkb21haW5TdG9yZSBhbnkpIGFueSB7CgkJYWNjZXNzLkFzc2VydElzUmxtQ3VycmVudCgwLCBybG0pCgoJCWN1cnJlbnRQb3NpdGlvblN0b3JlLCBvayA6PSBkb21haW5TdG9yZS4oSVBvc2l0aW9uU3RvcmUpCgkJaWYgIW9rIHsKCQkJcGFuaWMoImRvbWFpblN0b3JlIGlzIG5vdCBhbiBJUG9zaXRpb25TdG9yZSIpCgkJfQoKCQlyZXR1cm4gaW5pdGlhbGl6ZXIoMCwgcmxtLCBjdXJyZW50UG9zaXRpb25TdG9yZSkKCX0KCgllcnIgOj0gdmVyc2lvbk1hbmFnZXIuUmVnaXN0ZXJJbml0aWFsaXplcigwLCBjdXIsIGluaXRpYWxpemVyRnVuYykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgllcnIgPSB1cGRhdGVJbXBsZW1lbnRhdGlvbigpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cn0KCi8vIFVwZ3JhZGVJbXBsIHN3aXRjaGVzIHRoZSBhY3RpdmUgcG9zaXRpb24gaW1wbGVtZW50YXRpb24gdG8gYSBkaWZmZXJlbnQgdmVyc2lvbi4KLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3Mgc2VhbWxlc3MgdXBncmFkZXMgZnJvbSBvbmUgdmVyc2lvbiB0byBhbm90aGVyIHdpdGhvdXQKLy8gZGF0YSBtaWdyYXRpb24gb3IgZG93bnRpbWUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IGN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbQovLyAgIC0gcGFja2FnZVBhdGg6IGZ1bGx5IHF1YWxpZmllZCBwYWNrYWdlIHBhdGggb2YgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgcmVwbGFjZW1lbnQgaW1wbGVtZW50YXRpb24KLy8KLy8gU2VjdXJpdHk6IE9ubHkgYWRtaW4gb3IgZ292ZXJuYW5jZSBjYW4gcGVyZm9ybSB1cGdyYWRlcy4KLy8gVGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgdmlhIFJlZ2lzdGVySW5pdGlhbGl6ZXIuCmZ1bmMgVXBncmFkZUltcGwoY3VyIHJlYWxtLCBwYWNrYWdlUGF0aCBzdHJpbmcpIHsKCS8vIEVuc3VyZSBvbmx5IGFkbWluIG9yIGdvdmVybmFuY2UgY2FuIHBlcmZvcm0gdXBncmFkZXMKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWFjY2Vzcy5Bc3NlcnRJc0FkbWluT3JHb3Zlcm5hbmNlKGNhbGxlcikKCgllcnIgOj0gdmVyc2lvbk1hbmFnZXIuQ2hhbmdlSW1wbGVtZW50YXRpb24oMCwgY3VyLCBwYWNrYWdlUGF0aCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgllcnIgPSB1cGRhdGVJbXBsZW1lbnRhdGlvbigpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cn0KCi8vIEdldEltcGxlbWVudGF0aW9uUGFja2FnZVBhdGggcmV0dXJucyB0aGUgcGFja2FnZSBwYXRoIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIGltcGxlbWVudGF0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcGFja2FnZVBhdGg6IHBhY2thZ2UgcGF0aCBvZiB0aGUgYWN0aXZlIGltcGxlbWVudGF0aW9uCmZ1bmMgR2V0SW1wbGVtZW50YXRpb25QYWNrYWdlUGF0aCgpIHN0cmluZyB7CglyZXR1cm4gdmVyc2lvbk1hbmFnZXIuR2V0Q3VycmVudFBhY2thZ2VQYXRoKCkKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwSEQjYiN9VEgo4OTkwOHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAwSc1QTD4tI6os8LnebKOB+i6fWXOKGBf9lRpSI1wrrhEkBBHCJiouh67mwaIldFM3TGzMU4Vg8HC33relzGvOVxyEXpqQN+50lwQnpJwb/FAUr3P1JQz23J+IC8Vb4M2zk+GihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl