Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
A92489E4C845F512188F45E9A11EBCF4C35739E3A219BAB1AFBAD7AFFA1C127B
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
408,188,164
Requested gas limit
GAS USED
340,156,853
Gas consumed
FEE
408189ugnot
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
CvTHEAoML3ZtLm1fYWRkcGtnEuLHEAooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBK0xxAKBnN0YWtlchIZZ25vLmxhbmQvci9nbm9zd2FwL3N0YWtlchrmRwoJUkVBRE1FLm1kEthHIyBTdGFrZXIKCkxpcXVpZGl0eSBtaW5pbmcgYW5kIHJld2FyZCBkaXN0cmlidXRpb24gZm9yIExQIHBvc2l0aW9ucy4KCiMjIE92ZXJ2aWV3CgpTdGFrZXIgbWFuYWdlcyBkaXN0cmlidXRpb24gb2YgaW50ZXJuYWwgKEdOUyBlbWlzc2lvbikgYW5kIGV4dGVybmFsICh1c2VyLXByb3ZpZGVkKSByZXdhcmRzIHRvIHN0YWtlZCBMUCBwb3NpdGlvbnMsIHdpdGggdGltZS13ZWlnaHRlZCByZXdhcmRzIGFuZCB3YXJtdXAgcGVyaW9kcy4KCiMjIEdub3dlYgoKVGhlIHJvb3QgYFJlbmRlcigiIilgIGRlbGVnYXRlcyB0byB0aGUgYWN0aXZlIGltcGxlbWVudGF0aW9uIGFuZCBzaG93cyByZWFsbSBpZGVudGl0eSwgdGhlIGhhbHQgZmxhZywgc3RvcmVkIHJlY29yZCBjb3VudHMsIGN1bXVsYXRpdmUgR05TIGVtaXNzaW9ucywgdGhlIGNhY2hlZCBlbWlzc2lvbiByYXRlLCBpbmNlbnRpdmUgcmVxdWlyZW1lbnRzLCB0aWVyIGFsbG9jYXRpb25zLCB1bnN0YWtpbmcgZmVlcywgYW5kIHdhcm11cCBzdGFnZXMuCgpHTlMgYW1vdW50cyB1c2Ugc2l4LWRlY2ltYWwgYmFzZSB1bml0czsgZXh0ZXJuYWwgcmV3YXJkcyB1c2UgdGhlaXIgdG9rZW4ncyBiYXNlIHVuaXRzLiBXYXJtdXAgZHVyYXRpb25zIGFyZSBwZXItc3RhZ2Ugc2Vjb25kcywgd2l0aCB0aGUgZmluYWwgc3RhZ2Ugc2hvd24gYXMgdW5ib3VuZGVkLiBSZW5kZXJpbmcgcmVhZHMgc3RvcmVkIGNvdW50cyBhbmQgZml4ZWQgY29uZmlndXJhdGlvbiB3aXRob3V0IHRyYXZlcnNpbmcgcG9zaXRpb25zIG9yIGluY2VudGl2ZXMuIFVuc3VwcG9ydGVkIHBhdGhzIHJldHVybiBgNDA0YC4KCiMjIENvbmZpZ3VyYXRpb24KCi0gKipEZXBvc2l0IEdOUyBBbW91bnQqKjogMTAwLDAwMCBHTlMgcGVyIGV4dGVybmFsIGluY2VudGl2ZSAoZGVmYXVsdDsgZ292ZXJuYW5jZS1hZGp1c3RhYmxlKQotICoqTWluaW11bSBSZXdhcmQgQW1vdW50Kio6IDEsMDAwIHRva2VuIHVuaXRzIChkZWZhdWx0IGZvciBleHRlcm5hbCBpbmNlbnRpdmUgY3JlYXRpb24pCi0gKipVbnN0YWtpbmcgRmVlKio6IDElIGRlZmF1bHQgKDEwMCBiYXNpcyBwb2ludHM7IGNvbmZpZ3VyYWJsZSBmcm9tIDAgdG8gMTAlKQotICoqSW50ZXJuYWwgUG9vbCBUaWVycyoqOiAxLCAyLCBvciAzIChhc3NpZ25lZCBwZXIgcG9vbCk7IGV4dGVybmFsLW9ubHkgcG9vbHMgY2FuIGFsc28gYmUgc3Rha2VhYmxlCi0gKipXYXJtdXAgU2NoZWR1bGUqKjogMzAvNTAvNzAvMTAwJSBvdmVyIGRlZmF1bHQgY3VtdWxhdGl2ZSB3aW5kb3dzIG9mIDAtNSwgNS0xNSwgMTUtNDUsIGFuZCA0NSsgZGF5cwotICoqRXh0ZXJuYWwgVG9rZW4gUG9saWN5Kio6IEFwcHJvdmVkIHJld2FyZCB0b2tlbnM7IHBvb2wtcGFpciB0b2tlbnMgYXJlIGFsc28gYWNjZXB0ZWQgZm9yIHRoZWlyIG93biBwb29sIHVubGVzcyBleHBsaWNpdGx5IGRlbmllZAoKIyMgQ29yZSBGZWF0dXJlcwoKIyMjIEludGVybmFsIFJld2FyZHMgKEdOUyBFbWlzc2lvbikKCi0gQWxsb2NhdGVkIHRvIHRpZXJlZCBwb29scyAodGllcnMgMSwgMiwgMykKLSBTcGxpdCBhY3Jvc3MgdGllcnMgYnkgVGllclJhdGlvCi0gRGlzdHJpYnV0ZWQgcHJvcG9ydGlvbmFsbHkgdG8gaW4tcmFuZ2UgbGlxdWlkaXR5Ci0gVW5jbGFpbWVkIHJld2FyZHMgZ28gdG8gY29tbXVuaXR5IHBvb2wKCiMjIyBFeHRlcm5hbCBSZXdhcmRzIChVc2VyIEluY2VudGl2ZXMpCgotIENyZWF0ZWQgZm9yIHNwZWNpZmljIHBvb2xzCi0gQ29uc3RhbnQgcmV3YXJkIHBlciBzZWNvbmQgb3ZlciB0aGUgaW5jZW50aXZlIHdpbmRvdzsgdGhlIHN0b3JlZCByYXRlIGlzIFExMjgtc2NhbGVkIGFzIGAocmV3YXJkQW1vdW50IDw8IDEyOCkgLyBkdXJhdGlvbmAKLSBQcm9wb3J0aW9uYWwgdG8gc3Rha2VkIGxpcXVpZGl0eQotIGBFbmRFeHRlcm5hbEluY2VudGl2ZWAgcmV0dXJucyBvbmx5IHRoZSB1bmNsYWltYWJsZS9yZW1haW5kZXIgcG9ydGlvbiBhbmQgR05TIGRlcG9zaXQgdG8gaXRzIGV4cGxpY2l0IHJlZnVuZCBhZGRyZXNzOyByZXdhcmRzIHN0aWxsIG93ZWQgYnkgbGl2ZSBwb3NpdGlvbnMgcmVtYWluIGNsYWltYWJsZQoKIyMjIFdhcm11cCBQZXJpb2RzCgpFdmVyeSBzdGFrZWQgcG9zaXRpb24gcHJvZ3Jlc3NlcyB0aHJvdWdoIHdhcm11cCBwZXJpb2RzLiBUaGUgZGVmYXVsdCBmaW5pdGUgZHVyYXRpb25zIGFyZSA1LCAxMCwKYW5kIDMwIGRheXMsIGZvbGxvd2VkIGJ5IGEgZmluYWwgYG1hdGguTWF4SW50NjRgIHRpZXI6CgotIDAtNSBkYXlzOiAzMCUgb2YgdGhlIGNhbGN1bGF0ZWQgcmV3YXJkCi0gNS0xNSBkYXlzOiA1MCUgb2YgdGhlIGNhbGN1bGF0ZWQgcmV3YXJkCi0gMTUtNDUgZGF5czogNzAlIG9mIHRoZSBjYWxjdWxhdGVkIHJld2FyZAotIDQ1KyBkYXlzOiAxMDAlIG9mIHRoZSBjYWxjdWxhdGVkIHJld2FyZAoKR292ZXJuYW5jZSBtYXkgY2hhbmdlIHRoZSBmaW5pdGUgZHVyYXRpb25zLiBXYXJtdXAgcmF0aW9zIGFyZSBhcHBsaWVkIGJlZm9yZSB0aGUgc3Rha2luZy1yZXdhcmQgZmVlOgppbnRlcm5hbCBHTlMgcGVuYWx0aWVzIGdvIHRvIHRoZSBjb21tdW5pdHkgcG9vbCwgd2hpbGUgZXh0ZXJuYWwgcGVuYWx0aWVzIGFjY3VtdWxhdGUgb24gdGhlCmluY2VudGl2ZSBhbmQgYXJlIGNvbGxlY3RlZCBzZXBhcmF0ZWx5IHRvIGFuIGV4cGxpY2l0IGFkZHJlc3MgYWZ0ZXIgYEVuZEV4dGVybmFsSW5jZW50aXZlYC4KCiMjIEtleSBGdW5jdGlvbnMKCiMjIyBgU3Rha2VUb2tlbmAKClN0YWtlcyBMUCBwb3NpdGlvbiBORlQgdG8gZWFybiByZXdhcmRzLgoKIyMjIGBVblN0YWtlVG9rZW5gCgpVbnN0YWtlcyBhIHBvc2l0aW9uIGFuZCByZWNvcmRzIGFuIGV4aXQgY2hlY2twb2ludCBmb3IgaXRzIHJld2FyZHMuIEl0IG5laXRoZXIgY2FsY3VsYXRlcyBub3IKcGF5cyB0aGVtOiB3aXRoZHJhd2luZyBtdXN0IG5ldmVyIGRlcGVuZCBvbiB0aGUgcmV3YXJkIHNpZGUuCgojIyMgYENvbGxlY3RSZXdhcmRgCgpDb2xsZWN0cyBhY2N1bXVsYXRlZCByZXdhcmRzLiBUYWtlcyBhIHBvc2l0aW9uIHRoYXQgd2FzIHVuc3Rha2VkIHdpdGhvdXQgY29sbGVjdGluZyBhcyB3ZWxsIGFzIGEKc3Rha2VkIG9uZSwgc28gd2l0aGRyYXdpbmcgaXMgYFVuU3Rha2VUb2tlbmAgcGx1cyBvbmUgY29sbGVjdC4gQSBjb2xsZWN0IG9uIGFuIHVuc3Rha2VkIHBvc2l0aW9uCmlzIHBlcm1pc3Npb25sZXNzLCBzaW5jZSBpdCBjYW4gb25seSBldmVyIHBheSB0aGF0IHBvc2l0aW9uJ3Mgb3duZXIuCgojIyMgYENyZWF0ZUV4dGVybmFsSW5jZW50aXZlYAoKQ3JlYXRlcyBhbiBleHRlcm5hbCByZXdhcmQgcHJvZ3JhbSBmb3IgYSBzcGVjaWZpYyBwb29sLiBBbnkgY2FsbGVyIG1heSBjcmVhdGUgb25lIGFmdGVyIHNhdGlzZnlpbmcKdGhlIHJld2FyZC10b2tlbiBhbGxvd2xpc3QvZGVuaWFsLCBkdXJhdGlvbiwgc3RhcnQtdGltZSwgcmV3YXJkLW1pbmltdW0sIGFuZCBHTlMtZGVwb3NpdCBjaGVja3MuCgojIyMgYEVuZEV4dGVybmFsSW5jZW50aXZlYAoKRW5kcyBhbiBpbmNlbnRpdmUgYWZ0ZXIgaXRzIGVuZCB0aW1lc3RhbXAgYW5kIGZpbmFsaXplcyBpdHMgcmVmdW5kYWJsZSB1bmNsYWltYWJsZS9yZW1haW5kZXIKYW1vdW50LiBUaGUgcmV3YXJkIHRva2VucyBhbmQgR05TIGRlcG9zaXQgYXJlIHNlbnQgdG8gdGhlIGNhbGxlci1zdXBwbGllZCBgcmVmdW5kQWRkcmVzc2A7IG9ubHkKdGhlIGNyZWF0b3Igb3IgYWRtaW4gbWF5IGNhbGwgaXQsIGFuZCBhbiBvdXRzdGFuZGluZyBleGl0IGNoZWNrcG9pbnQgZm9yIHRoYXQgaW5jZW50aXZlIGJsb2NrcyBlbmRpbmcuCgojIyMgYENhbmNlbEV4dGVybmFsSW5jZW50aXZlYAoKUmVtb3ZlcyBhbiBpbmNlbnRpdmUgdGhhdCBoYXMgbm90IHN0YXJ0ZWQgYW5kIHJlZnVuZHMgaXRzIHJld2FyZCB0b2tlbnMgYW5kIEdOUyBkZXBvc2l0IHRvIHRoZQpjcmVhdG9yLiBDYWxsYWJsZSBieSBhZG1pbiwgZ292ZXJuYW5jZSwgb3IgdGhlIGNyZWF0b3I7IHRoZSByZXdhcmQtdG9rZW4gcmVmdW5kIGlzIGNhcHBlZCBieSB0aGUKYmFsYW5jZSBoZWxkIGJ5IHRoZSBzdGFrZXIuCgojIyBSZXdhcmQgQ2FsY3VsYXRpb24gTG9naWMKCiMjIyBUaWVyIFJhdGlvIERpc3RyaWJ1dGlvbgoKRW1pc3Npb24gc3BsaXQgYWNyb3NzIHRpZXJzIGJhc2VkIG9uIGFjdGl2ZSBwb29sczoKCmBgYApJZiBvbmx5IHRpZXIgMSBoYXMgcG9vbHM6ICAgIFsxMDAlLCAwJSwgMCVdCklmIHRpZXJzIDEgJiAzIGhhdmUgcG9vbHM6ICAgWzgwJSwgMCUsIDIwJV0KSWYgdGllcnMgMSAmIDIgaGF2ZSBwb29sczogICBbNzAlLCAzMCUsIDAlXQpJZiBhbGwgdGllcnMgaGF2ZSBwb29sczogICAgIFs1MCUsIDMwJSwgMjAlXQpgYGAKCk1hdGhlbWF0aWNhbCByZXByZXNlbnRhdGlvbjoKCmBgYG1hdGgKVGllclJhdGlvKHQpID0KICBbMTAwLCAwLCAwXSAgaWYgQ291bnQoMikgPSAwIOKIpyBDb3VudCgzKSA9IDAKICBbODAsIDAsIDIwXSAgaWYgQ291bnQoMikgPSAwCiAgWzcwLCAzMCwgMF0gIGlmIENvdW50KDMpID0gMAogIFs1MCwgMzAsIDIwXSBvdGhlcndpc2UKYGBgCgojIyMgUG9vbCBSZXdhcmQgRm9ybXVsYQoKYGBgbWF0aApwb29sUmV3YXJkKHBvb2wpID0gKGVtaXNzaW9uIMOXIFRpZXJSYXRpb1t0aWVyKHBvb2wpXSAvIDEwMCkgLyBDb3VudCh0aWVyKHBvb2wpKQpgYGAKCkhlcmUgYGVtaXNzaW9uYCBpcyB0aGUgYWxyZWFkeS1hbGxvY2F0ZWQgcGVyLXNlY29uZCBHTlMgYW1vdW50IHJldHVybmVkIGJ5IHRoZSBlbWlzc2lvbiBtb2R1bGUKZm9yIGxpcXVpZGl0eSBzdGFrZXJzLiBJdCBpcyBzcGxpdCBieSB0aGUgdGllciBwZXJjZW50YWdlIGFuZCB0aGVuIGRpdmlkZWQgYW1vbmcgcG9vbHMgaW4gdGhhdAp0aWVyOgoKYGBgbWF0aAplbWlzc2lvbiA9IEdldFN0YWtlckVtaXNzaW9uQW1vdW50UGVyU2Vjb25kKCkKYGBgCgojIyMgUG9zaXRpb24gUmV3YXJkIENhbGN1bGF0aW9uCgpUaGUgcmV3YXJkIGZvciBlYWNoIHBvc2l0aW9uIGlzIGNhbGN1bGF0ZWQgdGhyb3VnaDoKCjEuICoqUmVzb2x2ZSB0aGUgcGVyc2lzdGVkL2hhbHZpbmcgcGVyLXNlY29uZCByZXdhcmQgc2NoZWR1bGUqKiAocmVhZC1vbmx5KQoyLiAqKlJldHJpZXZlIHBvc2l0aW9uIHN0YXRlKiogZnJvbSBkZXBvc2l0IHJlY29yZHMgb3IgYW4gZXhpdCBjaGVja3BvaW50CjMuICoqQ2FsY3VsYXRlIGludGVybmFsIHJld2FyZHMqKiBpZiB0aGUgcG9vbCBoYXMgYW4gaW50ZXJuYWwgdGllcgo0LiAqKkNhbGN1bGF0ZSBleHRlcm5hbCByZXdhcmRzKiogZm9yIHRoZSBpbmNlbnRpdmUgSURzCjUuICoqQXBwbHkgd2FybXVwIHJhdGlvcyBhbmQgcGVuYWx0aWVzKiogYmFzZWQgb24gc3Rha2UgZHVyYXRpb24KCkNvbGxlY3Rpb24gbWF5IHNlcGFyYXRlbHkgYWR2YW5jZSByZXdhcmQgY2FjaGVzIGFuZCBwZXJzaXN0IG5ld2x5IGRpc2NvdmVyZWQgaW5jZW50aXZlIElEczsgdGhlCnJlYWQtb25seSBjYWxjdWxhdGlvbiBpdHNlbGYgZG9lcyBub3Qgd3JpdGUgdGhvc2UgY2FjaGVzLgoKTWF0aGVtYXRpY2FsIGZvcm11bGEgZm9yIHRvdGFsIHJld2FyZCByYXRpbzoKCmBgYG1hdGgKVG90YWxSZXdhcmRSYXRpbyhzLGUpID0gzqNbaT0wIHRvIG0tMV0gzpRSYXcozrHhtaIsIM6y4bWiKSDDlyBy4bWiCgp3aGVyZToKICDOseG1oiA9IG1heChzLCBI4bWi4oKL4oKBKQogIM6y4bWiID0gbWluKGUsIEjhtaIpCgrOlFJhdyhhLCBiKSA9IENhbGNSYXcoYikgLSBDYWxjUmF3KGEpCgpDYWxjUmF3KGgpID0KICBMKGgpIC0gVShoKSAgICAgICAgICAgaWYgdGljayhoKSA8IOKEkwogIFUoaCkgLSBMKGgpICAgICAgICAgICBpZiB0aWNrKGgpIOKJpSB1CiAgRyhoKSAtIChMKGgpICsgVShoKSkgIG90aGVyd2lzZQoKd2hlcmU6CiAgTChoKSA9IHRpY2tMb3dlci5PdXRzaWRlQWNjdW11bGF0aW9uKGgpCiAgVShoKSA9IHRpY2tVcHBlci5PdXRzaWRlQWNjdW11bGF0aW9uKGgpCiAgRyhoKSA9IGdsb2JhbFJld2FyZFJhdGlvQWNjdW11bGF0aW9uKGgpCiAg4oSTID0gdGlja0xvd2VyLmlkCiAgdSA9IHRpY2tVcHBlci5pZApgYGAKCkZpbmFsIHBvc2l0aW9uIHJld2FyZDoKCmBgYG1hdGgKZmluYWxSZXdhcmQgPSBUb3RhbFJld2FyZFJhdGlvIMOXIHBvb2xSZXdhcmQgw5cgcG9zaXRpb25MaXF1aWRpdHkKICAgICAgICAgICAgPSDiiKtbcyB0byBlXSAocG9vbFJld2FyZCDDlyBwb3NpdGlvbkxpcXVpZGl0eSkgLyBUb3RhbFN0YWtlZExpcXVpZGl0eShoKSBkaApgYGAKCiMjIyBUaWNrIENyb3NzIEhvb2sKCldoZW4gcHJpY2UgY3Jvc3NlcyBhbiBpbml0aWFsaXplZCB0aWNrIHdpdGggc3Rha2VkIHBvc2l0aW9uczoKCjEuICoqVXBkYXRlcyBzdGFrZWQgbGlxdWlkaXR5KiogLSBBZGp1c3RzIHRvdGFsIHN0YWtlZCBsaXF1aWRpdHkKMi4gKipVcGRhdGVzIHJld2FyZCBhY2N1bXVsYXRpb24qKiAtIFJlY2FsY3VsYXRlcyBgZ2xvYmFsUmV3YXJkUmF0aW9BY2N1bXVsYXRpb25gCjMuICoqTWFuYWdlcyB1bmNsYWltYWJsZSBwZXJpb2RzKiogLSBTdGFydHMvZW5kcyBwZXJpb2RzIHdpdGggbm8gaW4tcmFuZ2UgbGlxdWlkaXR5CjQuICoqVXBkYXRlcyB0aWNrIGFjY3VtdWxhdGlvbioqIC0gQWRqdXN0cyBgQ3VycmVudE91dHNpZGVBY2N1bXVsYXRpb25gCgpUaGUgYGdsb2JhbFJld2FyZFJhdGlvQWNjdW11bGF0aW9uYCB0cmFja3MgdGhlIGludGVncmFsOgoKYGBgbWF0aApnbG9iYWxSZXdhcmRSYXRpb0FjY3VtdWxhdGlvbiA9IOKIqyAxL1RvdGFsU3Rha2VkTGlxdWlkaXR5KGgpIGRoCmBgYAoKVGhpcyBpbnRlZ3JhbCBpcyBvbmx5IGNvbXB1dGVkIHdoZW4gYFRvdGFsU3Rha2VkTGlxdWlkaXR5KGgpIOKJoCAwYCwgZW5hYmxpbmcgcHJlY2lzZSByZXdhcmQgY2FsY3VsYXRpb24gZXZlbiBhcyBsaXF1aWRpdHkgY2hhbmdlcy4KCiMjIyBSZXdhcmQgU3RhdGUgVHJhY2tpbmcKClRoZSBzeXN0ZW0gbWFpbnRhaW5zOgoKLSAqKkdsb2JhbCBhY2N1bXVsYXRpb24qKjogVHJhY2tzIHJld2FyZCByYXRpbyBhY3Jvc3MgYWxsIHBvc2l0aW9ucwotICoqVGljayBhY2N1bXVsYXRpb24qKjogVHJhY2tzIHJld2FyZHMgIm91dHNpZGUiIGVhY2ggdGljawotICoqUG9zaXRpb24gc3RhdGUqKjogSW5kaXZpZHVhbCByZXdhcmQgY2FsY3VsYXRpb24gcGFyYW1ldGVycwoKIyMgQXBwcm92YWwgUmVxdWlyZW1lbnRzCgotIGBTdGFrZVRva2VuYCBtb3ZlcyB0aGUgcG9zaXRpb24gTkZUIHRvIHRoZSBzdGFrZXIgcmVhbG0gdGhyb3VnaAogIGBnbmZ0LlRyYW5zZmVyRnJvbWAsIHNvIHRoZSBjYWxsZXIgbXVzdCBhcHByb3ZlIHRoZSBzdGFrZXIgb24gdGhhdCBORlQgZmlyc3QKICB3aXRoIGBnbmZ0LkFwcHJvdmUoY3Jvc3MoY3VyKSwgc3Rha2VyQWRkcmVzcywgcG9zaXRpb25JZClgLCBvciBncmFudAogIGBnbmZ0LlNldEFwcHJvdmFsRm9yQWxsKGNyb3NzKGN1ciksIHN0YWtlckFkZHJlc3MsIHRydWUpYC4KLSBgQ3JlYXRlRXh0ZXJuYWxJbmNlbnRpdmVgIHB1bGxzIHR3byBhbW91bnRzIGludG8gdGhlIHN0YWtlciByZWFsbTogdGhlIHJld2FyZAogIHRva2VuIGFtb3VudCBhbmQgdGhlIEdOUyBkZXBvc2l0LiBBcHByb3ZlIHRoZSBzdGFrZXIgcmVhbG0gZm9yIGJvdGggdG9rZW4KICBjb250cmFjdHMgYmVmb3JlIGNhbGxpbmcuCi0gYFVuU3Rha2VUb2tlbmAsIHRoZSByZXdhcmQtY29sbGVjdGlvbiBmdW5jdGlvbnMsIGBFbmRFeHRlcm5hbEluY2VudGl2ZWAsIGFuZAogIGBDYW5jZWxFeHRlcm5hbEluY2VudGl2ZWAgcGF5IG91dCB0byB0aGUgY2FsbGVyIG9yIHRvIGEgc3VwcGxpZWQgYWRkcmVzcyBhbmQKICByZXF1aXJlIG5vIGFwcHJvdmFsLgoKYGBgZ28KLy8gQXBwcm92ZSB0aGUgc3Rha2VyIG9uIHRoZSBwb3NpdGlvbiBORlQsIHRoZW4gc3Rha2UKc3Rha2VyQWRkcmVzcyA6PSBhY2Nlc3MuTXVzdEdldEFkZHJlc3MocHJhYmMuUk9MRV9TVEFLRVIuU3RyaW5nKCkpCmduZnQuQXBwcm92ZShjcm9zcyhjdXIpLCBzdGFrZXJBZGRyZXNzLCBncmM3MjEuVG9rZW5JRCgiMTIzIikpClN0YWtlVG9rZW4oY3Jvc3MoY3VyKSwgMTIzLCAiIikKCi8vIEdOUyBwYXlzIGJvdGggdGhlIGV4dGVybmFsIHJld2FyZCBhbmQgdGhlIHJlcXVpcmVkIGRlcG9zaXQKZ25zLkFwcHJvdmUoY3Jvc3MoY3VyKSwgc3Rha2VyQWRkcmVzcywgMV8wMDBfMDAwXzAwMCtHZXREZXBvc2l0R25zQW1vdW50KCkpCmBgYAoKIyMgVXNhZ2UKClRoZSBwcm94eSBmdW5jdGlvbnMgcmVjZWl2ZSBhIHJlYWxtIGFyZ3VtZW50LiBGcm9tIGEgY2FsbGVyIHJlYWxtIHdpdGggYGN1ciByZWFsbWAsIHBhc3MKYGNyb3NzKGN1cilgIGFzIHRoYXQgZmlyc3QgYXJndW1lbnQ6CgpgYGBnbwovLyBTdGFrZSBhbiBleGlzdGluZyBwb3NpdGlvbgpTdGFrZVRva2VuKGNyb3NzKGN1ciksIDEyMywgImcxcmVmZXJyZXIuLi4iKQoKLy8gQ3JlYXRlIGFuIGV4dGVybmFsIGluY2VudGl2ZSAocmV3YXJkQW1vdW50IGlzIGFuIGludDY0IHRva2VuLXVuaXQgYW1vdW50KQpDcmVhdGVFeHRlcm5hbEluY2VudGl2ZSgKICAgIGNyb3NzKGN1ciksCiAgICAiZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3Q6Z25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlM6MzAwMCIsCiAgICAiZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlMiLAogICAgMV8wMDBfMDAwXzAwMCwKICAgIHN0YXJ0VGltZSwKICAgIGVuZFRpbWUsCikKCi8vIENvbGxlY3Qgd2hpbGUgdGhlIHBvc2l0aW9uIGlzIHN0YWtlZApDb2xsZWN0UmV3YXJkKGNyb3NzKGN1ciksIDEyMykKCi8vIFVuc3Rha2U6IHRoaXMgcmV0dXJucyB0aGUgTkZUIGFuZCBjcmVhdGVzIGFuIGV4aXQgY2hlY2twb2ludDsgaXQgZG9lcyBub3QgY29sbGVjdApVblN0YWtlVG9rZW4oY3Jvc3MoY3VyKSwgMTIzKQoKLy8gQ29sbGVjdCB0aGUgY2hlY2twb2ludCwgZWl0aGVyIHBlciBzb3VyY2Ugb3IgYWxsIGF0IG9uY2UKQ29sbGVjdEVtaXNzaW9uUmV3YXJkKGNyb3NzKGN1ciksIDEyMykKQ29sbGVjdEV4dGVybmFsSW5jZW50aXZlUmV3YXJkKGNyb3NzKGN1ciksIDEyMywgaW5jZW50aXZlSWQpCmBgYAoKIyMgU2VjdXJpdHkKCi0gUG9zaXRpb25zIGxvY2tlZCBkdXJpbmcgc3Rha2luZwotIEV4dGVybmFsIGluY2VudGl2ZXMgcmVxdWlyZSBHTlMgZGVwb3NpdAotIFdhcm11cCBwZXJpb2RzIHByZXZlbnQgZ2FtaW5nCi0gVW5jbGFpbWVkIHJld2FyZHMgcHJvcGVybHkgcmVkaXJlY3RlZAotIEhvb2sgaW50ZWdyYXRpb24gZW5zdXJlcyBhY2N1cmF0ZSB0cmFja2luZwoatY0BCgxhY2Nlc3Nvci5nbm8So40BcGFja2FnZSBzdGFrZXIKCmltcG9ydCAoCgkiZXJyb3JzIgoKCSJnbm8ubGFuZC9wL250L2dyYzcyMS92MCIKCSJnbm8ubGFuZC9yL2dub3N3YXAvYWNjZXNzL3YxIgoJImduby5sYW5kL3IvZ25vc3dhcC9lbWlzc2lvbiIKCSJnbm8ubGFuZC9yL2dub3N3YXAvZ25mdCIKCSJnbm8ubGFuZC9yL2dub3N3YXAvcG9vbCIKKQoKdHlwZSBQb29sQWNjZXNzb3IgaW50ZXJmYWNlIHsKCS8vIEV4aXN0c1Bvb2xQYXRoIHJlcG9ydHMgd2hldGhlciBhIHBvb2wgaXMgcmVnaXN0ZXJlZCBhdCBwb29sUGF0aC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBQb29sIHBhdGggd2hvc2UgcmVnaXN0cmF0aW9uIGlzIGNoZWNrZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBib29sOiB0cnVlIHdoZW4gYSBwb29sIGlzIHJlZ2lzdGVyZWQgYXQgcG9vbFBhdGg7IGZhbHNlIG90aGVyd2lzZS4KCUV4aXN0c1Bvb2xQYXRoKHBvb2xQYXRoIHN0cmluZykgYm9vbAoJLy8gR2V0U2xvdDBUaWNrIHJldHVybnMgdGhlIGN1cnJlbnQgc2xvdC0wIHRpY2sgZm9yIGEgcmVnaXN0ZXJlZCBwb29sLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCB3aG9zZSBjdXJyZW50IHRpY2sgaXMgcXVlcmllZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDMyOiBDdXJyZW50IHNpZ25lZCBzbG90LTAgdGljazsgdGhlIGFjY2Vzc29yIHBhbmljcyBpZiB0aGUgdW5kZXJseWluZyBwb29sIHF1ZXJ5IGZhaWxzLgoJR2V0U2xvdDBUaWNrKHBvb2xQYXRoIHN0cmluZykgaW50MzIKCS8vIEdldFNsb3QwU3FydFByaWNlWDk2IHJldHVybnMgYSBwb29sJ3MgY3VycmVudCBROTYtc2NhbGVkIHNxdWFyZS1yb290IHByaWNlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCB3aG9zZSBjdXJyZW50IHNxdWFyZS1yb290IHByaWNlIGlzIHF1ZXJpZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBzdHJpbmc6IERlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIFE5Ni1zY2FsZWQgc3F1YXJlLXJvb3QgcHJpY2U7IHRoZSBhY2Nlc3NvciBwYW5pY3MgaWYgdGhlIHVuZGVybHlpbmcgcXVlcnkgZmFpbHMuCglHZXRTbG90MFNxcnRQcmljZVg5Nihwb29sUGF0aCBzdHJpbmcpIHN0cmluZwoKCS8vIFNldFRpY2tDcm9zc0hvb2sgcmVnaXN0ZXJzIGEgY2FsbGJhY2sgZm9yIHBvb2wgdGljay1jcm9zc2luZyBldmVudHMuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBJbnRlcm5hbCBjYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgYmVmb3JlIHRoZSBob29rIGlzIHJlZ2lzdGVyZWQuCgkvLyAgIC0gaG9vazogQ2FsbGJhY2sgaW52b2tlZCB3aXRoIHRoZSBpbnRlcm5hbCBkaXNjcmltaW5hdG9yLCBjdXJyZW50IHBvb2wgcmVhbG0sIHBvb2wgcGF0aCwgY3Jvc3NlZCB0aWNrIElELCBzd2FwIGRpcmVjdGlvbiAoemVyb0Zvck9uZSksIGFuZCB0aGUgZXZlbnQgdGltZXN0YW1wIGluIFVuaXggc2Vjb25kcy4KCVNldFRpY2tDcm9zc0hvb2soXyBpbnQsIHJsbSByZWFsbSwgaG9vayBmdW5jKF8gaW50LCBybG0gcmVhbG0sIHBvb2xQYXRoIHN0cmluZywgdGlja0lkIGludDMyLCB6ZXJvRm9yT25lIGJvb2wsIHRpbWVzdGFtcCBpbnQ2NCkpCgkvLyBTZXRTd2FwU3RhcnRIb29rIHJlZ2lzdGVycyBhIGNhbGxiYWNrIGludm9rZWQgd2hlbiBhIHBvb2wgc3dhcCBzdGFydHMuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBJbnRlcm5hbCBjYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgYmVmb3JlIHRoZSBob29rIGlzIHJlZ2lzdGVyZWQuCgkvLyAgIC0gaG9vazogQ2FsbGJhY2sgaW52b2tlZCB3aXRoIHRoZSBpbnRlcm5hbCBkaXNjcmltaW5hdG9yLCBjdXJyZW50IHBvb2wgcmVhbG0sIHBvb2wgcGF0aCwgYW5kIHN3YXAtc3RhcnQgdGltZXN0YW1wIGluIFVuaXggc2Vjb25kcy4KCVNldFN3YXBTdGFydEhvb2soXyBpbnQsIHJsbSByZWFsbSwgaG9vayBmdW5jKF8gaW50LCBybG0gcmVhbG0sIHBvb2xQYXRoIHN0cmluZywgdGltZXN0YW1wIGludDY0KSkKCS8vIFNldFN3YXBFbmRIb29rIHJlZ2lzdGVycyBhIGNhbGxiYWNrIGludm9rZWQgd2hlbiBhIHBvb2wgc3dhcCBlbmRzLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogSW50ZXJuYWwgY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMC4KCS8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGJlZm9yZSB0aGUgaG9vayBpcyByZWdpc3RlcmVkLgoJLy8gICAtIGhvb2s6IENhbGxiYWNrIGludm9rZWQgd2l0aCB0aGUgaW50ZXJuYWwgZGlzY3JpbWluYXRvciwgY3VycmVudCBwb29sIHJlYWxtLCBhbmQgcG9vbCBwYXRoOyBpdHMgZXJyb3IgaXMgcHJvcGFnYXRlZCBieSB0aGUgcG9vbCBob29rLgoJU2V0U3dhcEVuZEhvb2soXyBpbnQsIHJsbSByZWFsbSwgaG9vayBmdW5jKF8gaW50LCBybG0gcmVhbG0sIHBvb2xQYXRoIHN0cmluZykgZXJyb3IpCn0KCnR5cGUgcG9vbEFjY2Vzc29yIHN0cnVjdHt9CgovLyBFeGlzdHNQb29sUGF0aCByZXBvcnRzIHdoZXRoZXIgYSBwb29sIGlzIHJlZ2lzdGVyZWQgYXQgcG9vbFBhdGguCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIHdob3NlIHJlZ2lzdHJhdGlvbiBpcyBjaGVja2VkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIGEgcG9vbCBpcyByZWdpc3RlcmVkIGF0IHBvb2xQYXRoOyBmYWxzZSBvdGhlcndpc2UuCmZ1bmMgKHAgKnBvb2xBY2Nlc3NvcikgRXhpc3RzUG9vbFBhdGgocG9vbFBhdGggc3RyaW5nKSBib29sIHsKCXJldHVybiBwb29sLkV4aXN0c1Bvb2xQYXRoKHBvb2xQYXRoKQp9CgovLyBHZXRTbG90MFRpY2sgcmV0dXJucyB0aGUgY3VycmVudCBzbG90LTAgdGljayBmb3IgYSByZWdpc3RlcmVkIHBvb2wuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIHdob3NlIGN1cnJlbnQgdGljayBpcyBxdWVyaWVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50MzI6IEN1cnJlbnQgc2lnbmVkIHNsb3QtMCB0aWNrOyB0aGUgYWNjZXNzb3IgcGFuaWNzIGlmIHRoZSB1bmRlcmx5aW5nIHBvb2wgcXVlcnkgZmFpbHMuCmZ1bmMgKHAgKnBvb2xBY2Nlc3NvcikgR2V0U2xvdDBUaWNrKHBvb2xQYXRoIHN0cmluZykgaW50MzIgewoJdGljaywgZXJyIDo9IHBvb2wuR2V0U2xvdDBUaWNrKHBvb2xQYXRoKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJcmV0dXJuIHRpY2sKfQoKLy8gR2V0U2xvdDBTcXJ0UHJpY2VYOTYgcmV0dXJucyBhIHBvb2wncyBjdXJyZW50IFE5Ni1zY2FsZWQgc3F1YXJlLXJvb3QgcHJpY2UuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIHdob3NlIGN1cnJlbnQgc3F1YXJlLXJvb3QgcHJpY2UgaXMgcXVlcmllZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogRGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgUTk2LXNjYWxlZCBzcXVhcmUtcm9vdCBwcmljZTsgdGhlIGFjY2Vzc29yIHBhbmljcyBpZiB0aGUgdW5kZXJseWluZyBxdWVyeSBmYWlscy4KZnVuYyAocCAqcG9vbEFjY2Vzc29yKSBHZXRTbG90MFNxcnRQcmljZVg5Nihwb29sUGF0aCBzdHJpbmcpIHN0cmluZyB7CglzcXJ0UHJpY2VYOTYsIGVyciA6PSBwb29sLkdldFNsb3QwU3FydFByaWNlWDk2KHBvb2xQYXRoKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJcmV0dXJuIHNxcnRQcmljZVg5Ngp9CgovLyBTZXRUaWNrQ3Jvc3NIb29rIHJlZ2lzdGVycyBhIGNhbGxiYWNrIGZvciBwb29sIHRpY2stY3Jvc3NpbmcgZXZlbnRzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogSW50ZXJuYWwgY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgYmVmb3JlIHRoZSBob29rIGlzIHJlZ2lzdGVyZWQuCi8vICAgLSBob29rOiBDYWxsYmFjayBpbnZva2VkIHdpdGggdGhlIGludGVybmFsIGRpc2NyaW1pbmF0b3IsIGN1cnJlbnQgcG9vbCByZWFsbSwgcG9vbCBwYXRoLCBjcm9zc2VkIHRpY2sgSUQsIHN3YXAgZGlyZWN0aW9uICh6ZXJvRm9yT25lKSwgYW5kIHRoZSBldmVudCB0aW1lc3RhbXAgaW4gVW5peCBzZWNvbmRzLgpmdW5jIChwICpwb29sQWNjZXNzb3IpIFNldFRpY2tDcm9zc0hvb2soXyBpbnQsIHJsbSByZWFsbSwgaG9vayBmdW5jKF8gaW50LCBybG0gcmVhbG0sIHBvb2xQYXRoIHN0cmluZywgdGlja0lkIGludDMyLCB6ZXJvRm9yT25lIGJvb2wsIHRpbWVzdGFtcCBpbnQ2NCkpIHsKCWFjY2Vzcy5Bc3NlcnRJc1JsbUN1cnJlbnQoMCwgcmxtKQoKCXBvb2wuU2V0VGlja0Nyb3NzSG9vayhjcm9zcyhybG0pLCBmdW5jKGN1ciByZWFsbSwgcG9vbFBhdGggc3RyaW5nLCB0aWNrSWQgaW50MzIsIHplcm9Gb3JPbmUgYm9vbCwgdGltZXN0YW1wIGludDY0KSB7CgkJaG9vaygwLCBjdXIsIHBvb2xQYXRoLCB0aWNrSWQsIHplcm9Gb3JPbmUsIHRpbWVzdGFtcCkKCX0pCn0KCi8vIFNldFN3YXBTdGFydEhvb2sgcmVnaXN0ZXJzIGEgY2FsbGJhY2sgaW52b2tlZCB3aGVuIGEgcG9vbCBzd2FwIHN0YXJ0cy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IEludGVybmFsIGNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGJlZm9yZSB0aGUgaG9vayBpcyByZWdpc3RlcmVkLgovLyAgIC0gaG9vazogQ2FsbGJhY2sgaW52b2tlZCB3aXRoIHRoZSBpbnRlcm5hbCBkaXNjcmltaW5hdG9yLCBjdXJyZW50IHBvb2wgcmVhbG0sIHBvb2wgcGF0aCwgYW5kIHN3YXAtc3RhcnQgdGltZXN0YW1wIGluIFVuaXggc2Vjb25kcy4KZnVuYyAocCAqcG9vbEFjY2Vzc29yKSBTZXRTd2FwU3RhcnRIb29rKF8gaW50LCBybG0gcmVhbG0sIGhvb2sgZnVuYyhfIGludCwgcmxtIHJlYWxtLCBwb29sUGF0aCBzdHJpbmcsIHRpbWVzdGFtcCBpbnQ2NCkpIHsKCWFjY2Vzcy5Bc3NlcnRJc1JsbUN1cnJlbnQoMCwgcmxtKQoKCXBvb2wuU2V0U3dhcFN0YXJ0SG9vayhjcm9zcyhybG0pLCBmdW5jKGN1ciByZWFsbSwgcG9vbFBhdGggc3RyaW5nLCB0aW1lc3RhbXAgaW50NjQpIHsKCQlob29rKDAsIGN1ciwgcG9vbFBhdGgsIHRpbWVzdGFtcCkKCX0pCn0KCi8vIFNldFN3YXBFbmRIb29rIHJlZ2lzdGVycyBhIGNhbGxiYWNrIGludm9rZWQgd2hlbiBhIHBvb2wgc3dhcCBlbmRzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogSW50ZXJuYWwgY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgYmVmb3JlIHRoZSBob29rIGlzIHJlZ2lzdGVyZWQuCi8vICAgLSBob29rOiBDYWxsYmFjayBpbnZva2VkIHdpdGggdGhlIGludGVybmFsIGRpc2NyaW1pbmF0b3IsIGN1cnJlbnQgcG9vbCByZWFsbSwgYW5kIHBvb2wgcGF0aDsgaXRzIGVycm9yIGlzIHByb3BhZ2F0ZWQgYnkgdGhlIHBvb2wgaG9vay4KZnVuYyAocCAqcG9vbEFjY2Vzc29yKSBTZXRTd2FwRW5kSG9vayhfIGludCwgcmxtIHJlYWxtLCBob29rIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSwgcG9vbFBhdGggc3RyaW5nKSBlcnJvcikgewoJYWNjZXNzLkFzc2VydElzUmxtQ3VycmVudCgwLCBybG0pCgoJcG9vbC5TZXRTd2FwRW5kSG9vayhjcm9zcyhybG0pLCBmdW5jKGN1ciByZWFsbSwgcG9vbFBhdGggc3RyaW5nKSBlcnJvciB7CgkJcmV0dXJuIGhvb2soMCwgY3VyLCBwb29sUGF0aCkKCX0pCn0KCmZ1bmMgbmV3UG9vbEFjY2Vzc29yKCkgUG9vbEFjY2Vzc29yIHsKCXJldHVybiAmcG9vbEFjY2Vzc29ye30KfQoKdHlwZSBFbWlzc2lvbkFjY2Vzc29yIGludGVyZmFjZSB7CgkvLyBNaW50QW5kRGlzdHJpYnV0ZUducyBtaW50cyBhbmQgZGlzdHJpYnV0ZXMgc2NoZWR1bGVkIEdOUyBlbWlzc2lvbiB0aHJvdWdoIHRoZSBlbWlzc2lvbiByZWFsbS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IEludGVybmFsIGNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBQcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgYmUgY3VycmVudCBiZWZvcmUgY3Jvc3NpbmcgaW50byB0aGUgZW1pc3Npb24gcmVhbG0uCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBpbnQ2NDogR05TIGFtb3VudCBkaXN0cmlidXRlZCBkdXJpbmcgdGhpcyBjYWxsLCBpbmNsdWRpbmcgYW55IGNhcnJpZWQtZm9yd2FyZCBhbW91bnQuCgkvLyAgIC0gYm9vbDogZmFsc2Ugb25seSB3aGVuIGVtaXNzaW9uIGlzIGhhbHRlZDsgdHJ1ZSB3aGVuIHByb2Nlc3NpbmcgY29tcGxldGVzLCBpbmNsdWRpbmcgYSBuby1vcCBjYWxsLgoJTWludEFuZERpc3RyaWJ1dGVHbnMoXyBpbnQsIHJsbSByZWFsbSkgKGludDY0LCBib29sKQoKCS8vIEdldFN0YWtlckVtaXNzaW9uQW1vdW50UGVyU2Vjb25kIHJldHVybnMgdGhlIGN1cnJlbnQgR05TIGVtaXNzaW9uIHJhdGUgYWxsb2NhdGVkIHRvIGxpcXVpZGl0eSBzdGFrZXJzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW50NjQ6IEN1cnJlbnQgc3Rha2VyIGFsbG9jYXRpb24gaW4gR05TIHVuaXRzIHBlciBzZWNvbmQuCgkvLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiB0aGUgZW1pc3Npb24gZGlzdHJpYnV0aW9uIGNvbmZpZ3VyYXRpb24gY2Fubm90IHByb3ZpZGUgYSBzdGFrZXIgcmF0ZTsgbmlsIG90aGVyd2lzZS4KCUdldFN0YWtlckVtaXNzaW9uQW1vdW50UGVyU2Vjb25kKCkgKGludDY0LCBlcnJvcikKCgkvLyBHZXRTdGFrZXJFbWlzc2lvbkFtb3VudFBlclNlY29uZEluUmFuZ2UgcmV0dXJucyBzdGFrZXIgZW1pc3Npb24tcmF0ZSBjaGFuZ2UgcG9pbnRzIG92ZXIgYW4gaW5jbHVzaXZlIHRpbWUgcmFuZ2UuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBzdGFydDogSW5jbHVzaXZlIGxvd2VyIGJvdW5kIGFzIGEgVW5peCB0aW1lc3RhbXAuCgkvLyAgIC0gZW5kOiBJbmNsdXNpdmUgdXBwZXIgYm91bmQgYXMgYSBVbml4IHRpbWVzdGFtcC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIFtdaW50NjQ6IFVuaXggdGltZXN0YW1wcyBhdCB3aGljaCB0aGUgdW5kZXJseWluZyBHTlMgZW1pc3Npb24gcmF0ZSBjaGFuZ2VzLgoJLy8gICAtIFtdaW50NjQ6IFN0YWtlciBlbWlzc2lvbiBhbW91bnRzIGluIEdOUyB1bml0cyBwZXIgc2Vjb25kIGF0IHRoZSBjb3JyZXNwb25kaW5nIHRpbWVzdGFtcHMuCgkvLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiB0aGUgZW1pc3Npb24gZGlzdHJpYnV0aW9uIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZDsgbmlsIHdoZW4gYm90aCBzbGljZXMgYXJlIHByb2R1Y2VkLgoJR2V0U3Rha2VyRW1pc3Npb25BbW91bnRQZXJTZWNvbmRJblJhbmdlKHN0YXJ0LCBlbmQgaW50NjQpIChbXWludDY0LCBbXWludDY0LCBlcnJvcikKCgkvLyBTZXRPbkRpc3RyaWJ1dGlvblBjdENoYW5nZUNhbGxiYWNrIHJlZ2lzdGVycyBhIGNhbGxiYWNrIGZvciBzdGFrZXIgZGlzdHJpYnV0aW9uLXBlcmNlbnRhZ2UgY2hhbmdlcy4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IEludGVybmFsIGNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBQcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgYmUgY3VycmVudCBiZWZvcmUgdGhlIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQuCgkvLyAgIC0gY2FsbGJhY2s6IENhbGxiYWNrIGludm9rZWQgd2l0aCB0aGUgaW50ZXJuYWwgZGlzY3JpbWluYXRvciwgY3VycmVudCBlbWlzc2lvbiByZWFsbSwgYW5kIHRoZSBuZXcgc3Rha2VyIGVtaXNzaW9uIGFtb3VudCBwZXIgc2Vjb25kLgoJU2V0T25EaXN0cmlidXRpb25QY3RDaGFuZ2VDYWxsYmFjayhfIGludCwgcmxtIHJlYWxtLCBjYWxsYmFjayBmdW5jKF8gaW50LCBybG0gcmVhbG0sIGVtaXNzaW9uQW1vdW50UGVyU2Vjb25kIGludDY0KSkKfQoKdHlwZSBlbWlzc2lvbkFjY2Vzc29yIHN0cnVjdHt9CgovLyBNaW50QW5kRGlzdHJpYnV0ZUducyBtaW50cyBhbmQgZGlzdHJpYnV0ZXMgc2NoZWR1bGVkIEdOUyBlbWlzc2lvbiB0aHJvdWdoIHRoZSBlbWlzc2lvbiByZWFsbS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IEludGVybmFsIGNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGJlZm9yZSBjcm9zc2luZyBpbnRvIHRoZSBlbWlzc2lvbiByZWFsbS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBHTlMgYW1vdW50IGRpc3RyaWJ1dGVkIGR1cmluZyB0aGlzIGNhbGwsIGluY2x1ZGluZyBhbnkgY2FycmllZC1mb3J3YXJkIGFtb3VudC4KLy8gICAtIGJvb2w6IGZhbHNlIG9ubHkgd2hlbiBlbWlzc2lvbiBpcyBoYWx0ZWQ7IHRydWUgd2hlbiBwcm9jZXNzaW5nIGNvbXBsZXRlcywgaW5jbHVkaW5nIGEgbm8tb3AgY2FsbC4KZnVuYyAoZSAqZW1pc3Npb25BY2Nlc3NvcikgTWludEFuZERpc3RyaWJ1dGVHbnMoXyBpbnQsIHJsbSByZWFsbSkgKGludDY0LCBib29sKSB7CglhY2Nlc3MuQXNzZXJ0SXNSbG1DdXJyZW50KDAsIHJsbSkKCglyZXR1cm4gZW1pc3Npb24uTWludEFuZERpc3RyaWJ1dGVHbnMoY3Jvc3MocmxtKSkKfQoKLy8gR2V0U3Rha2VyRW1pc3Npb25BbW91bnRQZXJTZWNvbmQgcmV0dXJucyB0aGUgY3VycmVudCBHTlMgZW1pc3Npb24gcmF0ZSBhbGxvY2F0ZWQgdG8gbGlxdWlkaXR5IHN0YWtlcnMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogQ3VycmVudCBzdGFrZXIgYWxsb2NhdGlvbiBpbiBHTlMgdW5pdHMgcGVyIHNlY29uZC4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gdGhlIGVtaXNzaW9uIGRpc3RyaWJ1dGlvbiBjb25maWd1cmF0aW9uIGNhbm5vdCBwcm92aWRlIGEgc3Rha2VyIHJhdGU7IG5pbCBvdGhlcndpc2UuCmZ1bmMgKGUgKmVtaXNzaW9uQWNjZXNzb3IpIEdldFN0YWtlckVtaXNzaW9uQW1vdW50UGVyU2Vjb25kKCkgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGVtaXNzaW9uLkdldFN0YWtlckVtaXNzaW9uQW1vdW50UGVyU2Vjb25kKCkKfQoKLy8gR2V0U3Rha2VyRW1pc3Npb25BbW91bnRQZXJTZWNvbmRJblJhbmdlIHJldHVybnMgc3Rha2VyIGVtaXNzaW9uLXJhdGUgY2hhbmdlIHBvaW50cyBvdmVyIGFuIGluY2x1c2l2ZSB0aW1lIHJhbmdlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gc3RhcnQ6IEluY2x1c2l2ZSBsb3dlciBib3VuZCBhcyBhIFVuaXggdGltZXN0YW1wLgovLyAgIC0gZW5kOiBJbmNsdXNpdmUgdXBwZXIgYm91bmQgYXMgYSBVbml4IHRpbWVzdGFtcC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIFtdaW50NjQ6IFVuaXggdGltZXN0YW1wcyBhdCB3aGljaCB0aGUgdW5kZXJseWluZyBHTlMgZW1pc3Npb24gcmF0ZSBjaGFuZ2VzLgovLyAgIC0gW11pbnQ2NDogU3Rha2VyIGVtaXNzaW9uIGFtb3VudHMgaW4gR05TIHVuaXRzIHBlciBzZWNvbmQgYXQgdGhlIGNvcnJlc3BvbmRpbmcgdGltZXN0YW1wcy4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gdGhlIGVtaXNzaW9uIGRpc3RyaWJ1dGlvbiBjb25maWd1cmF0aW9uIGlzIGludmFsaWQ7IG5pbCB3aGVuIGJvdGggc2xpY2VzIGFyZSBwcm9kdWNlZC4KZnVuYyAoZSAqZW1pc3Npb25BY2Nlc3NvcikgR2V0U3Rha2VyRW1pc3Npb25BbW91bnRQZXJTZWNvbmRJblJhbmdlKHN0YXJ0LCBlbmQgaW50NjQpIChbXWludDY0LCBbXWludDY0LCBlcnJvcikgewoJcmV0dXJuIGVtaXNzaW9uLkdldFN0YWtlckVtaXNzaW9uQW1vdW50UGVyU2Vjb25kSW5SYW5nZShzdGFydCwgZW5kKQp9CgovLyBTZXRPbkRpc3RyaWJ1dGlvblBjdENoYW5nZUNhbGxiYWNrIHJlZ2lzdGVycyBhIGNhbGxiYWNrIGZvciBzdGFrZXIgZGlzdHJpYnV0aW9uLXBlcmNlbnRhZ2UgY2hhbmdlcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IEludGVybmFsIGNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGJlZm9yZSB0aGUgY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZC4KLy8gICAtIGNhbGxiYWNrOiBDYWxsYmFjayBpbnZva2VkIHdpdGggdGhlIGludGVybmFsIGRpc2NyaW1pbmF0b3IsIGN1cnJlbnQgZW1pc3Npb24gcmVhbG0sIGFuZCB0aGUgbmV3IHN0YWtlciBlbWlzc2lvbiBhbW91bnQgcGVyIHNlY29uZC4KZnVuYyAoZSAqZW1pc3Npb25BY2Nlc3NvcikgU2V0T25EaXN0cmlidXRpb25QY3RDaGFuZ2VDYWxsYmFjayhfIGludCwgcmxtIHJlYWxtLCBjYWxsYmFjayBmdW5jKF8gaW50LCBybG0gcmVhbG0sIGVtaXNzaW9uQW1vdW50UGVyU2Vjb25kIGludDY0KSkgewoJYWNjZXNzLkFzc2VydElzUmxtQ3VycmVudCgwLCBybG0pCgoJLy8gV3JhcCB0aGUgY2FsbGVyLXByb3ZpZGVkIGNhbGxiYWNrIGluIGFuIGFkYXB0ZXIgY29uc3RydWN0ZWQgSEVSRSwgaW5zaWRlCgkvLyB0aGUgL3IvZ25vc3dhcC9zdGFrZXIgZG9tYWluIHBhY2thZ2UuIEJ5IGJvcnJvdyBydWxlICMzIHRoZSB3cmFwcGVyCgkvLyBjbG9zdXJlIGlzIG93bmVkIGJ5IC9yL2dub3N3YXAvc3Rha2VyIChpdHMgY29uc3RydWN0aW9uIHJlYWxtKSwgbm90IGJ5IHRoZQoJLy8gdjEgaW1wbGVtZW50YXRpb24gdGhhdCBwYXNzZWQgYGNhbGxiYWNrYCBpbi4gVGhpcyBtaXJyb3JzIHRoZSBzd2FwL3RpY2sKCS8vIGhvb2sgYWNjZXNzb3JzIGFib3ZlIGFuZCBsZXRzIGVtaXNzaW9uIHBlcnNpc3QgdGhlIGNhbGxiYWNrIGludG8gaXRzCgkvLyBwYWNrYWdlLWxldmVsIHZhciB3aXRob3V0IGhpdHRpbmcgImNhbm5vdCBwZXJzaXN0IHJlYWxtIHZhbHVlIiAod2hpY2gKCS8vIGZpcmVkIHdoZW4gYSB2MS1jb25zdHJ1Y3RlZCBjbG9zdXJlIHdhcyBzdG9yZWQgdGhlcmUgZGlyZWN0bHkpLgoJZW1pc3Npb24uU2V0T25EaXN0cmlidXRpb25QY3RDaGFuZ2VDYWxsYmFjayhjcm9zcyhybG0pLCBmdW5jKGN1ciByZWFsbSwgZW1pc3Npb25BbW91bnRQZXJTZWNvbmQgaW50NjQpIHsKCQljYWxsYmFjaygwLCBjdXIsIGVtaXNzaW9uQW1vdW50UGVyU2Vjb25kKQoJfSkKfQoKZnVuYyBuZXdFbWlzc2lvbkFjY2Vzc29yKCkgRW1pc3Npb25BY2Nlc3NvciB7CglyZXR1cm4gJmVtaXNzaW9uQWNjZXNzb3J7fQp9Cgp0eXBlIE5GVEFjY2Vzc29yIGludGVyZmFjZSB7CgkvLyBBcHByb3ZlIGdyYW50cyBhbiBhZGRyZXNzIHBlcm1pc3Npb24gdG8gdHJhbnNmZXIgYSBzcGVjaWZpYyBORlQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBJbnRlcm5hbCBjYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgYmVmb3JlIGNyb3NzaW5nIGludG8gdGhlIE5GVCByZWFsbS4KCS8vICAgLSBhcHByb3ZlZDogQWRkcmVzcyByZWNlaXZpbmcgcGVybWlzc2lvbiBmb3IgdGlkLgoJLy8gICAtIHRpZDogTkZUIHRva2VuIElEIHdob3NlIGFwcHJvdmFsIGlzIGNoYW5nZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnJvcjogTm9uLW5pbCB3aGVuIHRoZSBORlQgcmVhbG0gcmVqZWN0cyB0aGUgYXBwcm92YWwgb3IgdGhlIHJlYWxtIGNvbnRleHQgaXMgc3Bvb2ZlZDsgbmlsIG9uIHN1Y2Nlc3MuCglBcHByb3ZlKF8gaW50LCBybG0gcmVhbG0sIGFwcHJvdmVkIGFkZHJlc3MsIHRpZCBncmM3MjEuVG9rZW5JRCkgZXJyb3IKCgkvLyBNaW50IGNyZWF0ZXMgYW4gTkZUIHdpdGggdGlkIGFuZCB0cmFuc2ZlcnMgaXQgdG8gdG8uCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBJbnRlcm5hbCBjYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgYmVmb3JlIGNyb3NzaW5nIGludG8gdGhlIE5GVCByZWFsbS4KCS8vICAgLSB0bzogQWRkcmVzcyByZWNlaXZpbmcgdGhlIG5ld2x5IG1pbnRlZCBORlQuCgkvLyAgIC0gdGlkOiBUb2tlbiBJRCB0byBtaW50LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZ3JjNzIxLlRva2VuSUQ6IFRoZSBtaW50ZWQgdG9rZW4gSUQsIGVxdWFsIHRvIHRpZC4KCU1pbnQoXyBpbnQsIHJsbSByZWFsbSwgdG8gYWRkcmVzcywgdGlkIGdyYzcyMS5Ub2tlbklEKSBncmM3MjEuVG9rZW5JRAoKCS8vIEJ1cm4gZGVzdHJveXMgYW4gTkZULgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogSW50ZXJuYWwgY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMC4KCS8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGJlZm9yZSBjcm9zc2luZyBpbnRvIHRoZSBORlQgcmVhbG0uCgkvLyAgIC0gdGlkOiBORlQgdG9rZW4gSUQgdG8gYnVybi4KCUJ1cm4oXyBpbnQsIHJsbSByZWFsbSwgdGlkIGdyYzcyMS5Ub2tlbklEKQoKCS8vIFRyYW5zZmVyRnJvbSBtb3ZlcyBhbiBORlQgZnJvbSBpdHMgY3VycmVudCBvd25lciB0byBhbm90aGVyIGFkZHJlc3MuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBJbnRlcm5hbCBjYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgYmVmb3JlIGNyb3NzaW5nIGludG8gdGhlIE5GVCByZWFsbS4KCS8vICAgLSBmcm9tOiBDdXJyZW50IG93bmVyIGFkZHJlc3Mgb2YgdGlkLgoJLy8gICAtIHRvOiBSZWNpcGllbnQgYWRkcmVzcyBmb3IgdGlkLgoJLy8gICAtIHRpZDogTkZUIHRva2VuIElEIHRvIHRyYW5zZmVyLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiB0aGUgTkZUIHJlYWxtIHJlamVjdHMgdGhlIHRyYW5zZmVyIG9yIHRoZSByZWFsbSBjb250ZXh0IGlzIHNwb29mZWQ7IG5pbCBvbiBzdWNjZXNzLgoJVHJhbnNmZXJGcm9tKF8gaW50LCBybG0gcmVhbG0sIGZyb20sIHRvIGFkZHJlc3MsIHRpZCBncmM3MjEuVG9rZW5JRCkgZXJyb3IKCgkvLyBUb3RhbFN1cHBseSByZXR1cm5zIHRoZSBudW1iZXIgb2YgTkZUcyBjdXJyZW50bHkgbWludGVkIGFuZCBub3QgYnVybmVkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW50NjQ6IEN1cnJlbnQgTkZUIGNvbGxlY3Rpb24gc3VwcGx5LgoJVG90YWxTdXBwbHkoKSBpbnQ2NAoKCS8vIEV4aXN0cyByZXBvcnRzIHdoZXRoZXIgYW4gTkZUIHRva2VuIElEIGlzIGN1cnJlbnRseSBtaW50ZWQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSB0aWQ6IE5GVCB0b2tlbiBJRCB0byBsb29rIHVwLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHRpZCBoYXMgYW4gb3duZXIgaW4gdGhlIE5GVCBsZWRnZXI7IGZhbHNlIHdoZW4gaXQgZG9lcyBub3QgZXhpc3QuCglFeGlzdHModGlkIGdyYzcyMS5Ub2tlbklEKSBib29sCgoJLy8gTXVzdE93bmVyT2YgcmV0dXJucyB0aGUgb3duZXIgb2YgYW4gTkZUIGFuZCBwYW5pY3Mgd2hlbiB0aWQgaXMgaW52YWxpZC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHRpZDogTkZUIHRva2VuIElEIHdob3NlIG93bmVyIGlzIHJlcXVpcmVkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYWRkcmVzczogQ3VycmVudCBvd25lciBhZGRyZXNzIG9mIHRpZDsgdGhlIGFjY2Vzc29yIHBhbmljcyBpZiB0aWQgZG9lcyBub3QgZXhpc3QuCglNdXN0T3duZXJPZih0aWQgZ3JjNzIxLlRva2VuSUQpIGFkZHJlc3MKCgkvLyBPd25lck9mIHJldHVybnMgdGhlIG93bmVyIG9mIGFuIE5GVCB3aXRob3V0IHBhbmlja2luZyBvbiBsb29rdXAgZmFpbHVyZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHRpZDogTkZUIHRva2VuIElEIHdob3NlIG93bmVyIGlzIHF1ZXJpZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhZGRyZXNzOiBDdXJyZW50IG93bmVyIGFkZHJlc3MsIG9yIHRoZSB6ZXJvIGFkZHJlc3Mgd2hlbiBsb29rdXAgZmFpbHMuCgkvLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiB0aWQgZG9lcyBub3QgZXhpc3Qgb3IgdGhlIE5GVCByZWFsbSBjYW5ub3QgcmVzb2x2ZSBpdHMgb3duZXIuCglPd25lck9mKHRpZCBncmM3MjEuVG9rZW5JRCkgKGFkZHJlc3MsIGVycm9yKQp9Cgp0eXBlIGduZnRBY2Nlc3NvciBzdHJ1Y3R7fQoKLy8gQXBwcm92ZSBncmFudHMgYW4gYWRkcmVzcyBwZXJtaXNzaW9uIHRvIHRyYW5zZmVyIGEgc3BlY2lmaWMgTkZULgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogSW50ZXJuYWwgY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgYmVmb3JlIGNyb3NzaW5nIGludG8gdGhlIE5GVCByZWFsbS4KLy8gICAtIGFwcHJvdmVkOiBBZGRyZXNzIHJlY2VpdmluZyBwZXJtaXNzaW9uIGZvciB0aWQuCi8vICAgLSB0aWQ6IE5GVCB0b2tlbiBJRCB3aG9zZSBhcHByb3ZhbCBpcyBjaGFuZ2VkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiB0aGUgTkZUIHJlYWxtIHJlamVjdHMgdGhlIGFwcHJvdmFsIG9yIHRoZSByZWFsbSBjb250ZXh0IGlzIHNwb29mZWQ7IG5pbCBvbiBzdWNjZXNzLgpmdW5jIChuICpnbmZ0QWNjZXNzb3IpIEFwcHJvdmUoXyBpbnQsIHJsbSByZWFsbSwgYXBwcm92ZWQgYWRkcmVzcywgdGlkIGdyYzcyMS5Ub2tlbklEKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIGduZnQuQXBwcm92ZShjcm9zcyhybG0pLCBhcHByb3ZlZCwgdGlkKQp9CgovLyBNaW50IGNyZWF0ZXMgYW4gTkZUIHdpdGggdGlkIGFuZCB0cmFuc2ZlcnMgaXQgdG8gdG8uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBJbnRlcm5hbCBjYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwLgovLyAgIC0gcmxtOiBQcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgYmUgY3VycmVudCBiZWZvcmUgY3Jvc3NpbmcgaW50byB0aGUgTkZUIHJlYWxtLgovLyAgIC0gdG86IEFkZHJlc3MgcmVjZWl2aW5nIHRoZSBuZXdseSBtaW50ZWQgTkZULgovLyAgIC0gdGlkOiBUb2tlbiBJRCB0byBtaW50LgovLwovLyBSZXR1cm5zOgovLyAgIC0gZ3JjNzIxLlRva2VuSUQ6IFRoZSBtaW50ZWQgdG9rZW4gSUQsIGVxdWFsIHRvIHRpZC4KZnVuYyAobiAqZ25mdEFjY2Vzc29yKSBNaW50KF8gaW50LCBybG0gcmVhbG0sIHRvIGFkZHJlc3MsIHRpZCBncmM3MjEuVG9rZW5JRCkgZ3JjNzIxLlRva2VuSUQgewoJYWNjZXNzLkFzc2VydElzUmxtQ3VycmVudCgwLCBybG0pCgoJcmV0dXJuIGduZnQuTWludChjcm9zcyhybG0pLCB0bywgdGlkKQp9CgovLyBCdXJuIGRlc3Ryb3lzIGFuIE5GVC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IEludGVybmFsIGNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGJlZm9yZSBjcm9zc2luZyBpbnRvIHRoZSBORlQgcmVhbG0uCi8vICAgLSB0aWQ6IE5GVCB0b2tlbiBJRCB0byBidXJuLgpmdW5jIChuICpnbmZ0QWNjZXNzb3IpIEJ1cm4oXyBpbnQsIHJsbSByZWFsbSwgdGlkIGdyYzcyMS5Ub2tlbklEKSB7CglhY2Nlc3MuQXNzZXJ0SXNSbG1DdXJyZW50KDAsIHJsbSkKCglnbmZ0LkJ1cm4oY3Jvc3MocmxtKSwgdGlkKQp9CgovLyBUcmFuc2ZlckZyb20gbW92ZXMgYW4gTkZUIGZyb20gaXRzIGN1cnJlbnQgb3duZXIgdG8gYW5vdGhlciBhZGRyZXNzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogSW50ZXJuYWwgY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgYmVmb3JlIGNyb3NzaW5nIGludG8gdGhlIE5GVCByZWFsbS4KLy8gICAtIGZyb206IEN1cnJlbnQgb3duZXIgYWRkcmVzcyBvZiB0aWQuCi8vICAgLSB0bzogUmVjaXBpZW50IGFkZHJlc3MgZm9yIHRpZC4KLy8gICAtIHRpZDogTkZUIHRva2VuIElEIHRvIHRyYW5zZmVyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiB0aGUgTkZUIHJlYWxtIHJlamVjdHMgdGhlIHRyYW5zZmVyIG9yIHRoZSByZWFsbSBjb250ZXh0IGlzIHNwb29mZWQ7IG5pbCBvbiBzdWNjZXNzLgpmdW5jIChuICpnbmZ0QWNjZXNzb3IpIFRyYW5zZmVyRnJvbShfIGludCwgcmxtIHJlYWxtLCBmcm9tLCB0byBhZGRyZXNzLCB0aWQgZ3JjNzIxLlRva2VuSUQpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gZ25mdC5UcmFuc2ZlckZyb20oY3Jvc3MocmxtKSwgZnJvbSwgdG8sIHRpZCkKfQoKLy8gVG90YWxTdXBwbHkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIE5GVHMgY3VycmVudGx5IG1pbnRlZCBhbmQgbm90IGJ1cm5lZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBDdXJyZW50IE5GVCBjb2xsZWN0aW9uIHN1cHBseS4KZnVuYyAobiAqZ25mdEFjY2Vzc29yKSBUb3RhbFN1cHBseSgpIGludDY0IHsKCXJldHVybiBnbmZ0LlRvdGFsU3VwcGx5KCkKfQoKLy8gRXhpc3RzIHJlcG9ydHMgd2hldGhlciBhbiBORlQgdG9rZW4gSUQgaXMgY3VycmVudGx5IG1pbnRlZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpZDogTkZUIHRva2VuIElEIHRvIGxvb2sgdXAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIHdoZW4gdGlkIGhhcyBhbiBvd25lciBpbiB0aGUgTkZUIGxlZGdlcjsgZmFsc2Ugd2hlbiBpdCBkb2VzIG5vdCBleGlzdC4KZnVuYyAobiAqZ25mdEFjY2Vzc29yKSBFeGlzdHModGlkIGdyYzcyMS5Ub2tlbklEKSBib29sIHsKCXJldHVybiBnbmZ0LkV4aXN0cyh0aWQpCn0KCi8vIE11c3RPd25lck9mIHJldHVybnMgdGhlIG93bmVyIG9mIGFuIE5GVCBhbmQgcGFuaWNzIHdoZW4gdGlkIGlzIGludmFsaWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aWQ6IE5GVCB0b2tlbiBJRCB3aG9zZSBvd25lciBpcyByZXF1aXJlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFkZHJlc3M6IEN1cnJlbnQgb3duZXIgYWRkcmVzcyBvZiB0aWQ7IHRoZSBhY2Nlc3NvciBwYW5pY3MgaWYgdGlkIGRvZXMgbm90IGV4aXN0LgpmdW5jIChuICpnbmZ0QWNjZXNzb3IpIE11c3RPd25lck9mKHRpZCBncmM3MjEuVG9rZW5JRCkgYWRkcmVzcyB7Cglvd25lciwgZXJyIDo9IGduZnQuT3duZXJPZih0aWQpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIuRXJyb3IoKSkKCX0KCXJldHVybiBvd25lcgp9CgovLyBPd25lck9mIHJldHVybnMgdGhlIG93bmVyIG9mIGFuIE5GVCB3aXRob3V0IHBhbmlja2luZyBvbiBsb29rdXAgZmFpbHVyZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpZDogTkZUIHRva2VuIElEIHdob3NlIG93bmVyIGlzIHF1ZXJpZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhZGRyZXNzOiBDdXJyZW50IG93bmVyIGFkZHJlc3MsIG9yIHRoZSB6ZXJvIGFkZHJlc3Mgd2hlbiBsb29rdXAgZmFpbHMuCi8vICAgLSBlcnJvcjogTm9uLW5pbCB3aGVuIHRpZCBkb2VzIG5vdCBleGlzdCBvciB0aGUgTkZUIHJlYWxtIGNhbm5vdCByZXNvbHZlIGl0cyBvd25lci4KZnVuYyAobiAqZ25mdEFjY2Vzc29yKSBPd25lck9mKHRpZCBncmM3MjEuVG9rZW5JRCkgKGFkZHJlc3MsIGVycm9yKSB7CglyZXR1cm4gZ25mdC5Pd25lck9mKHRpZCkKfQoKZnVuYyBuZXdORlRBY2Nlc3NvcigpIE5GVEFjY2Vzc29yIHsKCXJldHVybiAmZ25mdEFjY2Vzc29ye30KfQoa6AQKC2NvdW50ZXIuZ25vEtgEcGFja2FnZSBzdGFrZXIKCnR5cGUgQ291bnRlciBzdHJ1Y3QgewoJaWQgaW50NjQKfQoKLy8gTmV3Q291bnRlciBjcmVhdGVzIGEgY291bnRlciBpbml0aWFsaXplZCBhdCB6ZXJvLgovLwovLyBSZXR1cm5zOgovLyAgIC0gY291bnRlcjogQ291bnRlciB3aG9zZSBuZXh0IGdlbmVyYXRlZCBpZGVudGlmaWVyIGlzIDEuCmZ1bmMgTmV3Q291bnRlcigpICpDb3VudGVyIHsKCXJldHVybiAmQ291bnRlcnsKCQlpZDogMCwKCX0KfQoKLy8gTmV4dCBpbmNyZW1lbnRzIHRoZSBjb3VudGVyIGFuZCByZXR1cm5zIHRoZSBuZXcgaWRlbnRpZmllci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGlkOiBDb3VudGVyIHZhbHVlIGFmdGVyIGluY3JlbWVudGluZyBieSBvbmUuCmZ1bmMgKGMgKkNvdW50ZXIpIE5leHQoKSBpbnQ2NCB7CgljLmlkKysKCglyZXR1cm4gYy5pZAp9CgovLyBHZXQgcmV0dXJucyB0aGUgY291bnRlcidzIGN1cnJlbnQgaWRlbnRpZmllciB3aXRob3V0IGluY3JlbWVudGluZyBpdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGlkOiBDdXJyZW50IGNvdW50ZXIgdmFsdWUuCmZ1bmMgKGMgKkNvdW50ZXIpIEdldCgpIGludDY0IHsKCXJldHVybiBjLmlkCn0KGrWQAQoLZGVwb3NpdC5nbm8SpJABcGFja2FnZSBzdGFrZXIKCmltcG9ydCAoCgkibWF0aCIKCgl1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKKQoKdHlwZSBEZXBvc2l0IHN0cnVjdCB7Cgl3YXJtdXBzICAgICAgICAgICAgICAgICAgICAgICAgW11XYXJtdXAgICAgICAgICAvLyB3YXJtdXAgaW5mb3JtYXRpb24KCWxpcXVpZGl0eSAgICAgICAgICAgICAgICAgICAgICAqdTI1Ni5VaW50ICAgICAgIC8vIGxpcXVpZGl0eQoJdGFyZ2V0UG9vbFBhdGggICAgICAgICAgICAgICAgIHN0cmluZyAgICAgICAgICAgLy8gc3Rha2VkIHBvc2l0aW9uJ3MgcG9vbCBwYXRoCglvd25lciAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyAgICAgICAgICAvLyBvd25lciBhZGRyZXNzCglzdGFrZVRpbWUgICAgICAgICAgICAgICAgICAgICAgaW50NjQgICAgICAgICAgICAvLyBzdGFrZWQgdGltZQoJaW50ZXJuYWxSZXdhcmRMYXN0Q29sbGVjdFRpbWUgIGludDY0ICAgICAgICAgICAgLy8gbGFzdCBjb2xsZWN0IHRpbWUgZm9yIGludGVybmFsIHJld2FyZAoJY29sbGVjdGVkSW50ZXJuYWxSZXdhcmQgICAgICAgIGludDY0ICAgICAgICAgICAgLy8gY29sbGVjdGVkIGludGVybmFsIHJld2FyZAoJY29sbGVjdGVkRXh0ZXJuYWxSZXdhcmRzICAgICAgIG1hcFtzdHJpbmddaW50NjQgLy8gY29sbGVjdGVkIGV4dGVybmFsIHJld2FyZCBieSBpbmNlbnRpdmUgaWQgKGluY2VudGl2ZUlEIC0+IGludDY0KQoJZXh0ZXJuYWxSZXdhcmRMYXN0Q29sbGVjdFRpbWVzIG1hcFtzdHJpbmddaW50NjQgLy8gbGFzdCBjb2xsZWN0IHRpbWUgZm9yIGV4dGVybmFsIHJld2FyZHMgYnkgaW5jZW50aXZlIGlkIChpbmNlbnRpdmVJRCAtPiBpbnQ2NCkKCWV4dGVybmFsSW5jZW50aXZlSWRzICAgICAgICAgICBtYXBbc3RyaW5nXWJvb2wgIC8vIGV4dGVybmFsIGluY2VudGl2ZSBpZHMgZm9yIHRoaXMgZGVwb3NpdCAoaW5jZW50aXZlSUQgLT4gYm9vbCkKCWxhc3RFeHRlcm5hbEluY2VudGl2ZVVwZGF0ZWRBdCBpbnQ2NCAgICAgICAgICAgIC8vIGxhc3QgdGltZSB3aGVuIGV4dGVybmFsIGluY2VudGl2ZSBpZHMgd2VyZSBzeW5jZWQKCXRpY2tMb3dlciAgICAgICAgICAgICAgICAgICAgICBpbnQzMiAgICAgICAgICAgIC8vIHRpY2sgbG93ZXIKCXRpY2tVcHBlciAgICAgICAgICAgICAgICAgICAgICBpbnQzMiAgICAgICAgICAgIC8vIHRpY2sgdXBwZXIKfQoKLy8gT3duZXIgcmV0dXJucyB0aGUgYWRkcmVzcyB0aGF0IG93bnMgdGhlIHN0YWtlZCBwb3NpdGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIG93bmVyOiBBZGRyZXNzIHJlY29yZGVkIGFzIHRoZSBkZXBvc2l0IG93bmVyLgpmdW5jIChkICpEZXBvc2l0KSBPd25lcigpIGFkZHJlc3MgewoJcmV0dXJuIGQub3duZXIKfQoKLy8gU2V0T3duZXIgdXBkYXRlcyB0aGUgYWRkcmVzcyByZWNvcmRlZCBhcyB0aGUgZGVwb3NpdCBvd25lci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIG93bmVyOiBBZGRyZXNzIHRoYXQgc2hvdWxkIG93biB0aGUgZGVwb3NpdC4KZnVuYyAoZCAqRGVwb3NpdCkgU2V0T3duZXIob3duZXIgYWRkcmVzcykgewoJZC5vd25lciA9IG93bmVyCn0KCi8vIFRhcmdldFBvb2xQYXRoIHJldHVybnMgdGhlIHBvb2wgcGF0aCBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YWtlZCBwb3NpdGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRhcmdldFBvb2xQYXRoOiBQb29sIGlkZW50aWZpZXIgdXNlZCB0byByZXNvbHZlIHRoZSBwb3NpdGlvbidzIHBvb2wuCmZ1bmMgKGQgKkRlcG9zaXQpIFRhcmdldFBvb2xQYXRoKCkgc3RyaW5nIHsKCXJldHVybiBkLnRhcmdldFBvb2xQYXRoCn0KCi8vIFNldFRhcmdldFBvb2xQYXRoIHVwZGF0ZXMgdGhlIHBvb2wgcGF0aCBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YWtlZCBwb3NpdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRhcmdldFBvb2xQYXRoOiBQb29sIGlkZW50aWZpZXIgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGRlcG9zaXQuCmZ1bmMgKGQgKkRlcG9zaXQpIFNldFRhcmdldFBvb2xQYXRoKHRhcmdldFBvb2xQYXRoIHN0cmluZykgewoJZC50YXJnZXRQb29sUGF0aCA9IHRhcmdldFBvb2xQYXRoCn0KCi8vIExpcXVpZGl0eSByZXR1cm5zIHRoZSBMUCBsaXF1aWRpdHkgcmVjb3JkZWQgZm9yIHRoZSBkZXBvc2l0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gbGlxdWlkaXR5OiBMaXF1aWRpdHkgYW1vdW50IHJlcHJlc2VudGVkIGJ5IHRoZSBzdGFrZWQgcG9zaXRpb24uCmZ1bmMgKGQgKkRlcG9zaXQpIExpcXVpZGl0eSgpICp1MjU2LlVpbnQgewoJcmV0dXJuIGQubGlxdWlkaXR5Cn0KCi8vIFNldExpcXVpZGl0eSByZXBsYWNlcyB0aGUgTFAgbGlxdWlkaXR5IHJlY29yZGVkIGZvciB0aGUgZGVwb3NpdC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGxpcXVpZGl0eTogTmV3IGxpcXVpZGl0eSBhbW91bnQ7IHRoZSBzZXR0ZXIgY29waWVzIHRoaXMgdmFsdWUgaW50byB0aGUgZGVwb3NpdC4KZnVuYyAoZCAqRGVwb3NpdCkgU2V0TGlxdWlkaXR5KGxpcXVpZGl0eSAqdTI1Ni5VaW50KSB7CglkLmxpcXVpZGl0eSA9IHUyNTYuWmVybygpLlNldChsaXF1aWRpdHkpCn0KCi8vIFN0YWtlVGltZSByZXR1cm5zIHRoZSBVbml4IHRpbWVzdGFtcCBhdCB3aGljaCB0aGUgcG9zaXRpb24gd2FzIHN0YWtlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0YWtlVGltZTogU3Rha2Ugc3RhcnQgdGltZSBpbiBVbml4IHNlY29uZHMuCmZ1bmMgKGQgKkRlcG9zaXQpIFN0YWtlVGltZSgpIGludDY0IHsKCXJldHVybiBkLnN0YWtlVGltZQp9CgovLyBTZXRTdGFrZVRpbWUgdXBkYXRlcyB0aGUgVW5peCB0aW1lc3RhbXAgYXQgd2hpY2ggdGhlIHBvc2l0aW9uIHdhcyBzdGFrZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzdGFrZVRpbWU6IFN0YWtlIHN0YXJ0IHRpbWUgaW4gVW5peCBzZWNvbmRzLgpmdW5jIChkICpEZXBvc2l0KSBTZXRTdGFrZVRpbWUoc3Rha2VUaW1lIGludDY0KSB7CglkLnN0YWtlVGltZSA9IHN0YWtlVGltZQp9CgovLyBJbnRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZSByZXR1cm5zIHRoZSBpbnRlcm5hbC1yZXdhcmQgY29sbGVjdGlvbiBjdXJzb3IuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZTogTGFzdCBpbnRlcm5hbCByZXdhcmQgY29sbGVjdGlvbiB0aW1lIGluIFVuaXggc2Vjb25kcy4KZnVuYyAoZCAqRGVwb3NpdCkgSW50ZXJuYWxSZXdhcmRMYXN0Q29sbGVjdFRpbWUoKSBpbnQ2NCB7CglyZXR1cm4gZC5pbnRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZQp9CgovLyBTZXRJbnRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZSB1cGRhdGVzIHRoZSBpbnRlcm5hbC1yZXdhcmQgY29sbGVjdGlvbiBjdXJzb3IuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbnRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZTogTmV3IGxhc3QgaW50ZXJuYWwgcmV3YXJkIGNvbGxlY3Rpb24gdGltZSBpbiBVbml4IHNlY29uZHMuCmZ1bmMgKGQgKkRlcG9zaXQpIFNldEludGVybmFsUmV3YXJkTGFzdENvbGxlY3RUaW1lKGludGVybmFsUmV3YXJkTGFzdENvbGxlY3RUaW1lIGludDY0KSB7CglkLmludGVybmFsUmV3YXJkTGFzdENvbGxlY3RUaW1lID0gaW50ZXJuYWxSZXdhcmRMYXN0Q29sbGVjdFRpbWUKfQoKLy8gQ29sbGVjdGVkSW50ZXJuYWxSZXdhcmQgcmV0dXJucyB0aGUgY3VtdWxhdGl2ZSBpbnRlcm5hbCByZXdhcmQgcmVjb3JkZWQgZm9yIHRoZSBkZXBvc2l0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gY29sbGVjdGVkSW50ZXJuYWxSZXdhcmQ6IEFjY3VtdWxhdGVkIGludGVybmFsIHJld2FyZCBhbW91bnQgaW4gdGhlIHJld2FyZCB0b2tlbidzIHNtYWxsZXN0IHVuaXRzLgpmdW5jIChkICpEZXBvc2l0KSBDb2xsZWN0ZWRJbnRlcm5hbFJld2FyZCgpIGludDY0IHsKCXJldHVybiBkLmNvbGxlY3RlZEludGVybmFsUmV3YXJkCn0KCi8vIFNldENvbGxlY3RlZEludGVybmFsUmV3YXJkIHJlcGxhY2VzIHRoZSBjdW11bGF0aXZlIGludGVybmFsIHJld2FyZCByZWNvcmRlZCBmb3IgdGhlIGRlcG9zaXQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjb2xsZWN0ZWRJbnRlcm5hbFJld2FyZDogQ3VtdWxhdGl2ZSBpbnRlcm5hbCByZXdhcmQgYW1vdW50IGluIHRoZSByZXdhcmQgdG9rZW4ncyBzbWFsbGVzdCB1bml0cy4KZnVuYyAoZCAqRGVwb3NpdCkgU2V0Q29sbGVjdGVkSW50ZXJuYWxSZXdhcmQoY29sbGVjdGVkSW50ZXJuYWxSZXdhcmQgaW50NjQpIHsKCWQuY29sbGVjdGVkSW50ZXJuYWxSZXdhcmQgPSBjb2xsZWN0ZWRJbnRlcm5hbFJld2FyZAp9CgovLyBDb2xsZWN0ZWRFeHRlcm5hbFJld2FyZHMgcmV0dXJucyBjdW11bGF0aXZlIGV4dGVybmFsIHJld2FyZHMga2V5ZWQgYnkgaW5jZW50aXZlIElELgovLwovLyBSZXR1cm5zOgovLyAgIC0gY29sbGVjdGVkRXh0ZXJuYWxSZXdhcmRzOiBNYXAgZnJvbSBpbmNlbnRpdmUgSUQgdG8gdGhlIGFtb3VudCBjb2xsZWN0ZWQgZm9yIHRoYXQgaW5jZW50aXZlLgpmdW5jIChkICpEZXBvc2l0KSBDb2xsZWN0ZWRFeHRlcm5hbFJld2FyZHMoKSBtYXBbc3RyaW5nXWludDY0IHsKCXJldHVybiBkLmNvbGxlY3RlZEV4dGVybmFsUmV3YXJkcwp9CgovLyBTZXRDb2xsZWN0ZWRFeHRlcm5hbFJld2FyZHMgcmVwbGFjZXMgdGhlIGN1bXVsYXRpdmUgZXh0ZXJuYWwtcmV3YXJkIG1hcC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGNvbGxlY3RlZEV4dGVybmFsUmV3YXJkczogTWFwIGZyb20gaW5jZW50aXZlIElEIHRvIGl0cyBjb2xsZWN0ZWQgcmV3YXJkIGFtb3VudC4KZnVuYyAoZCAqRGVwb3NpdCkgU2V0Q29sbGVjdGVkRXh0ZXJuYWxSZXdhcmRzKGNvbGxlY3RlZEV4dGVybmFsUmV3YXJkcyBtYXBbc3RyaW5nXWludDY0KSB7CglkLmNvbGxlY3RlZEV4dGVybmFsUmV3YXJkcyA9IGNvbGxlY3RlZEV4dGVybmFsUmV3YXJkcwp9CgovLyBHZXRDb2xsZWN0ZWRFeHRlcm5hbFJld2FyZCByZXR1cm5zIHRoZSBjb2xsZWN0ZWQgZXh0ZXJuYWwgcmV3YXJkIGZvciB0aGUgZ2l2ZW4gaW5jZW50aXZlIElELgovLyBSZXR1cm5zIDAgaWYgdGhlIGluY2VudGl2ZSBJRCBkb2VzIG5vdCBleGlzdC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGluY2VudGl2ZUlEOiBFeHRlcm5hbCBpbmNlbnRpdmUgSUQgd2hvc2UgY29sbGVjdGVkIGFtb3VudCBzaG91bGQgYmUgbG9va2VkIHVwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcmV3YXJkOiBDb2xsZWN0ZWQgYW1vdW50IGZvciB0aGUgaW5jZW50aXZlLCBvciAwIHdoZW4gdGhlIElEIGlzIGFic2VudC4KLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIHRoZSBtYXAgY29udGFpbnMgaW5jZW50aXZlSUQ7IGZhbHNlIHdoZW4gaXQgaXMgYWJzZW50LgpmdW5jIChkICpEZXBvc2l0KSBHZXRDb2xsZWN0ZWRFeHRlcm5hbFJld2FyZChpbmNlbnRpdmVJRCBzdHJpbmcpIChpbnQ2NCwgYm9vbCkgewoJcmV3YXJkLCBleGlzdHMgOj0gZC5jb2xsZWN0ZWRFeHRlcm5hbFJld2FyZHNbaW5jZW50aXZlSURdCglpZiAhZXhpc3RzIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCglyZXR1cm4gcmV3YXJkLCB0cnVlCn0KCi8vIFNldENvbGxlY3RlZEV4dGVybmFsUmV3YXJkIHJlY29yZHMgdGhlIGN1bXVsYXRpdmUgYW1vdW50IGNvbGxlY3RlZCBmb3Igb25lIGluY2VudGl2ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGluY2VudGl2ZUlEOiBFeHRlcm5hbCBpbmNlbnRpdmUgSUQgd2hvc2UgY29sbGVjdGVkIGFtb3VudCBzaG91bGQgYmUgc2V0LgovLyAgIC0gcmV3YXJkOiBDdW11bGF0aXZlIGNvbGxlY3RlZCBhbW91bnQgZm9yIGluY2VudGl2ZUlELgpmdW5jIChkICpEZXBvc2l0KSBTZXRDb2xsZWN0ZWRFeHRlcm5hbFJld2FyZChpbmNlbnRpdmVJRCBzdHJpbmcsIHJld2FyZCBpbnQ2NCkgewoJaWYgZC5jb2xsZWN0ZWRFeHRlcm5hbFJld2FyZHMgPT0gbmlsIHsKCQlkLmNvbGxlY3RlZEV4dGVybmFsUmV3YXJkcyA9IG1ha2UobWFwW3N0cmluZ11pbnQ2NCkKCX0KCglkLmNvbGxlY3RlZEV4dGVybmFsUmV3YXJkc1tpbmNlbnRpdmVJRF0gPSByZXdhcmQKfQoKLy8gRXh0ZXJuYWxSZXdhcmRMYXN0Q29sbGVjdFRpbWVzIHJldHVybnMgcGVyLWluY2VudGl2ZSBleHRlcm5hbCBjb2xsZWN0aW9uIGN1cnNvcnMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBleHRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZXM6IE1hcCBmcm9tIGluY2VudGl2ZSBJRCB0byBpdHMgbGFzdCBjb2xsZWN0aW9uIHRpbWUgaW4gVW5peCBzZWNvbmRzLgpmdW5jIChkICpEZXBvc2l0KSBFeHRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZXMoKSBtYXBbc3RyaW5nXWludDY0IHsKCXJldHVybiBkLmV4dGVybmFsUmV3YXJkTGFzdENvbGxlY3RUaW1lcwp9CgovLyBTZXRFeHRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZXMgcmVwbGFjZXMgdGhlIHBlci1pbmNlbnRpdmUgZXh0ZXJuYWwgY29sbGVjdGlvbiBjdXJzb3JzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZXh0ZXJuYWxSZXdhcmRMYXN0Q29sbGVjdFRpbWVzOiBNYXAgZnJvbSBpbmNlbnRpdmUgSUQgdG8gaXRzIGxhc3QgY29sbGVjdGlvbiB0aW1lIGluIFVuaXggc2Vjb25kcy4KZnVuYyAoZCAqRGVwb3NpdCkgU2V0RXh0ZXJuYWxSZXdhcmRMYXN0Q29sbGVjdFRpbWVzKGV4dGVybmFsUmV3YXJkTGFzdENvbGxlY3RUaW1lcyBtYXBbc3RyaW5nXWludDY0KSB7CglkLmV4dGVybmFsUmV3YXJkTGFzdENvbGxlY3RUaW1lcyA9IGV4dGVybmFsUmV3YXJkTGFzdENvbGxlY3RUaW1lcwp9CgovLyBHZXRFeHRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZSByZXR1cm5zIHRoZSBsYXN0IGNvbGxlY3QgdGltZSBmb3IgdGhlIGdpdmVuIGluY2VudGl2ZSBJRC4KLy8gUmV0dXJucyAwIGlmIHRoZSBpbmNlbnRpdmUgSUQgZG9lcyBub3QgZXhpc3QuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbmNlbnRpdmVJRDogRXh0ZXJuYWwgaW5jZW50aXZlIElEIHdob3NlIGNvbGxlY3Rpb24gY3Vyc29yIHNob3VsZCBiZSBsb29rZWQgdXAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aW1lOiBMYXN0IGNvbGxlY3Rpb24gdGltZSBmb3IgdGhlIGluY2VudGl2ZSBpbiBVbml4IHNlY29uZHMsIG9yIDAgd2hlbiB0aGUgSUQgaXMgYWJzZW50LgovLyAgIC0gZXhpc3RzOiBUcnVlIHdoZW4gdGhlIG1hcCBjb250YWlucyBpbmNlbnRpdmVJRDsgZmFsc2Ugd2hlbiBpdCBpcyBhYnNlbnQuCmZ1bmMgKGQgKkRlcG9zaXQpIEdldEV4dGVybmFsUmV3YXJkTGFzdENvbGxlY3RUaW1lKGluY2VudGl2ZUlEIHN0cmluZykgKGludDY0LCBib29sKSB7Cgl0aW1lLCBleGlzdHMgOj0gZC5leHRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZXNbaW5jZW50aXZlSURdCglpZiAhZXhpc3RzIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCglyZXR1cm4gdGltZSwgdHJ1ZQp9CgovLyBTZXRFeHRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZSByZWNvcmRzIHRoZSBjb2xsZWN0aW9uIGN1cnNvciBmb3Igb25lIGluY2VudGl2ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGluY2VudGl2ZUlEOiBFeHRlcm5hbCBpbmNlbnRpdmUgSUQgd2hvc2UgY3Vyc29yIHNob3VsZCBiZSBzZXQuCi8vICAgLSBjdXJyZW50VGltZTogTmV3IGNvbGxlY3Rpb24gdGltZSBmb3IgaW5jZW50aXZlSUQgaW4gVW5peCBzZWNvbmRzLgpmdW5jIChkICpEZXBvc2l0KSBTZXRFeHRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZShpbmNlbnRpdmVJRCBzdHJpbmcsIGN1cnJlbnRUaW1lIGludDY0KSB7CglpZiBkLmV4dGVybmFsUmV3YXJkTGFzdENvbGxlY3RUaW1lcyA9PSBuaWwgewoJCWQuZXh0ZXJuYWxSZXdhcmRMYXN0Q29sbGVjdFRpbWVzID0gbWFrZShtYXBbc3RyaW5nXWludDY0KQoJfQoKCWQuZXh0ZXJuYWxSZXdhcmRMYXN0Q29sbGVjdFRpbWVzW2luY2VudGl2ZUlEXSA9IGN1cnJlbnRUaW1lCn0KCi8vIFRpY2tMb3dlciByZXR1cm5zIHRoZSBsb3dlciBzaWduZWQgdGljayBib3VuZGFyeSBvZiB0aGUgc3Rha2VkIHBvc2l0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdGlja0xvd2VyOiBMb3dlciB0aWNrIGJvdW5kYXJ5IHVzZWQgYnkgdGhlIHBvc2l0aW9uJ3MgcHJpY2UgcmFuZ2UuCmZ1bmMgKGQgKkRlcG9zaXQpIFRpY2tMb3dlcigpIGludDMyIHsKCXJldHVybiBkLnRpY2tMb3dlcgp9CgovLyBTZXRUaWNrTG93ZXIgdXBkYXRlcyB0aGUgbG93ZXIgc2lnbmVkIHRpY2sgYm91bmRhcnkgb2YgdGhlIHN0YWtlZCBwb3NpdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpY2tMb3dlcjogTG93ZXIgdGljayBib3VuZGFyeSB0byBzdG9yZSBmb3IgdGhlIHBvc2l0aW9uJ3MgcHJpY2UgcmFuZ2UuCmZ1bmMgKGQgKkRlcG9zaXQpIFNldFRpY2tMb3dlcih0aWNrTG93ZXIgaW50MzIpIHsKCWQudGlja0xvd2VyID0gdGlja0xvd2VyCn0KCi8vIFRpY2tVcHBlciByZXR1cm5zIHRoZSB1cHBlciBzaWduZWQgdGljayBib3VuZGFyeSBvZiB0aGUgc3Rha2VkIHBvc2l0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdGlja1VwcGVyOiBVcHBlciB0aWNrIGJvdW5kYXJ5IHVzZWQgYnkgdGhlIHBvc2l0aW9uJ3MgcHJpY2UgcmFuZ2UuCmZ1bmMgKGQgKkRlcG9zaXQpIFRpY2tVcHBlcigpIGludDMyIHsKCXJldHVybiBkLnRpY2tVcHBlcgp9CgovLyBTZXRUaWNrVXBwZXIgdXBkYXRlcyB0aGUgdXBwZXIgc2lnbmVkIHRpY2sgYm91bmRhcnkgb2YgdGhlIHN0YWtlZCBwb3NpdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpY2tVcHBlcjogVXBwZXIgdGljayBib3VuZGFyeSB0byBzdG9yZSBmb3IgdGhlIHBvc2l0aW9uJ3MgcHJpY2UgcmFuZ2UuCmZ1bmMgKGQgKkRlcG9zaXQpIFNldFRpY2tVcHBlcih0aWNrVXBwZXIgaW50MzIpIHsKCWQudGlja1VwcGVyID0gdGlja1VwcGVyCn0KCi8vIEV4dGVybmFsSW5jZW50aXZlSWRzIHJldHVybnMgdGhlIGRlcG9zaXQncyBpbmRleGVkIGV4dGVybmFsIGluY2VudGl2ZSBJRHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBleHRlcm5hbEluY2VudGl2ZUlkczogTWFwIGZyb20gZWFjaCBpbmRleGVkIGluY2VudGl2ZSBJRCB0byBpdHMgbWVtYmVyc2hpcCBmbGFnLgpmdW5jIChkICpEZXBvc2l0KSBFeHRlcm5hbEluY2VudGl2ZUlkcygpIG1hcFtzdHJpbmddYm9vbCB7CglyZXR1cm4gZC5leHRlcm5hbEluY2VudGl2ZUlkcwp9CgovLyBTZXRFeHRlcm5hbEluY2VudGl2ZUlkcyByZXBsYWNlcyB0aGUgZGVwb3NpdCdzIGluZGV4ZWQgZXh0ZXJuYWwgaW5jZW50aXZlIElEcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGV4dGVybmFsSW5jZW50aXZlSWRzOiBNYXAgb2YgaW5jZW50aXZlIElEcyB0byB0aGVpciBtZW1iZXJzaGlwIGZsYWdzLgpmdW5jIChkICpEZXBvc2l0KSBTZXRFeHRlcm5hbEluY2VudGl2ZUlkcyhleHRlcm5hbEluY2VudGl2ZUlkcyBtYXBbc3RyaW5nXWJvb2wpIHsKCWQuZXh0ZXJuYWxJbmNlbnRpdmVJZHMgPSBleHRlcm5hbEluY2VudGl2ZUlkcwp9CgovLyBBZGRFeHRlcm5hbEluY2VudGl2ZUlkIGFkZHMgYW4gZXh0ZXJuYWwgaW5jZW50aXZlIGlkIHRvIHRoZSBkZXBvc2l0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW5jZW50aXZlSWQ6IEV4dGVybmFsIGluY2VudGl2ZSBJRCB0byBhZGQgdG8gdGhlIGRlcG9zaXQncyBpbmRleC4KZnVuYyAoZCAqRGVwb3NpdCkgQWRkRXh0ZXJuYWxJbmNlbnRpdmVJZChpbmNlbnRpdmVJZCBzdHJpbmcpIHsKCWlmIGQuZXh0ZXJuYWxJbmNlbnRpdmVJZHMgPT0gbmlsIHsKCQlkLmV4dGVybmFsSW5jZW50aXZlSWRzID0gbWFrZShtYXBbc3RyaW5nXWJvb2wpCgl9CgoJZC5leHRlcm5hbEluY2VudGl2ZUlkc1tpbmNlbnRpdmVJZF0gPSB0cnVlCn0KCi8vIEhhc0V4dGVybmFsSW5jZW50aXZlSWQgY2hlY2tzIGlmIHRoZSBkZXBvc2l0IGhhcyB0aGUgZ2l2ZW4gZXh0ZXJuYWwgaW5jZW50aXZlIGlkLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW5jZW50aXZlSWQ6IEV4dGVybmFsIGluY2VudGl2ZSBJRCB3aG9zZSBtZW1iZXJzaGlwIHNob3VsZCBiZSBjaGVja2VkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaGFzSW5jZW50aXZlOiBUcnVlIHdoZW4gaW5jZW50aXZlSWQgaXMgaW5kZXhlZCBvbiB0aGUgZGVwb3NpdDsgZmFsc2Ugb3RoZXJ3aXNlLgpmdW5jIChkICpEZXBvc2l0KSBIYXNFeHRlcm5hbEluY2VudGl2ZUlkKGluY2VudGl2ZUlkIHN0cmluZykgYm9vbCB7CglpZiBkLmV4dGVybmFsSW5jZW50aXZlSWRzID09IG5pbCB7CgkJcmV0dXJuIGZhbHNlCgl9CgoJcmV0dXJuIGQuZXh0ZXJuYWxJbmNlbnRpdmVJZHNbaW5jZW50aXZlSWRdCn0KCi8vIFJlbW92ZUV4dGVybmFsSW5jZW50aXZlSWQgcmVtb3ZlcyBhbiBleHRlcm5hbCBpbmNlbnRpdmUgaWQgZnJvbSB0aGUgZGVwb3NpdC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGluY2VudGl2ZUlkOiBFeHRlcm5hbCBpbmNlbnRpdmUgSUQgdG8gcmVtb3ZlIGZyb20gdGhlIGRlcG9zaXQncyBpbmRleC4KZnVuYyAoZCAqRGVwb3NpdCkgUmVtb3ZlRXh0ZXJuYWxJbmNlbnRpdmVJZChpbmNlbnRpdmVJZCBzdHJpbmcpIHsKCWlmIGQuZXh0ZXJuYWxJbmNlbnRpdmVJZHMgPT0gbmlsIHsKCQlyZXR1cm4KCX0KCglkZWxldGUoZC5leHRlcm5hbEluY2VudGl2ZUlkcywgaW5jZW50aXZlSWQpCn0KCi8vIEdldEV4dGVybmFsSW5jZW50aXZlSWRMaXN0IHJldHVybnMgYSBsaXN0IG9mIGV4dGVybmFsIGluY2VudGl2ZSBpZHMgZm9yIHRoZSBkZXBvc2l0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW5jZW50aXZlSWRzOiBTbGljZSBjb250YWluaW5nIHRoZSBpbmNlbnRpdmUgSURzIGN1cnJlbnRseSBpbmRleGVkIG9uIHRoZSBkZXBvc2l0OyBvcmRlciBmb2xsb3dzIG1hcCBpdGVyYXRpb24gYW5kIGlzIG5vdCBndWFyYW50ZWVkLgpmdW5jIChkICpEZXBvc2l0KSBHZXRFeHRlcm5hbEluY2VudGl2ZUlkTGlzdCgpIFtdc3RyaW5nIHsKCWlmIGQuZXh0ZXJuYWxJbmNlbnRpdmVJZHMgPT0gbmlsIHsKCQlyZXR1cm4gW11zdHJpbmd7fQoJfQoKCWlkcyA6PSBtYWtlKFtdc3RyaW5nLCAwLCBsZW4oZC5leHRlcm5hbEluY2VudGl2ZUlkcykpCgoJZm9yIGluY2VudGl2ZUlkIDo9IHJhbmdlIGQuZXh0ZXJuYWxJbmNlbnRpdmVJZHMgewoJCWlkcyA9IGFwcGVuZChpZHMsIGluY2VudGl2ZUlkKQoJfQoKCXJldHVybiBpZHMKfQoKLy8gSXRlcmF0ZUV4dGVybmFsSW5jZW50aXZlSWRzIGl0ZXJhdGVzIG92ZXIgZXh0ZXJuYWwgaW5jZW50aXZlIElEcyB3aXRob3V0IGFsbG9jYXRpbmcgYSBzbGljZS4KLy8gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHJlY2VpdmVzIGVhY2ggaW5jZW50aXZlIElEIGFuZCBzaG91bGQgcmV0dXJuIGZhbHNlIHRvIGNvbnRpbnVlIGl0ZXJhdGlvbiwKLy8gb3IgdHJ1ZSB0byBzdG9wIGVhcmx5LiBUaGlzIG1ldGhvZCBpcyBtb3JlIG1lbW9yeS1lZmZpY2llbnQgdGhhbiBHZXRFeHRlcm5hbEluY2VudGl2ZUlkTGlzdAovLyBmb3IgY2FzZXMgd2hlcmUgeW91IG9ubHkgbmVlZCB0byBwcm9jZXNzIElEcyBzZXF1ZW50aWFsbHkuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBmbjogQ2FsbGJhY2sgaW52b2tlZCB3aXRoIGVhY2ggaW5kZXhlZCBpbmNlbnRpdmUgSUQ7IHJldHVybiB0cnVlIHRvIHN0b3AgaXRlcmF0aW9uIGVhcmx5IG9yIGZhbHNlIHRvIGNvbnRpbnVlLgpmdW5jIChkICpEZXBvc2l0KSBJdGVyYXRlRXh0ZXJuYWxJbmNlbnRpdmVJZHMoZm4gZnVuYyhpbmNlbnRpdmVJZCBzdHJpbmcpIGJvb2wpIHsKCWlmIGQuZXh0ZXJuYWxJbmNlbnRpdmVJZHMgPT0gbmlsIHsKCQlyZXR1cm4KCX0KCglmb3IgaW5jZW50aXZlSWQgOj0gcmFuZ2UgZC5leHRlcm5hbEluY2VudGl2ZUlkcyB7CgkJaWYgZm4oaW5jZW50aXZlSWQpIHsKCQkJcmV0dXJuCgkJfQoJfQp9CgovLyBXYXJtdXBzIHJldHVybnMgYSBjb3B5IG9mIHRoZSBkZXBvc2l0J3Mgd2FybXVwIHNjaGVkdWxlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gd2FybXVwczogV2FybXVwIHRpZXJzIGFwcGxpZWQgdG8gcmV3YXJkcyBmb3IgdGhpcyBkZXBvc2l0LCBvciBuaWwgd2hlbiBubyBzY2hlZHVsZSBpcyBzdG9yZWQuCmZ1bmMgKGQgKkRlcG9zaXQpIFdhcm11cHMoKSBbXVdhcm11cCB7CglyZXR1cm4gY2xvbmVXYXJtdXBzKGQud2FybXVwcykKfQoKLy8gU2V0V2FybXVwcyByZXBsYWNlcyB0aGUgZGVwb3NpdCdzIHdhcm11cCBzY2hlZHVsZSB3aXRoIGEgY29waWVkIHNsaWNlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gd2FybXVwczogV2FybXVwIHRpZXJzIHRvIHVzZSBmb3Igc3Vic2VxdWVudCByZXdhcmQgY2FsY3VsYXRpb25zLgpmdW5jIChkICpEZXBvc2l0KSBTZXRXYXJtdXBzKHdhcm11cHMgW11XYXJtdXApIHsKCWQud2FybXVwcyA9IGNsb25lV2FybXVwcyh3YXJtdXBzKQp9CgovLyBMYXN0RXh0ZXJuYWxJbmNlbnRpdmVVcGRhdGVkQXQgcmV0dXJucyB0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGV4dGVybmFsLWluY2VudGl2ZSBpbmRleCByZWZyZXNoLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdGltZXN0YW1wOiBMYXN0IHJlZnJlc2ggdGltZSBpbiBVbml4IHNlY29uZHMuCmZ1bmMgKGQgKkRlcG9zaXQpIExhc3RFeHRlcm5hbEluY2VudGl2ZVVwZGF0ZWRBdCgpIGludDY0IHsKCXJldHVybiBkLmxhc3RFeHRlcm5hbEluY2VudGl2ZVVwZGF0ZWRBdAp9CgovLyBTZXRMYXN0RXh0ZXJuYWxJbmNlbnRpdmVVcGRhdGVkQXQgdXBkYXRlcyB0aGUgZXh0ZXJuYWwtaW5jZW50aXZlIGluZGV4IHJlZnJlc2ggdGltZXN0YW1wLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGltZXN0YW1wOiBSZWZyZXNoIHRpbWUgdG8gcmVjb3JkIGluIFVuaXggc2Vjb25kcy4KZnVuYyAoZCAqRGVwb3NpdCkgU2V0TGFzdEV4dGVybmFsSW5jZW50aXZlVXBkYXRlZEF0KHRpbWVzdGFtcCBpbnQ2NCkgewoJZC5sYXN0RXh0ZXJuYWxJbmNlbnRpdmVVcGRhdGVkQXQgPSB0aW1lc3RhbXAKfQoKLy8gQ2xvbmUgcmV0dXJucyBhIGRlZXAgY29weSBvZiB0aGUgZGVwb3NpdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGRlcG9zaXQ6IERlZXAgY29weSBvZiB0aGUgZGVwb3NpdCwgb3IgbmlsIHdoZW4gdGhlIHJlY2VpdmVyIGlzIG5pbC4KZnVuYyAoZCAqRGVwb3NpdCkgQ2xvbmUoKSAqRGVwb3NpdCB7CglpZiBkID09IG5pbCB7CgkJcmV0dXJuIG5pbAoJfQoKCXJldHVybiAmRGVwb3NpdHsKCQl3YXJtdXBzOiAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lV2FybXVwcyhkLndhcm11cHMpLAoJCWxpcXVpZGl0eTogICAgICAgICAgICAgICAgICAgICAgZC5saXF1aWRpdHkuQ2xvbmUoKSwKCQl0YXJnZXRQb29sUGF0aDogICAgICAgICAgICAgICAgIGQudGFyZ2V0UG9vbFBhdGgsCgkJb3duZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICBkLm93bmVyLAoJCXN0YWtlVGltZTogICAgICAgICAgICAgICAgICAgICAgZC5zdGFrZVRpbWUsCgkJaW50ZXJuYWxSZXdhcmRMYXN0Q29sbGVjdFRpbWU6ICBkLmludGVybmFsUmV3YXJkTGFzdENvbGxlY3RUaW1lLAoJCWNvbGxlY3RlZEludGVybmFsUmV3YXJkOiAgICAgICAgZC5jb2xsZWN0ZWRJbnRlcm5hbFJld2FyZCwKCQljb2xsZWN0ZWRFeHRlcm5hbFJld2FyZHM6ICAgICAgIGNsb25lU3RyaW5nSW50NjRNYXAoZC5jb2xsZWN0ZWRFeHRlcm5hbFJld2FyZHMpLAoJCWV4dGVybmFsUmV3YXJkTGFzdENvbGxlY3RUaW1lczogY2xvbmVTdHJpbmdJbnQ2NE1hcChkLmV4dGVybmFsUmV3YXJkTGFzdENvbGxlY3RUaW1lcyksCgkJZXh0ZXJuYWxJbmNlbnRpdmVJZHM6ICAgICAgICAgICBjbG9uZVN0cmluZ0Jvb2xNYXAoZC5leHRlcm5hbEluY2VudGl2ZUlkcyksCgkJbGFzdEV4dGVybmFsSW5jZW50aXZlVXBkYXRlZEF0OiBkLmxhc3RFeHRlcm5hbEluY2VudGl2ZVVwZGF0ZWRBdCwKCQl0aWNrTG93ZXI6ICAgICAgICAgICAgICAgICAgICAgIGQudGlja0xvd2VyLAoJCXRpY2tVcHBlcjogICAgICAgICAgICAgICAgICAgICAgZC50aWNrVXBwZXIsCgl9Cn0KCi8vIE5ld0RlcG9zaXQgY3JlYXRlcyBhIGRlcG9zaXQgZm9yIGEgc3Rha2VkIExQIHBvc2l0aW9uIGFuZCBpbml0aWFsaXplcyBpdHMgcmV3YXJkIGN1cnNvcnMgYW5kIG1hcHMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBvd25lcjogQWRkcmVzcyB0aGF0IG93bnMgdGhlIHN0YWtlZCBwb3NpdGlvbi4KLy8gICAtIHRhcmdldFBvb2xQYXRoOiBQb29sIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb3NpdGlvbi4KLy8gICAtIGxpcXVpZGl0eTogTFAgbGlxdWlkaXR5IGFtb3VudCByZXByZXNlbnRlZCBieSB0aGUgcG9zaXRpb24uCi8vICAgLSBjdXJyZW50VGltZTogU3Rha2luZyBhbmQgaW5pdGlhbCByZXdhcmQtY3Vyc29yIHRpbWUgaW4gVW5peCBzZWNvbmRzLgovLyAgIC0gdGlja0xvd2VyOiBMb3dlciBzaWduZWQgdGljayBib3VuZGFyeSBvZiB0aGUgcG9zaXRpb24ncyByYW5nZS4KLy8gICAtIHRpY2tVcHBlcjogVXBwZXIgc2lnbmVkIHRpY2sgYm91bmRhcnkgb2YgdGhlIHBvc2l0aW9uJ3MgcmFuZ2UuCi8vICAgLSB3YXJtdXBzOiBXYXJtdXAgc2NoZWR1bGUgdG8gYXBwbHkgdG8gdGhpcyBwb3NpdGlvbidzIHJld2FyZHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBkZXBvc2l0OiBOZXdseSBpbml0aWFsaXplZCBkZXBvc2l0IGNvbnRhaW5pbmcgdGhlIHN1cHBsaWVkIHBvc2l0aW9uIGFuZCB3YXJtdXAgc3RhdGUuCmZ1bmMgTmV3RGVwb3NpdCgKCW93bmVyIGFkZHJlc3MsCgl0YXJnZXRQb29sUGF0aCBzdHJpbmcsCglsaXF1aWRpdHkgKnUyNTYuVWludCwKCWN1cnJlbnRUaW1lIGludDY0LAoJdGlja0xvd2VyLCB0aWNrVXBwZXIgaW50MzIsCgl3YXJtdXBzIFtdV2FybXVwLAopICpEZXBvc2l0IHsKCXJldHVybiAmRGVwb3NpdHsKCQlvd25lcjogICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyLAoJCXRhcmdldFBvb2xQYXRoOiAgICAgICAgICAgICAgICAgdGFyZ2V0UG9vbFBhdGgsCgkJbGlxdWlkaXR5OiAgICAgICAgICAgICAgICAgICAgICBsaXF1aWRpdHksCgkJd2FybXVwczogICAgICAgICAgICAgICAgICAgICAgICB3YXJtdXBzLAoJCXN0YWtlVGltZTogICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRpbWUsCgkJdGlja0xvd2VyOiAgICAgICAgICAgICAgICAgICAgICB0aWNrTG93ZXIsCgkJdGlja1VwcGVyOiAgICAgICAgICAgICAgICAgICAgICB0aWNrVXBwZXIsCgkJaW50ZXJuYWxSZXdhcmRMYXN0Q29sbGVjdFRpbWU6ICBjdXJyZW50VGltZSwKCQlleHRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZXM6IG1ha2UobWFwW3N0cmluZ11pbnQ2NCksCgkJY29sbGVjdGVkSW50ZXJuYWxSZXdhcmQ6ICAgICAgICAwLAoJCWNvbGxlY3RlZEV4dGVybmFsUmV3YXJkczogICAgICAgbWFrZShtYXBbc3RyaW5nXWludDY0KSwKCQlleHRlcm5hbEluY2VudGl2ZUlkczogICAgICAgICAgIG1ha2UobWFwW3N0cmluZ11ib29sKSwKCQlsYXN0RXh0ZXJuYWxJbmNlbnRpdmVVcGRhdGVkQXQ6IDAsCgl9Cn0KCnR5cGUgV2FybXVwIHN0cnVjdCB7CglUaW1lRHVyYXRpb24gICBpbnQ2NAoJTmV4dFdhcm11cFRpbWUgaW50NjQgLy8gdGltZSB3aGVuIHRoaXMgd2FybXVwIHBlcmlvZCBlbmRzCglXYXJtdXBSYXRpbyAgICB1aW50NjQKfQoKLy8gTmV3V2FybXVwIGNyZWF0ZXMgb25lIHdhcm11cCB0aWVyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGltZUR1cmF0aW9uOiBEdXJhdGlvbiBvZiB0aGlzIHRpZXIgaW4gc2Vjb25kcy4KLy8gICAtIG5leHRXYXJtdXBUaW1lOiBVbml4IHRpbWVzdGFtcCBhdCB3aGljaCB0aGlzIHRpZXIgZW5kcy4KLy8gICAtIHdhcm11cFJhdGlvOiBQZXJjZW50YWdlIG9mIHRoZSBjYWxjdWxhdGVkIHJld2FyZCBjcmVkaXRlZCB0byB0aGUgcG9zaXRpb24sIGZyb20gMCB0byAxMDAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB3YXJtdXA6IFdhcm11cCB0aWVyIGluaXRpYWxpemVkIHdpdGggdGhlIHN1cHBsaWVkIGR1cmF0aW9uLCBlbmQgdGltZSwgYW5kIHJhdGlvLgpmdW5jIE5ld1dhcm11cCh0aW1lRHVyYXRpb24sIG5leHRXYXJtdXBUaW1lIGludDY0LCB3YXJtdXBSYXRpbyB1aW50NjQpIFdhcm11cCB7CglyZXR1cm4gV2FybXVwewoJCVRpbWVEdXJhdGlvbjogICB0aW1lRHVyYXRpb24sCgkJTmV4dFdhcm11cFRpbWU6IG5leHRXYXJtdXBUaW1lLAoJCVdhcm11cFJhdGlvOiAgICB3YXJtdXBSYXRpbywKCX0KfQoKLy8gU2V0TmV4dFdhcm11cFRpbWUgdXBkYXRlcyB0aGUgVW5peCB0aW1lc3RhbXAgYXQgd2hpY2ggdGhpcyB3YXJtdXAgdGllciBlbmRzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gbmV4dFdhcm11cFRpbWU6IFRpZXIgZW5kIHRpbWUgaW4gVW5peCBzZWNvbmRzLgpmdW5jICh3ICpXYXJtdXApIFNldE5leHRXYXJtdXBUaW1lKG5leHRXYXJtdXBUaW1lIGludDY0KSB7Cgl3Lk5leHRXYXJtdXBUaW1lID0gbmV4dFdhcm11cFRpbWUKfQoKLy8gU2V0V2FybXVwUmF0aW8gdXBkYXRlcyB0aGUgcGVyY2VudGFnZSBvZiBjYWxjdWxhdGVkIHJld2FyZCBjcmVkaXRlZCB0byB0aGUgcG9zaXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB3YXJtdXBSYXRpbzogUmV3YXJkIHBlcmNlbnRhZ2UgZm9yIHRoaXMgdGllciwgZXhwcmVzc2VkIGZyb20gMCB0byAxMDAuCmZ1bmMgKHcgKldhcm11cCkgU2V0V2FybXVwUmF0aW8od2FybXVwUmF0aW8gdWludDY0KSB7Cgl3Lldhcm11cFJhdGlvID0gd2FybXVwUmF0aW8KfQoKLy8gU2V0VGltZUR1cmF0aW9uIHVwZGF0ZXMgdGhlIGR1cmF0aW9uIG9mIHRoaXMgd2FybXVwIHRpZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aW1lRHVyYXRpb246IFRpZXIgZHVyYXRpb24gaW4gc2Vjb25kcy4KZnVuYyAodyAqV2FybXVwKSBTZXRUaW1lRHVyYXRpb24odGltZUR1cmF0aW9uIGludDY0KSB7Cgl3LlRpbWVEdXJhdGlvbiA9IHRpbWVEdXJhdGlvbgp9CgovLyBEZWZhdWx0V2FybXVwVGVtcGxhdGUgcmV0dXJucyB0aGUgYnVpbHQtaW4gZm91ci10aWVyIHdhcm11cCBzY2hlZHVsZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHdhcm11cHM6IFRlbXBsYXRlIHdpdGggNS1kYXksIDEwLWRheSwgMzAtZGF5LCBhbmQgZmluYWwtdW5ib3VuZGVkIHRpZXJzIHVzaW5nIDMwJSwgNTAlLCA3MCUsIGFuZCAxMDAlIHJhdGlvczsgTmV4dFdhcm11cFRpbWUgdmFsdWVzIGFyZSB6ZXJvIHVudGlsIGluc3RhbnRpYXRlZC4KZnVuYyBEZWZhdWx0V2FybXVwVGVtcGxhdGUoKSBbXVdhcm11cCB7CglzZWNvbmRzSW5EYXkgOj0gaW50NjQoODY0MDApCglzZWNvbmRzSW41RGF5cyA6PSBpbnQ2NCg1ICogc2Vjb25kc0luRGF5KQoJc2Vjb25kc0luMTBEYXlzIDo9IGludDY0KDEwICogc2Vjb25kc0luRGF5KQoJc2Vjb25kc0luMzBEYXlzIDo9IGludDY0KDMwICogc2Vjb25kc0luRGF5KQoKCS8vIE5leHRXYXJtdXBUaW1lIGlzIHNldCB0byAwIGZvciB0ZW1wbGF0ZS4KCS8vIFRoZXkgd2lsbCBiZSBzZXQgYnkgSW5zdGFudGlhdGVXYXJtdXAoKQoJcmV0dXJuIFtdV2FybXVwewoJCXsKCQkJVGltZUR1cmF0aW9uOiBzZWNvbmRzSW41RGF5cywKCQkJLy8gTmV4dFdhcm11cFRpbWUgd2lsbCBiZSBzZXQgYmFzZWQgb24gY3VycmVudFRpbWUKCQkJLy8gTmV4dFdhcm11cFRpbWU6IGN1cnJlbnRUaW1lICsgc2Vjb25kc0luNURheXMsCgkJCVdhcm11cFJhdGlvOiAzMCwKCQl9LAoJCXsKCQkJVGltZUR1cmF0aW9uOiBzZWNvbmRzSW4xMERheXMsCgkJCS8vIE5leHRXYXJtdXBUaW1lIHdpbGwgYmUgc2V0IGJhc2VkIG9uIGN1cnJlbnRUaW1lCgkJCS8vIE5leHRXYXJtdXBUaW1lOiBjdXJyZW50VGltZSArIHNlY29uZHNJbjEwRGF5cywKCQkJV2FybXVwUmF0aW86IDUwLAoJCX0sCgkJewoJCQlUaW1lRHVyYXRpb246IHNlY29uZHNJbjMwRGF5cywKCQkJLy8gTmV4dFdhcm11cFRpbWUgd2lsbCBiZSBzZXQgYmFzZWQgb24gY3VycmVudFRpbWUKCQkJLy8gTmV4dFdhcm11cFRpbWU6IGN1cnJlbnRUaW1lICsgc2Vjb25kc0luMzBEYXlzLAoJCQlXYXJtdXBSYXRpbzogNzAsCgkJfSwKCQl7CgkJCVRpbWVEdXJhdGlvbjogbWF0aC5NYXhJbnQ2NCwKCQkJLy8gTmV4dFdhcm11cFRpbWUgd2lsbCBiZSBzZXQgdG8gbWF0aC5NYXhJbnQ2NAoJCQkvLyBOZXh0V2FybXVwVGltZTogbWF0aC5NYXhJbnQ2NCwKCQkJV2FybXVwUmF0aW86IDEwMCwKCQl9LAoJfQp9Cgpjb25zdCAoCglHTlNfUEFUSCAgICBzdHJpbmcgPSAiZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlMiCglXVUdOT1RfUEFUSCBzdHJpbmcgPSAiZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3QiCikKCi8vIERlZmF1bHRBbGxvd2VkVG9rZW5zIHJldHVybnMgdGhlIHRva2VuIHBhdGhzIGFjY2VwdGVkIGJ5IHRoZSBzdGFrZXIncyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0b2tlblBhdGhzOiBTbGljZSBjb250YWluaW5nIHRoZSBHTlMgYW5kIHdyYXBwZWQtR05PVCB0b2tlbiBwYXRocy4KZnVuYyBEZWZhdWx0QWxsb3dlZFRva2VucygpIFtdc3RyaW5nIHsKCXJldHVybiBbXXN0cmluZ3tHTlNfUEFUSCwgV1VHTk9UX1BBVEh9Cn0KGuEDCgdkb2MuZ25vEtUDLy8gUGFja2FnZSBzdGFrZXIgbWFuYWdlcyBsaXF1aWRpdHkgbWluaW5nIHJld2FyZHMgZm9yIEdub1N3YXAgcG9zaXRpb25zLgovLwovLyBUaGUgc3Rha2VyIGRpc3RyaWJ1dGVzIEdOUyBlbWlzc2lvbnMgYW5kIGV4dGVybmFsIGluY2VudGl2ZXMgdG8gbGlxdWlkaXR5Ci8vIHByb3ZpZGVycyBiYXNlZCBvbiB0aGVpciBwb3NpdGlvbiBzaXplLCBwcmljZSByYW5nZSwgYW5kIHN0YWtpbmcgZHVyYXRpb24uCi8vIEl0IHN1cHBvcnRzIGJvdGggaW50ZXJuYWwgR05TIHJld2FyZHMgYW5kIGV4dGVybmFsIHRva2VuIGluY2VudGl2ZXMuCi8vCi8vIFJld2FyZCBjYWxjdWxhdGlvbnMgY29tYmluZSBlbGFwc2VkLXRpbWUgcmF0ZXMgd2l0aCB0aWNrL3JhbmdlIGFjY3VtdWxhdGlvbiwgYW5kCi8vIGNvbGxlY3Rpb24gZmxvd3MgYXJlIGludGVncmF0ZWQgaW50byB0aGUgc3Rha2luZyBsaWZlY3ljbGUuCnBhY2thZ2Ugc3Rha2VyChrD6gEKCmdldHRlci5nbm8Ss+oBcGFja2FnZSBzdGFrZXIKCmltcG9ydCAoCgl1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKCXJvdHJlZSAiZ25vLmxhbmQvcC9udC9icHRyZWUvcm90cmVlL3YwIgopCgovLyBJU3Rha2VyR2V0dGVyIGZ1bmN0aW9ucwoKLy8gR2V0UG9vbCByZXR1cm5zIGEgY29weSBvZiB0aGUgc3Rha2luZyBzdGF0ZSBmb3IgYSBwb29sLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IHBvb2wgcmVhbG0gcGF0aAovLwovLyBSZXR1cm5zOgovLyAgIC0gcG9vbDogaW5kZXBlbmRlbnQgcG9vbCBjb3B5LCBvciBuaWwgd2hlbiBhbiBpbXBsZW1lbnRhdGlvbiBoYXMgbm8gcG9vbCB2YWx1ZQovLyAgIC0gZXJyOiBpbXBsZW1lbnRhdGlvbiByZXNvbHV0aW9uIGVycm9yOyB0aGUgY3VycmVudCB2MSBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG5vdC1mb3VuZCBmb3IgYSBtaXNzaW5nIHBvb2wKZnVuYyBHZXRQb29sKHBvb2xQYXRoIHN0cmluZykgKCpQb29sLCBlcnJvcikgewoJcG9vbCwgZXJyIDo9IGdldEltcGxlbWVudGF0aW9uKCkuR2V0UG9vbChwb29sUGF0aCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoJaWYgcG9vbCA9PSBuaWwgewoJCXJldHVybiBuaWwsIG5pbAoJfQoJcmV0dXJuIHBvb2wuQ2xvbmUoKSwgbmlsCn0KCi8vIEdldERlcG9zaXQgcmV0dXJucyBhIGNvcHkgb2YgYSBzdGFrZWQgcG9zaXRpb24ncyBkZXBvc2l0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gbHBUb2tlbklkOiBzdGFrZWQgcG9zaXRpb24gTkZUIHRva2VuIElECi8vCi8vIFJldHVybnM6Ci8vICAgLSBkZXBvc2l0OiBpbmRlcGVuZGVudCBkZXBvc2l0IGNvcHksIG9yIG5pbCB3aGVuIGFuIGltcGxlbWVudGF0aW9uIGhhcyBubyBkZXBvc2l0IHZhbHVlCi8vICAgLSBlcnI6IGltcGxlbWVudGF0aW9uIHJlc29sdXRpb24gZXJyb3I7IHRoZSBjdXJyZW50IHYxIGltcGxlbWVudGF0aW9uIHJldHVybnMgbm90LWZvdW5kIGZvciBhIG1pc3NpbmcgZGVwb3NpdApmdW5jIEdldERlcG9zaXQobHBUb2tlbklkIHVpbnQ2NCkgKCpEZXBvc2l0LCBlcnJvcikgewoJZGVwb3NpdCwgZXJyIDo9IGdldEltcGxlbWVudGF0aW9uKCkuR2V0RGVwb3NpdChscFRva2VuSWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnIKCX0KCWlmIGRlcG9zaXQgPT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBuaWwKCX0KCXJldHVybiBkZXBvc2l0LkNsb25lKCksIG5pbAp9CgovLyBDb2xsZWN0YWJsZUVtaXNzaW9uUmV3YXJkIHJldHVybnMgdGhlIGNsYWltYWJsZSBpbnRlcm5hbCBHTlMgcmV3YXJkIGZvciBhIGxpdmUgc3Rha2VkIGRlcG9zaXQgb3IKLy8gYW4gZXhpdCBjaGVja3BvaW50IGxlZnQgYnkgVW5TdGFrZVRva2VuLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9zaXRpb25JZDogc3Rha2VkIHBvc2l0aW9uIE5GVCB0b2tlbiBJRCBvciBwb3NpdGlvbiB3aXRoIGFuIGV4aXQgY2hlY2twb2ludAovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBjbGFpbWFibGUgaW50ZXJuYWwgcmV3YXJkIGFtb3VudAovLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcG9zaXRpb25JZCBjYW5ub3QgYmUgcmVzb2x2ZWQKZnVuYyBDb2xsZWN0YWJsZUVtaXNzaW9uUmV3YXJkKHBvc2l0aW9uSWQgdWludDY0KSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5Db2xsZWN0YWJsZUVtaXNzaW9uUmV3YXJkKHBvc2l0aW9uSWQpCn0KCi8vIENvbGxlY3RhYmxlRXh0ZXJuYWxJbmNlbnRpdmVSZXdhcmQgcmV0dXJucyBhIHBvc2l0aW9uJ3MgY2xhaW1hYmxlIGV4dGVybmFsIHJld2FyZCBmb3IgYSBsaXZlCi8vIHN0YWtlZCBkZXBvc2l0IG9yIGFuIGV4aXQgY2hlY2twb2ludCBsZWZ0IGJ5IFVuU3Rha2VUb2tlbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvc2l0aW9uSWQ6IHN0YWtlZCBwb3NpdGlvbiBORlQgdG9rZW4gSUQgb3IgcG9zaXRpb24gd2l0aCBhbiBleGl0IGNoZWNrcG9pbnQKLy8gICAtIGluY2VudGl2ZUlkOiBleHRlcm5hbCBpbmNlbnRpdmUgaWRlbnRpZmllcgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBjbGFpbWFibGUgZXh0ZXJuYWwgcmV3YXJkIGFtb3VudAovLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gdGhlIHBvc2l0aW9uIG9yIGluY2VudGl2ZSBjYW5ub3QgYmUgcmVzb2x2ZWQKZnVuYyBDb2xsZWN0YWJsZUV4dGVybmFsSW5jZW50aXZlUmV3YXJkKHBvc2l0aW9uSWQgdWludDY0LCBpbmNlbnRpdmVJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkNvbGxlY3RhYmxlRXh0ZXJuYWxJbmNlbnRpdmVSZXdhcmQocG9zaXRpb25JZCwgaW5jZW50aXZlSWQpCn0KCi8vIEdldENyZWF0ZWRIZWlnaHRPZkluY2VudGl2ZSByZXR1cm5zIGFuIGluY2VudGl2ZSdzIGNyZWF0aW9uIGJsb2NrIGhlaWdodC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBwb29sIHJlYWxtIHBhdGgKLy8gICAtIGluY2VudGl2ZUlkOiBleHRlcm5hbCBpbmNlbnRpdmUgaWRlbnRpZmllcgovLwovLyBSZXR1cm5zOgovLyAgIC0gaGVpZ2h0OiBjcmVhdGlvbiBibG9jayBoZWlnaHQKLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHRoZSBpbmNlbnRpdmUgY2Fubm90IGJlIHJlc29sdmVkCmZ1bmMgR2V0Q3JlYXRlZEhlaWdodE9mSW5jZW50aXZlKHBvb2xQYXRoIHN0cmluZywgaW5jZW50aXZlSWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRDcmVhdGVkSGVpZ2h0T2ZJbmNlbnRpdmUocG9vbFBhdGgsIGluY2VudGl2ZUlkKQp9CgovLyBHZXRJbmNlbnRpdmVDcmVhdGVkVGltZXN0YW1wIHJldHVybnMgYW4gaW5jZW50aXZlJ3MgY3JlYXRpb24gdGltZXN0YW1wLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IHBvb2wgcmVhbG0gcGF0aAovLyAgIC0gaW5jZW50aXZlSWQ6IGV4dGVybmFsIGluY2VudGl2ZSBpZGVudGlmaWVyCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aW1lc3RhbXA6IGNyZWF0aW9uIFVuaXggdGltZXN0YW1wCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiB0aGUgaW5jZW50aXZlIGNhbm5vdCBiZSByZXNvbHZlZApmdW5jIEdldEluY2VudGl2ZUNyZWF0ZWRUaW1lc3RhbXAocG9vbFBhdGggc3RyaW5nLCBpbmNlbnRpdmVJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldEluY2VudGl2ZUNyZWF0ZWRUaW1lc3RhbXAocG9vbFBhdGgsIGluY2VudGl2ZUlkKQp9CgovLyBHZXRJbmNlbnRpdmVUb3RhbFJld2FyZEFtb3VudCByZXR1cm5zIHRoZSB0b3RhbCByZXdhcmQgYW1vdW50IG9mIGFuIGluY2VudGl2ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBQb29sIHBhdGggY29udGFpbmluZyB0aGUgaW5jZW50aXZlIHJlY29yZC4KLy8gICAtIGluY2VudGl2ZUlkOiBFeHRlcm5hbCBpbmNlbnRpdmUgaWRlbnRpZmllciB0byByZXNvbHZlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBUb3RhbCByZXdhcmQgYW1vdW50IGNvbmZpZ3VyZWQgd2hlbiB0aGUgaW5jZW50aXZlIHdhcyBjcmVhdGVkLCBpbiB0b2tlbiB1bml0cy4KLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIG9yIGluY2VudGl2ZUlkIGNhbm5vdCBiZSByZXNvbHZlZC4KZnVuYyBHZXRJbmNlbnRpdmVUb3RhbFJld2FyZEFtb3VudChwb29sUGF0aCBzdHJpbmcsIGluY2VudGl2ZUlkIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0SW5jZW50aXZlVG90YWxSZXdhcmRBbW91bnQocG9vbFBhdGgsIGluY2VudGl2ZUlkKQp9CgovLyBHZXRJbmNlbnRpdmVEaXN0cmlidXRlZFJld2FyZEFtb3VudCByZXR1cm5zIHRoZSBkaXN0cmlidXRlZCByZXdhcmQgYW1vdW50IG9mIGFuIGluY2VudGl2ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBQb29sIHBhdGggY29udGFpbmluZyB0aGUgaW5jZW50aXZlIHJlY29yZC4KLy8gICAtIGluY2VudGl2ZUlkOiBFeHRlcm5hbCBpbmNlbnRpdmUgaWRlbnRpZmllciB0byByZXNvbHZlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBSZXdhcmQgYW1vdW50IGFscmVhZHkgZGVsaXZlcmVkIHRvIHBvc2l0aW9ucyBvciByZWZ1bmRlZCBhdCBpbmNlbnRpdmUgZW5kLCBpbiB0b2tlbiB1bml0cy4KLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIG9yIGluY2VudGl2ZUlkIGNhbm5vdCBiZSByZXNvbHZlZC4KZnVuYyBHZXRJbmNlbnRpdmVEaXN0cmlidXRlZFJld2FyZEFtb3VudChwb29sUGF0aCBzdHJpbmcsIGluY2VudGl2ZUlkIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0SW5jZW50aXZlRGlzdHJpYnV0ZWRSZXdhcmRBbW91bnQocG9vbFBhdGgsIGluY2VudGl2ZUlkKQp9CgovLyBHZXRJbmNlbnRpdmVSZW1haW5pbmdSZXdhcmRBbW91bnQgcmV0dXJucyB0aGUgcmVtYWluaW5nIHJld2FyZCBhbW91bnQgb2YgYW4gaW5jZW50aXZlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCBjb250YWluaW5nIHRoZSBpbmNlbnRpdmUgcmVjb3JkLgovLyAgIC0gaW5jZW50aXZlSWQ6IEV4dGVybmFsIGluY2VudGl2ZSBpZGVudGlmaWVyIHRvIHJlc29sdmUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IE11dGFibGUgcmV3YXJkIGJhbGFuY2UgcmVtYWluaW5nIGFmdGVyIGRpc3RyaWJ1dGlvbnMgYW5kIHJlZnVuZHMsIGluIHRva2VuIHVuaXRzLgovLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggb3IgaW5jZW50aXZlSWQgY2Fubm90IGJlIHJlc29sdmVkLgpmdW5jIEdldEluY2VudGl2ZVJlbWFpbmluZ1Jld2FyZEFtb3VudChwb29sUGF0aCBzdHJpbmcsIGluY2VudGl2ZUlkIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0SW5jZW50aXZlUmVtYWluaW5nUmV3YXJkQW1vdW50KHBvb2xQYXRoLCBpbmNlbnRpdmVJZCkKfQoKLy8gR2V0SW5jZW50aXZlQWNjdW11bGF0ZWRQZW5hbHR5QW1vdW50IHJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHdhcm11cCBwZW5hbHR5IGFtb3VudCBvZiBhbiBpbmNlbnRpdmUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIGNvbnRhaW5pbmcgdGhlIGluY2VudGl2ZSByZWNvcmQuCi8vICAgLSBpbmNlbnRpdmVJZDogRXh0ZXJuYWwgaW5jZW50aXZlIGlkZW50aWZpZXIgdG8gcmVzb2x2ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogV2FybXVwIHBlbmFsdHkgYWNjdW11bGF0ZWQgZnJvbSBjb2xsZWN0aW9ucyBmb3IgdGhlIGluY2VudGl2ZSwgaW4gcmV3YXJkLXRva2VuIHVuaXRzLgovLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggb3IgaW5jZW50aXZlSWQgY2Fubm90IGJlIHJlc29sdmVkLgpmdW5jIEdldEluY2VudGl2ZUFjY3VtdWxhdGVkUGVuYWx0eUFtb3VudChwb29sUGF0aCBzdHJpbmcsIGluY2VudGl2ZUlkIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0SW5jZW50aXZlQWNjdW11bGF0ZWRQZW5hbHR5QW1vdW50KHBvb2xQYXRoLCBpbmNlbnRpdmVJZCkKfQoKLy8gR2V0SW5jZW50aXZlRGVwb3NpdEduc0Ftb3VudCByZXR1cm5zIHRoZSBkZXBvc2l0ZWQgR05TIGFtb3VudCBvZiBhbiBpbmNlbnRpdmUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIGNvbnRhaW5pbmcgdGhlIGluY2VudGl2ZSByZWNvcmQuCi8vICAgLSBpbmNlbnRpdmVJZDogRXh0ZXJuYWwgaW5jZW50aXZlIGlkZW50aWZpZXIgdG8gcmVzb2x2ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogR05TIGRlcG9zaXQgbG9ja2VkIGJ5IHRoZSBpbmNlbnRpdmUsIGluIHRva2VuIHVuaXRzLgovLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggb3IgaW5jZW50aXZlSWQgY2Fubm90IGJlIHJlc29sdmVkLgpmdW5jIEdldEluY2VudGl2ZURlcG9zaXRHbnNBbW91bnQocG9vbFBhdGggc3RyaW5nLCBpbmNlbnRpdmVJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldEluY2VudGl2ZURlcG9zaXRHbnNBbW91bnQocG9vbFBhdGgsIGluY2VudGl2ZUlkKQp9CgovLyBHZXRJbmNlbnRpdmVSZWZ1bmRlZCByZXR1cm5zIHdoZXRoZXIgYW4gaW5jZW50aXZlIGhhcyBiZWVuIHJlZnVuZGVkLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCBjb250YWluaW5nIHRoZSBpbmNlbnRpdmUgcmVjb3JkLgovLyAgIC0gaW5jZW50aXZlSWQ6IEV4dGVybmFsIGluY2VudGl2ZSBpZGVudGlmaWVyIHRvIHJlc29sdmUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZWZ1bmRlZDogVHJ1ZSB3aGVuIHRoZSBpbmNlbnRpdmUgaGFzIGJlZW4gZmluYWxpemVkIGFzIHJlZnVuZGVkOyBmYWxzZSB3aGlsZSBpdCByZW1haW5zIG9wZW4uCi8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBvciBpbmNlbnRpdmVJZCBjYW5ub3QgYmUgcmVzb2x2ZWQuCmZ1bmMgR2V0SW5jZW50aXZlUmVmdW5kZWQocG9vbFBhdGggc3RyaW5nLCBpbmNlbnRpdmVJZCBzdHJpbmcpIChib29sLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0SW5jZW50aXZlUmVmdW5kZWQocG9vbFBhdGgsIGluY2VudGl2ZUlkKQp9CgovLyBJc0luY2VudGl2ZUFjdGl2ZSByZXBvcnRzIHdoZXRoZXIgYW4gdW5yZWZ1bmRlZCBpbmNlbnRpdmUgaXMgYWN0aXZlLCBpbmNsdWRpbmcgYm90aCBzdGFydCBhbmQgZW5kIHRpbWVzdGFtcHMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIGNvbnRhaW5pbmcgdGhlIGluY2VudGl2ZSByZWNvcmQuCi8vICAgLSBpbmNlbnRpdmVJZDogRXh0ZXJuYWwgaW5jZW50aXZlIGlkZW50aWZpZXIgdG8gcmVzb2x2ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFjdGl2ZTogVHJ1ZSB3aGVuIHRoZSBjdXJyZW50IFVuaXggdGltZSBpcyB3aXRoaW4gdGhlIGluY2VudGl2ZSB3aW5kb3cgYW5kIGl0IGhhcyBub3QgYmVlbiByZWZ1bmRlZC4KLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIG9yIGluY2VudGl2ZUlkIGNhbm5vdCBiZSByZXNvbHZlZC4KZnVuYyBJc0luY2VudGl2ZUFjdGl2ZShwb29sUGF0aCBzdHJpbmcsIGluY2VudGl2ZUlkIHN0cmluZykgKGJvb2wsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5Jc0luY2VudGl2ZUFjdGl2ZShwb29sUGF0aCwgaW5jZW50aXZlSWQpCn0KCi8vIEdldERlcG9zaXRFeHRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZXN0YW1wIHJldHVybnMgdGhlIGxhc3QgZXh0ZXJuYWwgcmV3YXJkIGNvbGxlY3Rpb24gdGltZSBmb3IKLy8gYSBwb3NpdGlvbiBhbmQgaW5jZW50aXZlLiBGb3IgYSBuZXdseSB0cmFja2VkIGluY2VudGl2ZSwgdGhlIHZhbHVlIGlzIGJhc2VkIG9uIHRoZSBzdGFrZSB0aW1lc3RhbXAuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBscFRva2VuSWQ6IFBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSBleHRlcm5hbCByZXdhcmQgY3Vyc29yIHNob3VsZCBiZSByZWFkLgovLyAgIC0gaW5jZW50aXZlSWQ6IEV4dGVybmFsIGluY2VudGl2ZSBpZGVudGlmaWVyIHdob3NlIGNvbGxlY3Rpb24gY3Vyc29yIHNob3VsZCBiZSByZWFkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdGltZXN0YW1wOiBVbml4IHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBjb2xsZWN0aW9uIGN1cnNvcjsgbmV3bHkgdHJhY2tlZCBpbmNlbnRpdmVzIHVzZSB0aGUgZGVwb3NpdCdzIHN0YWtlIHRpbWUuCi8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBscFRva2VuSWQgZG9lcyBub3QgcmVzb2x2ZSB0byBhIHN0b3JlZCBkZXBvc2l0LgpmdW5jIEdldERlcG9zaXRFeHRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZXN0YW1wKGxwVG9rZW5JZCB1aW50NjQsIGluY2VudGl2ZUlkIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0RGVwb3NpdEV4dGVybmFsUmV3YXJkTGFzdENvbGxlY3RUaW1lc3RhbXAobHBUb2tlbklkLCBpbmNlbnRpdmVJZCkKfQoKLy8gR2V0RGVwb3NpdEduc0Ftb3VudCByZXR1cm5zIHRoZSBHTlMgZGVwb3NpdCByZXF1aXJlZCBmb3IgZWFjaCBleHRlcm5hbCBpbmNlbnRpdmUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IENvbmZpZ3VyZWQgR05TIGRlcG9zaXQgcmVxdWlyZWQgcGVyIGV4dGVybmFsIGluY2VudGl2ZSwgaW4gdG9rZW4gdW5pdHMuCmZ1bmMgR2V0RGVwb3NpdEduc0Ftb3VudCgpIGludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldERlcG9zaXRHbnNBbW91bnQoKQp9CgovLyBHZXREZXBvc2l0SW50ZXJuYWxSZXdhcmRMYXN0Q29sbGVjdFRpbWVzdGFtcCByZXR1cm5zIHRoZSBsYXN0IGludGVybmFsIHJld2FyZCBjb2xsZWN0aW9uIHRpbWUgZm9yIGEgcG9zaXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBscFRva2VuSWQ6IFBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSBpbnRlcm5hbCByZXdhcmQgY3Vyc29yIHNob3VsZCBiZSByZWFkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdGltZXN0YW1wOiBVbml4IHRpbWVzdGFtcCBvZiB0aGUgZGVwb3NpdCdzIGxhc3QgaW50ZXJuYWwgcmV3YXJkIGNvbGxlY3Rpb24uCi8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBscFRva2VuSWQgZG9lcyBub3QgcmVzb2x2ZSB0byBhIHN0b3JlZCBkZXBvc2l0LgpmdW5jIEdldERlcG9zaXRJbnRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZXN0YW1wKGxwVG9rZW5JZCB1aW50NjQpIChpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldERlcG9zaXRJbnRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZXN0YW1wKGxwVG9rZW5JZCkKfQoKLy8gR2V0RGVwb3NpdENvbGxlY3RlZEludGVybmFsUmV3YXJkIHJldHVybnMgdGhlIGNvbGxlY3RlZCBpbnRlcm5hbCByZXdhcmQgYW1vdW50IG9mIGEgcG9zaXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBscFRva2VuSWQ6IFBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSBjb2xsZWN0ZWQgaW50ZXJuYWwgcmV3YXJkIHNob3VsZCBiZSByZWFkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBJbnRlcm5hbCBHTlMgcmV3YXJkIGFtb3VudCBhbHJlYWR5IHJlY29yZGVkIGFzIGNvbGxlY3RlZCwgaW4gdG9rZW4gdW5pdHMuCi8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBscFRva2VuSWQgZG9lcyBub3QgcmVzb2x2ZSB0byBhIHN0b3JlZCBkZXBvc2l0LgpmdW5jIEdldERlcG9zaXRDb2xsZWN0ZWRJbnRlcm5hbFJld2FyZChscFRva2VuSWQgdWludDY0KSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXREZXBvc2l0Q29sbGVjdGVkSW50ZXJuYWxSZXdhcmQobHBUb2tlbklkKQp9CgovLyBHZXREZXBvc2l0Q29sbGVjdGVkRXh0ZXJuYWxSZXdhcmQgcmV0dXJucyB0aGUgY29sbGVjdGVkIGV4dGVybmFsIHJld2FyZCBhbW91bnQgb2YgYSBwb3NpdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGxwVG9rZW5JZDogUG9zaXRpb24gTkZUIHRva2VuIElEIHdob3NlIGNvbGxlY3RlZCByZXdhcmQgc2hvdWxkIGJlIHJlYWQuCi8vICAgLSBpbmNlbnRpdmVJZDogRXh0ZXJuYWwgaW5jZW50aXZlIGlkZW50aWZpZXIgd2hvc2UgY29sbGVjdGVkIGFtb3VudCBzaG91bGQgYmUgcmVhZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogRXh0ZXJuYWwgcmV3YXJkIGFtb3VudCBhbHJlYWR5IHJlY29yZGVkIGFzIGNvbGxlY3RlZCBmb3IgdGhlIGluY2VudGl2ZSwgaW4gdG9rZW4gdW5pdHMuCi8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBscFRva2VuSWQgZG9lcyBub3QgcmVzb2x2ZSB0byBhIHN0b3JlZCBkZXBvc2l0LgpmdW5jIEdldERlcG9zaXRDb2xsZWN0ZWRFeHRlcm5hbFJld2FyZChscFRva2VuSWQgdWludDY0LCBpbmNlbnRpdmVJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldERlcG9zaXRDb2xsZWN0ZWRFeHRlcm5hbFJld2FyZChscFRva2VuSWQsIGluY2VudGl2ZUlkKQp9CgovLyBHZXREZXBvc2l0TGlxdWlkaXR5IHJldHVybnMgdGhlIGxpcXVpZGl0eSBhbW91bnQgb2YgYSBzdGFrZWQgcG9zaXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBscFRva2VuSWQ6IFBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSBsaXF1aWRpdHkgc2hvdWxkIGJlIHJlYWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBsaXF1aWRpdHk6IEluZGVwZW5kZW50IHVpbnQyNTYgY29weSBvZiB0aGUgZGVwb3NpdCdzIGxpcXVpZGl0eSBhbW91bnQuCi8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBscFRva2VuSWQgZG9lcyBub3QgcmVzb2x2ZSB0byBhIHN0b3JlZCBkZXBvc2l0LgpmdW5jIEdldERlcG9zaXRMaXF1aWRpdHkobHBUb2tlbklkIHVpbnQ2NCkgKCp1MjU2LlVpbnQsIGVycm9yKSB7CglsaXF1aWRpdHksIGVyciA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldERlcG9zaXRMaXF1aWRpdHkobHBUb2tlbklkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIG5pbCwgZXJyCgl9CglyZXR1cm4gbGlxdWlkaXR5LkNsb25lKCksIG5pbAp9CgovLyBHZXREZXBvc2l0TGlxdWlkaXR5QXNTdHJpbmcgcmV0dXJucyB0aGUgbGlxdWlkaXR5IGFtb3VudCBvZiBhIHN0YWtlZCBwb3NpdGlvbiBhcyBhIGRlY2ltYWwgc3RyaW5nLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gbHBUb2tlbklkOiBQb3NpdGlvbiBORlQgdG9rZW4gSUQgd2hvc2UgbGlxdWlkaXR5IHNob3VsZCBiZSBmb3JtYXR0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBsaXF1aWRpdHk6IERlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRlcG9zaXQncyB1aW50MjU2IGxpcXVpZGl0eSBhbW91bnQuCi8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBscFRva2VuSWQgZG9lcyBub3QgcmVzb2x2ZSB0byBhIHN0b3JlZCBkZXBvc2l0LgpmdW5jIEdldERlcG9zaXRMaXF1aWRpdHlBc1N0cmluZyhscFRva2VuSWQgdWludDY0KSAoc3RyaW5nLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0RGVwb3NpdExpcXVpZGl0eUFzU3RyaW5nKGxwVG9rZW5JZCkKfQoKLy8gR2V0RGVwb3NpdE93bmVyIHJldHVybnMgdGhlIG93bmVyIG9mIGEgc3Rha2VkIHBvc2l0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gbHBUb2tlbklkOiBQb3NpdGlvbiBORlQgdG9rZW4gSUQgd2hvc2Ugb3duZXIgc2hvdWxkIGJlIHJlYWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBvd25lcjogQWRkcmVzcyByZWNvcmRlZCBhcyB0aGUgZGVwb3NpdCBvd25lci4KLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIGxwVG9rZW5JZCBkb2VzIG5vdCByZXNvbHZlIHRvIGEgc3RvcmVkIGRlcG9zaXQuCmZ1bmMgR2V0RGVwb3NpdE93bmVyKGxwVG9rZW5JZCB1aW50NjQpIChhZGRyZXNzLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0RGVwb3NpdE93bmVyKGxwVG9rZW5JZCkKfQoKLy8gR2V0RGVwb3NpdFN0YWtlVGltZSByZXR1cm5zIHRoZSBVbml4IHRpbWVzdGFtcCBhdCB3aGljaCBhIHBvc2l0aW9uIHdhcyBzdGFrZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBscFRva2VuSWQ6IFBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSBzdGFrZSB0aW1lIHNob3VsZCBiZSByZWFkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3Rha2VUaW1lOiBVbml4IHRpbWVzdGFtcCByZWNvcmRlZCB3aGVuIHRoZSBkZXBvc2l0IGVudGVyZWQgc3Rha2luZy4KLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIGxwVG9rZW5JZCBkb2VzIG5vdCByZXNvbHZlIHRvIGEgc3RvcmVkIGRlcG9zaXQuCmZ1bmMgR2V0RGVwb3NpdFN0YWtlVGltZShscFRva2VuSWQgdWludDY0KSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXREZXBvc2l0U3Rha2VUaW1lKGxwVG9rZW5JZCkKfQoKLy8gR2V0RGVwb3NpdFRhcmdldFBvb2xQYXRoIHJldHVybnMgdGhlIHBvb2wgcGF0aCBvZiBhIHN0YWtlZCBwb3NpdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGxwVG9rZW5JZDogUG9zaXRpb24gTkZUIHRva2VuIElEIHdob3NlIHRhcmdldCBwb29sIHNob3VsZCBiZSByZWFkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCBzdG9yZWQgb24gdGhlIGRlcG9zaXQuCi8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBscFRva2VuSWQgZG9lcyBub3QgcmVzb2x2ZSB0byBhIHN0b3JlZCBkZXBvc2l0LgpmdW5jIEdldERlcG9zaXRUYXJnZXRQb29sUGF0aChscFRva2VuSWQgdWludDY0KSAoc3RyaW5nLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0RGVwb3NpdFRhcmdldFBvb2xQYXRoKGxwVG9rZW5JZCkKfQoKLy8gR2V0RGVwb3NpdFRpY2tMb3dlciByZXR1cm5zIHRoZSBsb3dlciB0aWNrIG9mIGEgc3Rha2VkIHBvc2l0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gbHBUb2tlbklkOiBQb3NpdGlvbiBORlQgdG9rZW4gSUQgd2hvc2UgbG93ZXIgYm91bmRhcnkgc2hvdWxkIGJlIHJlYWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aWNrTG93ZXI6IExvd2VyIHByaWNlLXJhbmdlIHRpY2sgc3RvcmVkIG9uIHRoZSBkZXBvc2l0LgovLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gbHBUb2tlbklkIGRvZXMgbm90IHJlc29sdmUgdG8gYSBzdG9yZWQgZGVwb3NpdC4KZnVuYyBHZXREZXBvc2l0VGlja0xvd2VyKGxwVG9rZW5JZCB1aW50NjQpIChpbnQzMiwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldERlcG9zaXRUaWNrTG93ZXIobHBUb2tlbklkKQp9CgovLyBHZXREZXBvc2l0VGlja1VwcGVyIHJldHVybnMgdGhlIHVwcGVyIHRpY2sgb2YgYSBzdGFrZWQgcG9zaXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBscFRva2VuSWQ6IFBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSB1cHBlciBib3VuZGFyeSBzaG91bGQgYmUgcmVhZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpY2tVcHBlcjogVXBwZXIgcHJpY2UtcmFuZ2UgdGljayBzdG9yZWQgb24gdGhlIGRlcG9zaXQuCi8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBscFRva2VuSWQgZG9lcyBub3QgcmVzb2x2ZSB0byBhIHN0b3JlZCBkZXBvc2l0LgpmdW5jIEdldERlcG9zaXRUaWNrVXBwZXIobHBUb2tlbklkIHVpbnQ2NCkgKGludDMyLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0RGVwb3NpdFRpY2tVcHBlcihscFRva2VuSWQpCn0KCi8vIEdldERlcG9zaXRXYXJtVXAgcmV0dXJucyB0aGUgd2FybXVwIHJlY29yZHMgb2YgYSBzdGFrZWQgcG9zaXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBscFRva2VuSWQ6IFBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSB3YXJtdXAgc2NoZWR1bGUgc2hvdWxkIGJlIGluc3BlY3RlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHdhcm11cHM6IEluZGVwZW5kZW50IGNvcHkgb2YgdGhlIGRlcG9zaXQncyB3YXJtdXAgcmVjb3Jkcy4KLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIGxwVG9rZW5JZCBkb2VzIG5vdCByZXNvbHZlIHRvIGEgc3RvcmVkIGRlcG9zaXQuCmZ1bmMgR2V0RGVwb3NpdFdhcm1VcChscFRva2VuSWQgdWludDY0KSAoW11XYXJtdXAsIGVycm9yKSB7Cgl3YXJtdXBzLCBlcnIgOj0gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXREZXBvc2l0V2FybVVwKGxwVG9rZW5JZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoJcmV0dXJuIGNsb25lV2FybXVwcyh3YXJtdXBzKSwgbmlsCn0KCi8vIEdldERlcG9zaXRFeHRlcm5hbEluY2VudGl2ZUlkTGlzdCByZXR1cm5zIGV4dGVybmFsIGluY2VudGl2ZSBJRHMgdHJhY2tlZCBieSBhIGRlcG9zaXQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBscFRva2VuSWQ6IFBvc2l0aW9uIE5GVCB0b2tlbiBJRCB3aG9zZSBkZXBvc2l0IHNob3VsZCBiZSBpbnNwZWN0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbmNlbnRpdmVJZHM6IEluZGVwZW5kZW50IGNvcHkgb2YgZXh0ZXJuYWwgaW5jZW50aXZlIElEcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRlcG9zaXQuCi8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBscFRva2VuSWQgZG9lcyBub3QgcmVzb2x2ZSB0byBhIHN0b3JlZCBkZXBvc2l0LgpmdW5jIEdldERlcG9zaXRFeHRlcm5hbEluY2VudGl2ZUlkTGlzdChscFRva2VuSWQgdWludDY0KSAoW11zdHJpbmcsIGVycm9yKSB7CglpZHMsIGVyciA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldERlcG9zaXRFeHRlcm5hbEluY2VudGl2ZUlkTGlzdChscFRva2VuSWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnIKCX0KCXJldHVybiBjbG9uZVN0cmluZ1NsaWNlKGlkcyksIG5pbAp9CgovLyBHZXRFeHRlcm5hbEluY2VudGl2ZUJ5UG9vbFBhdGggcmV0dXJucyBhbGwgZXh0ZXJuYWwgaW5jZW50aXZlcyBmb3IgYSBwb29sLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCB3aG9zZSBleHRlcm5hbCBpbmNlbnRpdmVzIHNob3VsZCBiZSBsaXN0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbmNlbnRpdmVzOiBJbmRlcGVuZGVudCBjb3BpZXMgb2YgaW5jZW50aXZlcyB0YXJnZXRpbmcgcG9vbFBhdGguCi8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBzdG9yZWQgaW5jZW50aXZlIGRhdGEgY2Fubm90IGJlIHJlYWQgb3IgY2FzdC4KZnVuYyBHZXRFeHRlcm5hbEluY2VudGl2ZUJ5UG9vbFBhdGgocG9vbFBhdGggc3RyaW5nKSAoW11FeHRlcm5hbEluY2VudGl2ZSwgZXJyb3IpIHsKCWluY2VudGl2ZXMsIGVyciA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldEV4dGVybmFsSW5jZW50aXZlQnlQb29sUGF0aChwb29sUGF0aCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoJcmV0dXJuIGNsb25lRXh0ZXJuYWxJbmNlbnRpdmVzKGluY2VudGl2ZXMpLCBuaWwKfQoKLy8gR2V0SW5jZW50aXZlRW5kVGltZXN0YW1wIHJldHVybnMgdGhlIGVuZCB0aW1lc3RhbXAgb2YgYW4gaW5jZW50aXZlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCBjb250YWluaW5nIHRoZSBpbmNlbnRpdmUgcmVjb3JkLgovLyAgIC0gaW5jZW50aXZlSWQ6IEV4dGVybmFsIGluY2VudGl2ZSBpZGVudGlmaWVyIHRvIHJlc29sdmUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlbmRUaW1lc3RhbXA6IEluY2VudGl2ZSBlbmQgdGltZSBhcyBhIFVuaXggdGltZXN0YW1wLgovLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggb3IgaW5jZW50aXZlSWQgY2Fubm90IGJlIHJlc29sdmVkLgpmdW5jIEdldEluY2VudGl2ZUVuZFRpbWVzdGFtcChwb29sUGF0aCBzdHJpbmcsIGluY2VudGl2ZUlkIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0SW5jZW50aXZlRW5kVGltZXN0YW1wKHBvb2xQYXRoLCBpbmNlbnRpdmVJZCkKfQoKLy8gR2V0SW5jZW50aXZlQ3JlYXRvciByZXR1cm5zIHRoZSBjcmVhdG9yIGFkZHJlc3Mgb2YgYW4gaW5jZW50aXZlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCBjb250YWluaW5nIHRoZSBpbmNlbnRpdmUgcmVjb3JkLgovLyAgIC0gaW5jZW50aXZlSWQ6IEV4dGVybmFsIGluY2VudGl2ZSBpZGVudGlmaWVyIHRvIHJlc29sdmUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjcmVhdG9yOiBBZGRyZXNzIHRoYXQgY3JlYXRlZCBhbmQgZnVuZGVkIHRoZSBpbmNlbnRpdmUuCi8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBvciBpbmNlbnRpdmVJZCBjYW5ub3QgYmUgcmVzb2x2ZWQuCmZ1bmMgR2V0SW5jZW50aXZlQ3JlYXRvcihwb29sUGF0aCBzdHJpbmcsIGluY2VudGl2ZUlkIHN0cmluZykgKGFkZHJlc3MsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRJbmNlbnRpdmVDcmVhdG9yKHBvb2xQYXRoLCBpbmNlbnRpdmVJZCkKfQoKLy8gR2V0SW5jZW50aXZlUmV3YXJkQW1vdW50IHJldHVybnMgdGhlIHJlbWFpbmluZyByZXdhcmQgYW1vdW50IG9mIGFuIGluY2VudGl2ZSwgYWZ0ZXIgZGVsaXZlcmllcwovLyBhbmQgcmVmdW5kcyByZXByZXNlbnRlZCBieSB0aGUgY3VycmVudCBpbmNlbnRpdmUgc3RhdGUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIGNvbnRhaW5pbmcgdGhlIGluY2VudGl2ZSByZWNvcmQuCi8vICAgLSBpbmNlbnRpdmVJZDogRXh0ZXJuYWwgaW5jZW50aXZlIGlkZW50aWZpZXIgdG8gcmVzb2x2ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogSW5kZXBlbmRlbnQgdWludDI1NiBjb3B5IG9mIHRoZSBpbmNlbnRpdmUncyBtdXRhYmxlIHJlbWFpbmluZyByZXdhcmQgYW1vdW50LgovLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggb3IgaW5jZW50aXZlSWQgY2Fubm90IGJlIHJlc29sdmVkLgpmdW5jIEdldEluY2VudGl2ZVJld2FyZEFtb3VudChwb29sUGF0aCBzdHJpbmcsIGluY2VudGl2ZUlkIHN0cmluZykgKCp1MjU2LlVpbnQsIGVycm9yKSB7CglhbW91bnQsIGVyciA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldEluY2VudGl2ZVJld2FyZEFtb3VudChwb29sUGF0aCwgaW5jZW50aXZlSWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnIKCX0KCXJldHVybiBhbW91bnQuQ2xvbmUoKSwgbmlsCn0KCi8vIEdldEluY2VudGl2ZVJld2FyZEFtb3VudEFzU3RyaW5nIHJldHVybnMgdGhlIHJlbWFpbmluZyByZXdhcmQgYW1vdW50IG9mIGFuIGluY2VudGl2ZSBhcyBzdHJpbmcuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIGNvbnRhaW5pbmcgdGhlIGluY2VudGl2ZSByZWNvcmQuCi8vICAgLSBpbmNlbnRpdmVJZDogRXh0ZXJuYWwgaW5jZW50aXZlIGlkZW50aWZpZXIgdG8gcmVzb2x2ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogRGVjaW1hbCBzdHJpbmcgZm9yIHRoZSBpbmNlbnRpdmUncyByZW1haW5pbmcgcmV3YXJkIGFtb3VudCBhZnRlciBkZWxpdmVyaWVzIGFuZCByZWZ1bmRzLgovLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggb3IgaW5jZW50aXZlSWQgY2Fubm90IGJlIHJlc29sdmVkLgpmdW5jIEdldEluY2VudGl2ZVJld2FyZEFtb3VudEFzU3RyaW5nKHBvb2xQYXRoIHN0cmluZywgaW5jZW50aXZlSWQgc3RyaW5nKSAoc3RyaW5nLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0SW5jZW50aXZlUmV3YXJkQW1vdW50QXNTdHJpbmcocG9vbFBhdGgsIGluY2VudGl2ZUlkKQp9CgovLyBHZXRJbmNlbnRpdmVSZXdhcmRQZXJTZWNvbmRYMTI4IHJldHVybnMgdGhlIHJld2FyZCByYXRlIHBlciBzZWNvbmQgb2YgYW4KLy8gaW5jZW50aXZlLCBleHByZXNzZWQgYXMgYSBRMTI4IGZpeGVkLXBvaW50IG51bWJlciAoaS5lLiBhY3R1YWwgcmF0ZSA9Ci8vIHZhbHVlIC8gMl4xMjgpLiBDYWxsZXJzIG5lZWRpbmcgYW4gaW50ZWdlciByYXRlIGNhbiByaWdodC1zaGlmdCB0aGUgcmVzdWx0Ci8vIGJ5IDEyOC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBQb29sIHBhdGggY29udGFpbmluZyB0aGUgaW5jZW50aXZlIHJlY29yZC4KLy8gICAtIGluY2VudGl2ZUlkOiBFeHRlcm5hbCBpbmNlbnRpdmUgaWRlbnRpZmllciB0byByZXNvbHZlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcmF0ZVgxMjg6IENsb25lIG9mIHRoZSBRMTI4LXNjYWxlZCByZXdhcmQgcmF0ZTsgZGl2aWRlIGJ5IDJeMTI4IHRvIHJlY292ZXIgdGhlIGFjdHVhbCB0b2tlbiB1bml0cyBwZXIgc2Vjb25kLgovLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggb3IgaW5jZW50aXZlSWQgY2Fubm90IGJlIHJlc29sdmVkLgpmdW5jIEdldEluY2VudGl2ZVJld2FyZFBlclNlY29uZFgxMjgocG9vbFBhdGggc3RyaW5nLCBpbmNlbnRpdmVJZCBzdHJpbmcpICgqdTI1Ni5VaW50LCBlcnJvcikgewoJYW1vdW50LCBlcnIgOj0gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRJbmNlbnRpdmVSZXdhcmRQZXJTZWNvbmRYMTI4KHBvb2xQYXRoLCBpbmNlbnRpdmVJZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoJcmV0dXJuIGFtb3VudC5DbG9uZSgpLCBuaWwKfQoKLy8gR2V0SW5jZW50aXZlUmV3YXJkVG9rZW4gcmV0dXJucyB0aGUgcmV3YXJkIHRva2VuIG9mIGFuIGluY2VudGl2ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBQb29sIHBhdGggY29udGFpbmluZyB0aGUgaW5jZW50aXZlIHJlY29yZC4KLy8gICAtIGluY2VudGl2ZUlkOiBFeHRlcm5hbCBpbmNlbnRpdmUgaWRlbnRpZmllciB0byByZXNvbHZlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdG9rZW5QYXRoOiBSZXdhcmQtdG9rZW4gcGF0aCBjb25maWd1cmVkIGZvciB0aGUgaW5jZW50aXZlLgovLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggb3IgaW5jZW50aXZlSWQgY2Fubm90IGJlIHJlc29sdmVkLgpmdW5jIEdldEluY2VudGl2ZVJld2FyZFRva2VuKHBvb2xQYXRoIHN0cmluZywgaW5jZW50aXZlSWQgc3RyaW5nKSAoc3RyaW5nLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0SW5jZW50aXZlUmV3YXJkVG9rZW4ocG9vbFBhdGgsIGluY2VudGl2ZUlkKQp9CgovLyBHZXRJbmNlbnRpdmVTdGFydFRpbWVzdGFtcCByZXR1cm5zIHRoZSBzdGFydCB0aW1lc3RhbXAgb2YgYW4gaW5jZW50aXZlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCBjb250YWluaW5nIHRoZSBpbmNlbnRpdmUgcmVjb3JkLgovLyAgIC0gaW5jZW50aXZlSWQ6IEV4dGVybmFsIGluY2VudGl2ZSBpZGVudGlmaWVyIHRvIHJlc29sdmUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdGFydFRpbWVzdGFtcDogSW5jZW50aXZlIHN0YXJ0IHRpbWUgYXMgYSBVbml4IHRpbWVzdGFtcC4KLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIG9yIGluY2VudGl2ZUlkIGNhbm5vdCBiZSByZXNvbHZlZC4KZnVuYyBHZXRJbmNlbnRpdmVTdGFydFRpbWVzdGFtcChwb29sUGF0aCBzdHJpbmcsIGluY2VudGl2ZUlkIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0SW5jZW50aXZlU3RhcnRUaW1lc3RhbXAocG9vbFBhdGgsIGluY2VudGl2ZUlkKQp9CgovLyBHZXRNaW5pbXVtUmV3YXJkQW1vdW50IHJldHVybnMgdGhlIGRlZmF1bHQgbWluaW11bSByZXdhcmQgYW1vdW50IHJlcXVpcmVkIHRvIGNyZWF0ZSBhbiBleHRlcm5hbAovLyBpbmNlbnRpdmUuIEEgdG9rZW4tc3BlY2lmaWMgb3ZlcnJpZGUgbWF5IGFwcGx5LgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBEZWZhdWx0IG1pbmltdW0gZXh0ZXJuYWwtaW5jZW50aXZlIHJld2FyZCBhbW91bnQgaW4gdG9rZW4gdW5pdHMuCmZ1bmMgR2V0TWluaW11bVJld2FyZEFtb3VudCgpIGludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldE1pbmltdW1SZXdhcmRBbW91bnQoKQp9CgovLyBHZXRNaW5pbXVtUmV3YXJkQW1vdW50Rm9yVG9rZW4gcmV0dXJucyB0aGUgbWluaW11bSByZXdhcmQgYW1vdW50IGZvciBhIHNwZWNpZmljIHRva2VuLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW5QYXRoOiBUb2tlbiBwYXRoIHdob3NlIGNvbmZpZ3VyZWQgbWluaW11bS1yZXdhcmQgb3ZlcnJpZGUgc2hvdWxkIGJlIHJlYWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IFRva2VuLXNwZWNpZmljIG1pbmltdW0gcmV3YXJkIGFtb3VudCB3aGVuIGNvbmZpZ3VyZWQsIG90aGVyd2lzZSB0aGUgZGVmYXVsdCBtaW5pbXVtLCBpbiB0b2tlbiB1bml0cy4KZnVuYyBHZXRNaW5pbXVtUmV3YXJkQW1vdW50Rm9yVG9rZW4odG9rZW5QYXRoIHN0cmluZykgaW50NjQgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0TWluaW11bVJld2FyZEFtb3VudEZvclRva2VuKHRva2VuUGF0aCkKfQoKLy8gR2V0UG9vbFN0YWtlZExpcXVpZGl0eSByZXR1cm5zIHRoZSBjdXJyZW50IHRvdGFsIHN0YWtlZCBsaXF1aWRpdHkgb2YgYSBwb29sLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCB3aG9zZSBjdXJyZW50IHN0YWtlZCBsaXF1aWRpdHkgc2hvdWxkIGJlIHJlYWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBsaXF1aWRpdHk6IERlY2ltYWwgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBvb2wncyB0b3RhbCBzdGFrZWQgbGlxdWlkaXR5IGF0IHRoZSBjdXJyZW50IHRpbWUuCi8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBkb2VzIG5vdCByZXNvbHZlIHRvIGEgcG9vbC4KZnVuYyBHZXRQb29sU3Rha2VkTGlxdWlkaXR5KHBvb2xQYXRoIHN0cmluZykgKHN0cmluZywgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFBvb2xTdGFrZWRMaXF1aWRpdHkocG9vbFBhdGgpCn0KCi8vIEdldFBvb2xzQnlUaWVyIHJldHVybnMgdGhlIHBvb2wgbGlzdCBmb3IgYSB0aWVyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGllcjogRW1pc3Npb24gdGllciBpZGVudGlmaWVyIHdob3NlIGN1cnJlbnQgcG9vbCBtZW1iZXJzaGlwcyBzaG91bGQgYmUgbGlzdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcG9vbFBhdGhzOiBDb3B5IG9mIHBvb2wgcGF0aHMgY3VycmVudGx5IGFzc2lnbmVkIHRvIHRpZXI7IHRpZXIgemVybyB5aWVsZHMgYW4gZW1wdHkgbGlzdC4KLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIHRoZSBzdG9yZWQgdGllciBtZW1iZXJzaGlwIGNvbnRhaW5zIGFuIGludmFsaWQgdmFsdWUuCmZ1bmMgR2V0UG9vbHNCeVRpZXIodGllciB1aW50NjQpIChbXXN0cmluZywgZXJyb3IpIHsKCXBvb2xzLCBlcnIgOj0gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQb29sc0J5VGllcih0aWVyKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIG5pbCwgZXJyCgl9CglyZXR1cm4gY2xvbmVTdHJpbmdTbGljZShwb29scyksIG5pbAp9CgovLyBHZXRQb29sUmV3YXJkIHJldHVybnMgdGhlIHJld2FyZCBhbW91bnQgZm9yIGEgdGllci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpZXI6IEVtaXNzaW9uIHRpZXIgaWRlbnRpZmllciBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIHBlci1wb29sIHJld2FyZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHJld2FyZDogQ3VycmVudCBwZXItcG9vbCBHTlMgcmV3YXJkIHJhdGUgZm9yIHRpZXIsIGluIHRva2VuIHVuaXRzIHBlciBzZWNvbmQuCi8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiB0aWVyIGlzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlIDEgdGhyb3VnaCBBbGxUaWVyQ291bnQtMS4KZnVuYyBHZXRQb29sUmV3YXJkKHRpZXIgdWludDY0KSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQb29sUmV3YXJkKHRpZXIpCn0KCi8vIEdldFBvb2xUaWVyIHJldHVybnMgdGhlIHRpZXIgb2YgYSBwb29sLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCB3aG9zZSBjdXJyZW50IGVtaXNzaW9uIHRpZXIgc2hvdWxkIGJlIHJlYWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aWVyOiBDdXJyZW50IGVtaXNzaW9uIHRpZXIgaWRlbnRpZmllcjsgemVybyB3aGVuIHRoZSBwb29sIGhhcyBubyB0aWVyIGFzc2lnbm1lbnQuCmZ1bmMgR2V0UG9vbFRpZXIocG9vbFBhdGggc3RyaW5nKSB1aW50NjQgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UG9vbFRpZXIocG9vbFBhdGgpCn0KCi8vIEdldFBvb2xUaWVyQ291bnQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBvb2xzIGluIGEgdGllci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpZXI6IEVtaXNzaW9uIHRpZXIgaWRlbnRpZmllciB0byBjb3VudDsgdGllciB6ZXJvIGhhcyBubyBwb29scy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGNvdW50OiBOdW1iZXIgb2YgcG9vbHMgY3VycmVudGx5IGFzc2lnbmVkIHRvIHRpZXIsIG9yIHplcm8gZm9yIHRpZXIgemVyby4KZnVuYyBHZXRQb29sVGllckNvdW50KHRpZXIgdWludDY0KSB1aW50NjQgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UG9vbFRpZXJDb3VudCh0aWVyKQp9CgovLyBHZXRQb29sVGllclJhdGlvIHJldHVybnMgdGhlIHJld2FyZCByYXRpbyBvZiBhIHBvb2wuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIHdob3NlIGN1cnJlbnQgZW1pc3Npb24gdGllciByYXRpbyBzaG91bGQgYmUgcmVhZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHJhdGlvOiBTdG9yZWQgcmV3YXJkLXNoYXJlIHJhdGlvIGZvciB0aGUgcG9vbCdzIGN1cnJlbnQgdGllci4KLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIHRoZSBwb29sJ3MgdGllciBpcyBpbnZhbGlkIGFuZCBoYXMgbm8gY29uZmlndXJlZCByYXRpby4KZnVuYyBHZXRQb29sVGllclJhdGlvKHBvb2xQYXRoIHN0cmluZykgKHVpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFBvb2xUaWVyUmF0aW8ocG9vbFBhdGgpCn0KCi8vIEdldFNwZWNpZmljVG9rZW5NaW5pbXVtUmV3YXJkQW1vdW50IHJldHVybnMgdGhlIGV4cGxpY2l0bHkgc2V0IG1pbmltdW0gcmV3YXJkIGFtb3VudCBmb3IgYSB0b2tlbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuUGF0aDogVG9rZW4gcGF0aCB3aG9zZSBleHBsaWNpdCBtaW5pbXVtLXJld2FyZCBvdmVycmlkZSBzaG91bGQgYmUgcmVhZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogRXhwbGljaXQgbWluaW11bSByZXdhcmQgYW1vdW50IGluIHRva2VuIHVuaXRzLCBvciAwIHdoZW4gbm8gb3ZlcnJpZGUgaXMgY29uZmlndXJlZC4KLy8gICAtIGZvdW5kOiBUcnVlIHdoZW4gdG9rZW5QYXRoIGhhcyBhbiBleHBsaWNpdCBvdmVycmlkZTsgZmFsc2Ugd2hlbiB0aGUgZGVmYXVsdCB3b3VsZCBiZSB1c2VkLgpmdW5jIEdldFNwZWNpZmljVG9rZW5NaW5pbXVtUmV3YXJkQW1vdW50KHRva2VuUGF0aCBzdHJpbmcpIChpbnQ2NCwgYm9vbCkgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0U3BlY2lmaWNUb2tlbk1pbmltdW1SZXdhcmRBbW91bnQodG9rZW5QYXRoKQp9CgovLyBHZXRUYXJnZXRQb29sUGF0aEJ5SW5jZW50aXZlSWQgcmV0dXJucyB0aGUgcG9vbCBwYXRoIGZvciBhbiBpbmNlbnRpdmUgSUQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIGNvbnRhaW5pbmcgdGhlIGluY2VudGl2ZSByZWNvcmQuCi8vICAgLSBpbmNlbnRpdmVJZDogRXh0ZXJuYWwgaW5jZW50aXZlIGlkZW50aWZpZXIgdG8gcmVzb2x2ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRhcmdldFBvb2xQYXRoOiBQb29sIHBhdGggc3RvcmVkIG9uIHRoZSByZXNvbHZlZCBpbmNlbnRpdmUuCi8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBvciBpbmNlbnRpdmVJZCBjYW5ub3QgYmUgcmVzb2x2ZWQuCmZ1bmMgR2V0VGFyZ2V0UG9vbFBhdGhCeUluY2VudGl2ZUlkKHBvb2xQYXRoIHN0cmluZywgaW5jZW50aXZlSWQgc3RyaW5nKSAoc3RyaW5nLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0VGFyZ2V0UG9vbFBhdGhCeUluY2VudGl2ZUlkKHBvb2xQYXRoLCBpbmNlbnRpdmVJZCkKfQoKLy8gR2V0VW5zdGFraW5nRmVlIHJldHVybnMgdGhlIGN1cnJlbnQgdW5zdGFraW5nIGZlZSByYXRlIGluIGJhc2lzIHBvaW50cyAoMC0xLDAwMDsgMTAwID0gMSUpLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZmVlUmF0ZTogQ3VycmVudCBzdGFraW5nLXJld2FyZCBmZWUgcmF0ZSBpbiBiYXNpcyBwb2ludHMuCmZ1bmMgR2V0VW5zdGFraW5nRmVlKCkgdWludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFVuc3Rha2luZ0ZlZSgpCn0KCi8vIEhhc1Vuc3Rha2VkUG9zaXRpb24gcmV0dXJucyB3aGV0aGVyIGEgcG9zaXRpb24gd2FzIHVuc3Rha2VkIHdpdGggcmV3YXJkcyBsZWZ0IHRvIGNvbGxlY3QuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb3NpdGlvbklkOiBQb3NpdGlvbiBORlQgdG9rZW4gSUQgdG8gY2hlY2sgaW4gdGhlIHVuc3Rha2VkLXBvc2l0aW9uIHRyZWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB1bnN0YWtlZDogVHJ1ZSB3aGVuIHBvc2l0aW9uSWQgaGFzIGFuIGV4aXQgY2hlY2twb2ludCBhd2FpdGluZyBjb2xsZWN0aW9uOyBmYWxzZSBvdGhlcndpc2UuCmZ1bmMgSGFzVW5zdGFrZWRQb3NpdGlvbihwb3NpdGlvbklkIHVpbnQ2NCkgYm9vbCB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5IYXNVbnN0YWtlZFBvc2l0aW9uKHBvc2l0aW9uSWQpCn0KCi8vIEdldFVuc3Rha2VkUG9zaXRpb25FeGl0VGltZSByZXR1cm5zIHRoZSB0aW1lc3RhbXAgYXQgd2hpY2ggYW4gdW5zdGFrZWQgcG9zaXRpb24gc3RvcHBlZCBhY2NydWluZyByZXdhcmRzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9zaXRpb25JZDogUG9zaXRpb24gTkZUIHRva2VuIElEIGlkZW50aWZ5aW5nIHRoZSB1bnN0YWtlZCBleGl0IGNoZWNrcG9pbnQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBleGl0VGltZTogVW5peCB0aW1lc3RhbXAgcGlubmVkIGFzIHRoZSBlbmQgb2YgdGhlIHBvc2l0aW9uJ3MgcmV3YXJkLWFjY3J1YWwgd2luZG93LgovLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9zaXRpb25JZCBoYXMgbm8gdW5zdGFrZWQgY2hlY2twb2ludCB3aXRoIHVuY29sbGVjdGVkIHJld2FyZHMuCmZ1bmMgR2V0VW5zdGFrZWRQb3NpdGlvbkV4aXRUaW1lKHBvc2l0aW9uSWQgdWludDY0KSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRVbnN0YWtlZFBvc2l0aW9uRXhpdFRpbWUocG9zaXRpb25JZCkKfQoKLy8gR2V0VW5zdGFrZWRQb3NpdGlvblBlbmRpbmdJbmNlbnRpdmVzIHJldHVybnMgdGhlIGluY2VudGl2ZXMgYW4gdW5zdGFrZWQgcG9zaXRpb24gaGFzIHlldCB0byBjb2xsZWN0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9zaXRpb25JZDogUG9zaXRpb24gTkZUIHRva2VuIElEIGlkZW50aWZ5aW5nIHRoZSB1bnN0YWtlZCBleGl0IGNoZWNrcG9pbnQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbmNlbnRpdmVJZHM6IENvcHkgb2YgZXh0ZXJuYWwgaW5jZW50aXZlIElEcyBzdGlsbCBwZW5kaW5nIGZvciB0aGUgZXhpdCBjaGVja3BvaW50LgovLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9zaXRpb25JZCBoYXMgbm8gdW5zdGFrZWQgY2hlY2twb2ludCB3aXRoIHVuY29sbGVjdGVkIHJld2FyZHMuCmZ1bmMgR2V0VW5zdGFrZWRQb3NpdGlvblBlbmRpbmdJbmNlbnRpdmVzKHBvc2l0aW9uSWQgdWludDY0KSAoW11zdHJpbmcsIGVycm9yKSB7CglpbmNlbnRpdmVJZHMsIGVyciA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFVuc3Rha2VkUG9zaXRpb25QZW5kaW5nSW5jZW50aXZlcyhwb3NpdGlvbklkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIG5pbCwgZXJyCgl9CglyZXR1cm4gY2xvbmVTdHJpbmdTbGljZShpbmNlbnRpdmVJZHMpLCBuaWwKfQoKLy8gR2V0VW5jb2xsZWN0ZWRJbmNlbnRpdmVDb3VudCByZXR1cm5zIGhvdyBtYW55IHVuc3Rha2VkIHBvc2l0aW9ucyBzdGlsbCBvd2UgYSByZXdhcmQgZnJvbSB0aGUgaW5jZW50aXZlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW5jZW50aXZlSWQ6IEV4dGVybmFsIGluY2VudGl2ZSBpZGVudGlmaWVyIHdob3NlIG91dHN0YW5kaW5nIGV4aXQgcG9zaXRpb25zIHNob3VsZCBiZSBjb3VudGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gY291bnQ6IE51bWJlciBvZiB1bnN0YWtlZCBwb3NpdGlvbnMgd2l0aCBhbiB1bmNvbGxlY3RlZCByZXdhcmQgZm9yIGluY2VudGl2ZUlkLgpmdW5jIEdldFVuY29sbGVjdGVkSW5jZW50aXZlQ291bnQoaW5jZW50aXZlSWQgc3RyaW5nKSBpbnQ2NCB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRVbmNvbGxlY3RlZEluY2VudGl2ZUNvdW50KGluY2VudGl2ZUlkKQp9CgovLyBJc1N0YWtlZCByZXR1cm5zIHdoZXRoZXIgYSBwb3NpdGlvbiBpcyBzdGFrZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb3NpdGlvbklkOiBQb3NpdGlvbiBORlQgdG9rZW4gSUQgdG8gY2hlY2sgaW4gdGhlIGFjdGl2ZSBkZXBvc2l0IHRyZWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdGFrZWQ6IFRydWUgd2hlbiBwb3NpdGlvbklkIGhhcyBhbiBhY3RpdmUgZGVwb3NpdDsgZmFsc2UgZm9yIGFuIHVuc3Rha2VkIG9yIHVua25vd24gcG9zaXRpb24uCmZ1bmMgSXNTdGFrZWQocG9zaXRpb25JZCB1aW50NjQpIGJvb2wgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuSXNTdGFrZWQocG9zaXRpb25JZCkKfQoKLy8gR2V0VG90YWxFbWlzc2lvblNlbnQgcmV0dXJucyB0aGUgdG90YWwgR05TIGVtaXNzaW9uIHNlbnQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IEN1bXVsYXRpdmUgR05TIGVtaXNzaW9uIGFtb3VudCBzZW50IGJ5IHRoZSBzdGFrZXIsIGluIHRva2VuIHVuaXRzLgpmdW5jIEdldFRvdGFsRW1pc3Npb25TZW50KCkgaW50NjQgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0VG90YWxFbWlzc2lvblNlbnQoKQp9CgovLyBHZXRBbGxvd2VkVG9rZW5zIHJldHVybnMgdGhlIGFsbG93ZWQgZXh0ZXJuYWwgaW5jZW50aXZlIHRva2Vucy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRva2VuUGF0aHM6IENvcHkgb2YgdG9rZW4gcGF0aHMgcGVybWl0dGVkIGZvciBleHRlcm5hbCBpbmNlbnRpdmVzLgpmdW5jIEdldEFsbG93ZWRUb2tlbnMoKSBbXXN0cmluZyB7CglyZXR1cm4gY2xvbmVTdHJpbmdTbGljZShnZXRJbXBsZW1lbnRhdGlvbigpLkdldEFsbG93ZWRUb2tlbnMoKSkKfQoKLy8gR2V0RGVuaWVkUmV3YXJkVG9rZW5zIHJldHVybnMgdGhlIGRlbmllZCBleHRlcm5hbCBpbmNlbnRpdmUgcmV3YXJkIHRva2Vucy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRva2VuUGF0aHM6IENvcHkgb2YgdG9rZW4gcGF0aHMgZXhjbHVkZWQgZnJvbSBleHRlcm5hbCBpbmNlbnRpdmUgcmV3YXJkcy4KZnVuYyBHZXREZW5pZWRSZXdhcmRUb2tlbnMoKSBbXXN0cmluZyB7CglyZXR1cm4gY2xvbmVTdHJpbmdTbGljZShnZXRJbXBsZW1lbnRhdGlvbigpLkdldERlbmllZFJld2FyZFRva2VucygpKQp9CgovLyBHZXRXYXJtdXBUZW1wbGF0ZSByZXR1cm5zIHRoZSBjdXJyZW50IHdhcm11cCB0ZW1wbGF0ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHdhcm11cHM6IENvcHkgb2YgdGhlIGNvbmZpZ3VyZWQgd2FybXVwIHNjaGVkdWxlIHVzZWQgZm9yIG5ld2x5IHN0YWtlZCBwb3NpdGlvbnMuCmZ1bmMgR2V0V2FybXVwVGVtcGxhdGUoKSBbXVdhcm11cCB7CglyZXR1cm4gY2xvbmVXYXJtdXBzKGdldEltcGxlbWVudGF0aW9uKCkuR2V0V2FybXVwVGVtcGxhdGUoKSkKfQoKLy8gR2V0UG9vbFJld2FyZENhY2hlcyByZXR1cm5zIGEgcmVhZC1vbmx5IHZpZXcgb2YgYSBwb29sJ3MgcmV3YXJkIGNhY2hlLCBrZXllZAovLyBieSB0aGUgZW5jb2RlZCBibG9jayB0aW1lc3RhbXAuIENhbGxlcnMgcGFnaW5hdGUgaXQgdGhlbXNlbHZlcyB0aHJvdWdoCi8vIEl0ZXJhdGVCeU9mZnNldCBhbmQgZGVjb2RlIGtleXMgd2l0aCBEZWNvZGVJbnQ2NC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBQb29sIHBhdGggd2hvc2UgcmV3YXJkLWNhY2hlIGNoZWNrcG9pbnRzIHNob3VsZCBiZSByZWFkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gY2FjaGVzOiBSZWFkLW9ubHkgdHJlZSBvZiB0aW1lc3RhbXAga2V5cyB0byBjYWNoZWQgcmV3YXJkIHZhbHVlcywgb3IgbmlsIHdoZW4gcG9vbFBhdGggaGFzIG5vIHBvb2wuCmZ1bmMgR2V0UG9vbFJld2FyZENhY2hlcyhwb29sUGF0aCBzdHJpbmcpICpyb3RyZWUuUmVhZE9ubHlUcmVlIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFBvb2xSZXdhcmRDYWNoZXMocG9vbFBhdGgpCn0KCi8vIEdldFBvb2xJbmNlbnRpdmVzIHJldHVybnMgYSByZWFkLW9ubHkgdmlldyBvZiBhIHBvb2wncyBleHRlcm5hbCBpbmNlbnRpdmVzLAovLyBrZXllZCBieSBpbmNlbnRpdmUgSUQuIFJlYWRpbmcgYW4gZW50cnkgeWllbGRzIGEgY2xvbmUsIHNvIHRoZSB2aWV3IGNhbm5vdAovLyBtdXRhdGUgcmVhbG0gc3RhdGUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIHdob3NlIGV4dGVybmFsLWluY2VudGl2ZSByZWNvcmRzIHNob3VsZCBiZSByZWFkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW5jZW50aXZlczogUmVhZC1vbmx5IHRyZWUga2V5ZWQgYnkgaW5jZW50aXZlIElEIHdpdGggY2xvbmVkIGVudHJpZXMsIG9yIG5pbCB3aGVuIHBvb2xQYXRoIGhhcyBubyBwb29sLgpmdW5jIEdldFBvb2xJbmNlbnRpdmVzKHBvb2xQYXRoIHN0cmluZykgKnJvdHJlZS5SZWFkT25seVRyZWUgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UG9vbEluY2VudGl2ZXMocG9vbFBhdGgpCn0KCi8vIEdldFBvb2xHbG9iYWxSZXdhcmRSYXRpb0FjY3VtdWxhdGlvbnMgcmV0dXJucyBhIHJlYWQtb25seSB2aWV3IG9mIGEgcG9vbCdzCi8vIGdsb2JhbCByZXdhcmQgcmF0aW8gYWNjdW11bGF0aW9uLCBrZXllZCBieSB0aGUgZW5jb2RlZCBibG9jayB0aW1lc3RhbXAuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIHdob3NlIGdsb2JhbCByZXdhcmQtcmF0aW8gY2hlY2twb2ludHMgc2hvdWxkIGJlIHJlYWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhY2N1bXVsYXRpb25zOiBSZWFkLW9ubHkgdHJlZSBvZiB0aW1lc3RhbXAga2V5cyB0byBzdG9yZWQgYWNjdW11bGF0aW9uIHZhbHVlcywgb3IgbmlsIHdoZW4gcG9vbFBhdGggaGFzIG5vIHBvb2wuCmZ1bmMgR2V0UG9vbEdsb2JhbFJld2FyZFJhdGlvQWNjdW11bGF0aW9ucyhwb29sUGF0aCBzdHJpbmcpICpyb3RyZWUuUmVhZE9ubHlUcmVlIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFBvb2xHbG9iYWxSZXdhcmRSYXRpb0FjY3VtdWxhdGlvbnMocG9vbFBhdGgpCn0KCi8vIEdldFBvb2xIaXN0b3JpY2FsVGlja3MgcmV0dXJucyBhIHJlYWQtb25seSB2aWV3IG9mIGEgcG9vbCdzIGhpc3RvcmljYWwgdGlja3MsCi8vIGtleWVkIGJ5IHRoZSBlbmNvZGVkIGJsb2NrIHRpbWVzdGFtcCB3aXRoIHRoZSBpbnQzMiB0aWNrIGFzIHRoZSB2YWx1ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBQb29sIHBhdGggd2hvc2UgaGlzdG9yaWNhbCB0aWNrIGNoZWNrcG9pbnRzIHNob3VsZCBiZSByZWFkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdGlja3M6IFJlYWQtb25seSB0cmVlIG9mIHRpbWVzdGFtcCBrZXlzIHRvIGludDMyIHRpY2tzLCBvciBuaWwgd2hlbiBwb29sUGF0aCBoYXMgbm8gcG9vbC4KZnVuYyBHZXRQb29sSGlzdG9yaWNhbFRpY2tzKHBvb2xQYXRoIHN0cmluZykgKnJvdHJlZS5SZWFkT25seVRyZWUgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UG9vbEhpc3RvcmljYWxUaWNrcyhwb29sUGF0aCkKfQoKLy8gR2V0UGVuZGluZ1Byb3RvY29sRmVlcyByZXR1cm5zIHRoZSBwZW5kaW5nIHByb3RvY29sIGZlZSBhbW91bnQgcGVyIHRva2VuIHBhdGguCi8vCi8vIFJldHVybnM6Ci8vICAgLSBmZWVzOiBDb3B5IG9mIHBlbmRpbmcgcHJvdG9jb2wtZmVlIGFtb3VudHMga2V5ZWQgYnkgdG9rZW4gcGF0aCwgaW4gdGhlIGNvcnJlc3BvbmRpbmcgdG9rZW4gdW5pdHMuCmZ1bmMgR2V0UGVuZGluZ1Byb3RvY29sRmVlcygpIG1hcFtzdHJpbmddaW50NjQgewoJcmV0dXJuIGNsb25lU3RyaW5nSW50NjRNYXAoZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQZW5kaW5nUHJvdG9jb2xGZWVzKCkpCn0KGvsHChBnZXR0ZXJfdXRpbHMuZ25vEuYHcGFja2FnZSBzdGFrZXIKCmZ1bmMgY2xvbmVTdHJpbmdTbGljZShzcmMgW11zdHJpbmcpIFtdc3RyaW5nIHsKCWlmIHNyYyA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCWNvcGllZCA6PSBtYWtlKFtdc3RyaW5nLCBsZW4oc3JjKSkKCWNvcHkoY29waWVkLCBzcmMpCglyZXR1cm4gY29waWVkCn0KCmZ1bmMgY2xvbmVTdHJpbmdJbnQ2NE1hcChzcmMgbWFwW3N0cmluZ11pbnQ2NCkgbWFwW3N0cmluZ11pbnQ2NCB7CglpZiBzcmMgPT0gbmlsIHsKCQlyZXR1cm4gbmlsCgl9CgoJY29waWVkIDo9IG1ha2UobWFwW3N0cmluZ11pbnQ2NCwgbGVuKHNyYykpCglmb3Iga2V5LCB2YWx1ZSA6PSByYW5nZSBzcmMgewoJCWNvcGllZFtrZXldID0gdmFsdWUKCX0KCXJldHVybiBjb3BpZWQKfQoKZnVuYyBjbG9uZVN0cmluZ0Jvb2xNYXAoc3JjIG1hcFtzdHJpbmddYm9vbCkgbWFwW3N0cmluZ11ib29sIHsKCWlmIHNyYyA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCgljb3BpZWQgOj0gbWFrZShtYXBbc3RyaW5nXWJvb2wsIGxlbihzcmMpKQoJZm9yIGtleSwgdmFsdWUgOj0gcmFuZ2Ugc3JjIHsKCQljb3BpZWRba2V5XSA9IHZhbHVlCgl9CgoJcmV0dXJuIGNvcGllZAp9CgpmdW5jIGNsb25lRXh0ZXJuYWxJbmNlbnRpdmVzKHNyYyBbXUV4dGVybmFsSW5jZW50aXZlKSBbXUV4dGVybmFsSW5jZW50aXZlIHsKCWlmIHNyYyA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCgljb3BpZWQgOj0gbWFrZShbXUV4dGVybmFsSW5jZW50aXZlLCBsZW4oc3JjKSkKCWZvciBpIDo9IHJhbmdlIHNyYyB7CgkJY29waWVkW2ldID0gKnNyY1tpXS5DbG9uZSgpCgl9CgoJcmV0dXJuIGNvcGllZAp9CgpmdW5jIGNsb25lV2FybXVwcyh3YXJtdXBzIFtdV2FybXVwKSBbXVdhcm11cCB7CglpZiB3YXJtdXBzID09IG5pbCB7CgkJcmV0dXJuIG5pbAoJfQoKCWNvcGllZCA6PSBtYWtlKFtdV2FybXVwLCBsZW4od2FybXVwcykpCgljb3B5KGNvcGllZCwgd2FybXVwcykKCXJldHVybiBjb3BpZWQKfQoaQAoLZ25vbW9kLnRvbWwSMW1vZHVsZSA9ICJnbm8ubGFuZC9yL2dub3N3YXAvc3Rha2VyIgpnbm8gPSAiMC45Igoa7O0CCghwb29sLmdubxLe7QJwYWNrYWdlIHN0YWtlcgoKaW1wb3J0ICgKCSJlcnJvcnMiCgkidGltZSIKCgkiZ25vLmxhbmQvcC9nbm9zd2FwL2NvbnN0cy92MSIKCWkyNTYgImduby5sYW5kL3AvZ25vc3dhcC9pbnQyNTYvdjEiCgl1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKCSJnbm8ubGFuZC9wL2dub3N3YXAvdXRpbHMvdjEiCglicHRyZWUgImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgpjb25zdCBBbGxUaWVyQ291bnQgPSA0IC8vIDAsIDEsIDIsIDMKCi8vIFBvb2wgaXMgYSBzdHJ1Y3QgZm9yIHN0b3JpbmcgYW4gaW5jZW50aXZpemVkIHBvb2wgaW5mb3JtYXRpb24KLy8gRWFjaCBwb29sIHN0b3JlcyBJbmNlbnRpdmVzIGFuZCBUaWNrcyBhc3NvY2lhdGVkIHdpdGggaXQuCi8vCi8vIEZpZWxkczoKLy8gLSBwb29sUGF0aDogVGhlIHBhdGggb2YgdGhlIHBvb2wuCi8vCi8vICAgLSBzdGFrZWRMaXF1aWRpdHk6Ci8vICAgICBUaGUgY3VycmVudCB0b3RhbCBzdGFrZWQgbGlxdWlkaXR5IG9mIHRoZSBpbi1yYW5nZSBwb3NpdGlvbnMgZm9yIHRoZSBwb29sLgovLyAgICAgVXBkYXRlZCB3aGVuIHRpY2sgY3Jvc3MgaGFwcGVucyBvciBzdGFrZS91bnN0YWtlIGhhcHBlbnMuCi8vICAgICBVc2VkIHRvIGNhbGN1bGF0ZSB0aGUgZ2xvYmFsIHJld2FyZCByYXRpbyBhY2N1bXVsYXRpb24gb3IKLy8gICAgIGRlY2lkZSB3aGV0aGVyIHRvIGVudGVyL2V4aXQgdW5jbGFpbWFibGUgcGVyaW9kLgovLwovLyAgIC0gbGFzdFVuY2xhaW1hYmxlVGltZToKLy8gICAgIFRoZSB0aW1lIGF0IHdoaWNoIHRoZSB1bmNsYWltYWJsZSBwZXJpb2Qgc3RhcnRlZC4KLy8gICAgIFNldCB0byAwIHdoZW4gdGhlIHBvb2wgaXMgbm90IGluIGFuIHVuY2xhaW1hYmxlIHBlcmlvZC4KLy8KLy8gICAtIHVuY2xhaW1hYmxlQWNjOgovLyAgICAgVGhlIGFjY3VtdWxhdGVkIHVuZGlzdHJpYnV0ZWQgdW5jbGFpbWFibGUgcmV3YXJkLgovLyAgICAgUmVzZXQgdG8gMCB3aGVuIHByb2Nlc3NVbmNsYWltYWJsZVJld2FyZCBpcyBjYWxsZWQgYW5kIHNlbnQgdG8gY29tbXVuaXR5IHBvb2wuCi8vCi8vICAgLSByZXdhcmRDYWNoZToKLy8gICAgIFRoZSBjYWNoZWQgcGVyLXNlY29uZCByZXdhcmQgZW1pdHRlZCBmb3IgdGhpcyBwb29sLgovLyAgICAgU3RvcmVzIG5ldyBlbnRyeSBvbmx5IHdoZW4gdGhlIHJld2FyZCBpcyBjaGFuZ2VkLgovLyAgICAgUG9vbFRpZXIuY2FjaGVSZXdhcmQoKSB1cGRhdGVzIHRoaXMuCi8vCi8vIC0gaW5jZW50aXZlczogVGhlIGV4dGVybmFsIGluY2VudGl2ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb29sLgovLwovLyAtIHRpY2tzOiBUaGUgVGlja3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb29sLgovLwovLyAgIC0gZ2xvYmFsUmV3YXJkUmF0aW9BY2N1bXVsYXRpb246Ci8vICAgICBHbG9iYWwgcmF0aW8gb2YgVGltZSAvIFRvdGFsU3Rha2UgYWNjdW11bGF0aW9uKHNpbmNlIHRoZSBwb29sIGNyZWF0aW9uKQovLyAgICAgU3RvcmVzIG5ldyBlbnRyeSBvbmx5IHdoZW4gdGljayBjcm9zcyBvciBzdGFrZS91bnN0YWtlIGhhcHBlbnMuCi8vICAgICBJdCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcmV3YXJkIGZvciBhIHN0YWtlZCBwb3NpdGlvbiBhdCBjZXJ0YWluIHRpbWUuCi8vCi8vICAgLSBoaXN0b3JpY2FsVGljazoKLy8gICAgIFRoZSBoaXN0b3JpY2FsIHRpY2sgZm9yIHRoZSBwb29sIGF0IGEgZ2l2ZW4gdGltZS4KLy8gICAgIEl0IGRvZXMgbm90IHJlZmxlY3QgdGhlIGV4YWN0IHRpY2sgYXQgdGhlIHRpbWVzdGFtcCwKLy8gICAgIGJ1dCBpdCBwcm92aWRlcyBjb3JyZWN0IG9yZGVyaW5nIGZvciB0aGUgc3Rha2VkIHBvc2l0aW9uJ3MgdGlja3MuCi8vICAgICBUaGVyZWZvcmUsIHlvdSBzaG91bGQgbm90IGNvbXBhcmUgaXQgZm9yIGVxdWFsaXR5LCBvbmx5IGZvciBvcmRlcmluZy4KLy8gICAgIFNldCB3aGVuIHRpY2sgY3Jvc3MgaGFwcGVucyBvciBhIG5ldyBwb3NpdGlvbiBpcyBjcmVhdGVkLgp0eXBlIFBvb2wgc3RydWN0IHsKCXBvb2xQYXRoIHN0cmluZwoKCXN0YWtlZExpcXVpZGl0eSAqVWludFRyZWUgLy8gdWludDY0IHRpbWVzdGFtcCAtPiAqdTI1Ni5VaW50KFExMjgpCgoJbGFzdFVuY2xhaW1hYmxlVGltZSBpbnQ2NAoJdW5jbGFpbWFibGVBY2MgICAgICBpbnQ2NAoKCXJld2FyZENhY2hlICpVaW50VHJlZSAvLyB1aW50NjQgdGltZXN0YW1wIC0+IGludDY0IGduc1Jld2FyZAoKCWluY2VudGl2ZXMgKkluY2VudGl2ZXMKCgl0aWNrcyBUaWNrcyAvLyBpbnQzMiB0aWNrSWQgLT4gVGljayB0aWNrCgoJZ2xvYmFsUmV3YXJkUmF0aW9BY2N1bXVsYXRpb24gKlVpbnRUcmVlIC8vIHVpbnQ2NCB0aW1lc3RhbXAgLT4gKnUyNTYuVWludChRMTI4KSByZXdhcmRSYXRpb0FjY3VtdWxhdGlvbgoKCWhpc3RvcmljYWxUaWNrICpVaW50VHJlZSAvLyB1aW50NjQgdGltZXN0YW1wIC0+IGludDMyIHRpY2tJZAp9CgovLyBQb29sIEdldHRlci9TZXR0ZXIgbWV0aG9kcwoKLy8gUG9vbFBhdGggcmV0dXJucyB0aGUgcG9vbCBwYXRoCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwYXRoOiBQb29sIGlkZW50aWZpZXIgdXNlZCB0byBhc3NvY2lhdGUgdGhpcyBzdGF0ZSB3aXRoIGEgbGlxdWlkaXR5IHBvb2wuCmZ1bmMgKHAgKlBvb2wpIFBvb2xQYXRoKCkgc3RyaW5nIHsKCXJldHVybiBwLnBvb2xQYXRoCn0KCi8vIFNldFBvb2xQYXRoIHNldHMgdGhlIHBvb2wgcGF0aAovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IFBvb2wgaWRlbnRpZmllciB0byBzdG9yZS4KZnVuYyAocCAqUG9vbCkgU2V0UG9vbFBhdGgocG9vbFBhdGggc3RyaW5nKSB7CglwLnBvb2xQYXRoID0gcG9vbFBhdGgKfQoKLy8gU3Rha2VkTGlxdWlkaXR5IHJldHVybnMgdGhlIHN0YWtlZCBsaXF1aWRpdHkgdHJlZQovLwovLyBSZXR1cm5zOgovLyAgIC0gdHJlZTogSGlzdG9yaWNhbCBzdGFrZWQtbGlxdWlkaXR5IHRyZWUga2V5ZWQgYnkgVW5peCB0aW1lc3RhbXAsIHdpdGggUTEyOC1zY2FsZWQgbGlxdWlkaXR5IHZhbHVlcy4KZnVuYyAocCAqUG9vbCkgU3Rha2VkTGlxdWlkaXR5KCkgKlVpbnRUcmVlIHsKCXJldHVybiBwLnN0YWtlZExpcXVpZGl0eQp9CgovLyBTZXRTdGFrZWRMaXF1aWRpdHkgc2V0cyB0aGUgc3Rha2VkIGxpcXVpZGl0eSB0cmVlCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzdGFrZWRMaXF1aWRpdHk6IFRyZWUgb2YgaGlzdG9yaWNhbCB0b3RhbCBzdGFrZWQgbGlxdWlkaXR5IHNuYXBzaG90cy4KZnVuYyAocCAqUG9vbCkgU2V0U3Rha2VkTGlxdWlkaXR5KHN0YWtlZExpcXVpZGl0eSAqVWludFRyZWUpIHsKCXAuc3Rha2VkTGlxdWlkaXR5ID0gc3Rha2VkTGlxdWlkaXR5Cn0KCi8vIFNldFN0YWtlZExpcXVpZGl0eUF0IHJlY29yZHMgdGhlIGN1cnJlbnQgdG90YWwgc3Rha2VkIGxpcXVpZGl0eSBhdCBhIHRpbWVzdGFtcC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cnJlbnRUaW1lOiBOb25uZWdhdGl2ZSBVbml4IHRpbWVzdGFtcCBpbiBzZWNvbmRzIHVzZWQgYXMgdGhlIHNuYXBzaG90IGtleS4KLy8gICAtIGRlbHRhOiBUb3RhbCBzdGFrZWQgbGlxdWlkaXR5IGF0IGN1cnJlbnRUaW1lLCBzdG9yZWQgYXMgYSBjb3BpZWQgUTEyOC1zY2FsZWQgdWludCB2YWx1ZS4KZnVuYyAocCAqUG9vbCkgU2V0U3Rha2VkTGlxdWlkaXR5QXQoY3VycmVudFRpbWUgaW50NjQsIGRlbHRhICp1MjU2LlVpbnQpIHsKCXAuU3Rha2VkTGlxdWlkaXR5KCkuU2V0KGN1cnJlbnRUaW1lLCB1MjU2Llplcm8oKS5TZXQoZGVsdGEpKQp9CgovLyBMYXN0VW5jbGFpbWFibGVUaW1lIHJldHVybnMgdGhlIGxhc3QgdW5jbGFpbWFibGUgdGltZQovLwovLyBSZXR1cm5zOgovLyAgIC0gdGltZXN0YW1wOiBVbml4IHRpbWVzdGFtcCBpbiBzZWNvbmRzIGF0IHdoaWNoIHRoZSBwb29sIGVudGVyZWQgaXRzIGN1cnJlbnQgdW5jbGFpbWFibGUgcGVyaW9kLCBvciAwIHdoZW4gdHJhY2tpbmcgaGFzIG5vdCBzdGFydGVkLgpmdW5jIChwICpQb29sKSBMYXN0VW5jbGFpbWFibGVUaW1lKCkgaW50NjQgewoJcmV0dXJuIHAubGFzdFVuY2xhaW1hYmxlVGltZQp9CgovLyBTZXRMYXN0VW5jbGFpbWFibGVUaW1lIHNldHMgdGhlIGxhc3QgdW5jbGFpbWFibGUgdGltZQovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gbGFzdFVuY2xhaW1hYmxlVGltZTogVW5peCB0aW1lc3RhbXAgaW4gc2Vjb25kcyBtYXJraW5nIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCB1bmNsYWltYWJsZSBwZXJpb2Q7IHVzZSAwIHdoZW4gbm8gcGVyaW9kIGlzIGFjdGl2ZS4KZnVuYyAocCAqUG9vbCkgU2V0TGFzdFVuY2xhaW1hYmxlVGltZShsYXN0VW5jbGFpbWFibGVUaW1lIGludDY0KSB7CglwLmxhc3RVbmNsYWltYWJsZVRpbWUgPSBsYXN0VW5jbGFpbWFibGVUaW1lCn0KCi8vIFVuY2xhaW1hYmxlQWNjIHJldHVybnMgdGhlIHVuY2xhaW1hYmxlIGFjY3VtdWxhdGlvbgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBBY2N1bXVsYXRlZCB1bmRpc3RyaWJ1dGVkIHVuY2xhaW1hYmxlIHJld2FyZCBhbW91bnQgaW4gdGhlIHBvb2wncyBpbnQ2NCByZXdhcmQgdW5pdHMuCmZ1bmMgKHAgKlBvb2wpIFVuY2xhaW1hYmxlQWNjKCkgaW50NjQgewoJcmV0dXJuIHAudW5jbGFpbWFibGVBY2MKfQoKLy8gU2V0VW5jbGFpbWFibGVBY2Mgc2V0cyB0aGUgdW5jbGFpbWFibGUgYWNjdW11bGF0aW9uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB1bmNsYWltYWJsZUFjYzogQWNjdW11bGF0ZWQgdW5kaXN0cmlidXRlZCB1bmNsYWltYWJsZSByZXdhcmQgYW1vdW50IGluIHRoZSBwb29sJ3MgaW50NjQgcmV3YXJkIHVuaXRzLgpmdW5jIChwICpQb29sKSBTZXRVbmNsYWltYWJsZUFjYyh1bmNsYWltYWJsZUFjYyBpbnQ2NCkgewoJcC51bmNsYWltYWJsZUFjYyA9IHVuY2xhaW1hYmxlQWNjCn0KCi8vIFJld2FyZENhY2hlIHJldHVybnMgdGhlIHJld2FyZCBjYWNoZSB0cmVlCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0cmVlOiBIaXN0b3JpY2FsIHBlci1zZWNvbmQgR05TIHJld2FyZCBjYWNoZSBrZXllZCBieSBVbml4IHRpbWVzdGFtcC4KZnVuYyAocCAqUG9vbCkgUmV3YXJkQ2FjaGUoKSAqVWludFRyZWUgewoJcmV0dXJuIHAucmV3YXJkQ2FjaGUKfQoKLy8gU2V0UmV3YXJkQ2FjaGUgc2V0cyB0aGUgcmV3YXJkIGNhY2hlIHRyZWUKLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHJld2FyZENhY2hlOiBUcmVlIGNvbnRhaW5pbmcgdGhlIHBvb2wncyBwZXItc2Vjb25kIEdOUyByZXdhcmQgc25hcHNob3RzLgpmdW5jIChwICpQb29sKSBTZXRSZXdhcmRDYWNoZShyZXdhcmRDYWNoZSAqVWludFRyZWUpIHsKCXAucmV3YXJkQ2FjaGUgPSByZXdhcmRDYWNoZQp9CgovLyBTZXRSZXdhcmRDYWNoZUF0IHJlY29yZHMgdGhlIHBlci1zZWNvbmQgcmV3YXJkIHJhdGUgZm9yIGEgdGltZXN0YW1wLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VycmVudFRpbWU6IE5vbm5lZ2F0aXZlIFVuaXggdGltZXN0YW1wIGluIHNlY29uZHMgdXNlZCBhcyB0aGUgY2FjaGUga2V5LgovLyAgIC0gcmV3YXJkOiBHTlMgcmV3YXJkIGVtaXR0ZWQgcGVyIHNlY29uZCBmcm9tIGN1cnJlbnRUaW1lIHVudGlsIHRoZSBuZXh0IGNhY2hlZCBjaGFuZ2UuCmZ1bmMgKHAgKlBvb2wpIFNldFJld2FyZENhY2hlQXQoY3VycmVudFRpbWUgaW50NjQsIHJld2FyZCBpbnQ2NCkgewoJcC5SZXdhcmRDYWNoZSgpLlNldChjdXJyZW50VGltZSwgcmV3YXJkKQp9CgovLyBJbmNlbnRpdmVzIHJldHVybnMgdGhlIGluY2VudGl2ZXMKLy8KLy8gUmV0dXJuczoKLy8gICAtIGluY2VudGl2ZXM6IEV4dGVybmFsLWluY2VudGl2ZSBjb2xsZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBvb2wuCmZ1bmMgKHAgKlBvb2wpIEluY2VudGl2ZXMoKSAqSW5jZW50aXZlcyB7CglyZXR1cm4gcC5pbmNlbnRpdmVzCn0KCi8vIFNldEluY2VudGl2ZXMgc2V0cyB0aGUgaW5jZW50aXZlcwovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW5jZW50aXZlczogRXh0ZXJuYWwtaW5jZW50aXZlIGNvbGxlY3Rpb24gdG8gYXNzb2NpYXRlIHdpdGggdGhlIHBvb2wuCmZ1bmMgKHAgKlBvb2wpIFNldEluY2VudGl2ZXMoaW5jZW50aXZlcyAqSW5jZW50aXZlcykgewoJcC5pbmNlbnRpdmVzID0gaW5jZW50aXZlcwp9CgovLyBUaWNrcyByZXR1cm5zIHRoZSB0aWNrcwovLwovLyBSZXR1cm5zOgovLyAgIC0gdGlja3M6IEFkZHJlc3NhYmxlIHRpY2sgbWFwcGluZyBmb3IgdGhpcyBwb29sJ3Mgc3Rha2VkIHBvc2l0aW9ucy4KZnVuYyAocCAqUG9vbCkgVGlja3MoKSAqVGlja3MgewoJcmV0dXJuICZwLnRpY2tzCn0KCi8vIFNldFRpY2tzIHNldHMgdGhlIHRpY2tzCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aWNrczogVGljayBtYXBwaW5nIHZhbHVlIHRvIHN0b3JlIGluIHRoZSBwb29sLgpmdW5jIChwICpQb29sKSBTZXRUaWNrcyh0aWNrcyBUaWNrcykgewoJcC50aWNrcyA9IHRpY2tzCn0KCi8vIEdsb2JhbFJld2FyZFJhdGlvQWNjdW11bGF0aW9uIHJldHVybnMgdGhlIGdsb2JhbCByZXdhcmQgcmF0aW8gYWNjdW11bGF0aW9uIHRyZWUKLy8KLy8gUmV0dXJuczoKLy8gICAtIHRyZWU6IEhpc3RvcmljYWwgZ2xvYmFsIHRpbWUtcGVyLXRvdGFsLXN0YWtlIGFjY3VtdWxhdGlvbiBrZXllZCBieSBVbml4IHRpbWVzdGFtcC4KZnVuYyAocCAqUG9vbCkgR2xvYmFsUmV3YXJkUmF0aW9BY2N1bXVsYXRpb24oKSAqVWludFRyZWUgewoJcmV0dXJuIHAuZ2xvYmFsUmV3YXJkUmF0aW9BY2N1bXVsYXRpb24KfQoKLy8gU2V0R2xvYmFsUmV3YXJkUmF0aW9BY2N1bXVsYXRpb24gc2V0cyB0aGUgZ2xvYmFsIHJld2FyZCByYXRpbyBhY2N1bXVsYXRpb24gdHJlZQovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZ2xvYmFsUmV3YXJkUmF0aW9BY2N1bXVsYXRpb246IFRyZWUgb2Ygc2VyaWFsaXplZCBRMTI4LXNjYWxlZCByZXdhcmQtcmF0aW8gYWNjdW11bGF0aW9uIHNuYXBzaG90cy4KZnVuYyAocCAqUG9vbCkgU2V0R2xvYmFsUmV3YXJkUmF0aW9BY2N1bXVsYXRpb24oZ2xvYmFsUmV3YXJkUmF0aW9BY2N1bXVsYXRpb24gKlVpbnRUcmVlKSB7CglwLmdsb2JhbFJld2FyZFJhdGlvQWNjdW11bGF0aW9uID0gZ2xvYmFsUmV3YXJkUmF0aW9BY2N1bXVsYXRpb24KfQoKLy8gU2V0R2xvYmFsUmV3YXJkUmF0aW9BY2N1bXVsYXRpb25BdCByZWNvcmRzIGEgc2VyaWFsaXplZCBnbG9iYWwgcmV3YXJkLXJhdGlvIGFjY3VtdWxhdGlvbiBzbmFwc2hvdC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cnJlbnRUaW1lOiBOb25uZWdhdGl2ZSBVbml4IHRpbWVzdGFtcCBpbiBzZWNvbmRzIHVzZWQgYXMgdGhlIHNuYXBzaG90IGtleS4KLy8gICAtIGFjYzogU2VyaWFsaXplZCBRMTI4LXNjYWxlZCBnbG9iYWwgcmV3YXJkLXJhdGlvIGFjY3VtdWxhdGlvbiB2YWx1ZS4KZnVuYyAocCAqUG9vbCkgU2V0R2xvYmFsUmV3YXJkUmF0aW9BY2N1bXVsYXRpb25BdChjdXJyZW50VGltZSBpbnQ2NCwgYWNjIHN0cmluZykgewoJcC5HbG9iYWxSZXdhcmRSYXRpb0FjY3VtdWxhdGlvbigpLlNldChjdXJyZW50VGltZSwgYWNjKQp9CgovLyBIaXN0b3JpY2FsVGljayByZXR1cm5zIHRoZSBoaXN0b3JpY2FsIHRpY2sgdHJlZQovLwovLyBSZXR1cm5zOgovLyAgIC0gdHJlZTogSGlzdG9yaWNhbCB0aWNrLUlEIG9yZGVyaW5nIHNuYXBzaG90cyBrZXllZCBieSBVbml4IHRpbWVzdGFtcC4KZnVuYyAocCAqUG9vbCkgSGlzdG9yaWNhbFRpY2soKSAqVWludFRyZWUgewoJcmV0dXJuIHAuaGlzdG9yaWNhbFRpY2sKfQoKLy8gU2V0SGlzdG9yaWNhbFRpY2sgc2V0cyB0aGUgaGlzdG9yaWNhbCB0aWNrIHRyZWUKLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGhpc3RvcmljYWxUaWNrOiBUcmVlIG9mIHRpY2sgSURzIHJlcHJlc2VudGluZyB0aGUgb3JkZXJpbmcgaGlzdG9yeSBvZiBzdGFrZWQgcG9zaXRpb25zLgpmdW5jIChwICpQb29sKSBTZXRIaXN0b3JpY2FsVGljayhoaXN0b3JpY2FsVGljayAqVWludFRyZWUpIHsKCXAuaGlzdG9yaWNhbFRpY2sgPSBoaXN0b3JpY2FsVGljawp9CgovLyBTZXRIaXN0b3JpY2FsVGlja0F0IHJlY29yZHMgdGhlIHRpY2sgb3JkZXJpbmcgc25hcHNob3QgZm9yIGEgdGltZXN0YW1wLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VycmVudFRpbWU6IE5vbm5lZ2F0aXZlIFVuaXggdGltZXN0YW1wIGluIHNlY29uZHMgdXNlZCBhcyB0aGUgc25hcHNob3Qga2V5LgovLyAgIC0gdGljazogVGljayBJRCByZXByZXNlbnRpbmcgdGhlIHBvb2wncyBoaXN0b3JpY2FsIG9yZGVyaW5nIGF0IGN1cnJlbnRUaW1lLgpmdW5jIChwICpQb29sKSBTZXRIaXN0b3JpY2FsVGlja0F0KGN1cnJlbnRUaW1lIGludDY0LCB0aWNrIGludDMyKSB7CglwLkhpc3RvcmljYWxUaWNrKCkuU2V0KGN1cnJlbnRUaW1lLCB0aWNrKQp9CgovLyBDbG9uZSByZXR1cm5zIGEgcG9vbCBjb3B5IG9mIHRoZSBzY2FsYXIgc3RhdGUgd2l0aCBhIGZyZXNoIHRpY2sgY29udGFpbmVyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcG9vbDogUG9vbCBjb3B5IGNhcnJ5aW5nIHNjYWxhciBzdGF0ZSBhbmQgYSBmcmVzaCB0aWNrIGNvbnRhaW5lcjsgYmFja2luZyB0cmVlcyBhbmQgaW5jZW50aXZlcyBhcmUgbmlsLCBhbmQgbmlsIHJlY2VpdmVyIHlpZWxkcyBuaWwuCmZ1bmMgKHAgKlBvb2wpIENsb25lKCkgKlBvb2wgewoJaWYgcCA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCglyZXR1cm4gJlBvb2x7CgkJcG9vbFBhdGg6ICAgICAgICAgICAgICAgICAgICAgIHAucG9vbFBhdGgsCgkJc3Rha2VkTGlxdWlkaXR5OiAgICAgICAgICAgICAgIG5pbCwKCQlsYXN0VW5jbGFpbWFibGVUaW1lOiAgICAgICAgICAgcC5sYXN0VW5jbGFpbWFibGVUaW1lLAoJCXVuY2xhaW1hYmxlQWNjOiAgICAgICAgICAgICAgICBwLnVuY2xhaW1hYmxlQWNjLAoJCXJld2FyZENhY2hlOiAgICAgICAgICAgICAgICAgICBuaWwsCgkJaW5jZW50aXZlczogICAgICAgICAgICAgICAgICAgIG5pbCwKCQl0aWNrczogICAgICAgICAgICAgICAgICAgICAgICAgTmV3VGlja3MoKSwKCQlnbG9iYWxSZXdhcmRSYXRpb0FjY3VtdWxhdGlvbjogbmlsLAoJCWhpc3RvcmljYWxUaWNrOiAgICAgICAgICAgICAgICBuaWwsCgl9Cn0KCi8vIE5ld1Bvb2wgY3JlYXRlcyBwb29sIHJld2FyZCBzdGF0ZSBpbml0aWFsaXplZCBhdCBjdXJyZW50VGltZSAoVW5peCBzZWNvbmRzKS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBQb29sIGlkZW50aWZpZXIgdG8gc3RvcmUgaW4gdGhlIG5ldyByZXdhcmQtc3RhdGUgb2JqZWN0LgovLyAgIC0gY3VycmVudFRpbWU6IFVuaXggdGltZXN0YW1wIGluIHNlY29uZHMgdXNlZCB0byBzZWVkIHRoZSBpbml0aWFsIGFjY3VtdWxhdGlvbiwgcmV3YXJkLWNhY2hlLCBhbmQgbGlxdWlkaXR5IHNuYXBzaG90cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHBvb2w6IEluaXRpYWxpemVkIHBvb2wgd2l0aCBlbXB0eSBiYWNraW5nIHN0cnVjdHVyZXMgYW5kIHplcm8gaW5pdGlhbCByZXdhcmQvbGlxdWlkaXR5IHNuYXBzaG90cyBhdCBjdXJyZW50VGltZS4KZnVuYyBOZXdQb29sKHBvb2xQYXRoIHN0cmluZywgY3VycmVudFRpbWUgaW50NjQpICpQb29sIHsKCXBvb2wgOj0gJlBvb2x7CgkJcG9vbFBhdGg6ICAgICAgICBwb29sUGF0aCwKCQlzdGFrZWRMaXF1aWRpdHk6IE5ld1VpbnRUcmVlTig2NCksCgkJLy8gbGFzdFVuY2xhaW1hYmxlVGltZSBpcyBpbml0aWFsaXplZCB0byAwLCB3aGljaCBtZWFucyAidHJhY2tpbmcgbm90IHN0YXJ0ZWQgeWV0Ii4KCQkvLyBXaGVuIHRoZSBwb29sIHJlY2VpdmVzIGEgdGllciBhc3NpZ25tZW50IChvciBleHRlcm5hbCBpbmNlbnRpdmUpLCBgY2FjaGVSZXdhcmRgIHdpbGwgYmUgY2FsbGVkLAoJCS8vIHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSBjYWxsIGBzdGFydFVuY2xhaW1hYmxlUGVyaW9kYCBpZiB0aGUgcG9vbCBoYXMgemVybyBsaXF1aWRpdHkuCgkJLy8gVGhpcyBlbnN1cmVzIHByb3BlciB1bmNsYWltYWJsZSBwZXJpb2QgdHJhY2tpbmcgZnJvbSB0aGUgbW9tZW50IHJld2FyZHMgc3RhcnQgZW1pdHRpbmcuCgkJbGFzdFVuY2xhaW1hYmxlVGltZTogICAgICAgICAgIDAsCgkJdW5jbGFpbWFibGVBY2M6ICAgICAgICAgICAgICAgIDAsCgkJcmV3YXJkQ2FjaGU6ICAgICAgICAgICAgICAgICAgIE5ld1VpbnRUcmVlTig2NCksCgkJaW5jZW50aXZlczogICAgICAgICAgICAgICAgICAgIE5ld0luY2VudGl2ZXMocG9vbFBhdGgpLAoJCXRpY2tzOiAgICAgICAgICAgICAgICAgICAgICAgICBOZXdUaWNrcygpLAoJCWdsb2JhbFJld2FyZFJhdGlvQWNjdW11bGF0aW9uOiBOZXdVaW50VHJlZU4oNjQpLAoJCWhpc3RvcmljYWxUaWNrOiAgICAgICAgICAgICAgICBOZXdVaW50VHJlZU4oNjQpLAoJfQoKCXBvb2wuU2V0R2xvYmFsUmV3YXJkUmF0aW9BY2N1bXVsYXRpb25BdChjdXJyZW50VGltZSwgIjAiKQoKCS8vIEluaXRpYWxpemUgcmV3YXJkQ2FjaGUgdG8gMCB0byBlbnN1cmUgYGNhY2hlUmV3YXJkYCB3aWxsIHRyaWdnZXIgb24gZmlyc3QgdGllciBhc3NpZ25tZW50Cglwb29sLlNldFJld2FyZENhY2hlQXQoY3VycmVudFRpbWUsIGludDY0KDApKQoJcG9vbC5TZXRTdGFrZWRMaXF1aWRpdHlBdChjdXJyZW50VGltZSwgdTI1Ni5aZXJvKCkpCgoJcmV0dXJuIHBvb2wKfQoKLy8gSW5jZW50aXZlcyByZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBleHRlcm5hbCBpbmNlbnRpdmVzIGZvciBhIHNwZWNpZmljIHBvb2wuCi8vCi8vIEZpZWxkczoKLy8KLy8gICAtIGluY2VudGl2ZXM6IEJQVHJlZSBzdG9yaW5nIEV4dGVybmFsSW5jZW50aXZlIG9iamVjdHMgaW5kZXhlZCBieSBpbmNlbnRpdmVJZAovLyAgICAgVGhlIGluY2VudGl2ZUlkIHNlcnZlcyBhcyB0aGUga2V5IHRvIGVmZmljaWVudGx5IGxvb2t1cCBpbmNlbnRpdmUgZGV0YWlscwovLwovLyAgIC0gdGFyZ2V0UG9vbFBhdGg6IFN0cmluZyBpZGVudGlmaWVyIGZvciB0aGUgcG9vbCB0aGlzIGluY2VudGl2ZSBjb2xsZWN0aW9uIGJlbG9uZ3MgdG8KLy8gICAgIFVzZWQgdG8gYXNzb2NpYXRlIGluY2VudGl2ZXMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIGxpcXVpZGl0eSBwb29sCi8vCi8vICAgLSB1bmNsYWltYWJsZVBlcmlvZHM6IFRyZWUgc3RvcmluZyBwZXJpb2RzIHdoZW4gcmV3YXJkcyBjYW5ub3QgYmUgY2xhaW1lZAovLyAgICAgTWFwcyBzdGFydCB0aW1lc3RhbXAgKGtleSkgdG8gZW5kIHRpbWVzdGFtcCAodmFsdWUpCi8vICAgICBBbiBlbmQgdGltZXN0YW1wIG9mIDAgaW5kaWNhdGVzIGFuIG9uZ29pbmcgdW5jbGFpbWFibGUgcGVyaW9kCi8vICAgICBVc2VkIHRvIHRyYWNrIGludGVydmFscyB3aGVuIHN0YWtpbmcgcmV3YXJkcyBhcmUgbm90IGNsYWltYWJsZQovLwovLyAgIC0gYnlTdGFydFRpbWU6IFBlci1wb29sIHN0YXJ0LXRpbWUgaW5kZXggbWFwcGluZyBhbiBpbmNlbnRpdmUncyBzdGFydAovLyAgICAgdGltZXN0YW1wIChrZXkpIHRvIHRoZSBpbmNlbnRpdmUgSURzIHRoYXQgc3RhcnQgYXQgdGhhdCB0aW1lc3RhbXAKLy8gICAgICh2YWx1ZSkuIFRoaXMgbWlycm9ycyB0aGUgbGF6eS1kaXNjb3ZlcnkgbG9va3VwIHByZXZpb3VzbHkgc2VydmVkIGJ5IGEKLy8gICAgIGdsb2JhbCBjcmVhdGlvbi10aW1lIGluZGV4LCBidXQgc2NvcGVkIHRvIHRoaXMgcG9vbCdzIG93biBpbmNlbnRpdmVzLCBzbwovLyAgICAgZGlzY292ZXJ5IGNvc3QgaXMgYm91bmRlZCBieSB0aGlzIHBvb2wncyBpbmNlbnRpdmVzIGluc3RlYWQgb2YgZ3Jvd2luZwovLyAgICAgd2l0aCB0aGUgdG90YWwgbnVtYmVyIG9mIGluY2VudGl2ZXMgc3lzdGVtLXdpZGUuCnR5cGUgSW5jZW50aXZlcyBzdHJ1Y3QgewoJaW5jZW50aXZlcyAqYnB0cmVlLkJQVHJlZSAvLyAoaW5jZW50aXZlSWQpID0+IEV4dGVybmFsSW5jZW50aXZlCgoJdGFyZ2V0UG9vbFBhdGggc3RyaW5nIC8vIFRoZSB0YXJnZXQgcG9vbCBwYXRoIGZvciB0aGlzIGluY2VudGl2ZSBjb2xsZWN0aW9uCgoJdW5jbGFpbWFibGVQZXJpb2RzICpVaW50VHJlZSAvLyBibG9ja1RpbWVzdGFtcCAtPiBhbnkKCglieVN0YXJ0VGltZSAqVWludFRyZWUgLy8gc3RhcnRUaW1lc3RhbXAgLT4gW11pbmNlbnRpdmVJZAp9CgovLyBJbmNlbnRpdmVzIEdldHRlci9TZXR0ZXIgbWV0aG9kcwoKLy8gSW5jZW50aXZlcyByZXR1cm5zIHRoZSBpbmNlbnRpdmVzIHRyZWUKLy8KLy8gUmV0dXJuczoKLy8gICAtIHRyZWU6IE11dGFibGUgQisgdHJlZSBtYXBwaW5nIGluY2VudGl2ZSBJRHMgdG8gRXh0ZXJuYWxJbmNlbnRpdmUgcmVjb3Jkcy4KZnVuYyAoaSAqSW5jZW50aXZlcykgSW5jZW50aXZlVHJlZXMoKSAqYnB0cmVlLkJQVHJlZSB7CglyZXR1cm4gaS5pbmNlbnRpdmVzCn0KCi8vIFNldEluY2VudGl2ZXMgc2V0cyB0aGUgaW5jZW50aXZlcyB0cmVlCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbmNlbnRpdmVzOiBCKyB0cmVlIHRvIHVzZSBmb3IgaW5jZW50aXZlIElEIGxvb2t1cHMgYW5kIHN0b3JhZ2UuCmZ1bmMgKGkgKkluY2VudGl2ZXMpIFNldEluY2VudGl2ZXMoaW5jZW50aXZlcyAqYnB0cmVlLkJQVHJlZSkgewoJaS5pbmNlbnRpdmVzID0gaW5jZW50aXZlcwp9CgovLyBUYXJnZXRQb29sUGF0aCByZXR1cm5zIHRoZSB0YXJnZXQgcG9vbCBwYXRoCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwYXRoOiBQb29sIHBhdGggdG8gd2hpY2ggdGhpcyBpbmNlbnRpdmUgY29sbGVjdGlvbiBiZWxvbmdzLgpmdW5jIChpICpJbmNlbnRpdmVzKSBUYXJnZXRQb29sUGF0aCgpIHN0cmluZyB7CglyZXR1cm4gaS50YXJnZXRQb29sUGF0aAp9CgovLyBTZXRUYXJnZXRQb29sUGF0aCBzZXRzIHRoZSB0YXJnZXQgcG9vbCBwYXRoCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0YXJnZXRQb29sUGF0aDogUG9vbCBwYXRoIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgaW5jZW50aXZlIGNvbGxlY3Rpb24uCmZ1bmMgKGkgKkluY2VudGl2ZXMpIFNldFRhcmdldFBvb2xQYXRoKHRhcmdldFBvb2xQYXRoIHN0cmluZykgewoJaS50YXJnZXRQb29sUGF0aCA9IHRhcmdldFBvb2xQYXRoCn0KCi8vIFVuY2xhaW1hYmxlUGVyaW9kcyByZXR1cm5zIHRoZSB1bmNsYWltYWJsZSBwZXJpb2RzIHRyZWUKLy8KLy8gUmV0dXJuczoKLy8gICAtIHBlcmlvZHM6IFRyZWUgbWFwcGluZyB1bmNsYWltYWJsZS1wZXJpb2Qgc3RhcnQgdGltZXN0YW1wcyB0byBlbmQgdGltZXN0YW1wczsgZW5kIDAgZGVub3RlcyBhbiBvcGVuIHBlcmlvZC4KZnVuYyAoaSAqSW5jZW50aXZlcykgVW5jbGFpbWFibGVQZXJpb2RzKCkgKlVpbnRUcmVlIHsKCXJldHVybiBpLnVuY2xhaW1hYmxlUGVyaW9kcwp9CgovLyBTZXRVbmNsYWltYWJsZVBlcmlvZHMgc2V0cyB0aGUgdW5jbGFpbWFibGUgcGVyaW9kcyB0cmVlCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB1bmNsYWltYWJsZVBlcmlvZHM6IFRyZWUgb2YgcmV3YXJkLXVuY2xhaW1hYmxlIGludGVydmFscyBrZXllZCBieSB0aGVpciBzdGFydCB0aW1lc3RhbXBzLgpmdW5jIChpICpJbmNlbnRpdmVzKSBTZXRVbmNsYWltYWJsZVBlcmlvZHModW5jbGFpbWFibGVQZXJpb2RzICpVaW50VHJlZSkgewoJaS51bmNsYWltYWJsZVBlcmlvZHMgPSB1bmNsYWltYWJsZVBlcmlvZHMKfQoKLy8gSW5jZW50aXZlIHJldHVybnMgYW4gaW5jZW50aXZlIGJ5IElECi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbmNlbnRpdmVJZDogSWRlbnRpZmllciB1c2VkIHRvIGxvb2sgdXAgdGhlIGV4dGVybmFsIGluY2VudGl2ZSByZWNvcmQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbmNlbnRpdmU6IE1hdGNoaW5nIEV4dGVybmFsSW5jZW50aXZlIHBvaW50ZXIsIG9yIG5pbCB3aGVuIG5vIHZhbHVlIGlzIHN0b3JlZCBmb3IgaW5jZW50aXZlSWQuCi8vICAgLSBmb3VuZDogVHJ1ZSBvbmx5IHdoZW4gdGhlIHN0b3JlZCB2YWx1ZSBoYXMgRXh0ZXJuYWxJbmNlbnRpdmUgdHlwZTsgZmFsc2UgZm9yIGEgbWlzc2luZyBvciBtaXNtYXRjaGVkIHZhbHVlLgpmdW5jIChpICpJbmNlbnRpdmVzKSBJbmNlbnRpdmUoaW5jZW50aXZlSWQgc3RyaW5nKSAoKkV4dGVybmFsSW5jZW50aXZlLCBib29sKSB7Cgl2YWx1ZSA6PSBpLmluY2VudGl2ZXMuR2V0KGluY2VudGl2ZUlkKQoJaWYgdmFsdWUgPT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBmYWxzZQoJfQoJaW5jZW50aXZlLCBvayA6PSB2YWx1ZS4oKkV4dGVybmFsSW5jZW50aXZlKQoJcmV0dXJuIGluY2VudGl2ZSwgb2sKfQoKLy8gU2V0SW5jZW50aXZlIHNldHMgYW4gaW5jZW50aXZlIGJ5IElECi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbmNlbnRpdmVJZDogSWRlbnRpZmllciB1bmRlciB3aGljaCB0byBzdG9yZSB0aGUgaW5jZW50aXZlLgovLyAgIC0gaW5jZW50aXZlOiBFeHRlcm5hbEluY2VudGl2ZSByZWNvcmQgdG8gc3RvcmUgZm9yIGluY2VudGl2ZUlkLgpmdW5jIChpICpJbmNlbnRpdmVzKSBTZXRJbmNlbnRpdmUoaW5jZW50aXZlSWQgc3RyaW5nLCBpbmNlbnRpdmUgKkV4dGVybmFsSW5jZW50aXZlKSB7CglpLmluY2VudGl2ZXMuU2V0KGluY2VudGl2ZUlkLCBpbmNlbnRpdmUpCn0KCi8vIFJlbW92ZUluY2VudGl2ZSBkZWxldGVzIGFuIGluY2VudGl2ZSBieSBJRC4KLy8KLy8gT25seSBhbiBpbmNlbnRpdmUgdGhhdCBuZXZlciBzdGFydGVkIG1heSBiZSByZW1vdmVkOiBvbmNlIHJld2FyZHMgYmVnaW4KLy8gYWNjcnVpbmcsIGRlcG9zaXRzIGFuZCB0aGUgcmVmdW5kIGFjY291bnRpbmcgcmVmZXJlbmNlIHRoZSByZWNvcmQsIHNvIGFuCi8vIGVuZGVkIGluY2VudGl2ZSBpcyBtYXJrZWQgcmVmdW5kZWQgaW5zdGVhZCBvZiByZW1vdmVkLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW5jZW50aXZlSWQ6IElkZW50aWZpZXIgb2YgdGhlIGV4dGVybmFsIGluY2VudGl2ZSByZWNvcmQgdG8gcmVtb3ZlLgpmdW5jIChpICpJbmNlbnRpdmVzKSBSZW1vdmVJbmNlbnRpdmUoaW5jZW50aXZlSWQgc3RyaW5nKSB7CglpLmluY2VudGl2ZXMuUmVtb3ZlKGluY2VudGl2ZUlkKQp9CgovLyBTZXRVbmNsYWltYWJsZVBlcmlvZCByZWNvcmRzIGFuIGludGVydmFsIGR1cmluZyB3aGljaCBzdGFraW5nIHJld2FyZHMgY2Fubm90IGJlIGNsYWltZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzdGFydFRpbWVzdGFtcDogTm9ubmVnYXRpdmUgVW5peCB0aW1lc3RhbXAgaW4gc2Vjb25kcyBhdCB3aGljaCB0aGUgaW50ZXJ2YWwgYmVnaW5zLgovLyAgIC0gZW5kVGltZXN0YW1wOiBVbml4IHRpbWVzdGFtcCBpbiBzZWNvbmRzIGF0IHdoaWNoIHRoZSBpbnRlcnZhbCBlbmRzOyAwIHJlY29yZHMgYW4gb25nb2luZyBpbnRlcnZhbC4KZnVuYyAoaSAqSW5jZW50aXZlcykgU2V0VW5jbGFpbWFibGVQZXJpb2Qoc3RhcnRUaW1lc3RhbXAgaW50NjQsIGVuZFRpbWVzdGFtcCBpbnQ2NCkgewoJaS51bmNsYWltYWJsZVBlcmlvZHMuU2V0KHN0YXJ0VGltZXN0YW1wLCBlbmRUaW1lc3RhbXApCn0KCi8vIFJlbW92ZVVuY2xhaW1hYmxlUGVyaW9kIHJlbW92ZXMgdGhlIGludGVydmFsIGtleWVkIGJ5IGl0cyBzdGFydCB0aW1lc3RhbXAuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzdGFydFRpbWVzdGFtcDogTm9ubmVnYXRpdmUgVW5peCB0aW1lc3RhbXAgaW4gc2Vjb25kcyBpZGVudGlmeWluZyB0aGUgaW50ZXJ2YWwgdG8gcmVtb3ZlLgpmdW5jIChpICpJbmNlbnRpdmVzKSBSZW1vdmVVbmNsYWltYWJsZVBlcmlvZChzdGFydFRpbWVzdGFtcCBpbnQ2NCkgewoJaS51bmNsYWltYWJsZVBlcmlvZHMuUmVtb3ZlKHN0YXJ0VGltZXN0YW1wKQp9CgovLyBJdGVyYXRlSW5jZW50aXZlcyBpdGVyYXRlcyBvdmVyIGFsbCBpbmNlbnRpdmVzCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBmbjogQ2FsbGJhY2sgcmVjZWl2aW5nIGVhY2ggaW5jZW50aXZlIElEIGFuZCByZWNvcmQ7IHJldHVybmluZyB0cnVlIHJlcXVlc3RzIHRoYXQgaXRlcmF0aW9uIHN0b3AuCmZ1bmMgKGkgKkluY2VudGl2ZXMpIEl0ZXJhdGVJbmNlbnRpdmVzKGZuIGZ1bmMoaW5jZW50aXZlSWQgc3RyaW5nLCBpbmNlbnRpdmUgKkV4dGVybmFsSW5jZW50aXZlKSBib29sKSB7CglpLmluY2VudGl2ZXMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoa2V5IHN0cmluZywgdmFsdWUgaW50ZXJmYWNle30pIGJvb2wgewoJCWlmIGluY2VudGl2ZSwgb2sgOj0gdmFsdWUuKCpFeHRlcm5hbEluY2VudGl2ZSk7IG9rIHsKCQkJcmV0dXJuIGZuKGtleSwgaW5jZW50aXZlKQoJCX0KCQlyZXR1cm4gZmFsc2UKCX0pCn0KCi8vIEFkZEluY2VudGl2ZUJ5U3RhcnRUaW1lIHJlZ2lzdGVycyBhbiBpbmNlbnRpdmUgSUQgdW5kZXIgaXRzIHN0YXJ0IHRpbWVzdGFtcAovLyBpbiB0aGUgcGVyLXBvb2wgc3RhcnQtdGltZSBpbmRleC4gTXVsdGlwbGUgaW5jZW50aXZlcyBzdGFydGluZyBhdCB0aGUgc2FtZQovLyB0aW1lc3RhbXAgYXJlIGFjY3VtdWxhdGVkIGFzIGEgbGlzdC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHN0YXJ0VGltZXN0YW1wOiBOb25uZWdhdGl2ZSBVbml4IHRpbWVzdGFtcCBpbiBzZWNvbmRzIHVzZWQgYXMgdGhlIHN0YXJ0LXRpbWUgaW5kZXgga2V5LgovLyAgIC0gaW5jZW50aXZlSWQ6IEluY2VudGl2ZSBpZGVudGlmaWVyIHRvIGFwcGVuZCB0byB0aGF0IHRpbWVzdGFtcCdzIGJ1Y2tldC4KZnVuYyAoaSAqSW5jZW50aXZlcykgQWRkSW5jZW50aXZlQnlTdGFydFRpbWUoc3RhcnRUaW1lc3RhbXAgaW50NjQsIGluY2VudGl2ZUlkIHN0cmluZykgewoJdmFyIGluY2VudGl2ZUlkcyBbXXN0cmluZwoJaWYgdmFsdWUsIG9rIDo9IGkuYnlTdGFydFRpbWUuR2V0KHN0YXJ0VGltZXN0YW1wKTsgb2sgewoJCWlmIGlkcywgb2sgOj0gdmFsdWUuKFtdc3RyaW5nKTsgb2sgewoJCQlpbmNlbnRpdmVJZHMgPSBpZHMKCQl9Cgl9CglpbmNlbnRpdmVJZHMgPSBhcHBlbmQoaW5jZW50aXZlSWRzLCBpbmNlbnRpdmVJZCkKCWkuYnlTdGFydFRpbWUuU2V0KHN0YXJ0VGltZXN0YW1wLCBpbmNlbnRpdmVJZHMpCn0KCi8vIFJlbW92ZUluY2VudGl2ZUJ5U3RhcnRUaW1lIHVucmVnaXN0ZXJzIGFuIGluY2VudGl2ZSBJRCBmcm9tIHRoZSBwZXItcG9vbAovLyBzdGFydC10aW1lIGluZGV4LiBUaGUgYnVja2V0IGl0c2VsZiBpcyBkcm9wcGVkIG9uY2UgaXRzIGxhc3QgSUQgaXMgcmVtb3ZlZCwKLy8gc28gdGhlIGluZGV4IG5ldmVyIGtlZXBzIGFuIGVtcHR5IGVudHJ5IHRoYXQgZGlzY292ZXJ5IHdvdWxkIHN0aWxsIHZpc2l0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gc3RhcnRUaW1lc3RhbXA6IE5vbm5lZ2F0aXZlIFVuaXggdGltZXN0YW1wIGluIHNlY29uZHMgaWRlbnRpZnlpbmcgdGhlIHN0YXJ0LXRpbWUgYnVja2V0LgovLyAgIC0gaW5jZW50aXZlSWQ6IEluY2VudGl2ZSBpZGVudGlmaWVyIHRvIHJlbW92ZSBmcm9tIHRoYXQgYnVja2V0OyBhbGwgbWF0Y2hpbmcgZW50cmllcyBhcmUgb21pdHRlZC4KZnVuYyAoaSAqSW5jZW50aXZlcykgUmVtb3ZlSW5jZW50aXZlQnlTdGFydFRpbWUoc3RhcnRUaW1lc3RhbXAgaW50NjQsIGluY2VudGl2ZUlkIHN0cmluZykgewoJdmFsdWUsIG9rIDo9IGkuYnlTdGFydFRpbWUuR2V0KHN0YXJ0VGltZXN0YW1wKQoJaWYgIW9rIHsKCQlyZXR1cm4KCX0KCglpZHMsIG9rIDo9IHZhbHVlLihbXXN0cmluZykKCWlmICFvayB7CgkJcmV0dXJuCgl9CgoJcmVtYWluaW5nIDo9IG1ha2UoW11zdHJpbmcsIDAsIGxlbihpZHMpKQoJZm9yIF8sIGlkIDo9IHJhbmdlIGlkcyB7CgkJaWYgaWQgPT0gaW5jZW50aXZlSWQgewoJCQljb250aW51ZQoJCX0KCQlyZW1haW5pbmcgPSBhcHBlbmQocmVtYWluaW5nLCBpZCkKCX0KCglpZiBsZW4ocmVtYWluaW5nKSA9PSAwIHsKCQlpLmJ5U3RhcnRUaW1lLlJlbW92ZShzdGFydFRpbWVzdGFtcCkKCQlyZXR1cm4KCX0KCglpLmJ5U3RhcnRUaW1lLlNldChzdGFydFRpbWVzdGFtcCwgcmVtYWluaW5nKQp9CgovLyBJdGVyYXRlSW5jZW50aXZlSWRzQnlUaW1lIGl0ZXJhdGVzIG92ZXIgdGhlIGluY2VudGl2ZSBJRHMgdGhhdCBzdGFydCB3aXRoaW4KLy8gdGhlIGluY2x1c2l2ZSBbc3RhcnRUaW1lLCBlbmRUaW1lXSByYW5nZSwgdmlzaXRpbmcgb25seSB0aGUgYnVja2V0cyB0aGF0Ci8vIGZhbGwgaW4gdGhlIHJhbmdlLiBSZXZlcnNlSXRlcmF0ZSBpcyB1c2VkIGJlY2F1c2UgaXQgaXMgaW5jbHVzaXZlIG9uIGJvdGgKLy8gZW5kcywgbWF0Y2hpbmcgdGhlIGRpc2NvdmVyeSBzZW1hbnRpY3MgcHJldmlvdXNseSBpbXBsZW1lbnRlZCBhcwovLyAoc3RhcnRUaW1lc3RhbXAgPj0gc3RhcnRUaW1lICYmIHN0YXJ0VGltZXN0YW1wIDw9IGVuZFRpbWUpLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gc3RhcnRUaW1lOiBJbmNsdXNpdmUgbG93ZXIgVW5peCB0aW1lc3RhbXAgYm91bmQgZm9yIGluY2VudGl2ZSBzdGFydHMuCi8vICAgLSBlbmRUaW1lOiBJbmNsdXNpdmUgdXBwZXIgVW5peCB0aW1lc3RhbXAgYm91bmQgZm9yIGluY2VudGl2ZSBzdGFydHMuCi8vICAgLSBmbjogQ2FsbGJhY2sgcmVjZWl2aW5nIGVhY2ggbWF0Y2hpbmcgaW5jZW50aXZlIElEOyByZXR1cm5pbmcgdHJ1ZSByZXF1ZXN0cyB0aGF0IGl0ZXJhdGlvbiBzdG9wLgpmdW5jIChpICpJbmNlbnRpdmVzKSBJdGVyYXRlSW5jZW50aXZlSWRzQnlUaW1lKHN0YXJ0VGltZSwgZW5kVGltZSBpbnQ2NCwgZm4gZnVuYyhpbmNlbnRpdmVJZCBzdHJpbmcpIGJvb2wpIHsKCWkuYnlTdGFydFRpbWUuUmV2ZXJzZUl0ZXJhdGUoc3RhcnRUaW1lLCBlbmRUaW1lLCBmdW5jKF8gaW50NjQsIHZhbHVlIGFueSkgYm9vbCB7CgkJaW5jZW50aXZlSWRzLCBvayA6PSB2YWx1ZS4oW11zdHJpbmcpCgkJaWYgIW9rIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJCWZvciBfLCBpbmNlbnRpdmVJZCA6PSByYW5nZSBpbmNlbnRpdmVJZHMgewoJCQlpZiBmbihpbmNlbnRpdmVJZCkgewoJCQkJcmV0dXJuIHRydWUKCQkJfQoJCX0KCQlyZXR1cm4gZmFsc2UKCX0pCn0KCi8vIE5ld0luY2VudGl2ZXMgY3JlYXRlcyBhbiBpbmNlbnRpdmUgY29sbGVjdGlvbiBmb3IgYSBwb29sIGFuZCBzdGFydHMgYW4gb3BlbiB1bmNsYWltYWJsZSBwZXJpb2QgYXQgdGhlIGN1cnJlbnQgdGltZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRhcmdldFBvb2xQYXRoOiBQb29sIHBhdGggdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5ldyBpbmNlbnRpdmUgY29sbGVjdGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGluY2VudGl2ZXM6IENvbGxlY3Rpb24gd2l0aCBpbml0aWFsaXplZCBpbmNlbnRpdmUsIHN0YXJ0LXRpbWUsIGFuZCB1bmNsYWltYWJsZS1wZXJpb2QgdHJlZXMuCmZ1bmMgTmV3SW5jZW50aXZlcyh0YXJnZXRQb29sUGF0aCBzdHJpbmcpICpJbmNlbnRpdmVzIHsKCXJlc3VsdCA6PSAmSW5jZW50aXZlc3sKCQl0YXJnZXRQb29sUGF0aDogICAgIHRhcmdldFBvb2xQYXRoLAoJCXVuY2xhaW1hYmxlUGVyaW9kczogTmV3VWludFRyZWVOKDY0KSwKCQlpbmNlbnRpdmVzOiAgICAgICAgIGJwdHJlZS5OZXdCUFRyZWVOKDE2KSwKCQlieVN0YXJ0VGltZTogICAgICAgIE5ld1VpbnRUcmVlTig2NCksCgl9CgoJLy8gaW5pdGlhbCB1bmNsYWltYWJsZSBwZXJpb2Qgc3RhcnRzLCBhcyB0aGVyZSBjYW5ub3QgYmUgYW55IHN0YWtlZCBwb3NpdGlvbnMgeWV0LgoJY3VycmVudFRpbWVzdGFtcCA6PSB0aW1lLk5vdygpLlVuaXgoKQoJcmVzdWx0LlNldFVuY2xhaW1hYmxlUGVyaW9kKGN1cnJlbnRUaW1lc3RhbXAsIGludDY0KDApKQoJcmV0dXJuIHJlc3VsdAp9Cgp0eXBlIEV4dGVybmFsSW5jZW50aXZlIHN0cnVjdCB7CglpbmNlbnRpdmVJZCAgICAgICAgICAgICAgc3RyaW5nICAgICAvLyBpbmNlbnRpdmUgaWQKCXN0YXJ0VGltZXN0YW1wICAgICAgICAgICBpbnQ2NCAgICAgIC8vIHN0YXJ0IHRpbWUgZm9yIGV4dGVybmFsIHJld2FyZAoJZW5kVGltZXN0YW1wICAgICAgICAgICAgIGludDY0ICAgICAgLy8gZW5kIHRpbWUgZm9yIGV4dGVybmFsIHJld2FyZAoJY3JlYXRlZEhlaWdodCAgICAgICAgICAgIGludDY0ICAgICAgLy8gYmxvY2sgaGVpZ2h0IHdoZW4gdGhlIGluY2VudGl2ZSB3YXMgY3JlYXRlZAoJY3JlYXRlZFRpbWVzdGFtcCAgICAgICAgIGludDY0ICAgICAgLy8gdGltZXN0YW1wIHdoZW4gdGhlIGluY2VudGl2ZSB3YXMgY3JlYXRlZAoJZGVwb3NpdEduc0Ftb3VudCAgICAgICAgIGludDY0ICAgICAgLy8gZGVwb3NpdGVkIGducyBhbW91bnQKCXRhcmdldFBvb2xQYXRoICAgICAgICAgICBzdHJpbmcgICAgIC8vIGV4dGVybmFsIHJld2FyZCB0YXJnZXQgcG9vbCBwYXRoCglyZXdhcmRUb2tlbiAgICAgICAgICAgICAgc3RyaW5nICAgICAvLyBleHRlcm5hbCByZXdhcmQgdG9rZW4gcGF0aAoJdG90YWxSZXdhcmRBbW91bnQgICAgICAgIGludDY0ICAgICAgLy8gdG90YWwgcmV3YXJkIGFtb3VudAoJcmV3YXJkQW1vdW50ICAgICAgICAgICAgIGludDY0ICAgICAgLy8gbXV0YWJsZSByZW1haW5pbmcgcmV3YXJkIGFtb3VudAoJcmV3YXJkUGVyU2Vjb25kWDEyOCAgICAgICp1MjU2LlVpbnQgLy8gcmV3YXJkIHBlciBzZWNvbmQsIHNjYWxlZCBieSAyXjEyOCB0byBwcmVzZXJ2ZSBzdWItc2Vjb25kIHByZWNpc2lvbgoJZGlzdHJpYnV0ZWRSZXdhcmRBbW91bnQgIGludDY0ICAgICAgLy8gcmV3YXJkIGFtb3VudCBkZWxpdmVyZWQgdG8gcG9zaXRpb25zIG9yIHJlZnVuZGVkIGF0IGluY2VudGl2ZSBlbmQKCWFjY3VtdWxhdGVkUGVuYWx0eUFtb3VudCBpbnQ2NCAgICAgIC8vIGFjY3VtdWxhdGVkIHdhcm11cCBwZW5hbHR5IGZyb20gQ29sbGVjdFJld2FyZAoJY3JlYXRvciAgICAgICAgICAgICAgICAgIGFkZHJlc3MgICAgLy8gY3JlYXRvciBhZGRyZXNzCgoJcmVmdW5kZWQgYm9vbCAvLyB3aGV0aGVyIEVuZEV4dGVybmFsSW5jZW50aXZlIGZpbmFsaXplZCB0aGUgaW5jZW50aXZlIGFuZCByZXR1cm5lZCBpdHMgcmVmdW5kYWJsZSBwb3J0aW9uIGFuZCBHTlMgZGVwb3NpdAoKCXVuY2xhaW1hYmxlU2Vjb25kcyBpbnQ2NCAvLyBhY2N1bXVsYXRlZCBzZWNvbmRzIG9mIHVuY2xhaW1hYmxlIHBlcmlvZHMgb3ZlcmxhcHBpbmcgdGhlIGluY2VudGl2ZSB3aW5kb3cKfQoKLy8gRXh0ZXJuYWxJbmNlbnRpdmUgR2V0dGVyL1NldHRlciBtZXRob2RzCgovLyBJbmNlbnRpdmVJZCByZXR1cm5zIHRoZSBpbmNlbnRpdmUgSUQKLy8KLy8gUmV0dXJuczoKLy8gICAtIGlkOiBJZGVudGlmaWVyIGFzc2lnbmVkIHRvIHRoaXMgZXh0ZXJuYWwgaW5jZW50aXZlLgpmdW5jIChlICpFeHRlcm5hbEluY2VudGl2ZSkgSW5jZW50aXZlSWQoKSBzdHJpbmcgewoJcmV0dXJuIGUuaW5jZW50aXZlSWQKfQoKLy8gU2V0SW5jZW50aXZlSWQgc2V0cyB0aGUgaW5jZW50aXZlIElECi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbmNlbnRpdmVJZDogSWRlbnRpZmllciB0byBzdG9yZSBvbiB0aGUgaW5jZW50aXZlIHJlY29yZC4KZnVuYyAoZSAqRXh0ZXJuYWxJbmNlbnRpdmUpIFNldEluY2VudGl2ZUlkKGluY2VudGl2ZUlkIHN0cmluZykgewoJZS5pbmNlbnRpdmVJZCA9IGluY2VudGl2ZUlkCn0KCi8vIFN0YXJ0VGltZXN0YW1wIHJldHVybnMgdGhlIHN0YXJ0IHRpbWVzdGFtcC4KLy8KLy8gSXQga2V5cyB0aGUgYnlTdGFydFRpbWUgZGlzY292ZXJ5IGluZGV4IGFuZCBtdXN0IHN0YXkgaW1tdXRhYmxlIGFmdGVyIHRoZQovLyBpbmNlbnRpdmUgaXMgcmVnaXN0ZXJlZCwgc28gbm8gc2V0dGVyIGlzIGV4cG9zZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aW1lc3RhbXA6IFVuaXggdGltZXN0YW1wIGluIHNlY29uZHMgYXQgd2hpY2ggcmV3YXJkIGRpc3RyaWJ1dGlvbiBzdGFydHMuCmZ1bmMgKGUgKkV4dGVybmFsSW5jZW50aXZlKSBTdGFydFRpbWVzdGFtcCgpIGludDY0IHsKCXJldHVybiBlLnN0YXJ0VGltZXN0YW1wCn0KCi8vIEVuZFRpbWVzdGFtcCByZXR1cm5zIHRoZSBlbmQgdGltZXN0YW1wCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aW1lc3RhbXA6IFVuaXggdGltZXN0YW1wIGluIHNlY29uZHMgYXQgd2hpY2ggdGhlIGluY2VudGl2ZSB3aW5kb3cgZW5kcy4KZnVuYyAoZSAqRXh0ZXJuYWxJbmNlbnRpdmUpIEVuZFRpbWVzdGFtcCgpIGludDY0IHsKCXJldHVybiBlLmVuZFRpbWVzdGFtcAp9CgovLyBTZXRFbmRUaW1lc3RhbXAgc2V0cyB0aGUgZW5kIHRpbWVzdGFtcAovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZW5kVGltZXN0YW1wOiBVbml4IHRpbWVzdGFtcCBpbiBzZWNvbmRzIGF0IHdoaWNoIHRoZSBpbmNlbnRpdmUgd2luZG93IGVuZHMuCmZ1bmMgKGUgKkV4dGVybmFsSW5jZW50aXZlKSBTZXRFbmRUaW1lc3RhbXAoZW5kVGltZXN0YW1wIGludDY0KSB7CgllLmVuZFRpbWVzdGFtcCA9IGVuZFRpbWVzdGFtcAp9CgovLyBDcmVhdGVkSGVpZ2h0IHJldHVybnMgdGhlIGNyZWF0ZWQgaGVpZ2h0Ci8vCi8vIFJldHVybnM6Ci8vICAgLSBoZWlnaHQ6IEJsb2NrIGhlaWdodCBhdCB3aGljaCB0aGUgaW5jZW50aXZlIHJlY29yZCB3YXMgY3JlYXRlZC4KZnVuYyAoZSAqRXh0ZXJuYWxJbmNlbnRpdmUpIENyZWF0ZWRIZWlnaHQoKSBpbnQ2NCB7CglyZXR1cm4gZS5jcmVhdGVkSGVpZ2h0Cn0KCi8vIFNldENyZWF0ZWRIZWlnaHQgc2V0cyB0aGUgY3JlYXRlZCBoZWlnaHQKLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGNyZWF0ZWRIZWlnaHQ6IEJsb2NrIGhlaWdodCB0byByZWNvcmQgYXMgdGhlIGluY2VudGl2ZSdzIGNyZWF0aW9uIGhlaWdodC4KZnVuYyAoZSAqRXh0ZXJuYWxJbmNlbnRpdmUpIFNldENyZWF0ZWRIZWlnaHQoY3JlYXRlZEhlaWdodCBpbnQ2NCkgewoJZS5jcmVhdGVkSGVpZ2h0ID0gY3JlYXRlZEhlaWdodAp9CgovLyBDcmVhdGVkVGltZXN0YW1wIHJldHVybnMgdGhlIGNyZWF0ZWQgdGltZXN0YW1wCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aW1lc3RhbXA6IFVuaXggdGltZXN0YW1wIGluIHNlY29uZHMgYXQgd2hpY2ggdGhlIGluY2VudGl2ZSByZWNvcmQgd2FzIGNyZWF0ZWQuCmZ1bmMgKGUgKkV4dGVybmFsSW5jZW50aXZlKSBDcmVhdGVkVGltZXN0YW1wKCkgaW50NjQgewoJcmV0dXJuIGUuY3JlYXRlZFRpbWVzdGFtcAp9CgovLyBTZXRDcmVhdGVkVGltZXN0YW1wIHNldHMgdGhlIGNyZWF0ZWQgdGltZXN0YW1wCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjcmVhdGVkVGltZXN0YW1wOiBVbml4IHRpbWVzdGFtcCBpbiBzZWNvbmRzIHRvIHJlY29yZCBhcyB0aGUgaW5jZW50aXZlIGNyZWF0aW9uIHRpbWUuCmZ1bmMgKGUgKkV4dGVybmFsSW5jZW50aXZlKSBTZXRDcmVhdGVkVGltZXN0YW1wKGNyZWF0ZWRUaW1lc3RhbXAgaW50NjQpIHsKCWUuY3JlYXRlZFRpbWVzdGFtcCA9IGNyZWF0ZWRUaW1lc3RhbXAKfQoKLy8gRGVwb3NpdEduc0Ftb3VudCByZXR1cm5zIHRoZSBkZXBvc2l0IEdOUyBhbW91bnQKLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogR05TIGFtb3VudCBkZXBvc2l0ZWQgdG8gYmFjayB0aGlzIGV4dGVybmFsIGluY2VudGl2ZS4KZnVuYyAoZSAqRXh0ZXJuYWxJbmNlbnRpdmUpIERlcG9zaXRHbnNBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gZS5kZXBvc2l0R25zQW1vdW50Cn0KCi8vIFNldERlcG9zaXRHbnNBbW91bnQgc2V0cyB0aGUgZGVwb3NpdCBHTlMgYW1vdW50Ci8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZXBvc2l0R25zQW1vdW50OiBHTlMgYW1vdW50IGRlcG9zaXRlZCB0byBiYWNrIHRoaXMgZXh0ZXJuYWwgaW5jZW50aXZlLgpmdW5jIChlICpFeHRlcm5hbEluY2VudGl2ZSkgU2V0RGVwb3NpdEduc0Ftb3VudChkZXBvc2l0R25zQW1vdW50IGludDY0KSB7CgllLmRlcG9zaXRHbnNBbW91bnQgPSBkZXBvc2l0R25zQW1vdW50Cn0KCi8vIFRhcmdldFBvb2xQYXRoIHJldHVybnMgdGhlIHRhcmdldCBwb29sIHBhdGgKLy8KLy8gUmV0dXJuczoKLy8gICAtIHBhdGg6IFBvb2wgcGF0aCB0YXJnZXRlZCBieSB0aGlzIGV4dGVybmFsIGluY2VudGl2ZS4KZnVuYyAoZSAqRXh0ZXJuYWxJbmNlbnRpdmUpIFRhcmdldFBvb2xQYXRoKCkgc3RyaW5nIHsKCXJldHVybiBlLnRhcmdldFBvb2xQYXRoCn0KCi8vIFNldFRhcmdldFBvb2xQYXRoIHNldHMgdGhlIHRhcmdldCBwb29sIHBhdGgKLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRhcmdldFBvb2xQYXRoOiBQb29sIHBhdGggdG8gdGFyZ2V0IHdpdGggdGhpcyBleHRlcm5hbCBpbmNlbnRpdmUuCmZ1bmMgKGUgKkV4dGVybmFsSW5jZW50aXZlKSBTZXRUYXJnZXRQb29sUGF0aCh0YXJnZXRQb29sUGF0aCBzdHJpbmcpIHsKCWUudGFyZ2V0UG9vbFBhdGggPSB0YXJnZXRQb29sUGF0aAp9CgovLyBSZXdhcmRUb2tlbiByZXR1cm5zIHRoZSByZXdhcmQgdG9rZW4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRva2VuOiBSZXdhcmQtdG9rZW4gcGF0aCBkaXN0cmlidXRlZCBieSB0aGlzIGluY2VudGl2ZS4KZnVuYyAoZSAqRXh0ZXJuYWxJbmNlbnRpdmUpIFJld2FyZFRva2VuKCkgc3RyaW5nIHsKCXJldHVybiBlLnJld2FyZFRva2VuCn0KCi8vIFNldFJld2FyZFRva2VuIHNldHMgdGhlIHJld2FyZCB0b2tlbgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcmV3YXJkVG9rZW46IFRva2VuIHBhdGggb2YgdGhlIHJld2FyZCBhc3NldCBkaXN0cmlidXRlZCBieSB0aGlzIGluY2VudGl2ZS4KZnVuYyAoZSAqRXh0ZXJuYWxJbmNlbnRpdmUpIFNldFJld2FyZFRva2VuKHJld2FyZFRva2VuIHN0cmluZykgewoJZS5yZXdhcmRUb2tlbiA9IHJld2FyZFRva2VuCn0KCi8vIFRvdGFsUmV3YXJkQW1vdW50IHJldHVybnMgdGhlIHRvdGFsIHJld2FyZCBhbW91bnQKLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogVG90YWwgcmV3YXJkIGFtb3VudCBjb25maWd1cmVkIHdoZW4gdGhlIGluY2VudGl2ZSB3YXMgY3JlYXRlZC4KZnVuYyAoZSAqRXh0ZXJuYWxJbmNlbnRpdmUpIFRvdGFsUmV3YXJkQW1vdW50KCkgaW50NjQgewoJcmV0dXJuIGUudG90YWxSZXdhcmRBbW91bnQKfQoKLy8gU2V0VG90YWxSZXdhcmRBbW91bnQgc2V0cyB0aGUgdG90YWwgcmV3YXJkIGFtb3VudAovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG90YWxSZXdhcmRBbW91bnQ6IFRvdGFsIHJld2FyZCBhbW91bnQgdG8gcmVjb3JkIGZvciB0aGUgaW5jZW50aXZlLgpmdW5jIChlICpFeHRlcm5hbEluY2VudGl2ZSkgU2V0VG90YWxSZXdhcmRBbW91bnQodG90YWxSZXdhcmRBbW91bnQgaW50NjQpIHsKCWUudG90YWxSZXdhcmRBbW91bnQgPSB0b3RhbFJld2FyZEFtb3VudAp9CgovLyBSZXdhcmRBbW91bnQgcmV0dXJucyB0aGUgcmV3YXJkIGFtb3VudAovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBNdXRhYmxlIHJld2FyZCBhbW91bnQgcmVtYWluaW5nIGFmdGVyIGRpc3RyaWJ1dGlvbnMgYW5kIHJlZnVuZHMuCmZ1bmMgKGUgKkV4dGVybmFsSW5jZW50aXZlKSBSZXdhcmRBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gZS5yZXdhcmRBbW91bnQKfQoKLy8gU2V0UmV3YXJkQW1vdW50IHNldHMgdGhlIHJld2FyZCBhbW91bnQKLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHJld2FyZEFtb3VudDogUmVtYWluaW5nIHJld2FyZCBhbW91bnQgdG8gc3RvcmUgYWZ0ZXIgYWNjb3VudGluZyBhZGp1c3RtZW50cy4KZnVuYyAoZSAqRXh0ZXJuYWxJbmNlbnRpdmUpIFNldFJld2FyZEFtb3VudChyZXdhcmRBbW91bnQgaW50NjQpIHsKCWUucmV3YXJkQW1vdW50ID0gcmV3YXJkQW1vdW50Cn0KCi8vIFJld2FyZFBlclNlY29uZFgxMjggcmV0dXJucyB0aGUgUTEyOC1zY2FsZWQgcmV3YXJkIHBlciBzZWNvbmQuCi8vIFRoZSB1bmRlcmx5aW5nIHZhbHVlIGlzIChyZXdhcmRBbW91bnQgPDwgMTI4KSAvIGR1cmF0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcmF0ZTogUmV3YXJkIGVtaXR0ZWQgcGVyIHNlY29uZCwgc2NhbGVkIGJ5IDJeMTI4IGZvciBmaXhlZC1wb2ludCBhY2NvdW50aW5nLgpmdW5jIChlICpFeHRlcm5hbEluY2VudGl2ZSkgUmV3YXJkUGVyU2Vjb25kWDEyOCgpICp1MjU2LlVpbnQgewoJcmV0dXJuIGUucmV3YXJkUGVyU2Vjb25kWDEyOAp9CgovLyBTZXRSZXdhcmRQZXJTZWNvbmRYMTI4IHNldHMgdGhlIFExMjgtc2NhbGVkIHJld2FyZCBwZXIgc2Vjb25kLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcmV3YXJkUGVyU2Vjb25kWDEyODogUTEyOC1zY2FsZWQgcGVyLXNlY29uZCByZXdhcmQgcmF0ZTsgdGhlIHZhbHVlIGlzIGNvcGllZCBiZWZvcmUgc3RvcmFnZS4KZnVuYyAoZSAqRXh0ZXJuYWxJbmNlbnRpdmUpIFNldFJld2FyZFBlclNlY29uZFgxMjgocmV3YXJkUGVyU2Vjb25kWDEyOCAqdTI1Ni5VaW50KSB7CgllLnJld2FyZFBlclNlY29uZFgxMjggPSB1MjU2Llplcm8oKS5TZXQocmV3YXJkUGVyU2Vjb25kWDEyOCkKfQoKLy8gRGlzdHJpYnV0ZWRSZXdhcmRBbW91bnQgcmV0dXJucyB0aGUgZGlzdHJpYnV0ZWQgcmV3YXJkIGFtb3VudAovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBSZXdhcmQgYW1vdW50IGFscmVhZHkgZGVsaXZlcmVkIHRvIHBvc2l0aW9ucyBvciByZWZ1bmRlZCBhdCBpbmNlbnRpdmUgZW5kLgpmdW5jIChlICpFeHRlcm5hbEluY2VudGl2ZSkgRGlzdHJpYnV0ZWRSZXdhcmRBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gZS5kaXN0cmlidXRlZFJld2FyZEFtb3VudAp9CgovLyBTZXREaXN0cmlidXRlZFJld2FyZEFtb3VudCBzZXRzIHRoZSBkaXN0cmlidXRlZCByZXdhcmQgYW1vdW50Ci8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkaXN0cmlidXRlZFJld2FyZEFtb3VudDogUmV3YXJkIGFtb3VudCBkZWxpdmVyZWQgdG8gcG9zaXRpb25zIG9yIHJlZnVuZGVkIGF0IGluY2VudGl2ZSBlbmQuCmZ1bmMgKGUgKkV4dGVybmFsSW5jZW50aXZlKSBTZXREaXN0cmlidXRlZFJld2FyZEFtb3VudChkaXN0cmlidXRlZFJld2FyZEFtb3VudCBpbnQ2NCkgewoJZS5kaXN0cmlidXRlZFJld2FyZEFtb3VudCA9IGRpc3RyaWJ1dGVkUmV3YXJkQW1vdW50Cn0KCi8vIEFjY3VtdWxhdGVkUGVuYWx0eUFtb3VudCByZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB3YXJtdXAgcGVuYWx0eSBhbW91bnQKLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogV2FybS11cCBwZW5hbHR5IGFjY3VtdWxhdGVkIGZyb20gcmV3YXJkIGNvbGxlY3Rpb25zIGZvciB0aGlzIGluY2VudGl2ZS4KZnVuYyAoZSAqRXh0ZXJuYWxJbmNlbnRpdmUpIEFjY3VtdWxhdGVkUGVuYWx0eUFtb3VudCgpIGludDY0IHsKCXJldHVybiBlLmFjY3VtdWxhdGVkUGVuYWx0eUFtb3VudAp9CgovLyBTZXRBY2N1bXVsYXRlZFBlbmFsdHlBbW91bnQgc2V0cyB0aGUgYWNjdW11bGF0ZWQgd2FybXVwIHBlbmFsdHkgYW1vdW50Ci8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhY2N1bXVsYXRlZFBlbmFsdHlBbW91bnQ6IFdhcm0tdXAgcGVuYWx0eSBhbW91bnQgdG8gc3RvcmUgaW4gdGhlIGluY2VudGl2ZSdzIGFjY3VtdWxhdGVkIGFjY291bnRpbmcuCmZ1bmMgKGUgKkV4dGVybmFsSW5jZW50aXZlKSBTZXRBY2N1bXVsYXRlZFBlbmFsdHlBbW91bnQoYWNjdW11bGF0ZWRQZW5hbHR5QW1vdW50IGludDY0KSB7CgllLmFjY3VtdWxhdGVkUGVuYWx0eUFtb3VudCA9IGFjY3VtdWxhdGVkUGVuYWx0eUFtb3VudAp9CgovLyBDcmVhdG9yIHJldHVybnMgdGhlIGNyZWF0b3IgYWRkcmVzcwovLwovLyBSZXR1cm5zOgovLyAgIC0gY3JlYXRvcjogQWRkcmVzcyB0aGF0IGNyZWF0ZWQgYW5kIGZ1bmRlZCB0aGUgaW5jZW50aXZlLgpmdW5jIChlICpFeHRlcm5hbEluY2VudGl2ZSkgQ3JlYXRvcigpIGFkZHJlc3MgewoJcmV0dXJuIGUuY3JlYXRvcgp9CgovLyBTZXRDcmVhdG9yIHNldHMgdGhlIGNyZWF0b3IgYWRkcmVzcwovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3JlYXRvcjogQWRkcmVzcyB0byByZWNvcmQgYXMgdGhlIGluY2VudGl2ZSBjcmVhdG9yIGFuZCByZWZ1bmQgcmVjaXBpZW50LgpmdW5jIChlICpFeHRlcm5hbEluY2VudGl2ZSkgU2V0Q3JlYXRvcihjcmVhdG9yIGFkZHJlc3MpIHsKCWUuY3JlYXRvciA9IGNyZWF0b3IKfQoKLy8gUmVmdW5kZWQgcmV0dXJucyB0aGUgcmVmdW5kZWQgc3RhdHVzCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZWZ1bmRlZDogVHJ1ZSB3aGVuIGluY2VudGl2ZSBmaW5hbGl6YXRpb24gaGFzIG1hcmtlZCBpdHMgcmVmdW5kYWJsZSBiYWxhbmNlcyBhcyByZXR1cm5lZC4KZnVuYyAoZSAqRXh0ZXJuYWxJbmNlbnRpdmUpIFJlZnVuZGVkKCkgYm9vbCB7CglyZXR1cm4gZS5yZWZ1bmRlZAp9CgovLyBTZXRSZWZ1bmRlZCBzZXRzIHRoZSByZWZ1bmRlZCBzdGF0dXMKLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHJlZnVuZGVkOiBGaW5hbGl6YXRpb24gc3RhdHVzIHRvIHN0b3JlIGZvciB0aGUgaW5jZW50aXZlLgpmdW5jIChlICpFeHRlcm5hbEluY2VudGl2ZSkgU2V0UmVmdW5kZWQocmVmdW5kZWQgYm9vbCkgewoJZS5yZWZ1bmRlZCA9IHJlZnVuZGVkCn0KCi8vIFVuY2xhaW1hYmxlU2Vjb25kcyByZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCBzZWNvbmRzIG9mIHVuY2xhaW1hYmxlIHBlcmlvZHMKLy8gdGhhdCBvdmVybGFwIHRoZSBpbmNlbnRpdmUgd2luZG93LiBJdCBpcyB1cGRhdGVkIHdoZW5ldmVyIGFuIHVuY2xhaW1hYmxlCi8vIHBlcmlvZCBjbG9zZXMgYW5kIGlzIGJhY2tmaWxsZWQgb25jZSBmcm9tIHRoZSBoaXN0b3JpY2FsIHVuY2xhaW1hYmxlCi8vIHBlcmlvZHMgdHJlZSBhZnRlciBhbiB1cGdyYWRlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc2Vjb25kczogQWNjdW11bGF0ZWQgc2Vjb25kcyBvZiB1bmNsYWltYWJsZSBwZXJpb2RzIG92ZXJsYXBwaW5nIHRoZSBpbmNlbnRpdmUgd2luZG93LgpmdW5jIChlICpFeHRlcm5hbEluY2VudGl2ZSkgVW5jbGFpbWFibGVTZWNvbmRzKCkgaW50NjQgewoJcmV0dXJuIGUudW5jbGFpbWFibGVTZWNvbmRzCn0KCi8vIFNldFVuY2xhaW1hYmxlU2Vjb25kcyBzZXRzIHRoZSBhY2N1bXVsYXRlZCB1bmNsYWltYWJsZSBzZWNvbmRzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdW5jbGFpbWFibGVTZWNvbmRzOiBPdmVybGFwcGluZyB1bmNsYWltYWJsZSBkdXJhdGlvbiBpbiBzZWNvbmRzIHRvIHN0b3JlLgpmdW5jIChlICpFeHRlcm5hbEluY2VudGl2ZSkgU2V0VW5jbGFpbWFibGVTZWNvbmRzKHVuY2xhaW1hYmxlU2Vjb25kcyBpbnQ2NCkgewoJZS51bmNsYWltYWJsZVNlY29uZHMgPSB1bmNsYWltYWJsZVNlY29uZHMKfQoKLy8gQ2xvbmUgcmV0dXJucyBhbiBpbmRlcGVuZGVudCBFeHRlcm5hbEluY2VudGl2ZSB2YWx1ZSB3aXRoIHNjYWxhciBmaWVsZHMgY29waWVkIGFuZCBpdHMgZml4ZWQtcG9pbnQgcmF0ZSBkdXBsaWNhdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW5jZW50aXZlOiBDb3BpZWQgZXh0ZXJuYWwgaW5jZW50aXZlIHJlY29yZDsgaXRzIGZpeGVkLXBvaW50IHJhdGUgaXMgY2xvbmVkIHdoZW4gcHJlc2VudCBhbmQgb3RoZXJ3aXNlIGluaXRpYWxpemVkIHRvIHplcm8uCmZ1bmMgKGUgKkV4dGVybmFsSW5jZW50aXZlKSBDbG9uZSgpICpFeHRlcm5hbEluY2VudGl2ZSB7CglyZXdhcmRQZXJTZWNvbmRYMTI4IDo9IHUyNTYuWmVybygpCgoJaWYgZS5yZXdhcmRQZXJTZWNvbmRYMTI4ICE9IG5pbCB7CgkJcmV3YXJkUGVyU2Vjb25kWDEyOCA9IGUucmV3YXJkUGVyU2Vjb25kWDEyOC5DbG9uZSgpCgl9CgoJcmV0dXJuICZFeHRlcm5hbEluY2VudGl2ZXsKCQlpbmNlbnRpdmVJZDogICAgICAgICAgICAgIGUuaW5jZW50aXZlSWQsCgkJc3RhcnRUaW1lc3RhbXA6ICAgICAgICAgICBlLnN0YXJ0VGltZXN0YW1wLAoJCWVuZFRpbWVzdGFtcDogICAgICAgICAgICAgZS5lbmRUaW1lc3RhbXAsCgkJY3JlYXRlZEhlaWdodDogICAgICAgICAgICBlLmNyZWF0ZWRIZWlnaHQsCgkJY3JlYXRlZFRpbWVzdGFtcDogICAgICAgICBlLmNyZWF0ZWRUaW1lc3RhbXAsCgkJZGVwb3NpdEduc0Ftb3VudDogICAgICAgICBlLmRlcG9zaXRHbnNBbW91bnQsCgkJdGFyZ2V0UG9vbFBhdGg6ICAgICAgICAgICBlLnRhcmdldFBvb2xQYXRoLAoJCXJld2FyZFRva2VuOiAgICAgICAgICAgICAgZS5yZXdhcmRUb2tlbiwKCQl0b3RhbFJld2FyZEFtb3VudDogICAgICAgIGUudG90YWxSZXdhcmRBbW91bnQsCgkJcmV3YXJkQW1vdW50OiAgICAgICAgICAgICBlLnJld2FyZEFtb3VudCwKCQlyZXdhcmRQZXJTZWNvbmRYMTI4OiAgICAgIHJld2FyZFBlclNlY29uZFgxMjgsCgkJY3JlYXRvcjogICAgICAgICAgICAgICAgICBlLmNyZWF0b3IsCgkJcmVmdW5kZWQ6ICAgICAgICAgICAgICAgICBlLnJlZnVuZGVkLAoJCXVuY2xhaW1hYmxlU2Vjb25kczogICAgICAgZS51bmNsYWltYWJsZVNlY29uZHMsCgkJZGlzdHJpYnV0ZWRSZXdhcmRBbW91bnQ6ICBlLmRpc3RyaWJ1dGVkUmV3YXJkQW1vdW50LAoJCWFjY3VtdWxhdGVkUGVuYWx0eUFtb3VudDogZS5hY2N1bXVsYXRlZFBlbmFsdHlBbW91bnQsCgl9Cn0KCi8vIE5ld0V4dGVybmFsSW5jZW50aXZlIGNyZWF0ZXMgYSBuZXcgZXh0ZXJuYWwgaW5jZW50aXZlCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbmNlbnRpdmVJZDogVW5pcXVlIGlkZW50aWZpZXIgYXNzaWduZWQgdG8gdGhlIGV4dGVybmFsIGluY2VudGl2ZS4KLy8gICAtIHRhcmdldFBvb2xQYXRoOiBQb29sIHBhdGggd2hvc2Ugc3Rha2VkIHBvc2l0aW9ucyBtYXkgcmVjZWl2ZSB0aGlzIGluY2VudGl2ZS4KLy8gICAtIHJld2FyZFRva2VuOiBUb2tlbiBwYXRoIG9mIHRoZSBhc3NldCBkZXBvc2l0ZWQgZm9yIGRpc3RyaWJ1dGlvbi4KLy8gICAtIHJld2FyZEFtb3VudDogVG90YWwgcmV3YXJkIGFtb3VudCwgYWxzbyB1c2VkIGFzIHRoZSBpbml0aWFsIHJlbWFpbmluZyByZXdhcmQgYmFsYW5jZS4KLy8gICAtIHN0YXJ0VGltZXN0YW1wOiBVbml4IHRpbWVzdGFtcCBpbiBzZWNvbmRzIHdoZW4gcmV3YXJkIGRpc3RyaWJ1dGlvbiBzdGFydHMuCi8vICAgLSBlbmRUaW1lc3RhbXA6IFVuaXggdGltZXN0YW1wIGluIHNlY29uZHMgd2hlbiByZXdhcmQgZGlzdHJpYnV0aW9uIGVuZHM7IGR1cmF0aW9uIGlzIGVuZFRpbWVzdGFtcC1zdGFydFRpbWVzdGFtcCBhbmQgbXVzdCBiZSBub256ZXJvIGZvciB0aGUgcmF0ZSBjYWxjdWxhdGlvbi4KLy8gICAtIGNyZWF0b3I6IEFkZHJlc3MgdGhhdCBmdW5kcyB0aGUgaW5jZW50aXZlIGFuZCByZWNlaXZlcyByZWZ1bmRzIGF0IGZpbmFsaXphdGlvbi4KLy8gICAtIGRlcG9zaXRHbnNBbW91bnQ6IEdOUyBhbW91bnQgZGVwb3NpdGVkIGFzIHRoZSBpbmNlbnRpdmUncyByZXF1aXJlZCBjb2xsYXRlcmFsLgovLyAgIC0gY3JlYXRlZEhlaWdodDogQmxvY2sgaGVpZ2h0IHRvIHJlY29yZCBmb3IgaW5jZW50aXZlIGNyZWF0aW9uLgovLyAgIC0gY3VycmVudFRpbWU6IFVuaXggdGltZXN0YW1wIGluIHNlY29uZHMgcmVjb3JkZWQgYXMgdGhlIGluY2VudGl2ZSBjcmVhdGlvbiB0aW1lLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW5jZW50aXZlOiBOZXcgaW5jZW50aXZlIHdpdGggYSBRMTI4LXNjYWxlZCBwZXItc2Vjb25kIHJhdGUgYW5kIHplcm9lZCBkaXN0cmlidXRpb24sIHBlbmFsdHksIGFuZCB1bmNsYWltYWJsZSBjb3VudGVycy4KZnVuYyBOZXdFeHRlcm5hbEluY2VudGl2ZSgKCWluY2VudGl2ZUlkIHN0cmluZywKCXRhcmdldFBvb2xQYXRoIHN0cmluZywKCXJld2FyZFRva2VuIHN0cmluZywKCXJld2FyZEFtb3VudCBpbnQ2NCwKCXN0YXJ0VGltZXN0YW1wIGludDY0LCAvLyB0aW1lc3RhbXAgaXMgaW4gdW5peCB0aW1lKHNlY29uZHMpCgllbmRUaW1lc3RhbXAgaW50NjQsCgljcmVhdG9yIGFkZHJlc3MsCglkZXBvc2l0R25zQW1vdW50IGludDY0LAoJY3JlYXRlZEhlaWdodCBpbnQ2NCwKCWN1cnJlbnRUaW1lIGludDY0LCAvLyBjdXJyZW50IHRpbWUgaW4gdW5peCB0aW1lKHNlY29uZHMpCikgKkV4dGVybmFsSW5jZW50aXZlIHsKCWluY2VudGl2ZUR1cmF0aW9uIDo9IGVuZFRpbWVzdGFtcCAtIHN0YXJ0VGltZXN0YW1wCgoJLy8gQ29tcHV0ZSByZXdhcmQgcGVyIHNlY29uZCBzY2FsZWQgYnkgMl4xMjggdG8gcHJlc2VydmUgc3ViLXNlY29uZCBwcmVjaXNpb24uCgkvLyByZXdhcmRQZXJTZWNvbmRYMTI4ID0gKHJld2FyZEFtb3VudCA8PCAxMjgpIC8gaW5jZW50aXZlRHVyYXRpb24uCgkvLyBDb25zdW1lcnMgbXVzdCBkaXZpZGUgYnkgMl4xMjggd2hlbiBtYXRlcmlhbGl6aW5nIGJhY2sgdG8gYSBwbGFpbiBpbnRlZ2VyLgoJcmV3YXJkUGVyU2Vjb25kWDEyOCA6PSB1MjU2Lk11bERpdigKCQl1MjU2Lk5ld1VpbnRGcm9tSW50NjQocmV3YXJkQW1vdW50KSwKCQljb25zdHMuUTEyOCgpLAoJCXUyNTYuTmV3VWludEZyb21JbnQ2NChpbmNlbnRpdmVEdXJhdGlvbiksCgkpCgoJcmV0dXJuICZFeHRlcm5hbEluY2VudGl2ZXsKCQlpbmNlbnRpdmVJZDogICAgICAgICAgICAgIGluY2VudGl2ZUlkLAoJCXRhcmdldFBvb2xQYXRoOiAgICAgICAgICAgdGFyZ2V0UG9vbFBhdGgsCgkJcmV3YXJkVG9rZW46ICAgICAgICAgICAgICByZXdhcmRUb2tlbiwKCQl0b3RhbFJld2FyZEFtb3VudDogICAgICAgIHJld2FyZEFtb3VudCwKCQlyZXdhcmRBbW91bnQ6ICAgICAgICAgICAgIHJld2FyZEFtb3VudCwKCQlzdGFydFRpbWVzdGFtcDogICAgICAgICAgIHN0YXJ0VGltZXN0YW1wLAoJCWVuZFRpbWVzdGFtcDogICAgICAgICAgICAgZW5kVGltZXN0YW1wLAoJCXJld2FyZFBlclNlY29uZFgxMjg6ICAgICAgcmV3YXJkUGVyU2Vjb25kWDEyOCwKCQlkaXN0cmlidXRlZFJld2FyZEFtb3VudDogIDAsCgkJYWNjdW11bGF0ZWRQZW5hbHR5QW1vdW50OiAwLAoJCWNyZWF0b3I6ICAgICAgICAgICAgICAgICAgY3JlYXRvciwKCQljcmVhdGVkSGVpZ2h0OiAgICAgICAgICAgIGNyZWF0ZWRIZWlnaHQsCgkJY3JlYXRlZFRpbWVzdGFtcDogICAgICAgICBjdXJyZW50VGltZSwKCQlkZXBvc2l0R25zQW1vdW50OiAgICAgICAgIGRlcG9zaXRHbnNBbW91bnQsCgkJcmVmdW5kZWQ6ICAgICAgICAgICAgICAgICBmYWxzZSwKCQl1bmNsYWltYWJsZVNlY29uZHM6ICAgICAgIDAsCgl9Cn0KCi8vIFRpY2sgbWFwcGluZyBmb3IgZWFjaCBwb29sCnR5cGUgVGlja3Mgc3RydWN0IHsKCXRyZWUgKmJwdHJlZS5CUFRyZWUgLy8gaW50MzIgdGlja0lkIC0+IHRpY2sKfQoKLy8gVGlja3MgR2V0dGVyL1NldHRlciBtZXRob2RzCgovLyBUcmVlIHJldHVybnMgdGhlIHRpY2tzIHRyZWUKLy8KLy8gUmV0dXJuczoKLy8gICAtIHRyZWU6IE11dGFibGUgQisgdHJlZSBtYXBwaW5nIGVuY29kZWQgaW50MzIgdGljayBJRHMgdG8gVGljayByZWNvcmRzLgpmdW5jICh0ICpUaWNrcykgVHJlZSgpICpicHRyZWUuQlBUcmVlIHsKCXJldHVybiB0LnRyZWUKfQoKLy8gU2V0VHJlZSBzZXRzIHRoZSB0aWNrcyB0cmVlCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0cmVlOiBCKyB0cmVlIHRvIHVzZSBmb3IgdGljayBzdG9yYWdlLgpmdW5jICh0ICpUaWNrcykgU2V0VHJlZSh0cmVlICpicHRyZWUuQlBUcmVlKSB7Cgl0LnRyZWUgPSB0cmVlCn0KCi8vIEdldCByZXR1cm5zIHRoZSB0aWNrIGZvciB0aGUgZ2l2ZW4gdGlja0lkLCBvciBuaWwgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aWNrSWQ6IFRpY2sgaW5kZXggdG8gbG9vayB1cC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpY2s6IE1hdGNoaW5nIFRpY2sgcmVjb3JkLCBvciBuaWwgd2hlbiB0aGUgZW5jb2RlZCBJRCBpcyBhYnNlbnQ7IHBhbmljcyBpZiBhIHN0b3JlZCB2YWx1ZSBoYXMgdGhlIHdyb25nIHR5cGUuCmZ1bmMgKHQgKlRpY2tzKSBHZXQodGlja0lkIGludDMyKSAqVGljayB7Cgl2IDo9IHQudHJlZS5HZXQodXRpbHMuRW5jb2RlSW50MzIodGlja0lkKSkKCWlmIHYgPT0gbmlsIHsKCQlyZXR1cm4gbmlsCgl9CgoJdGljaywgb2sgOj0gdi4oKlRpY2spCglpZiAhb2sgewoJCXBhbmljKCJmYWlsZWQgdG8gY2FzdCB2YWx1ZSB0byAqVGljayIpCgl9CglyZXR1cm4gdGljawp9CgovLyBIYXMgcmVwb3J0cyB3aGV0aGVyIGEgdGljayBJRCBpcyBwcmVzZW50IGluIHRoZSB1bmRlcmx5aW5nIHRyZWUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aWNrSWQ6IFRpY2sgaW5kZXggd2hvc2UgZW5jb2RlZCBrZXkgaXMgdGVzdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcHJlc2VudDogVHJ1ZSB3aGVuIHRoZSBlbmNvZGVkIHRpY2sgSUQgZXhpc3RzIGluIHRoZSB1bmRlcmx5aW5nIHRyZWUuCmZ1bmMgKHNlbGYgKlRpY2tzKSBIYXModGlja0lkIGludDMyKSBib29sIHsKCXJldHVybiBzZWxmLnRyZWUuSGFzKHV0aWxzLkVuY29kZUludDMyKHRpY2tJZCkpCn0KCi8vIFNldFRpY2sgc2V0cyBhIHRpY2sgYnkgSUQKLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpY2tJZDogVGljayBpbmRleCB1bmRlciB3aGljaCB0byBzdG9yZSB0aGUgcmVjb3JkLgovLyAgIC0gdGljazogTm9uLW5pbCBUaWNrIHJlY29yZCB0byBzdG9yZTsgYSB6ZXJvIGdyb3NzIHN0YWtlZCBsaXF1aWRpdHkgcmVtb3ZlcyB0aGUgdGljayBpbnN0ZWFkLCB3aGlsZSBuaWwgaW5wdXQgcGFuaWNzIGR1cmluZyB0aGUgZ3Jvc3MtbGlxdWlkaXR5IGNoZWNrLgpmdW5jICh0ICpUaWNrcykgU2V0VGljayh0aWNrSWQgaW50MzIsIHRpY2sgKlRpY2spIHsKCWlmIHRpY2suc3Rha2VkTGlxdWlkaXR5R3Jvc3MuSXNaZXJvKCkgewoJCXQudHJlZS5SZW1vdmUodXRpbHMuRW5jb2RlSW50MzIodGlja0lkKSkKCQlyZXR1cm4KCX0KCgl0LnRyZWUuU2V0KHV0aWxzLkVuY29kZUludDMyKHRpY2tJZCksIHRpY2spCn0KCi8vIEl0ZXJhdGVUaWNrcyBpdGVyYXRlcyBvdmVyIGFsbCB0aWNrcwovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZm46IENhbGxiYWNrIHJlY2VpdmluZyBlYWNoIHN0b3JlZCBUaWNrIGFuZCBkZWNvZGVkIHRpY2sgSUQ7IHJldHVybmluZyB0cnVlIHJlcXVlc3RzIHRoYXQgaXRlcmF0aW9uIHN0b3AuCmZ1bmMgKHQgKlRpY2tzKSBJdGVyYXRlVGlja3MoZm4gZnVuYyh0aWNrSWQgaW50MzIsIHRpY2sgKlRpY2spIGJvb2wpIHsKCXQudHJlZS5JdGVyYXRlKCIiLCAiIiwgZnVuYyhrZXkgc3RyaW5nLCB2YWx1ZSBpbnRlcmZhY2V7fSkgYm9vbCB7CgkJdGljaywgb2sgOj0gdmFsdWUuKCpUaWNrKQoJCWlmICFvayB7CgkJCXJldHVybiBmYWxzZQoJCX0KCgkJcmV0dXJuIGZuKHV0aWxzLkRlY29kZUludDMyKGtleSksIHRpY2spCgl9KQp9CgovLyBDbG9uZSByZXR1cm5zIGEgZGVlcCBjb3B5IG9mIHRpY2tzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdGlja3M6IE5ldyBUaWNrcyB2YWx1ZSB3aXRoIGNsb25lZCBUaWNrIHJlY29yZHMgaW4gYSBmcmVzaCBmYW5vdXQtMTYgdHJlZS4KZnVuYyAodCBUaWNrcykgQ2xvbmUoKSBUaWNrcyB7CgljbG9uZWQgOj0gYnB0cmVlLk5ld0JQVHJlZU4oMTYpCgl0LnRyZWUuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoa2V5IHN0cmluZywgdmFsdWUgYW55KSBib29sIHsKCQl0aWNrLCBvayA6PSB2YWx1ZS4oKlRpY2spCgkJaWYgIW9rIHsKCQkJcGFuaWMoImZhaWxlZCB0byBjYXN0IHZhbHVlIHRvICpUaWNrIikKCQl9CgkJY2xvbmVkLlNldChrZXksIHRpY2suQ2xvbmUoKSkKCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gVGlja3N7dHJlZTogY2xvbmVkfQp9CgovLyBOZXdUaWNrcyBjcmVhdGVzIGFuIGVtcHR5IHRpY2sgbWFwcGluZyB3aXRoIGEgZmFub3V0LTE2IEIrIHRyZWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aWNrczogRW1wdHkgVGlja3MgdmFsdWUgcmVhZHkgdG8gc3RvcmUgcG9vbCB0aWNrIHJlY29yZHMuCmZ1bmMgTmV3VGlja3MoKSBUaWNrcyB7CglyZXR1cm4gVGlja3N7CgkJdHJlZTogYnB0cmVlLk5ld0JQVHJlZU4oMTYpLAoJfQp9CgovLyBUaWNrIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIGEgc3BlY2lmaWMgdGljayBpbiBhIHBvb2wuCi8vCi8vIEZpZWxkczoKLy8gLSBpZCAoaW50MzIpOiBUaGUgSUQgb2YgdGhlIHRpY2suCi8vIC0gc3Rha2VkTGlxdWlkaXR5R3Jvc3MgKCp1MjU2LlVpbnQpOiBUb3RhbCBncm9zcyBzdGFrZWQgbGlxdWlkaXR5IGF0IHRoaXMgdGljay4KLy8gLSBzdGFrZWRMaXF1aWRpdHlEZWx0YSAoKmkyNTYuSW50KTogTmV0IGNoYW5nZSBpbiBzdGFrZWQgbGlxdWlkaXR5IGF0IHRoaXMgdGljay4KLy8gLSBvdXRzaWRlQWNjdW11bGF0aW9uICgqVWludFRyZWUpOiBSZXdhcmRSYXRpb0FjY3VtdWxhdGlvbiBvdXRzaWRlIHRoZSB0aWNrLgp0eXBlIFRpY2sgc3RydWN0IHsKCWlkIGludDMyCgoJLy8gY29uY2VwdHVhbGx5IGVxdWFsIHdpdGggUG9vbC5saXF1aWRpdHlHcm9zcyBidXQgb25seSBmb3IgdGhlIHN0YWtlZCBwb3NpdGlvbnMKCXN0YWtlZExpcXVpZGl0eUdyb3NzICp1MjU2LlVpbnQKCgkvLyBjb25jZXB0dWFsbHkgZXF1YWwgd2l0aCBQb29sLmxpcXVpZGl0eU5ldCBidXQgb25seSBmb3IgdGhlIHN0YWtlZCBwb3NpdGlvbnMKCXN0YWtlZExpcXVpZGl0eURlbHRhICppMjU2LkludAoKCS8vIGN1cnJlbnRPdXRzaWRlQWNjdW11bGF0aW9uIGlzIHRoZSBhY2N1bXVsYXRpb24gb2YgdGhlIHRpbWUgLyBUb3RhbFN0YWtlIG91dHNpZGUgdGhlIHRpY2suCgkvLyBJdCBpcyBjYWxjdWxhdGVkIGJ5IHN1YnRyYWN0aW5nIHRoZSBjdXJyZW50IHRpY2sncyBjdXJyZW50T3V0c2lkZUFjY3VtdWxhdGlvbiBmcm9tIHRoZSBnbG9iYWwgcmV3YXJkIHJhdGlvIGFjY3VtdWxhdGlvbi4KCW91dHNpZGVBY2N1bXVsYXRpb24gKlVpbnRUcmVlIC8vIHRpbWVzdGFtcCAtPiBmaXhlZCAzMi1ieXRlIGJpZy1lbmRpYW4gc3RyaW5nCn0KCi8vIFRpY2sgR2V0dGVyL1NldHRlciBtZXRob2RzCgovLyBJZCByZXR1cm5zIHRoZSB0aWNrIElECi8vCi8vIFJldHVybnM6Ci8vICAgLSBpZDogVGljayBpbmRleCByZXByZXNlbnRlZCBieSB0aGlzIHJlY29yZC4KZnVuYyAodCAqVGljaykgSWQoKSBpbnQzMiB7CglyZXR1cm4gdC5pZAp9CgovLyBTZXRJZCBzZXRzIHRoZSB0aWNrIElECi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpZDogVGljayBpbmRleCB0byBzdG9yZSBpbiB0aGUgcmVjb3JkLgpmdW5jICh0ICpUaWNrKSBTZXRJZChpZCBpbnQzMikgewoJdC5pZCA9IGlkCn0KCi8vIFN0YWtlZExpcXVpZGl0eUdyb3NzIHJldHVybnMgdGhlIHN0YWtlZCBsaXF1aWRpdHkgZ3Jvc3MKLy8KLy8gUmV0dXJuczoKLy8gICAtIGxpcXVpZGl0eTogVG90YWwgZ3Jvc3Mgc3Rha2VkIGxpcXVpZGl0eSBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGljay4KZnVuYyAodCAqVGljaykgU3Rha2VkTGlxdWlkaXR5R3Jvc3MoKSAqdTI1Ni5VaW50IHsKCXJldHVybiB0LnN0YWtlZExpcXVpZGl0eUdyb3NzCn0KCi8vIFNldFN0YWtlZExpcXVpZGl0eUdyb3NzIHNldHMgdGhlIHN0YWtlZCBsaXF1aWRpdHkgZ3Jvc3MKLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHN0YWtlZExpcXVpZGl0eUdyb3NzOiBOZXcgdG90YWwgZ3Jvc3Mgc3Rha2VkIGxpcXVpZGl0eTsgdGhlIHZhbHVlIGlzIGNvcGllZCBiZWZvcmUgc3RvcmFnZS4KZnVuYyAodCAqVGljaykgU2V0U3Rha2VkTGlxdWlkaXR5R3Jvc3Moc3Rha2VkTGlxdWlkaXR5R3Jvc3MgKnUyNTYuVWludCkgewoJdC5zdGFrZWRMaXF1aWRpdHlHcm9zcyA9IHUyNTYuWmVybygpLlNldChzdGFrZWRMaXF1aWRpdHlHcm9zcykKfQoKLy8gU3Rha2VkTGlxdWlkaXR5RGVsdGEgcmV0dXJucyB0aGUgc3Rha2VkIGxpcXVpZGl0eSBkZWx0YQovLwovLyBSZXR1cm5zOgovLyAgIC0gZGVsdGE6IE5ldCBzdGFrZWQgbGlxdWlkaXR5IGNoYW5nZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0aWNrLgpmdW5jICh0ICpUaWNrKSBTdGFrZWRMaXF1aWRpdHlEZWx0YSgpICppMjU2LkludCB7CglyZXR1cm4gdC5zdGFrZWRMaXF1aWRpdHlEZWx0YQp9CgovLyBTZXRTdGFrZWRMaXF1aWRpdHlEZWx0YSBzZXRzIHRoZSBzdGFrZWQgbGlxdWlkaXR5IGRlbHRhCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzdGFrZWRMaXF1aWRpdHlEZWx0YTogTmV3IG5ldCBzdGFrZWQgbGlxdWlkaXR5IGRlbHRhOyB0aGUgdmFsdWUgaXMgY29waWVkIGJlZm9yZSBzdG9yYWdlLgpmdW5jICh0ICpUaWNrKSBTZXRTdGFrZWRMaXF1aWRpdHlEZWx0YShzdGFrZWRMaXF1aWRpdHlEZWx0YSAqaTI1Ni5JbnQpIHsKCXQuc3Rha2VkTGlxdWlkaXR5RGVsdGEgPSBpMjU2Llplcm8oKS5TZXQoc3Rha2VkTGlxdWlkaXR5RGVsdGEpCn0KCi8vIE91dHNpZGVBY2N1bXVsYXRpb24gcmV0dXJucyB0aGUgb3V0c2lkZSBhY2N1bXVsYXRpb24gdHJlZQovLwovLyBSZXR1cm5zOgovLyAgIC0gdHJlZTogSGlzdG9yaWNhbCByZXdhcmQtcmF0aW8gYWNjdW11bGF0aW9uIG9ic2VydmVkIG91dHNpZGUgdGhpcyB0aWNrLgpmdW5jICh0ICpUaWNrKSBPdXRzaWRlQWNjdW11bGF0aW9uKCkgKlVpbnRUcmVlIHsKCXJldHVybiB0Lm91dHNpZGVBY2N1bXVsYXRpb24KfQoKLy8gU2V0T3V0c2lkZUFjY3VtdWxhdGlvbiBzZXRzIHRoZSBvdXRzaWRlIGFjY3VtdWxhdGlvbiB0cmVlCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBvdXRzaWRlQWNjdW11bGF0aW9uOiBVaW50VHJlZSBvZiBvdXRzaWRlLWFjY3VtdWxhdGlvbiBzbmFwc2hvdHMga2V5ZWQgYnkgVW5peCB0aW1lc3RhbXAuCmZ1bmMgKHQgKlRpY2spIFNldE91dHNpZGVBY2N1bXVsYXRpb24ob3V0c2lkZUFjY3VtdWxhdGlvbiAqVWludFRyZWUpIHsKCXQub3V0c2lkZUFjY3VtdWxhdGlvbiA9IG91dHNpZGVBY2N1bXVsYXRpb24KfQoKLy8gU2V0T3V0c2lkZUFjY3VtdWxhdGlvbkF0IHNldHMgdGhlIG91dHNpZGUgYWNjdW11bGF0aW9uIGF0IHRoZSB0aW1lc3RhbXAuCi8vIFNldE91dHNpZGVBY2N1bXVsYXRpb25BdCByZWNvcmRzIHRoZSBRMTI4LXNjYWxlZCBvdXRzaWRlIGFjY3VtdWxhdGlvbiBhdCBhIHRpbWVzdGFtcC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpbWVzdGFtcDogTm9ubmVnYXRpdmUgVW5peCB0aW1lc3RhbXAgaW4gc2Vjb25kcyB1c2VkIGFzIHRoZSBzbmFwc2hvdCBrZXkuCi8vICAgLSBhY2M6IFExMjgtc2NhbGVkIGFjY3VtdWxhdGlvbiB2YWx1ZSBlbmNvZGVkIGludG8gdGhlIHRyZWUuCmZ1bmMgKHQgKlRpY2spIFNldE91dHNpZGVBY2N1bXVsYXRpb25BdCh0aW1lc3RhbXAgaW50NjQsIGFjYyAqdTI1Ni5VaW50KSB7Cgl0Lm91dHNpZGVBY2N1bXVsYXRpb24uU2V0KHRpbWVzdGFtcCwgdXRpbHMuRW5jb2RlVWludDI1NihhY2MpKQp9CgovLyBDbG9uZSByZXR1cm5zIGEgZGVlcCBjb3B5IG9mIHRoZSB0aWNrLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdGljazogRGVlcCBjb3B5IG9mIHRoZSB0aWNrIGFuZCBpdHMgb3V0c2lkZS1hY2N1bXVsYXRpb24gdHJlZSwgb3IgbmlsIHdoZW4gdGhlIHJlY2VpdmVyIGlzIG5pbC4KZnVuYyAodCAqVGljaykgQ2xvbmUoKSAqVGljayB7CglpZiB0ID09IG5pbCB7CgkJcmV0dXJuIG5pbAoJfQoKCXJldHVybiAmVGlja3sKCQlpZDogICAgICAgICAgICAgICAgICAgdC5pZCwKCQlzdGFrZWRMaXF1aWRpdHlHcm9zczogdC5zdGFrZWRMaXF1aWRpdHlHcm9zcy5DbG9uZSgpLAoJCXN0YWtlZExpcXVpZGl0eURlbHRhOiB0LnN0YWtlZExpcXVpZGl0eURlbHRhLkNsb25lKCksCgkJb3V0c2lkZUFjY3VtdWxhdGlvbjogIHQub3V0c2lkZUFjY3VtdWxhdGlvbi5DbG9uZSgpLAoJfQp9CgovLyBOZXdUaWNrIGNyZWF0ZXMgYSB0aWNrIHdpdGggemVybyBzdGFrZWQgbGlxdWlkaXR5IGFuZCBhbiBlbXB0eSBmYW5vdXQtNCBvdXRzaWRlLWFjY3VtdWxhdGlvbiB0cmVlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGlja0lkOiBUaWNrIGluZGV4IHRvIGFzc2lnbiB0byB0aGUgbmV3IHJlY29yZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpY2s6IEluaXRpYWxpemVkIHRpY2sgcmVjb3JkLgpmdW5jIE5ld1RpY2sodGlja0lkIGludDMyKSAqVGljayB7CglyZXR1cm4gJlRpY2t7CgkJaWQ6ICAgICAgICAgICAgICAgICAgIHRpY2tJZCwKCQlzdGFrZWRMaXF1aWRpdHlHcm9zczogdTI1Ni5aZXJvKCksCgkJc3Rha2VkTGlxdWlkaXR5RGVsdGE6IGkyNTYuWmVybygpLAoJCW91dHNpZGVBY2N1bXVsYXRpb246ICBOZXdVaW50VHJlZU4oNCksCgl9Cn0KCi8vIDEwMCUsIDAlLCAwJSBpZiBubyB0aWVyMiBhbmQgdGllcjMKLy8gODAlLCAwJSwgMjAlIGlmIG5vIHRpZXIyCi8vIDcwJSwgMzAlLCAwJSBpZiBubyB0aWVyMwovLyA1MCUsIDMwJSwgMjAlIGlmIGhhcyB0aWVyMiBhbmQgdGllcjMKdHlwZSBUaWVyUmF0aW8gc3RydWN0IHsKCVRpZXIxIHVpbnQ2NAoJVGllcjIgdWludDY0CglUaWVyMyB1aW50NjQKfQoKLy8gTmV3VGllclJhdGlvIGNvbnN0cnVjdHMgdGhlIHJld2FyZC1zaGFyZSByYXRpbyBmb3IgdGllcnMgMSB0aHJvdWdoIDMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aWVyMTogVGllci0xIHNoYXJlIHNjYWxlZCBieSAxMDAgKGZvciBleGFtcGxlLCA3MCBtZWFucyA3MCUpLgovLyAgIC0gdGllcjI6IFRpZXItMiBzaGFyZSBzY2FsZWQgYnkgMTAwLgovLyAgIC0gdGllcjM6IFRpZXItMyBzaGFyZSBzY2FsZWQgYnkgMTAwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcmF0aW86IFRpZXJSYXRpbyBjb250YWluaW5nIHRoZSBzdXBwbGllZCBzY2FsZWQgc2hhcmVzLgpmdW5jIE5ld1RpZXJSYXRpbyh0aWVyMSwgdGllcjIsIHRpZXIzIHVpbnQ2NCkgVGllclJhdGlvIHsKCXJldHVybiBUaWVyUmF0aW97CgkJVGllcjE6IHRpZXIxLAoJCVRpZXIyOiB0aWVyMiwKCQlUaWVyMzogdGllcjMsCgl9Cn0KCi8vIEdldCByZXR1cm5zIHRoZSByYXRpbyhzY2FsZWQgdXAgYnkgMTAwKSBmb3IgdGhlIGdpdmVuIHRpZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aWVyOiBUaWVyIG51bWJlciB0byBxdWVyeTsgb25seSB0aWVycyAxLCAyLCBhbmQgMyBhcmUgc3VwcG9ydGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcmF0aW86IFJlcXVlc3RlZCB0aWVyIHNoYXJlIHNjYWxlZCBieSAxMDAuCi8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiB0aWVyIGlzIG5vdCAxLCAyLCBvciAzOyBuaWwgZm9yIGEgc3VwcG9ydGVkIHRpZXIuCmZ1bmMgKHJhdGlvICpUaWVyUmF0aW8pIEdldCh0aWVyIHVpbnQ2NCkgKHVpbnQ2NCwgZXJyb3IpIHsKCXN3aXRjaCB0aWVyIHsKCWNhc2UgMToKCQlyZXR1cm4gcmF0aW8uVGllcjEsIG5pbAoJY2FzZSAyOgoJCXJldHVybiByYXRpby5UaWVyMiwgbmlsCgljYXNlIDM6CgkJcmV0dXJuIHJhdGlvLlRpZXIzLCBuaWwKCWRlZmF1bHQ6CgkJcmV0dXJuIDAsIGVycm9ycy5OZXcodWZtdC5TcHJpbnRmKCJ1bnN1cHBvcnRlZCB0aWVyKCVkKSIsIHRpZXIpKQoJfQp9CgovLyBTd2FwQmF0Y2hQcm9jZXNzb3IgcHJvY2Vzc2VzIHRpY2sgY3Jvc3NlcyBpbiBiYXRjaCBmb3IgYSBzd2FwCi8vIFRoaXMgcHJvY2Vzc29yIGFjY3VtdWxhdGVzIGFsbCB0aWNrIGNyb3NzZXMgdGhhdCBvY2N1ciBkdXJpbmcgYSBzaW5nbGUgc3dhcAovLyBhbmQgcHJvY2Vzc2VzIHRoZW0gdG9nZXRoZXIgYXQgdGhlIGVuZCwgcmVkdWNpbmcgcmVkdW5kYW50IGNhbGN1bGF0aW9ucwovLyBhbmQgc3RhdGUgdXBkYXRlcyB0aGF0IHdvdWxkIG9jY3VyIHdpdGggaW5kaXZpZHVhbCB0aWNrIHByb2Nlc3NpbmcKdHlwZSBTd2FwQmF0Y2hQcm9jZXNzb3Igc3RydWN0IHsKCXBvb2xQYXRoICBzdHJpbmcgICAgICAgICAgIC8vIFRoZSBwb29sIHBhdGggaWRlbnRpZmllciBmb3IgdGhpcyBzd2FwCglwb29sICAgICAgKlBvb2wgICAgICAgICAgICAvLyBSZWZlcmVuY2UgdG8gdGhlIHBvb2wgYmVpbmcgc3dhcHBlZCBpbgoJY3Jvc3NlcyAgIFtdKlN3YXBUaWNrQ3Jvc3MgLy8gQWNjdW11bGF0ZWQgdGljayBjcm9zc2VzIGR1cmluZyB0aGUgc3dhcAoJdGltZXN0YW1wIGludDY0ICAgICAgICAgICAgLy8gVGltZXN0YW1wIHdoZW4gdGhlIHN3YXAgc3RhcnRlZAoJaXNBY3RpdmUgIGJvb2wgICAgICAgICAgICAgLy8gRmxhZyB0byBwcmV2ZW50IGFjY3VtdWxhdGlvbiBhZnRlciBzd2FwIGVuZHMKfQoKLy8gUG9vbFBhdGggcmV0dXJucyB0aGUgcG9vbCBwYXRoIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN3YXAgYmF0Y2guCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwYXRoOiBQb29sIGlkZW50aWZpZXIgZm9yIHRoZSBzd2FwIGJlaW5nIHByb2Nlc3NlZC4KZnVuYyAocyAqU3dhcEJhdGNoUHJvY2Vzc29yKSBQb29sUGF0aCgpIHN0cmluZyB7CglyZXR1cm4gcy5wb29sUGF0aAp9CgovLyBTZXRQb29sUGF0aCBzdG9yZXMgdGhlIHBvb2wgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyBzd2FwIGJhdGNoLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IFBvb2wgaWRlbnRpZmllciB0byBhc3NvY2lhdGUgd2l0aCB0aGUgc3dhcCBiYXRjaC4KZnVuYyAocyAqU3dhcEJhdGNoUHJvY2Vzc29yKSBTZXRQb29sUGF0aChwb29sUGF0aCBzdHJpbmcpIHsKCXMucG9vbFBhdGggPSBwb29sUGF0aAp9CgovLyBQb29sIHJldHVybnMgdGhlIHBvb2wgcmVmZXJlbmNlZCBieSB0aGlzIHN3YXAgYmF0Y2guCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwb29sOiBQb29sIHN0YXRlIHVzZWQgdG8gcHJvY2VzcyB0aGUgYWNjdW11bGF0ZWQgdGljayBjcm9zc2VzLgpmdW5jIChzICpTd2FwQmF0Y2hQcm9jZXNzb3IpIFBvb2woKSAqUG9vbCB7CglyZXR1cm4gcy5wb29sCn0KCi8vIFNldFBvb2wgcmVwbGFjZXMgdGhlIHBvb2wgcmVmZXJlbmNlIHVzZWQgYnkgdGhpcyBzd2FwIGJhdGNoLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbDogUG9vbCBzdGF0ZSB0byByZWZlcmVuY2Ugd2hpbGUgcHJvY2Vzc2luZyB0aWNrIGNyb3NzZXMuCmZ1bmMgKHMgKlN3YXBCYXRjaFByb2Nlc3NvcikgU2V0UG9vbChwb29sICpQb29sKSB7CglzLnBvb2wgPSBwb29sCn0KCi8vIENyb3NzZXMgcmV0dXJucyB0aGUgdGljayBjcm9zc2VzIGFjY3VtdWxhdGVkIGJ5IHRoaXMgYmF0Y2guCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjcm9zc2VzOiBTbGljZSBvZiB0aWNrLWNyb3NzIHJlY29yZHMgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBhZGRlZC4KZnVuYyAocyAqU3dhcEJhdGNoUHJvY2Vzc29yKSBDcm9zc2VzKCkgW10qU3dhcFRpY2tDcm9zcyB7CglyZXR1cm4gcy5jcm9zc2VzCn0KCi8vIFNldENyb3NzZXMgcmVwbGFjZXMgdGhlIGJhdGNoJ3MgYWNjdW11bGF0ZWQgdGljay1jcm9zcyBzZXF1ZW5jZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGNyb3NzZXM6IFRpY2stY3Jvc3MgcmVjb3JkcyB0byBzdG9yZSBhcyB0aGUgYmF0Y2gncyBhY2N1bXVsYXRlZCBzZXF1ZW5jZS4KZnVuYyAocyAqU3dhcEJhdGNoUHJvY2Vzc29yKSBTZXRDcm9zc2VzKGNyb3NzZXMgW10qU3dhcFRpY2tDcm9zcykgewoJcy5jcm9zc2VzID0gY3Jvc3Nlcwp9CgovLyBUaW1lc3RhbXAgcmV0dXJucyB0aGUgVW5peCB0aW1lc3RhbXAgaW4gc2Vjb25kcyByZWNvcmRlZCB3aGVuIHRoZSBzd2FwIHN0YXJ0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aW1lc3RhbXA6IFN3YXAtc3RhcnQgdGltZXN0YW1wIGluIFVuaXggc2Vjb25kcy4KZnVuYyAocyAqU3dhcEJhdGNoUHJvY2Vzc29yKSBUaW1lc3RhbXAoKSBpbnQ2NCB7CglyZXR1cm4gcy50aW1lc3RhbXAKfQoKLy8gU2V0VGltZXN0YW1wIHN0b3JlcyB0aGUgc3dhcC1zdGFydCB0aW1lc3RhbXAgZm9yIHRoaXMgYmF0Y2guCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aW1lc3RhbXA6IFVuaXggdGltZXN0YW1wIGluIHNlY29uZHMgdG8gcmVjb3JkIGZvciB0aGUgc3dhcCBiYXRjaC4KZnVuYyAocyAqU3dhcEJhdGNoUHJvY2Vzc29yKSBTZXRUaW1lc3RhbXAodGltZXN0YW1wIGludDY0KSB7CglzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcAp9CgovLyBJc0FjdGl2ZSByZXBvcnRzIHRoZSBwcm9jZXNzb3IncyBzdG9yZWQgYWN0aXZlIGZsYWcuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhY3RpdmU6IFRydWUgd2hlbiB0aGUgYmF0Y2ggaXMgbWFya2VkIGFjdGl2ZSBmb3IgdGhlIHN3YXAgbGlmZWN5Y2xlLgpmdW5jIChzICpTd2FwQmF0Y2hQcm9jZXNzb3IpIElzQWN0aXZlKCkgYm9vbCB7CglyZXR1cm4gcy5pc0FjdGl2ZQp9CgovLyBTZXRJc0FjdGl2ZSBzdG9yZXMgdGhlIHByb2Nlc3NvcidzIGFjdGl2ZSBsaWZlY3ljbGUgZmxhZy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGlzQWN0aXZlOiBBY3RpdmUgZmxhZyB0byBzdG9yZSBmb3IgdGhlIHN3YXAgbGlmZWN5Y2xlLgpmdW5jIChzICpTd2FwQmF0Y2hQcm9jZXNzb3IpIFNldElzQWN0aXZlKGlzQWN0aXZlIGJvb2wpIHsKCXMuaXNBY3RpdmUgPSBpc0FjdGl2ZQp9CgovLyBMYXN0Q3Jvc3MgcmV0dXJucyB0aGUgbW9zdCByZWNlbnRseSBhcHBlbmRlZCB0aWNrIGNyb3NzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gY3Jvc3M6IExhc3QgdGljay1jcm9zcyByZWNvcmQsIG9yIG5pbCB3aGVuIG5vIGNyb3NzZXMgaGF2ZSBiZWVuIGFkZGVkLgpmdW5jIChzICpTd2FwQmF0Y2hQcm9jZXNzb3IpIExhc3RDcm9zcygpICpTd2FwVGlja0Nyb3NzIHsKCWlmIGxlbihzLmNyb3NzZXMpID09IDAgewoJCXJldHVybiBuaWwKCX0KCglyZXR1cm4gcy5jcm9zc2VzW2xlbihzLmNyb3NzZXMpLTFdCn0KCi8vIEFkZENyb3NzIGFwcGVuZHMgYSB0aWNrLWNyb3NzIHJlY29yZCB0byB0aGUgYmF0Y2ggc2VxdWVuY2UuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aWNrQ3Jvc3M6IFRpY2stY3Jvc3MgcmVjb3JkIHRvIGFwcGVuZC4KZnVuYyAocyAqU3dhcEJhdGNoUHJvY2Vzc29yKSBBZGRDcm9zcyh0aWNrQ3Jvc3MgKlN3YXBUaWNrQ3Jvc3MpIHsKCXMuY3Jvc3NlcyA9IGFwcGVuZChzLmNyb3NzZXMsIHRpY2tDcm9zcykKfQoKLy8gTmV3U3dhcEJhdGNoUHJvY2Vzc29yIGNyZWF0ZXMgYW4gYWN0aXZlIGJhdGNoIGZvciBjb2xsZWN0aW5nIHRpY2sgY3Jvc3NlcyBpbiBhIHBvb2wgc3dhcC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBQb29sIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBzd2FwLgovLyAgIC0gcG9vbDogUG9vbCBzdGF0ZSB3aG9zZSB0aWNrIGNyb3NzZXMgYXJlIGJlaW5nIGNvbGxlY3RlZC4KLy8gICAtIHRpbWVzdGFtcDogVW5peCB0aW1lc3RhbXAgaW4gc2Vjb25kcyB3aGVuIHRoZSBzd2FwIGJlZ2FuLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcHJvY2Vzc29yOiBBY3RpdmUgcHJvY2Vzc29yIHdpdGggYW4gZW1wdHkgY3Jvc3Mgc2VxdWVuY2UuCmZ1bmMgTmV3U3dhcEJhdGNoUHJvY2Vzc29yKHBvb2xQYXRoIHN0cmluZywgcG9vbCAqUG9vbCwgdGltZXN0YW1wIGludDY0KSAqU3dhcEJhdGNoUHJvY2Vzc29yIHsKCXJldHVybiAmU3dhcEJhdGNoUHJvY2Vzc29yewoJCXBvb2xQYXRoOiAgcG9vbFBhdGgsCgkJcG9vbDogICAgICBwb29sLAoJCWNyb3NzZXM6ICAgbWFrZShbXSpTd2FwVGlja0Nyb3NzLCAwKSwKCQl0aW1lc3RhbXA6IHRpbWVzdGFtcCwKCQlpc0FjdGl2ZTogIHRydWUsCgl9Cn0KCi8vIFN3YXBUaWNrQ3Jvc3Mgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgdGljayBjcm9zcyBkdXJpbmcgYSBzd2FwCi8vIFRoaXMgc3RydWN0IGlzIHVzZWQgdG8gYWNjdW11bGF0ZSB0aWNrIGNyb3NzIGV2ZW50cyBkdXJpbmcgYSBzaW5nbGUgc3dhcCB0cmFuc2FjdGlvbgovLyBmb3IgYmF0Y2ggcHJvY2Vzc2luZyB0byBvcHRpbWl6ZSBnYXMgdXNhZ2UgYW5kIGNvbXB1dGF0aW9uYWwgZWZmaWNpZW5jeQp0eXBlIFN3YXBUaWNrQ3Jvc3Mgc3RydWN0IHsKCXRpY2tJRCAgICAgaW50MzIgICAgIC8vIFRoZSB0aWNrIGluZGV4IHRoYXQgd2FzIGNyb3NzZWQKCXplcm9Gb3JPbmUgYm9vbCAgICAgIC8vIERpcmVjdGlvbiBvZiB0aGUgc3dhcCAodHJ1ZTogdG9rZW4wLT50b2tlbjEsIGZhbHNlOiB0b2tlbjEtPnRva2VuMCkKCWRlbHRhICAgICAgKmkyNTYuSW50IC8vIFByZS1jYWxjdWxhdGVkIGxpcXVpZGl0eSBkZWx0YSBmb3IgdGhpcyB0aWNrIGNyb3NzCn0KCi8vIFRpY2tJRCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY3Jvc3NlZCB0aWNrLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdGlja0lEOiBUaWNrIGluZGV4IHJlcHJlc2VudGVkIGJ5IHRoaXMgY3Jvc3MuCmZ1bmMgKHMgKlN3YXBUaWNrQ3Jvc3MpIFRpY2tJRCgpIGludDMyIHsKCXJldHVybiBzLnRpY2tJRAp9CgovLyBaZXJvRm9yT25lIHJlcG9ydHMgdGhlIHN3YXAgZGlyZWN0aW9uIHJlcHJlc2VudGVkIGJ5IHRoaXMgY3Jvc3MuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB6ZXJvRm9yT25lOiBUcnVlIGZvciB0b2tlbjAtdG8tdG9rZW4xIHN3YXBzOyBmYWxzZSBmb3IgdG9rZW4xLXRvLXRva2VuMCBzd2Fwcy4KZnVuYyAocyAqU3dhcFRpY2tDcm9zcykgWmVyb0Zvck9uZSgpIGJvb2wgewoJcmV0dXJuIHMuemVyb0Zvck9uZQp9CgovLyBEZWx0YSByZXR1cm5zIHRoZSBwcmVjb21wdXRlZCBuZXQgc3Rha2VkLWxpcXVpZGl0eSBjaGFuZ2UgZm9yIHRoZSBjcm9zc2VkIHRpY2suCi8vCi8vIFJldHVybnM6Ci8vICAgLSBkZWx0YTogU2lnbmVkIGxpcXVpZGl0eSBkZWx0YSB0byBhcHBseSBhdCB0aGUgY3Jvc3NlZCB0aWNrLgpmdW5jIChzICpTd2FwVGlja0Nyb3NzKSBEZWx0YSgpICppMjU2LkludCB7CglyZXR1cm4gcy5kZWx0YQp9CgovLyBOZXdTd2FwVGlja0Nyb3NzIGNyZWF0ZXMgYSB0aWNrLWNyb3NzIHJlY29yZCBmb3IgYSBzd2FwIGJhdGNoLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGlja0lEOiBJbmRleCBvZiB0aGUgdGljayBjcm9zc2VkIGR1cmluZyB0aGUgc3dhcC4KLy8gICAtIHplcm9Gb3JPbmU6IFN3YXAgZGlyZWN0aW9uOyB0cnVlIG1lYW5zIHRva2VuMC10by10b2tlbjEgYW5kIGZhbHNlIG1lYW5zIHRva2VuMS10by10b2tlbjAuCi8vICAgLSBkZWx0YTogUHJlY29tcHV0ZWQgc2lnbmVkIHN0YWtlZC1saXF1aWRpdHkgY2hhbmdlIGZvciB0aGlzIHRpY2sgY3Jvc3MuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjcm9zczogVGljay1jcm9zcyByZWNvcmQgY29udGFpbmluZyB0aGUgc3VwcGxpZWQgaW5kZXgsIGRpcmVjdGlvbiwgYW5kIGRlbHRhLgpmdW5jIE5ld1N3YXBUaWNrQ3Jvc3ModGlja0lEIGludDMyLCB6ZXJvRm9yT25lIGJvb2wsIGRlbHRhICppMjU2LkludCkgKlN3YXBUaWNrQ3Jvc3MgewoJcmV0dXJuICZTd2FwVGlja0Nyb3NzewoJCXRpY2tJRDogICAgIHRpY2tJRCwKCQl6ZXJvRm9yT25lOiB6ZXJvRm9yT25lLAoJCWRlbHRhOiAgICAgIGRlbHRhLAoJfQp9Chq+bQoJcHJveHkuZ25vErBtcGFja2FnZSBzdGFrZXIKCi8vIFN0YWtlVG9rZW4gc3Rha2VzIGEgcG9zaXRpb24gTkZUIHRvIGVhcm4gcmV3YXJkcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gcG9zaXRpb25JZDogTFAgcG9zaXRpb24gTkZUIHRva2VuIElEIHRvIHN0YWtlLgovLyAgIC0gcmVmZXJyZXI6IE9wdGlvbmFsIHJlZmVycmFsIGFkZHJlc3Mgc3RyaW5nIHVzZWQgZm9yIHJlZmVycmFsIHRyYWNraW5nLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RyaW5nOiBQb29sIHBhdGggd2hlcmUgdGhlIHBvc2l0aW9uIHdhcyBzdGFrZWQuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFN0YWtlciBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBTdGFrZVRva2VuKGN1ciByZWFsbSwgcG9zaXRpb25JZCB1aW50NjQsIHJlZmVycmVyIHN0cmluZykgc3RyaW5nIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLlN0YWtlVG9rZW4oMCwgY3VyLCBwb3NpdGlvbklkLCByZWZlcnJlcikKfQoKLy8gVW5TdGFrZVRva2VuIHVuc3Rha2VzIGEgcG9zaXRpb24gTkZUIGFuZCBjcmVhdGVzIGFuIGV4aXQgY2hlY2twb2ludCBmb3IgaXRzIHJld2FyZHMuCi8vCi8vIFRoZSBORlQgaXMgcmV0dXJuZWQgdG8gaXRzIG93bmVyIHdpdGhvdXQgY2FsY3VsYXRpbmcgb3IgcGF5aW5nIHJld2FyZHMuIFVzZSBhIENvbGxlY3QqIGVudHJ5Ci8vIHBvaW50IGFmdGVyd2FyZDsgY29sbGVjdGlvbiBvZiBhbiBleGl0IGNoZWNrcG9pbnQgaXMgcGVybWlzc2lvbmxlc3MgYW5kIHBheXMgaXRzIHBpbm5lZCBvd25lci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gcG9zaXRpb25JZDogTFAgcG9zaXRpb24gTkZUIHRva2VuIElEIHRvIHVuc3Rha2UuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdHJpbmc6IFBvb2wgcGF0aCB3aGVyZSB0aGUgcG9zaXRpb24gd2FzIHN0YWtlZC4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgV2l0aGRyYXcgaGFsdCBzY29wZSBpcyBhY3RpdmUuCmZ1bmMgVW5TdGFrZVRva2VuKGN1ciByZWFsbSwgcG9zaXRpb25JZCB1aW50NjQpIHN0cmluZyB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5VblN0YWtlVG9rZW4oMCwgY3VyLCBwb3NpdGlvbklkKQp9CgovLyBDb2xsZWN0UmV3YXJkIGNvbGxlY3RzIGJvdGggdGhlIEdOUyBlbWlzc2lvbiBhbmQgZXh0ZXJuYWwgaW5jZW50aXZlIHJld2FyZHMgZm9yIGEgbGl2ZSBzdGFrZWQKLy8gZGVwb3NpdCBvciBhbiBleGl0IGNoZWNrcG9pbnQgbGVmdCBieSBVblN0YWtlVG9rZW4uCi8vCi8vIEEgbGl2ZS1kZXBvc2l0IGNvbGxlY3QgcmVxdWlyZXMgdGhlIGRlcG9zaXRvci9vd25lci4gQW4gZXhpdC1jaGVja3BvaW50IGNvbGxlY3QgaXMgcGVybWlzc2lvbmxlc3MKLy8gYW5kIHBheXMgdGhlIG93bmVyIHBpbm5lZCBpbiB0aGUgY2hlY2twb2ludC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gcG9zaXRpb25JZDogU3Rha2VkIHBvc2l0aW9uIE5GVCB0b2tlbiBJRCBvciBwb3NpdGlvbiB3aXRoIGFuIGV4aXQgY2hlY2twb2ludC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogR05TIGVtaXNzaW9uIGFtb3VudCBzZW50IHRvIHRoZSB1c2VyLgovLyAgIC0gc3RyaW5nOiBHTlMgZW1pc3Npb24gcGVuYWx0eSBhbW91bnQgc2VudCB0byB0aGUgY29tbXVuaXR5IHBvb2wuCi8vICAgLSBtYXBbc3RyaW5nXWludDY0OiBHcm9zcyBleHRlcm5hbCByZXdhcmQgYW1vdW50IHBlciByZXdhcmQgdG9rZW4sIGJlZm9yZSB0aGUgc3Rha2luZy1yZXdhcmQgZmVlLgovLyAgIC0gbWFwW3N0cmluZ11pbnQ2NDogRXh0ZXJuYWwgcGVuYWx0eSBhbW91bnQgcGVyIHJld2FyZCB0b2tlbi4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgV2l0aGRyYXcgaGFsdCBzY29wZSBpcyBhY3RpdmUuCmZ1bmMgQ29sbGVjdFJld2FyZChjdXIgcmVhbG0sIHBvc2l0aW9uSWQgdWludDY0KSAoc3RyaW5nLCBzdHJpbmcsIG1hcFtzdHJpbmddaW50NjQsIG1hcFtzdHJpbmddaW50NjQpIHsKCWVtaXNzaW9uVG9Vc2VyLCBlbWlzc2lvblBlbmFsdHksIGV4dGVybmFsUmV3YXJkcywgZXh0ZXJuYWxQZW5hbHRpZXMgOj0gZ2V0SW1wbGVtZW50YXRpb24oKS5Db2xsZWN0UmV3YXJkKDAsIGN1ciwgcG9zaXRpb25JZCkKCXJldHVybiBlbWlzc2lvblRvVXNlciwgZW1pc3Npb25QZW5hbHR5LCBjbG9uZVN0cmluZ0ludDY0TWFwKGV4dGVybmFsUmV3YXJkcyksIGNsb25lU3RyaW5nSW50NjRNYXAoZXh0ZXJuYWxQZW5hbHRpZXMpCn0KCi8vIENvbGxlY3RFbWlzc2lvblJld2FyZCBjb2xsZWN0cyBvbmx5IHRoZSBHTlMgZW1pc3Npb24gcmV3YXJkIGZvciBhIGxpdmUgc3Rha2VkIGRlcG9zaXQgb3IgYW4gZXhpdAovLyBjaGVja3BvaW50IGxlZnQgYnkgVW5TdGFrZVRva2VuLgovLwovLyBBIGxpdmUtZGVwb3NpdCBjb2xsZWN0IHJlcXVpcmVzIHRoZSBkZXBvc2l0b3Ivb3duZXIuIEFuIGV4aXQtY2hlY2twb2ludCBjb2xsZWN0IGlzIHBlcm1pc3Npb25sZXNzCi8vIGFuZCBwYXlzIHRoZSBvd25lciBwaW5uZWQgaW4gdGhlIGNoZWNrcG9pbnQuCi8vCi8vIEV4dGVybmFsIGluY2VudGl2ZSByZXdhcmRzIGtlZXAgYWNjcnVpbmc7IGNvbGxlY3QgdGhlbSB3aXRoIENvbGxlY3RFeHRlcm5hbEluY2VudGl2ZVJld2FyZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gcG9zaXRpb25JZDogU3Rha2VkIHBvc2l0aW9uIE5GVCB0b2tlbiBJRCBvciBwb3NpdGlvbiB3aXRoIGFuIGV4aXQgY2hlY2twb2ludC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBHTlMgZW1pc3Npb24gYW1vdW50IHNlbnQgdG8gdGhlIHVzZXIuCi8vICAgLSBpbnQ2NDogR05TIGVtaXNzaW9uIHBlbmFsdHkgYW1vdW50IHNlbnQgdG8gdGhlIGNvbW11bml0eSBwb29sLgovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBXaXRoZHJhdyBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBDb2xsZWN0RW1pc3Npb25SZXdhcmQoY3VyIHJlYWxtLCBwb3NpdGlvbklkIHVpbnQ2NCkgKGludDY0LCBpbnQ2NCkgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuQ29sbGVjdEVtaXNzaW9uUmV3YXJkKDAsIGN1ciwgcG9zaXRpb25JZCkKfQoKLy8gQ29sbGVjdEV4dGVybmFsSW5jZW50aXZlUmV3YXJkIGNvbGxlY3RzIG9uZSBleHRlcm5hbCBpbmNlbnRpdmUgcmV3YXJkIGZvciBhIGxpdmUgc3Rha2VkIGRlcG9zaXQKLy8gb3IgYW4gZXhpdCBjaGVja3BvaW50IGxlZnQgYnkgVW5TdGFrZVRva2VuLgovLwovLyBBIGxpdmUtZGVwb3NpdCBjb2xsZWN0IHJlcXVpcmVzIHRoZSBkZXBvc2l0b3Ivb3duZXIuIEFuIGV4aXQtY2hlY2twb2ludCBjb2xsZWN0IGlzIHBlcm1pc3Npb25sZXNzCi8vIGFuZCBwYXlzIHRoZSBvd25lciBwaW5uZWQgaW4gdGhlIGNoZWNrcG9pbnQuCi8vCi8vIFRoZSBHTlMgZW1pc3Npb24gcmV3YXJkIGFuZCBldmVyeSBvdGhlciBpbmNlbnRpdmUga2VlcCBhY2NydWluZzsgY29sbGVjdCB0aGUgZW1pc3Npb24gcmV3YXJkIHdpdGgKLy8gQ29sbGVjdEVtaXNzaW9uUmV3YXJkIGFuZCB0aGUgb3RoZXIgaW5jZW50aXZlcyBieSBjYWxsaW5nIHRoaXMgd2l0aCB0aGVpciBvd24gaW5jZW50aXZlIGlkLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBwb3NpdGlvbklkOiBTdGFrZWQgcG9zaXRpb24gTkZUIHRva2VuIElEIG9yIHBvc2l0aW9uIHdpdGggYW4gZXhpdCBjaGVja3BvaW50LgovLyAgIC0gaW5jZW50aXZlSWQ6IEV4dGVybmFsIGluY2VudGl2ZSBpZGVudGlmaWVyIHRvIGNvbGxlY3QuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogR3Jvc3MgcmV3YXJkIGFtb3VudCBiZWZvcmUgdGhlIHN0YWtpbmctcmV3YXJkIGZlZS4KLy8gICAtIGludDY0OiBQZW5hbHR5IGFtb3VudCByZXRhaW5lZCBieSB0aGUgaW5jZW50aXZlLgovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBXaXRoZHJhdyBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBDb2xsZWN0RXh0ZXJuYWxJbmNlbnRpdmVSZXdhcmQoY3VyIHJlYWxtLCBwb3NpdGlvbklkIHVpbnQ2NCwgaW5jZW50aXZlSWQgc3RyaW5nKSAoaW50NjQsIGludDY0KSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5Db2xsZWN0RXh0ZXJuYWxJbmNlbnRpdmVSZXdhcmQoMCwgY3VyLCBwb3NpdGlvbklkLCBpbmNlbnRpdmVJZCkKfQoKLy8gU2V0UG9vbFRpZXIgYXNzaWducyBhIHBvb2wgdG8gYW4gaW50ZXJuYWwgR05TIGVtaXNzaW9uIHJld2FyZCB0aWVyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIHdob3NlIGVtaXNzaW9uIHRpZXIgaXMgYXNzaWduZWQuCi8vICAgLSB0aWVyOiBUYXJnZXQgdGllciBudW1iZXIgZnJvbSAwIHRocm91Z2ggMzsgemVybyByZW1vdmVzIHRoZSBwb29sIGZyb20gZW1pc3Npb24gdGFyZ2V0aW5nLgovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBTdGFrZXIgaGFsdCBzY29wZSBpcyBhY3RpdmUuCmZ1bmMgU2V0UG9vbFRpZXIoY3VyIHJlYWxtLCBwb29sUGF0aCBzdHJpbmcsIHRpZXIgdWludDY0KSB7CglnZXRJbXBsZW1lbnRhdGlvbigpLlNldFBvb2xUaWVyKDAsIGN1ciwgcG9vbFBhdGgsIHRpZXIpCn0KCi8vIENoYW5nZVBvb2xUaWVyIGNoYW5nZXMgdGhlIGludGVybmFsIEdOUyBlbWlzc2lvbiB0aWVyIGFzc2lnbmVkIHRvIGEgcG9vbC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCB3aG9zZSBlbWlzc2lvbiB0aWVyIGlzIGNoYW5nZWQuCi8vICAgLSB0aWVyOiBOZXcgdGllciBudW1iZXIgZnJvbSAwIHRocm91Z2ggMzsgemVybyBtZWFucyBubyBpbnRlcm5hbC1lbWlzc2lvbiB0YXJnZXQuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFN0YWtlciBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBDaGFuZ2VQb29sVGllcihjdXIgcmVhbG0sIHBvb2xQYXRoIHN0cmluZywgdGllciB1aW50NjQpIHsKCWdldEltcGxlbWVudGF0aW9uKCkuQ2hhbmdlUG9vbFRpZXIoMCwgY3VyLCBwb29sUGF0aCwgdGllcikKfQoKLy8gUmVtb3ZlUG9vbFRpZXIgcmVtb3ZlcyBhIHBvb2wgZnJvbSB0aGUgaW50ZXJuYWwgR05TIGVtaXNzaW9uIHRpZXIgc3lzdGVtLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIHRvIHJlbW92ZSBmcm9tIGVtaXNzaW9uLXRpZXIgbWVtYmVyc2hpcC4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgU3Rha2VyIGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIFJlbW92ZVBvb2xUaWVyKGN1ciByZWFsbSwgcG9vbFBhdGggc3RyaW5nKSB7CglnZXRJbXBsZW1lbnRhdGlvbigpLlJlbW92ZVBvb2xUaWVyKDAsIGN1ciwgcG9vbFBhdGgpCn0KCi8vIENyZWF0ZUV4dGVybmFsSW5jZW50aXZlIGNyZWF0ZXMgYW4gZXh0ZXJuYWwgcmV3YXJkIGluY2VudGl2ZSBmb3IgYSBwb29sLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSB0YXJnZXRQb29sUGF0aDogUG9vbCBwYXRoIHdob3NlIGxpcXVpZGl0eSBwcm92aWRlcnMgd2lsbCByZWNlaXZlIHRoZSBpbmNlbnRpdmUuCi8vICAgLSByZXdhcmRUb2tlbjogUmVnaXN0ZXJlZCB0b2tlbiBwYXRoIHVzZWQgdG8gcGF5IHRoZSBpbmNlbnRpdmUuCi8vICAgLSByZXdhcmRBbW91bnQ6IFRvdGFsIHJld2FyZCBhbW91bnQgZGVwb3NpdGVkLCBpbiByZXdhcmQtdG9rZW4gdW5pdHMuCi8vICAgLSBzdGFydFRpbWVzdGFtcDogSW5jZW50aXZlIHN0YXJ0IHRpbWUgYXMgYW4gaW5jbHVzaXZlIFVuaXggdGltZXN0YW1wLgovLyAgIC0gZW5kVGltZXN0YW1wOiBJbmNlbnRpdmUgZW5kIHRpbWUgYXMgYW4gaW5jbHVzaXZlIFVuaXggdGltZXN0YW1wLgovLwovLyBBbnkgY2FsbGVyIG1heSBjcmVhdGUgYW4gaW5jZW50aXZlIGFmdGVyIHNhdGlzZnlpbmcgdGhlIHRva2VuLCBkdXJhdGlvbiwgc3RhcnQtdGltZSwKLy8gcmV3YXJkLW1pbmltdW0sIGFuZCBHTlMtZGVwb3NpdCBjaGVja3MuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFN0YWtlciBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBDcmVhdGVFeHRlcm5hbEluY2VudGl2ZSgKCWN1ciByZWFsbSwKCXRhcmdldFBvb2xQYXRoIHN0cmluZywKCXJld2FyZFRva2VuIHN0cmluZywKCXJld2FyZEFtb3VudCBpbnQ2NCwKCXN0YXJ0VGltZXN0YW1wIGludDY0LAoJZW5kVGltZXN0YW1wIGludDY0LAopIHsKCWdldEltcGxlbWVudGF0aW9uKCkuQ3JlYXRlRXh0ZXJuYWxJbmNlbnRpdmUoCgkJMCwKCQljdXIsCgkJdGFyZ2V0UG9vbFBhdGgsCgkJcmV3YXJkVG9rZW4sCgkJcmV3YXJkQW1vdW50LAoJCXN0YXJ0VGltZXN0YW1wLAoJCWVuZFRpbWVzdGFtcCwKCSkKfQoKLy8gRW5kRXh0ZXJuYWxJbmNlbnRpdmUgZmluYWxpemVzIGFuIGV4dGVybmFsIGluY2VudGl2ZSBvbmNlIGl0cyBlbmQgdGltZXN0YW1wIGhhcyBwYXNzZWQsCi8vIHNlbmRpbmcgdGhlIHVuY2xhaW1hYmxlL3JlbWFpbmRlciByZXdhcmQgcG9ydGlvbiBhbmQgR05TIGRlcG9zaXQgdG8gdGhlIGV4cGxpY2l0IHJlZnVuZEFkZHJlc3MuCi8vIE9ubHkgdGhlIGluY2VudGl2ZSBjcmVhdG9yIG9yIGFkbWluIG1heSBjYWxsIGl0OyBhbiBvdXRzdGFuZGluZyBleGl0IGNoZWNrcG9pbnQgZm9yIHRoaXMKLy8gaW5jZW50aXZlIG11c3QgYmUgY29sbGVjdGVkIG9yIGZvcmZlaXRlZCBmaXJzdC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gdGFyZ2V0UG9vbFBhdGg6IFBvb2wgcGF0aCBjb250YWluaW5nIHRoZSBpbmNlbnRpdmUuCi8vICAgLSBpbmNlbnRpdmVJZDogVW5pcXVlIGluY2VudGl2ZSBpZGVudGlmaWVyIHRvIGZpbmFsaXplLgovLyAgIC0gcmVmdW5kQWRkcmVzczogQWRkcmVzcyByZWNlaXZpbmcgdGhlIHJlZnVuZGFibGUgcmV3YXJkIHRva2VucyBhbmQgR05TIGRlcG9zaXQuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFdpdGhkcmF3IGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIEVuZEV4dGVybmFsSW5jZW50aXZlKGN1ciByZWFsbSwgdGFyZ2V0UG9vbFBhdGgsIGluY2VudGl2ZUlkIHN0cmluZywgcmVmdW5kQWRkcmVzcyBhZGRyZXNzKSB7CglnZXRJbXBsZW1lbnRhdGlvbigpLkVuZEV4dGVybmFsSW5jZW50aXZlKDAsIGN1ciwgdGFyZ2V0UG9vbFBhdGgsIGluY2VudGl2ZUlkLCByZWZ1bmRBZGRyZXNzKQp9CgovLyBDYW5jZWxFeHRlcm5hbEluY2VudGl2ZSBjYW5jZWxzIGFuIGV4dGVybmFsIGluY2VudGl2ZSB0aGF0IGhhcyBub3Qgc3RhcnRlZCB5ZXQsCi8vIHJlbW92aW5nIGl0IGFuZCByZWZ1bmRpbmcgdGhlIHJld2FyZCB0b2tlbnMgYW5kIHRoZSBHTlMgZGVwb3NpdCB0byB0aGUgY3JlYXRvci4KLy8gQ2FsbGFibGUgYnkgYWRtaW4sIGdvdmVybmFuY2UsIG9yIHRoZSBpbmNlbnRpdmUgY3JlYXRvci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gdGFyZ2V0UG9vbFBhdGg6IFBvb2wgcGF0aCBjb250YWluaW5nIHRoZSBpbmNlbnRpdmUuCi8vICAgLSBpbmNlbnRpdmVJZDogVW5pcXVlIGluY2VudGl2ZSBpZGVudGlmaWVyIHRvIGNhbmNlbC4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgV2l0aGRyYXcgaGFsdCBzY29wZSBpcyBhY3RpdmUuCmZ1bmMgQ2FuY2VsRXh0ZXJuYWxJbmNlbnRpdmUoY3VyIHJlYWxtLCB0YXJnZXRQb29sUGF0aCwgaW5jZW50aXZlSWQgc3RyaW5nKSB7CglnZXRJbXBsZW1lbnRhdGlvbigpLkNhbmNlbEV4dGVybmFsSW5jZW50aXZlKDAsIGN1ciwgdGFyZ2V0UG9vbFBhdGgsIGluY2VudGl2ZUlkKQp9CgovLyBDb2xsZWN0RXh0ZXJuYWxJbmNlbnRpdmVQZW5hbHR5IGNvbGxlY3RzIGFjY3VtdWxhdGVkIHdhcm0tdXAgcGVuYWx0aWVzIGFmdGVyCi8vIEVuZEV4dGVybmFsSW5jZW50aXZlIGhhcyBmaW5hbGl6ZWQgdGhlIGluY2VudGl2ZSwgc2VuZGluZyB0aGVtIHRvIHJlZnVuZEFkZHJlc3MuCi8vIE9ubHkgdGhlIGluY2VudGl2ZSBjcmVhdG9yIG9yIGFkbWluIG1heSBjYWxsIGl0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSB0YXJnZXRQb29sUGF0aDogUG9vbCBwYXRoIGNvbnRhaW5pbmcgdGhlIGluY2VudGl2ZS4KLy8gICAtIGluY2VudGl2ZUlkOiBVbmlxdWUgaW5jZW50aXZlIGlkZW50aWZpZXIgd2hvc2UgcGVuYWx0eSBpcyBjb2xsZWN0ZWQuCi8vICAgLSByZWZ1bmRBZGRyZXNzOiBBZGRyZXNzIHJlY2VpdmluZyB0aGUgY29sbGVjdGVkIHBlbmFsdHkgYW1vdW50LgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IFBlbmFsdHkgYW1vdW50IHRyYW5zZmVycmVkLCBjYXBwZWQgYnkgdGhlIHN0YWtlcidzIGF2YWlsYWJsZSByZXdhcmQtdG9rZW4gYmFsYW5jZS4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgV2l0aGRyYXcgaGFsdCBzY29wZSBpcyBhY3RpdmUuCmZ1bmMgQ29sbGVjdEV4dGVybmFsSW5jZW50aXZlUGVuYWx0eShjdXIgcmVhbG0sIHRhcmdldFBvb2xQYXRoLCBpbmNlbnRpdmVJZCBzdHJpbmcsIHJlZnVuZEFkZHJlc3MgYWRkcmVzcykgaW50NjQgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuQ29sbGVjdEV4dGVybmFsSW5jZW50aXZlUGVuYWx0eSgwLCBjdXIsIHRhcmdldFBvb2xQYXRoLCBpbmNlbnRpdmVJZCwgcmVmdW5kQWRkcmVzcykKfQoKLy8gQWRkVG9rZW4gYWRkcyBhIHRva2VuIHRvIHRoZSByZXdhcmQgdG9rZW4gd2hpdGVsaXN0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSB0b2tlblBhdGg6IFJlZ2lzdGVyZWQgdG9rZW4gcGF0aCB0byBhZGQgdG8gdGhlIGFsbG93ZWQgcmV3YXJkLXRva2VuIGxpc3QuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFN0YWtlciBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBBZGRUb2tlbihjdXIgcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcpIHsKCWdldEltcGxlbWVudGF0aW9uKCkuQWRkVG9rZW4oMCwgY3VyLCB0b2tlblBhdGgpCn0KCi8vIFJlbW92ZVRva2VuIHJlbW92ZXMgYSB0b2tlbiBmcm9tIHRoZSByZXdhcmQgdG9rZW4gd2hpdGVsaXN0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSB0b2tlblBhdGg6IFRva2VuIHBhdGggdG8gcmVtb3ZlIGZyb20gdGhlIGFsbG93ZWQgcmV3YXJkLXRva2VuIGxpc3QuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFN0YWtlciBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBSZW1vdmVUb2tlbihjdXIgcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcpIHsKCWdldEltcGxlbWVudGF0aW9uKCkuUmVtb3ZlVG9rZW4oMCwgY3VyLCB0b2tlblBhdGgpCn0KCi8vIFNldERlbmllZFJld2FyZFRva2VuIHNldHMgb3IgY2xlYXJzIHRoZSBvcGVyYXRpb25hbCBkZW55IGZsYWcgZm9yIGFuIGV4dGVybmFsCi8vIGluY2VudGl2ZSByZXdhcmQgdG9rZW4uIFBvb2wtcGFpciB0b2tlbnMgcXVhbGlmeSBhcyByZXdhcmQgdG9rZW5zIHdpdGhvdXQgdGhlCi8vIGdvdmVybmFuY2UgYWxsb3dsaXN0IChieSBkZXNpZ24pLCBzbyB0aGlzIGZsYWcgaXMgdGhlIG9ubHkgbGV2ZXIgdG8gc3RvcCBORVcKLy8gaW5jZW50aXZlcyBpbiBhIHBhaXIgdG9rZW4gd2hvc2UgaXNzdWVyIHR1cm5lZCBob3N0aWxlLiBFeGlzdGluZyBpbmNlbnRpdmVzCi8vIGFuZCB0aGVpciBjb2xsZWN0aW9uIGFyZSBkZWxpYmVyYXRlbHkgdW5hZmZlY3RlZDsgdGhlIGxlZGdlci1sZXZlbCBkZWxpdmVyeQovLyBndWFyZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gYm91bmRzIHRoZWlyIGJsYXN0IHJhZGl1cyBpbnN0ZWFkLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSB0b2tlblBhdGg6IFJld2FyZC10b2tlbiBwYXRoIHdob3NlIGRlbnkgc3RhdHVzIGlzIGNoYW5nZWQuCi8vICAgLSBkZW5pZWQ6IFRydWUgdG8gYmxvY2sgbmV3IGluY2VudGl2ZXMgZm9yIHRva2VuUGF0aDsgZmFsc2UgdG8gY2xlYXIgdGhhdCBibG9jay4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgU3Rha2VyIGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIFNldERlbmllZFJld2FyZFRva2VuKGN1ciByZWFsbSwgdG9rZW5QYXRoIHN0cmluZywgZGVuaWVkIGJvb2wpIHsKCWdldEltcGxlbWVudGF0aW9uKCkuU2V0RGVuaWVkUmV3YXJkVG9rZW4oMCwgY3VyLCB0b2tlblBhdGgsIGRlbmllZCkKfQoKLy8gU2V0V2FybVVwIGNvbmZpZ3VyZXMgdGhlIGR1cmF0aW9uIGZvciB0aGUgd2FybS11cCB0aWVyIHNlbGVjdGVkIGJ5IGl0cyBmaXhlZCByYXRpby4KLy8gRmluaXRlIHRpZXJzIGFyZSBjYXBwZWQgYXQgMzY1IGRheXM7IHRoZSBmaW5hbCAxMDAlIHRpZXIgbXVzdCByZXRhaW4gbWF0aC5NYXhJbnQ2NC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gcGN0OiBXYXJtLXVwIHBheW91dCBwZXJjZW50YWdlIHNlbGVjdGluZyBvbmUgb2YgdGhlIDMwJSwgNTAlLCA3MCUsIG9yIDEwMCUgdGllcnMuCi8vICAgLSB0aW1lRHVyYXRpb246IFdhcm0tdXAgZHVyYXRpb24gaW4gVW5peCBzZWNvbmRzIGZvciB0aGUgc2VsZWN0ZWQgcGVyY2VudGFnZSB0aWVyOyBmaW5pdGUgdGllcnMgYXJlIGNhcHBlZCBhdCAzNjUgZGF5cyBhbmQgdGhlIDEwMCUgdGllciB1c2VzIG1hdGguTWF4SW50NjQuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFN0YWtlciBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBTZXRXYXJtVXAoY3VyIHJlYWxtLCBwY3QsIHRpbWVEdXJhdGlvbiBpbnQ2NCkgewoJZ2V0SW1wbGVtZW50YXRpb24oKS5TZXRXYXJtVXAoMCwgY3VyLCBwY3QsIHRpbWVEdXJhdGlvbikKfQoKLy8gU2V0RGVwb3NpdEduc0Ftb3VudCBzZXRzIHRoZSBHTlMgZGVwb3NpdCByZXF1aXJlZCBmb3IgZWFjaCBleHRlcm5hbCBpbmNlbnRpdmUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbS4KLy8gICAtIGFtb3VudDogR05TIGFtb3VudCByZXF1aXJlZCBhcyB0aGUgcGVyLWluY2VudGl2ZSBkZXBvc2l0LgovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBTdGFrZXIgaGFsdCBzY29wZSBpcyBhY3RpdmUuCmZ1bmMgU2V0RGVwb3NpdEduc0Ftb3VudChjdXIgcmVhbG0sIGFtb3VudCBpbnQ2NCkgewoJZ2V0SW1wbGVtZW50YXRpb24oKS5TZXREZXBvc2l0R25zQW1vdW50KDAsIGN1ciwgYW1vdW50KQp9CgovLyBTZXRNaW5pbXVtUmV3YXJkQW1vdW50IHNldHMgdGhlIGRlZmF1bHQgbWluaW11bSByZXdhcmQgYW1vdW50IHJlcXVpcmVkIHRvIGNyZWF0ZSBhbiBleHRlcm5hbAovLyBpbmNlbnRpdmUuIEEgdG9rZW4tc3BlY2lmaWMgb3ZlcnJpZGUgbWF5IGFwcGx5LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBhbW91bnQ6IERlZmF1bHQgbWluaW11bSByZXdhcmQgYW1vdW50LCBtZWFzdXJlZCBpbiB0aGUgcmV3YXJkIHRva2VuJ3MgdW5pdHMuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFN0YWtlciBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBTZXRNaW5pbXVtUmV3YXJkQW1vdW50KGN1ciByZWFsbSwgYW1vdW50IGludDY0KSB7CglnZXRJbXBsZW1lbnRhdGlvbigpLlNldE1pbmltdW1SZXdhcmRBbW91bnQoMCwgY3VyLCBhbW91bnQpCn0KCi8vIFNldFRva2VuTWluaW11bVJld2FyZEFtb3VudCBzZXRzIG1pbmltdW0gcmV3YXJkIGFtb3VudHMgcGVyIHRva2VuLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBwYXJhbXNTdHI6IENvbG9uLWRlbGltaXRlZCB0b2tlbiBwYXRoIGFuZCBtaW5pbXVtIGFtb3VudCAoYHRva2VuUGF0aDphbW91bnRgKTsgYW1vdW50IHplcm8gcmVtb3ZlcyB0aGUgb3ZlcnJpZGUuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFN0YWtlciBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBTZXRUb2tlbk1pbmltdW1SZXdhcmRBbW91bnQoY3VyIHJlYWxtLCBwYXJhbXNTdHIgc3RyaW5nKSB7CglnZXRJbXBsZW1lbnRhdGlvbigpLlNldFRva2VuTWluaW11bVJld2FyZEFtb3VudCgwLCBjdXIsIHBhcmFtc1N0cikKfQoKLy8gU2V0VW5TdGFraW5nRmVlIHNldHMgdGhlIHVuc3Rha2luZyBmZWUgcmF0ZSBpbiBiYXNpcyBwb2ludHMgKDAtMSwwMDA7IDEwMCA9IDElKS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gZmVlOiBVbnN0YWtpbmcgZmVlIHJhdGUgaW4gYmFzaXMgcG9pbnRzLCBmcm9tIDAgdGhyb3VnaCAxLDAwMCBpbmNsdXNpdmUuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFN0YWtlciBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBTZXRVblN0YWtpbmdGZWUoY3VyIHJlYWxtLCBmZWUgdWludDY0KSB7CglnZXRJbXBsZW1lbnRhdGlvbigpLlNldFVuU3Rha2luZ0ZlZSgwLCBjdXIsIGZlZSkKfQoarAEKCnJlbmRlci5nbm8SnQFwYWNrYWdlIHN0YWtlcgoKLy8gUmVuZGVyIGRlbGVnYXRlcyB3ZWIgcmVuZGVyaW5nIHRvIHRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24uCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuUmVuZGVyKHBhdGgpCn0KGqQMCglzdGF0ZS5nbm8SlgxwYWNrYWdlIHN0YWtlcgoKaW1wb3J0ICgKCSJlcnJvcnMiCgoJcHJiYWMgImduby5sYW5kL3AvZ25vc3dhcC9yYmFjL3YxIgoJXyAiZ25vLmxhbmQvci9nbm9zd2FwL3JiYWMvdjEiIC8vIGluaXRpYWxpemUgcmVhZGFibGUgY29udHJhY3Qgcm9sZShzKQoKCSJnbm8ubGFuZC9wL2dub3N3YXAvc3RvcmUvdjEiCgkiZ25vLmxhbmQvcC9nbm9zd2FwL3ZlcnNpb25fbWFuYWdlci92MSIKCgkiZ25vLmxhbmQvci9nbm9zd2FwL2FjY2Vzcy92MSIKKQoKY29uc3QgRXJyU3Bvb2ZlZFJlYWxtID0gInJsbSBkb2VzIG5vdCBtYXRjaCB0aGUgY3VycmVudCBjcm9zc2luZyBmcmFtZSIKCnZhciAoCglrdlN0b3JlIHN0b3JlLktWU3RvcmUKCgl2ZXJzaW9uTWFuYWdlciB2ZXJzaW9uX21hbmFnZXIuVmVyc2lvbk1hbmFnZXIKCWltcGxlbWVudGF0aW9uIElTdGFrZXIKKQoKZnVuYyBpbml0KGN1ciByZWFsbSkgewoJLy8gQ3JlYXRlIGEgbmV3IEtWIHN0b3JlIGluc3RhbmNlIGZvciB0aGlzIGRvbWFpbgoJa3ZTdG9yZSA9IHN0b3JlLk5ld0tWU3RvcmUoY3VyLkFkZHJlc3MoKSkKCWluaXRSZWdpc3RlcldyaXRhYmxlQ29udHJhY3QoY3VyKQoKCS8vIEluaXRpYWxpemUgdGhlIGluaXRpYWxpemVycyBtYXAgdG8gc3RvcmUgaW1wbGVtZW50YXRpb24gcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucwoJdmVyc2lvbk1hbmFnZXIgPSB2ZXJzaW9uX21hbmFnZXIuTmV3VmVyc2lvbk1hbmFnZXIoCgkJY3VyLlBrZ1BhdGgoKSwKCQlrdlN0b3JlLAoJCWluaXRpYWxpemVEb21haW5TdG9yZSwKCSkKCglpbXBsZW1lbnRhdGlvbiA9IG5pbAp9CgpmdW5jIGluaXRSZWdpc3RlcldyaXRhYmxlQ29udHJhY3QoY3VyIHJlYWxtKSB7Cglwb29sQWRkciA6PSBhY2Nlc3MuTXVzdEdldEFkZHJlc3MocHJiYWMuUk9MRV9QT09MLlN0cmluZygpKQoKCWlmIGVyciA6PSBrdlN0b3JlLkFkZEF1dGhvcml6ZWRDYWxsZXIoMCwgY3VyLCBwb29sQWRkciwgc3RvcmUuV3JpdGUpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cn0KCmZ1bmMgaW5pdGlhbGl6ZURvbWFpblN0b3JlKF8gaW50LCBybG0gcmVhbG0sIGt2U3RvcmUgc3RvcmUuS1ZTdG9yZSkgYW55IHsKCXJldHVybiBOZXdTdGFrZXJTdG9yZShrdlN0b3JlKQp9CgpmdW5jIGdldEltcGxlbWVudGF0aW9uKCkgSVN0YWtlciB7CglpZiBpbXBsZW1lbnRhdGlvbiA9PSBuaWwgewoJCXBhbmljKCJpbXBsZW1lbnRhdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQiKQoJfQoKCXJldHVybiBpbXBsZW1lbnRhdGlvbgp9CgpmdW5jIHVwZGF0ZUltcGxlbWVudGF0aW9uKCkgZXJyb3IgewoJcmVzdWx0IDo9IHZlcnNpb25NYW5hZ2VyLkdldEN1cnJlbnRJbXBsZW1lbnRhdGlvbigpCglpZiByZXN1bHQgPT0gbmlsIHsKCQlyZXR1cm4gZXJyb3JzLk5ldygiaW1wbGVtZW50YXRpb24gaXMgbm90IGluaXRpYWxpemVkIikKCX0KCglpbXBsLCBvayA6PSByZXN1bHQuKElTdGFrZXIpCglpZiAhb2sgewoJCXJldHVybiBlcnJvcnMuTmV3KCJpbXBsIGlzIG5vdCBhbiBJU3Rha2VyIikKCX0KCglpbXBsZW1lbnRhdGlvbiA9IGltcGwKCglyZXR1cm4gbmlsCn0KGrToAgoJc3RvcmUuZ25vEqXoAnBhY2thZ2Ugc3Rha2VyCgppbXBvcnQgKAoJImVycm9ycyIKCgkiZ25vLmxhbmQvcC9nbm9zd2FwL3N0b3JlL3YxIgoJYnB0cmVlICJnbm8ubGFuZC9wL250L2JwdHJlZS92MCIKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKdHlwZSBTdG9yZUtleSBzdHJpbmcKCi8vIFN0b3JlS2V5LlN0cmluZyByZXR1cm5zIHRoZSB0ZXh0dWFsIGtleSB1c2VkIGJ5IHRoZSBLViBzdG9yZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogVW5kZXJseWluZyBzdG9yYWdlLWtleSB0ZXh0LgpmdW5jIChzIFN0b3JlS2V5KSBTdHJpbmcoKSBzdHJpbmcgewoJcmV0dXJuIHN0cmluZyhzKQp9Cgpjb25zdCAoCglTdG9yZUtleURlcG9zaXRHbnNBbW91bnQgICAgICAgICAgICAgICAgIFN0b3JlS2V5ID0gImRlcG9zaXRHbnNBbW91bnQiCglTdG9yZUtleU1pbmltdW1SZXdhcmRBbW91bnQgICAgICAgICAgICAgIFN0b3JlS2V5ID0gIm1pbmltdW1SZXdhcmRBbW91bnQiCglTdG9yZUtleURlcG9zaXRzICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlS2V5ID0gImRlcG9zaXRzIgoJU3RvcmVLZXlFeHRlcm5hbEluY2VudGl2ZXMgICAgICAgICAgICAgICBTdG9yZUtleSA9ICJleHRlcm5hbEluY2VudGl2ZXMiCglTdG9yZUtleVRvdGFsRW1pc3Npb25TZW50ICAgICAgICAgICAgICAgIFN0b3JlS2V5ID0gInRvdGFsRW1pc3Npb25TZW50IgoJU3RvcmVLZXlBbGxvd2VkVG9rZW5zICAgICAgICAgICAgICAgICAgICBTdG9yZUtleSA9ICJhbGxvd2VkVG9rZW5zIgoJU3RvcmVLZXlEZW5pZWRSZXdhcmRUb2tlbnMgICAgICAgICAgICAgICBTdG9yZUtleSA9ICJkZW5pZWRSZXdhcmRUb2tlbnMiCglTdG9yZUtleUluY2VudGl2ZUNvdW50ZXIgICAgICAgICAgICAgICAgIFN0b3JlS2V5ID0gImluY2VudGl2ZUNvdW50ZXIiCglTdG9yZUtleVRva2VuU3BlY2lmaWNNaW5pbXVtUmV3YXJkcyAgICAgIFN0b3JlS2V5ID0gInRva2VuU3BlY2lmaWNNaW5pbXVtUmV3YXJkcyIKCVN0b3JlS2V5VW5zdGFraW5nRmVlICAgICAgICAgICAgICAgICAgICAgU3RvcmVLZXkgPSAidW5zdGFraW5nRmVlIgoJU3RvcmVLZXlQZW5kaW5nUHJvdG9jb2xGZWVzICAgICAgICAgICAgICBTdG9yZUtleSA9ICJwZW5kaW5nUHJvdG9jb2xGZWVzIgoJU3RvcmVLZXlVbnN0YWtlZFBvc2l0aW9ucyAgICAgICAgICAgICAgICBTdG9yZUtleSA9ICJ1bnN0YWtlZFBvc2l0aW9ucyIKCVN0b3JlS2V5VW5jb2xsZWN0ZWRJbmNlbnRpdmVDb3VudHMgICAgICAgU3RvcmVLZXkgPSAidW5jb2xsZWN0ZWRJbmNlbnRpdmVDb3VudHMiCglTdG9yZUtleVBvb2xzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlS2V5ID0gInBvb2xzIgoJU3RvcmVLZXlQb29sVGllck1lbWJlcnNoaXBzICAgICAgICAgICAgICBTdG9yZUtleSA9ICJwb29sVGllck1lbWJlcnNoaXBzIgoJU3RvcmVLZXlQb29sVGllclJhdGlvICAgICAgICAgICAgICAgICAgICBTdG9yZUtleSA9ICJwb29sVGllclJhdGlvIgoJU3RvcmVLZXlQb29sVGllckNvdW50cyAgICAgICAgICAgICAgICAgICBTdG9yZUtleSA9ICJwb29sVGllckNvdW50cyIKCVN0b3JlS2V5UG9vbFRpZXJMYXN0UmV3YXJkQ2FjaGVUaW1lc3RhbXAgU3RvcmVLZXkgPSAicG9vbFRpZXJMYXN0UmV3YXJkQ2FjaGVUaW1lc3RhbXAiCglTdG9yZUtleVBvb2xUaWVyQ3VycmVudEVtaXNzaW9uICAgICAgICAgIFN0b3JlS2V5ID0gInBvb2xUaWVyQ3VycmVudEVtaXNzaW9uIgoJU3RvcmVLZXlQb29sVGllckdldEVtaXNzaW9uICAgICAgICAgICAgICBTdG9yZUtleSA9ICJwb29sVGllckdldEVtaXNzaW9uIgoJU3RvcmVLZXlQb29sVGllckdldEhhbHZpbmdCbG9ja3NJblJhbmdlICBTdG9yZUtleSA9ICJwb29sVGllckdldEhhbHZpbmdCbG9ja3NJblJhbmdlIgoJU3RvcmVLZXlXYXJtdXBUZW1wbGF0ZSAgICAgICAgICAgICAgICAgICBTdG9yZUtleSA9ICJ3YXJtdXBUZW1wbGF0ZSIKCVN0b3JlS2V5Q3VycmVudFN3YXBCYXRjaCAgICAgICAgICAgICAgICAgU3RvcmVLZXkgPSAiY3VycmVudFN3YXBCYXRjaCIKKQoKdHlwZSBzdGFrZXJTdG9yZSBzdHJ1Y3QgewoJa3ZTdG9yZSBzdG9yZS5LVlN0b3JlCn0KCi8vIERlcG9zaXRHbnNBbW91bnQKLy8gSGFzRGVwb3NpdEduc0Ftb3VudFN0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgR05TIHJlc2VydmUgYW1vdW50IGtleSBleGlzdHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiBUcnVlIHdoZW4gYSBkZXBvc2l0IEdOUyBhbW91bnQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgaW4gc3RvcmFnZS4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIEhhc0RlcG9zaXRHbnNBbW91bnRTdG9yZUtleSgpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlEZXBvc2l0R25zQW1vdW50LlN0cmluZygpKQp9CgovLyBHZXREZXBvc2l0R25zQW1vdW50IHJldHJpZXZlcyB0aGUgR05TIHJlc2VydmUgYW1vdW50IGRlcG9zaXRlZCBmb3IgdGhlIHN0YWtlci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBTdG9yZWQgR05TIHJlc2VydmUgYW1vdW50OyBwYW5pY3Mgb24gcmVhZCBvciB0eXBlIGZhaWx1cmUuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBHZXREZXBvc2l0R25zQW1vdW50KCkgaW50NjQgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleURlcG9zaXRHbnNBbW91bnQuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJYW1vdW50LCBvayA6PSByZXN1bHQuKGludDY0KQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byBpbnQ2NDogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiBhbW91bnQKfQoKLy8gU2V0RGVwb3NpdEduc0Ftb3VudCBzdG9yZXMgdGhlIEdOUyBhbW91bnQgZGVwb3NpdGVkIGFzIHRoZSBzdGFrZXIgcmVzZXJ2ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IExlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yIGZvciB0aGUgZm9yd2FyZGVkIHN0b3JlIGNhbGw7IGNhbGxlcnMgcGFzcyAwLgovLyAgIC0gcmxtOiBDdXJyZW50IHN0YWtlciByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgYmVmb3JlIHN0b3JhZ2UgaXMgd3JpdHRlbi4KLy8gICAtIGFtb3VudDogR05TIHJlc2VydmUgYW1vdW50IHVzZWQgZm9yIHN0YWtlciBpbml0aWFsaXphdGlvbiBhbmQgYWNjb3VudGluZy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBFcnJTcG9vZmVkUmVhbG0gd2hlbiBybG0gaXMgbm90IGN1cnJlbnQsIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yOyBuaWwgb24gc3VjY2Vzcy4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIFNldERlcG9zaXRHbnNBbW91bnQoXyBpbnQsIHJsbSByZWFsbSwgYW1vdW50IGludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleURlcG9zaXRHbnNBbW91bnQuU3RyaW5nKCksIGFtb3VudCkKfQoKLy8gTWluaW11bVJld2FyZEFtb3VudAovLyBIYXNNaW5pbXVtUmV3YXJkQW1vdW50U3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBkZWZhdWx0IG1pbmltdW0tcmV3YXJkIGtleSBleGlzdHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiBUcnVlIHdoZW4gdGhlIGRlZmF1bHQgbWluaW11bSByZXdhcmQgYW1vdW50IGhhcyBiZWVuIGluaXRpYWxpemVkIGluIHN0b3JhZ2UuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBIYXNNaW5pbXVtUmV3YXJkQW1vdW50U3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5TWluaW11bVJld2FyZEFtb3VudC5TdHJpbmcoKSkKfQoKLy8gR2V0TWluaW11bVJld2FyZEFtb3VudCByZXRyaWV2ZXMgdGhlIGRlZmF1bHQgbWluaW11bSBleHRlcm5hbCByZXdhcmQgYW1vdW50LgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IFN0b3JlZCBkZWZhdWx0IG1pbmltdW0gcmV3YXJkIGFtb3VudDsgcGFuaWNzIG9uIHJlYWQgb3IgdHlwZSBmYWlsdXJlLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgR2V0TWluaW11bVJld2FyZEFtb3VudCgpIGludDY0IHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlNaW5pbXVtUmV3YXJkQW1vdW50LlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCWFtb3VudCwgb2sgOj0gcmVzdWx0LihpbnQ2NCkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gaW50NjQ6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gYW1vdW50Cn0KCi8vIFNldE1pbmltdW1SZXdhcmRBbW91bnQgc3RvcmVzIHRoZSBkZWZhdWx0IG1pbmltdW0gZXh0ZXJuYWwgcmV3YXJkIGFtb3VudC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IExlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yIGZvciB0aGUgZm9yd2FyZGVkIHN0b3JlIGNhbGw7IGNhbGxlcnMgcGFzcyAwLgovLyAgIC0gcmxtOiBDdXJyZW50IHN0YWtlciByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgYmVmb3JlIHN0b3JhZ2UgaXMgd3JpdHRlbi4KLy8gICAtIGFtb3VudDogRGVmYXVsdCBtaW5pbXVtIHJld2FyZCBhbW91bnQgYXBwbGllZCB3aGVuIG5vIHRva2VuLXNwZWNpZmljIG92ZXJyaWRlIGV4aXN0cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBFcnJTcG9vZmVkUmVhbG0gd2hlbiBybG0gaXMgbm90IGN1cnJlbnQsIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yOyBuaWwgb24gc3VjY2Vzcy4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIFNldE1pbmltdW1SZXdhcmRBbW91bnQoXyBpbnQsIHJsbSByZWFsbSwgYW1vdW50IGludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleU1pbmltdW1SZXdhcmRBbW91bnQuU3RyaW5nKCksIGFtb3VudCkKfQoKLy8gRGVwb3NpdHMKLy8gSGFzRGVwb3NpdHNTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIGFjdGl2ZS1kZXBvc2l0cyBrZXkgZXhpc3RzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogVHJ1ZSB3aGVuIGFjdGl2ZSBkZXBvc2l0cyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgaW4gc3RvcmFnZS4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIEhhc0RlcG9zaXRzU3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5RGVwb3NpdHMuU3RyaW5nKCkpCn0KCi8vIEdldERlcG9zaXRzIHJldHJpZXZlcyB0aGUgYWN0aXZlIGRlcG9zaXQgdHJlZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpicHRyZWUuQlBUcmVlOiBTdG9yZWQgcG9zaXRpb24tdG8tZGVwb3NpdCByZWNvcmRzOyBwYW5pY3Mgb24gcmVhZCBvciB0eXBlIGZhaWx1cmUuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBHZXREZXBvc2l0cygpICpicHRyZWUuQlBUcmVlIHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlEZXBvc2l0cy5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglkZXBvc2l0cywgb2sgOj0gcmVzdWx0LigqYnB0cmVlLkJQVHJlZSkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gKmJwdHJlZS5CUFRyZWU6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gZGVwb3NpdHMKfQoKLy8gU2V0RGVwb3NpdHMgc3RvcmVzIHRoZSBkZXBvc2l0IHRyZWUga2V5ZWQgYnkgcG9zaXRpb24gaWRlbnRpZmllci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IExlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yIGZvciB0aGUgZm9yd2FyZGVkIHN0b3JlIGNhbGw7IGNhbGxlcnMgcGFzcyAwLgovLyAgIC0gcmxtOiBDdXJyZW50IHN0YWtlciByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgYmVmb3JlIHN0b3JhZ2UgaXMgd3JpdHRlbi4KLy8gICAtIGRlcG9zaXRzOiBCKyB0cmVlIGNvbnRhaW5pbmcgYWN0aXZlIHN0YWtpbmcgZGVwb3NpdHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogRXJyU3Bvb2ZlZFJlYWxtIHdoZW4gcmxtIGlzIG5vdCBjdXJyZW50LCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvcjsgbmlsIG9uIHN1Y2Nlc3MuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBTZXREZXBvc2l0cyhfIGludCwgcmxtIHJlYWxtLCBkZXBvc2l0cyAqYnB0cmVlLkJQVHJlZSkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlEZXBvc2l0cy5TdHJpbmcoKSwgZGVwb3NpdHMpCn0KCi8vIEV4dGVybmFsSW5jZW50aXZlcwovLyBIYXNFeHRlcm5hbEluY2VudGl2ZXNTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIGV4dGVybmFsLWluY2VudGl2ZXMga2V5IGV4aXN0cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IFRydWUgd2hlbiBleHRlcm5hbCBpbmNlbnRpdmVzIGhhdmUgYmVlbiBpbml0aWFsaXplZCBpbiBzdG9yYWdlLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgSGFzRXh0ZXJuYWxJbmNlbnRpdmVzU3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5RXh0ZXJuYWxJbmNlbnRpdmVzLlN0cmluZygpKQp9CgovLyBHZXRFeHRlcm5hbEluY2VudGl2ZXMgcmV0cmlldmVzIHRoZSBleHRlcm5hbCBpbmNlbnRpdmUgdHJlZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpicHRyZWUuQlBUcmVlOiBTdG9yZWQgZXh0ZXJuYWwgaW5jZW50aXZlIHJlY29yZHM7IHBhbmljcyBvbiByZWFkIG9yIHR5cGUgZmFpbHVyZS4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIEdldEV4dGVybmFsSW5jZW50aXZlcygpICpicHRyZWUuQlBUcmVlIHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlFeHRlcm5hbEluY2VudGl2ZXMuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJaW5jZW50aXZlcywgb2sgOj0gcmVzdWx0LigqYnB0cmVlLkJQVHJlZSkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gKmJwdHJlZS5CUFRyZWU6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gaW5jZW50aXZlcwp9CgovLyBTZXRFeHRlcm5hbEluY2VudGl2ZXMgc3RvcmVzIHRoZSBleHRlcm5hbCBpbmNlbnRpdmUgdHJlZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IExlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yIGZvciB0aGUgZm9yd2FyZGVkIHN0b3JlIGNhbGw7IGNhbGxlcnMgcGFzcyAwLgovLyAgIC0gcmxtOiBDdXJyZW50IHN0YWtlciByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgYmVmb3JlIHN0b3JhZ2UgaXMgd3JpdHRlbi4KLy8gICAtIGluY2VudGl2ZXM6IEIrIHRyZWUgbWFwcGluZyBleHRlcm5hbCBpbmNlbnRpdmUgaWRlbnRpZmllcnMgdG8gaW5jZW50aXZlIHJlY29yZHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogRXJyU3Bvb2ZlZFJlYWxtIHdoZW4gcmxtIGlzIG5vdCBjdXJyZW50LCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvcjsgbmlsIG9uIHN1Y2Nlc3MuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBTZXRFeHRlcm5hbEluY2VudGl2ZXMoXyBpbnQsIHJsbSByZWFsbSwgaW5jZW50aXZlcyAqYnB0cmVlLkJQVHJlZSkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlFeHRlcm5hbEluY2VudGl2ZXMuU3RyaW5nKCksIGluY2VudGl2ZXMpCn0KCi8vIFRvdGFsRW1pc3Npb25TZW50Ci8vIEhhc1RvdGFsRW1pc3Npb25TZW50U3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSB0b3RhbC1lbWlzc2lvbi1zZW50IGtleSBleGlzdHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiBUcnVlIHdoZW4gY3VtdWxhdGl2ZSBzZW50IGVtaXNzaW9uIGhhcyBiZWVuIGluaXRpYWxpemVkIGluIHN0b3JhZ2UuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBIYXNUb3RhbEVtaXNzaW9uU2VudFN0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleVRvdGFsRW1pc3Npb25TZW50LlN0cmluZygpKQp9CgovLyBHZXRUb3RhbEVtaXNzaW9uU2VudCByZXRyaWV2ZXMgdGhlIGN1bXVsYXRpdmUgZW1pc3Npb24gYW1vdW50IHNlbnQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogU3RvcmVkIGN1bXVsYXRpdmUgZW1pc3Npb24gYW1vdW50OyBwYW5pY3Mgb24gcmVhZCBvciB0eXBlIGZhaWx1cmUuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBHZXRUb3RhbEVtaXNzaW9uU2VudCgpIGludDY0IHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlUb3RhbEVtaXNzaW9uU2VudC5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglhbW91bnQsIG9rIDo9IHJlc3VsdC4oaW50NjQpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvIGludDY0OiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIGFtb3VudAp9CgovLyBTZXRUb3RhbEVtaXNzaW9uU2VudCBzdG9yZXMgdGhlIGN1bXVsYXRpdmUgZW1pc3Npb24gYW1vdW50IHNlbnQgdG8gc3Rha2VyIHBvb2xzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogTGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBmb3J3YXJkZWQgc3RvcmUgY2FsbDsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IEN1cnJlbnQgc3Rha2VyIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgYmUgY3VycmVudCBiZWZvcmUgc3RvcmFnZSBpcyB3cml0dGVuLgovLyAgIC0gYW1vdW50OiBDdW11bGF0aXZlIGVtaXNzaW9uIGFtb3VudCBhbHJlYWR5IHNlbnQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogRXJyU3Bvb2ZlZFJlYWxtIHdoZW4gcmxtIGlzIG5vdCBjdXJyZW50LCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvcjsgbmlsIG9uIHN1Y2Nlc3MuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBTZXRUb3RhbEVtaXNzaW9uU2VudChfIGludCwgcmxtIHJlYWxtLCBhbW91bnQgaW50NjQpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5VG90YWxFbWlzc2lvblNlbnQuU3RyaW5nKCksIGFtb3VudCkKfQoKLy8gQWxsb3dlZFRva2VucwovLyBIYXNBbGxvd2VkVG9rZW5zU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBhbGxvd2VkLXRva2VuIGtleSBleGlzdHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiBUcnVlIHdoZW4gdGhlIGFsbG93ZWQgZXh0ZXJuYWwtcmV3YXJkIHRva2VuIGxpc3QgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgaW4gc3RvcmFnZS4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIEhhc0FsbG93ZWRUb2tlbnNTdG9yZUtleSgpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlBbGxvd2VkVG9rZW5zLlN0cmluZygpKQp9CgovLyBHZXRBbGxvd2VkVG9rZW5zIHJldHJpZXZlcyBhIGNsb25lIG9mIHRoZSBhbGxvd2VkIGV4dGVybmFsLXJld2FyZCB0b2tlbiBsaXN0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gW11zdHJpbmc6IEFsbG93ZWQgdG9rZW4gcGF0aHMgY29waWVkIGZvciB0aGUgY2FsbGVyOyBwYW5pY3Mgb24gcmVhZCBvciB0eXBlIGZhaWx1cmUuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBHZXRBbGxvd2VkVG9rZW5zKCkgW11zdHJpbmcgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleUFsbG93ZWRUb2tlbnMuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJdG9rZW5zLCBvayA6PSByZXN1bHQuKFtdc3RyaW5nKQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byBbXXN0cmluZzogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiBjbG9uZVN0cmluZ1NsaWNlKHRva2VucykKfQoKLy8gU2V0QWxsb3dlZFRva2VucyByZXBsYWNlcyB0aGUgYWxsb3dlZCBleHRlcm5hbC1yZXdhcmQgdG9rZW4gbGlzdC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IExlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yIGZvciB0aGUgZm9yd2FyZGVkIHN0b3JlIGNhbGw7IGNhbGxlcnMgcGFzcyAwLgovLyAgIC0gcmxtOiBDdXJyZW50IHN0YWtlciByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgYmVmb3JlIHN0b3JhZ2UgaXMgd3JpdHRlbi4KLy8gICAtIHRva2VuczogUmVnaXN0ZXJlZCB0b2tlbiBwYXRocyBwZXJtaXR0ZWQgYXMgZXh0ZXJuYWwgcmV3YXJkIHRva2Vucy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBFcnJTcG9vZmVkUmVhbG0gd2hlbiBybG0gaXMgbm90IGN1cnJlbnQsIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yOyBuaWwgb24gc3VjY2Vzcy4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIFNldEFsbG93ZWRUb2tlbnMoXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5zIFtdc3RyaW5nKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleUFsbG93ZWRUb2tlbnMuU3RyaW5nKCksIHRva2VucykKfQoKLy8gQWRkQWxsb3dlZFRva2VuIGFwcGVuZHMgdG9rZW5QYXRoIHRvIHRoZSBhbGxvd2VkLXRva2VucyBsaXN0IHdoZW4gYWJzZW50LgovLyBUaGUgc3RvcmUtb3duZWQgc2xpY2UgaXMgY2xvbmVkIGJlZm9yZSBtdXRhdGlvbiB0byBhdm9pZCByZWFkb25seS10YWludCBwYW5pY3MuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBMZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvciBmb3IgdGhlIGZvcndhcmRlZCBzdG9yZSBjYWxsOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogQ3VycmVudCBzdGFrZXIgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGJlZm9yZSBzdG9yYWdlIGlzIHdyaXR0ZW4uCi8vICAgLSB0b2tlblBhdGg6IFJlZ2lzdGVyZWQgdG9rZW4gcGF0aCB0byBhZGQgdG8gdGhlIGFsbG93ZWQtdG9rZW4gbGlzdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBFcnJTcG9vZmVkUmVhbG0gd2hlbiBybG0gaXMgbm90IGN1cnJlbnQsIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yOyBuaWwgb24gc3VjY2Vzcy4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIEFkZEFsbG93ZWRUb2tlbihfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJdG9rZW5zIDo9IHMuR2V0QWxsb3dlZFRva2VucygpCglpZiAhY29udGFpbnModG9rZW5zLCB0b2tlblBhdGgpIHsKCQl0b2tlbnMgPSBhcHBlbmQodG9rZW5zLCB0b2tlblBhdGgpCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleUFsbG93ZWRUb2tlbnMuU3RyaW5nKCksIHRva2VucykKfQoKLy8gUmVtb3ZlQWxsb3dlZFRva2VuIHJlbW92ZXMgdG9rZW5QYXRoIGZyb20gdGhlIGFsbG93ZWQtdG9rZW5zIGxpc3Qgd2hlbiBwcmVzZW50LgovLyBUaGUgc3RvcmUtb3duZWQgc2xpY2UgaXMgY2xvbmVkIGJlZm9yZSBtdXRhdGlvbiB0byBhdm9pZCByZWFkb25seS10YWludCBwYW5pY3MuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBMZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvciBmb3IgdGhlIGZvcndhcmRlZCBzdG9yZSBjYWxsOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogQ3VycmVudCBzdGFrZXIgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGJlZm9yZSBzdG9yYWdlIGlzIHdyaXR0ZW4uCi8vICAgLSB0b2tlblBhdGg6IFJlZ2lzdGVyZWQgdG9rZW4gcGF0aCB0byByZW1vdmUgZnJvbSB0aGUgYWxsb3dlZC10b2tlbiBsaXN0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IEVyclNwb29mZWRSZWFsbSB3aGVuIHJsbSBpcyBub3QgY3VycmVudCwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3I7IG5pbCBvbiBzdWNjZXNzLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgUmVtb3ZlQWxsb3dlZFRva2VuKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCgl0b2tlbnMgOj0gcy5HZXRBbGxvd2VkVG9rZW5zKCkKCWZvciBpLCB0IDo9IHJhbmdlIHRva2VucyB7CgkJaWYgdCA9PSB0b2tlblBhdGggewoJCQl0b2tlbnMgPSBhcHBlbmQodG9rZW5zWzppXSwgdG9rZW5zW2krMTpdLi4uKQoJCQlicmVhawoJCX0KCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5QWxsb3dlZFRva2Vucy5TdHJpbmcoKSwgdG9rZW5zKQp9CgovLyBEZW5pZWRSZXdhcmRUb2tlbnMKLy8KLy8gVGhlIGRlbnkgbGlzdCBpcyB0aGUgb3BlcmF0aW9uYWwgc3RvcCBzd2l0Y2ggZm9yIHRoZSBwb29sLXBhaXIgcmV3YXJkLXRva2VuCi8vIHBvbGljeTogcGFpciB0b2tlbnMgcXVhbGlmeSBhcyBleHRlcm5hbC1pbmNlbnRpdmUgcmV3YXJkIHRva2VucyB3aXRob3V0IGdvaW5nCi8vIHRocm91Z2ggdGhlIGdvdmVybmFuY2UgYWxsb3dsaXN0IChieSBkZXNpZ24pLCBzbyB3aXRob3V0IHRoaXMgbGlzdCB0aGVyZSBpcwovLyBubyBsZXZlciB0byBzdG9wIE5FVyBpbmNlbnRpdmVzIGluIGEgcGFpciB0b2tlbiB3aG9zZSBpc3N1ZXIgdHVybmVkIGhvc3RpbGUuCi8vIEEgbWlzc2luZyBzdG9yZSBrZXkgbWVhbnMgYW4gZW1wdHkgbGlzdCwgc28gbm8gaW5pdGlhbGl6ZXIgc2VlZGluZyBhbmQgbm8KLy8gdXBncmFkZSBtaWdyYXRpb24gYXJlIG5lZWRlZC4KLy8gSGFzRGVuaWVkUmV3YXJkVG9rZW5zU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBkZW5pZWQtcmV3YXJkLXRva2VuIGtleSBleGlzdHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiBUcnVlIHdoZW4gYSBkZW5pZWQtcmV3YXJkIGxpc3QgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgaW4gc3RvcmFnZS4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIEhhc0RlbmllZFJld2FyZFRva2Vuc1N0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleURlbmllZFJld2FyZFRva2Vucy5TdHJpbmcoKSkKfQoKLy8gR2V0RGVuaWVkUmV3YXJkVG9rZW5zIHJldHJpZXZlcyB0aGUgZGVuaWVkLXJld2FyZCBsaXN0LCB0cmVhdGluZyBhIG1pc3Npbmcga2V5IGFzIGVtcHR5LgovLwovLyBSZXR1cm5zOgovLyAgIC0gW11zdHJpbmc6IENsb25lIG9mIGRlbmllZCByZXdhcmQtdG9rZW4gcGF0aHM7IGVtcHR5IHdoZW4gdGhlIGtleSBpcyBhYnNlbnQsIGFuZCBwYW5pY3Mgb24gcmVhZCBvciB0eXBlIGZhaWx1cmUuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBHZXREZW5pZWRSZXdhcmRUb2tlbnMoKSBbXXN0cmluZyB7CglpZiAhcy5rdlN0b3JlLkhhcyhTdG9yZUtleURlbmllZFJld2FyZFRva2Vucy5TdHJpbmcoKSkgewoJCXJldHVybiBbXXN0cmluZ3t9Cgl9CgoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleURlbmllZFJld2FyZFRva2Vucy5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgl0b2tlbnMsIG9rIDo9IHJlc3VsdC4oW11zdHJpbmcpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvIFtdc3RyaW5nOiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIGNsb25lU3RyaW5nU2xpY2UodG9rZW5zKQp9CgovLyBBZGREZW5pZWRSZXdhcmRUb2tlbiBhcHBlbmRzIHRva2VuUGF0aCB0byB0aGUgZGVuaWVkLXJld2FyZC10b2tlbnMgbGlzdCB3aGVuIGFic2VudC4KLy8gVGhlIHN0b3JlLW93bmVkIHNsaWNlIGlzIGNsb25lZCBiZWZvcmUgbXV0YXRpb24gdG8gYXZvaWQgcmVhZG9ubHktdGFpbnQgcGFuaWNzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogTGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBmb3J3YXJkZWQgc3RvcmUgY2FsbDsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IEN1cnJlbnQgc3Rha2VyIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgYmUgY3VycmVudCBiZWZvcmUgc3RvcmFnZSBpcyB3cml0dGVuLgovLyAgIC0gdG9rZW5QYXRoOiBSZXdhcmQtdG9rZW4gcGF0aCB0byBibG9jayBmb3IgbmV3IGV4dGVybmFsIGluY2VudGl2ZXMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogRXJyU3Bvb2ZlZFJlYWxtIHdoZW4gcmxtIGlzIG5vdCBjdXJyZW50LCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvcjsgbmlsIG9uIHN1Y2Nlc3MuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBBZGREZW5pZWRSZXdhcmRUb2tlbihfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJdG9rZW5zIDo9IHMuR2V0RGVuaWVkUmV3YXJkVG9rZW5zKCkKCWlmICFjb250YWlucyh0b2tlbnMsIHRva2VuUGF0aCkgewoJCXRva2VucyA9IGFwcGVuZCh0b2tlbnMsIHRva2VuUGF0aCkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5RGVuaWVkUmV3YXJkVG9rZW5zLlN0cmluZygpLCB0b2tlbnMpCn0KCi8vIFJlbW92ZURlbmllZFJld2FyZFRva2VuIHJlbW92ZXMgdG9rZW5QYXRoIGZyb20gdGhlIGRlbmllZC1yZXdhcmQtdG9rZW5zIGxpc3Qgd2hlbiBwcmVzZW50LgovLyBUaGUgc3RvcmUtb3duZWQgc2xpY2UgaXMgY2xvbmVkIGJlZm9yZSBtdXRhdGlvbiB0byBhdm9pZCByZWFkb25seS10YWludCBwYW5pY3MuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBMZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvciBmb3IgdGhlIGZvcndhcmRlZCBzdG9yZSBjYWxsOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogQ3VycmVudCBzdGFrZXIgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGJlZm9yZSBzdG9yYWdlIGlzIHdyaXR0ZW4uCi8vICAgLSB0b2tlblBhdGg6IFJld2FyZC10b2tlbiBwYXRoIHRvIHJlbW92ZSBmcm9tIHRoZSBkZW55IGxpc3QuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogRXJyU3Bvb2ZlZFJlYWxtIHdoZW4gcmxtIGlzIG5vdCBjdXJyZW50LCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvcjsgbmlsIG9uIHN1Y2Nlc3MuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBSZW1vdmVEZW5pZWRSZXdhcmRUb2tlbihfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJdG9rZW5zIDo9IHMuR2V0RGVuaWVkUmV3YXJkVG9rZW5zKCkKCWZvciBpLCB0IDo9IHJhbmdlIHRva2VucyB7CgkJaWYgdCA9PSB0b2tlblBhdGggewoJCQl0b2tlbnMgPSBhcHBlbmQodG9rZW5zWzppXSwgdG9rZW5zW2krMTpdLi4uKQoJCQlicmVhawoJCX0KCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5RGVuaWVkUmV3YXJkVG9rZW5zLlN0cmluZygpLCB0b2tlbnMpCn0KCi8vIEluY2VudGl2ZUNvdW50ZXIKLy8gSGFzSW5jZW50aXZlQ291bnRlclN0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgaW5jZW50aXZlLWNvdW50ZXIga2V5IGV4aXN0cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IFRydWUgd2hlbiBhbiBpbmNlbnRpdmUgY291bnRlciBoYXMgYmVlbiBpbml0aWFsaXplZCBpbiBzdG9yYWdlLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgSGFzSW5jZW50aXZlQ291bnRlclN0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleUluY2VudGl2ZUNvdW50ZXIuU3RyaW5nKCkpCn0KCi8vIEdldEluY2VudGl2ZUNvdW50ZXIgcmV0cmlldmVzIHRoZSBwZXJzaXN0ZW50IGluY2VudGl2ZSBpZGVudGlmaWVyIGNvdW50ZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqQ291bnRlcjogU3RvcmVkIGNvdW50ZXIgc3RhdGU7IHBhbmljcyBvbiByZWFkIG9yIHR5cGUgZmFpbHVyZS4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIEdldEluY2VudGl2ZUNvdW50ZXIoKSAqQ291bnRlciB7CglyZXN1bHQsIGVyciA6PSBzLmt2U3RvcmUuR2V0KFN0b3JlS2V5SW5jZW50aXZlQ291bnRlci5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgljb3VudGVyLCBvayA6PSByZXN1bHQuKCpDb3VudGVyKQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byAqQ291bnRlcjogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiBjb3VudGVyCn0KCi8vIFNldEluY2VudGl2ZUNvdW50ZXIgc3RvcmVzIHRoZSBjb3VudGVyIHVzZWQgdG8gYWxsb2NhdGUgaW5jZW50aXZlIGlkZW50aWZpZXJzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogTGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBmb3J3YXJkZWQgc3RvcmUgY2FsbDsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IEN1cnJlbnQgc3Rha2VyIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgYmUgY3VycmVudCBiZWZvcmUgc3RvcmFnZSBpcyB3cml0dGVuLgovLyAgIC0gY291bnRlcjogQ291bnRlciBzdGF0ZSB3aG9zZSBuZXh0IHZhbHVlIGlzIHVzZWQgYnkgTmV4dEluY2VudGl2ZUlELgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IEVyclNwb29mZWRSZWFsbSB3aGVuIHJsbSBpcyBub3QgY3VycmVudCwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3I7IG5pbCBvbiBzdWNjZXNzLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgU2V0SW5jZW50aXZlQ291bnRlcihfIGludCwgcmxtIHJlYWxtLCBjb3VudGVyICpDb3VudGVyKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleUluY2VudGl2ZUNvdW50ZXIuU3RyaW5nKCksIGNvdW50ZXIpCn0KCi8vIE5leHRJbmNlbnRpdmVJRCBhZHZhbmNlcyB0aGUgc3RvcmVkIGNvdW50ZXIgYW5kIGJ1aWxkcyBhIHVuaXF1ZSBpbmNlbnRpdmUgaWRlbnRpZmllci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGNyZWF0b3I6IEFkZHJlc3MgdGhhdCBjcmVhdGVkIHRoZSBpbmNlbnRpdmUuCi8vICAgLSB0aW1lc3RhbXA6IEluY2VudGl2ZSBzdGFydCBvciBjcmVhdGlvbiB0aW1lc3RhbXAgaW5jbHVkZWQgaW4gdGhlIGlkZW50aWZpZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdHJpbmc6IElkZW50aWZpZXIgY29tYmluaW5nIGNyZWF0b3IsIHRpbWVzdGFtcCwgYW5kIHRoZSBuZXh0IGNvdW50ZXIgaW5kZXguCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBOZXh0SW5jZW50aXZlSUQoY3JlYXRvciBhZGRyZXNzLCB0aW1lc3RhbXAgaW50NjQpIHN0cmluZyB7Cgljb3VudGVyIDo9IHMuR2V0SW5jZW50aXZlQ291bnRlcigpCglyZXR1cm4gbWFrZUluY2VudGl2ZUlEKGNyZWF0b3IsIHRpbWVzdGFtcCwgY291bnRlci5OZXh0KCkpCn0KCi8vIFRva2VuU3BlY2lmaWNNaW5pbXVtUmV3YXJkcwovLyBIYXNUb2tlblNwZWNpZmljTWluaW11bVJld2FyZHNTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIHRva2VuLXNwZWNpZmljIG1pbmltdW0tcmV3YXJkcyBrZXkgZXhpc3RzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogVHJ1ZSB3aGVuIHRva2VuLXNwZWNpZmljIG1pbmltdW0gcmV3YXJkcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgaW4gc3RvcmFnZS4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIEhhc1Rva2VuU3BlY2lmaWNNaW5pbXVtUmV3YXJkc1N0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleVRva2VuU3BlY2lmaWNNaW5pbXVtUmV3YXJkcy5TdHJpbmcoKSkKfQoKLy8gR2V0VG9rZW5TcGVjaWZpY01pbmltdW1SZXdhcmRzIHJldHJpZXZlcyBwZXItdG9rZW4gbWluaW11bSByZXdhcmQgYW1vdW50cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIG1hcFtzdHJpbmddaW50NjQ6IFN0b3JlZCBtaW5pbXVtIHJld2FyZCBvdmVycmlkZXMga2V5ZWQgYnkgdG9rZW4gcGF0aDsgcGFuaWNzIG9uIHJlYWQgb3IgdHlwZSBmYWlsdXJlLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgR2V0VG9rZW5TcGVjaWZpY01pbmltdW1SZXdhcmRzKCkgbWFwW3N0cmluZ11pbnQ2NCB7CglyZXN1bHQsIGVyciA6PSBzLmt2U3RvcmUuR2V0KFN0b3JlS2V5VG9rZW5TcGVjaWZpY01pbmltdW1SZXdhcmRzLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXJld2FyZHMsIG9rIDo9IHJlc3VsdC4obWFwW3N0cmluZ11pbnQ2NCkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gbWFwW3N0cmluZ11pbnQ2NDogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiByZXdhcmRzCn0KCi8vIFNldFRva2VuU3BlY2lmaWNNaW5pbXVtUmV3YXJkcyByZXBsYWNlcyB0aGUgdG9rZW4tc3BlY2lmaWMgbWluaW11bSByZXdhcmQgbWFwLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogTGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBmb3J3YXJkZWQgc3RvcmUgY2FsbDsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IEN1cnJlbnQgc3Rha2VyIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgYmUgY3VycmVudCBiZWZvcmUgc3RvcmFnZSBpcyB3cml0dGVuLgovLyAgIC0gcmV3YXJkczogTWluaW11bSByZXdhcmQgYW1vdW50cyBrZXllZCBieSB0b2tlbiBwYXRoLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IEVyclNwb29mZWRSZWFsbSB3aGVuIHJsbSBpcyBub3QgY3VycmVudCwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3I7IG5pbCBvbiBzdWNjZXNzLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgU2V0VG9rZW5TcGVjaWZpY01pbmltdW1SZXdhcmRzKF8gaW50LCBybG0gcmVhbG0sIHJld2FyZHMgbWFwW3N0cmluZ11pbnQ2NCkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlUb2tlblNwZWNpZmljTWluaW11bVJld2FyZHMuU3RyaW5nKCksIHJld2FyZHMpCn0KCi8vIFNldFRva2VuU3BlY2lmaWNNaW5pbXVtUmV3YXJkSXRlbSBzZXRzIGEgc2luZ2xlIHRva2VuJ3MgbWluaW11bSByZXdhcmQgYW1vdW50LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogTGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBmb3J3YXJkZWQgc3RvcmUgY2FsbDsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IEN1cnJlbnQgc3Rha2VyIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgYmUgY3VycmVudCBiZWZvcmUgc3RvcmFnZSBpcyB3cml0dGVuLgovLyAgIC0gdG9rZW5QYXRoOiBUb2tlbiBwYXRoIHJlY2VpdmluZyB0aGUgbWluaW11bSByZXdhcmQgb3ZlcnJpZGUuCi8vICAgLSBhbW91bnQ6IE1pbmltdW0gcmV3YXJkIGFtb3VudCByZXF1aXJlZCBmb3IgdG9rZW5QYXRoLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IEVyclNwb29mZWRSZWFsbSB3aGVuIHJsbSBpcyBub3QgY3VycmVudCwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3I7IG5pbCBvbiBzdWNjZXNzLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgU2V0VG9rZW5TcGVjaWZpY01pbmltdW1SZXdhcmRJdGVtKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcsIGFtb3VudCBpbnQ2NCkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJld2FyZHMgOj0gcy5HZXRUb2tlblNwZWNpZmljTWluaW11bVJld2FyZHMoKQoKCW93bmVkIDo9IG1ha2UobWFwW3N0cmluZ11pbnQ2NCkKCWZvciBrLCB2IDo9IHJhbmdlIHJld2FyZHMgewoJCW93bmVkW2tdID0gdgoJfQoKCW93bmVkW3Rva2VuUGF0aF0gPSBhbW91bnQKCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5VG9rZW5TcGVjaWZpY01pbmltdW1SZXdhcmRzLlN0cmluZygpLCBvd25lZCkKfQoKLy8gUmVtb3ZlVG9rZW5TcGVjaWZpY01pbmltdW1SZXdhcmRJdGVtIHJlbW92ZXMgYSBzaW5nbGUgdG9rZW4ncyBtaW5pbXVtIHJld2FyZCBlbnRyeS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IExlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yIGZvciB0aGUgZm9yd2FyZGVkIHN0b3JlIGNhbGw7IGNhbGxlcnMgcGFzcyAwLgovLyAgIC0gcmxtOiBDdXJyZW50IHN0YWtlciByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgYmVmb3JlIHN0b3JhZ2UgaXMgd3JpdHRlbi4KLy8gICAtIHRva2VuUGF0aDogVG9rZW4gcGF0aCB3aG9zZSBvdmVycmlkZSBpcyByZW1vdmVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IEVyclNwb29mZWRSZWFsbSB3aGVuIHJsbSBpcyBub3QgY3VycmVudCwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3I7IG5pbCBvbiBzdWNjZXNzLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgUmVtb3ZlVG9rZW5TcGVjaWZpY01pbmltdW1SZXdhcmRJdGVtKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglyZXdhcmRzIDo9IHMuR2V0VG9rZW5TcGVjaWZpY01pbmltdW1SZXdhcmRzKCkKCglvd25lZCA6PSBtYWtlKG1hcFtzdHJpbmddaW50NjQpCglmb3IgaywgdiA6PSByYW5nZSByZXdhcmRzIHsKCQlpZiBrID09IHRva2VuUGF0aCB7CgkJCWNvbnRpbnVlCgkJfQoKCQlvd25lZFtrXSA9IHYKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5VG9rZW5TcGVjaWZpY01pbmltdW1SZXdhcmRzLlN0cmluZygpLCBvd25lZCkKfQoKLy8gVW5zdGFraW5nRmVlCi8vIEhhc1Vuc3Rha2luZ0ZlZVN0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgdW5zdGFraW5nLWZlZSBrZXkgZXhpc3RzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogVHJ1ZSB3aGVuIGFuIHVuc3Rha2luZyBmZWUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgaW4gc3RvcmFnZS4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIEhhc1Vuc3Rha2luZ0ZlZVN0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleVVuc3Rha2luZ0ZlZS5TdHJpbmcoKSkKfQoKLy8gR2V0VW5zdGFraW5nRmVlIHJldHJpZXZlcyB0aGUgY29uZmlndXJlZCB1bnN0YWtpbmcgZmVlIHJhdGUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB1aW50NjQ6IFN0b3JlZCB1bnN0YWtpbmcgZmVlIHJhdGUgaW4gYmFzaXMgcG9pbnRzOyBwYW5pY3Mgb24gcmVhZCBvciB0eXBlIGZhaWx1cmUuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBHZXRVbnN0YWtpbmdGZWUoKSB1aW50NjQgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleVVuc3Rha2luZ0ZlZS5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglmZWUsIG9rIDo9IHJlc3VsdC4odWludDY0KQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byB1aW50NjQ6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gZmVlCn0KCi8vIFNldFVuc3Rha2luZ0ZlZSBzdG9yZXMgdGhlIGZlZSBjaGFyZ2VkIHdoZW4gYSBwb3NpdGlvbiBpcyB1bnN0YWtlZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IExlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yIGZvciB0aGUgZm9yd2FyZGVkIHN0b3JlIGNhbGw7IGNhbGxlcnMgcGFzcyAwLgovLyAgIC0gcmxtOiBDdXJyZW50IHN0YWtlciByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgYmVmb3JlIHN0b3JhZ2UgaXMgd3JpdHRlbi4KLy8gICAtIGZlZTogVW5zdGFraW5nIGZlZSByYXRlIGluIGJhc2lzIHBvaW50cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBFcnJTcG9vZmVkUmVhbG0gd2hlbiBybG0gaXMgbm90IGN1cnJlbnQsIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yOyBuaWwgb24gc3VjY2Vzcy4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIFNldFVuc3Rha2luZ0ZlZShfIGludCwgcmxtIHJlYWxtLCBmZWUgdWludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVVuc3Rha2luZ0ZlZS5TdHJpbmcoKSwgZmVlKQp9CgovLyBIYXNQZW5kaW5nUHJvdG9jb2xGZWVzU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBwZW5kaW5nIHByb3RvY29sLWZlZXMga2V5IGV4aXN0cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IFRydWUgd2hlbiBwZW5kaW5nIHByb3RvY29sIGZlZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGluIHN0b3JhZ2UuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBIYXNQZW5kaW5nUHJvdG9jb2xGZWVzU3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5UGVuZGluZ1Byb3RvY29sRmVlcy5TdHJpbmcoKSkKfQoKLy8gR2V0UGVuZGluZ1Byb3RvY29sRmVlcyByZXRyaWV2ZXMgcGVuZGluZyBwcm90b2NvbCBmZWUgYW1vdW50cyBrZXllZCBieSB0b2tlbiBwYXRoLgovLwovLyBSZXR1cm5zOgovLyAgIC0gbWFwW3N0cmluZ11pbnQ2NDogU3RvcmVkIHRva2VuLXRvLWZlZSBtYXA7IHBhbmljcyBvbiByZWFkIG9yIHR5cGUgZmFpbHVyZS4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIEdldFBlbmRpbmdQcm90b2NvbEZlZXMoKSBtYXBbc3RyaW5nXWludDY0IHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlQZW5kaW5nUHJvdG9jb2xGZWVzLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCWZlZXMsIG9rIDo9IHJlc3VsdC4obWFwW3N0cmluZ11pbnQ2NCkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gbWFwW3N0cmluZ11pbnQ2NDogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiBmZWVzCn0KCi8vIFNldFBlbmRpbmdQcm90b2NvbEZlZXMgcmVwbGFjZXMgdGhlIHBlbmRpbmcgcHJvdG9jb2wtZmVlIG1hcCB3aXRoIGEgc3RvcmUtb3duZWQgY29weS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IExlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yIGZvciB0aGUgZm9yd2FyZGVkIHN0b3JlIGNhbGw7IGNhbGxlcnMgcGFzcyAwLgovLyAgIC0gcmxtOiBDdXJyZW50IHN0YWtlciByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgYmVmb3JlIHN0b3JhZ2UgaXMgd3JpdHRlbi4KLy8gICAtIGZlZXM6IFBlbmRpbmcgcHJvdG9jb2wgZmVlIGFtb3VudHMga2V5ZWQgYnkgdG9rZW4gcGF0aC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBFcnJTcG9vZmVkUmVhbG0gd2hlbiBybG0gaXMgbm90IGN1cnJlbnQsIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yOyBuaWwgb24gc3VjY2Vzcy4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIFNldFBlbmRpbmdQcm90b2NvbEZlZXMoXyBpbnQsIHJsbSByZWFsbSwgZmVlcyBtYXBbc3RyaW5nXWludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJLy8gVGhlIG1hcCBpcyBjb3BpZWQgaGVyZSBzbyBpdCBpcyBhbGxvY2F0ZWQgYnksIGFuZCB0aGVyZWZvcmUgbXV0YWJsZSBmcm9tLCB0aGlzIHJlYWxtLgoJb3duZWQgOj0gbWFrZShtYXBbc3RyaW5nXWludDY0LCBsZW4oZmVlcykpCglmb3IgdG9rZW5QYXRoLCBhbW91bnQgOj0gcmFuZ2UgZmVlcyB7CgkJb3duZWRbdG9rZW5QYXRoXSA9IGFtb3VudAoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlQZW5kaW5nUHJvdG9jb2xGZWVzLlN0cmluZygpLCBvd25lZCkKfQoKLy8gR2V0UGVuZGluZ1Byb3RvY29sRmVlIHJldHVybnMgb25lIHRva2VuJ3MgcGVuZGluZyBwcm90b2NvbCBmZWUgYW1vdW50LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW5QYXRoOiBUb2tlbiBwYXRoIHdob3NlIHBlbmRpbmcgZmVlIGlzIHJlYWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogU3RvcmVkIHBlbmRpbmcgZmVlIGFtb3VudCwgb3IgemVybyB3aGVuIHRva2VuUGF0aCBoYXMgbm8gbWFwIGVudHJ5LgpmdW5jIChzICpzdGFrZXJTdG9yZSkgR2V0UGVuZGluZ1Byb3RvY29sRmVlKHRva2VuUGF0aCBzdHJpbmcpIGludDY0IHsKCXJldHVybiBzLkdldFBlbmRpbmdQcm90b2NvbEZlZXMoKVt0b2tlblBhdGhdCn0KCi8vIFNldFBlbmRpbmdQcm90b2NvbEZlZSB1cGRhdGVzIG9uZSB0b2tlbidzIHBlbmRpbmcgcHJvdG9jb2wgZmVlIGluIHRoZSBzdG9yZWQgZmVlIG1hcC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IExlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yIGZvciB0aGUgZm9yd2FyZGVkIHN0b3JlIGNhbGw7IGNhbGxlcnMgcGFzcyAwLgovLyAgIC0gcmxtOiBDdXJyZW50IHN0YWtlciByZWFsbSBjb250ZXh0IGFuZCB3cml0ZS1hdXRob3JpemluZyByZWFsbS4KLy8gICAtIHRva2VuUGF0aDogVG9rZW4gcGF0aCB3aG9zZSBwZW5kaW5nIGZlZSBhbW91bnQgaXMgdXBkYXRlZC4KLy8gICAtIGFtb3VudDogUGVuZGluZyBwcm90b2NvbCBmZWUgYW1vdW50IGZvciB0b2tlblBhdGguCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogRXJyU3Bvb2ZlZFJlYWxtIG9yIHdyaXRlLXBlcm1pc3Npb24gZXJyb3Igd2hlbiB0aGUgcmVhbG0gY2Fubm90IG11dGF0ZSB0aGlzIHN0b3JlOyBuaWwgb24gc3VjY2Vzcy4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIFNldFBlbmRpbmdQcm90b2NvbEZlZShfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nLCBhbW91bnQgaW50NjQpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglpZiBybG0uSXNDb2RlKCkgJiYgIXMua3ZTdG9yZS5Jc1dyaXRlQXV0aG9yaXplZChybG0uQWRkcmVzcygpKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoc3RvcmUuRXJyV3JpdGVQZXJtaXNzaW9uRGVuaWVkKQoJfQoKCXMuR2V0UGVuZGluZ1Byb3RvY29sRmVlcygpW3Rva2VuUGF0aF0gPSBhbW91bnQKCglyZXR1cm4gbmlsCn0KCi8vIFJlbW92ZVBlbmRpbmdQcm90b2NvbEZlZSByZW1vdmVzIG9uZSB0b2tlbidzIHBlbmRpbmcgcHJvdG9jb2wgZmVlIGVudHJ5LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogTGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBmb3J3YXJkZWQgc3RvcmUgY2FsbDsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IEN1cnJlbnQgc3Rha2VyIHJlYWxtIGNvbnRleHQgYW5kIHdyaXRlLWF1dGhvcml6aW5nIHJlYWxtLgovLyAgIC0gdG9rZW5QYXRoOiBUb2tlbiBwYXRoIHdob3NlIHBlbmRpbmcgZmVlIGVudHJ5IGlzIGRlbGV0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogRXJyU3Bvb2ZlZFJlYWxtIG9yIHdyaXRlLXBlcm1pc3Npb24gZXJyb3Igd2hlbiB0aGUgcmVhbG0gY2Fubm90IG11dGF0ZSB0aGlzIHN0b3JlOyBuaWwgb24gc3VjY2Vzcy4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIFJlbW92ZVBlbmRpbmdQcm90b2NvbEZlZShfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJaWYgcmxtLklzQ29kZSgpICYmICFzLmt2U3RvcmUuSXNXcml0ZUF1dGhvcml6ZWQocmxtLkFkZHJlc3MoKSkgewoJCXJldHVybiBlcnJvcnMuTmV3KHN0b3JlLkVycldyaXRlUGVybWlzc2lvbkRlbmllZCkKCX0KCglkZWxldGUocy5HZXRQZW5kaW5nUHJvdG9jb2xGZWVzKCksIHRva2VuUGF0aCkKCglyZXR1cm4gbmlsCn0KCi8vIFVuc3Rha2VkUG9zaXRpb25zCi8vIEhhc1Vuc3Rha2VkUG9zaXRpb25zU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSB1bnN0YWtlZC1wb3NpdGlvbnMga2V5IGV4aXN0cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IFRydWUgd2hlbiB1bnN0YWtlZCBwb3NpdGlvbnMgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGluIHN0b3JhZ2UuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBIYXNVbnN0YWtlZFBvc2l0aW9uc1N0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleVVuc3Rha2VkUG9zaXRpb25zLlN0cmluZygpKQp9CgovLyBHZXRVbnN0YWtlZFBvc2l0aW9ucyByZXRyaWV2ZXMgdGhlIHVuc3Rha2VkLXBvc2l0aW9uIHRyZWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqYnB0cmVlLkJQVHJlZTogU3RvcmVkIHVuc3Rha2VkLXBvc2l0aW9uIHJlY29yZHM7IHBhbmljcyBvbiByZWFkIG9yIHR5cGUgZmFpbHVyZS4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIEdldFVuc3Rha2VkUG9zaXRpb25zKCkgKmJwdHJlZS5CUFRyZWUgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleVVuc3Rha2VkUG9zaXRpb25zLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXBvc2l0aW9ucywgb2sgOj0gcmVzdWx0LigqYnB0cmVlLkJQVHJlZSkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gKmJwdHJlZS5CUFRyZWU6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gcG9zaXRpb25zCn0KCi8vIFNldFVuc3Rha2VkUG9zaXRpb25zIHN0b3JlcyBwb3NpdGlvbnMgdGhhdCBoYXZlIGJlZW4gdW5zdGFrZWQgYnV0IHJldGFpbiByZXdhcmQgY2hlY2twb2ludHMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBMZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvciBmb3IgdGhlIGZvcndhcmRlZCBzdG9yZSBjYWxsOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogQ3VycmVudCBzdGFrZXIgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGJlZm9yZSBzdG9yYWdlIGlzIHdyaXR0ZW4uCi8vICAgLSBwb3NpdGlvbnM6IEIrIHRyZWUgb2YgdW5zdGFrZWQgcG9zaXRpb24gcmVjb3JkcyBhbmQgdGhlaXIgZXhpdCBjaGVja3BvaW50cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBFcnJTcG9vZmVkUmVhbG0gd2hlbiBybG0gaXMgbm90IGN1cnJlbnQsIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yOyBuaWwgb24gc3VjY2Vzcy4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIFNldFVuc3Rha2VkUG9zaXRpb25zKF8gaW50LCBybG0gcmVhbG0sIHBvc2l0aW9ucyAqYnB0cmVlLkJQVHJlZSkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlVbnN0YWtlZFBvc2l0aW9ucy5TdHJpbmcoKSwgcG9zaXRpb25zKQp9CgovLyBVbmNvbGxlY3RlZEluY2VudGl2ZUNvdW50cwovLyBIYXNVbmNvbGxlY3RlZEluY2VudGl2ZUNvdW50c1N0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgdW5jb2xsZWN0ZWQtY291bnRzIGtleSBleGlzdHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiBUcnVlIHdoZW4gdW5jb2xsZWN0ZWQgaW5jZW50aXZlIGNvdW50cyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgaW4gc3RvcmFnZS4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIEhhc1VuY29sbGVjdGVkSW5jZW50aXZlQ291bnRzU3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5VW5jb2xsZWN0ZWRJbmNlbnRpdmVDb3VudHMuU3RyaW5nKCkpCn0KCi8vIEdldFVuY29sbGVjdGVkSW5jZW50aXZlQ291bnRzIHJldHJpZXZlcyBvdXRzdGFuZGluZy1wb3NpdGlvbiBjb3VudHMgYnkgaW5jZW50aXZlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKmJwdHJlZS5CUFRyZWU6IFN0b3JlZCBpbmNlbnRpdmUtdG8tY291bnQgdHJlZTsgcGFuaWNzIG9uIHJlYWQgb3IgdHlwZSBmYWlsdXJlLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgR2V0VW5jb2xsZWN0ZWRJbmNlbnRpdmVDb3VudHMoKSAqYnB0cmVlLkJQVHJlZSB7CglyZXN1bHQsIGVyciA6PSBzLmt2U3RvcmUuR2V0KFN0b3JlS2V5VW5jb2xsZWN0ZWRJbmNlbnRpdmVDb3VudHMuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJY291bnRzLCBvayA6PSByZXN1bHQuKCpicHRyZWUuQlBUcmVlKQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byAqYnB0cmVlLkJQVHJlZTogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiBjb3VudHMKfQoKLy8gU2V0VW5jb2xsZWN0ZWRJbmNlbnRpdmVDb3VudHMgc3RvcmVzIGNvdW50cyBvZiB1bnN0YWtlZCBwb3NpdGlvbnMgb3dpbmcgZWFjaCBpbmNlbnRpdmUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBMZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvciBmb3IgdGhlIGZvcndhcmRlZCBzdG9yZSBjYWxsOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogQ3VycmVudCBzdGFrZXIgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGJlZm9yZSBzdG9yYWdlIGlzIHdyaXR0ZW4uCi8vICAgLSBjb3VudHM6IEIrIHRyZWUgbWFwcGluZyBpbmNlbnRpdmUgaWRlbnRpZmllcnMgdG8gb3V0c3RhbmRpbmcgcG9zaXRpb24gY291bnRzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IEVyclNwb29mZWRSZWFsbSB3aGVuIHJsbSBpcyBub3QgY3VycmVudCwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3I7IG5pbCBvbiBzdWNjZXNzLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgU2V0VW5jb2xsZWN0ZWRJbmNlbnRpdmVDb3VudHMoXyBpbnQsIHJsbSByZWFsbSwgY291bnRzICpicHRyZWUuQlBUcmVlKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVVuY29sbGVjdGVkSW5jZW50aXZlQ291bnRzLlN0cmluZygpLCBjb3VudHMpCn0KCi8vIFBvb2xzCi8vIEhhc1Bvb2xzU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBwb29scyBrZXkgZXhpc3RzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogVHJ1ZSB3aGVuIHRoZSBwb29sIGNvbGxlY3Rpb24gaGFzIGJlZW4gaW5pdGlhbGl6ZWQgaW4gc3RvcmFnZS4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIEhhc1Bvb2xzU3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5UG9vbHMuU3RyaW5nKCkpCn0KCi8vIEdldFBvb2xzIHJldHJpZXZlcyB0aGUgc3Rha2VyJ3MgcG9vbCBjb2xsZWN0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKmJwdHJlZS5CUFRyZWU6IFN0b3JlZCBwb29sIHRyZWU7IHBhbmljcyBvbiByZWFkIG9yIHR5cGUgZmFpbHVyZS4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIEdldFBvb2xzKCkgKmJwdHJlZS5CUFRyZWUgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleVBvb2xzLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXBvb2xzLCBvayA6PSByZXN1bHQuKCpicHRyZWUuQlBUcmVlKQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byAqYnB0cmVlLkJQVHJlZTogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiBwb29scwp9CgovLyBTZXRQb29scyBzdG9yZXMgdGhlIHBvb2wgY29sbGVjdGlvbiB1c2VkIGJ5IHRoZSBzdGFrZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBMZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvciBmb3IgdGhlIGZvcndhcmRlZCBzdG9yZSBjYWxsOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogQ3VycmVudCBzdGFrZXIgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGJlZm9yZSBzdG9yYWdlIGlzIHdyaXR0ZW4uCi8vICAgLSBwb29sczogUG9vbCB0cmVlIGNvbnRhaW5pbmcgcmVnaXN0ZXJlZCBwb29scyBhbmQgdGhlaXIgcmV3YXJkIHN0YXRlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IEVyclNwb29mZWRSZWFsbSB3aGVuIHJsbSBpcyBub3QgY3VycmVudCwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3I7IG5pbCBvbiBzdWNjZXNzLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgU2V0UG9vbHMoXyBpbnQsIHJsbSByZWFsbSwgcG9vbHMgKmJwdHJlZS5CUFRyZWUpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5UG9vbHMuU3RyaW5nKCksIHBvb2xzKQp9CgovLyBQb29sVGllck1lbWJlcnNoaXBzCi8vIEhhc1Bvb2xUaWVyTWVtYmVyc2hpcHNTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIHBvb2wtdGllciBtZW1iZXJzaGlwIGtleSBleGlzdHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiBUcnVlIHdoZW4gcG9vbC10aWVyIG1lbWJlcnNoaXBzIGhhdmUgYmVlbiBpbml0aWFsaXplZCBpbiBzdG9yYWdlLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgSGFzUG9vbFRpZXJNZW1iZXJzaGlwc1N0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleVBvb2xUaWVyTWVtYmVyc2hpcHMuU3RyaW5nKCkpCn0KCi8vIEdldFBvb2xUaWVyTWVtYmVyc2hpcHMgcmV0cmlldmVzIHRoZSBwb29sLXRvLXRpZXIgbWVtYmVyc2hpcCB0cmVlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKmJwdHJlZS5CUFRyZWU6IFN0b3JlZCBtYXBwaW5nIGZyb20gcG9vbCBwYXRocyB0byB0aWVyIG51bWJlcnM7IHBhbmljcyBvbiByZWFkIG9yIHR5cGUgZmFpbHVyZS4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIEdldFBvb2xUaWVyTWVtYmVyc2hpcHMoKSAqYnB0cmVlLkJQVHJlZSB7CglyZXN1bHQsIGVyciA6PSBzLmt2U3RvcmUuR2V0KFN0b3JlS2V5UG9vbFRpZXJNZW1iZXJzaGlwcy5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgltZW1iZXJzaGlwcywgb2sgOj0gcmVzdWx0LigqYnB0cmVlLkJQVHJlZSkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gKmJwdHJlZS5CUFRyZWU6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gbWVtYmVyc2hpcHMKfQoKLy8gU2V0UG9vbFRpZXJNZW1iZXJzaGlwcyBzdG9yZXMgdGhlIHBvb2wtdG8tdGllciBtZW1iZXJzaGlwIHRyZWUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBMZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvciBmb3IgdGhlIGZvcndhcmRlZCBzdG9yZSBjYWxsOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogQ3VycmVudCBzdGFrZXIgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGJlZm9yZSBzdG9yYWdlIGlzIHdyaXR0ZW4uCi8vICAgLSBtZW1iZXJzaGlwczogTWFwcGluZyBmcm9tIHBvb2wgcGF0aHMgdG8gdGhlaXIgYXNzaWduZWQgdGllciBudW1iZXJzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IEVyclNwb29mZWRSZWFsbSB3aGVuIHJsbSBpcyBub3QgY3VycmVudCwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3I7IG5pbCBvbiBzdWNjZXNzLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgU2V0UG9vbFRpZXJNZW1iZXJzaGlwcyhfIGludCwgcmxtIHJlYWxtLCBtZW1iZXJzaGlwcyAqYnB0cmVlLkJQVHJlZSkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlQb29sVGllck1lbWJlcnNoaXBzLlN0cmluZygpLCBtZW1iZXJzaGlwcykKfQoKLy8gUG9vbFRpZXJSYXRpbwovLyBIYXNQb29sVGllclJhdGlvU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBwb29sLXRpZXIgcmF0aW8ga2V5IGV4aXN0cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IFRydWUgd2hlbiBhIHBvb2wtdGllciByYXRpbyBoYXMgYmVlbiBpbml0aWFsaXplZCBpbiBzdG9yYWdlLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgSGFzUG9vbFRpZXJSYXRpb1N0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleVBvb2xUaWVyUmF0aW8uU3RyaW5nKCkpCn0KCi8vIEdldFBvb2xUaWVyUmF0aW8gcmV0cmlldmVzIHRoZSBjb25maWd1cmVkIHBvb2wtdGllciByZXdhcmQtc2hhcmUgcmF0aW8uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBUaWVyUmF0aW86IFN0b3JlZCByYXRpbyBkaXN0cmlidXRpb24gYWNyb3NzIHRpZXJzOyBwYW5pY3Mgb24gcmVhZCBvciB0eXBlIGZhaWx1cmUuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBHZXRQb29sVGllclJhdGlvKCkgVGllclJhdGlvIHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlQb29sVGllclJhdGlvLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXJhdGlvLCBvayA6PSByZXN1bHQuKFRpZXJSYXRpbykKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gVGllclJhdGlvOiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIHJhdGlvCn0KCi8vIFNldFBvb2xUaWVyUmF0aW8gc3RvcmVzIHRoZSByZXdhcmQtc2hhcmUgcmF0aW8gZm9yIGVhY2ggcG9vbCB0aWVyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogTGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBmb3J3YXJkZWQgc3RvcmUgY2FsbDsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IEN1cnJlbnQgc3Rha2VyIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgYmUgY3VycmVudCBiZWZvcmUgc3RvcmFnZSBpcyB3cml0dGVuLgovLyAgIC0gcmF0aW86IFRpZXIgcmV3YXJkLXNoYXJlIHJhdGlvIHVzZWQgdG8gZGl2aWRlIGN1cnJlbnQgZW1pc3Npb24uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogRXJyU3Bvb2ZlZFJlYWxtIHdoZW4gcmxtIGlzIG5vdCBjdXJyZW50LCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvcjsgbmlsIG9uIHN1Y2Nlc3MuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBTZXRQb29sVGllclJhdGlvKF8gaW50LCBybG0gcmVhbG0sIHJhdGlvIFRpZXJSYXRpbykgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlQb29sVGllclJhdGlvLlN0cmluZygpLCByYXRpbykKfQoKLy8gUG9vbFRpZXJDb3VudHMKLy8gSGFzUG9vbFRpZXJDb3VudHNTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIHBvb2wtdGllciBjb3VudHMga2V5IGV4aXN0cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IFRydWUgd2hlbiBwb29sIGNvdW50cyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgaW4gc3RvcmFnZS4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIEhhc1Bvb2xUaWVyQ291bnRzU3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5UG9vbFRpZXJDb3VudHMuU3RyaW5nKCkpCn0KCi8vIEdldFBvb2xUaWVyQ291bnRzIHJldHJpZXZlcyB0aGUgcG9vbCBjb3VudCBmb3IgZXZlcnkgdGllciBpbmRleC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIFtBbGxUaWVyQ291bnRddWludDY0OiBTdG9yZWQgcG9vbCBjb3VudHMgaW5kZXhlZCBieSB0aWVyOyBwYW5pY3Mgb24gcmVhZCBvciB0eXBlIGZhaWx1cmUuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBHZXRQb29sVGllckNvdW50cygpIFtBbGxUaWVyQ291bnRddWludDY0IHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlQb29sVGllckNvdW50cy5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgljb3VudHMsIG9rIDo9IHJlc3VsdC4oW0FsbFRpZXJDb3VudF11aW50NjQpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvIFtBbGxUaWVyQ291bnRddWludDY0OiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIGNvdW50cwp9CgovLyBTZXRQb29sVGllckNvdW50cyBzdG9yZXMgdGhlIG51bWJlciBvZiBwb29scyBhc3NpZ25lZCB0byBlYWNoIHRpZXIgaW5kZXguCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBMZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvciBmb3IgdGhlIGZvcndhcmRlZCBzdG9yZSBjYWxsOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogQ3VycmVudCBzdGFrZXIgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGJlZm9yZSBzdG9yYWdlIGlzIHdyaXR0ZW4uCi8vICAgLSBjb3VudHM6IFBvb2wgY291bnRzIGluZGV4ZWQgYnkgdGllciwgaW5jbHVkaW5nIHRoZSByZXNlcnZlZCB6ZXJvIHRpZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogRXJyU3Bvb2ZlZFJlYWxtIHdoZW4gcmxtIGlzIG5vdCBjdXJyZW50LCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvcjsgbmlsIG9uIHN1Y2Nlc3MuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBTZXRQb29sVGllckNvdW50cyhfIGludCwgcmxtIHJlYWxtLCBjb3VudHMgW0FsbFRpZXJDb3VudF11aW50NjQpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5UG9vbFRpZXJDb3VudHMuU3RyaW5nKCksIGNvdW50cykKfQoKLy8gUG9vbFRpZXJMYXN0UmV3YXJkQ2FjaGVUaW1lc3RhbXAKLy8gSGFzUG9vbFRpZXJMYXN0UmV3YXJkQ2FjaGVUaW1lc3RhbXBTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIHRpZXIgcmV3YXJkLWNhY2hlIHRpbWVzdGFtcCBrZXkgZXhpc3RzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogVHJ1ZSB3aGVuIGEgdGllciByZXdhcmQtY2FjaGUgdGltZXN0YW1wIGhhcyBiZWVuIGluaXRpYWxpemVkIGluIHN0b3JhZ2UuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBIYXNQb29sVGllckxhc3RSZXdhcmRDYWNoZVRpbWVzdGFtcFN0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleVBvb2xUaWVyTGFzdFJld2FyZENhY2hlVGltZXN0YW1wLlN0cmluZygpKQp9CgovLyBHZXRQb29sVGllckxhc3RSZXdhcmRDYWNoZVRpbWVzdGFtcCByZXRyaWV2ZXMgdGhlIHRpZXIgcmV3YXJkLWNhY2hlIHRpbWVzdGFtcC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBTdG9yZWQgVW5peCB0aW1lc3RhbXAgdGhyb3VnaCB3aGljaCB0aWVyIHJld2FyZHMgYXJlIG1hdGVyaWFsaXplZDsgcGFuaWNzIG9uIHJlYWQgb3IgdHlwZSBmYWlsdXJlLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgR2V0UG9vbFRpZXJMYXN0UmV3YXJkQ2FjaGVUaW1lc3RhbXAoKSBpbnQ2NCB7CglyZXN1bHQsIGVyciA6PSBzLmt2U3RvcmUuR2V0KFN0b3JlS2V5UG9vbFRpZXJMYXN0UmV3YXJkQ2FjaGVUaW1lc3RhbXAuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJdGltZXN0YW1wLCBvayA6PSByZXN1bHQuKGludDY0KQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byBpbnQ2NDogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiB0aW1lc3RhbXAKfQoKLy8gU2V0UG9vbFRpZXJMYXN0UmV3YXJkQ2FjaGVUaW1lc3RhbXAgc3RvcmVzIHRoZSB0aW1lc3RhbXAgdGhyb3VnaCB3aGljaCB0aWVyIHJld2FyZHMgYXJlIGNhY2hlZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IExlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yIGZvciB0aGUgZm9yd2FyZGVkIHN0b3JlIGNhbGw7IGNhbGxlcnMgcGFzcyAwLgovLyAgIC0gcmxtOiBDdXJyZW50IHN0YWtlciByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgYmVmb3JlIHN0b3JhZ2UgaXMgd3JpdHRlbi4KLy8gICAtIHRpbWVzdGFtcDogVW5peCB0aW1lc3RhbXAgdGhyb3VnaCB3aGljaCBwb29sLXRpZXIgcmV3YXJkIGNhY2hlcyBhcmUgbWF0ZXJpYWxpemVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IEVyclNwb29mZWRSZWFsbSB3aGVuIHJsbSBpcyBub3QgY3VycmVudCwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3I7IG5pbCBvbiBzdWNjZXNzLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgU2V0UG9vbFRpZXJMYXN0UmV3YXJkQ2FjaGVUaW1lc3RhbXAoXyBpbnQsIHJsbSByZWFsbSwgdGltZXN0YW1wIGludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVBvb2xUaWVyTGFzdFJld2FyZENhY2hlVGltZXN0YW1wLlN0cmluZygpLCB0aW1lc3RhbXApCn0KCi8vIFBvb2xUaWVyQ3VycmVudEVtaXNzaW9uCi8vIEhhc1Bvb2xUaWVyQ3VycmVudEVtaXNzaW9uU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBjdXJyZW50IHBvb2wtdGllciBlbWlzc2lvbiBrZXkgZXhpc3RzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogVHJ1ZSB3aGVuIHRoZSBjdXJyZW50IHBvb2wtdGllciBlbWlzc2lvbiBoYXMgYmVlbiBpbml0aWFsaXplZCBpbiBzdG9yYWdlLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgSGFzUG9vbFRpZXJDdXJyZW50RW1pc3Npb25TdG9yZUtleSgpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlQb29sVGllckN1cnJlbnRFbWlzc2lvbi5TdHJpbmcoKSkKfQoKLy8gR2V0UG9vbFRpZXJDdXJyZW50RW1pc3Npb24gcmV0cmlldmVzIHRoZSBjdXJyZW50IHBvb2wtdGllciBlbWlzc2lvbiBhbW91bnQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogU3RvcmVkIGVtaXNzaW9uIGFtb3VudCB1c2VkIGZvciB0aWVyIHJld2FyZCBhY2NydWFsOyBwYW5pY3Mgb24gcmVhZCBvciB0eXBlIGZhaWx1cmUuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBHZXRQb29sVGllckN1cnJlbnRFbWlzc2lvbigpIGludDY0IHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlQb29sVGllckN1cnJlbnRFbWlzc2lvbi5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgllbWlzc2lvbiwgb2sgOj0gcmVzdWx0LihpbnQ2NCkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gaW50NjQ6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gZW1pc3Npb24KfQoKLy8gU2V0UG9vbFRpZXJDdXJyZW50RW1pc3Npb24gc3RvcmVzIHRoZSBjdXJyZW50IHBvb2wtdGllciBlbWlzc2lvbiBhbW91bnQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBMZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvciBmb3IgdGhlIGZvcndhcmRlZCBzdG9yZSBjYWxsOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogQ3VycmVudCBzdGFrZXIgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGJlZm9yZSBzdG9yYWdlIGlzIHdyaXR0ZW4uCi8vICAgLSBlbWlzc2lvbjogQ3VycmVudCBlbWlzc2lvbiBhbW91bnQgdXNlZCBmb3IgdGllciByZXdhcmQgYWNjcnVhbC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBFcnJTcG9vZmVkUmVhbG0gd2hlbiBybG0gaXMgbm90IGN1cnJlbnQsIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yOyBuaWwgb24gc3VjY2Vzcy4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIFNldFBvb2xUaWVyQ3VycmVudEVtaXNzaW9uKF8gaW50LCBybG0gcmVhbG0sIGVtaXNzaW9uIGludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVBvb2xUaWVyQ3VycmVudEVtaXNzaW9uLlN0cmluZygpLCBlbWlzc2lvbikKfQoKLy8gUG9vbFRpZXJHZXRFbWlzc2lvbgovLyBIYXNQb29sVGllckdldEVtaXNzaW9uU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBwb29sLXRpZXIgZW1pc3Npb24gY2FsbGJhY2sga2V5IGV4aXN0cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IFRydWUgd2hlbiB0aGUgY3VycmVudC1lbWlzc2lvbiBjYWxsYmFjayBoYXMgYmVlbiBpbml0aWFsaXplZCBpbiBzdG9yYWdlLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgSGFzUG9vbFRpZXJHZXRFbWlzc2lvblN0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleVBvb2xUaWVyR2V0RW1pc3Npb24uU3RyaW5nKCkpCn0KCi8vIEdldFBvb2xUaWVyR2V0RW1pc3Npb24gcmV0cmlldmVzIHRoZSBjdXJyZW50LWVtaXNzaW9uIGNhbGxiYWNrLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZnVuYygpIChpbnQ2NCwgZXJyb3IpOiBDYWxsYmFjayByZXR1cm5pbmcgdGhlIGN1cnJlbnQgZW1pc3Npb24gYW1vdW50IHBlciBzZWNvbmQgYW5kIGFuIGVycm9yOyBwYW5pY3Mgb24gcmVhZCBvciB0eXBlIGZhaWx1cmUuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBHZXRQb29sVGllckdldEVtaXNzaW9uKCkgZnVuYygpIChpbnQ2NCwgZXJyb3IpIHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlQb29sVGllckdldEVtaXNzaW9uLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCWZuLCBvayA6PSByZXN1bHQuKGZ1bmMoKSAoaW50NjQsIGVycm9yKSkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gZnVuYygpIChpbnQ2NCwgZXJyb3IpOiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIGZuCn0KCi8vIFNldFBvb2xUaWVyR2V0RW1pc3Npb24gc3RvcmVzIHRoZSBjYWxsYmFjayB1c2VkIHRvIHJlYWQgY3VycmVudCBzdGFrZXIgZW1pc3Npb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBMZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvciBmb3IgdGhlIGZvcndhcmRlZCBzdG9yZSBjYWxsOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogQ3VycmVudCBzdGFrZXIgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGJlZm9yZSBzdG9yYWdlIGlzIHdyaXR0ZW4uCi8vICAgLSBmbjogQ2FsbGJhY2sgcmV0dXJuaW5nIHRoZSBjdXJyZW50IGVtaXNzaW9uIGFtb3VudCBwZXIgc2Vjb25kIGFuZCBhbiBlcnJvci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBFcnJTcG9vZmVkUmVhbG0gd2hlbiBybG0gaXMgbm90IGN1cnJlbnQsIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yOyBuaWwgb24gc3VjY2Vzcy4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIFNldFBvb2xUaWVyR2V0RW1pc3Npb24oXyBpbnQsIHJsbSByZWFsbSwgZm4gZnVuYygpIChpbnQ2NCwgZXJyb3IpKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVBvb2xUaWVyR2V0RW1pc3Npb24uU3RyaW5nKCksIGZuKQp9CgovLyBQb29sVGllckdldEhhbHZpbmdCbG9ja3NJblJhbmdlCi8vIEhhc1Bvb2xUaWVyR2V0SGFsdmluZ0Jsb2Nrc0luUmFuZ2VTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIHBvb2wtdGllciBoYWx2aW5nIGNhbGxiYWNrIGtleSBleGlzdHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiBUcnVlIHdoZW4gdGhlIGhhbHZpbmctcmFuZ2UgY2FsbGJhY2sgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgaW4gc3RvcmFnZS4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIEhhc1Bvb2xUaWVyR2V0SGFsdmluZ0Jsb2Nrc0luUmFuZ2VTdG9yZUtleSgpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlQb29sVGllckdldEhhbHZpbmdCbG9ja3NJblJhbmdlLlN0cmluZygpKQp9CgovLyBHZXRQb29sVGllckdldEhhbHZpbmdCbG9ja3NJblJhbmdlIHJldHJpZXZlcyB0aGUgc3RvcmVkIGhhbHZpbmctcmFuZ2UgY2FsbGJhY2suCi8vCi8vIFJldHVybnM6Ci8vICAgLSBmdW5jKHN0YXJ0LCBlbmQgaW50NjQpIChbXWludDY0LCBbXWludDY0LCBlcnJvcik6IENhbGxiYWNrIHJldHVybmluZyBoYWx2aW5nIHRpbWVzdGFtcHMgYW5kIG1hdGNoaW5nIGVtaXNzaW9ucyBmb3IgW3N0YXJ0LCBlbmQpOyBwYW5pY3Mgb24gcmVhZCBvciB0eXBlIGZhaWx1cmUuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBHZXRQb29sVGllckdldEhhbHZpbmdCbG9ja3NJblJhbmdlKCkgZnVuYyhzdGFydCwgZW5kIGludDY0KSAoW11pbnQ2NCwgW11pbnQ2NCwgZXJyb3IpIHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlQb29sVGllckdldEhhbHZpbmdCbG9ja3NJblJhbmdlLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCWZuLCBvayA6PSByZXN1bHQuKGZ1bmMoc3RhcnQsIGVuZCBpbnQ2NCkgKFtdaW50NjQsIFtdaW50NjQsIGVycm9yKSkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gZnVuYyhzdGFydCwgZW5kIGludDY0KSAoW11pbnQ2NCwgW11pbnQ2NCwgZXJyb3IpOiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIGZuCn0KCi8vIFNldFBvb2xUaWVyR2V0SGFsdmluZ0Jsb2Nrc0luUmFuZ2Ugc3RvcmVzIHRoZSBoYWx2aW5nLXJhbmdlIGNhbGxiYWNrIHVzZWQgYnkgcG9vbC10aWVyIHJld2FyZCBjYWNoaW5nLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogTGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBmb3J3YXJkZWQgc3RvcmUgY2FsbDsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IEN1cnJlbnQgc3Rha2VyIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgYmUgY3VycmVudCBiZWZvcmUgc3RvcmFnZSBpcyB3cml0dGVuLgovLyAgIC0gZm46IENhbGxiYWNrIGFjY2VwdGluZyBbc3RhcnQsIGVuZCkgdGltZXN0YW1wcyBhbmQgcmV0dXJuaW5nIGhhbHZpbmcgdGltZXN0YW1wcywgZW1pc3Npb25zLCBhbmQgYW4gZXJyb3IuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogRXJyU3Bvb2ZlZFJlYWxtIHdoZW4gcmxtIGlzIG5vdCBjdXJyZW50LCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvcjsgbmlsIG9uIHN1Y2Nlc3MuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBTZXRQb29sVGllckdldEhhbHZpbmdCbG9ja3NJblJhbmdlKF8gaW50LCBybG0gcmVhbG0sIGZuIGZ1bmMoc3RhcnQsIGVuZCBpbnQ2NCkgKFtdaW50NjQsIFtdaW50NjQsIGVycm9yKSkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlQb29sVGllckdldEhhbHZpbmdCbG9ja3NJblJhbmdlLlN0cmluZygpLCBmbikKfQoKLy8gSGFzV2FybXVwVGVtcGxhdGVTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIHdhcm11cC10ZW1wbGF0ZSBrZXkgZXhpc3RzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogVHJ1ZSB3aGVuIGEgd2FybXVwIHNjaGVkdWxlIGhhcyBiZWVuIGluaXRpYWxpemVkIGluIHN0b3JhZ2UuCmZ1bmMgKHMgKnN0YWtlclN0b3JlKSBIYXNXYXJtdXBUZW1wbGF0ZVN0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleVdhcm11cFRlbXBsYXRlLlN0cmluZygpKQp9CgovLyBHZXRXYXJtdXBUZW1wbGF0ZSByZXRyaWV2ZXMgYSBjbG9uZSBvZiB0aGUgc3RvcmVkIHdhcm11cCBzY2hlZHVsZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIFtdV2FybXVwOiBXYXJtdXAgZW50cmllcyBjb3BpZWQgaW50byB0aGUgY2FsbGVyJ3MgcmVhbG07IHBhbmljcyBvbiByZWFkIG9yIHR5cGUgZmFpbHVyZS4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIEdldFdhcm11cFRlbXBsYXRlKCkgW11XYXJtdXAgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleVdhcm11cFRlbXBsYXRlLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXdhcm11cHMsIG9rIDo9IHJlc3VsdC4oW11XYXJtdXApCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvIFtdV2FybXVwOiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIGNsb25lV2FybXVwcyh3YXJtdXBzKQp9CgovLyBTZXRXYXJtdXBUZW1wbGF0ZSBzdG9yZXMgdGhlIHdhcm11cCBzY2hlZHVsZSB1c2VkIGZvciBleHRlcm5hbCBpbmNlbnRpdmVzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogTGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBmb3J3YXJkZWQgc3RvcmUgY2FsbDsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IEN1cnJlbnQgc3Rha2VyIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgYmUgY3VycmVudCBiZWZvcmUgc3RvcmFnZSBpcyB3cml0dGVuLgovLyAgIC0gd2FybXVwczogV2FybXVwIHNjaGVkdWxlIGVudHJpZXMgdG8gcGVyc2lzdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBFcnJTcG9vZmVkUmVhbG0gd2hlbiBybG0gaXMgbm90IGN1cnJlbnQsIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yOyBuaWwgb24gc3VjY2Vzcy4KZnVuYyAocyAqc3Rha2VyU3RvcmUpIFNldFdhcm11cFRlbXBsYXRlKF8gaW50LCBybG0gcmVhbG0sIHdhcm11cHMgW11XYXJtdXApIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5V2FybXVwVGVtcGxhdGUuU3RyaW5nKCksIHdhcm11cHMpCn0KCi8vIEN1cnJlbnRTd2FwQmF0Y2gKLy8gSGFzQ3VycmVudFN3YXBCYXRjaFN0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgY3VycmVudC1zd2FwLWJhdGNoIGtleSBleGlzdHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiBUcnVlIHdoZW4gdGhlIGN1cnJlbnQgc3dhcCBiYXRjaCBoYXMgYmVlbiBpbml0aWFsaXplZCBpbiBzdG9yYWdlLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgSGFzQ3VycmVudFN3YXBCYXRjaFN0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleUN1cnJlbnRTd2FwQmF0Y2guU3RyaW5nKCkpCn0KCi8vIEdldEN1cnJlbnRTd2FwQmF0Y2ggcmV0cmlldmVzIHRoZSBwcm9jZXNzb3IgZm9yIHRoZSBjdXJyZW50bHkgYWN0aXZlIHN3YXAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqU3dhcEJhdGNoUHJvY2Vzc29yOiBTdG9yZWQgc3dhcCBiYXRjaCwgb3IgbmlsIHdoZW4gaW5pdGlhbGl6YXRpb24gaGFzIHJlY29yZGVkIG5vIGFjdGl2ZSBiYXRjaDsgcGFuaWNzIG9uIHJlYWQgb3IgdHlwZSBmYWlsdXJlLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgR2V0Q3VycmVudFN3YXBCYXRjaCgpICpTd2FwQmF0Y2hQcm9jZXNzb3IgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleUN1cnJlbnRTd2FwQmF0Y2guU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJYmF0Y2gsIG9rIDo9IHJlc3VsdC4oKlN3YXBCYXRjaFByb2Nlc3NvcikKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gKlN3YXBCYXRjaFByb2Nlc3NvcjogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiBiYXRjaAp9CgovLyBTZXRDdXJyZW50U3dhcEJhdGNoIHBlcnNpc3RzIHRoZSBwcm9jZXNzb3IgZm9yIHRoZSBjdXJyZW50bHkgYWN0aXZlIHN3YXAuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBMZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvciBmb3IgdGhlIGZvcndhcmRlZCBzdG9yZSBjYWxsOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogQ3VycmVudCBzdGFrZXIgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGJlZm9yZSBzdG9yYWdlIGlzIHdyaXR0ZW4uCi8vICAgLSBiYXRjaDogU3dhcC1iYXRjaCBwcm9jZXNzb3IgdG8gcGVyc2lzdCwgb3IgbmlsIHdoZW4gdGhlIHN3YXAgaGFzIGVuZGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IEVyclNwb29mZWRSZWFsbSB3aGVuIHJsbSBpcyBub3QgY3VycmVudCwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3I7IG5pbCBvbiBzdWNjZXNzLgpmdW5jIChzICpzdGFrZXJTdG9yZSkgU2V0Q3VycmVudFN3YXBCYXRjaChfIGludCwgcmxtIHJlYWxtLCBiYXRjaCAqU3dhcEJhdGNoUHJvY2Vzc29yKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleUN1cnJlbnRTd2FwQmF0Y2guU3RyaW5nKCksIGJhdGNoKQp9CgovLyBOZXdTdGFrZXJTdG9yZSBjcmVhdGVzIGEgbmV3IHN0YWtlciBzdG9yZSBpbnN0YW5jZSB3aXRoIHRoZSBwcm92aWRlZCBLViBzdG9yZS4KLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSB1cGdyYWRlIHN5c3RlbSB0byBjcmVhdGUgc3RvcmFnZSBpbnN0YW5jZXMgZm9yIGVhY2ggaW1wbGVtZW50YXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBrdlN0b3JlOiBLZXktdmFsdWUgc3RvcmUgdXNlZCBmb3IgYWxsIHN0YWtlciBzdGF0ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIElTdGFrZXJTdG9yZTogU3RvcmUgaW50ZXJmYWNlIGJhY2tlZCBieSB0aGUgc3VwcGxpZWQgS1Ygc3RvcmUuCmZ1bmMgTmV3U3Rha2VyU3RvcmUoa3ZTdG9yZSBzdG9yZS5LVlN0b3JlKSBJU3Rha2VyU3RvcmUgewoJcmV0dXJuICZzdGFrZXJTdG9yZXsKCQlrdlN0b3JlOiBrdlN0b3JlLAoJfQp9CgpmdW5jIG1ha2VJbmNlbnRpdmVJRChjcmVhdG9yIGFkZHJlc3MsIHRpbWVzdGFtcCBpbnQ2NCwgaW5kZXggaW50NjQpIHN0cmluZyB7CglyZXR1cm4gdWZtdC5TcHJpbnRmKCIlczolZDolZCIsIGNyZWF0b3IuU3RyaW5nKCksIHRpbWVzdGFtcCwgaW5kZXgpCn0KCmZ1bmMgY29udGFpbnMoaXRlbXMgW11zdHJpbmcsIGl0ZW0gc3RyaW5nKSBib29sIHsKCWZvciBfLCBpIDo9IHJhbmdlIGl0ZW1zIHsKCQlpZiBpID09IGl0ZW0gewoJCQlyZXR1cm4gdHJ1ZQoJCX0KCX0KCglyZXR1cm4gZmFsc2UKfQoaojYKCHRyZWUuZ25vEpU2cGFja2FnZSBzdGFrZXIKCmltcG9ydCAoCgkiZ25vLmxhbmQvcC9nbm9zd2FwL2duc21hdGgvdjEiCgkiZ25vLmxhbmQvcC9nbm9zd2FwL3V0aWxzL3YxIgoJcm90cmVlICJnbm8ubGFuZC9wL250L2JwdHJlZS9yb3RyZWUvdjAiCglicHRyZWUgImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgovLyBVaW50VHJlZSB3cmFwcyBhIEIrIHRyZWUgd2l0aCBub25uZWdhdGl2ZSBpbnQ2NCB0aW1lc3RhbXAga2V5cywgZW5jb2RlZCBhcwovLyBmaXhlZC13aWR0aCA4LWJ5dGUgYmlnLWVuZGlhbiBzdHJpbmdzIHRvIHByZXNlcnZlIG51bWVyaWMgb3JkZXJpbmcuCi8vCi8vIE1ldGhvZHM6Ci8vIC0gR2V0OiBSZXRyaWV2ZXMgYSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYW4gaW50NjQga2V5LgovLyAtIFNldDogU3RvcmVzIGEgdmFsdWUgd2l0aCBhbiBpbnQ2NCBrZXkuCi8vIC0gSGFzOiBDaGVja3MgaWYgYW4gaW50NjQga2V5IGV4aXN0cyBpbiB0aGUgdHJlZS4KLy8gLSBSZW1vdmU6IFJlbW92ZXMgYW4gaW50NjQga2V5IGFuZCBpdHMgYXNzb2NpYXRlZCB2YWx1ZS4KLy8gLSBJdGVyYXRlOiBJdGVyYXRlcyBvdmVyIGtleXMgYW5kIHZhbHVlcyBpbiBhIHJhbmdlLgovLyAtIFJldmVyc2VJdGVyYXRlOiBJdGVyYXRlcyBpbiByZXZlcnNlIG9yZGVyIG92ZXIga2V5cyBhbmQgdmFsdWVzIGluIGEgcmFuZ2UuCnR5cGUgVWludFRyZWUgc3RydWN0IHsKCXRyZWUgICAqYnB0cmVlLkJQVHJlZSAvLyBibG9ja1RpbWVzdGFtcCAtPiBhbnkKCWZhbm91dCBpbnQKfQoKLy8gTmV3QlBUcmVlTiBhbGxvY2F0ZXMgYSByYXcgQlAtdHJlZSB1bmRlciAvci9nbm9zd2FwL3N0YWtlcidzIHJlYWxtCi8vIGNvbnRleHQgKHRoZSByZWFsbSB0aGF0IGRlY2xhcmVzIFBvb2wvRGVwb3NpdC9FeHRlcm5hbEluY2VudGl2ZSkuIFRoZSB0cmVlJ3MKLy8gUGtnSUQgaXMgdGhlcmVmb3JlIC9yL2dub3N3YXAvc3Rha2VyLCBtYXRjaGluZyB0aGUgZG9tYWluIHZhbHVlcyBpdCBzdG9yZXMsCi8vIHNvIHRyZWUuU2V0IGxlYWYtc2xvdCB3cml0ZXMgY2xlYXIgdGhlIHJlYWRvbmx5LXRhaW50IGdhdGUgcmVnYXJkbGVzcyBvZgovLyB3aGljaCByZWFsbSAoc3Rha2VyL3YxLCBtb2NrKSBjYWxscyBTZXQgKGJvcnJvdyBydWxlICMyIGJvcnJvd3MgbS5SZWFsbSB0bwovLyB0aGUgdHJlZSdzIG93bmluZyByZWFsbSkuIEltcGxlbWVudGF0aW9ucyBhbmQgbW9ja3MgbXVzdCBhbGxvY2F0ZSB0cmVlcyB0aGF0Ci8vIGhvbGQgL3IvZ25vc3dhcC9zdGFrZXItZGVjbGFyZWQgdmFsdWVzIHRocm91Z2ggaGVyZSByYXRoZXIgdGhhbiBjYWxsaW5nCi8vIGJwdHJlZS5OZXdCUFRyZWVOIGRpcmVjdGx5IGluIHRoZWlyIG93biByZWFsbS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGZhbm91dDogTnVtYmVyIG9mIGNoaWxkIHBvaW50ZXJzIHBlciBCKyB0cmVlIG5vZGU7IGNvbnRyb2xzIHRoZSB0cmVlJ3MgYnJhbmNoaW5nIGZhY3Rvci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRyZWU6IE11dGFibGUgcmF3IEIrIHRyZWUgYWxsb2NhdGVkIGluIHRoZSBzdGFrZXIgcmVhbG0gY29udGV4dC4KZnVuYyBOZXdCUFRyZWVOKGZhbm91dCBpbnQpICpicHRyZWUuQlBUcmVlIHsKCXJldHVybiBicHRyZWUuTmV3QlBUcmVlTihmYW5vdXQpCn0KCi8vIE5ld1VpbnRUcmVlIGNyZWF0ZXMgYSBuZXcgVWludFRyZWUgaW5zdGFuY2Ugd2l0aCBkZWZhdWx0IGZhbm91dCA2NC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRyZWU6IEVtcHR5IFVpbnRUcmVlIHVzaW5nIHRoZSBkZWZhdWx0IGZhbm91dCBvZiA2NC4KZnVuYyBOZXdVaW50VHJlZSgpICpVaW50VHJlZSB7CglyZXR1cm4gTmV3VWludFRyZWVOKDY0KQp9CgovLyBOZXdVaW50VHJlZU4gY3JlYXRlcyBhIG5ldyBVaW50VHJlZSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgZmFub3V0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZmFub3V0OiBOdW1iZXIgb2YgY2hpbGQgcG9pbnRlcnMgcGVyIEIrIHRyZWUgbm9kZSB1c2VkIGJ5IHRoZSB3cmFwcGVkIHRyZWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0cmVlOiBFbXB0eSBVaW50VHJlZSBjb25maWd1cmVkIHdpdGggdGhlIHJlcXVlc3RlZCBmYW5vdXQuCmZ1bmMgTmV3VWludFRyZWVOKGZhbm91dCBpbnQpICpVaW50VHJlZSB7CglyZXR1cm4gJlVpbnRUcmVlewoJCXRyZWU6ICAgYnB0cmVlLk5ld0JQVHJlZU4oZmFub3V0KSwKCQlmYW5vdXQ6IGZhbm91dCwKCX0KfQoKLy8gR2V0IGxvb2tzIHVwIGEgdmFsdWUgYnkgaXRzIG5vbm5lZ2F0aXZlIGludDY0IGtleS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGtleTogTm9ubmVnYXRpdmUgdGltZXN0YW1wLWxpa2Uga2V5IGVuY29kZWQgaW50byB0aGUgdHJlZSdzIG9yZGVyZWQga2V5IGZvcm1hdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHZhbHVlOiBTdG9yZWQgdmFsdWUgd2hlbiB0aGUga2V5IG1hcHMgdG8gYSBub24tbmlsIGVudHJ5OyBuaWwgd2hlbiBhYnNlbnQuCi8vICAgLSBmb3VuZDogVHJ1ZSB3aGVuIGEgbm9uLW5pbCB2YWx1ZSBleGlzdHMgZm9yIGtleSwgYW5kIGZhbHNlIG90aGVyd2lzZS4KZnVuYyAoc2VsZiAqVWludFRyZWUpIEdldChrZXkgaW50NjQpIChhbnksIGJvb2wpIHsKCXYgOj0gc2VsZi50cmVlLkdldChlbmNvZGVJbnQ2NChrZXkpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiBuaWwsIGZhbHNlCgl9CglyZXR1cm4gdiwgdHJ1ZQp9CgovLyBTZXQgc3RvcmVzIGEgdmFsdWUgdW5kZXIgYSBub25uZWdhdGl2ZSBpbnQ2NCBrZXkuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBrZXk6IE5vbm5lZ2F0aXZlIHRpbWVzdGFtcC1saWtlIGtleSB1c2VkIGFzIHRoZSBvcmRlcmVkIHRyZWUga2V5OyBuZWdhdGl2ZSB2YWx1ZXMgcGFuaWMuCi8vICAgLSB2YWx1ZTogVmFsdWUgdG8gYXNzb2NpYXRlIHdpdGgga2V5LgpmdW5jIChzZWxmICpVaW50VHJlZSkgU2V0KGtleSBpbnQ2NCwgdmFsdWUgYW55KSB7CglzZWxmLnRyZWUuU2V0KGVuY29kZUludDY0KGtleSksIHZhbHVlKQp9CgovLyBIYXMgcmVwb3J0cyB3aGV0aGVyIGFuIGVuY29kZWQga2V5IGlzIHByZXNlbnQgaW4gdGhlIHVuZGVybHlpbmcgdHJlZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGtleTogTm9ubmVnYXRpdmUgdGltZXN0YW1wLWxpa2Uga2V5IHRvIHRlc3Q7IG5lZ2F0aXZlIHZhbHVlcyBwYW5pYyBkdXJpbmcgZW5jb2RpbmcuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwcmVzZW50OiBUcnVlIHdoZW4gdGhlIHVuZGVybHlpbmcgdHJlZSBjb250YWlucyBrZXksIGluY2x1ZGluZyBlbnRyaWVzIHdob3NlIHZhbHVlIG1heSBiZSBuaWwgYWNjb3JkaW5nIHRvIHRoZSBCKyB0cmVlLgpmdW5jIChzZWxmICpVaW50VHJlZSkgSGFzKGtleSBpbnQ2NCkgYm9vbCB7CglyZXR1cm4gc2VsZi50cmVlLkhhcyhlbmNvZGVJbnQ2NChrZXkpKQp9CgovLyBSZW1vdmUgZGVsZXRlcyB0aGUgdmFsdWUgc3RvcmVkIHVuZGVyIGEga2V5LCBpZiBhbnkuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBrZXk6IE5vbm5lZ2F0aXZlIHRpbWVzdGFtcC1saWtlIGtleSB0byByZW1vdmU7IG5lZ2F0aXZlIHZhbHVlcyBwYW5pYyBkdXJpbmcgZW5jb2RpbmcuCmZ1bmMgKHNlbGYgKlVpbnRUcmVlKSBSZW1vdmUoa2V5IGludDY0KSB7CglzZWxmLnRyZWUuUmVtb3ZlKGVuY29kZUludDY0KGtleSkpCn0KCi8vIEl0ZXJhdGUgdmlzaXRzIGVudHJpZXMgaW4gYXNjZW5kaW5nIGtleSBvcmRlciBvdmVyIHRoZSB1bmRlcmx5aW5nIHRyZWUgcmFuZ2UuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzdGFydDogTm9ubmVnYXRpdmUgbG93ZXIgYm91bmQgZm9yIHRoZSBlbmNvZGVkIGtleSByYW5nZS4KLy8gICAtIGVuZDogTm9ubmVnYXRpdmUgdXBwZXIgYm91bmQgZm9yIHRoZSBlbmNvZGVkIGtleSByYW5nZS4KLy8gICAtIGZuOiBDYWxsYmFjayByZWNlaXZpbmcgZWFjaCBkZWNvZGVkIGtleSBhbmQgdmFsdWU7IHJldHVybmluZyB0cnVlIHJlcXVlc3RzIHRoYXQgaXRlcmF0aW9uIHN0b3AuCmZ1bmMgKHNlbGYgKlVpbnRUcmVlKSBJdGVyYXRlKHN0YXJ0LCBlbmQgaW50NjQsIGZuIGZ1bmMoa2V5IGludDY0LCB2YWx1ZSBhbnkpIGJvb2wpIHsKCXNlbGYudHJlZS5JdGVyYXRlKGVuY29kZUludDY0KHN0YXJ0KSwgZW5jb2RlSW50NjQoZW5kKSwgZnVuYyhrZXkgc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCXJldHVybiBmbihkZWNvZGVJbnQ2NChrZXkpLCB2YWx1ZSkKCX0pCn0KCi8vIFJldmVyc2VJdGVyYXRlIHZpc2l0cyBlbnRyaWVzIGluIGRlc2NlbmRpbmcga2V5IG9yZGVyIG92ZXIgdGhlIHVuZGVybHlpbmcgdHJlZSByYW5nZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHN0YXJ0OiBOb25uZWdhdGl2ZSBsb3dlciBib3VuZCBmb3IgdGhlIGVuY29kZWQga2V5IHJhbmdlLgovLyAgIC0gZW5kOiBOb25uZWdhdGl2ZSB1cHBlciBib3VuZCBmb3IgdGhlIGVuY29kZWQga2V5IHJhbmdlLgovLyAgIC0gZm46IENhbGxiYWNrIHJlY2VpdmluZyBlYWNoIGRlY29kZWQga2V5IGFuZCB2YWx1ZTsgcmV0dXJuaW5nIHRydWUgcmVxdWVzdHMgdGhhdCBpdGVyYXRpb24gc3RvcC4KZnVuYyAoc2VsZiAqVWludFRyZWUpIFJldmVyc2VJdGVyYXRlKHN0YXJ0LCBlbmQgaW50NjQsIGZuIGZ1bmMoa2V5IGludDY0LCB2YWx1ZSBhbnkpIGJvb2wpIHsKCXNlbGYudHJlZS5SZXZlcnNlSXRlcmF0ZShlbmNvZGVJbnQ2NChzdGFydCksIGVuY29kZUludDY0KGVuZCksIGZ1bmMoa2V5IHN0cmluZywgdmFsdWUgYW55KSBib29sIHsKCQlyZXR1cm4gZm4oZGVjb2RlSW50NjQoa2V5KSwgdmFsdWUpCgl9KQp9CgovLyBTaXplIHJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGN1cnJlbnRseSBzdG9yZWQgaW4gdGhlIHRyZWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzaXplOiBOdW1iZXIgb2Yga2V5L3ZhbHVlIGVudHJpZXMgaW4gdGhlIHVuZGVybHlpbmcgQisgdHJlZS4KZnVuYyAoc2VsZiAqVWludFRyZWUpIFNpemUoKSBpbnQgewoJcmV0dXJuIHNlbGYudHJlZS5TaXplKCkKfQoKLy8gSXRlcmF0ZUJ5T2Zmc2V0IHZpc2l0cyBhIHBhZ2Ugb2YgZW50cmllcyBiZWdpbm5pbmcgYXQgYW4gb2Zmc2V0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gb2Zmc2V0OiBaZXJvLWJhc2VkIG51bWJlciBvZiBlbnRyaWVzIHRvIHNraXAgYmVmb3JlIGludm9raW5nIGZuLgovLyAgIC0gY291bnQ6IE1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgdG8gdmlzaXQuCi8vICAgLSBmbjogQ2FsbGJhY2sgcmVjZWl2aW5nIGVhY2ggZGVjb2RlZCBrZXkgYW5kIHZhbHVlOyByZXR1cm5pbmcgdHJ1ZSByZXF1ZXN0cyB0aGF0IGl0ZXJhdGlvbiBzdG9wLgpmdW5jIChzZWxmICpVaW50VHJlZSkgSXRlcmF0ZUJ5T2Zmc2V0KG9mZnNldCwgY291bnQgaW50LCBmbiBmdW5jKGtleSBpbnQ2NCwgdmFsdWUgYW55KSBib29sKSB7CglzZWxmLnRyZWUuSXRlcmF0ZUJ5T2Zmc2V0KG9mZnNldCwgY291bnQsIGZ1bmMoa2V5IHN0cmluZywgdmFsdWUgYW55KSBib29sIHsKCQlyZXR1cm4gZm4oZGVjb2RlSW50NjQoa2V5KSwgdmFsdWUpCgl9KQp9CgovLyBSZWFkT25seSByZXR1cm5zIGEgcmVhZC1vbmx5IHZpZXcgb2YgdGhlIHVuZGVybHlpbmcgdHJlZSwgc28gY2FsbGVycyBjYW4KLy8gcGFnaW5hdGUgaXQgd2l0aG91dCBnYWluaW5nIGEgaGFuZGxlIG9uIHRoZSBtdXRhYmxlIHRyZWUuCi8vCi8vIEtleXMgdXNlIHV0aWxzLkVuY29kZVVpbnQ2NCdzIGZpeGVkLXdpZHRoIGJpbmFyeSBlbmNvZGluZywgbm90IHRoZSBpbnQ2NAovLyBrZXlzIHRoaXMgdHlwZSB0YWtlczsgdXRpbHMuRGVjb2RlVWludDY0IHJlY292ZXJzIHRoZSBub25uZWdhdGl2ZSB2YWx1ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIG1ha2VFbnRyeVNhZmVGbjogQ2FsbGJhY2sgdGhhdCBjb252ZXJ0cyBlYWNoIHN0b3JlZCB2YWx1ZSBpbnRvIHRoZSByZXByZXNlbnRhdGlvbiBleHBvc2VkIHRocm91Z2ggdGhlIHJlYWQtb25seSB2aWV3LgovLwovLyBSZXR1cm5zOgovLyAgIC0gdHJlZTogUmVhZC1vbmx5IHdyYXBwZXIgb3ZlciB0aGUgdW5kZXJseWluZyB0cmVlIGZvciBzYWZlIHBhZ2luYXRpb24uCmZ1bmMgKHNlbGYgKlVpbnRUcmVlKSBSZWFkT25seShtYWtlRW50cnlTYWZlRm4gZnVuYyhhbnkpIGFueSkgKnJvdHJlZS5SZWFkT25seVRyZWUgewoJcmV0dXJuIHJvdHJlZS5XcmFwKHNlbGYudHJlZSwgbWFrZUVudHJ5U2FmZUZuKQp9CgovLyBDbG9uZSByZXR1cm5zIGEgbmV3IFVpbnRUcmVlIHdpdGggdGhlIHNhbWUgZW5jb2RlZCBrZXlzIGFuZCBzdG9yZWQgdmFsdWUgcmVmZXJlbmNlcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRyZWU6IE5ldyBVaW50VHJlZSBwcmVzZXJ2aW5nIHRoaXMgdHJlZSdzIGZhbm91dCBhbmQgZW50cmllczsgcG9pbnRlZC10byB2YWx1ZXMgYXJlIG5vdCBkZWVwLWNsb25lZC4KZnVuYyAoc2VsZiAqVWludFRyZWUpIENsb25lKCkgKlVpbnRUcmVlIHsKCWlmIHNlbGYgPT0gbmlsIHsKCQlyZXR1cm4gbmlsCgl9CgoJY2xvbmVkIDo9IE5ld1VpbnRUcmVlTihzZWxmLmZhbm91dCkKCXNlbGYudHJlZS5JdGVyYXRlKCIiLCAiIiwgZnVuYyhrZXkgc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCWNsb25lZC50cmVlLlNldChrZXksIHZhbHVlKQoJCXJldHVybiBmYWxzZQoJfSkKCglyZXR1cm4gY2xvbmVkCn0KCmZ1bmMgZW5jb2RlSW50NjQobnVtIGludDY0KSBzdHJpbmcgewoJaWYgbnVtIDwgMCB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJuZWdhdGl2ZSB2YWx1ZSBub3Qgc3VwcG9ydGVkOiAlZCIsIG51bSkpCgl9CglyZXR1cm4gdXRpbHMuRW5jb2RlVWludDY0KHVpbnQ2NChudW0pKQp9CgpmdW5jIGRlY29kZUludDY0KHMgc3RyaW5nKSBpbnQ2NCB7CglyZXR1cm4gZ25zbWF0aC5TYWZlVWludDY0VG9JbnQ2NCh1dGlscy5EZWNvZGVVaW50NjQocykpCn0KGuOBBAoJdHlwZXMuZ25vEtSBBHBhY2thZ2Ugc3Rha2VyCgppbXBvcnQgKAoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCglyb3RyZWUgImduby5sYW5kL3AvbnQvYnB0cmVlL3JvdHJlZS92MCIKCWJwdHJlZSAiZ25vLmxhbmQvcC9udC9icHRyZWUvdjAiCikKCnR5cGUgSVN0YWtlciBpbnRlcmZhY2UgewoJSVN0YWtlck1hbmFnZXIKCUlTdGFrZXJHZXR0ZXIKCVJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nCn0KCnR5cGUgSVN0YWtlck1hbmFnZXIgaW50ZXJmYWNlIHsKCS8vIFN0YWtlVG9rZW4gc3Rha2VzIGFuIExQIHBvc2l0aW9uIE5GVCwgdHJhbnNmZXJzIGN1c3RvZHkgdG8gdGhlIHN0YWtlciwgYW5kCgkvLyBzdGFydHMgaW50ZXJuYWwgR05TIGFuZCBlbGlnaWJsZSBleHRlcm5hbCByZXdhcmQgYWNjb3VudGluZy4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbXBsZW1lbnRhdGlvbiBmb3J3YXJkaW5nOyBwcm94eSBtZXRob2RzIHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBzdGFrZXIgcHJveHkgKDAsIGN1ciwgLi4uKS4KCS8vICAgLSBwb3NpdGlvbklkOiBMUCBwb3NpdGlvbiBORlQgaWRlbnRpZmllciB3aG9zZSBsaXF1aWRpdHkgd2lsbCBiZSBzdGFrZWQuCgkvLyAgIC0gcmVmZXJyZXI6IE9wdGlvbmFsIHJlZmVycmFsIGFkZHJlc3Mgb3IgaWRlbnRpZmllciBzdXBwbGllZCBmb3IgcmVmZXJyYWwgdHJhY2tpbmcuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHRva2VuMDp0b2tlbjE6ZmVlIHBhdGggb2YgdGhlIHBvb2wgY29udGFpbmluZyB0aGUgc3Rha2VkIHBvc2l0aW9uLgoJLy8KCVN0YWtlVG9rZW4oXyBpbnQsIHJsbSByZWFsbSwgcG9zaXRpb25JZCB1aW50NjQsIHJlZmVycmVyIHN0cmluZykgc3RyaW5nCgoJLy8gVW5TdGFrZVRva2VuIHJlY29yZHMgdGhlIHBvc2l0aW9uJ3MgZXhpdCBjaGVja3BvaW50LCByZW1vdmVzIGl0IGZyb20gYWN0aXZlCgkvLyBzdGFraW5nLCBhbmQgcmV0dXJucyB0aGUgTkZUIHRvIGl0cyBvd25lci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbXBsZW1lbnRhdGlvbiBmb3J3YXJkaW5nOyBwcm94eSBtZXRob2RzIHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBzdGFrZXIgcHJveHkgKDAsIGN1ciwgLi4uKS4KCS8vICAgLSBwb3NpdGlvbklkOiBMUCBwb3NpdGlvbiBORlQgaWRlbnRpZmllciB0byByZW1vdmUgZnJvbSBzdGFraW5nLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggZnJvbSB0aGUgcG9zaXRpb24ncyBhY3RpdmUgZGVwb3NpdC4KCS8vCglVblN0YWtlVG9rZW4oXyBpbnQsIHJsbSByZWFsbSwgcG9zaXRpb25JZCB1aW50NjQpIHN0cmluZwoKCS8vIENvbGxlY3RSZXdhcmQgc2V0dGxlcyBib3RoIEdOUyBlbWlzc2lvbiBhbmQgYWxsIGN1cnJlbnRseSBwYXlhYmxlIGV4dGVybmFsCgkvLyBpbmNlbnRpdmUgcmV3YXJkcyBmb3IgYSBsaXZlIGRlcG9zaXQgb3IgYW4gdW5zdGFrZWQgZXhpdCBjaGVja3BvaW50LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yIGltcGxlbWVudGF0aW9uIGZvcndhcmRpbmc7IHByb3h5IG1ldGhvZHMgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIHN0YWtlciBwcm94eSAoMCwgY3VyLCAuLi4pLgoJLy8gICAtIHBvc2l0aW9uSWQ6IExQIHBvc2l0aW9uIE5GVCBpZGVudGlmaWVyLCBvciBhbiBpZGVudGlmaWVyIHdpdGggYW4gZXhpdCBjaGVja3BvaW50LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW50ZXJuYWxSZXdhcmRUb1VzZXI6IERlY2ltYWwgc3RyaW5nIGZvciB0aGUgR05TIGFtb3VudCB0cmFuc2ZlcnJlZCB0byB0aGUgcG9zaXRpb24gb3duZXIuCgkvLyAgIC0gaW50ZXJuYWxSZXdhcmRQZW5hbHR5OiBEZWNpbWFsIHN0cmluZyBmb3IgdGhlIEdOUyB3YXJtLXVwIHBlbmFsdHkgc2VudCB0byB0aGUgY29tbXVuaXR5IHBvb2wuCgkvLyAgIC0gZXh0ZXJuYWxSZXdhcmRzOiBNYXAga2V5ZWQgYnkgcmV3YXJkLXRva2VuIHBhdGggY29udGFpbmluZyBncm9zcyBleHRlcm5hbCByZXdhcmQgYW1vdW50cyBiZWZvcmUgdGhlIHN0YWtpbmcgZmVlLgoJLy8gICAtIGV4dGVybmFsUGVuYWx0aWVzOiBNYXAga2V5ZWQgYnkgcmV3YXJkLXRva2VuIHBhdGggY29udGFpbmluZyB3YXJtLXVwIHBlbmFsdGllcyByZXRhaW5lZCBieSBlYWNoIGluY2VudGl2ZS4KCS8vCglDb2xsZWN0UmV3YXJkKF8gaW50LCBybG0gcmVhbG0sIHBvc2l0aW9uSWQgdWludDY0KSAoc3RyaW5nLCBzdHJpbmcsIG1hcFtzdHJpbmddaW50NjQsIG1hcFtzdHJpbmddaW50NjQpCgoJLy8gQ29sbGVjdEVtaXNzaW9uUmV3YXJkIHNldHRsZXMgb25seSB0aGUgaW50ZXJuYWwgR05TIGVtaXNzaW9uIGZvciBhIGxpdmUKCS8vIGRlcG9zaXQgb3IgYW4gdW5zdGFrZWQgZXhpdCBjaGVja3BvaW50LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yIGltcGxlbWVudGF0aW9uIGZvcndhcmRpbmc7IHByb3h5IG1ldGhvZHMgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIHN0YWtlciBwcm94eSAoMCwgY3VyLCAuLi4pLgoJLy8gICAtIHBvc2l0aW9uSWQ6IExQIHBvc2l0aW9uIE5GVCBpZGVudGlmaWVyLCBvciBhbiBpZGVudGlmaWVyIHdpdGggYW4gZXhpdCBjaGVja3BvaW50LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gcmV3YXJkVG9Vc2VyOiBHTlMgYW1vdW50IHRyYW5zZmVycmVkIHRvIHRoZSBwb3NpdGlvbiBvd25lci4KCS8vICAgLSByZXdhcmRQZW5hbHR5OiBHTlMgd2FybS11cCBwZW5hbHR5IHRyYW5zZmVycmVkIHRvIHRoZSBjb21tdW5pdHkgcG9vbC4KCS8vCglDb2xsZWN0RW1pc3Npb25SZXdhcmQoXyBpbnQsIHJsbSByZWFsbSwgcG9zaXRpb25JZCB1aW50NjQpIChpbnQ2NCwgaW50NjQpCgoJLy8gQ29sbGVjdEV4dGVybmFsSW5jZW50aXZlUmV3YXJkIHNldHRsZXMgb25lIGV4dGVybmFsIGluY2VudGl2ZSBmb3IgYSBsaXZlCgkvLyBkZXBvc2l0IG9yIGFuIHVuc3Rha2VkIGV4aXQgY2hlY2twb2ludC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbXBsZW1lbnRhdGlvbiBmb3J3YXJkaW5nOyBwcm94eSBtZXRob2RzIHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBzdGFrZXIgcHJveHkgKDAsIGN1ciwgLi4uKS4KCS8vICAgLSBwb3NpdGlvbklkOiBMUCBwb3NpdGlvbiBORlQgaWRlbnRpZmllciwgb3IgYW4gaWRlbnRpZmllciB3aXRoIGFuIGV4aXQgY2hlY2twb2ludC4KCS8vICAgLSBpbmNlbnRpdmVJZDogRXh0ZXJuYWwgaW5jZW50aXZlIGlkZW50aWZpZXIgdG8gc2V0dGxlIGZvciB0aGUgcG9zaXRpb24uCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSByZXdhcmRBbW91bnQ6IEdyb3NzIHJld2FyZC10b2tlbiBhbW91bnQgY2FsY3VsYXRlZCBmb3IgdGhlIGluY2VudGl2ZSBiZWZvcmUgdGhlIHN0YWtpbmcgZmVlLgoJLy8gICAtIHBlbmFsdHlBbW91bnQ6IFdhcm0tdXAgcGVuYWx0eSBhbW91bnQgcmV0YWluZWQgYnkgdGhlIGluY2VudGl2ZSByYXRoZXIgdGhhbiBzZW50IHRvIHRoZSBvd25lci4KCS8vCglDb2xsZWN0RXh0ZXJuYWxJbmNlbnRpdmVSZXdhcmQoXyBpbnQsIHJsbSByZWFsbSwgcG9zaXRpb25JZCB1aW50NjQsIGluY2VudGl2ZUlkIHN0cmluZykgKGludDY0LCBpbnQ2NCkKCgkvLyBTZXRQb29sVGllciBhc3NpZ25zIGFuIGludGVybmFsIEdOUy1lbWlzc2lvbiB0aWVyIHRvIGFuIGV4aXN0aW5nIHBvb2wuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBMZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgaW1wbGVtZW50YXRpb24gZm9yd2FyZGluZzsgcHJveHkgbWV0aG9kcyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBDdXJyZW50IHJlYWxtIGNvbnRleHQgZm9yd2FyZGVkIHVuY2hhbmdlZCBieSB0aGUgc3Rha2VyIHByb3h5ICgwLCBjdXIsIC4uLikuCgkvLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggd2hvc2UgZW1pc3Npb24gdGllciBpcyBiZWluZyBhc3NpZ25lZC4KCS8vICAgLSB0aWVyOiBQb29sIHRpZXIgaW5kZXggaW4gWzAsIEFsbFRpZXJDb3VudCk7IHplcm8gcmVtb3ZlcyB0aGUgcG9vbCBmcm9tIHRoZSBpbnRlcm5hbCBlbWlzc2lvbiB0YXJnZXQuCgkvLwoJU2V0UG9vbFRpZXIoXyBpbnQsIHJsbSByZWFsbSwgcG9vbFBhdGggc3RyaW5nLCB0aWVyIHVpbnQ2NCkKCgkvLyBDaGFuZ2VQb29sVGllciBjaGFuZ2VzIHRoZSBpbnRlcm5hbCBHTlMtZW1pc3Npb24gdGllciBvZiBhbiBleGlzdGluZyBwb29sLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yIGltcGxlbWVudGF0aW9uIGZvcndhcmRpbmc7IHByb3h5IG1ldGhvZHMgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIHN0YWtlciBwcm94eSAoMCwgY3VyLCAuLi4pLgoJLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcG9vbCBwYXRoIHdob3NlIGVtaXNzaW9uIHRpZXIgaXMgYmVpbmcgY2hhbmdlZC4KCS8vICAgLSB0aWVyOiBSZXBsYWNlbWVudCBwb29sIHRpZXIgaW5kZXggaW4gWzAsIEFsbFRpZXJDb3VudCk7IHplcm8gcmVtb3ZlcyB0aGUgcG9vbCBmcm9tIHRoZSBpbnRlcm5hbCBlbWlzc2lvbiB0YXJnZXQuCgkvLwoJQ2hhbmdlUG9vbFRpZXIoXyBpbnQsIHJsbSByZWFsbSwgcG9vbFBhdGggc3RyaW5nLCB0aWVyIHVpbnQ2NCkKCgkvLyBSZW1vdmVQb29sVGllciByZW1vdmVzIGEgcG9vbCBmcm9tIHRoZSBpbnRlcm5hbCBHTlMtZW1pc3Npb24gdGllciBzeXN0ZW0uCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBMZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgaW1wbGVtZW50YXRpb24gZm9yd2FyZGluZzsgcHJveHkgbWV0aG9kcyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBDdXJyZW50IHJlYWxtIGNvbnRleHQgZm9yd2FyZGVkIHVuY2hhbmdlZCBieSB0aGUgc3Rha2VyIHByb3h5ICgwLCBjdXIsIC4uLikuCgkvLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggdG8gcmVtb3ZlIGZyb20gdGllciBtZW1iZXJzaGlwLgoJLy8KCVJlbW92ZVBvb2xUaWVyKF8gaW50LCBybG0gcmVhbG0sIHBvb2xQYXRoIHN0cmluZykKCgkvLyBDcmVhdGVFeHRlcm5hbEluY2VudGl2ZSBmdW5kcyBhbmQgcmVnaXN0ZXJzIGFuIGV4dGVybmFsIHJld2FyZCBwcm9ncmFtIGZvciBhCgkvLyB0YXJnZXQgcG9vbCBvdmVyIHRoZSByZXF1ZXN0ZWQgVW5peC10aW1lIGludGVydmFsLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yIGltcGxlbWVudGF0aW9uIGZvcndhcmRpbmc7IHByb3h5IG1ldGhvZHMgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIHN0YWtlciBwcm94eSAoMCwgY3VyLCAuLi4pLgoJLy8gICAtIHRhcmdldFBvb2xQYXRoOiBDYW5vbmljYWwgcG9vbCBwYXRoIHdob3NlIHBvc2l0aW9ucyBtYXkgZWFybiB0aGUgaW5jZW50aXZlLgoJLy8gICAtIHJld2FyZFRva2VuOiBSZWdpc3RlcmVkIHRva2VuIHBhdGggdXNlZCB0byBwYXkgdGhlIGV4dGVybmFsIHJld2FyZC4KCS8vICAgLSByZXdhcmRBbW91bnQ6IFRvdGFsIHJld2FyZC10b2tlbiBhbW91bnQgZGVwb3NpdGVkIGZvciB0aGUgaW5jZW50aXZlLgoJLy8gICAtIHN0YXJ0VGltZXN0YW1wOiBJbmNsdXNpdmUgVW5peC1zZWNvbmQgdGltZXN0YW1wIGF0IHdoaWNoIHJld2FyZHMgYmVnaW4gYWNjcnVpbmcuCgkvLyAgIC0gZW5kVGltZXN0YW1wOiBVbml4LXNlY29uZCB0aW1lc3RhbXAgYXQgd2hpY2ggdGhlIHJld2FyZCBpbnRlcnZhbCBlbmRzLgoJLy8KCUNyZWF0ZUV4dGVybmFsSW5jZW50aXZlKAoJCV8gaW50LAoJCXJsbSByZWFsbSwKCQl0YXJnZXRQb29sUGF0aCBzdHJpbmcsCgkJcmV3YXJkVG9rZW4gc3RyaW5nLAoJCXJld2FyZEFtb3VudCBpbnQ2NCwKCQlzdGFydFRpbWVzdGFtcCBpbnQ2NCwKCQllbmRUaW1lc3RhbXAgaW50NjQsCgkpCgoJLy8gRW5kRXh0ZXJuYWxJbmNlbnRpdmUgZmluYWxpemVzIGFuIGVuZGVkIGV4dGVybmFsIGluY2VudGl2ZSBhbmQgcmVmdW5kcyBpdHMKCS8vIHJlbWFpbmluZyByZXdhcmQgdG9rZW5zIGFuZCBkZXBvc2l0ZWQgR05TIHRvIHRoZSByZXF1ZXN0ZWQgYWRkcmVzcy4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbXBsZW1lbnRhdGlvbiBmb3J3YXJkaW5nOyBwcm94eSBtZXRob2RzIHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBzdGFrZXIgcHJveHkgKDAsIGN1ciwgLi4uKS4KCS8vICAgLSB0YXJnZXRQb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBjb250YWluaW5nIHRoZSBpbmNlbnRpdmUuCgkvLyAgIC0gaW5jZW50aXZlSWQ6IFVuaXF1ZSBleHRlcm5hbCBpbmNlbnRpdmUgaWRlbnRpZmllciB0byBmaW5hbGl6ZS4KCS8vICAgLSByZWZ1bmRBZGRyZXNzOiBBZGRyZXNzIHJlY2VpdmluZyByZWZ1bmRhYmxlIHJld2FyZCB0b2tlbnMgYW5kIHRoZSBHTlMgZGVwb3NpdC4KCS8vCglFbmRFeHRlcm5hbEluY2VudGl2ZShfIGludCwgcmxtIHJlYWxtLCB0YXJnZXRQb29sUGF0aCwgaW5jZW50aXZlSWQgc3RyaW5nLCByZWZ1bmRBZGRyZXNzIGFkZHJlc3MpCgoJLy8gQ2FuY2VsRXh0ZXJuYWxJbmNlbnRpdmUgcmVtb3ZlcyBhbiBleHRlcm5hbCBpbmNlbnRpdmUgYmVmb3JlIGl0IHN0YXJ0cyBhbmQKCS8vIHJlZnVuZHMgdGhlIGF2YWlsYWJsZSBmdW5kZWQgYW1vdW50cyB0byBpdHMgY3JlYXRvci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbXBsZW1lbnRhdGlvbiBmb3J3YXJkaW5nOyBwcm94eSBtZXRob2RzIHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBzdGFrZXIgcHJveHkgKDAsIGN1ciwgLi4uKS4KCS8vICAgLSB0YXJnZXRQb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBjb250YWluaW5nIHRoZSBpbmNlbnRpdmUuCgkvLyAgIC0gaW5jZW50aXZlSWQ6IFVuaXF1ZSBleHRlcm5hbCBpbmNlbnRpdmUgaWRlbnRpZmllciB0byBjYW5jZWwuCgkvLwoJQ2FuY2VsRXh0ZXJuYWxJbmNlbnRpdmUoXyBpbnQsIHJsbSByZWFsbSwgdGFyZ2V0UG9vbFBhdGgsIGluY2VudGl2ZUlkIHN0cmluZykKCgkvLyBDb2xsZWN0RXh0ZXJuYWxJbmNlbnRpdmVQZW5hbHR5IHRyYW5zZmVycyBhY2N1bXVsYXRlZCB3YXJtLXVwIHBlbmFsdGllcwoJLy8gZnJvbSBhbiBlbmRlZCBleHRlcm5hbCBpbmNlbnRpdmUgdG8gdGhlIHJlcXVlc3RlZCBhZGRyZXNzLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yIGltcGxlbWVudGF0aW9uIGZvcndhcmRpbmc7IHByb3h5IG1ldGhvZHMgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIHN0YWtlciBwcm94eSAoMCwgY3VyLCAuLi4pLgoJLy8gICAtIHRhcmdldFBvb2xQYXRoOiBDYW5vbmljYWwgcG9vbCBwYXRoIGNvbnRhaW5pbmcgdGhlIGluY2VudGl2ZS4KCS8vICAgLSBpbmNlbnRpdmVJZDogRW5kZWQgZXh0ZXJuYWwgaW5jZW50aXZlIGlkZW50aWZpZXIgd2hvc2UgcGVuYWx0aWVzIGFyZSBjb2xsZWN0ZWQuCgkvLyAgIC0gcmVmdW5kQWRkcmVzczogQWRkcmVzcyByZWNlaXZpbmcgdGhlIGNvbGxlY3RlZCByZXdhcmQtdG9rZW4gcGVuYWx0eS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHBlbmFsdHlBbW91bnQ6IEFtb3VudCBhY3R1YWxseSB0cmFuc2ZlcnJlZCwgY2FwcGVkIGJ5IHRoZSBzdGFrZXIncyBhdmFpbGFibGUgYmFsYW5jZSBhbmQgemVybyB3aGVuIG5vIHBlbmFsdHkgaXMgYWNjcnVlZC4KCS8vCglDb2xsZWN0RXh0ZXJuYWxJbmNlbnRpdmVQZW5hbHR5KF8gaW50LCBybG0gcmVhbG0sIHRhcmdldFBvb2xQYXRoLCBpbmNlbnRpdmVJZCBzdHJpbmcsIHJlZnVuZEFkZHJlc3MgYWRkcmVzcykgaW50NjQKCgkvLyBBZGRUb2tlbiBhZGRzIGEgcmVnaXN0ZXJlZCBub24tZGVmYXVsdCB0b2tlbiBwYXRoIHRvIHRoZSBleHRlcm5hbC1pbmNlbnRpdmUgYWxsb3dsaXN0LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yIGltcGxlbWVudGF0aW9uIGZvcndhcmRpbmc7IHByb3h5IG1ldGhvZHMgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIHN0YWtlciBwcm94eSAoMCwgY3VyLCAuLi4pLgoJLy8gICAtIHRva2VuUGF0aDogUmVnaXN0ZXJlZCB0b2tlbiBjb250cmFjdCBwYXRoIHRvIGFsbG93IGZvciBuZXcgZXh0ZXJuYWwgaW5jZW50aXZlcy4KCS8vCglBZGRUb2tlbihfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nKQoKCS8vIFJlbW92ZVRva2VuIHJlbW92ZXMgYSBub24tZGVmYXVsdCB0b2tlbiBwYXRoIGZyb20gdGhlIGV4dGVybmFsLWluY2VudGl2ZSBhbGxvd2xpc3QuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBMZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgaW1wbGVtZW50YXRpb24gZm9yd2FyZGluZzsgcHJveHkgbWV0aG9kcyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBDdXJyZW50IHJlYWxtIGNvbnRleHQgZm9yd2FyZGVkIHVuY2hhbmdlZCBieSB0aGUgc3Rha2VyIHByb3h5ICgwLCBjdXIsIC4uLikuCgkvLyAgIC0gdG9rZW5QYXRoOiBBbGxvd2VkIHRva2VuIGNvbnRyYWN0IHBhdGggdG8gcmVtb3ZlIGZyb20gZnV0dXJlIGluY2VudGl2ZSBjcmVhdGlvbi4KCS8vCglSZW1vdmVUb2tlbihfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nKQoKCS8vIFNldERlbmllZFJld2FyZFRva2VuIHNldHMgb3IgY2xlYXJzIHRoZSBvcGVyYXRpb25hbCBkZW55IGZsYWcgZm9yIGEgcmV3YXJkIHRva2VuLgoJLy8gVGhlIGZsYWcgcHJldmVudHMgbmV3IGluY2VudGl2ZXMgd2hpbGUgbGVhdmluZyBhbHJlYWR5LWNyZWF0ZWQgaW5jZW50aXZlcyBjb2xsZWN0aWJsZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbXBsZW1lbnRhdGlvbiBmb3J3YXJkaW5nOyBwcm94eSBtZXRob2RzIHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBzdGFrZXIgcHJveHkgKDAsIGN1ciwgLi4uKS4KCS8vICAgLSB0b2tlblBhdGg6IFJld2FyZC10b2tlbiBjb250cmFjdCBwYXRoIHdob3NlIGRlbnkgZmxhZyBpcyBiZWluZyBjaGFuZ2VkLgoJLy8gICAtIGRlbmllZDogdHJ1ZSB0byBkZW55IG5ldyBpbmNlbnRpdmVzIGZvciB0aGUgdG9rZW4sIG9yIGZhbHNlIHRvIHJlbW92ZSB0aGUgZGVuaWFsLgoJLy8KCVNldERlbmllZFJld2FyZFRva2VuKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcsIGRlbmllZCBib29sKQoKCS8vIFNldFdhcm1VcCBjaGFuZ2VzIHRoZSBkdXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggb25lIG9mIHRoZSBmaXhlZCB3YXJtLXVwIHJhdGlvcy4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbXBsZW1lbnRhdGlvbiBmb3J3YXJkaW5nOyBwcm94eSBtZXRob2RzIHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBzdGFrZXIgcHJveHkgKDAsIGN1ciwgLi4uKS4KCS8vICAgLSBwY3Q6IFdhcm0tdXAgY29tcGxldGlvbiByYXRpbyBzZWxlY3Rvcjsgc3VwcG9ydGVkIHZhbHVlcyBhcmUgMzAsIDUwLCA3MCwgYW5kIDEwMC4KCS8vICAgLSB0aW1lRHVyYXRpb246IFdhcm0tdXAgZHVyYXRpb24gaW4gc2Vjb25kcyBmb3IgdGhlIHNlbGVjdGVkIHJhdGlvOyBmaW5pdGUgdGllcnMgYXJlIGJvdW5kZWQgYnkgMzY1IGRheXMuCgkvLwoJU2V0V2FybVVwKF8gaW50LCBybG0gcmVhbG0sIHBjdCwgdGltZUR1cmF0aW9uIGludDY0KQoKCS8vIFNldERlcG9zaXRHbnNBbW91bnQgdXBkYXRlcyB0aGUgR05TIGRlcG9zaXQgcmVxdWlyZWQgd2hlbiBjcmVhdGluZyBhbiBleHRlcm5hbCBpbmNlbnRpdmUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBMZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgaW1wbGVtZW50YXRpb24gZm9yd2FyZGluZzsgcHJveHkgbWV0aG9kcyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBDdXJyZW50IHJlYWxtIGNvbnRleHQgZm9yd2FyZGVkIHVuY2hhbmdlZCBieSB0aGUgc3Rha2VyIHByb3h5ICgwLCBjdXIsIC4uLikuCgkvLyAgIC0gYW1vdW50OiBOb25uZWdhdGl2ZSBHTlMgYW1vdW50IHJlcXVpcmVkIGFzIGVhY2ggZXh0ZXJuYWwtaW5jZW50aXZlIGRlcG9zaXQuCgkvLwoJU2V0RGVwb3NpdEduc0Ftb3VudChfIGludCwgcmxtIHJlYWxtLCBhbW91bnQgaW50NjQpCgoJLy8gU2V0TWluaW11bVJld2FyZEFtb3VudCB1cGRhdGVzIHRoZSBkZWZhdWx0IG1pbmltdW0gcmV3YXJkIGFtb3VudCBmb3IgZXh0ZXJuYWwgaW5jZW50aXZlcy4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbXBsZW1lbnRhdGlvbiBmb3J3YXJkaW5nOyBwcm94eSBtZXRob2RzIHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBzdGFrZXIgcHJveHkgKDAsIGN1ciwgLi4uKS4KCS8vICAgLSBhbW91bnQ6IE5vbm5lZ2F0aXZlIHJld2FyZC10b2tlbiBhbW91bnQgdXNlZCB3aGVuIG5vIHRva2VuLXNwZWNpZmljIG1pbmltdW0gZXhpc3RzLgoJLy8KCVNldE1pbmltdW1SZXdhcmRBbW91bnQoXyBpbnQsIHJsbSByZWFsbSwgYW1vdW50IGludDY0KQoKCS8vIFNldFRva2VuTWluaW11bVJld2FyZEFtb3VudCBzZXRzIG9yIHJlbW92ZXMgYSB0b2tlbi1zcGVjaWZpYyBleHRlcm5hbC1pbmNlbnRpdmUgbWluaW11bS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbXBsZW1lbnRhdGlvbiBmb3J3YXJkaW5nOyBwcm94eSBtZXRob2RzIHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBzdGFrZXIgcHJveHkgKDAsIGN1ciwgLi4uKS4KCS8vICAgLSBwYXJhbXNTdHI6IENvbG9uLWRlbGltaXRlZCB0b2tlblBhdGg6YW1vdW50IHN0cmluZzsgYW1vdW50IDAgcmVtb3ZlcyB0aGF0IHRva2VuJ3Mgb3ZlcnJpZGUuCgkvLwoJU2V0VG9rZW5NaW5pbXVtUmV3YXJkQW1vdW50KF8gaW50LCBybG0gcmVhbG0sIHBhcmFtc1N0ciBzdHJpbmcpCgoJLy8gU2V0VW5TdGFraW5nRmVlIHVwZGF0ZXMgdGhlIGZlZSBjaGFyZ2VkIGFnYWluc3QgY29sbGVjdGVkIHN0YWtpbmcgcmV3YXJkcy4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbXBsZW1lbnRhdGlvbiBmb3J3YXJkaW5nOyBwcm94eSBtZXRob2RzIHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBzdGFrZXIgcHJveHkgKDAsIGN1ciwgLi4uKS4KCS8vICAgLSBmZWU6IFVuc3Rha2luZyBmZWUgcmF0ZSBpbiBiYXNpcyBwb2ludHMsIHdoZXJlIDEwLDAwMCBiYXNpcyBwb2ludHMgcmVwcmVzZW50cyAxMDAlLgoJLy8KCVNldFVuU3Rha2luZ0ZlZShfIGludCwgcmxtIHJlYWxtLCBmZWUgdWludDY0KQp9Cgp0eXBlIElTdGFrZXJHZXR0ZXIgaW50ZXJmYWNlIHsKCS8vIEdldFBvb2wgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwb29sIGZvciBhIGNhbm9uaWNhbCBwb29sIHBhdGguCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHRva2VuMDp0b2tlbjE6ZmVlIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBwb29sOiBQb2ludGVyIHRvIHRoZSByZWdpc3RlcmVkIHBvb2w7IG5pbCB3aGVuIGxvb2t1cCBmYWlscy4KCS8vICAgLSBlcnI6IE5pbCBvbiBzdWNjZXNzLCBvciBhbiBlcnJvciB3aGVuIHRoZSBwb29sIGlzIGFic2VudCBvciBjYW5ub3QgYmUgZGVjb2RlZC4KCS8vCglHZXRQb29sKHBvb2xQYXRoIHN0cmluZykgKCpQb29sLCBlcnJvcikKCgkvLyBHZXRQb29sUmV3YXJkQ2FjaGVzIGV4cG9zZXMgYSByZWFkLW9ubHkgdHJlZSBvZiBhIHBvb2wncyByZXdhcmQtY2FjaGUgc25hcHNob3RzLAoJLy8ga2V5ZWQgYnkgZW5jb2RlZCBibG9jayB0aW1lc3RhbXBzLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggd2hvc2UgcmV3YXJkIGNhY2hlIGlzIHJlcXVlc3RlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHJld2FyZENhY2hlczogUmVhZC1vbmx5IHJld2FyZC1jYWNoZSB0cmVlLCBvciBuaWwgd2hlbiB0aGUgcG9vbCBkb2VzIG5vdCBleGlzdC4KCS8vCglHZXRQb29sUmV3YXJkQ2FjaGVzKHBvb2xQYXRoIHN0cmluZykgKnJvdHJlZS5SZWFkT25seVRyZWUKCgkvLyBHZXRQb29sSW5jZW50aXZlcyBleHBvc2VzIGEgcmVhZC1vbmx5IHRyZWUgb2YgYSBwb29sJ3MgZXh0ZXJuYWwgaW5jZW50aXZlcywKCS8vIGtleWVkIGJ5IGluY2VudGl2ZSBpZGVudGlmaWVyLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggd2hvc2UgaW5jZW50aXZlcyBhcmUgcmVxdWVzdGVkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW5jZW50aXZlczogUmVhZC1vbmx5IGV4dGVybmFsLWluY2VudGl2ZSB0cmVlLCBvciBuaWwgd2hlbiB0aGUgcG9vbCBkb2VzIG5vdCBleGlzdC4KCS8vCglHZXRQb29sSW5jZW50aXZlcyhwb29sUGF0aCBzdHJpbmcpICpyb3RyZWUuUmVhZE9ubHlUcmVlCgoJLy8gR2V0UG9vbEdsb2JhbFJld2FyZFJhdGlvQWNjdW11bGF0aW9ucyBleHBvc2VzIGEgcmVhZC1vbmx5IHRyZWUgb2YgZ2xvYmFsCgkvLyByZXdhcmQtcmF0aW8gc25hcHNob3RzIGtleWVkIGJ5IGVuY29kZWQgYmxvY2sgdGltZXN0YW1wcy4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcG9vbCBwYXRoIHdob3NlIGdsb2JhbCBhY2N1bXVsYXRpb25zIGFyZSByZXF1ZXN0ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhY2N1bXVsYXRpb25zOiBSZWFkLW9ubHkgZ2xvYmFsIHJld2FyZC1yYXRpbyB0cmVlLCBvciBuaWwgd2hlbiB0aGUgcG9vbCBkb2VzIG5vdCBleGlzdC4KCS8vCglHZXRQb29sR2xvYmFsUmV3YXJkUmF0aW9BY2N1bXVsYXRpb25zKHBvb2xQYXRoIHN0cmluZykgKnJvdHJlZS5SZWFkT25seVRyZWUKCgkvLyBHZXRQb29sSGlzdG9yaWNhbFRpY2tzIGV4cG9zZXMgYSByZWFkLW9ubHkgdHJlZSBvZiBoaXN0b3JpY2FsIHBvb2wgdGlja3MKCS8vIGtleWVkIGJ5IGVuY29kZWQgYmxvY2sgdGltZXN0YW1wcy4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcG9vbCBwYXRoIHdob3NlIGhpc3RvcmljYWwgdGlja3MgYXJlIHJlcXVlc3RlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGhpc3RvcmljYWxUaWNrczogUmVhZC1vbmx5IGhpc3RvcmljYWwtdGljayB0cmVlLCBvciBuaWwgd2hlbiB0aGUgcG9vbCBkb2VzIG5vdCBleGlzdC4KCS8vCglHZXRQb29sSGlzdG9yaWNhbFRpY2tzKHBvb2xQYXRoIHN0cmluZykgKnJvdHJlZS5SZWFkT25seVRyZWUKCgkvLyBHZXREZXBvc2l0IHJldHVybnMgdGhlIHN0YWtlciBkZXBvc2l0IGFzc29jaWF0ZWQgd2l0aCBhbiBMUCBwb3NpdGlvbiBORlQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBscFRva2VuSWQ6IExQIHBvc2l0aW9uIE5GVCBpZGVudGlmaWVyIHVzZWQgYXMgdGhlIGRlcG9zaXQga2V5LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZGVwb3NpdDogU3RvcmVkIGRlcG9zaXQgZm9yIHRoZSBwb3NpdGlvbjsgbmlsIHdoZW4gbG9va3VwIGZhaWxzLgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gbm8gZGVwb3NpdCBleGlzdHMgZm9yIHRoZSBpZGVudGlmaWVyLgoJLy8KCUdldERlcG9zaXQobHBUb2tlbklkIHVpbnQ2NCkgKCpEZXBvc2l0LCBlcnJvcikKCgkvLyBDb2xsZWN0YWJsZUVtaXNzaW9uUmV3YXJkIGNhbGN1bGF0ZXMgdGhlIGN1cnJlbnRseSBjbGFpbWFibGUgaW50ZXJuYWwgR05TCgkvLyBlbWlzc2lvbiB3aXRob3V0IG11dGF0aW5nIHRoZSBwb3NpdGlvbi4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvc2l0aW9uSWQ6IExQIHBvc2l0aW9uIGlkZW50aWZpZXIgZm9yIGEgbGl2ZSBkZXBvc2l0IG9yIGV4aXQgY2hlY2twb2ludC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHJld2FyZDogQ2xhaW1hYmxlIGludGVybmFsIEdOUyBhbW91bnQgYXQgdGhlIGN1cnJlbnQgY2hhaW4gdGltZSBhbmQgaGVpZ2h0LgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIHBvc2l0aW9uIGlzIG5laXRoZXIgc3Rha2VkIG5vciBjaGVja3BvaW50ZWQgb3IgY2FsY3VsYXRpb24gZmFpbHMuCgkvLwoJQ29sbGVjdGFibGVFbWlzc2lvblJld2FyZChwb3NpdGlvbklkIHVpbnQ2NCkgKGludDY0LCBlcnJvcikKCgkvLyBDb2xsZWN0YWJsZUV4dGVybmFsSW5jZW50aXZlUmV3YXJkIGNhbGN1bGF0ZXMgdGhlIGN1cnJlbnRseSBjbGFpbWFibGUgYW1vdW50CgkvLyBmb3Igb25lIGV4dGVybmFsIGluY2VudGl2ZSB3aXRob3V0IG11dGF0aW5nIHRoZSBwb3NpdGlvbi4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvc2l0aW9uSWQ6IExQIHBvc2l0aW9uIGlkZW50aWZpZXIgZm9yIGEgbGl2ZSBkZXBvc2l0IG9yIGV4aXQgY2hlY2twb2ludC4KCS8vICAgLSBpbmNlbnRpdmVJZDogRXh0ZXJuYWwgaW5jZW50aXZlIGlkZW50aWZpZXIgd2hvc2UgcmV3YXJkIGlzIHF1ZXJpZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSByZXdhcmQ6IENsYWltYWJsZSBncm9zcyByZXdhcmQtdG9rZW4gYW1vdW50LCBvciB6ZXJvIHdoZW4gdGhhdCBpbmNlbnRpdmUgY29udHJpYnV0ZXMgbm8gcmV3YXJkLgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIHBvc2l0aW9uIG9yIHJld2FyZCBjYWxjdWxhdGlvbiBpcyBpbnZhbGlkLgoJLy8KCUNvbGxlY3RhYmxlRXh0ZXJuYWxJbmNlbnRpdmVSZXdhcmQocG9zaXRpb25JZCB1aW50NjQsIGluY2VudGl2ZUlkIHN0cmluZykgKGludDY0LCBlcnJvcikKCgkvLyBHZXRDcmVhdGVkSGVpZ2h0T2ZJbmNlbnRpdmUgcmV0dXJucyB0aGUgY2hhaW4gaGVpZ2h0IHJlY29yZGVkIHdoZW4gYW4gaW5jZW50aXZlIHdhcyBjcmVhdGVkLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCBjb250YWluaW5nIHRoZSBpbmNlbnRpdmUuCgkvLyAgIC0gaW5jZW50aXZlSWQ6IEV4dGVybmFsIGluY2VudGl2ZSBpZGVudGlmaWVyIHRvIGluc3BlY3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBjcmVhdGVkSGVpZ2h0OiBDaGFpbiBoZWlnaHQgcGVyc2lzdGVkIGF0IGluY2VudGl2ZSBjcmVhdGlvbi4KCS8vICAgLSBlcnI6IE5pbCBvbiBzdWNjZXNzLCBvciBhbiBlcnJvciB3aGVuIHRoZSBwb29sIG9yIGluY2VudGl2ZSBkb2VzIG5vdCBleGlzdC4KCS8vCglHZXRDcmVhdGVkSGVpZ2h0T2ZJbmNlbnRpdmUocG9vbFBhdGggc3RyaW5nLCBpbmNlbnRpdmVJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpCgoJLy8gR2V0SW5jZW50aXZlQ3JlYXRlZFRpbWVzdGFtcCByZXR1cm5zIHRoZSBVbml4LXNlY29uZCBjcmVhdGlvbiB0aW1lIG9mIGFuIGluY2VudGl2ZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBQb29sIHBhdGggY29udGFpbmluZyB0aGUgaW5jZW50aXZlLgoJLy8gICAtIGluY2VudGl2ZUlkOiBFeHRlcm5hbCBpbmNlbnRpdmUgaWRlbnRpZmllciB0byBpbnNwZWN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gY3JlYXRlZFRpbWVzdGFtcDogVW5peC1zZWNvbmQgdGltZXN0YW1wIHJlY29yZGVkIGF0IGNyZWF0aW9uLgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIHBvb2wgb3IgaW5jZW50aXZlIGRvZXMgbm90IGV4aXN0LgoJLy8KCUdldEluY2VudGl2ZUNyZWF0ZWRUaW1lc3RhbXAocG9vbFBhdGggc3RyaW5nLCBpbmNlbnRpdmVJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpCgoJLy8gR2V0SW5jZW50aXZlVG90YWxSZXdhcmRBbW91bnQgcmV0dXJucyB0aGUgYW1vdW50IG9yaWdpbmFsbHkgZnVuZGVkIGZvciBhbiBpbmNlbnRpdmUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIGNvbnRhaW5pbmcgdGhlIGluY2VudGl2ZS4KCS8vICAgLSBpbmNlbnRpdmVJZDogRXh0ZXJuYWwgaW5jZW50aXZlIGlkZW50aWZpZXIgdG8gaW5zcGVjdC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHRvdGFsUmV3YXJkQW1vdW50OiBPcmlnaW5hbCByZXdhcmQtdG9rZW4gYW1vdW50IGZ1bmRlZCBhdCBjcmVhdGlvbi4KCS8vICAgLSBlcnI6IE5pbCBvbiBzdWNjZXNzLCBvciBhbiBlcnJvciB3aGVuIHRoZSBwb29sIG9yIGluY2VudGl2ZSBkb2VzIG5vdCBleGlzdC4KCS8vCglHZXRJbmNlbnRpdmVUb3RhbFJld2FyZEFtb3VudChwb29sUGF0aCBzdHJpbmcsIGluY2VudGl2ZUlkIHN0cmluZykgKGludDY0LCBlcnJvcikKCgkvLyBHZXRJbmNlbnRpdmVEaXN0cmlidXRlZFJld2FyZEFtb3VudCByZXR1cm5zIHRoZSByZXdhcmQgYW1vdW50IGFscmVhZHkKCS8vIGRpc3RyaWJ1dGVkIHRvIHBvc2l0aW9ucyBvciByZWZ1bmRlZCB3aGVuIHRoZSBpbmNlbnRpdmUgZW5kZWQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIGNvbnRhaW5pbmcgdGhlIGluY2VudGl2ZS4KCS8vICAgLSBpbmNlbnRpdmVJZDogRXh0ZXJuYWwgaW5jZW50aXZlIGlkZW50aWZpZXIgdG8gaW5zcGVjdC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGRpc3RyaWJ1dGVkUmV3YXJkQW1vdW50OiBDdW11bGF0aXZlIGRpc3RyaWJ1dGVkIG9yIHJlZnVuZGVkIHJld2FyZC10b2tlbiBhbW91bnQuCgkvLyAgIC0gZXJyOiBOaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgcG9vbCBvciBpbmNlbnRpdmUgZG9lcyBub3QgZXhpc3QuCgkvLwoJR2V0SW5jZW50aXZlRGlzdHJpYnV0ZWRSZXdhcmRBbW91bnQocG9vbFBhdGggc3RyaW5nLCBpbmNlbnRpdmVJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpCgoJLy8gR2V0SW5jZW50aXZlUmVtYWluaW5nUmV3YXJkQW1vdW50IHJldHVybnMgdGhlIGN1cnJlbnQgdW5kaXN0cmlidXRlZCByZXdhcmQgYmFsYW5jZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBQb29sIHBhdGggY29udGFpbmluZyB0aGUgaW5jZW50aXZlLgoJLy8gICAtIGluY2VudGl2ZUlkOiBFeHRlcm5hbCBpbmNlbnRpdmUgaWRlbnRpZmllciB0byBpbnNwZWN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gcmVtYWluaW5nUmV3YXJkQW1vdW50OiBSZXdhcmQtdG9rZW4gYW1vdW50IHN0aWxsIGhlbGQgZm9yIGZ1dHVyZSBkaXN0cmlidXRpb24gb3IgcmVmdW5kLgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIHBvb2wgb3IgaW5jZW50aXZlIGRvZXMgbm90IGV4aXN0LgoJLy8KCUdldEluY2VudGl2ZVJlbWFpbmluZ1Jld2FyZEFtb3VudChwb29sUGF0aCBzdHJpbmcsIGluY2VudGl2ZUlkIHN0cmluZykgKGludDY0LCBlcnJvcikKCgkvLyBHZXRJbmNlbnRpdmVBY2N1bXVsYXRlZFBlbmFsdHlBbW91bnQgcmV0dXJucyB3YXJtLXVwIHBlbmFsdGllcyBhY2N1bXVsYXRlZAoJLy8gZnJvbSBjb2xsZWN0aW9ucyBmb3IgYW4gaW5jZW50aXZlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCBjb250YWluaW5nIHRoZSBpbmNlbnRpdmUuCgkvLyAgIC0gaW5jZW50aXZlSWQ6IEV4dGVybmFsIGluY2VudGl2ZSBpZGVudGlmaWVyIHRvIGluc3BlY3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBwZW5hbHR5QW1vdW50OiBSZXdhcmQtdG9rZW4gcGVuYWx0eSBhbW91bnQgYWNjdW11bGF0ZWQgZm9yIGxhdGVyIGNvbGxlY3Rpb24uCgkvLyAgIC0gZXJyOiBOaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgcG9vbCBvciBpbmNlbnRpdmUgZG9lcyBub3QgZXhpc3QuCgkvLwoJR2V0SW5jZW50aXZlQWNjdW11bGF0ZWRQZW5hbHR5QW1vdW50KHBvb2xQYXRoIHN0cmluZywgaW5jZW50aXZlSWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKQoKCS8vIEdldEluY2VudGl2ZURlcG9zaXRHbnNBbW91bnQgcmV0dXJucyB0aGUgR05TIGRlcG9zaXQgbG9ja2VkIGJ5IGFuIGluY2VudGl2ZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBQb29sIHBhdGggY29udGFpbmluZyB0aGUgaW5jZW50aXZlLgoJLy8gICAtIGluY2VudGl2ZUlkOiBFeHRlcm5hbCBpbmNlbnRpdmUgaWRlbnRpZmllciB0byBpbnNwZWN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZGVwb3NpdEduc0Ftb3VudDogR05TIGFtb3VudCBkZXBvc2l0ZWQgYXMgdGhlIGluY2VudGl2ZSdzIGNvbGxhdGVyYWwuCgkvLyAgIC0gZXJyOiBOaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgcG9vbCBvciBpbmNlbnRpdmUgZG9lcyBub3QgZXhpc3QuCgkvLwoJR2V0SW5jZW50aXZlRGVwb3NpdEduc0Ftb3VudChwb29sUGF0aCBzdHJpbmcsIGluY2VudGl2ZUlkIHN0cmluZykgKGludDY0LCBlcnJvcikKCgkvLyBHZXRJbmNlbnRpdmVSZWZ1bmRlZCByZXBvcnRzIHdoZXRoZXIgdGhlIGluY2VudGl2ZSBoYXMgYmVlbiBmaW5hbGl6ZWQgYW5kIHJlZnVuZGVkLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCBjb250YWluaW5nIHRoZSBpbmNlbnRpdmUuCgkvLyAgIC0gaW5jZW50aXZlSWQ6IEV4dGVybmFsIGluY2VudGl2ZSBpZGVudGlmaWVyIHRvIGluc3BlY3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSByZWZ1bmRlZDogVHJ1ZSBhZnRlciBFbmRFeHRlcm5hbEluY2VudGl2ZSBoYXMgbWFya2VkIHRoZSBpbmNlbnRpdmUgcmVmdW5kZWQ7IGZhbHNlIG90aGVyd2lzZS4KCS8vICAgLSBlcnI6IE5pbCBvbiBzdWNjZXNzLCBvciBhbiBlcnJvciB3aGVuIHRoZSBwb29sIG9yIGluY2VudGl2ZSBkb2VzIG5vdCBleGlzdC4KCS8vCglHZXRJbmNlbnRpdmVSZWZ1bmRlZChwb29sUGF0aCBzdHJpbmcsIGluY2VudGl2ZUlkIHN0cmluZykgKGJvb2wsIGVycm9yKQoKCS8vIElzSW5jZW50aXZlQWN0aXZlIHJlcG9ydHMgd2hldGhlciBhbiB1bnJlZnVuZGVkIGluY2VudGl2ZSBpcyB3aXRoaW4gaXRzCgkvLyBpbmNsdXNpdmUgc3RhcnQvZW5kIFVuaXgtc2Vjb25kIGludGVydmFsIGF0IHRoZSBjdXJyZW50IHRpbWUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIGNvbnRhaW5pbmcgdGhlIGluY2VudGl2ZS4KCS8vICAgLSBpbmNlbnRpdmVJZDogRXh0ZXJuYWwgaW5jZW50aXZlIGlkZW50aWZpZXIgdG8gaW5zcGVjdC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGFjdGl2ZTogVHJ1ZSBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgdGltZSBpcyBiZXR3ZWVuIHRoZSBpbmNlbnRpdmUgYm91bmRzIGFuZCBpdCBpcyBub3QgcmVmdW5kZWQuCgkvLyAgIC0gZXJyOiBOaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgcG9vbCBvciBpbmNlbnRpdmUgZG9lcyBub3QgZXhpc3QuCgkvLwoJSXNJbmNlbnRpdmVBY3RpdmUocG9vbFBhdGggc3RyaW5nLCBpbmNlbnRpdmVJZCBzdHJpbmcpIChib29sLCBlcnJvcikKCgkvLyBHZXREZXBvc2l0RXh0ZXJuYWxSZXdhcmRMYXN0Q29sbGVjdFRpbWVzdGFtcCByZXR1cm5zIHRoZSBsYXN0IGNvbGxlY3Rpb24KCS8vIHRpbWVzdGFtcCBmb3Igb25lIGRlcG9zaXQvaW5jZW50aXZlIHBhaXIuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBscFRva2VuSWQ6IExQIHBvc2l0aW9uIE5GVCBpZGVudGlmaWVyIG93bmluZyB0aGUgZXh0ZXJuYWwgcmV3YXJkIGN1cnNvci4KCS8vICAgLSBpbmNlbnRpdmVJZDogRXh0ZXJuYWwgaW5jZW50aXZlIGlkZW50aWZpZXIgd2hvc2UgY3Vyc29yIGlzIHJlcXVlc3RlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHRpbWVzdGFtcDogVW5peC1zZWNvbmQgY3Vyc29yLCBmYWxsaW5nIGJhY2sgdG8gc3Rha2UgdGltZSB3aGVuIHRoZSBpbmNlbnRpdmUgaGFzIG5ldmVyIGJlZW4gY29sbGVjdGVkLgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIGRlcG9zaXQgZG9lcyBub3QgZXhpc3QuCgkvLwoJR2V0RGVwb3NpdEV4dGVybmFsUmV3YXJkTGFzdENvbGxlY3RUaW1lc3RhbXAobHBUb2tlbklkIHVpbnQ2NCwgaW5jZW50aXZlSWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKQoKCS8vIEdldERlcG9zaXRHbnNBbW91bnQgcmV0dXJucyB0aGUgY29uZmlndXJlZCBHTlMgZGVwb3NpdCByZXF1aXJlZCBwZXIgZXh0ZXJuYWwgaW5jZW50aXZlLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYW1vdW50OiBDdXJyZW50IHJlcXVpcmVkIEdOUyBkZXBvc2l0IGluIHRva2VuIHVuaXRzLgoJLy8KCUdldERlcG9zaXRHbnNBbW91bnQoKSBpbnQ2NAoKCS8vIEdldERlcG9zaXRJbnRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZXN0YW1wIHJldHVybnMgdGhlIHN0b3JlZCBpbnRlcm5hbAoJLy8gcmV3YXJkIGNvbGxlY3Rpb24gY3Vyc29yIGZvciBhIGRlcG9zaXQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBscFRva2VuSWQ6IExQIHBvc2l0aW9uIE5GVCBpZGVudGlmaWVyIG93bmluZyB0aGUgaW50ZXJuYWwgcmV3YXJkIGN1cnNvci4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHRpbWVzdGFtcDogVW5peC1zZWNvbmQgY3Vyc29yLCB3aGljaCBpcyB6ZXJvIGJlZm9yZSB0aGUgZmlyc3QgaW50ZXJuYWwgY29sbGVjdGlvbi4KCS8vICAgLSBlcnI6IE5pbCBvbiBzdWNjZXNzLCBvciBhbiBlcnJvciB3aGVuIHRoZSBkZXBvc2l0IGRvZXMgbm90IGV4aXN0LgoJLy8KCUdldERlcG9zaXRJbnRlcm5hbFJld2FyZExhc3RDb2xsZWN0VGltZXN0YW1wKGxwVG9rZW5JZCB1aW50NjQpIChpbnQ2NCwgZXJyb3IpCgoJLy8gR2V0RGVwb3NpdENvbGxlY3RlZEludGVybmFsUmV3YXJkIHJldHVybnMgY3VtdWxhdGl2ZSBpbnRlcm5hbCByZXdhcmQgcmVjb3JkZWQgZm9yIGEgZGVwb3NpdC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIGxwVG9rZW5JZDogTFAgcG9zaXRpb24gTkZUIGlkZW50aWZpZXIgd2hvc2UgY29sbGVjdGlvbiB0b3RhbCBpcyByZXF1ZXN0ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnQ6IEN1bXVsYXRpdmUgR05TIGFtb3VudCByZWNvcmRlZCBhcyBjb2xsZWN0ZWQgZm9yIHRoZSBkZXBvc2l0LgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIGRlcG9zaXQgZG9lcyBub3QgZXhpc3QuCgkvLwoJR2V0RGVwb3NpdENvbGxlY3RlZEludGVybmFsUmV3YXJkKGxwVG9rZW5JZCB1aW50NjQpIChpbnQ2NCwgZXJyb3IpCgoJLy8gR2V0RGVwb3NpdENvbGxlY3RlZEV4dGVybmFsUmV3YXJkIHJldHVybnMgdGhlIGN1bXVsYXRpdmUgYW1vdW50IHJlY29yZGVkCgkvLyBmb3Igb25lIGRlcG9zaXQvaW5jZW50aXZlIHBhaXIuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBscFRva2VuSWQ6IExQIHBvc2l0aW9uIE5GVCBpZGVudGlmaWVyIHdob3NlIGNvbGxlY3Rpb24gdG90YWwgaXMgcmVxdWVzdGVkLgoJLy8gICAtIGluY2VudGl2ZUlkOiBFeHRlcm5hbCBpbmNlbnRpdmUgaWRlbnRpZmllciBmb3IgdGhlIGNvbGxlY3Rpb24gdG90YWwuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnQ6IEN1bXVsYXRpdmUgZ3Jvc3MgcmV3YXJkLXRva2VuIGFtb3VudCByZWNvcmRlZCBmb3IgdGhhdCBpbmNlbnRpdmUuCgkvLyAgIC0gZXJyOiBOaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgZGVwb3NpdCBkb2VzIG5vdCBleGlzdC4KCS8vCglHZXREZXBvc2l0Q29sbGVjdGVkRXh0ZXJuYWxSZXdhcmQobHBUb2tlbklkIHVpbnQ2NCwgaW5jZW50aXZlSWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKQoKCS8vIEdldERlcG9zaXRMaXF1aWRpdHkgcmV0dXJucyB0aGUgZnVsbC1wcmVjaXNpb24gbGlxdWlkaXR5IGFzc2lnbmVkIHRvIGEgZGVwb3NpdC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIGxwVG9rZW5JZDogTFAgcG9zaXRpb24gTkZUIGlkZW50aWZpZXIgd2hvc2UgbGlxdWlkaXR5IGlzIHJlcXVlc3RlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGxpcXVpZGl0eTogMjU2LWJpdCBsaXF1aWRpdHkgdmFsdWUgc3RvcmVkIGluIHRoZSBkZXBvc2l0LgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIGRlcG9zaXQgZG9lcyBub3QgZXhpc3QuCgkvLwoJR2V0RGVwb3NpdExpcXVpZGl0eShscFRva2VuSWQgdWludDY0KSAoKnUyNTYuVWludCwgZXJyb3IpCgoJLy8gR2V0RGVwb3NpdExpcXVpZGl0eUFzU3RyaW5nIHJldHVybnMgdGhlIGRlY2ltYWwgc3RyaW5nIGZvcm0gb2YgYSBkZXBvc2l0J3MgbGlxdWlkaXR5LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gbHBUb2tlbklkOiBMUCBwb3NpdGlvbiBORlQgaWRlbnRpZmllciB3aG9zZSBsaXF1aWRpdHkgaXMgcmVxdWVzdGVkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gbGlxdWlkaXR5OiBEZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdG9yZWQgMjU2LWJpdCBsaXF1aWRpdHkuCgkvLyAgIC0gZXJyOiBOaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgZGVwb3NpdCBkb2VzIG5vdCBleGlzdC4KCS8vCglHZXREZXBvc2l0TGlxdWlkaXR5QXNTdHJpbmcobHBUb2tlbklkIHVpbnQ2NCkgKHN0cmluZywgZXJyb3IpCgoJLy8gR2V0RGVwb3NpdE93bmVyIHJldHVybnMgdGhlIGFkZHJlc3MgcmVjb3JkZWQgYXMgb3duZXIgb2YgYSBkZXBvc2l0LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gbHBUb2tlbklkOiBMUCBwb3NpdGlvbiBORlQgaWRlbnRpZmllciB3aG9zZSBvd25lciBpcyByZXF1ZXN0ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBvd25lcjogQWRkcmVzcyByZWNvcmRlZCB3aGVuIHRoZSBwb3NpdGlvbiB3YXMgc3Rha2VkLgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIGRlcG9zaXQgZG9lcyBub3QgZXhpc3QuCgkvLwoJR2V0RGVwb3NpdE93bmVyKGxwVG9rZW5JZCB1aW50NjQpIChhZGRyZXNzLCBlcnJvcikKCgkvLyBHZXREZXBvc2l0U3Rha2VUaW1lIHJldHVybnMgdGhlIFVuaXgtc2Vjb25kIHRpbWVzdGFtcCB3aGVuIGEgcG9zaXRpb24gd2FzIHN0YWtlZC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIGxwVG9rZW5JZDogTFAgcG9zaXRpb24gTkZUIGlkZW50aWZpZXIgd2hvc2Ugc3Rha2UgdGltZSBpcyByZXF1ZXN0ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBzdGFrZVRpbWU6IFVuaXgtc2Vjb25kIHRpbWVzdGFtcCBzdG9yZWQgaW4gdGhlIGRlcG9zaXQuCgkvLyAgIC0gZXJyOiBOaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgZGVwb3NpdCBkb2VzIG5vdCBleGlzdC4KCS8vCglHZXREZXBvc2l0U3Rha2VUaW1lKGxwVG9rZW5JZCB1aW50NjQpIChpbnQ2NCwgZXJyb3IpCgoJLy8gR2V0RGVwb3NpdFRhcmdldFBvb2xQYXRoIHJldHVybnMgdGhlIHBvb2wgcGF0aCByZWNvcmRlZCBmb3IgYSBkZXBvc2l0LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gbHBUb2tlbklkOiBMUCBwb3NpdGlvbiBORlQgaWRlbnRpZmllciB3aG9zZSB0YXJnZXQgcG9vbCBpcyByZXF1ZXN0ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHRhcmdldCBwb29sIHBhdGggcmVjb3JkZWQgaW4gdGhlIGRlcG9zaXQuCgkvLyAgIC0gZXJyOiBOaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgZGVwb3NpdCBkb2VzIG5vdCBleGlzdC4KCS8vCglHZXREZXBvc2l0VGFyZ2V0UG9vbFBhdGgobHBUb2tlbklkIHVpbnQ2NCkgKHN0cmluZywgZXJyb3IpCgoJLy8gR2V0RGVwb3NpdFRpY2tMb3dlciByZXR1cm5zIHRoZSBsb3dlciBjb25jZW50cmF0ZWQtbGlxdWlkaXR5IHRpY2sgb2YgYSBkZXBvc2l0LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gbHBUb2tlbklkOiBMUCBwb3NpdGlvbiBORlQgaWRlbnRpZmllciB3aG9zZSBsb3dlciB0aWNrIGlzIHJlcXVlc3RlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHRpY2tMb3dlcjogU2lnbmVkIGxvd2VyIHRpY2sgc3RvcmVkIGluIHRoZSBkZXBvc2l0LgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIGRlcG9zaXQgZG9lcyBub3QgZXhpc3QuCgkvLwoJR2V0RGVwb3NpdFRpY2tMb3dlcihscFRva2VuSWQgdWludDY0KSAoaW50MzIsIGVycm9yKQoKCS8vIEdldERlcG9zaXRUaWNrVXBwZXIgcmV0dXJucyB0aGUgdXBwZXIgY29uY2VudHJhdGVkLWxpcXVpZGl0eSB0aWNrIG9mIGEgZGVwb3NpdC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIGxwVG9rZW5JZDogTFAgcG9zaXRpb24gTkZUIGlkZW50aWZpZXIgd2hvc2UgdXBwZXIgdGljayBpcyByZXF1ZXN0ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0aWNrVXBwZXI6IFNpZ25lZCB1cHBlciB0aWNrIHN0b3JlZCBpbiB0aGUgZGVwb3NpdC4KCS8vICAgLSBlcnI6IE5pbCBvbiBzdWNjZXNzLCBvciBhbiBlcnJvciB3aGVuIHRoZSBkZXBvc2l0IGRvZXMgbm90IGV4aXN0LgoJLy8KCUdldERlcG9zaXRUaWNrVXBwZXIobHBUb2tlbklkIHVpbnQ2NCkgKGludDMyLCBlcnJvcikKCgkvLyBHZXREZXBvc2l0V2FybVVwIHJldHVybnMgdGhlIHdhcm0tdXAgcmVjb3JkcyBjdXJyZW50bHkgYXR0YWNoZWQgdG8gYSBkZXBvc2l0LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gbHBUb2tlbklkOiBMUCBwb3NpdGlvbiBORlQgaWRlbnRpZmllciB3aG9zZSB3YXJtLXVwIHJlY29yZHMgYXJlIHJlcXVlc3RlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHdhcm11cHM6IFdhcm0tdXAgc2NoZWR1bGUgZW50cmllcyBzdG9yZWQgZm9yIHRoZSBkZXBvc2l0LgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIGRlcG9zaXQgZG9lcyBub3QgZXhpc3QuCgkvLwoJR2V0RGVwb3NpdFdhcm1VcChscFRva2VuSWQgdWludDY0KSAoW11XYXJtdXAsIGVycm9yKQoKCS8vIEdldERlcG9zaXRFeHRlcm5hbEluY2VudGl2ZUlkTGlzdCByZXR1cm5zIGV4dGVybmFsIGluY2VudGl2ZSBpZGVudGlmaWVycwoJLy8gY3VycmVudGx5IHRyYWNrZWQgYnkgYSBkZXBvc2l0LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gbHBUb2tlbklkOiBMUCBwb3NpdGlvbiBORlQgaWRlbnRpZmllciB3aG9zZSBpbmNlbnRpdmUgaW5kZXggaXMgcmVxdWVzdGVkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW5jZW50aXZlSWRzOiBFeHRlcm5hbCBpbmNlbnRpdmUgSURzIGF0dGFjaGVkIHRvIHRoZSBkZXBvc2l0LgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIGRlcG9zaXQgZG9lcyBub3QgZXhpc3QuCgkvLwoJR2V0RGVwb3NpdEV4dGVybmFsSW5jZW50aXZlSWRMaXN0KGxwVG9rZW5JZCB1aW50NjQpIChbXXN0cmluZywgZXJyb3IpCgoJLy8gR2V0RXh0ZXJuYWxJbmNlbnRpdmVCeVBvb2xQYXRoIHJldHVybnMgYWxsIHN0b3JlZCBleHRlcm5hbCBpbmNlbnRpdmVzIHRhcmdldGluZyBhIHBvb2wuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCB1c2VkIHRvIGZpbHRlciBpbmNlbnRpdmUgcmVjb3Jkcy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGluY2VudGl2ZXM6IE1hdGNoaW5nIGV4dGVybmFsIGluY2VudGl2ZSByZWNvcmRzLCBwb3NzaWJseSBhbiBlbXB0eSBzbGljZS4KCS8vICAgLSBlcnI6IE5pbCBvbiBzdWNjZXNzLCBvciBhbiBlcnJvciB3aGVuIGEgc3RvcmVkIHJlY29yZCBoYXMgYW4gaW52YWxpZCB0eXBlLgoJLy8KCUdldEV4dGVybmFsSW5jZW50aXZlQnlQb29sUGF0aChwb29sUGF0aCBzdHJpbmcpIChbXUV4dGVybmFsSW5jZW50aXZlLCBlcnJvcikKCgkvLyBHZXRJbmNlbnRpdmVFbmRUaW1lc3RhbXAgcmV0dXJucyB0aGUgVW5peC1zZWNvbmQgZW5kIHRpbWUgb2YgYW4gaW5jZW50aXZlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCBjb250YWluaW5nIHRoZSBpbmNlbnRpdmUuCgkvLyAgIC0gaW5jZW50aXZlSWQ6IEV4dGVybmFsIGluY2VudGl2ZSBpZGVudGlmaWVyIHRvIGluc3BlY3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlbmRUaW1lc3RhbXA6IEluY2x1c2l2ZSBVbml4LXNlY29uZCBlbmQgYm91bmQgcmVjb3JkZWQgZm9yIHRoZSBpbmNlbnRpdmUuCgkvLyAgIC0gZXJyOiBOaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgcG9vbCBvciBpbmNlbnRpdmUgZG9lcyBub3QgZXhpc3QuCgkvLwoJR2V0SW5jZW50aXZlRW5kVGltZXN0YW1wKHBvb2xQYXRoIHN0cmluZywgaW5jZW50aXZlSWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKQoKCS8vIEdldEluY2VudGl2ZUNyZWF0b3IgcmV0dXJucyB0aGUgYWRkcmVzcyB0aGF0IGNyZWF0ZWQgYW5kIGZ1bmRlZCBhbiBpbmNlbnRpdmUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIGNvbnRhaW5pbmcgdGhlIGluY2VudGl2ZS4KCS8vICAgLSBpbmNlbnRpdmVJZDogRXh0ZXJuYWwgaW5jZW50aXZlIGlkZW50aWZpZXIgdG8gaW5zcGVjdC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGNyZWF0b3I6IEFkZHJlc3MgcmVjb3JkZWQgYXMgdGhlIGluY2VudGl2ZSBjcmVhdG9yLgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIHBvb2wgb3IgaW5jZW50aXZlIGRvZXMgbm90IGV4aXN0LgoJLy8KCUdldEluY2VudGl2ZUNyZWF0b3IocG9vbFBhdGggc3RyaW5nLCBpbmNlbnRpdmVJZCBzdHJpbmcpIChhZGRyZXNzLCBlcnJvcikKCgkvLyBHZXRJbmNlbnRpdmVSZXdhcmRBbW91bnQgcmV0dXJucyB0aGUgcmVtYWluaW5nIHJld2FyZCBhbW91bnQgYXMgYSAyNTYtYml0IHVuc2lnbmVkIHZhbHVlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCBjb250YWluaW5nIHRoZSBpbmNlbnRpdmUuCgkvLyAgIC0gaW5jZW50aXZlSWQ6IEV4dGVybmFsIGluY2VudGl2ZSBpZGVudGlmaWVyIHRvIGluc3BlY3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSByZXdhcmRBbW91bnQ6IFJlbWFpbmluZyByZXdhcmQtdG9rZW4gYW1vdW50IHJlcHJlc2VudGVkIGFzIGEgdWludDI1NiB2YWx1ZS4KCS8vICAgLSBlcnI6IE5pbCBvbiBzdWNjZXNzLCBvciBhbiBlcnJvciB3aGVuIHRoZSBwb29sIG9yIGluY2VudGl2ZSBkb2VzIG5vdCBleGlzdC4KCS8vCglHZXRJbmNlbnRpdmVSZXdhcmRBbW91bnQocG9vbFBhdGggc3RyaW5nLCBpbmNlbnRpdmVJZCBzdHJpbmcpICgqdTI1Ni5VaW50LCBlcnJvcikKCgkvLyBHZXRJbmNlbnRpdmVSZXdhcmRBbW91bnRBc1N0cmluZyByZXR1cm5zIHRoZSBkZWNpbWFsIHN0cmluZyBmb3JtIG9mIHRoZSByZW1haW5pbmcgcmV3YXJkLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCBjb250YWluaW5nIHRoZSBpbmNlbnRpdmUuCgkvLyAgIC0gaW5jZW50aXZlSWQ6IEV4dGVybmFsIGluY2VudGl2ZSBpZGVudGlmaWVyIHRvIGluc3BlY3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSByZXdhcmRBbW91bnQ6IERlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlbWFpbmluZyByZXdhcmQtdG9rZW4gYW1vdW50LgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIHBvb2wgb3IgaW5jZW50aXZlIGRvZXMgbm90IGV4aXN0LgoJLy8KCUdldEluY2VudGl2ZVJld2FyZEFtb3VudEFzU3RyaW5nKHBvb2xQYXRoIHN0cmluZywgaW5jZW50aXZlSWQgc3RyaW5nKSAoc3RyaW5nLCBlcnJvcikKCgkvLyBHZXRJbmNlbnRpdmVSZXdhcmRQZXJTZWNvbmRYMTI4IHJldHVybnMgdGhlIFExMjgtc2NhbGVkIHJld2FyZCByYXRlIG9mIGFuIGluY2VudGl2ZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBQb29sIHBhdGggY29udGFpbmluZyB0aGUgaW5jZW50aXZlLgoJLy8gICAtIGluY2VudGl2ZUlkOiBFeHRlcm5hbCBpbmNlbnRpdmUgaWRlbnRpZmllciB0byBpbnNwZWN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gcmV3YXJkUGVyU2Vjb25kWDEyODogUmV3YXJkLXBlci1zZWNvbmQgcmF0ZSBzY2FsZWQgYnkgMl4xMjggdG8gcHJlc2VydmUgcHJlY2lzaW9uLgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIHBvb2wgb3IgaW5jZW50aXZlIGRvZXMgbm90IGV4aXN0LgoJLy8KCUdldEluY2VudGl2ZVJld2FyZFBlclNlY29uZFgxMjgocG9vbFBhdGggc3RyaW5nLCBpbmNlbnRpdmVJZCBzdHJpbmcpICgqdTI1Ni5VaW50LCBlcnJvcikKCgkvLyBHZXRJbmNlbnRpdmVSZXdhcmRUb2tlbiByZXR1cm5zIHRoZSB0b2tlbiBwYXRoIHVzZWQgdG8gcGF5IGFuIGluY2VudGl2ZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBQb29sIHBhdGggY29udGFpbmluZyB0aGUgaW5jZW50aXZlLgoJLy8gICAtIGluY2VudGl2ZUlkOiBFeHRlcm5hbCBpbmNlbnRpdmUgaWRlbnRpZmllciB0byBpbnNwZWN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gcmV3YXJkVG9rZW46IFJlZ2lzdGVyZWQgcmV3YXJkLXRva2VuIGNvbnRyYWN0IHBhdGguCgkvLyAgIC0gZXJyOiBOaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgcG9vbCBvciBpbmNlbnRpdmUgZG9lcyBub3QgZXhpc3QuCgkvLwoJR2V0SW5jZW50aXZlUmV3YXJkVG9rZW4ocG9vbFBhdGggc3RyaW5nLCBpbmNlbnRpdmVJZCBzdHJpbmcpIChzdHJpbmcsIGVycm9yKQoKCS8vIEdldEluY2VudGl2ZVN0YXJ0VGltZXN0YW1wIHJldHVybnMgdGhlIFVuaXgtc2Vjb25kIHN0YXJ0IHRpbWUgb2YgYW4gaW5jZW50aXZlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IFBvb2wgcGF0aCBjb250YWluaW5nIHRoZSBpbmNlbnRpdmUuCgkvLyAgIC0gaW5jZW50aXZlSWQ6IEV4dGVybmFsIGluY2VudGl2ZSBpZGVudGlmaWVyIHRvIGluc3BlY3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBzdGFydFRpbWVzdGFtcDogSW5jbHVzaXZlIFVuaXgtc2Vjb25kIHN0YXJ0IGJvdW5kIHJlY29yZGVkIGZvciB0aGUgaW5jZW50aXZlLgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIHBvb2wgb3IgaW5jZW50aXZlIGRvZXMgbm90IGV4aXN0LgoJLy8KCUdldEluY2VudGl2ZVN0YXJ0VGltZXN0YW1wKHBvb2xQYXRoIHN0cmluZywgaW5jZW50aXZlSWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKQoKCS8vIEdldE1pbmltdW1SZXdhcmRBbW91bnQgcmV0dXJucyB0aGUgZGVmYXVsdCBtaW5pbXVtIHJld2FyZCBhbW91bnQgZm9yIGV4dGVybmFsIGluY2VudGl2ZXMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnQ6IERlZmF1bHQgbWluaW11bSByZXdhcmQtdG9rZW4gYW1vdW50IHVzZWQgd2hlbiBubyB0b2tlbi1zcGVjaWZpYyBvdmVycmlkZSBleGlzdHMuCgkvLwoJR2V0TWluaW11bVJld2FyZEFtb3VudCgpIGludDY0CgoJLy8gR2V0TWluaW11bVJld2FyZEFtb3VudEZvclRva2VuIHJldHVybnMgYSB0b2tlbi1zcGVjaWZpYyBtaW5pbXVtLCBmYWxsaW5nCgkvLyBiYWNrIHRvIHRoZSBkZWZhdWx0IG1pbmltdW0gd2hlbiBubyBvdmVycmlkZSBpcyBjb25maWd1cmVkLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gdG9rZW5QYXRoOiBSZXdhcmQtdG9rZW4gY29udHJhY3QgcGF0aCB3aG9zZSBtaW5pbXVtIGlzIHJlcXVlc3RlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGFtb3VudDogVG9rZW4tc3BlY2lmaWMgbWluaW11bSB3aGVuIGNvbmZpZ3VyZWQsIG90aGVyd2lzZSB0aGUgZGVmYXVsdCBtaW5pbXVtLgoJLy8KCUdldE1pbmltdW1SZXdhcmRBbW91bnRGb3JUb2tlbih0b2tlblBhdGggc3RyaW5nKSBpbnQ2NAoKCS8vIEdldFBvb2xTdGFrZWRMaXF1aWRpdHkgcmV0dXJucyB0aGUgY3VycmVudCB0b3RhbCBzdGFrZWQgbGlxdWlkaXR5IGFzIGEgZGVjaW1hbCBzdHJpbmcuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCB3aG9zZSBhY3RpdmUgc3Rha2VkIGxpcXVpZGl0eSBpcyByZXF1ZXN0ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBsaXF1aWRpdHk6IERlY2ltYWwgc3RyaW5nIGZvciBjdXJyZW50IHN0YWtlZCBsaXF1aWRpdHksIG9yIHplcm8gd2hlbiB0aGUgcG9vbCBoYXMgbm8gdmFsdWUuCgkvLyAgIC0gZXJyOiBOaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgcG9vbCBkb2VzIG5vdCBleGlzdC4KCS8vCglHZXRQb29sU3Rha2VkTGlxdWlkaXR5KHBvb2xQYXRoIHN0cmluZykgKHN0cmluZywgZXJyb3IpCgoJLy8gR2V0UG9vbHNCeVRpZXIgbGlzdHMgcG9vbCBwYXRocyBjdXJyZW50bHkgYXNzaWduZWQgdG8gYW4gaW50ZXJuYWwgZW1pc3Npb24gdGllci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHRpZXI6IFRpZXIgbnVtYmVyIHVzZWQgdG8gZmlsdGVyIHBvb2wgbWVtYmVyc2hpcDsgdGllciB6ZXJvIHJldHVybnMgYW4gZW1wdHkgbGlzdC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHBvb2xQYXRoczogUG9vbCBwYXRocyBhc3NpZ25lZCB0byB0aGUgcmVxdWVzdGVkIHRpZXIuCgkvLyAgIC0gZXJyOiBOaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiBzdG9yZWQgdGllciBtZW1iZXJzaGlwIGNhbm5vdCBiZSBkZWNvZGVkLgoJLy8KCUdldFBvb2xzQnlUaWVyKHRpZXIgdWludDY0KSAoW11zdHJpbmcsIGVycm9yKQoKCS8vIEdldFBvb2xSZXdhcmQgcmV0dXJucyB0aGUgY3VycmVudCBwZXItc2Vjb25kIEdOUyByZXdhcmQgZm9yIGEgdGllci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHRpZXI6IFN1cHBvcnRlZCBub256ZXJvIHRpZXIgd2hvc2UgcmV3YXJkIHJhdGUgaXMgcmVxdWVzdGVkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gcmV3YXJkOiBDdXJyZW50IHRpZXIgcmV3YXJkIGFtb3VudCBwZXIgc2Vjb25kLgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGludmFsaWQtdGllciBlcnJvciBmb3IgemVybyBvciB1bnN1cHBvcnRlZCB0aWVycy4KCS8vCglHZXRQb29sUmV3YXJkKHRpZXIgdWludDY0KSAoaW50NjQsIGVycm9yKQoKCS8vIEdldFBvb2xUaWVyIHJldHVybnMgdGhlIGludGVybmFsIGVtaXNzaW9uIHRpZXIgY3VycmVudGx5IGFzc2lnbmVkIHRvIGEgcG9vbC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcG9vbCBwYXRoIHdob3NlIHRpZXIgaXMgcmVxdWVzdGVkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdGllcjogQXNzaWduZWQgdGllciBudW1iZXI7IHplcm8gZGVub3RlcyBubyBpbnRlcm5hbCBlbWlzc2lvbiB0aWVyLgoJLy8KCUdldFBvb2xUaWVyKHBvb2xQYXRoIHN0cmluZykgdWludDY0CgoJLy8gR2V0UG9vbFRpZXJDb3VudCByZXR1cm5zIHRoZSBudW1iZXIgb2YgcG9vbHMgYXNzaWduZWQgdG8gYSB0aWVyLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gdGllcjogVGllciBudW1iZXIgd2hvc2UgbWVtYmVyc2hpcCBjb3VudCBpcyByZXF1ZXN0ZWQ7IHRpZXIgemVybyBoYXMgY291bnQgemVyby4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGNvdW50OiBDdXJyZW50IG51bWJlciBvZiBwb29scyBpbiB0aGUgcmVxdWVzdGVkIHRpZXIuCgkvLwoJR2V0UG9vbFRpZXJDb3VudCh0aWVyIHVpbnQ2NCkgdWludDY0CgoJLy8gR2V0UG9vbFRpZXJSYXRpbyByZXR1cm5zIHRoZSByZXdhcmQgcmF0aW8gY29uZmlndXJlZCBmb3IgYSBwb29sJ3MgY3VycmVudCB0aWVyLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggd2hvc2UgY3VycmVudCB0aWVyIHJhdGlvIGlzIHJlcXVlc3RlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHJhdGlvOiBDdXJyZW50IHJld2FyZCByYXRpbyBmb3IgdGhlIHBvb2wncyBhc3NpZ25lZCB0aWVyLgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGludmFsaWQtdGllciBlcnJvciB3aGVuIHRoZSB0aWVyIGhhcyBubyByYXRpby4KCS8vCglHZXRQb29sVGllclJhdGlvKHBvb2xQYXRoIHN0cmluZykgKHVpbnQ2NCwgZXJyb3IpCgoJLy8gR2V0U3BlY2lmaWNUb2tlbk1pbmltdW1SZXdhcmRBbW91bnQgbG9va3MgdXAgb25seSBhbiBleHBsaWNpdGx5IGNvbmZpZ3VyZWQKCS8vIHRva2VuLXNwZWNpZmljIG1pbmltdW0gYW5kIGRvZXMgbm90IGFwcGx5IHRoZSBkZWZhdWx0IGZhbGxiYWNrLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gdG9rZW5QYXRoOiBSZXdhcmQtdG9rZW4gY29udHJhY3QgcGF0aCB3aG9zZSBvdmVycmlkZSBpcyByZXF1ZXN0ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnQ6IENvbmZpZ3VyZWQgdG9rZW4tc3BlY2lmaWMgbWluaW11bSwgb3IgemVybyB3aGVuIGFic2VudC4KCS8vICAgLSBmb3VuZDogVHJ1ZSB3aGVuIGFuIGV4cGxpY2l0IG92ZXJyaWRlIGV4aXN0czsgZmFsc2Ugd2hlbiB0aGUgZGVmYXVsdCBzaG91bGQgYmUgdXNlZC4KCS8vCglHZXRTcGVjaWZpY1Rva2VuTWluaW11bVJld2FyZEFtb3VudCh0b2tlblBhdGggc3RyaW5nKSAoaW50NjQsIGJvb2wpCgoJLy8gR2V0VGFyZ2V0UG9vbFBhdGhCeUluY2VudGl2ZUlkIHJldHVybnMgdGhlIHBvb2wgcGF0aCB0YXJnZXRlZCBieSBhbiBpbmNlbnRpdmUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogUG9vbCBwYXRoIGNvbnRhaW5pbmcgdGhlIGluY2VudGl2ZSByZWNvcmQuCgkvLyAgIC0gaW5jZW50aXZlSWQ6IEV4dGVybmFsIGluY2VudGl2ZSBpZGVudGlmaWVyIHRvIGluc3BlY3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0YXJnZXRQb29sUGF0aDogUG9vbCBwYXRoIHJlY29yZGVkIGFzIHRoZSBpbmNlbnRpdmUgdGFyZ2V0LgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIHBvb2wgb3IgaW5jZW50aXZlIGRvZXMgbm90IGV4aXN0LgoJLy8KCUdldFRhcmdldFBvb2xQYXRoQnlJbmNlbnRpdmVJZChwb29sUGF0aCBzdHJpbmcsIGluY2VudGl2ZUlkIHN0cmluZykgKHN0cmluZywgZXJyb3IpCgoJLy8gR2V0VW5zdGFraW5nRmVlIHJldHVybnMgdGhlIGN1cnJlbnQgcmV3YXJkIGZlZSByYXRlIGluIGJhc2lzIHBvaW50cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGZlZTogQ3VycmVudCB1bnN0YWtpbmcgZmVlLCB3aGVyZSAxMCwwMDAgYmFzaXMgcG9pbnRzIHJlcHJlc2VudHMgMTAwJS4KCS8vCglHZXRVbnN0YWtpbmdGZWUoKSB1aW50NjQKCgkvLyBHZXRQZW5kaW5nUHJvdG9jb2xGZWVzIHJldHVybnMgcGVuZGluZyBwcm90b2NvbC1mZWUgYW1vdW50cyBrZXllZCBieSB0b2tlbiBwYXRoLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZmVlczogTWFwIGZyb20gcmV3YXJkLXRva2VuIHBhdGggdG8gYW1vdW50IGF3YWl0aW5nIHByb3RvY29sLWZlZSBzZXR0bGVtZW50LgoJLy8KCUdldFBlbmRpbmdQcm90b2NvbEZlZXMoKSBtYXBbc3RyaW5nXWludDY0CgoJLy8gSGFzVW5zdGFrZWRQb3NpdGlvbiByZXBvcnRzIHdoZXRoZXIgYW4gZXhpdCBjaGVja3BvaW50IHdpdGggdW5jb2xsZWN0ZWQKCS8vIHJld2FyZHMgZXhpc3RzIGZvciBhIHBvc2l0aW9uLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9zaXRpb25JZDogTFAgcG9zaXRpb24gaWRlbnRpZmllciB3aG9zZSBleGl0IGNoZWNrcG9pbnQgaXMgcXVlcmllZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIGFuIHVuY29sbGVjdGVkIGV4aXQgY2hlY2twb2ludCBpcyBwcmVzZW50LgoJLy8KCUhhc1Vuc3Rha2VkUG9zaXRpb24ocG9zaXRpb25JZCB1aW50NjQpIGJvb2wKCgkvLyBHZXRVbnN0YWtlZFBvc2l0aW9uRXhpdFRpbWUgcmV0dXJucyB3aGVuIGFuIGV4aXQgY2hlY2twb2ludCBzdG9wcGVkIGFjY3J1aW5nIHJld2FyZHMuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb3NpdGlvbklkOiBMUCBwb3NpdGlvbiBpZGVudGlmaWVyIHdob3NlIGNoZWNrcG9pbnQgaXMgcmVxdWVzdGVkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXhpdFRpbWU6IFVuaXgtc2Vjb25kIHRpbWVzdGFtcCBhdCB3aGljaCB0aGUgcG9zaXRpb24gd2FzIHVuc3Rha2VkLgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gbm8gdW5jb2xsZWN0ZWQgY2hlY2twb2ludCBleGlzdHMuCgkvLwoJR2V0VW5zdGFrZWRQb3NpdGlvbkV4aXRUaW1lKHBvc2l0aW9uSWQgdWludDY0KSAoaW50NjQsIGVycm9yKQoKCS8vIEdldFVuc3Rha2VkUG9zaXRpb25QZW5kaW5nSW5jZW50aXZlcyByZXR1cm5zIGV4dGVybmFsIGluY2VudGl2ZSBJRHMgc3RpbGwKCS8vIG93ZWQgYnkgYW4gZXhpdCBjaGVja3BvaW50LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9zaXRpb25JZDogTFAgcG9zaXRpb24gaWRlbnRpZmllciB3aG9zZSBjaGVja3BvaW50IGlzIHJlcXVlc3RlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGluY2VudGl2ZUlkczogRXh0ZXJuYWwgaW5jZW50aXZlIElEcyBwZW5kaW5nIGNvbGxlY3Rpb24gZm9yIHRoZSBjaGVja3BvaW50LgoJLy8gICAtIGVycjogTmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gbm8gdW5jb2xsZWN0ZWQgY2hlY2twb2ludCBleGlzdHMuCgkvLwoJR2V0VW5zdGFrZWRQb3NpdGlvblBlbmRpbmdJbmNlbnRpdmVzKHBvc2l0aW9uSWQgdWludDY0KSAoW11zdHJpbmcsIGVycm9yKQoKCS8vIEdldFVuY29sbGVjdGVkSW5jZW50aXZlQ291bnQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGV4aXQgY2hlY2twb2ludHMgc3RpbGwKCS8vIGNhcnJ5aW5nIGFuIHVuY29sbGVjdGVkIGNsYWltIGZvciBhbiBpbmNlbnRpdmUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBpbmNlbnRpdmVJZDogRXh0ZXJuYWwgaW5jZW50aXZlIGlkZW50aWZpZXIgd2hvc2UgY2hlY2twb2ludCBjb3VudCBpcyByZXF1ZXN0ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBjb3VudDogTnVtYmVyIG9mIHVuY29sbGVjdGVkIGV4aXQtcG9zaXRpb24gY2xhaW1zIGZvciB0aGUgaW5jZW50aXZlLgoJLy8KCUdldFVuY29sbGVjdGVkSW5jZW50aXZlQ291bnQoaW5jZW50aXZlSWQgc3RyaW5nKSBpbnQ2NAoKCS8vIElzU3Rha2VkIHJlcG9ydHMgd2hldGhlciBhIGxpdmUgZGVwb3NpdCBleGlzdHMgZm9yIGEgcG9zaXRpb24uCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb3NpdGlvbklkOiBMUCBwb3NpdGlvbiBpZGVudGlmaWVyIHRvIHF1ZXJ5LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gc3Rha2VkOiBUcnVlIHdoZW4gdGhlIHBvc2l0aW9uIGlzIHByZXNlbnQgaW4gYWN0aXZlIGRlcG9zaXRzLgoJLy8KCUlzU3Rha2VkKHBvc2l0aW9uSWQgdWludDY0KSBib29sCgoJLy8gR2V0VG90YWxFbWlzc2lvblNlbnQgcmV0dXJucyBjdW11bGF0aXZlIEdOUyBlbWlzc2lvbiBzZW50IG9yIGFjY291bnRlZCBmb3IuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnQ6IEN1bXVsYXRpdmUgaW50ZXJuYWwgR05TIGVtaXNzaW9uIGFtb3VudCByZWNvcmRlZCBieSB0aGUgc3Rha2VyLgoJLy8KCUdldFRvdGFsRW1pc3Npb25TZW50KCkgaW50NjQKCgkvLyBHZXRBbGxvd2VkVG9rZW5zIHJldHVybnMgdG9rZW4gcGF0aHMgYXBwcm92ZWQgZm9yIG5ldyBleHRlcm5hbCBpbmNlbnRpdmVzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdG9rZW5QYXRoczogUmVnaXN0ZXJlZCBleHRlcm5hbC1pbmNlbnRpdmUgdG9rZW4gcGF0aHMgY3VycmVudGx5IGFsbG93ZWQuCgkvLwoJR2V0QWxsb3dlZFRva2VucygpIFtdc3RyaW5nCgoJLy8gR2V0RGVuaWVkUmV3YXJkVG9rZW5zIHJldHVybnMgdG9rZW4gcGF0aHMgZGVuaWVkIGZvciBuZXcgZXh0ZXJuYWwgaW5jZW50aXZlcy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHRva2VuUGF0aHM6IFJld2FyZC10b2tlbiBwYXRocyBvbiB0aGUgb3BlcmF0aW9uYWwgZGVueSBsaXN0LgoJLy8KCUdldERlbmllZFJld2FyZFRva2VucygpIFtdc3RyaW5nCgoJLy8gR2V0V2FybXVwVGVtcGxhdGUgcmV0dXJucyB0aGUgY3VycmVudCB3YXJtLXVwIHNjaGVkdWxlIHVzZWQgZm9yIG5ldyBkZXBvc2l0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHdhcm11cHM6IE9yZGVyZWQgd2FybS11cCBlbnRyaWVzIGRlZmluaW5nIHJld2FyZC1yZWxlYXNlIHJhdGlvcyBhbmQgZHVyYXRpb25zLgoJLy8KCUdldFdhcm11cFRlbXBsYXRlKCkgW11XYXJtdXAKfQoKdHlwZSBJU3Rha2VyU3RvcmUgaW50ZXJmYWNlIHsKCS8vIEhhc0RlcG9zaXRHbnNBbW91bnRTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIGNvbmZpZ3VyZWQgR05TLWRlcG9zaXQga2V5IGV4aXN0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIHRoZSBkZXBvc2l0R25zQW1vdW50IGtleSBpcyBwcmVzZW50IGluIHBlcnNpc3RlbnQgc3RvcmFnZS4KCS8vCglIYXNEZXBvc2l0R25zQW1vdW50U3RvcmVLZXkoKSBib29sCgoJLy8gR2V0RGVwb3NpdEduc0Ftb3VudCByZXR1cm5zIHRoZSBzdG9yZWQgR05TIGRlcG9zaXQgcmVxdWlyZWQgcGVyIGV4dGVybmFsIGluY2VudGl2ZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGFtb3VudDogUGVyc2lzdGVkIEdOUyBhbW91bnQgaW4gdG9rZW4gdW5pdHM7IHN0b3JhZ2UgcmVhZCBvciB0eXBlIGZhaWx1cmVzIHBhbmljLgoJLy8KCUdldERlcG9zaXRHbnNBbW91bnQoKSBpbnQ2NAoKCS8vIFNldERlcG9zaXRHbnNBbW91bnQgcGVyc2lzdHMgdGhlIEdOUyBkZXBvc2l0IHJlcXVpcmVkIHBlciBleHRlcm5hbCBpbmNlbnRpdmUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBMZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgaW50ZXJuYWwgc3RvcmUgZm9yd2FyZGluZzsgY2FsbGVycyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBQcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dDsgYSBub24tY3VycmVudCByZWFsbSBpcyByZWplY3RlZCBiZWZvcmUgd3JpdGluZy4KCS8vICAgLSBhbW91bnQ6IEdOUyBhbW91bnQgaW4gdG9rZW4gdW5pdHMgdG8gcGVyc2lzdC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogTmlsIHdoZW4gc3RvcmVkLCBFcnJTcG9vZmVkUmVhbG0gZm9yIGEgbm9uLWN1cnJlbnQgcmVhbG0sIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yLgoJLy8KCVNldERlcG9zaXRHbnNBbW91bnQoXyBpbnQsIHJsbSByZWFsbSwgYW1vdW50IGludDY0KSBlcnJvcgoKCS8vIEhhc01pbmltdW1SZXdhcmRBbW91bnRTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIGRlZmF1bHQgbWluaW11bS1yZXdhcmQga2V5IGV4aXN0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIHRoZSBtaW5pbXVtUmV3YXJkQW1vdW50IGtleSBpcyBwcmVzZW50IGluIHBlcnNpc3RlbnQgc3RvcmFnZS4KCS8vCglIYXNNaW5pbXVtUmV3YXJkQW1vdW50U3RvcmVLZXkoKSBib29sCgoJLy8gR2V0TWluaW11bVJld2FyZEFtb3VudCByZXR1cm5zIHRoZSBkZWZhdWx0IG1pbmltdW0gZXh0ZXJuYWwtaW5jZW50aXZlIHJld2FyZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGFtb3VudDogUGVyc2lzdGVkIGRlZmF1bHQgcmV3YXJkLXRva2VuIG1pbmltdW07IHN0b3JhZ2UgcmVhZCBvciB0eXBlIGZhaWx1cmVzIHBhbmljLgoJLy8KCUdldE1pbmltdW1SZXdhcmRBbW91bnQoKSBpbnQ2NAoKCS8vIFNldE1pbmltdW1SZXdhcmRBbW91bnQgcGVyc2lzdHMgdGhlIGRlZmF1bHQgbWluaW11bSBleHRlcm5hbC1pbmNlbnRpdmUgcmV3YXJkLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yIGludGVybmFsIHN0b3JlIGZvcndhcmRpbmc7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGEgbm9uLWN1cnJlbnQgcmVhbG0gaXMgcmVqZWN0ZWQgYmVmb3JlIHdyaXRpbmcuCgkvLyAgIC0gYW1vdW50OiBEZWZhdWx0IG1pbmltdW0gcmV3YXJkLXRva2VuIGFtb3VudCBpbiB0b2tlbiB1bml0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogTmlsIHdoZW4gc3RvcmVkLCBFcnJTcG9vZmVkUmVhbG0gZm9yIGEgbm9uLWN1cnJlbnQgcmVhbG0sIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yLgoJLy8KCVNldE1pbmltdW1SZXdhcmRBbW91bnQoXyBpbnQsIHJsbSByZWFsbSwgYW1vdW50IGludDY0KSBlcnJvcgoKCS8vIEhhc0RlcG9zaXRzU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBhY3RpdmUtZGVwb3NpdHMgdHJlZSBrZXkgZXhpc3RzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXhpc3RzOiBUcnVlIHdoZW4gdGhlIGRlcG9zaXRzIGtleSBpcyBwcmVzZW50IGluIHBlcnNpc3RlbnQgc3RvcmFnZS4KCS8vCglIYXNEZXBvc2l0c1N0b3JlS2V5KCkgYm9vbAoKCS8vIEdldERlcG9zaXRzIHJldHVybnMgdGhlIHBlcnNpc3RlZCBhY3RpdmUgcG9zaXRpb24tZGVwb3NpdCB0cmVlLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZGVwb3NpdHM6IEIrdHJlZSBtYXBwaW5nIExQIHBvc2l0aW9uIElEcyB0byBkZXBvc2l0czsgc3RvcmFnZSByZWFkIG9yIHR5cGUgZmFpbHVyZXMgcGFuaWMuCgkvLwoJR2V0RGVwb3NpdHMoKSAqYnB0cmVlLkJQVHJlZQoKCS8vIFNldERlcG9zaXRzIHBlcnNpc3RzIHRoZSBhY3RpdmUgcG9zaXRpb24tZGVwb3NpdCB0cmVlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yIGludGVybmFsIHN0b3JlIGZvcndhcmRpbmc7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGEgbm9uLWN1cnJlbnQgcmVhbG0gaXMgcmVqZWN0ZWQgYmVmb3JlIHdyaXRpbmcuCgkvLyAgIC0gZGVwb3NpdHM6IEIrdHJlZSBjb250YWluaW5nIGFjdGl2ZSBwb3NpdGlvbiBkZXBvc2l0cyB0byBwZXJzaXN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBOaWwgd2hlbiBzdG9yZWQsIEVyclNwb29mZWRSZWFsbSBmb3IgYSBub24tY3VycmVudCByZWFsbSwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCgkvLwoJU2V0RGVwb3NpdHMoXyBpbnQsIHJsbSByZWFsbSwgZGVwb3NpdHMgKmJwdHJlZS5CUFRyZWUpIGVycm9yCgoJLy8gSGFzRXh0ZXJuYWxJbmNlbnRpdmVzU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBleHRlcm5hbC1pbmNlbnRpdmVzIHRyZWUga2V5IGV4aXN0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIHRoZSBleHRlcm5hbEluY2VudGl2ZXMga2V5IGlzIHByZXNlbnQgaW4gcGVyc2lzdGVudCBzdG9yYWdlLgoJLy8KCUhhc0V4dGVybmFsSW5jZW50aXZlc1N0b3JlS2V5KCkgYm9vbAoKCS8vIEdldEV4dGVybmFsSW5jZW50aXZlcyByZXR1cm5zIHRoZSBwZXJzaXN0ZWQgZXh0ZXJuYWwtaW5jZW50aXZlIHRyZWUuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBpbmNlbnRpdmVzOiBCK3RyZWUgbWFwcGluZyBpbmNlbnRpdmUgSURzIHRvIGluY2VudGl2ZSByZWNvcmRzOyBzdG9yYWdlIHJlYWQgb3IgdHlwZSBmYWlsdXJlcyBwYW5pYy4KCS8vCglHZXRFeHRlcm5hbEluY2VudGl2ZXMoKSAqYnB0cmVlLkJQVHJlZQoKCS8vIFNldEV4dGVybmFsSW5jZW50aXZlcyBwZXJzaXN0cyB0aGUgZXh0ZXJuYWwtaW5jZW50aXZlIHRyZWUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBMZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgaW50ZXJuYWwgc3RvcmUgZm9yd2FyZGluZzsgY2FsbGVycyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBQcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dDsgYSBub24tY3VycmVudCByZWFsbSBpcyByZWplY3RlZCBiZWZvcmUgd3JpdGluZy4KCS8vICAgLSBpbmNlbnRpdmVzOiBCK3RyZWUgY29udGFpbmluZyBleHRlcm5hbC1pbmNlbnRpdmUgcmVjb3JkcyB0byBwZXJzaXN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBOaWwgd2hlbiBzdG9yZWQsIEVyclNwb29mZWRSZWFsbSBmb3IgYSBub24tY3VycmVudCByZWFsbSwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCgkvLwoJU2V0RXh0ZXJuYWxJbmNlbnRpdmVzKF8gaW50LCBybG0gcmVhbG0sIGluY2VudGl2ZXMgKmJwdHJlZS5CUFRyZWUpIGVycm9yCgoJLy8gSGFzVG90YWxFbWlzc2lvblNlbnRTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIGN1bXVsYXRpdmUtZW1pc3Npb24ga2V5IGV4aXN0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIHRoZSB0b3RhbEVtaXNzaW9uU2VudCBrZXkgaXMgcHJlc2VudCBpbiBwZXJzaXN0ZW50IHN0b3JhZ2UuCgkvLwoJSGFzVG90YWxFbWlzc2lvblNlbnRTdG9yZUtleSgpIGJvb2wKCgkvLyBHZXRUb3RhbEVtaXNzaW9uU2VudCByZXR1cm5zIHRoZSBwZXJzaXN0ZWQgY3VtdWxhdGl2ZSBHTlMgZW1pc3Npb24gYW1vdW50LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYW1vdW50OiBDdW11bGF0aXZlIGludGVybmFsIGVtaXNzaW9uIGluIEdOUyB0b2tlbiB1bml0czsgc3RvcmFnZSByZWFkIG9yIHR5cGUgZmFpbHVyZXMgcGFuaWMuCgkvLwoJR2V0VG90YWxFbWlzc2lvblNlbnQoKSBpbnQ2NAoKCS8vIFNldFRvdGFsRW1pc3Npb25TZW50IHBlcnNpc3RzIHRoZSBjdW11bGF0aXZlIEdOUyBlbWlzc2lvbiBhbW91bnQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBMZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgaW50ZXJuYWwgc3RvcmUgZm9yd2FyZGluZzsgY2FsbGVycyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBQcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dDsgYSBub24tY3VycmVudCByZWFsbSBpcyByZWplY3RlZCBiZWZvcmUgd3JpdGluZy4KCS8vICAgLSBhbW91bnQ6IEN1bXVsYXRpdmUgR05TIGFtb3VudCB0byBwZXJzaXN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBOaWwgd2hlbiBzdG9yZWQsIEVyclNwb29mZWRSZWFsbSBmb3IgYSBub24tY3VycmVudCByZWFsbSwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCgkvLwoJU2V0VG90YWxFbWlzc2lvblNlbnQoXyBpbnQsIHJsbSByZWFsbSwgYW1vdW50IGludDY0KSBlcnJvcgoKCS8vIEhhc0FsbG93ZWRUb2tlbnNTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIGV4dGVybmFsLWluY2VudGl2ZSBhbGxvd2xpc3Qga2V5IGV4aXN0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIHRoZSBhbGxvd2VkVG9rZW5zIGtleSBpcyBwcmVzZW50IGluIHBlcnNpc3RlbnQgc3RvcmFnZS4KCS8vCglIYXNBbGxvd2VkVG9rZW5zU3RvcmVLZXkoKSBib29sCgoJLy8gR2V0QWxsb3dlZFRva2VucyByZXR1cm5zIGEgY29weSBvZiB0b2tlbiBwYXRocyBhbGxvd2VkIGZvciBuZXcgaW5jZW50aXZlcy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHRva2VuUGF0aHM6IFN0b3JlLW93bmVkIGFsbG93bGlzdCBjb3BpZWQgaW50byBhIGNhbGxlci1zYWZlIHNsaWNlLgoJLy8KCUdldEFsbG93ZWRUb2tlbnMoKSBbXXN0cmluZwoKCS8vIFNldEFsbG93ZWRUb2tlbnMgcmVwbGFjZXMgdGhlIGV4dGVybmFsLWluY2VudGl2ZSBhbGxvd2xpc3QuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBMZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgaW50ZXJuYWwgc3RvcmUgZm9yd2FyZGluZzsgY2FsbGVycyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBQcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dDsgYSBub24tY3VycmVudCByZWFsbSBpcyByZWplY3RlZCBiZWZvcmUgd3JpdGluZy4KCS8vICAgLSB0b2tlbnM6IFRva2VuIGNvbnRyYWN0IHBhdGhzIHRvIHBlcnNpc3QgYXMgdGhlIG5ldyBhbGxvd2xpc3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IE5pbCB3aGVuIHN0b3JlZCwgRXJyU3Bvb2ZlZFJlYWxtIGZvciBhIG5vbi1jdXJyZW50IHJlYWxtLCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvci4KCS8vCglTZXRBbGxvd2VkVG9rZW5zKF8gaW50LCBybG0gcmVhbG0sIHRva2VucyBbXXN0cmluZykgZXJyb3IKCgkvLyBBZGRBbGxvd2VkVG9rZW4gYWRkcyBhIHRva2VuIHBhdGggdG8gdGhlIGFsbG93bGlzdCB3aGVuIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBMZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgaW50ZXJuYWwgc3RvcmUgZm9yd2FyZGluZzsgY2FsbGVycyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBQcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dDsgYSBub24tY3VycmVudCByZWFsbSBpcyByZWplY3RlZCBiZWZvcmUgd3JpdGluZy4KCS8vICAgLSB0b2tlblBhdGg6IFRva2VuIGNvbnRyYWN0IHBhdGggdG8gYWRkIHRvIHRoZSBhbGxvd2xpc3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IE5pbCB3aGVuIGFkZGVkIG9yIGFscmVhZHkgcHJlc2VudCwgRXJyU3Bvb2ZlZFJlYWxtIGZvciBhIG5vbi1jdXJyZW50IHJlYWxtLCBvciB0aGUgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCgkvLwoJQWRkQWxsb3dlZFRva2VuKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcpIGVycm9yCgoJLy8gUmVtb3ZlQWxsb3dlZFRva2VuIHJlbW92ZXMgYSB0b2tlbiBwYXRoIGZyb20gdGhlIGFsbG93bGlzdCB3aGVuIHByZXNlbnQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBMZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgaW50ZXJuYWwgc3RvcmUgZm9yd2FyZGluZzsgY2FsbGVycyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBQcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dDsgYSBub24tY3VycmVudCByZWFsbSBpcyByZWplY3RlZCBiZWZvcmUgd3JpdGluZy4KCS8vICAgLSB0b2tlblBhdGg6IFRva2VuIGNvbnRyYWN0IHBhdGggdG8gcmVtb3ZlIGZyb20gdGhlIGFsbG93bGlzdC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogTmlsIHdoZW4gcmVtb3ZlZCBvciBhYnNlbnQsIEVyclNwb29mZWRSZWFsbSBmb3IgYSBub24tY3VycmVudCByZWFsbSwgb3IgdGhlIEtWLXN0b3JlIHdyaXRlIGVycm9yLgoJLy8KCVJlbW92ZUFsbG93ZWRUb2tlbihfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nKSBlcnJvcgoKCS8vIEhhc0RlbmllZFJld2FyZFRva2Vuc1N0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgZXh0ZXJuYWwgcmV3YXJkIGRlbnktbGlzdCBrZXkgZXhpc3RzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXhpc3RzOiBUcnVlIHdoZW4gdGhlIGRlbmllZFJld2FyZFRva2VucyBrZXkgaXMgcHJlc2VudCBpbiBwZXJzaXN0ZW50IHN0b3JhZ2UuCgkvLwoJSGFzRGVuaWVkUmV3YXJkVG9rZW5zU3RvcmVLZXkoKSBib29sCgoJLy8gR2V0RGVuaWVkUmV3YXJkVG9rZW5zIHJldHVybnMgYSBjb3B5IG9mIHRva2VuIHBhdGhzIGRlbmllZCBmb3IgbmV3IGluY2VudGl2ZXMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0b2tlblBhdGhzOiBTdG9yZS1vd25lZCBkZW55IGxpc3QgY29waWVkIGZvciBjYWxsZXJzOyBhbiB1bmluaXRpYWxpemVkIGtleSB5aWVsZHMgYW4gZW1wdHkgc2xpY2UuCgkvLwoJR2V0RGVuaWVkUmV3YXJkVG9rZW5zKCkgW11zdHJpbmcKCgkvLyBBZGREZW5pZWRSZXdhcmRUb2tlbiBhZGRzIGEgdG9rZW4gcGF0aCB0byB0aGUgZGVueSBsaXN0IHdoZW4gYWJzZW50LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yIGludGVybmFsIHN0b3JlIGZvcndhcmRpbmc7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGEgbm9uLWN1cnJlbnQgcmVhbG0gaXMgcmVqZWN0ZWQgYmVmb3JlIHdyaXRpbmcuCgkvLyAgIC0gdG9rZW5QYXRoOiBSZXdhcmQtdG9rZW4gY29udHJhY3QgcGF0aCB0byBkZW55IGZvciBuZXcgaW5jZW50aXZlcy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogTmlsIHdoZW4gYWRkZWQgb3IgYWxyZWFkeSBwcmVzZW50LCBFcnJTcG9vZmVkUmVhbG0gZm9yIGEgbm9uLWN1cnJlbnQgcmVhbG0sIG9yIHRoZSBLVi1zdG9yZSB3cml0ZSBlcnJvci4KCS8vCglBZGREZW5pZWRSZXdhcmRUb2tlbihfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nKSBlcnJvcgoKCS8vIFJlbW92ZURlbmllZFJld2FyZFRva2VuIHJlbW92ZXMgYSB0b2tlbiBwYXRoIGZyb20gdGhlIGRlbnkgbGlzdCB3aGVuIHByZXNlbnQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBMZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgaW50ZXJuYWwgc3RvcmUgZm9yd2FyZGluZzsgY2FsbGVycyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBQcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dDsgYSBub24tY3VycmVudCByZWFsbSBpcyByZWplY3RlZCBiZWZvcmUgd3JpdGluZy4KCS8vICAgLSB0b2tlblBhdGg6IFJld2FyZC10b2tlbiBjb250cmFjdCBwYXRoIHRvIGFsbG93IGFnYWluIGZvciBuZXcgaW5jZW50aXZlcy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogTmlsIHdoZW4gcmVtb3ZlZCBvciBhYnNlbnQsIEVyclNwb29mZWRSZWFsbSBmb3IgYSBub24tY3VycmVudCByZWFsbSwgb3IgdGhlIEtWLXN0b3JlIHdyaXRlIGVycm9yLgoJLy8KCVJlbW92ZURlbmllZFJld2FyZFRva2VuKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcpIGVycm9yCgoJLy8gSGFzSW5jZW50aXZlQ291bnRlclN0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgaW5jZW50aXZlLWNvdW50ZXIga2V5IGV4aXN0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIHRoZSBpbmNlbnRpdmVDb3VudGVyIGtleSBpcyBwcmVzZW50IGluIHBlcnNpc3RlbnQgc3RvcmFnZS4KCS8vCglIYXNJbmNlbnRpdmVDb3VudGVyU3RvcmVLZXkoKSBib29sCgoJLy8gR2V0SW5jZW50aXZlQ291bnRlciByZXR1cm5zIHRoZSBwZXJzaXN0ZWQgY291bnRlciB1c2VkIHRvIGFsbG9jYXRlIGluY2VudGl2ZSBJRHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBjb3VudGVyOiBJbmNlbnRpdmUtSUQgY291bnRlciBvYmplY3Q7IHN0b3JhZ2UgcmVhZCBvciB0eXBlIGZhaWx1cmVzIHBhbmljLgoJLy8KCUdldEluY2VudGl2ZUNvdW50ZXIoKSAqQ291bnRlcgoKCS8vIFNldEluY2VudGl2ZUNvdW50ZXIgcGVyc2lzdHMgdGhlIGluY2VudGl2ZS1JRCBjb3VudGVyLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yIGludGVybmFsIHN0b3JlIGZvcndhcmRpbmc7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGEgbm9uLWN1cnJlbnQgcmVhbG0gaXMgcmVqZWN0ZWQgYmVmb3JlIHdyaXRpbmcuCgkvLyAgIC0gY291bnRlcjogQ291bnRlciBvYmplY3Qgd2hvc2UgbmV4dCB2YWx1ZSB3aWxsIGJlIHVzZWQgZm9yIGluY2VudGl2ZSBJRHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IE5pbCB3aGVuIHN0b3JlZCwgRXJyU3Bvb2ZlZFJlYWxtIGZvciBhIG5vbi1jdXJyZW50IHJlYWxtLCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvci4KCS8vCglTZXRJbmNlbnRpdmVDb3VudGVyKF8gaW50LCBybG0gcmVhbG0sIGNvdW50ZXIgKkNvdW50ZXIpIGVycm9yCgoJLy8gTmV4dEluY2VudGl2ZUlEIGNvbnN1bWVzIHRoZSBuZXh0IGNvdW50ZXIgdmFsdWUgYW5kIGZvcm1hdHMgYSB1bmlxdWUgaW5jZW50aXZlIElELgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gY3JlYXRvcjogQWRkcmVzcyB0aGF0IGlzIGNyZWF0aW5nIGFuZCBmdW5kaW5nIHRoZSBpbmNlbnRpdmUuCgkvLyAgIC0gdGltZXN0YW1wOiBVbml4LXNlY29uZCBjcmVhdGlvbiB0aW1lc3RhbXAgZW1iZWRkZWQgaW4gdGhlIGlkZW50aWZpZXIuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBpbmNlbnRpdmVJZDogSWRlbnRpZmllciBjb21iaW5pbmcgY3JlYXRvciwgdGltZXN0YW1wLCBhbmQgdGhlIGluY3JlbWVudGVkIGNvdW50ZXIgaW5kZXguCgkvLwoJTmV4dEluY2VudGl2ZUlEKGNyZWF0b3IgYWRkcmVzcywgdGltZXN0YW1wIGludDY0KSBzdHJpbmcKCgkvLyBIYXNUb2tlblNwZWNpZmljTWluaW11bVJld2FyZHNTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdG9rZW4tc3BlY2lmaWMgbWluaW11bXMgZXhpc3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IFRydWUgd2hlbiB0aGUgdG9rZW5TcGVjaWZpY01pbmltdW1SZXdhcmRzIGtleSBpcyBwcmVzZW50IGluIHBlcnNpc3RlbnQgc3RvcmFnZS4KCS8vCglIYXNUb2tlblNwZWNpZmljTWluaW11bVJld2FyZHNTdG9yZUtleSgpIGJvb2wKCgkvLyBHZXRUb2tlblNwZWNpZmljTWluaW11bVJld2FyZHMgcmV0dXJucyBjb25maWd1cmVkIHRva2VuLXNwZWNpZmljIHJld2FyZCBtaW5pbXVtcy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHJld2FyZHM6IE1hcCBmcm9tIHRva2VuIGNvbnRyYWN0IHBhdGggdG8gbWluaW11bSByZXdhcmQgYW1vdW50OyBzdG9yYWdlIHJlYWQgb3IgdHlwZSBmYWlsdXJlcyBwYW5pYy4KCS8vCglHZXRUb2tlblNwZWNpZmljTWluaW11bVJld2FyZHMoKSBtYXBbc3RyaW5nXWludDY0CgoJLy8gU2V0VG9rZW5TcGVjaWZpY01pbmltdW1SZXdhcmRzIHJlcGxhY2VzIGFsbCB0b2tlbi1zcGVjaWZpYyBtaW5pbXVtcy4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbnRlcm5hbCBzdG9yZSBmb3J3YXJkaW5nOyBjYWxsZXJzIHBhc3MgMC4KCS8vICAgLSBybG06IFByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0OyBhIG5vbi1jdXJyZW50IHJlYWxtIGlzIHJlamVjdGVkIGJlZm9yZSB3cml0aW5nLgoJLy8gICAtIHJld2FyZHM6IFRva2VuLXBhdGgtdG8tbWluaW11bS1hbW91bnQgbWFwcGluZyB0byBwZXJzaXN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBOaWwgd2hlbiBzdG9yZWQsIEVyclNwb29mZWRSZWFsbSBmb3IgYSBub24tY3VycmVudCByZWFsbSwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCgkvLwoJU2V0VG9rZW5TcGVjaWZpY01pbmltdW1SZXdhcmRzKF8gaW50LCBybG0gcmVhbG0sIHJld2FyZHMgbWFwW3N0cmluZ11pbnQ2NCkgZXJyb3IKCgkvLyBTZXRUb2tlblNwZWNpZmljTWluaW11bVJld2FyZEl0ZW0gc2V0cyBvbmUgdG9rZW4ncyBtaW5pbXVtIHJld2FyZCBlbnRyeS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbnRlcm5hbCBzdG9yZSBmb3J3YXJkaW5nOyBjYWxsZXJzIHBhc3MgMC4KCS8vICAgLSBybG06IFByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0OyBhIG5vbi1jdXJyZW50IHJlYWxtIGlzIHJlamVjdGVkIGJlZm9yZSB3cml0aW5nLgoJLy8gICAtIHRva2VuUGF0aDogVG9rZW4gY29udHJhY3QgcGF0aCB3aG9zZSBvdmVycmlkZSBpcyBiZWluZyBzZXQuCgkvLyAgIC0gYW1vdW50OiBUb2tlbi1zcGVjaWZpYyBtaW5pbXVtIHJld2FyZCBhbW91bnQgaW4gdG9rZW4gdW5pdHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IE5pbCB3aGVuIHRoZSBpdGVtIGlzIHN0b3JlZCwgRXJyU3Bvb2ZlZFJlYWxtIGZvciBhIG5vbi1jdXJyZW50IHJlYWxtLCBvciB0aGUgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCgkvLwoJU2V0VG9rZW5TcGVjaWZpY01pbmltdW1SZXdhcmRJdGVtKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcsIGFtb3VudCBpbnQ2NCkgZXJyb3IKCgkvLyBSZW1vdmVUb2tlblNwZWNpZmljTWluaW11bVJld2FyZEl0ZW0gcmVtb3ZlcyBvbmUgdG9rZW4ncyBtaW5pbXVtIHJld2FyZCBlbnRyeS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbnRlcm5hbCBzdG9yZSBmb3J3YXJkaW5nOyBjYWxsZXJzIHBhc3MgMC4KCS8vICAgLSBybG06IFByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0OyBhIG5vbi1jdXJyZW50IHJlYWxtIGlzIHJlamVjdGVkIGJlZm9yZSB3cml0aW5nLgoJLy8gICAtIHRva2VuUGF0aDogVG9rZW4gY29udHJhY3QgcGF0aCB3aG9zZSBvdmVycmlkZSBpcyBiZWluZyByZW1vdmVkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBOaWwgYWZ0ZXIgcmVidWlsZGluZyB0aGUgbWFwcGluZyB3aXRob3V0IHRoZSBpdGVtLCBFcnJTcG9vZmVkUmVhbG0gZm9yIGEgbm9uLWN1cnJlbnQgcmVhbG0sIG9yIHRoZSBLVi1zdG9yZSB3cml0ZSBlcnJvci4KCS8vCglSZW1vdmVUb2tlblNwZWNpZmljTWluaW11bVJld2FyZEl0ZW0oXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZykgZXJyb3IKCgkvLyBIYXNVbnN0YWtpbmdGZWVTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIHVuc3Rha2luZy1mZWUga2V5IGV4aXN0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIHRoZSB1bnN0YWtpbmdGZWUga2V5IGlzIHByZXNlbnQgaW4gcGVyc2lzdGVudCBzdG9yYWdlLgoJLy8KCUhhc1Vuc3Rha2luZ0ZlZVN0b3JlS2V5KCkgYm9vbAoKCS8vIEdldFVuc3Rha2luZ0ZlZSByZXR1cm5zIHRoZSBzdG9yZWQgcmV3YXJkIGZlZSByYXRlIGluIGJhc2lzIHBvaW50cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGZlZTogUGVyc2lzdGVkIGZlZSByYXRlLCB3aGVyZSAxMCwwMDAgYmFzaXMgcG9pbnRzIHJlcHJlc2VudHMgMTAwJS4KCS8vCglHZXRVbnN0YWtpbmdGZWUoKSB1aW50NjQKCgkvLyBTZXRVbnN0YWtpbmdGZWUgcGVyc2lzdHMgdGhlIHJld2FyZCBmZWUgcmF0ZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbnRlcm5hbCBzdG9yZSBmb3J3YXJkaW5nOyBjYWxsZXJzIHBhc3MgMC4KCS8vICAgLSBybG06IFByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0OyBhIG5vbi1jdXJyZW50IHJlYWxtIGlzIHJlamVjdGVkIGJlZm9yZSB3cml0aW5nLgoJLy8gICAtIGZlZTogRmVlIHJhdGUgaW4gYmFzaXMgcG9pbnRzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBOaWwgd2hlbiBzdG9yZWQsIEVyclNwb29mZWRSZWFsbSBmb3IgYSBub24tY3VycmVudCByZWFsbSwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCgkvLwoJU2V0VW5zdGFraW5nRmVlKF8gaW50LCBybG0gcmVhbG0sIGZlZSB1aW50NjQpIGVycm9yCgoJLy8gSGFzUGVuZGluZ1Byb3RvY29sRmVlc1N0b3JlS2V5IHJlcG9ydHMgd2hldGhlciBwZW5kaW5nIHByb3RvY29sIGZlZXMgZXhpc3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IFRydWUgd2hlbiB0aGUgcGVuZGluZ1Byb3RvY29sRmVlcyBrZXkgaXMgcHJlc2VudCBpbiBwZXJzaXN0ZW50IHN0b3JhZ2UuCgkvLwoJSGFzUGVuZGluZ1Byb3RvY29sRmVlc1N0b3JlS2V5KCkgYm9vbAoKCS8vIEdldFBlbmRpbmdQcm90b2NvbEZlZXMgcmV0dXJucyBwZW5kaW5nIHByb3RvY29sLWZlZSBhbW91bnRzIGJ5IHRva2VuIHBhdGguCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBmZWVzOiBUb2tlbi1wYXRoLXRvLWFtb3VudCBtYXAgYXdhaXRpbmcgc2V0dGxlbWVudDsgc3RvcmFnZSByZWFkIG9yIHR5cGUgZmFpbHVyZXMgcGFuaWMuCgkvLwoJR2V0UGVuZGluZ1Byb3RvY29sRmVlcygpIG1hcFtzdHJpbmddaW50NjQKCgkvLyBTZXRQZW5kaW5nUHJvdG9jb2xGZWVzIHJlcGxhY2VzIGFsbCBwZW5kaW5nIHByb3RvY29sLWZlZSBhbW91bnRzLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yIGludGVybmFsIHN0b3JlIGZvcndhcmRpbmc7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGEgbm9uLWN1cnJlbnQgcmVhbG0gaXMgcmVqZWN0ZWQgYmVmb3JlIHdyaXRpbmcuCgkvLyAgIC0gZmVlczogVG9rZW4tcGF0aC10by1hbW91bnQgbWFwIGNvcGllZCBpbnRvIHJlYWxtLW93bmVkIHBlcnNpc3RlbnQgc3RvcmFnZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogTmlsIHdoZW4gc3RvcmVkLCBFcnJTcG9vZmVkUmVhbG0gb3Igd3JpdGUtcGVybWlzc2lvbiBlcnJvciB3aGVuIHVuYXV0aG9yaXplZCwgb3IgdGhlIEtWLXN0b3JlIHdyaXRlIGVycm9yLgoJLy8KCVNldFBlbmRpbmdQcm90b2NvbEZlZXMoXyBpbnQsIHJsbSByZWFsbSwgZmVlcyBtYXBbc3RyaW5nXWludDY0KSBlcnJvcgoKCS8vIEdldFBlbmRpbmdQcm90b2NvbEZlZSByZXR1cm5zIHRoZSBwZW5kaW5nIGFtb3VudCBmb3Igb25lIHRva2VuIHBhdGguCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSB0b2tlblBhdGg6IFRva2VuIGNvbnRyYWN0IHBhdGggd2hvc2UgcGVuZGluZyBhbW91bnQgaXMgcmVxdWVzdGVkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYW1vdW50OiBQZW5kaW5nIGFtb3VudCBmb3IgdGhlIHRva2VuLCBvciB6ZXJvIHdoZW4gbm8gZW50cnkgZXhpc3RzLgoJLy8KCUdldFBlbmRpbmdQcm90b2NvbEZlZSh0b2tlblBhdGggc3RyaW5nKSBpbnQ2NAoKCS8vIFNldFBlbmRpbmdQcm90b2NvbEZlZSB1cGRhdGVzIG9uZSB0b2tlbidzIHBlbmRpbmcgcHJvdG9jb2wtZmVlIGFtb3VudC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbnRlcm5hbCBzdG9yZSBmb3J3YXJkaW5nOyBjYWxsZXJzIHBhc3MgMC4KCS8vICAgLSBybG06IFByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGFsc28gYmUgYXV0aG9yaXplZCBmb3IgY29kZS1yZWFsbSB3cml0ZXMuCgkvLyAgIC0gdG9rZW5QYXRoOiBUb2tlbiBjb250cmFjdCBwYXRoIHdob3NlIHBlbmRpbmcgYW1vdW50IGlzIHVwZGF0ZWQuCgkvLyAgIC0gYW1vdW50OiBQZW5kaW5nIHByb3RvY29sLWZlZSBhbW91bnQgdG8gcmVjb3JkIGZvciB0aGUgdG9rZW4uCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IE5pbCB3aGVuIHVwZGF0ZWQsIEVyclNwb29mZWRSZWFsbSBvciB3cml0ZS1wZXJtaXNzaW9uIGVycm9yIHdoZW4gdW5hdXRob3JpemVkLCBvciB0aGUgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCgkvLwoJU2V0UGVuZGluZ1Byb3RvY29sRmVlKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcsIGFtb3VudCBpbnQ2NCkgZXJyb3IKCgkvLyBSZW1vdmVQZW5kaW5nUHJvdG9jb2xGZWUgZGVsZXRlcyBvbmUgdG9rZW4ncyBwZW5kaW5nIHByb3RvY29sLWZlZSBlbnRyeS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbnRlcm5hbCBzdG9yZSBmb3J3YXJkaW5nOyBjYWxsZXJzIHBhc3MgMC4KCS8vICAgLSBybG06IFByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGFsc28gYmUgYXV0aG9yaXplZCBmb3IgY29kZS1yZWFsbSB3cml0ZXMuCgkvLyAgIC0gdG9rZW5QYXRoOiBUb2tlbiBjb250cmFjdCBwYXRoIHdob3NlIHBlbmRpbmcgZW50cnkgaXMgZGVsZXRlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogTmlsIHdoZW4gcmVtb3ZlZCwgRXJyU3Bvb2ZlZFJlYWxtIG9yIHdyaXRlLXBlcm1pc3Npb24gZXJyb3Igd2hlbiB1bmF1dGhvcml6ZWQsIG9yIHRoZSBLVi1zdG9yZSB3cml0ZSBlcnJvci4KCS8vCglSZW1vdmVQZW5kaW5nUHJvdG9jb2xGZWUoXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZykgZXJyb3IKCgkvLyBIYXNVbnN0YWtlZFBvc2l0aW9uc1N0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgZXhpdC1jaGVja3BvaW50IHRyZWUga2V5IGV4aXN0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIHRoZSB1bnN0YWtlZFBvc2l0aW9ucyBrZXkgaXMgcHJlc2VudCBpbiBwZXJzaXN0ZW50IHN0b3JhZ2UuCgkvLwoJSGFzVW5zdGFrZWRQb3NpdGlvbnNTdG9yZUtleSgpIGJvb2wKCgkvLyBHZXRVbnN0YWtlZFBvc2l0aW9ucyByZXR1cm5zIHRoZSBwZXJzaXN0ZWQgZXhpdC1jaGVja3BvaW50IHRyZWUuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBwb3NpdGlvbnM6IEIrdHJlZSBtYXBwaW5nIHBvc2l0aW9uIElEcyB0byB1bnN0YWtlZCBjaGVja3BvaW50czsgc3RvcmFnZSByZWFkIG9yIHR5cGUgZmFpbHVyZXMgcGFuaWMuCgkvLwoJR2V0VW5zdGFrZWRQb3NpdGlvbnMoKSAqYnB0cmVlLkJQVHJlZQoKCS8vIFNldFVuc3Rha2VkUG9zaXRpb25zIHBlcnNpc3RzIHRoZSBleGl0LWNoZWNrcG9pbnQgdHJlZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbnRlcm5hbCBzdG9yZSBmb3J3YXJkaW5nOyBjYWxsZXJzIHBhc3MgMC4KCS8vICAgLSBybG06IFByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0OyBhIG5vbi1jdXJyZW50IHJlYWxtIGlzIHJlamVjdGVkIGJlZm9yZSB3cml0aW5nLgoJLy8gICAtIHBvc2l0aW9uczogQit0cmVlIGNvbnRhaW5pbmcgdW5zdGFrZWQgcG9zaXRpb24gY2hlY2twb2ludHMgdG8gcGVyc2lzdC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogTmlsIHdoZW4gc3RvcmVkLCBFcnJTcG9vZmVkUmVhbG0gZm9yIGEgbm9uLWN1cnJlbnQgcmVhbG0sIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yLgoJLy8KCVNldFVuc3Rha2VkUG9zaXRpb25zKF8gaW50LCBybG0gcmVhbG0sIHBvc2l0aW9ucyAqYnB0cmVlLkJQVHJlZSkgZXJyb3IKCgkvLyBIYXNVbmNvbGxlY3RlZEluY2VudGl2ZUNvdW50c1N0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgaW5jZW50aXZlLWNvdW50IHRyZWUga2V5IGV4aXN0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIHRoZSB1bmNvbGxlY3RlZEluY2VudGl2ZUNvdW50cyBrZXkgaXMgcHJlc2VudCBpbiBwZXJzaXN0ZW50IHN0b3JhZ2UuCgkvLwoJSGFzVW5jb2xsZWN0ZWRJbmNlbnRpdmVDb3VudHNTdG9yZUtleSgpIGJvb2wKCgkvLyBHZXRVbmNvbGxlY3RlZEluY2VudGl2ZUNvdW50cyByZXR1cm5zIHRoZSBwZXJzaXN0ZWQgY291bnQgdHJlZSBmb3IgZXhpdCBjbGFpbXMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBjb3VudHM6IEIrdHJlZSBtYXBwaW5nIGluY2VudGl2ZSBJRHMgdG8gdW5jb2xsZWN0ZWQgY2hlY2twb2ludCBjb3VudHM7IHN0b3JhZ2UgcmVhZCBvciB0eXBlIGZhaWx1cmVzIHBhbmljLgoJLy8KCUdldFVuY29sbGVjdGVkSW5jZW50aXZlQ291bnRzKCkgKmJwdHJlZS5CUFRyZWUKCgkvLyBTZXRVbmNvbGxlY3RlZEluY2VudGl2ZUNvdW50cyBwZXJzaXN0cyB0aGUgZXhpdC1jbGFpbSBjb3VudCB0cmVlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yIGludGVybmFsIHN0b3JlIGZvcndhcmRpbmc7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGEgbm9uLWN1cnJlbnQgcmVhbG0gaXMgcmVqZWN0ZWQgYmVmb3JlIHdyaXRpbmcuCgkvLyAgIC0gY291bnRzOiBCK3RyZWUgY29udGFpbmluZyB1bmNvbGxlY3RlZCBpbmNlbnRpdmUgY291bnRzIHRvIHBlcnNpc3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IE5pbCB3aGVuIHN0b3JlZCwgRXJyU3Bvb2ZlZFJlYWxtIGZvciBhIG5vbi1jdXJyZW50IHJlYWxtLCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvci4KCS8vCglTZXRVbmNvbGxlY3RlZEluY2VudGl2ZUNvdW50cyhfIGludCwgcmxtIHJlYWxtLCBjb3VudHMgKmJwdHJlZS5CUFRyZWUpIGVycm9yCgkvLyBIYXNQb29sc1N0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgcG9vbCByZWdpc3RyeSB0cmVlIGtleSBleGlzdHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IFRydWUgd2hlbiB0aGUgcG9vbHMga2V5IGlzIHByZXNlbnQgaW4gcGVyc2lzdGVudCBzdG9yYWdlLgoJLy8KCUhhc1Bvb2xzU3RvcmVLZXkoKSBib29sCgoJLy8gR2V0UG9vbHMgcmV0dXJucyB0aGUgcGVyc2lzdGVkIHBvb2wgcmVnaXN0cnkgdHJlZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHBvb2xzOiBCK3RyZWUgbWFwcGluZyBjYW5vbmljYWwgcG9vbCBwYXRocyB0byBwb29sIHJlY29yZHM7IHN0b3JhZ2UgcmVhZCBvciB0eXBlIGZhaWx1cmVzIHBhbmljLgoJLy8KCUdldFBvb2xzKCkgKmJwdHJlZS5CUFRyZWUKCgkvLyBTZXRQb29scyBwZXJzaXN0cyB0aGUgcG9vbCByZWdpc3RyeSB0cmVlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yIGludGVybmFsIHN0b3JlIGZvcndhcmRpbmc7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGEgbm9uLWN1cnJlbnQgcmVhbG0gaXMgcmVqZWN0ZWQgYmVmb3JlIHdyaXRpbmcuCgkvLyAgIC0gcG9vbHM6IEIrdHJlZSBjb250YWluaW5nIHBvb2wgcmVjb3JkcyB0byBwZXJzaXN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBOaWwgd2hlbiBzdG9yZWQsIEVyclNwb29mZWRSZWFsbSBmb3IgYSBub24tY3VycmVudCByZWFsbSwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCgkvLwoJU2V0UG9vbHMoXyBpbnQsIHJsbSByZWFsbSwgcG9vbHMgKmJwdHJlZS5CUFRyZWUpIGVycm9yCgoJLy8gSGFzUG9vbFRpZXJNZW1iZXJzaGlwc1N0b3JlS2V5IHJlcG9ydHMgd2hldGhlciBwb29sLXRvLXRpZXIgbWVtYmVyc2hpcCBkYXRhIGV4aXN0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIHRoZSBwb29sVGllck1lbWJlcnNoaXBzIGtleSBpcyBwcmVzZW50IGluIHBlcnNpc3RlbnQgc3RvcmFnZS4KCS8vCglIYXNQb29sVGllck1lbWJlcnNoaXBzU3RvcmVLZXkoKSBib29sCgoJLy8gR2V0UG9vbFRpZXJNZW1iZXJzaGlwcyByZXR1cm5zIHRoZSBwZXJzaXN0ZWQgcG9vbC10by10aWVyIG1lbWJlcnNoaXAgdHJlZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIG1lbWJlcnNoaXBzOiBCK3RyZWUgbWFwcGluZyBwb29sIHBhdGhzIHRvIHRpZXIgbnVtYmVyczsgc3RvcmFnZSByZWFkIG9yIHR5cGUgZmFpbHVyZXMgcGFuaWMuCgkvLwoJR2V0UG9vbFRpZXJNZW1iZXJzaGlwcygpICpicHRyZWUuQlBUcmVlCgoJLy8gU2V0UG9vbFRpZXJNZW1iZXJzaGlwcyBwZXJzaXN0cyBwb29sLXRvLXRpZXIgbWVtYmVyc2hpcCBkYXRhLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yIGludGVybmFsIHN0b3JlIGZvcndhcmRpbmc7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGEgbm9uLWN1cnJlbnQgcmVhbG0gaXMgcmVqZWN0ZWQgYmVmb3JlIHdyaXRpbmcuCgkvLyAgIC0gbWVtYmVyc2hpcHM6IEIrdHJlZSBtYXBwaW5nIHBvb2wgcGF0aHMgdG8gdGllciBudW1iZXJzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBOaWwgd2hlbiBzdG9yZWQsIEVyclNwb29mZWRSZWFsbSBmb3IgYSBub24tY3VycmVudCByZWFsbSwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCgkvLwoJU2V0UG9vbFRpZXJNZW1iZXJzaGlwcyhfIGludCwgcmxtIHJlYWxtLCBtZW1iZXJzaGlwcyAqYnB0cmVlLkJQVHJlZSkgZXJyb3IKCgkvLyBIYXNQb29sVGllclJhdGlvU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRpZXIgcmV3YXJkLXJhdGlvIGRhdGEgZXhpc3RzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXhpc3RzOiBUcnVlIHdoZW4gdGhlIHBvb2xUaWVyUmF0aW8ga2V5IGlzIHByZXNlbnQgaW4gcGVyc2lzdGVudCBzdG9yYWdlLgoJLy8KCUhhc1Bvb2xUaWVyUmF0aW9TdG9yZUtleSgpIGJvb2wKCgkvLyBHZXRQb29sVGllclJhdGlvIHJldHVybnMgdGhlIHBlcnNpc3RlZCB0aWVyLXRvLXJhdGlvIGNvbmZpZ3VyYXRpb24uCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSByYXRpbzogVGllclJhdGlvIGNvbmZpZ3VyYXRpb24gdXNlZCB0byBjYWxjdWxhdGUgcG9vbCBlbWlzc2lvbiBzaGFyZXM7IHN0b3JhZ2UgcmVhZCBvciB0eXBlIGZhaWx1cmVzIHBhbmljLgoJLy8KCUdldFBvb2xUaWVyUmF0aW8oKSBUaWVyUmF0aW8KCgkvLyBTZXRQb29sVGllclJhdGlvIHBlcnNpc3RzIHRpZXIgcmV3YXJkLXJhdGlvIGNvbmZpZ3VyYXRpb24uCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBMZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgaW50ZXJuYWwgc3RvcmUgZm9yd2FyZGluZzsgY2FsbGVycyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBQcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dDsgYSBub24tY3VycmVudCByZWFsbSBpcyByZWplY3RlZCBiZWZvcmUgd3JpdGluZy4KCS8vICAgLSByYXRpbzogVGllclJhdGlvIGNvbmZpZ3VyYXRpb24gdG8gcGVyc2lzdC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogTmlsIHdoZW4gc3RvcmVkLCBFcnJTcG9vZmVkUmVhbG0gZm9yIGEgbm9uLWN1cnJlbnQgcmVhbG0sIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yLgoJLy8KCVNldFBvb2xUaWVyUmF0aW8oXyBpbnQsIHJsbSByZWFsbSwgcmF0aW8gVGllclJhdGlvKSBlcnJvcgoKCS8vIEhhc1Bvb2xUaWVyQ291bnRzU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRpZXIgbWVtYmVyc2hpcCBjb3VudHMgZXhpc3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IFRydWUgd2hlbiB0aGUgcG9vbFRpZXJDb3VudHMga2V5IGlzIHByZXNlbnQgaW4gcGVyc2lzdGVudCBzdG9yYWdlLgoJLy8KCUhhc1Bvb2xUaWVyQ291bnRzU3RvcmVLZXkoKSBib29sCgoJLy8gR2V0UG9vbFRpZXJDb3VudHMgcmV0dXJucyB0aGUgZml4ZWQtc2l6ZSBhcnJheSBvZiBwb29sIGNvdW50cyBieSB0aWVyLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gY291bnRzOiBQZXItdGllciBwb29sIG1lbWJlcnNoaXAgY291bnRzIGluZGV4ZWQgYnkgQWxsVGllckNvdW50OyBzdG9yYWdlIHJlYWQgb3IgdHlwZSBmYWlsdXJlcyBwYW5pYy4KCS8vCglHZXRQb29sVGllckNvdW50cygpIFtBbGxUaWVyQ291bnRddWludDY0CgoJLy8gU2V0UG9vbFRpZXJDb3VudHMgcGVyc2lzdHMgcGVyLXRpZXIgcG9vbCBtZW1iZXJzaGlwIGNvdW50cy4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbnRlcm5hbCBzdG9yZSBmb3J3YXJkaW5nOyBjYWxsZXJzIHBhc3MgMC4KCS8vICAgLSBybG06IFByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0OyBhIG5vbi1jdXJyZW50IHJlYWxtIGlzIHJlamVjdGVkIGJlZm9yZSB3cml0aW5nLgoJLy8gICAtIGNvdW50czogRml4ZWQtc2l6ZSBwZXItdGllciBwb29sIG1lbWJlcnNoaXAgY291bnRzIHRvIHBlcnNpc3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IE5pbCB3aGVuIHN0b3JlZCwgRXJyU3Bvb2ZlZFJlYWxtIGZvciBhIG5vbi1jdXJyZW50IHJlYWxtLCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvci4KCS8vCglTZXRQb29sVGllckNvdW50cyhfIGludCwgcmxtIHJlYWxtLCBjb3VudHMgW0FsbFRpZXJDb3VudF11aW50NjQpIGVycm9yCgoJLy8gSGFzUG9vbFRpZXJMYXN0UmV3YXJkQ2FjaGVUaW1lc3RhbXBTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIHJld2FyZC1jYWNoZSB0aW1lc3RhbXAgZXhpc3RzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXhpc3RzOiBUcnVlIHdoZW4gdGhlIHBvb2xUaWVyTGFzdFJld2FyZENhY2hlVGltZXN0YW1wIGtleSBpcyBwcmVzZW50IGluIHBlcnNpc3RlbnQgc3RvcmFnZS4KCS8vCglIYXNQb29sVGllckxhc3RSZXdhcmRDYWNoZVRpbWVzdGFtcFN0b3JlS2V5KCkgYm9vbAoKCS8vIEdldFBvb2xUaWVyTGFzdFJld2FyZENhY2hlVGltZXN0YW1wIHJldHVybnMgdGhlIGxhc3QgdGllciByZXdhcmQtY2FjaGUgdGltZXN0YW1wLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdGltZXN0YW1wOiBVbml4LXNlY29uZCB0aW1lc3RhbXAgcGVyc2lzdGVkIGFmdGVyIHRpZXIgcmV3YXJkIGNhY2hpbmc7IHJlYWQvdHlwZSBmYWlsdXJlcyBwYW5pYy4KCS8vCglHZXRQb29sVGllckxhc3RSZXdhcmRDYWNoZVRpbWVzdGFtcCgpIGludDY0CgoJLy8gU2V0UG9vbFRpZXJMYXN0UmV3YXJkQ2FjaGVUaW1lc3RhbXAgcGVyc2lzdHMgdGhlIHRpZXIgcmV3YXJkLWNhY2hlIHRpbWVzdGFtcC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbnRlcm5hbCBzdG9yZSBmb3J3YXJkaW5nOyBjYWxsZXJzIHBhc3MgMC4KCS8vICAgLSBybG06IFByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0OyBhIG5vbi1jdXJyZW50IHJlYWxtIGlzIHJlamVjdGVkIGJlZm9yZSB3cml0aW5nLgoJLy8gICAtIHRpbWVzdGFtcDogVW5peC1zZWNvbmQgdGltZXN0YW1wIHRvIHBlcnNpc3QgYXMgdGhlIGxhc3QgY2FjaGUgYm91bmRhcnkuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IE5pbCB3aGVuIHN0b3JlZCwgRXJyU3Bvb2ZlZFJlYWxtIGZvciBhIG5vbi1jdXJyZW50IHJlYWxtLCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvci4KCS8vCglTZXRQb29sVGllckxhc3RSZXdhcmRDYWNoZVRpbWVzdGFtcChfIGludCwgcmxtIHJlYWxtLCB0aW1lc3RhbXAgaW50NjQpIGVycm9yCgoJLy8gSGFzUG9vbFRpZXJDdXJyZW50RW1pc3Npb25TdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdGllci1lbWlzc2lvbiBrZXkgZXhpc3RzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXhpc3RzOiBUcnVlIHdoZW4gdGhlIHBvb2xUaWVyQ3VycmVudEVtaXNzaW9uIGtleSBpcyBwcmVzZW50IGluIHBlcnNpc3RlbnQgc3RvcmFnZS4KCS8vCglIYXNQb29sVGllckN1cnJlbnRFbWlzc2lvblN0b3JlS2V5KCkgYm9vbAoKCS8vIEdldFBvb2xUaWVyQ3VycmVudEVtaXNzaW9uIHJldHVybnMgdGhlIGN1cnJlbnQgR05TIGVtaXNzaW9uIHJhdGUgY2FjaGVkIGZvciB0aWVycy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVtaXNzaW9uOiBDdXJyZW50IHBlci1zZWNvbmQgZW1pc3Npb24gYW1vdW50OyBzdG9yYWdlIHJlYWQgb3IgdHlwZSBmYWlsdXJlcyBwYW5pYy4KCS8vCglHZXRQb29sVGllckN1cnJlbnRFbWlzc2lvbigpIGludDY0CgoJLy8gU2V0UG9vbFRpZXJDdXJyZW50RW1pc3Npb24gcGVyc2lzdHMgdGhlIGN1cnJlbnQgdGllci1lbWlzc2lvbiByYXRlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yIGludGVybmFsIHN0b3JlIGZvcndhcmRpbmc7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGEgbm9uLWN1cnJlbnQgcmVhbG0gaXMgcmVqZWN0ZWQgYmVmb3JlIHdyaXRpbmcuCgkvLyAgIC0gZW1pc3Npb246IEN1cnJlbnQgcGVyLXNlY29uZCBHTlMgZW1pc3Npb24gYW1vdW50IHRvIHBlcnNpc3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IE5pbCB3aGVuIHN0b3JlZCwgRXJyU3Bvb2ZlZFJlYWxtIGZvciBhIG5vbi1jdXJyZW50IHJlYWxtLCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvci4KCS8vCglTZXRQb29sVGllckN1cnJlbnRFbWlzc2lvbihfIGludCwgcmxtIHJlYWxtLCBlbWlzc2lvbiBpbnQ2NCkgZXJyb3IKCgkvLyBIYXNQb29sVGllckdldEVtaXNzaW9uU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBlbWlzc2lvbi1yYXRlIGNhbGxiYWNrIGV4aXN0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIHRoZSBwb29sVGllckdldEVtaXNzaW9uIGtleSBpcyBwcmVzZW50IGluIHBlcnNpc3RlbnQgc3RvcmFnZS4KCS8vCglIYXNQb29sVGllckdldEVtaXNzaW9uU3RvcmVLZXkoKSBib29sCgoJLy8gR2V0UG9vbFRpZXJHZXRFbWlzc2lvbiByZXR1cm5zIHRoZSBjYWxsYmFjayB1c2VkIHRvIHF1ZXJ5IGN1cnJlbnQgZW1pc3Npb24uCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBnZXRFbWlzc2lvbjogQ2FsbGJhY2sgcmV0dXJuaW5nIHRoZSBjdXJyZW50IGVtaXNzaW9uIGFtb3VudCBhbmQgYW4gZXJyb3I7IHN0b3JhZ2UgcmVhZCBvciB0eXBlIGZhaWx1cmVzIHBhbmljLgoJLy8KCUdldFBvb2xUaWVyR2V0RW1pc3Npb24oKSBmdW5jKCkgKGludDY0LCBlcnJvcikKCgkvLyBTZXRQb29sVGllckdldEVtaXNzaW9uIHBlcnNpc3RzIHRoZSBjYWxsYmFjayB1c2VkIHRvIHF1ZXJ5IGN1cnJlbnQgZW1pc3Npb24uCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBMZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgaW50ZXJuYWwgc3RvcmUgZm9yd2FyZGluZzsgY2FsbGVycyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBQcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dDsgYSBub24tY3VycmVudCByZWFsbSBpcyByZWplY3RlZCBiZWZvcmUgd3JpdGluZy4KCS8vICAgLSBmbjogQ2FsbGJhY2sgdGhhdCByZXR1cm5zIHRoZSBjdXJyZW50IHBlci1zZWNvbmQgZW1pc3Npb24gYW1vdW50LCBvciBhbiBlcnJvciB3aGVuIHVuYXZhaWxhYmxlLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBOaWwgd2hlbiBzdG9yZWQsIEVyclNwb29mZWRSZWFsbSBmb3IgYSBub24tY3VycmVudCByZWFsbSwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCgkvLwoJU2V0UG9vbFRpZXJHZXRFbWlzc2lvbihfIGludCwgcmxtIHJlYWxtLCBmbiBmdW5jKCkgKGludDY0LCBlcnJvcikpIGVycm9yCgoJLy8gSGFzUG9vbFRpZXJHZXRIYWx2aW5nQmxvY2tzSW5SYW5nZVN0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgaGFsdmluZy1yYW5nZSBjYWxsYmFjayBleGlzdHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IFRydWUgd2hlbiB0aGUgcG9vbFRpZXJHZXRIYWx2aW5nQmxvY2tzSW5SYW5nZSBrZXkgaXMgcHJlc2VudCBpbiBwZXJzaXN0ZW50IHN0b3JhZ2UuCgkvLwoJSGFzUG9vbFRpZXJHZXRIYWx2aW5nQmxvY2tzSW5SYW5nZVN0b3JlS2V5KCkgYm9vbAoKCS8vIEdldFBvb2xUaWVyR2V0SGFsdmluZ0Jsb2Nrc0luUmFuZ2UgcmV0dXJucyB0aGUgY2FsbGJhY2sgdXNlZCB0byBxdWVyeQoJLy8gaGFsdmluZyB0aW1lc3RhbXBzIGFuZCBtYXRjaGluZyBlbWlzc2lvbiBhbW91bnRzIGZvciBhIHRpbWUgcmFuZ2UuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBnZXRIYWx2aW5nQmxvY2tzSW5SYW5nZTogQ2FsbGJhY2sgdGFraW5nIFtzdGFydCxlbmQpIHRpbWVzdGFtcHMgYW5kIHJldHVybmluZyBhc2NlbmRpbmcgaGFsdmluZyB0aW1lc3RhbXBzLCBjb3JyZXNwb25kaW5nIGVtaXNzaW9ucywgYW5kIGFuIGVycm9yOyBzdG9yYWdlIHJlYWQgb3IgdHlwZSBmYWlsdXJlcyBwYW5pYy4KCS8vCglHZXRQb29sVGllckdldEhhbHZpbmdCbG9ja3NJblJhbmdlKCkgZnVuYyhzdGFydCwgZW5kIGludDY0KSAoW11pbnQ2NCwgW11pbnQ2NCwgZXJyb3IpCgoJLy8gU2V0UG9vbFRpZXJHZXRIYWx2aW5nQmxvY2tzSW5SYW5nZSBwZXJzaXN0cyB0aGUgaGFsdmluZy1yYW5nZSBjYWxsYmFjay4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciBpbnRlcm5hbCBzdG9yZSBmb3J3YXJkaW5nOyBjYWxsZXJzIHBhc3MgMC4KCS8vICAgLSBybG06IFByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0OyBhIG5vbi1jdXJyZW50IHJlYWxtIGlzIHJlamVjdGVkIGJlZm9yZSB3cml0aW5nLgoJLy8gICAtIGZuOiBDYWxsYmFjayB0YWtpbmcgYSBbc3RhcnQsZW5kKSB0aW1lc3RhbXAgaW50ZXJ2YWwgYW5kIHJldHVybmluZyBtYXRjaGluZyBoYWx2aW5nIHRpbWVzdGFtcHMsIGVtaXNzaW9uIGFtb3VudHMsIGFuZCBhbiBlcnJvci4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogTmlsIHdoZW4gc3RvcmVkLCBFcnJTcG9vZmVkUmVhbG0gZm9yIGEgbm9uLWN1cnJlbnQgcmVhbG0sIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yLgoJLy8KCVNldFBvb2xUaWVyR2V0SGFsdmluZ0Jsb2Nrc0luUmFuZ2UoXyBpbnQsIHJsbSByZWFsbSwgZm4gZnVuYyhzdGFydCwgZW5kIGludDY0KSAoW11pbnQ2NCwgW11pbnQ2NCwgZXJyb3IpKSBlcnJvcgoKCS8vIEhhc1dhcm11cFRlbXBsYXRlU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSB3YXJtLXVwIHRlbXBsYXRlIGtleSBleGlzdHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IFRydWUgd2hlbiB0aGUgd2FybXVwVGVtcGxhdGUga2V5IGlzIHByZXNlbnQgaW4gcGVyc2lzdGVudCBzdG9yYWdlLgoJLy8KCUhhc1dhcm11cFRlbXBsYXRlU3RvcmVLZXkoKSBib29sCgoJLy8gR2V0V2FybXVwVGVtcGxhdGUgcmV0dXJucyBhIGNvcHkgb2YgdGhlIHdhcm0tdXAgc2NoZWR1bGUgZm9yIG5ldyBkZXBvc2l0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHdhcm11cHM6IENhbGxlci1zYWZlIGNvcHkgb2Ygb3JkZXJlZCB3YXJtLXVwIHJhdGlvIGFuZCBkdXJhdGlvbiBlbnRyaWVzLgoJLy8KCUdldFdhcm11cFRlbXBsYXRlKCkgW11XYXJtdXAKCgkvLyBTZXRXYXJtdXBUZW1wbGF0ZSByZXBsYWNlcyB0aGUgd2FybS11cCBzY2hlZHVsZSBmb3IgbmV3IGRlcG9zaXRzLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yIGludGVybmFsIHN0b3JlIGZvcndhcmRpbmc7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGEgbm9uLWN1cnJlbnQgcmVhbG0gaXMgcmVqZWN0ZWQgYmVmb3JlIHdyaXRpbmcuCgkvLyAgIC0gd2FybXVwczogT3JkZXJlZCB3YXJtLXVwIHJhdGlvIGFuZCBkdXJhdGlvbiBlbnRyaWVzIHRvIHBlcnNpc3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IE5pbCB3aGVuIHN0b3JlZCwgRXJyU3Bvb2ZlZFJlYWxtIGZvciBhIG5vbi1jdXJyZW50IHJlYWxtLCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvci4KCS8vCglTZXRXYXJtdXBUZW1wbGF0ZShfIGludCwgcmxtIHJlYWxtLCB3YXJtdXBzIFtdV2FybXVwKSBlcnJvcgoKCS8vIEhhc0N1cnJlbnRTd2FwQmF0Y2hTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3dhcC1iYXRjaCBrZXkgZXhpc3RzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXhpc3RzOiBUcnVlIHdoZW4gdGhlIGN1cnJlbnRTd2FwQmF0Y2gga2V5IGlzIHByZXNlbnQgaW4gcGVyc2lzdGVudCBzdG9yYWdlLgoJLy8KCUhhc0N1cnJlbnRTd2FwQmF0Y2hTdG9yZUtleSgpIGJvb2wKCgkvLyBHZXRDdXJyZW50U3dhcEJhdGNoIHJldHVybnMgdGhlIHBlcnNpc3RlZCBzd2FwLWJhdGNoIHByb2Nlc3NvciBzdGF0ZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGJhdGNoOiBDdXJyZW50IFN3YXBCYXRjaFByb2Nlc3NvciBwb2ludGVyOyBzdG9yYWdlIHJlYWQgb3IgdHlwZSBmYWlsdXJlcyBwYW5pYy4KCS8vCglHZXRDdXJyZW50U3dhcEJhdGNoKCkgKlN3YXBCYXRjaFByb2Nlc3NvcgoKCS8vIFNldEN1cnJlbnRTd2FwQmF0Y2ggcGVyc2lzdHMgdGhlIGN1cnJlbnQgc3dhcC1iYXRjaCBwcm9jZXNzb3Igc3RhdGUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBMZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgaW50ZXJuYWwgc3RvcmUgZm9yd2FyZGluZzsgY2FsbGVycyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBQcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dDsgYSBub24tY3VycmVudCByZWFsbSBpcyByZWplY3RlZCBiZWZvcmUgd3JpdGluZy4KCS8vICAgLSBiYXRjaDogU3dhcEJhdGNoUHJvY2Vzc29yIHN0YXRlIHRvIHBlcnNpc3QgZm9yIHRoZSBjdXJyZW50IGJhdGNoLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBOaWwgd2hlbiBzdG9yZWQsIEVyclNwb29mZWRSZWFsbSBmb3IgYSBub24tY3VycmVudCByZWFsbSwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCgkvLwoJU2V0Q3VycmVudFN3YXBCYXRjaChfIGludCwgcmxtIHJlYWxtLCBiYXRjaCAqU3dhcEJhdGNoUHJvY2Vzc29yKSBlcnJvcgp9ChrARgoVdW5zdGFrZWRfcG9zaXRpb24uZ25vEqZGcGFja2FnZSBzdGFrZXIKCi8vIFVuc3Rha2VkUG9zaXRpb24gaXMgdGhlIGV4aXQgY2hlY2twb2ludCBvZiBhIHBvc2l0aW9uIHRoYXQgbGVmdCB0aGUgcG9vbCBiZWZvcmUgY29sbGVjdGluZy4KLy8KLy8gSXQgcGlucyB0aGUgcG9vbCBzdGF0ZSBhIGxhdGVyIGNvbGxlY3QgbXVzdCByZXByb2R1Y2UgdGhlIGV4aXQtdGltZSByZXdhcmQgZnJvbTogdGhlIHRpY2sKLy8gb2JzZXJ2ZWQgYXQgdGhlIGV4aXQsIHRoZSB0d28gYm91bmRhcnkgdGlja3MgKHdoaWNoIHRoZSB1bnN0YWtlIG1heSBwcnVuZSBmcm9tIHRoZSBwb29sKSwKLy8gYW5kIHRoZSB0aWVyIGNvbnRleHQgKHdoaWNoIGEgbGF0ZXIgdGllciBjaGFuZ2Ugd291bGQgb3RoZXJ3aXNlIHJlLXJhdGUgdGhlIHdpbmRvdyB3aXRoKS4KLy8gQ29sbGVjdGlvbiBpcyBwZXIgc291cmNlLCBzbyB0aGUgY2hlY2twb2ludCB0cmFja3Mgd2hhdCBpcyBsZWZ0IGFuZCBpcyBkcm9wcGVkIHdoZW4gbm90aGluZyBpcy4KdHlwZSBVbnN0YWtlZFBvc2l0aW9uIHN0cnVjdCB7CglkZXBvc2l0ICAgKkRlcG9zaXQKCWV4aXRUaW1lICBpbnQ2NAoJZXhpdFRpY2sgIGludDMyCglsb3dlclRpY2sgKlRpY2sKCXVwcGVyVGljayAqVGljawoKCS8vIE91dHNpZGUgYWNjdW11bGF0aW9ucyBvZiB0aGUgdHdvIGJvdW5kYXJ5IHRpY2tzIGF0IGV4aXRUaW1lLCBhcyBkZWNpbWFsIHN0cmluZ3MuIEVudHJpZXMKCS8vIGJlZm9yZSBleGl0VGltZSBjYW4gbm8gbG9uZ2VyIGNoYW5nZSwgYnV0IHRoZSBvbmUgYXQgZXhpdFRpbWUgY2FuIGJlIG92ZXJ3cml0dGVuIGJ5IGEgdGljawoJLy8gY3Jvc3MgbGF0ZXIgaW4gdGhlIHNhbWUgYmxvY2ssIHNvIGl0IGlzIHBpbm5lZCByYXRoZXIgdGhhbiByZWFkIGJhY2suCglsb3dlck91dHNpZGVBY2Mgc3RyaW5nCgl1cHBlck91dHNpZGVBY2Mgc3RyaW5nCgoJdGllciAgICAgIHVpbnQ2NAoJdGllclJhdGlvIHVpbnQ2NAoJdGllckNvdW50IHVpbnQ2NAoKCS8vIHVuc3Rha2luZ0ZlZSBpcyB0aGUgc3Rha2luZy1yZXdhcmQgZmVlIHJhdGUgaW4gZm9yY2UgYXQgZXhpdFRpbWUuIFRoZSB3aW5kb3cgY2xvc2VkIHVuZGVyCgkvLyBpdCwgc28gYSBsYXRlciByYXRlIGNoYW5nZSBtdXN0IG5vdCBhcHBseSByZXRyb2FjdGl2ZWx5IGF0IGNvbGxlY3QgdGltZS4KCXVuc3Rha2luZ0ZlZSB1aW50NjQKCgllbWlzc2lvbkNvbGxlY3RlZCAgIGJvb2wKCXBlbmRpbmdJbmNlbnRpdmVJZHMgbWFwW3N0cmluZ11ib29sCn0KCi8vIE5ld1Vuc3Rha2VkUG9zaXRpb24gY3JlYXRlcyBhbiBleGl0IGNoZWNrcG9pbnQgb3dpbmcgZXZlcnkgcmV3YXJkIHNvdXJjZSBvZiB0aGUgZGVwb3NpdC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlcG9zaXQ6IERlcG9zaXQgc3RhdGUgY2FwdHVyZWQgd2hlbiB0aGUgcG9zaXRpb24gbGVhdmVzIHRoZSBwb29sLgovLyAgIC0gZXhpdFRpbWU6IFVuaXggdGltZXN0YW1wIHdoZW4gc3Rha2luZyBlbmRlZCBhbmQgdGhpcyBjaGVja3BvaW50J3MgcmV3YXJkIHdpbmRvdyBzdG9wcGVkLgovLyAgIC0gZXhpdFRpY2s6IFBvb2wgdGljayBvYnNlcnZlZCBhdCBleGl0VGltZSBmb3IgcmVjb25zdHJ1Y3RpbmcgaW4tcmFuZ2UgcmV3YXJkcy4KLy8gICAtIGxvd2VyVGljazogU25hcHNob3Qgb2YgdGhlIHBvc2l0aW9uJ3MgbG93ZXIgYm91bmRhcnkgdGljaywgcmV0YWluZWQgaWYgdGhlIGxpdmUgcG9vbCBwcnVuZXMgaXQuCi8vICAgLSB1cHBlclRpY2s6IFNuYXBzaG90IG9mIHRoZSBwb3NpdGlvbidzIHVwcGVyIGJvdW5kYXJ5IHRpY2ssIHJldGFpbmVkIGlmIHRoZSBsaXZlIHBvb2wgcHJ1bmVzIGl0LgovLyAgIC0gbG93ZXJPdXRzaWRlQWNjOiBEZWNpbWFsLWVuY29kZWQgb3V0c2lkZSByZXdhcmQtcmF0aW8gYWNjdW11bGF0aW9uIG9mIHRoZSBsb3dlciB0aWNrIGF0IGV4aXRUaW1lLgovLyAgIC0gdXBwZXJPdXRzaWRlQWNjOiBEZWNpbWFsLWVuY29kZWQgb3V0c2lkZSByZXdhcmQtcmF0aW8gYWNjdW11bGF0aW9uIG9mIHRoZSB1cHBlciB0aWNrIGF0IGV4aXRUaW1lLgovLyAgIC0gdGllcjogUG9vbCBlbWlzc2lvbiB0aWVyIGF0IGV4aXRUaW1lOyB6ZXJvIGRlbm90ZXMgdGhhdCB0aGUgcG9vbCB3YXMgbm90IHRpZXJlZC4KLy8gICAtIHRpZXJSYXRpbzogVGllciByZXdhcmQtc2hhcmUgcmF0aW8sIGluIGl0cyBzdG9yZWQgc2NhbGVkIGZvcm0sIGF0IGV4aXRUaW1lLgovLyAgIC0gdGllckNvdW50OiBOdW1iZXIgb2YgcG9vbHMgc2hhcmluZyB0aGUgdGllciBhdCBleGl0VGltZSBmb3IgZGl2aWRpbmcgdGllciByZXdhcmRzLgovLyAgIC0gdW5zdGFraW5nRmVlOiBTdGFraW5nLXJld2FyZCBmZWUgcmF0ZSBpbiBiYXNpcyBwb2ludHMgYXQgZXhpdFRpbWUgKDAtMSwwMDA7IDEwMCA9IDElKS4KLy8gICAtIHBlbmRpbmdJbmNlbnRpdmVJZHM6IEV4dGVybmFsIGluY2VudGl2ZSBJRHMgd2hvc2UgcmV3YXJkcyBhcmUgc3RpbGwgb3dlZCBieSB0aGUgcG9zaXRpb24uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwb3NpdGlvbjogTmV3IGV4aXQgY2hlY2twb2ludCByZXRhaW5pbmcgdGhlIGRlcG9zaXQgYW5kIGV4aXQtdGltZSByZXdhcmQgY29udGV4dDsgZW1pc3Npb24gaXMgaW5pdGlhbGx5IHVuY29sbGVjdGVkIGFuZCBldmVyeSBzdXBwbGllZCBpbmNlbnRpdmUgaXMgcGVuZGluZy4KZnVuYyBOZXdVbnN0YWtlZFBvc2l0aW9uKAoJZGVwb3NpdCAqRGVwb3NpdCwKCWV4aXRUaW1lIGludDY0LAoJZXhpdFRpY2sgaW50MzIsCglsb3dlclRpY2sgKlRpY2ssCgl1cHBlclRpY2sgKlRpY2ssCglsb3dlck91dHNpZGVBY2Mgc3RyaW5nLAoJdXBwZXJPdXRzaWRlQWNjIHN0cmluZywKCXRpZXIgdWludDY0LAoJdGllclJhdGlvIHVpbnQ2NCwKCXRpZXJDb3VudCB1aW50NjQsCgl1bnN0YWtpbmdGZWUgdWludDY0LAoJcGVuZGluZ0luY2VudGl2ZUlkcyBbXXN0cmluZywKKSAqVW5zdGFrZWRQb3NpdGlvbiB7CgkvLyBBbGxvY2F0ZWQgaGVyZSBzbyB0aGlzIHJlYWxtIG93bnMgaXQ7IGEgbWFwIGJ1aWx0IGJ5IHRoZSBjYWxsZXIgaXMgcmVhZG9ubHkgdGFpbnRlZC4KCXBlbmRpbmcgOj0gbWFrZShtYXBbc3RyaW5nXWJvb2wpCglmb3IgXywgaW5jZW50aXZlSWQgOj0gcmFuZ2UgcGVuZGluZ0luY2VudGl2ZUlkcyB7CgkJcGVuZGluZ1tpbmNlbnRpdmVJZF0gPSB0cnVlCgl9CgoJcmV0dXJuICZVbnN0YWtlZFBvc2l0aW9uewoJCWRlcG9zaXQ6ICAgICAgICAgICAgIGRlcG9zaXQsCgkJZXhpdFRpbWU6ICAgICAgICAgICAgZXhpdFRpbWUsCgkJZXhpdFRpY2s6ICAgICAgICAgICAgZXhpdFRpY2ssCgkJbG93ZXJUaWNrOiAgICAgICAgICAgbG93ZXJUaWNrLAoJCXVwcGVyVGljazogICAgICAgICAgIHVwcGVyVGljaywKCQlsb3dlck91dHNpZGVBY2M6ICAgICBsb3dlck91dHNpZGVBY2MsCgkJdXBwZXJPdXRzaWRlQWNjOiAgICAgdXBwZXJPdXRzaWRlQWNjLAoJCXRpZXI6ICAgICAgICAgICAgICAgIHRpZXIsCgkJdGllclJhdGlvOiAgICAgICAgICAgdGllclJhdGlvLAoJCXRpZXJDb3VudDogICAgICAgICAgIHRpZXJDb3VudCwKCQl1bnN0YWtpbmdGZWU6ICAgICAgICB1bnN0YWtpbmdGZWUsCgkJcGVuZGluZ0luY2VudGl2ZUlkczogcGVuZGluZywKCX0KfQoKLy8gRGVwb3NpdCByZXR1cm5zIHRoZSBkZXBvc2l0IHNuYXBzaG90IGNhcHR1cmVkIHdoZW4gdGhpcyBwb3NpdGlvbiB3YXMgdW5zdGFrZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBkZXBvc2l0OiBTdG9yZWQgZGVwb3NpdCBzdGF0ZSwgaW5jbHVkaW5nIGl0cyBvd25lciwgcG9vbCwgbGlxdWlkaXR5LCB0aWNrcywgd2FybXVwcywgYW5kIGNvbGxlY3RlZCByZXdhcmQgZmllbGRzLgpmdW5jICh1ICpVbnN0YWtlZFBvc2l0aW9uKSBEZXBvc2l0KCkgKkRlcG9zaXQgeyByZXR1cm4gdS5kZXBvc2l0IH0KCi8vIEV4aXRUaW1lIHJldHVybnMgdGhlIHRpbWVzdGFtcCBhdCB3aGljaCB0aGUgcG9zaXRpb24gc3RvcHBlZCBhY2NydWluZyByZXdhcmRzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXhpdFRpbWU6IFVuaXggdGltZXN0YW1wIHBpbm5lZCBhcyB0aGUgZW5kIG9mIHRoaXMgcG9zaXRpb24ncyByZXdhcmQtYWNjcnVhbCB3aW5kb3cuCmZ1bmMgKHUgKlVuc3Rha2VkUG9zaXRpb24pIEV4aXRUaW1lKCkgaW50NjQgeyByZXR1cm4gdS5leGl0VGltZSB9CgovLyBFeGl0VGljayByZXR1cm5zIHRoZSBwb29sIHRpY2sgb2JzZXJ2ZWQgYXQgRXhpdFRpbWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBleGl0VGljazogVGljayB2YWx1ZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcG9zaXRpb24ncyBpbi1yYW5nZSBzdGF0dXMgYXQgdGhlIGV4aXQgY2hlY2twb2ludC4KZnVuYyAodSAqVW5zdGFrZWRQb3NpdGlvbikgRXhpdFRpY2soKSBpbnQzMiB7IHJldHVybiB1LmV4aXRUaWNrIH0KCi8vIExvd2VyVGljayByZXR1cm5zIHRoZSBwb3NpdGlvbidzIGxvd2VyIGJvdW5kYXJ5IHRpY2sgc25hcHNob3QuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBsb3dlclRpY2s6IFN0b3JlZCBsb3dlciBib3VuZGFyeSB0aWNrIHVzZWQgd2hlbiBjYWxjdWxhdGluZyByZXdhcmRzIGZvciB0aGlzIGV4aXQgY2hlY2twb2ludC4KZnVuYyAodSAqVW5zdGFrZWRQb3NpdGlvbikgTG93ZXJUaWNrKCkgKlRpY2sgeyByZXR1cm4gdS5sb3dlclRpY2sgfQoKLy8gVXBwZXJUaWNrIHJldHVybnMgdGhlIHBvc2l0aW9uJ3MgdXBwZXIgYm91bmRhcnkgdGljayBzbmFwc2hvdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHVwcGVyVGljazogU3RvcmVkIHVwcGVyIGJvdW5kYXJ5IHRpY2sgdXNlZCB3aGVuIGNhbGN1bGF0aW5nIHJld2FyZHMgZm9yIHRoaXMgZXhpdCBjaGVja3BvaW50LgpmdW5jICh1ICpVbnN0YWtlZFBvc2l0aW9uKSBVcHBlclRpY2soKSAqVGljayB7IHJldHVybiB1LnVwcGVyVGljayB9CgovLyBMb3dlck91dHNpZGVBY2MgcmV0dXJucyB0aGUgbG93ZXIgYm91bmRhcnkgdGljaydzIG91dHNpZGUgYWNjdW11bGF0aW9uIGF0IEV4aXRUaW1lLgovLwovLyBSZXR1cm5zOgovLyAgIC0gbG93ZXJPdXRzaWRlQWNjOiBEZWNpbWFsLWVuY29kZWQgcmV3YXJkLXJhdGlvIGFjY3VtdWxhdGlvbiBvdXRzaWRlIHRoZSBsb3dlciBib3VuZGFyeSBhdCBleGl0LgpmdW5jICh1ICpVbnN0YWtlZFBvc2l0aW9uKSBMb3dlck91dHNpZGVBY2MoKSBzdHJpbmcgeyByZXR1cm4gdS5sb3dlck91dHNpZGVBY2MgfQoKLy8gVXBwZXJPdXRzaWRlQWNjIHJldHVybnMgdGhlIHVwcGVyIGJvdW5kYXJ5IHRpY2sncyBvdXRzaWRlIGFjY3VtdWxhdGlvbiBhdCBFeGl0VGltZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHVwcGVyT3V0c2lkZUFjYzogRGVjaW1hbC1lbmNvZGVkIHJld2FyZC1yYXRpbyBhY2N1bXVsYXRpb24gb3V0c2lkZSB0aGUgdXBwZXIgYm91bmRhcnkgYXQgZXhpdC4KZnVuYyAodSAqVW5zdGFrZWRQb3NpdGlvbikgVXBwZXJPdXRzaWRlQWNjKCkgc3RyaW5nIHsgcmV0dXJuIHUudXBwZXJPdXRzaWRlQWNjIH0KCi8vIFRpZXIgcmV0dXJucyB0aGUgcG9vbCdzIGVtaXNzaW9uIHRpZXIgYXQgRXhpdFRpbWUsIG9yIDAgd2hlbiBpdCB3YXMgbm90IHRpZXJlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpZXI6IFRpZXIgaWRlbnRpZmllciBwaW5uZWQgYXQgZXhpdDsgemVybyBtZWFucyBubyBlbWlzc2lvbiB0aWVyIGFwcGxpZWQuCmZ1bmMgKHUgKlVuc3Rha2VkUG9zaXRpb24pIFRpZXIoKSB1aW50NjQgeyByZXR1cm4gdS50aWVyIH0KCi8vIFRpZXJSYXRpbyByZXR1cm5zIHRoZSB0aWVyJ3MgZW1pc3Npb24gcmF0aW8gYXQgRXhpdFRpbWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aWVyUmF0aW86IFN0b3JlZCBzY2FsZWQgcmV3YXJkLXNoYXJlIHJhdGlvIGZvciB0aGUgcGlubmVkIHRpZXIgYXQgZXhpdC4KZnVuYyAodSAqVW5zdGFrZWRQb3NpdGlvbikgVGllclJhdGlvKCkgdWludDY0IHsgcmV0dXJuIHUudGllclJhdGlvIH0KCi8vIFRpZXJDb3VudCByZXR1cm5zIGhvdyBtYW55IHBvb2xzIHNoYXJlZCB0aGUgdGllciBhdCBFeGl0VGltZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpZXJDb3VudDogTnVtYmVyIG9mIHBvb2xzIGluIHRoZSBwaW5uZWQgdGllciB3aGVuIHRoZSBwb3NpdGlvbiBleGl0ZWQuCmZ1bmMgKHUgKlVuc3Rha2VkUG9zaXRpb24pIFRpZXJDb3VudCgpIHVpbnQ2NCB7IHJldHVybiB1LnRpZXJDb3VudCB9CgovLyBVbnN0YWtpbmdGZWUgcmV0dXJucyB0aGUgc3Rha2luZy1yZXdhcmQgZmVlIHJhdGUgaW4gZm9yY2UgYXQgRXhpdFRpbWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB1bnN0YWtpbmdGZWU6IEZlZSByYXRlIHBpbm5lZCBmb3IgdGhpcyBleGl0IGluIGJhc2lzIHBvaW50cyAoMC0xLDAwMDsgMTAwID0gMSUpLgpmdW5jICh1ICpVbnN0YWtlZFBvc2l0aW9uKSBVbnN0YWtpbmdGZWUoKSB1aW50NjQgeyByZXR1cm4gdS51bnN0YWtpbmdGZWUgfQoKLy8gRW1pc3Npb25Db2xsZWN0ZWQgcmVwb3J0cyB3aGV0aGVyIHRoZSBlbWlzc2lvbiByZXdhcmQgaGFzIGJlZW4gY29sbGVjdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gY29sbGVjdGVkOiBUcnVlIGFmdGVyIE1hcmtFbWlzc2lvbkNvbGxlY3RlZCBoYXMgYmVlbiBjYWxsZWQ7IGZhbHNlIHdoaWxlIHRoZSBpbnRlcm5hbCByZXdhcmQgcmVtYWlucyBwZW5kaW5nLgpmdW5jICh1ICpVbnN0YWtlZFBvc2l0aW9uKSBFbWlzc2lvbkNvbGxlY3RlZCgpIGJvb2wgeyByZXR1cm4gdS5lbWlzc2lvbkNvbGxlY3RlZCB9CgovLyBNYXJrRW1pc3Npb25Db2xsZWN0ZWQgcmVjb3JkcyB0aGF0IHRoZSBlbWlzc2lvbiByZXdhcmQgaGFzIGJlZW4gY29sbGVjdGVkLgpmdW5jICh1ICpVbnN0YWtlZFBvc2l0aW9uKSBNYXJrRW1pc3Npb25Db2xsZWN0ZWQoKSB7IHUuZW1pc3Npb25Db2xsZWN0ZWQgPSB0cnVlIH0KCi8vIEhhc1BlbmRpbmdJbmNlbnRpdmVJZCByZXBvcnRzIHdoZXRoZXIgdGhlIGluY2VudGl2ZSBpcyBzdGlsbCB0byBiZSBjb2xsZWN0ZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbmNlbnRpdmVJZDogRXh0ZXJuYWwgaW5jZW50aXZlIGlkZW50aWZpZXIgdG8gbG9vayB1cCBpbiB0aGlzIGNoZWNrcG9pbnQncyBwZW5kaW5nIHNldC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHBlbmRpbmc6IFRydWUgd2hlbiBpbmNlbnRpdmVJZCBpcyBjdXJyZW50bHkgcGVuZGluZzsgZmFsc2Ugd2hlbiBpdCBpcyBhYnNlbnQgb3IgdGhlIHBlbmRpbmcgc2V0IGlzIG5pbC4KZnVuYyAodSAqVW5zdGFrZWRQb3NpdGlvbikgSGFzUGVuZGluZ0luY2VudGl2ZUlkKGluY2VudGl2ZUlkIHN0cmluZykgYm9vbCB7CglpZiB1LnBlbmRpbmdJbmNlbnRpdmVJZHMgPT0gbmlsIHsKCQlyZXR1cm4gZmFsc2UKCX0KCglyZXR1cm4gdS5wZW5kaW5nSW5jZW50aXZlSWRzW2luY2VudGl2ZUlkXQp9CgovLyBQZW5kaW5nSW5jZW50aXZlSWRMaXN0IHJldHVybnMgdGhlIGluY2VudGl2ZXMgc3RpbGwgdG8gYmUgY29sbGVjdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW5jZW50aXZlSWRzOiBJRHMgY3VycmVudGx5IHByZXNlbnQgaW4gdGhlIHBlbmRpbmcgc2V0OyBpdGVyYXRpb24gb3JkZXIgaXMgdW5zcGVjaWZpZWQuCmZ1bmMgKHUgKlVuc3Rha2VkUG9zaXRpb24pIFBlbmRpbmdJbmNlbnRpdmVJZExpc3QoKSBbXXN0cmluZyB7CglpbmNlbnRpdmVJZHMgOj0gbWFrZShbXXN0cmluZywgMCwgbGVuKHUucGVuZGluZ0luY2VudGl2ZUlkcykpCglmb3IgaW5jZW50aXZlSWQgOj0gcmFuZ2UgdS5wZW5kaW5nSW5jZW50aXZlSWRzIHsKCQlpbmNlbnRpdmVJZHMgPSBhcHBlbmQoaW5jZW50aXZlSWRzLCBpbmNlbnRpdmVJZCkKCX0KCglyZXR1cm4gaW5jZW50aXZlSWRzCn0KCi8vIFBlbmRpbmdJbmNlbnRpdmVDb3VudCByZXR1cm5zIGhvdyBtYW55IGluY2VudGl2ZXMgYXJlIHN0aWxsIHRvIGJlIGNvbGxlY3RlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGNvdW50OiBOdW1iZXIgb2YgZXh0ZXJuYWwgaW5jZW50aXZlIElEcyBjdXJyZW50bHkgcGVuZGluZyBpbiB0aGUgY2hlY2twb2ludC4KZnVuYyAodSAqVW5zdGFrZWRQb3NpdGlvbikgUGVuZGluZ0luY2VudGl2ZUNvdW50KCkgaW50IHsKCXJldHVybiBsZW4odS5wZW5kaW5nSW5jZW50aXZlSWRzKQp9CgovLyBIYXNQZW5kaW5nSW5jZW50aXZlcyByZXBvcnRzIHdoZXRoZXIgYW55IGluY2VudGl2ZSBpcyBzdGlsbCB0byBiZSBjb2xsZWN0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwZW5kaW5nOiBUcnVlIHdoZW4gYXQgbGVhc3Qgb25lIGV4dGVybmFsIGluY2VudGl2ZSBJRCByZW1haW5zIHBlbmRpbmc7IGZhbHNlIG90aGVyd2lzZS4KZnVuYyAodSAqVW5zdGFrZWRQb3NpdGlvbikgSGFzUGVuZGluZ0luY2VudGl2ZXMoKSBib29sIHsKCXJldHVybiBsZW4odS5wZW5kaW5nSW5jZW50aXZlSWRzKSA+IDAKfQoKLy8gTWFya0luY2VudGl2ZUNvbGxlY3RlZCByZWNvcmRzIHRoYXQgdGhlIGluY2VudGl2ZSBoYXMgYmVlbiBjb2xsZWN0ZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbmNlbnRpdmVJZDogRXh0ZXJuYWwgaW5jZW50aXZlIGlkZW50aWZpZXIgdG8gcmVtb3ZlIGZyb20gdGhlIHBlbmRpbmcgc2V0LgpmdW5jICh1ICpVbnN0YWtlZFBvc2l0aW9uKSBNYXJrSW5jZW50aXZlQ29sbGVjdGVkKGluY2VudGl2ZUlkIHN0cmluZykgewoJaWYgdS5wZW5kaW5nSW5jZW50aXZlSWRzID09IG5pbCB7CgkJcmV0dXJuCgl9CgoJZGVsZXRlKHUucGVuZGluZ0luY2VudGl2ZUlkcywgaW5jZW50aXZlSWQpCn0KCi8vIEZ1bGx5Q29sbGVjdGVkIHJlcG9ydHMgd2hldGhlciBldmVyeSByZXdhcmQgc291cmNlIGhhcyBiZWVuIGNvbGxlY3RlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGNvbGxlY3RlZDogVHJ1ZSBvbmx5IHdoZW4gdGhlIGludGVybmFsIGVtaXNzaW9uIGZsYWcgaXMgc2V0IGFuZCBubyBleHRlcm5hbCBpbmNlbnRpdmUgSURzIHJlbWFpbiBwZW5kaW5nLgpmdW5jICh1ICpVbnN0YWtlZFBvc2l0aW9uKSBGdWxseUNvbGxlY3RlZCgpIGJvb2wgewoJcmV0dXJuIHUuZW1pc3Npb25Db2xsZWN0ZWQgJiYgIXUuSGFzUGVuZGluZ0luY2VudGl2ZXMoKQp9ChqrFQoLdXBncmFkZS5nbm8SmxVwYWNrYWdlIHN0YWtlcgoKaW1wb3J0ICgKCSJnbm8ubGFuZC9yL2dub3N3YXAvYWNjZXNzL3YxIgopCgovLyBSZWdpc3RlckluaXRpYWxpemVyIHJlZ2lzdGVycyBhIG5ldyBzdGFrZXIgaW1wbGVtZW50YXRpb24gdmVyc2lvbi4KLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgZWFjaCB2ZXJzaW9uICh2MSwgdjIsIGV0Yy4pIGR1cmluZyBpbml0aWFsaXphdGlvbgovLyB0byByZWdpc3RlciB0aGVpciBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZSBwcm94eSBzeXN0ZW0uCi8vCi8vIFRoZSBpbml0aWFsaXplciBmdW5jdGlvbiBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbgovLyB1c2luZyB0aGUgcHJvdmlkZWQgc3Rha2VyU3RvcmUgaW50ZXJmYWNlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBpbml0aWFsaXplcjogRmFjdG9yeSBjYWxsYmFjayB0aGF0IHJlY2VpdmVzIHRoZSBpbnRlcm5hbCBkaXNjcmltaW5hdG9yLCBjdXJyZW50IHN0YWtlciByZWFsbSwgYW5kIGFjY2Vzc29yIGludGVyZmFjZXMsIHRoZW4gcmV0dXJucyB0aGUgaW1wbGVtZW50YXRpb24gaW5zdGFuY2UuCi8vCi8vIFNlY3VyaXR5OiBPbmx5IGNvbnRyYWN0cyB3aXRoaW4gdGhlIGRvbWFpbiBwYXRoIGNhbiByZWdpc3RlciBpbml0aWFsaXplcnMuCi8vIEVhY2ggcGFja2FnZSBwYXRoIGNhbiBvbmx5IHJlZ2lzdGVyIG9uY2UgdG8gcHJldmVudCBkdXBsaWNhdGUgcmVnaXN0cmF0aW9ucy4KZnVuYyBSZWdpc3RlckluaXRpYWxpemVyKGN1ciByZWFsbSwgaW5pdGlhbGl6ZXIgZnVuYyhfIGludCwgcmxtIHJlYWxtLCBzdGFrZXJTdG9yZSBJU3Rha2VyU3RvcmUsIHBvb2xBY2Nlc3NvciBQb29sQWNjZXNzb3IsIGVtaXNzaW9uQWNjZXNzb3IgRW1pc3Npb25BY2Nlc3NvciwgbmZ0QWNjZXNzb3IgTkZUQWNjZXNzb3IpIElTdGFrZXIpIHsKCWluaXRpYWxpemVyRnVuYyA6PSBmdW5jKF8gaW50LCBybG0gcmVhbG0sIGRvbWFpblN0b3JlIGFueSkgYW55IHsKCQlhY2Nlc3MuQXNzZXJ0SXNSbG1DdXJyZW50KDAsIHJsbSkKCgkJY3VycmVudFN0YWtlclN0b3JlLCBvayA6PSBkb21haW5TdG9yZS4oSVN0YWtlclN0b3JlKQoJCWlmICFvayB7CgkJCXBhbmljKCJkb21haW5TdG9yZSBpcyBub3QgYW4gSVN0YWtlclN0b3JlIikKCQl9CgoJCXJldHVybiBpbml0aWFsaXplcigwLCBybG0sIGN1cnJlbnRTdGFrZXJTdG9yZSwgbmV3UG9vbEFjY2Vzc29yKCksIG5ld0VtaXNzaW9uQWNjZXNzb3IoKSwgbmV3TkZUQWNjZXNzb3IoKSkKCX0KCgllcnIgOj0gdmVyc2lvbk1hbmFnZXIuUmVnaXN0ZXJJbml0aWFsaXplcigwLCBjdXIsIGluaXRpYWxpemVyRnVuYykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgllcnIgPSB1cGRhdGVJbXBsZW1lbnRhdGlvbigpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cn0KCi8vIFVwZ3JhZGVJbXBsIHN3aXRjaGVzIHRoZSBhY3RpdmUgc3Rha2VyIGltcGxlbWVudGF0aW9uIHRvIGEgZGlmZmVyZW50IHZlcnNpb24uCi8vIEl0IGNoYW5nZXMgdGhlIGltcGxlbWVudGF0aW9uIHBvaW50ZXIgd2l0aG91dCB0cmFuc2Zvcm1pbmcgcGVyc2lzdGVkIHN0YXRlOyB0aGUKLy8gc2VsZWN0ZWQgaW1wbGVtZW50YXRpb24gbXVzdCB1bmRlcnN0YW5kIHRoZSBleGlzdGluZyBzdG9yYWdlIHNjaGVtYS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gcGFja2FnZVBhdGg6IFJlZ2lzdGVyZWQgcGFja2FnZSBwYXRoIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0byBhY3RpdmF0ZS4KLy8KLy8gU2VjdXJpdHk6IE9ubHkgYWRtaW4gb3IgZ292ZXJuYW5jZSBjYW4gcGVyZm9ybSB1cGdyYWRlcy4KLy8gVGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgdmlhIFJlZ2lzdGVySW5pdGlhbGl6ZXIuCmZ1bmMgVXBncmFkZUltcGwoY3VyIHJlYWxtLCBwYWNrYWdlUGF0aCBzdHJpbmcpIHsKCS8vIEVuc3VyZSBvbmx5IGFkbWluIG9yIGdvdmVybmFuY2UgY2FuIHBlcmZvcm0gdXBncmFkZXMKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWFjY2Vzcy5Bc3NlcnRJc0FkbWluT3JHb3Zlcm5hbmNlKGNhbGxlcikKCgllcnIgOj0gdmVyc2lvbk1hbmFnZXIuQ2hhbmdlSW1wbGVtZW50YXRpb24oMCwgY3VyLCBwYWNrYWdlUGF0aCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgllcnIgPSB1cGRhdGVJbXBsZW1lbnRhdGlvbigpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cn0KCi8vIEdldEltcGxlbWVudGF0aW9uUGFja2FnZVBhdGggcmV0dXJucyB0aGUgcGFja2FnZSBwYXRoIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIGltcGxlbWVudGF0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcGFja2FnZVBhdGg6IHBhY2thZ2UgcGF0aCBvZiB0aGUgYWN0aXZlIGltcGxlbWVudGF0aW9uCmZ1bmMgR2V0SW1wbGVtZW50YXRpb25QYWNrYWdlUGF0aCgpIHN0cmluZyB7CglyZXR1cm4gdmVyc2lvbk1hbmFnZXIuR2V0Q3VycmVudFBhY2thZ2VQYXRoKCkKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwSEwiI1KOFAxILNDA4MTg5dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDBJzVBMPi0jqizwud5so4H6Lp9Zc4oYF/2VGlIjXCuuESQO4lCFWRUuGvjCmRawTfnp1D2EWpZ7uhkZ/lmi3gux/UcidZFeCkUqTNladu96c6yXefo9yncQo6jjvqVSrl6SIaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=