@query-farm/vgi 0.25.3 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,24 @@
1
+ // © Copyright 2025-2026, Query.Farm LLC - https://query.farm
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ //
4
+ // VENDORED ASSET — DO NOT EDIT BY HAND.
5
+ // Browser build of the @query-farm/vgi client, authored in
6
+ // vgi-web-frontend (`bun run build:landing-client`). The shared landing
7
+ // page imports it from {prefix}/vgi-client.js to read catalog metadata
8
+ // over the VGI protocol. Base64-embedded so it survives single-file
9
+ // bundling (bun build) unchanged and is served as raw bytes.
10
+ // Regenerate with scripts/vendor-client-bundle.mjs.
11
+
12
+ const CLIENT_BUNDLE_B64 =
13
+ "dmFyIEFQPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgVVA9KCQpPT4kO2Z1bmN0aW9uIFJQKCQsWCl7dGhpc1skXT1VUC5iaW5kKG51bGwsWCl9dmFyIEMkPSgkLFgpPT57Zm9yKHZhciBRIGluIFgpQVAoJCxRLHtnZXQ6WFtRXSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxzZXQ6UlAuYmluZChYLFEpfSl9O3ZhciBBPSgkLFgpPT4oKT0+KCQmJihYPSQoJD0wKSksWCk7ZnVuY3Rpb24gSlcoJCxYKXt2YXIgUT17fTtmb3IodmFyIFogaW4gJClpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJCxaKSYmWC5pbmRleE9mKFopPDApUVtaXT0kW1pdO2lmKCQhPW51bGwmJnR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzPT09ImZ1bmN0aW9uIil7Zm9yKHZhciBKPTAsWj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKCQpO0o8Wi5sZW5ndGg7SisrKWlmKFguaW5kZXhPZihaW0pdKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoJCxaW0pdKSlRW1pbSl1dPSRbWltKXV19cmV0dXJuIFF9ZnVuY3Rpb24gVigkLFgsUSxaKXtmdW5jdGlvbiBKKFkpe3JldHVybiBZIGluc3RhbmNlb2YgUT9ZOm5ldyBRKGZ1bmN0aW9uKEgpe0goWSl9KX1yZXR1cm4gbmV3KFF8fChRPVByb21pc2UpKShmdW5jdGlvbihZLEgpe2Z1bmN0aW9uIFcocSl7dHJ5e0coWi5uZXh0KHEpKX1jYXRjaChMKXtIKEwpfX1mdW5jdGlvbiBQKHEpe3RyeXtHKFoudGhyb3cocSkpfWNhdGNoKEwpe0goTCl9fWZ1bmN0aW9uIEcocSl7cS5kb25lP1kocS52YWx1ZSk6SihxLnZhbHVlKS50aGVuKFcsUCl9RygoWj1aLmFwcGx5KCQsWHx8W10pKS5uZXh0KCkpfSl9ZnVuY3Rpb24gWlcoJCl7dmFyIFg9dHlwZW9mIFN5bWJvbD09PSJmdW5jdGlvbiImJlN5bWJvbC5pdGVyYXRvcixRPVgmJiRbWF0sWj0wO2lmKFEpcmV0dXJuIFEuY2FsbCgkKTtpZigkJiZ0eXBlb2YgJC5sZW5ndGg9PT0ibnVtYmVyIilyZXR1cm57bmV4dDpmdW5jdGlvbigpe2lmKCQmJlo+PSQubGVuZ3RoKSQ9dm9pZCAwO3JldHVybnt2YWx1ZTokJiYkW1orK10sZG9uZTohJH19fTt0aHJvdyBUeXBlRXJyb3IoWD8iT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iOiJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuIil9ZnVuY3Rpb24gcigkKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIHI/KHRoaXMudj0kLHRoaXMpOm5ldyByKCQpfWZ1bmN0aW9uIEkwKCQsWCxRKXtpZighU3ltYm9sLmFzeW5jSXRlcmF0b3IpdGhyb3cgVHlwZUVycm9yKCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTt2YXIgWj1RLmFwcGx5KCQsWHx8W10pLEosWT1bXTtyZXR1cm4gSj1PYmplY3QuY3JlYXRlKCh0eXBlb2YgQXN5bmNJdGVyYXRvcj09PSJmdW5jdGlvbiI/QXN5bmNJdGVyYXRvcjpPYmplY3QpLnByb3RvdHlwZSksVygibmV4dCIpLFcoInRocm93IiksVygicmV0dXJuIixIKSxKW1N5bWJvbC5hc3luY0l0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxKO2Z1bmN0aW9uIEgoVSl7cmV0dXJuIGZ1bmN0aW9uKGspe3JldHVybiBQcm9taXNlLnJlc29sdmUoaykudGhlbihVLEwpfX1mdW5jdGlvbiBXKFUsayl7aWYoWltVXSl7aWYoSltVXT1mdW5jdGlvbihTKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocyxQOCl7WS5wdXNoKFtVLFMscyxQOF0pPjF8fFAoVSxTKX0pfSxrKUpbVV09ayhKW1VdKX19ZnVuY3Rpb24gUChVLGspe3RyeXtHKFpbVV0oaykpfWNhdGNoKFMpe04oWVswXVszXSxTKX19ZnVuY3Rpb24gRyhVKXtVLnZhbHVlIGluc3RhbmNlb2Ygcj9Qcm9taXNlLnJlc29sdmUoVS52YWx1ZS52KS50aGVuKHEsTCk6TihZWzBdWzJdLFUpfWZ1bmN0aW9uIHEoVSl7UCgibmV4dCIsVSl9ZnVuY3Rpb24gTChVKXtQKCJ0aHJvdyIsVSl9ZnVuY3Rpb24gTihVLGspe2lmKFUoayksWS5zaGlmdCgpLFkubGVuZ3RoKVAoWVswXVswXSxZWzBdWzFdKX19ZnVuY3Rpb24gS1goJCl7dmFyIFgsUTtyZXR1cm4gWD17fSxaKCJuZXh0IiksWigidGhyb3ciLGZ1bmN0aW9uKEope3Rocm93IEp9KSxaKCJyZXR1cm4iKSxYW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sWDtmdW5jdGlvbiBaKEosWSl7WFtKXT0kW0pdP2Z1bmN0aW9uKEgpe3JldHVybihRPSFRKT97dmFsdWU6cigkW0pdKEgpKSxkb25lOiExfTpZP1koSCk6SH06WX19ZnVuY3Rpb24gWSQoJCl7aWYoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKXRocm93IFR5cGVFcnJvcigiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuIik7dmFyIFg9JFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0sUTtyZXR1cm4gWD9YLmNhbGwoJCk6KCQ9dHlwZW9mIFpXPT09ImZ1bmN0aW9uIj9aVygkKTokW1N5bWJvbC5pdGVyYXRvcl0oKSxRPXt9LFooIm5leHQiKSxaKCJ0aHJvdyIpLFooInJldHVybiIpLFFbU3ltYm9sLmFzeW5jSXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LFEpO2Z1bmN0aW9uIFooWSl7UVtZXT0kW1ldJiZmdW5jdGlvbihIKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oVyxQKXtIPSRbWV0oSCksSihXLFAsSC5kb25lLEgudmFsdWUpfSl9fWZ1bmN0aW9uIEooWSxILFcsUCl7UHJvbWlzZS5yZXNvbHZlKFApLnRoZW4oZnVuY3Rpb24oRyl7WSh7dmFsdWU6Ryxkb25lOld9KX0sSCl9fXZhciBkMD0oKT0+e307dmFyIFlXLFBYLENQLEgkPSgkKT0+Q1AuZW5jb2RlKCQpO3ZhciBVMT1BKCgpPT57WVc9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIpLFBYPVlXLmRlY29kZS5iaW5kKFlXKSxDUD1uZXcgVGV4dEVuY29kZXJ9KTt2YXIgT1A9KCQpPT50eXBlb2YgJD09PSJudW1iZXIiLEhXPSgkKT0+dHlwZW9mICQ9PT0iYm9vbGVhbiIsbjg9KCQpPT50eXBlb2YgJD09PSJmdW5jdGlvbiIsXzA9KCQpPT4kIT1udWxsJiZPYmplY3QoJCk9PT0kLFckPSgkKT0+e3JldHVybiBfMCgkKSYmbjgoJC50aGVuKX0sZyQ9KCQpPT57cmV0dXJuIF8wKCQpJiZuOCgkW1N5bWJvbC5pdGVyYXRvcl0pfSxPJD0oJCk9PntyZXR1cm4gXzAoJCkmJm44KCRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKX0sSVo9KCQpPT57cmV0dXJuIF8wKCQpJiZfMCgkLnNjaGVtYSl9LF9aPSgkKT0+e3JldHVybiBfMCgkKSYmImRvbmUiaW4gJCYmInZhbHVlImluICR9LFRaPSgkKT0+e3JldHVybiBfMCgkKSYmbjgoJC5zdGF0KSYmT1AoJC5mZCl9LHhaPSgkKT0+e3JldHVybiBfMCgkKSYmVVEoJC5ib2R5KX0sZ1o9KCQpPT4oIl9nZXRET01TdHJlYW0iaW4gJCkmJigiX2dldE5vZGVTdHJlYW0iaW4gJCksV1c9KCQpPT57cmV0dXJuIF8wKCQpJiZuOCgkLmFib3J0KSYmbjgoJC5nZXRXcml0ZXIpJiYhZ1ooJCl9LFVRPSgkKT0+e3JldHVybiBfMCgkKSYmbjgoJC5jYW5jZWwpJiZuOCgkLmdldFJlYWRlcikmJiFnWigkKX0sS1c9KCQpPT57cmV0dXJuIF8wKCQpJiZuOCgkLmVuZCkmJm44KCQud3JpdGUpJiZIVygkLndyaXRhYmxlKSYmIWdaKCQpfSx2Wj0oJCk9PntyZXR1cm4gXzAoJCkmJm44KCQucmVhZCkmJm44KCQucGlwZSkmJkhXKCQucmVhZGFibGUpJiYhZ1ooJCl9LFBXPSgkKT0+e3JldHVybiBfMCgkKSYmbjgoJC5jbGVhcikmJm44KCQuYnl0ZXMpJiZuOCgkLnBvc2l0aW9uKSYmbjgoJC5zZXRQb3NpdGlvbikmJm44KCQuY2FwYWNpdHkpJiZuOCgkLmdldEJ1ZmZlcklkZW50aWZpZXIpJiZuOCgkLmNyZWF0ZUxvbmcpfTt2YXIgWVk9e307QyQoWVkse3RvVWludDhDbGFtcGVkQXJyYXlJdGVyYXRvcjooKT0+ZlAsdG9VaW50OENsYW1wZWRBcnJheUFzeW5jSXRlcmF0b3I6KCk9Pm9QLHRvVWludDhDbGFtcGVkQXJyYXk6KCk9Pl9QLHRvVWludDhBcnJheUl0ZXJhdG9yOigpPT5RWSx0b1VpbnQ4QXJyYXlBc3luY0l0ZXJhdG9yOigpPT5aWSx0b1VpbnQ4QXJyYXk6KCk9PngsdG9VaW50MzJBcnJheUl0ZXJhdG9yOigpPT5oUCx0b1VpbnQzMkFycmF5QXN5bmNJdGVyYXRvcjooKT0+ZFAsdG9VaW50MzJBcnJheTooKT0+d1AsdG9VaW50MTZBcnJheUl0ZXJhdG9yOigpPT52UCx0b1VpbnQxNkFycmF5QXN5bmNJdGVyYXRvcjooKT0+dVAsdG9VaW50MTZBcnJheTooKT0+RFAsdG9JbnQ4QXJyYXlJdGVyYXRvcjooKT0+VFAsdG9JbnQ4QXJyYXlBc3luY0l0ZXJhdG9yOigpPT5iUCx0b0ludDhBcnJheTooKT0+alAsdG9JbnQzMkFycmF5SXRlcmF0b3I6KCk9PmdQLHRvSW50MzJBcnJheUFzeW5jSXRlcmF0b3I6KCk9PmNQLHRvSW50MzJBcnJheTooKT0+QTYsdG9JbnQxNkFycmF5SXRlcmF0b3I6KCk9PnhQLHRvSW50MTZBcnJheUFzeW5jSXRlcmF0b3I6KCk9PnBQLHRvSW50MTZBcnJheTooKT0+U1AsdG9GbG9hdDY0QXJyYXlJdGVyYXRvcjooKT0+bVAsdG9GbG9hdDY0QXJyYXlBc3luY0l0ZXJhdG9yOigpPT5uUCx0b0Zsb2F0NjRBcnJheTooKT0+SVAsdG9GbG9hdDMyQXJyYXlJdGVyYXRvcjooKT0+eVAsdG9GbG9hdDMyQXJyYXlBc3luY0l0ZXJhdG9yOigpPT5sUCx0b0Zsb2F0MzJBcnJheTooKT0+QlAsdG9CaWdVaW50NjRBcnJheTooKT0+VlAsdG9CaWdJbnQ2NEFycmF5OigpPT5oWix0b0FycmF5QnVmZmVyVmlld0l0ZXJhdG9yOigpPT5RMSx0b0FycmF5QnVmZmVyVmlld0FzeW5jSXRlcmF0b3I6KCk9PnYkLHRvQXJyYXlCdWZmZXJWaWV3OigpPT50LHJlYmFzZVZhbHVlT2Zmc2V0czooKT0+eVosbWVtY3B5OigpPT5SUSxqb2luVWludDhBcnJheXM6KCk9PkskLGNvbXBhcmVBcnJheUxpa2U6KCk9PkpZfSk7ZnVuY3Rpb24ga1AoJCl7bGV0IFg9JFswXT9bJFswXV06W10sUSxaLEosWTtmb3IobGV0IEgsVyxQPTAsRz0wLHE9JC5sZW5ndGg7KytQPHE7KXtpZihIPVhbR10sVz0kW1BdLCFIfHwhV3x8SC5idWZmZXIhPT1XLmJ1ZmZlcnx8Vy5ieXRlT2Zmc2V0PEguYnl0ZU9mZnNldCl7VyYmKFhbKytHXT1XKTtjb250aW51ZX1pZih7Ynl0ZU9mZnNldDpRLGJ5dGVMZW5ndGg6Sn09SCx7Ynl0ZU9mZnNldDpaLGJ5dGVMZW5ndGg6WX09VyxRK0o8Wnx8WitZPFEpe1cmJihYWysrR109Vyk7Y29udGludWV9WFtHXT1uZXcgVWludDhBcnJheShILmJ1ZmZlcixRLFotUStZKX1yZXR1cm4gWH1mdW5jdGlvbiBSUSgkLFgsUT0wLFo9WC5ieXRlTGVuZ3RoKXtsZXQgSj0kLmJ5dGVMZW5ndGgsWT1uZXcgVWludDhBcnJheSgkLmJ1ZmZlciwkLmJ5dGVPZmZzZXQsSiksSD1uZXcgVWludDhBcnJheShYLmJ1ZmZlcixYLmJ5dGVPZmZzZXQsTWF0aC5taW4oWixKKSk7cmV0dXJuIFkuc2V0KEgsUSksJH1mdW5jdGlvbiBLJCgkLFgpe2xldCBRPWtQKCQpLFo9US5yZWR1Y2UoKHEsTCk9PnErTC5ieXRlTGVuZ3RoLDApLEosWSxILFc9MCxQPS0xLEc9TWF0aC5taW4oWHx8TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFopO2ZvcihsZXQgcT1RLmxlbmd0aDsrK1A8cTspe2lmKEo9UVtQXSxZPUouc3ViYXJyYXkoMCxNYXRoLm1pbihKLmxlbmd0aCxHLVcpKSxHPD1XK1kubGVuZ3RoKXtpZihZLmxlbmd0aDxKLmxlbmd0aClRW1BdPUouc3ViYXJyYXkoWS5sZW5ndGgpO2Vsc2UgaWYoWS5sZW5ndGg9PT1KLmxlbmd0aClQKys7SD9SUShILFksVyk6SD1ZO2JyZWFrfVJRKEh8fChIPW5ldyBVaW50OEFycmF5KEcpKSxZLFcpLFcrPVkubGVuZ3RofXJldHVybltIfHxuZXcgVWludDhBcnJheSgwKSxRLnNsaWNlKFApLFotKEg/SC5ieXRlTGVuZ3RoOjApXX1mdW5jdGlvbiB0KCQsWCl7bGV0IFE9X1ooWCk/WC52YWx1ZTpYO2lmKFEgaW5zdGFuY2VvZiAkKXtpZigkPT09VWludDhBcnJheSlyZXR1cm4gbmV3ICQoUS5idWZmZXIsUS5ieXRlT2Zmc2V0LFEuYnl0ZUxlbmd0aCk7cmV0dXJuIFF9aWYoIVEpcmV0dXJuIG5ldyAkKDApO2lmKHR5cGVvZiBRPT09InN0cmluZyIpUT1IJChRKTtpZihRIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpcmV0dXJuIG5ldyAkKFEpO2lmKFEgaW5zdGFuY2VvZiBYWSlyZXR1cm4gbmV3ICQoUSk7aWYoUFcoUSkpcmV0dXJuIHQoJCxRLmJ5dGVzKCkpO3JldHVybiFBcnJheUJ1ZmZlci5pc1ZpZXcoUSk/JC5mcm9tKFEpOlEuYnl0ZUxlbmd0aDw9MD9uZXcgJCgwKTpuZXcgJChRLmJ1ZmZlcixRLmJ5dGVPZmZzZXQsUS5ieXRlTGVuZ3RoLyQuQllURVNfUEVSX0VMRU1FTlQpfWZ1bmN0aW9uKlExKCQsWCl7bGV0IFE9ZnVuY3Rpb24qKEope3lpZWxkIEp9LFo9dHlwZW9mIFg9PT0ic3RyaW5nIj9RKFgpOkFycmF5QnVmZmVyLmlzVmlldyhYKT9RKFgpOlggaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9RKFgpOlggaW5zdGFuY2VvZiBYWT9RKFgpOiFnJChYKT9RKFgpOlg7cmV0dXJuIHlpZWxkKiRZKGZ1bmN0aW9uKihKKXtsZXQgWT1udWxsO2RvIFk9Si5uZXh0KHlpZWxkIHQoJCxZKSk7d2hpbGUoIVkuZG9uZSl9KFpbU3ltYm9sLml0ZXJhdG9yXSgpKSksbmV3ICR9ZnVuY3Rpb24gdiQoJCxYKXtyZXR1cm4gSTAodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKCl7aWYoVyQoWCkpcmV0dXJuIHlpZWxkIHIoeWllbGQgcih5aWVsZCpLWChZJCh2JCgkLHlpZWxkIHIoWCkpKSkpKTtsZXQgWj1mdW5jdGlvbihIKXtyZXR1cm4gSTAodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKCl7eWllbGQgeWllbGQgcih5aWVsZCByKEgpKX0pfSxKPWZ1bmN0aW9uKEgpe3JldHVybiBJMCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooKXt5aWVsZCByKHlpZWxkKktYKFkkKCRZKGZ1bmN0aW9uKihXKXtsZXQgUD1udWxsO2RvIFA9Vy5uZXh0KHlpZWxkIFA9PT1udWxsfHxQPT09dm9pZCAwP3ZvaWQgMDpQLnZhbHVlKTt3aGlsZSghUC5kb25lKX0oSFtTeW1ib2wuaXRlcmF0b3JdKCkpKSkpKX0pfSxZPXR5cGVvZiBYPT09InN0cmluZyI/WihYKTpBcnJheUJ1ZmZlci5pc1ZpZXcoWCk/WihYKTpYIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/WihYKTpYIGluc3RhbmNlb2YgWFk/WihYKTpnJChYKT9KKFgpOiFPJChYKT9aKFgpOlg7cmV0dXJuIHlpZWxkIHIoeWllbGQqS1goWSQoJFkoZnVuY3Rpb24oSCl7cmV0dXJuIEkwKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKigpe2xldCBXPW51bGw7ZG8gVz15aWVsZCByKEgubmV4dCh5aWVsZCB5aWVsZCByKHQoJCxXKSkpKTt3aGlsZSghVy5kb25lKX0pfShZW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpKSkpKSkseWllbGQgcihuZXcgJCl9KX1mdW5jdGlvbiB5WigkLFgsUSl7aWYoJCE9PTApe1E9US5zbGljZSgwLFgpO2ZvcihsZXQgWj0tMSxKPVEubGVuZ3RoOysrWjxKOylRW1pdKz0kfXJldHVybiBRLnN1YmFycmF5KDAsWCl9ZnVuY3Rpb24gSlkoJCxYKXtsZXQgUT0wLFo9JC5sZW5ndGg7aWYoWiE9PVgubGVuZ3RoKXJldHVybiExO2lmKFo+MClkbyBpZigkW1FdIT09WFtRXSlyZXR1cm4hMTt3aGlsZSgrK1E8Wik7cmV0dXJuITB9dmFyIFhZLGpQPSgkKT0+dChJbnQ4QXJyYXksJCksU1A9KCQpPT50KEludDE2QXJyYXksJCksQTY9KCQpPT50KEludDMyQXJyYXksJCksaFo9KCQpPT50KEJpZ0ludDY0QXJyYXksJCkseD0oJCk9PnQoVWludDhBcnJheSwkKSxEUD0oJCk9PnQoVWludDE2QXJyYXksJCksd1A9KCQpPT50KFVpbnQzMkFycmF5LCQpLFZQPSgkKT0+dChCaWdVaW50NjRBcnJheSwkKSxCUD0oJCk9PnQoRmxvYXQzMkFycmF5LCQpLElQPSgkKT0+dChGbG9hdDY0QXJyYXksJCksX1A9KCQpPT50KFVpbnQ4Q2xhbXBlZEFycmF5LCQpLCRZPSgkKT0+e3JldHVybiAkLm5leHQoKSwkfSxUUD0oJCk9PlExKEludDhBcnJheSwkKSx4UD0oJCk9PlExKEludDE2QXJyYXksJCksZ1A9KCQpPT5RMShJbnQzMkFycmF5LCQpLFFZPSgkKT0+UTEoVWludDhBcnJheSwkKSx2UD0oJCk9PlExKFVpbnQxNkFycmF5LCQpLGhQPSgkKT0+UTEoVWludDMyQXJyYXksJCkseVA9KCQpPT5RMShGbG9hdDMyQXJyYXksJCksbVA9KCQpPT5RMShGbG9hdDY0QXJyYXksJCksZlA9KCQpPT5RMShVaW50OENsYW1wZWRBcnJheSwkKSxiUD0oJCk9PnYkKEludDhBcnJheSwkKSxwUD0oJCk9PnYkKEludDE2QXJyYXksJCksY1A9KCQpPT52JChJbnQzMkFycmF5LCQpLFpZPSgkKT0+diQoVWludDhBcnJheSwkKSx1UD0oJCk9PnYkKFVpbnQxNkFycmF5LCQpLGRQPSgkKT0+diQoVWludDMyQXJyYXksJCksbFA9KCQpPT52JChGbG9hdDMyQXJyYXksJCksblA9KCQpPT52JChGbG9hdDY0QXJyYXksJCksb1A9KCQpPT52JChVaW50OENsYW1wZWRBcnJheSwkKTt2YXIgbzg9QSgoKT0+e2QwKCk7VTEoKTtYWT10eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXI8InUiP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyfSk7ZnVuY3Rpb24qc1AoJCl7bGV0IFgsUT0hMSxaPVtdLEosWSxILFc9MDtmdW5jdGlvbiBQKCl7aWYoWT09PSJwZWVrIilyZXR1cm4gSyQoWixIKVswXTtyZXR1cm5bSixaLFddPUskKFosSCksSn0oe2NtZDpZLHNpemU6SH09KHlpZWxkKCgpPT5udWxsKSgpKXx8e2NtZDoicmVhZCIsc2l6ZTowfSk7bGV0IEc9UVkoJClbU3ltYm9sLml0ZXJhdG9yXSgpO3RyeXtkb3tpZih7ZG9uZTpYLHZhbHVlOkp9PU51bWJlci5pc05hTihILVcpP0cubmV4dCgpOkcubmV4dChILVcpLCFYJiZKLmJ5dGVMZW5ndGg+MClaLnB1c2goSiksVys9Si5ieXRlTGVuZ3RoO2lmKFh8fEg8PVcpZG8oe2NtZDpZLHNpemU6SH09eWllbGQgUCgpKTt3aGlsZShIPFcpfXdoaWxlKCFYKX1jYXRjaChxKXtRPSEwLHR5cGVvZiBHLnRocm93PT09ImZ1bmN0aW9uIiYmRy50aHJvdyhxKX1maW5hbGx5e1E9PT0hMSYmdHlwZW9mIEcucmV0dXJuPT09ImZ1bmN0aW9uIiYmRy5yZXR1cm4obnVsbCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gclAoJCl7cmV0dXJuIEkwKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKigpe2xldCBRLFo9ITEsSj1bXSxZLEgsVyxQPTA7ZnVuY3Rpb24gRygpe2lmKEg9PT0icGVlayIpcmV0dXJuIEskKEosVylbMF07cmV0dXJuW1ksSixQXT1LJChKLFcpLFl9KHtjbWQ6SCxzaXplOld9PSh5aWVsZCB5aWVsZCByKCgoKT0+bnVsbCkoKSkpfHx7Y21kOiJyZWFkIixzaXplOjB9KTtsZXQgcT1aWSgkKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTt0cnl7ZG97aWYoe2RvbmU6USx2YWx1ZTpZfT1OdW1iZXIuaXNOYU4oVy1QKT95aWVsZCByKHEubmV4dCgpKTp5aWVsZCByKHEubmV4dChXLVApKSwhUSYmWS5ieXRlTGVuZ3RoPjApSi5wdXNoKFkpLFArPVkuYnl0ZUxlbmd0aDtpZihRfHxXPD1QKWRvKHtjbWQ6SCxzaXplOld9PXlpZWxkIHlpZWxkIHIoRygpKSk7d2hpbGUoVzxQKX13aGlsZSghUSl9Y2F0Y2goTCl7Wj0hMCx0eXBlb2YgcS50aHJvdz09PSJmdW5jdGlvbiImJih5aWVsZCByKHEudGhyb3coTCkpKX1maW5hbGx5e1o9PT0hMSYmdHlwZW9mIHEucmV0dXJuPT09ImZ1bmN0aW9uIiYmKHlpZWxkIHIocS5yZXR1cm4obmV3IFVpbnQ4QXJyYXkoMCkpKSl9cmV0dXJuIHlpZWxkIHIobnVsbCl9KX1mdW5jdGlvbiBpUCgkKXtyZXR1cm4gSTAodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKCl7bGV0IFE9ITEsWj0hMSxKPVtdLFksSCxXLFA9MDtmdW5jdGlvbiBHKCl7aWYoSD09PSJwZWVrIilyZXR1cm4gSyQoSixXKVswXTtyZXR1cm5bWSxKLFBdPUskKEosVyksWX0oe2NtZDpILHNpemU6V309KHlpZWxkIHlpZWxkIHIoKCgpPT5udWxsKSgpKSl8fHtjbWQ6InJlYWQiLHNpemU6MH0pO2xldCBxPW5ldyBHVygkKTt0cnl7ZG97aWYoe2RvbmU6USx2YWx1ZTpZfT1OdW1iZXIuaXNOYU4oVy1QKT95aWVsZCByKHEucmVhZCgpKTp5aWVsZCByKHEucmVhZChXLVApKSwhUSYmWS5ieXRlTGVuZ3RoPjApSi5wdXNoKHgoWSkpLFArPVkuYnl0ZUxlbmd0aDtpZihRfHxXPD1QKWRvKHtjbWQ6SCxzaXplOld9PXlpZWxkIHlpZWxkIHIoRygpKSk7d2hpbGUoVzxQKX13aGlsZSghUSl9Y2F0Y2goTCl7Wj0hMCx5aWVsZCByKHEuY2FuY2VsKEwpKX1maW5hbGx5e1o9PT0hMT95aWVsZCByKHEuY2FuY2VsKCkpOiQubG9ja2VkJiZxLnJlbGVhc2VMb2NrKCl9cmV0dXJuIHlpZWxkIHIobnVsbCl9KX1jbGFzcyBHV3tjb25zdHJ1Y3RvcigkKXt0aGlzLnNvdXJjZT0kLHRoaXMucmVhZGVyPW51bGwsdGhpcy5yZWFkZXI9dGhpcy5zb3VyY2UuZ2V0UmVhZGVyKCksdGhpcy5yZWFkZXIuY2xvc2VkLmNhdGNoKCgpPT57fSl9Z2V0IGNsb3NlZCgpe3JldHVybiB0aGlzLnJlYWRlcj90aGlzLnJlYWRlci5jbG9zZWQuY2F0Y2goKCk9Pnt9KTpQcm9taXNlLnJlc29sdmUoKX1yZWxlYXNlTG9jaygpe2lmKHRoaXMucmVhZGVyKXRoaXMucmVhZGVyLnJlbGVhc2VMb2NrKCk7dGhpcy5yZWFkZXI9bnVsbH1jYW5jZWwoJCl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2xldHtyZWFkZXI6WCxzb3VyY2U6UX09dGhpcztYJiYoeWllbGQgWC5jYW5jZWwoJCkuY2F0Y2goKCk9Pnt9KSksUSYmKFEubG9ja2VkJiZ0aGlzLnJlbGVhc2VMb2NrKCkpfSl9cmVhZCgkKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7aWYoJD09PTApcmV0dXJue2RvbmU6dGhpcy5yZWFkZXI9PW51bGwsdmFsdWU6bmV3IFVpbnQ4QXJyYXkoMCl9O2xldCBYPXlpZWxkIHRoaXMucmVhZGVyLnJlYWQoKTtyZXR1cm4hWC5kb25lJiYoWC52YWx1ZT14KFgpKSxYfSl9fWZ1bmN0aW9uIGFQKCQpe3JldHVybiBJMCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooKXtsZXQgUT1bXSxaPSJlcnJvciIsSj0hMSxZPW51bGwsSCxXLFA9MCxHPVtdLHE7ZnVuY3Rpb24gTCgpe2lmKEg9PT0icGVlayIpcmV0dXJuIEskKEcsVylbMF07cmV0dXJuW3EsRyxQXT1LJChHLFcpLHF9aWYoe2NtZDpILHNpemU6V309KHlpZWxkIHlpZWxkIHIoKCgpPT5udWxsKSgpKSl8fHtjbWQ6InJlYWQiLHNpemU6MH0sJC5pc1RUWSlyZXR1cm4geWllbGQgeWllbGQgcihuZXcgVWludDhBcnJheSgwKSkseWllbGQgcihudWxsKTt0cnl7UVswXT1IWSgkLCJlbmQiKSxRWzFdPUhZKCQsImVycm9yIik7ZG97aWYoUVsyXT1IWSgkLCJyZWFkYWJsZSIpLFtaLFldPXlpZWxkIHIoUHJvbWlzZS5yYWNlKFEubWFwKChVKT0+VVsyXSkpKSxaPT09ImVycm9yIilicmVhaztpZighKEo9Wj09PSJlbmQiKSl7aWYoIU51bWJlci5pc0Zpbml0ZShXLVApKXE9eCgkLnJlYWQoKSk7ZWxzZSBpZihxPXgoJC5yZWFkKFctUCkpLHEuYnl0ZUxlbmd0aDxXLVApcT14KCQucmVhZCgpKTtpZihxLmJ5dGVMZW5ndGg+MClHLnB1c2gocSksUCs9cS5ieXRlTGVuZ3RofWlmKEp8fFc8PVApZG8oe2NtZDpILHNpemU6V309eWllbGQgeWllbGQgcihMKCkpKTt3aGlsZShXPFApfXdoaWxlKCFKKX1maW5hbGx5e3lpZWxkIHIoTihRLFo9PT0iZXJyb3IiP1k6bnVsbCkpfXJldHVybiB5aWVsZCByKG51bGwpO2Z1bmN0aW9uIE4oVSxrKXtyZXR1cm4gcT1HPW51bGwsbmV3IFByb21pc2UoKFMscyk9Pntmb3IobGV0W1A4LEQ4XW9mIFUpJC5vZmYoUDgsRDgpO3RyeXtsZXQgUDg9JC5kZXN0cm95O1A4JiZQOC5jYWxsKCQsayksaz12b2lkIDB9Y2F0Y2goUDgpe2s9UDh8fGt9ZmluYWxseXtrIT1udWxsP3Moayk6UygpfX0pfX0pfXZhciBLMCxtWj0oJCk9PntyZXR1cm4gJC5uZXh0KCksJH0sSFk9KCQsWCk9PntsZXQgUT0oSik9PlooW1gsSl0pLFo7cmV0dXJuW1gsUSxuZXcgUHJvbWlzZSgoSik9PihaPUopJiYkLm9uY2UoWCxRKSldfTt2YXIgQ1E9QSgoKT0+e2QwKCk7bzgoKTtLMD17ZnJvbUl0ZXJhYmxlKCQpe3JldHVybiBtWihzUCgkKSl9LGZyb21Bc3luY0l0ZXJhYmxlKCQpe3JldHVybiBtWihyUCgkKSl9LGZyb21ET01TdHJlYW0oJCl7cmV0dXJuIG1aKGlQKCQpKX0sZnJvbU5vZGVTdHJlYW0oJCl7cmV0dXJuIG1aKGFQKCQpKX0sdG9ET01TdHJlYW0oJCxYKXt0aHJvdyBFcnJvcignInRvRE9NU3RyZWFtIiBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQnKX0sdG9Ob2RlU3RyZWFtKCQsWCl7dGhyb3cgRXJyb3IoJyJ0b05vZGVTdHJlYW0iIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudCcpfX19KTt2YXIgcTg7dmFyIGZaPUEoKCk9PnsoZnVuY3Rpb24oJCl7JFskLlYxPTBdPSJWMSIsJFskLlYyPTFdPSJWMiIsJFskLlYzPTJdPSJWMyIsJFskLlY0PTNdPSJWNCIsJFskLlY1PTRdPSJWNSJ9KShxOHx8KHE4PXt9KSl9KTt2YXIgJDg7dmFyIFdZPUEoKCk9PnsoZnVuY3Rpb24oJCl7JFskLlNwYXJzZT0wXT0iU3BhcnNlIiwkWyQuRGVuc2U9MV09IkRlbnNlIn0pKCQ4fHwoJDg9e30pKX0pO3ZhciB6ODt2YXIgS1k9QSgoKT0+eyhmdW5jdGlvbigkKXskWyQuSEFMRj0wXT0iSEFMRiIsJFskLlNJTkdMRT0xXT0iU0lOR0xFIiwkWyQuRE9VQkxFPTJdPSJET1VCTEUifSkoejh8fCh6OD17fSkpfSk7dmFyIEo4O3ZhciBQWT1BKCgpPT57KGZ1bmN0aW9uKCQpeyRbJC5EQVk9MF09IkRBWSIsJFskLk1JTExJU0VDT05EPTFdPSJNSUxMSVNFQ09ORCJ9KShKOHx8KEo4PXt9KSl9KTt2YXIgTzt2YXIgT1E9QSgoKT0+eyhmdW5jdGlvbigkKXskWyQuU0VDT05EPTBdPSJTRUNPTkQiLCRbJC5NSUxMSVNFQ09ORD0xXT0iTUlMTElTRUNPTkQiLCRbJC5NSUNST1NFQ09ORD0yXT0iTUlDUk9TRUNPTkQiLCRbJC5OQU5PU0VDT05EPTNdPSJOQU5PU0VDT05EIn0pKE98fChPPXt9KSl9KTt2YXIgZTt2YXIgR1k9QSgoKT0+eyhmdW5jdGlvbigkKXskWyQuWUVBUl9NT05USD0wXT0iWUVBUl9NT05USCIsJFskLkRBWV9USU1FPTFdPSJEQVlfVElNRSIsJFskLk1PTlRIX0RBWV9OQU5PPTJdPSJNT05USF9EQVlfTkFOTyJ9KShlfHwoZT17fSkpfSk7dmFyIGtRPTIsUCQ9NCxrJD00LEk9NDt2YXIgWjEsYloscFosR1g7dmFyIHFZPUEoKCk9PntaMT1uZXcgSW50MzJBcnJheSgyKSxiWj1uZXcgRmxvYXQzMkFycmF5KFoxLmJ1ZmZlcikscFo9bmV3IEZsb2F0NjRBcnJheShaMS5idWZmZXIpLEdYPW5ldyBVaW50MTZBcnJheShuZXcgVWludDhBcnJheShbMSwwXSkuYnVmZmVyKVswXT09PTF9KTt2YXIgalE7dmFyIHpZPUEoKCk9PnsoZnVuY3Rpb24oJCl7JFskLlVURjhfQllURVM9MV09IlVURjhfQllURVMiLCRbJC5VVEYxNl9TVFJJTkc9Ml09IlVURjE2X1NUUklORyJ9KShqUXx8KGpRPXt9KSl9KTtjbGFzcyBQMHtjb25zdHJ1Y3RvcigkKXt0aGlzLmJ5dGVzXz0kLHRoaXMucG9zaXRpb25fPTAsdGhpcy50ZXh0X2RlY29kZXJfPW5ldyBUZXh0RGVjb2Rlcn1zdGF0aWMgYWxsb2NhdGUoJCl7cmV0dXJuIG5ldyBQMChuZXcgVWludDhBcnJheSgkKSl9Y2xlYXIoKXt0aGlzLnBvc2l0aW9uXz0wfWJ5dGVzKCl7cmV0dXJuIHRoaXMuYnl0ZXNffXBvc2l0aW9uKCl7cmV0dXJuIHRoaXMucG9zaXRpb25ffXNldFBvc2l0aW9uKCQpe3RoaXMucG9zaXRpb25fPSR9Y2FwYWNpdHkoKXtyZXR1cm4gdGhpcy5ieXRlc18ubGVuZ3RofXJlYWRJbnQ4KCQpe3JldHVybiB0aGlzLnJlYWRVaW50OCgkKTw8MjQ+PjI0fXJlYWRVaW50OCgkKXtyZXR1cm4gdGhpcy5ieXRlc19bJF19cmVhZEludDE2KCQpe3JldHVybiB0aGlzLnJlYWRVaW50MTYoJCk8PDE2Pj4xNn1yZWFkVWludDE2KCQpe3JldHVybiB0aGlzLmJ5dGVzX1skXXx0aGlzLmJ5dGVzX1skKzFdPDw4fXJlYWRJbnQzMigkKXtyZXR1cm4gdGhpcy5ieXRlc19bJF18dGhpcy5ieXRlc19bJCsxXTw8OHx0aGlzLmJ5dGVzX1skKzJdPDwxNnx0aGlzLmJ5dGVzX1skKzNdPDwyNH1yZWFkVWludDMyKCQpe3JldHVybiB0aGlzLnJlYWRJbnQzMigkKT4+PjB9cmVhZEludDY0KCQpe3JldHVybiBCaWdJbnQuYXNJbnROKDY0LEJpZ0ludCh0aGlzLnJlYWRVaW50MzIoJCkpKyhCaWdJbnQodGhpcy5yZWFkVWludDMyKCQrNCkpPDxCaWdJbnQoMzIpKSl9cmVhZFVpbnQ2NCgkKXtyZXR1cm4gQmlnSW50LmFzVWludE4oNjQsQmlnSW50KHRoaXMucmVhZFVpbnQzMigkKSkrKEJpZ0ludCh0aGlzLnJlYWRVaW50MzIoJCs0KSk8PEJpZ0ludCgzMikpKX1yZWFkRmxvYXQzMigkKXtyZXR1cm4gWjFbMF09dGhpcy5yZWFkSW50MzIoJCksYlpbMF19cmVhZEZsb2F0NjQoJCl7cmV0dXJuIFoxW0dYPzA6MV09dGhpcy5yZWFkSW50MzIoJCksWjFbR1g/MTowXT10aGlzLnJlYWRJbnQzMigkKzQpLHBaWzBdfXdyaXRlSW50OCgkLFgpe3RoaXMuYnl0ZXNfWyRdPVh9d3JpdGVVaW50OCgkLFgpe3RoaXMuYnl0ZXNfWyRdPVh9d3JpdGVJbnQxNigkLFgpe3RoaXMuYnl0ZXNfWyRdPVgsdGhpcy5ieXRlc19bJCsxXT1YPj44fXdyaXRlVWludDE2KCQsWCl7dGhpcy5ieXRlc19bJF09WCx0aGlzLmJ5dGVzX1skKzFdPVg+Pjh9d3JpdGVJbnQzMigkLFgpe3RoaXMuYnl0ZXNfWyRdPVgsdGhpcy5ieXRlc19bJCsxXT1YPj44LHRoaXMuYnl0ZXNfWyQrMl09WD4+MTYsdGhpcy5ieXRlc19bJCszXT1YPj4yNH13cml0ZVVpbnQzMigkLFgpe3RoaXMuYnl0ZXNfWyRdPVgsdGhpcy5ieXRlc19bJCsxXT1YPj44LHRoaXMuYnl0ZXNfWyQrMl09WD4+MTYsdGhpcy5ieXRlc19bJCszXT1YPj4yNH13cml0ZUludDY0KCQsWCl7dGhpcy53cml0ZUludDMyKCQsTnVtYmVyKEJpZ0ludC5hc0ludE4oMzIsWCkpKSx0aGlzLndyaXRlSW50MzIoJCs0LE51bWJlcihCaWdJbnQuYXNJbnROKDMyLFg+PkJpZ0ludCgzMikpKSl9d3JpdGVVaW50NjQoJCxYKXt0aGlzLndyaXRlVWludDMyKCQsTnVtYmVyKEJpZ0ludC5hc1VpbnROKDMyLFgpKSksdGhpcy53cml0ZVVpbnQzMigkKzQsTnVtYmVyKEJpZ0ludC5hc1VpbnROKDMyLFg+PkJpZ0ludCgzMikpKSl9d3JpdGVGbG9hdDMyKCQsWCl7YlpbMF09WCx0aGlzLndyaXRlSW50MzIoJCxaMVswXSl9d3JpdGVGbG9hdDY0KCQsWCl7cFpbMF09WCx0aGlzLndyaXRlSW50MzIoJCxaMVtHWD8wOjFdKSx0aGlzLndyaXRlSW50MzIoJCs0LFoxW0dYPzE6MF0pfWdldEJ1ZmZlcklkZW50aWZpZXIoKXtpZih0aGlzLmJ5dGVzXy5sZW5ndGg8dGhpcy5wb3NpdGlvbl8rUCQrayQpdGhyb3cgRXJyb3IoIkZsYXRCdWZmZXJzOiBCeXRlQnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluIGFuIGlkZW50aWZpZXIuIik7bGV0ICQ9IiI7Zm9yKGxldCBYPTA7WDxrJDtYKyspJCs9U3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnJlYWRJbnQ4KHRoaXMucG9zaXRpb25fK1AkK1gpKTtyZXR1cm4gJH1fX29mZnNldCgkLFgpe2xldCBRPSQtdGhpcy5yZWFkSW50MzIoJCk7cmV0dXJuIFg8dGhpcy5yZWFkSW50MTYoUSk/dGhpcy5yZWFkSW50MTYoUStYKTowfV9fdW5pb24oJCxYKXtyZXR1cm4gJC5iYl9wb3M9WCt0aGlzLnJlYWRJbnQzMihYKSwkLmJiPXRoaXMsJH1fX3N0cmluZygkLFgpeyQrPXRoaXMucmVhZEludDMyKCQpO2xldCBRPXRoaXMucmVhZEludDMyKCQpOyQrPVAkO2xldCBaPXRoaXMuYnl0ZXNfLnN1YmFycmF5KCQsJCtRKTtpZihYPT09alEuVVRGOF9CWVRFUylyZXR1cm4gWjtlbHNlIHJldHVybiB0aGlzLnRleHRfZGVjb2Rlcl8uZGVjb2RlKFopfV9fdW5pb25fd2l0aF9zdHJpbmcoJCxYKXtpZih0eXBlb2YgJD09PSJzdHJpbmciKXJldHVybiB0aGlzLl9fc3RyaW5nKFgpO3JldHVybiB0aGlzLl9fdW5pb24oJCxYKX1fX2luZGlyZWN0KCQpe3JldHVybiAkK3RoaXMucmVhZEludDMyKCQpfV9fdmVjdG9yKCQpe3JldHVybiAkK3RoaXMucmVhZEludDMyKCQpK1AkfV9fdmVjdG9yX2xlbigkKXtyZXR1cm4gdGhpcy5yZWFkSW50MzIoJCt0aGlzLnJlYWRJbnQzMigkKSl9X19oYXNfaWRlbnRpZmllcigkKXtpZigkLmxlbmd0aCE9ayQpdGhyb3cgRXJyb3IoIkZsYXRCdWZmZXJzOiBmaWxlIGlkZW50aWZpZXIgbXVzdCBiZSBsZW5ndGggIitrJCk7Zm9yKGxldCBYPTA7WDxrJDtYKyspaWYoJC5jaGFyQ29kZUF0KFgpIT10aGlzLnJlYWRJbnQ4KHRoaXMucG9zaXRpb24oKStQJCtYKSlyZXR1cm4hMTtyZXR1cm4hMH1jcmVhdGVTY2FsYXJMaXN0KCQsWCl7bGV0IFE9W107Zm9yKGxldCBaPTA7WjxYOysrWil7bGV0IEo9JChaKTtpZihKIT09bnVsbClRLnB1c2goSil9cmV0dXJuIFF9Y3JlYXRlT2JqTGlzdCgkLFgpe2xldCBRPVtdO2ZvcihsZXQgWj0wO1o8WDsrK1ope2xldCBKPSQoWik7aWYoSiE9PW51bGwpUS5wdXNoKEoudW5wYWNrKCkpfXJldHVybiBRfX12YXIgRVk9QSgoKT0+e3pZKCk7cVkoKX0pO2NsYXNzIFU2e2NvbnN0cnVjdG9yKCQpe3RoaXMubWluYWxpZ249MSx0aGlzLnZ0YWJsZT1udWxsLHRoaXMudnRhYmxlX2luX3VzZT0wLHRoaXMuaXNOZXN0ZWQ9ITEsdGhpcy5vYmplY3Rfc3RhcnQ9MCx0aGlzLnZ0YWJsZXM9W10sdGhpcy52ZWN0b3JfbnVtX2VsZW1zPTAsdGhpcy5mb3JjZV9kZWZhdWx0cz0hMSx0aGlzLnN0cmluZ19tYXBzPW51bGwsdGhpcy50ZXh0X2VuY29kZXI9bmV3IFRleHRFbmNvZGVyO2xldCBYO2lmKCEkKVg9MTAyNDtlbHNlIFg9JDt0aGlzLmJiPVAwLmFsbG9jYXRlKFgpLHRoaXMuc3BhY2U9WH1jbGVhcigpe3RoaXMuYmIuY2xlYXIoKSx0aGlzLnNwYWNlPXRoaXMuYmIuY2FwYWNpdHkoKSx0aGlzLm1pbmFsaWduPTEsdGhpcy52dGFibGU9bnVsbCx0aGlzLnZ0YWJsZV9pbl91c2U9MCx0aGlzLmlzTmVzdGVkPSExLHRoaXMub2JqZWN0X3N0YXJ0PTAsdGhpcy52dGFibGVzPVtdLHRoaXMudmVjdG9yX251bV9lbGVtcz0wLHRoaXMuZm9yY2VfZGVmYXVsdHM9ITEsdGhpcy5zdHJpbmdfbWFwcz1udWxsfWZvcmNlRGVmYXVsdHMoJCl7dGhpcy5mb3JjZV9kZWZhdWx0cz0kfWRhdGFCdWZmZXIoKXtyZXR1cm4gdGhpcy5iYn1hc1VpbnQ4QXJyYXkoKXtyZXR1cm4gdGhpcy5iYi5ieXRlcygpLnN1YmFycmF5KHRoaXMuYmIucG9zaXRpb24oKSx0aGlzLmJiLnBvc2l0aW9uKCkrdGhpcy5vZmZzZXQoKSl9cHJlcCgkLFgpe2lmKCQ+dGhpcy5taW5hbGlnbil0aGlzLm1pbmFsaWduPSQ7bGV0IFE9fih0aGlzLmJiLmNhcGFjaXR5KCktdGhpcy5zcGFjZStYKSsxJiQtMTt3aGlsZSh0aGlzLnNwYWNlPFErJCtYKXtsZXQgWj10aGlzLmJiLmNhcGFjaXR5KCk7dGhpcy5iYj1VNi5ncm93Qnl0ZUJ1ZmZlcih0aGlzLmJiKSx0aGlzLnNwYWNlKz10aGlzLmJiLmNhcGFjaXR5KCktWn10aGlzLnBhZChRKX1wYWQoJCl7Zm9yKGxldCBYPTA7WDwkO1grKyl0aGlzLmJiLndyaXRlSW50OCgtLXRoaXMuc3BhY2UsMCl9d3JpdGVJbnQ4KCQpe3RoaXMuYmIud3JpdGVJbnQ4KHRoaXMuc3BhY2UtPTEsJCl9d3JpdGVJbnQxNigkKXt0aGlzLmJiLndyaXRlSW50MTYodGhpcy5zcGFjZS09MiwkKX13cml0ZUludDMyKCQpe3RoaXMuYmIud3JpdGVJbnQzMih0aGlzLnNwYWNlLT00LCQpfXdyaXRlSW50NjQoJCl7dGhpcy5iYi53cml0ZUludDY0KHRoaXMuc3BhY2UtPTgsJCl9d3JpdGVGbG9hdDMyKCQpe3RoaXMuYmIud3JpdGVGbG9hdDMyKHRoaXMuc3BhY2UtPTQsJCl9d3JpdGVGbG9hdDY0KCQpe3RoaXMuYmIud3JpdGVGbG9hdDY0KHRoaXMuc3BhY2UtPTgsJCl9YWRkSW50OCgkKXt0aGlzLnByZXAoMSwwKSx0aGlzLndyaXRlSW50OCgkKX1hZGRJbnQxNigkKXt0aGlzLnByZXAoMiwwKSx0aGlzLndyaXRlSW50MTYoJCl9YWRkSW50MzIoJCl7dGhpcy5wcmVwKDQsMCksdGhpcy53cml0ZUludDMyKCQpfWFkZEludDY0KCQpe3RoaXMucHJlcCg4LDApLHRoaXMud3JpdGVJbnQ2NCgkKX1hZGRGbG9hdDMyKCQpe3RoaXMucHJlcCg0LDApLHRoaXMud3JpdGVGbG9hdDMyKCQpfWFkZEZsb2F0NjQoJCl7dGhpcy5wcmVwKDgsMCksdGhpcy53cml0ZUZsb2F0NjQoJCl9YWRkRmllbGRJbnQ4KCQsWCxRKXtpZih0aGlzLmZvcmNlX2RlZmF1bHRzfHxYIT1RKXRoaXMuYWRkSW50OChYKSx0aGlzLnNsb3QoJCl9YWRkRmllbGRJbnQxNigkLFgsUSl7aWYodGhpcy5mb3JjZV9kZWZhdWx0c3x8WCE9USl0aGlzLmFkZEludDE2KFgpLHRoaXMuc2xvdCgkKX1hZGRGaWVsZEludDMyKCQsWCxRKXtpZih0aGlzLmZvcmNlX2RlZmF1bHRzfHxYIT1RKXRoaXMuYWRkSW50MzIoWCksdGhpcy5zbG90KCQpfWFkZEZpZWxkSW50NjQoJCxYLFEpe2lmKHRoaXMuZm9yY2VfZGVmYXVsdHN8fFghPT1RKXRoaXMuYWRkSW50NjQoWCksdGhpcy5zbG90KCQpfWFkZEZpZWxkRmxvYXQzMigkLFgsUSl7aWYodGhpcy5mb3JjZV9kZWZhdWx0c3x8WCE9USl0aGlzLmFkZEZsb2F0MzIoWCksdGhpcy5zbG90KCQpfWFkZEZpZWxkRmxvYXQ2NCgkLFgsUSl7aWYodGhpcy5mb3JjZV9kZWZhdWx0c3x8WCE9USl0aGlzLmFkZEZsb2F0NjQoWCksdGhpcy5zbG90KCQpfWFkZEZpZWxkT2Zmc2V0KCQsWCxRKXtpZih0aGlzLmZvcmNlX2RlZmF1bHRzfHxYIT1RKXRoaXMuYWRkT2Zmc2V0KFgpLHRoaXMuc2xvdCgkKX1hZGRGaWVsZFN0cnVjdCgkLFgsUSl7aWYoWCE9USl0aGlzLm5lc3RlZChYKSx0aGlzLnNsb3QoJCl9bmVzdGVkKCQpe2lmKCQhPXRoaXMub2Zmc2V0KCkpdGhyb3cgVHlwZUVycm9yKCJGbGF0QnVmZmVyczogc3RydWN0IG11c3QgYmUgc2VyaWFsaXplZCBpbmxpbmUuIil9bm90TmVzdGVkKCl7aWYodGhpcy5pc05lc3RlZCl0aHJvdyBUeXBlRXJyb3IoIkZsYXRCdWZmZXJzOiBvYmplY3Qgc2VyaWFsaXphdGlvbiBtdXN0IG5vdCBiZSBuZXN0ZWQuIil9c2xvdCgkKXtpZih0aGlzLnZ0YWJsZSE9PW51bGwpdGhpcy52dGFibGVbJF09dGhpcy5vZmZzZXQoKX1vZmZzZXQoKXtyZXR1cm4gdGhpcy5iYi5jYXBhY2l0eSgpLXRoaXMuc3BhY2V9c3RhdGljIGdyb3dCeXRlQnVmZmVyKCQpe2xldCBYPSQuY2FwYWNpdHkoKTtpZihYJjMyMjEyMjU0NzIpdGhyb3cgRXJyb3IoIkZsYXRCdWZmZXJzOiBjYW5ub3QgZ3JvdyBidWZmZXIgYmV5b25kIDIgZ2lnYWJ5dGVzLiIpO2xldCBRPVg8PDEsWj1QMC5hbGxvY2F0ZShRKTtyZXR1cm4gWi5zZXRQb3NpdGlvbihRLVgpLFouYnl0ZXMoKS5zZXQoJC5ieXRlcygpLFEtWCksWn1hZGRPZmZzZXQoJCl7dGhpcy5wcmVwKFAkLDApLHRoaXMud3JpdGVJbnQzMih0aGlzLm9mZnNldCgpLSQrUCQpfXN0YXJ0T2JqZWN0KCQpe2lmKHRoaXMubm90TmVzdGVkKCksdGhpcy52dGFibGU9PW51bGwpdGhpcy52dGFibGU9W107dGhpcy52dGFibGVfaW5fdXNlPSQ7Zm9yKGxldCBYPTA7WDwkO1grKyl0aGlzLnZ0YWJsZVtYXT0wO3RoaXMuaXNOZXN0ZWQ9ITAsdGhpcy5vYmplY3Rfc3RhcnQ9dGhpcy5vZmZzZXQoKX1lbmRPYmplY3QoKXtpZih0aGlzLnZ0YWJsZT09bnVsbHx8IXRoaXMuaXNOZXN0ZWQpdGhyb3cgRXJyb3IoIkZsYXRCdWZmZXJzOiBlbmRPYmplY3QgY2FsbGVkIHdpdGhvdXQgc3RhcnRPYmplY3QiKTt0aGlzLmFkZEludDMyKDApO2xldCAkPXRoaXMub2Zmc2V0KCksWD10aGlzLnZ0YWJsZV9pbl91c2UtMTtmb3IoO1g+PTAmJnRoaXMudnRhYmxlW1hdPT0wO1gtLSk7bGV0IFE9WCsxO2Zvcig7WD49MDtYLS0pdGhpcy5hZGRJbnQxNih0aGlzLnZ0YWJsZVtYXSE9MD8kLXRoaXMudnRhYmxlW1hdOjApO2xldCBaPTI7dGhpcy5hZGRJbnQxNigkLXRoaXMub2JqZWN0X3N0YXJ0KTtsZXQgSj0oUStaKSprUTt0aGlzLmFkZEludDE2KEopO2xldCBZPTAsSD10aGlzLnNwYWNlOyQ6Zm9yKFg9MDtYPHRoaXMudnRhYmxlcy5sZW5ndGg7WCsrKXtsZXQgVz10aGlzLmJiLmNhcGFjaXR5KCktdGhpcy52dGFibGVzW1hdO2lmKEo9PXRoaXMuYmIucmVhZEludDE2KFcpKXtmb3IobGV0IFA9a1E7UDxKO1ArPWtRKWlmKHRoaXMuYmIucmVhZEludDE2KEgrUCkhPXRoaXMuYmIucmVhZEludDE2KFcrUCkpY29udGludWUgJDtZPXRoaXMudnRhYmxlc1tYXTticmVha319aWYoWSl0aGlzLnNwYWNlPXRoaXMuYmIuY2FwYWNpdHkoKS0kLHRoaXMuYmIud3JpdGVJbnQzMih0aGlzLnNwYWNlLFktJCk7ZWxzZSB0aGlzLnZ0YWJsZXMucHVzaCh0aGlzLm9mZnNldCgpKSx0aGlzLmJiLndyaXRlSW50MzIodGhpcy5iYi5jYXBhY2l0eSgpLSQsdGhpcy5vZmZzZXQoKS0kKTtyZXR1cm4gdGhpcy5pc05lc3RlZD0hMSwkfWZpbmlzaCgkLFgsUSl7bGV0IFo9UT9JOjA7aWYoWCl7bGV0IEo9WDtpZih0aGlzLnByZXAodGhpcy5taW5hbGlnbixQJCtrJCtaKSxKLmxlbmd0aCE9ayQpdGhyb3cgVHlwZUVycm9yKCJGbGF0QnVmZmVyczogZmlsZSBpZGVudGlmaWVyIG11c3QgYmUgbGVuZ3RoICIrayQpO2ZvcihsZXQgWT1rJC0xO1k+PTA7WS0tKXRoaXMud3JpdGVJbnQ4KEouY2hhckNvZGVBdChZKSl9aWYodGhpcy5wcmVwKHRoaXMubWluYWxpZ24sUCQrWiksdGhpcy5hZGRPZmZzZXQoJCksWil0aGlzLmFkZEludDMyKHRoaXMuYmIuY2FwYWNpdHkoKS10aGlzLnNwYWNlKTt0aGlzLmJiLnNldFBvc2l0aW9uKHRoaXMuc3BhY2UpfWZpbmlzaFNpemVQcmVmaXhlZCgkLFgpe3RoaXMuZmluaXNoKCQsWCwhMCl9cmVxdWlyZWRGaWVsZCgkLFgpe2xldCBRPXRoaXMuYmIuY2FwYWNpdHkoKS0kLFo9US10aGlzLmJiLnJlYWRJbnQzMihRKTtpZighKFg8dGhpcy5iYi5yZWFkSW50MTYoWikmJnRoaXMuYmIucmVhZEludDE2KForWCkhPTApKXRocm93IFR5cGVFcnJvcigiRmxhdEJ1ZmZlcnM6IGZpZWxkICIrWCsiIG11c3QgYmUgc2V0Iil9c3RhcnRWZWN0b3IoJCxYLFEpe3RoaXMubm90TmVzdGVkKCksdGhpcy52ZWN0b3JfbnVtX2VsZW1zPVgsdGhpcy5wcmVwKFAkLCQqWCksdGhpcy5wcmVwKFEsJCpYKX1lbmRWZWN0b3IoKXtyZXR1cm4gdGhpcy53cml0ZUludDMyKHRoaXMudmVjdG9yX251bV9lbGVtcyksdGhpcy5vZmZzZXQoKX1jcmVhdGVTaGFyZWRTdHJpbmcoJCl7aWYoISQpcmV0dXJuIDA7aWYoIXRoaXMuc3RyaW5nX21hcHMpdGhpcy5zdHJpbmdfbWFwcz1uZXcgTWFwO2lmKHRoaXMuc3RyaW5nX21hcHMuaGFzKCQpKXJldHVybiB0aGlzLnN0cmluZ19tYXBzLmdldCgkKTtsZXQgWD10aGlzLmNyZWF0ZVN0cmluZygkKTtyZXR1cm4gdGhpcy5zdHJpbmdfbWFwcy5zZXQoJCxYKSxYfWNyZWF0ZVN0cmluZygkKXtpZigkPT09bnVsbHx8JD09PXZvaWQgMClyZXR1cm4gMDtsZXQgWDtpZigkIGluc3RhbmNlb2YgVWludDhBcnJheSlYPSQ7ZWxzZSBYPXRoaXMudGV4dF9lbmNvZGVyLmVuY29kZSgkKTtyZXR1cm4gdGhpcy5hZGRJbnQ4KDApLHRoaXMuc3RhcnRWZWN0b3IoMSxYLmxlbmd0aCwxKSx0aGlzLmJiLnNldFBvc2l0aW9uKHRoaXMuc3BhY2UtPVgubGVuZ3RoKSx0aGlzLmJiLmJ5dGVzKCkuc2V0KFgsdGhpcy5zcGFjZSksdGhpcy5lbmRWZWN0b3IoKX1jcmVhdGVCeXRlVmVjdG9yKCQpe2lmKCQ9PT1udWxsfHwkPT09dm9pZCAwKXJldHVybiAwO3JldHVybiB0aGlzLnN0YXJ0VmVjdG9yKDEsJC5sZW5ndGgsMSksdGhpcy5iYi5zZXRQb3NpdGlvbih0aGlzLnNwYWNlLT0kLmxlbmd0aCksdGhpcy5iYi5ieXRlcygpLnNldCgkLHRoaXMuc3BhY2UpLHRoaXMuZW5kVmVjdG9yKCl9Y3JlYXRlT2JqZWN0T2Zmc2V0KCQpe2lmKCQ9PT1udWxsKXJldHVybiAwO2lmKHR5cGVvZiAkPT09InN0cmluZyIpcmV0dXJuIHRoaXMuY3JlYXRlU3RyaW5nKCQpO2Vsc2UgcmV0dXJuICQucGFjayh0aGlzKX1jcmVhdGVPYmplY3RPZmZzZXRMaXN0KCQpe2xldCBYPVtdO2ZvcihsZXQgUT0wO1E8JC5sZW5ndGg7KytRKXtsZXQgWj0kW1FdO2lmKFohPT1udWxsKVgucHVzaCh0aGlzLmNyZWF0ZU9iamVjdE9mZnNldChaKSk7ZWxzZSB0aHJvdyBUeXBlRXJyb3IoIkZsYXRCdWZmZXJzOiBBcmd1bWVudCBmb3IgY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCBjYW5ub3QgY29udGFpbiBudWxsLiIpfXJldHVybiBYfWNyZWF0ZVN0cnVjdE9mZnNldExpc3QoJCxYKXtyZXR1cm4gWCh0aGlzLCQubGVuZ3RoKSx0aGlzLmNyZWF0ZU9iamVjdE9mZnNldExpc3QoJC5zbGljZSgpLnJldmVyc2UoKSksdGhpcy5lbmRWZWN0b3IoKX19dmFyIHFXPUEoKCk9PntFWSgpfSk7dmFyIFk4PUEoKCk9PntxWSgpO3FXKCk7RVkoKTt6WSgpfSk7dmFyIFI2O3ZhciBNWT1BKCgpPT57KGZ1bmN0aW9uKCQpeyRbJC5CVUZGRVI9MF09IkJVRkZFUiJ9KShSNnx8KFI2PXt9KSl9KTt2YXIgRzA7dmFyIHFYPUEoKCk9PnsoZnVuY3Rpb24oJCl7JFskLkxaNF9GUkFNRT0wXT0iTFo0X0ZSQU1FIiwkWyQuWlNURD0xXT0iWlNURCJ9KShHMHx8KEcwPXt9KSl9KTtjbGFzcyBsMHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdCgkLFgpe3JldHVybiB0aGlzLmJiX3Bvcz0kLHRoaXMuYmI9WCx0aGlzfXN0YXRpYyBnZXRSb290QXNCb2R5Q29tcHJlc3Npb24oJCxYKXtyZXR1cm4oWHx8bmV3IGwwKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0JvZHlDb21wcmVzc2lvbigkLFgpe3JldHVybiAkLnNldFBvc2l0aW9uKCQucG9zaXRpb24oKStJKSwoWHx8bmV3IGwwKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9Y29kZWMoKXtsZXQgJD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiAkP3RoaXMuYmIucmVhZEludDgodGhpcy5iYl9wb3MrJCk6RzAuTFo0X0ZSQU1FfW1ldGhvZCgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuICQ/dGhpcy5iYi5yZWFkSW50OCh0aGlzLmJiX3BvcyskKTpSNi5CVUZGRVJ9c3RhdGljIHN0YXJ0Qm9keUNvbXByZXNzaW9uKCQpeyQuc3RhcnRPYmplY3QoMil9c3RhdGljIGFkZENvZGVjKCQsWCl7JC5hZGRGaWVsZEludDgoMCxYLEcwLkxaNF9GUkFNRSl9c3RhdGljIGFkZE1ldGhvZCgkLFgpeyQuYWRkRmllbGRJbnQ4KDEsWCxSNi5CVUZGRVIpfXN0YXRpYyBlbmRCb2R5Q29tcHJlc3Npb24oJCl7cmV0dXJuICQuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZUJvZHlDb21wcmVzc2lvbigkLFgsUSl7cmV0dXJuIGwwLnN0YXJ0Qm9keUNvbXByZXNzaW9uKCQpLGwwLmFkZENvZGVjKCQsWCksbDAuYWRkTWV0aG9kKCQsUSksbDAuZW5kQm9keUNvbXByZXNzaW9uKCQpfX12YXIgTFk9QSgoKT0+e1k4KCk7TVkoKTtxWCgpfSk7Y2xhc3MgU1F7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MH1fX2luaXQoJCxYKXtyZXR1cm4gdGhpcy5iYl9wb3M9JCx0aGlzLmJiPVgsdGhpc31vZmZzZXQoKXtyZXR1cm4gdGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MpfWxlbmd0aCgpe3JldHVybiB0aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3Bvcys4KX1zdGF0aWMgc2l6ZU9mKCl7cmV0dXJuIDE2fXN0YXRpYyBjcmVhdGVCdWZmZXIoJCxYLFEpe3JldHVybiAkLnByZXAoOCwxNiksJC53cml0ZUludDY0KEJpZ0ludChRIT09bnVsbCYmUSE9PXZvaWQgMD9ROjApKSwkLndyaXRlSW50NjQoQmlnSW50KFghPT1udWxsJiZYIT09dm9pZCAwP1g6MCkpLCQub2Zmc2V0KCl9fWNsYXNzIERRe2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KCQsWCl7cmV0dXJuIHRoaXMuYmJfcG9zPSQsdGhpcy5iYj1YLHRoaXN9bGVuZ3RoKCl7cmV0dXJuIHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zKX1udWxsQ291bnQoKXtyZXR1cm4gdGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MrOCl9c3RhdGljIHNpemVPZigpe3JldHVybiAxNn1zdGF0aWMgY3JlYXRlRmllbGROb2RlKCQsWCxRKXtyZXR1cm4gJC5wcmVwKDgsMTYpLCQud3JpdGVJbnQ2NChCaWdJbnQoUSE9PW51bGwmJlEhPT12b2lkIDA/UTowKSksJC53cml0ZUludDY0KEJpZ0ludChYIT09bnVsbCYmWCE9PXZvaWQgMD9YOjApKSwkLm9mZnNldCgpfX1jbGFzcyBxMHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdCgkLFgpe3JldHVybiB0aGlzLmJiX3Bvcz0kLHRoaXMuYmI9WCx0aGlzfXN0YXRpYyBnZXRSb290QXNSZWNvcmRCYXRjaCgkLFgpe3JldHVybihYfHxuZXcgcTApLl9faW5pdCgkLnJlYWRJbnQzMigkLnBvc2l0aW9uKCkpKyQucG9zaXRpb24oKSwkKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzUmVjb3JkQmF0Y2goJCxYKXtyZXR1cm4gJC5zZXRQb3NpdGlvbigkLnBvc2l0aW9uKCkrSSksKFh8fG5ldyBxMCkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfWxlbmd0aCgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuICQ/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MrJCk6QmlnSW50KCIwIil9bm9kZXMoJCxYKXtsZXQgUT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBRPyhYfHxuZXcgRFEpLl9faW5pdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK1EpKyQqMTYsdGhpcy5iYik6bnVsbH1ub2Rlc0xlbmd0aCgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuICQ/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrJCk6MH1idWZmZXJzKCQsWCl7bGV0IFE9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gUT8oWHx8bmV3IFNRKS5fX2luaXQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytRKSskKjE2LHRoaXMuYmIpOm51bGx9YnVmZmVyc0xlbmd0aCgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuICQ/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrJCk6MH1jb21wcmVzc2lvbigkKXtsZXQgWD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEwKTtyZXR1cm4gWD8oJHx8bmV3IGwwKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK1gpLHRoaXMuYmIpOm51bGx9dmFyaWFkaWNCdWZmZXJDb3VudHMoJCl7bGV0IFg9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIFg/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytYKSskKjgpOkJpZ0ludCgwKX12YXJpYWRpY0J1ZmZlckNvdW50c0xlbmd0aCgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTIpO3JldHVybiAkP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zKyQpOjB9c3RhdGljIHN0YXJ0UmVjb3JkQmF0Y2goJCl7JC5zdGFydE9iamVjdCg1KX1zdGF0aWMgYWRkTGVuZ3RoKCQsWCl7JC5hZGRGaWVsZEludDY0KDAsWCxCaWdJbnQoIjAiKSl9c3RhdGljIGFkZE5vZGVzKCQsWCl7JC5hZGRGaWVsZE9mZnNldCgxLFgsMCl9c3RhdGljIHN0YXJ0Tm9kZXNWZWN0b3IoJCxYKXskLnN0YXJ0VmVjdG9yKDE2LFgsOCl9c3RhdGljIGFkZEJ1ZmZlcnMoJCxYKXskLmFkZEZpZWxkT2Zmc2V0KDIsWCwwKX1zdGF0aWMgc3RhcnRCdWZmZXJzVmVjdG9yKCQsWCl7JC5zdGFydFZlY3RvcigxNixYLDgpfXN0YXRpYyBhZGRDb21wcmVzc2lvbigkLFgpeyQuYWRkRmllbGRPZmZzZXQoMyxYLDApfXN0YXRpYyBhZGRWYXJpYWRpY0J1ZmZlckNvdW50cygkLFgpeyQuYWRkRmllbGRPZmZzZXQoNCxYLDApfXN0YXRpYyBjcmVhdGVWYXJpYWRpY0J1ZmZlckNvdW50c1ZlY3RvcigkLFgpeyQuc3RhcnRWZWN0b3IoOCxYLmxlbmd0aCw4KTtmb3IobGV0IFE9WC5sZW5ndGgtMTtRPj0wO1EtLSkkLmFkZEludDY0KFhbUV0pO3JldHVybiAkLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydFZhcmlhZGljQnVmZmVyQ291bnRzVmVjdG9yKCQsWCl7JC5zdGFydFZlY3Rvcig4LFgsOCl9c3RhdGljIGVuZFJlY29yZEJhdGNoKCQpe3JldHVybiAkLmVuZE9iamVjdCgpfX12YXIgTlk9QSgoKT0+e1k4KCk7TFkoKX0pO2NsYXNzIEoxe2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KCQsWCl7cmV0dXJuIHRoaXMuYmJfcG9zPSQsdGhpcy5iYj1YLHRoaXN9c3RhdGljIGdldFJvb3RBc0RpY3Rpb25hcnlCYXRjaCgkLFgpe3JldHVybihYfHxuZXcgSjEpLl9faW5pdCgkLnJlYWRJbnQzMigkLnBvc2l0aW9uKCkpKyQucG9zaXRpb24oKSwkKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRGljdGlvbmFyeUJhdGNoKCQsWCl7cmV0dXJuICQuc2V0UG9zaXRpb24oJC5wb3NpdGlvbigpK0kpLChYfHxuZXcgSjEpLl9faW5pdCgkLnJlYWRJbnQzMigkLnBvc2l0aW9uKCkpKyQucG9zaXRpb24oKSwkKX1pZCgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuICQ/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MrJCk6QmlnSW50KCIwIil9ZGF0YSgkKXtsZXQgWD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBYPygkfHxuZXcgcTApLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrWCksdGhpcy5iYik6bnVsbH1pc0RlbHRhKCl7bGV0ICQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gJD8hIXRoaXMuYmIucmVhZEludDgodGhpcy5iYl9wb3MrJCk6ITF9c3RhdGljIHN0YXJ0RGljdGlvbmFyeUJhdGNoKCQpeyQuc3RhcnRPYmplY3QoMyl9c3RhdGljIGFkZElkKCQsWCl7JC5hZGRGaWVsZEludDY0KDAsWCxCaWdJbnQoIjAiKSl9c3RhdGljIGFkZERhdGEoJCxYKXskLmFkZEZpZWxkT2Zmc2V0KDEsWCwwKX1zdGF0aWMgYWRkSXNEZWx0YSgkLFgpeyQuYWRkRmllbGRJbnQ4KDIsK1gsMCl9c3RhdGljIGVuZERpY3Rpb25hcnlCYXRjaCgkKXtyZXR1cm4gJC5lbmRPYmplY3QoKX19dmFyIHpXPUEoKCk9PntZOCgpO05ZKCl9KTt2YXIgZjE7dmFyIEZZPUEoKCk9PnsoZnVuY3Rpb24oJCl7JFskLkxpdHRsZT0wXT0iTGl0dGxlIiwkWyQuQmlnPTFdPSJCaWcifSkoZjF8fChmMT17fSkpfSk7dmFyIHdRO3ZhciBFVz1BKCgpPT57KGZ1bmN0aW9uKCQpeyRbJC5EZW5zZUFycmF5PTBdPSJEZW5zZUFycmF5In0pKHdRfHwod1E9e30pKX0pO2NsYXNzIFIwe2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KCQsWCl7cmV0dXJuIHRoaXMuYmJfcG9zPSQsdGhpcy5iYj1YLHRoaXN9c3RhdGljIGdldFJvb3RBc0ludCgkLFgpe3JldHVybihYfHxuZXcgUjApLl9faW5pdCgkLnJlYWRJbnQzMigkLnBvc2l0aW9uKCkpKyQucG9zaXRpb24oKSwkKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzSW50KCQsWCl7cmV0dXJuICQuc2V0UG9zaXRpb24oJC5wb3NpdGlvbigpK0kpLChYfHxuZXcgUjApLl9faW5pdCgkLnJlYWRJbnQzMigkLnBvc2l0aW9uKCkpKyQucG9zaXRpb24oKSwkKX1iaXRXaWR0aCgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuICQ/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MrJCk6MH1pc1NpZ25lZCgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuICQ/ISF0aGlzLmJiLnJlYWRJbnQ4KHRoaXMuYmJfcG9zKyQpOiExfXN0YXRpYyBzdGFydEludCgkKXskLnN0YXJ0T2JqZWN0KDIpfXN0YXRpYyBhZGRCaXRXaWR0aCgkLFgpeyQuYWRkRmllbGRJbnQzMigwLFgsMCl9c3RhdGljIGFkZElzU2lnbmVkKCQsWCl7JC5hZGRGaWVsZEludDgoMSwrWCwwKX1zdGF0aWMgZW5kSW50KCQpe3JldHVybiAkLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVJbnQoJCxYLFEpe3JldHVybiBSMC5zdGFydEludCgkKSxSMC5hZGRCaXRXaWR0aCgkLFgpLFIwLmFkZElzU2lnbmVkKCQsUSksUjAuZW5kSW50KCQpfX12YXIgY1o9QSgoKT0+e1k4KCl9KTtjbGFzcyBoJHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdCgkLFgpe3JldHVybiB0aGlzLmJiX3Bvcz0kLHRoaXMuYmI9WCx0aGlzfXN0YXRpYyBnZXRSb290QXNEaWN0aW9uYXJ5RW5jb2RpbmcoJCxYKXtyZXR1cm4oWHx8bmV3IGgkKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0RpY3Rpb25hcnlFbmNvZGluZygkLFgpe3JldHVybiAkLnNldFBvc2l0aW9uKCQucG9zaXRpb24oKStJKSwoWHx8bmV3IGgkKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9aWQoKXtsZXQgJD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiAkP3RoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zKyQpOkJpZ0ludCgiMCIpfWluZGV4VHlwZSgkKXtsZXQgWD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBYPygkfHxuZXcgUjApLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrWCksdGhpcy5iYik6bnVsbH1pc09yZGVyZWQoKXtsZXQgJD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiAkPyEhdGhpcy5iYi5yZWFkSW50OCh0aGlzLmJiX3BvcyskKTohMX1kaWN0aW9uYXJ5S2luZCgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTApO3JldHVybiAkP3RoaXMuYmIucmVhZEludDE2KHRoaXMuYmJfcG9zKyQpOndRLkRlbnNlQXJyYXl9c3RhdGljIHN0YXJ0RGljdGlvbmFyeUVuY29kaW5nKCQpeyQuc3RhcnRPYmplY3QoNCl9c3RhdGljIGFkZElkKCQsWCl7JC5hZGRGaWVsZEludDY0KDAsWCxCaWdJbnQoIjAiKSl9c3RhdGljIGFkZEluZGV4VHlwZSgkLFgpeyQuYWRkRmllbGRPZmZzZXQoMSxYLDApfXN0YXRpYyBhZGRJc09yZGVyZWQoJCxYKXskLmFkZEZpZWxkSW50OCgyLCtYLDApfXN0YXRpYyBhZGREaWN0aW9uYXJ5S2luZCgkLFgpeyQuYWRkRmllbGRJbnQxNigzLFgsd1EuRGVuc2VBcnJheSl9c3RhdGljIGVuZERpY3Rpb25hcnlFbmNvZGluZygkKXtyZXR1cm4gJC5lbmRPYmplY3QoKX19dmFyIEFZPUEoKCk9PntZOCgpO0VXKCk7Y1ooKX0pO2NsYXNzIFU4e2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KCQsWCl7cmV0dXJuIHRoaXMuYmJfcG9zPSQsdGhpcy5iYj1YLHRoaXN9c3RhdGljIGdldFJvb3RBc0tleVZhbHVlKCQsWCl7cmV0dXJuKFh8fG5ldyBVOCkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNLZXlWYWx1ZSgkLFgpe3JldHVybiAkLnNldFBvc2l0aW9uKCQucG9zaXRpb24oKStJKSwoWHx8bmV3IFU4KS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9a2V5KCQpe2xldCBYPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIFg/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcytYLCQpOm51bGx9dmFsdWUoJCl7bGV0IFg9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gWD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK1gsJCk6bnVsbH1zdGF0aWMgc3RhcnRLZXlWYWx1ZSgkKXskLnN0YXJ0T2JqZWN0KDIpfXN0YXRpYyBhZGRLZXkoJCxYKXskLmFkZEZpZWxkT2Zmc2V0KDAsWCwwKX1zdGF0aWMgYWRkVmFsdWUoJCxYKXskLmFkZEZpZWxkT2Zmc2V0KDEsWCwwKX1zdGF0aWMgZW5kS2V5VmFsdWUoJCl7cmV0dXJuICQuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZUtleVZhbHVlKCQsWCxRKXtyZXR1cm4gVTguc3RhcnRLZXlWYWx1ZSgkKSxVOC5hZGRLZXkoJCxYKSxVOC5hZGRWYWx1ZSgkLFEpLFU4LmVuZEtleVZhbHVlKCQpfX12YXIgelg9QSgoKT0+e1k4KCl9KTtjbGFzcyBiMXtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdCgkLFgpe3JldHVybiB0aGlzLmJiX3Bvcz0kLHRoaXMuYmI9WCx0aGlzfXN0YXRpYyBnZXRSb290QXNCaW5hcnkoJCxYKXtyZXR1cm4oWHx8bmV3IGIxKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0JpbmFyeSgkLFgpe3JldHVybiAkLnNldFBvc2l0aW9uKCQucG9zaXRpb24oKStJKSwoWHx8bmV3IGIxKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9c3RhdGljIHN0YXJ0QmluYXJ5KCQpeyQuc3RhcnRPYmplY3QoMCl9c3RhdGljIGVuZEJpbmFyeSgkKXtyZXR1cm4gJC5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlQmluYXJ5KCQpe3JldHVybiBiMS5zdGFydEJpbmFyeSgkKSxiMS5lbmRCaW5hcnkoJCl9fXZhciBNVz1BKCgpPT57WTgoKX0pO2NsYXNzIHAxe2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KCQsWCl7cmV0dXJuIHRoaXMuYmJfcG9zPSQsdGhpcy5iYj1YLHRoaXN9c3RhdGljIGdldFJvb3RBc0JpbmFyeVZpZXcoJCxYKXtyZXR1cm4oWHx8bmV3IHAxKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0JpbmFyeVZpZXcoJCxYKXtyZXR1cm4gJC5zZXRQb3NpdGlvbigkLnBvc2l0aW9uKCkrSSksKFh8fG5ldyBwMSkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXN0YXRpYyBzdGFydEJpbmFyeVZpZXcoJCl7JC5zdGFydE9iamVjdCgwKX1zdGF0aWMgZW5kQmluYXJ5VmlldygkKXtyZXR1cm4gJC5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlQmluYXJ5VmlldygkKXtyZXR1cm4gcDEuc3RhcnRCaW5hcnlWaWV3KCQpLHAxLmVuZEJpbmFyeVZpZXcoJCl9fXZhciBMVz1BKCgpPT57WTgoKX0pO2NsYXNzIGMxe2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KCQsWCl7cmV0dXJuIHRoaXMuYmJfcG9zPSQsdGhpcy5iYj1YLHRoaXN9c3RhdGljIGdldFJvb3RBc0Jvb2woJCxYKXtyZXR1cm4oWHx8bmV3IGMxKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0Jvb2woJCxYKXtyZXR1cm4gJC5zZXRQb3NpdGlvbigkLnBvc2l0aW9uKCkrSSksKFh8fG5ldyBjMSkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXN0YXRpYyBzdGFydEJvb2woJCl7JC5zdGFydE9iamVjdCgwKX1zdGF0aWMgZW5kQm9vbCgkKXtyZXR1cm4gJC5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlQm9vbCgkKXtyZXR1cm4gYzEuc3RhcnRCb29sKCQpLGMxLmVuZEJvb2woJCl9fXZhciBOVz1BKCgpPT57WTgoKX0pO2NsYXNzIGoke2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KCQsWCl7cmV0dXJuIHRoaXMuYmJfcG9zPSQsdGhpcy5iYj1YLHRoaXN9c3RhdGljIGdldFJvb3RBc0RhdGUoJCxYKXtyZXR1cm4oWHx8bmV3IGokKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0RhdGUoJCxYKXtyZXR1cm4gJC5zZXRQb3NpdGlvbigkLnBvc2l0aW9uKCkrSSksKFh8fG5ldyBqJCkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXVuaXQoKXtsZXQgJD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiAkP3RoaXMuYmIucmVhZEludDE2KHRoaXMuYmJfcG9zKyQpOko4Lk1JTExJU0VDT05EfXN0YXRpYyBzdGFydERhdGUoJCl7JC5zdGFydE9iamVjdCgxKX1zdGF0aWMgYWRkVW5pdCgkLFgpeyQuYWRkRmllbGRJbnQxNigwLFgsSjguTUlMTElTRUNPTkQpfXN0YXRpYyBlbmREYXRlKCQpe3JldHVybiAkLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVEYXRlKCQsWCl7cmV0dXJuIGokLnN0YXJ0RGF0ZSgkKSxqJC5hZGRVbml0KCQsWCksaiQuZW5kRGF0ZSgkKX19dmFyIFVZPUEoKCk9PntZOCgpO1BZKCl9KTtjbGFzcyBDMHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdCgkLFgpe3JldHVybiB0aGlzLmJiX3Bvcz0kLHRoaXMuYmI9WCx0aGlzfXN0YXRpYyBnZXRSb290QXNEZWNpbWFsKCQsWCl7cmV0dXJuKFh8fG5ldyBDMCkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNEZWNpbWFsKCQsWCl7cmV0dXJuICQuc2V0UG9zaXRpb24oJC5wb3NpdGlvbigpK0kpLChYfHxuZXcgQzApLl9faW5pdCgkLnJlYWRJbnQzMigkLnBvc2l0aW9uKCkpKyQucG9zaXRpb24oKSwkKX1wcmVjaXNpb24oKXtsZXQgJD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiAkP3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zKyQpOjB9c2NhbGUoKXtsZXQgJD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiAkP3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zKyQpOjB9Yml0V2lkdGgoKXtsZXQgJD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiAkP3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zKyQpOjEyOH1zdGF0aWMgc3RhcnREZWNpbWFsKCQpeyQuc3RhcnRPYmplY3QoMyl9c3RhdGljIGFkZFByZWNpc2lvbigkLFgpeyQuYWRkRmllbGRJbnQzMigwLFgsMCl9c3RhdGljIGFkZFNjYWxlKCQsWCl7JC5hZGRGaWVsZEludDMyKDEsWCwwKX1zdGF0aWMgYWRkQml0V2lkdGgoJCxYKXskLmFkZEZpZWxkSW50MzIoMixYLDEyOCl9c3RhdGljIGVuZERlY2ltYWwoJCl7cmV0dXJuICQuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZURlY2ltYWwoJCxYLFEsWil7cmV0dXJuIEMwLnN0YXJ0RGVjaW1hbCgkKSxDMC5hZGRQcmVjaXNpb24oJCxYKSxDMC5hZGRTY2FsZSgkLFEpLEMwLmFkZEJpdFdpZHRoKCQsWiksQzAuZW5kRGVjaW1hbCgkKX19dmFyIFJZPUEoKCk9PntZOCgpfSk7Y2xhc3MgUyR7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MH1fX2luaXQoJCxYKXtyZXR1cm4gdGhpcy5iYl9wb3M9JCx0aGlzLmJiPVgsdGhpc31zdGF0aWMgZ2V0Um9vdEFzRHVyYXRpb24oJCxYKXtyZXR1cm4oWHx8bmV3IFMkKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0R1cmF0aW9uKCQsWCl7cmV0dXJuICQuc2V0UG9zaXRpb24oJC5wb3NpdGlvbigpK0kpLChYfHxuZXcgUyQpLl9faW5pdCgkLnJlYWRJbnQzMigkLnBvc2l0aW9uKCkpKyQucG9zaXRpb24oKSwkKX11bml0KCl7bGV0ICQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gJD90aGlzLmJiLnJlYWRJbnQxNih0aGlzLmJiX3BvcyskKTpPLk1JTExJU0VDT05EfXN0YXRpYyBzdGFydER1cmF0aW9uKCQpeyQuc3RhcnRPYmplY3QoMSl9c3RhdGljIGFkZFVuaXQoJCxYKXskLmFkZEZpZWxkSW50MTYoMCxYLE8uTUlMTElTRUNPTkQpfXN0YXRpYyBlbmREdXJhdGlvbigkKXtyZXR1cm4gJC5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlRHVyYXRpb24oJCxYKXtyZXR1cm4gUyQuc3RhcnREdXJhdGlvbigkKSxTJC5hZGRVbml0KCQsWCksUyQuZW5kRHVyYXRpb24oJCl9fXZhciBDWT1BKCgpPT57WTgoKTtPUSgpfSk7Y2xhc3MgRCR7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MH1fX2luaXQoJCxYKXtyZXR1cm4gdGhpcy5iYl9wb3M9JCx0aGlzLmJiPVgsdGhpc31zdGF0aWMgZ2V0Um9vdEFzRml4ZWRTaXplQmluYXJ5KCQsWCl7cmV0dXJuKFh8fG5ldyBEJCkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNGaXhlZFNpemVCaW5hcnkoJCxYKXtyZXR1cm4gJC5zZXRQb3NpdGlvbigkLnBvc2l0aW9uKCkrSSksKFh8fG5ldyBEJCkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfWJ5dGVXaWR0aCgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuICQ/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MrJCk6MH1zdGF0aWMgc3RhcnRGaXhlZFNpemVCaW5hcnkoJCl7JC5zdGFydE9iamVjdCgxKX1zdGF0aWMgYWRkQnl0ZVdpZHRoKCQsWCl7JC5hZGRGaWVsZEludDMyKDAsWCwwKX1zdGF0aWMgZW5kRml4ZWRTaXplQmluYXJ5KCQpe3JldHVybiAkLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVGaXhlZFNpemVCaW5hcnkoJCxYKXtyZXR1cm4gRCQuc3RhcnRGaXhlZFNpemVCaW5hcnkoJCksRCQuYWRkQnl0ZVdpZHRoKCQsWCksRCQuZW5kRml4ZWRTaXplQmluYXJ5KCQpfX12YXIgT1k9QSgoKT0+e1k4KCl9KTtjbGFzcyB3JHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdCgkLFgpe3JldHVybiB0aGlzLmJiX3Bvcz0kLHRoaXMuYmI9WCx0aGlzfXN0YXRpYyBnZXRSb290QXNGaXhlZFNpemVMaXN0KCQsWCl7cmV0dXJuKFh8fG5ldyB3JCkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNGaXhlZFNpemVMaXN0KCQsWCl7cmV0dXJuICQuc2V0UG9zaXRpb24oJC5wb3NpdGlvbigpK0kpLChYfHxuZXcgdyQpLl9faW5pdCgkLnJlYWRJbnQzMigkLnBvc2l0aW9uKCkpKyQucG9zaXRpb24oKSwkKX1saXN0U2l6ZSgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuICQ/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MrJCk6MH1zdGF0aWMgc3RhcnRGaXhlZFNpemVMaXN0KCQpeyQuc3RhcnRPYmplY3QoMSl9c3RhdGljIGFkZExpc3RTaXplKCQsWCl7JC5hZGRGaWVsZEludDMyKDAsWCwwKX1zdGF0aWMgZW5kRml4ZWRTaXplTGlzdCgkKXtyZXR1cm4gJC5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlRml4ZWRTaXplTGlzdCgkLFgpe3JldHVybiB3JC5zdGFydEZpeGVkU2l6ZUxpc3QoJCksdyQuYWRkTGlzdFNpemUoJCxYKSx3JC5lbmRGaXhlZFNpemVMaXN0KCQpfX12YXIga1k9QSgoKT0+e1k4KCl9KTtjbGFzcyBWJHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdCgkLFgpe3JldHVybiB0aGlzLmJiX3Bvcz0kLHRoaXMuYmI9WCx0aGlzfXN0YXRpYyBnZXRSb290QXNGbG9hdGluZ1BvaW50KCQsWCl7cmV0dXJuKFh8fG5ldyBWJCkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNGbG9hdGluZ1BvaW50KCQsWCl7cmV0dXJuICQuc2V0UG9zaXRpb24oJC5wb3NpdGlvbigpK0kpLChYfHxuZXcgViQpLl9faW5pdCgkLnJlYWRJbnQzMigkLnBvc2l0aW9uKCkpKyQucG9zaXRpb24oKSwkKX1wcmVjaXNpb24oKXtsZXQgJD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiAkP3RoaXMuYmIucmVhZEludDE2KHRoaXMuYmJfcG9zKyQpOno4LkhBTEZ9c3RhdGljIHN0YXJ0RmxvYXRpbmdQb2ludCgkKXskLnN0YXJ0T2JqZWN0KDEpfXN0YXRpYyBhZGRQcmVjaXNpb24oJCxYKXskLmFkZEZpZWxkSW50MTYoMCxYLHo4LkhBTEYpfXN0YXRpYyBlbmRGbG9hdGluZ1BvaW50KCQpe3JldHVybiAkLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVGbG9hdGluZ1BvaW50KCQsWCl7cmV0dXJuIFYkLnN0YXJ0RmxvYXRpbmdQb2ludCgkKSxWJC5hZGRQcmVjaXNpb24oJCxYKSxWJC5lbmRGbG9hdGluZ1BvaW50KCQpfX12YXIgalk9QSgoKT0+e1k4KCk7S1koKX0pO2NsYXNzIEIke2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KCQsWCl7cmV0dXJuIHRoaXMuYmJfcG9zPSQsdGhpcy5iYj1YLHRoaXN9c3RhdGljIGdldFJvb3RBc0ludGVydmFsKCQsWCl7cmV0dXJuKFh8fG5ldyBCJCkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNJbnRlcnZhbCgkLFgpe3JldHVybiAkLnNldFBvc2l0aW9uKCQucG9zaXRpb24oKStJKSwoWHx8bmV3IEIkKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9dW5pdCgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuICQ/dGhpcy5iYi5yZWFkSW50MTYodGhpcy5iYl9wb3MrJCk6ZS5ZRUFSX01PTlRIfXN0YXRpYyBzdGFydEludGVydmFsKCQpeyQuc3RhcnRPYmplY3QoMSl9c3RhdGljIGFkZFVuaXQoJCxYKXskLmFkZEZpZWxkSW50MTYoMCxYLGUuWUVBUl9NT05USCl9c3RhdGljIGVuZEludGVydmFsKCQpe3JldHVybiAkLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVJbnRlcnZhbCgkLFgpe3JldHVybiBCJC5zdGFydEludGVydmFsKCQpLEIkLmFkZFVuaXQoJCxYKSxCJC5lbmRJbnRlcnZhbCgkKX19dmFyIFNZPUEoKCk9PntZOCgpO0dZKCl9KTtjbGFzcyB1MXtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdCgkLFgpe3JldHVybiB0aGlzLmJiX3Bvcz0kLHRoaXMuYmI9WCx0aGlzfXN0YXRpYyBnZXRSb290QXNMYXJnZUJpbmFyeSgkLFgpe3JldHVybihYfHxuZXcgdTEpLl9faW5pdCgkLnJlYWRJbnQzMigkLnBvc2l0aW9uKCkpKyQucG9zaXRpb24oKSwkKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzTGFyZ2VCaW5hcnkoJCxYKXtyZXR1cm4gJC5zZXRQb3NpdGlvbigkLnBvc2l0aW9uKCkrSSksKFh8fG5ldyB1MSkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXN0YXRpYyBzdGFydExhcmdlQmluYXJ5KCQpeyQuc3RhcnRPYmplY3QoMCl9c3RhdGljIGVuZExhcmdlQmluYXJ5KCQpe3JldHVybiAkLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVMYXJnZUJpbmFyeSgkKXtyZXR1cm4gdTEuc3RhcnRMYXJnZUJpbmFyeSgkKSx1MS5lbmRMYXJnZUJpbmFyeSgkKX19dmFyIEZXPUEoKCk9PntZOCgpfSk7Y2xhc3MgZDF7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MH1fX2luaXQoJCxYKXtyZXR1cm4gdGhpcy5iYl9wb3M9JCx0aGlzLmJiPVgsdGhpc31zdGF0aWMgZ2V0Um9vdEFzTGFyZ2VVdGY4KCQsWCl7cmV0dXJuKFh8fG5ldyBkMSkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNMYXJnZVV0ZjgoJCxYKXtyZXR1cm4gJC5zZXRQb3NpdGlvbigkLnBvc2l0aW9uKCkrSSksKFh8fG5ldyBkMSkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXN0YXRpYyBzdGFydExhcmdlVXRmOCgkKXskLnN0YXJ0T2JqZWN0KDApfXN0YXRpYyBlbmRMYXJnZVV0ZjgoJCl7cmV0dXJuICQuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZUxhcmdlVXRmOCgkKXtyZXR1cm4gZDEuc3RhcnRMYXJnZVV0ZjgoJCksZDEuZW5kTGFyZ2VVdGY4KCQpfX12YXIgQVc9QSgoKT0+e1k4KCl9KTtjbGFzcyBsMXtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdCgkLFgpe3JldHVybiB0aGlzLmJiX3Bvcz0kLHRoaXMuYmI9WCx0aGlzfXN0YXRpYyBnZXRSb290QXNMaXN0KCQsWCl7cmV0dXJuKFh8fG5ldyBsMSkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNMaXN0KCQsWCl7cmV0dXJuICQuc2V0UG9zaXRpb24oJC5wb3NpdGlvbigpK0kpLChYfHxuZXcgbDEpLl9faW5pdCgkLnJlYWRJbnQzMigkLnBvc2l0aW9uKCkpKyQucG9zaXRpb24oKSwkKX1zdGF0aWMgc3RhcnRMaXN0KCQpeyQuc3RhcnRPYmplY3QoMCl9c3RhdGljIGVuZExpc3QoJCl7cmV0dXJuICQuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZUxpc3QoJCl7cmV0dXJuIGwxLnN0YXJ0TGlzdCgkKSxsMS5lbmRMaXN0KCQpfX12YXIgVVc9QSgoKT0+e1k4KCl9KTtjbGFzcyBJJHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdCgkLFgpe3JldHVybiB0aGlzLmJiX3Bvcz0kLHRoaXMuYmI9WCx0aGlzfXN0YXRpYyBnZXRSb290QXNNYXAoJCxYKXtyZXR1cm4oWHx8bmV3IEkkKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc01hcCgkLFgpe3JldHVybiAkLnNldFBvc2l0aW9uKCQucG9zaXRpb24oKStJKSwoWHx8bmV3IEkkKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9a2V5c1NvcnRlZCgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuICQ/ISF0aGlzLmJiLnJlYWRJbnQ4KHRoaXMuYmJfcG9zKyQpOiExfXN0YXRpYyBzdGFydE1hcCgkKXskLnN0YXJ0T2JqZWN0KDEpfXN0YXRpYyBhZGRLZXlzU29ydGVkKCQsWCl7JC5hZGRGaWVsZEludDgoMCwrWCwwKX1zdGF0aWMgZW5kTWFwKCQpe3JldHVybiAkLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVNYXAoJCxYKXtyZXR1cm4gSSQuc3RhcnRNYXAoJCksSSQuYWRkS2V5c1NvcnRlZCgkLFgpLEkkLmVuZE1hcCgkKX19dmFyIERZPUEoKCk9PntZOCgpfSk7Y2xhc3MgbjF7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MH1fX2luaXQoJCxYKXtyZXR1cm4gdGhpcy5iYl9wb3M9JCx0aGlzLmJiPVgsdGhpc31zdGF0aWMgZ2V0Um9vdEFzTnVsbCgkLFgpe3JldHVybihYfHxuZXcgbjEpLl9faW5pdCgkLnJlYWRJbnQzMigkLnBvc2l0aW9uKCkpKyQucG9zaXRpb24oKSwkKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzTnVsbCgkLFgpe3JldHVybiAkLnNldFBvc2l0aW9uKCQucG9zaXRpb24oKStJKSwoWHx8bmV3IG4xKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9c3RhdGljIHN0YXJ0TnVsbCgkKXskLnN0YXJ0T2JqZWN0KDApfXN0YXRpYyBlbmROdWxsKCQpe3JldHVybiAkLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVOdWxsKCQpe3JldHVybiBuMS5zdGFydE51bGwoJCksbjEuZW5kTnVsbCgkKX19dmFyIFJXPUEoKCk9PntZOCgpfSk7Y2xhc3MgbzF7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MH1fX2luaXQoJCxYKXtyZXR1cm4gdGhpcy5iYl9wb3M9JCx0aGlzLmJiPVgsdGhpc31zdGF0aWMgZ2V0Um9vdEFzU3RydWN0XygkLFgpe3JldHVybihYfHxuZXcgbzEpLl9faW5pdCgkLnJlYWRJbnQzMigkLnBvc2l0aW9uKCkpKyQucG9zaXRpb24oKSwkKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU3RydWN0XygkLFgpe3JldHVybiAkLnNldFBvc2l0aW9uKCQucG9zaXRpb24oKStJKSwoWHx8bmV3IG8xKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9c3RhdGljIHN0YXJ0U3RydWN0XygkKXskLnN0YXJ0T2JqZWN0KDApfXN0YXRpYyBlbmRTdHJ1Y3RfKCQpe3JldHVybiAkLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVTdHJ1Y3RfKCQpe3JldHVybiBvMS5zdGFydFN0cnVjdF8oJCksbzEuZW5kU3RydWN0XygkKX19dmFyIENXPUEoKCk9PntZOCgpfSk7Y2xhc3MgbjB7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MH1fX2luaXQoJCxYKXtyZXR1cm4gdGhpcy5iYl9wb3M9JCx0aGlzLmJiPVgsdGhpc31zdGF0aWMgZ2V0Um9vdEFzVGltZSgkLFgpe3JldHVybihYfHxuZXcgbjApLl9faW5pdCgkLnJlYWRJbnQzMigkLnBvc2l0aW9uKCkpKyQucG9zaXRpb24oKSwkKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVGltZSgkLFgpe3JldHVybiAkLnNldFBvc2l0aW9uKCQucG9zaXRpb24oKStJKSwoWHx8bmV3IG4wKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9dW5pdCgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuICQ/dGhpcy5iYi5yZWFkSW50MTYodGhpcy5iYl9wb3MrJCk6Ty5NSUxMSVNFQ09ORH1iaXRXaWR0aCgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuICQ/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MrJCk6MzJ9c3RhdGljIHN0YXJ0VGltZSgkKXskLnN0YXJ0T2JqZWN0KDIpfXN0YXRpYyBhZGRVbml0KCQsWCl7JC5hZGRGaWVsZEludDE2KDAsWCxPLk1JTExJU0VDT05EKX1zdGF0aWMgYWRkQml0V2lkdGgoJCxYKXskLmFkZEZpZWxkSW50MzIoMSxYLDMyKX1zdGF0aWMgZW5kVGltZSgkKXtyZXR1cm4gJC5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlVGltZSgkLFgsUSl7cmV0dXJuIG4wLnN0YXJ0VGltZSgkKSxuMC5hZGRVbml0KCQsWCksbjAuYWRkQml0V2lkdGgoJCxRKSxuMC5lbmRUaW1lKCQpfX12YXIgd1k9QSgoKT0+e1k4KCk7T1EoKX0pO2NsYXNzIG8we2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KCQsWCl7cmV0dXJuIHRoaXMuYmJfcG9zPSQsdGhpcy5iYj1YLHRoaXN9c3RhdGljIGdldFJvb3RBc1RpbWVzdGFtcCgkLFgpe3JldHVybihYfHxuZXcgbzApLl9faW5pdCgkLnJlYWRJbnQzMigkLnBvc2l0aW9uKCkpKyQucG9zaXRpb24oKSwkKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVGltZXN0YW1wKCQsWCl7cmV0dXJuICQuc2V0UG9zaXRpb24oJC5wb3NpdGlvbigpK0kpLChYfHxuZXcgbzApLl9faW5pdCgkLnJlYWRJbnQzMigkLnBvc2l0aW9uKCkpKyQucG9zaXRpb24oKSwkKX11bml0KCl7bGV0ICQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gJD90aGlzLmJiLnJlYWRJbnQxNih0aGlzLmJiX3BvcyskKTpPLlNFQ09ORH10aW1lem9uZSgkKXtsZXQgWD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBYP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrWCwkKTpudWxsfXN0YXRpYyBzdGFydFRpbWVzdGFtcCgkKXskLnN0YXJ0T2JqZWN0KDIpfXN0YXRpYyBhZGRVbml0KCQsWCl7JC5hZGRGaWVsZEludDE2KDAsWCxPLlNFQ09ORCl9c3RhdGljIGFkZFRpbWV6b25lKCQsWCl7JC5hZGRGaWVsZE9mZnNldCgxLFgsMCl9c3RhdGljIGVuZFRpbWVzdGFtcCgkKXtyZXR1cm4gJC5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlVGltZXN0YW1wKCQsWCxRKXtyZXR1cm4gbzAuc3RhcnRUaW1lc3RhbXAoJCksbzAuYWRkVW5pdCgkLFgpLG8wLmFkZFRpbWV6b25lKCQsUSksbzAuZW5kVGltZXN0YW1wKCQpfX12YXIgVlk9QSgoKT0+e1k4KCk7T1EoKX0pO2NsYXNzIE8we2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KCQsWCl7cmV0dXJuIHRoaXMuYmJfcG9zPSQsdGhpcy5iYj1YLHRoaXN9c3RhdGljIGdldFJvb3RBc1VuaW9uKCQsWCl7cmV0dXJuKFh8fG5ldyBPMCkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNVbmlvbigkLFgpe3JldHVybiAkLnNldFBvc2l0aW9uKCQucG9zaXRpb24oKStJKSwoWHx8bmV3IE8wKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9bW9kZSgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuICQ/dGhpcy5iYi5yZWFkSW50MTYodGhpcy5iYl9wb3MrJCk6JDguU3BhcnNlfXR5cGVJZHMoJCl7bGV0IFg9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gWD90aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK1gpKyQqNCk6MH10eXBlSWRzTGVuZ3RoKCl7bGV0ICQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gJD90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyskKTowfXR5cGVJZHNBcnJheSgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuICQ/bmV3IEludDMyQXJyYXkodGhpcy5iYi5ieXRlcygpLmJ1ZmZlcix0aGlzLmJiLmJ5dGVzKCkuYnl0ZU9mZnNldCt0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zKyQpLHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zKyQpKTpudWxsfXN0YXRpYyBzdGFydFVuaW9uKCQpeyQuc3RhcnRPYmplY3QoMil9c3RhdGljIGFkZE1vZGUoJCxYKXskLmFkZEZpZWxkSW50MTYoMCxYLCQ4LlNwYXJzZSl9c3RhdGljIGFkZFR5cGVJZHMoJCxYKXskLmFkZEZpZWxkT2Zmc2V0KDEsWCwwKX1zdGF0aWMgY3JlYXRlVHlwZUlkc1ZlY3RvcigkLFgpeyQuc3RhcnRWZWN0b3IoNCxYLmxlbmd0aCw0KTtmb3IobGV0IFE9WC5sZW5ndGgtMTtRPj0wO1EtLSkkLmFkZEludDMyKFhbUV0pO3JldHVybiAkLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydFR5cGVJZHNWZWN0b3IoJCxYKXskLnN0YXJ0VmVjdG9yKDQsWCw0KX1zdGF0aWMgZW5kVW5pb24oJCl7cmV0dXJuICQuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZVVuaW9uKCQsWCxRKXtyZXR1cm4gTzAuc3RhcnRVbmlvbigkKSxPMC5hZGRNb2RlKCQsWCksTzAuYWRkVHlwZUlkcygkLFEpLE8wLmVuZFVuaW9uKCQpfX12YXIgQlk9QSgoKT0+e1k4KCk7V1koKX0pO2NsYXNzIHMxe2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KCQsWCl7cmV0dXJuIHRoaXMuYmJfcG9zPSQsdGhpcy5iYj1YLHRoaXN9c3RhdGljIGdldFJvb3RBc1V0ZjgoJCxYKXtyZXR1cm4oWHx8bmV3IHMxKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1V0ZjgoJCxYKXtyZXR1cm4gJC5zZXRQb3NpdGlvbigkLnBvc2l0aW9uKCkrSSksKFh8fG5ldyBzMSkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXN0YXRpYyBzdGFydFV0ZjgoJCl7JC5zdGFydE9iamVjdCgwKX1zdGF0aWMgZW5kVXRmOCgkKXtyZXR1cm4gJC5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlVXRmOCgkKXtyZXR1cm4gczEuc3RhcnRVdGY4KCQpLHMxLmVuZFV0ZjgoJCl9fXZhciBPVz1BKCgpPT57WTgoKX0pO2NsYXNzIHIxe2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KCQsWCl7cmV0dXJuIHRoaXMuYmJfcG9zPSQsdGhpcy5iYj1YLHRoaXN9c3RhdGljIGdldFJvb3RBc1V0ZjhWaWV3KCQsWCl7cmV0dXJuKFh8fG5ldyByMSkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNVdGY4VmlldygkLFgpe3JldHVybiAkLnNldFBvc2l0aW9uKCQucG9zaXRpb24oKStJKSwoWHx8bmV3IHIxKS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9c3RhdGljIHN0YXJ0VXRmOFZpZXcoJCl7JC5zdGFydE9iamVjdCgwKX1zdGF0aWMgZW5kVXRmOFZpZXcoJCl7cmV0dXJuICQuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZVV0ZjhWaWV3KCQpe3JldHVybiByMS5zdGFydFV0ZjhWaWV3KCQpLHIxLmVuZFV0ZjhWaWV3KCQpfX12YXIga1c9QSgoKT0+e1k4KCl9KTt2YXIgcDt2YXIgdVo9QSgoKT0+eyhmdW5jdGlvbigkKXskWyQuTk9ORT0wXT0iTk9ORSIsJFskLk51bGw9MV09Ik51bGwiLCRbJC5JbnQ9Ml09IkludCIsJFskLkZsb2F0aW5nUG9pbnQ9M109IkZsb2F0aW5nUG9pbnQiLCRbJC5CaW5hcnk9NF09IkJpbmFyeSIsJFskLlV0Zjg9NV09IlV0ZjgiLCRbJC5Cb29sPTZdPSJCb29sIiwkWyQuRGVjaW1hbD03XT0iRGVjaW1hbCIsJFskLkRhdGU9OF09IkRhdGUiLCRbJC5UaW1lPTldPSJUaW1lIiwkWyQuVGltZXN0YW1wPTEwXT0iVGltZXN0YW1wIiwkWyQuSW50ZXJ2YWw9MTFdPSJJbnRlcnZhbCIsJFskLkxpc3Q9MTJdPSJMaXN0IiwkWyQuU3RydWN0Xz0xM109IlN0cnVjdF8iLCRbJC5Vbmlvbj0xNF09IlVuaW9uIiwkWyQuRml4ZWRTaXplQmluYXJ5PTE1XT0iRml4ZWRTaXplQmluYXJ5IiwkWyQuRml4ZWRTaXplTGlzdD0xNl09IkZpeGVkU2l6ZUxpc3QiLCRbJC5NYXA9MTddPSJNYXAiLCRbJC5EdXJhdGlvbj0xOF09IkR1cmF0aW9uIiwkWyQuTGFyZ2VCaW5hcnk9MTldPSJMYXJnZUJpbmFyeSIsJFskLkxhcmdlVXRmOD0yMF09IkxhcmdlVXRmOCIsJFskLkxhcmdlTGlzdD0yMV09IkxhcmdlTGlzdCIsJFskLlJ1bkVuZEVuY29kZWQ9MjJdPSJSdW5FbmRFbmNvZGVkIiwkWyQuQmluYXJ5Vmlldz0yM109IkJpbmFyeVZpZXciLCRbJC5VdGY4Vmlldz0yNF09IlV0ZjhWaWV3IiwkWyQuTGlzdFZpZXc9MjVdPSJMaXN0VmlldyIsJFskLkxhcmdlTGlzdFZpZXc9MjZdPSJMYXJnZUxpc3RWaWV3In0pKHB8fChwPXt9KSl9KTtjbGFzcyBYMHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdCgkLFgpe3JldHVybiB0aGlzLmJiX3Bvcz0kLHRoaXMuYmI9WCx0aGlzfXN0YXRpYyBnZXRSb290QXNGaWVsZCgkLFgpe3JldHVybihYfHxuZXcgWDApLl9faW5pdCgkLnJlYWRJbnQzMigkLnBvc2l0aW9uKCkpKyQucG9zaXRpb24oKSwkKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRmllbGQoJCxYKXtyZXR1cm4gJC5zZXRQb3NpdGlvbigkLnBvc2l0aW9uKCkrSSksKFh8fG5ldyBYMCkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfW5hbWUoJCl7bGV0IFg9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gWD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK1gsJCk6bnVsbH1udWxsYWJsZSgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuICQ/ISF0aGlzLmJiLnJlYWRJbnQ4KHRoaXMuYmJfcG9zKyQpOiExfXR5cGVUeXBlKCl7bGV0ICQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gJD90aGlzLmJiLnJlYWRVaW50OCh0aGlzLmJiX3BvcyskKTpwLk5PTkV9dHlwZSgkKXtsZXQgWD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEwKTtyZXR1cm4gWD90aGlzLmJiLl9fdW5pb24oJCx0aGlzLmJiX3BvcytYKTpudWxsfWRpY3Rpb25hcnkoJCl7bGV0IFg9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIFg/KCR8fG5ldyBoJCkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytYKSx0aGlzLmJiKTpudWxsfWNoaWxkcmVuKCQsWCl7bGV0IFE9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNCk7cmV0dXJuIFE/KFh8fG5ldyBYMCkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK1EpKyQqNCksdGhpcy5iYik6bnVsbH1jaGlsZHJlbkxlbmd0aCgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTQpO3JldHVybiAkP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zKyQpOjB9Y3VzdG9tTWV0YWRhdGEoJCxYKXtsZXQgUT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE2KTtyZXR1cm4gUT8oWHx8bmV3IFU4KS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrUSkrJCo0KSx0aGlzLmJiKTpudWxsfWN1c3RvbU1ldGFkYXRhTGVuZ3RoKCl7bGV0ICQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNik7cmV0dXJuICQ/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrJCk6MH1zdGF0aWMgc3RhcnRGaWVsZCgkKXskLnN0YXJ0T2JqZWN0KDcpfXN0YXRpYyBhZGROYW1lKCQsWCl7JC5hZGRGaWVsZE9mZnNldCgwLFgsMCl9c3RhdGljIGFkZE51bGxhYmxlKCQsWCl7JC5hZGRGaWVsZEludDgoMSwrWCwwKX1zdGF0aWMgYWRkVHlwZVR5cGUoJCxYKXskLmFkZEZpZWxkSW50OCgyLFgscC5OT05FKX1zdGF0aWMgYWRkVHlwZSgkLFgpeyQuYWRkRmllbGRPZmZzZXQoMyxYLDApfXN0YXRpYyBhZGREaWN0aW9uYXJ5KCQsWCl7JC5hZGRGaWVsZE9mZnNldCg0LFgsMCl9c3RhdGljIGFkZENoaWxkcmVuKCQsWCl7JC5hZGRGaWVsZE9mZnNldCg1LFgsMCl9c3RhdGljIGNyZWF0ZUNoaWxkcmVuVmVjdG9yKCQsWCl7JC5zdGFydFZlY3Rvcig0LFgubGVuZ3RoLDQpO2ZvcihsZXQgUT1YLmxlbmd0aC0xO1E+PTA7US0tKSQuYWRkT2Zmc2V0KFhbUV0pO3JldHVybiAkLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydENoaWxkcmVuVmVjdG9yKCQsWCl7JC5zdGFydFZlY3Rvcig0LFgsNCl9c3RhdGljIGFkZEN1c3RvbU1ldGFkYXRhKCQsWCl7JC5hZGRGaWVsZE9mZnNldCg2LFgsMCl9c3RhdGljIGNyZWF0ZUN1c3RvbU1ldGFkYXRhVmVjdG9yKCQsWCl7JC5zdGFydFZlY3Rvcig0LFgubGVuZ3RoLDQpO2ZvcihsZXQgUT1YLmxlbmd0aC0xO1E+PTA7US0tKSQuYWRkT2Zmc2V0KFhbUV0pO3JldHVybiAkLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydEN1c3RvbU1ldGFkYXRhVmVjdG9yKCQsWCl7JC5zdGFydFZlY3Rvcig0LFgsNCl9c3RhdGljIGVuZEZpZWxkKCQpe3JldHVybiAkLmVuZE9iamVjdCgpfX12YXIgSVk9QSgoKT0+e1k4KCk7QVkoKTt6WCgpO3VaKCl9KTtjbGFzcyBnOHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdCgkLFgpe3JldHVybiB0aGlzLmJiX3Bvcz0kLHRoaXMuYmI9WCx0aGlzfXN0YXRpYyBnZXRSb290QXNTY2hlbWEoJCxYKXtyZXR1cm4oWHx8bmV3IGc4KS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1NjaGVtYSgkLFgpe3JldHVybiAkLnNldFBvc2l0aW9uKCQucG9zaXRpb24oKStJKSwoWHx8bmV3IGc4KS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9ZW5kaWFubmVzcygpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuICQ/dGhpcy5iYi5yZWFkSW50MTYodGhpcy5iYl9wb3MrJCk6ZjEuTGl0dGxlfWZpZWxkcygkLFgpe2xldCBRPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIFE/KFh8fG5ldyBYMCkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK1EpKyQqNCksdGhpcy5iYik6bnVsbH1maWVsZHNMZW5ndGgoKXtsZXQgJD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiAkP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zKyQpOjB9Y3VzdG9tTWV0YWRhdGEoJCxYKXtsZXQgUT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBRPyhYfHxuZXcgVTgpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytRKSskKjQpLHRoaXMuYmIpOm51bGx9Y3VzdG9tTWV0YWRhdGFMZW5ndGgoKXtsZXQgJD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiAkP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zKyQpOjB9ZmVhdHVyZXMoJCl7bGV0IFg9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMCk7cmV0dXJuIFg/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytYKSskKjgpOkJpZ0ludCgwKX1mZWF0dXJlc0xlbmd0aCgpe2xldCAkPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTApO3JldHVybiAkP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zKyQpOjB9c3RhdGljIHN0YXJ0U2NoZW1hKCQpeyQuc3RhcnRPYmplY3QoNCl9c3RhdGljIGFkZEVuZGlhbm5lc3MoJCxYKXskLmFkZEZpZWxkSW50MTYoMCxYLGYxLkxpdHRsZSl9c3RhdGljIGFkZEZpZWxkcygkLFgpeyQuYWRkRmllbGRPZmZzZXQoMSxYLDApfXN0YXRpYyBjcmVhdGVGaWVsZHNWZWN0b3IoJCxYKXskLnN0YXJ0VmVjdG9yKDQsWC5sZW5ndGgsNCk7Zm9yKGxldCBRPVgubGVuZ3RoLTE7UT49MDtRLS0pJC5hZGRPZmZzZXQoWFtRXSk7cmV0dXJuICQuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0RmllbGRzVmVjdG9yKCQsWCl7JC5zdGFydFZlY3Rvcig0LFgsNCl9c3RhdGljIGFkZEN1c3RvbU1ldGFkYXRhKCQsWCl7JC5hZGRGaWVsZE9mZnNldCgyLFgsMCl9c3RhdGljIGNyZWF0ZUN1c3RvbU1ldGFkYXRhVmVjdG9yKCQsWCl7JC5zdGFydFZlY3Rvcig0LFgubGVuZ3RoLDQpO2ZvcihsZXQgUT1YLmxlbmd0aC0xO1E+PTA7US0tKSQuYWRkT2Zmc2V0KFhbUV0pO3JldHVybiAkLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydEN1c3RvbU1ldGFkYXRhVmVjdG9yKCQsWCl7JC5zdGFydFZlY3Rvcig0LFgsNCl9c3RhdGljIGFkZEZlYXR1cmVzKCQsWCl7JC5hZGRGaWVsZE9mZnNldCgzLFgsMCl9c3RhdGljIGNyZWF0ZUZlYXR1cmVzVmVjdG9yKCQsWCl7JC5zdGFydFZlY3Rvcig4LFgubGVuZ3RoLDgpO2ZvcihsZXQgUT1YLmxlbmd0aC0xO1E+PTA7US0tKSQuYWRkSW50NjQoWFtRXSk7cmV0dXJuICQuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0RmVhdHVyZXNWZWN0b3IoJCxYKXskLnN0YXJ0VmVjdG9yKDgsWCw4KX1zdGF0aWMgZW5kU2NoZW1hKCQpe3JldHVybiAkLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVTY2hlbWEoJCxYLFEsWixKKXtyZXR1cm4gZzguc3RhcnRTY2hlbWEoJCksZzguYWRkRW5kaWFubmVzcygkLFgpLGc4LmFkZEZpZWxkcygkLFEpLGc4LmFkZEN1c3RvbU1ldGFkYXRhKCQsWiksZzguYWRkRmVhdHVyZXMoJCxKKSxnOC5lbmRTY2hlbWEoJCl9fXZhciBfWT1BKCgpPT57WTgoKTtGWSgpO0lZKCk7elgoKX0pO3ZhciBYODt2YXIgZFo9QSgoKT0+eyhmdW5jdGlvbigkKXskWyQuTk9ORT0wXT0iTk9ORSIsJFskLlNjaGVtYT0xXT0iU2NoZW1hIiwkWyQuRGljdGlvbmFyeUJhdGNoPTJdPSJEaWN0aW9uYXJ5QmF0Y2giLCRbJC5SZWNvcmRCYXRjaD0zXT0iUmVjb3JkQmF0Y2giLCRbJC5UZW5zb3I9NF09IlRlbnNvciIsJFskLlNwYXJzZVRlbnNvcj01XT0iU3BhcnNlVGVuc29yIn0pKFg4fHwoWDg9e30pKX0pO3ZhciBFLHowO3ZhciBWOD1BKCgpPT57ZlooKTtXWSgpO0tZKCk7UFkoKTtPUSgpO0dZKCk7ZFooKTsoZnVuY3Rpb24oJCl7JFskLk5PTkU9MF09Ik5PTkUiLCRbJC5OdWxsPTFdPSJOdWxsIiwkWyQuSW50PTJdPSJJbnQiLCRbJC5GbG9hdD0zXT0iRmxvYXQiLCRbJC5CaW5hcnk9NF09IkJpbmFyeSIsJFskLlV0Zjg9NV09IlV0ZjgiLCRbJC5Cb29sPTZdPSJCb29sIiwkWyQuRGVjaW1hbD03XT0iRGVjaW1hbCIsJFskLkRhdGU9OF09IkRhdGUiLCRbJC5UaW1lPTldPSJUaW1lIiwkWyQuVGltZXN0YW1wPTEwXT0iVGltZXN0YW1wIiwkWyQuSW50ZXJ2YWw9MTFdPSJJbnRlcnZhbCIsJFskLkxpc3Q9MTJdPSJMaXN0IiwkWyQuU3RydWN0PTEzXT0iU3RydWN0IiwkWyQuVW5pb249MTRdPSJVbmlvbiIsJFskLkZpeGVkU2l6ZUJpbmFyeT0xNV09IkZpeGVkU2l6ZUJpbmFyeSIsJFskLkZpeGVkU2l6ZUxpc3Q9MTZdPSJGaXhlZFNpemVMaXN0IiwkWyQuTWFwPTE3XT0iTWFwIiwkWyQuRHVyYXRpb249MThdPSJEdXJhdGlvbiIsJFskLkxhcmdlQmluYXJ5PTE5XT0iTGFyZ2VCaW5hcnkiLCRbJC5MYXJnZVV0Zjg9MjBdPSJMYXJnZVV0ZjgiLCRbJC5CaW5hcnlWaWV3PTIzXT0iQmluYXJ5VmlldyIsJFskLlV0ZjhWaWV3PTI0XT0iVXRmOFZpZXciLCRbJC5EaWN0aW9uYXJ5PS0xXT0iRGljdGlvbmFyeSIsJFskLkludDg9LTJdPSJJbnQ4IiwkWyQuSW50MTY9LTNdPSJJbnQxNiIsJFskLkludDMyPS00XT0iSW50MzIiLCRbJC5JbnQ2ND0tNV09IkludDY0IiwkWyQuVWludDg9LTZdPSJVaW50OCIsJFskLlVpbnQxNj0tN109IlVpbnQxNiIsJFskLlVpbnQzMj0tOF09IlVpbnQzMiIsJFskLlVpbnQ2ND0tOV09IlVpbnQ2NCIsJFskLkZsb2F0MTY9LTEwXT0iRmxvYXQxNiIsJFskLkZsb2F0MzI9LTExXT0iRmxvYXQzMiIsJFskLkZsb2F0NjQ9LTEyXT0iRmxvYXQ2NCIsJFskLkRhdGVEYXk9LTEzXT0iRGF0ZURheSIsJFskLkRhdGVNaWxsaXNlY29uZD0tMTRdPSJEYXRlTWlsbGlzZWNvbmQiLCRbJC5UaW1lc3RhbXBTZWNvbmQ9LTE1XT0iVGltZXN0YW1wU2Vjb25kIiwkWyQuVGltZXN0YW1wTWlsbGlzZWNvbmQ9LTE2XT0iVGltZXN0YW1wTWlsbGlzZWNvbmQiLCRbJC5UaW1lc3RhbXBNaWNyb3NlY29uZD0tMTddPSJUaW1lc3RhbXBNaWNyb3NlY29uZCIsJFskLlRpbWVzdGFtcE5hbm9zZWNvbmQ9LTE4XT0iVGltZXN0YW1wTmFub3NlY29uZCIsJFskLlRpbWVTZWNvbmQ9LTE5XT0iVGltZVNlY29uZCIsJFskLlRpbWVNaWxsaXNlY29uZD0tMjBdPSJUaW1lTWlsbGlzZWNvbmQiLCRbJC5UaW1lTWljcm9zZWNvbmQ9LTIxXT0iVGltZU1pY3Jvc2Vjb25kIiwkWyQuVGltZU5hbm9zZWNvbmQ9LTIyXT0iVGltZU5hbm9zZWNvbmQiLCRbJC5EZW5zZVVuaW9uPS0yM109IkRlbnNlVW5pb24iLCRbJC5TcGFyc2VVbmlvbj0tMjRdPSJTcGFyc2VVbmlvbiIsJFskLkludGVydmFsRGF5VGltZT0tMjVdPSJJbnRlcnZhbERheVRpbWUiLCRbJC5JbnRlcnZhbFllYXJNb250aD0tMjZdPSJJbnRlcnZhbFllYXJNb250aCIsJFskLkR1cmF0aW9uU2Vjb25kPS0yN109IkR1cmF0aW9uU2Vjb25kIiwkWyQuRHVyYXRpb25NaWxsaXNlY29uZD0tMjhdPSJEdXJhdGlvbk1pbGxpc2Vjb25kIiwkWyQuRHVyYXRpb25NaWNyb3NlY29uZD0tMjldPSJEdXJhdGlvbk1pY3Jvc2Vjb25kIiwkWyQuRHVyYXRpb25OYW5vc2Vjb25kPS0zMF09IkR1cmF0aW9uTmFub3NlY29uZCIsJFskLkludGVydmFsTW9udGhEYXlOYW5vPS0zMV09IkludGVydmFsTW9udGhEYXlOYW5vIn0pKEV8fChFPXt9KSk7KGZ1bmN0aW9uKCQpeyRbJC5PRkZTRVQ9MF09Ik9GRlNFVCIsJFskLkRBVEE9MV09IkRBVEEiLCRbJC5WQUxJRElUWT0yXT0iVkFMSURJVFkiLCRbJC5UWVBFPTNdPSJUWVBFIn0pKHowfHwoejA9e30pKX0pO3ZhciBUWT17fTtDJChUWSx7dmFsdWVUb1N0cmluZzooKT0+eSR9KTtmdW5jdGlvbiB5JCgkKXtpZigkPT09bnVsbClyZXR1cm4ibnVsbCI7aWYoJD09PXZvaWQgMClyZXR1cm4idW5kZWZpbmVkIjtzd2l0Y2godHlwZW9mICQpe2Nhc2UibnVtYmVyIjpyZXR1cm5gJHskfWA7Y2FzZSJiaWdpbnQiOnJldHVybmAkeyR9YDtjYXNlInN0cmluZyI6cmV0dXJuYCIkeyR9ImB9aWYodHlwZW9mICRbU3ltYm9sLnRvUHJpbWl0aXZlXT09PSJmdW5jdGlvbiIpcmV0dXJuICRbU3ltYm9sLnRvUHJpbWl0aXZlXSgic3RyaW5nIik7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KCQpKXtpZigkIGluc3RhbmNlb2YgQmlnSW50NjRBcnJheXx8JCBpbnN0YW5jZW9mIEJpZ1VpbnQ2NEFycmF5KXJldHVybmBbJHtbLi4uJF0ubWFwKChYKT0+eSQoWCkpfV1gO3JldHVybmBbJHskfV1gfXJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoJCk/YFskeyR9XWA6SlNPTi5zdHJpbmdpZnkoJCwoWCxRKT0+dHlwZW9mIFE9PT0iYmlnaW50Ij9gJHtRfWA6USl9ZnVuY3Rpb24gVzgoJCl7aWYodHlwZW9mICQ9PT0iYmlnaW50IiYmKCQ8TnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJ8fCQ+TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpKXRocm93IFR5cGVFcnJvcihgJHskfSBpcyBub3Qgc2FmZSB0byBjb252ZXJ0IHRvIGEgbnVtYmVyLmApO3JldHVybiBOdW1iZXIoJCl9ZnVuY3Rpb24geFkoJCxYKXtyZXR1cm4gVzgoJC9YKStXOCgkJVgpL1c4KFgpfXZhciBoWT17fTtDJChoWSx7aXNBcnJvd0JpZ051bVN5bWJvbDooKT0+alcsYmlnTnVtVG9TdHJpbmc6KCk9PkxYLGJpZ051bVRvTnVtYmVyOigpPT52WSxiaWdOdW1Ub0JpZ0ludDooKT0+U1csQk46KCk9PkM2fSk7ZnVuY3Rpb24gbSQoJCwuLi5YKXtpZihYLmxlbmd0aD09PTApcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZih0KHRoaXMuVHlwZWRBcnJheSwkKSx0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSk7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihuZXcgdGhpcy5UeXBlZEFycmF5KCQsLi4uWCksdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpfWZ1bmN0aW9uIEVYKC4uLiQpe3JldHVybiBtJC5hcHBseSh0aGlzLCQpfWZ1bmN0aW9uIE1YKC4uLiQpe3JldHVybiBtJC5hcHBseSh0aGlzLCQpfWZ1bmN0aW9uIFZRKC4uLiQpe3JldHVybiBtJC5hcHBseSh0aGlzLCQpfWZ1bmN0aW9uIHZZKCQsWCl7bGV0e2J1ZmZlcjpRLGJ5dGVPZmZzZXQ6WixieXRlTGVuZ3RoOkosc2lnbmVkOll9PSQsSD1uZXcgQmlnVWludDY0QXJyYXkoUSxaLEovOCksVz1ZJiZILmF0KC0xKSZCaWdJbnQoMSk8PEJpZ0ludCg2MyksUD1CaWdJbnQoMCksRz0wO2lmKFcpe2ZvcihsZXQgcSBvZiBIKVB8PShxXmVQKSooQmlnSW50KDEpPDxCaWdJbnQoNjQqRysrKSk7UCo9QmlnSW50KC0xKSxQLT1CaWdJbnQoMSl9ZWxzZSBmb3IobGV0IHEgb2YgSClQfD1xKihCaWdJbnQoMSk8PEJpZ0ludCg2NCpHKyspKTtpZih0eXBlb2YgWD09PSJudW1iZXIiJiZYPjApe2xldCBxPUJpZ0ludCgiMSIucGFkRW5kKFgrMSwiMCIpKSxMPVAvcSxOPVc/LShQJXEpOlAlcSxVPVc4KEwpLGs9YCR7Tn1gLnBhZFN0YXJ0KFgsIjAiKTtyZXR1cm4rYCR7VyYmVT09PTA/Ii0iOiIifSR7VX0uJHtrfWB9cmV0dXJuIFc4KFApfWZ1bmN0aW9uIExYKCQpe2lmKCQuYnl0ZUxlbmd0aD09PTgpcmV0dXJuYCR7bmV3ICQuQmlnSW50QXJyYXkoJC5idWZmZXIsJC5ieXRlT2Zmc2V0LDEpWzBdfWA7aWYoISQuc2lnbmVkKXJldHVybiBnWSgkKTtsZXQgWD1uZXcgVWludDE2QXJyYXkoJC5idWZmZXIsJC5ieXRlT2Zmc2V0LCQuYnl0ZUxlbmd0aC8yKTtpZihuZXcgSW50MTZBcnJheShbWC5hdCgtMSldKVswXT49MClyZXR1cm4gZ1koJCk7WD1YLnNsaWNlKCk7bGV0IFo9MTtmb3IobGV0IFk9MDtZPFgubGVuZ3RoO1krKyl7bGV0IEg9WFtZXSxXPX5IK1o7WFtZXT1XLFomPUg9PT0wPzE6MH1yZXR1cm5gLSR7Z1koWCl9YH1mdW5jdGlvbiBTVygkKXtpZigkLmJ5dGVMZW5ndGg9PT04KXJldHVybiBuZXcgJC5CaWdJbnRBcnJheSgkLmJ1ZmZlciwkLmJ5dGVPZmZzZXQsMSlbMF07ZWxzZSByZXR1cm4gTFgoJCl9ZnVuY3Rpb24gZ1koJCl7bGV0IFg9IiIsUT1uZXcgVWludDMyQXJyYXkoMiksWj1uZXcgVWludDE2QXJyYXkoJC5idWZmZXIsJC5ieXRlT2Zmc2V0LCQuYnl0ZUxlbmd0aC8yKSxKPW5ldyBVaW50MzJBcnJheSgoWj1uZXcgVWludDE2QXJyYXkoWikucmV2ZXJzZSgpKS5idWZmZXIpLFk9LTEsSD1aLmxlbmd0aC0xO2Rve2ZvcihRWzBdPVpbWT0wXTtZPEg7KVpbWSsrXT1RWzFdPVFbMF0vMTAsUVswXT0oUVswXS1RWzFdKjEwPDwxNikrWltZXTtaW1ldPVFbMV09UVswXS8xMCxRWzBdPVFbMF0tUVsxXSoxMCxYPWAke1FbMF19JHtYfWB9d2hpbGUoSlswXXx8SlsxXXx8SlsyXXx8SlszXSk7cmV0dXJuIFghPT1udWxsJiZYIT09dm9pZCAwP1g6IjAifWNsYXNzIEM2e3N0YXRpYyBuZXcoJCxYKXtzd2l0Y2goWCl7Y2FzZSEwOnJldHVybiBuZXcgRVgoJCk7Y2FzZSExOnJldHVybiBuZXcgTVgoJCl9c3dpdGNoKCQuY29uc3RydWN0b3Ipe2Nhc2UgSW50OEFycmF5OmNhc2UgSW50MTZBcnJheTpjYXNlIEludDMyQXJyYXk6Y2FzZSBCaWdJbnQ2NEFycmF5OnJldHVybiBuZXcgRVgoJCl9aWYoJC5ieXRlTGVuZ3RoPT09MTYpcmV0dXJuIG5ldyBWUSgkKTtyZXR1cm4gbmV3IE1YKCQpfXN0YXRpYyBzaWduZWQoJCl7cmV0dXJuIG5ldyBFWCgkKX1zdGF0aWMgdW5zaWduZWQoJCl7cmV0dXJuIG5ldyBNWCgkKX1zdGF0aWMgZGVjaW1hbCgkKXtyZXR1cm4gbmV3IFZRKCQpfWNvbnN0cnVjdG9yKCQsWCl7cmV0dXJuIEM2Lm5ldygkLFgpfX12YXIgalcsdFAsZVA7dmFyIGxaPUEoKCk9PntvOCgpO2pXPVN5bWJvbC5mb3IoImlzQXJyb3dCaWdOdW0iKTttJC5wcm90b3R5cGVbalddPSEwO20kLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm5gIiR7TFgodGhpcyl9ImB9O20kLnByb3RvdHlwZS52YWx1ZU9mPWZ1bmN0aW9uKCQpe3JldHVybiB2WSh0aGlzLCQpfTttJC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gTFgodGhpcyl9O20kLnByb3RvdHlwZVtTeW1ib2wudG9QcmltaXRpdmVdPWZ1bmN0aW9uKCQ9ImRlZmF1bHQiKXtzd2l0Y2goJCl7Y2FzZSJudW1iZXIiOnJldHVybiB2WSh0aGlzKTtjYXNlInN0cmluZyI6cmV0dXJuIExYKHRoaXMpO2Nhc2UiZGVmYXVsdCI6cmV0dXJuIFNXKHRoaXMpfXJldHVybiBMWCh0aGlzKX07T2JqZWN0LnNldFByb3RvdHlwZU9mKEVYLnByb3RvdHlwZSxPYmplY3QuY3JlYXRlKEludDMyQXJyYXkucHJvdG90eXBlKSk7T2JqZWN0LnNldFByb3RvdHlwZU9mKE1YLnByb3RvdHlwZSxPYmplY3QuY3JlYXRlKFVpbnQzMkFycmF5LnByb3RvdHlwZSkpO09iamVjdC5zZXRQcm90b3R5cGVPZihWUS5wcm90b3R5cGUsT2JqZWN0LmNyZWF0ZShVaW50MzJBcnJheS5wcm90b3R5cGUpKTtPYmplY3QuYXNzaWduKEVYLnByb3RvdHlwZSxtJC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOkVYLHNpZ25lZDohMCxUeXBlZEFycmF5OkludDMyQXJyYXksQmlnSW50QXJyYXk6QmlnSW50NjRBcnJheX0pO09iamVjdC5hc3NpZ24oTVgucHJvdG90eXBlLG0kLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6TVgsc2lnbmVkOiExLFR5cGVkQXJyYXk6VWludDMyQXJyYXksQmlnSW50QXJyYXk6QmlnVWludDY0QXJyYXl9KTtPYmplY3QuYXNzaWduKFZRLnByb3RvdHlwZSxtJC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOlZRLHNpZ25lZDohMCxUeXBlZEFycmF5OlVpbnQzMkFycmF5LEJpZ0ludEFycmF5OkJpZ1VpbnQ2NEFycmF5fSk7dFA9QmlnSW50KDQyOTQ5NjcyOTYpKkJpZ0ludCg0Mjk0OTY3Mjk2KSxlUD10UC1CaWdJbnQoMSl9KTtjbGFzcyBSe3N0YXRpYyBpc0RhdGFUeXBlKCQpe3JldHVybigkPT09bnVsbHx8JD09PXZvaWQgMD92b2lkIDA6JFtpV10pPT09ITB9c3RhdGljIGlzTnVsbCgkKXtyZXR1cm4oJD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiQudHlwZUlkKT09PUUuTnVsbH1zdGF0aWMgaXNJbnQoJCl7cmV0dXJuKCQ9PT1udWxsfHwkPT09dm9pZCAwP3ZvaWQgMDokLnR5cGVJZCk9PT1FLkludH1zdGF0aWMgaXNGbG9hdCgkKXtyZXR1cm4oJD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiQudHlwZUlkKT09PUUuRmxvYXR9c3RhdGljIGlzQmluYXJ5KCQpe3JldHVybigkPT09bnVsbHx8JD09PXZvaWQgMD92b2lkIDA6JC50eXBlSWQpPT09RS5CaW5hcnl9c3RhdGljIGlzQmluYXJ5VmlldygkKXtyZXR1cm4oJD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiQudHlwZUlkKT09PUUuQmluYXJ5Vmlld31zdGF0aWMgaXNMYXJnZUJpbmFyeSgkKXtyZXR1cm4oJD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiQudHlwZUlkKT09PUUuTGFyZ2VCaW5hcnl9c3RhdGljIGlzVXRmOCgkKXtyZXR1cm4oJD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiQudHlwZUlkKT09PUUuVXRmOH1zdGF0aWMgaXNVdGY4VmlldygkKXtyZXR1cm4oJD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiQudHlwZUlkKT09PUUuVXRmOFZpZXd9c3RhdGljIGlzTGFyZ2VVdGY4KCQpe3JldHVybigkPT09bnVsbHx8JD09PXZvaWQgMD92b2lkIDA6JC50eXBlSWQpPT09RS5MYXJnZVV0Zjh9c3RhdGljIGlzQm9vbCgkKXtyZXR1cm4oJD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiQudHlwZUlkKT09PUUuQm9vbH1zdGF0aWMgaXNEZWNpbWFsKCQpe3JldHVybigkPT09bnVsbHx8JD09PXZvaWQgMD92b2lkIDA6JC50eXBlSWQpPT09RS5EZWNpbWFsfXN0YXRpYyBpc0RhdGUoJCl7cmV0dXJuKCQ9PT1udWxsfHwkPT09dm9pZCAwP3ZvaWQgMDokLnR5cGVJZCk9PT1FLkRhdGV9c3RhdGljIGlzVGltZSgkKXtyZXR1cm4oJD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiQudHlwZUlkKT09PUUuVGltZX1zdGF0aWMgaXNUaW1lc3RhbXAoJCl7cmV0dXJuKCQ9PT1udWxsfHwkPT09dm9pZCAwP3ZvaWQgMDokLnR5cGVJZCk9PT1FLlRpbWVzdGFtcH1zdGF0aWMgaXNJbnRlcnZhbCgkKXtyZXR1cm4oJD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiQudHlwZUlkKT09PUUuSW50ZXJ2YWx9c3RhdGljIGlzRHVyYXRpb24oJCl7cmV0dXJuKCQ9PT1udWxsfHwkPT09dm9pZCAwP3ZvaWQgMDokLnR5cGVJZCk9PT1FLkR1cmF0aW9ufXN0YXRpYyBpc0xpc3QoJCl7cmV0dXJuKCQ9PT1udWxsfHwkPT09dm9pZCAwP3ZvaWQgMDokLnR5cGVJZCk9PT1FLkxpc3R9c3RhdGljIGlzU3RydWN0KCQpe3JldHVybigkPT09bnVsbHx8JD09PXZvaWQgMD92b2lkIDA6JC50eXBlSWQpPT09RS5TdHJ1Y3R9c3RhdGljIGlzVW5pb24oJCl7cmV0dXJuKCQ9PT1udWxsfHwkPT09dm9pZCAwP3ZvaWQgMDokLnR5cGVJZCk9PT1FLlVuaW9ufXN0YXRpYyBpc0ZpeGVkU2l6ZUJpbmFyeSgkKXtyZXR1cm4oJD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiQudHlwZUlkKT09PUUuRml4ZWRTaXplQmluYXJ5fXN0YXRpYyBpc0ZpeGVkU2l6ZUxpc3QoJCl7cmV0dXJuKCQ9PT1udWxsfHwkPT09dm9pZCAwP3ZvaWQgMDokLnR5cGVJZCk9PT1FLkZpeGVkU2l6ZUxpc3R9c3RhdGljIGlzTWFwKCQpe3JldHVybigkPT09bnVsbHx8JD09PXZvaWQgMD92b2lkIDA6JC50eXBlSWQpPT09RS5NYXB9c3RhdGljIGlzRGljdGlvbmFyeSgkKXtyZXR1cm4oJD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiQudHlwZUlkKT09PUUuRGljdGlvbmFyeX1zdGF0aWMgaXNEZW5zZVVuaW9uKCQpe3JldHVybiBSLmlzVW5pb24oJCkmJiQubW9kZT09PSQ4LkRlbnNlfXN0YXRpYyBpc1NwYXJzZVVuaW9uKCQpe3JldHVybiBSLmlzVW5pb24oJCkmJiQubW9kZT09PSQ4LlNwYXJzZX1jb25zdHJ1Y3RvcigkKXt0aGlzLnR5cGVJZD0kfX1mdW5jdGlvbiBNJCgkKXtsZXQgWD0kO3N3aXRjaCgkLnR5cGVJZCl7Y2FzZSBFLkRlY2ltYWw6cmV0dXJuICQuYml0V2lkdGgvMzI7Y2FzZSBFLkludGVydmFsOntpZihYLnVuaXQ9PT1lLk1PTlRIX0RBWV9OQU5PKXJldHVybiA0O3JldHVybiAxK1gudW5pdH1jYXNlIEUuQmluYXJ5VmlldzpjYXNlIEUuVXRmOFZpZXc6cmV0dXJuIDE2O2Nhc2UgRS5GaXhlZFNpemVMaXN0OnJldHVybiBYLmxpc3RTaXplO2Nhc2UgRS5GaXhlZFNpemVCaW5hcnk6cmV0dXJuIFguYnl0ZVdpZHRoO2RlZmF1bHQ6cmV0dXJuIDF9fXZhciBEVyx3VyxWVyxCVyxJVyxfVyxUVyx4VyxnVyx2VyxoVyx5VyxtVyxmVyxiVyxwVyxjVyx1VyxkVyxsVyxuVyxvVyxzVyxyVyxpVyxPOCxmOCxZMSxIMSxaMCxiOCxXMSxLMSxQMSxFJCxHJCxPNixHMSx0MCxUMCxhLGYkLF84LHMwLGIkLFM4LHEkLHIwLEJRLG5aLGswLG9aLHNaLElRLHJaLFEwLGlaLE5YLGFaLHRaLHgwLGVaLCRKLFhKLGowLFFKLFpKLF9RLEpKLEUwLGwsaTAsRlgsUjEseiQsYTAsZzAsJDcsczg7dmFyIE44PUEoKCk9PntWOCgpO2lXPVN5bWJvbC5mb3IoImFwYWNoZS1hcnJvdy9EYXRhVHlwZSIpO0RXPVN5bWJvbC50b1N0cmluZ1RhZztSW0RXXT0oKCQpPT57cmV0dXJuICQuY2hpbGRyZW49bnVsbCwkLkFycmF5VHlwZT1BcnJheSwkLk9mZnNldEFycmF5VHlwZT1JbnQzMkFycmF5LCRbaVddPSEwLCRbU3ltYm9sLnRvU3RyaW5nVGFnXT0iRGF0YVR5cGUifSkoUi5wcm90b3R5cGUpO084PWNsYXNzIE84IGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe3N1cGVyKEUuTnVsbCl9dG9TdHJpbmcoKXtyZXR1cm4iTnVsbCJ9fTt3Vz1TeW1ib2wudG9TdHJpbmdUYWc7Tzhbd1ddPSgoJCk9PiRbU3ltYm9sLnRvU3RyaW5nVGFnXT0iTnVsbCIpKE84LnByb3RvdHlwZSk7Zjg9Y2xhc3MgZjggZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKCQsWCl7c3VwZXIoRS5JbnQpO3RoaXMuaXNTaWduZWQ9JCx0aGlzLmJpdFdpZHRoPVh9Z2V0IEFycmF5VHlwZSgpe3N3aXRjaCh0aGlzLmJpdFdpZHRoKXtjYXNlIDg6cmV0dXJuIHRoaXMuaXNTaWduZWQ/SW50OEFycmF5OlVpbnQ4QXJyYXk7Y2FzZSAxNjpyZXR1cm4gdGhpcy5pc1NpZ25lZD9JbnQxNkFycmF5OlVpbnQxNkFycmF5O2Nhc2UgMzI6cmV0dXJuIHRoaXMuaXNTaWduZWQ/SW50MzJBcnJheTpVaW50MzJBcnJheTtjYXNlIDY0OnJldHVybiB0aGlzLmlzU2lnbmVkP0JpZ0ludDY0QXJyYXk6QmlnVWludDY0QXJyYXl9dGhyb3cgRXJyb3IoYFVucmVjb2duaXplZCAke3RoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXX0gdHlwZWApfXRvU3RyaW5nKCl7cmV0dXJuYCR7dGhpcy5pc1NpZ25lZD8iSSI6IlVpIn1udCR7dGhpcy5iaXRXaWR0aH1gfX07Vlc9U3ltYm9sLnRvU3RyaW5nVGFnO2Y4W1ZXXT0oKCQpPT57cmV0dXJuICQuaXNTaWduZWQ9bnVsbCwkLmJpdFdpZHRoPW51bGwsJFtTeW1ib2wudG9TdHJpbmdUYWddPSJJbnQifSkoZjgucHJvdG90eXBlKTtZMT1jbGFzcyBZMSBleHRlbmRzIGY4e2NvbnN0cnVjdG9yKCl7c3VwZXIoITAsOCl9Z2V0IEFycmF5VHlwZSgpe3JldHVybiBJbnQ4QXJyYXl9fTtIMT1jbGFzcyBIMSBleHRlbmRzIGY4e2NvbnN0cnVjdG9yKCl7c3VwZXIoITAsMTYpfWdldCBBcnJheVR5cGUoKXtyZXR1cm4gSW50MTZBcnJheX19O1owPWNsYXNzIFowIGV4dGVuZHMgZjh7Y29uc3RydWN0b3IoKXtzdXBlcighMCwzMil9Z2V0IEFycmF5VHlwZSgpe3JldHVybiBJbnQzMkFycmF5fX07Yjg9Y2xhc3MgYjggZXh0ZW5kcyBmOHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCEwLDY0KX1nZXQgQXJyYXlUeXBlKCl7cmV0dXJuIEJpZ0ludDY0QXJyYXl9fTtXMT1jbGFzcyBXMSBleHRlbmRzIGY4e2NvbnN0cnVjdG9yKCl7c3VwZXIoITEsOCl9Z2V0IEFycmF5VHlwZSgpe3JldHVybiBVaW50OEFycmF5fX07SzE9Y2xhc3MgSzEgZXh0ZW5kcyBmOHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCExLDE2KX1nZXQgQXJyYXlUeXBlKCl7cmV0dXJuIFVpbnQxNkFycmF5fX07UDE9Y2xhc3MgUDEgZXh0ZW5kcyBmOHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCExLDMyKX1nZXQgQXJyYXlUeXBlKCl7cmV0dXJuIFVpbnQzMkFycmF5fX07RSQ9Y2xhc3MgRSQgZXh0ZW5kcyBmOHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCExLDY0KX1nZXQgQXJyYXlUeXBlKCl7cmV0dXJuIEJpZ1VpbnQ2NEFycmF5fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KFkxLnByb3RvdHlwZSwiQXJyYXlUeXBlIix7dmFsdWU6SW50OEFycmF5fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEgxLnByb3RvdHlwZSwiQXJyYXlUeXBlIix7dmFsdWU6SW50MTZBcnJheX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShaMC5wcm90b3R5cGUsIkFycmF5VHlwZSIse3ZhbHVlOkludDMyQXJyYXl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYjgucHJvdG90eXBlLCJBcnJheVR5cGUiLHt2YWx1ZTpCaWdJbnQ2NEFycmF5fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFcxLnByb3RvdHlwZSwiQXJyYXlUeXBlIix7dmFsdWU6VWludDhBcnJheX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShLMS5wcm90b3R5cGUsIkFycmF5VHlwZSIse3ZhbHVlOlVpbnQxNkFycmF5fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFAxLnByb3RvdHlwZSwiQXJyYXlUeXBlIix7dmFsdWU6VWludDMyQXJyYXl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRSQucHJvdG90eXBlLCJBcnJheVR5cGUiLHt2YWx1ZTpCaWdVaW50NjRBcnJheX0pO0ckPWNsYXNzIEckIGV4dGVuZHMgUntjb25zdHJ1Y3RvcigkKXtzdXBlcihFLkZsb2F0KTt0aGlzLnByZWNpc2lvbj0kfWdldCBBcnJheVR5cGUoKXtzd2l0Y2godGhpcy5wcmVjaXNpb24pe2Nhc2UgejguSEFMRjpyZXR1cm4gVWludDE2QXJyYXk7Y2FzZSB6OC5TSU5HTEU6cmV0dXJuIEZsb2F0MzJBcnJheTtjYXNlIHo4LkRPVUJMRTpyZXR1cm4gRmxvYXQ2NEFycmF5fXRocm93IEVycm9yKGBVbnJlY29nbml6ZWQgJHt0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ119IHR5cGVgKX10b1N0cmluZygpe3JldHVybmBGbG9hdCR7dGhpcy5wcmVjaXNpb248PDV8fDE2fWB9fTtCVz1TeW1ib2wudG9TdHJpbmdUYWc7RyRbQlddPSgoJCk9PntyZXR1cm4gJC5wcmVjaXNpb249bnVsbCwkW1N5bWJvbC50b1N0cmluZ1RhZ109IkZsb2F0In0pKEckLnByb3RvdHlwZSk7TzY9Y2xhc3MgTzYgZXh0ZW5kcyBHJHtjb25zdHJ1Y3Rvcigpe3N1cGVyKHo4LkhBTEYpfX07RzE9Y2xhc3MgRzEgZXh0ZW5kcyBHJHtjb25zdHJ1Y3Rvcigpe3N1cGVyKHo4LlNJTkdMRSl9fTt0MD1jbGFzcyB0MCBleHRlbmRzIEcke2NvbnN0cnVjdG9yKCl7c3VwZXIoejguRE9VQkxFKX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShPNi5wcm90b3R5cGUsIkFycmF5VHlwZSIse3ZhbHVlOlVpbnQxNkFycmF5fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEcxLnByb3RvdHlwZSwiQXJyYXlUeXBlIix7dmFsdWU6RmxvYXQzMkFycmF5fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQwLnByb3RvdHlwZSwiQXJyYXlUeXBlIix7dmFsdWU6RmxvYXQ2NEFycmF5fSk7VDA9Y2xhc3MgVDAgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKCl7c3VwZXIoRS5CaW5hcnkpfXRvU3RyaW5nKCl7cmV0dXJuIkJpbmFyeSJ9fTtJVz1TeW1ib2wudG9TdHJpbmdUYWc7VDBbSVddPSgoJCk9PntyZXR1cm4gJC5BcnJheVR5cGU9VWludDhBcnJheSwkW1N5bWJvbC50b1N0cmluZ1RhZ109IkJpbmFyeSJ9KShUMC5wcm90b3R5cGUpO2E9Y2xhc3MgYSBleHRlbmRzIFJ7Y29uc3RydWN0b3IoKXtzdXBlcihFLkJpbmFyeVZpZXcpfXRvU3RyaW5nKCl7cmV0dXJuIkJpbmFyeVZpZXcifX07X1c9U3ltYm9sLnRvU3RyaW5nVGFnO2EuRUxFTUVOVF9XSURUSD0xNjthLklOTElORV9DQVBBQ0lUWT0xMjthLkxFTkdUSF9PRkZTRVQ9MDthLklOTElORV9PRkZTRVQ9NDthLkJVRkZFUl9JTkRFWF9PRkZTRVQ9ODthLkJVRkZFUl9PRkZTRVRfT0ZGU0VUPTEyO2FbX1ddPSgoJCk9PntyZXR1cm4gJC5BcnJheVR5cGU9VWludDhBcnJheSwkW1N5bWJvbC50b1N0cmluZ1RhZ109IkJpbmFyeVZpZXcifSkoYS5wcm90b3R5cGUpO2YkPWNsYXNzIGYkIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe3N1cGVyKEUuTGFyZ2VCaW5hcnkpfXRvU3RyaW5nKCl7cmV0dXJuIkxhcmdlQmluYXJ5In19O1RXPVN5bWJvbC50b1N0cmluZ1RhZztmJFtUV109KCgkKT0+e3JldHVybiAkLkFycmF5VHlwZT1VaW50OEFycmF5LCQuT2Zmc2V0QXJyYXlUeXBlPUJpZ0ludDY0QXJyYXksJFtTeW1ib2wudG9TdHJpbmdUYWddPSJMYXJnZUJpbmFyeSJ9KShmJC5wcm90b3R5cGUpO184PWNsYXNzIF84IGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe3N1cGVyKEUuVXRmOCl9dG9TdHJpbmcoKXtyZXR1cm4iVXRmOCJ9fTt4Vz1TeW1ib2wudG9TdHJpbmdUYWc7XzhbeFddPSgoJCk9PntyZXR1cm4gJC5BcnJheVR5cGU9VWludDhBcnJheSwkW1N5bWJvbC50b1N0cmluZ1RhZ109IlV0ZjgifSkoXzgucHJvdG90eXBlKTtzMD1jbGFzcyBzMCBleHRlbmRzIFJ7Y29uc3RydWN0b3IoKXtzdXBlcihFLlV0ZjhWaWV3KX10b1N0cmluZygpe3JldHVybiJVdGY4VmlldyJ9fTtnVz1TeW1ib2wudG9TdHJpbmdUYWc7czAuRUxFTUVOVF9XSURUSD1hLkVMRU1FTlRfV0lEVEg7czAuSU5MSU5FX0NBUEFDSVRZPWEuSU5MSU5FX0NBUEFDSVRZO3MwW2dXXT0oKCQpPT57cmV0dXJuICQuQXJyYXlUeXBlPVVpbnQ4QXJyYXksJFtTeW1ib2wudG9TdHJpbmdUYWddPSJVdGY4VmlldyJ9KShzMC5wcm90b3R5cGUpO2IkPWNsYXNzIGIkIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe3N1cGVyKEUuTGFyZ2VVdGY4KX10b1N0cmluZygpe3JldHVybiJMYXJnZVV0ZjgifX07dlc9U3ltYm9sLnRvU3RyaW5nVGFnO2IkW3ZXXT0oKCQpPT57cmV0dXJuICQuQXJyYXlUeXBlPVVpbnQ4QXJyYXksJC5PZmZzZXRBcnJheVR5cGU9QmlnSW50NjRBcnJheSwkW1N5bWJvbC50b1N0cmluZ1RhZ109IkxhcmdlVXRmOCJ9KShiJC5wcm90b3R5cGUpO1M4PWNsYXNzIFM4IGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe3N1cGVyKEUuQm9vbCl9dG9TdHJpbmcoKXtyZXR1cm4iQm9vbCJ9fTtoVz1TeW1ib2wudG9TdHJpbmdUYWc7UzhbaFddPSgoJCk9PntyZXR1cm4gJC5BcnJheVR5cGU9VWludDhBcnJheSwkW1N5bWJvbC50b1N0cmluZ1RhZ109IkJvb2wifSkoUzgucHJvdG90eXBlKTtxJD1jbGFzcyBxJCBleHRlbmRzIFJ7Y29uc3RydWN0b3IoJCxYLFE9MTI4KXtzdXBlcihFLkRlY2ltYWwpO3RoaXMuc2NhbGU9JCx0aGlzLnByZWNpc2lvbj1YLHRoaXMuYml0V2lkdGg9UX10b1N0cmluZygpe3JldHVybmBEZWNpbWFsWyR7dGhpcy5wcmVjaXNpb259ZSR7dGhpcy5zY2FsZT4wPyIrIjoiIn0ke3RoaXMuc2NhbGV9XWB9fTt5Vz1TeW1ib2wudG9TdHJpbmdUYWc7cSRbeVddPSgoJCk9PntyZXR1cm4gJC5zY2FsZT1udWxsLCQucHJlY2lzaW9uPW51bGwsJC5BcnJheVR5cGU9VWludDMyQXJyYXksJFtTeW1ib2wudG9TdHJpbmdUYWddPSJEZWNpbWFsIn0pKHEkLnByb3RvdHlwZSk7cjA9Y2xhc3MgcjAgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKCQpe3N1cGVyKEUuRGF0ZSk7dGhpcy51bml0PSR9dG9TdHJpbmcoKXtyZXR1cm5gRGF0ZSR7KHRoaXMudW5pdCsxKSozMn08JHtKOFt0aGlzLnVuaXRdfT5gfWdldCBBcnJheVR5cGUoKXtyZXR1cm4gdGhpcy51bml0PT09SjguREFZP0ludDMyQXJyYXk6QmlnSW50NjRBcnJheX19O21XPVN5bWJvbC50b1N0cmluZ1RhZztyMFttV109KCgkKT0+e3JldHVybiAkLnVuaXQ9bnVsbCwkW1N5bWJvbC50b1N0cmluZ1RhZ109IkRhdGUifSkocjAucHJvdG90eXBlKTtCUT1jbGFzcyBCUSBleHRlbmRzIHIwe2NvbnN0cnVjdG9yKCl7c3VwZXIoSjguREFZKX19O25aPWNsYXNzIG5aIGV4dGVuZHMgcjB7Y29uc3RydWN0b3IoKXtzdXBlcihKOC5NSUxMSVNFQ09ORCl9fTtrMD1jbGFzcyBrMCBleHRlbmRzIFJ7Y29uc3RydWN0b3IoJCxYKXtzdXBlcihFLlRpbWUpO3RoaXMudW5pdD0kLHRoaXMuYml0V2lkdGg9WH10b1N0cmluZygpe3JldHVybmBUaW1lJHt0aGlzLmJpdFdpZHRofTwke09bdGhpcy51bml0XX0+YH1nZXQgQXJyYXlUeXBlKCl7c3dpdGNoKHRoaXMuYml0V2lkdGgpe2Nhc2UgMzI6cmV0dXJuIEludDMyQXJyYXk7Y2FzZSA2NDpyZXR1cm4gQmlnSW50NjRBcnJheX10aHJvdyBFcnJvcihgVW5yZWNvZ25pemVkICR7dGhpc1tTeW1ib2wudG9TdHJpbmdUYWddfSB0eXBlYCl9fTtmVz1TeW1ib2wudG9TdHJpbmdUYWc7azBbZlddPSgoJCk9PntyZXR1cm4gJC51bml0PW51bGwsJC5iaXRXaWR0aD1udWxsLCRbU3ltYm9sLnRvU3RyaW5nVGFnXT0iVGltZSJ9KShrMC5wcm90b3R5cGUpO29aPWNsYXNzIG9aIGV4dGVuZHMgazB7Y29uc3RydWN0b3IoKXtzdXBlcihPLlNFQ09ORCwzMil9fTtzWj1jbGFzcyBzWiBleHRlbmRzIGswe2NvbnN0cnVjdG9yKCl7c3VwZXIoTy5NSUxMSVNFQ09ORCwzMil9fTtJUT1jbGFzcyBJUSBleHRlbmRzIGswe2NvbnN0cnVjdG9yKCl7c3VwZXIoTy5NSUNST1NFQ09ORCw2NCl9fTtyWj1jbGFzcyByWiBleHRlbmRzIGswe2NvbnN0cnVjdG9yKCl7c3VwZXIoTy5OQU5PU0VDT05ELDY0KX19O1EwPWNsYXNzIFEwIGV4dGVuZHMgUntjb25zdHJ1Y3RvcigkLFgpe3N1cGVyKEUuVGltZXN0YW1wKTt0aGlzLnVuaXQ9JCx0aGlzLnRpbWV6b25lPVh9dG9TdHJpbmcoKXtyZXR1cm5gVGltZXN0YW1wPCR7T1t0aGlzLnVuaXRdfSR7dGhpcy50aW1lem9uZT9gLCAke3RoaXMudGltZXpvbmV9YDoiIn0+YH19O2JXPVN5bWJvbC50b1N0cmluZ1RhZztRMFtiV109KCgkKT0+e3JldHVybiAkLnVuaXQ9bnVsbCwkLnRpbWV6b25lPW51bGwsJC5BcnJheVR5cGU9QmlnSW50NjRBcnJheSwkW1N5bWJvbC50b1N0cmluZ1RhZ109IlRpbWVzdGFtcCJ9KShRMC5wcm90b3R5cGUpO2laPWNsYXNzIGlaIGV4dGVuZHMgUTB7Y29uc3RydWN0b3IoJCl7c3VwZXIoTy5TRUNPTkQsJCl9fTtOWD1jbGFzcyBOWCBleHRlbmRzIFEwe2NvbnN0cnVjdG9yKCQpe3N1cGVyKE8uTUlMTElTRUNPTkQsJCl9fTthWj1jbGFzcyBhWiBleHRlbmRzIFEwe2NvbnN0cnVjdG9yKCQpe3N1cGVyKE8uTUlDUk9TRUNPTkQsJCl9fTt0Wj1jbGFzcyB0WiBleHRlbmRzIFEwe2NvbnN0cnVjdG9yKCQpe3N1cGVyKE8uTkFOT1NFQ09ORCwkKX19O3gwPWNsYXNzIHgwIGV4dGVuZHMgUntjb25zdHJ1Y3RvcigkKXtzdXBlcihFLkludGVydmFsKTt0aGlzLnVuaXQ9JH10b1N0cmluZygpe3JldHVybmBJbnRlcnZhbDwke2VbdGhpcy51bml0XX0+YH19O3BXPVN5bWJvbC50b1N0cmluZ1RhZzt4MFtwV109KCgkKT0+e3JldHVybiAkLnVuaXQ9bnVsbCwkLkFycmF5VHlwZT1JbnQzMkFycmF5LCRbU3ltYm9sLnRvU3RyaW5nVGFnXT0iSW50ZXJ2YWwifSkoeDAucHJvdG90eXBlKTtlWj1jbGFzcyBlWiBleHRlbmRzIHgwe2NvbnN0cnVjdG9yKCl7c3VwZXIoZS5EQVlfVElNRSl9fTskSj1jbGFzcyAkSiBleHRlbmRzIHgwe2NvbnN0cnVjdG9yKCl7c3VwZXIoZS5ZRUFSX01PTlRIKX19O1hKPWNsYXNzIFhKIGV4dGVuZHMgeDB7Y29uc3RydWN0b3IoKXtzdXBlcihlLk1PTlRIX0RBWV9OQU5PKX19O2owPWNsYXNzIGowIGV4dGVuZHMgUntjb25zdHJ1Y3RvcigkKXtzdXBlcihFLkR1cmF0aW9uKTt0aGlzLnVuaXQ9JH10b1N0cmluZygpe3JldHVybmBEdXJhdGlvbjwke09bdGhpcy51bml0XX0+YH19O2NXPVN5bWJvbC50b1N0cmluZ1RhZztqMFtjV109KCgkKT0+e3JldHVybiAkLnVuaXQ9bnVsbCwkLkFycmF5VHlwZT1CaWdJbnQ2NEFycmF5LCRbU3ltYm9sLnRvU3RyaW5nVGFnXT0iRHVyYXRpb24ifSkoajAucHJvdG90eXBlKTtRSj1jbGFzcyBRSiBleHRlbmRzIGowe2NvbnN0cnVjdG9yKCl7c3VwZXIoTy5TRUNPTkQpfX07Wko9Y2xhc3MgWkogZXh0ZW5kcyBqMHtjb25zdHJ1Y3Rvcigpe3N1cGVyKE8uTUlMTElTRUNPTkQpfX07X1E9Y2xhc3MgX1EgZXh0ZW5kcyBqMHtjb25zdHJ1Y3Rvcigpe3N1cGVyKE8uTUlDUk9TRUNPTkQpfX07Sko9Y2xhc3MgSkogZXh0ZW5kcyBqMHtjb25zdHJ1Y3Rvcigpe3N1cGVyKE8uTkFOT1NFQ09ORCl9fTtFMD1jbGFzcyBFMCBleHRlbmRzIFJ7Y29uc3RydWN0b3IoJCl7c3VwZXIoRS5MaXN0KTt0aGlzLmNoaWxkcmVuPVskXX10b1N0cmluZygpe3JldHVybmBMaXN0PCR7dGhpcy52YWx1ZVR5cGV9PmB9Z2V0IHZhbHVlVHlwZSgpe3JldHVybiB0aGlzLmNoaWxkcmVuWzBdLnR5cGV9Z2V0IHZhbHVlRmllbGQoKXtyZXR1cm4gdGhpcy5jaGlsZHJlblswXX1nZXQgQXJyYXlUeXBlKCl7cmV0dXJuIHRoaXMudmFsdWVUeXBlLkFycmF5VHlwZX19O3VXPVN5bWJvbC50b1N0cmluZ1RhZztFMFt1V109KCgkKT0+e3JldHVybiAkLmNoaWxkcmVuPW51bGwsJFtTeW1ib2wudG9TdHJpbmdUYWddPSJMaXN0In0pKEUwLnByb3RvdHlwZSk7bD1jbGFzcyBsIGV4dGVuZHMgUntjb25zdHJ1Y3RvcigkKXtzdXBlcihFLlN0cnVjdCk7dGhpcy5jaGlsZHJlbj0kfXRvU3RyaW5nKCl7cmV0dXJuYFN0cnVjdDx7JHt0aGlzLmNoaWxkcmVuLm1hcCgoJCk9PmAkeyQubmFtZX06JHskLnR5cGV9YCkuam9pbigiLCAiKX19PmB9fTtkVz1TeW1ib2wudG9TdHJpbmdUYWc7bFtkV109KCgkKT0+e3JldHVybiAkLmNoaWxkcmVuPW51bGwsJFtTeW1ib2wudG9TdHJpbmdUYWddPSJTdHJ1Y3QifSkobC5wcm90b3R5cGUpO2kwPWNsYXNzIGkwIGV4dGVuZHMgUntjb25zdHJ1Y3RvcigkLFgsUSl7c3VwZXIoRS5Vbmlvbik7dGhpcy5tb2RlPSQsdGhpcy5jaGlsZHJlbj1RLHRoaXMudHlwZUlkcz1YPUludDMyQXJyYXkuZnJvbShYKSx0aGlzLnR5cGVJZFRvQ2hpbGRJbmRleD1YLnJlZHVjZSgoWixKLFkpPT4oWltKXT1ZKSYmWnx8WixPYmplY3QuY3JlYXRlKG51bGwpKX10b1N0cmluZygpe3JldHVybmAke3RoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXX08JHt0aGlzLmNoaWxkcmVuLm1hcCgoJCk9PmAkeyQudHlwZX1gKS5qb2luKCIgfCAiKX0+YH19O2xXPVN5bWJvbC50b1N0cmluZ1RhZztpMFtsV109KCgkKT0+e3JldHVybiAkLm1vZGU9bnVsbCwkLnR5cGVJZHM9bnVsbCwkLmNoaWxkcmVuPW51bGwsJC50eXBlSWRUb0NoaWxkSW5kZXg9bnVsbCwkLkFycmF5VHlwZT1JbnQ4QXJyYXksJFtTeW1ib2wudG9TdHJpbmdUYWddPSJVbmlvbiJ9KShpMC5wcm90b3R5cGUpO0ZYPWNsYXNzIEZYIGV4dGVuZHMgaTB7Y29uc3RydWN0b3IoJCxYKXtzdXBlcigkOC5EZW5zZSwkLFgpfX07UjE9Y2xhc3MgUjEgZXh0ZW5kcyBpMHtjb25zdHJ1Y3RvcigkLFgpe3N1cGVyKCQ4LlNwYXJzZSwkLFgpfX07eiQ9Y2xhc3MgeiQgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKCQpe3N1cGVyKEUuRml4ZWRTaXplQmluYXJ5KTt0aGlzLmJ5dGVXaWR0aD0kfXRvU3RyaW5nKCl7cmV0dXJuYEZpeGVkU2l6ZUJpbmFyeVske3RoaXMuYnl0ZVdpZHRofV1gfX07blc9U3ltYm9sLnRvU3RyaW5nVGFnO3okW25XXT0oKCQpPT57cmV0dXJuICQuYnl0ZVdpZHRoPW51bGwsJC5BcnJheVR5cGU9VWludDhBcnJheSwkW1N5bWJvbC50b1N0cmluZ1RhZ109IkZpeGVkU2l6ZUJpbmFyeSJ9KSh6JC5wcm90b3R5cGUpO2EwPWNsYXNzIGEwIGV4dGVuZHMgUntjb25zdHJ1Y3RvcigkLFgpe3N1cGVyKEUuRml4ZWRTaXplTGlzdCk7dGhpcy5saXN0U2l6ZT0kLHRoaXMuY2hpbGRyZW49W1hdfWdldCB2YWx1ZVR5cGUoKXtyZXR1cm4gdGhpcy5jaGlsZHJlblswXS50eXBlfWdldCB2YWx1ZUZpZWxkKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW5bMF19Z2V0IEFycmF5VHlwZSgpe3JldHVybiB0aGlzLnZhbHVlVHlwZS5BcnJheVR5cGV9dG9TdHJpbmcoKXtyZXR1cm5gRml4ZWRTaXplTGlzdFske3RoaXMubGlzdFNpemV9XTwke3RoaXMudmFsdWVUeXBlfT5gfX07b1c9U3ltYm9sLnRvU3RyaW5nVGFnO2EwW29XXT0oKCQpPT57cmV0dXJuICQuY2hpbGRyZW49bnVsbCwkLmxpc3RTaXplPW51bGwsJFtTeW1ib2wudG9TdHJpbmdUYWddPSJGaXhlZFNpemVMaXN0In0pKGEwLnByb3RvdHlwZSk7ZzA9Y2xhc3MgZzAgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKCQsWD0hMSl7dmFyIFEsWixKO3N1cGVyKEUuTWFwKTtpZih0aGlzLmNoaWxkcmVuPVskXSx0aGlzLmtleXNTb3J0ZWQ9WCwkKXtpZigkLm5hbWU9ImVudHJpZXMiLChRPSQ9PT1udWxsfHwkPT09dm9pZCAwP3ZvaWQgMDokLnR5cGUpPT09bnVsbHx8UT09PXZvaWQgMD92b2lkIDA6US5jaGlsZHJlbil7bGV0IFk9KFo9JD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiQudHlwZSk9PT1udWxsfHxaPT09dm9pZCAwP3ZvaWQgMDpaLmNoaWxkcmVuWzBdO2lmKFkpWS5uYW1lPSJrZXkiO2xldCBIPShKPSQ9PT1udWxsfHwkPT09dm9pZCAwP3ZvaWQgMDokLnR5cGUpPT09bnVsbHx8Sj09PXZvaWQgMD92b2lkIDA6Si5jaGlsZHJlblsxXTtpZihIKUgubmFtZT0idmFsdWUifX19Z2V0IGtleVR5cGUoKXtyZXR1cm4gdGhpcy5jaGlsZHJlblswXS50eXBlLmNoaWxkcmVuWzBdLnR5cGV9Z2V0IHZhbHVlVHlwZSgpe3JldHVybiB0aGlzLmNoaWxkcmVuWzBdLnR5cGUuY2hpbGRyZW5bMV0udHlwZX1nZXQgY2hpbGRUeXBlKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW5bMF0udHlwZX10b1N0cmluZygpe3JldHVybmBNYXA8eyR7dGhpcy5jaGlsZHJlblswXS50eXBlLmNoaWxkcmVuLm1hcCgoJCk9PmAkeyQubmFtZX06JHskLnR5cGV9YCkuam9pbigiLCAiKX19PmB9fTtzVz1TeW1ib2wudG9TdHJpbmdUYWc7ZzBbc1ddPSgoJCk9PntyZXR1cm4gJC5jaGlsZHJlbj1udWxsLCQua2V5c1NvcnRlZD1udWxsLCRbU3ltYm9sLnRvU3RyaW5nVGFnXT0iTWFwXyJ9KShnMC5wcm90b3R5cGUpOyQ3PSgoJCk9PigpPT4rKyQpKC0xKTtzOD1jbGFzcyBzOCBleHRlbmRzIFJ7Y29uc3RydWN0b3IoJCxYLFEsWil7c3VwZXIoRS5EaWN0aW9uYXJ5KTt0aGlzLmluZGljZXM9WCx0aGlzLmRpY3Rpb25hcnk9JCx0aGlzLmlzT3JkZXJlZD1afHwhMSx0aGlzLmlkPVE9PW51bGw/JDcoKTpXOChRKX1nZXQgY2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5kaWN0aW9uYXJ5LmNoaWxkcmVufWdldCB2YWx1ZVR5cGUoKXtyZXR1cm4gdGhpcy5kaWN0aW9uYXJ5fWdldCBBcnJheVR5cGUoKXtyZXR1cm4gdGhpcy5kaWN0aW9uYXJ5LkFycmF5VHlwZX10b1N0cmluZygpe3JldHVybmBEaWN0aW9uYXJ5PCR7dGhpcy5pbmRpY2VzfSwgJHt0aGlzLmRpY3Rpb25hcnl9PmB9fTtyVz1TeW1ib2wudG9TdHJpbmdUYWc7czhbclddPSgoJCk9PntyZXR1cm4gJC5pZD1udWxsLCQuaW5kaWNlcz1udWxsLCQuaXNPcmRlcmVkPW51bGwsJC5kaWN0aW9uYXJ5PW51bGwsJFtTeW1ib2wudG9TdHJpbmdUYWddPSJEaWN0aW9uYXJ5In0pKHM4LnByb3RvdHlwZSl9KTtjbGFzcyBUe3Zpc2l0TWFueSgkLC4uLlgpe3JldHVybiAkLm1hcCgoUSxaKT0+dGhpcy52aXNpdChRLC4uLlgubWFwKChKKT0+SltaXSkpKX12aXNpdCguLi4kKXtyZXR1cm4gdGhpcy5nZXRWaXNpdEZuKCRbMF0sITEpLmFwcGx5KHRoaXMsJCl9Z2V0VmlzaXRGbigkLFg9ITApe3JldHVybiBYNyh0aGlzLCQsWCl9Z2V0VmlzaXRGbkJ5VHlwZUlkKCQsWD0hMCl7cmV0dXJuIEFYKHRoaXMsJCxYKX12aXNpdE51bGwoJCwuLi5YKXtyZXR1cm4gbnVsbH12aXNpdEJvb2woJCwuLi5YKXtyZXR1cm4gbnVsbH12aXNpdEludCgkLC4uLlgpe3JldHVybiBudWxsfXZpc2l0RmxvYXQoJCwuLi5YKXtyZXR1cm4gbnVsbH12aXNpdFV0ZjgoJCwuLi5YKXtyZXR1cm4gbnVsbH12aXNpdExhcmdlVXRmOCgkLC4uLlgpe3JldHVybiBudWxsfXZpc2l0VXRmOFZpZXcoJCwuLi5YKXtyZXR1cm4gbnVsbH12aXNpdEJpbmFyeSgkLC4uLlgpe3JldHVybiBudWxsfXZpc2l0TGFyZ2VCaW5hcnkoJCwuLi5YKXtyZXR1cm4gbnVsbH12aXNpdEJpbmFyeVZpZXcoJCwuLi5YKXtyZXR1cm4gbnVsbH12aXNpdEZpeGVkU2l6ZUJpbmFyeSgkLC4uLlgpe3JldHVybiBudWxsfXZpc2l0RGF0ZSgkLC4uLlgpe3JldHVybiBudWxsfXZpc2l0VGltZXN0YW1wKCQsLi4uWCl7cmV0dXJuIG51bGx9dmlzaXRUaW1lKCQsLi4uWCl7cmV0dXJuIG51bGx9dmlzaXREZWNpbWFsKCQsLi4uWCl7cmV0dXJuIG51bGx9dmlzaXRMaXN0KCQsLi4uWCl7cmV0dXJuIG51bGx9dmlzaXRTdHJ1Y3QoJCwuLi5YKXtyZXR1cm4gbnVsbH12aXNpdFVuaW9uKCQsLi4uWCl7cmV0dXJuIG51bGx9dmlzaXREaWN0aW9uYXJ5KCQsLi4uWCl7cmV0dXJuIG51bGx9dmlzaXRJbnRlcnZhbCgkLC4uLlgpe3JldHVybiBudWxsfXZpc2l0RHVyYXRpb24oJCwuLi5YKXtyZXR1cm4gbnVsbH12aXNpdEZpeGVkU2l6ZUxpc3QoJCwuLi5YKXtyZXR1cm4gbnVsbH12aXNpdE1hcCgkLC4uLlgpe3JldHVybiBudWxsfX1mdW5jdGlvbiBYNygkLFgsUT0hMCl7aWYodHlwZW9mIFg9PT0ibnVtYmVyIilyZXR1cm4gQVgoJCxYLFEpO2lmKHR5cGVvZiBYPT09InN0cmluZyImJlggaW4gRSlyZXR1cm4gQVgoJCxFW1hdLFEpO2lmKFgmJlggaW5zdGFuY2VvZiBSKXJldHVybiBBWCgkLHRXKFgpLFEpO2lmKChYPT09bnVsbHx8WD09PXZvaWQgMD92b2lkIDA6WC50eXBlKSYmWC50eXBlIGluc3RhbmNlb2YgUilyZXR1cm4gQVgoJCx0VyhYLnR5cGUpLFEpO3JldHVybiBBWCgkLEUuTk9ORSxRKX1mdW5jdGlvbiBBWCgkLFgsUT0hMCl7bGV0IFo9bnVsbDtzd2l0Y2goWCl7Y2FzZSBFLk51bGw6Wj0kLnZpc2l0TnVsbDticmVhaztjYXNlIEUuQm9vbDpaPSQudmlzaXRCb29sO2JyZWFrO2Nhc2UgRS5JbnQ6Wj0kLnZpc2l0SW50O2JyZWFrO2Nhc2UgRS5JbnQ4Olo9JC52aXNpdEludDh8fCQudmlzaXRJbnQ7YnJlYWs7Y2FzZSBFLkludDE2Olo9JC52aXNpdEludDE2fHwkLnZpc2l0SW50O2JyZWFrO2Nhc2UgRS5JbnQzMjpaPSQudmlzaXRJbnQzMnx8JC52aXNpdEludDticmVhaztjYXNlIEUuSW50NjQ6Wj0kLnZpc2l0SW50NjR8fCQudmlzaXRJbnQ7YnJlYWs7Y2FzZSBFLlVpbnQ4Olo9JC52aXNpdFVpbnQ4fHwkLnZpc2l0SW50O2JyZWFrO2Nhc2UgRS5VaW50MTY6Wj0kLnZpc2l0VWludDE2fHwkLnZpc2l0SW50O2JyZWFrO2Nhc2UgRS5VaW50MzI6Wj0kLnZpc2l0VWludDMyfHwkLnZpc2l0SW50O2JyZWFrO2Nhc2UgRS5VaW50NjQ6Wj0kLnZpc2l0VWludDY0fHwkLnZpc2l0SW50O2JyZWFrO2Nhc2UgRS5GbG9hdDpaPSQudmlzaXRGbG9hdDticmVhaztjYXNlIEUuRmxvYXQxNjpaPSQudmlzaXRGbG9hdDE2fHwkLnZpc2l0RmxvYXQ7YnJlYWs7Y2FzZSBFLkZsb2F0MzI6Wj0kLnZpc2l0RmxvYXQzMnx8JC52aXNpdEZsb2F0O2JyZWFrO2Nhc2UgRS5GbG9hdDY0Olo9JC52aXNpdEZsb2F0NjR8fCQudmlzaXRGbG9hdDticmVhaztjYXNlIEUuVXRmODpaPSQudmlzaXRVdGY4O2JyZWFrO2Nhc2UgRS5MYXJnZVV0Zjg6Wj0kLnZpc2l0TGFyZ2VVdGY4O2JyZWFrO2Nhc2UgRS5VdGY4VmlldzpaPSQudmlzaXRVdGY4Vmlld3x8JC52aXNpdFV0Zjg7YnJlYWs7Y2FzZSBFLkJpbmFyeTpaPSQudmlzaXRCaW5hcnk7YnJlYWs7Y2FzZSBFLkxhcmdlQmluYXJ5Olo9JC52aXNpdExhcmdlQmluYXJ5O2JyZWFrO2Nhc2UgRS5CaW5hcnlWaWV3Olo9JC52aXNpdEJpbmFyeVZpZXd8fCQudmlzaXRCaW5hcnk7YnJlYWs7Y2FzZSBFLkZpeGVkU2l6ZUJpbmFyeTpaPSQudmlzaXRGaXhlZFNpemVCaW5hcnk7YnJlYWs7Y2FzZSBFLkRhdGU6Wj0kLnZpc2l0RGF0ZTticmVhaztjYXNlIEUuRGF0ZURheTpaPSQudmlzaXREYXRlRGF5fHwkLnZpc2l0RGF0ZTticmVhaztjYXNlIEUuRGF0ZU1pbGxpc2Vjb25kOlo9JC52aXNpdERhdGVNaWxsaXNlY29uZHx8JC52aXNpdERhdGU7YnJlYWs7Y2FzZSBFLlRpbWVzdGFtcDpaPSQudmlzaXRUaW1lc3RhbXA7YnJlYWs7Y2FzZSBFLlRpbWVzdGFtcFNlY29uZDpaPSQudmlzaXRUaW1lc3RhbXBTZWNvbmR8fCQudmlzaXRUaW1lc3RhbXA7YnJlYWs7Y2FzZSBFLlRpbWVzdGFtcE1pbGxpc2Vjb25kOlo9JC52aXNpdFRpbWVzdGFtcE1pbGxpc2Vjb25kfHwkLnZpc2l0VGltZXN0YW1wO2JyZWFrO2Nhc2UgRS5UaW1lc3RhbXBNaWNyb3NlY29uZDpaPSQudmlzaXRUaW1lc3RhbXBNaWNyb3NlY29uZHx8JC52aXNpdFRpbWVzdGFtcDticmVhaztjYXNlIEUuVGltZXN0YW1wTmFub3NlY29uZDpaPSQudmlzaXRUaW1lc3RhbXBOYW5vc2Vjb25kfHwkLnZpc2l0VGltZXN0YW1wO2JyZWFrO2Nhc2UgRS5UaW1lOlo9JC52aXNpdFRpbWU7YnJlYWs7Y2FzZSBFLlRpbWVTZWNvbmQ6Wj0kLnZpc2l0VGltZVNlY29uZHx8JC52aXNpdFRpbWU7YnJlYWs7Y2FzZSBFLlRpbWVNaWxsaXNlY29uZDpaPSQudmlzaXRUaW1lTWlsbGlzZWNvbmR8fCQudmlzaXRUaW1lO2JyZWFrO2Nhc2UgRS5UaW1lTWljcm9zZWNvbmQ6Wj0kLnZpc2l0VGltZU1pY3Jvc2Vjb25kfHwkLnZpc2l0VGltZTticmVhaztjYXNlIEUuVGltZU5hbm9zZWNvbmQ6Wj0kLnZpc2l0VGltZU5hbm9zZWNvbmR8fCQudmlzaXRUaW1lO2JyZWFrO2Nhc2UgRS5EZWNpbWFsOlo9JC52aXNpdERlY2ltYWw7YnJlYWs7Y2FzZSBFLkxpc3Q6Wj0kLnZpc2l0TGlzdDticmVhaztjYXNlIEUuU3RydWN0Olo9JC52aXNpdFN0cnVjdDticmVhaztjYXNlIEUuVW5pb246Wj0kLnZpc2l0VW5pb247YnJlYWs7Y2FzZSBFLkRlbnNlVW5pb246Wj0kLnZpc2l0RGVuc2VVbmlvbnx8JC52aXNpdFVuaW9uO2JyZWFrO2Nhc2UgRS5TcGFyc2VVbmlvbjpaPSQudmlzaXRTcGFyc2VVbmlvbnx8JC52aXNpdFVuaW9uO2JyZWFrO2Nhc2UgRS5EaWN0aW9uYXJ5Olo9JC52aXNpdERpY3Rpb25hcnk7YnJlYWs7Y2FzZSBFLkludGVydmFsOlo9JC52aXNpdEludGVydmFsO2JyZWFrO2Nhc2UgRS5JbnRlcnZhbERheVRpbWU6Wj0kLnZpc2l0SW50ZXJ2YWxEYXlUaW1lfHwkLnZpc2l0SW50ZXJ2YWw7YnJlYWs7Y2FzZSBFLkludGVydmFsWWVhck1vbnRoOlo9JC52aXNpdEludGVydmFsWWVhck1vbnRofHwkLnZpc2l0SW50ZXJ2YWw7YnJlYWs7Y2FzZSBFLkludGVydmFsTW9udGhEYXlOYW5vOlo9JC52aXNpdEludGVydmFsTW9udGhEYXlOYW5vfHwkLnZpc2l0SW50ZXJ2YWw7YnJlYWs7Y2FzZSBFLkR1cmF0aW9uOlo9JC52aXNpdER1cmF0aW9uO2JyZWFrO2Nhc2UgRS5EdXJhdGlvblNlY29uZDpaPSQudmlzaXREdXJhdGlvblNlY29uZHx8JC52aXNpdER1cmF0aW9uO2JyZWFrO2Nhc2UgRS5EdXJhdGlvbk1pbGxpc2Vjb25kOlo9JC52aXNpdER1cmF0aW9uTWlsbGlzZWNvbmR8fCQudmlzaXREdXJhdGlvbjticmVhaztjYXNlIEUuRHVyYXRpb25NaWNyb3NlY29uZDpaPSQudmlzaXREdXJhdGlvbk1pY3Jvc2Vjb25kfHwkLnZpc2l0RHVyYXRpb247YnJlYWs7Y2FzZSBFLkR1cmF0aW9uTmFub3NlY29uZDpaPSQudmlzaXREdXJhdGlvbk5hbm9zZWNvbmR8fCQudmlzaXREdXJhdGlvbjticmVhaztjYXNlIEUuRml4ZWRTaXplTGlzdDpaPSQudmlzaXRGaXhlZFNpemVMaXN0O2JyZWFrO2Nhc2UgRS5NYXA6Wj0kLnZpc2l0TWFwO2JyZWFrfWlmKHR5cGVvZiBaPT09ImZ1bmN0aW9uIilyZXR1cm4gWjtpZighUSlyZXR1cm4oKT0+bnVsbDt0aHJvdyBFcnJvcihgVW5yZWNvZ25pemVkIHR5cGUgJyR7RVtYXX0nYCl9ZnVuY3Rpb24gdFcoJCl7c3dpdGNoKCQudHlwZUlkKXtjYXNlIEUuTnVsbDpyZXR1cm4gRS5OdWxsO2Nhc2UgRS5JbnQ6e2xldHtiaXRXaWR0aDpYLGlzU2lnbmVkOlF9PSQ7c3dpdGNoKFgpe2Nhc2UgODpyZXR1cm4gUT9FLkludDg6RS5VaW50ODtjYXNlIDE2OnJldHVybiBRP0UuSW50MTY6RS5VaW50MTY7Y2FzZSAzMjpyZXR1cm4gUT9FLkludDMyOkUuVWludDMyO2Nhc2UgNjQ6cmV0dXJuIFE/RS5JbnQ2NDpFLlVpbnQ2NH1yZXR1cm4gRS5JbnR9Y2FzZSBFLkZsb2F0OnN3aXRjaCgkLnByZWNpc2lvbil7Y2FzZSB6OC5IQUxGOnJldHVybiBFLkZsb2F0MTY7Y2FzZSB6OC5TSU5HTEU6cmV0dXJuIEUuRmxvYXQzMjtjYXNlIHo4LkRPVUJMRTpyZXR1cm4gRS5GbG9hdDY0fXJldHVybiBFLkZsb2F0O2Nhc2UgRS5CaW5hcnk6cmV0dXJuIEUuQmluYXJ5O2Nhc2UgRS5MYXJnZUJpbmFyeTpyZXR1cm4gRS5MYXJnZUJpbmFyeTtjYXNlIEUuQmluYXJ5VmlldzpyZXR1cm4gRS5CaW5hcnlWaWV3O2Nhc2UgRS5VdGY4OnJldHVybiBFLlV0Zjg7Y2FzZSBFLkxhcmdlVXRmODpyZXR1cm4gRS5MYXJnZVV0Zjg7Y2FzZSBFLlV0ZjhWaWV3OnJldHVybiBFLlV0ZjhWaWV3O2Nhc2UgRS5Cb29sOnJldHVybiBFLkJvb2w7Y2FzZSBFLkRlY2ltYWw6cmV0dXJuIEUuRGVjaW1hbDtjYXNlIEUuVGltZTpzd2l0Y2goJC51bml0KXtjYXNlIE8uU0VDT05EOnJldHVybiBFLlRpbWVTZWNvbmQ7Y2FzZSBPLk1JTExJU0VDT05EOnJldHVybiBFLlRpbWVNaWxsaXNlY29uZDtjYXNlIE8uTUlDUk9TRUNPTkQ6cmV0dXJuIEUuVGltZU1pY3Jvc2Vjb25kO2Nhc2UgTy5OQU5PU0VDT05EOnJldHVybiBFLlRpbWVOYW5vc2Vjb25kfXJldHVybiBFLlRpbWU7Y2FzZSBFLlRpbWVzdGFtcDpzd2l0Y2goJC51bml0KXtjYXNlIE8uU0VDT05EOnJldHVybiBFLlRpbWVzdGFtcFNlY29uZDtjYXNlIE8uTUlMTElTRUNPTkQ6cmV0dXJuIEUuVGltZXN0YW1wTWlsbGlzZWNvbmQ7Y2FzZSBPLk1JQ1JPU0VDT05EOnJldHVybiBFLlRpbWVzdGFtcE1pY3Jvc2Vjb25kO2Nhc2UgTy5OQU5PU0VDT05EOnJldHVybiBFLlRpbWVzdGFtcE5hbm9zZWNvbmR9cmV0dXJuIEUuVGltZXN0YW1wO2Nhc2UgRS5EYXRlOnN3aXRjaCgkLnVuaXQpe2Nhc2UgSjguREFZOnJldHVybiBFLkRhdGVEYXk7Y2FzZSBKOC5NSUxMSVNFQ09ORDpyZXR1cm4gRS5EYXRlTWlsbGlzZWNvbmR9cmV0dXJuIEUuRGF0ZTtjYXNlIEUuSW50ZXJ2YWw6c3dpdGNoKCQudW5pdCl7Y2FzZSBlLkRBWV9USU1FOnJldHVybiBFLkludGVydmFsRGF5VGltZTtjYXNlIGUuWUVBUl9NT05USDpyZXR1cm4gRS5JbnRlcnZhbFllYXJNb250aDtjYXNlIGUuTU9OVEhfREFZX05BTk86cmV0dXJuIEUuSW50ZXJ2YWxNb250aERheU5hbm99cmV0dXJuIEUuSW50ZXJ2YWw7Y2FzZSBFLkR1cmF0aW9uOnN3aXRjaCgkLnVuaXQpe2Nhc2UgTy5TRUNPTkQ6cmV0dXJuIEUuRHVyYXRpb25TZWNvbmQ7Y2FzZSBPLk1JTExJU0VDT05EOnJldHVybiBFLkR1cmF0aW9uTWlsbGlzZWNvbmQ7Y2FzZSBPLk1JQ1JPU0VDT05EOnJldHVybiBFLkR1cmF0aW9uTWljcm9zZWNvbmQ7Y2FzZSBPLk5BTk9TRUNPTkQ6cmV0dXJuIEUuRHVyYXRpb25OYW5vc2Vjb25kfXJldHVybiBFLkR1cmF0aW9uO2Nhc2UgRS5NYXA6cmV0dXJuIEUuTWFwO2Nhc2UgRS5MaXN0OnJldHVybiBFLkxpc3Q7Y2FzZSBFLlN0cnVjdDpyZXR1cm4gRS5TdHJ1Y3Q7Y2FzZSBFLlVuaW9uOnN3aXRjaCgkLm1vZGUpe2Nhc2UgJDguRGVuc2U6cmV0dXJuIEUuRGVuc2VVbmlvbjtjYXNlICQ4LlNwYXJzZTpyZXR1cm4gRS5TcGFyc2VVbmlvbn1yZXR1cm4gRS5VbmlvbjtjYXNlIEUuRml4ZWRTaXplQmluYXJ5OnJldHVybiBFLkZpeGVkU2l6ZUJpbmFyeTtjYXNlIEUuRml4ZWRTaXplTGlzdDpyZXR1cm4gRS5GaXhlZFNpemVMaXN0O2Nhc2UgRS5EaWN0aW9uYXJ5OnJldHVybiBFLkRpY3Rpb25hcnl9dGhyb3cgRXJyb3IoYFVucmVjb2duaXplZCB0eXBlICcke0VbJC50eXBlSWRdfSdgKX12YXIgZTA9QSgoKT0+e1Y4KCk7TjgoKTtULnByb3RvdHlwZS52aXNpdEludDg9bnVsbDtULnByb3RvdHlwZS52aXNpdEludDE2PW51bGw7VC5wcm90b3R5cGUudmlzaXRJbnQzMj1udWxsO1QucHJvdG90eXBlLnZpc2l0SW50NjQ9bnVsbDtULnByb3RvdHlwZS52aXNpdFVpbnQ4PW51bGw7VC5wcm90b3R5cGUudmlzaXRVaW50MTY9bnVsbDtULnByb3RvdHlwZS52aXNpdFVpbnQzMj1udWxsO1QucHJvdG90eXBlLnZpc2l0VWludDY0PW51bGw7VC5wcm90b3R5cGUudmlzaXRGbG9hdDE2PW51bGw7VC5wcm90b3R5cGUudmlzaXRGbG9hdDMyPW51bGw7VC5wcm90b3R5cGUudmlzaXRGbG9hdDY0PW51bGw7VC5wcm90b3R5cGUudmlzaXREYXRlRGF5PW51bGw7VC5wcm90b3R5cGUudmlzaXREYXRlTWlsbGlzZWNvbmQ9bnVsbDtULnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcFNlY29uZD1udWxsO1QucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wTWlsbGlzZWNvbmQ9bnVsbDtULnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcE1pY3Jvc2Vjb25kPW51bGw7VC5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBOYW5vc2Vjb25kPW51bGw7VC5wcm90b3R5cGUudmlzaXRUaW1lU2Vjb25kPW51bGw7VC5wcm90b3R5cGUudmlzaXRUaW1lTWlsbGlzZWNvbmQ9bnVsbDtULnByb3RvdHlwZS52aXNpdFRpbWVNaWNyb3NlY29uZD1udWxsO1QucHJvdG90eXBlLnZpc2l0VGltZU5hbm9zZWNvbmQ9bnVsbDtULnByb3RvdHlwZS52aXNpdERlbnNlVW5pb249bnVsbDtULnByb3RvdHlwZS52aXNpdFNwYXJzZVVuaW9uPW51bGw7VC5wcm90b3R5cGUudmlzaXRJbnRlcnZhbERheVRpbWU9bnVsbDtULnByb3RvdHlwZS52aXNpdEludGVydmFsWWVhck1vbnRoPW51bGw7VC5wcm90b3R5cGUudmlzaXRJbnRlcnZhbE1vbnRoRGF5TmFubz1udWxsO1QucHJvdG90eXBlLnZpc2l0RHVyYXRpb249bnVsbDtULnByb3RvdHlwZS52aXNpdER1cmF0aW9uU2Vjb25kPW51bGw7VC5wcm90b3R5cGUudmlzaXREdXJhdGlvbk1pbGxpc2Vjb25kPW51bGw7VC5wcm90b3R5cGUudmlzaXREdXJhdGlvbk1pY3Jvc2Vjb25kPW51bGw7VC5wcm90b3R5cGUudmlzaXREdXJhdGlvbk5hbm9zZWNvbmQ9bnVsbH0pO3ZhciB5WT17fTtDJCh5WSx7dWludDE2VG9GbG9hdDY0OigpPT5ZSixmbG9hdDY0VG9VaW50MTY6KCk9PlRRfSk7ZnVuY3Rpb24gWUooJCl7bGV0IFg9KCQmMzE3NDQpPj4xMCxRPSgkJjEwMjMpLzEwMjQsWj1NYXRoLnBvdygtMSwoJCYzMjc2OCk+PjE1KTtzd2l0Y2goWCl7Y2FzZSAzMTpyZXR1cm4gWiooUT9OdW1iZXIuTmFOOjEvMCk7Y2FzZSAwOnJldHVybiBaKihRPzAuMDAwMDYxMDM1MTU2MjUqUTowKX1yZXR1cm4gWipNYXRoLnBvdygyLFgtMTUpKigxK1EpfWZ1bmN0aW9uIFRRKCQpe2lmKCQhPT0kKXJldHVybiAzMjI1NjtlV1swXT0kO2xldCBYPShVWFsxXSYyMTQ3NDgzNjQ4KT4+MTYmNjU1MzUsUT1VWFsxXSYyMTQ2NDM1MDcyLFo9MDtpZihRPj0xMDg5NDcwNDY0KWlmKFVYWzBdPjApUT0zMTc0NDtlbHNlIFE9KFEmMjA4MDM3NDc4NCk+PjE2LFo9KFVYWzFdJjEwNDg1NzUpPj4xMDtlbHNlIGlmKFE8PTEwNTY5NjQ2MDgpWj0xMDQ4NTc2KyhVWFsxXSYxMDQ4NTc1KSxaPTEwNDg1NzYrKFo8PChRPj4yMCktOTk4KT4+MjEsUT0wO2Vsc2UgUT1RLTEwNTY5NjQ2MDg+PjEwLFo9KFVYWzFdJjEwNDg1NzUpKzUxMj4+MTA7cmV0dXJuIFh8UXxaJjY1NTM1fXZhciBlVyxVWDt2YXIgeFE9QSgoKT0+e2VXPW5ldyBGbG9hdDY0QXJyYXkoMSksVVg9bmV3IFVpbnQzMkFycmF5KGVXLmJ1ZmZlcil9KTtmdW5jdGlvbiBkKCQpe3JldHVybihYLFEsWik9PntpZihYLnNldFZhbGlkKFEsWiE9bnVsbCkpcmV0dXJuICQoWCxRLFopfX12YXIgYixRNz0oJCxYLFEpPT57JFtYXT1NYXRoLmZsb29yKFEvODY0MDAwMDApfSwkMz0oJCxYLFEsWik9PntpZihRKzE8WC5sZW5ndGgpe2xldCBKPVc4KFhbUV0pLFk9VzgoWFtRKzFdKTskLnNldChaLnN1YmFycmF5KDAsWS1KKSxKKX19LFo3PSh7b2Zmc2V0OiQsdmFsdWVzOlh9LFEsWik9PntsZXQgSj0kK1E7Wj9YW0o+PjNdfD0xPDxKJTg6WFtKPj4zXSY9figxPDxKJTgpfSxDMT0oe3ZhbHVlczokfSxYLFEpPT57JFtYXT1RfSxtWT0oe3ZhbHVlczokfSxYLFEpPT57JFtYXT1RfSxYMz0oe3ZhbHVlczokfSxYLFEpPT57JFtYXT1UUShRKX0sSjc9KCQsWCxRKT0+e3N3aXRjaCgkLnR5cGUucHJlY2lzaW9uKXtjYXNlIHo4LkhBTEY6cmV0dXJuIFgzKCQsWCxRKTtjYXNlIHo4LlNJTkdMRTpjYXNlIHo4LkRPVUJMRTpyZXR1cm4gbVkoJCxYLFEpfX0sSEo9KHt2YWx1ZXM6JH0sWCxRKT0+e1E3KCQsWCxRLnZhbHVlT2YoKSl9LFdKPSh7dmFsdWVzOiR9LFgsUSk9PnskW1hdPUJpZ0ludChRKX0sZlk9KHtzdHJpZGU6JCx2YWx1ZXM6WH0sUSxaKT0+e1guc2V0KFouc3ViYXJyYXkoMCwkKSwkKlEpfSxRMz0oe3ZhbHVlczokLHZhbHVlT2Zmc2V0czpYfSxRLFopPT4kMygkLFgsUSxaKSxZNz0oJCk9PntsZXQgWD0kLnZhcmlhZGljQnVmZmVycztpZighQXJyYXkuaXNBcnJheShYKXx8T2JqZWN0LmlzRnJvemVuKFgpKVg9QXJyYXkuZnJvbShYKSwkLnZhcmlhZGljQnVmZmVycz1YO3JldHVybiBYfSxaMz0oJCxYLFEpPT57dmFyIFosSixZLEg7bGV0IFc9JC52YWx1ZXM7aWYoIVcpdGhyb3cgRXJyb3IoIkJpbmFyeVZpZXcgZGF0YSBpcyBtaXNzaW5nIHZpZXcgYnVmZmVyIik7bGV0IFA9YS5FTEVNRU5UX1dJRFRILEc9WCpQLHE9RytQO2lmKEc8MHx8cT5XLmxlbmd0aCl0aHJvdyBSYW5nZUVycm9yKGBCaW5hcnlWaWV3IGluZGV4ICR7WH0gb3V0IG9mIGJvdW5kc2ApO1cuZmlsbCgwLEcscSk7bGV0IEw9bmV3IERhdGFWaWV3KFcuYnVmZmVyLFcuYnl0ZU9mZnNldCtHLFApLE49US5sZW5ndGg7aWYoTC5zZXRJbnQzMihhLkxFTkdUSF9PRkZTRVQsTiwhMCksTjw9YS5JTkxJTkVfQ0FQQUNJVFkpe1cuc2V0KFEsRythLklOTElORV9PRkZTRVQpO3JldHVybn1sZXQgVT0oKFo9UVswXSkhPT1udWxsJiZaIT09dm9pZCAwP1o6MCl8KChKPVFbMV0pIT09bnVsbCYmSiE9PXZvaWQgMD9KOjApPDw4fCgoWT1RWzJdKSE9PW51bGwmJlkhPT12b2lkIDA/WTowKTw8MTZ8KChIPVFbM10pIT09bnVsbCYmSCE9PXZvaWQgMD9IOjApPDwyNDtMLnNldFVpbnQzMihhLklOTElORV9PRkZTRVQsVT4+PjAsITApO2xldCBrPVk3KCQpLFM9US5zbGljZSgpLHM9ay5wdXNoKFMpLTE7TC5zZXRJbnQzMihhLkJVRkZFUl9JTkRFWF9PRkZTRVQscywhMCksTC5zZXRJbnQzMihhLkJVRkZFUl9PRkZTRVRfT0ZGU0VULDAsITApfSxINz0oJCxYLFEpPT57bGV0IFo9USBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/UTpuZXcgVWludDhBcnJheShRKTtaMygkLFgsWil9LEozPSh7dmFsdWVzOiQsdmFsdWVPZmZzZXRzOlh9LFEsWik9PiQzKCQsWCxRLEgkKFopKSxXNz0oJCxYLFEpPT57bGV0IFo9SCQoUSk7WjMoJCxYLFopfSxiWT0oJCxYLFEpPT57JC50eXBlLnVuaXQ9PT1KOC5EQVk/SEooJCxYLFEpOldKKCQsWCxRKX0sS0o9KHt2YWx1ZXM6JH0sWCxRKT0+eyRbWF09QmlnSW50KFEvMTAwMCl9LFBKPSh7dmFsdWVzOiR9LFgsUSk9PnskW1hdPUJpZ0ludChRKX0sR0o9KHt2YWx1ZXM6JH0sWCxRKT0+eyRbWF09QmlnSW50KFEqMTAwMCl9LHFKPSh7dmFsdWVzOiR9LFgsUSk9PnskW1hdPUJpZ0ludChRKjFlNil9LHBZPSgkLFgsUSk9Pntzd2l0Y2goJC50eXBlLnVuaXQpe2Nhc2UgTy5TRUNPTkQ6cmV0dXJuIEtKKCQsWCxRKTtjYXNlIE8uTUlMTElTRUNPTkQ6cmV0dXJuIFBKKCQsWCxRKTtjYXNlIE8uTUlDUk9TRUNPTkQ6cmV0dXJuIEdKKCQsWCxRKTtjYXNlIE8uTkFOT1NFQ09ORDpyZXR1cm4gcUooJCxYLFEpfX0seko9KHt2YWx1ZXM6JH0sWCxRKT0+eyRbWF09UX0sRUo9KHt2YWx1ZXM6JH0sWCxRKT0+eyRbWF09UX0sTUo9KHt2YWx1ZXM6JH0sWCxRKT0+eyRbWF09UX0sTEo9KHt2YWx1ZXM6JH0sWCxRKT0+eyRbWF09UX0sY1k9KCQsWCxRKT0+e3N3aXRjaCgkLnR5cGUudW5pdCl7Y2FzZSBPLlNFQ09ORDpyZXR1cm4gekooJCxYLFEpO2Nhc2UgTy5NSUxMSVNFQ09ORDpyZXR1cm4gRUooJCxYLFEpO2Nhc2UgTy5NSUNST1NFQ09ORDpyZXR1cm4gTUooJCxYLFEpO2Nhc2UgTy5OQU5PU0VDT05EOnJldHVybiBMSigkLFgsUSl9fSx1WT0oe3ZhbHVlczokLHN0cmlkZTpYfSxRLFopPT57JC5zZXQoWi5zdWJhcnJheSgwLFgpLFgqUSl9LEs3PSgkLFgsUSk9PntsZXQgWj0kLmNoaWxkcmVuWzBdLEo9JC52YWx1ZU9mZnNldHMsWT1NMC5nZXRWaXNpdEZuKFopO2lmKEFycmF5LmlzQXJyYXkoUSkpZm9yKGxldCBIPS0xLFc9SltYXSxQPUpbWCsxXTtXPFA7KVkoWixXKyssUVsrK0hdKTtlbHNlIGZvcihsZXQgSD0tMSxXPUpbWF0sUD1KW1grMV07VzxQOylZKFosVysrLFEuZ2V0KCsrSCkpfSxQNz0oJCxYLFEpPT57bGV0IFo9JC5jaGlsZHJlblswXSx7dmFsdWVPZmZzZXRzOkp9PSQsWT1NMC5nZXRWaXNpdEZuKFopLHtbWF06SCxbWCsxXTpXfT1KLFA9USBpbnN0YW5jZW9mIE1hcD9RLmVudHJpZXMoKTpPYmplY3QuZW50cmllcyhRKTtmb3IobGV0IEcgb2YgUClpZihZKFosSCxHKSwrK0g+PVcpYnJlYWt9LEc3PSgkLFgpPT4oUSxaLEosWSk9PlomJlEoWiwkLFhbWV0pLHE3PSgkLFgpPT4oUSxaLEosWSk9PlomJlEoWiwkLFguZ2V0KFkpKSx6Nz0oJCxYKT0+KFEsWixKLFkpPT5aJiZRKFosJCxYLmdldChKLm5hbWUpKSxFNz0oJCxYKT0+KFEsWixKLFkpPT5aJiZRKFosJCxYW0oubmFtZV0pLE03PSgkLFgsUSk9PntsZXQgWj0kLnR5cGUuY2hpbGRyZW4ubWFwKChZKT0+TTAuZ2V0VmlzaXRGbihZLnR5cGUpKSxKPVEgaW5zdGFuY2VvZiBNYXA/ejcoWCxRKTpRIGluc3RhbmNlb2YgRD9xNyhYLFEpOkFycmF5LmlzQXJyYXkoUSk/RzcoWCxRKTpFNyhYLFEpOyQudHlwZS5jaGlsZHJlbi5mb3JFYWNoKChZLEgpPT5KKFpbSF0sJC5jaGlsZHJlbltIXSxZLEgpKX0sTDc9KCQsWCxRKT0+eyQudHlwZS5tb2RlPT09JDguRGVuc2U/WTMoJCxYLFEpOkgzKCQsWCxRKX0sWTM9KCQsWCxRKT0+e2xldCBaPSQudHlwZS50eXBlSWRUb0NoaWxkSW5kZXhbJC50eXBlSWRzW1hdXSxKPSQuY2hpbGRyZW5bWl07TTAudmlzaXQoSiwkLnZhbHVlT2Zmc2V0c1tYXSxRKX0sSDM9KCQsWCxRKT0+e2xldCBaPSQudHlwZS50eXBlSWRUb0NoaWxkSW5kZXhbJC50eXBlSWRzW1hdXSxKPSQuY2hpbGRyZW5bWl07TTAudmlzaXQoSixYLFEpfSxONz0oJCxYLFEpPT57dmFyIFo7KFo9JC5kaWN0aW9uYXJ5KT09PW51bGx8fFo9PT12b2lkIDB8fFouc2V0KCQudmFsdWVzW1hdLFEpfSxkWT0oJCxYLFEpPT57c3dpdGNoKCQudHlwZS51bml0KXtjYXNlIGUuWUVBUl9NT05USDpyZXR1cm4gRkooJCxYLFEpO2Nhc2UgZS5EQVlfVElNRTpyZXR1cm4gTkooJCxYLFEpO2Nhc2UgZS5NT05USF9EQVlfTkFOTzpyZXR1cm4gQUooJCxYLFEpfX0sTko9KHt2YWx1ZXM6JH0sWCxRKT0+eyQuc2V0KFEuc3ViYXJyYXkoMCwyKSwyKlgpfSxGSj0oe3ZhbHVlczokfSxYLFEpPT57JFtYXT1RWzBdKjEyK1FbMV0lMTJ9LEFKPSh7dmFsdWVzOiQsc3RyaWRlOlh9LFEsWik9PnskLnNldChaLnN1YmFycmF5KDAsWCksWCpRKX0sVUo9KHt2YWx1ZXM6JH0sWCxRKT0+eyRbWF09UX0sUko9KHt2YWx1ZXM6JH0sWCxRKT0+eyRbWF09UX0sQ0o9KHt2YWx1ZXM6JH0sWCxRKT0+eyRbWF09UX0sT0o9KHt2YWx1ZXM6JH0sWCxRKT0+eyRbWF09UX0sbFk9KCQsWCxRKT0+e3N3aXRjaCgkLnR5cGUudW5pdCl7Y2FzZSBPLlNFQ09ORDpyZXR1cm4gVUooJCxYLFEpO2Nhc2UgTy5NSUxMSVNFQ09ORDpyZXR1cm4gUkooJCxYLFEpO2Nhc2UgTy5NSUNST1NFQ09ORDpyZXR1cm4gQ0ooJCxYLFEpO2Nhc2UgTy5OQU5PU0VDT05EOnJldHVybiBPSigkLFgsUSl9fSxGNz0oJCxYLFEpPT57bGV0e3N0cmlkZTpafT0kLEo9JC5jaGlsZHJlblswXSxZPU0wLmdldFZpc2l0Rm4oSik7aWYoQXJyYXkuaXNBcnJheShRKSlmb3IobGV0IEg9LTEsVz1YKlo7KytIPFo7KVkoSixXK0gsUVtIXSk7ZWxzZSBmb3IobGV0IEg9LTEsVz1YKlo7KytIPFo7KVkoSixXK0gsUS5nZXQoSCkpfSxNMDt2YXIgTCQ9QSgoKT0+e1MwKCk7ZTAoKTtVMSgpO3hRKCk7VjgoKTtOOCgpO2I9Y2xhc3MgYiBleHRlbmRzIFR7fTtiLnByb3RvdHlwZS52aXNpdEJvb2w9ZChaNyk7Yi5wcm90b3R5cGUudmlzaXRJbnQ9ZChDMSk7Yi5wcm90b3R5cGUudmlzaXRJbnQ4PWQoQzEpO2IucHJvdG90eXBlLnZpc2l0SW50MTY9ZChDMSk7Yi5wcm90b3R5cGUudmlzaXRJbnQzMj1kKEMxKTtiLnByb3RvdHlwZS52aXNpdEludDY0PWQoQzEpO2IucHJvdG90eXBlLnZpc2l0VWludDg9ZChDMSk7Yi5wcm90b3R5cGUudmlzaXRVaW50MTY9ZChDMSk7Yi5wcm90b3R5cGUudmlzaXRVaW50MzI9ZChDMSk7Yi5wcm90b3R5cGUudmlzaXRVaW50NjQ9ZChDMSk7Yi5wcm90b3R5cGUudmlzaXRGbG9hdD1kKEo3KTtiLnByb3RvdHlwZS52aXNpdEZsb2F0MTY9ZChYMyk7Yi5wcm90b3R5cGUudmlzaXRGbG9hdDMyPWQobVkpO2IucHJvdG90eXBlLnZpc2l0RmxvYXQ2ND1kKG1ZKTtiLnByb3RvdHlwZS52aXNpdFV0Zjg9ZChKMyk7Yi5wcm90b3R5cGUudmlzaXRMYXJnZVV0Zjg9ZChKMyk7Yi5wcm90b3R5cGUudmlzaXRVdGY4Vmlldz1kKFc3KTtiLnByb3RvdHlwZS52aXNpdEJpbmFyeT1kKFEzKTtiLnByb3RvdHlwZS52aXNpdExhcmdlQmluYXJ5PWQoUTMpO2IucHJvdG90eXBlLnZpc2l0QmluYXJ5Vmlldz1kKEg3KTtiLnByb3RvdHlwZS52aXNpdEZpeGVkU2l6ZUJpbmFyeT1kKGZZKTtiLnByb3RvdHlwZS52aXNpdERhdGU9ZChiWSk7Yi5wcm90b3R5cGUudmlzaXREYXRlRGF5PWQoSEopO2IucHJvdG90eXBlLnZpc2l0RGF0ZU1pbGxpc2Vjb25kPWQoV0opO2IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wPWQocFkpO2IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wU2Vjb25kPWQoS0opO2IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wTWlsbGlzZWNvbmQ9ZChQSik7Yi5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBNaWNyb3NlY29uZD1kKEdKKTtiLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcE5hbm9zZWNvbmQ9ZChxSik7Yi5wcm90b3R5cGUudmlzaXRUaW1lPWQoY1kpO2IucHJvdG90eXBlLnZpc2l0VGltZVNlY29uZD1kKHpKKTtiLnByb3RvdHlwZS52aXNpdFRpbWVNaWxsaXNlY29uZD1kKEVKKTtiLnByb3RvdHlwZS52aXNpdFRpbWVNaWNyb3NlY29uZD1kKE1KKTtiLnByb3RvdHlwZS52aXNpdFRpbWVOYW5vc2Vjb25kPWQoTEopO2IucHJvdG90eXBlLnZpc2l0RGVjaW1hbD1kKHVZKTtiLnByb3RvdHlwZS52aXNpdExpc3Q9ZChLNyk7Yi5wcm90b3R5cGUudmlzaXRTdHJ1Y3Q9ZChNNyk7Yi5wcm90b3R5cGUudmlzaXRVbmlvbj1kKEw3KTtiLnByb3RvdHlwZS52aXNpdERlbnNlVW5pb249ZChZMyk7Yi5wcm90b3R5cGUudmlzaXRTcGFyc2VVbmlvbj1kKEgzKTtiLnByb3RvdHlwZS52aXNpdERpY3Rpb25hcnk9ZChONyk7Yi5wcm90b3R5cGUudmlzaXRJbnRlcnZhbD1kKGRZKTtiLnByb3RvdHlwZS52aXNpdEludGVydmFsRGF5VGltZT1kKE5KKTtiLnByb3RvdHlwZS52aXNpdEludGVydmFsWWVhck1vbnRoPWQoRkopO2IucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWxNb250aERheU5hbm89ZChBSik7Yi5wcm90b3R5cGUudmlzaXREdXJhdGlvbj1kKGxZKTtiLnByb3RvdHlwZS52aXNpdER1cmF0aW9uU2Vjb25kPWQoVUopO2IucHJvdG90eXBlLnZpc2l0RHVyYXRpb25NaWxsaXNlY29uZD1kKFJKKTtiLnByb3RvdHlwZS52aXNpdER1cmF0aW9uTWljcm9zZWNvbmQ9ZChDSik7Yi5wcm90b3R5cGUudmlzaXREdXJhdGlvbk5hbm9zZWNvbmQ9ZChPSik7Yi5wcm90b3R5cGUudmlzaXRGaXhlZFNpemVMaXN0PWQoRjcpO2IucHJvdG90eXBlLnZpc2l0TWFwPWQoUDcpO00wPW5ldyBifSk7Y2xhc3MgSzN7aXNFeHRlbnNpYmxlKCl7cmV0dXJuITF9ZGVsZXRlUHJvcGVydHkoKXtyZXR1cm4hMX1wcmV2ZW50RXh0ZW5zaW9ucygpe3JldHVybiEwfW93bktleXMoJCl7cmV0dXJuICRbcCRdLnR5cGUuY2hpbGRyZW4ubWFwKChYKT0+WC5uYW1lKX1oYXMoJCxYKXtyZXR1cm4gJFtwJF0udHlwZS5jaGlsZHJlbi5zb21lKChRKT0+US5uYW1lPT09WCl9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKCQsWCl7aWYoJFtwJF0udHlwZS5jaGlsZHJlbi5zb21lKChRKT0+US5uYW1lPT09WCkpcmV0dXJue3dyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfTtyZXR1cm59Z2V0KCQsWCl7aWYoUmVmbGVjdC5oYXMoJCxYKSlyZXR1cm4gJFtYXTtsZXQgUT0kW3AkXS50eXBlLmNoaWxkcmVuLmZpbmRJbmRleCgoWik9PloubmFtZT09PVgpO2lmKFEhPT0tMSl7bGV0IFo9cDgudmlzaXQoJFtwJF0uY2hpbGRyZW5bUV0sJFtSWF0pO3JldHVybiBSZWZsZWN0LnNldCgkLFgsWiksWn19c2V0KCQsWCxRKXtsZXQgWj0kW3AkXS50eXBlLmNoaWxkcmVuLmZpbmRJbmRleCgoSik9PkoubmFtZT09PVgpO2lmKFohPT0tMSlyZXR1cm4gTTAudmlzaXQoJFtwJF0uY2hpbGRyZW5bWl0sJFtSWF0sUSksUmVmbGVjdC5zZXQoJCxYLFEpO2Vsc2UgaWYoUmVmbGVjdC5oYXMoJCxYKXx8dHlwZW9mIFg9PT0ic3ltYm9sIilyZXR1cm4gUmVmbGVjdC5zZXQoJCxYLFEpO3JldHVybiExfX12YXIgcCQsUlgsTzEsVzMsQTc7dmFyIGtKPUEoKCk9PntrNigpO0wkKCk7cCQ9U3ltYm9sLmZvcigicGFyZW50IiksUlg9U3ltYm9sLmZvcigicm93SW5kZXgiKTtPMT1jbGFzcyBPMXtjb25zdHJ1Y3RvcigkLFgpe3JldHVybiB0aGlzW3AkXT0kLHRoaXNbUlhdPVgsbmV3IFByb3h5KHRoaXMsQTcpfXRvQXJyYXkoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLnRvSlNPTigpKX10b0pTT04oKXtsZXQgJD10aGlzW1JYXSxYPXRoaXNbcCRdLFE9WC50eXBlLmNoaWxkcmVuLFo9e307Zm9yKGxldCBKPS0xLFk9US5sZW5ndGg7KytKPFk7KVpbUVtKXS5uYW1lXT1wOC52aXNpdChYLmNoaWxkcmVuW0pdLCQpO3JldHVybiBafXRvU3RyaW5nKCl7cmV0dXJuYHske1suLi50aGlzXS5tYXAoKFskLFhdKT0+YCR7eSQoJCl9OiAke3kkKFgpfWApLmpvaW4oIiwgIil9fWB9W1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIildKCl7cmV0dXJuIHRoaXMudG9TdHJpbmcoKX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBuZXcgVzModGhpc1twJF0sdGhpc1tSWF0pfX07VzM9Y2xhc3MgVzN7Y29uc3RydWN0b3IoJCxYKXt0aGlzLmNoaWxkSW5kZXg9MCx0aGlzLmNoaWxkcmVuPSQuY2hpbGRyZW4sdGhpcy5yb3dJbmRleD1YLHRoaXMuY2hpbGRGaWVsZHM9JC50eXBlLmNoaWxkcmVuLHRoaXMubnVtQ2hpbGRyZW49dGhpcy5jaGlsZEZpZWxkcy5sZW5ndGh9W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpc31uZXh0KCl7bGV0ICQ9dGhpcy5jaGlsZEluZGV4O2lmKCQ8dGhpcy5udW1DaGlsZHJlbilyZXR1cm4gdGhpcy5jaGlsZEluZGV4PSQrMSx7ZG9uZTohMSx2YWx1ZTpbdGhpcy5jaGlsZEZpZWxkc1skXS5uYW1lLHA4LnZpc2l0KHRoaXMuY2hpbGRyZW5bJF0sdGhpcy5yb3dJbmRleCldfTtyZXR1cm57ZG9uZTohMCx2YWx1ZTpudWxsfX19O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8xLnByb3RvdHlwZSx7W1N5bWJvbC50b1N0cmluZ1RhZ106e2VudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiExLHZhbHVlOiJSb3cifSxbcCRdOnt3cml0YWJsZTohMCxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMSx2YWx1ZTpudWxsfSxbUlhdOnt3cml0YWJsZTohMCxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMSx2YWx1ZTotMX19KTtBNz1uZXcgSzN9KTtmdW5jdGlvbiBjKCQpe3JldHVybihYLFEpPT5YLmdldFZhbGlkKFEpPyQoWCxRKTpudWxsfXZhciB2LFU3PSgkLFgpPT44NjQwMDAwMCokW1hdLENYPTE2LFI3PTEyLEM3PSgkLFgpPT5udWxsLFAzPSgkLFgsUSk9PntpZihRKzE+PVgubGVuZ3RoKXJldHVybiBudWxsO2xldCBaPVc4KFhbUV0pLEo9VzgoWFtRKzFdKTtyZXR1cm4gJC5zdWJhcnJheShaLEopfSxPNz0oe29mZnNldDokLHZhbHVlczpYfSxRKT0+e2xldCBaPSQrUTtyZXR1cm4oWFtaPj4zXSYxPDxaJTgpIT09MH0sRzM9KHt2YWx1ZXM6JH0sWCk9PlU3KCQsWCkscTM9KHt2YWx1ZXM6JH0sWCk9Plc4KCRbWF0pLGkxPSh7c3RyaWRlOiQsdmFsdWVzOlh9LFEpPT5YWyQqUV0sazc9KHtzdHJpZGU6JCx2YWx1ZXM6WH0sUSk9PllKKFhbJCpRXSksejM9KHt2YWx1ZXM6JH0sWCk9PiRbWF0sajc9KHtzdHJpZGU6JCx2YWx1ZXM6WH0sUSk9Plguc3ViYXJyYXkoJCpRLCQqKFErMSkpLEUzPSh7dmFsdWVzOiQsdmFsdWVPZmZzZXRzOlh9LFEpPT5QMygkLFgsUSksTTM9KCQsWCk9Pnt2YXIgUTtsZXQgWj0kLnZhbHVlcztpZighWil0aHJvdyBFcnJvcigiQmluYXJ5VmlldyBkYXRhIGlzIG1pc3NpbmcgdmlldyBidWZmZXIiKTtsZXQgSj1YKkNYLFk9SitDWDtpZihKPDB8fFk+Wi5sZW5ndGgpdGhyb3cgRXJyb3IoYEJpbmFyeVZpZXcgZGF0YSBidWZmZXIgaXMgdG9vIHNob3J0OiBleHBlY3RlZCAke0NYfSBieXRlcywgZ290ICR7TWF0aC5tYXgoMCxaLmxlbmd0aC1KKX1gKTtsZXQgSD1aLnN1YmFycmF5KEosWSk7aWYoSC5sZW5ndGg8Q1gpdGhyb3cgRXJyb3IoYEJpbmFyeVZpZXcgZGF0YSBidWZmZXIgaXMgdG9vIHNob3J0OiBleHBlY3RlZCAke0NYfSBieXRlcywgZ290ICR7SC5sZW5ndGh9YCk7bGV0IFc9bmV3IERhdGFWaWV3KFouYnVmZmVyLEguYnl0ZU9mZnNldCxDWCksUD1XLmdldEludDMyKDAsITApO2lmKFA8PTApcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO2lmKFA8PVI3KXJldHVybiBILnN1YmFycmF5KDQsNCtQKTtsZXQgRz1XLmdldEludDMyKDgsITApLHE9Vy5nZXRJbnQzMigxMiwhMCksTD0oUT0kLnZhcmlhZGljQnVmZmVycyk9PT1udWxsfHxRPT09dm9pZCAwP3ZvaWQgMDpRW0ddO2lmKCFMKXRocm93IEVycm9yKGBCaW5hcnlWaWV3IHZhcmlhZGljIGJ1ZmZlciAke0d9IGlzIG1pc3NpbmdgKTtyZXR1cm4gTC5zdWJhcnJheShxLHErUCl9LFM3PSgkLFgpPT57cmV0dXJuIE0zKCQsWCl9LEwzPSh7dmFsdWVzOiQsdmFsdWVPZmZzZXRzOlh9LFEpPT57bGV0IFo9UDMoJCxYLFEpO3JldHVybiBaIT09bnVsbD9QWChaKTpudWxsfSxENz0oJCxYKT0+e2xldCBRPU0zKCQsWCk7cmV0dXJuIFBYKFEpfSx3Nz0oe3ZhbHVlczokfSxYKT0+JFtYXSxWNz0oe3R5cGU6JCx2YWx1ZXM6WH0sUSk9PiQucHJlY2lzaW9uIT09ejguSEFMRj9YW1FdOllKKFhbUV0pLEI3PSgkLFgpPT4kLnR5cGUudW5pdD09PUo4LkRBWT9HMygkLFgpOnEzKCQsWCksTjM9KHt2YWx1ZXM6JH0sWCk9PjEwMDAqVzgoJFtYXSksRjM9KHt2YWx1ZXM6JH0sWCk9Plc4KCRbWF0pLEEzPSh7dmFsdWVzOiR9LFgpPT54WSgkW1hdLEJpZ0ludCgxMDAwKSksVTM9KHt2YWx1ZXM6JH0sWCk9PnhZKCRbWF0sQmlnSW50KDFlNikpLEk3PSgkLFgpPT57c3dpdGNoKCQudHlwZS51bml0KXtjYXNlIE8uU0VDT05EOnJldHVybiBOMygkLFgpO2Nhc2UgTy5NSUxMSVNFQ09ORDpyZXR1cm4gRjMoJCxYKTtjYXNlIE8uTUlDUk9TRUNPTkQ6cmV0dXJuIEEzKCQsWCk7Y2FzZSBPLk5BTk9TRUNPTkQ6cmV0dXJuIFUzKCQsWCl9fSxSMz0oe3ZhbHVlczokfSxYKT0+JFtYXSxDMz0oe3ZhbHVlczokfSxYKT0+JFtYXSxPMz0oe3ZhbHVlczokfSxYKT0+JFtYXSxrMz0oe3ZhbHVlczokfSxYKT0+JFtYXSxfNz0oJCxYKT0+e3N3aXRjaCgkLnR5cGUudW5pdCl7Y2FzZSBPLlNFQ09ORDpyZXR1cm4gUjMoJCxYKTtjYXNlIE8uTUlMTElTRUNPTkQ6cmV0dXJuIEMzKCQsWCk7Y2FzZSBPLk1JQ1JPU0VDT05EOnJldHVybiBPMygkLFgpO2Nhc2UgTy5OQU5PU0VDT05EOnJldHVybiBrMygkLFgpfX0sVDc9KHt2YWx1ZXM6JCxzdHJpZGU6WH0sUSk9PkM2LmRlY2ltYWwoJC5zdWJhcnJheShYKlEsWCooUSsxKSkpLHg3PSgkLFgpPT57bGV0e3ZhbHVlT2Zmc2V0czpRLHN0cmlkZTpaLGNoaWxkcmVuOkp9PSQse1tYKlpdOlksW1gqWisxXTpIfT1RLFA9SlswXS5zbGljZShZLEgtWSk7cmV0dXJuIG5ldyBEKFtQXSl9LGc3PSgkLFgpPT57bGV0e3ZhbHVlT2Zmc2V0czpRLGNoaWxkcmVuOlp9PSQse1tYXTpKLFtYKzFdOll9PVEsSD1aWzBdO3JldHVybiBuZXcgYyQoSC5zbGljZShKLFktSikpfSx2Nz0oJCxYKT0+e3JldHVybiBuZXcgTzEoJCxYKX0saDc9KCQsWCk9PntyZXR1cm4gJC50eXBlLm1vZGU9PT0kOC5EZW5zZT9qMygkLFgpOlMzKCQsWCl9LGozPSgkLFgpPT57bGV0IFE9JC50eXBlLnR5cGVJZFRvQ2hpbGRJbmRleFskLnR5cGVJZHNbWF1dLFo9JC5jaGlsZHJlbltRXTtyZXR1cm4gcDgudmlzaXQoWiwkLnZhbHVlT2Zmc2V0c1tYXSl9LFMzPSgkLFgpPT57bGV0IFE9JC50eXBlLnR5cGVJZFRvQ2hpbGRJbmRleFskLnR5cGVJZHNbWF1dLFo9JC5jaGlsZHJlbltRXTtyZXR1cm4gcDgudmlzaXQoWixYKX0seTc9KCQsWCk9Pnt2YXIgUTtyZXR1cm4oUT0kLmRpY3Rpb25hcnkpPT09bnVsbHx8UT09PXZvaWQgMD92b2lkIDA6US5nZXQoJC52YWx1ZXNbWF0pfSxtNz0oJCxYKT0+JC50eXBlLnVuaXQ9PT1lLk1PTlRIX0RBWV9OQU5PP1YzKCQsWCk6JC50eXBlLnVuaXQ9PT1lLkRBWV9USU1FP0QzKCQsWCk6dzMoJCxYKSxEMz0oe3ZhbHVlczokfSxYKT0+JC5zdWJhcnJheSgyKlgsMiooWCsxKSksdzM9KHt2YWx1ZXM6JH0sWCk9PntsZXQgUT0kW1hdLFo9bmV3IEludDMyQXJyYXkoMik7cmV0dXJuIFpbMF09TWF0aC50cnVuYyhRLzEyKSxaWzFdPU1hdGgudHJ1bmMoUSUxMiksWn0sVjM9KHt2YWx1ZXM6JH0sWCk9PiQuc3ViYXJyYXkoNCpYLDQqKFgrMSkpLEIzPSh7dmFsdWVzOiR9LFgpPT4kW1hdLEkzPSh7dmFsdWVzOiR9LFgpPT4kW1hdLF8zPSh7dmFsdWVzOiR9LFgpPT4kW1hdLFQzPSh7dmFsdWVzOiR9LFgpPT4kW1hdLGY3PSgkLFgpPT57c3dpdGNoKCQudHlwZS51bml0KXtjYXNlIE8uU0VDT05EOnJldHVybiBCMygkLFgpO2Nhc2UgTy5NSUxMSVNFQ09ORDpyZXR1cm4gSTMoJCxYKTtjYXNlIE8uTUlDUk9TRUNPTkQ6cmV0dXJuIF8zKCQsWCk7Y2FzZSBPLk5BTk9TRUNPTkQ6cmV0dXJuIFQzKCQsWCl9fSxiNz0oJCxYKT0+e2xldHtzdHJpZGU6USxjaGlsZHJlbjpafT0kLFk9WlswXS5zbGljZShYKlEsUSk7cmV0dXJuIG5ldyBEKFtZXSl9LHA4O3ZhciBrNj1BKCgpPT57bFooKTtTMCgpO2UwKCk7Z1EoKTtrSigpO1UxKCk7eFEoKTtWOCgpO3Y9Y2xhc3MgdiBleHRlbmRzIFR7fTt2LnByb3RvdHlwZS52aXNpdE51bGw9YyhDNyk7di5wcm90b3R5cGUudmlzaXRCb29sPWMoTzcpO3YucHJvdG90eXBlLnZpc2l0SW50PWModzcpO3YucHJvdG90eXBlLnZpc2l0SW50OD1jKGkxKTt2LnByb3RvdHlwZS52aXNpdEludDE2PWMoaTEpO3YucHJvdG90eXBlLnZpc2l0SW50MzI9YyhpMSk7di5wcm90b3R5cGUudmlzaXRJbnQ2ND1jKHozKTt2LnByb3RvdHlwZS52aXNpdFVpbnQ4PWMoaTEpO3YucHJvdG90eXBlLnZpc2l0VWludDE2PWMoaTEpO3YucHJvdG90eXBlLnZpc2l0VWludDMyPWMoaTEpO3YucHJvdG90eXBlLnZpc2l0VWludDY0PWMoejMpO3YucHJvdG90eXBlLnZpc2l0RmxvYXQ9YyhWNyk7di5wcm90b3R5cGUudmlzaXRGbG9hdDE2PWMoazcpO3YucHJvdG90eXBlLnZpc2l0RmxvYXQzMj1jKGkxKTt2LnByb3RvdHlwZS52aXNpdEZsb2F0NjQ9YyhpMSk7di5wcm90b3R5cGUudmlzaXRVdGY4PWMoTDMpO3YucHJvdG90eXBlLnZpc2l0TGFyZ2VVdGY4PWMoTDMpO3YucHJvdG90eXBlLnZpc2l0VXRmOFZpZXc9YyhENyk7di5wcm90b3R5cGUudmlzaXRCaW5hcnk9YyhFMyk7di5wcm90b3R5cGUudmlzaXRMYXJnZUJpbmFyeT1jKEUzKTt2LnByb3RvdHlwZS52aXNpdEJpbmFyeVZpZXc9YyhTNyk7di5wcm90b3R5cGUudmlzaXRGaXhlZFNpemVCaW5hcnk9YyhqNyk7di5wcm90b3R5cGUudmlzaXREYXRlPWMoQjcpO3YucHJvdG90eXBlLnZpc2l0RGF0ZURheT1jKEczKTt2LnByb3RvdHlwZS52aXNpdERhdGVNaWxsaXNlY29uZD1jKHEzKTt2LnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcD1jKEk3KTt2LnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcFNlY29uZD1jKE4zKTt2LnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcE1pbGxpc2Vjb25kPWMoRjMpO3YucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wTWljcm9zZWNvbmQ9YyhBMyk7di5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBOYW5vc2Vjb25kPWMoVTMpO3YucHJvdG90eXBlLnZpc2l0VGltZT1jKF83KTt2LnByb3RvdHlwZS52aXNpdFRpbWVTZWNvbmQ9YyhSMyk7di5wcm90b3R5cGUudmlzaXRUaW1lTWlsbGlzZWNvbmQ9YyhDMyk7di5wcm90b3R5cGUudmlzaXRUaW1lTWljcm9zZWNvbmQ9YyhPMyk7di5wcm90b3R5cGUudmlzaXRUaW1lTmFub3NlY29uZD1jKGszKTt2LnByb3RvdHlwZS52aXNpdERlY2ltYWw9YyhUNyk7di5wcm90b3R5cGUudmlzaXRMaXN0PWMoeDcpO3YucHJvdG90eXBlLnZpc2l0U3RydWN0PWModjcpO3YucHJvdG90eXBlLnZpc2l0VW5pb249YyhoNyk7di5wcm90b3R5cGUudmlzaXREZW5zZVVuaW9uPWMoajMpO3YucHJvdG90eXBlLnZpc2l0U3BhcnNlVW5pb249YyhTMyk7di5wcm90b3R5cGUudmlzaXREaWN0aW9uYXJ5PWMoeTcpO3YucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWw9YyhtNyk7di5wcm90b3R5cGUudmlzaXRJbnRlcnZhbERheVRpbWU9YyhEMyk7di5wcm90b3R5cGUudmlzaXRJbnRlcnZhbFllYXJNb250aD1jKHczKTt2LnByb3RvdHlwZS52aXNpdEludGVydmFsTW9udGhEYXlOYW5vPWMoVjMpO3YucHJvdG90eXBlLnZpc2l0RHVyYXRpb249YyhmNyk7di5wcm90b3R5cGUudmlzaXREdXJhdGlvblNlY29uZD1jKEIzKTt2LnByb3RvdHlwZS52aXNpdER1cmF0aW9uTWlsbGlzZWNvbmQ9YyhJMyk7di5wcm90b3R5cGUudmlzaXREdXJhdGlvbk1pY3Jvc2Vjb25kPWMoXzMpO3YucHJvdG90eXBlLnZpc2l0RHVyYXRpb25OYW5vc2Vjb25kPWMoVDMpO3YucHJvdG90eXBlLnZpc2l0Rml4ZWRTaXplTGlzdD1jKGI3KTt2LnByb3RvdHlwZS52aXNpdE1hcD1jKGc3KTtwOD1uZXcgdn0pO2NsYXNzIGcze2lzRXh0ZW5zaWJsZSgpe3JldHVybiExfWRlbGV0ZVByb3BlcnR5KCl7cmV0dXJuITF9cHJldmVudEV4dGVuc2lvbnMoKXtyZXR1cm4hMH1vd25LZXlzKCQpe3JldHVybiAkW09YXX1oYXMoJCxYKXtyZXR1cm4gJFtPWF0uaW5jbHVkZXMoWCl9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKCQsWCl7aWYoJFtPWF0uaW5kZXhPZihYKSE9PS0xKXJldHVybnt3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH07cmV0dXJufWdldCgkLFgpe2lmKFJlZmxlY3QuaGFzKCQsWCkpcmV0dXJuICRbWF07bGV0IFE9JFtPWF0uaW5kZXhPZihYKTtpZihRIT09LTEpe2xldCBaPXA4LnZpc2l0KFJlZmxlY3QuZ2V0KCQsa1gpLFEpO3JldHVybiBSZWZsZWN0LnNldCgkLFgsWiksWn19c2V0KCQsWCxRKXtsZXQgWj0kW09YXS5pbmRleE9mKFgpO2lmKFohPT0tMSlyZXR1cm4gTTAudmlzaXQoUmVmbGVjdC5nZXQoJCxrWCksWixRKSxSZWZsZWN0LnNldCgkLFgsUSk7ZWxzZSBpZihSZWZsZWN0LmhhcygkLFgpKXJldHVybiBSZWZsZWN0LnNldCgkLFgsUSk7cmV0dXJuITF9fXZhciBhMSxrWCxPWCxuWSxjJCx4Mzt2YXIgZ1E9QSgoKT0+e1MwKCk7azYoKTtMJCgpO2ExPVN5bWJvbC5mb3IoImtleXMiKSxrWD1TeW1ib2wuZm9yKCJ2YWxzIiksT1g9U3ltYm9sLmZvcigia0tleXNBc1N0cmluZ3MiKSxuWT1TeW1ib2wuZm9yKCJfa0tleXNBc1N0cmluZ3MiKTtjJD1jbGFzcyBjJHtjb25zdHJ1Y3RvcigkKXtyZXR1cm4gdGhpc1thMV09bmV3IEQoWyQuY2hpbGRyZW5bMF1dKS5tZW1vaXplKCksdGhpc1trWF09JC5jaGlsZHJlblsxXSxuZXcgUHJveHkodGhpcyxuZXcgZzMpfWdldFtPWF0oKXtyZXR1cm4gdGhpc1tuWV18fCh0aGlzW25ZXT1BcnJheS5mcm9tKHRoaXNbYTFdLnRvQXJyYXkoKSxTdHJpbmcpKX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBuZXcgeDModGhpc1thMV0sdGhpc1trWF0pfWdldCBzaXplKCl7cmV0dXJuIHRoaXNbYTFdLmxlbmd0aH10b0FycmF5KCl7cmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy50b0pTT04oKSl9dG9KU09OKCl7bGV0ICQ9dGhpc1thMV0sWD10aGlzW2tYXSxRPXt9O2ZvcihsZXQgWj0tMSxKPSQubGVuZ3RoOysrWjxKOylRWyQuZ2V0KFopXT1wOC52aXNpdChYLFopO3JldHVybiBRfXRvU3RyaW5nKCl7cmV0dXJuYHske1suLi50aGlzXS5tYXAoKFskLFhdKT0+YCR7eSQoJCl9OiAke3kkKFgpfWApLmpvaW4oIiwgIil9fWB9W1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIildKCl7cmV0dXJuIHRoaXMudG9TdHJpbmcoKX19O3gzPWNsYXNzIHgze2NvbnN0cnVjdG9yKCQsWCl7dGhpcy5rZXlzPSQsdGhpcy52YWxzPVgsdGhpcy5rZXlJbmRleD0wLHRoaXMubnVtS2V5cz0kLmxlbmd0aH1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzfW5leHQoKXtsZXQgJD10aGlzLmtleUluZGV4O2lmKCQ9PT10aGlzLm51bUtleXMpcmV0dXJue2RvbmU6ITAsdmFsdWU6bnVsbH07cmV0dXJuIHRoaXMua2V5SW5kZXgrKyx7ZG9uZTohMSx2YWx1ZTpbdGhpcy5rZXlzLmdldCgkKSxwOC52aXNpdCh0aGlzLnZhbHMsJCldfX19O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGMkLnByb3RvdHlwZSx7W1N5bWJvbC50b1N0cmluZ1RhZ106e2VudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiExLHZhbHVlOiJSb3cifSxbYTFdOnt3cml0YWJsZTohMCxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMSx2YWx1ZTpudWxsfSxba1hdOnt3cml0YWJsZTohMCxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMSx2YWx1ZTpudWxsfSxbblldOnt3cml0YWJsZTohMCxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMSx2YWx1ZTpudWxsfX0pfSk7dmFyIG9ZPXt9O0MkKG9ZLHt3cmFwSW5kZXg6KCk9Pmo2LGNyZWF0ZUVsZW1lbnRDb21wYXJhdG9yOigpPT50MSxjbGFtcFJhbmdlOigpPT52UX0pO2Z1bmN0aW9uIHZRKCQsWCxRLFope2xldHtsZW5ndGg6Sj0wfT0kLFk9dHlwZW9mIFghPT0ibnVtYmVyIj8wOlgsSD10eXBlb2YgUSE9PSJudW1iZXIiP0o6UTtyZXR1cm4gWTwwJiYoWT0oWSVKK0opJUopLEg8MCYmKEg9KEglSitKKSVKKSxIPFkmJih2Mz1ZLFk9SCxIPXYzKSxIPkomJihIPUopLFo/WigkLFksSCk6W1ksSF19ZnVuY3Rpb24gdDEoJCl7aWYodHlwZW9mICQhPT0ib2JqZWN0Inx8JD09PW51bGwpe2lmKGgzKCQpKXJldHVybiBoMztyZXR1cm4oUSk9PlE9PT0kfWlmKCQgaW5zdGFuY2VvZiBEYXRlKXtsZXQgUT0kLnZhbHVlT2YoKTtyZXR1cm4oWik9PlogaW5zdGFuY2VvZiBEYXRlP1oudmFsdWVPZigpPT09UTohMX1pZihBcnJheUJ1ZmZlci5pc1ZpZXcoJCkpcmV0dXJuKFEpPT5RP0pZKCQsUSk6ITE7aWYoJCBpbnN0YW5jZW9mIE1hcClyZXR1cm4gYzcoJCk7aWYoQXJyYXkuaXNBcnJheSgkKSlyZXR1cm4gcDcoJCk7aWYoJCBpbnN0YW5jZW9mIEQpcmV0dXJuIHU3KCQpO3JldHVybiBkNygkLCEwKX1mdW5jdGlvbiBwNygkKXtsZXQgWD1bXTtmb3IobGV0IFE9LTEsWj0kLmxlbmd0aDsrK1E8WjspWFtRXT10MSgkW1FdKTtyZXR1cm4gakooWCl9ZnVuY3Rpb24gYzcoJCl7bGV0IFg9LTEsUT1bXTtmb3IobGV0IFogb2YgJC52YWx1ZXMoKSlRWysrWF09dDEoWik7cmV0dXJuIGpKKFEpfWZ1bmN0aW9uIHU3KCQpe2xldCBYPVtdO2ZvcihsZXQgUT0tMSxaPSQubGVuZ3RoOysrUTxaOylYW1FdPXQxKCQuZ2V0KFEpKTtyZXR1cm4gakooWCl9ZnVuY3Rpb24gZDcoJCxYPSExKXtsZXQgUT1PYmplY3Qua2V5cygkKTtpZighWCYmUS5sZW5ndGg9PT0wKXJldHVybigpPT4hMTtsZXQgWj1bXTtmb3IobGV0IEo9LTEsWT1RLmxlbmd0aDsrK0o8WTspWltKXT10MSgkW1FbSl1dKTtyZXR1cm4gakooWixRKX1mdW5jdGlvbiBqSigkLFgpe3JldHVybihRKT0+e2lmKCFRfHx0eXBlb2YgUSE9PSJvYmplY3QiKXJldHVybiExO3N3aXRjaChRLmNvbnN0cnVjdG9yKXtjYXNlIEFycmF5OnJldHVybiBsNygkLFEpO2Nhc2UgTWFwOnJldHVybiB5MygkLFEsUS5rZXlzKCkpO2Nhc2UgYyQ6Y2FzZSBPMTpjYXNlIE9iamVjdDpjYXNlIHZvaWQgMDpyZXR1cm4geTMoJCxRLFh8fE9iamVjdC5rZXlzKFEpKX1yZXR1cm4gUSBpbnN0YW5jZW9mIEQ/bjcoJCxRKTohMX19ZnVuY3Rpb24gbDcoJCxYKXtsZXQgUT0kLmxlbmd0aDtpZihYLmxlbmd0aCE9PVEpcmV0dXJuITE7Zm9yKGxldCBaPS0xOysrWjxROylpZighJFtaXShYW1pdKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBuNygkLFgpe2xldCBRPSQubGVuZ3RoO2lmKFgubGVuZ3RoIT09USlyZXR1cm4hMTtmb3IobGV0IFo9LTE7KytaPFE7KWlmKCEkW1pdKFguZ2V0KFopKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiB5MygkLFgsUSl7bGV0IFo9UVtTeW1ib2wuaXRlcmF0b3JdKCksSj1YIGluc3RhbmNlb2YgTWFwP1gua2V5cygpOk9iamVjdC5rZXlzKFgpW1N5bWJvbC5pdGVyYXRvcl0oKSxZPVggaW5zdGFuY2VvZiBNYXA/WC52YWx1ZXMoKTpPYmplY3QudmFsdWVzKFgpW1N5bWJvbC5pdGVyYXRvcl0oKSxIPTAsVz0kLmxlbmd0aCxQPVkubmV4dCgpLEc9Wi5uZXh0KCkscT1KLm5leHQoKTtmb3IoO0g8VyYmIUcuZG9uZSYmIXEuZG9uZSYmIVAuZG9uZTsrK0gsRz1aLm5leHQoKSxxPUoubmV4dCgpLFA9WS5uZXh0KCkpaWYoRy52YWx1ZSE9PXEudmFsdWV8fCEkW0hdKFAudmFsdWUpKWJyZWFrO2lmKEg9PT1XJiZHLmRvbmUmJnEuZG9uZSYmUC5kb25lKXJldHVybiEwO3JldHVybiBaLnJldHVybiYmWi5yZXR1cm4oKSxKLnJldHVybiYmSi5yZXR1cm4oKSxZLnJldHVybiYmWS5yZXR1cm4oKSwhMX12YXIgdjMsajY9KCQsWCk9PiQ8MD9YKyQ6JCxoMz0oJCk9PiQhPT0kO3ZhciBqWD1BKCgpPT57UzAoKTtnUSgpO2tKKCk7bzgoKX0pO3ZhciBzWT17fTtDJChzWSx7dHJ1bmNhdGVCaXRtYXA6KCk9PlM2LHNldEJvb2w6KCk9Pm83LHBvcGNudF91aW50MzI6KCk9PlNKLHBvcGNudF9iaXRfcmFuZ2U6KCk9PmhRLHBvcGNudF9hcnJheTooKT0+bTMscGFja0Jvb2xzOigpPT5ENixnZXRCb29sOigpPT5TWCxnZXRCaXQ6KCk9PkRKLEJpdEl0ZXJhdG9yOigpPT5rMX0pO2Z1bmN0aW9uIFNYKCQsWCxRLFope3JldHVybihRJjE8PFopIT09MH1mdW5jdGlvbiBESigkLFgsUSxaKXtyZXR1cm4oUSYxPDxaKT4+Wn1mdW5jdGlvbiBvNygkLFgsUSl7cmV0dXJuIFE/ISEoJFtYPj4zXXw9MTw8WCU4KXx8ITA6ISgkW1g+PjNdJj1+KDE8PFglOCkpJiYhMX1mdW5jdGlvbiBTNigkLFgsUSl7bGV0IFo9US5ieXRlTGVuZ3RoKzcmLTg7aWYoJD4wfHxRLmJ5dGVMZW5ndGg8Wil7bGV0IEo9bmV3IFVpbnQ4QXJyYXkoWik7cmV0dXJuIEouc2V0KCQlOD09PTA/US5zdWJhcnJheSgkPj4zKTpENihuZXcgazEoUSwkLFgsbnVsbCxTWCkpLnN1YmFycmF5KDAsWikpLEp9cmV0dXJuIFF9ZnVuY3Rpb24gRDYoJCl7bGV0IFg9W10sUT0wLFo9MCxKPTA7Zm9yKGxldCBIIG9mICQpaWYoSCYmKEp8PTE8PFopLCsrWj09PTgpWFtRKytdPUosSj1aPTA7aWYoUT09PTB8fFo+MClYW1ErK109SjtsZXQgWT1uZXcgVWludDhBcnJheShYLmxlbmd0aCs3Ji04KTtyZXR1cm4gWS5zZXQoWCksWX1mdW5jdGlvbiBoUSgkLFgsUSl7aWYoUS1YPD0wKXJldHVybiAwO2lmKFEtWDw4KXtsZXQgWT0wO2ZvcihsZXQgSCBvZiBuZXcgazEoJCxYLFEtWCwkLERKKSlZKz1IO3JldHVybiBZfWxldCBaPVE+PjM8PDMsSj1YKyhYJTg9PT0wPzA6OC1YJTgpO3JldHVybiBoUSgkLFgsSikraFEoJCxaLFEpK20zKCQsSj4+MyxaLUo+PjMpfWZ1bmN0aW9uIG0zKCQsWCxRKXtsZXQgWj0wLEo9TWF0aC50cnVuYyhYKSxZPW5ldyBEYXRhVmlldygkLmJ1ZmZlciwkLmJ5dGVPZmZzZXQsJC5ieXRlTGVuZ3RoKSxIPVE9PT12b2lkIDA/JC5ieXRlTGVuZ3RoOkorUTt3aGlsZShILUo+PTQpWis9U0ooWS5nZXRVaW50MzIoSikpLEorPTQ7d2hpbGUoSC1KPj0yKVorPVNKKFkuZ2V0VWludDE2KEopKSxKKz0yO3doaWxlKEgtSj49MSlaKz1TSihZLmdldFVpbnQ4KEopKSxKKz0xO3JldHVybiBafWZ1bmN0aW9uIFNKKCQpe2xldCBYPU1hdGgudHJ1bmMoJCk7cmV0dXJuIFg9WC0oWD4+PjEmMTQzMTY1NTc2NSksWD0oWCY4NTg5OTM0NTkpKyhYPj4+MiY4NTg5OTM0NTkpLChYKyhYPj4+NCkmMjUyNjQ1MTM1KSoxNjg0MzAwOT4+PjI0fXZhciBrMTt2YXIgdzY9QSgoKT0+e2sxPWNsYXNzIGsxe2NvbnN0cnVjdG9yKCQsWCxRLFosSil7dGhpcy5ieXRlcz0kLHRoaXMubGVuZ3RoPVEsdGhpcy5jb250ZXh0PVosdGhpcy5nZXQ9Six0aGlzLmJpdD1YJTgsdGhpcy5ieXRlSW5kZXg9WD4+Myx0aGlzLmJ5dGU9JFt0aGlzLmJ5dGVJbmRleCsrXSx0aGlzLmluZGV4PTB9bmV4dCgpe2lmKHRoaXMuaW5kZXg8dGhpcy5sZW5ndGgpe2lmKHRoaXMuYml0PT09OCl0aGlzLmJpdD0wLHRoaXMuYnl0ZT10aGlzLmJ5dGVzW3RoaXMuYnl0ZUluZGV4KytdO3JldHVybnt2YWx1ZTp0aGlzLmdldCh0aGlzLmNvbnRleHQsdGhpcy5pbmRleCsrLHRoaXMuYnl0ZSx0aGlzLmJpdCsrKX19cmV0dXJue2RvbmU6ITAsdmFsdWU6bnVsbH19W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpc319fSk7Y2xhc3MgbntzdGF0aWMgaXNEYXRhKCQpe3JldHVybigkPT09bnVsbHx8JD09PXZvaWQgMD92b2lkIDA6JFtmM10pPT09ITB9Z2V0IHR5cGVJZCgpe3JldHVybiB0aGlzLnR5cGUudHlwZUlkfWdldCBBcnJheVR5cGUoKXtyZXR1cm4gdGhpcy50eXBlLkFycmF5VHlwZX1nZXQgYnVmZmVycygpe3JldHVyblt0aGlzLnZhbHVlT2Zmc2V0cyx0aGlzLnZhbHVlcyx0aGlzLm51bGxCaXRtYXAsdGhpcy50eXBlSWRzXX1nZXQgbnVsbGFibGUoKXtpZih0aGlzLl9udWxsQ291bnQhPT0wKXtsZXR7dHlwZTokfT10aGlzO2lmKFIuaXNTcGFyc2VVbmlvbigkKSlyZXR1cm4gdGhpcy5jaGlsZHJlbi5zb21lKChYKT0+WC5udWxsYWJsZSk7ZWxzZSBpZihSLmlzRGVuc2VVbmlvbigkKSlyZXR1cm4gdGhpcy5jaGlsZHJlbi5zb21lKChYKT0+WC5udWxsYWJsZSk7cmV0dXJuIHRoaXMubnVsbEJpdG1hcCYmdGhpcy5udWxsQml0bWFwLmJ5dGVMZW5ndGg+MH1yZXR1cm4hMH1nZXQgYnl0ZUxlbmd0aCgpe2xldCAkPTAse3ZhbHVlT2Zmc2V0czpYLHZhbHVlczpRLG51bGxCaXRtYXA6Wix0eXBlSWRzOkp9PXRoaXM7cmV0dXJuIFgmJigkKz1YLmJ5dGVMZW5ndGgpLFEmJigkKz1RLmJ5dGVMZW5ndGgpLFomJigkKz1aLmJ5dGVMZW5ndGgpLEomJigkKz1KLmJ5dGVMZW5ndGgpLCQrPXRoaXMudmFyaWFkaWNCdWZmZXJzLnJlZHVjZSgoWSxIKT0+e3ZhciBXO3JldHVybiBZKygoVz1IPT09bnVsbHx8SD09PXZvaWQgMD92b2lkIDA6SC5ieXRlTGVuZ3RoKSE9PW51bGwmJlchPT12b2lkIDA/VzowKX0sMCksdGhpcy5jaGlsZHJlbi5yZWR1Y2UoKFksSCk9PlkrSC5ieXRlTGVuZ3RoLCQpfWdldCBudWxsQ291bnQoKXtpZihSLmlzVW5pb24odGhpcy50eXBlKSlyZXR1cm4gdGhpcy5jaGlsZHJlbi5yZWR1Y2UoKFEsWik9PlErWi5udWxsQ291bnQsMCk7bGV0ICQ9dGhpcy5fbnVsbENvdW50LFg7aWYoJDw9czcmJihYPXRoaXMubnVsbEJpdG1hcCkpdGhpcy5fbnVsbENvdW50PSQ9WC5sZW5ndGg9PT0wPzA6dGhpcy5sZW5ndGgtaFEoWCx0aGlzLm9mZnNldCx0aGlzLm9mZnNldCt0aGlzLmxlbmd0aCk7cmV0dXJuICR9Y29uc3RydWN0b3IoJCxYLFEsWixKLFk9W10sSCxXPVtdKXt2YXIgUDt0aGlzLnR5cGU9JCx0aGlzLmNoaWxkcmVuPVksdGhpcy5kaWN0aW9uYXJ5PUgsdGhpcy5vZmZzZXQ9TWF0aC5mbG9vcihNYXRoLm1heChYfHwwLDApKSx0aGlzLmxlbmd0aD1NYXRoLmZsb29yKE1hdGgubWF4KFF8fDAsMCkpLHRoaXMuX251bGxDb3VudD1NYXRoLmZsb29yKE1hdGgubWF4KFp8fDAsLTEpKTtsZXQgRztpZihKIGluc3RhbmNlb2Ygbil0aGlzLnN0cmlkZT1KLnN0cmlkZSx0aGlzLnZhbHVlcz1KLnZhbHVlcyx0aGlzLnR5cGVJZHM9Si50eXBlSWRzLHRoaXMubnVsbEJpdG1hcD1KLm51bGxCaXRtYXAsdGhpcy52YWx1ZU9mZnNldHM9Si52YWx1ZU9mZnNldHMsdGhpcy52YXJpYWRpY0J1ZmZlcnM9Si52YXJpYWRpY0J1ZmZlcnM7ZWxzZXtpZih0aGlzLnN0cmlkZT1NJCgkKSxKKShHPUpbMF0pJiYodGhpcy52YWx1ZU9mZnNldHM9RyksKEc9SlsxXSkmJih0aGlzLnZhbHVlcz1HKSwoRz1KWzJdKSYmKHRoaXMubnVsbEJpdG1hcD1HKSwoRz1KWzNdKSYmKHRoaXMudHlwZUlkcz1HKTt0aGlzLnZhcmlhZGljQnVmZmVycz1XfShQPXRoaXMudmFyaWFkaWNCdWZmZXJzKSE9PW51bGwmJlAhPT12b2lkIDB8fCh0aGlzLnZhcmlhZGljQnVmZmVycz1bXSl9Z2V0VmFsaWQoJCl7bGV0e3R5cGU6WH09dGhpcztpZihSLmlzVW5pb24oWCkpe2xldCBRPVgsWj10aGlzLnR5cGVJZHNbJF0sSj1RLnR5cGVJZFRvQ2hpbGRJbmRleFtaXSxZPXRoaXMuY2hpbGRyZW5bSl0sSD10aGlzLnZhbHVlT2Zmc2V0cyxXPVEubW9kZT09PSQ4LkRlbnNlJiZIP051bWJlcihIWyRdKTokO3JldHVybiBZLmdldFZhbGlkKFcpfWlmKHRoaXMubnVsbGFibGUmJnRoaXMubnVsbENvdW50PjApe2xldCBRPXRoaXMub2Zmc2V0KyQ7cmV0dXJuKHRoaXMubnVsbEJpdG1hcFtRPj4zXSYxPDxRJTgpIT09MH1yZXR1cm4hMH1zZXRWYWxpZCgkLFgpe2xldCBRLHt0eXBlOlp9PXRoaXM7aWYoUi5pc1VuaW9uKFopKXtsZXQgSj1aLFk9dGhpcy50eXBlSWRzWyRdLEg9Si50eXBlSWRUb0NoaWxkSW5kZXhbWV0sVz10aGlzLmNoaWxkcmVuW0hdLFA9dGhpcy52YWx1ZU9mZnNldHMsRz1KLm1vZGU9PT0kOC5EZW5zZSYmUD9OdW1iZXIoUFskXSk6JDtRPVcuZ2V0VmFsaWQoRyksVy5zZXRWYWxpZChHLFgpfWVsc2V7bGV0e251bGxCaXRtYXA6Sn09dGhpcyx7b2Zmc2V0OlksbGVuZ3RoOkh9PXRoaXMsVz1ZKyQsUD0xPDxXJTgsRz1XPj4zO2lmKCFKfHxKLmJ5dGVMZW5ndGg8PUcpaWYoSj1uZXcgVWludDhBcnJheSgoWStIKzYzJi02NCk+PjMpLmZpbGwoMjU1KSx0aGlzLm51bGxDb3VudD4wKUouc2V0KFM2KFksSCx0aGlzLm51bGxCaXRtYXApLDApLE9iamVjdC5hc3NpZ24odGhpcyx7bnVsbEJpdG1hcDpKfSk7ZWxzZSBPYmplY3QuYXNzaWduKHRoaXMse251bGxCaXRtYXA6SixfbnVsbENvdW50OjB9KTtsZXQgcT1KW0ddO1E9KHEmUCkhPT0wLEpbR109WD9xfFA6cSZ+UH1pZihRIT09ISFYKXRoaXMuX251bGxDb3VudD10aGlzLm51bGxDb3VudCsoWD8tMToxKTtyZXR1cm4gWH1jbG9uZSgkPXRoaXMudHlwZSxYPXRoaXMub2Zmc2V0LFE9dGhpcy5sZW5ndGgsWj10aGlzLl9udWxsQ291bnQsSj10aGlzLFk9dGhpcy5jaGlsZHJlbixIPXRoaXMudmFyaWFkaWNCdWZmZXJzKXtyZXR1cm4gbmV3IG4oJCxYLFEsWixKLFksdGhpcy5kaWN0aW9uYXJ5LEgpfXNsaWNlKCQsWCl7bGV0e3N0cmlkZTpRLHR5cGVJZDpaLGNoaWxkcmVuOkp9PXRoaXMsWT0rKHRoaXMuX251bGxDb3VudD09PTApLTEsSD1aPT09MTY/UToxLFc9dGhpcy5fc2xpY2VCdWZmZXJzKCQsWCxRLFopO3JldHVybiB0aGlzLmNsb25lKHRoaXMudHlwZSx0aGlzLm9mZnNldCskLFgsWSxXLEoubGVuZ3RoPT09MHx8dGhpcy52YWx1ZU9mZnNldHM/Sjp0aGlzLl9zbGljZUNoaWxkcmVuKEosSCokLEgqWCksdGhpcy52YXJpYWRpY0J1ZmZlcnMpfV9jaGFuZ2VMZW5ndGhBbmRCYWNrZmlsbE51bGxCaXRtYXAoJCl7aWYodGhpcy50eXBlSWQ9PT1FLk51bGwpcmV0dXJuIHRoaXMuY2xvbmUodGhpcy50eXBlLDAsJCwwLHRoaXMuYnVmZmVycyx0aGlzLmNoaWxkcmVuLHRoaXMudmFyaWFkaWNCdWZmZXJzKTtsZXR7bGVuZ3RoOlgsbnVsbENvdW50OlF9PXRoaXMsWj1uZXcgVWludDhBcnJheSgoJCs2MyYtNjQpPj4zKS5maWxsKDI1NSwwLFg+PjMpO2lmKFpbWD4+M109KDE8PFgtKFgmLTgpKS0xLFE+MClaLnNldChTNih0aGlzLm9mZnNldCxYLHRoaXMubnVsbEJpdG1hcCksMCk7bGV0IEo9dGhpcy5idWZmZXJzO3JldHVybiBKW3owLlZBTElESVRZXT1aLHRoaXMuY2xvbmUodGhpcy50eXBlLDAsJCxRKygkLVgpLEosdGhpcy5jaGlsZHJlbix0aGlzLnZhcmlhZGljQnVmZmVycyl9X3NsaWNlQnVmZmVycygkLFgsUSxaKXtsZXQgSix7YnVmZmVyczpZfT10aGlzO2lmKChKPVlbejAuVFlQRV0pJiYoWVt6MC5UWVBFXT1KLnN1YmFycmF5KCQsJCtYKSksUi5pc0JpbmFyeVZpZXcodGhpcy50eXBlKXx8Ui5pc1V0ZjhWaWV3KHRoaXMudHlwZSkpe2xldCBIPWEuRUxFTUVOVF9XSURUSDsoSj1ZW3owLkRBVEFdKSYmKFlbejAuREFUQV09Si5zdWJhcnJheSgkKkgsKCQrWCkqSCkpfWVsc2UoSj1ZW3owLk9GRlNFVF0pJiYoWVt6MC5PRkZTRVRdPUouc3ViYXJyYXkoJCwkK1grMSkpfHwoSj1ZW3owLkRBVEFdKSYmKFlbejAuREFUQV09Wj09PTY/SjpKLnN1YmFycmF5KFEqJCxRKigkK1gpKSk7cmV0dXJuIFl9X3NsaWNlQ2hpbGRyZW4oJCxYLFEpe3JldHVybiAkLm1hcCgoWik9Plouc2xpY2UoWCxRKSl9fWZ1bmN0aW9uIEMoJCl7cmV0dXJuIHI3LnZpc2l0KCQpfXZhciBzNz0tMSxmMyx5USxyNzt2YXIgXyQ9QSgoKT0+e1MwKCk7VjgoKTtOOCgpO3c2KCk7TjgoKTtlMCgpO284KCk7ZjM9U3ltYm9sLmZvcigiYXBhY2hlLWFycm93L0RhdGEiKTtuLnByb3RvdHlwZS5jaGlsZHJlbj1PYmplY3QuZnJlZXplKFtdKTtuLnByb3RvdHlwZVtmM109ITA7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sU3ltYm9sLmhhc0luc3RhbmNlLHt2YWx1ZTpmdW5jdGlvbihYKXtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0uY2FsbCh0aGlzLFgpfHx0aGlzPT09biYmbi5pc0RhdGEoWCl9fSk7eVE9Y2xhc3MgeVEgZXh0ZW5kcyBUe3Zpc2l0KCQpe3JldHVybiB0aGlzLmdldFZpc2l0Rm4oJC50eXBlKS5jYWxsKHRoaXMsJCl9dmlzaXROdWxsKCQpe2xldHtbInR5cGUiXTpYLFsib2Zmc2V0Il06UT0wLFsibGVuZ3RoIl06Wj0wfT0kO3JldHVybiBuZXcgbihYLFEsWixaKX12aXNpdEJvb2woJCl7bGV0e1sidHlwZSJdOlgsWyJvZmZzZXQiXTpRPTB9PSQsWj14KCQubnVsbEJpdG1hcCksSj10KFguQXJyYXlUeXBlLCQuZGF0YSkse1sibGVuZ3RoIl06WT1KLmxlbmd0aD4+MyxbIm51bGxDb3VudCJdOkg9JC5udWxsQml0bWFwPy0xOjB9PSQ7cmV0dXJuIG5ldyBuKFgsUSxZLEgsW3ZvaWQgMCxKLFpdKX12aXNpdEludCgkKXtsZXR7WyJ0eXBlIl06WCxbIm9mZnNldCJdOlE9MH09JCxaPXgoJC5udWxsQml0bWFwKSxKPXQoWC5BcnJheVR5cGUsJC5kYXRhKSx7WyJsZW5ndGgiXTpZPUoubGVuZ3RoLFsibnVsbENvdW50Il06SD0kLm51bGxCaXRtYXA/LTE6MH09JDtyZXR1cm4gbmV3IG4oWCxRLFksSCxbdm9pZCAwLEosWl0pfXZpc2l0RmxvYXQoJCl7bGV0e1sidHlwZSJdOlgsWyJvZmZzZXQiXTpRPTB9PSQsWj14KCQubnVsbEJpdG1hcCksSj10KFguQXJyYXlUeXBlLCQuZGF0YSkse1sibGVuZ3RoIl06WT1KLmxlbmd0aCxbIm51bGxDb3VudCJdOkg9JC5udWxsQml0bWFwPy0xOjB9PSQ7cmV0dXJuIG5ldyBuKFgsUSxZLEgsW3ZvaWQgMCxKLFpdKX12aXNpdFV0ZjgoJCl7bGV0e1sidHlwZSJdOlgsWyJvZmZzZXQiXTpRPTB9PSQsWj14KCQuZGF0YSksSj14KCQubnVsbEJpdG1hcCksWT1BNigkLnZhbHVlT2Zmc2V0cykse1sibGVuZ3RoIl06SD1ZLmxlbmd0aC0xLFsibnVsbENvdW50Il06Vz0kLm51bGxCaXRtYXA/LTE6MH09JDtyZXR1cm4gbmV3IG4oWCxRLEgsVyxbWSxaLEpdKX12aXNpdFV0ZjhWaWV3KCQpe3ZhciBYO2xldHtbInR5cGUiXTpRLFsib2Zmc2V0Il06Wj0wfT0kLEo9dChRLkFycmF5VHlwZSwkLnZpZXdzKSxZPXgoJC5udWxsQml0bWFwKSxIPSgkLnZhcmlhZGljQnVmZmVyc3x8W10pLm1hcCgoRyk9PngoRykpLFc9KFg9JC5sZW5ndGgpIT09bnVsbCYmWCE9PXZvaWQgMD9YOk1hdGgudHJ1bmMoSi5sZW5ndGgvczAuRUxFTUVOVF9XSURUSCksUD0kLm51bGxCaXRtYXA/LTE6MDtyZXR1cm4gbmV3IG4oUSxaLFcsUCxbdm9pZCAwLEosWV0sW10sdm9pZCAwLEgpfXZpc2l0TGFyZ2VVdGY4KCQpe2xldHtbInR5cGUiXTpYLFsib2Zmc2V0Il06UT0wfT0kLFo9eCgkLmRhdGEpLEo9eCgkLm51bGxCaXRtYXApLFk9aFooJC52YWx1ZU9mZnNldHMpLHtbImxlbmd0aCJdOkg9WS5sZW5ndGgtMSxbIm51bGxDb3VudCJdOlc9JC5udWxsQml0bWFwPy0xOjB9PSQ7cmV0dXJuIG5ldyBuKFgsUSxILFcsW1ksWixKXSl9dmlzaXRCaW5hcnkoJCl7bGV0e1sidHlwZSJdOlgsWyJvZmZzZXQiXTpRPTB9PSQsWj14KCQuZGF0YSksSj14KCQubnVsbEJpdG1hcCksWT1BNigkLnZhbHVlT2Zmc2V0cykse1sibGVuZ3RoIl06SD1ZLmxlbmd0aC0xLFsibnVsbENvdW50Il06Vz0kLm51bGxCaXRtYXA/LTE6MH09JDtyZXR1cm4gbmV3IG4oWCxRLEgsVyxbWSxaLEpdKX12aXNpdEJpbmFyeVZpZXcoJCl7dmFyIFg7bGV0e1sidHlwZSJdOlEsWyJvZmZzZXQiXTpaPTB9PSQsSj10KFEuQXJyYXlUeXBlLCQudmlld3MpLFk9eCgkLm51bGxCaXRtYXApLEg9KCQudmFyaWFkaWNCdWZmZXJzfHxbXSkubWFwKChHKT0+eChHKSksVz0oWD0kLmxlbmd0aCkhPT1udWxsJiZYIT09dm9pZCAwP1g6TWF0aC50cnVuYyhKLmxlbmd0aC9hLkVMRU1FTlRfV0lEVEgpLFA9JC5udWxsQml0bWFwPy0xOjA7cmV0dXJuIG5ldyBuKFEsWixXLFAsW3ZvaWQgMCxKLFldLFtdLHZvaWQgMCxIKX12aXNpdExhcmdlQmluYXJ5KCQpe2xldHtbInR5cGUiXTpYLFsib2Zmc2V0Il06UT0wfT0kLFo9eCgkLmRhdGEpLEo9eCgkLm51bGxCaXRtYXApLFk9aFooJC52YWx1ZU9mZnNldHMpLHtbImxlbmd0aCJdOkg9WS5sZW5ndGgtMSxbIm51bGxDb3VudCJdOlc9JC5udWxsQml0bWFwPy0xOjB9PSQ7cmV0dXJuIG5ldyBuKFgsUSxILFcsW1ksWixKXSl9dmlzaXRGaXhlZFNpemVCaW5hcnkoJCl7bGV0e1sidHlwZSJdOlgsWyJvZmZzZXQiXTpRPTB9PSQsWj14KCQubnVsbEJpdG1hcCksSj10KFguQXJyYXlUeXBlLCQuZGF0YSkse1sibGVuZ3RoIl06WT1KLmxlbmd0aC9NJChYKSxbIm51bGxDb3VudCJdOkg9JC5udWxsQml0bWFwPy0xOjB9PSQ7cmV0dXJuIG5ldyBuKFgsUSxZLEgsW3ZvaWQgMCxKLFpdKX12aXNpdERhdGUoJCl7bGV0e1sidHlwZSJdOlgsWyJvZmZzZXQiXTpRPTB9PSQsWj14KCQubnVsbEJpdG1hcCksSj10KFguQXJyYXlUeXBlLCQuZGF0YSkse1sibGVuZ3RoIl06WT1KLmxlbmd0aC9NJChYKSxbIm51bGxDb3VudCJdOkg9JC5udWxsQml0bWFwPy0xOjB9PSQ7cmV0dXJuIG5ldyBuKFgsUSxZLEgsW3ZvaWQgMCxKLFpdKX12aXNpdFRpbWVzdGFtcCgkKXtsZXR7WyJ0eXBlIl06WCxbIm9mZnNldCJdOlE9MH09JCxaPXgoJC5udWxsQml0bWFwKSxKPXQoWC5BcnJheVR5cGUsJC5kYXRhKSx7WyJsZW5ndGgiXTpZPUoubGVuZ3RoL00kKFgpLFsibnVsbENvdW50Il06SD0kLm51bGxCaXRtYXA/LTE6MH09JDtyZXR1cm4gbmV3IG4oWCxRLFksSCxbdm9pZCAwLEosWl0pfXZpc2l0VGltZSgkKXtsZXR7WyJ0eXBlIl06WCxbIm9mZnNldCJdOlE9MH09JCxaPXgoJC5udWxsQml0bWFwKSxKPXQoWC5BcnJheVR5cGUsJC5kYXRhKSx7WyJsZW5ndGgiXTpZPUoubGVuZ3RoL00kKFgpLFsibnVsbENvdW50Il06SD0kLm51bGxCaXRtYXA/LTE6MH09JDtyZXR1cm4gbmV3IG4oWCxRLFksSCxbdm9pZCAwLEosWl0pfXZpc2l0RGVjaW1hbCgkKXtsZXR7WyJ0eXBlIl06WCxbIm9mZnNldCJdOlE9MH09JCxaPXgoJC5udWxsQml0bWFwKSxKPXQoWC5BcnJheVR5cGUsJC5kYXRhKSx7WyJsZW5ndGgiXTpZPUoubGVuZ3RoL00kKFgpLFsibnVsbENvdW50Il06SD0kLm51bGxCaXRtYXA/LTE6MH09JDtyZXR1cm4gbmV3IG4oWCxRLFksSCxbdm9pZCAwLEosWl0pfXZpc2l0TGlzdCgkKXtsZXR7WyJ0eXBlIl06WCxbIm9mZnNldCJdOlE9MCxbImNoaWxkIl06Wn09JCxKPXgoJC5udWxsQml0bWFwKSxZPUE2KCQudmFsdWVPZmZzZXRzKSx7WyJsZW5ndGgiXTpIPVkubGVuZ3RoLTEsWyJudWxsQ291bnQiXTpXPSQubnVsbEJpdG1hcD8tMTowfT0kO3JldHVybiBuZXcgbihYLFEsSCxXLFtZLHZvaWQgMCxKXSxbWl0pfXZpc2l0U3RydWN0KCQpe2xldHtbInR5cGUiXTpYLFsib2Zmc2V0Il06UT0wLFsiY2hpbGRyZW4iXTpaPVtdfT0kLEo9eCgkLm51bGxCaXRtYXApLHtsZW5ndGg6WT1aLnJlZHVjZSgoVyx7bGVuZ3RoOlB9KT0+TWF0aC5tYXgoVyxQKSwwKSxudWxsQ291bnQ6SD0kLm51bGxCaXRtYXA/LTE6MH09JDtyZXR1cm4gbmV3IG4oWCxRLFksSCxbdm9pZCAwLHZvaWQgMCxKXSxaKX12aXNpdFVuaW9uKCQpe2xldHtbInR5cGUiXTpYLFsib2Zmc2V0Il06UT0wLFsiY2hpbGRyZW4iXTpaPVtdfT0kLEo9dChYLkFycmF5VHlwZSwkLnR5cGVJZHMpLHtbImxlbmd0aCJdOlk9Si5sZW5ndGgsWyJudWxsQ291bnQiXTpIPS0xfT0kO2lmKFIuaXNTcGFyc2VVbmlvbihYKSlyZXR1cm4gbmV3IG4oWCxRLFksSCxbdm9pZCAwLHZvaWQgMCx2b2lkIDAsSl0sWik7bGV0IFc9QTYoJC52YWx1ZU9mZnNldHMpO3JldHVybiBuZXcgbihYLFEsWSxILFtXLHZvaWQgMCx2b2lkIDAsSl0sWil9dmlzaXREaWN0aW9uYXJ5KCQpe2xldHtbInR5cGUiXTpYLFsib2Zmc2V0Il06UT0wfT0kLFo9eCgkLm51bGxCaXRtYXApLEo9dChYLmluZGljZXMuQXJyYXlUeXBlLCQuZGF0YSkse1siZGljdGlvbmFyeSJdOlk9bmV3IEQoW25ldyB5USgpLnZpc2l0KHt0eXBlOlguZGljdGlvbmFyeX0pXSl9PSQse1sibGVuZ3RoIl06SD1KLmxlbmd0aCxbIm51bGxDb3VudCJdOlc9JC5udWxsQml0bWFwPy0xOjB9PSQ7cmV0dXJuIG5ldyBuKFgsUSxILFcsW3ZvaWQgMCxKLFpdLFtdLFkpfXZpc2l0SW50ZXJ2YWwoJCl7bGV0e1sidHlwZSJdOlgsWyJvZmZzZXQiXTpRPTB9PSQsWj14KCQubnVsbEJpdG1hcCksSj10KFguQXJyYXlUeXBlLCQuZGF0YSkse1sibGVuZ3RoIl06WT1KLmxlbmd0aC9NJChYKSxbIm51bGxDb3VudCJdOkg9JC5udWxsQml0bWFwPy0xOjB9PSQ7cmV0dXJuIG5ldyBuKFgsUSxZLEgsW3ZvaWQgMCxKLFpdKX12aXNpdER1cmF0aW9uKCQpe2xldHtbInR5cGUiXTpYLFsib2Zmc2V0Il06UT0wfT0kLFo9eCgkLm51bGxCaXRtYXApLEo9dChYLkFycmF5VHlwZSwkLmRhdGEpLHtbImxlbmd0aCJdOlk9Si5sZW5ndGgsWyJudWxsQ291bnQiXTpIPSQubnVsbEJpdG1hcD8tMTowfT0kO3JldHVybiBuZXcgbihYLFEsWSxILFt2b2lkIDAsSixaXSl9dmlzaXRGaXhlZFNpemVMaXN0KCQpe2xldHtbInR5cGUiXTpYLFsib2Zmc2V0Il06UT0wLFsiY2hpbGQiXTpaPW5ldyB5USgpLnZpc2l0KHt0eXBlOlgudmFsdWVUeXBlfSl9PSQsSj14KCQubnVsbEJpdG1hcCkse1sibGVuZ3RoIl06WT1aLmxlbmd0aC9NJChYKSxbIm51bGxDb3VudCJdOkg9JC5udWxsQml0bWFwPy0xOjB9PSQ7cmV0dXJuIG5ldyBuKFgsUSxZLEgsW3ZvaWQgMCx2b2lkIDAsSl0sW1pdKX12aXNpdE1hcCgkKXtsZXR7WyJ0eXBlIl06WCxbIm9mZnNldCJdOlE9MCxbImNoaWxkIl06Wj1uZXcgeVEoKS52aXNpdCh7dHlwZTpYLmNoaWxkVHlwZX0pfT0kLEo9eCgkLm51bGxCaXRtYXApLFk9QTYoJC52YWx1ZU9mZnNldHMpLHtbImxlbmd0aCJdOkg9WS5sZW5ndGgtMSxbIm51bGxDb3VudCJdOlc9JC5udWxsQml0bWFwPy0xOjB9PSQ7cmV0dXJuIG5ldyBuKFgsUSxILFcsW1ksdm9pZCAwLEpdLFtaXSl9fTtyNz1uZXcgeVF9KTtmdW5jdGlvbiBiMygkKXtyZXR1cm4gJC5zb21lKChYKT0+WC5udWxsYWJsZSl9ZnVuY3Rpb24gVkooJCl7cmV0dXJuICQucmVkdWNlKChYLFEpPT5YK1EubnVsbENvdW50LDApfWZ1bmN0aW9uIEJKKCQpe3JldHVybiAkLnJlZHVjZSgoWCxRLFopPT57cmV0dXJuIFhbWisxXT1YW1pdK1EubGVuZ3RoLFh9LG5ldyBVaW50MzJBcnJheSgkLmxlbmd0aCsxKSl9ZnVuY3Rpb24gSUooJCxYLFEsWil7bGV0IEo9W107Zm9yKGxldCBZPS0xLEg9JC5sZW5ndGg7KytZPEg7KXtsZXQgVz0kW1ldLFA9WFtZXSx7bGVuZ3RoOkd9PVc7aWYoUD49WilicmVhaztpZihRPj1QK0cpY29udGludWU7aWYoUD49USYmUCtHPD1aKXtKLnB1c2goVyk7Y29udGludWV9bGV0IHE9TWF0aC5tYXgoMCxRLVApLEw9TWF0aC5taW4oWi1QLEcpO0oucHVzaChXLnNsaWNlKHEsTC1xKSl9aWYoSi5sZW5ndGg9PT0wKUoucHVzaCgkWzBdLnNsaWNlKDAsMCkpO3JldHVybiBKfWZ1bmN0aW9uIHJZKCQsWCxRLFope2xldCBKPTAsWT0wLEg9WC5sZW5ndGgtMTtkb3tpZihKPj1ILTEpcmV0dXJuIFE8WFtIXT9aKCQsSixRLVhbSl0pOm51bGw7WT1KK01hdGgudHJ1bmMoKEgtSikqMC41KSxRPFhbWV0/SD1ZOko9WX13aGlsZShKPEgpfWZ1bmN0aW9uIG1RKCQsWCl7cmV0dXJuICQuZ2V0VmFsaWQoWCl9ZnVuY3Rpb24gRFgoJCl7ZnVuY3Rpb24gWChRLFosSil7cmV0dXJuICQoUVtaXSxKKX1yZXR1cm4gZnVuY3Rpb24oUSl7bGV0IFo9dGhpcy5kYXRhO3JldHVybiByWShaLHRoaXMuX29mZnNldHMsUSxYKX19ZnVuY3Rpb24gX0ooJCl7bGV0IFg7ZnVuY3Rpb24gUShaLEosWSl7cmV0dXJuICQoWltKXSxZLFgpfXJldHVybiBmdW5jdGlvbihaLEope2xldCBZPXRoaXMuZGF0YTtYPUo7bGV0IEg9clkoWSx0aGlzLl9vZmZzZXRzLFosUSk7cmV0dXJuIFg9dm9pZCAwLEh9fWZ1bmN0aW9uIFRKKCQpe2xldCBYO2Z1bmN0aW9uIFEoWixKLFkpe2xldCBIPVksVz0wLFA9MDtmb3IobGV0IEc9Si0xLHE9Wi5sZW5ndGg7KytHPHE7KXtsZXQgTD1aW0ddO2lmKH4oVz0kKEwsWCxIKSkpcmV0dXJuIFArVztIPTAsUCs9TC5sZW5ndGh9cmV0dXJuLTF9cmV0dXJuIGZ1bmN0aW9uKFosSil7WD1aO2xldCBZPXRoaXMuZGF0YSxIPXR5cGVvZiBKIT09Im51bWJlciI/UShZLDAsMCk6clkoWSx0aGlzLl9vZmZzZXRzLEosUSk7cmV0dXJuIFg9dm9pZCAwLEh9fXZhciB3Sjt2YXIgeEo9QSgoKT0+e3dKPWNsYXNzIHdKe2NvbnN0cnVjdG9yKCQ9MCxYKXt0aGlzLm51bUNodW5rcz0kLHRoaXMuZ2V0Q2h1bmtJdGVyYXRvcj1YLHRoaXMuY2h1bmtJbmRleD0wLHRoaXMuY2h1bmtJdGVyYXRvcj10aGlzLmdldENodW5rSXRlcmF0b3IoMCl9bmV4dCgpe3doaWxlKHRoaXMuY2h1bmtJbmRleDx0aGlzLm51bUNodW5rcyl7bGV0ICQ9dGhpcy5jaHVua0l0ZXJhdG9yLm5leHQoKTtpZighJC5kb25lKXJldHVybiAkO2lmKCsrdGhpcy5jaHVua0luZGV4PHRoaXMubnVtQ2h1bmtzKXRoaXMuY2h1bmtJdGVyYXRvcj10aGlzLmdldENodW5rSXRlcmF0b3IodGhpcy5jaHVua0luZGV4KX1yZXR1cm57ZG9uZTohMCx2YWx1ZTpudWxsfX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzfX19KTtmdW5jdGlvbiBpNygkLFgpe3JldHVybiBYPT09bnVsbCYmJC5sZW5ndGg+MD8wOi0xfWZ1bmN0aW9uIGE3KCQsWCl7bGV0e251bGxCaXRtYXA6UX09JDtpZighUXx8JC5udWxsQ291bnQ8PTApcmV0dXJuLTE7bGV0IFo9MDtmb3IobGV0IEogb2YgbmV3IGsxKFEsJC5vZmZzZXQrKFh8fDApLCQubGVuZ3RoLFEsU1gpKXtpZighSilyZXR1cm4gWjsrK1p9cmV0dXJuLTF9ZnVuY3Rpb24gbygkLFgsUSl7aWYoWD09PXZvaWQgMClyZXR1cm4tMTtpZihYPT09bnVsbClzd2l0Y2goJC50eXBlSWQpe2Nhc2UgRS5VbmlvbjpicmVhaztjYXNlIEUuRGljdGlvbmFyeTpicmVhaztkZWZhdWx0OnJldHVybiBhNygkLFEpfWxldCBaPXA4LmdldFZpc2l0Rm4oJCksSj10MShYKTtmb3IobGV0IFk9KFF8fDApLTEsSD0kLmxlbmd0aDsrK1k8SDspaWYoSihaKCQsWSkpKXJldHVybiBZO3JldHVybi0xfWZ1bmN0aW9uIHAzKCQsWCxRKXtsZXQgWj1wOC5nZXRWaXNpdEZuKCQpLEo9dDEoWCk7Zm9yKGxldCBZPShRfHwwKS0xLEg9JC5sZW5ndGg7KytZPEg7KWlmKEooWigkLFkpKSlyZXR1cm4gWTtyZXR1cm4tMX12YXIgaCxWNjt2YXIgZ0o9QSgoKT0+e1Y4KCk7ZTAoKTtrNigpO3c2KCk7algoKTtoPWNsYXNzIGggZXh0ZW5kcyBUe307aC5wcm90b3R5cGUudmlzaXROdWxsPWk3O2gucHJvdG90eXBlLnZpc2l0Qm9vbD1vO2gucHJvdG90eXBlLnZpc2l0SW50PW87aC5wcm90b3R5cGUudmlzaXRJbnQ4PW87aC5wcm90b3R5cGUudmlzaXRJbnQxNj1vO2gucHJvdG90eXBlLnZpc2l0SW50MzI9bztoLnByb3RvdHlwZS52aXNpdEludDY0PW87aC5wcm90b3R5cGUudmlzaXRVaW50OD1vO2gucHJvdG90eXBlLnZpc2l0VWludDE2PW87aC5wcm90b3R5cGUudmlzaXRVaW50MzI9bztoLnByb3RvdHlwZS52aXNpdFVpbnQ2ND1vO2gucHJvdG90eXBlLnZpc2l0RmxvYXQ9bztoLnByb3RvdHlwZS52aXNpdEZsb2F0MTY9bztoLnByb3RvdHlwZS52aXNpdEZsb2F0MzI9bztoLnByb3RvdHlwZS52aXNpdEZsb2F0NjQ9bztoLnByb3RvdHlwZS52aXNpdFV0Zjg9bztoLnByb3RvdHlwZS52aXNpdExhcmdlVXRmOD1vO2gucHJvdG90eXBlLnZpc2l0VXRmOFZpZXc9bztoLnByb3RvdHlwZS52aXNpdEJpbmFyeT1vO2gucHJvdG90eXBlLnZpc2l0TGFyZ2VCaW5hcnk9bztoLnByb3RvdHlwZS52aXNpdEJpbmFyeVZpZXc9bztoLnByb3RvdHlwZS52aXNpdEZpeGVkU2l6ZUJpbmFyeT1vO2gucHJvdG90eXBlLnZpc2l0RGF0ZT1vO2gucHJvdG90eXBlLnZpc2l0RGF0ZURheT1vO2gucHJvdG90eXBlLnZpc2l0RGF0ZU1pbGxpc2Vjb25kPW87aC5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXA9bztoLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcFNlY29uZD1vO2gucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wTWlsbGlzZWNvbmQ9bztoLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcE1pY3Jvc2Vjb25kPW87aC5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBOYW5vc2Vjb25kPW87aC5wcm90b3R5cGUudmlzaXRUaW1lPW87aC5wcm90b3R5cGUudmlzaXRUaW1lU2Vjb25kPW87aC5wcm90b3R5cGUudmlzaXRUaW1lTWlsbGlzZWNvbmQ9bztoLnByb3RvdHlwZS52aXNpdFRpbWVNaWNyb3NlY29uZD1vO2gucHJvdG90eXBlLnZpc2l0VGltZU5hbm9zZWNvbmQ9bztoLnByb3RvdHlwZS52aXNpdERlY2ltYWw9bztoLnByb3RvdHlwZS52aXNpdExpc3Q9bztoLnByb3RvdHlwZS52aXNpdFN0cnVjdD1vO2gucHJvdG90eXBlLnZpc2l0VW5pb249bztoLnByb3RvdHlwZS52aXNpdERlbnNlVW5pb249cDM7aC5wcm90b3R5cGUudmlzaXRTcGFyc2VVbmlvbj1wMztoLnByb3RvdHlwZS52aXNpdERpY3Rpb25hcnk9bztoLnByb3RvdHlwZS52aXNpdEludGVydmFsPW87aC5wcm90b3R5cGUudmlzaXRJbnRlcnZhbERheVRpbWU9bztoLnByb3RvdHlwZS52aXNpdEludGVydmFsWWVhck1vbnRoPW87aC5wcm90b3R5cGUudmlzaXRJbnRlcnZhbE1vbnRoRGF5TmFubz1vO2gucHJvdG90eXBlLnZpc2l0RHVyYXRpb249bztoLnByb3RvdHlwZS52aXNpdER1cmF0aW9uU2Vjb25kPW87aC5wcm90b3R5cGUudmlzaXREdXJhdGlvbk1pbGxpc2Vjb25kPW87aC5wcm90b3R5cGUudmlzaXREdXJhdGlvbk1pY3Jvc2Vjb25kPW87aC5wcm90b3R5cGUudmlzaXREdXJhdGlvbk5hbm9zZWNvbmQ9bztoLnByb3RvdHlwZS52aXNpdEZpeGVkU2l6ZUxpc3Q9bztoLnByb3RvdHlwZS52aXNpdE1hcD1vO1Y2PW5ldyBofSk7ZnVuY3Rpb24gdSgkKXtsZXR7dHlwZTpYfT0kO2lmKCQubnVsbENvdW50PT09MCYmJC5zdHJpZGU9PT0xJiYoUi5pc0ludChYKSYmWC5iaXRXaWR0aCE9PTY0fHxSLmlzVGltZShYKSYmWC5iaXRXaWR0aCE9PTY0fHxSLmlzRmxvYXQoWCkmJlgucHJlY2lzaW9uIT09ejguSEFMRikpcmV0dXJuIG5ldyB3SigkLmRhdGEubGVuZ3RoLChaKT0+e2xldCBKPSQuZGF0YVtaXTtyZXR1cm4gSi52YWx1ZXMuc3ViYXJyYXkoMCxKLmxlbmd0aClbU3ltYm9sLml0ZXJhdG9yXSgpfSk7bGV0IFE9MDtyZXR1cm4gbmV3IHdKKCQuZGF0YS5sZW5ndGgsKFopPT57bGV0IFk9JC5kYXRhW1pdLmxlbmd0aCxIPSQuc2xpY2UoUSxRK1kpO3JldHVybiBRKz1ZLG5ldyBjMyhIKX0pfXZhciB5LGMzLHdYO3ZhciB2Sj1BKCgpPT57ZTAoKTtWOCgpO044KCk7eEooKTt5PWNsYXNzIHkgZXh0ZW5kcyBUe307YzM9Y2xhc3MgYzN7Y29uc3RydWN0b3IoJCl7dGhpcy52ZWN0b3I9JCx0aGlzLmluZGV4PTB9bmV4dCgpe2lmKHRoaXMuaW5kZXg8dGhpcy52ZWN0b3IubGVuZ3RoKXJldHVybnt2YWx1ZTp0aGlzLnZlY3Rvci5nZXQodGhpcy5pbmRleCsrKX07cmV0dXJue2RvbmU6ITAsdmFsdWU6bnVsbH19W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpc319O3kucHJvdG90eXBlLnZpc2l0TnVsbD11O3kucHJvdG90eXBlLnZpc2l0Qm9vbD11O3kucHJvdG90eXBlLnZpc2l0SW50PXU7eS5wcm90b3R5cGUudmlzaXRJbnQ4PXU7eS5wcm90b3R5cGUudmlzaXRJbnQxNj11O3kucHJvdG90eXBlLnZpc2l0SW50MzI9dTt5LnByb3RvdHlwZS52aXNpdEludDY0PXU7eS5wcm90b3R5cGUudmlzaXRVaW50OD11O3kucHJvdG90eXBlLnZpc2l0VWludDE2PXU7eS5wcm90b3R5cGUudmlzaXRVaW50MzI9dTt5LnByb3RvdHlwZS52aXNpdFVpbnQ2ND11O3kucHJvdG90eXBlLnZpc2l0RmxvYXQ9dTt5LnByb3RvdHlwZS52aXNpdEZsb2F0MTY9dTt5LnByb3RvdHlwZS52aXNpdEZsb2F0MzI9dTt5LnByb3RvdHlwZS52aXNpdEZsb2F0NjQ9dTt5LnByb3RvdHlwZS52aXNpdFV0Zjg9dTt5LnByb3RvdHlwZS52aXNpdExhcmdlVXRmOD11O3kucHJvdG90eXBlLnZpc2l0VXRmOFZpZXc9dTt5LnByb3RvdHlwZS52aXNpdEJpbmFyeT11O3kucHJvdG90eXBlLnZpc2l0TGFyZ2VCaW5hcnk9dTt5LnByb3RvdHlwZS52aXNpdEJpbmFyeVZpZXc9dTt5LnByb3RvdHlwZS52aXNpdEZpeGVkU2l6ZUJpbmFyeT11O3kucHJvdG90eXBlLnZpc2l0RGF0ZT11O3kucHJvdG90eXBlLnZpc2l0RGF0ZURheT11O3kucHJvdG90eXBlLnZpc2l0RGF0ZU1pbGxpc2Vjb25kPXU7eS5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXA9dTt5LnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcFNlY29uZD11O3kucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wTWlsbGlzZWNvbmQ9dTt5LnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcE1pY3Jvc2Vjb25kPXU7eS5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBOYW5vc2Vjb25kPXU7eS5wcm90b3R5cGUudmlzaXRUaW1lPXU7eS5wcm90b3R5cGUudmlzaXRUaW1lU2Vjb25kPXU7eS5wcm90b3R5cGUudmlzaXRUaW1lTWlsbGlzZWNvbmQ9dTt5LnByb3RvdHlwZS52aXNpdFRpbWVNaWNyb3NlY29uZD11O3kucHJvdG90eXBlLnZpc2l0VGltZU5hbm9zZWNvbmQ9dTt5LnByb3RvdHlwZS52aXNpdERlY2ltYWw9dTt5LnByb3RvdHlwZS52aXNpdExpc3Q9dTt5LnByb3RvdHlwZS52aXNpdFN0cnVjdD11O3kucHJvdG90eXBlLnZpc2l0VW5pb249dTt5LnByb3RvdHlwZS52aXNpdERlbnNlVW5pb249dTt5LnByb3RvdHlwZS52aXNpdFNwYXJzZVVuaW9uPXU7eS5wcm90b3R5cGUudmlzaXREaWN0aW9uYXJ5PXU7eS5wcm90b3R5cGUudmlzaXRJbnRlcnZhbD11O3kucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWxEYXlUaW1lPXU7eS5wcm90b3R5cGUudmlzaXRJbnRlcnZhbFllYXJNb250aD11O3kucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWxNb250aERheU5hbm89dTt5LnByb3RvdHlwZS52aXNpdER1cmF0aW9uPXU7eS5wcm90b3R5cGUudmlzaXREdXJhdGlvblNlY29uZD11O3kucHJvdG90eXBlLnZpc2l0RHVyYXRpb25NaWxsaXNlY29uZD11O3kucHJvdG90eXBlLnZpc2l0RHVyYXRpb25NaWNyb3NlY29uZD11O3kucHJvdG90eXBlLnZpc2l0RHVyYXRpb25OYW5vc2Vjb25kPXU7eS5wcm90b3R5cGUudmlzaXRGaXhlZFNpemVMaXN0PXU7eS5wcm90b3R5cGUudmlzaXRNYXA9dTt3WD1uZXcgeX0pO2Z1bmN0aW9uIHExKCQpe2lmKCQpe2lmKCQgaW5zdGFuY2VvZiBuKXJldHVybiBuZXcgRChbJF0pO2lmKCQgaW5zdGFuY2VvZiBEKXJldHVybiBuZXcgRCgkLmRhdGEpO2lmKCQudHlwZSBpbnN0YW5jZW9mIFIpcmV0dXJuIG5ldyBEKFtDKCQpXSk7aWYoQXJyYXkuaXNBcnJheSgkKSlyZXR1cm4gbmV3IEQoJC5mbGF0TWFwKChYKT0+dDcoWCkpKTtpZihBcnJheUJ1ZmZlci5pc1ZpZXcoJCkpe2lmKCQgaW5zdGFuY2VvZiBEYXRhVmlldykkPW5ldyBVaW50OEFycmF5KCQuYnVmZmVyKTtsZXQgWD17b2Zmc2V0OjAsbGVuZ3RoOiQubGVuZ3RoLG51bGxDb3VudDotMSxkYXRhOiR9O2lmKCQgaW5zdGFuY2VvZiBJbnQ4QXJyYXkpcmV0dXJuIG5ldyBEKFtDKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxYKSx7dHlwZTpuZXcgWTF9KSldKTtpZigkIGluc3RhbmNlb2YgSW50MTZBcnJheSlyZXR1cm4gbmV3IEQoW0MoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LFgpLHt0eXBlOm5ldyBIMX0pKV0pO2lmKCQgaW5zdGFuY2VvZiBJbnQzMkFycmF5KXJldHVybiBuZXcgRChbQyhPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sWCkse3R5cGU6bmV3IFowfSkpXSk7aWYoJCBpbnN0YW5jZW9mIEJpZ0ludDY0QXJyYXkpcmV0dXJuIG5ldyBEKFtDKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxYKSx7dHlwZTpuZXcgYjh9KSldKTtpZigkIGluc3RhbmNlb2YgVWludDhBcnJheXx8JCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KXJldHVybiBuZXcgRChbQyhPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sWCkse3R5cGU6bmV3IFcxfSkpXSk7aWYoJCBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KXJldHVybiBuZXcgRChbQyhPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sWCkse3R5cGU6bmV3IEsxfSkpXSk7aWYoJCBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KXJldHVybiBuZXcgRChbQyhPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sWCkse3R5cGU6bmV3IFAxfSkpXSk7aWYoJCBpbnN0YW5jZW9mIEJpZ1VpbnQ2NEFycmF5KXJldHVybiBuZXcgRChbQyhPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sWCkse3R5cGU6bmV3IEUkfSkpXSk7aWYoJCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSlyZXR1cm4gbmV3IEQoW0MoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LFgpLHt0eXBlOm5ldyBHMX0pKV0pO2lmKCQgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkpcmV0dXJuIG5ldyBEKFtDKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxYKSx7dHlwZTpuZXcgdDB9KSldKTt0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIGlucHV0Iil9fXRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgaW5wdXQiKX1mdW5jdGlvbiB0NygkKXtyZXR1cm4gJCBpbnN0YW5jZW9mIG4/WyRdOiQgaW5zdGFuY2VvZiBEPyQuZGF0YTpxMSgkKS5kYXRhfXZhciB1MyxkMyxsMyxuMyxELGhKO3ZhciBTMD1BKCgpPT57VjgoKTtqWCgpO044KCk7XyQoKTt4SigpO2s2KCk7TCQoKTtnSigpO3ZKKCk7TjgoKTtkMz1TeW1ib2wuZm9yKCJhcGFjaGUtYXJyb3cvVmVjdG9yIiksbDM9e30sbjM9e307RD1jbGFzcyBEe3N0YXRpYyBpc1ZlY3RvcigkKXtyZXR1cm4oJD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiRbZDNdKT09PSEwfWNvbnN0cnVjdG9yKCQpe3ZhciBYLFEsWjtsZXQgSj0kWzBdaW5zdGFuY2VvZiBEPyQuZmxhdE1hcCgoSCk9PkguZGF0YSk6JDtpZihKLmxlbmd0aD09PTB8fEouc29tZSgoSCk9PiEoSCBpbnN0YW5jZW9mIG4pKSl0aHJvdyBUeXBlRXJyb3IoIlZlY3RvciBjb25zdHJ1Y3RvciBleHBlY3RzIGFuIEFycmF5IG9mIERhdGEgaW5zdGFuY2VzLiIpO2xldCBZPShYPUpbMF0pPT09bnVsbHx8WD09PXZvaWQgMD92b2lkIDA6WC50eXBlO3N3aXRjaChKLmxlbmd0aCl7Y2FzZSAwOnRoaXMuX29mZnNldHM9WzBdO2JyZWFrO2Nhc2UgMTp7bGV0e2dldDpILHNldDpXLGluZGV4T2Y6UH09bDNbWS50eXBlSWRdLEc9SlswXTt0aGlzLmlzVmFsaWQ9KHEpPT5tUShHLHEpLHRoaXMuZ2V0PShxKT0+SChHLHEpLHRoaXMuc2V0PShxLEwpPT5XKEcscSxMKSx0aGlzLmluZGV4T2Y9KHEpPT5QKEcscSksdGhpcy5fb2Zmc2V0cz1bMCxHLmxlbmd0aF07YnJlYWt9ZGVmYXVsdDpPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxuM1tZLnR5cGVJZF0pLHRoaXMuX29mZnNldHM9QkooSik7YnJlYWt9dGhpcy5kYXRhPUosdGhpcy50eXBlPVksdGhpcy5zdHJpZGU9TSQoWSksdGhpcy5udW1DaGlsZHJlbj0oWj0oUT1ZLmNoaWxkcmVuKT09PW51bGx8fFE9PT12b2lkIDA/dm9pZCAwOlEubGVuZ3RoKSE9PW51bGwmJlohPT12b2lkIDA/WjowLHRoaXMubGVuZ3RoPXRoaXMuX29mZnNldHMuYXQoLTEpfWdldCBieXRlTGVuZ3RoKCl7cmV0dXJuIHRoaXMuZGF0YS5yZWR1Y2UoKCQsWCk9PiQrWC5ieXRlTGVuZ3RoLDApfWdldCBudWxsYWJsZSgpe3JldHVybiBiMyh0aGlzLmRhdGEpfWdldCBudWxsQ291bnQoKXtyZXR1cm4gVkoodGhpcy5kYXRhKX1nZXQgQXJyYXlUeXBlKCl7cmV0dXJuIHRoaXMudHlwZS5BcnJheVR5cGV9Z2V0W1N5bWJvbC50b1N0cmluZ1RhZ10oKXtyZXR1cm5gJHt0aGlzLlZlY3Rvck5hbWV9PCR7dGhpcy50eXBlW1N5bWJvbC50b1N0cmluZ1RhZ119PmB9Z2V0IFZlY3Rvck5hbWUoKXtyZXR1cm5gJHtFW3RoaXMudHlwZS50eXBlSWRdfVZlY3RvcmB9aXNWYWxpZCgkKXtyZXR1cm4hMX1nZXQoJCl7cmV0dXJuIG51bGx9YXQoJCl7cmV0dXJuIHRoaXMuZ2V0KGo2KCQsdGhpcy5sZW5ndGgpKX1zZXQoJCxYKXtyZXR1cm59aW5kZXhPZigkLFgpe3JldHVybi0xfWluY2x1ZGVzKCQsWCl7cmV0dXJuIHRoaXMuaW5kZXhPZigkLFgpPi0xfVtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIHdYLnZpc2l0KHRoaXMpfWNvbmNhdCguLi4kKXtyZXR1cm4gbmV3IEQodGhpcy5kYXRhLmNvbmNhdCgkLmZsYXRNYXAoKFgpPT5YLmRhdGEpLmZsYXQoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSkpfXNsaWNlKCQsWCl7cmV0dXJuIG5ldyBEKHZRKHRoaXMsJCxYLCh7ZGF0YTpRLF9vZmZzZXRzOlp9LEosWSk9PklKKFEsWixKLFkpKSl9dG9KU09OKCl7cmV0dXJuWy4uLnRoaXNdfXRvQXJyYXkoKXtsZXR7dHlwZTokLGRhdGE6WCxsZW5ndGg6USxzdHJpZGU6WixBcnJheVR5cGU6Sn09dGhpcztzd2l0Y2goJC50eXBlSWQpe2Nhc2UgRS5JbnQ6Y2FzZSBFLkZsb2F0OmNhc2UgRS5EZWNpbWFsOmNhc2UgRS5UaW1lOmNhc2UgRS5UaW1lc3RhbXA6c3dpdGNoKFgubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyBKO2Nhc2UgMTpyZXR1cm4gWFswXS52YWx1ZXMuc3ViYXJyYXkoMCxRKlopO2RlZmF1bHQ6cmV0dXJuIFgucmVkdWNlKChZLHt2YWx1ZXM6SCxsZW5ndGg6V30pPT57cmV0dXJuIFkuYXJyYXkuc2V0KEguc3ViYXJyYXkoMCxXKlopLFkub2Zmc2V0KSxZLm9mZnNldCs9VypaLFl9LHthcnJheTpuZXcgSihRKlopLG9mZnNldDowfSkuYXJyYXl9fXJldHVyblsuLi50aGlzXX10b1N0cmluZygpe3JldHVybmBbJHtbLi4udGhpc10uam9pbigiLCIpfV1gfWdldENoaWxkKCQpe3ZhciBYO3JldHVybiB0aGlzLmdldENoaWxkQXQoKFg9dGhpcy50eXBlLmNoaWxkcmVuKT09PW51bGx8fFg9PT12b2lkIDA/dm9pZCAwOlguZmluZEluZGV4KChRKT0+US5uYW1lPT09JCkpfWdldENoaWxkQXQoJCl7aWYoJD4tMSYmJDx0aGlzLm51bUNoaWxkcmVuKXJldHVybiBuZXcgRCh0aGlzLmRhdGEubWFwKCh7Y2hpbGRyZW46WH0pPT5YWyRdKSk7cmV0dXJuIG51bGx9Z2V0IGlzTWVtb2l6ZWQoKXtpZihSLmlzRGljdGlvbmFyeSh0aGlzLnR5cGUpKXJldHVybiB0aGlzLmRhdGFbMF0uZGljdGlvbmFyeS5pc01lbW9pemVkO3JldHVybiExfW1lbW9pemUoKXtpZihSLmlzRGljdGlvbmFyeSh0aGlzLnR5cGUpKXtsZXQgJD1uZXcgaEoodGhpcy5kYXRhWzBdLmRpY3Rpb25hcnkpLFg9dGhpcy5kYXRhLm1hcCgoUSk9PntsZXQgWj1RLmNsb25lKCk7cmV0dXJuIFouZGljdGlvbmFyeT0kLFp9KTtyZXR1cm4gbmV3IEQoWCl9cmV0dXJuIG5ldyBoSih0aGlzKX11bm1lbW9pemUoKXtpZihSLmlzRGljdGlvbmFyeSh0aGlzLnR5cGUpJiZ0aGlzLmlzTWVtb2l6ZWQpe2xldCAkPXRoaXMuZGF0YVswXS5kaWN0aW9uYXJ5LnVubWVtb2l6ZSgpLFg9dGhpcy5kYXRhLm1hcCgoUSk9PntsZXQgWj1RLmNsb25lKCk7cmV0dXJuIFouZGljdGlvbmFyeT0kLFp9KTtyZXR1cm4gbmV3IEQoWCl9cmV0dXJuIHRoaXN9fTt1Mz1TeW1ib2wudG9TdHJpbmdUYWc7RFt1M109KCgkKT0+eyQudHlwZT1SLnByb3RvdHlwZSwkLmRhdGE9W10sJC5sZW5ndGg9MCwkLnN0cmlkZT0xLCQubnVtQ2hpbGRyZW49MCwkLl9vZmZzZXRzPW5ldyBVaW50MzJBcnJheShbMF0pLCRbU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZV09ITAsJFtkM109ITA7bGV0IFg9T2JqZWN0LmtleXMoRSkubWFwKChRKT0+RVtRXSkuZmlsdGVyKChRKT0+dHlwZW9mIFE9PT0ibnVtYmVyIiYmUSE9PUUuTk9ORSk7Zm9yKGxldCBRIG9mIFgpe2xldCBaPXA4LmdldFZpc2l0Rm5CeVR5cGVJZChRKSxKPU0wLmdldFZpc2l0Rm5CeVR5cGVJZChRKSxZPVY2LmdldFZpc2l0Rm5CeVR5cGVJZChRKTtsM1tRXT17Z2V0Olosc2V0OkosaW5kZXhPZjpZfSxuM1tRXT1PYmplY3QuY3JlYXRlKCQse1siaXNWYWxpZCJdOnt2YWx1ZTpEWChtUSl9LFsiZ2V0Il06e3ZhbHVlOkRYKHA4LmdldFZpc2l0Rm5CeVR5cGVJZChRKSl9LFsic2V0Il06e3ZhbHVlOl9KKE0wLmdldFZpc2l0Rm5CeVR5cGVJZChRKSl9LFsiaW5kZXhPZiJdOnt2YWx1ZTpUSihWNi5nZXRWaXNpdEZuQnlUeXBlSWQoUSkpfX0pfXJldHVybiJWZWN0b3IifSkoRC5wcm90b3R5cGUpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShELFN5bWJvbC5oYXNJbnN0YW5jZSx7dmFsdWU6ZnVuY3Rpb24oWCl7cmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdLmNhbGwodGhpcyxYKXx8dGhpcz09PUQmJkQuaXNWZWN0b3IoWCl9fSk7aEo9Y2xhc3MgaEogZXh0ZW5kcyBEe2NvbnN0cnVjdG9yKCQpe3N1cGVyKCQuZGF0YSk7bGV0IFg9dGhpcy5nZXQsUT10aGlzLnNldCxaPXRoaXMuc2xpY2UsSj1BcnJheSh0aGlzLmxlbmd0aCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImdldCIse3ZhbHVlKFkpe2xldCBIPUpbWV07aWYoSCE9PXZvaWQgMClyZXR1cm4gSDtsZXQgVz1YLmNhbGwodGhpcyxZKTtyZXR1cm4gSltZXT1XLFd9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInNldCIse3ZhbHVlKFksSCl7US5jYWxsKHRoaXMsWSxIKSxKW1ldPUh9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInNsaWNlIix7dmFsdWU6KFksSCk9Pm5ldyBoSihaLmNhbGwodGhpcyxZLEgpKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpc01lbW9pemVkIix7dmFsdWU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidW5tZW1vaXplIix7dmFsdWU6KCk9Pm5ldyBEKHRoaXMuZGF0YSl9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibWVtb2l6ZSIse3ZhbHVlOigpPT50aGlzfSl9fX0pO2Z1bmN0aW9uIG8zKCQpe2lmKCEkfHwkLmxlbmd0aDw9MClyZXR1cm4gZnVuY3Rpb24oSil7cmV0dXJuITB9O2xldCBYPSIiLFE9JC5maWx0ZXIoKFopPT5aPT09Wik7aWYoUS5sZW5ndGg+MClYPWAKICAgIHN3aXRjaCAoeCkgeyR7US5tYXAoKFopPT5gCiAgICAgICAgY2FzZSAke2U3KFopfTpgKS5qb2luKCIiKX0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfWA7aWYoJC5sZW5ndGghPT1RLmxlbmd0aClYPWBpZiAoeCAhPT0geCkgcmV0dXJuIGZhbHNlOwoke1h9YDtyZXR1cm4gRnVuY3Rpb24oIngiLGAke1h9CnJldHVybiB0cnVlO2ApfWZ1bmN0aW9uIGU3KCQpe2lmKHR5cGVvZiAkIT09ImJpZ2ludCIpcmV0dXJuIHkkKCQpO3JldHVybmAke3kkKCQpfW5gfXZhciBzMz0oKT0+e307ZnVuY3Rpb24gaVkoJCxYKXtsZXQgUT1NYXRoLmNlaWwoJCkqWC0xO3JldHVybihRLVElNjQrNjR8fDY0KS9YfWZ1bmN0aW9uIHIzKCQsWD0wKXtyZXR1cm4gJC5sZW5ndGg+PVg/JC5zdWJhcnJheSgwLFgpOlJRKG5ldyAkLmNvbnN0cnVjdG9yKFgpLCQsMCl9Y2xhc3MgTiR7Y29uc3RydWN0b3IoJCxYPTAsUT0xKXt0aGlzLmxlbmd0aD1NYXRoLmNlaWwoWC9RKSx0aGlzLmJ1ZmZlcj1uZXcgJCh0aGlzLmxlbmd0aCksdGhpcy5zdHJpZGU9USx0aGlzLkJZVEVTX1BFUl9FTEVNRU5UPSQuQllURVNfUEVSX0VMRU1FTlQsdGhpcy5BcnJheVR5cGU9JH1nZXQgYnl0ZUxlbmd0aCgpe3JldHVybiBNYXRoLmNlaWwodGhpcy5sZW5ndGgqdGhpcy5zdHJpZGUpKnRoaXMuQllURVNfUEVSX0VMRU1FTlR9Z2V0IHJlc2VydmVkTGVuZ3RoKCl7cmV0dXJuIHRoaXMuYnVmZmVyLmxlbmd0aC90aGlzLnN0cmlkZX1nZXQgcmVzZXJ2ZWRCeXRlTGVuZ3RoKCl7cmV0dXJuIHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGh9c2V0KCQsWCl7cmV0dXJuIHRoaXN9YXBwZW5kKCQpe3JldHVybiB0aGlzLnNldCh0aGlzLmxlbmd0aCwkKX1yZXNlcnZlKCQpe2lmKCQ+MCl7dGhpcy5sZW5ndGgrPSQ7bGV0IFg9dGhpcy5zdHJpZGUsUT10aGlzLmxlbmd0aCpYLFo9dGhpcy5idWZmZXIubGVuZ3RoO2lmKFE+PVopdGhpcy5fcmVzaXplKFo9PT0wP2lZKFEqMSx0aGlzLkJZVEVTX1BFUl9FTEVNRU5UKTppWShRKjIsdGhpcy5CWVRFU19QRVJfRUxFTUVOVCkpfXJldHVybiB0aGlzfWZsdXNoKCQ9dGhpcy5sZW5ndGgpeyQ9aVkoJCp0aGlzLnN0cmlkZSx0aGlzLkJZVEVTX1BFUl9FTEVNRU5UKTtsZXQgWD1yMyh0aGlzLmJ1ZmZlciwkKTtyZXR1cm4gdGhpcy5jbGVhcigpLFh9Y2xlYXIoKXtyZXR1cm4gdGhpcy5sZW5ndGg9MCx0aGlzLmJ1ZmZlcj1uZXcgdGhpcy5BcnJheVR5cGUsdGhpc31fcmVzaXplKCQpe3JldHVybiB0aGlzLmJ1ZmZlcj1yMyh0aGlzLmJ1ZmZlciwkKX19dmFyIGUxLGZRLGJRO3ZhciB6MT1BKCgpPT57bzgoKTtlMT1jbGFzcyBlMSBleHRlbmRzIE4ke2xhc3QoKXtyZXR1cm4gdGhpcy5nZXQodGhpcy5sZW5ndGgtMSl9Z2V0KCQpe3JldHVybiB0aGlzLmJ1ZmZlclskXX1zZXQoJCxYKXtyZXR1cm4gdGhpcy5yZXNlcnZlKCQtdGhpcy5sZW5ndGgrMSksdGhpcy5idWZmZXJbJCp0aGlzLnN0cmlkZV09WCx0aGlzfX07ZlE9Y2xhc3MgZlEgZXh0ZW5kcyBlMXtjb25zdHJ1Y3Rvcigpe3N1cGVyKFVpbnQ4QXJyYXksMCwwLjEyNSk7dGhpcy5udW1WYWxpZD0wfWdldCBudW1JbnZhbGlkKCl7cmV0dXJuIHRoaXMubGVuZ3RoLXRoaXMubnVtVmFsaWR9Z2V0KCQpe3JldHVybiB0aGlzLmJ1ZmZlclskPj4zXT4+JCU4JjF9c2V0KCQsWCl7bGV0e2J1ZmZlcjpRfT10aGlzLnJlc2VydmUoJC10aGlzLmxlbmd0aCsxKSxaPSQ+PjMsSj0kJTgsWT1RW1pdPj5KJjE7cmV0dXJuIFg/WT09PTAmJihRW1pdfD0xPDxKLCsrdGhpcy5udW1WYWxpZCk6WT09PTEmJihRW1pdJj1+KDE8PEopLC0tdGhpcy5udW1WYWxpZCksdGhpc31jbGVhcigpe3JldHVybiB0aGlzLm51bVZhbGlkPTAsc3VwZXIuY2xlYXIoKX19O2JRPWNsYXNzIGJRIGV4dGVuZHMgZTF7Y29uc3RydWN0b3IoJCl7c3VwZXIoJC5PZmZzZXRBcnJheVR5cGUsMSwxKX1hcHBlbmQoJCl7cmV0dXJuIHRoaXMuc2V0KHRoaXMubGVuZ3RoLTEsJCl9c2V0KCQsWCl7bGV0IFE9dGhpcy5sZW5ndGgtMSxaPXRoaXMucmVzZXJ2ZSgkLVErMSkuYnVmZmVyO2lmKFE8JCsrJiZRPj0wKVouZmlsbChaW1FdLFEsJCk7cmV0dXJuIFpbJF09WlskLTFdK1gsdGhpc31mbHVzaCgkPXRoaXMubGVuZ3RoLTEpe2lmKCQ+dGhpcy5sZW5ndGgpdGhpcy5zZXQoJC0xLHRoaXMuQllURVNfUEVSX0VMRU1FTlQ+ND9CaWdJbnQoMCk6MCk7cmV0dXJuIHN1cGVyLmZsdXNoKCQrMSl9fX0pO2NsYXNzIFI4e3N0YXRpYyB0aHJvdWdoTm9kZSgkKXt0aHJvdyBFcnJvcignInRocm91Z2hOb2RlIiBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQnKX1zdGF0aWMgdGhyb3VnaERPTSgkKXt0aHJvdyBFcnJvcignInRocm91Z2hET00iIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudCcpfWNvbnN0cnVjdG9yKHt0eXBlOiQsbnVsbFZhbHVlczpYfSl7aWYodGhpcy5sZW5ndGg9MCx0aGlzLmZpbmlzaGVkPSExLHRoaXMudHlwZT0kLHRoaXMuY2hpbGRyZW49W10sdGhpcy5udWxsVmFsdWVzPVgsdGhpcy5zdHJpZGU9TSQoJCksdGhpcy5fbnVsbHM9bmV3IGZRLFgmJlgubGVuZ3RoPjApdGhpcy5faXNWYWxpZD1vMyhYKX10b1ZlY3Rvcigpe3JldHVybiBuZXcgRChbdGhpcy5mbHVzaCgpXSl9Z2V0IEFycmF5VHlwZSgpe3JldHVybiB0aGlzLnR5cGUuQXJyYXlUeXBlfWdldCBudWxsQ291bnQoKXtyZXR1cm4gdGhpcy5fbnVsbHMubnVtSW52YWxpZH1nZXQgbnVtQ2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGh9Z2V0IGJ5dGVMZW5ndGgoKXtsZXQgJD0wLHtfb2Zmc2V0czpYLF92YWx1ZXM6USxfbnVsbHM6WixfdHlwZUlkczpKLGNoaWxkcmVuOll9PXRoaXM7cmV0dXJuIFgmJigkKz1YLmJ5dGVMZW5ndGgpLFEmJigkKz1RLmJ5dGVMZW5ndGgpLFomJigkKz1aLmJ5dGVMZW5ndGgpLEomJigkKz1KLmJ5dGVMZW5ndGgpLFkucmVkdWNlKChILFcpPT5IK1cuYnl0ZUxlbmd0aCwkKX1nZXQgcmVzZXJ2ZWRMZW5ndGgoKXtyZXR1cm4gdGhpcy5fbnVsbHMucmVzZXJ2ZWRMZW5ndGh9Z2V0IHJlc2VydmVkQnl0ZUxlbmd0aCgpe2xldCAkPTA7cmV0dXJuIHRoaXMuX29mZnNldHMmJigkKz10aGlzLl9vZmZzZXRzLnJlc2VydmVkQnl0ZUxlbmd0aCksdGhpcy5fdmFsdWVzJiYoJCs9dGhpcy5fdmFsdWVzLnJlc2VydmVkQnl0ZUxlbmd0aCksdGhpcy5fbnVsbHMmJigkKz10aGlzLl9udWxscy5yZXNlcnZlZEJ5dGVMZW5ndGgpLHRoaXMuX3R5cGVJZHMmJigkKz10aGlzLl90eXBlSWRzLnJlc2VydmVkQnl0ZUxlbmd0aCksdGhpcy5jaGlsZHJlbi5yZWR1Y2UoKFgsUSk9PlgrUS5yZXNlcnZlZEJ5dGVMZW5ndGgsJCl9Z2V0IHZhbHVlT2Zmc2V0cygpe3JldHVybiB0aGlzLl9vZmZzZXRzP3RoaXMuX29mZnNldHMuYnVmZmVyOm51bGx9Z2V0IHZhbHVlcygpe3JldHVybiB0aGlzLl92YWx1ZXM/dGhpcy5fdmFsdWVzLmJ1ZmZlcjpudWxsfWdldCBudWxsQml0bWFwKCl7cmV0dXJuIHRoaXMuX251bGxzP3RoaXMuX251bGxzLmJ1ZmZlcjpudWxsfWdldCB0eXBlSWRzKCl7cmV0dXJuIHRoaXMuX3R5cGVJZHM/dGhpcy5fdHlwZUlkcy5idWZmZXI6bnVsbH1hcHBlbmQoJCl7cmV0dXJuIHRoaXMuc2V0KHRoaXMubGVuZ3RoLCQpfWlzVmFsaWQoJCl7cmV0dXJuIHRoaXMuX2lzVmFsaWQoJCl9c2V0KCQsWCl7aWYodGhpcy5zZXRWYWxpZCgkLHRoaXMuaXNWYWxpZChYKSkpdGhpcy5zZXRWYWx1ZSgkLFgpO3JldHVybiB0aGlzfXNldFZhbHVlKCQsWCl7dGhpcy5fc2V0VmFsdWUodGhpcywkLFgpfXNldFZhbGlkKCQsWCl7cmV0dXJuIHRoaXMubGVuZ3RoPXRoaXMuX251bGxzLnNldCgkLCtYKS5sZW5ndGgsWH1hZGRDaGlsZCgkLFg9YCR7dGhpcy5udW1DaGlsZHJlbn1gKXt0aHJvdyBFcnJvcihgQ2Fubm90IGFwcGVuZCBjaGlsZHJlbiB0byBub24tbmVzdGVkIHR5cGUgIiR7dGhpcy50eXBlfSJgKX1nZXRDaGlsZEF0KCQpe3JldHVybiB0aGlzLmNoaWxkcmVuWyRdfHxudWxsfWZsdXNoKCl7bGV0ICQsWCxRLFose3R5cGU6SixsZW5ndGg6WSxudWxsQ291bnQ6SCxfdHlwZUlkczpXLF9vZmZzZXRzOlAsX3ZhbHVlczpHLF9udWxsczpxfT10aGlzO2lmKFg9Vz09PW51bGx8fFc9PT12b2lkIDA/dm9pZCAwOlcuZmx1c2goWSkpWj1QPT09bnVsbHx8UD09PXZvaWQgMD92b2lkIDA6UC5mbHVzaChZKTtlbHNlIGlmKFo9UD09PW51bGx8fFA9PT12b2lkIDA/dm9pZCAwOlAuZmx1c2goWSkpJD1HPT09bnVsbHx8Rz09PXZvaWQgMD92b2lkIDA6Ry5mbHVzaChQLmxhc3QoKSk7ZWxzZSAkPUc9PT1udWxsfHxHPT09dm9pZCAwP3ZvaWQgMDpHLmZsdXNoKFkpO2lmKEg+MClRPXE9PT1udWxsfHxxPT09dm9pZCAwP3ZvaWQgMDpxLmZsdXNoKFkpO2xldCBMPXRoaXMuY2hpbGRyZW4ubWFwKChOKT0+Ti5mbHVzaCgpKTtyZXR1cm4gdGhpcy5jbGVhcigpLEMoe3R5cGU6SixsZW5ndGg6WSxudWxsQ291bnQ6SCxjaGlsZHJlbjpMLGNoaWxkOkxbMF0sZGF0YTokLHR5cGVJZHM6WCxudWxsQml0bWFwOlEsdmFsdWVPZmZzZXRzOlp9KX1maW5pc2goKXt0aGlzLmZpbmlzaGVkPSEwO2ZvcihsZXQgJCBvZiB0aGlzLmNoaWxkcmVuKSQuZmluaXNoKCk7cmV0dXJuIHRoaXN9Y2xlYXIoKXt2YXIgJCxYLFEsWjt0aGlzLmxlbmd0aD0wLCgkPXRoaXMuX251bGxzKT09PW51bGx8fCQ9PT12b2lkIDB8fCQuY2xlYXIoKSwoWD10aGlzLl92YWx1ZXMpPT09bnVsbHx8WD09PXZvaWQgMHx8WC5jbGVhcigpLChRPXRoaXMuX29mZnNldHMpPT09bnVsbHx8UT09PXZvaWQgMHx8US5jbGVhcigpLChaPXRoaXMuX3R5cGVJZHMpPT09bnVsbHx8Wj09PXZvaWQgMHx8Wi5jbGVhcigpO2ZvcihsZXQgSiBvZiB0aGlzLmNoaWxkcmVuKUouY2xlYXIoKTtyZXR1cm4gdGhpc319dmFyIHI4LEYkO3ZhciBrOD1BKCgpPT57UzAoKTtfJCgpO2dRKCk7TjgoKTtzMygpO3oxKCk7UjgucHJvdG90eXBlLmxlbmd0aD0xO1I4LnByb3RvdHlwZS5zdHJpZGU9MTtSOC5wcm90b3R5cGUuY2hpbGRyZW49bnVsbDtSOC5wcm90b3R5cGUuZmluaXNoZWQ9ITE7UjgucHJvdG90eXBlLm51bGxWYWx1ZXM9bnVsbDtSOC5wcm90b3R5cGUuX2lzVmFsaWQ9KCk9PiEwO3I4PWNsYXNzIHI4IGV4dGVuZHMgUjh7Y29uc3RydWN0b3IoJCl7c3VwZXIoJCk7dGhpcy5fdmFsdWVzPW5ldyBlMSh0aGlzLkFycmF5VHlwZSwwLHRoaXMuc3RyaWRlKX1zZXRWYWx1ZSgkLFgpe2xldCBRPXRoaXMuX3ZhbHVlcztyZXR1cm4gUS5yZXNlcnZlKCQtUS5sZW5ndGgrMSksc3VwZXIuc2V0VmFsdWUoJCxYKX19O0YkPWNsYXNzIEYkIGV4dGVuZHMgUjh7Y29uc3RydWN0b3IoJCl7c3VwZXIoJCk7dGhpcy5fcGVuZGluZ0xlbmd0aD0wLHRoaXMuX29mZnNldHM9bmV3IGJRKCQudHlwZSl9c2V0VmFsdWUoJCxYKXtsZXQgUT10aGlzLl9wZW5kaW5nfHwodGhpcy5fcGVuZGluZz1uZXcgTWFwKSxaPVEuZ2V0KCQpO1omJih0aGlzLl9wZW5kaW5nTGVuZ3RoLT1aLmxlbmd0aCksdGhpcy5fcGVuZGluZ0xlbmd0aCs9WCBpbnN0YW5jZW9mIGMkP1hbYTFdLmxlbmd0aDpYLmxlbmd0aCxRLnNldCgkLFgpfXNldFZhbGlkKCQsWCl7aWYoIXN1cGVyLnNldFZhbGlkKCQsWCkpcmV0dXJuKHRoaXMuX3BlbmRpbmd8fCh0aGlzLl9wZW5kaW5nPW5ldyBNYXApKS5zZXQoJCx2b2lkIDApLCExO3JldHVybiEwfWNsZWFyKCl7cmV0dXJuIHRoaXMuX3BlbmRpbmdMZW5ndGg9MCx0aGlzLl9wZW5kaW5nPXZvaWQgMCxzdXBlci5jbGVhcigpfWZsdXNoKCl7cmV0dXJuIHRoaXMuX2ZsdXNoKCksc3VwZXIuZmx1c2goKX1maW5pc2goKXtyZXR1cm4gdGhpcy5fZmx1c2goKSxzdXBlci5maW5pc2goKX1fZmx1c2goKXtsZXQgJD10aGlzLl9wZW5kaW5nLFg9dGhpcy5fcGVuZGluZ0xlbmd0aDtpZih0aGlzLl9wZW5kaW5nTGVuZ3RoPTAsdGhpcy5fcGVuZGluZz12b2lkIDAsJCYmJC5zaXplPjApdGhpcy5fZmx1c2hQZW5kaW5nKCQsWCk7cmV0dXJuIHRoaXN9fX0pO2NsYXNzIFZYe2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KCQsWCl7cmV0dXJuIHRoaXMuYmJfcG9zPSQsdGhpcy5iYj1YLHRoaXN9b2Zmc2V0KCl7cmV0dXJuIHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zKX1tZXRhRGF0YUxlbmd0aCgpe3JldHVybiB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3Bvcys4KX1ib2R5TGVuZ3RoKCl7cmV0dXJuIHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zKzE2KX1zdGF0aWMgc2l6ZU9mKCl7cmV0dXJuIDI0fXN0YXRpYyBjcmVhdGVCbG9jaygkLFgsUSxaKXtyZXR1cm4gJC5wcmVwKDgsMjQpLCQud3JpdGVJbnQ2NChCaWdJbnQoWiE9PW51bGwmJlohPT12b2lkIDA/WjowKSksJC5wYWQoNCksJC53cml0ZUludDMyKFEpLCQud3JpdGVJbnQ2NChCaWdJbnQoWCE9PW51bGwmJlghPT12b2lkIDA/WDowKSksJC5vZmZzZXQoKX19Y2xhc3MgJCR7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MH1fX2luaXQoJCxYKXtyZXR1cm4gdGhpcy5iYl9wb3M9JCx0aGlzLmJiPVgsdGhpc31zdGF0aWMgZ2V0Um9vdEFzRm9vdGVyKCQsWCl7cmV0dXJuKFh8fG5ldyAkJCkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNGb290ZXIoJCxYKXtyZXR1cm4gJC5zZXRQb3NpdGlvbigkLnBvc2l0aW9uKCkrSSksKFh8fG5ldyAkJCkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXZlcnNpb24oKXtsZXQgJD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiAkP3RoaXMuYmIucmVhZEludDE2KHRoaXMuYmJfcG9zKyQpOnE4LlYxfXNjaGVtYSgkKXtsZXQgWD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBYPygkfHxuZXcgZzgpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrWCksdGhpcy5iYik6bnVsbH1kaWN0aW9uYXJpZXMoJCxYKXtsZXQgUT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBRPyhYfHxuZXcgVlgpLl9faW5pdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK1EpKyQqMjQsdGhpcy5iYik6bnVsbH1kaWN0aW9uYXJpZXNMZW5ndGgoKXtsZXQgJD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiAkP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zKyQpOjB9cmVjb3JkQmF0Y2hlcygkLFgpe2xldCBRPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTApO3JldHVybiBRPyhYfHxuZXcgVlgpLl9faW5pdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK1EpKyQqMjQsdGhpcy5iYik6bnVsbH1yZWNvcmRCYXRjaGVzTGVuZ3RoKCl7bGV0ICQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMCk7cmV0dXJuICQ/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrJCk6MH1jdXN0b21NZXRhZGF0YSgkLFgpe2xldCBRPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTIpO3JldHVybiBRPyhYfHxuZXcgVTgpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytRKSskKjQpLHRoaXMuYmIpOm51bGx9Y3VzdG9tTWV0YWRhdGFMZW5ndGgoKXtsZXQgJD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEyKTtyZXR1cm4gJD90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyskKTowfXN0YXRpYyBzdGFydEZvb3RlcigkKXskLnN0YXJ0T2JqZWN0KDUpfXN0YXRpYyBhZGRWZXJzaW9uKCQsWCl7JC5hZGRGaWVsZEludDE2KDAsWCxxOC5WMSl9c3RhdGljIGFkZFNjaGVtYSgkLFgpeyQuYWRkRmllbGRPZmZzZXQoMSxYLDApfXN0YXRpYyBhZGREaWN0aW9uYXJpZXMoJCxYKXskLmFkZEZpZWxkT2Zmc2V0KDIsWCwwKX1zdGF0aWMgc3RhcnREaWN0aW9uYXJpZXNWZWN0b3IoJCxYKXskLnN0YXJ0VmVjdG9yKDI0LFgsOCl9c3RhdGljIGFkZFJlY29yZEJhdGNoZXMoJCxYKXskLmFkZEZpZWxkT2Zmc2V0KDMsWCwwKX1zdGF0aWMgc3RhcnRSZWNvcmRCYXRjaGVzVmVjdG9yKCQsWCl7JC5zdGFydFZlY3RvcigyNCxYLDgpfXN0YXRpYyBhZGRDdXN0b21NZXRhZGF0YSgkLFgpeyQuYWRkRmllbGRPZmZzZXQoNCxYLDApfXN0YXRpYyBjcmVhdGVDdXN0b21NZXRhZGF0YVZlY3RvcigkLFgpeyQuc3RhcnRWZWN0b3IoNCxYLmxlbmd0aCw0KTtmb3IobGV0IFE9WC5sZW5ndGgtMTtRPj0wO1EtLSkkLmFkZE9mZnNldChYW1FdKTtyZXR1cm4gJC5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRDdXN0b21NZXRhZGF0YVZlY3RvcigkLFgpeyQuc3RhcnRWZWN0b3IoNCxYLDQpfXN0YXRpYyBlbmRGb290ZXIoJCl7cmV0dXJuICQuZW5kT2JqZWN0KCl9c3RhdGljIGZpbmlzaEZvb3RlckJ1ZmZlcigkLFgpeyQuZmluaXNoKFgpfXN0YXRpYyBmaW5pc2hTaXplUHJlZml4ZWRGb290ZXJCdWZmZXIoJCxYKXskLmZpbmlzaChYLHZvaWQgMCwhMCl9fXZhciBpMz1BKCgpPT57WTgoKTt6WCgpO2ZaKCk7X1koKX0pO2Z1bmN0aW9uIHlKKCQsWCl7cmV0dXJuIG5ldyBNYXAoWy4uLiR8fG5ldyBNYXAsLi4uWHx8bmV3IE1hcF0pfWZ1bmN0aW9uIGFZKCQsWD1uZXcgTWFwKXtmb3IobGV0IFE9LTEsWj0kLmxlbmd0aDsrK1E8Wjspe2xldCBZPSRbUV0udHlwZTtpZihSLmlzRGljdGlvbmFyeShZKSl7aWYoIVguaGFzKFkuaWQpKVguc2V0KFkuaWQsWS5kaWN0aW9uYXJ5KTtlbHNlIGlmKFguZ2V0KFkuaWQpIT09WS5kaWN0aW9uYXJ5KXRocm93IEVycm9yKCJDYW5ub3QgY3JlYXRlIFNjaGVtYSBjb250YWluaW5nIHR3byBkaWZmZXJlbnQgZGljdGlvbmFyaWVzIHdpdGggdGhlIHNhbWUgSWQiKX1pZihZLmNoaWxkcmVuJiZZLmNoaWxkcmVuLmxlbmd0aD4wKWFZKFkuY2hpbGRyZW4sWCl9cmV0dXJuIFh9dmFyIGEzLHQzLEIsdzt2YXIgdjA9QSgoKT0+e1Y4KCk7TjgoKTthMz1TeW1ib2wuZm9yKCJhcGFjaGUtYXJyb3cvU2NoZW1hIiksdDM9U3ltYm9sLmZvcigiYXBhY2hlLWFycm93L0ZpZWxkIik7Qj1jbGFzcyBCe3N0YXRpYyBpc1NjaGVtYSgkKXtyZXR1cm4oJD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiRbYTNdKT09PSEwfWNvbnN0cnVjdG9yKCQ9W10sWCxRLFo9cTguVjUpe2lmKHRoaXMuZmllbGRzPSR8fFtdLHRoaXMubWV0YWRhdGE9WHx8bmV3IE1hcCwhUSlRPWFZKHRoaXMuZmllbGRzKTt0aGlzLmRpY3Rpb25hcmllcz1RLHRoaXMubWV0YWRhdGFWZXJzaW9uPVp9Z2V0W1N5bWJvbC50b1N0cmluZ1RhZ10oKXtyZXR1cm4iU2NoZW1hIn1nZXQgbmFtZXMoKXtyZXR1cm4gdGhpcy5maWVsZHMubWFwKCgkKT0+JC5uYW1lKX10b1N0cmluZygpe3JldHVybmBTY2hlbWE8eyAke3RoaXMuZmllbGRzLm1hcCgoJCxYKT0+YCR7WH06ICR7JH1gKS5qb2luKCIsICIpfSB9PmB9c2VsZWN0KCQpe2xldCBYPW5ldyBTZXQoJCksUT10aGlzLmZpZWxkcy5maWx0ZXIoKFopPT5YLmhhcyhaLm5hbWUpKTtyZXR1cm4gbmV3IEIoUSx0aGlzLm1ldGFkYXRhKX1zZWxlY3RBdCgkKXtsZXQgWD0kLm1hcCgoUSk9PnRoaXMuZmllbGRzW1FdKS5maWx0ZXIoQm9vbGVhbik7cmV0dXJuIG5ldyBCKFgsdGhpcy5tZXRhZGF0YSl9YXNzaWduKC4uLiQpe2xldCBYPSRbMF1pbnN0YW5jZW9mIEI/JFswXTpBcnJheS5pc0FycmF5KCRbMF0pP25ldyBCKCRbMF0pOm5ldyBCKCQpLFE9Wy4uLnRoaXMuZmllbGRzXSxaPXlKKHlKKG5ldyBNYXAsdGhpcy5tZXRhZGF0YSksWC5tZXRhZGF0YSksSj1YLmZpZWxkcy5maWx0ZXIoKEgpPT57bGV0IFc9US5maW5kSW5kZXgoKFApPT5QLm5hbWU9PT1ILm5hbWUpO3JldHVybn5XPyhRW1ddPUguY2xvbmUoe21ldGFkYXRhOnlKKHlKKG5ldyBNYXAsUVtXXS5tZXRhZGF0YSksSC5tZXRhZGF0YSl9KSkmJiExOiEwfSksWT1hWShKLG5ldyBNYXApO3JldHVybiBuZXcgQihbLi4uUSwuLi5KXSxaLG5ldyBNYXAoWy4uLnRoaXMuZGljdGlvbmFyaWVzLC4uLlldKSl9fTtCLnByb3RvdHlwZS5maWVsZHM9bnVsbDtCLnByb3RvdHlwZS5tZXRhZGF0YT1udWxsO0IucHJvdG90eXBlLmRpY3Rpb25hcmllcz1udWxsO0IucHJvdG90eXBlW2EzXT0hMDtPYmplY3QuZGVmaW5lUHJvcGVydHkoQixTeW1ib2wuaGFzSW5zdGFuY2Use3ZhbHVlOmZ1bmN0aW9uKFgpe3JldHVybiBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXS5jYWxsKHRoaXMsWCl8fHRoaXM9PT1CJiZCLmlzU2NoZW1hKFgpfX0pO3c9Y2xhc3Mgd3tzdGF0aWMgaXNGaWVsZCgkKXtyZXR1cm4oJD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiRbdDNdKT09PSEwfXN0YXRpYyBuZXcoLi4uJCl7bGV0W1gsUSxaLEpdPSQ7aWYoJFswXSYmdHlwZW9mICRbMF09PT0ib2JqZWN0Iikoe25hbWU6WH09JFswXSksUT09PXZvaWQgMCYmKFE9JFswXS50eXBlKSxaPT09dm9pZCAwJiYoWj0kWzBdLm51bGxhYmxlKSxKPT09dm9pZCAwJiYoSj0kWzBdLm1ldGFkYXRhKTtyZXR1cm4gbmV3IHcoYCR7WH1gLFEsWixKKX1jb25zdHJ1Y3RvcigkLFgsUT0hMSxaKXt0aGlzLm5hbWU9JCx0aGlzLnR5cGU9WCx0aGlzLm51bGxhYmxlPVEsdGhpcy5tZXRhZGF0YT1afHxuZXcgTWFwfWdldCB0eXBlSWQoKXtyZXR1cm4gdGhpcy50eXBlLnR5cGVJZH1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJGaWVsZCJ9dG9TdHJpbmcoKXtyZXR1cm5gJHt0aGlzLm5hbWV9OiAke3RoaXMudHlwZX1gfWNsb25lKC4uLiQpe2xldFtYLFEsWixKXT0kO3JldHVybiEkWzBdfHx0eXBlb2YgJFswXSE9PSJvYmplY3QiP1tYPXRoaXMubmFtZSxRPXRoaXMudHlwZSxaPXRoaXMubnVsbGFibGUsSj10aGlzLm1ldGFkYXRhXT0kOntuYW1lOlg9dGhpcy5uYW1lLHR5cGU6UT10aGlzLnR5cGUsbnVsbGFibGU6Wj10aGlzLm51bGxhYmxlLG1ldGFkYXRhOko9dGhpcy5tZXRhZGF0YX09JFswXSx3Lm5ldyhYLFEsWixKKX19O3cucHJvdG90eXBlLnR5cGU9bnVsbDt3LnByb3RvdHlwZS5uYW1lPW51bGw7dy5wcm90b3R5cGUubnVsbGFibGU9bnVsbDt3LnByb3RvdHlwZS5tZXRhZGF0YT1udWxsO3cucHJvdG90eXBlW3QzXT0hMDtPYmplY3QuZGVmaW5lUHJvcGVydHkodyxTeW1ib2wuaGFzSW5zdGFuY2Use3ZhbHVlOmZ1bmN0aW9uKFgpe3JldHVybiBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXS5jYWxsKHRoaXMsWCl8fHRoaXM9PT13JiZ3LmlzRmllbGQoWCl9fSl9KTtjbGFzcyAkNntzdGF0aWMgZGVjb2RlKCQpeyQ9bmV3IFhHKHgoJCkpO2xldCBYPSQkLmdldFJvb3RBc0Zvb3RlcigkKSxRPUIuZGVjb2RlKFguc2NoZW1hKCksbmV3IE1hcCxYLnZlcnNpb24oKSk7cmV0dXJuIG5ldyBlMyhRLFgpfXN0YXRpYyBlbmNvZGUoJCl7bGV0IFg9bmV3ICRHLFE9Qi5lbmNvZGUoWCwkLnNjaGVtYSk7JCQuc3RhcnRSZWNvcmRCYXRjaGVzVmVjdG9yKFgsJC5udW1SZWNvcmRCYXRjaGVzKTtmb3IobGV0IFkgb2ZbLi4uJC5yZWNvcmRCYXRjaGVzKCldLnNsaWNlKCkucmV2ZXJzZSgpKXUkLmVuY29kZShYLFkpO2xldCBaPVguZW5kVmVjdG9yKCk7JCQuc3RhcnREaWN0aW9uYXJpZXNWZWN0b3IoWCwkLm51bURpY3Rpb25hcmllcyk7Zm9yKGxldCBZIG9mWy4uLiQuZGljdGlvbmFyeUJhdGNoZXMoKV0uc2xpY2UoKS5yZXZlcnNlKCkpdSQuZW5jb2RlKFgsWSk7bGV0IEo9WC5lbmRWZWN0b3IoKTtyZXR1cm4gJCQuc3RhcnRGb290ZXIoWCksJCQuYWRkU2NoZW1hKFgsUSksJCQuYWRkVmVyc2lvbihYLHE4LlY1KSwkJC5hZGRSZWNvcmRCYXRjaGVzKFgsWiksJCQuYWRkRGljdGlvbmFyaWVzKFgsSiksJCQuZmluaXNoRm9vdGVyQnVmZmVyKFgsJCQuZW5kRm9vdGVyKFgpKSxYLmFzVWludDhBcnJheSgpfWdldCBudW1SZWNvcmRCYXRjaGVzKCl7cmV0dXJuIHRoaXMuX3JlY29yZEJhdGNoZXMubGVuZ3RofWdldCBudW1EaWN0aW9uYXJpZXMoKXtyZXR1cm4gdGhpcy5fZGljdGlvbmFyeUJhdGNoZXMubGVuZ3RofWNvbnN0cnVjdG9yKCQsWD1xOC5WNSxRLFope3RoaXMuc2NoZW1hPSQsdGhpcy52ZXJzaW9uPVgsUSYmKHRoaXMuX3JlY29yZEJhdGNoZXM9USksWiYmKHRoaXMuX2RpY3Rpb25hcnlCYXRjaGVzPVopfSpyZWNvcmRCYXRjaGVzKCl7Zm9yKGxldCAkLFg9LTEsUT10aGlzLm51bVJlY29yZEJhdGNoZXM7KytYPFE7KWlmKCQ9dGhpcy5nZXRSZWNvcmRCYXRjaChYKSl5aWVsZCAkfSpkaWN0aW9uYXJ5QmF0Y2hlcygpe2ZvcihsZXQgJCxYPS0xLFE9dGhpcy5udW1EaWN0aW9uYXJpZXM7KytYPFE7KWlmKCQ9dGhpcy5nZXREaWN0aW9uYXJ5QmF0Y2goWCkpeWllbGQgJH1nZXRSZWNvcmRCYXRjaCgkKXtyZXR1cm4gJD49MCYmJDx0aGlzLm51bVJlY29yZEJhdGNoZXMmJnRoaXMuX3JlY29yZEJhdGNoZXNbJF18fG51bGx9Z2V0RGljdGlvbmFyeUJhdGNoKCQpe3JldHVybiAkPj0wJiYkPHRoaXMubnVtRGljdGlvbmFyaWVzJiZ0aGlzLl9kaWN0aW9uYXJ5QmF0Y2hlc1skXXx8bnVsbH19Y2xhc3MgdSR7c3RhdGljIGRlY29kZSgkKXtyZXR1cm4gbmV3IHUkKCQubWV0YURhdGFMZW5ndGgoKSwkLmJvZHlMZW5ndGgoKSwkLm9mZnNldCgpKX1zdGF0aWMgZW5jb2RlKCQsWCl7bGV0e21ldGFEYXRhTGVuZ3RoOlF9PVgsWj1CaWdJbnQoWC5vZmZzZXQpLEo9QmlnSW50KFguYm9keUxlbmd0aCk7cmV0dXJuIFZYLmNyZWF0ZUJsb2NrKCQsWixRLEopfWNvbnN0cnVjdG9yKCQsWCxRKXt0aGlzLm1ldGFEYXRhTGVuZ3RoPSQsdGhpcy5vZmZzZXQ9VzgoUSksdGhpcy5ib2R5TGVuZ3RoPVc4KFgpfX12YXIgJEcsWEcsZTM7dmFyIHRZPUEoKCk9PntpMygpO1k4KCk7djAoKTtWOCgpO284KCk7JEc9VTYsWEc9UDA7ZTM9Y2xhc3MgZTMgZXh0ZW5kcyAkNntnZXQgbnVtUmVjb3JkQmF0Y2hlcygpe3JldHVybiB0aGlzLl9mb290ZXIucmVjb3JkQmF0Y2hlc0xlbmd0aCgpfWdldCBudW1EaWN0aW9uYXJpZXMoKXtyZXR1cm4gdGhpcy5fZm9vdGVyLmRpY3Rpb25hcmllc0xlbmd0aCgpfWNvbnN0cnVjdG9yKCQsWCl7c3VwZXIoJCxYLnZlcnNpb24oKSk7dGhpcy5fZm9vdGVyPVh9Z2V0UmVjb3JkQmF0Y2goJCl7aWYoJD49MCYmJDx0aGlzLm51bVJlY29yZEJhdGNoZXMpe2xldCBYPXRoaXMuX2Zvb3Rlci5yZWNvcmRCYXRjaGVzKCQpO2lmKFgpcmV0dXJuIHUkLmRlY29kZShYKX1yZXR1cm4gbnVsbH1nZXREaWN0aW9uYXJ5QmF0Y2goJCl7aWYoJD49MCYmJDx0aGlzLm51bURpY3Rpb25hcmllcyl7bGV0IFg9dGhpcy5fZm9vdGVyLmRpY3Rpb25hcmllcygkKTtpZihYKXJldHVybiB1JC5kZWNvZGUoWCl9cmV0dXJuIG51bGx9fX0pO2NsYXNzIHY4e2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KCQsWCl7cmV0dXJuIHRoaXMuYmJfcG9zPSQsdGhpcy5iYj1YLHRoaXN9c3RhdGljIGdldFJvb3RBc01lc3NhZ2UoJCxYKXtyZXR1cm4oWHx8bmV3IHY4KS5fX2luaXQoJC5yZWFkSW50MzIoJC5wb3NpdGlvbigpKSskLnBvc2l0aW9uKCksJCl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc01lc3NhZ2UoJCxYKXtyZXR1cm4gJC5zZXRQb3NpdGlvbigkLnBvc2l0aW9uKCkrSSksKFh8fG5ldyB2OCkuX19pbml0KCQucmVhZEludDMyKCQucG9zaXRpb24oKSkrJC5wb3NpdGlvbigpLCQpfXZlcnNpb24oKXtsZXQgJD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiAkP3RoaXMuYmIucmVhZEludDE2KHRoaXMuYmJfcG9zKyQpOnE4LlYxfWhlYWRlclR5cGUoKXtsZXQgJD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiAkP3RoaXMuYmIucmVhZFVpbnQ4KHRoaXMuYmJfcG9zKyQpOlg4Lk5PTkV9aGVhZGVyKCQpe2xldCBYPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIFg/dGhpcy5iYi5fX3VuaW9uKCQsdGhpcy5iYl9wb3MrWCk6bnVsbH1ib2R5TGVuZ3RoKCl7bGV0ICQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMCk7cmV0dXJuICQ/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MrJCk6QmlnSW50KCIwIil9Y3VzdG9tTWV0YWRhdGEoJCxYKXtsZXQgUT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEyKTtyZXR1cm4gUT8oWHx8bmV3IFU4KS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrUSkrJCo0KSx0aGlzLmJiKTpudWxsfWN1c3RvbU1ldGFkYXRhTGVuZ3RoKCl7bGV0ICQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuICQ/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrJCk6MH1zdGF0aWMgc3RhcnRNZXNzYWdlKCQpeyQuc3RhcnRPYmplY3QoNSl9c3RhdGljIGFkZFZlcnNpb24oJCxYKXskLmFkZEZpZWxkSW50MTYoMCxYLHE4LlYxKX1zdGF0aWMgYWRkSGVhZGVyVHlwZSgkLFgpeyQuYWRkRmllbGRJbnQ4KDEsWCxYOC5OT05FKX1zdGF0aWMgYWRkSGVhZGVyKCQsWCl7JC5hZGRGaWVsZE9mZnNldCgyLFgsMCl9c3RhdGljIGFkZEJvZHlMZW5ndGgoJCxYKXskLmFkZEZpZWxkSW50NjQoMyxYLEJpZ0ludCgiMCIpKX1zdGF0aWMgYWRkQ3VzdG9tTWV0YWRhdGEoJCxYKXskLmFkZEZpZWxkT2Zmc2V0KDQsWCwwKX1zdGF0aWMgY3JlYXRlQ3VzdG9tTWV0YWRhdGFWZWN0b3IoJCxYKXskLnN0YXJ0VmVjdG9yKDQsWC5sZW5ndGgsNCk7Zm9yKGxldCBRPVgubGVuZ3RoLTE7UT49MDtRLS0pJC5hZGRPZmZzZXQoWFtRXSk7cmV0dXJuICQuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0Q3VzdG9tTWV0YWRhdGFWZWN0b3IoJCxYKXskLnN0YXJ0VmVjdG9yKDQsWCw0KX1zdGF0aWMgZW5kTWVzc2FnZSgkKXtyZXR1cm4gJC5lbmRPYmplY3QoKX1zdGF0aWMgZmluaXNoTWVzc2FnZUJ1ZmZlcigkLFgpeyQuZmluaXNoKFgpfXN0YXRpYyBmaW5pc2hTaXplUHJlZml4ZWRNZXNzYWdlQnVmZmVyKCQsWCl7JC5maW5pc2goWCx2b2lkIDAsITApfXN0YXRpYyBjcmVhdGVNZXNzYWdlKCQsWCxRLFosSixZKXtyZXR1cm4gdjguc3RhcnRNZXNzYWdlKCQpLHY4LmFkZFZlcnNpb24oJCxYKSx2OC5hZGRIZWFkZXJUeXBlKCQsUSksdjguYWRkSGVhZGVyKCQsWiksdjguYWRkQm9keUxlbmd0aCgkLEopLHY4LmFkZEN1c3RvbU1ldGFkYXRhKCQsWSksdjguZW5kTWVzc2FnZSgkKX19dmFyICQ1PUEoKCk9PntZOCgpO3pYKCk7ZFooKTtmWigpfSk7dmFyIFg1LG1KO3ZhciBRNT1BKCgpPT57ZTAoKTtSVygpO2NaKCk7alkoKTtNVygpO0xXKCk7RlcoKTtOVygpO09XKCk7a1coKTtBVygpO1JZKCk7VVkoKTt3WSgpO1ZZKCk7U1koKTtDWSgpO1VXKCk7Q1coKTtCWSgpO0FZKCk7T1koKTtrWSgpO0RZKCk7WDU9Y2xhc3MgWDUgZXh0ZW5kcyBUe3Zpc2l0KCQsWCl7cmV0dXJuICQ9PW51bGx8fFg9PW51bGw/dm9pZCAwOnN1cGVyLnZpc2l0KCQsWCl9dmlzaXROdWxsKCQsWCl7cmV0dXJuIG4xLnN0YXJ0TnVsbChYKSxuMS5lbmROdWxsKFgpfXZpc2l0SW50KCQsWCl7cmV0dXJuIFIwLnN0YXJ0SW50KFgpLFIwLmFkZEJpdFdpZHRoKFgsJC5iaXRXaWR0aCksUjAuYWRkSXNTaWduZWQoWCwkLmlzU2lnbmVkKSxSMC5lbmRJbnQoWCl9dmlzaXRGbG9hdCgkLFgpe3JldHVybiBWJC5zdGFydEZsb2F0aW5nUG9pbnQoWCksViQuYWRkUHJlY2lzaW9uKFgsJC5wcmVjaXNpb24pLFYkLmVuZEZsb2F0aW5nUG9pbnQoWCl9dmlzaXRCaW5hcnkoJCxYKXtyZXR1cm4gYjEuc3RhcnRCaW5hcnkoWCksYjEuZW5kQmluYXJ5KFgpfXZpc2l0QmluYXJ5VmlldygkLFgpe3JldHVybiBwMS5zdGFydEJpbmFyeVZpZXcoWCkscDEuZW5kQmluYXJ5VmlldyhYKX12aXNpdExhcmdlQmluYXJ5KCQsWCl7cmV0dXJuIHUxLnN0YXJ0TGFyZ2VCaW5hcnkoWCksdTEuZW5kTGFyZ2VCaW5hcnkoWCl9dmlzaXRCb29sKCQsWCl7cmV0dXJuIGMxLnN0YXJ0Qm9vbChYKSxjMS5lbmRCb29sKFgpfXZpc2l0VXRmOCgkLFgpe3JldHVybiBzMS5zdGFydFV0ZjgoWCksczEuZW5kVXRmOChYKX12aXNpdFV0ZjhWaWV3KCQsWCl7cmV0dXJuIHIxLnN0YXJ0VXRmOFZpZXcoWCkscjEuZW5kVXRmOFZpZXcoWCl9dmlzaXRMYXJnZVV0ZjgoJCxYKXtyZXR1cm4gZDEuc3RhcnRMYXJnZVV0ZjgoWCksZDEuZW5kTGFyZ2VVdGY4KFgpfXZpc2l0RGVjaW1hbCgkLFgpe3JldHVybiBDMC5zdGFydERlY2ltYWwoWCksQzAuYWRkU2NhbGUoWCwkLnNjYWxlKSxDMC5hZGRQcmVjaXNpb24oWCwkLnByZWNpc2lvbiksQzAuYWRkQml0V2lkdGgoWCwkLmJpdFdpZHRoKSxDMC5lbmREZWNpbWFsKFgpfXZpc2l0RGF0ZSgkLFgpe3JldHVybiBqJC5zdGFydERhdGUoWCksaiQuYWRkVW5pdChYLCQudW5pdCksaiQuZW5kRGF0ZShYKX12aXNpdFRpbWUoJCxYKXtyZXR1cm4gbjAuc3RhcnRUaW1lKFgpLG4wLmFkZFVuaXQoWCwkLnVuaXQpLG4wLmFkZEJpdFdpZHRoKFgsJC5iaXRXaWR0aCksbjAuZW5kVGltZShYKX12aXNpdFRpbWVzdGFtcCgkLFgpe2xldCBRPSQudGltZXpvbmUmJlguY3JlYXRlU3RyaW5nKCQudGltZXpvbmUpfHx2b2lkIDA7aWYobzAuc3RhcnRUaW1lc3RhbXAoWCksbzAuYWRkVW5pdChYLCQudW5pdCksUSE9PXZvaWQgMClvMC5hZGRUaW1lem9uZShYLFEpO3JldHVybiBvMC5lbmRUaW1lc3RhbXAoWCl9dmlzaXRJbnRlcnZhbCgkLFgpe3JldHVybiBCJC5zdGFydEludGVydmFsKFgpLEIkLmFkZFVuaXQoWCwkLnVuaXQpLEIkLmVuZEludGVydmFsKFgpfXZpc2l0RHVyYXRpb24oJCxYKXtyZXR1cm4gUyQuc3RhcnREdXJhdGlvbihYKSxTJC5hZGRVbml0KFgsJC51bml0KSxTJC5lbmREdXJhdGlvbihYKX12aXNpdExpc3QoJCxYKXtyZXR1cm4gbDEuc3RhcnRMaXN0KFgpLGwxLmVuZExpc3QoWCl9dmlzaXRTdHJ1Y3QoJCxYKXtyZXR1cm4gbzEuc3RhcnRTdHJ1Y3RfKFgpLG8xLmVuZFN0cnVjdF8oWCl9dmlzaXRVbmlvbigkLFgpe08wLnN0YXJ0VHlwZUlkc1ZlY3RvcihYLCQudHlwZUlkcy5sZW5ndGgpO2xldCBRPU8wLmNyZWF0ZVR5cGVJZHNWZWN0b3IoWCwkLnR5cGVJZHMpO3JldHVybiBPMC5zdGFydFVuaW9uKFgpLE8wLmFkZE1vZGUoWCwkLm1vZGUpLE8wLmFkZFR5cGVJZHMoWCxRKSxPMC5lbmRVbmlvbihYKX12aXNpdERpY3Rpb25hcnkoJCxYKXtsZXQgUT10aGlzLnZpc2l0KCQuaW5kaWNlcyxYKTtpZihoJC5zdGFydERpY3Rpb25hcnlFbmNvZGluZyhYKSxoJC5hZGRJZChYLEJpZ0ludCgkLmlkKSksaCQuYWRkSXNPcmRlcmVkKFgsJC5pc09yZGVyZWQpLFEhPT12b2lkIDApaCQuYWRkSW5kZXhUeXBlKFgsUSk7cmV0dXJuIGgkLmVuZERpY3Rpb25hcnlFbmNvZGluZyhYKX12aXNpdEZpeGVkU2l6ZUJpbmFyeSgkLFgpe3JldHVybiBEJC5zdGFydEZpeGVkU2l6ZUJpbmFyeShYKSxEJC5hZGRCeXRlV2lkdGgoWCwkLmJ5dGVXaWR0aCksRCQuZW5kRml4ZWRTaXplQmluYXJ5KFgpfXZpc2l0Rml4ZWRTaXplTGlzdCgkLFgpe3JldHVybiB3JC5zdGFydEZpeGVkU2l6ZUxpc3QoWCksdyQuYWRkTGlzdFNpemUoWCwkLmxpc3RTaXplKSx3JC5lbmRGaXhlZFNpemVMaXN0KFgpfXZpc2l0TWFwKCQsWCl7cmV0dXJuIEkkLnN0YXJ0TWFwKFgpLEkkLmFkZEtleXNTb3J0ZWQoWCwkLmtleXNTb3J0ZWQpLEkkLmVuZE1hcChYKX19O21KPW5ldyBYNX0pO2Z1bmN0aW9uIEg1KCQsWD1uZXcgTWFwKXtyZXR1cm4gbmV3IEIoUUcoJCxYKSxmSigkLm1ldGFkYXRhKSxYKX1mdW5jdGlvbiBlWSgkKXtyZXR1cm4gbmV3IGk4KCQuY291bnQsSzUoJC5jb2x1bW5zKSxQNSgkLmNvbHVtbnMpLG51bGwsRzUoJC5jb2x1bW5zKSl9ZnVuY3Rpb24gVzUoJCl7cmV0dXJuIG5ldyBoMChlWSgkLmRhdGEpLCQuaWQsJC5pc0RlbHRhKX1mdW5jdGlvbiBRRygkLFgpe3JldHVybigkLmZpZWxkc3x8W10pLmZpbHRlcihCb29sZWFuKS5tYXAoKFEpPT53LmZyb21KU09OKFEsWCkpfWZ1bmN0aW9uIFo1KCQsWCl7cmV0dXJuKCQuY2hpbGRyZW58fFtdKS5maWx0ZXIoQm9vbGVhbikubWFwKChRKT0+dy5mcm9tSlNPTihRLFgpKX1mdW5jdGlvbiBLNSgkKXtyZXR1cm4oJHx8W10pLnJlZHVjZSgoWCxRKT0+Wy4uLlgsbmV3IGQkKFEuY291bnQsWkcoUS5WQUxJRElUWSkpLC4uLks1KFEuY2hpbGRyZW4pXSxbXSl9ZnVuY3Rpb24gUDUoJCxYPVtdKXtmb3IobGV0IFE9LTEsWj0oJHx8W10pLmxlbmd0aDsrK1E8Wjspe2xldCBKPSRbUV07aWYoSi5WQUxJRElUWSYmWC5wdXNoKG5ldyBoOChYLmxlbmd0aCxKLlZBTElESVRZLmxlbmd0aCkpLEouVFlQRV9JRCYmWC5wdXNoKG5ldyBoOChYLmxlbmd0aCxKLlRZUEVfSUQubGVuZ3RoKSksSi5PRkZTRVQmJlgucHVzaChuZXcgaDgoWC5sZW5ndGgsSi5PRkZTRVQubGVuZ3RoKSksSi5EQVRBJiZYLnB1c2gobmV3IGg4KFgubGVuZ3RoLEouREFUQS5sZW5ndGgpKSxKLlZJRVdTJiZYLnB1c2gobmV3IGg4KFgubGVuZ3RoLEouVklFV1MubGVuZ3RoKSksSi5WQVJJQURJQ19EQVRBX0JVRkZFUlMpZm9yKGxldCBZIG9mIEouVkFSSUFESUNfREFUQV9CVUZGRVJTKVgucHVzaChuZXcgaDgoWC5sZW5ndGgsWS5sZW5ndGgpKTtYPVA1KEouY2hpbGRyZW4sWCl9cmV0dXJuIFh9ZnVuY3Rpb24gWkcoJCl7cmV0dXJuKCR8fFtdKS5yZWR1Y2UoKFgsUSk9PlgrICsoUT09PTApLDApfWZ1bmN0aW9uIEc1KCQpe3JldHVybigkfHxbXSkucmVkdWNlKChYLFEpPT5bLi4uWCwuLi5RLlZBUklBRElDX0RBVEFfQlVGRkVSUz9bUS5WQVJJQURJQ19EQVRBX0JVRkZFUlMubGVuZ3RoXTpbXSwuLi5HNShRLmNoaWxkcmVuKV0sW10pfWZ1bmN0aW9uIHE1KCQsWCl7bGV0IFEsWixKLFksSCxXO2lmKCFYfHwhKFk9JC5kaWN0aW9uYXJ5KSlIPVk1KCQsWjUoJCxYKSksSj1uZXcgdygkLm5hbWUsSCwkLm51bGxhYmxlLGZKKCQubWV0YWRhdGEpKTtlbHNlIGlmKCFYLmhhcyhRPVkuaWQpKVo9KFo9WS5pbmRleFR5cGUpP0o1KFopOm5ldyBaMCxYLnNldChRLEg9WTUoJCxaNSgkLFgpKSksVz1uZXcgczgoSCxaLFEsWS5pc09yZGVyZWQpLEo9bmV3IHcoJC5uYW1lLFcsJC5udWxsYWJsZSxmSigkLm1ldGFkYXRhKSk7ZWxzZSBaPShaPVkuaW5kZXhUeXBlKT9KNShaKTpuZXcgWjAsVz1uZXcgczgoWC5nZXQoUSksWixRLFkuaXNPcmRlcmVkKSxKPW5ldyB3KCQubmFtZSxXLCQubnVsbGFibGUsZkooJC5tZXRhZGF0YSkpO3JldHVybiBKfHxudWxsfWZ1bmN0aW9uIGZKKCQ9W10pe3JldHVybiBuZXcgTWFwKCQubWFwKCh7a2V5OlgsdmFsdWU6UX0pPT5bWCxRXSkpfWZ1bmN0aW9uIEo1KCQpe3JldHVybiBuZXcgZjgoJC5pc1NpZ25lZCwkLmJpdFdpZHRoKX1mdW5jdGlvbiBZNSgkLFgpe2xldCBRPSQudHlwZS5uYW1lO3N3aXRjaChRKXtjYXNlIk5PTkUiOnJldHVybiBuZXcgTzg7Y2FzZSJudWxsIjpyZXR1cm4gbmV3IE84O2Nhc2UiYmluYXJ5IjpyZXR1cm4gbmV3IFQwO2Nhc2UibGFyZ2ViaW5hcnkiOnJldHVybiBuZXcgZiQ7Y2FzZSJiaW5hcnl2aWV3IjpyZXR1cm4gbmV3IGE7Y2FzZSJ1dGY4IjpyZXR1cm4gbmV3IF84O2Nhc2UibGFyZ2V1dGY4IjpyZXR1cm4gbmV3IGIkO2Nhc2UidXRmOHZpZXciOnJldHVybiBuZXcgczA7Y2FzZSJib29sIjpyZXR1cm4gbmV3IFM4O2Nhc2UibGlzdCI6cmV0dXJuIG5ldyBFMCgoWHx8W10pWzBdKTtjYXNlInN0cnVjdCI6cmV0dXJuIG5ldyBsKFh8fFtdKTtjYXNlInN0cnVjdF8iOnJldHVybiBuZXcgbChYfHxbXSl9c3dpdGNoKFEpe2Nhc2UiaW50Ijp7bGV0IFo9JC50eXBlO3JldHVybiBuZXcgZjgoWi5pc1NpZ25lZCxaLmJpdFdpZHRoKX1jYXNlImZsb2F0aW5ncG9pbnQiOntsZXQgWj0kLnR5cGU7cmV0dXJuIG5ldyBHJCh6OFtaLnByZWNpc2lvbl0pfWNhc2UiZGVjaW1hbCI6e2xldCBaPSQudHlwZTtyZXR1cm4gbmV3IHEkKFouc2NhbGUsWi5wcmVjaXNpb24sWi5iaXRXaWR0aCl9Y2FzZSJkYXRlIjp7bGV0IFo9JC50eXBlO3JldHVybiBuZXcgcjAoSjhbWi51bml0XSl9Y2FzZSJ0aW1lIjp7bGV0IFo9JC50eXBlO3JldHVybiBuZXcgazAoT1taLnVuaXRdLFouYml0V2lkdGgpfWNhc2UidGltZXN0YW1wIjp7bGV0IFo9JC50eXBlO3JldHVybiBuZXcgUTAoT1taLnVuaXRdLFoudGltZXpvbmUpfWNhc2UiaW50ZXJ2YWwiOntsZXQgWj0kLnR5cGU7cmV0dXJuIG5ldyB4MChlW1oudW5pdF0pfWNhc2UiZHVyYXRpb24iOntsZXQgWj0kLnR5cGU7cmV0dXJuIG5ldyBqMChPW1oudW5pdF0pfWNhc2UidW5pb24iOntsZXQgWj0kLnR5cGUsW0osLi4uWV09KFoubW9kZSsiIikudG9Mb3dlckNhc2UoKSxIPUoudG9VcHBlckNhc2UoKStZLmpvaW4oIiIpO3JldHVybiBuZXcgaTAoJDhbSF0sWi50eXBlSWRzfHxbXSxYfHxbXSl9Y2FzZSJmaXhlZHNpemViaW5hcnkiOntsZXQgWj0kLnR5cGU7cmV0dXJuIG5ldyB6JChaLmJ5dGVXaWR0aCl9Y2FzZSJmaXhlZHNpemVsaXN0Ijp7bGV0IFo9JC50eXBlO3JldHVybiBuZXcgYTAoWi5saXN0U2l6ZSwoWHx8W10pWzBdKX1jYXNlIm1hcCI6e2xldCBaPSQudHlwZTtyZXR1cm4gbmV3IGcwKChYfHxbXSlbMF0sWi5rZXlzU29ydGVkKX19dGhyb3cgRXJyb3IoYFVucmVjb2duaXplZCB0eXBlOiAiJHtRfSJgKX12YXIgejU9QSgoKT0+e3YwKCk7TjgoKTtYNigpO1Y4KCl9KTtjbGFzcyBjOHtzdGF0aWMgZnJvbUpTT04oJCxYKXtsZXQgUT1uZXcgYzgoMCxxOC5WNSxYKTtyZXR1cm4gUS5fY3JlYXRlSGVhZGVyPUhHKCQsWCksUX1zdGF0aWMgZGVjb2RlKCQpeyQ9bmV3IFlHKHgoJCkpO2xldCBYPXY4LmdldFJvb3RBc01lc3NhZ2UoJCksUT1YLmJvZHlMZW5ndGgoKSxaPVgudmVyc2lvbigpLEo9WC5oZWFkZXJUeXBlKCksWT1BRyhYKSxIPW5ldyBjOChRLFosSix2b2lkIDAsWSk7cmV0dXJuIEguX2NyZWF0ZUhlYWRlcj1XRyhYLEopLEh9c3RhdGljIGVuY29kZSgkKXtsZXQgWD1uZXcgSkcsUT0tMTtpZigkLmlzU2NoZW1hKCkpUT1CLmVuY29kZShYLCQuaGVhZGVyKCkpO2Vsc2UgaWYoJC5pc1JlY29yZEJhdGNoKCkpUT1pOC5lbmNvZGUoWCwkLmhlYWRlcigpKTtlbHNlIGlmKCQuaXNEaWN0aW9uYXJ5QmF0Y2goKSlRPWgwLmVuY29kZShYLCQuaGVhZGVyKCkpO2xldCBaPSEoJC5tZXRhZGF0YSYmJC5tZXRhZGF0YS5zaXplPjApPy0xOnY4LmNyZWF0ZUN1c3RvbU1ldGFkYXRhVmVjdG9yKFgsWy4uLiQubWV0YWRhdGFdLm1hcCgoW0osWV0pPT57bGV0IEg9WC5jcmVhdGVTdHJpbmcoYCR7Sn1gKSxXPVguY3JlYXRlU3RyaW5nKGAke1l9YCk7cmV0dXJuIFU4LnN0YXJ0S2V5VmFsdWUoWCksVTguYWRkS2V5KFgsSCksVTguYWRkVmFsdWUoWCxXKSxVOC5lbmRLZXlWYWx1ZShYKX0pKTtpZih2OC5zdGFydE1lc3NhZ2UoWCksdjguYWRkVmVyc2lvbihYLHE4LlY1KSx2OC5hZGRIZWFkZXIoWCxRKSx2OC5hZGRIZWFkZXJUeXBlKFgsJC5oZWFkZXJUeXBlKSx2OC5hZGRCb2R5TGVuZ3RoKFgsQmlnSW50KCQuYm9keUxlbmd0aCkpLFohPT0tMSl2OC5hZGRDdXN0b21NZXRhZGF0YShYLFopO3JldHVybiB2OC5maW5pc2hNZXNzYWdlQnVmZmVyKFgsdjguZW5kTWVzc2FnZShYKSksWC5hc1VpbnQ4QXJyYXkoKX1zdGF0aWMgZnJvbSgkLFg9MCl7aWYoJCBpbnN0YW5jZW9mIEIpcmV0dXJuIG5ldyBjOCgwLHE4LlY1LFg4LlNjaGVtYSwkKTtpZigkIGluc3RhbmNlb2YgaTgpcmV0dXJuIG5ldyBjOChYLHE4LlY1LFg4LlJlY29yZEJhdGNoLCQsJC5tZXRhZGF0YSk7aWYoJCBpbnN0YW5jZW9mIGgwKXJldHVybiBuZXcgYzgoWCxxOC5WNSxYOC5EaWN0aW9uYXJ5QmF0Y2gsJCk7dGhyb3cgRXJyb3IoYFVucmVjb2duaXplZCBNZXNzYWdlIGhlYWRlcjogJHskfWApfWdldCB0eXBlKCl7cmV0dXJuIHRoaXMuaGVhZGVyVHlwZX1nZXQgdmVyc2lvbigpe3JldHVybiB0aGlzLl92ZXJzaW9ufWdldCBoZWFkZXJUeXBlKCl7cmV0dXJuIHRoaXMuX2hlYWRlclR5cGV9Z2V0IGNvbXByZXNzaW9uKCl7cmV0dXJuIHRoaXMuX2NvbXByZXNzaW9ufWdldCBib2R5TGVuZ3RoKCl7cmV0dXJuIHRoaXMuX2JvZHlMZW5ndGh9Z2V0IG1ldGFkYXRhKCl7cmV0dXJuIHRoaXMuX21ldGFkYXRhfWhlYWRlcigpe3JldHVybiB0aGlzLl9jcmVhdGVIZWFkZXIoKX1pc1NjaGVtYSgpe3JldHVybiB0aGlzLmhlYWRlclR5cGU9PT1YOC5TY2hlbWF9aXNSZWNvcmRCYXRjaCgpe3JldHVybiB0aGlzLmhlYWRlclR5cGU9PT1YOC5SZWNvcmRCYXRjaH1pc0RpY3Rpb25hcnlCYXRjaCgpe3JldHVybiB0aGlzLmhlYWRlclR5cGU9PT1YOC5EaWN0aW9uYXJ5QmF0Y2h9Y29uc3RydWN0b3IoJCxYLFEsWixKKXt0aGlzLl92ZXJzaW9uPVgsdGhpcy5faGVhZGVyVHlwZT1RLHRoaXMuYm9keT1uZXcgVWludDhBcnJheSgwKSx0aGlzLl9jb21wcmVzc2lvbj1aPT09bnVsbHx8Wj09PXZvaWQgMD92b2lkIDA6Wi5jb21wcmVzc2lvbixaJiYodGhpcy5fY3JlYXRlSGVhZGVyPSgpPT5aKSx0aGlzLl9ib2R5TGVuZ3RoPVc4KCQpLHRoaXMuX21ldGFkYXRhPUp8fG5ldyBNYXB9fWNsYXNzIGk4e2dldCBub2Rlcygpe3JldHVybiB0aGlzLl9ub2Rlc31nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuX2xlbmd0aH1nZXQgYnVmZmVycygpe3JldHVybiB0aGlzLl9idWZmZXJzfWdldCBjb21wcmVzc2lvbigpe3JldHVybiB0aGlzLl9jb21wcmVzc2lvbn1nZXQgdmFyaWFkaWNCdWZmZXJDb3VudHMoKXtyZXR1cm4gdGhpcy5fdmFyaWFkaWNCdWZmZXJDb3VudHN9Z2V0IG1ldGFkYXRhKCl7cmV0dXJuIHRoaXMuX21ldGFkYXRhfWNvbnN0cnVjdG9yKCQsWCxRLFosSj1bXSxZKXt0aGlzLl9ub2Rlcz1YLHRoaXMuX2J1ZmZlcnM9USx0aGlzLl9sZW5ndGg9VzgoJCksdGhpcy5fY29tcHJlc3Npb249Wix0aGlzLl92YXJpYWRpY0J1ZmZlckNvdW50cz1KLHRoaXMuX21ldGFkYXRhPVl8fG5ldyBNYXB9fWNsYXNzIGgwe2dldCBpZCgpe3JldHVybiB0aGlzLl9pZH1nZXQgZGF0YSgpe3JldHVybiB0aGlzLl9kYXRhfWdldCBpc0RlbHRhKCl7cmV0dXJuIHRoaXMuX2lzRGVsdGF9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmRhdGEubGVuZ3RofWdldCBub2Rlcygpe3JldHVybiB0aGlzLmRhdGEubm9kZXN9Z2V0IGJ1ZmZlcnMoKXtyZXR1cm4gdGhpcy5kYXRhLmJ1ZmZlcnN9Y29uc3RydWN0b3IoJCxYLFE9ITEpe3RoaXMuX2RhdGE9JCx0aGlzLl9pc0RlbHRhPVEsdGhpcy5faWQ9VzgoWCl9fWNsYXNzIGg4e2NvbnN0cnVjdG9yKCQsWCl7dGhpcy5vZmZzZXQ9VzgoJCksdGhpcy5sZW5ndGg9VzgoWCl9fWNsYXNzIGQke2NvbnN0cnVjdG9yKCQsWCl7dGhpcy5sZW5ndGg9VzgoJCksdGhpcy5udWxsQ291bnQ9VzgoWCl9fWNsYXNzIEJYe2NvbnN0cnVjdG9yKCQsWD1SNi5CVUZGRVIpe3RoaXMudHlwZT0kLHRoaXMubWV0aG9kPVh9fWZ1bmN0aW9uIEhHKCQsWCl7cmV0dXJuKCk9Pntzd2l0Y2goWCl7Y2FzZSBYOC5TY2hlbWE6cmV0dXJuIEIuZnJvbUpTT04oJCk7Y2FzZSBYOC5SZWNvcmRCYXRjaDpyZXR1cm4gaTguZnJvbUpTT04oJCk7Y2FzZSBYOC5EaWN0aW9uYXJ5QmF0Y2g6cmV0dXJuIGgwLmZyb21KU09OKCQpfXRocm93IEVycm9yKGBVbnJlY29nbml6ZWQgTWVzc2FnZSB0eXBlOiB7IG5hbWU6ICR7WDhbWF19LCB0eXBlOiAke1h9IH1gKX19ZnVuY3Rpb24gV0coJCxYKXtyZXR1cm4oKT0+e3N3aXRjaChYKXtjYXNlIFg4LlNjaGVtYTpyZXR1cm4gQi5kZWNvZGUoJC5oZWFkZXIobmV3IGc4KSxuZXcgTWFwLCQudmVyc2lvbigpKTtjYXNlIFg4LlJlY29yZEJhdGNoOnJldHVybiBpOC5kZWNvZGUoJC5oZWFkZXIobmV3IHEwKSwkLnZlcnNpb24oKSk7Y2FzZSBYOC5EaWN0aW9uYXJ5QmF0Y2g6cmV0dXJuIGgwLmRlY29kZSgkLmhlYWRlcihuZXcgSjEpLCQudmVyc2lvbigpKX10aHJvdyBFcnJvcihgVW5yZWNvZ25pemVkIE1lc3NhZ2UgdHlwZTogeyBuYW1lOiAke1g4W1hdfSwgdHlwZTogJHtYfSB9YCl9fWZ1bmN0aW9uIEtHKCQsWD1uZXcgTWFwLFE9cTguVjUpe2xldCBaPU5HKCQsWCk7cmV0dXJuIG5ldyBCKFosYkooJCksWCxRKX1mdW5jdGlvbiBQRygkLFg9cTguVjUpe3JldHVybiBuZXcgaTgoJC5sZW5ndGgoKSxFRygkKSxNRygkLFgpLE41KCQuY29tcHJlc3Npb24oKSksTEcoJCkpfWZ1bmN0aW9uIEdHKCQsWD1xOC5WNSl7cmV0dXJuIG5ldyBoMChpOC5kZWNvZGUoJC5kYXRhKCksWCksJC5pZCgpLCQuaXNEZWx0YSgpKX1mdW5jdGlvbiBxRygkKXtyZXR1cm4gbmV3IGg4KCQub2Zmc2V0KCksJC5sZW5ndGgoKSl9ZnVuY3Rpb24gekcoJCl7cmV0dXJuIG5ldyBkJCgkLmxlbmd0aCgpLCQubnVsbENvdW50KCkpfWZ1bmN0aW9uIEVHKCQpe2xldCBYPVtdO2ZvcihsZXQgUSxaPS0xLEo9LTEsWT0kLm5vZGVzTGVuZ3RoKCk7KytaPFk7KWlmKFE9JC5ub2RlcyhaKSlYWysrSl09ZCQuZGVjb2RlKFEpO3JldHVybiBYfWZ1bmN0aW9uIE1HKCQsWCl7bGV0IFE9W107Zm9yKGxldCBaLEo9LTEsWT0tMSxIPSQuYnVmZmVyc0xlbmd0aCgpOysrSjxIOylpZihaPSQuYnVmZmVycyhKKSl7aWYoWDxxOC5WNClaLmJiX3Bvcys9OCooSisxKTtRWysrWV09aDguZGVjb2RlKFopfXJldHVybiBRfWZ1bmN0aW9uIExHKCQpe2xldCBYPVtdLFE9TWF0aC50cnVuYygkLnZhcmlhZGljQnVmZmVyQ291bnRzTGVuZ3RoKCkpO2ZvcihsZXQgWj0wO1o8UTsrK1opWC5wdXNoKFc4KCQudmFyaWFkaWNCdWZmZXJDb3VudHMoWikpKTtyZXR1cm4gWH1mdW5jdGlvbiBORygkLFgpe2xldCBRPVtdO2ZvcihsZXQgWixKPS0xLFk9LTEsSD0kLmZpZWxkc0xlbmd0aCgpOysrSjxIOylpZihaPSQuZmllbGRzKEopKVFbKytZXT13LmRlY29kZShaLFgpO3JldHVybiBRfWZ1bmN0aW9uIEU1KCQsWCl7bGV0IFE9W107Zm9yKGxldCBaLEo9LTEsWT0tMSxIPSQuY2hpbGRyZW5MZW5ndGgoKTsrK0o8SDspaWYoWj0kLmNoaWxkcmVuKEopKVFbKytZXT13LmRlY29kZShaLFgpO3JldHVybiBRfWZ1bmN0aW9uIEZHKCQsWCl7bGV0IFEsWixKLFksSCxXO2lmKCFYfHwhKFc9JC5kaWN0aW9uYXJ5KCkpKUo9TDUoJCxFNSgkLFgpKSxaPW5ldyB3KCQubmFtZSgpLEosJC5udWxsYWJsZSgpLGJKKCQpKTtlbHNlIGlmKCFYLmhhcyhRPVc4KFcuaWQoKSkpKVk9KFk9Vy5pbmRleFR5cGUoKSk/TTUoWSk6bmV3IFowLFguc2V0KFEsSj1MNSgkLEU1KCQsWCkpKSxIPW5ldyBzOChKLFksUSxXLmlzT3JkZXJlZCgpKSxaPW5ldyB3KCQubmFtZSgpLEgsJC5udWxsYWJsZSgpLGJKKCQpKTtlbHNlIFk9KFk9Vy5pbmRleFR5cGUoKSk/TTUoWSk6bmV3IFowLEg9bmV3IHM4KFguZ2V0KFEpLFksUSxXLmlzT3JkZXJlZCgpKSxaPW5ldyB3KCQubmFtZSgpLEgsJC5udWxsYWJsZSgpLGJKKCQpKTtyZXR1cm4gWnx8bnVsbH1mdW5jdGlvbiBiSigkKXtsZXQgWD1uZXcgTWFwO2lmKCQpe2ZvcihsZXQgUSxaLEo9LTEsWT1NYXRoLnRydW5jKCQuY3VzdG9tTWV0YWRhdGFMZW5ndGgoKSk7KytKPFk7KWlmKChRPSQuY3VzdG9tTWV0YWRhdGEoSikpJiYoWj1RLmtleSgpKSE9bnVsbClYLnNldChaLFEudmFsdWUoKSl9cmV0dXJuIFh9ZnVuY3Rpb24gQUcoJCl7bGV0IFg9bmV3IE1hcDtmb3IobGV0IFEsWixKPS0xLFk9TWF0aC50cnVuYygkLmN1c3RvbU1ldGFkYXRhTGVuZ3RoKCkpOysrSjxZOylpZigoUT0kLmN1c3RvbU1ldGFkYXRhKEopKSYmKFo9US5rZXkoKSkhPW51bGwpWC5zZXQoWixRLnZhbHVlKCkpO3JldHVybiBYfWZ1bmN0aW9uIE01KCQpe3JldHVybiBuZXcgZjgoJC5pc1NpZ25lZCgpLCQuYml0V2lkdGgoKSl9ZnVuY3Rpb24gTDUoJCxYKXtsZXQgUT0kLnR5cGVUeXBlKCk7c3dpdGNoKFEpe2Nhc2UgcC5OT05FOnJldHVybiBuZXcgTzg7Y2FzZSBwLk51bGw6cmV0dXJuIG5ldyBPODtjYXNlIHAuQmluYXJ5OnJldHVybiBuZXcgVDA7Y2FzZSBwLkxhcmdlQmluYXJ5OnJldHVybiBuZXcgZiQ7Y2FzZSBwLkJpbmFyeVZpZXc6cmV0dXJuIG5ldyBhO2Nhc2UgcC5VdGY4OnJldHVybiBuZXcgXzg7Y2FzZSBwLkxhcmdlVXRmODpyZXR1cm4gbmV3IGIkO2Nhc2UgcC5VdGY4VmlldzpyZXR1cm4gbmV3IHMwO2Nhc2UgcC5Cb29sOnJldHVybiBuZXcgUzg7Y2FzZSBwLkxpc3Q6cmV0dXJuIG5ldyBFMCgoWHx8W10pWzBdKTtjYXNlIHAuU3RydWN0XzpyZXR1cm4gbmV3IGwoWHx8W10pfXN3aXRjaChRKXtjYXNlIHAuSW50OntsZXQgWj0kLnR5cGUobmV3IFIwKTtyZXR1cm4gbmV3IGY4KFouaXNTaWduZWQoKSxaLmJpdFdpZHRoKCkpfWNhc2UgcC5GbG9hdGluZ1BvaW50OntsZXQgWj0kLnR5cGUobmV3IFYkKTtyZXR1cm4gbmV3IEckKFoucHJlY2lzaW9uKCkpfWNhc2UgcC5EZWNpbWFsOntsZXQgWj0kLnR5cGUobmV3IEMwKTtyZXR1cm4gbmV3IHEkKFouc2NhbGUoKSxaLnByZWNpc2lvbigpLFouYml0V2lkdGgoKSl9Y2FzZSBwLkRhdGU6e2xldCBaPSQudHlwZShuZXcgaiQpO3JldHVybiBuZXcgcjAoWi51bml0KCkpfWNhc2UgcC5UaW1lOntsZXQgWj0kLnR5cGUobmV3IG4wKTtyZXR1cm4gbmV3IGswKFoudW5pdCgpLFouYml0V2lkdGgoKSl9Y2FzZSBwLlRpbWVzdGFtcDp7bGV0IFo9JC50eXBlKG5ldyBvMCk7cmV0dXJuIG5ldyBRMChaLnVuaXQoKSxaLnRpbWV6b25lKCkpfWNhc2UgcC5JbnRlcnZhbDp7bGV0IFo9JC50eXBlKG5ldyBCJCk7cmV0dXJuIG5ldyB4MChaLnVuaXQoKSl9Y2FzZSBwLkR1cmF0aW9uOntsZXQgWj0kLnR5cGUobmV3IFMkKTtyZXR1cm4gbmV3IGowKFoudW5pdCgpKX1jYXNlIHAuVW5pb246e2xldCBaPSQudHlwZShuZXcgTzApO3JldHVybiBuZXcgaTAoWi5tb2RlKCksWi50eXBlSWRzQXJyYXkoKXx8W10sWHx8W10pfWNhc2UgcC5GaXhlZFNpemVCaW5hcnk6e2xldCBaPSQudHlwZShuZXcgRCQpO3JldHVybiBuZXcgeiQoWi5ieXRlV2lkdGgoKSl9Y2FzZSBwLkZpeGVkU2l6ZUxpc3Q6e2xldCBaPSQudHlwZShuZXcgdyQpO3JldHVybiBuZXcgYTAoWi5saXN0U2l6ZSgpLChYfHxbXSlbMF0pfWNhc2UgcC5NYXA6e2xldCBaPSQudHlwZShuZXcgSSQpO3JldHVybiBuZXcgZzAoKFh8fFtdKVswXSxaLmtleXNTb3J0ZWQoKSl9fXRocm93IEVycm9yKGBVbnJlY29nbml6ZWQgdHlwZTogIiR7cFtRXX0iICgke1F9KWApfWZ1bmN0aW9uIE41KCQpe3JldHVybiAkP25ldyBCWCgkLmNvZGVjKCksJC5tZXRob2QoKSk6bnVsbH1mdW5jdGlvbiBVRygkLFgpe2xldCBRPVguZmllbGRzLm1hcCgoWSk9PncuZW5jb2RlKCQsWSkpO2c4LnN0YXJ0RmllbGRzVmVjdG9yKCQsUS5sZW5ndGgpO2xldCBaPWc4LmNyZWF0ZUZpZWxkc1ZlY3RvcigkLFEpLEo9IShYLm1ldGFkYXRhJiZYLm1ldGFkYXRhLnNpemU+MCk/LTE6ZzguY3JlYXRlQ3VzdG9tTWV0YWRhdGFWZWN0b3IoJCxbLi4uWC5tZXRhZGF0YV0ubWFwKChbWSxIXSk9PntsZXQgVz0kLmNyZWF0ZVN0cmluZyhgJHtZfWApLFA9JC5jcmVhdGVTdHJpbmcoYCR7SH1gKTtyZXR1cm4gVTguc3RhcnRLZXlWYWx1ZSgkKSxVOC5hZGRLZXkoJCxXKSxVOC5hZGRWYWx1ZSgkLFApLFU4LmVuZEtleVZhbHVlKCQpfSkpO2lmKGc4LnN0YXJ0U2NoZW1hKCQpLGc4LmFkZEZpZWxkcygkLFopLGc4LmFkZEVuZGlhbm5lc3MoJCxTRz9mMS5MaXR0bGU6ZjEuQmlnKSxKIT09LTEpZzguYWRkQ3VzdG9tTWV0YWRhdGEoJCxKKTtyZXR1cm4gZzguZW5kU2NoZW1hKCQpfWZ1bmN0aW9uIFJHKCQsWCl7bGV0IFE9LTEsWj0tMSxKPS0xLFk9WC50eXBlLEg9WC50eXBlSWQ7aWYoIVIuaXNEaWN0aW9uYXJ5KFkpKVo9bUoudmlzaXQoWSwkKTtlbHNlIEg9WS5kaWN0aW9uYXJ5LnR5cGVJZCxKPW1KLnZpc2l0KFksJCksWj1tSi52aXNpdChZLmRpY3Rpb25hcnksJCk7bGV0IFc9KFkuY2hpbGRyZW58fFtdKS5tYXAoKHEpPT53LmVuY29kZSgkLHEpKSxQPVgwLmNyZWF0ZUNoaWxkcmVuVmVjdG9yKCQsVyksRz0hKFgubWV0YWRhdGEmJlgubWV0YWRhdGEuc2l6ZT4wKT8tMTpYMC5jcmVhdGVDdXN0b21NZXRhZGF0YVZlY3RvcigkLFsuLi5YLm1ldGFkYXRhXS5tYXAoKFtxLExdKT0+e2xldCBOPSQuY3JlYXRlU3RyaW5nKGAke3F9YCksVT0kLmNyZWF0ZVN0cmluZyhgJHtMfWApO3JldHVybiBVOC5zdGFydEtleVZhbHVlKCQpLFU4LmFkZEtleSgkLE4pLFU4LmFkZFZhbHVlKCQsVSksVTguZW5kS2V5VmFsdWUoJCl9KSk7aWYoWC5uYW1lKVE9JC5jcmVhdGVTdHJpbmcoWC5uYW1lKTtpZihYMC5zdGFydEZpZWxkKCQpLFgwLmFkZFR5cGUoJCxaKSxYMC5hZGRUeXBlVHlwZSgkLEgpLFgwLmFkZENoaWxkcmVuKCQsUCksWDAuYWRkTnVsbGFibGUoJCwhIVgubnVsbGFibGUpLFEhPT0tMSlYMC5hZGROYW1lKCQsUSk7aWYoSiE9PS0xKVgwLmFkZERpY3Rpb25hcnkoJCxKKTtpZihHIT09LTEpWDAuYWRkQ3VzdG9tTWV0YWRhdGEoJCxHKTtyZXR1cm4gWDAuZW5kRmllbGQoJCl9ZnVuY3Rpb24gQ0coJCxYKXtsZXQgUT1YLm5vZGVzfHxbXSxaPVguYnVmZmVyc3x8W10sSj1YLnZhcmlhZGljQnVmZmVyQ291bnRzfHxbXTtxMC5zdGFydE5vZGVzVmVjdG9yKCQsUS5sZW5ndGgpO2ZvcihsZXQgRyBvZiBRLnNsaWNlKCkucmV2ZXJzZSgpKWQkLmVuY29kZSgkLEcpO2xldCBZPSQuZW5kVmVjdG9yKCk7cTAuc3RhcnRCdWZmZXJzVmVjdG9yKCQsWi5sZW5ndGgpO2ZvcihsZXQgRyBvZiBaLnNsaWNlKCkucmV2ZXJzZSgpKWg4LmVuY29kZSgkLEcpO2xldCBIPSQuZW5kVmVjdG9yKCksVz1udWxsO2lmKFguY29tcHJlc3Npb24hPT1udWxsKVc9RjUoJCxYLmNvbXByZXNzaW9uKTtsZXQgUD0tMTtpZihKLmxlbmd0aD4wKVA9cTAuY3JlYXRlVmFyaWFkaWNCdWZmZXJDb3VudHNWZWN0b3IoJCxKLm1hcChCaWdJbnQpKTtpZihxMC5zdGFydFJlY29yZEJhdGNoKCQpLHEwLmFkZExlbmd0aCgkLEJpZ0ludChYLmxlbmd0aCkpLHEwLmFkZE5vZGVzKCQsWSkscTAuYWRkQnVmZmVycygkLEgpLFguY29tcHJlc3Npb24hPT1udWxsJiZXKXEwLmFkZENvbXByZXNzaW9uKCQsVyk7aWYoUCE9PS0xKXEwLmFkZFZhcmlhZGljQnVmZmVyQ291bnRzKCQsUCk7cmV0dXJuIHEwLmVuZFJlY29yZEJhdGNoKCQpfWZ1bmN0aW9uIEY1KCQsWCl7cmV0dXJuIGwwLnN0YXJ0Qm9keUNvbXByZXNzaW9uKCQpLGwwLmFkZENvZGVjKCQsWC50eXBlKSxsMC5hZGRNZXRob2QoJCxYLm1ldGhvZCksbDAuZW5kQm9keUNvbXByZXNzaW9uKCQpfWZ1bmN0aW9uIE9HKCQsWCl7bGV0IFE9aTguZW5jb2RlKCQsWC5kYXRhKTtyZXR1cm4gSjEuc3RhcnREaWN0aW9uYXJ5QmF0Y2goJCksSjEuYWRkSWQoJCxCaWdJbnQoWC5pZCkpLEoxLmFkZElzRGVsdGEoJCxYLmlzRGVsdGEpLEoxLmFkZERhdGEoJCxRKSxKMS5lbmREaWN0aW9uYXJ5QmF0Y2goJCl9ZnVuY3Rpb24ga0coJCxYKXtyZXR1cm4gRFEuY3JlYXRlRmllbGROb2RlKCQsQmlnSW50KFgubGVuZ3RoKSxCaWdJbnQoWC5udWxsQ291bnQpKX1mdW5jdGlvbiBqRygkLFgpe3JldHVybiBTUS5jcmVhdGVCdWZmZXIoJCxCaWdJbnQoWC5vZmZzZXQpLEJpZ0ludChYLmxlbmd0aCkpfXZhciBKRyxZRyxTRzt2YXIgWDY9QSgoKT0+e1k4KCk7X1koKTtjWigpO05ZKCk7elcoKTtJWSgpO3VaKCk7elgoKTtGWSgpO2pZKCk7UlkoKTtVWSgpO3dZKCk7VlkoKTtTWSgpO0NZKCk7QlkoKTtPWSgpO2tZKCk7RFkoKTskNSgpO0xZKCk7TVkoKTt2MCgpO284KCk7VjgoKTtRNSgpO3o1KCk7TjgoKTtKRz1VNixZRz1QMDt3LmVuY29kZT1SRzt3LmRlY29kZT1GRzt3LmZyb21KU09OPXE1O0IuZW5jb2RlPVVHO0IuZGVjb2RlPUtHO0IuZnJvbUpTT049SDU7aTguZW5jb2RlPUNHO2k4LmRlY29kZT1QRztpOC5mcm9tSlNPTj1lWTtoMC5lbmNvZGU9T0c7aDAuZGVjb2RlPUdHO2gwLmZyb21KU09OPVc1O2QkLmVuY29kZT1rRztkJC5kZWNvZGU9ekc7aDguZW5jb2RlPWpHO2g4LmRlY29kZT1xRztCWC5lbmNvZGU9RjU7QlguZGVjb2RlPU41O1NHPSgoKT0+e2xldCAkPW5ldyBBcnJheUJ1ZmZlcigyKTtyZXR1cm4gbmV3IERhdGFWaWV3KCQpLnNldEludDE2KDAsMjU2LCEwKSxuZXcgSW50MTZBcnJheSgkKVswXT09PTI1Nn0pKCl9KTtjbGFzcyBwSntjb25zdHJ1Y3RvcigkKXt0aGlzLl9qc29uPSR9Z2V0IHNjaGVtYSgpe3JldHVybiB0aGlzLl9qc29uLnNjaGVtYX1nZXQgYmF0Y2hlcygpe3JldHVybiB0aGlzLl9qc29uLmJhdGNoZXN8fFtdfWdldCBkaWN0aW9uYXJpZXMoKXtyZXR1cm4gdGhpcy5fanNvbi5kaWN0aW9uYXJpZXN8fFtdfX1jbGFzcyBJWHt0ZWUoKXtyZXR1cm4gdGhpcy5fZ2V0RE9NU3RyZWFtKCkudGVlKCl9cGlwZSgkLFgpe3JldHVybiB0aGlzLl9nZXROb2RlU3RyZWFtKCkucGlwZSgkLFgpfXBpcGVUbygkLFgpe3JldHVybiB0aGlzLl9nZXRET01TdHJlYW0oKS5waXBlVG8oJCxYKX1waXBlVGhyb3VnaCgkLFgpe3JldHVybiB0aGlzLl9nZXRET01TdHJlYW0oKS5waXBlVGhyb3VnaCgkLFgpfV9nZXRET01TdHJlYW0oKXtyZXR1cm4gdGhpcy5fRE9NU3RyZWFtfHwodGhpcy5fRE9NU3RyZWFtPXRoaXMudG9ET01TdHJlYW0oKSl9X2dldE5vZGVTdHJlYW0oKXtyZXR1cm4gdGhpcy5fbm9kZVN0cmVhbXx8KHRoaXMuX25vZGVTdHJlYW09dGhpcy50b05vZGVTdHJlYW0oKSl9fXZhciBDOCwkMjt2YXIgcFE9QSgoKT0+e2QwKCk7Q1EoKTtDOD1PYmplY3QuZnJlZXplKHtkb25lOiEwLHZhbHVlOnZvaWQgMH0pOyQyPWNsYXNzICQyIGV4dGVuZHMgSVh7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX3ZhbHVlcz1bXSx0aGlzLnJlc29sdmVycz1bXSx0aGlzLl9jbG9zZWRQcm9taXNlPW5ldyBQcm9taXNlKCgkKT0+dGhpcy5fY2xvc2VkUHJvbWlzZVJlc29sdmU9JCl9Z2V0IGNsb3NlZCgpe3JldHVybiB0aGlzLl9jbG9zZWRQcm9taXNlfWNhbmNlbCgkKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5yZXR1cm4oJCl9KX13cml0ZSgkKXtpZih0aGlzLl9lbnN1cmVPcGVuKCkpdGhpcy5yZXNvbHZlcnMubGVuZ3RoPD0wP3RoaXMuX3ZhbHVlcy5wdXNoKCQpOnRoaXMucmVzb2x2ZXJzLnNoaWZ0KCkucmVzb2x2ZSh7ZG9uZTohMSx2YWx1ZTokfSl9YWJvcnQoJCl7aWYodGhpcy5fY2xvc2VkUHJvbWlzZVJlc29sdmUpdGhpcy5yZXNvbHZlcnMubGVuZ3RoPD0wP3RoaXMuX2Vycm9yPXtlcnJvcjokfTp0aGlzLnJlc29sdmVycy5zaGlmdCgpLnJlamVjdCh7ZG9uZTohMCx2YWx1ZTokfSl9Y2xvc2UoKXtpZih0aGlzLl9jbG9zZWRQcm9taXNlUmVzb2x2ZSl7bGV0e3Jlc29sdmVyczokfT10aGlzO3doaWxlKCQubGVuZ3RoPjApJC5zaGlmdCgpLnJlc29sdmUoQzgpO3RoaXMuX2Nsb3NlZFByb21pc2VSZXNvbHZlKCksdGhpcy5fY2xvc2VkUHJvbWlzZVJlc29sdmU9dm9pZCAwfX1bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7cmV0dXJuIHRoaXN9dG9ET01TdHJlYW0oJCl7cmV0dXJuIEswLnRvRE9NU3RyZWFtKHRoaXMuX2Nsb3NlZFByb21pc2VSZXNvbHZlfHx0aGlzLl9lcnJvcj90aGlzOnRoaXMuX3ZhbHVlcywkKX10b05vZGVTdHJlYW0oJCl7cmV0dXJuIEswLnRvTm9kZVN0cmVhbSh0aGlzLl9jbG9zZWRQcm9taXNlUmVzb2x2ZXx8dGhpcy5fZXJyb3I/dGhpczp0aGlzLl92YWx1ZXMsJCl9dGhyb3coJCl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLmFib3J0KCQpLEM4fSl9cmV0dXJuKCQpe3JldHVybiBWKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5jbG9zZSgpLEM4fSl9cmVhZCgkKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7cmV0dXJuKHlpZWxkIHRoaXMubmV4dCgkLCJyZWFkIikpLnZhbHVlfSl9cGVlaygkKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7cmV0dXJuKHlpZWxkIHRoaXMubmV4dCgkLCJwZWVrIikpLnZhbHVlfSl9bmV4dCguLi4kKXtpZih0aGlzLl92YWx1ZXMubGVuZ3RoPjApcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7ZG9uZTohMSx2YWx1ZTp0aGlzLl92YWx1ZXMuc2hpZnQoKX0pO2Vsc2UgaWYodGhpcy5fZXJyb3IpcmV0dXJuIFByb21pc2UucmVqZWN0KHtkb25lOiEwLHZhbHVlOnRoaXMuX2Vycm9yLmVycm9yfSk7ZWxzZSBpZighdGhpcy5fY2xvc2VkUHJvbWlzZVJlc29sdmUpcmV0dXJuIFByb21pc2UucmVzb2x2ZShDOCk7ZWxzZSByZXR1cm4gbmV3IFByb21pc2UoKFgsUSk9Pnt0aGlzLnJlc29sdmVycy5wdXNoKHtyZXNvbHZlOlgscmVqZWN0OlF9KX0pfV9lbnN1cmVPcGVuKCl7aWYodGhpcy5fY2xvc2VkUHJvbWlzZVJlc29sdmUpcmV0dXJuITA7dGhyb3cgRXJyb3IoIkFzeW5jUXVldWUgaXMgY2xvc2VkIil9fX0pO2NsYXNzIFU1e2NvbnN0cnVjdG9yKCQpe3RoaXMuc291cmNlPSR9Y2FuY2VsKCQpe3RoaXMucmV0dXJuKCQpfXBlZWsoJCl7cmV0dXJuIHRoaXMubmV4dCgkLCJwZWVrIikudmFsdWV9cmVhZCgkKXtyZXR1cm4gdGhpcy5uZXh0KCQsInJlYWQiKS52YWx1ZX1uZXh0KCQsWD0icmVhZCIpe3JldHVybiB0aGlzLnNvdXJjZS5uZXh0KHtjbWQ6WCxzaXplOiR9KX10aHJvdygkKXtyZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzLnNvdXJjZS50aHJvdyYmdGhpcy5zb3VyY2UudGhyb3coJCl8fEM4KX1yZXR1cm4oJCl7cmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcy5zb3VyY2UucmV0dXJuJiZ0aGlzLnNvdXJjZS5yZXR1cm4oJCl8fEM4KX19Y2xhc3MgUTZ7Y29uc3RydWN0b3IoJCl7dGhpcy5zb3VyY2U9JCx0aGlzLl9jbG9zZWRQcm9taXNlPW5ldyBQcm9taXNlKChYKT0+dGhpcy5fY2xvc2VkUHJvbWlzZVJlc29sdmU9WCl9Y2FuY2VsKCQpe3JldHVybiBWKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLnJldHVybigkKX0pfWdldCBjbG9zZWQoKXtyZXR1cm4gdGhpcy5fY2xvc2VkUHJvbWlzZX1yZWFkKCQpe3JldHVybiBWKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5uZXh0KCQsInJlYWQiKSkudmFsdWV9KX1wZWVrKCQpe3JldHVybiBWKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5uZXh0KCQsInBlZWsiKSkudmFsdWV9KX1uZXh0KCQpe3JldHVybiBWKHRoaXMsYXJndW1lbnRzLHZvaWQgMCxmdW5jdGlvbiooWCxRPSJyZWFkIil7cmV0dXJuIHlpZWxkIHRoaXMuc291cmNlLm5leHQoe2NtZDpRLHNpemU6WH0pfSl9dGhyb3coJCl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2xldCBYPXRoaXMuc291cmNlLnRocm93JiYoeWllbGQgdGhpcy5zb3VyY2UudGhyb3coJCkpfHxDODtyZXR1cm4gdGhpcy5fY2xvc2VkUHJvbWlzZVJlc29sdmUmJnRoaXMuX2Nsb3NlZFByb21pc2VSZXNvbHZlKCksdGhpcy5fY2xvc2VkUHJvbWlzZVJlc29sdmU9dm9pZCAwLE9iamVjdC5jcmVhdGUoWCl9KX1yZXR1cm4oJCl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2xldCBYPXRoaXMuc291cmNlLnJldHVybiYmKHlpZWxkIHRoaXMuc291cmNlLnJldHVybigkKSl8fEM4O3JldHVybiB0aGlzLl9jbG9zZWRQcm9taXNlUmVzb2x2ZSYmdGhpcy5fY2xvc2VkUHJvbWlzZVJlc29sdmUoKSx0aGlzLl9jbG9zZWRQcm9taXNlUmVzb2x2ZT12b2lkIDAsT2JqZWN0LmNyZWF0ZShYKX0pfX12YXIgbCQsbiQsWCQ7dmFyIFo2PUEoKCk9PntkMCgpO0NRKCk7VTEoKTtwUSgpO284KCk7bCQ9Y2xhc3MgbCQgZXh0ZW5kcyAkMnt3cml0ZSgkKXtpZigoJD14KCQpKS5ieXRlTGVuZ3RoPjApcmV0dXJuIHN1cGVyLndyaXRlKCQpfXRvU3RyaW5nKCQ9ITEpe3JldHVybiAkP1BYKHRoaXMudG9VaW50OEFycmF5KCEwKSk6dGhpcy50b1VpbnQ4QXJyYXkoITEpLnRoZW4oUFgpfXRvVWludDhBcnJheSgkPSExKXtyZXR1cm4gJD9LJCh0aGlzLl92YWx1ZXMpWzBdOigoKT0+Vih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7dmFyIFgsUSxaLEo7bGV0IFk9W10sSD0wO3RyeXtmb3IodmFyIFc9ITAsUD1ZJCh0aGlzKSxHO0c9eWllbGQgUC5uZXh0KCksWD1HLmRvbmUsIVg7Vz0hMCl7Sj1HLnZhbHVlLFc9ITE7bGV0IHE9SjtZLnB1c2gocSksSCs9cS5ieXRlTGVuZ3RofX1jYXRjaChxKXtRPXtlcnJvcjpxfX1maW5hbGx5e3RyeXtpZighVyYmIVgmJihaPVAucmV0dXJuKSl5aWVsZCBaLmNhbGwoUCl9ZmluYWxseXtpZihRKXRocm93IFEuZXJyb3J9fXJldHVybiBLJChZLEgpWzBdfSkpKCl9fTtuJD1jbGFzcyBuJHtjb25zdHJ1Y3RvcigkKXtpZigkKXRoaXMuc291cmNlPW5ldyBVNShLMC5mcm9tSXRlcmFibGUoJCkpfVtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIHRoaXN9bmV4dCgkKXtyZXR1cm4gdGhpcy5zb3VyY2UubmV4dCgkKX10aHJvdygkKXtyZXR1cm4gdGhpcy5zb3VyY2UudGhyb3coJCl9cmV0dXJuKCQpe3JldHVybiB0aGlzLnNvdXJjZS5yZXR1cm4oJCl9cGVlaygkKXtyZXR1cm4gdGhpcy5zb3VyY2UucGVlaygkKX1yZWFkKCQpe3JldHVybiB0aGlzLnNvdXJjZS5yZWFkKCQpfX07WCQ9Y2xhc3MgWCR7Y29uc3RydWN0b3IoJCl7aWYoJCBpbnN0YW5jZW9mIFgkKXRoaXMuc291cmNlPSQuc291cmNlO2Vsc2UgaWYoJCBpbnN0YW5jZW9mIGwkKXRoaXMuc291cmNlPW5ldyBRNihLMC5mcm9tQXN5bmNJdGVyYWJsZSgkKSk7ZWxzZSBpZih2WigkKSl0aGlzLnNvdXJjZT1uZXcgUTYoSzAuZnJvbU5vZGVTdHJlYW0oJCkpO2Vsc2UgaWYoVVEoJCkpdGhpcy5zb3VyY2U9bmV3IFE2KEswLmZyb21ET01TdHJlYW0oJCkpO2Vsc2UgaWYoeFooJCkpdGhpcy5zb3VyY2U9bmV3IFE2KEswLmZyb21ET01TdHJlYW0oJC5ib2R5KSk7ZWxzZSBpZihnJCgkKSl0aGlzLnNvdXJjZT1uZXcgUTYoSzAuZnJvbUl0ZXJhYmxlKCQpKTtlbHNlIGlmKFckKCQpKXRoaXMuc291cmNlPW5ldyBRNihLMC5mcm9tQXN5bmNJdGVyYWJsZSgkKSk7ZWxzZSBpZihPJCgkKSl0aGlzLnNvdXJjZT1uZXcgUTYoSzAuZnJvbUFzeW5jSXRlcmFibGUoJCkpfVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtyZXR1cm4gdGhpc31uZXh0KCQpe3JldHVybiB0aGlzLnNvdXJjZS5uZXh0KCQpfXRocm93KCQpe3JldHVybiB0aGlzLnNvdXJjZS50aHJvdygkKX1yZXR1cm4oJCl7cmV0dXJuIHRoaXMuc291cmNlLnJldHVybigkKX1nZXQgY2xvc2VkKCl7cmV0dXJuIHRoaXMuc291cmNlLmNsb3NlZH1jYW5jZWwoJCl7cmV0dXJuIHRoaXMuc291cmNlLmNhbmNlbCgkKX1wZWVrKCQpe3JldHVybiB0aGlzLnNvdXJjZS5wZWVrKCQpfXJlYWQoJCl7cmV0dXJuIHRoaXMuc291cmNlLnJlYWQoJCl9fX0pO3ZhciBjSixCNjt2YXIgWDI9QSgoKT0+e2QwKCk7WjYoKTtvOCgpO2NKPWNsYXNzIGNKIGV4dGVuZHMgbiR7Y29uc3RydWN0b3IoJCxYKXtzdXBlcigpO3RoaXMucG9zaXRpb249MCx0aGlzLmJ1ZmZlcj14KCQpLHRoaXMuc2l6ZT1YPT09dm9pZCAwP3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGg6WH1yZWFkSW50MzIoJCl7bGV0e2J1ZmZlcjpYLGJ5dGVPZmZzZXQ6UX09dGhpcy5yZWFkQXQoJCw0KTtyZXR1cm4gbmV3IERhdGFWaWV3KFgsUSkuZ2V0SW50MzIoMCwhMCl9c2VlaygkKXtyZXR1cm4gdGhpcy5wb3NpdGlvbj1NYXRoLm1pbigkLHRoaXMuc2l6ZSksJDx0aGlzLnNpemV9cmVhZCgkKXtsZXR7YnVmZmVyOlgsc2l6ZTpRLHBvc2l0aW9uOlp9PXRoaXM7aWYoWCYmWjxRKXtpZih0eXBlb2YgJCE9PSJudW1iZXIiKSQ9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO3JldHVybiB0aGlzLnBvc2l0aW9uPU1hdGgubWluKFEsWitNYXRoLm1pbihRLVosJCkpLFguc3ViYXJyYXkoWix0aGlzLnBvc2l0aW9uKX1yZXR1cm4gbnVsbH1yZWFkQXQoJCxYKXtsZXQgUT10aGlzLmJ1ZmZlcixaPU1hdGgubWluKHRoaXMuc2l6ZSwkK1gpO3JldHVybiBRP1Euc3ViYXJyYXkoJCxaKTpuZXcgVWludDhBcnJheShYKX1jbG9zZSgpe3RoaXMuYnVmZmVyJiYodGhpcy5idWZmZXI9bnVsbCl9dGhyb3coJCl7cmV0dXJuIHRoaXMuY2xvc2UoKSx7ZG9uZTohMCx2YWx1ZTokfX1yZXR1cm4oJCl7cmV0dXJuIHRoaXMuY2xvc2UoKSx7ZG9uZTohMCx2YWx1ZTokfX19O0I2PWNsYXNzIEI2IGV4dGVuZHMgWCR7Y29uc3RydWN0b3IoJCxYKXtzdXBlcigpO2lmKHRoaXMucG9zaXRpb249MCx0aGlzLl9oYW5kbGU9JCx0eXBlb2YgWD09PSJudW1iZXIiKXRoaXMuc2l6ZT1YO2Vsc2UgdGhpcy5fcGVuZGluZz0oKCk9PlYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3RoaXMuc2l6ZT0oeWllbGQgJC5zdGF0KCkpLnNpemUsZGVsZXRlIHRoaXMuX3BlbmRpbmd9KSkoKX1yZWFkSW50MzIoJCl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2xldHtidWZmZXI6WCxieXRlT2Zmc2V0OlF9PXlpZWxkIHRoaXMucmVhZEF0KCQsNCk7cmV0dXJuIG5ldyBEYXRhVmlldyhYLFEpLmdldEludDMyKDAsITApfSl9c2VlaygkKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX3BlbmRpbmcmJih5aWVsZCB0aGlzLl9wZW5kaW5nKSx0aGlzLnBvc2l0aW9uPU1hdGgubWluKCQsdGhpcy5zaXplKSwkPHRoaXMuc2l6ZX0pfXJlYWQoJCl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3RoaXMuX3BlbmRpbmcmJih5aWVsZCB0aGlzLl9wZW5kaW5nKTtsZXR7X2hhbmRsZTpYLHNpemU6USxwb3NpdGlvbjpafT10aGlzO2lmKFgmJlo8USl7aWYodHlwZW9mICQhPT0ibnVtYmVyIikkPU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtsZXQgSj1aLFk9MCxIPTAsVz1NYXRoLm1pbihRLEorTWF0aC5taW4oUS1KLCQpKSxQPW5ldyBVaW50OEFycmF5KE1hdGgubWF4KDAsKHRoaXMucG9zaXRpb249VyktSikpO3doaWxlKChKKz1IKTxXJiYoWSs9SCk8UC5ieXRlTGVuZ3RoKSh7Ynl0ZXNSZWFkOkh9PXlpZWxkIFgucmVhZChQLFksUC5ieXRlTGVuZ3RoLVksSikpO3JldHVybiBQfXJldHVybiBudWxsfSl9cmVhZEF0KCQsWCl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3RoaXMuX3BlbmRpbmcmJih5aWVsZCB0aGlzLl9wZW5kaW5nKTtsZXR7X2hhbmRsZTpRLHNpemU6Wn09dGhpcztpZihRJiYkK1g8Wil7bGV0IEo9TWF0aC5taW4oWiwkK1gpLFk9bmV3IFVpbnQ4QXJyYXkoSi0kKTtyZXR1cm4oeWllbGQgUS5yZWFkKFksMCxYLCQpKS5idWZmZXJ9cmV0dXJuIG5ldyBVaW50OEFycmF5KFgpfSl9Y2xvc2UoKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7bGV0ICQ9dGhpcy5faGFuZGxlO3RoaXMuX2hhbmRsZT1udWxsLCQmJih5aWVsZCAkLmNsb3NlKCkpfSl9dGhyb3coJCl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLmNsb3NlKCkse2RvbmU6ITAsdmFsdWU6JH19KX1yZXR1cm4oJCl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLmNsb3NlKCkse2RvbmU6ITAsdmFsdWU6JH19KX19fSk7dmFyIFoyPXt9O0MkKFoyLHtVaW50NjQ6KCk9PkY4LEludDY0OigpPT5EMCxJbnQxMjg6KCk9PlQkLEJhc2VJbnQ2NDooKT0+dUp9KTtmdW5jdGlvbiBfWCgkKXtpZigkPDApJD00Mjk0OTY3Mjk1KyQrMTtyZXR1cm5gMHgkeyQudG9TdHJpbmcoMTYpfWB9Y2xhc3MgdUp7Y29uc3RydWN0b3IoJCl7dGhpcy5idWZmZXI9JH1oaWdoKCl7cmV0dXJuIHRoaXMuYnVmZmVyWzFdfWxvdygpe3JldHVybiB0aGlzLmJ1ZmZlclswXX1fdGltZXMoJCl7bGV0IFg9bmV3IFVpbnQzMkFycmF5KFt0aGlzLmJ1ZmZlclsxXT4+PjE2LHRoaXMuYnVmZmVyWzFdJjY1NTM1LHRoaXMuYnVmZmVyWzBdPj4+MTYsdGhpcy5idWZmZXJbMF0mNjU1MzVdKSxRPW5ldyBVaW50MzJBcnJheShbJC5idWZmZXJbMV0+Pj4xNiwkLmJ1ZmZlclsxXSY2NTUzNSwkLmJ1ZmZlclswXT4+PjE2LCQuYnVmZmVyWzBdJjY1NTM1XSksWj1YWzNdKlFbM107dGhpcy5idWZmZXJbMF09WiY2NTUzNTtsZXQgSj1aPj4+MTY7cmV0dXJuIFo9WFsyXSpRWzNdLEorPVosWj1YWzNdKlFbMl0+Pj4wLEorPVosdGhpcy5idWZmZXJbMF0rPUo8PDE2LHRoaXMuYnVmZmVyWzFdPUo+Pj4wPFo/NjU1MzY6MCx0aGlzLmJ1ZmZlclsxXSs9Sj4+PjE2LHRoaXMuYnVmZmVyWzFdKz1YWzFdKlFbM10rWFsyXSpRWzJdK1hbM10qUVsxXSx0aGlzLmJ1ZmZlclsxXSs9WFswXSpRWzNdK1hbMV0qUVsyXStYWzJdKlFbMV0rWFszXSpRWzBdPDwxNix0aGlzfV9wbHVzKCQpe2xldCBYPXRoaXMuYnVmZmVyWzBdKyQuYnVmZmVyWzBdPj4+MDtpZih0aGlzLmJ1ZmZlclsxXSs9JC5idWZmZXJbMV0sWDx0aGlzLmJ1ZmZlclswXT4+PjApKyt0aGlzLmJ1ZmZlclsxXTt0aGlzLmJ1ZmZlclswXT1YfWxlc3NUaGFuKCQpe3JldHVybiB0aGlzLmJ1ZmZlclsxXTwkLmJ1ZmZlclsxXXx8dGhpcy5idWZmZXJbMV09PT0kLmJ1ZmZlclsxXSYmdGhpcy5idWZmZXJbMF08JC5idWZmZXJbMF19ZXF1YWxzKCQpe3JldHVybiB0aGlzLmJ1ZmZlclsxXT09PSQuYnVmZmVyWzFdJiZ0aGlzLmJ1ZmZlclswXT09JC5idWZmZXJbMF19Z3JlYXRlclRoYW4oJCl7cmV0dXJuICQubGVzc1RoYW4odGhpcyl9aGV4KCl7cmV0dXJuYCR7X1godGhpcy5idWZmZXJbMV0pfSAke19YKHRoaXMuYnVmZmVyWzBdKX1gfX1jbGFzcyBUJHtjb25zdHJ1Y3RvcigkKXt0aGlzLmJ1ZmZlcj0kfWhpZ2goKXtyZXR1cm4gbmV3IEQwKG5ldyBVaW50MzJBcnJheSh0aGlzLmJ1ZmZlci5idWZmZXIsdGhpcy5idWZmZXIuYnl0ZU9mZnNldCs4LDIpKX1sb3coKXtyZXR1cm4gbmV3IEQwKG5ldyBVaW50MzJBcnJheSh0aGlzLmJ1ZmZlci5idWZmZXIsdGhpcy5idWZmZXIuYnl0ZU9mZnNldCwyKSl9bmVnYXRlKCl7aWYodGhpcy5idWZmZXJbMF09fnRoaXMuYnVmZmVyWzBdKzEsdGhpcy5idWZmZXJbMV09fnRoaXMuYnVmZmVyWzFdLHRoaXMuYnVmZmVyWzJdPX50aGlzLmJ1ZmZlclsyXSx0aGlzLmJ1ZmZlclszXT1+dGhpcy5idWZmZXJbM10sdGhpcy5idWZmZXJbMF09PTApKyt0aGlzLmJ1ZmZlclsxXTtpZih0aGlzLmJ1ZmZlclsxXT09MCkrK3RoaXMuYnVmZmVyWzJdO2lmKHRoaXMuYnVmZmVyWzJdPT0wKSsrdGhpcy5idWZmZXJbM107cmV0dXJuIHRoaXN9dGltZXMoJCl7bGV0IFg9bmV3IEY4KG5ldyBVaW50MzJBcnJheShbdGhpcy5idWZmZXJbM10sMF0pKSxRPW5ldyBGOChuZXcgVWludDMyQXJyYXkoW3RoaXMuYnVmZmVyWzJdLDBdKSksWj1uZXcgRjgobmV3IFVpbnQzMkFycmF5KFt0aGlzLmJ1ZmZlclsxXSwwXSkpLEo9bmV3IEY4KG5ldyBVaW50MzJBcnJheShbdGhpcy5idWZmZXJbMF0sMF0pKSxZPW5ldyBGOChuZXcgVWludDMyQXJyYXkoWyQuYnVmZmVyWzNdLDBdKSksSD1uZXcgRjgobmV3IFVpbnQzMkFycmF5KFskLmJ1ZmZlclsyXSwwXSkpLFc9bmV3IEY4KG5ldyBVaW50MzJBcnJheShbJC5idWZmZXJbMV0sMF0pKSxQPW5ldyBGOChuZXcgVWludDMyQXJyYXkoWyQuYnVmZmVyWzBdLDBdKSksRz1GOC5tdWx0aXBseShKLFApO3RoaXMuYnVmZmVyWzBdPUcubG93KCk7bGV0IHE9bmV3IEY4KG5ldyBVaW50MzJBcnJheShbRy5oaWdoKCksMF0pKTtyZXR1cm4gRz1GOC5tdWx0aXBseShaLFApLHEucGx1cyhHKSxHPUY4Lm11bHRpcGx5KEosVykscS5wbHVzKEcpLHRoaXMuYnVmZmVyWzFdPXEubG93KCksdGhpcy5idWZmZXJbM109cS5sZXNzVGhhbihHKT8xOjAsdGhpcy5idWZmZXJbMl09cS5oaWdoKCksbmV3IEY4KG5ldyBVaW50MzJBcnJheSh0aGlzLmJ1ZmZlci5idWZmZXIsdGhpcy5idWZmZXIuYnl0ZU9mZnNldCs4LDIpKS5wbHVzKEY4Lm11bHRpcGx5KFEsUCkpLnBsdXMoRjgubXVsdGlwbHkoWixXKSkucGx1cyhGOC5tdWx0aXBseShKLEgpKSx0aGlzLmJ1ZmZlclszXSs9RjgubXVsdGlwbHkoWCxQKS5wbHVzKEY4Lm11bHRpcGx5KFEsVykpLnBsdXMoRjgubXVsdGlwbHkoWixIKSkucGx1cyhGOC5tdWx0aXBseShKLFkpKS5sb3coKSx0aGlzfXBsdXMoJCl7bGV0IFg9bmV3IFVpbnQzMkFycmF5KDQpO2lmKFhbM109dGhpcy5idWZmZXJbM10rJC5idWZmZXJbM10+Pj4wLFhbMl09dGhpcy5idWZmZXJbMl0rJC5idWZmZXJbMl0+Pj4wLFhbMV09dGhpcy5idWZmZXJbMV0rJC5idWZmZXJbMV0+Pj4wLFhbMF09dGhpcy5idWZmZXJbMF0rJC5idWZmZXJbMF0+Pj4wLFhbMF08dGhpcy5idWZmZXJbMF0+Pj4wKSsrWFsxXTtpZihYWzFdPHRoaXMuYnVmZmVyWzFdPj4+MCkrK1hbMl07aWYoWFsyXTx0aGlzLmJ1ZmZlclsyXT4+PjApKytYWzNdO3JldHVybiB0aGlzLmJ1ZmZlclszXT1YWzNdLHRoaXMuYnVmZmVyWzJdPVhbMl0sdGhpcy5idWZmZXJbMV09WFsxXSx0aGlzLmJ1ZmZlclswXT1YWzBdLHRoaXN9aGV4KCl7cmV0dXJuYCR7X1godGhpcy5idWZmZXJbM10pfSAke19YKHRoaXMuYnVmZmVyWzJdKX0gJHtfWCh0aGlzLmJ1ZmZlclsxXSl9ICR7X1godGhpcy5idWZmZXJbMF0pfWB9c3RhdGljIG11bHRpcGx5KCQsWCl7cmV0dXJuIG5ldyBUJChuZXcgVWludDMyQXJyYXkoJC5idWZmZXIpKS50aW1lcyhYKX1zdGF0aWMgYWRkKCQsWCl7cmV0dXJuIG5ldyBUJChuZXcgVWludDMyQXJyYXkoJC5idWZmZXIpKS5wbHVzKFgpfXN0YXRpYyBmcm9tKCQsWD1uZXcgVWludDMyQXJyYXkoNCkpe3JldHVybiBUJC5mcm9tU3RyaW5nKHR5cGVvZiAkPT09InN0cmluZyI/JDokLnRvU3RyaW5nKCksWCl9c3RhdGljIGZyb21OdW1iZXIoJCxYPW5ldyBVaW50MzJBcnJheSg0KSl7cmV0dXJuIFQkLmZyb21TdHJpbmcoJC50b1N0cmluZygpLFgpfXN0YXRpYyBmcm9tU3RyaW5nKCQsWD1uZXcgVWludDMyQXJyYXkoNCkpe2xldCBRPSQuc3RhcnRzV2l0aCgiLSIpLFo9JC5sZW5ndGgsSj1uZXcgVCQoWCk7Zm9yKGxldCBZPVE/MTowO1k8Wjspe2xldCBIPVRYPFotWT9UWDpaLVksVz1uZXcgVCQobmV3IFVpbnQzMkFycmF5KFtOdW1iZXIucGFyc2VJbnQoJC5zbGljZShZLFkrSCksMTApLDAsMCwwXSkpLFA9bmV3IFQkKG5ldyBVaW50MzJBcnJheShbUTJbSF0sMCwwLDBdKSk7Si50aW1lcyhQKSxKLnBsdXMoVyksWSs9SH1yZXR1cm4gUT9KLm5lZ2F0ZSgpOkp9c3RhdGljIGNvbnZlcnRBcnJheSgkKXtsZXQgWD1uZXcgVWludDMyQXJyYXkoJC5sZW5ndGgqNCk7Zm9yKGxldCBRPS0xLFo9JC5sZW5ndGg7KytRPFo7KVQkLmZyb20oJFtRXSxuZXcgVWludDMyQXJyYXkoWC5idWZmZXIsWC5ieXRlT2Zmc2V0KzE2KlEsNCkpO3JldHVybiBYfX12YXIgVFg9OCxRMixGOCxEMDt2YXIgSjI9QSgoKT0+e1EyPVsxLDEwLDEwMCwxMDAwLDFlNCwxZTUsMWU2LDFlNywxZThdO0Y4PWNsYXNzIEY4IGV4dGVuZHMgdUp7dGltZXMoJCl7cmV0dXJuIHRoaXMuX3RpbWVzKCQpLHRoaXN9cGx1cygkKXtyZXR1cm4gdGhpcy5fcGx1cygkKSx0aGlzfXN0YXRpYyBmcm9tKCQsWD1uZXcgVWludDMyQXJyYXkoMikpe3JldHVybiBGOC5mcm9tU3RyaW5nKHR5cGVvZiAkPT09InN0cmluZyI/JDokLnRvU3RyaW5nKCksWCl9c3RhdGljIGZyb21OdW1iZXIoJCxYPW5ldyBVaW50MzJBcnJheSgyKSl7cmV0dXJuIEY4LmZyb21TdHJpbmcoJC50b1N0cmluZygpLFgpfXN0YXRpYyBmcm9tU3RyaW5nKCQsWD1uZXcgVWludDMyQXJyYXkoMikpe2xldCBRPSQubGVuZ3RoLFo9bmV3IEY4KFgpO2ZvcihsZXQgSj0wO0o8UTspe2xldCBZPVRYPFEtSj9UWDpRLUosSD1uZXcgRjgobmV3IFVpbnQzMkFycmF5KFtOdW1iZXIucGFyc2VJbnQoJC5zbGljZShKLEorWSksMTApLDBdKSksVz1uZXcgRjgobmV3IFVpbnQzMkFycmF5KFtRMltZXSwwXSkpO1oudGltZXMoVyksWi5wbHVzKEgpLEorPVl9cmV0dXJuIFp9c3RhdGljIGNvbnZlcnRBcnJheSgkKXtsZXQgWD1uZXcgVWludDMyQXJyYXkoJC5sZW5ndGgqMik7Zm9yKGxldCBRPS0xLFo9JC5sZW5ndGg7KytRPFo7KUY4LmZyb20oJFtRXSxuZXcgVWludDMyQXJyYXkoWC5idWZmZXIsWC5ieXRlT2Zmc2V0KzIqUSo0LDIpKTtyZXR1cm4gWH1zdGF0aWMgbXVsdGlwbHkoJCxYKXtyZXR1cm4gbmV3IEY4KG5ldyBVaW50MzJBcnJheSgkLmJ1ZmZlcikpLnRpbWVzKFgpfXN0YXRpYyBhZGQoJCxYKXtyZXR1cm4gbmV3IEY4KG5ldyBVaW50MzJBcnJheSgkLmJ1ZmZlcikpLnBsdXMoWCl9fTtEMD1jbGFzcyBEMCBleHRlbmRzIHVKe25lZ2F0ZSgpe2lmKHRoaXMuYnVmZmVyWzBdPX50aGlzLmJ1ZmZlclswXSsxLHRoaXMuYnVmZmVyWzFdPX50aGlzLmJ1ZmZlclsxXSx0aGlzLmJ1ZmZlclswXT09MCkrK3RoaXMuYnVmZmVyWzFdO3JldHVybiB0aGlzfXRpbWVzKCQpe3JldHVybiB0aGlzLl90aW1lcygkKSx0aGlzfXBsdXMoJCl7cmV0dXJuIHRoaXMuX3BsdXMoJCksdGhpc31sZXNzVGhhbigkKXtsZXQgWD10aGlzLmJ1ZmZlclsxXTw8MCxRPSQuYnVmZmVyWzFdPDwwO3JldHVybiBYPFF8fFg9PT1RJiZ0aGlzLmJ1ZmZlclswXTwkLmJ1ZmZlclswXX1zdGF0aWMgZnJvbSgkLFg9bmV3IFVpbnQzMkFycmF5KDIpKXtyZXR1cm4gRDAuZnJvbVN0cmluZyh0eXBlb2YgJD09PSJzdHJpbmciPyQ6JC50b1N0cmluZygpLFgpfXN0YXRpYyBmcm9tTnVtYmVyKCQsWD1uZXcgVWludDMyQXJyYXkoMikpe3JldHVybiBEMC5mcm9tU3RyaW5nKCQudG9TdHJpbmcoKSxYKX1zdGF0aWMgZnJvbVN0cmluZygkLFg9bmV3IFVpbnQzMkFycmF5KDIpKXtsZXQgUT0kLnN0YXJ0c1dpdGgoIi0iKSxaPSQubGVuZ3RoLEo9bmV3IEQwKFgpO2ZvcihsZXQgWT1RPzE6MDtZPFo7KXtsZXQgSD1UWDxaLVk/VFg6Wi1ZLFc9bmV3IEQwKG5ldyBVaW50MzJBcnJheShbTnVtYmVyLnBhcnNlSW50KCQuc2xpY2UoWSxZK0gpLDEwKSwwXSkpLFA9bmV3IEQwKG5ldyBVaW50MzJBcnJheShbUTJbSF0sMF0pKTtKLnRpbWVzKFApLEoucGx1cyhXKSxZKz1IfXJldHVybiBRP0oubmVnYXRlKCk6Sn1zdGF0aWMgY29udmVydEFycmF5KCQpe2xldCBYPW5ldyBVaW50MzJBcnJheSgkLmxlbmd0aCoyKTtmb3IobGV0IFE9LTEsWj0kLmxlbmd0aDsrK1E8WjspRDAuZnJvbSgkW1FdLG5ldyBVaW50MzJBcnJheShYLmJ1ZmZlcixYLmJ5dGVPZmZzZXQrMipRKjQsMikpO3JldHVybiBYfXN0YXRpYyBtdWx0aXBseSgkLFgpe3JldHVybiBuZXcgRDAobmV3IFVpbnQzMkFycmF5KCQuYnVmZmVyKSkudGltZXMoWCl9c3RhdGljIGFkZCgkLFgpe3JldHVybiBuZXcgRDAobmV3IFVpbnQzMkFycmF5KCQuYnVmZmVyKSkucGx1cyhYKX19fSk7dmFyIFAyPXt9O0MkKFAyLHt0b0ludGVydmFsTW9udGhEYXlOYW5vT2JqZWN0czooKT0+SzIsdG9JbnRlcnZhbE1vbnRoRGF5TmFub0ludDMyQXJyYXk6KCk9PkgyLHRvSW50ZXJ2YWxEYXlUaW1lT2JqZWN0czooKT0+VzIsdG9JbnRlcnZhbERheVRpbWVJbnQzMkFycmF5OigpPT5ZMn0pO2Z1bmN0aW9uIFkyKCQpe3ZhciBYLFE7bGV0IFo9JC5sZW5ndGgsSj1uZXcgSW50MzJBcnJheShaKjIpO2ZvcihsZXQgWT0wLEg9MDtZPFo7WSsrKXtsZXQgVz0kW1ldO0pbSCsrXT0oWD1XLmRheXMpIT09bnVsbCYmWCE9PXZvaWQgMD9YOjAsSltIKytdPShRPVcubWlsbGlzZWNvbmRzKSE9PW51bGwmJlEhPT12b2lkIDA/UTowfXJldHVybiBKfWZ1bmN0aW9uIEgyKCQpe3ZhciBYLFE7bGV0IFo9JC5sZW5ndGgsSj1uZXcgSW50MzJBcnJheShaKjQpO2ZvcihsZXQgWT0wLEg9MDtZPFo7WSsrKXtsZXQgVz0kW1ldO0pbSCsrXT0oWD1XLm1vbnRocykhPT1udWxsJiZYIT09dm9pZCAwP1g6MCxKW0grK109KFE9Vy5kYXlzKSE9PW51bGwmJlEhPT12b2lkIDA/UTowO2xldCBQPVcubmFub3NlY29uZHM7aWYoUCl7bGV0IEc9QmlnSW50KFApO0pbSCsrXT1OdW1iZXIoRyZCaWdJbnQoNDI5NDk2NzI5NSkpPj4+MCxKW0grK109TnVtYmVyKEc+PkJpZ0ludCgzMikpPj4+MH1lbHNlIEgrPTJ9cmV0dXJuIEp9ZnVuY3Rpb24gVzIoJCl7bGV0IFg9JC5sZW5ndGgsUT1BcnJheShYLzIpO2ZvcihsZXQgWj0wLEo9MDtaPFg7Wis9MilRW0orK109e2RheXM6JFtaXSxtaWxsaXNlY29uZHM6JFtaKzFdfTtyZXR1cm4gUX1mdW5jdGlvbiBLMigkLFgpe2xldCBRPSQubGVuZ3RoLFo9QXJyYXkoUS80KTtmb3IobGV0IEo9MCxZPTA7SjxRO0orPTQpe2xldCBIPUJpZ0ludCgkW0orM10pPDxCaWdJbnQoMzIpfEJpZ0ludCgkW0orMl0+Pj4wKTtaW1krK109e21vbnRoczokW0pdLGRheXM6JFtKKzFdLG5hbm9zZWNvbmRzOlg/YCR7SH1gOkh9fXJldHVybiBafWZ1bmN0aW9uIFI1KCQpe2xldCBYPW5ldyBVaW50OEFycmF5KCQubGVuZ3RoLzIpO2ZvcihsZXQgUT0wO1E8JC5sZW5ndGg7USs9MilYW1E+PjFdPU51bWJlci5wYXJzZUludCgkLnNsaWNlKFEsUSsyKSwxNik7cmV0dXJuIFh9ZnVuY3Rpb24gREcoJCl7cmV0dXJuIFI1KCQuam9pbigiIikpfWZ1bmN0aW9uIEM1KCQsWCl7bGV0IFE9bmV3IFVpbnQ4QXJyYXkoJC5sZW5ndGgqMTYpLFo9bmV3IERhdGFWaWV3KFEuYnVmZmVyKTtmb3IobGV0W0osWV1vZiAkLmVudHJpZXMoKSl7bGV0IEg9SioxNixXPVkuU0laRTtpZihaLnNldEludDMyKEgsVywhMCksWS5JTkxJTkVEIT09dm9pZCAwKXtsZXQgUD1YKFkuSU5MSU5FRCk7Zm9yKGxldCBHPTA7RzxQLmxlbmd0aCYmRzwxMjtHKyspUVtIKzQrR109UFtHXX1lbHNle2xldCBQPVkuUFJFRklYX0hFWDtmb3IobGV0IEc9MDtHPDgmJkc8UC5sZW5ndGg7Rys9MilRW0grNCsoRz4+MSldPU51bWJlci5wYXJzZUludChQLnNsaWNlKEcsRysyKSwxNik7Wi5zZXRJbnQzMihIKzgsWS5CVUZGRVJfSU5ERVgsITApLFouc2V0SW50MzIoSCsxMixZLk9GRlNFVCwhMCl9fXJldHVybiBRfWZ1bmN0aW9uIHdHKCQpe3JldHVybiBDNSgkLChYKT0+e2xldCBRPW5ldyBVaW50OEFycmF5KFgubGVuZ3RoLzIpO2ZvcihsZXQgWj0wO1o8WC5sZW5ndGg7Wis9MilRW1o+PjFdPU51bWJlci5wYXJzZUludChYLnNsaWNlKFosWisyKSwxNik7cmV0dXJuIFF9KX1mdW5jdGlvbiBWRygkKXtyZXR1cm4gQzUoJCwoWCk9PntyZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKFgpfSl9dmFyIGNRLEcyLHEyO3ZhciBPNT1BKCgpPT57XyQoKTt2MCgpO044KCk7ZTAoKTt3NigpO1UxKCk7SjIoKTtWOCgpO284KCk7Y1E9Y2xhc3MgY1EgZXh0ZW5kcyBUe2NvbnN0cnVjdG9yKCQsWCxRLFosSj1xOC5WNSxZPVtdKXtzdXBlcigpO3RoaXMubm9kZXNJbmRleD0tMSx0aGlzLmJ1ZmZlcnNJbmRleD0tMSx0aGlzLnZhcmlhZGljQnVmZmVySW5kZXg9LTEsdGhpcy5ieXRlcz0kLHRoaXMubm9kZXM9WCx0aGlzLmJ1ZmZlcnM9USx0aGlzLmRpY3Rpb25hcmllcz1aLHRoaXMubWV0YWRhdGFWZXJzaW9uPUosdGhpcy52YXJpYWRpY0J1ZmZlckNvdW50cz1ZfXZpc2l0KCQpe3JldHVybiBzdXBlci52aXNpdCgkIGluc3RhbmNlb2Ygdz8kLnR5cGU6JCl9dmlzaXROdWxsKCQse2xlbmd0aDpYfT10aGlzLm5leHRGaWVsZE5vZGUoKSl7cmV0dXJuIEMoe3R5cGU6JCxsZW5ndGg6WH0pfXZpc2l0Qm9vbCgkLHtsZW5ndGg6WCxudWxsQ291bnQ6UX09dGhpcy5uZXh0RmllbGROb2RlKCkpe3JldHVybiBDKHt0eXBlOiQsbGVuZ3RoOlgsbnVsbENvdW50OlEsbnVsbEJpdG1hcDp0aGlzLnJlYWROdWxsQml0bWFwKCQsUSksZGF0YTp0aGlzLnJlYWREYXRhKCQpfSl9dmlzaXRJbnQoJCx7bGVuZ3RoOlgsbnVsbENvdW50OlF9PXRoaXMubmV4dEZpZWxkTm9kZSgpKXtyZXR1cm4gQyh7dHlwZTokLGxlbmd0aDpYLG51bGxDb3VudDpRLG51bGxCaXRtYXA6dGhpcy5yZWFkTnVsbEJpdG1hcCgkLFEpLGRhdGE6dGhpcy5yZWFkRGF0YSgkKX0pfXZpc2l0RmxvYXQoJCx7bGVuZ3RoOlgsbnVsbENvdW50OlF9PXRoaXMubmV4dEZpZWxkTm9kZSgpKXtyZXR1cm4gQyh7dHlwZTokLGxlbmd0aDpYLG51bGxDb3VudDpRLG51bGxCaXRtYXA6dGhpcy5yZWFkTnVsbEJpdG1hcCgkLFEpLGRhdGE6dGhpcy5yZWFkRGF0YSgkKX0pfXZpc2l0VXRmOCgkLHtsZW5ndGg6WCxudWxsQ291bnQ6UX09dGhpcy5uZXh0RmllbGROb2RlKCkpe3JldHVybiBDKHt0eXBlOiQsbGVuZ3RoOlgsbnVsbENvdW50OlEsbnVsbEJpdG1hcDp0aGlzLnJlYWROdWxsQml0bWFwKCQsUSksdmFsdWVPZmZzZXRzOnRoaXMucmVhZE9mZnNldHMoJCksZGF0YTp0aGlzLnJlYWREYXRhKCQpfSl9dmlzaXRMYXJnZVV0ZjgoJCx7bGVuZ3RoOlgsbnVsbENvdW50OlF9PXRoaXMubmV4dEZpZWxkTm9kZSgpKXtyZXR1cm4gQyh7dHlwZTokLGxlbmd0aDpYLG51bGxDb3VudDpRLG51bGxCaXRtYXA6dGhpcy5yZWFkTnVsbEJpdG1hcCgkLFEpLHZhbHVlT2Zmc2V0czp0aGlzLnJlYWRPZmZzZXRzKCQpLGRhdGE6dGhpcy5yZWFkRGF0YSgkKX0pfXZpc2l0VXRmOFZpZXcoJCx7bGVuZ3RoOlgsbnVsbENvdW50OlF9PXRoaXMubmV4dEZpZWxkTm9kZSgpKXtsZXQgWj10aGlzLnJlYWROdWxsQml0bWFwKCQsUSksSj10aGlzLnJlYWREYXRhKCQpLFk9dGhpcy5yZWFkVmFyaWFkaWNCdWZmZXJzKHRoaXMubmV4dFZhcmlhZGljQnVmZmVyQ291bnQoKSk7cmV0dXJuIEMoe3R5cGU6JCxsZW5ndGg6WCxudWxsQ291bnQ6USxudWxsQml0bWFwOlosWyJ2aWV3cyJdOkosWyJ2YXJpYWRpY0J1ZmZlcnMiXTpZfSl9dmlzaXRCaW5hcnkoJCx7bGVuZ3RoOlgsbnVsbENvdW50OlF9PXRoaXMubmV4dEZpZWxkTm9kZSgpKXtyZXR1cm4gQyh7dHlwZTokLGxlbmd0aDpYLG51bGxDb3VudDpRLG51bGxCaXRtYXA6dGhpcy5yZWFkTnVsbEJpdG1hcCgkLFEpLHZhbHVlT2Zmc2V0czp0aGlzLnJlYWRPZmZzZXRzKCQpLGRhdGE6dGhpcy5yZWFkRGF0YSgkKX0pfXZpc2l0TGFyZ2VCaW5hcnkoJCx7bGVuZ3RoOlgsbnVsbENvdW50OlF9PXRoaXMubmV4dEZpZWxkTm9kZSgpKXtyZXR1cm4gQyh7dHlwZTokLGxlbmd0aDpYLG51bGxDb3VudDpRLG51bGxCaXRtYXA6dGhpcy5yZWFkTnVsbEJpdG1hcCgkLFEpLHZhbHVlT2Zmc2V0czp0aGlzLnJlYWRPZmZzZXRzKCQpLGRhdGE6dGhpcy5yZWFkRGF0YSgkKX0pfXZpc2l0QmluYXJ5VmlldygkLHtsZW5ndGg6WCxudWxsQ291bnQ6UX09dGhpcy5uZXh0RmllbGROb2RlKCkpe2xldCBaPXRoaXMucmVhZE51bGxCaXRtYXAoJCxRKSxKPXRoaXMucmVhZERhdGEoJCksWT10aGlzLnJlYWRWYXJpYWRpY0J1ZmZlcnModGhpcy5uZXh0VmFyaWFkaWNCdWZmZXJDb3VudCgpKTtyZXR1cm4gQyh7dHlwZTokLGxlbmd0aDpYLG51bGxDb3VudDpRLG51bGxCaXRtYXA6WixbInZpZXdzIl06SixbInZhcmlhZGljQnVmZmVycyJdOll9KX12aXNpdEZpeGVkU2l6ZUJpbmFyeSgkLHtsZW5ndGg6WCxudWxsQ291bnQ6UX09dGhpcy5uZXh0RmllbGROb2RlKCkpe3JldHVybiBDKHt0eXBlOiQsbGVuZ3RoOlgsbnVsbENvdW50OlEsbnVsbEJpdG1hcDp0aGlzLnJlYWROdWxsQml0bWFwKCQsUSksZGF0YTp0aGlzLnJlYWREYXRhKCQpfSl9dmlzaXREYXRlKCQse2xlbmd0aDpYLG51bGxDb3VudDpRfT10aGlzLm5leHRGaWVsZE5vZGUoKSl7cmV0dXJuIEMoe3R5cGU6JCxsZW5ndGg6WCxudWxsQ291bnQ6USxudWxsQml0bWFwOnRoaXMucmVhZE51bGxCaXRtYXAoJCxRKSxkYXRhOnRoaXMucmVhZERhdGEoJCl9KX12aXNpdFRpbWVzdGFtcCgkLHtsZW5ndGg6WCxudWxsQ291bnQ6UX09dGhpcy5uZXh0RmllbGROb2RlKCkpe3JldHVybiBDKHt0eXBlOiQsbGVuZ3RoOlgsbnVsbENvdW50OlEsbnVsbEJpdG1hcDp0aGlzLnJlYWROdWxsQml0bWFwKCQsUSksZGF0YTp0aGlzLnJlYWREYXRhKCQpfSl9dmlzaXRUaW1lKCQse2xlbmd0aDpYLG51bGxDb3VudDpRfT10aGlzLm5leHRGaWVsZE5vZGUoKSl7cmV0dXJuIEMoe3R5cGU6JCxsZW5ndGg6WCxudWxsQ291bnQ6USxudWxsQml0bWFwOnRoaXMucmVhZE51bGxCaXRtYXAoJCxRKSxkYXRhOnRoaXMucmVhZERhdGEoJCl9KX12aXNpdERlY2ltYWwoJCx7bGVuZ3RoOlgsbnVsbENvdW50OlF9PXRoaXMubmV4dEZpZWxkTm9kZSgpKXtyZXR1cm4gQyh7dHlwZTokLGxlbmd0aDpYLG51bGxDb3VudDpRLG51bGxCaXRtYXA6dGhpcy5yZWFkTnVsbEJpdG1hcCgkLFEpLGRhdGE6dGhpcy5yZWFkRGF0YSgkKX0pfXZpc2l0TGlzdCgkLHtsZW5ndGg6WCxudWxsQ291bnQ6UX09dGhpcy5uZXh0RmllbGROb2RlKCkpe3JldHVybiBDKHt0eXBlOiQsbGVuZ3RoOlgsbnVsbENvdW50OlEsbnVsbEJpdG1hcDp0aGlzLnJlYWROdWxsQml0bWFwKCQsUSksdmFsdWVPZmZzZXRzOnRoaXMucmVhZE9mZnNldHMoJCksY2hpbGQ6dGhpcy52aXNpdCgkLmNoaWxkcmVuWzBdKX0pfXZpc2l0U3RydWN0KCQse2xlbmd0aDpYLG51bGxDb3VudDpRfT10aGlzLm5leHRGaWVsZE5vZGUoKSl7cmV0dXJuIEMoe3R5cGU6JCxsZW5ndGg6WCxudWxsQ291bnQ6USxudWxsQml0bWFwOnRoaXMucmVhZE51bGxCaXRtYXAoJCxRKSxjaGlsZHJlbjp0aGlzLnZpc2l0TWFueSgkLmNoaWxkcmVuKX0pfXZpc2l0VW5pb24oJCx7bGVuZ3RoOlgsbnVsbENvdW50OlF9PXRoaXMubmV4dEZpZWxkTm9kZSgpKXtpZih0aGlzLm1ldGFkYXRhVmVyc2lvbjxxOC5WNSl0aGlzLnJlYWROdWxsQml0bWFwKCQsUSk7cmV0dXJuICQubW9kZT09PSQ4LlNwYXJzZT90aGlzLnZpc2l0U3BhcnNlVW5pb24oJCx7bGVuZ3RoOlgsbnVsbENvdW50OlF9KTp0aGlzLnZpc2l0RGVuc2VVbmlvbigkLHtsZW5ndGg6WCxudWxsQ291bnQ6UX0pfXZpc2l0RGVuc2VVbmlvbigkLHtsZW5ndGg6WCxudWxsQ291bnQ6UX09dGhpcy5uZXh0RmllbGROb2RlKCkpe3JldHVybiBDKHt0eXBlOiQsbGVuZ3RoOlgsbnVsbENvdW50OlEsdHlwZUlkczp0aGlzLnJlYWRUeXBlSWRzKCQpLHZhbHVlT2Zmc2V0czp0aGlzLnJlYWRPZmZzZXRzKCQpLGNoaWxkcmVuOnRoaXMudmlzaXRNYW55KCQuY2hpbGRyZW4pfSl9dmlzaXRTcGFyc2VVbmlvbigkLHtsZW5ndGg6WCxudWxsQ291bnQ6UX09dGhpcy5uZXh0RmllbGROb2RlKCkpe3JldHVybiBDKHt0eXBlOiQsbGVuZ3RoOlgsbnVsbENvdW50OlEsdHlwZUlkczp0aGlzLnJlYWRUeXBlSWRzKCQpLGNoaWxkcmVuOnRoaXMudmlzaXRNYW55KCQuY2hpbGRyZW4pfSl9dmlzaXREaWN0aW9uYXJ5KCQse2xlbmd0aDpYLG51bGxDb3VudDpRfT10aGlzLm5leHRGaWVsZE5vZGUoKSl7cmV0dXJuIEMoe3R5cGU6JCxsZW5ndGg6WCxudWxsQ291bnQ6USxudWxsQml0bWFwOnRoaXMucmVhZE51bGxCaXRtYXAoJCxRKSxkYXRhOnRoaXMucmVhZERhdGEoJC5pbmRpY2VzKSxkaWN0aW9uYXJ5OnRoaXMucmVhZERpY3Rpb25hcnkoJCl9KX12aXNpdEludGVydmFsKCQse2xlbmd0aDpYLG51bGxDb3VudDpRfT10aGlzLm5leHRGaWVsZE5vZGUoKSl7cmV0dXJuIEMoe3R5cGU6JCxsZW5ndGg6WCxudWxsQ291bnQ6USxudWxsQml0bWFwOnRoaXMucmVhZE51bGxCaXRtYXAoJCxRKSxkYXRhOnRoaXMucmVhZERhdGEoJCl9KX12aXNpdER1cmF0aW9uKCQse2xlbmd0aDpYLG51bGxDb3VudDpRfT10aGlzLm5leHRGaWVsZE5vZGUoKSl7cmV0dXJuIEMoe3R5cGU6JCxsZW5ndGg6WCxudWxsQ291bnQ6USxudWxsQml0bWFwOnRoaXMucmVhZE51bGxCaXRtYXAoJCxRKSxkYXRhOnRoaXMucmVhZERhdGEoJCl9KX12aXNpdEZpeGVkU2l6ZUxpc3QoJCx7bGVuZ3RoOlgsbnVsbENvdW50OlF9PXRoaXMubmV4dEZpZWxkTm9kZSgpKXtyZXR1cm4gQyh7dHlwZTokLGxlbmd0aDpYLG51bGxDb3VudDpRLG51bGxCaXRtYXA6dGhpcy5yZWFkTnVsbEJpdG1hcCgkLFEpLGNoaWxkOnRoaXMudmlzaXQoJC5jaGlsZHJlblswXSl9KX12aXNpdE1hcCgkLHtsZW5ndGg6WCxudWxsQ291bnQ6UX09dGhpcy5uZXh0RmllbGROb2RlKCkpe3JldHVybiBDKHt0eXBlOiQsbGVuZ3RoOlgsbnVsbENvdW50OlEsbnVsbEJpdG1hcDp0aGlzLnJlYWROdWxsQml0bWFwKCQsUSksdmFsdWVPZmZzZXRzOnRoaXMucmVhZE9mZnNldHMoJCksY2hpbGQ6dGhpcy52aXNpdCgkLmNoaWxkcmVuWzBdKX0pfW5leHRGaWVsZE5vZGUoKXtyZXR1cm4gdGhpcy5ub2Rlc1srK3RoaXMubm9kZXNJbmRleF19bmV4dEJ1ZmZlclJhbmdlKCl7cmV0dXJuIHRoaXMuYnVmZmVyc1srK3RoaXMuYnVmZmVyc0luZGV4XX1yZWFkTnVsbEJpdG1hcCgkLFgsUT10aGlzLm5leHRCdWZmZXJSYW5nZSgpKXtyZXR1cm4gWD4wJiZ0aGlzLnJlYWREYXRhKCQsUSl8fG5ldyBVaW50OEFycmF5KDApfXJlYWRPZmZzZXRzKCQsWCl7cmV0dXJuIHRoaXMucmVhZERhdGEoJCxYKX1yZWFkVHlwZUlkcygkLFgpe3JldHVybiB0aGlzLnJlYWREYXRhKCQsWCl9cmVhZERhdGEoJCx7bGVuZ3RoOlgsb2Zmc2V0OlF9PXRoaXMubmV4dEJ1ZmZlclJhbmdlKCkpe3JldHVybiB0aGlzLmJ5dGVzLnN1YmFycmF5KFEsUStYKX1yZWFkVmFyaWFkaWNCdWZmZXJzKCQpe3JldHVybiBBcnJheS5mcm9tKHtsZW5ndGg6JH0sKCk9PnRoaXMucmVhZERhdGEobnVsbCkpfW5leHRWYXJpYWRpY0J1ZmZlckNvdW50KCl7dmFyICQ7cmV0dXJuKCQ9dGhpcy52YXJpYWRpY0J1ZmZlckNvdW50c1srK3RoaXMudmFyaWFkaWNCdWZmZXJJbmRleF0pIT09bnVsbCYmJCE9PXZvaWQgMD8kOjB9cmVhZERpY3Rpb25hcnkoJCl7cmV0dXJuIHRoaXMuZGljdGlvbmFyaWVzLmdldCgkLmlkKX19O0cyPWNsYXNzIEcyIGV4dGVuZHMgY1F7Y29uc3RydWN0b3IoJCxYLFEsWixKLFk9W10pe3N1cGVyKG5ldyBVaW50OEFycmF5KDApLFgsUSxaLEosWSk7dGhpcy5zb3VyY2VzPSR9cmVhZE51bGxCaXRtYXAoJCxYLHtvZmZzZXQ6UX09dGhpcy5uZXh0QnVmZmVyUmFuZ2UoKSl7cmV0dXJuIFg8PTA/bmV3IFVpbnQ4QXJyYXkoMCk6RDYodGhpcy5zb3VyY2VzW1FdKX1yZWFkT2Zmc2V0cygkLHtvZmZzZXQ6WH09dGhpcy5uZXh0QnVmZmVyUmFuZ2UoKSl7cmV0dXJuIHQoVWludDhBcnJheSx0KCQuT2Zmc2V0QXJyYXlUeXBlLHRoaXMuc291cmNlc1tYXSkpfXJlYWRUeXBlSWRzKCQse29mZnNldDpYfT10aGlzLm5leHRCdWZmZXJSYW5nZSgpKXtyZXR1cm4gdChVaW50OEFycmF5LHQoJC5BcnJheVR5cGUsdGhpcy5zb3VyY2VzW1hdKSl9cmVhZERhdGEoJCx7b2Zmc2V0Olh9PXRoaXMubmV4dEJ1ZmZlclJhbmdlKCkpe2xldHtzb3VyY2VzOlF9PXRoaXM7aWYoUi5pc1RpbWVzdGFtcCgkKSlyZXR1cm4gdChVaW50OEFycmF5LEQwLmNvbnZlcnRBcnJheShRW1hdKSk7ZWxzZSBpZigoUi5pc0ludCgkKXx8Ui5pc1RpbWUoJCkpJiYkLmJpdFdpZHRoPT09NjR8fFIuaXNEdXJhdGlvbigkKSlyZXR1cm4gdChVaW50OEFycmF5LEQwLmNvbnZlcnRBcnJheShRW1hdKSk7ZWxzZSBpZihSLmlzRGF0ZSgkKSYmJC51bml0PT09SjguTUlMTElTRUNPTkQpcmV0dXJuIHQoVWludDhBcnJheSxEMC5jb252ZXJ0QXJyYXkoUVtYXSkpO2Vsc2UgaWYoUi5pc0RlY2ltYWwoJCkpcmV0dXJuIHQoVWludDhBcnJheSxUJC5jb252ZXJ0QXJyYXkoUVtYXSkpO2Vsc2UgaWYoUi5pc0JpbmFyeSgkKXx8Ui5pc0xhcmdlQmluYXJ5KCQpfHxSLmlzRml4ZWRTaXplQmluYXJ5KCQpKXJldHVybiBERyhRW1hdKTtlbHNlIGlmKFIuaXNCaW5hcnlWaWV3KCQpKXJldHVybiB3RyhRW1hdKTtlbHNlIGlmKFIuaXNVdGY4VmlldygkKSlyZXR1cm4gVkcoUVtYXSk7ZWxzZSBpZihSLmlzQm9vbCgkKSlyZXR1cm4gRDYoUVtYXSk7ZWxzZSBpZihSLmlzVXRmOCgkKXx8Ui5pc0xhcmdlVXRmOCgkKSlyZXR1cm4gSCQoUVtYXS5qb2luKCIiKSk7ZWxzZSBpZihSLmlzSW50ZXJ2YWwoJCkpc3dpdGNoKCQudW5pdCl7Y2FzZSBlLkRBWV9USU1FOnJldHVybiBZMihRW1hdKTtjYXNlIGUuTU9OVEhfREFZX05BTk86cmV0dXJuIEgyKFFbWF0pO2RlZmF1bHQ6YnJlYWt9cmV0dXJuIHQoVWludDhBcnJheSx0KCQuQXJyYXlUeXBlLFFbWF0ubWFwKChaKT0+K1opKSl9cmVhZFZhcmlhZGljQnVmZmVycygkKXtsZXQgWD1bXTtmb3IobGV0IFE9MDtRPCQ7USsrKXtsZXR7b2Zmc2V0Olp9PXRoaXMubmV4dEJ1ZmZlclJhbmdlKCksSj10aGlzLnNvdXJjZXNbWl07WC5wdXNoKFI1KEopKX1yZXR1cm4gWH19O3EyPWNsYXNzIHEyIGV4dGVuZHMgY1F7Y29uc3RydWN0b3IoJCxYLFEsWixKLFk9W10pe3N1cGVyKG5ldyBVaW50OEFycmF5KDApLFgsUSxaLEosWSk7dGhpcy5ib2R5Q2h1bmtzPSR9cmVhZERhdGEoJCxYPXRoaXMubmV4dEJ1ZmZlclJhbmdlKCkpe3JldHVybiB0aGlzLmJvZHlDaHVua3NbdGhpcy5idWZmZXJzSW5kZXhdfX19KTt2YXIgSjY7dmFyIGRKPUEoKCk9Pnt6MSgpO2s4KCk7bzgoKTtKNj1jbGFzcyBKNiBleHRlbmRzIEYke2NvbnN0cnVjdG9yKCQpe3N1cGVyKCQpO3RoaXMuX3ZhbHVlcz1uZXcgTiQoVWludDhBcnJheSl9Z2V0IGJ5dGVMZW5ndGgoKXtsZXQgJD10aGlzLl9wZW5kaW5nTGVuZ3RoK3RoaXMubGVuZ3RoKjQ7cmV0dXJuIHRoaXMuX29mZnNldHMmJigkKz10aGlzLl9vZmZzZXRzLmJ5dGVMZW5ndGgpLHRoaXMuX3ZhbHVlcyYmKCQrPXRoaXMuX3ZhbHVlcy5ieXRlTGVuZ3RoKSx0aGlzLl9udWxscyYmKCQrPXRoaXMuX251bGxzLmJ5dGVMZW5ndGgpLCR9c2V0VmFsdWUoJCxYKXtyZXR1cm4gc3VwZXIuc2V0VmFsdWUoJCx4KFgpKX1fZmx1c2hQZW5kaW5nKCQsWCl7bGV0IFE9dGhpcy5fb2Zmc2V0cyxaPXRoaXMuX3ZhbHVlcy5yZXNlcnZlKFgpLmJ1ZmZlcixKPTA7Zm9yKGxldFtZLEhdb2YgJClpZihIPT09dm9pZCAwKVEuc2V0KFksMCk7ZWxzZXtsZXQgVz1ILmxlbmd0aDtaLnNldChILEopLFEuc2V0KFksVyksSis9V319fX0pO3ZhciBZNjt2YXIgbEo9QSgoKT0+e284KCk7ejEoKTtrOCgpO1k2PWNsYXNzIFk2IGV4dGVuZHMgRiR7Y29uc3RydWN0b3IoJCl7c3VwZXIoJCk7dGhpcy5fdmFsdWVzPW5ldyBOJChVaW50OEFycmF5KX1nZXQgYnl0ZUxlbmd0aCgpe2xldCAkPXRoaXMuX3BlbmRpbmdMZW5ndGgrdGhpcy5sZW5ndGgqNDtyZXR1cm4gdGhpcy5fb2Zmc2V0cyYmKCQrPXRoaXMuX29mZnNldHMuYnl0ZUxlbmd0aCksdGhpcy5fdmFsdWVzJiYoJCs9dGhpcy5fdmFsdWVzLmJ5dGVMZW5ndGgpLHRoaXMuX251bGxzJiYoJCs9dGhpcy5fbnVsbHMuYnl0ZUxlbmd0aCksJH1zZXRWYWx1ZSgkLFgpe3JldHVybiBzdXBlci5zZXRWYWx1ZSgkLHgoWCkpfV9mbHVzaFBlbmRpbmcoJCxYKXtsZXQgUT10aGlzLl9vZmZzZXRzLFo9dGhpcy5fdmFsdWVzLnJlc2VydmUoWCkuYnVmZmVyLEo9MDtmb3IobGV0W1ksSF1vZiAkKWlmKEg9PT12b2lkIDApUS5zZXQoWSxCaWdJbnQoMCkpO2Vsc2V7bGV0IFc9SC5sZW5ndGg7Wi5zZXQoSCxKKSxRLnNldChZLEJpZ0ludChXKSksSis9V319fX0pO3ZhciB4WDt2YXIgejI9QSgoKT0+e3oxKCk7azgoKTt4WD1jbGFzcyB4WCBleHRlbmRzIFI4e2NvbnN0cnVjdG9yKCQpe3N1cGVyKCQpO3RoaXMuX3ZhbHVlcz1uZXcgZlF9c2V0VmFsdWUoJCxYKXt0aGlzLl92YWx1ZXMuc2V0KCQsK1gpfX19KTt2YXIgajEsSTYsXzY7dmFyIEUyPUEoKCk9PntrOCgpO0wkKCk7ajE9Y2xhc3MgajEgZXh0ZW5kcyByOHt9O2oxLnByb3RvdHlwZS5fc2V0VmFsdWU9Ylk7STY9Y2xhc3MgSTYgZXh0ZW5kcyBqMXt9O0k2LnByb3RvdHlwZS5fc2V0VmFsdWU9SEo7XzY9Y2xhc3MgXzYgZXh0ZW5kcyBqMXt9O182LnByb3RvdHlwZS5fc2V0VmFsdWU9V0p9KTt2YXIgVDY7dmFyIE0yPUEoKCk9PntrOCgpO0wkKCk7VDY9Y2xhc3MgVDYgZXh0ZW5kcyByOHt9O1Q2LnByb3RvdHlwZS5fc2V0VmFsdWU9dVl9KTt2YXIgZ1g7dmFyIEwyPUEoKCk9PntOOCgpO2s4KCk7dlgoKTtnWD1jbGFzcyBnWCBleHRlbmRzIFI4e2NvbnN0cnVjdG9yKHt0eXBlOiQsbnVsbFZhbHVlczpYLGRpY3Rpb25hcnlIYXNoRnVuY3Rpb246UX0pe3N1cGVyKHt0eXBlOm5ldyBzOCgkLmRpY3Rpb25hcnksJC5pbmRpY2VzLCQuaWQsJC5pc09yZGVyZWQpfSk7aWYodGhpcy5fbnVsbHM9bnVsbCx0aGlzLl9kaWN0aW9uYXJ5T2Zmc2V0PTAsdGhpcy5fa2V5c1RvSW5kaWNlcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuaW5kaWNlcz1vJCh7dHlwZTp0aGlzLnR5cGUuaW5kaWNlcyxudWxsVmFsdWVzOlh9KSx0aGlzLmRpY3Rpb25hcnk9byQoe3R5cGU6dGhpcy50eXBlLmRpY3Rpb25hcnksbnVsbFZhbHVlczpudWxsfSksdHlwZW9mIFE9PT0iZnVuY3Rpb24iKXRoaXMudmFsdWVUb0tleT1RfWdldCB2YWx1ZXMoKXtyZXR1cm4gdGhpcy5pbmRpY2VzLnZhbHVlc31nZXQgbnVsbENvdW50KCl7cmV0dXJuIHRoaXMuaW5kaWNlcy5udWxsQ291bnR9Z2V0IG51bGxCaXRtYXAoKXtyZXR1cm4gdGhpcy5pbmRpY2VzLm51bGxCaXRtYXB9Z2V0IGJ5dGVMZW5ndGgoKXtyZXR1cm4gdGhpcy5pbmRpY2VzLmJ5dGVMZW5ndGgrdGhpcy5kaWN0aW9uYXJ5LmJ5dGVMZW5ndGh9Z2V0IHJlc2VydmVkTGVuZ3RoKCl7cmV0dXJuIHRoaXMuaW5kaWNlcy5yZXNlcnZlZExlbmd0aCt0aGlzLmRpY3Rpb25hcnkucmVzZXJ2ZWRMZW5ndGh9Z2V0IHJlc2VydmVkQnl0ZUxlbmd0aCgpe3JldHVybiB0aGlzLmluZGljZXMucmVzZXJ2ZWRCeXRlTGVuZ3RoK3RoaXMuZGljdGlvbmFyeS5yZXNlcnZlZEJ5dGVMZW5ndGh9aXNWYWxpZCgkKXtyZXR1cm4gdGhpcy5pbmRpY2VzLmlzVmFsaWQoJCl9c2V0VmFsaWQoJCxYKXtsZXQgUT10aGlzLmluZGljZXM7cmV0dXJuIFg9US5zZXRWYWxpZCgkLFgpLHRoaXMubGVuZ3RoPVEubGVuZ3RoLFh9c2V0VmFsdWUoJCxYKXtsZXQgUT10aGlzLl9rZXlzVG9JbmRpY2VzLFo9dGhpcy52YWx1ZVRvS2V5KFgpLEo9UVtaXTtpZihKPT09dm9pZCAwKVFbWl09Sj10aGlzLl9kaWN0aW9uYXJ5T2Zmc2V0K3RoaXMuZGljdGlvbmFyeS5hcHBlbmQoWCkubGVuZ3RoLTE7cmV0dXJuIHRoaXMuaW5kaWNlcy5zZXRWYWx1ZSgkLEopfWZsdXNoKCl7bGV0ICQ9dGhpcy50eXBlLFg9dGhpcy5fZGljdGlvbmFyeSxRPXRoaXMuZGljdGlvbmFyeS50b1ZlY3RvcigpLFo9dGhpcy5pbmRpY2VzLmZsdXNoKCkuY2xvbmUoJCk7cmV0dXJuIFouZGljdGlvbmFyeT1YP1guY29uY2F0KFEpOlEsdGhpcy5maW5pc2hlZHx8KHRoaXMuX2RpY3Rpb25hcnlPZmZzZXQrPVEubGVuZ3RoKSx0aGlzLl9kaWN0aW9uYXJ5PVouZGljdGlvbmFyeSx0aGlzLmNsZWFyKCksWn1maW5pc2goKXtyZXR1cm4gdGhpcy5pbmRpY2VzLmZpbmlzaCgpLHRoaXMuZGljdGlvbmFyeS5maW5pc2goKSx0aGlzLl9kaWN0aW9uYXJ5T2Zmc2V0PTAsdGhpcy5fa2V5c1RvSW5kaWNlcz1PYmplY3QuY3JlYXRlKG51bGwpLHN1cGVyLmZpbmlzaCgpfWNsZWFyKCl7cmV0dXJuIHRoaXMuaW5kaWNlcy5jbGVhcigpLHRoaXMuZGljdGlvbmFyeS5jbGVhcigpLHN1cGVyLmNsZWFyKCl9dmFsdWVUb0tleSgkKXtyZXR1cm4gdHlwZW9mICQ9PT0ic3RyaW5nIj8kOmAkeyR9YH19fSk7dmFyIHg2O3ZhciBOMj1BKCgpPT57azgoKTtMJCgpO3g2PWNsYXNzIHg2IGV4dGVuZHMgcjh7fTt4Ni5wcm90b3R5cGUuX3NldFZhbHVlPWZZfSk7dmFyIGhYO3ZhciBGMj1BKCgpPT57djAoKTtrOCgpO044KCk7aFg9Y2xhc3MgaFggZXh0ZW5kcyBSOHtzZXRWYWx1ZSgkLFgpe2xldFtRXT10aGlzLmNoaWxkcmVuLFo9JCp0aGlzLnN0cmlkZTtmb3IobGV0IEo9LTEsWT10aGlzLnN0cmlkZTsrK0o8WTspUS5zZXQoWitKLFhbSl0pfXNldFZhbGlkKCQsWCl7aWYoIXN1cGVyLnNldFZhbGlkKCQsWCkpdGhpcy5jaGlsZHJlblswXS5zZXRWYWxpZCgoJCsxKSp0aGlzLnN0cmlkZS0xLCExKTtyZXR1cm4gWH1hZGRDaGlsZCgkLFg9IjAiKXtpZih0aGlzLm51bUNoaWxkcmVuPjApdGhyb3cgRXJyb3IoIkZpeGVkU2l6ZUxpc3RCdWlsZGVyIGNhbiBvbmx5IGhhdmUgb25lIGNoaWxkLiIpO2xldCBRPXRoaXMuY2hpbGRyZW4ucHVzaCgkKTtyZXR1cm4gdGhpcy50eXBlPW5ldyBhMCh0aGlzLnR5cGUubGlzdFNpemUsbmV3IHcoWCwkLnR5cGUsITApKSxRfX19KTt2YXIgUzEseVgsbVgsZlg7dmFyIEEyPUEoKCk9Pnt4USgpO2s4KCk7UzE9Y2xhc3MgUzEgZXh0ZW5kcyByOHtzZXRWYWx1ZSgkLFgpe3RoaXMuX3ZhbHVlcy5zZXQoJCxYKX19O3lYPWNsYXNzIHlYIGV4dGVuZHMgUzF7c2V0VmFsdWUoJCxYKXtzdXBlci5zZXRWYWx1ZSgkLFRRKFgpKX19O21YPWNsYXNzIG1YIGV4dGVuZHMgUzF7fTtmWD1jbGFzcyBmWCBleHRlbmRzIFMxe319KTt2YXIgRTEsZzYsdjYsaDY7dmFyIFUyPUEoKCk9PntrOCgpO0wkKCk7RTE9Y2xhc3MgRTEgZXh0ZW5kcyByOHt9O0UxLnByb3RvdHlwZS5fc2V0VmFsdWU9ZFk7ZzY9Y2xhc3MgZzYgZXh0ZW5kcyBFMXt9O2c2LnByb3RvdHlwZS5fc2V0VmFsdWU9Tko7djY9Y2xhc3MgdjYgZXh0ZW5kcyBFMXt9O3Y2LnByb3RvdHlwZS5fc2V0VmFsdWU9Rko7aDY9Y2xhc3MgaDYgZXh0ZW5kcyBFMXt9O2g2LnByb3RvdHlwZS5fc2V0VmFsdWU9QUp9KTt2YXIgcyQseTYsbTYsZjYsYjY7dmFyIFIyPUEoKCk9PntrOCgpO0wkKCk7cyQ9Y2xhc3MgcyQgZXh0ZW5kcyByOHt9O3MkLnByb3RvdHlwZS5fc2V0VmFsdWU9bFk7eTY9Y2xhc3MgeTYgZXh0ZW5kcyBzJHt9O3k2LnByb3RvdHlwZS5fc2V0VmFsdWU9VUo7bTY9Y2xhc3MgbTYgZXh0ZW5kcyBzJHt9O202LnByb3RvdHlwZS5fc2V0VmFsdWU9Uko7ZjY9Y2xhc3MgZjYgZXh0ZW5kcyBzJHt9O2Y2LnByb3RvdHlwZS5fc2V0VmFsdWU9Q0o7YjY9Y2xhc3MgYjYgZXh0ZW5kcyBzJHt9O2I2LnByb3RvdHlwZS5fc2V0VmFsdWU9T0p9KTt2YXIgUSQsYlgscFgsY1gsdVgsZFgsbFgsblgsb1g7dmFyIEMyPUEoKCk9PntrOCgpO1EkPWNsYXNzIFEkIGV4dGVuZHMgcjh7c2V0VmFsdWUoJCxYKXt0aGlzLl92YWx1ZXMuc2V0KCQsWCl9fTtiWD1jbGFzcyBiWCBleHRlbmRzIFEke307cFg9Y2xhc3MgcFggZXh0ZW5kcyBRJHt9O2NYPWNsYXNzIGNYIGV4dGVuZHMgUSR7fTt1WD1jbGFzcyB1WCBleHRlbmRzIFEke307ZFg9Y2xhc3MgZFggZXh0ZW5kcyBRJHt9O2xYPWNsYXNzIGxYIGV4dGVuZHMgUSR7fTtuWD1jbGFzcyBuWCBleHRlbmRzIFEke307b1g9Y2xhc3Mgb1ggZXh0ZW5kcyBRJHt9fSk7dmFyIHNYO3ZhciBPMj1BKCgpPT57djAoKTtOOCgpO3oxKCk7azgoKTtzWD1jbGFzcyBzWCBleHRlbmRzIEYke2NvbnN0cnVjdG9yKCQpe3N1cGVyKCQpO3RoaXMuX29mZnNldHM9bmV3IGJRKCQudHlwZSl9YWRkQ2hpbGQoJCxYPSIwIil7aWYodGhpcy5udW1DaGlsZHJlbj4wKXRocm93IEVycm9yKCJMaXN0QnVpbGRlciBjYW4gb25seSBoYXZlIG9uZSBjaGlsZC4iKTtyZXR1cm4gdGhpcy5jaGlsZHJlblt0aGlzLm51bUNoaWxkcmVuXT0kLHRoaXMudHlwZT1uZXcgRTAobmV3IHcoWCwkLnR5cGUsITApKSx0aGlzLm51bUNoaWxkcmVuLTF9X2ZsdXNoUGVuZGluZygkKXtsZXQgWD10aGlzLl9vZmZzZXRzLFtRXT10aGlzLmNoaWxkcmVuO2ZvcihsZXRbWixKXW9mICQpaWYodHlwZW9mIEo+InUiKVguc2V0KFosMCk7ZWxzZXtsZXQgWT1KLEg9WS5sZW5ndGgsVz1YLnNldChaLEgpLmJ1ZmZlcltaXTtmb3IobGV0IFA9LTE7KytQPEg7KVEuc2V0KFcrUCxZW1BdKX19fX0pO3ZhciByWDt2YXIgazI9QSgoKT0+e3YwKCk7TjgoKTtrOCgpO3JYPWNsYXNzIHJYIGV4dGVuZHMgRiR7c2V0KCQsWCl7cmV0dXJuIHN1cGVyLnNldCgkLFgpfXNldFZhbHVlKCQsWCl7bGV0IFE9WCBpbnN0YW5jZW9mIE1hcD9YOm5ldyBNYXAoT2JqZWN0LmVudHJpZXMoWCkpLFo9dGhpcy5fcGVuZGluZ3x8KHRoaXMuX3BlbmRpbmc9bmV3IE1hcCksSj1aLmdldCgkKTtKJiYodGhpcy5fcGVuZGluZ0xlbmd0aC09Si5zaXplKSx0aGlzLl9wZW5kaW5nTGVuZ3RoKz1RLnNpemUsWi5zZXQoJCxRKX1hZGRDaGlsZCgkLFg9YCR7dGhpcy5udW1DaGlsZHJlbn1gKXtpZih0aGlzLm51bUNoaWxkcmVuPjApdGhyb3cgRXJyb3IoIkxpc3RCdWlsZGVyIGNhbiBvbmx5IGhhdmUgb25lIGNoaWxkLiIpO3JldHVybiB0aGlzLmNoaWxkcmVuW3RoaXMubnVtQ2hpbGRyZW5dPSQsdGhpcy50eXBlPW5ldyBnMChuZXcgdyhYLCQudHlwZSwhMCksdGhpcy50eXBlLmtleXNTb3J0ZWQpLHRoaXMubnVtQ2hpbGRyZW4tMX1fZmx1c2hQZW5kaW5nKCQpe2xldCBYPXRoaXMuX29mZnNldHMsW1FdPXRoaXMuY2hpbGRyZW47Zm9yKGxldFtaLEpdb2YgJClpZihKPT09dm9pZCAwKVguc2V0KFosMCk7ZWxzZXtsZXR7W1pdOlksW1orMV06SH09WC5zZXQoWixKLnNpemUpLmJ1ZmZlcjtmb3IobGV0IFcgb2YgSi5lbnRyaWVzKCkpaWYoUS5zZXQoWSxXKSwrK1k+PUgpYnJlYWt9fX19KTt2YXIgaVg7dmFyIGoyPUEoKCk9PntrOCgpO2lYPWNsYXNzIGlYIGV4dGVuZHMgUjh7c2V0VmFsdWUoJCxYKXt9c2V0VmFsaWQoJCxYKXtyZXR1cm4gdGhpcy5sZW5ndGg9TWF0aC5tYXgoJCsxLHRoaXMubGVuZ3RoKSxYfX19KTt2YXIgYVg7dmFyIFMyPUEoKCk9Pnt2MCgpO2s4KCk7TjgoKTthWD1jbGFzcyBhWCBleHRlbmRzIFI4e3NldFZhbHVlKCQsWCl7bGV0e2NoaWxkcmVuOlEsdHlwZTpafT10aGlzO3N3aXRjaChBcnJheS5pc0FycmF5KFgpfHxYLmNvbnN0cnVjdG9yKXtjYXNlITA6cmV0dXJuIFouY2hpbGRyZW4uZm9yRWFjaCgoSixZKT0+UVtZXS5zZXQoJCxYW1ldKSk7Y2FzZSBNYXA6cmV0dXJuIFouY2hpbGRyZW4uZm9yRWFjaCgoSixZKT0+UVtZXS5zZXQoJCxYLmdldChKLm5hbWUpKSk7ZGVmYXVsdDpyZXR1cm4gWi5jaGlsZHJlbi5mb3JFYWNoKChKLFkpPT5RW1ldLnNldCgkLFhbSi5uYW1lXSkpfX1zZXRWYWxpZCgkLFgpe2lmKCFzdXBlci5zZXRWYWxpZCgkLFgpKXRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoUSk9PlEuc2V0VmFsaWQoJCxYKSk7cmV0dXJuIFh9YWRkQ2hpbGQoJCxYPWAke3RoaXMubnVtQ2hpbGRyZW59YCl7bGV0IFE9dGhpcy5jaGlsZHJlbi5wdXNoKCQpO3JldHVybiB0aGlzLnR5cGU9bmV3IGwoWy4uLnRoaXMudHlwZS5jaGlsZHJlbixuZXcgdyhYLCQudHlwZSwhMCldKSxRfX19KTt2YXIgciQscDYsYzYsdTYsZDY7dmFyIEQyPUEoKCk9PntrOCgpO0wkKCk7ciQ9Y2xhc3MgciQgZXh0ZW5kcyByOHt9O3IkLnByb3RvdHlwZS5fc2V0VmFsdWU9cFk7cDY9Y2xhc3MgcDYgZXh0ZW5kcyByJHt9O3A2LnByb3RvdHlwZS5fc2V0VmFsdWU9S0o7YzY9Y2xhc3MgYzYgZXh0ZW5kcyByJHt9O2M2LnByb3RvdHlwZS5fc2V0VmFsdWU9UEo7dTY9Y2xhc3MgdTYgZXh0ZW5kcyByJHt9O3U2LnByb3RvdHlwZS5fc2V0VmFsdWU9R0o7ZDY9Y2xhc3MgZDYgZXh0ZW5kcyByJHt9O2Q2LnByb3RvdHlwZS5fc2V0VmFsdWU9cUp9KTt2YXIgaSQsbDYsbjYsbzYsczY7dmFyIHcyPUEoKCk9PntrOCgpO0wkKCk7aSQ9Y2xhc3MgaSQgZXh0ZW5kcyByOHt9O2kkLnByb3RvdHlwZS5fc2V0VmFsdWU9Y1k7bDY9Y2xhc3MgbDYgZXh0ZW5kcyBpJHt9O2w2LnByb3RvdHlwZS5fc2V0VmFsdWU9eko7bjY9Y2xhc3MgbjYgZXh0ZW5kcyBpJHt9O242LnByb3RvdHlwZS5fc2V0VmFsdWU9RUo7bzY9Y2xhc3MgbzYgZXh0ZW5kcyBpJHt9O282LnByb3RvdHlwZS5fc2V0VmFsdWU9TUo7czY9Y2xhc3MgczYgZXh0ZW5kcyBpJHt9O3M2LnByb3RvdHlwZS5fc2V0VmFsdWU9TEp9KTt2YXIgSDYsdFgsZVg7dmFyIFYyPUEoKCk9Pnt2MCgpO3oxKCk7azgoKTtOOCgpO0g2PWNsYXNzIEg2IGV4dGVuZHMgUjh7Y29uc3RydWN0b3IoJCl7c3VwZXIoJCk7aWYodGhpcy5fdHlwZUlkcz1uZXcgZTEoSW50OEFycmF5LDAsMSksdHlwZW9mICQudmFsdWVUb0NoaWxkVHlwZUlkPT09ImZ1bmN0aW9uIil0aGlzLl92YWx1ZVRvQ2hpbGRUeXBlSWQ9JC52YWx1ZVRvQ2hpbGRUeXBlSWR9Z2V0IHR5cGVJZFRvQ2hpbGRJbmRleCgpe3JldHVybiB0aGlzLnR5cGUudHlwZUlkVG9DaGlsZEluZGV4fWFwcGVuZCgkLFgpe3JldHVybiB0aGlzLnNldCh0aGlzLmxlbmd0aCwkLFgpfXNldCgkLFgsUSl7aWYoUT09PXZvaWQgMClRPXRoaXMuX3ZhbHVlVG9DaGlsZFR5cGVJZCh0aGlzLFgsJCk7cmV0dXJuIHRoaXMuc2V0VmFsdWUoJCxYLFEpLHRoaXN9c2V0VmFsdWUoJCxYLFEpe3RoaXMuX3R5cGVJZHMuc2V0KCQsUSk7bGV0IFo9dGhpcy50eXBlLnR5cGVJZFRvQ2hpbGRJbmRleFtRXSxKPXRoaXMuY2hpbGRyZW5bWl07Sj09PW51bGx8fEo9PT12b2lkIDB8fEouc2V0KCQsWCksdGhpcy5sZW5ndGg9TWF0aC5tYXgoJCsxLHRoaXMubGVuZ3RoKX1hZGRDaGlsZCgkLFg9YCR7dGhpcy5jaGlsZHJlbi5sZW5ndGh9YCl7bGV0IFE9dGhpcy5jaGlsZHJlbi5wdXNoKCQpLHt0eXBlOntjaGlsZHJlbjpaLG1vZGU6Six0eXBlSWRzOll9fT10aGlzLEg9Wy4uLlosbmV3IHcoWCwkLnR5cGUpXTtyZXR1cm4gdGhpcy50eXBlPW5ldyBpMChKLFsuLi5ZLFFdLEgpLFF9X3ZhbHVlVG9DaGlsZFR5cGVJZCgkLFgsUSl7dGhyb3cgRXJyb3IoIkNhbm5vdCBtYXAgVW5pb25CdWlsZGVyIHZhbHVlIHRvIGNoaWxkIHR5cGVJZC4gUGFzcyB0aGUgYGNoaWxkVHlwZUlkYCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHVuaW9uQnVpbGRlci5hcHBlbmQoKSwgb3Igc3VwcGx5IGEgYHZhbHVlVG9DaGlsZFR5cGVJZGAgZnVuY3Rpb24gYXMgcGFydCBvZiB0aGUgVW5pb25CdWlsZGVyIGNvbnN0cnVjdG9yIG9wdGlvbnMuIil9fTt0WD1jbGFzcyB0WCBleHRlbmRzIEg2e307ZVg9Y2xhc3MgZVggZXh0ZW5kcyBINntjb25zdHJ1Y3RvcigkKXtzdXBlcigkKTt0aGlzLl9vZmZzZXRzPW5ldyBlMShJbnQzMkFycmF5KX1zZXRWYWx1ZSgkLFgsUSl7bGV0IFo9dGhpcy5fdHlwZUlkcy5zZXQoJCxRKS5idWZmZXJbJF0sSj10aGlzLmdldENoaWxkQXQodGhpcy50eXBlLnR5cGVJZFRvQ2hpbGRJbmRleFtaXSksWT10aGlzLl9vZmZzZXRzLnNldCgkLEoubGVuZ3RoKS5idWZmZXJbJF07Sj09PW51bGx8fEo9PT12b2lkIDB8fEouc2V0KFksWCksdGhpcy5sZW5ndGg9TWF0aC5tYXgoJCsxLHRoaXMubGVuZ3RoKX19fSk7dmFyIHI2O3ZhciBCMj1BKCgpPT57VTEoKTtkSigpO3oxKCk7azgoKTtyNj1jbGFzcyByNiBleHRlbmRzIEYke2NvbnN0cnVjdG9yKCQpe3N1cGVyKCQpO3RoaXMuX3ZhbHVlcz1uZXcgTiQoVWludDhBcnJheSl9Z2V0IGJ5dGVMZW5ndGgoKXtsZXQgJD10aGlzLl9wZW5kaW5nTGVuZ3RoK3RoaXMubGVuZ3RoKjQ7cmV0dXJuIHRoaXMuX29mZnNldHMmJigkKz10aGlzLl9vZmZzZXRzLmJ5dGVMZW5ndGgpLHRoaXMuX3ZhbHVlcyYmKCQrPXRoaXMuX3ZhbHVlcy5ieXRlTGVuZ3RoKSx0aGlzLl9udWxscyYmKCQrPXRoaXMuX251bGxzLmJ5dGVMZW5ndGgpLCR9c2V0VmFsdWUoJCxYKXtyZXR1cm4gc3VwZXIuc2V0VmFsdWUoJCxIJChYKSl9X2ZsdXNoUGVuZGluZygkLFgpe319O3I2LnByb3RvdHlwZS5fZmx1c2hQZW5kaW5nPUo2LnByb3RvdHlwZS5fZmx1c2hQZW5kaW5nfSk7dmFyIGk2O3ZhciBJMj1BKCgpPT57VTEoKTt6MSgpO2s4KCk7bEooKTtpNj1jbGFzcyBpNiBleHRlbmRzIEYke2NvbnN0cnVjdG9yKCQpe3N1cGVyKCQpO3RoaXMuX3ZhbHVlcz1uZXcgTiQoVWludDhBcnJheSl9Z2V0IGJ5dGVMZW5ndGgoKXtsZXQgJD10aGlzLl9wZW5kaW5nTGVuZ3RoK3RoaXMubGVuZ3RoKjQ7cmV0dXJuIHRoaXMuX29mZnNldHMmJigkKz10aGlzLl9vZmZzZXRzLmJ5dGVMZW5ndGgpLHRoaXMuX3ZhbHVlcyYmKCQrPXRoaXMuX3ZhbHVlcy5ieXRlTGVuZ3RoKSx0aGlzLl9udWxscyYmKCQrPXRoaXMuX251bGxzLmJ5dGVMZW5ndGgpLCR9c2V0VmFsdWUoJCxYKXtyZXR1cm4gc3VwZXIuc2V0VmFsdWUoJCxIJChYKSl9X2ZsdXNoUGVuZGluZygkLFgpe319O2k2LnByb3RvdHlwZS5fZmx1c2hQZW5kaW5nPVk2LnByb3RvdHlwZS5fZmx1c2hQZW5kaW5nfSk7dmFyIFc2O3ZhciBuSj1BKCgpPT57TjgoKTtrOCgpO3oxKCk7bzgoKTtfJCgpO1c2PWNsYXNzIFc2IGV4dGVuZHMgUjh7Y29uc3RydWN0b3IoJCl7c3VwZXIoJCk7dGhpcy5fdmFyaWFkaWNCdWZmZXJzPVtdLHRoaXMuX2N1cnJlbnRCdWZmZXI9bnVsbCx0aGlzLl9jdXJyZW50QnVmZmVySW5kZXg9MCx0aGlzLl9jdXJyZW50QnVmZmVyT2Zmc2V0PTAsdGhpcy5fYnVmZmVyU2l6ZT0zMzU1NDQzMix0aGlzLl92aWV3cz1uZXcgTiQoVWludDhBcnJheSl9Z2V0IGJ5dGVMZW5ndGgoKXtsZXQgJD0wO3RoaXMuX3ZpZXdzJiYoJCs9dGhpcy5fdmlld3MuYnl0ZUxlbmd0aCksdGhpcy5fbnVsbHMmJigkKz10aGlzLl9udWxscy5ieXRlTGVuZ3RoKTtmb3IobGV0IFggb2YgdGhpcy5fdmFyaWFkaWNCdWZmZXJzKSQrPVguYnl0ZUxlbmd0aDtyZXR1cm4gdGhpcy5fY3VycmVudEJ1ZmZlciYmKCQrPXRoaXMuX2N1cnJlbnRCdWZmZXIuYnl0ZUxlbmd0aCksJH1zZXRWYWx1ZSgkLFgpe3JldHVybiB0aGlzLndyaXRlQmluYXJ5VmFsdWUoJCx0aGlzLmVuY29kZVZhbHVlKFgpKX13cml0ZUJpbmFyeVZhbHVlKCQsWCl7bGV0IFE9WC5sZW5ndGgsWj0oJCsxKSphLkVMRU1FTlRfV0lEVEgsSj10aGlzLl92aWV3cy5sZW5ndGg7aWYoWj5KKXRoaXMuX3ZpZXdzLnJlc2VydmUoWi1KKTtsZXQgWT10aGlzLl92aWV3cy5idWZmZXIsSD0kKmEuRUxFTUVOVF9XSURUSCxXPW5ldyBEYXRhVmlldyhZLmJ1ZmZlcixZLmJ5dGVPZmZzZXQrSCxhLkVMRU1FTlRfV0lEVEgpO2lmKFcuc2V0SW50MzIoYS5MRU5HVEhfT0ZGU0VULFEsITApLFE8PWEuSU5MSU5FX0NBUEFDSVRZKXtZLnNldChYLEgrYS5JTkxJTkVfT0ZGU0VUKTtmb3IobGV0IFA9UTtQPGEuSU5MSU5FX0NBUEFDSVRZO1ArKylZW0grYS5JTkxJTkVfT0ZGU0VUK1BdPTB9ZWxzZXtsZXQgUD1uZXcgRGF0YVZpZXcoWC5idWZmZXIsWC5ieXRlT2Zmc2V0LE1hdGgubWluKDQsUSkpO2lmKFcuc2V0VWludDMyKGEuSU5MSU5FX09GRlNFVCxQLmdldFVpbnQzMigwLCEwKSwhMCksIXRoaXMuX2N1cnJlbnRCdWZmZXJ8fHRoaXMuX2N1cnJlbnRCdWZmZXJPZmZzZXQrUT50aGlzLl9idWZmZXJTaXplKXtpZih0aGlzLl9jdXJyZW50QnVmZmVyKXRoaXMuX3ZhcmlhZGljQnVmZmVycy5wdXNoKHRoaXMuX2N1cnJlbnRCdWZmZXIuYnVmZmVyLnNsaWNlKDAsdGhpcy5fY3VycmVudEJ1ZmZlck9mZnNldCkpO3RoaXMuX2N1cnJlbnRCdWZmZXI9bmV3IE4kKFVpbnQ4QXJyYXkpLHRoaXMuX2N1cnJlbnRCdWZmZXJJbmRleD10aGlzLl92YXJpYWRpY0J1ZmZlcnMubGVuZ3RoLHRoaXMuX2N1cnJlbnRCdWZmZXJPZmZzZXQ9MH10aGlzLl9jdXJyZW50QnVmZmVyLnJlc2VydmUoUSkuYnVmZmVyLnNldChYLHRoaXMuX2N1cnJlbnRCdWZmZXJPZmZzZXQpLFcuc2V0SW50MzIoYS5CVUZGRVJfSU5ERVhfT0ZGU0VULHRoaXMuX2N1cnJlbnRCdWZmZXJJbmRleCwhMCksVy5zZXRJbnQzMihhLkJVRkZFUl9PRkZTRVRfT0ZGU0VULHRoaXMuX2N1cnJlbnRCdWZmZXJPZmZzZXQsITApLHRoaXMuX2N1cnJlbnRCdWZmZXJPZmZzZXQrPVF9cmV0dXJuIHRoaXN9ZW5jb2RlVmFsdWUoJCl7cmV0dXJuIHgoJCl9c2V0VmFsaWQoJCxYKXtsZXQgUT0oJCsxKSphLkVMRU1FTlRfV0lEVEgsWj10aGlzLl92aWV3cy5sZW5ndGg7aWYoUT5aKXRoaXMuX3ZpZXdzLnJlc2VydmUoUS1aKTtsZXQgSj1zdXBlci5zZXRWYWxpZCgkLFgpO2lmKCFKKXtsZXQgWT10aGlzLl92aWV3cy5idWZmZXIsSD0kKmEuRUxFTUVOVF9XSURUSDtmb3IobGV0IFc9MDtXPGEuRUxFTUVOVF9XSURUSDtXKyspWVtIK1ddPTB9cmV0dXJuIEp9Y2xlYXIoKXtyZXR1cm4gdGhpcy5fdmFyaWFkaWNCdWZmZXJzPVtdLHRoaXMuX2N1cnJlbnRCdWZmZXI9bnVsbCx0aGlzLl9jdXJyZW50QnVmZmVySW5kZXg9MCx0aGlzLl9jdXJyZW50QnVmZmVyT2Zmc2V0PTAsdGhpcy5fdmlld3MuY2xlYXIoKSxzdXBlci5jbGVhcigpfWZsdXNoKCl7bGV0e3R5cGU6JCxsZW5ndGg6WCxudWxsQ291bnQ6USxfdmlld3M6WixfbnVsbHM6Sn09dGhpcztpZih0aGlzLl9jdXJyZW50QnVmZmVyJiZ0aGlzLl9jdXJyZW50QnVmZmVyT2Zmc2V0PjApdGhpcy5fdmFyaWFkaWNCdWZmZXJzLnB1c2godGhpcy5fY3VycmVudEJ1ZmZlci5idWZmZXIuc2xpY2UoMCx0aGlzLl9jdXJyZW50QnVmZmVyT2Zmc2V0KSksdGhpcy5fY3VycmVudEJ1ZmZlcj1udWxsLHRoaXMuX2N1cnJlbnRCdWZmZXJPZmZzZXQ9MDtsZXQgWT1aLmZsdXNoKFgqYS5FTEVNRU5UX1dJRFRIKSxIPVE+MD9KLmZsdXNoKFgpOnZvaWQgMCxXPXRoaXMuX3ZhcmlhZGljQnVmZmVycy5zbGljZSgpO3JldHVybiB0aGlzLl92YXJpYWRpY0J1ZmZlcnM9W10sdGhpcy5fY3VycmVudEJ1ZmZlckluZGV4PTAsdGhpcy5jbGVhcigpLEMoe3R5cGU6JCxsZW5ndGg6WCxudWxsQ291bnQ6USxudWxsQml0bWFwOkgsWyJ2aWV3cyJdOlksWyJ2YXJpYWRpY0J1ZmZlcnMiXTpXfSl9ZmluaXNoKCl7cmV0dXJuIHRoaXMuZmluaXNoZWQ9ITAsdGhpc319fSk7dmFyICRRO3ZhciBfMj1BKCgpPT57bkooKTtVMSgpOyRRPWNsYXNzICRRIGV4dGVuZHMgVzZ7Y29uc3RydWN0b3IoJCl7c3VwZXIoJCl9c2V0VmFsdWUoJCxYKXtyZXR1cm4gdGhpcy53cml0ZUJpbmFyeVZhbHVlKCQsSCQoWCkpfX19KTt2YXIgazUsajU7dmFyIFM1PUEoKCk9PntlMCgpO2RKKCk7bEooKTt6MigpO0UyKCk7TTIoKTtMMigpO04yKCk7RjIoKTtBMigpO1UyKCk7UjIoKTtDMigpO08yKCk7azIoKTtqMigpO1MyKCk7RDIoKTt3MigpO1YyKCk7QjIoKTtJMigpO25KKCk7XzIoKTtrNT1jbGFzcyBrNSBleHRlbmRzIFR7dmlzaXROdWxsKCl7cmV0dXJuIGlYfXZpc2l0Qm9vbCgpe3JldHVybiB4WH12aXNpdEludCgpe3JldHVybiBRJH12aXNpdEludDgoKXtyZXR1cm4gYlh9dmlzaXRJbnQxNigpe3JldHVybiBwWH12aXNpdEludDMyKCl7cmV0dXJuIGNYfXZpc2l0SW50NjQoKXtyZXR1cm4gdVh9dmlzaXRVaW50OCgpe3JldHVybiBkWH12aXNpdFVpbnQxNigpe3JldHVybiBsWH12aXNpdFVpbnQzMigpe3JldHVybiBuWH12aXNpdFVpbnQ2NCgpe3JldHVybiBvWH12aXNpdEZsb2F0KCl7cmV0dXJuIFMxfXZpc2l0RmxvYXQxNigpe3JldHVybiB5WH12aXNpdEZsb2F0MzIoKXtyZXR1cm4gbVh9dmlzaXRGbG9hdDY0KCl7cmV0dXJuIGZYfXZpc2l0VXRmOCgpe3JldHVybiByNn12aXNpdExhcmdlVXRmOCgpe3JldHVybiBpNn12aXNpdEJpbmFyeSgpe3JldHVybiBKNn12aXNpdExhcmdlQmluYXJ5KCl7cmV0dXJuIFk2fXZpc2l0Rml4ZWRTaXplQmluYXJ5KCl7cmV0dXJuIHg2fXZpc2l0RGF0ZSgpe3JldHVybiBqMX12aXNpdERhdGVEYXkoKXtyZXR1cm4gSTZ9dmlzaXREYXRlTWlsbGlzZWNvbmQoKXtyZXR1cm4gXzZ9dmlzaXRUaW1lc3RhbXAoKXtyZXR1cm4gciR9dmlzaXRUaW1lc3RhbXBTZWNvbmQoKXtyZXR1cm4gcDZ9dmlzaXRUaW1lc3RhbXBNaWxsaXNlY29uZCgpe3JldHVybiBjNn12aXNpdFRpbWVzdGFtcE1pY3Jvc2Vjb25kKCl7cmV0dXJuIHU2fXZpc2l0VGltZXN0YW1wTmFub3NlY29uZCgpe3JldHVybiBkNn12aXNpdFRpbWUoKXtyZXR1cm4gaSR9dmlzaXRUaW1lU2Vjb25kKCl7cmV0dXJuIGw2fXZpc2l0VGltZU1pbGxpc2Vjb25kKCl7cmV0dXJuIG42fXZpc2l0VGltZU1pY3Jvc2Vjb25kKCl7cmV0dXJuIG82fXZpc2l0VGltZU5hbm9zZWNvbmQoKXtyZXR1cm4gczZ9dmlzaXREZWNpbWFsKCl7cmV0dXJuIFQ2fXZpc2l0TGlzdCgpe3JldHVybiBzWH12aXNpdFN0cnVjdCgpe3JldHVybiBhWH12aXNpdFVuaW9uKCl7cmV0dXJuIEg2fXZpc2l0RGVuc2VVbmlvbigpe3JldHVybiBlWH12aXNpdFNwYXJzZVVuaW9uKCl7cmV0dXJuIHRYfXZpc2l0RGljdGlvbmFyeSgpe3JldHVybiBnWH12aXNpdEludGVydmFsKCl7cmV0dXJuIEUxfXZpc2l0SW50ZXJ2YWxEYXlUaW1lKCl7cmV0dXJuIGc2fXZpc2l0SW50ZXJ2YWxZZWFyTW9udGgoKXtyZXR1cm4gdjZ9dmlzaXRJbnRlcnZhbE1vbnRoRGF5TmFubygpe3JldHVybiBoNn12aXNpdER1cmF0aW9uKCl7cmV0dXJuIHMkfXZpc2l0RHVyYXRpb25TZWNvbmQoKXtyZXR1cm4geTZ9dmlzaXREdXJhdGlvbk1pbGxpc2Vjb25kKCl7cmV0dXJuIG02fXZpc2l0RHVyYXRpb25NaWNyb3NlY29uZCgpe3JldHVybiBmNn12aXNpdER1cmF0aW9uTmFub3NlY29uZCgpe3JldHVybiBiNn12aXNpdEZpeGVkU2l6ZUxpc3QoKXtyZXR1cm4gaFh9dmlzaXRNYXAoKXtyZXR1cm4gclh9dmlzaXRCaW5hcnlWaWV3KCl7cmV0dXJuIFc2fXZpc2l0VXRmOFZpZXcoKXtyZXR1cm4gJFF9fTtqNT1uZXcgazV9KTtmdW5jdGlvbiB5MCgkLFgpe3JldHVybiBYIGluc3RhbmNlb2YgJC5jb25zdHJ1Y3Rvcn1mdW5jdGlvbiBEMSgkLFgpe3JldHVybiAkPT09WHx8eTAoJCxYKX1mdW5jdGlvbiB3MSgkLFgpe3JldHVybiAkPT09WHx8eTAoJCxYKSYmJC5iaXRXaWR0aD09PVguYml0V2lkdGgmJiQuaXNTaWduZWQ9PT1YLmlzU2lnbmVkfWZ1bmN0aW9uIG9KKCQsWCl7cmV0dXJuICQ9PT1YfHx5MCgkLFgpJiYkLnByZWNpc2lvbj09PVgucHJlY2lzaW9ufWZ1bmN0aW9uIEJHKCQsWCl7cmV0dXJuICQ9PT1YfHx5MCgkLFgpJiYkLmJ5dGVXaWR0aD09PVguYnl0ZVdpZHRofWZ1bmN0aW9uIFQyKCQsWCl7cmV0dXJuICQ9PT1YfHx5MCgkLFgpJiYkLnVuaXQ9PT1YLnVuaXR9ZnVuY3Rpb24gdVEoJCxYKXtyZXR1cm4gJD09PVh8fHkwKCQsWCkmJiQudW5pdD09PVgudW5pdCYmJC50aW1lem9uZT09PVgudGltZXpvbmV9ZnVuY3Rpb24gZFEoJCxYKXtyZXR1cm4gJD09PVh8fHkwKCQsWCkmJiQudW5pdD09PVgudW5pdCYmJC5iaXRXaWR0aD09PVguYml0V2lkdGh9ZnVuY3Rpb24gSUcoJCxYKXtyZXR1cm4gJD09PVh8fHkwKCQsWCkmJiQuY2hpbGRyZW4ubGVuZ3RoPT09WC5jaGlsZHJlbi5sZW5ndGgmJk0xLmNvbXBhcmVNYW55RmllbGRzKCQuY2hpbGRyZW4sWC5jaGlsZHJlbil9ZnVuY3Rpb24gX0coJCxYKXtyZXR1cm4gJD09PVh8fHkwKCQsWCkmJiQuY2hpbGRyZW4ubGVuZ3RoPT09WC5jaGlsZHJlbi5sZW5ndGgmJk0xLmNvbXBhcmVNYW55RmllbGRzKCQuY2hpbGRyZW4sWC5jaGlsZHJlbil9ZnVuY3Rpb24geDIoJCxYKXtyZXR1cm4gJD09PVh8fHkwKCQsWCkmJiQubW9kZT09PVgubW9kZSYmJC50eXBlSWRzLmV2ZXJ5KChRLFopPT5RPT09WC50eXBlSWRzW1pdKSYmTTEuY29tcGFyZU1hbnlGaWVsZHMoJC5jaGlsZHJlbixYLmNoaWxkcmVuKX1mdW5jdGlvbiBURygkLFgpe3JldHVybiAkPT09WHx8eTAoJCxYKSYmJC5pZD09PVguaWQmJiQuaXNPcmRlcmVkPT09WC5pc09yZGVyZWQmJk0xLnZpc2l0KCQuaW5kaWNlcyxYLmluZGljZXMpJiZNMS52aXNpdCgkLmRpY3Rpb25hcnksWC5kaWN0aW9uYXJ5KX1mdW5jdGlvbiBzSigkLFgpe3JldHVybiAkPT09WHx8eTAoJCxYKSYmJC51bml0PT09WC51bml0fWZ1bmN0aW9uIGxRKCQsWCl7cmV0dXJuICQ9PT1YfHx5MCgkLFgpJiYkLnVuaXQ9PT1YLnVuaXR9ZnVuY3Rpb24geEcoJCxYKXtyZXR1cm4gJD09PVh8fHkwKCQsWCkmJiQubGlzdFNpemU9PT1YLmxpc3RTaXplJiYkLmNoaWxkcmVuLmxlbmd0aD09PVguY2hpbGRyZW4ubGVuZ3RoJiZNMS5jb21wYXJlTWFueUZpZWxkcygkLmNoaWxkcmVuLFguY2hpbGRyZW4pfWZ1bmN0aW9uIGdHKCQsWCl7cmV0dXJuICQ9PT1YfHx5MCgkLFgpJiYkLmtleXNTb3J0ZWQ9PT1YLmtleXNTb3J0ZWQmJiQuY2hpbGRyZW4ubGVuZ3RoPT09WC5jaGlsZHJlbi5sZW5ndGgmJk0xLmNvbXBhcmVNYW55RmllbGRzKCQuY2hpbGRyZW4sWC5jaGlsZHJlbil9ZnVuY3Rpb24gYTYoJCxYKXtyZXR1cm4gTTEuY29tcGFyZVNjaGVtYXMoJCxYKX1mdW5jdGlvbiBENSgkLFgpe3JldHVybiBNMS5jb21wYXJlRmllbGRzKCQsWCl9ZnVuY3Rpb24gckooJCxYKXtyZXR1cm4gTTEudmlzaXQoJCxYKX12YXIgbSxNMTt2YXIgblE9QSgoKT0+e2UwKCk7bT1jbGFzcyBtIGV4dGVuZHMgVHtjb21wYXJlU2NoZW1hcygkLFgpe3JldHVybiAkPT09WHx8WCBpbnN0YW5jZW9mICQuY29uc3RydWN0b3ImJnRoaXMuY29tcGFyZU1hbnlGaWVsZHMoJC5maWVsZHMsWC5maWVsZHMpfWNvbXBhcmVNYW55RmllbGRzKCQsWCl7cmV0dXJuICQ9PT1YfHxBcnJheS5pc0FycmF5KCQpJiZBcnJheS5pc0FycmF5KFgpJiYkLmxlbmd0aD09PVgubGVuZ3RoJiYkLmV2ZXJ5KChRLFopPT50aGlzLmNvbXBhcmVGaWVsZHMoUSxYW1pdKSl9Y29tcGFyZUZpZWxkcygkLFgpe3JldHVybiAkPT09WHx8WCBpbnN0YW5jZW9mICQuY29uc3RydWN0b3ImJiQubmFtZT09PVgubmFtZSYmJC5udWxsYWJsZT09PVgubnVsbGFibGUmJnRoaXMudmlzaXQoJC50eXBlLFgudHlwZSl9fTttLnByb3RvdHlwZS52aXNpdE51bGw9RDE7bS5wcm90b3R5cGUudmlzaXRCb29sPUQxO20ucHJvdG90eXBlLnZpc2l0SW50PXcxO20ucHJvdG90eXBlLnZpc2l0SW50OD13MTttLnByb3RvdHlwZS52aXNpdEludDE2PXcxO20ucHJvdG90eXBlLnZpc2l0SW50MzI9dzE7bS5wcm90b3R5cGUudmlzaXRJbnQ2ND13MTttLnByb3RvdHlwZS52aXNpdFVpbnQ4PXcxO20ucHJvdG90eXBlLnZpc2l0VWludDE2PXcxO20ucHJvdG90eXBlLnZpc2l0VWludDMyPXcxO20ucHJvdG90eXBlLnZpc2l0VWludDY0PXcxO20ucHJvdG90eXBlLnZpc2l0RmxvYXQ9b0o7bS5wcm90b3R5cGUudmlzaXRGbG9hdDE2PW9KO20ucHJvdG90eXBlLnZpc2l0RmxvYXQzMj1vSjttLnByb3RvdHlwZS52aXNpdEZsb2F0NjQ9b0o7bS5wcm90b3R5cGUudmlzaXRVdGY4PUQxO20ucHJvdG90eXBlLnZpc2l0TGFyZ2VVdGY4PUQxO20ucHJvdG90eXBlLnZpc2l0VXRmOFZpZXc9RDE7bS5wcm90b3R5cGUudmlzaXRCaW5hcnk9RDE7bS5wcm90b3R5cGUudmlzaXRMYXJnZUJpbmFyeT1EMTttLnByb3RvdHlwZS52aXNpdEJpbmFyeVZpZXc9RDE7bS5wcm90b3R5cGUudmlzaXRGaXhlZFNpemVCaW5hcnk9Qkc7bS5wcm90b3R5cGUudmlzaXREYXRlPVQyO20ucHJvdG90eXBlLnZpc2l0RGF0ZURheT1UMjttLnByb3RvdHlwZS52aXNpdERhdGVNaWxsaXNlY29uZD1UMjttLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcD11UTttLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcFNlY29uZD11UTttLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcE1pbGxpc2Vjb25kPXVRO20ucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wTWljcm9zZWNvbmQ9dVE7bS5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBOYW5vc2Vjb25kPXVRO20ucHJvdG90eXBlLnZpc2l0VGltZT1kUTttLnByb3RvdHlwZS52aXNpdFRpbWVTZWNvbmQ9ZFE7bS5wcm90b3R5cGUudmlzaXRUaW1lTWlsbGlzZWNvbmQ9ZFE7bS5wcm90b3R5cGUudmlzaXRUaW1lTWljcm9zZWNvbmQ9ZFE7bS5wcm90b3R5cGUudmlzaXRUaW1lTmFub3NlY29uZD1kUTttLnByb3RvdHlwZS52aXNpdERlY2ltYWw9RDE7bS5wcm90b3R5cGUudmlzaXRMaXN0PUlHO20ucHJvdG90eXBlLnZpc2l0U3RydWN0PV9HO20ucHJvdG90eXBlLnZpc2l0VW5pb249eDI7bS5wcm90b3R5cGUudmlzaXREZW5zZVVuaW9uPXgyO20ucHJvdG90eXBlLnZpc2l0U3BhcnNlVW5pb249eDI7bS5wcm90b3R5cGUudmlzaXREaWN0aW9uYXJ5PVRHO20ucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWw9c0o7bS5wcm90b3R5cGUudmlzaXRJbnRlcnZhbERheVRpbWU9c0o7bS5wcm90b3R5cGUudmlzaXRJbnRlcnZhbFllYXJNb250aD1zSjttLnByb3RvdHlwZS52aXNpdEludGVydmFsTW9udGhEYXlOYW5vPXNKO20ucHJvdG90eXBlLnZpc2l0RHVyYXRpb249bFE7bS5wcm90b3R5cGUudmlzaXREdXJhdGlvblNlY29uZD1sUTttLnByb3RvdHlwZS52aXNpdER1cmF0aW9uTWlsbGlzZWNvbmQ9bFE7bS5wcm90b3R5cGUudmlzaXREdXJhdGlvbk1pY3Jvc2Vjb25kPWxRO20ucHJvdG90eXBlLnZpc2l0RHVyYXRpb25OYW5vc2Vjb25kPWxRO20ucHJvdG90eXBlLnZpc2l0Rml4ZWRTaXplTGlzdD14RzttLnByb3RvdHlwZS52aXNpdE1hcD1nRztNMT1uZXcgbX0pO2Z1bmN0aW9uIG8kKCQpe2xldCBYPSQudHlwZSxRPW5ldyhqNS5nZXRWaXNpdEZuKFgpKCkpKCQpO2lmKFguY2hpbGRyZW4mJlguY2hpbGRyZW4ubGVuZ3RoPjApe2xldCBaPSQuY2hpbGRyZW58fFtdLEo9e251bGxWYWx1ZXM6JC5udWxsVmFsdWVzfSxZPUFycmF5LmlzQXJyYXkoWik/KEgsVyk9PlpbV118fEo6KHtuYW1lOkh9KT0+WltIXXx8Sjtmb3IobGV0W0gsV11vZiBYLmNoaWxkcmVuLmVudHJpZXMoKSl7bGV0e3R5cGU6UH09VyxHPVkoVyxIKTtRLmNoaWxkcmVuLnB1c2gobyQoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LEcpLHt0eXBlOlB9KSkpfX1yZXR1cm4gUX1mdW5jdGlvbiBhOCgkLFgpe2lmKCQgaW5zdGFuY2VvZiBufHwkIGluc3RhbmNlb2YgRHx8JC50eXBlIGluc3RhbmNlb2YgUilyZXR1cm4gcTEoJCk7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KCQpJiYhWClyZXR1cm4gcTEoJCk7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KCQpJiZYKXtsZXQgWT0kIGluc3RhbmNlb2YgQmlnSW50NjRBcnJheXx8JCBpbnN0YW5jZW9mIEJpZ1VpbnQ2NEFycmF5LEg9WC5BcnJheVR5cGU9PT1CaWdJbnQ2NEFycmF5fHxYLkFycmF5VHlwZT09PUJpZ1VpbnQ2NEFycmF5O2lmKFkmJiFIKXRocm93IFR5cGVFcnJvcihgQ2Fubm90IGNvbnZlcnQgQmlnSW50IGlucHV0IHRvICR7WH0uIEJpZ0ludCBhcnJheXMgY2FuIG9ubHkgdGFyZ2V0IEJpZ0ludC1iYXNlZCB0eXBlcyAoZS5nLiBJbnQ2NCwgVWludDY0KS5gKTtpZighWSYmSCl0aHJvdyBUeXBlRXJyb3IoYENhbm5vdCBjb252ZXJ0IG5vbi1CaWdJbnQgaW5wdXQgdG8gJHtYfS4gJHtYfSByZXF1aXJlcyBCaWdJbnQgdmFsdWVzLmApO2lmKFIuaXNJbnQoWCl8fFIuaXNGbG9hdChYKSl7bGV0IFc9JC5jb25zdHJ1Y3Rvcj09PVguQXJyYXlUeXBlPyQ6bmV3IFguQXJyYXlUeXBlKCQpO3JldHVybiBxMSh7dHlwZTpYLGRhdGE6VyxvZmZzZXQ6MCxsZW5ndGg6Vy5sZW5ndGgsbnVsbENvdW50OjB9KX19bGV0IFE9e3R5cGU6WCE9PW51bGwmJlghPT12b2lkIDA/WDppSigkKSxudWxsVmFsdWVzOltudWxsXX0sWj1bLi4uYUooUSkoJCldLEo9Wi5sZW5ndGg9PT0xP1pbMF06Wi5yZWR1Y2UoKFksSCk9PlkuY29uY2F0KEgpKTtpZihSLmlzRGljdGlvbmFyeShKLnR5cGUpKXJldHVybiBKLm1lbW9pemUoKTtyZXR1cm4gSn1mdW5jdGlvbiBnMigkKXtsZXQgWD1hOCgkKSxRPW5ldyBnKG5ldyBCKFgudHlwZS5jaGlsZHJlbiksWC5kYXRhWzBdKTtyZXR1cm4gbmV3IE04KFEpfWZ1bmN0aW9uIGlKKCQpe2lmKCQubGVuZ3RoPT09MClyZXR1cm4gbmV3IE84O2xldCBYPTAsUT0wLFo9MCxKPTAsWT0wLEg9MCxXPTAsUD0wO2ZvcihsZXQgRyBvZiAkKXtpZihHPT1udWxsKXsrK1g7Y29udGludWV9c3dpdGNoKHR5cGVvZiBHKXtjYXNlImJpZ2ludCI6KytIO2NvbnRpbnVlO2Nhc2UiYm9vbGVhbiI6KytXO2NvbnRpbnVlO2Nhc2UibnVtYmVyIjorK0o7Y29udGludWU7Y2FzZSJzdHJpbmciOisrWTtjb250aW51ZTtjYXNlIm9iamVjdCI6aWYoQXJyYXkuaXNBcnJheShHKSkrK1E7ZWxzZSBpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoRyk9PT0iW29iamVjdCBEYXRlXSIpKytQO2Vsc2UrK1o7Y29udGludWV9dGhyb3cgVHlwZUVycm9yKCJVbmFibGUgdG8gaW5mZXIgVmVjdG9yIHR5cGUgZnJvbSBpbnB1dCB2YWx1ZXMsIGV4cGxpY2l0IHR5cGUgZGVjbGFyYXRpb24gZXhwZWN0ZWQuIil9aWYoSitYPT09JC5sZW5ndGgpcmV0dXJuIG5ldyB0MDtlbHNlIGlmKFkrWD09PSQubGVuZ3RoKXJldHVybiBuZXcgczgobmV3IF84LG5ldyBaMCk7ZWxzZSBpZihIK1g9PT0kLmxlbmd0aClyZXR1cm4gbmV3IGI4O2Vsc2UgaWYoVytYPT09JC5sZW5ndGgpcmV0dXJuIG5ldyBTODtlbHNlIGlmKFArWD09PSQubGVuZ3RoKXJldHVybiBuZXcgTlg7ZWxzZSBpZihRK1g9PT0kLmxlbmd0aCl7bGV0IEc9JCxxPWlKKEdbRy5maW5kSW5kZXgoKEwpPT5MIT1udWxsKV0pO2lmKEcuZXZlcnkoKEwpPT5MPT1udWxsfHxySihxLGlKKEwpKSkpcmV0dXJuIG5ldyBFMChuZXcgdygiIixxLCEwKSl9ZWxzZSBpZihaK1g9PT0kLmxlbmd0aCl7bGV0IEc9bmV3IE1hcDtmb3IobGV0IHEgb2YgJClmb3IobGV0IEwgb2YgT2JqZWN0LmtleXMocSkpaWYoIUcuaGFzKEwpJiZxW0xdIT1udWxsKUcuc2V0KEwsbmV3IHcoTCxpSihbcVtMXV0pLCEwKSk7cmV0dXJuIG5ldyBsKFsuLi5HLnZhbHVlcygpXSl9dGhyb3cgVHlwZUVycm9yKCJVbmFibGUgdG8gaW5mZXIgVmVjdG9yIHR5cGUgZnJvbSBpbnB1dCB2YWx1ZXMsIGV4cGxpY2l0IHR5cGUgZGVjbGFyYXRpb24gZXhwZWN0ZWQuIil9ZnVuY3Rpb24gYUooJCl7bGV0e1sicXVldWVpbmdTdHJhdGVneSJdOlg9ImNvdW50In09JCx7WyJoaWdoV2F0ZXJNYXJrIl06UT1YIT09ImJ5dGVzIj9OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk6TWF0aC5wb3coMiwxNCl9PSQsWj1YIT09ImJ5dGVzIj8ibGVuZ3RoIjoiYnl0ZUxlbmd0aCI7cmV0dXJuIGZ1bmN0aW9uKihKKXtsZXQgWT0wLEg9byQoJCk7Zm9yKGxldCBXIG9mIEopaWYoSC5hcHBlbmQoVylbWl0+PVEpKytZJiYoeWllbGQgSC50b1ZlY3RvcigpKTtpZihILmZpbmlzaCgpLmxlbmd0aD4wfHxZPT09MCl5aWVsZCBILnRvVmVjdG9yKCl9fWZ1bmN0aW9uIHYyKCQpe2xldHtbInF1ZXVlaW5nU3RyYXRlZ3kiXTpYPSJjb3VudCJ9PSQse1siaGlnaFdhdGVyTWFyayJdOlE9WCE9PSJieXRlcyI/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOk1hdGgucG93KDIsMTQpfT0kLFo9WCE9PSJieXRlcyI/Imxlbmd0aCI6ImJ5dGVMZW5ndGgiO3JldHVybiBmdW5jdGlvbihKKXtyZXR1cm4gSTAodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKCl7dmFyIFksSCxXLFA7bGV0IEc9MCxxPW8kKCQpO3RyeXtmb3IodmFyIEw9ITAsTj1ZJChKKSxVO1U9eWllbGQgcihOLm5leHQoKSksWT1VLmRvbmUsIVk7TD0hMCl7UD1VLnZhbHVlLEw9ITE7bGV0IGs9UDtpZihxLmFwcGVuZChrKVtaXT49USkrK0cmJih5aWVsZCB5aWVsZCByKHEudG9WZWN0b3IoKSkpfX1jYXRjaChrKXtIPXtlcnJvcjprfX1maW5hbGx5e3RyeXtpZighTCYmIVkmJihXPU4ucmV0dXJuKSl5aWVsZCByKFcuY2FsbChOKSl9ZmluYWxseXtpZihIKXRocm93IEguZXJyb3J9fWlmKHEuZmluaXNoKCkubGVuZ3RoPjB8fEc9PT0wKXlpZWxkIHlpZWxkIHIocS50b1ZlY3RvcigpKX0pfX12YXIgdlg9QSgoKT0+e2QwKCk7djAoKTtOOCgpO18kKCk7UzAoKTtTNSgpO3Q2KCk7VjEoKTtuUSgpfSk7ZnVuY3Rpb24gb1EoJCxYKXtyZXR1cm4gdkcoJCxYLm1hcCgoUSk9PlEuZGF0YS5jb25jYXQoKSkpfWZ1bmN0aW9uIHZHKCQsWCl7bGV0IFE9Wy4uLiQuZmllbGRzXSxaPVtdLEo9e251bUJhdGNoZXM6WC5yZWR1Y2UoKEwsTik9Pk1hdGgubWF4KEwsTi5sZW5ndGgpLDApfSxZPTAsSD0wLFc9LTEsUD1YLmxlbmd0aCxHLHE9W107d2hpbGUoSi5udW1CYXRjaGVzLS0gPjApe2ZvcihIPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxXPS0xOysrVzxQOylxW1ddPUc9WFtXXS5zaGlmdCgpLEg9TWF0aC5taW4oSCxHP0cubGVuZ3RoOkgpO2lmKE51bWJlci5pc0Zpbml0ZShIKSl7aWYocT1oRyhRLEgscSxYLEopLEg+MClaW1krK109Qyh7dHlwZTpuZXcgbChRKSxsZW5ndGg6SCxudWxsQ291bnQ6MCxjaGlsZHJlbjpxLnNsaWNlKCl9KX19cmV0dXJuWyQ9JC5hc3NpZ24oUSksWi5tYXAoKEwpPT5uZXcgZygkLEwpKV19ZnVuY3Rpb24gaEcoJCxYLFEsWixKKXt2YXIgWTtsZXQgSD0oWCs2MyYtNjQpPj4zO2ZvcihsZXQgVz0tMSxQPVoubGVuZ3RoOysrVzxQOyl7bGV0IEc9UVtXXSxxPUc9PT1udWxsfHxHPT09dm9pZCAwP3ZvaWQgMDpHLmxlbmd0aDtpZihxPj1YKWlmKHE9PT1YKVFbV109RztlbHNlIFFbV109Ry5zbGljZSgwLFgpLEoubnVtQmF0Y2hlcz1NYXRoLm1heChKLm51bUJhdGNoZXMsWltXXS51bnNoaWZ0KEcuc2xpY2UoWCxxLVgpKSk7ZWxzZXtsZXQgTD0kW1ddOyRbV109TC5jbG9uZSh7bnVsbGFibGU6ITB9KSxRW1ddPShZPUc9PT1udWxsfHxHPT09dm9pZCAwP3ZvaWQgMDpHLl9jaGFuZ2VMZW5ndGhBbmRCYWNrZmlsbE51bGxCaXRtYXAoWCkpIT09bnVsbCYmWSE9PXZvaWQgMD9ZOkMoe3R5cGU6TC50eXBlLGxlbmd0aDpYLG51bGxDb3VudDpYLG51bGxCaXRtYXA6bmV3IFVpbnQ4QXJyYXkoSCl9KX19cmV0dXJuIFF9dmFyIHc1PUEoKCk9PntfJCgpO044KCk7VjEoKX0pO2Z1bmN0aW9uIGgyKCQpe2xldCBYPXt9LFE9T2JqZWN0LmVudHJpZXMoJCk7Zm9yKGxldFtaLEpdb2YgUSlYW1pdPXExKEopO3JldHVybiBuZXcgTTgoWCl9ZnVuY3Rpb24geTIoJCxYKXtpZihYKXtsZXQgWj1bXTtmb3IobGV0IEggb2YgWC5maWVsZHMpe2xldCBXPSRbSC5uYW1lXTtpZihXPT09dm9pZCAwKXRocm93IFR5cGVFcnJvcihgU2NoZW1hIGZpZWxkICIke0gubmFtZX0iIG5vdCBmb3VuZCBpbiBpbnB1dC4gQXZhaWxhYmxlIGtleXM6IFske09iamVjdC5rZXlzKCQpLmpvaW4oIiwgIil9XWApO1oucHVzaChhOChXLEgudHlwZSkpfWxldFtKLFldPW9RKFgsWik7cmV0dXJuIG5ldyBNOChKLFkpfWxldCBRPXt9O2ZvcihsZXRbWixKXW9mIE9iamVjdC5lbnRyaWVzKCQpKVFbWl09YTgoSik7cmV0dXJuIG5ldyBNOChRKX12YXIgVjUsQjUsTTg7dmFyIHQ2PUEoKCk9PntWOCgpO18kKCk7dlgoKTtTMCgpO3YwKCk7TjgoKTtuUSgpO3c1KCk7eEooKTtrNigpO0wkKCk7Z0ooKTt2SigpO2pYKCk7VjEoKTtCNT1TeW1ib2wuZm9yKCJhcGFjaGUtYXJyb3cvVGFibGUiKTtNOD1jbGFzcyBNOHtzdGF0aWMgaXNUYWJsZSgkKXtyZXR1cm4oJD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiRbQjVdKT09PSEwfWNvbnN0cnVjdG9yKC4uLiQpe3ZhciBYLFE7aWYoJC5sZW5ndGg9PT0wKXJldHVybiB0aGlzLmJhdGNoZXM9W10sdGhpcy5zY2hlbWE9bmV3IEIoW10pLHRoaXMuX29mZnNldHM9WzBdLHRoaXM7bGV0IFosSjtpZigkWzBdaW5zdGFuY2VvZiBCKVo9JC5zaGlmdCgpO2lmKCQuYXQoLTEpaW5zdGFuY2VvZiBVaW50MzJBcnJheSlKPSQucG9wKCk7bGV0IFk9KFcpPT57aWYoVyl7aWYoVyBpbnN0YW5jZW9mIGcpcmV0dXJuW1ddO2Vsc2UgaWYoVyBpbnN0YW5jZW9mIE04KXJldHVybiBXLmJhdGNoZXM7ZWxzZSBpZihXIGluc3RhbmNlb2Ygbil7aWYoVy50eXBlIGluc3RhbmNlb2YgbClyZXR1cm5bbmV3IGcobmV3IEIoVy50eXBlLmNoaWxkcmVuKSxXKV19ZWxzZSBpZihBcnJheS5pc0FycmF5KFcpKXJldHVybiBXLmZsYXRNYXAoKFApPT5ZKFApKTtlbHNlIGlmKHR5cGVvZiBXW1N5bWJvbC5pdGVyYXRvcl09PT0iZnVuY3Rpb24iKXJldHVyblsuLi5XXS5mbGF0TWFwKChQKT0+WShQKSk7ZWxzZSBpZih0eXBlb2YgVz09PSJvYmplY3QiKXtsZXQgUD1PYmplY3Qua2V5cyhXKSxHPVAubWFwKChOKT0+bmV3IEQoW1dbTl1dKSkscT1aIT09bnVsbCYmWiE9PXZvaWQgMD9aOm5ldyBCKFAubWFwKChOLFUpPT5uZXcgdyhTdHJpbmcoTiksR1tVXS50eXBlLEdbVV0ubnVsbGFibGUpKSksWyxMXT1vUShxLEcpO3JldHVybiBMLmxlbmd0aD09PTA/W25ldyBnKFcpXTpMfX1yZXR1cm5bXX0sSD0kLmZsYXRNYXAoKFcpPT5ZKFcpKTtpZihaPShRPVohPT1udWxsJiZaIT09dm9pZCAwP1o6KFg9SFswXSk9PT1udWxsfHxYPT09dm9pZCAwP3ZvaWQgMDpYLnNjaGVtYSkhPT1udWxsJiZRIT09dm9pZCAwP1E6bmV3IEIoW10pLCEoWiBpbnN0YW5jZW9mIEIpKXRocm93IFR5cGVFcnJvcigiVGFibGUgY29uc3RydWN0b3IgZXhwZWN0cyBhIFtTY2hlbWEsIFJlY29yZEJhdGNoW11dIHBhaXIuIik7Zm9yKGxldCBXIG9mIEgpe2lmKCEoVyBpbnN0YW5jZW9mIGcpKXRocm93IFR5cGVFcnJvcigiVGFibGUgY29uc3RydWN0b3IgZXhwZWN0cyBhIFtTY2hlbWEsIFJlY29yZEJhdGNoW11dIHBhaXIuIik7aWYoIWE2KFosVy5zY2hlbWEpKXRocm93IFR5cGVFcnJvcigiVGFibGUgYW5kIGlubmVyIFJlY29yZEJhdGNoIHNjaGVtYXMgbXVzdCBiZSBlcXVpdmFsZW50LiIpfXRoaXMuc2NoZW1hPVosdGhpcy5iYXRjaGVzPUgsdGhpcy5fb2Zmc2V0cz1KIT09bnVsbCYmSiE9PXZvaWQgMD9KOkJKKHRoaXMuZGF0YSl9Z2V0IGRhdGEoKXtyZXR1cm4gdGhpcy5iYXRjaGVzLm1hcCgoe2RhdGE6JH0pPT4kKX1nZXQgbnVtQ29scygpe3JldHVybiB0aGlzLnNjaGVtYS5maWVsZHMubGVuZ3RofWdldCBudW1Sb3dzKCl7cmV0dXJuIHRoaXMuZGF0YS5yZWR1Y2UoKCQsWCk9PiQrWC5sZW5ndGgsMCl9Z2V0IG51bGxDb3VudCgpe2lmKHRoaXMuX251bGxDb3VudD09PS0xKXRoaXMuX251bGxDb3VudD1WSih0aGlzLmRhdGEpO3JldHVybiB0aGlzLl9udWxsQ291bnR9aXNWYWxpZCgkKXtyZXR1cm4hMX1nZXQoJCl7cmV0dXJuIG51bGx9YXQoJCl7cmV0dXJuIHRoaXMuZ2V0KGo2KCQsdGhpcy5udW1Sb3dzKSl9c2V0KCQsWCl7cmV0dXJufWluZGV4T2YoJCxYKXtyZXR1cm4tMX1bU3ltYm9sLml0ZXJhdG9yXSgpe2lmKHRoaXMuYmF0Y2hlcy5sZW5ndGg+MClyZXR1cm4gd1gudmlzaXQobmV3IEQodGhpcy5kYXRhKSk7cmV0dXJuW11bU3ltYm9sLml0ZXJhdG9yXSgpfXRvQXJyYXkoKXtyZXR1cm5bLi4udGhpc119dG9TdHJpbmcoKXtyZXR1cm5gWwogICR7dGhpcy50b0FycmF5KCkuam9pbihgLAogIGApfQpdYH1jb25jYXQoLi4uJCl7bGV0IFg9dGhpcy5zY2hlbWEsUT10aGlzLmRhdGEuY29uY2F0KCQuZmxhdE1hcCgoe2RhdGE6Wn0pPT5aKSk7cmV0dXJuIG5ldyBNOChYLFEubWFwKChaKT0+bmV3IGcoWCxaKSkpfXNsaWNlKCQsWCl7bGV0IFE9dGhpcy5zY2hlbWE7WyQsWF09dlEoe2xlbmd0aDp0aGlzLm51bVJvd3N9LCQsWCk7bGV0IFo9SUoodGhpcy5kYXRhLHRoaXMuX29mZnNldHMsJCxYKTtyZXR1cm4gbmV3IE04KFEsWi5tYXAoKEopPT5uZXcgZyhRLEopKSl9Z2V0Q2hpbGQoJCl7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRBdCh0aGlzLnNjaGVtYS5maWVsZHMuZmluZEluZGV4KChYKT0+WC5uYW1lPT09JCkpfWdldENoaWxkQXQoJCl7aWYoJD4tMSYmJDx0aGlzLnNjaGVtYS5maWVsZHMubGVuZ3RoKXtsZXQgWD10aGlzLmRhdGEubWFwKChRKT0+US5jaGlsZHJlblskXSk7aWYoWC5sZW5ndGg9PT0wKXtsZXR7dHlwZTpRfT10aGlzLnNjaGVtYS5maWVsZHNbJF0sWj1DKHt0eXBlOlEsbGVuZ3RoOjAsbnVsbENvdW50OjB9KTtYLnB1c2goWi5fY2hhbmdlTGVuZ3RoQW5kQmFja2ZpbGxOdWxsQml0bWFwKHRoaXMubnVtUm93cykpfXJldHVybiBuZXcgRChYKX1yZXR1cm4gbnVsbH1zZXRDaGlsZCgkLFgpe3ZhciBRO3JldHVybiB0aGlzLnNldENoaWxkQXQoKFE9dGhpcy5zY2hlbWEuZmllbGRzKT09PW51bGx8fFE9PT12b2lkIDA/dm9pZCAwOlEuZmluZEluZGV4KChaKT0+Wi5uYW1lPT09JCksWCl9c2V0Q2hpbGRBdCgkLFgpe2xldCBRPXRoaXMuc2NoZW1hLFo9Wy4uLnRoaXMuYmF0Y2hlc107aWYoJD4tMSYmJDx0aGlzLm51bUNvbHMpe2lmKCFYKVg9bmV3IEQoW0Moe3R5cGU6bmV3IE84LGxlbmd0aDp0aGlzLm51bVJvd3N9KV0pO2xldCBKPVEuZmllbGRzLnNsaWNlKCksWT1KWyRdLmNsb25lKHt0eXBlOlgudHlwZX0pLEg9dGhpcy5zY2hlbWEuZmllbGRzLm1hcCgoVyxQKT0+dGhpcy5nZXRDaGlsZEF0KFApKTtbSlskXSxIWyRdXT1bWSxYXSxbUSxaXT1vUShRLEgpfXJldHVybiBuZXcgTTgoUSxaKX1zZWxlY3QoJCl7bGV0IFg9dGhpcy5zY2hlbWEuZmllbGRzLnJlZHVjZSgoUSxaLEopPT5RLnNldChaLm5hbWUsSiksbmV3IE1hcCk7cmV0dXJuIHRoaXMuc2VsZWN0QXQoJC5tYXAoKFEpPT5YLmdldChRKSkuZmlsdGVyKChRKT0+UT4tMSkpfXNlbGVjdEF0KCQpe2xldCBYPXRoaXMuc2NoZW1hLnNlbGVjdEF0KCQpLFE9dGhpcy5iYXRjaGVzLm1hcCgoWik9Plouc2VsZWN0QXQoJCkpO3JldHVybiBuZXcgTTgoWCxRKX1hc3NpZ24oJCl7bGV0IFg9dGhpcy5zY2hlbWEuZmllbGRzLFtRLFpdPSQuc2NoZW1hLmZpZWxkcy5yZWR1Y2UoKEgsVyxQKT0+e2xldFtHLHFdPUgsTD1YLmZpbmRJbmRleCgoTik9Pk4ubmFtZT09PVcubmFtZSk7cmV0dXJufkw/cVtMXT1QOkcucHVzaChQKSxIfSxbW10sW11dKSxKPXRoaXMuc2NoZW1hLmFzc2lnbigkLnNjaGVtYSksWT1bLi4uWC5tYXAoKEgsVyk9PltXLFpbV11dKS5tYXAoKFtILFddKT0+Vz09PXZvaWQgMD90aGlzLmdldENoaWxkQXQoSCk6JC5nZXRDaGlsZEF0KFcpKSwuLi5RLm1hcCgoSCk9PiQuZ2V0Q2hpbGRBdChIKSldLmZpbHRlcihCb29sZWFuKTtyZXR1cm4gbmV3IE04KC4uLm9RKEosWSkpfX07VjU9U3ltYm9sLnRvU3RyaW5nVGFnO004W1Y1XT0oKCQpPT57cmV0dXJuICQuc2NoZW1hPW51bGwsJC5iYXRjaGVzPVtdLCQuX29mZnNldHM9bmV3IFVpbnQzMkFycmF5KFswXSksJC5fbnVsbENvdW50PS0xLCRbU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZV09ITAsJFtCNV09ITAsJC5pc1ZhbGlkPURYKG1RKSwkLmdldD1EWChwOC5nZXRWaXNpdEZuKEUuU3RydWN0KSksJC5zZXQ9X0ooTTAuZ2V0VmlzaXRGbihFLlN0cnVjdCkpLCQuaW5kZXhPZj1USihWNi5nZXRWaXNpdEZuKEUuU3RydWN0KSksIlRhYmxlIn0pKE04LnByb3RvdHlwZSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KE04LFN5bWJvbC5oYXNJbnN0YW5jZSx7dmFsdWU6ZnVuY3Rpb24oWCl7cmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdLmNhbGwodGhpcyxYKXx8dGhpcz09PU04JiZNOC5pc1RhYmxlKFgpfX0pfSk7ZnVuY3Rpb24gbTIoJCxYKXtpZihYKXtsZXQgWj1bXTtmb3IobGV0IEogb2YgWC5maWVsZHMpe2xldCBZPSRbSi5uYW1lXTtpZihZPT09dm9pZCAwKXRocm93IFR5cGVFcnJvcihgU2NoZW1hIGZpZWxkICIke0oubmFtZX0iIG5vdCBmb3VuZCBpbiBpbnB1dC4gQXZhaWxhYmxlIGtleXM6IFske09iamVjdC5rZXlzKCQpLmpvaW4oIiwgIil9XWApO1oucHVzaChhOChZLEoudHlwZSkuZGF0YVswXSl9cmV0dXJuIG5ldyBnKFgsQyh7dHlwZTpuZXcgbChYLmZpZWxkcyksY2hpbGRyZW46Wn0pKX1sZXQgUT17fTtmb3IobGV0W1osSl1vZiBPYmplY3QuZW50cmllcygkKSlRW1pdPWE4KEopLmRhdGFbMF07cmV0dXJuIG5ldyBnKFEpfWZ1bmN0aW9uIEk1KCQsWCxRPVgucmVkdWNlKChaLEopPT5NYXRoLm1heChaLEoubGVuZ3RoKSwwKSl7dmFyIFo7bGV0IEo9Wy4uLiQuZmllbGRzXSxZPVsuLi5YXSxIPShRKzYzJi02NCk+PjM7Zm9yKGxldFtXLFBdb2YgJC5maWVsZHMuZW50cmllcygpKXtsZXQgRz1YW1ddO2lmKCFHfHxHLmxlbmd0aCE9PVEpSltXXT1QLmNsb25lKHtudWxsYWJsZTohMH0pLFlbV109KFo9Rz09PW51bGx8fEc9PT12b2lkIDA/dm9pZCAwOkcuX2NoYW5nZUxlbmd0aEFuZEJhY2tmaWxsTnVsbEJpdG1hcChRKSkhPT1udWxsJiZaIT09dm9pZCAwP1o6Qyh7dHlwZTpQLnR5cGUsbGVuZ3RoOlEsbnVsbENvdW50OlEsbnVsbEJpdG1hcDpuZXcgVWludDhBcnJheShIKX0pfXJldHVyblskLmFzc2lnbihKKSxDKHt0eXBlOm5ldyBsKEopLGxlbmd0aDpRLGNoaWxkcmVuOll9KV19ZnVuY3Rpb24geDUoJCxYLFE9bmV3IE1hcCl7dmFyIFosSjtpZigoKFo9JD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiQubGVuZ3RoKSE9PW51bGwmJlohPT12b2lkIDA/WjowKT4wJiYoJD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiQubGVuZ3RoKT09PShYPT09bnVsbHx8WD09PXZvaWQgMD92b2lkIDA6WC5sZW5ndGgpKWZvcihsZXQgWT0tMSxIPSQubGVuZ3RoOysrWTxIOyl7bGV0e3R5cGU6V309JFtZXSxQPVhbWV07Zm9yKGxldCBHIG9mW1AsLi4uKChKPVA9PT1udWxsfHxQPT09dm9pZCAwP3ZvaWQgMDpQLmRpY3Rpb25hcnkpPT09bnVsbHx8Sj09PXZvaWQgMD92b2lkIDA6Si5kYXRhKXx8W11dKXg1KFcuY2hpbGRyZW4sRz09PW51bGx8fEc9PT12b2lkIDA/dm9pZCAwOkcuY2hpbGRyZW4sUSk7aWYoUi5pc0RpY3Rpb25hcnkoVykpe2xldHtpZDpHfT1XO2lmKCFRLmhhcyhHKSl7aWYoUD09PW51bGx8fFA9PT12b2lkIDA/dm9pZCAwOlAuZGljdGlvbmFyeSlRLnNldChHLFAuZGljdGlvbmFyeSl9ZWxzZSBpZihRLmdldChHKSE9PVAuZGljdGlvbmFyeSl0aHJvdyBFcnJvcigiQ2Fubm90IGNyZWF0ZSBTY2hlbWEgY29udGFpbmluZyB0d28gZGlmZmVyZW50IGRpY3Rpb25hcmllcyB3aXRoIHRoZSBzYW1lIElkIil9fXJldHVybiBRfXZhciBfNSxUNSxnLFhRO3ZhciBWMT1BKCgpPT57XyQoKTt0NigpO1MwKCk7djAoKTtOOCgpO2pYKCk7dlgoKTtrNigpO0wkKCk7Z0ooKTt2SigpO1Q1PVN5bWJvbC5mb3IoImFwYWNoZS1hcnJvdy9SZWNvcmRCYXRjaCIpO2c9Y2xhc3MgZ3tzdGF0aWMgaXNSZWNvcmRCYXRjaCgkKXtyZXR1cm4oJD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiRbVDVdKT09PSEwfWNvbnN0cnVjdG9yKC4uLiQpe3N3aXRjaCgkLmxlbmd0aCl7Y2FzZSAzOmNhc2UgMjp7aWYoW3RoaXMuc2NoZW1hXT0kLCEodGhpcy5zY2hlbWEgaW5zdGFuY2VvZiBCKSl0aHJvdyBUeXBlRXJyb3IoIlJlY29yZEJhdGNoIGNvbnN0cnVjdG9yIGV4cGVjdHMgYSBbU2NoZW1hLCBEYXRhXSBwYWlyLiIpO2lmKFssdGhpcy5kYXRhPUMoe251bGxDb3VudDowLHR5cGU6bmV3IGwodGhpcy5zY2hlbWEuZmllbGRzKSxjaGlsZHJlbjp0aGlzLnNjaGVtYS5maWVsZHMubWFwKChYKT0+Qyh7dHlwZTpYLnR5cGUsbnVsbENvdW50OjB9KSl9KSx0aGlzLl9tZXRhZGF0YT1uZXcgTWFwXT0kLCEodGhpcy5kYXRhIGluc3RhbmNlb2YgbikpdGhyb3cgVHlwZUVycm9yKCJSZWNvcmRCYXRjaCBjb25zdHJ1Y3RvciBleHBlY3RzIGEgW1NjaGVtYSwgRGF0YV0gcGFpci4iKTtbdGhpcy5zY2hlbWEsdGhpcy5kYXRhXT1JNSh0aGlzLnNjaGVtYSx0aGlzLmRhdGEuY2hpbGRyZW4sdGhpcy5kYXRhLmxlbmd0aCk7YnJlYWt9Y2FzZSAxOntsZXRbWF09JCx7ZmllbGRzOlEsY2hpbGRyZW46WixsZW5ndGg6Sn09T2JqZWN0LmtleXMoWCkucmVkdWNlKChXLFAsRyk9PntyZXR1cm4gVy5jaGlsZHJlbltHXT1YW1BdLFcubGVuZ3RoPU1hdGgubWF4KFcubGVuZ3RoLFhbUF0ubGVuZ3RoKSxXLmZpZWxkc1tHXT13Lm5ldyh7bmFtZTpQLHR5cGU6WFtQXS50eXBlLG51bGxhYmxlOiEwfSksV30se2xlbmd0aDowLGZpZWxkczpbXSxjaGlsZHJlbjpbXX0pLFk9bmV3IEIoUSksSD1DKHt0eXBlOm5ldyBsKFEpLGxlbmd0aDpKLGNoaWxkcmVuOlosbnVsbENvdW50OjB9KTtbdGhpcy5zY2hlbWEsdGhpcy5kYXRhXT1JNShZLEguY2hpbGRyZW4sSiksdGhpcy5fbWV0YWRhdGE9bmV3IE1hcDticmVha31kZWZhdWx0OnRocm93IFR5cGVFcnJvcigiUmVjb3JkQmF0Y2ggY29uc3RydWN0b3IgZXhwZWN0cyBhbiBPYmplY3QgbWFwcGluZyBuYW1lcyB0byBjaGlsZCBEYXRhLCBvciBhIFtTY2hlbWEsIERhdGFdIHBhaXIuIil9fWdldCBtZXRhZGF0YSgpe3JldHVybiB0aGlzLl9tZXRhZGF0YX1nZXQgZGljdGlvbmFyaWVzKCl7cmV0dXJuIHRoaXMuX2RpY3Rpb25hcmllc3x8KHRoaXMuX2RpY3Rpb25hcmllcz14NSh0aGlzLnNjaGVtYS5maWVsZHMsdGhpcy5kYXRhLmNoaWxkcmVuKSl9Z2V0IG51bUNvbHMoKXtyZXR1cm4gdGhpcy5zY2hlbWEuZmllbGRzLmxlbmd0aH1nZXQgbnVtUm93cygpe3JldHVybiB0aGlzLmRhdGEubGVuZ3RofWdldCBudWxsQ291bnQoKXtyZXR1cm4gdGhpcy5kYXRhLm51bGxDb3VudH1pc1ZhbGlkKCQpe3JldHVybiB0aGlzLmRhdGEuZ2V0VmFsaWQoJCl9Z2V0KCQpe3JldHVybiBwOC52aXNpdCh0aGlzLmRhdGEsJCl9YXQoJCl7cmV0dXJuIHRoaXMuZ2V0KGo2KCQsdGhpcy5udW1Sb3dzKSl9c2V0KCQsWCl7cmV0dXJuIE0wLnZpc2l0KHRoaXMuZGF0YSwkLFgpfWluZGV4T2YoJCxYKXtyZXR1cm4gVjYudmlzaXQodGhpcy5kYXRhLCQsWCl9W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gd1gudmlzaXQobmV3IEQoW3RoaXMuZGF0YV0pKX10b0FycmF5KCl7cmV0dXJuWy4uLnRoaXNdfWNvbmNhdCguLi4kKXtyZXR1cm4gbmV3IE04KHRoaXMuc2NoZW1hLFt0aGlzLC4uLiRdKX1zbGljZSgkLFgpe2xldFtRXT1uZXcgRChbdGhpcy5kYXRhXSkuc2xpY2UoJCxYKS5kYXRhO3JldHVybiBuZXcgZyh0aGlzLnNjaGVtYSxRLHRoaXMuX21ldGFkYXRhKX1nZXRDaGlsZCgkKXt2YXIgWDtyZXR1cm4gdGhpcy5nZXRDaGlsZEF0KChYPXRoaXMuc2NoZW1hLmZpZWxkcyk9PT1udWxsfHxYPT09dm9pZCAwP3ZvaWQgMDpYLmZpbmRJbmRleCgoUSk9PlEubmFtZT09PSQpKX1nZXRDaGlsZEF0KCQpe2lmKCQ+LTEmJiQ8dGhpcy5zY2hlbWEuZmllbGRzLmxlbmd0aClyZXR1cm4gbmV3IEQoW3RoaXMuZGF0YS5jaGlsZHJlblskXV0pO3JldHVybiBudWxsfXNldENoaWxkKCQsWCl7dmFyIFE7cmV0dXJuIHRoaXMuc2V0Q2hpbGRBdCgoUT10aGlzLnNjaGVtYS5maWVsZHMpPT09bnVsbHx8UT09PXZvaWQgMD92b2lkIDA6US5maW5kSW5kZXgoKFopPT5aLm5hbWU9PT0kKSxYKX1zZXRDaGlsZEF0KCQsWCl7bGV0IFE9dGhpcy5zY2hlbWEsWj10aGlzLmRhdGE7aWYoJD4tMSYmJDx0aGlzLm51bUNvbHMpe2lmKCFYKVg9bmV3IEQoW0Moe3R5cGU6bmV3IE84LGxlbmd0aDp0aGlzLm51bVJvd3N9KV0pO2xldCBKPVEuZmllbGRzLnNsaWNlKCksWT1aLmNoaWxkcmVuLnNsaWNlKCksSD1KWyRdLmNsb25lKHt0eXBlOlgudHlwZX0pO1tKWyRdLFlbJF1dPVtILFguZGF0YVswXV0sUT1uZXcgQihKLG5ldyBNYXAodGhpcy5zY2hlbWEubWV0YWRhdGEpKSxaPUMoe3R5cGU6bmV3IGwoSiksbGVuZ3RoOloubGVuZ3RoLGNoaWxkcmVuOll9KX1yZXR1cm4gbmV3IGcoUSxaLHRoaXMuX21ldGFkYXRhKX1zZWxlY3QoJCl7bGV0IFg9dGhpcy5zY2hlbWEuc2VsZWN0KCQpLFE9bmV3IGwoWC5maWVsZHMpLFo9W107Zm9yKGxldCBKIG9mICQpe2xldCBZPXRoaXMuc2NoZW1hLmZpZWxkcy5maW5kSW5kZXgoKEgpPT5ILm5hbWU9PT1KKTtpZih+WSlaW1ldPXRoaXMuZGF0YS5jaGlsZHJlbltZXX1yZXR1cm4gbmV3IGcoWCxDKHt0eXBlOlEsbGVuZ3RoOnRoaXMubnVtUm93cyxjaGlsZHJlbjpafSksdGhpcy5fbWV0YWRhdGEpfXNlbGVjdEF0KCQpe2xldCBYPXRoaXMuc2NoZW1hLnNlbGVjdEF0KCQpLFE9JC5tYXAoKEopPT50aGlzLmRhdGEuY2hpbGRyZW5bSl0pLmZpbHRlcihCb29sZWFuKSxaPUMoe3R5cGU6bmV3IGwoWC5maWVsZHMpLGxlbmd0aDp0aGlzLm51bVJvd3MsY2hpbGRyZW46UX0pO3JldHVybiBuZXcgZyhYLFosdGhpcy5fbWV0YWRhdGEpfX07XzU9U3ltYm9sLnRvU3RyaW5nVGFnO2dbXzVdPSgoJCk9PntyZXR1cm4gJC5fbnVsbENvdW50PS0xLCRbU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZV09ITAsJFtUNV09ITAsIlJlY29yZEJhdGNoIn0pKGcucHJvdG90eXBlKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZyxTeW1ib2wuaGFzSW5zdGFuY2Use3ZhbHVlOmZ1bmN0aW9uKFgpe3JldHVybiBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXS5jYWxsKHRoaXMsWCl8fHRoaXM9PT1nJiZnLmlzUmVjb3JkQmF0Y2goWCl9fSk7WFE9Y2xhc3MgWFEgZXh0ZW5kcyBne2NvbnN0cnVjdG9yKCQsWCl7bGV0IFE9JC5maWVsZHMubWFwKChKKT0+Qyh7dHlwZTpKLnR5cGV9KSksWj1DKHt0eXBlOm5ldyBsKCQuZmllbGRzKSxsZW5ndGg6MCxudWxsQ291bnQ6MCxjaGlsZHJlbjpRfSk7c3VwZXIoJCxaLFh8fG5ldyBNYXApfX19KTtmdW5jdGlvbiBlSigkLFg9MCl7Zm9yKGxldCBRPS0xLFo9UVEubGVuZ3RoOysrUTxaOylpZihRUVtRXSE9PSRbWCtRXSlyZXR1cm4hMTtyZXR1cm4hMH12YXIgYjI9KCQpPT5gRXhwZWN0ZWQgJHtYOFskXX0gTWVzc2FnZSBpbiBzdHJlYW0sIGJ1dCB3YXMgbnVsbCBvciBsZW5ndGggMC5gLHAyPSgkKT0+YEhlYWRlciBwb2ludGVyIG9mIGZsYXRidWZmZXItZW5jb2RlZCAke1g4WyRdfSBNZXNzYWdlIGlzIG51bGwgb3IgbGVuZ3RoIDAuYCxnNT0oJCxYKT0+YEV4cGVjdGVkIHRvIHJlYWQgJHskfSBtZXRhZGF0YSBieXRlcywgYnV0IG9ubHkgcmVhZCAke1h9LmAsdjU9KCQsWCk9PmBFeHBlY3RlZCB0byByZWFkICR7JH0gYnl0ZXMgZm9yIG1lc3NhZ2UgYm9keSwgYnV0IG9ubHkgcmVhZCAke1h9LmAsZTYsWlEsSlEsdEo9NCxmMj0iQVJST1cxIixRUSxZUSxjMixoNTt2YXIgJDQ9QSgoKT0+e2QwKCk7VjgoKTtZOCgpO1g2KCk7WDIoKTtvOCgpO1o2KCk7cFEoKTtlNj1jbGFzcyBlNntjb25zdHJ1Y3RvcigkKXt0aGlzLnNvdXJjZT0kIGluc3RhbmNlb2YgbiQ/JDpuZXcgbiQoJCl9W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpc31uZXh0KCl7bGV0ICQ7aWYoKCQ9dGhpcy5yZWFkTWV0YWRhdGFMZW5ndGgoKSkuZG9uZSlyZXR1cm4gQzg7aWYoJC52YWx1ZT09PS0xJiYoJD10aGlzLnJlYWRNZXRhZGF0YUxlbmd0aCgpKS5kb25lKXJldHVybiBDODtpZigoJD10aGlzLnJlYWRNZXRhZGF0YSgkLnZhbHVlKSkuZG9uZSlyZXR1cm4gQzg7cmV0dXJuICR9dGhyb3coJCl7cmV0dXJuIHRoaXMuc291cmNlLnRocm93KCQpfXJldHVybigkKXtyZXR1cm4gdGhpcy5zb3VyY2UucmV0dXJuKCQpfXJlYWRNZXNzYWdlKCQpe2xldCBYO2lmKChYPXRoaXMubmV4dCgpKS5kb25lKXJldHVybiBudWxsO2lmKCQhPW51bGwmJlgudmFsdWUuaGVhZGVyVHlwZSE9PSQpdGhyb3cgRXJyb3IoYjIoJCkpO3JldHVybiBYLnZhbHVlfXJlYWRNZXNzYWdlQm9keSgkKXtpZigkPD0wKXJldHVybiBuZXcgVWludDhBcnJheSgwKTtsZXQgWD14KHRoaXMuc291cmNlLnJlYWQoJCkpO2lmKFguYnl0ZUxlbmd0aDwkKXRocm93IEVycm9yKHY1KCQsWC5ieXRlTGVuZ3RoKSk7cmV0dXJuIFguYnl0ZU9mZnNldCU4PT09MCYmWC5ieXRlT2Zmc2V0K1guYnl0ZUxlbmd0aDw9WC5idWZmZXIuYnl0ZUxlbmd0aD9YOlguc2xpY2UoKX1yZWFkU2NoZW1hKCQ9ITEpe2xldCBYPVg4LlNjaGVtYSxRPXRoaXMucmVhZE1lc3NhZ2UoWCksWj1RPT09bnVsbHx8UT09PXZvaWQgMD92b2lkIDA6US5oZWFkZXIoKTtpZigkJiYhWil0aHJvdyBFcnJvcihwMihYKSk7cmV0dXJuIFp9cmVhZE1ldGFkYXRhTGVuZ3RoKCl7bGV0ICQ9dGhpcy5zb3VyY2UucmVhZCh0SiksWD0kJiZuZXcgUDAoJCksUT0oWD09PW51bGx8fFg9PT12b2lkIDA/dm9pZCAwOlgucmVhZEludDMyKDApKXx8MDtyZXR1cm57ZG9uZTpRPT09MCx2YWx1ZTpRfX1yZWFkTWV0YWRhdGEoJCl7bGV0IFg9dGhpcy5zb3VyY2UucmVhZCgkKTtpZighWClyZXR1cm4gQzg7aWYoWC5ieXRlTGVuZ3RoPCQpdGhyb3cgRXJyb3IoZzUoJCxYLmJ5dGVMZW5ndGgpKTtyZXR1cm57ZG9uZTohMSx2YWx1ZTpjOC5kZWNvZGUoWCl9fX07WlE9Y2xhc3MgWlF7Y29uc3RydWN0b3IoJCxYKXt0aGlzLnNvdXJjZT0kIGluc3RhbmNlb2YgWCQ/JDpUWigkKT9uZXcgQjYoJCxYKTpuZXcgWCQoJCl9W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpe3JldHVybiB0aGlzfW5leHQoKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7bGV0ICQ7aWYoKCQ9eWllbGQgdGhpcy5yZWFkTWV0YWRhdGFMZW5ndGgoKSkuZG9uZSlyZXR1cm4gQzg7aWYoJC52YWx1ZT09PS0xJiYoJD15aWVsZCB0aGlzLnJlYWRNZXRhZGF0YUxlbmd0aCgpKS5kb25lKXJldHVybiBDODtpZigoJD15aWVsZCB0aGlzLnJlYWRNZXRhZGF0YSgkLnZhbHVlKSkuZG9uZSlyZXR1cm4gQzg7cmV0dXJuICR9KX10aHJvdygkKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuc291cmNlLnRocm93KCQpfSl9cmV0dXJuKCQpe3JldHVybiBWKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5zb3VyY2UucmV0dXJuKCQpfSl9cmVhZE1lc3NhZ2UoJCl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2xldCBYO2lmKChYPXlpZWxkIHRoaXMubmV4dCgpKS5kb25lKXJldHVybiBudWxsO2lmKCQhPW51bGwmJlgudmFsdWUuaGVhZGVyVHlwZSE9PSQpdGhyb3cgRXJyb3IoYjIoJCkpO3JldHVybiBYLnZhbHVlfSl9cmVhZE1lc3NhZ2VCb2R5KCQpe3JldHVybiBWKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtpZigkPD0wKXJldHVybiBuZXcgVWludDhBcnJheSgwKTtsZXQgWD14KHlpZWxkIHRoaXMuc291cmNlLnJlYWQoJCkpO2lmKFguYnl0ZUxlbmd0aDwkKXRocm93IEVycm9yKHY1KCQsWC5ieXRlTGVuZ3RoKSk7cmV0dXJuIFguYnl0ZU9mZnNldCU4PT09MCYmWC5ieXRlT2Zmc2V0K1guYnl0ZUxlbmd0aDw9WC5idWZmZXIuYnl0ZUxlbmd0aD9YOlguc2xpY2UoKX0pfXJlYWRTY2hlbWEoKXtyZXR1cm4gVih0aGlzLGFyZ3VtZW50cyx2b2lkIDAsZnVuY3Rpb24qKCQ9ITEpe2xldCBYPVg4LlNjaGVtYSxRPXlpZWxkIHRoaXMucmVhZE1lc3NhZ2UoWCksWj1RPT09bnVsbHx8UT09PXZvaWQgMD92b2lkIDA6US5oZWFkZXIoKTtpZigkJiYhWil0aHJvdyBFcnJvcihwMihYKSk7cmV0dXJuIFp9KX1yZWFkTWV0YWRhdGFMZW5ndGgoKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7bGV0ICQ9eWllbGQgdGhpcy5zb3VyY2UucmVhZCh0SiksWD0kJiZuZXcgUDAoJCksUT0oWD09PW51bGx8fFg9PT12b2lkIDA/dm9pZCAwOlgucmVhZEludDMyKDApKXx8MDtyZXR1cm57ZG9uZTpRPT09MCx2YWx1ZTpRfX0pfXJlYWRNZXRhZGF0YSgkKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7bGV0IFg9eWllbGQgdGhpcy5zb3VyY2UucmVhZCgkKTtpZighWClyZXR1cm4gQzg7aWYoWC5ieXRlTGVuZ3RoPCQpdGhyb3cgRXJyb3IoZzUoJCxYLmJ5dGVMZW5ndGgpKTtyZXR1cm57ZG9uZTohMSx2YWx1ZTpjOC5kZWNvZGUoWCl9fSl9fTtKUT1jbGFzcyBKUSBleHRlbmRzIGU2e2NvbnN0cnVjdG9yKCQpe3N1cGVyKG5ldyBVaW50OEFycmF5KDApKTt0aGlzLl9zY2hlbWE9ITEsdGhpcy5fYm9keT1bXSx0aGlzLl9iYXRjaEluZGV4PTAsdGhpcy5fZGljdGlvbmFyeUluZGV4PTAsdGhpcy5fanNvbj0kIGluc3RhbmNlb2YgcEo/JDpuZXcgcEooJCl9bmV4dCgpe2xldHtfanNvbjokfT10aGlzO2lmKCF0aGlzLl9zY2hlbWEpcmV0dXJuIHRoaXMuX3NjaGVtYT0hMCx7ZG9uZTohMSx2YWx1ZTpjOC5mcm9tSlNPTigkLnNjaGVtYSxYOC5TY2hlbWEpfTtpZih0aGlzLl9kaWN0aW9uYXJ5SW5kZXg8JC5kaWN0aW9uYXJpZXMubGVuZ3RoKXtsZXQgWD0kLmRpY3Rpb25hcmllc1t0aGlzLl9kaWN0aW9uYXJ5SW5kZXgrK107cmV0dXJuIHRoaXMuX2JvZHk9WC5kYXRhLmNvbHVtbnMse2RvbmU6ITEsdmFsdWU6YzguZnJvbUpTT04oWCxYOC5EaWN0aW9uYXJ5QmF0Y2gpfX1pZih0aGlzLl9iYXRjaEluZGV4PCQuYmF0Y2hlcy5sZW5ndGgpe2xldCBYPSQuYmF0Y2hlc1t0aGlzLl9iYXRjaEluZGV4KytdO3JldHVybiB0aGlzLl9ib2R5PVguY29sdW1ucyx7ZG9uZTohMSx2YWx1ZTpjOC5mcm9tSlNPTihYLFg4LlJlY29yZEJhdGNoKX19cmV0dXJuIHRoaXMuX2JvZHk9W10sQzh9cmVhZE1lc3NhZ2VCb2R5KCQpe3JldHVybiBYKHRoaXMuX2JvZHkpO2Z1bmN0aW9uIFgoUSl7cmV0dXJuKFF8fFtdKS5yZWR1Y2UoKFosSik9PlsuLi5aLC4uLkouVkFMSURJVFkmJltKLlZBTElESVRZXXx8W10sLi4uSi5UWVBFX0lEJiZbSi5UWVBFX0lEXXx8W10sLi4uSi5PRkZTRVQmJltKLk9GRlNFVF18fFtdLC4uLkouREFUQSYmW0ouREFUQV18fFtdLC4uLkouVklFV1MmJltKLlZJRVdTXXx8W10sLi4uSi5WQVJJQURJQ19EQVRBX0JVRkZFUlN8fFtdLC4uLlgoSi5jaGlsZHJlbildLFtdKX19cmVhZE1lc3NhZ2UoJCl7bGV0IFg7aWYoKFg9dGhpcy5uZXh0KCkpLmRvbmUpcmV0dXJuIG51bGw7aWYoJCE9bnVsbCYmWC52YWx1ZS5oZWFkZXJUeXBlIT09JCl0aHJvdyBFcnJvcihiMigkKSk7cmV0dXJuIFgudmFsdWV9cmVhZFNjaGVtYSgpe2xldCAkPVg4LlNjaGVtYSxYPXRoaXMucmVhZE1lc3NhZ2UoJCksUT1YPT09bnVsbHx8WD09PXZvaWQgMD92b2lkIDA6WC5oZWFkZXIoKTtpZighWHx8IVEpdGhyb3cgRXJyb3IocDIoJCkpO3JldHVybiBRfX07UVE9bmV3IFVpbnQ4QXJyYXkoZjIubGVuZ3RoKTtmb3IobGV0ICQ9MDskPGYyLmxlbmd0aDskKz0xKVFRWyRdPWYyLmNvZGVQb2ludEF0KCQpO1lRPVFRLmxlbmd0aCxjMj1ZUSt0SixoNT1ZUSoyK3RKfSk7Y2xhc3MgeTV7Y29uc3RydWN0b3IoKXt0aGlzLkxaNF9GUkFNRV9NQUdJQz1uZXcgVWludDhBcnJheShbNCwzNCw3NywyNF0pLHRoaXMuTUlOX0hFQURFUl9MRU5HVEg9N31pc1ZhbGlkQ29kZWNFbmNvZGUoJCl7bGV0IFg9bmV3IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOF0pLFE9JC5lbmNvZGUoWCk7cmV0dXJuIHRoaXMuX2lzVmFsaWRDb21wcmVzc2VkKFEpfV9pc1ZhbGlkQ29tcHJlc3NlZCgkKXtyZXR1cm4gdGhpcy5faGFzTWluaW11bUxlbmd0aCgkKSYmdGhpcy5faGFzVmFsaWRNYWdpY051bWJlcigkKSYmdGhpcy5faGFzVmFsaWRWZXJzaW9uKCQpfV9oYXNNaW5pbXVtTGVuZ3RoKCQpe3JldHVybiAkLmxlbmd0aD49dGhpcy5NSU5fSEVBREVSX0xFTkdUSH1faGFzVmFsaWRNYWdpY051bWJlcigkKXtyZXR1cm4gdGhpcy5MWjRfRlJBTUVfTUFHSUMuZXZlcnkoKFgsUSk9PiRbUV09PT1YKX1faGFzVmFsaWRWZXJzaW9uKCQpe3JldHVybigkWzRdJjE5Mik+PjY9PT0xfX1jbGFzcyBtNXtjb25zdHJ1Y3Rvcigpe3RoaXMuWlNURF9NQUdJQz1uZXcgVWludDhBcnJheShbNDAsMTgxLDQ3LDI1M10pLHRoaXMuTUlOX0hFQURFUl9MRU5HVEg9Nn1pc1ZhbGlkQ29kZWNFbmNvZGUoJCl7bGV0IFg9bmV3IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOF0pLFE9JC5lbmNvZGUoWCk7cmV0dXJuIHRoaXMuX2lzVmFsaWRDb21wcmVzc2VkKFEpfV9pc1ZhbGlkQ29tcHJlc3NlZCgkKXtyZXR1cm4gdGhpcy5faGFzTWluaW11bUxlbmd0aCgkKSYmdGhpcy5faGFzVmFsaWRNYWdpY051bWJlcigkKX1faGFzTWluaW11bUxlbmd0aCgkKXtyZXR1cm4gJC5sZW5ndGg+PXRoaXMuTUlOX0hFQURFUl9MRU5HVEh9X2hhc1ZhbGlkTWFnaWNOdW1iZXIoJCl7cmV0dXJuIHRoaXMuWlNURF9NQUdJQy5ldmVyeSgoWCxRKT0+JFtRXT09PVgpfX12YXIgZjU7dmFyIGI1PUEoKCk9PntxWCgpO2Y1PXtbRzAuTFo0X0ZSQU1FXTpuZXcgeTUsW0cwLlpTVERdOm5ldyBtNX19KTtjbGFzcyBwNXtjb25zdHJ1Y3Rvcigpe3RoaXMucmVnaXN0cnk9e319c2V0KCQsWCl7aWYoKFg9PT1udWxsfHxYPT09dm9pZCAwP3ZvaWQgMDpYLmVuY29kZSkmJnR5cGVvZiBYLmVuY29kZT09PSJmdW5jdGlvbiImJiFmNVskXS5pc1ZhbGlkQ29kZWNFbmNvZGUoWCkpdGhyb3cgRXJyb3IoYEVuY29kZXIgZm9yICR7RzBbJF19IGlzIG5vdCB2YWxpZC5gKTt0aGlzLnJlZ2lzdHJ5WyRdPVh9Z2V0KCQpe3ZhciBYO3JldHVybigoWD10aGlzLnJlZ2lzdHJ5KT09PW51bGx8fFg9PT12b2lkIDA/dm9pZCAwOlhbJF0pfHxudWxsfX12YXIgSzY7dmFyIFg0PUEoKCk9PntxWCgpO2I1KCk7SzY9bmV3IHA1fSk7dmFyIFE0PS0xLHNRPTg7Y2xhc3MgdTJ7Z2V0IG51bURpY3Rpb25hcmllcygpe3JldHVybiB0aGlzLl9kaWN0aW9uYXJ5SW5kZXh9Z2V0IG51bVJlY29yZEJhdGNoZXMoKXtyZXR1cm4gdGhpcy5fcmVjb3JkQmF0Y2hJbmRleH1jb25zdHJ1Y3RvcigkPW5ldyBNYXApe3RoaXMuY2xvc2VkPSExLHRoaXMuYXV0b0Rlc3Ryb3k9ITAsdGhpcy5fZGljdGlvbmFyeUluZGV4PTAsdGhpcy5fcmVjb3JkQmF0Y2hJbmRleD0wLHRoaXMuZGljdGlvbmFyaWVzPSR9aXNTeW5jKCl7cmV0dXJuITF9aXNBc3luYygpe3JldHVybiExfWlzRmlsZSgpe3JldHVybiExfWlzU3RyZWFtKCl7cmV0dXJuITF9cmVzZXQoJCl7cmV0dXJuIHRoaXMuX2RpY3Rpb25hcnlJbmRleD0wLHRoaXMuX3JlY29yZEJhdGNoSW5kZXg9MCx0aGlzLnNjaGVtYT0kLHRoaXMuZGljdGlvbmFyaWVzPW5ldyBNYXAsdGhpc31fbG9hZFJlY29yZEJhdGNoKCQsWCxRKXtsZXQgWjtpZigkLmNvbXByZXNzaW9uIT1udWxsKXtsZXQgWT1LNi5nZXQoJC5jb21wcmVzc2lvbi50eXBlKTtpZigoWT09PW51bGx8fFk9PT12b2lkIDA/dm9pZCAwOlkuZGVjb2RlKSYmdHlwZW9mIFkuZGVjb2RlPT09ImZ1bmN0aW9uIil7bGV0e2RlY29tbXByZXNzZWRCb2R5OkgsYnVmZmVyczpXfT10aGlzLl9kZWNvbXByZXNzQnVmZmVycygkLFgsWSk7Wj10aGlzLl9sb2FkQ29tcHJlc3NlZFZlY3RvcnMoJCxILHRoaXMuc2NoZW1hLmZpZWxkcyksJD1uZXcgaTgoJC5sZW5ndGgsJC5ub2RlcyxXLG51bGwpfWVsc2UgdGhyb3cgRXJyb3IoIlJlY29yZCBiYXRjaCBpcyBjb21wcmVzc2VkIGJ1dCBjb2RlYyBub3QgZm91bmQiKX1lbHNlIFo9dGhpcy5fbG9hZFZlY3RvcnMoJCxYLHRoaXMuc2NoZW1hLmZpZWxkcyk7bGV0IEo9Qyh7dHlwZTpuZXcgbCh0aGlzLnNjaGVtYS5maWVsZHMpLGxlbmd0aDokLmxlbmd0aCxjaGlsZHJlbjpafSk7cmV0dXJuIG5ldyBnKHRoaXMuc2NoZW1hLEosUSl9X2xvYWREaWN0aW9uYXJ5QmF0Y2goJCxYKXtsZXR7aWQ6USxpc0RlbHRhOlp9PSQse2RpY3Rpb25hcmllczpKLHNjaGVtYTpZfT10aGlzLEg9Si5nZXQoUSksVz1ZLmRpY3Rpb25hcmllcy5nZXQoUSksUDtpZigkLmRhdGEuY29tcHJlc3Npb24hPW51bGwpe2xldCBHPUs2LmdldCgkLmRhdGEuY29tcHJlc3Npb24udHlwZSk7aWYoKEc9PT1udWxsfHxHPT09dm9pZCAwP3ZvaWQgMDpHLmRlY29kZSkmJnR5cGVvZiBHLmRlY29kZT09PSJmdW5jdGlvbiIpe2xldHtkZWNvbW1wcmVzc2VkQm9keTpxLGJ1ZmZlcnM6TH09dGhpcy5fZGVjb21wcmVzc0J1ZmZlcnMoJC5kYXRhLFgsRyk7UD10aGlzLl9sb2FkQ29tcHJlc3NlZFZlY3RvcnMoJC5kYXRhLHEsW1ddKSwkPW5ldyBoMChuZXcgaTgoJC5kYXRhLmxlbmd0aCwkLmRhdGEubm9kZXMsTCxudWxsLCQuZGF0YS52YXJpYWRpY0J1ZmZlckNvdW50cyksUSxaKX1lbHNlIHRocm93IEVycm9yKCJEaWN0aW9uYXJ5IGJhdGNoIGlzIGNvbXByZXNzZWQgYnV0IGNvZGVjIG5vdCBmb3VuZCIpfWVsc2UgUD10aGlzLl9sb2FkVmVjdG9ycygkLmRhdGEsWCxbV10pO3JldHVybihIJiZaP0guY29uY2F0KG5ldyBEKFApKTpuZXcgRChQKSkubWVtb2l6ZSgpfV9sb2FkVmVjdG9ycygkLFgsUSl7cmV0dXJuIG5ldyBjUShYLCQubm9kZXMsJC5idWZmZXJzLHRoaXMuZGljdGlvbmFyaWVzLHRoaXMuc2NoZW1hLm1ldGFkYXRhVmVyc2lvbiwkLnZhcmlhZGljQnVmZmVyQ291bnRzKS52aXNpdE1hbnkoUSl9X2xvYWRDb21wcmVzc2VkVmVjdG9ycygkLFgsUSl7cmV0dXJuIG5ldyBxMihYLCQubm9kZXMsJC5idWZmZXJzLHRoaXMuZGljdGlvbmFyaWVzLHRoaXMuc2NoZW1hLm1ldGFkYXRhVmVyc2lvbiwkLnZhcmlhZGljQnVmZmVyQ291bnRzKS52aXNpdE1hbnkoUSl9X2RlY29tcHJlc3NCdWZmZXJzKCQsWCxRKXtsZXQgWj1bXSxKPVtdLFk9MDtmb3IobGV0e29mZnNldDpILGxlbmd0aDpXfW9mICQuYnVmZmVycyl7aWYoVz09PTApe1oucHVzaChuZXcgVWludDhBcnJheSgwKSksSi5wdXNoKG5ldyBoOChZLDApKTtjb250aW51ZX1sZXQgUD1uZXcgUDAoWC5zdWJhcnJheShILEgrVykpLEc9VzgoUC5yZWFkSW50NjQoMCkpLHE9UC5ieXRlcygpLnN1YmFycmF5KHNRKSxMPUc9PT1RND9xOlEuZGVjb2RlKHEpO1oucHVzaChMKTtsZXQgTj0oWSs3Ji04KS1ZO1krPU4sSi5wdXNoKG5ldyBoOChZLEwubGVuZ3RoKSksWSs9TC5sZW5ndGh9cmV0dXJue2RlY29tbXByZXNzZWRCb2R5OlosYnVmZmVyczpKfX19ZnVuY3Rpb24gbjUoJCxYKXtyZXR1cm4gWCYmdHlwZW9mIFguYXV0b0Rlc3Ryb3k9PT0iYm9vbGVhbiI/WC5hdXRvRGVzdHJveTokLmF1dG9EZXN0cm95fWZ1bmN0aW9uKmM1KCQpe2xldCBYPUE4LmZyb20oJCk7dHJ5e2lmKCFYLm9wZW4oe2F1dG9EZXN0cm95OiExfSkuY2xvc2VkKWRvIHlpZWxkIFg7d2hpbGUoIVgucmVzZXQoKS5vcGVuKCkuY2xvc2VkKX1maW5hbGx5e1guY2FuY2VsKCl9fWZ1bmN0aW9uIHU1KCQpe3JldHVybiBJMCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooKXtsZXQgUT15aWVsZCByKEE4LmZyb20oJCkpO3RyeXtpZighKHlpZWxkIHIoUS5vcGVuKHthdXRvRGVzdHJveTohMX0pKSkuY2xvc2VkKWRvIHlpZWxkIHlpZWxkIHIoUSk7d2hpbGUoISh5aWVsZCByKFEucmVzZXQoKS5vcGVuKCkpKS5jbG9zZWQpfWZpbmFsbHl7eWllbGQgcihRLmNhbmNlbCgpKX19KX1mdW5jdGlvbiB5RygkKXtyZXR1cm4gbmV3IEwxKG5ldyBsNSgkKSl9ZnVuY3Rpb24gbUcoJCl7bGV0IFg9JC5wZWVrKFlRKzcmLTgpO3JldHVybiBYJiZYLmJ5dGVMZW5ndGg+PTQ/IWVKKFgpP25ldyBMMShuZXcgclEoJCkpOm5ldyBHNihuZXcgZDIoJC5yZWFkKCkpKTpuZXcgTDEobmV3IHJRKGZ1bmN0aW9uKigpe30oKSkpfWZ1bmN0aW9uIGZHKCQpe3JldHVybiBWKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtsZXQgWD15aWVsZCAkLnBlZWsoWVErNyYtOCk7cmV0dXJuIFgmJlguYnl0ZUxlbmd0aD49ND8hZUooWCk/bmV3IFA2KG5ldyBpUSgkKSk6bmV3IEc2KG5ldyBkMih5aWVsZCAkLnJlYWQoKSkpOm5ldyBQNihuZXcgaVEoZnVuY3Rpb24oKXtyZXR1cm4gSTAodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKCl7fSl9KCkpKX0pfWZ1bmN0aW9uIGJHKCQpe3JldHVybiBWKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtsZXR7c2l6ZTpYfT15aWVsZCAkLnN0YXQoKSxRPW5ldyBCNigkLFgpO2lmKFg+PWg1JiZlSih5aWVsZCBRLnJlYWRBdCgwLFlRKzcmLTgpKSlyZXR1cm4gbmV3IGFRKG5ldyBkNShRKSk7cmV0dXJuIG5ldyBQNihuZXcgaVEoUSkpfSl9dmFyIEE4LEwxLFA2LEc2LGFRLHJRLGlRLGQyLGQ1LGw1O3ZhciB0UT1BKCgpPT57ZDAoKTtfJCgpO1MwKCk7TjgoKTtWOCgpO3RZKCk7Q1EoKTtYNigpO1o2KCk7WDIoKTtPNSgpO1YxKCk7cFEoKTskNCgpO1g0KCk7WTgoKTtBOD1jbGFzcyBBOCBleHRlbmRzIElYe2NvbnN0cnVjdG9yKCQpe3N1cGVyKCk7dGhpcy5faW1wbD0kfWdldCBjbG9zZWQoKXtyZXR1cm4gdGhpcy5faW1wbC5jbG9zZWR9Z2V0IHNjaGVtYSgpe3JldHVybiB0aGlzLl9pbXBsLnNjaGVtYX1nZXQgYXV0b0Rlc3Ryb3koKXtyZXR1cm4gdGhpcy5faW1wbC5hdXRvRGVzdHJveX1nZXQgZGljdGlvbmFyaWVzKCl7cmV0dXJuIHRoaXMuX2ltcGwuZGljdGlvbmFyaWVzfWdldCBudW1EaWN0aW9uYXJpZXMoKXtyZXR1cm4gdGhpcy5faW1wbC5udW1EaWN0aW9uYXJpZXN9Z2V0IG51bVJlY29yZEJhdGNoZXMoKXtyZXR1cm4gdGhpcy5faW1wbC5udW1SZWNvcmRCYXRjaGVzfWdldCBmb290ZXIoKXtyZXR1cm4gdGhpcy5faW1wbC5pc0ZpbGUoKT90aGlzLl9pbXBsLmZvb3RlcjpudWxsfWlzU3luYygpe3JldHVybiB0aGlzLl9pbXBsLmlzU3luYygpfWlzQXN5bmMoKXtyZXR1cm4gdGhpcy5faW1wbC5pc0FzeW5jKCl9aXNGaWxlKCl7cmV0dXJuIHRoaXMuX2ltcGwuaXNGaWxlKCl9aXNTdHJlYW0oKXtyZXR1cm4gdGhpcy5faW1wbC5pc1N0cmVhbSgpfW5leHQoKXtyZXR1cm4gdGhpcy5faW1wbC5uZXh0KCl9dGhyb3coJCl7cmV0dXJuIHRoaXMuX2ltcGwudGhyb3coJCl9cmV0dXJuKCQpe3JldHVybiB0aGlzLl9pbXBsLnJldHVybigkKX1jYW5jZWwoKXtyZXR1cm4gdGhpcy5faW1wbC5jYW5jZWwoKX1yZXNldCgkKXtyZXR1cm4gdGhpcy5faW1wbC5yZXNldCgkKSx0aGlzLl9ET01TdHJlYW09dm9pZCAwLHRoaXMuX25vZGVTdHJlYW09dm9pZCAwLHRoaXN9b3BlbigkKXtsZXQgWD10aGlzLl9pbXBsLm9wZW4oJCk7cmV0dXJuIFckKFgpP1gudGhlbigoKT0+dGhpcyk6dGhpc31yZWFkUmVjb3JkQmF0Y2goJCl7cmV0dXJuIHRoaXMuX2ltcGwuaXNGaWxlKCk/dGhpcy5faW1wbC5yZWFkUmVjb3JkQmF0Y2goJCk6bnVsbH1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzLl9pbXBsW1N5bWJvbC5pdGVyYXRvcl0oKX1bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7cmV0dXJuIHRoaXMuX2ltcGxbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl9dG9ET01TdHJlYW0oKXtyZXR1cm4gSzAudG9ET01TdHJlYW0odGhpcy5pc1N5bmMoKT97W1N5bWJvbC5pdGVyYXRvcl06KCk9PnRoaXN9OntbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT50aGlzfSl9dG9Ob2RlU3RyZWFtKCl7cmV0dXJuIEswLnRvTm9kZVN0cmVhbSh0aGlzLmlzU3luYygpP3tbU3ltYm9sLml0ZXJhdG9yXTooKT0+dGhpc306e1tTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PnRoaXN9LHtvYmplY3RNb2RlOiEwfSl9c3RhdGljIHRocm91Z2hOb2RlKCQpe3Rocm93IEVycm9yKCcidGhyb3VnaE5vZGUiIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudCcpfXN0YXRpYyB0aHJvdWdoRE9NKCQsWCl7dGhyb3cgRXJyb3IoJyJ0aHJvdWdoRE9NIiBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQnKX1zdGF0aWMgZnJvbSgkKXtpZigkIGluc3RhbmNlb2YgQTgpcmV0dXJuICQ7ZWxzZSBpZihJWigkKSlyZXR1cm4geUcoJCk7ZWxzZSBpZihUWigkKSlyZXR1cm4gYkcoJCk7ZWxzZSBpZihXJCgkKSlyZXR1cm4oKCk9PlYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCBBOC5mcm9tKHlpZWxkICQpfSkpKCk7ZWxzZSBpZih4WigkKXx8VVEoJCl8fHZaKCQpfHxPJCgkKSlyZXR1cm4gZkcobmV3IFgkKCQpKTtyZXR1cm4gbUcobmV3IG4kKCQpKX1zdGF0aWMgcmVhZEFsbCgkKXtpZigkIGluc3RhbmNlb2YgQTgpcmV0dXJuICQuaXNTeW5jKCk/YzUoJCk6dTUoJCk7ZWxzZSBpZihJWigkKXx8QXJyYXlCdWZmZXIuaXNWaWV3KCQpfHxnJCgkKXx8X1ooJCkpcmV0dXJuIGM1KCQpO3JldHVybiB1NSgkKX19O0wxPWNsYXNzIEwxIGV4dGVuZHMgQTh7Y29uc3RydWN0b3IoJCl7c3VwZXIoJCk7dGhpcy5faW1wbD0kfXJlYWRBbGwoKXtyZXR1cm5bLi4udGhpc119W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpcy5faW1wbFtTeW1ib2wuaXRlcmF0b3JdKCl9W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpe3JldHVybiBJMCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooKXt5aWVsZCByKHlpZWxkKktYKFkkKHRoaXNbU3ltYm9sLml0ZXJhdG9yXSgpKSkpfSl9fTtQNj1jbGFzcyBQNiBleHRlbmRzIEE4e2NvbnN0cnVjdG9yKCQpe3N1cGVyKCQpO3RoaXMuX2ltcGw9JH1yZWFkQWxsKCl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3ZhciAkLFgsUSxaO2xldCBKPVtdO3RyeXtmb3IodmFyIFk9ITAsSD1ZJCh0aGlzKSxXO1c9eWllbGQgSC5uZXh0KCksJD1XLmRvbmUsISQ7WT0hMCl7Wj1XLnZhbHVlLFk9ITE7bGV0IFA9WjtKLnB1c2goUCl9fWNhdGNoKFApe1g9e2Vycm9yOlB9fWZpbmFsbHl7dHJ5e2lmKCFZJiYhJCYmKFE9SC5yZXR1cm4pKXlpZWxkIFEuY2FsbChIKX1maW5hbGx5e2lmKFgpdGhyb3cgWC5lcnJvcn19cmV0dXJuIEp9KX1bU3ltYm9sLml0ZXJhdG9yXSgpe3Rocm93IEVycm9yKCJBc3luY1JlY29yZEJhdGNoU3RyZWFtUmVhZGVyIGlzIG5vdCBJdGVyYWJsZSIpfVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtyZXR1cm4gdGhpcy5faW1wbFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKX19O0c2PWNsYXNzIEc2IGV4dGVuZHMgTDF7Y29uc3RydWN0b3IoJCl7c3VwZXIoJCk7dGhpcy5faW1wbD0kfX07YVE9Y2xhc3MgYVEgZXh0ZW5kcyBQNntjb25zdHJ1Y3RvcigkKXtzdXBlcigkKTt0aGlzLl9pbXBsPSR9fTtyUT1jbGFzcyByUSBleHRlbmRzIHUye2NvbnN0cnVjdG9yKCQsWCl7c3VwZXIoWCk7dGhpcy5fcmVhZGVyPSFJWigkKT9uZXcgZTYodGhpcy5faGFuZGxlPSQpOm5ldyBKUSh0aGlzLl9oYW5kbGU9JCl9aXNTeW5jKCl7cmV0dXJuITB9aXNTdHJlYW0oKXtyZXR1cm4hMH1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzfWNhbmNlbCgpe2lmKCF0aGlzLmNsb3NlZCYmKHRoaXMuY2xvc2VkPSEwKSl0aGlzLnJlc2V0KCkuX3JlYWRlci5yZXR1cm4oKSx0aGlzLl9yZWFkZXI9bnVsbCx0aGlzLmRpY3Rpb25hcmllcz1udWxsfW9wZW4oJCl7aWYoIXRoaXMuY2xvc2VkKXtpZih0aGlzLmF1dG9EZXN0cm95PW41KHRoaXMsJCksISh0aGlzLnNjaGVtYXx8KHRoaXMuc2NoZW1hPXRoaXMuX3JlYWRlci5yZWFkU2NoZW1hKCkpKSl0aGlzLmNhbmNlbCgpfXJldHVybiB0aGlzfXRocm93KCQpe2lmKCF0aGlzLmNsb3NlZCYmdGhpcy5hdXRvRGVzdHJveSYmKHRoaXMuY2xvc2VkPSEwKSlyZXR1cm4gdGhpcy5yZXNldCgpLl9yZWFkZXIudGhyb3coJCk7cmV0dXJuIEM4fXJldHVybigkKXtpZighdGhpcy5jbG9zZWQmJnRoaXMuYXV0b0Rlc3Ryb3kmJih0aGlzLmNsb3NlZD0hMCkpcmV0dXJuIHRoaXMucmVzZXQoKS5fcmVhZGVyLnJldHVybigkKTtyZXR1cm4gQzh9bmV4dCgpe2lmKHRoaXMuY2xvc2VkKXJldHVybiBDODtsZXQgJCx7X3JlYWRlcjpYfT10aGlzO3doaWxlKCQ9dGhpcy5fcmVhZE5leHRNZXNzYWdlQW5kVmFsaWRhdGUoKSlpZigkLmlzU2NoZW1hKCkpdGhpcy5yZXNldCgkLmhlYWRlcigpKTtlbHNlIGlmKCQuaXNSZWNvcmRCYXRjaCgpKXt0aGlzLl9yZWNvcmRCYXRjaEluZGV4Kys7bGV0IFE9JC5oZWFkZXIoKSxaPVgucmVhZE1lc3NhZ2VCb2R5KCQuYm9keUxlbmd0aCk7cmV0dXJue2RvbmU6ITEsdmFsdWU6dGhpcy5fbG9hZFJlY29yZEJhdGNoKFEsWiwkLm1ldGFkYXRhKX19ZWxzZSBpZigkLmlzRGljdGlvbmFyeUJhdGNoKCkpe3RoaXMuX2RpY3Rpb25hcnlJbmRleCsrO2xldCBRPSQuaGVhZGVyKCksWj1YLnJlYWRNZXNzYWdlQm9keSgkLmJvZHlMZW5ndGgpLEo9dGhpcy5fbG9hZERpY3Rpb25hcnlCYXRjaChRLFopO3RoaXMuZGljdGlvbmFyaWVzLnNldChRLmlkLEopfWlmKHRoaXMuc2NoZW1hJiZ0aGlzLl9yZWNvcmRCYXRjaEluZGV4PT09MClyZXR1cm4gdGhpcy5fcmVjb3JkQmF0Y2hJbmRleCsrLHtkb25lOiExLHZhbHVlOm5ldyBYUSh0aGlzLnNjaGVtYSl9O3JldHVybiB0aGlzLnJldHVybigpfV9yZWFkTmV4dE1lc3NhZ2VBbmRWYWxpZGF0ZSgkKXtyZXR1cm4gdGhpcy5fcmVhZGVyLnJlYWRNZXNzYWdlKCQpfX07aVE9Y2xhc3MgaVEgZXh0ZW5kcyB1Mntjb25zdHJ1Y3RvcigkLFgpe3N1cGVyKFgpO3RoaXMuX3JlYWRlcj1uZXcgWlEodGhpcy5faGFuZGxlPSQpfWlzQXN5bmMoKXtyZXR1cm4hMH1pc1N0cmVhbSgpe3JldHVybiEwfVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtyZXR1cm4gdGhpc31jYW5jZWwoKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7aWYoIXRoaXMuY2xvc2VkJiYodGhpcy5jbG9zZWQ9ITApKXlpZWxkIHRoaXMucmVzZXQoKS5fcmVhZGVyLnJldHVybigpLHRoaXMuX3JlYWRlcj1udWxsLHRoaXMuZGljdGlvbmFyaWVzPW51bGx9KX1vcGVuKCQpe3JldHVybiBWKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtpZighdGhpcy5jbG9zZWQpe2lmKHRoaXMuYXV0b0Rlc3Ryb3k9bjUodGhpcywkKSwhKHRoaXMuc2NoZW1hfHwodGhpcy5zY2hlbWE9eWllbGQgdGhpcy5fcmVhZGVyLnJlYWRTY2hlbWEoKSkpKXlpZWxkIHRoaXMuY2FuY2VsKCl9cmV0dXJuIHRoaXN9KX10aHJvdygkKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7aWYoIXRoaXMuY2xvc2VkJiZ0aGlzLmF1dG9EZXN0cm95JiYodGhpcy5jbG9zZWQ9ITApKXJldHVybiB5aWVsZCB0aGlzLnJlc2V0KCkuX3JlYWRlci50aHJvdygkKTtyZXR1cm4gQzh9KX1yZXR1cm4oJCl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2lmKCF0aGlzLmNsb3NlZCYmdGhpcy5hdXRvRGVzdHJveSYmKHRoaXMuY2xvc2VkPSEwKSlyZXR1cm4geWllbGQgdGhpcy5yZXNldCgpLl9yZWFkZXIucmV0dXJuKCQpO3JldHVybiBDOH0pfW5leHQoKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7aWYodGhpcy5jbG9zZWQpcmV0dXJuIEM4O2xldCAkLHtfcmVhZGVyOlh9PXRoaXM7d2hpbGUoJD15aWVsZCB0aGlzLl9yZWFkTmV4dE1lc3NhZ2VBbmRWYWxpZGF0ZSgpKWlmKCQuaXNTY2hlbWEoKSl5aWVsZCB0aGlzLnJlc2V0KCQuaGVhZGVyKCkpO2Vsc2UgaWYoJC5pc1JlY29yZEJhdGNoKCkpe3RoaXMuX3JlY29yZEJhdGNoSW5kZXgrKztsZXQgUT0kLmhlYWRlcigpLFo9eWllbGQgWC5yZWFkTWVzc2FnZUJvZHkoJC5ib2R5TGVuZ3RoKTtyZXR1cm57ZG9uZTohMSx2YWx1ZTp0aGlzLl9sb2FkUmVjb3JkQmF0Y2goUSxaLCQubWV0YWRhdGEpfX1lbHNlIGlmKCQuaXNEaWN0aW9uYXJ5QmF0Y2goKSl7dGhpcy5fZGljdGlvbmFyeUluZGV4Kys7bGV0IFE9JC5oZWFkZXIoKSxaPXlpZWxkIFgucmVhZE1lc3NhZ2VCb2R5KCQuYm9keUxlbmd0aCksSj10aGlzLl9sb2FkRGljdGlvbmFyeUJhdGNoKFEsWik7dGhpcy5kaWN0aW9uYXJpZXMuc2V0KFEuaWQsSil9aWYodGhpcy5zY2hlbWEmJnRoaXMuX3JlY29yZEJhdGNoSW5kZXg9PT0wKXJldHVybiB0aGlzLl9yZWNvcmRCYXRjaEluZGV4Kysse2RvbmU6ITEsdmFsdWU6bmV3IFhRKHRoaXMuc2NoZW1hKX07cmV0dXJuIHlpZWxkIHRoaXMucmV0dXJuKCl9KX1fcmVhZE5leHRNZXNzYWdlQW5kVmFsaWRhdGUoJCl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9yZWFkZXIucmVhZE1lc3NhZ2UoJCl9KX19O2QyPWNsYXNzIGQyIGV4dGVuZHMgclF7Z2V0IGZvb3Rlcigpe3JldHVybiB0aGlzLl9mb290ZXJ9Z2V0IG51bURpY3Rpb25hcmllcygpe3JldHVybiB0aGlzLl9mb290ZXI/dGhpcy5fZm9vdGVyLm51bURpY3Rpb25hcmllczowfWdldCBudW1SZWNvcmRCYXRjaGVzKCl7cmV0dXJuIHRoaXMuX2Zvb3Rlcj90aGlzLl9mb290ZXIubnVtUmVjb3JkQmF0Y2hlczowfWNvbnN0cnVjdG9yKCQsWCl7c3VwZXIoJCBpbnN0YW5jZW9mIGNKPyQ6bmV3IGNKKCQpLFgpfWlzU3luYygpe3JldHVybiEwfWlzRmlsZSgpe3JldHVybiEwfW9wZW4oJCl7aWYoIXRoaXMuY2xvc2VkJiYhdGhpcy5fZm9vdGVyKXt0aGlzLnNjaGVtYT0odGhpcy5fZm9vdGVyPXRoaXMuX3JlYWRGb290ZXIoKSkuc2NoZW1hO2ZvcihsZXQgWCBvZiB0aGlzLl9mb290ZXIuZGljdGlvbmFyeUJhdGNoZXMoKSlYJiZ0aGlzLl9yZWFkRGljdGlvbmFyeUJhdGNoKHRoaXMuX2RpY3Rpb25hcnlJbmRleCsrKX1yZXR1cm4gc3VwZXIub3BlbigkKX1yZWFkUmVjb3JkQmF0Y2goJCl7dmFyIFg7aWYodGhpcy5jbG9zZWQpcmV0dXJuIG51bGw7aWYoIXRoaXMuX2Zvb3Rlcil0aGlzLm9wZW4oKTtsZXQgUT0oWD10aGlzLl9mb290ZXIpPT09bnVsbHx8WD09PXZvaWQgMD92b2lkIDA6WC5nZXRSZWNvcmRCYXRjaCgkKTtpZihRJiZ0aGlzLl9oYW5kbGUuc2VlayhRLm9mZnNldCkpe2xldCBaPXRoaXMuX3JlYWRlci5yZWFkTWVzc2FnZShYOC5SZWNvcmRCYXRjaCk7aWYoWj09PW51bGx8fFo9PT12b2lkIDA/dm9pZCAwOlouaXNSZWNvcmRCYXRjaCgpKXtsZXQgSj1aLmhlYWRlcigpLFk9dGhpcy5fcmVhZGVyLnJlYWRNZXNzYWdlQm9keShaLmJvZHlMZW5ndGgpO3JldHVybiB0aGlzLl9sb2FkUmVjb3JkQmF0Y2goSixZLFoubWV0YWRhdGEpfX1yZXR1cm4gbnVsbH1fcmVhZERpY3Rpb25hcnlCYXRjaCgkKXt2YXIgWDtsZXQgUT0oWD10aGlzLl9mb290ZXIpPT09bnVsbHx8WD09PXZvaWQgMD92b2lkIDA6WC5nZXREaWN0aW9uYXJ5QmF0Y2goJCk7aWYoUSYmdGhpcy5faGFuZGxlLnNlZWsoUS5vZmZzZXQpKXtsZXQgWj10aGlzLl9yZWFkZXIucmVhZE1lc3NhZ2UoWDguRGljdGlvbmFyeUJhdGNoKTtpZihaPT09bnVsbHx8Wj09PXZvaWQgMD92b2lkIDA6Wi5pc0RpY3Rpb25hcnlCYXRjaCgpKXtsZXQgSj1aLmhlYWRlcigpLFk9dGhpcy5fcmVhZGVyLnJlYWRNZXNzYWdlQm9keShaLmJvZHlMZW5ndGgpLEg9dGhpcy5fbG9hZERpY3Rpb25hcnlCYXRjaChKLFkpO3RoaXMuZGljdGlvbmFyaWVzLnNldChKLmlkLEgpfX19X3JlYWRGb290ZXIoKXtsZXR7X2hhbmRsZTokfT10aGlzLFg9JC5zaXplLWMyLFE9JC5yZWFkSW50MzIoWCksWj0kLnJlYWRBdChYLVEsUSk7cmV0dXJuICQ2LmRlY29kZShaKX1fcmVhZE5leHRNZXNzYWdlQW5kVmFsaWRhdGUoJCl7dmFyIFg7aWYoIXRoaXMuX2Zvb3Rlcil0aGlzLm9wZW4oKTtpZih0aGlzLl9mb290ZXImJnRoaXMuX3JlY29yZEJhdGNoSW5kZXg8dGhpcy5udW1SZWNvcmRCYXRjaGVzKXtsZXQgUT0oWD10aGlzLl9mb290ZXIpPT09bnVsbHx8WD09PXZvaWQgMD92b2lkIDA6WC5nZXRSZWNvcmRCYXRjaCh0aGlzLl9yZWNvcmRCYXRjaEluZGV4KTtpZihRJiZ0aGlzLl9oYW5kbGUuc2VlayhRLm9mZnNldCkpcmV0dXJuIHRoaXMuX3JlYWRlci5yZWFkTWVzc2FnZSgkKX1yZXR1cm4gbnVsbH19O2Q1PWNsYXNzIGQ1IGV4dGVuZHMgaVF7Z2V0IGZvb3Rlcigpe3JldHVybiB0aGlzLl9mb290ZXJ9Z2V0IG51bURpY3Rpb25hcmllcygpe3JldHVybiB0aGlzLl9mb290ZXI/dGhpcy5fZm9vdGVyLm51bURpY3Rpb25hcmllczowfWdldCBudW1SZWNvcmRCYXRjaGVzKCl7cmV0dXJuIHRoaXMuX2Zvb3Rlcj90aGlzLl9mb290ZXIubnVtUmVjb3JkQmF0Y2hlczowfWNvbnN0cnVjdG9yKCQsLi4uWCl7bGV0IFE9dHlwZW9mIFhbMF0hPT0ibnVtYmVyIj9YLnNoaWZ0KCk6dm9pZCAwLFo9WFswXWluc3RhbmNlb2YgTWFwP1guc2hpZnQoKTp2b2lkIDA7c3VwZXIoJCBpbnN0YW5jZW9mIEI2PyQ6bmV3IEI2KCQsUSksWil9aXNGaWxlKCl7cmV0dXJuITB9aXNBc3luYygpe3JldHVybiEwfW9wZW4oJCl7bGV0IFg9T2JqZWN0LmNyZWF0ZShudWxsLHtvcGVuOntnZXQ6KCk9PnN1cGVyLm9wZW59fSk7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2lmKCF0aGlzLmNsb3NlZCYmIXRoaXMuX2Zvb3Rlcil7dGhpcy5zY2hlbWE9KHRoaXMuX2Zvb3Rlcj15aWVsZCB0aGlzLl9yZWFkRm9vdGVyKCkpLnNjaGVtYTtmb3IobGV0IFEgb2YgdGhpcy5fZm9vdGVyLmRpY3Rpb25hcnlCYXRjaGVzKCkpUSYmKHlpZWxkIHRoaXMuX3JlYWREaWN0aW9uYXJ5QmF0Y2godGhpcy5fZGljdGlvbmFyeUluZGV4KyspKX1yZXR1cm4geWllbGQgWC5vcGVuLmNhbGwodGhpcywkKX0pfXJlYWRSZWNvcmRCYXRjaCgkKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7dmFyIFg7aWYodGhpcy5jbG9zZWQpcmV0dXJuIG51bGw7aWYoIXRoaXMuX2Zvb3Rlcil5aWVsZCB0aGlzLm9wZW4oKTtsZXQgUT0oWD10aGlzLl9mb290ZXIpPT09bnVsbHx8WD09PXZvaWQgMD92b2lkIDA6WC5nZXRSZWNvcmRCYXRjaCgkKTtpZihRJiYoeWllbGQgdGhpcy5faGFuZGxlLnNlZWsoUS5vZmZzZXQpKSl7bGV0IFo9eWllbGQgdGhpcy5fcmVhZGVyLnJlYWRNZXNzYWdlKFg4LlJlY29yZEJhdGNoKTtpZihaPT09bnVsbHx8Wj09PXZvaWQgMD92b2lkIDA6Wi5pc1JlY29yZEJhdGNoKCkpe2xldCBKPVouaGVhZGVyKCksWT15aWVsZCB0aGlzLl9yZWFkZXIucmVhZE1lc3NhZ2VCb2R5KFouYm9keUxlbmd0aCk7cmV0dXJuIHRoaXMuX2xvYWRSZWNvcmRCYXRjaChKLFksWi5tZXRhZGF0YSl9fXJldHVybiBudWxsfSl9X3JlYWREaWN0aW9uYXJ5QmF0Y2goJCl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3ZhciBYO2xldCBRPShYPXRoaXMuX2Zvb3Rlcik9PT1udWxsfHxYPT09dm9pZCAwP3ZvaWQgMDpYLmdldERpY3Rpb25hcnlCYXRjaCgkKTtpZihRJiYoeWllbGQgdGhpcy5faGFuZGxlLnNlZWsoUS5vZmZzZXQpKSl7bGV0IFo9eWllbGQgdGhpcy5fcmVhZGVyLnJlYWRNZXNzYWdlKFg4LkRpY3Rpb25hcnlCYXRjaCk7aWYoWj09PW51bGx8fFo9PT12b2lkIDA/dm9pZCAwOlouaXNEaWN0aW9uYXJ5QmF0Y2goKSl7bGV0IEo9Wi5oZWFkZXIoKSxZPXlpZWxkIHRoaXMuX3JlYWRlci5yZWFkTWVzc2FnZUJvZHkoWi5ib2R5TGVuZ3RoKSxIPXRoaXMuX2xvYWREaWN0aW9uYXJ5QmF0Y2goSixZKTt0aGlzLmRpY3Rpb25hcmllcy5zZXQoSi5pZCxIKX19fSl9X3JlYWRGb290ZXIoKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7bGV0e19oYW5kbGU6JH09dGhpczskLl9wZW5kaW5nJiYoeWllbGQgJC5fcGVuZGluZyk7bGV0IFg9JC5zaXplLWMyLFE9eWllbGQgJC5yZWFkSW50MzIoWCksWj15aWVsZCAkLnJlYWRBdChYLVEsUSk7cmV0dXJuICQ2LmRlY29kZShaKX0pfV9yZWFkTmV4dE1lc3NhZ2VBbmRWYWxpZGF0ZSgkKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7aWYoIXRoaXMuX2Zvb3Rlcil5aWVsZCB0aGlzLm9wZW4oKTtpZih0aGlzLl9mb290ZXImJnRoaXMuX3JlY29yZEJhdGNoSW5kZXg8dGhpcy5udW1SZWNvcmRCYXRjaGVzKXtsZXQgWD10aGlzLl9mb290ZXIuZ2V0UmVjb3JkQmF0Y2godGhpcy5fcmVjb3JkQmF0Y2hJbmRleCk7aWYoWCYmKHlpZWxkIHRoaXMuX2hhbmRsZS5zZWVrKFgub2Zmc2V0KSkpcmV0dXJuIHlpZWxkIHRoaXMuX3JlYWRlci5yZWFkTWVzc2FnZSgkKX1yZXR1cm4gbnVsbH0pfX07bDU9Y2xhc3MgbDUgZXh0ZW5kcyByUXtjb25zdHJ1Y3RvcigkLFgpe3N1cGVyKCQsWCl9X2xvYWRWZWN0b3JzKCQsWCxRKXtyZXR1cm4gbmV3IEcyKFgsJC5ub2RlcywkLmJ1ZmZlcnMsdGhpcy5kaWN0aW9uYXJpZXMsdGhpcy5zY2hlbWEubWV0YWRhdGFWZXJzaW9uLCQudmFyaWFkaWNCdWZmZXJDb3VudHMpLnZpc2l0TWFueShRKX19fSk7ZnVuY3Rpb24gQSQoJCl7bGV0IFg9JC5ieXRlTGVuZ3RoKzcmLTg7cmV0dXJuIHRoaXMuYnVmZmVycy5wdXNoKCQpLHRoaXMuYnVmZmVyUmVnaW9ucy5wdXNoKG5ldyBoOCh0aGlzLl9ieXRlTGVuZ3RoLFgpKSx0aGlzLl9ieXRlTGVuZ3RoKz1YLHRoaXN9ZnVuY3Rpb24gcEcoJCl7dmFyIFg7bGV0e3R5cGU6USxsZW5ndGg6Wix0eXBlSWRzOkosdmFsdWVPZmZzZXRzOll9PSQ7aWYoQSQuY2FsbCh0aGlzLEopLFEubW9kZT09PSQ4LlNwYXJzZSlyZXR1cm4gbDIuY2FsbCh0aGlzLCQpO2Vsc2UgaWYoUS5tb2RlPT09JDguRGVuc2UpaWYoJC5vZmZzZXQ8PTApcmV0dXJuIEEkLmNhbGwodGhpcyxZKSxsMi5jYWxsKHRoaXMsJCk7ZWxzZXtsZXQgSD1uZXcgSW50MzJBcnJheShaKSxXPU9iamVjdC5jcmVhdGUobnVsbCksUD1PYmplY3QuY3JlYXRlKG51bGwpO2ZvcihsZXQgRyxxLEw9LTE7KytMPFo7KXtpZigoRz1KW0xdKT09PXZvaWQgMCljb250aW51ZTtpZigocT1XW0ddKT09PXZvaWQgMClxPVdbR109WVtMXTtIW0xdPVlbTF0tcSxQW0ddPSgoWD1QW0ddKSE9PW51bGwmJlghPT12b2lkIDA/WDowKSsxfUEkLmNhbGwodGhpcyxIKSx0aGlzLnZpc2l0TWFueSgkLmNoaWxkcmVuLm1hcCgoRyxxKT0+e2xldCBMPVEudHlwZUlkc1txXSxOPVdbTF0sVT1QW0xdO3JldHVybiBHLnNsaWNlKE4sTWF0aC5taW4oWixVKSl9KSl9cmV0dXJuIHRoaXN9ZnVuY3Rpb24gY0coJCl7bGV0IFg7aWYoJC5udWxsQ291bnQ+PSQubGVuZ3RoKXJldHVybiBBJC5jYWxsKHRoaXMsbmV3IFVpbnQ4QXJyYXkoJC5sZW5ndGgrNz4+MykpO2Vsc2UgaWYoKFg9JC52YWx1ZXMpaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBBJC5jYWxsKHRoaXMsUzYoJC5vZmZzZXQsJC5sZW5ndGgsWCkpO3JldHVybiBBJC5jYWxsKHRoaXMsRDYoJC52YWx1ZXMpKX1mdW5jdGlvbiBCMSgkKXtyZXR1cm4gQSQuY2FsbCh0aGlzLCQudmFsdWVzLnN1YmFycmF5KDAsJC5sZW5ndGgqJC5zdHJpZGUpKX1mdW5jdGlvbiBaNCgkKXtsZXR7bGVuZ3RoOlgsdmFsdWVzOlEsdmFsdWVPZmZzZXRzOlp9PSQsSj1XOChaWzBdKSxZPVc4KFpbWF0pLEg9TWF0aC5taW4oWS1KLFEuYnl0ZUxlbmd0aC1KKTtyZXR1cm4gQSQuY2FsbCh0aGlzLHlaKC1KLFgrMSxaKSksQSQuY2FsbCh0aGlzLFEuc3ViYXJyYXkoSixKK0gpKSx0aGlzfWZ1bmN0aW9uIG81KCQpe2xldHtvZmZzZXQ6WCxsZW5ndGg6USxzdHJpZGU6Wix2YWx1ZXM6Six2YXJpYWRpY0J1ZmZlcnM6WT1bXX09JDtpZighSil0aHJvdyBFcnJvcigiQmluYXJ5VmlldyBkYXRhIGlzIG1pc3NpbmcgdmlldyBidWZmZXIiKTtsZXQgSD1YKlosVz1IK1EqWjtBJC5jYWxsKHRoaXMsSi5zdWJhcnJheShILFcpKTtmb3IobGV0IFAgb2YgWSlBJC5jYWxsKHRoaXMsUCk7cmV0dXJuIHRoaXMuX3ZhcmlhZGljQnVmZmVyQ291bnRzLnB1c2goWS5sZW5ndGgpLHRoaXN9ZnVuY3Rpb24gbjIoJCl7bGV0e2xlbmd0aDpYLHZhbHVlT2Zmc2V0czpRfT0kO2lmKFEpe2xldHtbMF06WixbWF06Sn09UTtyZXR1cm4gQSQuY2FsbCh0aGlzLHlaKC1aLFgrMSxRKSksdGhpcy52aXNpdCgkLmNoaWxkcmVuWzBdLnNsaWNlKFosSi1aKSl9cmV0dXJuIHRoaXMudmlzaXQoJC5jaGlsZHJlblswXSl9ZnVuY3Rpb24gbDIoJCl7cmV0dXJuIHRoaXMudmlzaXRNYW55KCQudHlwZS5jaGlsZHJlbi5tYXAoKFgsUSk9PiQuY2hpbGRyZW5bUV0pLmZpbHRlcihCb29sZWFuKSlbMF19dmFyIGo4O3ZhciBzNT1BKCgpPT57UzAoKTtlMCgpO1Y4KCk7VjEoKTtvOCgpO3c2KCk7WDYoKTtOOCgpO2o4PWNsYXNzIGo4IGV4dGVuZHMgVHtzdGF0aWMgYXNzZW1ibGUoLi4uJCl7bGV0IFg9KFopPT5aLmZsYXRNYXAoKEopPT5BcnJheS5pc0FycmF5KEopP1goSik6SiBpbnN0YW5jZW9mIGc/Si5kYXRhLmNoaWxkcmVuOkouZGF0YSksUT1uZXcgajg7cmV0dXJuIFEudmlzaXRNYW55KFgoJCkpLFF9Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX2J5dGVMZW5ndGg9MCx0aGlzLl9ub2Rlcz1bXSx0aGlzLl9idWZmZXJzPVtdLHRoaXMuX2J1ZmZlclJlZ2lvbnM9W10sdGhpcy5fdmFyaWFkaWNCdWZmZXJDb3VudHM9W119dmlzaXQoJCl7aWYoJCBpbnN0YW5jZW9mIEQpcmV0dXJuIHRoaXMudmlzaXRNYW55KCQuZGF0YSksdGhpcztsZXR7dHlwZTpYfT0kO2lmKCFSLmlzRGljdGlvbmFyeShYKSl7bGV0e2xlbmd0aDpRfT0kO2lmKFE+MjE0NzQ4MzY0Nyl0aHJvdyBSYW5nZUVycm9yKCJDYW5ub3Qgd3JpdGUgYXJyYXlzIGxhcmdlciB0aGFuIDJeMzEgLSAxIGluIGxlbmd0aCIpO2lmKFIuaXNVbmlvbihYKSl0aGlzLm5vZGVzLnB1c2gobmV3IGQkKFEsMCkpO2Vsc2V7bGV0e251bGxDb3VudDpafT0kO2lmKCFSLmlzTnVsbChYKSlBJC5jYWxsKHRoaXMsWjw9MD9uZXcgVWludDhBcnJheSgwKTpTNigkLm9mZnNldCxRLCQubnVsbEJpdG1hcCkpO3RoaXMubm9kZXMucHVzaChuZXcgZCQoUSxaKSl9fXJldHVybiBzdXBlci52aXNpdCgkKX12aXNpdE51bGwoJCl7cmV0dXJuIHRoaXN9dmlzaXREaWN0aW9uYXJ5KCQpe3JldHVybiB0aGlzLnZpc2l0KCQuY2xvbmUoJC50eXBlLmluZGljZXMpKX1nZXQgbm9kZXMoKXtyZXR1cm4gdGhpcy5fbm9kZXN9Z2V0IGJ1ZmZlcnMoKXtyZXR1cm4gdGhpcy5fYnVmZmVyc31nZXQgYnl0ZUxlbmd0aCgpe3JldHVybiB0aGlzLl9ieXRlTGVuZ3RofWdldCBidWZmZXJSZWdpb25zKCl7cmV0dXJuIHRoaXMuX2J1ZmZlclJlZ2lvbnN9Z2V0IHZhcmlhZGljQnVmZmVyQ291bnRzKCl7cmV0dXJuIHRoaXMuX3ZhcmlhZGljQnVmZmVyQ291bnRzfX07ajgucHJvdG90eXBlLnZpc2l0Qm9vbD1jRztqOC5wcm90b3R5cGUudmlzaXRJbnQ9QjE7ajgucHJvdG90eXBlLnZpc2l0RmxvYXQ9QjE7ajgucHJvdG90eXBlLnZpc2l0VXRmOD1aNDtqOC5wcm90b3R5cGUudmlzaXRMYXJnZVV0Zjg9WjQ7ajgucHJvdG90eXBlLnZpc2l0VXRmOFZpZXc9bzU7ajgucHJvdG90eXBlLnZpc2l0QmluYXJ5PVo0O2o4LnByb3RvdHlwZS52aXNpdExhcmdlQmluYXJ5PVo0O2o4LnByb3RvdHlwZS52aXNpdEJpbmFyeVZpZXc9bzU7ajgucHJvdG90eXBlLnZpc2l0Rml4ZWRTaXplQmluYXJ5PUIxO2o4LnByb3RvdHlwZS52aXNpdERhdGU9QjE7ajgucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wPUIxO2o4LnByb3RvdHlwZS52aXNpdFRpbWU9QjE7ajgucHJvdG90eXBlLnZpc2l0RGVjaW1hbD1CMTtqOC5wcm90b3R5cGUudmlzaXRMaXN0PW4yO2o4LnByb3RvdHlwZS52aXNpdFN0cnVjdD1sMjtqOC5wcm90b3R5cGUudmlzaXRVbmlvbj1wRztqOC5wcm90b3R5cGUudmlzaXRJbnRlcnZhbD1CMTtqOC5wcm90b3R5cGUudmlzaXREdXJhdGlvbj1CMTtqOC5wcm90b3R5cGUudmlzaXRGaXhlZFNpemVMaXN0PW4yO2o4LnByb3RvdHlwZS52aXNpdE1hcD1uMn0pO3ZhciBvMjt2YXIgcjU9QSgoKT0+e2UwKCk7dVooKTtWOCgpO28yPWNsYXNzIG8yIGV4dGVuZHMgVHt2aXNpdCgkKXtyZXR1cm4gJD09bnVsbD92b2lkIDA6c3VwZXIudmlzaXQoJCl9dmlzaXROdWxsKHt0eXBlSWQ6JH0pe3JldHVybntuYW1lOnBbJF0udG9Mb3dlckNhc2UoKX19dmlzaXRJbnQoe3R5cGVJZDokLGJpdFdpZHRoOlgsaXNTaWduZWQ6UX0pe3JldHVybntuYW1lOnBbJF0udG9Mb3dlckNhc2UoKSxiaXRXaWR0aDpYLGlzU2lnbmVkOlF9fXZpc2l0RmxvYXQoe3R5cGVJZDokLHByZWNpc2lvbjpYfSl7cmV0dXJue25hbWU6cFskXS50b0xvd2VyQ2FzZSgpLHByZWNpc2lvbjp6OFtYXX19dmlzaXRCaW5hcnkoe3R5cGVJZDokfSl7cmV0dXJue25hbWU6cFskXS50b0xvd2VyQ2FzZSgpfX12aXNpdExhcmdlQmluYXJ5KHt0eXBlSWQ6JH0pe3JldHVybntuYW1lOnBbJF0udG9Mb3dlckNhc2UoKX19dmlzaXRCaW5hcnlWaWV3KHt0eXBlSWQ6JH0pe3JldHVybntuYW1lOnBbJF0udG9Mb3dlckNhc2UoKX19dmlzaXRCb29sKHt0eXBlSWQ6JH0pe3JldHVybntuYW1lOnBbJF0udG9Mb3dlckNhc2UoKX19dmlzaXRVdGY4KHt0eXBlSWQ6JH0pe3JldHVybntuYW1lOnBbJF0udG9Mb3dlckNhc2UoKX19dmlzaXRMYXJnZVV0Zjgoe3R5cGVJZDokfSl7cmV0dXJue25hbWU6cFskXS50b0xvd2VyQ2FzZSgpfX12aXNpdFV0ZjhWaWV3KHt0eXBlSWQ6JH0pe3JldHVybntuYW1lOnBbJF0udG9Mb3dlckNhc2UoKX19dmlzaXREZWNpbWFsKHt0eXBlSWQ6JCxzY2FsZTpYLHByZWNpc2lvbjpRLGJpdFdpZHRoOlp9KXtyZXR1cm57bmFtZTpwWyRdLnRvTG93ZXJDYXNlKCksc2NhbGU6WCxwcmVjaXNpb246USxiaXRXaWR0aDpafX12aXNpdERhdGUoe3R5cGVJZDokLHVuaXQ6WH0pe3JldHVybntuYW1lOnBbJF0udG9Mb3dlckNhc2UoKSx1bml0Oko4W1hdfX12aXNpdFRpbWUoe3R5cGVJZDokLHVuaXQ6WCxiaXRXaWR0aDpRfSl7cmV0dXJue25hbWU6cFskXS50b0xvd2VyQ2FzZSgpLHVuaXQ6T1tYXSxiaXRXaWR0aDpRfX12aXNpdFRpbWVzdGFtcCh7dHlwZUlkOiQsdGltZXpvbmU6WCx1bml0OlF9KXtyZXR1cm57bmFtZTpwWyRdLnRvTG93ZXJDYXNlKCksdW5pdDpPW1FdLHRpbWV6b25lOlh9fXZpc2l0SW50ZXJ2YWwoe3R5cGVJZDokLHVuaXQ6WH0pe3JldHVybntuYW1lOnBbJF0udG9Mb3dlckNhc2UoKSx1bml0OmVbWF19fXZpc2l0RHVyYXRpb24oe3R5cGVJZDokLHVuaXQ6WH0pe3JldHVybntuYW1lOnBbJF0udG9Mb2NhbGVMb3dlckNhc2UoKSx1bml0Ok9bWF19fXZpc2l0TGlzdCh7dHlwZUlkOiR9KXtyZXR1cm57bmFtZTpwWyRdLnRvTG93ZXJDYXNlKCl9fXZpc2l0U3RydWN0KHt0eXBlSWQ6JH0pe3JldHVybntuYW1lOnBbJF0udG9Mb3dlckNhc2UoKX19dmlzaXRVbmlvbih7dHlwZUlkOiQsbW9kZTpYLHR5cGVJZHM6UX0pe3JldHVybntuYW1lOnBbJF0udG9Mb3dlckNhc2UoKSxtb2RlOiQ4W1hdLnRvVXBwZXJDYXNlKCksdHlwZUlkczpbLi4uUV19fXZpc2l0RGljdGlvbmFyeSgkKXtyZXR1cm4gdGhpcy52aXNpdCgkLmRpY3Rpb25hcnkpfXZpc2l0Rml4ZWRTaXplQmluYXJ5KHt0eXBlSWQ6JCxieXRlV2lkdGg6WH0pe3JldHVybntuYW1lOnBbJF0udG9Mb3dlckNhc2UoKSxieXRlV2lkdGg6WH19dmlzaXRGaXhlZFNpemVMaXN0KHt0eXBlSWQ6JCxsaXN0U2l6ZTpYfSl7cmV0dXJue25hbWU6cFskXS50b0xvd2VyQ2FzZSgpLGxpc3RTaXplOlh9fXZpc2l0TWFwKHt0eXBlSWQ6JCxrZXlzU29ydGVkOlh9KXtyZXR1cm57bmFtZTpwWyRdLnRvTG93ZXJDYXNlKCksa2V5c1NvcnRlZDpYfX19fSk7ZnVuY3Rpb24qczIoJCl7Zm9yKGxldCBYIG9mICQpeWllbGQgWC5yZWR1Y2UoKFEsWik9PntyZXR1cm5gJHtRfSR7KCIwIisoWiYyNTUpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpfWB9LCIiKS50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uKnE2KCQsWCl7bGV0IFE9bmV3IFVpbnQzMkFycmF5KCQuYnVmZmVyKTtmb3IobGV0IFo9LTEsSj1RLmxlbmd0aC9YOysrWjxKOyl5aWVsZGAke0M2Lm5ldyhRLnN1YmFycmF5KChaKzApKlgsKForMSkqWCksITEpfWB9ZnVuY3Rpb24gaTUoJCxYKXtsZXQgWj0kLnZhbHVlcyxKPW5ldyBEYXRhVmlldyhaLmJ1ZmZlcixaLmJ5dGVPZmZzZXQsWi5ieXRlTGVuZ3RoKSxZPVouYnl0ZUxlbmd0aC8xNixIPShOKT0+QXJyYXkuZnJvbShOKS5tYXAoKFUpPT4oIjAiKyhVJjI1NSkudG9TdHJpbmcoMTYpKS5zbGljZSgtMikpLmpvaW4oIiIpLnRvVXBwZXJDYXNlKCksVz1BcnJheS5mcm9tKHtsZW5ndGg6WX0sKE4sVSk9PntsZXQgaz1VKjE2LFM9Si5nZXRJbnQzMihrLCEwKTtyZXR1cm5bayxTXX0pLm1hcCgoW04sVV0pPT5VPjEyP3tTSVpFOlUsUFJFRklYX0hFWDpIKFouc3ViYXJyYXkoTis0LE4rOCkpLEJVRkZFUl9JTkRFWDpKLmdldEludDMyKE4rOCwhMCksT0ZGU0VUOkouZ2V0SW50MzIoTisxMiwhMCl9OntTSVpFOlUsSU5MSU5FRDpYKFouc3ViYXJyYXkoTis0LE4rNCtVKSl9KSxQPVsuLi5uZXcgU2V0KFcubWFwKChOKT0+Ti5CVUZGRVJfSU5ERVgpLmZpbHRlcigoTik9Pk4hPT12b2lkIDApKV0sRz1QLm1hcCgoTik9PkgoJC52YXJpYWRpY0J1ZmZlcnNbTl0pKSxxPW5ldyBNYXAoUC5tYXAoKE4sVSk9PltOLFVdKSk7cmV0dXJue1ZJRVdTOlcubWFwKChOKT0+Ti5CVUZGRVJfSU5ERVghPT12b2lkIDA/T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LE4pLHtCVUZGRVJfSU5ERVg6cS5nZXQoTi5CVUZGRVJfSU5ERVgpfSk6TiksVkFSSUFESUNfREFUQV9CVUZGRVJTOkd9fXZhciBlUTt2YXIgYTU9QSgoKT0+e2xaKCk7UzAoKTtlMCgpO1Y4KCk7VjgoKTt3NigpO044KCk7ZVE9Y2xhc3MgZVEgZXh0ZW5kcyBUe3N0YXRpYyBhc3NlbWJsZSguLi4kKXtsZXQgWD1uZXcgZVE7cmV0dXJuICQubWFwKCh7c2NoZW1hOlEsZGF0YTpafSk9PntyZXR1cm4gWC52aXNpdE1hbnkoUS5maWVsZHMsWi5jaGlsZHJlbil9KX12aXNpdCh7bmFtZTokfSxYKXtsZXR7bGVuZ3RoOlF9PVgse29mZnNldDpaLG51bGxDb3VudDpKLG51bGxCaXRtYXA6WX09WCxIPVIuaXNEaWN0aW9uYXJ5KFgudHlwZSk/WC50eXBlLmluZGljZXM6WC50eXBlLFc9T2JqZWN0LmFzc2lnbihbXSxYLmJ1ZmZlcnMse1t6MC5WQUxJRElUWV06dm9pZCAwfSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oe25hbWU6JCxjb3VudDpRLFZBTElESVRZOlIuaXNOdWxsKEgpfHxSLmlzVW5pb24oSCk/dm9pZCAwOko8PTA/QXJyYXkuZnJvbSh7bGVuZ3RoOlF9LCgpPT4xKTpbLi4ubmV3IGsxKFksWixRLG51bGwsREopXX0sc3VwZXIudmlzaXQoWC5jbG9uZShILFosUSwwLFcpKSl9dmlzaXROdWxsKCl7cmV0dXJue319dmlzaXRCb29sKHt2YWx1ZXM6JCxvZmZzZXQ6WCxsZW5ndGg6UX0pe3JldHVybntEQVRBOlsuLi5uZXcgazEoJCxYLFEsbnVsbCxTWCldfX12aXNpdEludCgkKXtyZXR1cm57REFUQTokLnR5cGUuYml0V2lkdGg8NjQ/Wy4uLiQudmFsdWVzXTpbLi4ucTYoJC52YWx1ZXMsMildfX12aXNpdEZsb2F0KCQpe3JldHVybntEQVRBOlsuLi4kLnZhbHVlc119fXZpc2l0VXRmOCgkKXtyZXR1cm57REFUQTpbLi4ubmV3IEQoWyRdKV0sT0ZGU0VUOlsuLi4kLnZhbHVlT2Zmc2V0c119fXZpc2l0TGFyZ2VVdGY4KCQpe3JldHVybntEQVRBOlsuLi5uZXcgRChbJF0pXSxPRkZTRVQ6Wy4uLnE2KCQudmFsdWVPZmZzZXRzLDIpXX19dmlzaXRCaW5hcnkoJCl7cmV0dXJue0RBVEE6Wy4uLnMyKG5ldyBEKFskXSkpXSxPRkZTRVQ6Wy4uLiQudmFsdWVPZmZzZXRzXX19dmlzaXRMYXJnZUJpbmFyeSgkKXtyZXR1cm57REFUQTpbLi4uczIobmV3IEQoWyRdKSldLE9GRlNFVDpbLi4ucTYoJC52YWx1ZU9mZnNldHMsMildfX12aXNpdEJpbmFyeVZpZXcoJCl7cmV0dXJuIGk1KCQsKFgpPT5BcnJheS5mcm9tKFgpLm1hcCgoUSk9PigiMCIrKFEmMjU1KS50b1N0cmluZygxNikpLnNsaWNlKC0yKSkuam9pbigiIikudG9VcHBlckNhc2UoKSl9dmlzaXRVdGY4VmlldygkKXtyZXR1cm4gaTUoJCwoWCk9PkFycmF5LmZyb20oWCkubWFwKChRKT0+U3RyaW5nLmZyb21Db2RlUG9pbnQoUSkpLmpvaW4oIiIpKX12aXNpdEZpeGVkU2l6ZUJpbmFyeSgkKXtyZXR1cm57REFUQTpbLi4uczIobmV3IEQoWyRdKSldfX12aXNpdERhdGUoJCl7cmV0dXJue0RBVEE6JC50eXBlLnVuaXQ9PT1KOC5EQVk/Wy4uLiQudmFsdWVzXTpbLi4ucTYoJC52YWx1ZXMsMildfX12aXNpdFRpbWVzdGFtcCgkKXtyZXR1cm57REFUQTpbLi4ucTYoJC52YWx1ZXMsMildfX12aXNpdFRpbWUoJCl7cmV0dXJue0RBVEE6JC50eXBlLnVuaXQ8Ty5NSUNST1NFQ09ORD9bLi4uJC52YWx1ZXNdOlsuLi5xNigkLnZhbHVlcywyKV19fXZpc2l0RGVjaW1hbCgkKXtyZXR1cm57REFUQTpbLi4ucTYoJC52YWx1ZXMsNCldfX12aXNpdExpc3QoJCl7cmV0dXJue09GRlNFVDpbLi4uJC52YWx1ZU9mZnNldHNdLGNoaWxkcmVuOnRoaXMudmlzaXRNYW55KCQudHlwZS5jaGlsZHJlbiwkLmNoaWxkcmVuKX19dmlzaXRTdHJ1Y3QoJCl7cmV0dXJue2NoaWxkcmVuOnRoaXMudmlzaXRNYW55KCQudHlwZS5jaGlsZHJlbiwkLmNoaWxkcmVuKX19dmlzaXRVbmlvbigkKXtyZXR1cm57VFlQRV9JRDpbLi4uJC50eXBlSWRzXSxPRkZTRVQ6JC50eXBlLm1vZGU9PT0kOC5EZW5zZT9bLi4uJC52YWx1ZU9mZnNldHNdOnZvaWQgMCxjaGlsZHJlbjp0aGlzLnZpc2l0TWFueSgkLnR5cGUuY2hpbGRyZW4sJC5jaGlsZHJlbil9fXZpc2l0SW50ZXJ2YWwoJCl7c3dpdGNoKCQudHlwZS51bml0KXtjYXNlIGUuWUVBUl9NT05USDpyZXR1cm57REFUQTpbLi4uJC52YWx1ZXNdfTtjYXNlIGUuREFZX1RJTUU6cmV0dXJue0RBVEE6VzIoJC52YWx1ZXMpfTtjYXNlIGUuTU9OVEhfREFZX05BTk86cmV0dXJue0RBVEE6SzIoJC52YWx1ZXMsITApfX19dmlzaXREdXJhdGlvbigkKXtyZXR1cm57REFUQTpbLi4ucTYoJC52YWx1ZXMsMildfX12aXNpdEZpeGVkU2l6ZUxpc3QoJCl7cmV0dXJue2NoaWxkcmVuOnRoaXMudmlzaXRNYW55KCQudHlwZS5jaGlsZHJlbiwkLmNoaWxkcmVuKX19dmlzaXRNYXAoJCl7cmV0dXJue09GRlNFVDpbLi4uJC52YWx1ZU9mZnNldHNdLGNoaWxkcmVuOnRoaXMudmlzaXRNYW55KCQudHlwZS5jaGlsZHJlbiwkLmNoaWxkcmVuKX19fX0pO2Z1bmN0aW9uIHIyKCQsWCl7bGV0IFE9WDtpZihYIGluc3RhbmNlb2YgTTgpUT1YLmJhdGNoZXMsJC5yZXNldCh2b2lkIDAsWC5zY2hlbWEpO2ZvcihsZXQgWiBvZiBRKSQud3JpdGUoWik7cmV0dXJuICQuZmluaXNoKCl9ZnVuY3Rpb24gaTIoJCxYKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7dmFyIFEsWixKLFksSCxXLFA7dHJ5e2ZvcihRPSEwLFo9WSQoWCk7Sj15aWVsZCBaLm5leHQoKSxZPUouZG9uZSwhWTtRPSEwKXtQPUoudmFsdWUsUT0hMTtsZXQgRz1QOyQud3JpdGUoRyl9fWNhdGNoKEcpe0g9e2Vycm9yOkd9fWZpbmFsbHl7dHJ5e2lmKCFRJiYhWSYmKFc9Wi5yZXR1cm4pKXlpZWxkIFcuY2FsbChaKX1maW5hbGx5e2lmKEgpdGhyb3cgSC5lcnJvcn19cmV0dXJuICQuZmluaXNoKCl9KX1mdW5jdGlvbiB0NSh7bmFtZTokLHR5cGU6WCxudWxsYWJsZTpRfSl7bGV0IFo9bmV3IG8yO3JldHVybntuYW1lOiQsbnVsbGFibGU6USx0eXBlOloudmlzaXQoWCksY2hpbGRyZW46KFguY2hpbGRyZW58fFtdKS5tYXAoKEopPT50NShKKSksZGljdGlvbmFyeTohUi5pc0RpY3Rpb25hcnkoWCk/dm9pZCAwOntpZDpYLmlkLGlzT3JkZXJlZDpYLmlzT3JkZXJlZCxpbmRleFR5cGU6Wi52aXNpdChYLmluZGljZXMpfX19ZnVuY3Rpb24gdUcoJCxYLFE9ITEpe2xldFtaXT1lUS5hc3NlbWJsZShuZXcgZyh7W1hdOiR9KSk7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHtpZDpYLGlzRGVsdGE6USxkYXRhOntjb3VudDokLmxlbmd0aCxjb2x1bW5zOlp9fSxudWxsLDIpfWZ1bmN0aW9uIGRHKCQpe2xldFtYXT1lUS5hc3NlbWJsZSgkKTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoe2NvdW50OiQubnVtUm93cyxjb2x1bW5zOlh9LG51bGwsMil9dmFyIEkxLFokLF8xLCRaO3ZhciBKND1BKCgpPT57ZDAoKTt0NigpOyQ0KCk7UzAoKTtOOCgpO1g2KCk7WDYoKTt0WSgpO1Y4KCk7blEoKTtaNigpO3M1KCk7cjUoKTthNSgpO284KCk7VjEoKTtwUSgpO3FYKCk7WDQoKTtZOCgpO0kxPWNsYXNzIEkxIGV4dGVuZHMgSVh7c3RhdGljIHRocm91Z2hOb2RlKCQpe3Rocm93IEVycm9yKCcidGhyb3VnaE5vZGUiIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudCcpfXN0YXRpYyB0aHJvdWdoRE9NKCQsWCl7dGhyb3cgRXJyb3IoJyJ0aHJvdWdoRE9NIiBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQnKX1jb25zdHJ1Y3RvcigkKXtzdXBlcigpO2lmKHRoaXMuX3Bvc2l0aW9uPTAsdGhpcy5fc3RhcnRlZD0hMSx0aGlzLl9jb21wcmVzc2lvbj1udWxsLHRoaXMuX3Npbms9bmV3IGwkLHRoaXMuX3NjaGVtYT1udWxsLHRoaXMuX2RpY3Rpb25hcnlCbG9ja3M9W10sdGhpcy5fcmVjb3JkQmF0Y2hCbG9ja3M9W10sdGhpcy5fc2VlbkRpY3Rpb25hcmllcz1uZXcgTWFwLHRoaXMuX2RpY3Rpb25hcnlEZWx0YU9mZnNldHM9bmV3IE1hcCxfMCgkKXx8KCQ9e2F1dG9EZXN0cm95OiEwLHdyaXRlTGVnYWN5SXBjRm9ybWF0OiExLGNvbXByZXNzaW9uVHlwZTpudWxsfSksdGhpcy5fYXV0b0Rlc3Ryb3k9dHlwZW9mICQuYXV0b0Rlc3Ryb3k9PT0iYm9vbGVhbiI/JC5hdXRvRGVzdHJveTohMCx0aGlzLl93cml0ZUxlZ2FjeUlwY0Zvcm1hdD10eXBlb2YgJC53cml0ZUxlZ2FjeUlwY0Zvcm1hdD09PSJib29sZWFuIj8kLndyaXRlTGVnYWN5SXBjRm9ybWF0OiExLCQuY29tcHJlc3Npb25UeXBlIT1udWxsKXtpZih0aGlzLl93cml0ZUxlZ2FjeUlwY0Zvcm1hdCl0aHJvdyBFcnJvcigiTGVnYWN5IElQQyBmb3JtYXQgZG9lcyBub3Qgc3VwcG9ydCBjb2x1bW5hciBjb21wcmVzc2lvbi4gVXNlIG1vZGVybiBJUEMgZm9ybWF0ICh3cml0ZUxlZ2FjeUlwY0Zvcm1hdD1mYWxzZSkuIik7aWYoT2JqZWN0LnZhbHVlcyhHMCkuaW5jbHVkZXMoJC5jb21wcmVzc2lvblR5cGUpKXRoaXMuX2NvbXByZXNzaW9uPW5ldyBCWCgkLmNvbXByZXNzaW9uVHlwZSk7ZWxzZXtsZXQgWD1PYmplY3QudmFsdWVzKEcwKS5maWx0ZXIoKFEpPT50eXBlb2YgUT09PSJzdHJpbmciKTt0aHJvdyBFcnJvcihgVW5zdXBwb3J0ZWQgY29tcHJlc3Npb25UeXBlOiAkeyQuY29tcHJlc3Npb25UeXBlfSBBdmFpbGFibGUgdHlwZXM6ICR7WC5qb2luKCIsICIpfWApfX1lbHNlIHRoaXMuX2NvbXByZXNzaW9uPW51bGx9dG9TdHJpbmcoJD0hMSl7cmV0dXJuIHRoaXMuX3NpbmsudG9TdHJpbmcoJCl9dG9VaW50OEFycmF5KCQ9ITEpe3JldHVybiB0aGlzLl9zaW5rLnRvVWludDhBcnJheSgkKX13cml0ZUFsbCgkKXtpZihXJCgkKSlyZXR1cm4gJC50aGVuKChYKT0+dGhpcy53cml0ZUFsbChYKSk7ZWxzZSBpZihPJCgkKSlyZXR1cm4gaTIodGhpcywkKTtyZXR1cm4gcjIodGhpcywkKX1nZXQgY2xvc2VkKCl7cmV0dXJuIHRoaXMuX3NpbmsuY2xvc2VkfVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtyZXR1cm4gdGhpcy5fc2lua1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKX10b0RPTVN0cmVhbSgkKXtyZXR1cm4gdGhpcy5fc2luay50b0RPTVN0cmVhbSgkKX10b05vZGVTdHJlYW0oJCl7cmV0dXJuIHRoaXMuX3NpbmsudG9Ob2RlU3RyZWFtKCQpfWNsb3NlKCl7cmV0dXJuIHRoaXMucmVzZXQoKS5fc2luay5jbG9zZSgpfWFib3J0KCQpe3JldHVybiB0aGlzLnJlc2V0KCkuX3NpbmsuYWJvcnQoJCl9ZmluaXNoKCl7cmV0dXJuIHRoaXMuX2F1dG9EZXN0cm95P3RoaXMuY2xvc2UoKTp0aGlzLnJlc2V0KHRoaXMuX3NpbmssdGhpcy5fc2NoZW1hKSx0aGlzfXJlc2V0KCQ9dGhpcy5fc2luayxYPW51bGwpe2lmKCQ9PT10aGlzLl9zaW5rfHwkIGluc3RhbmNlb2YgbCQpdGhpcy5fc2luaz0kO2Vsc2UgaWYodGhpcy5fc2luaz1uZXcgbCQsJCYmV1coJCkpdGhpcy50b0RPTVN0cmVhbSh7dHlwZToiYnl0ZXMifSkucGlwZVRvKCQpO2Vsc2UgaWYoJCYmS1coJCkpdGhpcy50b05vZGVTdHJlYW0oe29iamVjdE1vZGU6ITF9KS5waXBlKCQpO2lmKHRoaXMuX3N0YXJ0ZWQmJnRoaXMuX3NjaGVtYSl0aGlzLl93cml0ZUZvb3Rlcih0aGlzLl9zY2hlbWEpO2lmKHRoaXMuX3N0YXJ0ZWQ9ITEsdGhpcy5fZGljdGlvbmFyeUJsb2Nrcz1bXSx0aGlzLl9yZWNvcmRCYXRjaEJsb2Nrcz1bXSx0aGlzLl9zZWVuRGljdGlvbmFyaWVzPW5ldyBNYXAsdGhpcy5fZGljdGlvbmFyeURlbHRhT2Zmc2V0cz1uZXcgTWFwLCFYfHwhYTYoWCx0aGlzLl9zY2hlbWEpKWlmKFg9PW51bGwpdGhpcy5fcG9zaXRpb249MCx0aGlzLl9zY2hlbWE9bnVsbDtlbHNlIHRoaXMuX3N0YXJ0ZWQ9ITAsdGhpcy5fc2NoZW1hPVgsdGhpcy5fd3JpdGVTY2hlbWEoWCk7cmV0dXJuIHRoaXN9d3JpdGUoJCl7bGV0IFg9bnVsbDtpZighdGhpcy5fc2luayl0aHJvdyBFcnJvcigiUmVjb3JkQmF0Y2hXcml0ZXIgaXMgY2xvc2VkIik7ZWxzZSBpZigkPT1udWxsKXJldHVybiB0aGlzLmZpbmlzaCgpJiZ2b2lkIDA7ZWxzZSBpZigkIGluc3RhbmNlb2YgTTgmJiEoWD0kLnNjaGVtYSkpcmV0dXJuIHRoaXMuZmluaXNoKCkmJnZvaWQgMDtlbHNlIGlmKCQgaW5zdGFuY2VvZiBnJiYhKFg9JC5zY2hlbWEpKXJldHVybiB0aGlzLmZpbmlzaCgpJiZ2b2lkIDA7aWYoWCYmIWE2KFgsdGhpcy5fc2NoZW1hKSl7aWYodGhpcy5fc3RhcnRlZCYmdGhpcy5fYXV0b0Rlc3Ryb3kpcmV0dXJuIHRoaXMuY2xvc2UoKTt0aGlzLnJlc2V0KHRoaXMuX3NpbmssWCl9aWYoJCBpbnN0YW5jZW9mIGcpe2lmKCEoJCBpbnN0YW5jZW9mIFhRKSl0aGlzLl93cml0ZVJlY29yZEJhdGNoKCQpfWVsc2UgaWYoJCBpbnN0YW5jZW9mIE04KXRoaXMud3JpdGVBbGwoJC5iYXRjaGVzKTtlbHNlIGlmKGckKCQpKXRoaXMud3JpdGVBbGwoJCl9X3dyaXRlTWVzc2FnZSgkLFg9OCl7bGV0IFE9WC0xLFo9YzguZW5jb2RlKCQpLEo9Wi5ieXRlTGVuZ3RoLFk9IXRoaXMuX3dyaXRlTGVnYWN5SXBjRm9ybWF0Pzg6NCxIPUorWStRJn5RLFc9SC1KLVk7aWYoJC5oZWFkZXJUeXBlPT09WDguUmVjb3JkQmF0Y2gpdGhpcy5fcmVjb3JkQmF0Y2hCbG9ja3MucHVzaChuZXcgdSQoSCwkLmJvZHlMZW5ndGgsdGhpcy5fcG9zaXRpb24pKTtlbHNlIGlmKCQuaGVhZGVyVHlwZT09PVg4LkRpY3Rpb25hcnlCYXRjaCl0aGlzLl9kaWN0aW9uYXJ5QmxvY2tzLnB1c2gobmV3IHUkKEgsJC5ib2R5TGVuZ3RoLHRoaXMuX3Bvc2l0aW9uKSk7aWYoIXRoaXMuX3dyaXRlTGVnYWN5SXBjRm9ybWF0KXRoaXMuX3dyaXRlKEludDMyQXJyYXkub2YoLTEpKTtpZih0aGlzLl93cml0ZShJbnQzMkFycmF5Lm9mKEgtWSkpLEo+MCl0aGlzLl93cml0ZShaKTtyZXR1cm4gdGhpcy5fd3JpdGVQYWRkaW5nKFcpfV93cml0ZSgkKXtpZih0aGlzLl9zdGFydGVkKXtsZXQgWD14KCQpO2lmKFgmJlguYnl0ZUxlbmd0aD4wKXRoaXMuX3Npbmsud3JpdGUoWCksdGhpcy5fcG9zaXRpb24rPVguYnl0ZUxlbmd0aH1yZXR1cm4gdGhpc31fd3JpdGVTY2hlbWEoJCl7cmV0dXJuIHRoaXMuX3dyaXRlTWVzc2FnZShjOC5mcm9tKCQpKX1fd3JpdGVGb290ZXIoJCl7cmV0dXJuIHRoaXMuX3dyaXRlTGVnYWN5SXBjRm9ybWF0P3RoaXMuX3dyaXRlKEludDMyQXJyYXkub2YoMCkpOnRoaXMuX3dyaXRlKEludDMyQXJyYXkub2YoLTEsMCkpfV93cml0ZU1hZ2ljKCl7cmV0dXJuIHRoaXMuX3dyaXRlKFFRKX1fd3JpdGVQYWRkaW5nKCQpe3JldHVybiAkPjA/dGhpcy5fd3JpdGUobmV3IFVpbnQ4QXJyYXkoJCkpOnRoaXN9X3dyaXRlUmVjb3JkQmF0Y2goJCl7bGV0e2J5dGVMZW5ndGg6WCxub2RlczpRLGJ1ZmZlclJlZ2lvbnM6WixidWZmZXJzOkosdmFyaWFkaWNCdWZmZXJDb3VudHM6WX09dGhpcy5fYXNzZW1ibGVSZWNvcmRCYXRjaCgkKSxIPW5ldyBpOCgkLm51bVJvd3MsUSxaLHRoaXMuX2NvbXByZXNzaW9uLFksJC5tZXRhZGF0YSksVz1jOC5mcm9tKEgsWCk7cmV0dXJuIHRoaXMuX3dyaXRlRGljdGlvbmFyaWVzKCQpLl93cml0ZU1lc3NhZ2UoVykuX3dyaXRlQm9keUJ1ZmZlcnMoSil9X2Fzc2VtYmxlUmVjb3JkQmF0Y2goJCl7bGV0e2J5dGVMZW5ndGg6WCxub2RlczpRLGJ1ZmZlclJlZ2lvbnM6WixidWZmZXJzOkosdmFyaWFkaWNCdWZmZXJDb3VudHM6WX09ajguYXNzZW1ibGUoJCk7aWYodGhpcy5fY29tcHJlc3Npb24hPW51bGwpKHtieXRlTGVuZ3RoOlgsYnVmZmVyUmVnaW9uczpaLGJ1ZmZlcnM6Sn09dGhpcy5fY29tcHJlc3NCb2R5QnVmZmVycyhKKSk7cmV0dXJue2J5dGVMZW5ndGg6WCxub2RlczpRLGJ1ZmZlclJlZ2lvbnM6WixidWZmZXJzOkosdmFyaWFkaWNCdWZmZXJDb3VudHM6WX19X2NvbXByZXNzQm9keUJ1ZmZlcnMoJCl7bGV0IFg9SzYuZ2V0KHRoaXMuX2NvbXByZXNzaW9uLnR5cGUpO2lmKCEoWD09PW51bGx8fFg9PT12b2lkIDA/dm9pZCAwOlguZW5jb2RlKXx8dHlwZW9mIFguZW5jb2RlIT09ImZ1bmN0aW9uIil0aHJvdyBFcnJvcihgQ29kZWMgZm9yIGNvbXByZXNzaW9uIHR5cGUgIiR7RzBbdGhpcy5fY29tcHJlc3Npb24udHlwZV19IiBoYXMgaW52YWxpZCBlbmNvZGUgbWV0aG9kYCk7bGV0IFE9MCxaPVtdLEo9W107Zm9yKGxldCBIIG9mICQpe2xldCBXPXgoSCk7aWYoVy5sZW5ndGg9PT0wKXtaLnB1c2gobmV3IFVpbnQ4QXJyYXkoMCksbmV3IFVpbnQ4QXJyYXkoMCkpLEoucHVzaChuZXcgaDgoUSwwKSk7Y29udGludWV9bGV0IFA9WC5lbmNvZGUoVyksRz1QLmxlbmd0aDxXLmxlbmd0aCxxPUc/UDpXLEw9Rz9xLmxlbmd0aDpRNCxOPW5ldyBQMChuZXcgVWludDhBcnJheShzUSkpO04ud3JpdGVJbnQ2NCgwLEJpZ0ludChMKSksWi5wdXNoKE4uYnl0ZXMoKSxuZXcgVWludDhBcnJheShxKSk7bGV0IFU9KFErNyYtOCktUTtRKz1VO2xldCBrPXNRK3EubGVuZ3RoO0oucHVzaChuZXcgaDgoUSxrKSksUSs9a31sZXQgWT0oUSs3Ji04KS1RO3JldHVybiBRKz1ZLHtieXRlTGVuZ3RoOlEsYnVmZmVyUmVnaW9uczpKLGJ1ZmZlcnM6Wn19X3dyaXRlRGljdGlvbmFyeUJhdGNoKCQsWCxRPSExKXtsZXR7Ynl0ZUxlbmd0aDpaLG5vZGVzOkosYnVmZmVyUmVnaW9uczpZLGJ1ZmZlcnM6SCx2YXJpYWRpY0J1ZmZlckNvdW50czpXfT10aGlzLl9hc3NlbWJsZVJlY29yZEJhdGNoKG5ldyBEKFskXSkpLFA9bmV3IGk4KCQubGVuZ3RoLEosWSx0aGlzLl9jb21wcmVzc2lvbixXKSxHPW5ldyBoMChQLFgsUSkscT1jOC5mcm9tKEcsWik7cmV0dXJuIHRoaXMuX3dyaXRlTWVzc2FnZShxKS5fd3JpdGVCb2R5QnVmZmVycyhIKX1fd3JpdGVCb2R5QnVmZmVycygkKXtsZXQgWD10aGlzLl9jb21wcmVzc2lvbiE9bnVsbD8yOjEsUT1BcnJheShYKTtmb3IobGV0IFo9MDtaPCQubGVuZ3RoO1orPVgpe2xldCBKPTA7Zm9yKGxldCBIPS0xOysrSDxYOylRW0hdPSRbWitIXSxKKz1RW0hdLmJ5dGVMZW5ndGg7aWYoSj09PTApY29udGludWU7Zm9yKGxldCBIIG9mIFEpdGhpcy5fd3JpdGUoSCk7bGV0IFk9KEorNyYtOCktSjtpZihZPjApdGhpcy5fd3JpdGVQYWRkaW5nKFkpfXJldHVybiB0aGlzfV93cml0ZURpY3Rpb25hcmllcygkKXt2YXIgWCxRO2ZvcihsZXRbWixKXW9mICQuZGljdGlvbmFyaWVzKXtsZXQgWT0oWD1KPT09bnVsbHx8Sj09PXZvaWQgMD92b2lkIDA6Si5kYXRhKSE9PW51bGwmJlghPT12b2lkIDA/WDpbXSxIPXRoaXMuX3NlZW5EaWN0aW9uYXJpZXMuZ2V0KFopLFc9KFE9dGhpcy5fZGljdGlvbmFyeURlbHRhT2Zmc2V0cy5nZXQoWikpIT09bnVsbCYmUSE9PXZvaWQgMD9ROjA7aWYoIUh8fEguZGF0YVswXSE9PVlbMF0pZm9yKGxldFtQLEddb2YgWS5lbnRyaWVzKCkpdGhpcy5fd3JpdGVEaWN0aW9uYXJ5QmF0Y2goRyxaLFA+MCk7ZWxzZSBpZihXPFkubGVuZ3RoKWZvcihsZXQgUCBvZiBZLnNsaWNlKFcpKXRoaXMuX3dyaXRlRGljdGlvbmFyeUJhdGNoKFAsWiwhMCk7dGhpcy5fc2VlbkRpY3Rpb25hcmllcy5zZXQoWixKKSx0aGlzLl9kaWN0aW9uYXJ5RGVsdGFPZmZzZXRzLnNldChaLFkubGVuZ3RoKX1yZXR1cm4gdGhpc319O1okPWNsYXNzIFokIGV4dGVuZHMgSTF7c3RhdGljIHdyaXRlQWxsKCQsWCl7bGV0IFE9bmV3IFokKFgpO2lmKFckKCQpKXJldHVybiAkLnRoZW4oKFopPT5RLndyaXRlQWxsKFopKTtlbHNlIGlmKE8kKCQpKXJldHVybiBpMihRLCQpO3JldHVybiByMihRLCQpfX07XzE9Y2xhc3MgXzEgZXh0ZW5kcyBJMXtzdGF0aWMgd3JpdGVBbGwoJCxYKXtsZXQgUT1uZXcgXzEoWCk7aWYoVyQoJCkpcmV0dXJuICQudGhlbigoWik9PlEud3JpdGVBbGwoWikpO2Vsc2UgaWYoTyQoJCkpcmV0dXJuIGkyKFEsJCk7cmV0dXJuIHIyKFEsJCl9Y29uc3RydWN0b3IoJCl7c3VwZXIoJCk7dGhpcy5fYXV0b0Rlc3Ryb3k9ITAsdGhpcy5fd3JpdGVMZWdhY3lJcGNGb3JtYXQ9ITF9X3dyaXRlU2NoZW1hKCQpe3JldHVybiB0aGlzLl93cml0ZU1hZ2ljKCkuX3dyaXRlUGFkZGluZygyKX1fd3JpdGVEaWN0aW9uYXJ5QmF0Y2goJCxYLFE9ITEpe2lmKCFRJiZ0aGlzLl9zZWVuRGljdGlvbmFyaWVzLmhhcyhYKSl0aHJvdyBFcnJvcigiVGhlIEFycm93IEZpbGUgZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgcmVwbGFjZW1lbnQgZGljdGlvbmFyaWVzLiAiKTtyZXR1cm4gc3VwZXIuX3dyaXRlRGljdGlvbmFyeUJhdGNoKCQsWCxRKX1fd3JpdGVGb290ZXIoJCl7bGV0IFg9JDYuZW5jb2RlKG5ldyAkNigkLHE4LlY1LHRoaXMuX3JlY29yZEJhdGNoQmxvY2tzLHRoaXMuX2RpY3Rpb25hcnlCbG9ja3MpKTtyZXR1cm4gc3VwZXIuX3dyaXRlRm9vdGVyKCQpLl93cml0ZShYKS5fd3JpdGUoSW50MzJBcnJheS5vZihYLmJ5dGVMZW5ndGgpKS5fd3JpdGVNYWdpYygpfX07JFo9Y2xhc3MgJFogZXh0ZW5kcyBJMXtzdGF0aWMgd3JpdGVBbGwoJCl7cmV0dXJuIG5ldyAkWigpLndyaXRlQWxsKCQpfWNvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9hdXRvRGVzdHJveT0hMCx0aGlzLl9yZWNvcmRCYXRjaGVzPVtdLHRoaXMuX3JlY29yZEJhdGNoZXNXaXRoRGljdGlvbmFyaWVzPVtdfV93cml0ZU1lc3NhZ2UoKXtyZXR1cm4gdGhpc31fd3JpdGVGb290ZXIoJCl7cmV0dXJuIHRoaXN9X3dyaXRlU2NoZW1hKCQpe3JldHVybiB0aGlzLl93cml0ZShgewogICJzY2hlbWEiOiAke0pTT04uc3RyaW5naWZ5KHtmaWVsZHM6JC5maWVsZHMubWFwKChYKT0+dDUoWCkpfSxudWxsLDIpfWApfV93cml0ZURpY3Rpb25hcmllcygkKXtpZigkLmRpY3Rpb25hcmllcy5zaXplPjApdGhpcy5fcmVjb3JkQmF0Y2hlc1dpdGhEaWN0aW9uYXJpZXMucHVzaCgkKTtyZXR1cm4gdGhpc31fd3JpdGVEaWN0aW9uYXJ5QmF0Y2goJCxYLFE9ITEpe3JldHVybiB0aGlzLl93cml0ZSh0aGlzLl9kaWN0aW9uYXJ5QmxvY2tzLmxlbmd0aD09PTA/IiAgICAiOmAsCiAgICBgKSx0aGlzLl93cml0ZSh1RygkLFgsUSkpLHRoaXMuX2RpY3Rpb25hcnlCbG9ja3MucHVzaChuZXcgdSQoMCwwLDApKSx0aGlzfV93cml0ZVJlY29yZEJhdGNoKCQpe3JldHVybiB0aGlzLl93cml0ZURpY3Rpb25hcmllcygkKSx0aGlzLl9yZWNvcmRCYXRjaGVzLnB1c2goJCksdGhpc31jbG9zZSgpe2lmKHRoaXMuX3JlY29yZEJhdGNoZXNXaXRoRGljdGlvbmFyaWVzLmxlbmd0aD4wKXt0aGlzLl93cml0ZShgLAogICJkaWN0aW9uYXJpZXMiOiBbCmApO2ZvcihsZXQgJCBvZiB0aGlzLl9yZWNvcmRCYXRjaGVzV2l0aERpY3Rpb25hcmllcylzdXBlci5fd3JpdGVEaWN0aW9uYXJpZXMoJCk7dGhpcy5fd3JpdGUoYAogIF1gKX1pZih0aGlzLl9yZWNvcmRCYXRjaGVzLmxlbmd0aD4wKXtmb3IobGV0ICQ9LTEsWD10aGlzLl9yZWNvcmRCYXRjaGVzLmxlbmd0aDsrKyQ8WDspdGhpcy5fd3JpdGUoJD09PTA/YCwKICAiYmF0Y2hlcyI6IFsKICAgIGA6YCwKICAgIGApLHRoaXMuX3dyaXRlKGRHKHRoaXMuX3JlY29yZEJhdGNoZXNbJF0pKSx0aGlzLl9yZWNvcmRCYXRjaEJsb2Nrcy5wdXNoKG5ldyB1JCgwLDAsMCkpO3RoaXMuX3dyaXRlKGAKICBdYCl9aWYodGhpcy5fc2NoZW1hKXRoaXMuX3dyaXRlKGAKfWApO3JldHVybiB0aGlzLl9yZWNvcmRCYXRjaGVzV2l0aERpY3Rpb25hcmllcz1bXSx0aGlzLl9yZWNvcmRCYXRjaGVzPVtdLHN1cGVyLmNsb3NlKCl9fX0pO2Z1bmN0aW9uIGU1KCQsWCl7aWYoTyQoJCkpcmV0dXJuIG5HKCQsWCk7aWYoZyQoJCkpcmV0dXJuIGxHKCQsWCk7dGhyb3cgRXJyb3IoInRvRE9NU3RyZWFtKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBJdGVyYWJsZSBvciBBc3luY0l0ZXJhYmxlIil9ZnVuY3Rpb24gbEcoJCxYKXtsZXQgUT1udWxsLFo9KFg9PT1udWxsfHxYPT09dm9pZCAwP3ZvaWQgMDpYLnR5cGUpPT09ImJ5dGVzInx8ITEsSj0oWD09PW51bGx8fFg9PT12b2lkIDA/dm9pZCAwOlguaGlnaFdhdGVyTWFyayl8fE1hdGgucG93KDIsMjQpO3JldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LFgpLHtzdGFydChIKXtZKEgsUXx8KFE9JFtTeW1ib2wuaXRlcmF0b3JdKCkpKX0scHVsbChIKXtRP1koSCxRKTpILmNsb3NlKCl9LGNhbmNlbCgpeyhRPT09bnVsbHx8UT09PXZvaWQgMD92b2lkIDA6US5yZXR1cm4pJiZRLnJldHVybigpLFE9bnVsbH19KSxPYmplY3QuYXNzaWduKHtoaWdoV2F0ZXJNYXJrOlo/Sjp2b2lkIDB9LFgpKTtmdW5jdGlvbiBZKEgsVyl7bGV0IFAsRz1udWxsLHE9SC5kZXNpcmVkU2l6ZXx8bnVsbDt3aGlsZSghKEc9Vy5uZXh0KFo/cTpudWxsKSkuZG9uZSl7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KEcudmFsdWUpJiYoUD14KEcudmFsdWUpKSlxIT1udWxsJiZaJiYocT1xLVAuYnl0ZUxlbmd0aCsxKSxHLnZhbHVlPVA7aWYoSC5lbnF1ZXVlKEcudmFsdWUpLHEhPW51bGwmJi0tcTw9MClyZXR1cm59SC5jbG9zZSgpfX1mdW5jdGlvbiBuRygkLFgpe2xldCBRPW51bGwsWj0oWD09PW51bGx8fFg9PT12b2lkIDA/dm9pZCAwOlgudHlwZSk9PT0iYnl0ZXMifHwhMSxKPShYPT09bnVsbHx8WD09PXZvaWQgMD92b2lkIDA6WC5oaWdoV2F0ZXJNYXJrKXx8TWF0aC5wb3coMiwyNCk7cmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sWCkse3N0YXJ0KEgpe3JldHVybiBWKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXt5aWVsZCBZKEgsUXx8KFE9JFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSkpfSl9LHB1bGwoSCl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe1E/eWllbGQgWShILFEpOkguY2xvc2UoKX0pfSxjYW5jZWwoKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7KFE9PT1udWxsfHxRPT09dm9pZCAwP3ZvaWQgMDpRLnJldHVybikmJih5aWVsZCBRLnJldHVybigpKSxRPW51bGx9KX19KSxPYmplY3QuYXNzaWduKHtoaWdoV2F0ZXJNYXJrOlo/Sjp2b2lkIDB9LFgpKTtmdW5jdGlvbiBZKEgsVyl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2xldCBQLEc9bnVsbCxxPUguZGVzaXJlZFNpemV8fG51bGw7d2hpbGUoIShHPXlpZWxkIFcubmV4dChaP3E6bnVsbCkpLmRvbmUpe2lmKEFycmF5QnVmZmVyLmlzVmlldyhHLnZhbHVlKSYmKFA9eChHLnZhbHVlKSkpcSE9bnVsbCYmWiYmKHE9cS1QLmJ5dGVMZW5ndGgrMSksRy52YWx1ZT1QO2lmKEguZW5xdWV1ZShHLnZhbHVlKSxxIT1udWxsJiYtLXE8PTApcmV0dXJufUguY2xvc2UoKX0pfX12YXIgJEs9QSgoKT0+e2QwKCk7bzgoKX0pO2Z1bmN0aW9uIFpLKCQpe3JldHVybiBuZXcgSksoJCl9Y2xhc3MgSkt7Y29uc3RydWN0b3IoJCl7dGhpcy5fbnVtQ2h1bmtzPTAsdGhpcy5fZmluaXNoZWQ9ITEsdGhpcy5fYnVmZmVyZWRTaXplPTA7bGV0e1sicmVhZGFibGVTdHJhdGVneSJdOlgsWyJ3cml0YWJsZVN0cmF0ZWd5Il06USxbInF1ZXVlaW5nU3RyYXRlZ3kiXTpaPSJjb3VudCJ9PSQsSj1KVygkLFsicmVhZGFibGVTdHJhdGVneSIsIndyaXRhYmxlU3RyYXRlZ3kiLCJxdWV1ZWluZ1N0cmF0ZWd5Il0pO3RoaXMuX2NvbnRyb2xsZXI9bnVsbCx0aGlzLl9idWlsZGVyPW8kKEopLHRoaXMuX2dldFNpemU9WiE9PSJieXRlcyI/WEs6UUs7bGV0e1siaGlnaFdhdGVyTWFyayJdOlk9Wj09PSJieXRlcyI/TWF0aC5wb3coMiwxNCk6MTAwMH09T2JqZWN0LmFzc2lnbih7fSxYKSx7WyJoaWdoV2F0ZXJNYXJrIl06SD1aPT09ImJ5dGVzIj9NYXRoLnBvdygyLDE0KToxMDAwfT1PYmplY3QuYXNzaWduKHt9LFEpO3RoaXMucmVhZGFibGU9bmV3IFJlYWRhYmxlU3RyZWFtKHtbImNhbmNlbCJdOigpPT57dGhpcy5fYnVpbGRlci5jbGVhcigpfSxbInB1bGwiXTooVyk9Pnt0aGlzLl9tYXliZUZsdXNoKHRoaXMuX2J1aWxkZXIsdGhpcy5fY29udHJvbGxlcj1XKX0sWyJzdGFydCJdOihXKT0+e3RoaXMuX21heWJlRmx1c2godGhpcy5fYnVpbGRlcix0aGlzLl9jb250cm9sbGVyPVcpfX0se2hpZ2hXYXRlck1hcms6WSxzaXplOlohPT0iYnl0ZXMiP1hLOlFLfSksdGhpcy53cml0YWJsZT1uZXcgV3JpdGFibGVTdHJlYW0oe1siYWJvcnQiXTooKT0+e3RoaXMuX2J1aWxkZXIuY2xlYXIoKX0sWyJ3cml0ZSJdOigpPT57dGhpcy5fbWF5YmVGbHVzaCh0aGlzLl9idWlsZGVyLHRoaXMuX2NvbnRyb2xsZXIpfSxbImNsb3NlIl06KCk9Pnt0aGlzLl9tYXliZUZsdXNoKHRoaXMuX2J1aWxkZXIuZmluaXNoKCksdGhpcy5fY29udHJvbGxlcil9fSx7aGlnaFdhdGVyTWFyazpILHNpemU6KFcpPT50aGlzLl93cml0ZVZhbHVlQW5kUmV0dXJuQ2h1bmtTaXplKFcpfSl9X3dyaXRlVmFsdWVBbmRSZXR1cm5DaHVua1NpemUoJCl7bGV0IFg9dGhpcy5fYnVmZmVyZWRTaXplO3JldHVybiB0aGlzLl9idWZmZXJlZFNpemU9dGhpcy5fZ2V0U2l6ZSh0aGlzLl9idWlsZGVyLmFwcGVuZCgkKSksdGhpcy5fYnVmZmVyZWRTaXplLVh9X21heWJlRmx1c2goJCxYKXtpZihYPT1udWxsKXJldHVybjtpZih0aGlzLl9idWZmZXJlZFNpemU+PVguZGVzaXJlZFNpemUpKyt0aGlzLl9udW1DaHVua3MmJnRoaXMuX2VucXVldWUoWCwkLnRvVmVjdG9yKCkpO2lmKCQuZmluaXNoZWQpe2lmKCQubGVuZ3RoPjB8fHRoaXMuX251bUNodW5rcz09PTApKyt0aGlzLl9udW1DaHVua3MmJnRoaXMuX2VucXVldWUoWCwkLnRvVmVjdG9yKCkpO2lmKCF0aGlzLl9maW5pc2hlZCYmKHRoaXMuX2ZpbmlzaGVkPSEwKSl0aGlzLl9lbnF1ZXVlKFgsbnVsbCl9fV9lbnF1ZXVlKCQsWCl7dGhpcy5fYnVmZmVyZWRTaXplPTAsdGhpcy5fY29udHJvbGxlcj1udWxsLFg9PW51bGw/JC5jbG9zZSgpOiQuZW5xdWV1ZShYKX19dmFyIFhLPSgkKT0+e3ZhciBYO3JldHVybihYPSQ9PT1udWxsfHwkPT09dm9pZCAwP3ZvaWQgMDokLmxlbmd0aCkhPT1udWxsJiZYIT09dm9pZCAwP1g6MH0sUUs9KCQpPT57dmFyIFg7cmV0dXJuKFg9JD09PW51bGx8fCQ9PT12b2lkIDA/dm9pZCAwOiQuYnl0ZUxlbmd0aCkhPT1udWxsJiZYIT09dm9pZCAwP1g6MH07dmFyIFlLPUEoKCk9PntkMCgpO3ZYKCl9KTtmdW5jdGlvbiBZNCgkLFgpe2xldCBRPW5ldyBsJCxaPW51bGwsSj1uZXcgUmVhZGFibGVTdHJlYW0oe2NhbmNlbCgpe3JldHVybiBWKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXt5aWVsZCBRLmNsb3NlKCl9KX0sc3RhcnQoVyl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3lpZWxkIEgoVyxafHwoWj15aWVsZCBZKCkpKX0pfSxwdWxsKFcpe3JldHVybiBWKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtaP3lpZWxkIEgoVyxaKTpXLmNsb3NlKCl9KX19KTtyZXR1cm57d3JpdGFibGU6bmV3IFdyaXRhYmxlU3RyZWFtKFEsT2JqZWN0LmFzc2lnbih7aGlnaFdhdGVyTWFyazpNYXRoLnBvdygyLDE0KX0sJCkpLHJlYWRhYmxlOkp9O2Z1bmN0aW9uIFkoKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkKHlpZWxkIEE4LmZyb20oUSkpLm9wZW4oWCl9KX1mdW5jdGlvbiBIKFcsUCl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2xldCBHPVcuZGVzaXJlZFNpemUscT1udWxsO3doaWxlKCEocT15aWVsZCBQLm5leHQoKSkuZG9uZSlpZihXLmVucXVldWUocS52YWx1ZSksRyE9bnVsbCYmLS1HPD0wKXJldHVybjtXLmNsb3NlKCl9KX19dmFyIEhLPUEoKCk9PntkMCgpO1o2KCk7dFEoKX0pO2Z1bmN0aW9uIEg0KCQsWCl7bGV0IFE9bmV3IHRoaXMoJCksWj1uZXcgWCQoUSksSj1uZXcgUmVhZGFibGVTdHJlYW0oe2NhbmNlbCgpe3JldHVybiBWKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXt5aWVsZCBaLmNhbmNlbCgpfSl9LHB1bGwoSCl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3lpZWxkIFkoSCl9KX0sc3RhcnQoSCl7cmV0dXJuIFYodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3lpZWxkIFkoSCl9KX19LE9iamVjdC5hc3NpZ24oe2hpZ2hXYXRlck1hcms6TWF0aC5wb3coMiwxNCl9LFgpKTtyZXR1cm57d3JpdGFibGU6bmV3IFdyaXRhYmxlU3RyZWFtKFEsJCkscmVhZGFibGU6Sn07ZnVuY3Rpb24gWShIKXtyZXR1cm4gVih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7bGV0IFc9bnVsbCxQPUguZGVzaXJlZFNpemU7d2hpbGUoVz15aWVsZCBaLnJlYWQoUHx8bnVsbCkpaWYoSC5lbnF1ZXVlKFcpLFAhPW51bGwmJihQLT1XLmJ5dGVMZW5ndGgpPD0wKXJldHVybjtILmNsb3NlKCl9KX19dmFyIFdLPUEoKCk9PntkMCgpO1o2KCl9KTtmdW5jdGlvbiBXNCgkKXtsZXQgWD1BOC5mcm9tKCQpO2lmKFckKFgpKXJldHVybiBYLnRoZW4oKFEpPT5XNChRKSk7aWYoWC5pc0FzeW5jKCkpcmV0dXJuIFgucmVhZEFsbCgpLnRoZW4oKFEpPT5uZXcgTTgoUSkpO3JldHVybiBuZXcgTTgoWC5yZWFkQWxsKCkpfWZ1bmN0aW9uIGEyKCQsWD0ic3RyZWFtIixRPW51bGwpe2xldCBaPXtjb21wcmVzc2lvblR5cGU6UX07cmV0dXJuKFg9PT0ic3RyZWFtIj9aJDpfMSkud3JpdGVBbGwoJCxaKS50b1VpbnQ4QXJyYXkoITApfXZhciBLSz1BKCgpPT57dDYoKTt0USgpO0o0KCl9KTt2YXIgdDI9e307QyQodDIse2lzQXJyb3dWZWN0b3I6KCk9Pno0LGlzQXJyb3dUYWJsZTooKT0+TTQsaXNBcnJvd1NjaGVtYTooKT0+SzQsaXNBcnJvd1JlY29yZEJhdGNoOigpPT5FNCxpc0Fycm93RmllbGQ6KCk9PlA0LGlzQXJyb3dEYXRhVHlwZTooKT0+RzQsaXNBcnJvd0RhdGE6KCk9PnE0fSk7ZnVuY3Rpb24gSzQoJCl7cmV0dXJuIEIuaXNTY2hlbWEoJCl9ZnVuY3Rpb24gUDQoJCl7cmV0dXJuIHcuaXNGaWVsZCgkKX1mdW5jdGlvbiBHNCgkKXtyZXR1cm4gUi5pc0RhdGFUeXBlKCQpfWZ1bmN0aW9uIHE0KCQpe3JldHVybiBuLmlzRGF0YSgkKX1mdW5jdGlvbiB6NCgkKXtyZXR1cm4gRC5pc1ZlY3RvcigkKX1mdW5jdGlvbiBFNCgkKXtyZXR1cm4gZy5pc1JlY29yZEJhdGNoKCQpfWZ1bmN0aW9uIE00KCQpe3JldHVybiBNOC5pc1RhYmxlKCQpfXZhciBlMj1BKCgpPT57djAoKTtOOCgpO18kKCk7UzAoKTtWMSgpO3Q2KCl9KTt2YXIgUEs7dmFyICRIPUEoKCk9PntkWigpO3FYKCk7VjgoKTtfJCgpO044KCk7dDYoKTtTMCgpO2UwKCk7djAoKTtnUSgpO2tKKCk7azgoKTt2WCgpO3oyKCk7ajIoKTtFMigpO00yKCk7TDIoKTtOMigpO0EyKCk7QzIoKTt3MigpO0QyKCk7VTIoKTtSMigpO0IyKCk7XzIoKTtJMigpO2RKKCk7bkooKTtsSigpO08yKCk7RjIoKTtrMigpO1MyKCk7VjIoKTtaNigpO3RRKCk7SjQoKTtLSygpO1g0KCk7JDQoKTtYNigpO1YxKCk7ZTIoKTtsWigpO0oyKCk7dzYoKTt4USgpO284KCk7algoKTtlMigpO25RKCk7UEs9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxoWSksWjIpLHNZKSx5WSksWVkpLG9ZKSxUWSksUDIpLHQyKSx7Y29tcGFyZVNjaGVtYXM6YTYsY29tcGFyZUZpZWxkczpENSxjb21wYXJlVHlwZXM6ckp9KX0pO3ZhciBHSz17fTtDJChHSyx7dmVjdG9yRnJvbUFycmF5OigpPT5hOCx1dGlsOigpPT5QSyx0YWJsZVRvSVBDOigpPT5hMix0YWJsZUZyb21KU09OOigpPT5nMix0YWJsZUZyb21JUEM6KCk9Plc0LHRhYmxlRnJvbUFycmF5czooKT0+eTIscmVjb3JkQmF0Y2hGcm9tQXJyYXlzOigpPT5tMixtYWtlVmVjdG9yOigpPT5xMSxtYWtlVGFibGU6KCk9PmgyLG1ha2VEYXRhOigpPT5DLG1ha2VCdWlsZGVyOigpPT5vJCxpc0Fycm93VmVjdG9yOigpPT56NCxpc0Fycm93VGFibGU6KCk9Pk00LGlzQXJyb3dTY2hlbWE6KCk9Pks0LGlzQXJyb3dSZWNvcmRCYXRjaDooKT0+RTQsaXNBcnJvd0ZpZWxkOigpPT5QNCxpc0Fycm93RGF0YVR5cGU6KCk9Pkc0LGlzQXJyb3dEYXRhOigpPT5xNCxjb21wcmVzc2lvblJlZ2lzdHJ5OigpPT5LNixidWlsZGVyVGhyb3VnaEl0ZXJhYmxlOigpPT5hSixidWlsZGVyVGhyb3VnaEFzeW5jSXRlcmFibGU6KCk9PnYyLFZpc2l0b3I6KCk9PlQsVmVjdG9yOigpPT5ELFV0ZjhWaWV3QnVpbGRlcjooKT0+JFEsVXRmOFZpZXc6KCk9PnMwLFV0ZjhCdWlsZGVyOigpPT5yNixVdGY4OigpPT5fOCxVbmlvbk1vZGU6KCk9PiQ4LFVuaW9uQnVpbGRlcjooKT0+SDYsVW5pb246KCk9PmkwLFVpbnQ4QnVpbGRlcjooKT0+ZFgsVWludDg6KCk9PlcxLFVpbnQ2NEJ1aWxkZXI6KCk9Pm9YLFVpbnQ2NDooKT0+RSQsVWludDMyQnVpbGRlcjooKT0+blgsVWludDMyOigpPT5QMSxVaW50MTZCdWlsZGVyOigpPT5sWCxVaW50MTY6KCk9PksxLFR5cGU6KCk9PkUsVGltZXN0YW1wU2Vjb25kQnVpbGRlcjooKT0+cDYsVGltZXN0YW1wU2Vjb25kOigpPT5pWixUaW1lc3RhbXBOYW5vc2Vjb25kQnVpbGRlcjooKT0+ZDYsVGltZXN0YW1wTmFub3NlY29uZDooKT0+dFosVGltZXN0YW1wTWlsbGlzZWNvbmRCdWlsZGVyOigpPT5jNixUaW1lc3RhbXBNaWxsaXNlY29uZDooKT0+TlgsVGltZXN0YW1wTWljcm9zZWNvbmRCdWlsZGVyOigpPT51NixUaW1lc3RhbXBNaWNyb3NlY29uZDooKT0+YVosVGltZXN0YW1wQnVpbGRlcjooKT0+ciQsVGltZXN0YW1wOigpPT5RMCxUaW1lVW5pdDooKT0+TyxUaW1lU2Vjb25kQnVpbGRlcjooKT0+bDYsVGltZVNlY29uZDooKT0+b1osVGltZU5hbm9zZWNvbmRCdWlsZGVyOigpPT5zNixUaW1lTmFub3NlY29uZDooKT0+closVGltZU1pbGxpc2Vjb25kQnVpbGRlcjooKT0+bjYsVGltZU1pbGxpc2Vjb25kOigpPT5zWixUaW1lTWljcm9zZWNvbmRCdWlsZGVyOigpPT5vNixUaW1lTWljcm9zZWNvbmQ6KCk9PklRLFRpbWVCdWlsZGVyOigpPT5pJCxUaW1lOigpPT5rMCxUYWJsZTooKT0+TTgsU3RydWN0Um93OigpPT5PMSxTdHJ1Y3RCdWlsZGVyOigpPT5hWCxTdHJ1Y3Q6KCk9PmwsU3BhcnNlVW5pb25CdWlsZGVyOigpPT50WCxTcGFyc2VVbmlvbjooKT0+UjEsU2NoZW1hOigpPT5CLFJlY29yZEJhdGNoV3JpdGVyOigpPT5JMSxSZWNvcmRCYXRjaFN0cmVhbVdyaXRlcjooKT0+WiQsUmVjb3JkQmF0Y2hTdHJlYW1SZWFkZXI6KCk9PkwxLFJlY29yZEJhdGNoUmVhZGVyOigpPT5BOCxSZWNvcmRCYXRjaEpTT05Xcml0ZXI6KCk9PiRaLFJlY29yZEJhdGNoRmlsZVdyaXRlcjooKT0+XzEsUmVjb3JkQmF0Y2hGaWxlUmVhZGVyOigpPT5HNixSZWNvcmRCYXRjaDooKT0+ZyxQcmVjaXNpb246KCk9Pno4LE51bGxCdWlsZGVyOigpPT5pWCxOdWxsOigpPT5POCxNZXRhZGF0YVZlcnNpb246KCk9PnE4LE1lc3NhZ2VSZWFkZXI6KCk9PmU2LE1lc3NhZ2VIZWFkZXI6KCk9Plg4LE1lc3NhZ2U6KCk9PmM4LE1hcF86KCk9PmcwLE1hcFJvdzooKT0+YyQsTWFwQnVpbGRlcjooKT0+clgsTGlzdEJ1aWxkZXI6KCk9PnNYLExpc3Q6KCk9PkUwLExhcmdlVXRmOEJ1aWxkZXI6KCk9Pmk2LExhcmdlVXRmODooKT0+YiQsTGFyZ2VCaW5hcnlCdWlsZGVyOigpPT5ZNixMYXJnZUJpbmFyeTooKT0+ZiQsSlNPTk1lc3NhZ2VSZWFkZXI6KCk9PkpRLEludGVydmFsWWVhck1vbnRoQnVpbGRlcjooKT0+djYsSW50ZXJ2YWxZZWFyTW9udGg6KCk9PiRKLEludGVydmFsVW5pdDooKT0+ZSxJbnRlcnZhbE1vbnRoRGF5TmFub0J1aWxkZXI6KCk9Pmg2LEludGVydmFsTW9udGhEYXlOYW5vOigpPT5YSixJbnRlcnZhbERheVRpbWVCdWlsZGVyOigpPT5nNixJbnRlcnZhbERheVRpbWU6KCk9PmVaLEludGVydmFsQnVpbGRlcjooKT0+RTEsSW50ZXJ2YWw6KCk9PngwLEludEJ1aWxkZXI6KCk9PlEkLEludDhCdWlsZGVyOigpPT5iWCxJbnQ4OigpPT5ZMSxJbnQ2NEJ1aWxkZXI6KCk9PnVYLEludDY0OigpPT5iOCxJbnQzMkJ1aWxkZXI6KCk9PmNYLEludDMyOigpPT5aMCxJbnQxNkJ1aWxkZXI6KCk9PnBYLEludDE2OigpPT5IMSxJbnQ6KCk9PmY4LEZsb2F0QnVpbGRlcjooKT0+UzEsRmxvYXQ2NEJ1aWxkZXI6KCk9PmZYLEZsb2F0NjQ6KCk9PnQwLEZsb2F0MzJCdWlsZGVyOigpPT5tWCxGbG9hdDMyOigpPT5HMSxGbG9hdDE2QnVpbGRlcjooKT0+eVgsRmxvYXQxNjooKT0+TzYsRmxvYXQ6KCk9PkckLEZpeGVkU2l6ZUxpc3RCdWlsZGVyOigpPT5oWCxGaXhlZFNpemVMaXN0OigpPT5hMCxGaXhlZFNpemVCaW5hcnlCdWlsZGVyOigpPT54NixGaXhlZFNpemVCaW5hcnk6KCk9PnokLEZpZWxkOigpPT53LER1cmF0aW9uU2Vjb25kQnVpbGRlcjooKT0+eTYsRHVyYXRpb25TZWNvbmQ6KCk9PlFKLER1cmF0aW9uTmFub3NlY29uZEJ1aWxkZXI6KCk9PmI2LER1cmF0aW9uTmFub3NlY29uZDooKT0+SkosRHVyYXRpb25NaWxsaXNlY29uZEJ1aWxkZXI6KCk9Pm02LER1cmF0aW9uTWlsbGlzZWNvbmQ6KCk9PlpKLER1cmF0aW9uTWljcm9zZWNvbmRCdWlsZGVyOigpPT5mNixEdXJhdGlvbk1pY3Jvc2Vjb25kOigpPT5fUSxEdXJhdGlvbkJ1aWxkZXI6KCk9PnMkLER1cmF0aW9uOigpPT5qMCxEaWN0aW9uYXJ5QnVpbGRlcjooKT0+Z1gsRGljdGlvbmFyeTooKT0+czgsRGVuc2VVbmlvbkJ1aWxkZXI6KCk9PmVYLERlbnNlVW5pb246KCk9PkZYLERlY2ltYWxCdWlsZGVyOigpPT5UNixEZWNpbWFsOigpPT5xJCxEYXRlXzooKT0+cjAsRGF0ZVVuaXQ6KCk9Pko4LERhdGVNaWxsaXNlY29uZEJ1aWxkZXI6KCk9Pl82LERhdGVNaWxsaXNlY29uZDooKT0+blosRGF0ZURheUJ1aWxkZXI6KCk9Pkk2LERhdGVEYXk6KCk9PkJRLERhdGVCdWlsZGVyOigpPT5qMSxEYXRhVHlwZTooKT0+UixEYXRhOigpPT5uLENvbXByZXNzaW9uVHlwZTooKT0+RzAsQnl0ZVN0cmVhbTooKT0+biQsQnVpbGRlcjooKT0+UjgsQnVmZmVyVHlwZTooKT0+ejAsQm9vbEJ1aWxkZXI6KCk9PnhYLEJvb2w6KCk9PlM4LEJpbmFyeVZpZXdCdWlsZGVyOigpPT5XNixCaW5hcnlWaWV3OigpPT5hLEJpbmFyeUJ1aWxkZXI6KCk9Pko2LEJpbmFyeTooKT0+VDAsQXN5bmNSZWNvcmRCYXRjaFN0cmVhbVJlYWRlcjooKT0+UDYsQXN5bmNSZWNvcmRCYXRjaEZpbGVSZWFkZXI6KCk9PmFRLEFzeW5jTWVzc2FnZVJlYWRlcjooKT0+WlEsQXN5bmNCeXRlU3RyZWFtOigpPT5YJCxBc3luY0J5dGVRdWV1ZTooKT0+bCR9KTt2YXIgTDA9QSgoKT0+e0NRKCk7azgoKTt0USgpO0o0KCk7JEsoKTtZSygpO0hLKCk7V0soKTskSCgpOyRIKCk7SzAudG9ET01TdHJlYW09ZTU7UjgudGhyb3VnaERPTT1aSztBOC50aHJvdWdoRE9NPVk0O0c2LnRocm91Z2hET009WTQ7TDEudGhyb3VnaERPTT1ZNDtJMS50aHJvdWdoRE9NPUg0O18xLnRocm91Z2hET009SDQ7WiQudGhyb3VnaERPTT1INH0pO2Z1bmN0aW9uIEpQKCQsWCl7dmFyIFE9W10sWj0rIVgsSj0wLFk9MDtmb3IoOyQubGVuZ3RoOyl7dmFyIEg9SjkoJCxafHxYKTtpZih0eXBlb2YgSD09Im9iamVjdCIpe2lmKFope2lmKFg9bnVsbCxILncubGVuZ3RoPT1ILnUpUS5wdXNoKFg9SC53KSxZKz1ILnV9ZWxzZSBRLnB1c2goWCksSC5lPTA7Zm9yKDshSC5sOyl7dmFyIFc9ejkoJCxILFgpO2lmKCFXKWQ4KDUpO2lmKFgpSC5lPUgueTtlbHNlIFEucHVzaChXKSxZKz1XLmxlbmd0aCxYOShILncsMCxXLmxlbmd0aCksSC53LnNldChXLEgudy5sZW5ndGgtVy5sZW5ndGgpfUo9SC5iK0guYyo0fWVsc2UgSj1IOyQ9JC5zdWJhcnJheShKKX1yZXR1cm4gRTkoUSxZKX12YXIgZXEsbTgsZDQsJDksbDQsdUg9ZnVuY3Rpb24oJCxYLFEpe2lmKG04LnByb3RvdHlwZS5zbGljZSlyZXR1cm4gbTgucHJvdG90eXBlLnNsaWNlLmNhbGwoJCxYLFEpO2lmKFg9PW51bGx8fFg8MClYPTA7aWYoUT09bnVsbHx8UT4kLmxlbmd0aClRPSQubGVuZ3RoO3ZhciBaPW5ldyBtOChRLVgpO3JldHVybiBaLnNldCgkLnN1YmFycmF5KFgsUSkpLFp9LERaPWZ1bmN0aW9uKCQsWCxRLFope2lmKG04LnByb3RvdHlwZS5maWxsKXJldHVybiBtOC5wcm90b3R5cGUuZmlsbC5jYWxsKCQsWCxRLFopO2lmKFE9PW51bGx8fFE8MClRPTA7aWYoWj09bnVsbHx8Wj4kLmxlbmd0aClaPSQubGVuZ3RoO2Zvcig7UTxaOysrUSkkW1FdPVg7cmV0dXJuICR9LFg5PWZ1bmN0aW9uKCQsWCxRLFope2lmKG04LnByb3RvdHlwZS5jb3B5V2l0aGluKXJldHVybiBtOC5wcm90b3R5cGUuY29weVdpdGhpbi5jYWxsKCQsWCxRLFopO2lmKFE9PW51bGx8fFE8MClRPTA7aWYoWj09bnVsbHx8Wj4kLmxlbmd0aClaPSQubGVuZ3RoO3doaWxlKFE8WikkW1grK109JFtRKytdfSxROSxkOD1mdW5jdGlvbigkLFgsUSl7dmFyIFo9RXJyb3IoWHx8UTlbJF0pO2lmKFouY29kZT0kLEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKFosZDgpO2lmKCFRKXRocm93IFo7cmV0dXJuIFp9LFFQPWZ1bmN0aW9uKCQsWCxRKXt2YXIgWj0wLEo9MDtmb3IoO1o8UTsrK1opSnw9JFtYKytdPDwoWjw8Myk7cmV0dXJuIEp9LFo5PWZ1bmN0aW9uKCQsWCl7cmV0dXJuKCRbWF18JFtYKzFdPDw4fCRbWCsyXTw8MTZ8JFtYKzNdPDwyNCk+Pj4wfSxKOT1mdW5jdGlvbigkLFgpe3ZhciBRPSRbMF18JFsxXTw8OHwkWzJdPDwxNjtpZihRPT0zMTI2NTY4JiYkWzNdPT0yNTMpe3ZhciBaPSRbNF0sSj1aPj41JjEsWT1aPj4yJjEsSD1aJjMsVz1aPj42O2lmKFomOClkOCgwKTt2YXIgUD02LUosRz1IPT0zPzQ6SCxxPVFQKCQsUCxHKTtQKz1HO3ZhciBMPVc/MTw8VzpKLE49UVAoJCxQLEwpKyhXPT0xJiYyNTYpLFU9TjtpZighSil7dmFyIGs9MTw8MTArKCRbNV0+PjMpO1U9aysoaz4+MykqKCRbNV0mNyl9aWYoVT4yMTQ1Mzg2NDk2KWQ4KDEpO3ZhciBTPW5ldyBtOCgoWD09MT9OfHxVOlg/MDpVKSsxMik7cmV0dXJuIFNbMF09MSxTWzRdPTQsU1s4XT04LHtiOlArTCx5OjAsbDowLGQ6cSx3OlgmJlghPTE/WDpTLnN1YmFycmF5KDEyKSxlOlUsbzpuZXcgbDQoUy5idWZmZXIsMCwzKSx1Ok4sYzpZLG06TWF0aC5taW4oMTMxMDcyLFUpfX1lbHNlIGlmKChRPj40fCRbM108PDIwKT09MjU0ODE4OTMpcmV0dXJuIFo5KCQsNCkrODtkOCgwKX0sWVg9ZnVuY3Rpb24oJCl7dmFyIFg9MDtmb3IoOzE8PFg8PSQ7KytYKTtyZXR1cm4gWC0xfSx3Wj1mdW5jdGlvbigkLFgsUSl7dmFyIFo9KFg8PDMpKzQsSj0oJFtYXSYxNSkrNTtpZihKPlEpZDgoMyk7dmFyIFk9MTw8SixIPVksVz0tMSxQPS0xLEc9LTEscT1ZLEw9bmV3IGVxKDUxMisoWTw8MikpLE49bmV3ICQ5KEwsMCwyNTYpLFU9bmV3IGQ0KEwsMCwyNTYpLGs9bmV3IGQ0KEwsNTEyLFkpLFM9NTEyKyhZPDwxKSxzPW5ldyBtOChMLFMsWSksUDg9bmV3IG04KEwsUytZKTt3aGlsZShXPDI1NSYmSD4wKXt2YXIgRDg9WVgoSCsxKSxUOD1aPj4zLHgkPSgxPDxEOCsxKS0xLHg4PSgkW1Q4XXwkW1Q4KzFdPDw4fCRbVDgrMl08PDE2KT4+KFomNykmeCQsaj0oMTw8RDgpLTEsWjg9eCQtSC0xLCQwPXg4Jmo7aWYoJDA8WjgpWis9RDgseDg9JDA7ZWxzZSBpZihaKz1EOCsxLHg4PmopeDgtPVo4O2lmKE5bKytXXT0tLXg4LHg4PT0tMSlIKz14OCxzWy0tcV09VztlbHNlIEgtPXg4O2lmKCF4OClkb3t2YXIgRTg9Wj4+MztQPSgkW0U4XXwkW0U4KzFdPDw4KT4+KFomNykmMyxaKz0yLFcrPVB9d2hpbGUoUD09Myl9aWYoVz4yNTV8fEgpZDgoMCk7dmFyIEk4PTAsdTA9KFk+PjEpKyhZPj4zKSszLEEwPVktMTtmb3IodmFyIFUwPTA7VTA8PVc7KytVMCl7dmFyIEc4PU5bVTBdO2lmKEc4PDEpe1VbVTBdPS1HODtjb250aW51ZX1mb3IoRz0wO0c8Rzg7KytHKXtzW0k4XT1VMDtkbyBJOD1JOCt1MCZBMDt3aGlsZShJOD49cSl9fWlmKEk4KWQ4KDApO2ZvcihHPTA7RzxZOysrRyl7dmFyIGk9VVtzW0ddXSsrLHc4PVA4W0ddPUotWVgoaSk7a1tHXT0oaTw8dzgpLVl9cmV0dXJuW1orNz4+Myx7YjpKLHMsbjpQOCx0Omt9XX0sWTk9ZnVuY3Rpb24oJCxYKXt2YXIgUT0wLFo9LTEsSj1uZXcgbTgoMjkyKSxZPSRbWF0sSD1KLnN1YmFycmF5KDAsMjU2KSxXPUouc3ViYXJyYXkoMjU2LDI2OCksUD1uZXcgZDQoSi5idWZmZXIsMjY4KTtpZihZPDEyOCl7dmFyIEc9d1ooJCxYKzEsNikscT1HWzBdLEw9R1sxXTtYKz1ZO3ZhciBOPXE8PDMsVT0kW1hdO2lmKCFVKWQ4KDApO3ZhciBrPTAsUz0wLHM9TC5iLFA4PXMsRDg9KCsrWDw8MyktOCtZWChVKTtmb3IoOzspe2lmKEQ4LT1zLEQ4PE4pYnJlYWs7dmFyIFQ4PUQ4Pj4zO2lmKGsrPSgkW1Q4XXwkW1Q4KzFdPDw4KT4+KEQ4JjcpJigxPDxzKS0xLEhbKytaXT1MLnNba10sRDgtPVA4LEQ4PE4pYnJlYWs7VDg9RDg+PjMsUys9KCRbVDhdfCRbVDgrMV08PDgpPj4oRDgmNykmKDE8PFA4KS0xLEhbKytaXT1MLnNbU10scz1MLm5ba10saz1MLnRba10sUDg9TC5uW1NdLFM9TC50W1NdfWlmKCsrWj4yNTUpZDgoMCl9ZWxzZXtaPVktMTI3O2Zvcig7UTxaO1ErPTIpe3ZhciB4JD0kWysrWF07SFtRXT14JD4+NCxIW1ErMV09eCQmMTV9KytYfXZhciB4OD0wO2ZvcihRPTA7UTxaOysrUSl7dmFyIGo9SFtRXTtpZihqPjExKWQ4KDApO3g4Kz1qJiYxPDxqLTF9dmFyIFo4PVlYKHg4KSsxLCQwPTE8PFo4LEU4PSQwLXg4O2lmKEU4JkU4LTEpZDgoMCk7SFtaKytdPVlYKEU4KSsxO2ZvcihRPTA7UTxaOysrUSl7dmFyIGo9SFtRXTsrK1dbSFtRXT1qJiZaOCsxLWpdfXZhciBJOD1uZXcgbTgoJDA8PDEpLHUwPUk4LnN1YmFycmF5KDAsJDApLEEwPUk4LnN1YmFycmF5KCQwKTtQW1o4XT0wO2ZvcihRPVo4O1E+MDstLVEpe3ZhciBVMD1QW1FdO0RaKEEwLFEsVTAsUFtRLTFdPVUwK1dbUV0qKDE8PFo4LVEpKX1pZihQWzBdIT0kMClkOCgwKTtmb3IoUT0wO1E8WjsrK1Epe3ZhciBHOD1IW1FdO2lmKEc4KXt2YXIgaT1QW0c4XTtEWih1MCxRLGksUFtHOF09aSsoMTw8WjgtRzgpKX19cmV0dXJuW1gse246QTAsYjpaOCxzOnUwfV19LEg5LFc5LEs5LFpQPWZ1bmN0aW9uKCQsWCl7dmFyIFE9JC5sZW5ndGgsWj1uZXcgbDQoUSk7Zm9yKHZhciBKPTA7SjxROysrSilaW0pdPVgsWCs9MTw8JFtKXTtyZXR1cm4gWn0sZEgsUDksbEgsRzksU1o9ZnVuY3Rpb24oJCxYLFEpe3ZhciBaPSQubGVuZ3RoLEo9WC5sZW5ndGgsWT0kW1otMV0sSD0oMTw8US5iKS0xLFc9LVEuYjtpZighWSlkOCgwKTt2YXIgUD0wLEc9US5iLHE9KFo8PDMpLTgrWVgoWSktRyxMPS0xO2Zvcig7cT5XJiZMPEo7KXt2YXIgTj1xPj4zLFU9KCRbTl18JFtOKzFdPDw4fCRbTisyXTw8MTYpPj4ocSY3KTtQPShQPDxHfFUpJkgsWFsrK0xdPVEuc1tQXSxxLT1HPVEubltQXX1pZihxIT1XfHxMKzEhPUopZDgoMCl9LHE5PWZ1bmN0aW9uKCQsWCxRKXt2YXIgWj02LEo9WC5sZW5ndGgsWT1KKzM+PjIsSD1ZPDwxLFc9WStIO1NaKCQuc3ViYXJyYXkoWixaKz0kWzBdfCRbMV08PDgpLFguc3ViYXJyYXkoMCxZKSxRKSxTWigkLnN1YmFycmF5KFosWis9JFsyXXwkWzNdPDw4KSxYLnN1YmFycmF5KFksSCksUSksU1ooJC5zdWJhcnJheShaLForPSRbNF18JFs1XTw8OCksWC5zdWJhcnJheShILFcpLFEpLFNaKCQuc3ViYXJyYXkoWiksWC5zdWJhcnJheShXKSxRKX0sejk9ZnVuY3Rpb24oJCxYLFEpe3ZhciBaLEo9WC5iLFk9JFtKXSxIPVk+PjEmMztYLmw9WSYxO3ZhciBXPVk+PjN8JFtKKzFdPDw1fCRbSisyXTw8MTMsUD0oSis9MykrVztpZihIPT0xKXtpZihKPj0kLmxlbmd0aClyZXR1cm47aWYoWC5iPUorMSxRKXJldHVybiBEWihRLCRbSl0sWC55LFgueSs9VyksUTtyZXR1cm4gRFoobmV3IG04KFcpLCRbSl0pfWlmKFA+JC5sZW5ndGgpcmV0dXJuO2lmKEg9PTApe2lmKFguYj1QLFEpcmV0dXJuIFEuc2V0KCQuc3ViYXJyYXkoSixQKSxYLnkpLFgueSs9VyxRO3JldHVybiB1SCgkLEosUCl9aWYoSD09Mil7dmFyIEc9JFtKXSxxPUcmMyxMPUc+PjImMyxOPUc+PjQsVT0wLGs9MDtpZihxPDIpaWYoTCYxKU58PSRbKytKXTw8NHwoTCYyJiYkWysrSl08PDEyKTtlbHNlIE49Rz4+MztlbHNlIGlmKGs9TCxMPDIpTnw9KCRbKytKXSY2Myk8PDQsVT0kW0pdPj42fCRbKytKXTw8MjtlbHNlIGlmKEw9PTIpTnw9JFsrK0pdPDw0fCgkWysrSl0mMyk8PDEyLFU9JFtKXT4+MnwkWysrSl08PDY7ZWxzZSBOfD0kWysrSl08PDR8KCRbKytKXSY2Myk8PDEyLFU9JFtKXT4+NnwkWysrSl08PDJ8JFsrK0pdPDwxMDsrK0o7dmFyIFM9UT9RLnN1YmFycmF5KFgueSxYLnkrWC5tKTpuZXcgbTgoWC5tKSxzPVMubGVuZ3RoLU47aWYocT09MClTLnNldCgkLnN1YmFycmF5KEosSis9Tikscyk7ZWxzZSBpZihxPT0xKURaKFMsJFtKKytdLHMpO2Vsc2V7dmFyIFA4PVguaDtpZihxPT0yKXt2YXIgRDg9WTkoJCxKKTtVKz1KLShKPUQ4WzBdKSxYLmg9UDg9RDhbMV19ZWxzZSBpZighUDgpZDgoMCk7KGs/cTk6U1opKCQuc3ViYXJyYXkoSixKKz1VKSxTLnN1YmFycmF5KHMpLFA4KX12YXIgVDg9JFtKKytdO2lmKFQ4KXtpZihUOD09MjU1KVQ4PSgkW0orK118JFtKKytdPDw4KSszMjUxMjtlbHNlIGlmKFQ4PjEyNylUOD1UOC0xMjg8PDh8JFtKKytdO3ZhciB4JD0kW0orK107aWYoeCQmMylkOCgwKTt2YXIgeDg9W1c5LEs5LEg5XTtmb3IodmFyIGo9MjtqPi0xOy0tail7dmFyIFo4PXgkPj4oajw8MSkrMiYzO2lmKFo4PT0xKXt2YXIgJDA9bmV3IG04KFswLDAsJFtKKytdXSk7eDhbal09e3M6JDAuc3ViYXJyYXkoMiwzKSxuOiQwLnN1YmFycmF5KDAsMSksdDpuZXcgZDQoJDAuYnVmZmVyLDAsMSksYjowfX1lbHNlIGlmKFo4PT0yKVo9d1ooJCxKLDktKGomMSkpLEo9WlswXSx4OFtqXT1aWzFdO2Vsc2UgaWYoWjg9PTMpe2lmKCFYLnQpZDgoMCk7eDhbal09WC50W2pdfX12YXIgRTg9WC50PXg4LEk4PUU4WzBdLHUwPUU4WzFdLEEwPUU4WzJdLFUwPSRbUC0xXTtpZighVTApZDgoMCk7dmFyIEc4PShQPDwzKS04K1lYKFUwKS1BMC5iLGk9Rzg+PjMsdzg9MCxZMD0oJFtpXXwkW2krMV08PDgpPj4oRzgmNykmKDE8PEEwLmIpLTE7aT0oRzgtPXUwLmIpPj4zO3ZhciBCMD0oJFtpXXwkW2krMV08PDgpPj4oRzgmNykmKDE8PHUwLmIpLTE7aT0oRzgtPUk4LmIpPj4zO3ZhciBYMT0oJFtpXXwkW2krMV08PDgpPj4oRzgmNykmKDE8PEk4LmIpLTE7Zm9yKCsrVDg7LS1UODspe3ZhciBMUT1BMC5zW1kwXSxONj1BMC5uW1kwXSx5MT1JOC5zW1gxXSxKJD1JOC5uW1gxXSxIMD11MC5zW0IwXSxsOD11MC5uW0IwXTtpPShHOC09SDApPj4zO3ZhciBBMT0xPDxIMCxtMT1BMSsoKCRbaV18JFtpKzFdPDw4fCRbaSsyXTw8MTZ8JFtpKzNdPDwyNCk+Pj4oRzgmNykmQTEtMSk7aT0oRzgtPWxIW3kxXSk+PjM7dmFyIE5RPUc5W3kxXSsoKCRbaV18JFtpKzFdPDw4fCRbaSsyXTw8MTYpPj4oRzgmNykmKDE8PGxIW3kxXSktMSk7aT0oRzgtPWRIW0xRXSk+PjM7dmFyIFZaPVA5W0xRXSsoKCRbaV18JFtpKzFdPDw4fCRbaSsyXTw8MTYpPj4oRzgmNykmKDE8PGRIW0xRXSktMSk7aWYoaT0oRzgtPU42KT4+MyxZMD1BMC50W1kwXSsoKCRbaV18JFtpKzFdPDw4KT4+KEc4JjcpJigxPDxONiktMSksaT0oRzgtPUokKT4+MyxYMT1JOC50W1gxXSsoKCRbaV18JFtpKzFdPDw4KT4+KEc4JjcpJigxPDxKJCktMSksaT0oRzgtPWw4KT4+MyxCMD11MC50W0IwXSsoKCRbaV18JFtpKzFdPDw4KT4+KEc4JjcpJigxPDxsOCktMSksbTE+MylYLm9bMl09WC5vWzFdLFgub1sxXT1YLm9bMF0sWC5vWzBdPW0xLT0zO2Vsc2V7dmFyIEJaPW0xLShWWiE9MCk7aWYoQlope2lmKG0xPUJaPT0zP1gub1swXS0xOlgub1tCWl0sQlo+MSlYLm9bMl09WC5vWzFdO1gub1sxXT1YLm9bMF0sWC5vWzBdPW0xfWVsc2UgbTE9WC5vWzBdfWZvcih2YXIgaj0wO2o8Vlo7KytqKVNbdzgral09U1tzK2pdO3c4Kz1WWixzKz1WWjt2YXIgRlE9dzgtbTE7aWYoRlE8MCl7dmFyIEFRPS1GUSxGUD1YLmUrRlE7aWYoQVE+TlEpQVE9TlE7Zm9yKHZhciBqPTA7ajxBUTsrK2opU1t3OCtqXT1YLndbRlAral07dzgrPUFRLE5RLT1BUSxGUT0wfWZvcih2YXIgaj0wO2o8TlE7KytqKVNbdzgral09U1tGUStqXTt3OCs9TlF9aWYodzghPXMpd2hpbGUoczxTLmxlbmd0aClTW3c4KytdPVNbcysrXTtlbHNlIHc4PVMubGVuZ3RoO2lmKFEpWC55Kz13ODtlbHNlIFM9dUgoUywwLHc4KX1lbHNlIGlmKFEpe2lmKFgueSs9TixzKWZvcih2YXIgaj0wO2o8TjsrK2opU1tqXT1TW3Mral19ZWxzZSBpZihzKVM9dUgoUyxzKTtyZXR1cm4gWC5iPVAsU31kOCgyKX0sRTk9ZnVuY3Rpb24oJCxYKXtpZigkLmxlbmd0aD09MSlyZXR1cm4gJFswXTt2YXIgUT1uZXcgbTgoWCk7Zm9yKHZhciBaPTAsSj0wO1o8JC5sZW5ndGg7KytaKXt2YXIgWT0kW1pdO1Euc2V0KFksSiksSis9WS5sZW5ndGh9cmV0dXJuIFF9O3ZhciBZUD1BKCgpPT57ZXE9QXJyYXlCdWZmZXIsbTg9VWludDhBcnJheSxkND1VaW50MTZBcnJheSwkOT1JbnQxNkFycmF5LGw0PUludDMyQXJyYXksUTk9WyJpbnZhbGlkIHpzdGQgZGF0YSIsIndpbmRvdyBzaXplIHRvbyBsYXJnZSAoPjIwNDZNQikiLCJpbnZhbGlkIGJsb2NrIHR5cGUiLCJGU0UgYWNjdXJhY3kgdG9vIGhpZ2giLCJtYXRjaCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLCJ1bmV4cGVjdGVkIEVPRiJdLEg5PXdaKG5ldyBtOChbODEsMTYsOTksMTQwLDQ5LDE5OCwyNCw5OSwxMiwzMywxOTYsMjQsOTksMTAyLDEwMiwxMzQsNzAsMTQ2LDRdKSwwLDYpWzFdLFc5PXdaKG5ldyBtOChbMzMsMjAsMTk2LDI0LDk5LDE0MCwzMywxMzIsMTYsNjYsOCwzMywxMzIsMTYsNjYsOCwzMyw2OCw2OCw2OCw2OCw2OCw2OCw2OCw2OCwzNiw5XSksMCw2KVsxXSxLOT13WihuZXcgbTgoWzMyLDEzMiwxNiw2NiwxMDIsNzAsNjgsNjgsNjgsNjgsMzYsNzMsMl0pLDAsNSlbMV0sZEg9bmV3IG04KG5ldyBsNChbMCwwLDAsMCwxNjg0MzAwOSw1MDUyODc3MCwxMzQ2NzgwMjAsMjAyMDUwMDU3LDI2OTQyMjA5M10pLmJ1ZmZlciwwLDM2KSxQOT1aUChkSCwwKSxsSD1uZXcgbTgobmV3IGw0KFswLDAsMCwwLDAsMCwwLDAsMTY4NDMwMDksNTA1Mjg3NzAsMTE3NzY5MjIwLDE4NTIwNzA0OCwyNTI1NzkwODQsMTZdKS5idWZmZXIsMCw1MyksRzk9WlAobEgsMyl9KTt2YXIgV1A9e307QyQoV1Ase3pzdGREZWNvbXByZXNzOigpPT5zSCx6c3RkQ29tcHJlc3M6KCk9PkhQLGlzWnN0ZENvbXByZXNzQXZhaWxhYmxlOigpPT5MOX0pO2Z1bmN0aW9uIG9IKCl7bGV0ICQ9aW1wb3J0Lm1ldGEucmVxdWlyZT8/Z2xvYmFsVGhpcy5yZXF1aXJlPz9udWxsO2lmKCEkKXJldHVybiBudWxsO3RyeXtyZXR1cm4gJChNOSl9Y2F0Y2h7cmV0dXJuIG51bGx9fWZ1bmN0aW9uIEw5KCl7aWYobkgpcmV0dXJuITA7cmV0dXJuIHR5cGVvZiBvSCgpPy56c3RkQ29tcHJlc3NTeW5jPT09ImZ1bmN0aW9uIn1hc3luYyBmdW5jdGlvbiBIUCgkLFgpe2lmKG5IKXJldHVybiBuZXcgVWludDhBcnJheShCdW4uenN0ZENvbXByZXNzU3luYygkLHtsZXZlbDpYfSkpO2xldCBRPW9IKCksWj1RPy56c3RkQ29tcHJlc3NTeW5jO2lmKHR5cGVvZiBaIT09ImZ1bmN0aW9uIil0aHJvdyBFcnJvcigienN0ZCBjb21wcmVzc2lvbiBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgcnVudGltZS4gUmVxdWlyZXMgQnVuIG9yIE5vZGUuanMgPj0gMjIuMTUgLyBEZW5vID49IDIuNi45LiAod29ya2VyZCBoYXMgbm8gbmF0aXZlIHpzdGQgZW5jb2RlcjsgZnpzdGQgaXMgZGVjb21wcmVzcy1vbmx5LikiKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWigkLHtwYXJhbXM6e1tRLmNvbnN0YW50cy5aU1REX2NfY29tcHJlc3Npb25MZXZlbF06WH19KSl9YXN5bmMgZnVuY3Rpb24gc0goJCxYKXtpZihYIT1udWxsKXtsZXQgWj1OOSgkKTtpZihaIT09bnVsbCYmWj5YKXRocm93IEVycm9yKGB6c3RkIGRlY29tcHJlc3NlZCBzaXplICgke1p9KSB3b3VsZCBleGNlZWQgY2FwICgke1h9KWApfWxldCBRO2lmKG5IKVE9bmV3IFVpbnQ4QXJyYXkoQnVuLnpzdGREZWNvbXByZXNzU3luYygkKSk7ZWxzZXtsZXQgSj1vSCgpPy56c3RkRGVjb21wcmVzc1N5bmM7aWYodHlwZW9mIEo9PT0iZnVuY3Rpb24iKVE9bmV3IFVpbnQ4QXJyYXkoSigkKSk7ZWxzZXtsZXQgWT1KUCgkKTtRPW5ldyBVaW50OEFycmF5KFkuYnl0ZUxlbmd0aCksUS5zZXQoWSl9fWlmKFghPW51bGwmJlEuYnl0ZUxlbmd0aD5YKXRocm93IEVycm9yKGB6c3RkIGRlY29tcHJlc3NlZCBzaXplICgke1EuYnl0ZUxlbmd0aH0pIGV4Y2VlZHMgY2FwICgke1h9KWApO3JldHVybiBRfWZ1bmN0aW9uIE45KCQpe2lmKCQubGVuZ3RoPDYpcmV0dXJuIG51bGw7aWYoJFswXSE9PTQwfHwkWzFdIT09MTgxfHwkWzJdIT09NDd8fCRbM10hPT0yNTMpcmV0dXJuIG51bGw7bGV0IFg9JFs0XSxRPVg+PjYmMyxaPShYPj41JjEpPT09MSxKPVgmMyxZPVE9PT0wP1o/MTowOlE9PT0xPzI6UT09PTI/NDo4O2lmKFk9PT0wKXJldHVybiBudWxsO2xldCBIPVo/MDoxLFc9Sj09PTA/MDpKPT09MT8xOko9PT0yPzI6NCxQPTUrSCtXO2lmKCQubGVuZ3RoPFArWSlyZXR1cm4gbnVsbDtsZXQgRz0wbjtmb3IobGV0IHE9MDtxPFk7cSsrKUd8PUJpZ0ludCgkW1ArcV0pPDxCaWdJbnQocSo4KTtpZihZPT09MilHKz0yNTZuO2lmKEc+QmlnSW50KE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSlyZXR1cm4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7cmV0dXJuIE51bWJlcihHKX12YXIgTTk9Im5vZGU6emxpYiIsbkg7dmFyIHJIPUEoKCk9PntZUCgpO25IPXR5cGVvZiBnbG9iYWxUaGlzLkJ1bjwidSJ9KTt2YXIgSzg9e051bGw6MSxJbnQ6MixGbG9hdDozLEJpbmFyeTo0LFV0Zjg6NSxCb29sOjYsRGVjaW1hbDo3LERhdGU6OCxUaW1lOjksVGltZXN0YW1wOjEwLEludGVydmFsOjExLExpc3Q6MTIsU3RydWN0OjEzLFVuaW9uOjE0LEZpeGVkU2l6ZUJpbmFyeToxNSxGaXhlZFNpemVMaXN0OjE2LE1hcDoxNyxEdXJhdGlvbjoxOCxMYXJnZUJpbmFyeToxOSxMYXJnZVV0Zjg6MjAsRGljdGlvbmFyeTotMX07ZnVuY3Rpb24gRjYoJCl7cmV0dXJuICQudHlwZUlkPT09SzguSW50fWZ1bmN0aW9uIHM0KCQpe3JldHVybiAkLnR5cGVJZD09PUs4LkJpbmFyeXx8JC50eXBlSWQ9PT1LOC5MYXJnZUJpbmFyeX1mdW5jdGlvbiByNCgkKXtyZXR1cm4gJC50eXBlSWQ9PT1LOC5Cb29sfWZ1bmN0aW9uIGk0KCQpe3JldHVybiAkLnR5cGVJZD09PUs4Lkxpc3R9ZnVuY3Rpb24gYTQoJCl7cmV0dXJuICQudHlwZUlkPT09SzguU3RydWN0fWZ1bmN0aW9uIHQ0KCQpe3JldHVybiAkLnR5cGVJZD09PUs4Lk1hcH1mdW5jdGlvbiBlNCgkKXtyZXR1cm4gJC50eXBlSWQ9PT1LOC5EaWN0aW9uYXJ5fXZhciBrSD17fTtDJChrSCx7d2l0aEJhdGNoTWV0YWRhdGE6KCk9PlJILHV0Zjg6KCk9Pms0LHVuaW9uOigpPT5XWix1aW50ODooKT0+QTQsdWludDY0OigpPT5DNCx1aW50MzI6KCk9PlI0LHVpbnQxNjooKT0+VTQsdGltZXN0YW1wOigpPT5TNCx0aW1lU2Vjb25kOigpPT5QSCx0aW1lTmFub3NlY29uZDooKT0+ekgsdGltZU1pbGxpc2Vjb25kOigpPT5HSCx0aW1lTWljcm9zZWNvbmQ6KCk9PnFILHRpbWU6KCk9PlhYLHN0cnVjdDooKT0+SFosc3BhcnNlVW5pb246KCk9Pk5ILHNlcmlhbGl6ZVNjaGVtYTooKT0+dCQsc2VyaWFsaXplQmF0Y2g6KCk9Pnk4LHNjaGVtYTooKT0+TUssc2FmZU51bWJlcjooKT0+cVoscmVhZENhbm9uaWNhbFZhbHVlOigpPT53MCxwcm9qZWN0U2NoZW1hOigpPT5QUSxwcm9qZWN0QmF0Y2g6KCk9PkVaLG51bGxUeXBlOigpPT5MNCxtYXA6KCk9Pnc0LGxpc3Q6KCk9PkQ0LGl0ZXJSb3dzOigpPT5OMCxpbnRlcnZhbDooKT0+TUgsaW50ODooKT0+RjQsaW50NjQ6KCk9PlpaLGludDMyOigpPT5RWixpbnQxNjooKT0+SFEsaW50OigpPT5YSCxmbG9hdDY0OigpPT5PNCxmbG9hdDMyOigpPT5aSCxmbG9hdDE2OigpPT5RSCxmaXhlZFNpemVMaXN0OigpPT5MSCxmaXhlZFNpemVCaW5hcnk6KCk9PkpILGZpbHRlckJhdGNoOigpPT56WixmaWVsZDooKT0+TjEsZW1wdHlCYXRjaDooKT0+YSQsZHVyYXRpb246KCk9PkVILGRpY3Rpb25hcnk6KCk9PlY0LGRlc2VyaWFsaXplU2NoZW1hOigpPT5lJCxkZXNlcmlhbGl6ZUJhdGNoOigpPT5GMCxkZW5zZVVuaW9uOigpPT5GSCxkZWNvZGVEaWN0VmFsdWU6KCk9Pl80LGRlY2ltYWwyNTY6KCk9PkhILGRlY2ltYWwxMjg6KCk9PllILGRlY2ltYWw6KCk9PkpaLGRhdGVNaWxsaXNlY29uZDooKT0+S0gsZGF0ZURheTooKT0+V0gsZGF0ZTooKT0+WVosY29sdW1uRnJvbUFycmF5OigpPT5VSCxidWlsZFN0YXRpc3RpY3NCYXRjaDooKT0+Q0gsYm9vbDooKT0+TjQsYmluYXJ5OigpPT5qNCxiYXRjaFRvU2VjcmV0RGljdDooKT0+VDQsYmF0Y2hUb1NjYWxhckRpY3Q6KCk9Pno2LGJhdGNoRnJvbVJvd3M6KCk9PlIkLGJhdGNoRnJvbUNvbHVtbnM6KCk9PnQ4LGJhY2tlbmQ6KCk9PkNLLGFkb3B0QXJyb3dKc1NoYXBlOigpPT5PSCxVbmlvbk1vZGU6KCk9PkVLLFRpbWVVbml0OigpPT4kWCxJbnRlcnZhbFVuaXQ6KCk9PnpLLERhdGVVbml0OigpPT5xS30pO0wwKCk7dmFyICRYPXtTRUNPTkQ6Ty5TRUNPTkQsTUlMTElTRUNPTkQ6Ty5NSUxMSVNFQ09ORCxNSUNST1NFQ09ORDpPLk1JQ1JPU0VDT05ELE5BTk9TRUNPTkQ6Ty5OQU5PU0VDT05EfSxxSz17REFZOko4LkRBWSxNSUxMSVNFQ09ORDpKOC5NSUxMSVNFQ09ORH0seks9e1lFQVJfTU9OVEg6ZS5ZRUFSX01PTlRILERBWV9USU1FOmUuREFZX1RJTUUsTU9OVEhfREFZX05BTk86ZS5NT05USF9EQVlfTkFOT30sRUs9e1NwYXJzZTokOC5TcGFyc2UsRGVuc2U6JDguRGVuc2V9O2Z1bmN0aW9uIE1LKCQsWCl7cmV0dXJuIG5ldyBCKCQsWD8/bmV3IE1hcCl9ZnVuY3Rpb24gTjEoJCxYLFE9ITAsWil7cmV0dXJuIG5ldyB3KCQsWCxRLFo/P25ldyBNYXApfXZhciBMND0oKT0+bmV3IE84LE40PSgpPT5uZXcgUzgsRjQ9KCk9Pm5ldyBZMSxIUT0oKT0+bmV3IEgxLFFaPSgpPT5uZXcgWjAsWlo9KCk9Pm5ldyBiOCxBND0oKT0+bmV3IFcxLFU0PSgpPT5uZXcgSzEsUjQ9KCk9Pm5ldyBQMSxDND0oKT0+bmV3IEUkO2Z1bmN0aW9uIFhIKCQ9MzIsWD0hMCl7aWYoWClzd2l0Y2goJCl7Y2FzZSA4OnJldHVybiBGNCgpO2Nhc2UgMTY6cmV0dXJuIEhRKCk7Y2FzZSAzMjpyZXR1cm4gUVooKTtjYXNlIDY0OnJldHVybiBaWigpfWVsc2Ugc3dpdGNoKCQpe2Nhc2UgODpyZXR1cm4gQTQoKTtjYXNlIDE2OnJldHVybiBVNCgpO2Nhc2UgMzI6cmV0dXJuIFI0KCk7Y2FzZSA2NDpyZXR1cm4gQzQoKX10aHJvdyBFcnJvcihgaW50OiB1bnN1cHBvcnRlZCBiaXRXaWR0aCAkeyR9YCl9dmFyIFFIPSgpPT5uZXcgTzYsWkg9KCk9Pm5ldyBHMSxPND0oKT0+bmV3IHQwLGs0PSgpPT5uZXcgXzgsajQ9KCk9Pm5ldyBUMCxKSD0oJCk9Pm5ldyB6JCgkKTtmdW5jdGlvbiBKWigkLFgsUT0xMjgpe3JldHVybiBuZXcgcSQoWCwkLFEpfXZhciBZSD0oJCxYKT0+SlooJCxYLDEyOCksSEg9KCQsWCk9PkpaKCQsWCwyNTYpLFlaPSgkPUo4Lk1JTExJU0VDT05EKT0+bmV3IHIwKCQpLFdIPSgpPT5ZWihKOC5EQVkpLEtIPSgpPT5ZWihKOC5NSUxMSVNFQ09ORCk7ZnVuY3Rpb24gWFgoJD1PLk1JTExJU0VDT05ELFgpe2xldCBRPVg/PygkPD1PLk1JTExJU0VDT05EPzMyOjY0KTtyZXR1cm4gbmV3IGswKCQsUSl9dmFyIFBIPSgpPT5YWChPLlNFQ09ORCwzMiksR0g9KCk9PlhYKE8uTUlMTElTRUNPTkQsMzIpLHFIPSgpPT5YWChPLk1JQ1JPU0VDT05ELDY0KSx6SD0oKT0+WFgoTy5OQU5PU0VDT05ELDY0KSxTND0oJD1PLk1JTExJU0VDT05ELFg9bnVsbCk9Pm5ldyBRMCgkLFgpLEVIPSgkPU8uTUlMTElTRUNPTkQpPT5uZXcgajAoJCksTUg9KCQ9ZS5NT05USF9EQVlfTkFOTyk9Pm5ldyB4MCgkKTtmdW5jdGlvbiBENCgkKXtsZXQgWD1YWigkKT8kOk4xKCJpdGVtIiwkLCEwKTtyZXR1cm4gbmV3IEUwKFgpfWZ1bmN0aW9uIExIKCQsWCl7bGV0IFE9WFooJCk/JDpOMSgiaXRlbSIsJCwhMCk7cmV0dXJuIG5ldyBhMChYLFEpfWZ1bmN0aW9uIEhaKCQpe3JldHVybiBuZXcgbCgkKX1mdW5jdGlvbiB3NCgkLFgsUT0hMSl7bGV0IFo9WFooJCk/JDpOMSgia2V5IiwkLCExKSxKPVhaKFgpP1g6TjEoInZhbHVlIixYLCEwKSxZPU4xKCJlbnRyaWVzIixIWihbWixKXSksITEpO3JldHVybiBuZXcgZzAoWSxRKX1mdW5jdGlvbiBWNCgkLFg9SFEoKSxRPSExLFope3JldHVybiBuZXcgczgoJCxYLFosUSl9ZnVuY3Rpb24gV1ooJCxYLFEpe2xldCBaPVgubWFwKChILFcpPT5YWihIKT9IOk4xKFN0cmluZyhXKSxILCEwKSksSj1RPz9aLm1hcCgoSCxXKT0+Vyk7cmV0dXJuIG5ldygkPT09JDguRGVuc2U/Rlg6UjEpKEosWil9dmFyIE5IPSgkLFgpPT5XWigkOC5TcGFyc2UsJCxYKSxGSD0oJCxYKT0+V1ooJDguRGVuc2UsJCxYKTtmdW5jdGlvbiBYWigkKXtyZXR1cm4gdHlwZW9mICQubmFtZT09PSJzdHJpbmciJiYkLnR5cGUhPW51bGx9TDAoKTtmdW5jdGlvbiBCNCgkKXtsZXQgWD0kLnR5cGU7aWYoUi5pc0xpc3QoWCkpe2xldCBRPVguY2hpbGRyZW5bMF07cmV0dXJuIEMoe3R5cGU6WCxsZW5ndGg6MCxudWxsQ291bnQ6MCxjaGlsZDpCNChRKSx2YWx1ZU9mZnNldHM6bmV3IEludDMyQXJyYXkoWzBdKX0pfWlmKFIuaXNNYXAoWCkpe2xldCBRPVguY2hpbGRyZW5bMF07cmV0dXJuIEMoe3R5cGU6WCxsZW5ndGg6MCxudWxsQ291bnQ6MCxjaGlsZDpCNChRKSx2YWx1ZU9mZnNldHM6bmV3IEludDMyQXJyYXkoWzBdKX0pfWlmKFIuaXNTdHJ1Y3QoWCkpe2xldCBRPVguY2hpbGRyZW4ubWFwKChaKT0+QjQoWikpO3JldHVybiBDKHt0eXBlOlgsbGVuZ3RoOjAsbnVsbENvdW50OjAsY2hpbGRyZW46UX0pfXJldHVybiBDKHt0eXBlOlgsbGVuZ3RoOjAsbnVsbENvdW50OjB9KX1mdW5jdGlvbiBhJCgkKXtsZXQgWD0kLFE9WC5maWVsZHMubWFwKChZKT0+QjQoWSkpLFo9bmV3IGwoWC5maWVsZHMpLEo9Qyh7dHlwZTpaLGxlbmd0aDowLGNoaWxkcmVuOlEsbnVsbENvdW50OjB9KTtyZXR1cm4gbmV3IGcoWCxKKX1MMCgpO3ZhciBLWj04NjQwMDAwMDtmdW5jdGlvbiBMOCgkKXtyZXR1cm4gJD09PW51bGx8fCQ9PT12b2lkIDB9ZnVuY3Rpb24gUTgoJCxYLFEpe2xldCBaO3RyeXtaPXR5cGVvZiBRPT09ImJpZ2ludCI/YCR7UX1uYDp0eXBlb2YgUT09PSJvYmplY3QiP09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChRKTpTdHJpbmcoUSl9Y2F0Y2h7Wj0iPHVucHJpbnRhYmxlPiJ9dGhyb3cgVHlwZUVycm9yKGBjb2RlY1skeyR9XTogJHtYfSAoZ290ICR7dHlwZW9mIFF9OiAke1p9KWApfWZ1bmN0aW9uIFUkKCQsWCl7bGV0IFE9KFopPT57aWYoTDgoWikpcmV0dXJuIG51bGw7cmV0dXJuIFgoWiksWn07cmV0dXJue2xhYmVsOiQscmljaFRvQ2Fub25pY2FsOlEsY2Fub25pY2FsVG9SaWNoOlEscmF3VG9DYW5vbmljYWw6USxjYW5vbmljYWxUb1JhdzpRfX1mdW5jdGlvbiBvRygkKXtyZXR1cm4oWCk9PntpZih0eXBlb2YgWCE9PSJib29sZWFuIilROCgkLCJleHBlY3RlZCBib29sZWFuIixYKX19ZnVuY3Rpb24gV1EoJCxYLFEpe3JldHVybihaKT0+e2xldCBKO2lmKHR5cGVvZiBaPT09Im51bWJlciIpSj1aO2Vsc2UgaWYodHlwZW9mIFo9PT0iYmlnaW50Iil7aWYoWjxCaWdJbnQoWCl8fFo+QmlnSW50KFEpKVE4KCQsYGJpZ2ludCBvdXQgb2YgJHskfSByYW5nZWAsWik7cmV0dXJufWVsc2UgcmV0dXJuIFE4KCQsImV4cGVjdGVkIG51bWJlciIsWik7aWYoIU51bWJlci5pc0ludGVnZXIoSikpUTgoJCwiZXhwZWN0ZWQgYW4gaW50ZWdlciIsWik7aWYoSjxYfHxKPlEpUTgoJCxgdmFsdWUgb3V0IG9mICR7JH0gcmFuZ2UgWyR7WH0sICR7UX1dYCxaKX19ZnVuY3Rpb24gc0coJCl7cmV0dXJuKFgpPT57aWYodHlwZW9mIFg9PT0ibnVtYmVyIilyZXR1cm47aWYodHlwZW9mIFg9PT0iYmlnaW50IilyZXR1cm47UTgoJCwiZXhwZWN0ZWQgbnVtYmVyIixYKX19ZnVuY3Rpb24gTksoJCxYLFEpe2xldCBaPVE/KDFuPDxCaWdJbnQoWC0xKSktMW46KDFuPDxCaWdJbnQoWCkpLTFuLEo9UT8tKDFuPDxCaWdJbnQoWC0xKSk6MG47cmV0dXJuKFkpPT57bGV0IEg7aWYodHlwZW9mIFk9PT0iYmlnaW50IilIPVk7ZWxzZSBpZih0eXBlb2YgWT09PSJudW1iZXIiKXtpZighTnVtYmVyLmlzSW50ZWdlcihZKSlROCgkLCJleHBlY3RlZCBhbiBpbnRlZ2VyIixZKTtIPUJpZ0ludChZKX1lbHNlIHJldHVybiBROCgkLCJleHBlY3RlZCBiaWdpbnQiLFkpO2lmKEg8Snx8SD5aKVE4KCQsYHZhbHVlIG91dCBvZiAkeyR9IHJhbmdlYCxZKX19ZnVuY3Rpb24gTEsoJCl7cmV0dXJuKFgpPT57aWYodHlwZW9mIFghPT0ic3RyaW5nIilROCgkLCJleHBlY3RlZCBzdHJpbmciLFgpfX1mdW5jdGlvbiBQWigkLFgpe2lmKHR5cGVvZiBYPT09ImJpZ2ludCIpcmV0dXJuIFg7aWYodHlwZW9mIFg9PT0ibnVtYmVyIil7aWYoIU51bWJlci5pc0ludGVnZXIoWCkpUTgoJCwiZXhwZWN0ZWQgYW4gaW50ZWdlciB2YWx1ZSIsWCk7cmV0dXJuIEJpZ0ludChYKX1yZXR1cm4gUTgoJCwiZXhwZWN0ZWQgbnVtYmVyIG9yIGJpZ2ludCIsWCl9ZnVuY3Rpb24gUVgoJCxYKXtpZihYPC05MDA3MTk5MjU0NzQwOTkxbnx8WD45MDA3MTk5MjU0NzQwOTkxbilROCgkLCJiaWdpbnQgb3ZlcmZsb3dzIHRoZSBzYWZlLWludGVnZXIgcmFuZ2Ugd2hlbiBuYXJyb3dpbmcgdG8gbnVtYmVyIixYKTtyZXR1cm4gTnVtYmVyKFgpfWZ1bmN0aW9uIHJHKCl7cmV0dXJue2xhYmVsOiJkYXRlMzIiLHJpY2hUb0Nhbm9uaWNhbChYKXtpZihMOChYKSlyZXR1cm4gbnVsbDtpZihYIGluc3RhbmNlb2YgRGF0ZSl7bGV0IFE9WC5nZXRUaW1lKCk7aWYoTnVtYmVyLmlzTmFOKFEpKVE4KCJkYXRlMzIiLCJpbnZhbGlkIERhdGUiLFgpO2lmKFElS1ohPT0wKXJldHVybiBNYXRoLmZsb29yKFEvS1opO3JldHVybiBRL0tafWlmKHR5cGVvZiBYPT09Im51bWJlciIpe2lmKCFOdW1iZXIuaXNJbnRlZ2VyKFgpKVE4KCJkYXRlMzIiLCJkYXktbnVtYmVyIG11c3QgYmUgYW4gaW50ZWdlciIsWCk7cmV0dXJuIFh9aWYodHlwZW9mIFg9PT0iYmlnaW50IilyZXR1cm4gUVgoImRhdGUzMiIsWCk7cmV0dXJuIFE4KCJkYXRlMzIiLCJleHBlY3RlZCBEYXRlLCBudW1iZXIgKGRheXMpLCBvciBiaWdpbnQiLFgpfSxjYW5vbmljYWxUb1JpY2goWCl7aWYoTDgoWCkpcmV0dXJuIG51bGw7bGV0IFE7aWYodHlwZW9mIFg9PT0ibnVtYmVyIil7aWYoIU51bWJlci5pc0ludGVnZXIoWCkpUTgoImRhdGUzMiIsImNhbm9uaWNhbCBkYXktbnVtYmVyIG11c3QgYmUgYW4gaW50ZWdlciIsWCk7UT1YfWVsc2UgaWYodHlwZW9mIFg9PT0iYmlnaW50IilRPVFYKCJkYXRlMzIiLFgpO2Vsc2UgaWYoWCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIFg7ZWxzZSByZXR1cm4gUTgoImRhdGUzMiIsImV4cGVjdGVkIG51bWJlciAoZGF5cykgY2Fub25pY2FsIixYKTtsZXQgWj1RKktaLEo9bmV3IERhdGUoWik7aWYoTnVtYmVyLmlzTmFOKEouZ2V0VGltZSgpKSlROCgiZGF0ZTMyIiwiZGF5LW51bWJlciBwcm9kdWNlcyBhbiBpbnZhbGlkIERhdGUiLFgpO3JldHVybiBKfSxyYXdUb0Nhbm9uaWNhbChYKXtpZihMOChYKSlyZXR1cm4gbnVsbDtpZih0eXBlb2YgWD09PSJudW1iZXIiKXtpZighTnVtYmVyLmlzSW50ZWdlcihYKSlROCgiZGF0ZTMyIiwicmF3IGRheS1udW1iZXIgbXVzdCBiZSBhbiBpbnRlZ2VyIixYKTtyZXR1cm4gWH1pZih0eXBlb2YgWD09PSJiaWdpbnQiKXJldHVybiBRWCgiZGF0ZTMyIixYKTtyZXR1cm4gUTgoImRhdGUzMiIsImV4cGVjdGVkIGJyYW5kZWQgRGF0ZTMyIChkYXktbnVtYmVyKSIsWCl9LGNhbm9uaWNhbFRvUmF3KFgpe2lmKEw4KFgpKXJldHVybiBudWxsO2lmKHR5cGVvZiBYPT09Im51bWJlciIpe2lmKCFOdW1iZXIuaXNJbnRlZ2VyKFgpKVE4KCJkYXRlMzIiLCJjYW5vbmljYWwgZGF5LW51bWJlciBtdXN0IGJlIGFuIGludGVnZXIiLFgpO3JldHVybiBYfWlmKHR5cGVvZiBYPT09ImJpZ2ludCIpcmV0dXJuIFFYKCJkYXRlMzIiLFgpO2lmKFggaW5zdGFuY2VvZiBEYXRlKXtsZXQgUT1YLmdldFRpbWUoKTtpZihOdW1iZXIuaXNOYU4oUSkpUTgoImRhdGUzMiIsImludmFsaWQgRGF0ZSIsWCk7cmV0dXJuIE1hdGguZmxvb3IoUS9LWil9cmV0dXJuIFE4KCJkYXRlMzIiLCJleHBlY3RlZCBudW1iZXIgKGRheXMpIGNhbm9uaWNhbCIsWCl9fX1mdW5jdGlvbiBpRygpe3JldHVybntsYWJlbDoiZGF0ZTY0IixyaWNoVG9DYW5vbmljYWwoWCl7aWYoTDgoWCkpcmV0dXJuIG51bGw7aWYoWCBpbnN0YW5jZW9mIERhdGUpe2xldCBRPVguZ2V0VGltZSgpO2lmKE51bWJlci5pc05hTihRKSlROCgiZGF0ZTY0IiwiaW52YWxpZCBEYXRlIixYKTtyZXR1cm4gQmlnSW50KFEpfWlmKHR5cGVvZiBYPT09ImJpZ2ludCIpcmV0dXJuIFg7aWYodHlwZW9mIFg9PT0ibnVtYmVyIil7aWYoIU51bWJlci5pc0ludGVnZXIoWCkpUTgoImRhdGU2NCIsIm1zIHZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciIsWCk7cmV0dXJuIEJpZ0ludChYKX1yZXR1cm4gUTgoImRhdGU2NCIsImV4cGVjdGVkIERhdGUsIGJpZ2ludCAobXMpLCBvciBudW1iZXIiLFgpfSxjYW5vbmljYWxUb1JpY2goWCl7aWYoTDgoWCkpcmV0dXJuIG51bGw7aWYoWCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIFg7bGV0IFE9UFooImRhdGU2NCIsWCksWj1RWCgiZGF0ZTY0IixRKSxKPW5ldyBEYXRlKFopO2lmKE51bWJlci5pc05hTihKLmdldFRpbWUoKSkpUTgoImRhdGU2NCIsIm1zIHZhbHVlIHByb2R1Y2VzIGFuIGludmFsaWQgRGF0ZSIsWCk7cmV0dXJuIEp9LHJhd1RvQ2Fub25pY2FsKFgpe2lmKEw4KFgpKXJldHVybiBudWxsO2lmKFggaW5zdGFuY2VvZiBEYXRlKXJldHVybiBROCgiZGF0ZTY0IiwicmF3IERhdGU2NE1zIG11c3QgYmUgYSBiaWdpbnQgKG1zKSwgbm90IGEgRGF0ZSIsWCk7cmV0dXJuIFBaKCJkYXRlNjQiLFgpfSxjYW5vbmljYWxUb1JhdyhYKXtpZihMOChYKSlyZXR1cm4gbnVsbDtpZihYIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gQmlnSW50KFguZ2V0VGltZSgpKTtyZXR1cm4gUFooImRhdGU2NCIsWCl9fX1mdW5jdGlvbiBhRygpe2xldCBYPShaKT0+e2lmKEw4KFopKXJldHVybiBudWxsO2lmKHR5cGVvZiBaPT09Im51bWJlciIpe2lmKCFOdW1iZXIuaXNJbnRlZ2VyKFopKVE4KCJ0aW1lMzIiLCJ0aW1lMzIgdmFsdWUgbXVzdCBiZSBhbiBpbnRlZ2VyIixaKTtyZXR1cm4gWn1pZih0eXBlb2YgWj09PSJiaWdpbnQiKXJldHVybiBRWCgidGltZTMyIixaKTtyZXR1cm4gUTgoInRpbWUzMiIsImV4cGVjdGVkIG51bWJlciAocmF3IHRpbWUgdW5pdCkiLFopfSxRPShaKT0+e2lmKEw4KFopKXJldHVybiBudWxsO2lmKHR5cGVvZiBaPT09Im51bWJlciIpcmV0dXJuIFo7aWYodHlwZW9mIFo9PT0iYmlnaW50IilyZXR1cm4gUVgoInRpbWUzMiIsWik7cmV0dXJuIFE4KCJ0aW1lMzIiLCJleHBlY3RlZCBudW1iZXIgY2Fub25pY2FsIixaKX07cmV0dXJue2xhYmVsOiJ0aW1lMzIiLHJpY2hUb0Nhbm9uaWNhbDpYLGNhbm9uaWNhbFRvUmljaDpRLHJhd1RvQ2Fub25pY2FsOlgsY2Fub25pY2FsVG9SYXc6UX19ZnVuY3Rpb24gQUgoJCl7bGV0IFg9KFEpPT57aWYoTDgoUSkpcmV0dXJuIG51bGw7cmV0dXJuIFBaKCQsUSl9O3JldHVybntsYWJlbDokLHJpY2hUb0Nhbm9uaWNhbDpYLGNhbm9uaWNhbFRvUmljaDpYLHJhd1RvQ2Fub25pY2FsOlgsY2Fub25pY2FsVG9SYXc6WH19ZnVuY3Rpb24gdEcoJCl7bGV0IFg9bmV3IFVpbnQ4QXJyYXkoJC5idWZmZXIsJC5ieXRlT2Zmc2V0LCQuYnl0ZUxlbmd0aCksUT0wbjtmb3IobGV0IFo9WC5sZW5ndGgtMTtaPj0wO1otLSlRPVE8PDhufEJpZ0ludChYW1pdKTtpZihYLmxlbmd0aD4wJiZYW1gubGVuZ3RoLTFdJjEyOClRLT0xbjw8QmlnSW50KFgubGVuZ3RoKjgpO3JldHVybiBRfWZ1bmN0aW9uIGVHKCl7bGV0IFg9KFopPT57aWYoTDgoWikpcmV0dXJuIG51bGw7aWYodHlwZW9mIFo9PT0iYmlnaW50IilyZXR1cm4gWjtpZih0eXBlb2YgWj09PSJudW1iZXIiKXJldHVybiBQWigiZGVjaW1hbCIsWik7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KFopKXJldHVybiB0RyhaKTtyZXR1cm4gUTgoImRlY2ltYWwiLCJleHBlY3RlZCBiaWdpbnQsIG51bWJlciwgb3IgZGVjaW1hbCBieXRlIHZpZXciLFopfSxRPShaKT0+e2lmKEw4KFopKXJldHVybiBudWxsO3JldHVybiBYKFopfTtyZXR1cm57bGFiZWw6ImRlY2ltYWwiLHJpY2hUb0Nhbm9uaWNhbDpYLGNhbm9uaWNhbFRvUmljaDpRLHJhd1RvQ2Fub25pY2FsOlgsY2Fub25pY2FsVG9SYXc6UX19ZnVuY3Rpb24gJHEoJCl7bGV0IFE9JC5jaGlsZHJlbi5tYXAoKEopPT4oe25hbWU6Si5uYW1lLGNvZGVjOm0wKEoudHlwZSl9KSksWj0ic3RydWN0IjtyZXR1cm57bGFiZWw6InN0cnVjdCIscmljaFRvQ2Fub25pY2FsKEope2lmKEw4KEopKXJldHVybiBudWxsO2lmKHR5cGVvZiBKIT09Im9iamVjdCIpUTgoInN0cnVjdCIsImV4cGVjdGVkIGFuIG9iamVjdCIsSik7bGV0IFk9SixIPXt9O2ZvcihsZXR7bmFtZTpXLGNvZGVjOlB9b2YgUSlIW1ddPVAucmljaFRvQ2Fub25pY2FsKFlbV10/P251bGwpO3JldHVybiBIfSxjYW5vbmljYWxUb1JpY2goSil7aWYoTDgoSikpcmV0dXJuIG51bGw7aWYodHlwZW9mIEohPT0ib2JqZWN0IilROCgic3RydWN0IiwiZXhwZWN0ZWQgYW4gb2JqZWN0IixKKTtsZXQgWT1KLEg9e307Zm9yKGxldHtuYW1lOlcsY29kZWM6UH1vZiBRKUhbV109UC5jYW5vbmljYWxUb1JpY2goWVtXXT8/bnVsbCk7cmV0dXJuIEh9LHJhd1RvQ2Fub25pY2FsKEope2lmKEw4KEopKXJldHVybiBudWxsO2lmKHR5cGVvZiBKIT09Im9iamVjdCIpUTgoInN0cnVjdCIsImV4cGVjdGVkIGFuIG9iamVjdCIsSik7bGV0IFk9SixIPXt9O2ZvcihsZXR7bmFtZTpXLGNvZGVjOlB9b2YgUSlIW1ddPVAucmF3VG9DYW5vbmljYWwoWVtXXT8/bnVsbCk7cmV0dXJuIEh9LGNhbm9uaWNhbFRvUmF3KEope2lmKEw4KEopKXJldHVybiBudWxsO2lmKHR5cGVvZiBKIT09Im9iamVjdCIpUTgoInN0cnVjdCIsImV4cGVjdGVkIGFuIG9iamVjdCIsSik7bGV0IFk9SixIPXt9O2ZvcihsZXR7bmFtZTpXLGNvZGVjOlB9b2YgUSlIW1ddPVAuY2Fub25pY2FsVG9SYXcoWVtXXT8/bnVsbCk7cmV0dXJuIEh9fX1mdW5jdGlvbiBYcSgkKXtsZXQgWD0kLmNoaWxkcmVuPy5bMF07aWYoIVgpdGhyb3cgRXJyb3IoImNvZGVjW2xpc3RdOiBsaXN0IHR5cGUgaGFzIG5vIGNoaWxkIGZpZWxkIik7bGV0IFE9bTAoWC50eXBlKSxaPSJsaXN0IixKPShZKT0+e2lmKEFycmF5LmlzQXJyYXkoWSkpcmV0dXJuIFk7aWYoWSE9bnVsbCYmdHlwZW9mIFlbU3ltYm9sLml0ZXJhdG9yXT09PSJmdW5jdGlvbiIpcmV0dXJuIEFycmF5LmZyb20oWSk7cmV0dXJuIFE4KFosImV4cGVjdGVkIGFuIGFycmF5IG9yIGl0ZXJhYmxlIixZKX07cmV0dXJue2xhYmVsOloscmljaFRvQ2Fub25pY2FsKFkpe2lmKEw4KFkpKXJldHVybiBudWxsO3JldHVybiBKKFkpLm1hcCgoSCk9PlEucmljaFRvQ2Fub25pY2FsKEgpKX0sY2Fub25pY2FsVG9SaWNoKFkpe2lmKEw4KFkpKXJldHVybiBudWxsO3JldHVybiBKKFkpLm1hcCgoSCk9PlEuY2Fub25pY2FsVG9SaWNoKEgpKX0scmF3VG9DYW5vbmljYWwoWSl7aWYoTDgoWSkpcmV0dXJuIG51bGw7cmV0dXJuIEooWSkubWFwKChIKT0+US5yYXdUb0Nhbm9uaWNhbChIKSl9LGNhbm9uaWNhbFRvUmF3KFkpe2lmKEw4KFkpKXJldHVybiBudWxsO3JldHVybiBKKFkpLm1hcCgoSCk9PlEuY2Fub25pY2FsVG9SYXcoSCkpfX19ZnVuY3Rpb24gUXEoJCl7bGV0IFE9JC5jaGlsZHJlbj8uWzBdPy50eXBlPy5jaGlsZHJlbjtpZighUXx8US5sZW5ndGg8Mil0aHJvdyBFcnJvcigiY29kZWNbbWFwXTogbWFwIHR5cGUgaGFzIG5vIGtleS92YWx1ZSBlbnRyeSBmaWVsZHMiKTtsZXQgWj1tMChRWzBdLnR5cGUpLEo9bTAoUVsxXS50eXBlKSxZPSJtYXAiLEg9KFcpPT57aWYoQXJyYXkuaXNBcnJheShXKSlyZXR1cm4gVztpZihXIGluc3RhbmNlb2YgTWFwKXJldHVybiBBcnJheS5mcm9tKFcuZW50cmllcygpKTtpZihXIT1udWxsJiZ0eXBlb2YgV1tTeW1ib2wuaXRlcmF0b3JdPT09ImZ1bmN0aW9uIilyZXR1cm4gQXJyYXkuZnJvbShXKTtpZihXIT1udWxsJiZ0eXBlb2YgVz09PSJvYmplY3QiKXJldHVybiBPYmplY3QuZW50cmllcyhXKTtyZXR1cm4gUTgoWSwiZXhwZWN0ZWQgTWFwLCBhcnJheSBvZiBwYWlycywgb3Igb2JqZWN0IixXKX07cmV0dXJue2xhYmVsOlkscmljaFRvQ2Fub25pY2FsKFcpe2lmKEw4KFcpKXJldHVybiBudWxsO3JldHVybiBIKFcpLm1hcCgoW1AsR10pPT5bWi5yaWNoVG9DYW5vbmljYWwoUCksSi5yaWNoVG9DYW5vbmljYWwoRyldKX0sY2Fub25pY2FsVG9SaWNoKFcpe2lmKEw4KFcpKXJldHVybiBudWxsO3JldHVybiBIKFcpLm1hcCgoW1AsR10pPT5bWi5jYW5vbmljYWxUb1JpY2goUCksSi5jYW5vbmljYWxUb1JpY2goRyldKX0scmF3VG9DYW5vbmljYWwoVyl7aWYoTDgoVykpcmV0dXJuIG51bGw7cmV0dXJuIEgoVykubWFwKChbUCxHXSk9PltaLnJhd1RvQ2Fub25pY2FsKFApLEoucmF3VG9DYW5vbmljYWwoRyldKX0sY2Fub25pY2FsVG9SYXcoVyl7aWYoTDgoVykpcmV0dXJuIG51bGw7cmV0dXJuIEgoVykubWFwKChbUCxHXSk9PltaLmNhbm9uaWNhbFRvUmF3KFApLEouY2Fub25pY2FsVG9SYXcoRyldKX19fWZ1bmN0aW9uIFpxKCQpe2xldCBYPSQuZGljdGlvbmFyeTtpZighWCl0aHJvdyBFcnJvcigiY29kZWNbZGljdGlvbmFyeV06IG1pc3NpbmcgZGljdGlvbmFyeSB2YWx1ZSB0eXBlIik7bGV0IFE9bTAoWCk7cmV0dXJue2xhYmVsOmBkaWN0aW9uYXJ5PCR7US5sYWJlbH0+YCxyaWNoVG9DYW5vbmljYWw6KFopPT5RLnJpY2hUb0Nhbm9uaWNhbChaKSxjYW5vbmljYWxUb1JpY2g6KFopPT5RLmNhbm9uaWNhbFRvUmljaChaKSxyYXdUb0Nhbm9uaWNhbDooWik9PlEucmF3VG9DYW5vbmljYWwoWiksY2Fub25pY2FsVG9SYXc6KFopPT5RLmNhbm9uaWNhbFRvUmF3KFopfX12YXIgSnE9VSQoImludDgiLFdRKCJpbnQ4IiwtMTI4LDEyNykpLFlxPVUkKCJpbnQxNiIsV1EoImludDE2IiwtMzI3NjgsMzI3NjcpKSxIcT1VJCgiaW50MzIiLFdRKCJpbnQzMiIsLTIxNDc0ODM2NDgsMjE0NzQ4MzY0NykpLFdxPVUkKCJ1aW50OCIsV1EoInVpbnQ4IiwwLDI1NSkpLEtxPVUkKCJ1aW50MTYiLFdRKCJ1aW50MTYiLDAsNjU1MzUpKSxQcT1VJCgidWludDMyIixXUSgidWludDMyIiwwLDQyOTQ5NjcyOTUpKSxHcT1VJCgiaW50NjQiLE5LKCJpbnQ2NCIsNjQsITApKSxxcT1VJCgidWludDY0IixOSygidWludDY0Iiw2NCwhMSkpLHpxPVUkKCJmbG9hdCIsc0coImZsb2F0IikpLEVxPVUkKCJib29sIixvRygiYm9vbCIpKSxNcT17bGFiZWw6InV0ZjgiLHJpY2hUb0Nhbm9uaWNhbCgkKXtpZihMOCgkKSlyZXR1cm4gbnVsbDtyZXR1cm4gdHlwZW9mICQ9PT0ic3RyaW5nIj8kOlN0cmluZygkKX0sY2Fub25pY2FsVG9SaWNoKCQpe2lmKEw4KCQpKXJldHVybiBudWxsO3JldHVybiBMSygidXRmOCIpKCQpLCR9LHJhd1RvQ2Fub25pY2FsKCQpe2lmKEw4KCQpKXJldHVybiBudWxsO3JldHVybiB0eXBlb2YgJD09PSJzdHJpbmciPyQ6U3RyaW5nKCQpfSxjYW5vbmljYWxUb1JhdygkKXtpZihMOCgkKSlyZXR1cm4gbnVsbDtyZXR1cm4gTEsoInV0ZjgiKSgkKSwkfX07ZnVuY3Rpb24gTHEoJCxYKXtyZXR1cm4oUSk9PntpZihMOChRKSlyZXR1cm4gbnVsbDtsZXQgWjtpZihRIGluc3RhbmNlb2YgVWludDhBcnJheSlaPVE7ZWxzZSBpZihBcnJheUJ1ZmZlci5pc1ZpZXcoUSkpe2xldCBKPVE7Wj1uZXcgVWludDhBcnJheShKLmJ1ZmZlcixKLmJ5dGVPZmZzZXQsSi5ieXRlTGVuZ3RoKX1lbHNlIHJldHVybiBROCgkLCJleHBlY3RlZCBVaW50OEFycmF5IixRKTtpZihYIT1udWxsJiZaLmxlbmd0aCE9PVgpUTgoJCxgZXhwZWN0ZWQgZXhhY3RseSAke1h9IGJ5dGVzYCxRKTtyZXR1cm4gWn19ZnVuY3Rpb24gRksoJCxYKXtsZXQgUT1McSgkLFgpO3JldHVybntsYWJlbDokLHJpY2hUb0Nhbm9uaWNhbDpRLGNhbm9uaWNhbFRvUmljaDpRLHJhd1RvQ2Fub25pY2FsOlEsY2Fub25pY2FsVG9SYXc6UX19dmFyIE5xPUZLKCJiaW5hcnkiKSxGcT17bGFiZWw6Im51bGwiLHJpY2hUb0Nhbm9uaWNhbDooKT0+bnVsbCxjYW5vbmljYWxUb1JpY2g6KCk9Pm51bGwscmF3VG9DYW5vbmljYWw6KCk9Pm51bGwsY2Fub25pY2FsVG9SYXc6KCk9Pm51bGx9O2Z1bmN0aW9uIG0wKCQpe3N3aXRjaCgkLnR5cGVJZCl7Y2FzZSBLOC5OdWxsOnJldHVybiBGcTtjYXNlIEs4LkJvb2w6cmV0dXJuIEVxO2Nhc2UgSzguSW50OntsZXQgWD0kLmJpdFdpZHRoPz8zMixRPSQuaXNTaWduZWQ/PyQuc2lnbmVkPz8hMDtpZihYPT09NjQpcmV0dXJuIFE/R3E6cXE7aWYoUSl7aWYoWD09PTgpcmV0dXJuIEpxO2lmKFg9PT0xNilyZXR1cm4gWXE7cmV0dXJuIEhxfWlmKFg9PT04KXJldHVybiBXcTtpZihYPT09MTYpcmV0dXJuIEtxO3JldHVybiBQcX1jYXNlIEs4LkZsb2F0OnJldHVybiB6cTtjYXNlIEs4LlV0Zjg6Y2FzZSBLOC5MYXJnZVV0Zjg6cmV0dXJuIE1xO2Nhc2UgSzguQmluYXJ5OmNhc2UgSzguTGFyZ2VCaW5hcnk6cmV0dXJuIE5xO2Nhc2UgSzguRml4ZWRTaXplQmluYXJ5OnJldHVybiBGSygiZml4ZWRTaXplQmluYXJ5IiwkLmJ5dGVXaWR0aD8/JC5zdHJpZGUpO2Nhc2UgSzguRGVjaW1hbDpyZXR1cm4gZUcoKTtjYXNlIEs4LkRhdGU6cmV0dXJuICQudW5pdD09PTA/ckcoKTppRygpO2Nhc2UgSzguVGltZTpyZXR1cm4oJC5iaXRXaWR0aD8/MzIpPT09NjQ/QUgoInRpbWU2NCIpOmFHKCk7Y2FzZSBLOC5UaW1lc3RhbXA6cmV0dXJuIEFIKCJ0aW1lc3RhbXAiKTtjYXNlIEs4LkR1cmF0aW9uOnJldHVybiBBSCgiZHVyYXRpb24iKTtjYXNlIEs4LlN0cnVjdDpyZXR1cm4gJHEoJCk7Y2FzZSBLOC5VbmlvbjpyZXR1cm4gVSQoInVuaW9uIiwoKT0+e30pO2Nhc2UgSzguTGlzdDpjYXNlIEs4LkZpeGVkU2l6ZUxpc3Q6cmV0dXJuIFhxKCQpO2Nhc2UgSzguTWFwOnJldHVybiBRcSgkKTtjYXNlIEs4LkRpY3Rpb25hcnk6cmV0dXJuIFpxKCQpO2Nhc2UgSzguSW50ZXJ2YWw6cmV0dXJuIFUkKCJpbnRlcnZhbCIsKCk9Pnt9KTtkZWZhdWx0OnJldHVybiBVJChgdHlwZSMkeyQudHlwZUlkfWAsKCk9Pnt9KX19TDAoKTtmdW5jdGlvbiBJNCgkLFgpe3JldHVybiBHWihYLCQpfWZ1bmN0aW9uIEdaKCQsWCl7aWYoUi5pc0xpc3QoWCkpcmV0dXJuIGtxKCQsWCk7aWYoUi5pc01hcChYKSlyZXR1cm4ganEoJCxYKTtpZihSLmlzU3RydWN0KFgpKXJldHVybiBTcSgkLFgpO2lmKFIuaXNEZWNpbWFsKFgpKXJldHVybiBScSgkLFgpO2lmKFIuaXNEYXRlKFgpfHxSLmlzVGltZShYKXx8Ui5pc1RpbWVzdGFtcChYKXx8Ui5pc0R1cmF0aW9uKFgpKXtpZihBcShYKT09PTY0KXJldHVybiBBSygkLFgpO3JldHVybiBVcSgkLFgpfWlmKFIuaXNJbnQoWCkmJlguYml0V2lkdGg9PT02NClyZXR1cm4gQUsoJCxYKTtyZXR1cm4gYTgoJCxYKS5kYXRhWzBdfWZ1bmN0aW9uIEFxKCQpe2lmKFIuaXNEYXRlKCQpKXJldHVybiAkLnVuaXQ9PT1KOC5EQVk/MzI6NjQ7aWYoUi5pc1RpbWUoJCkpcmV0dXJuICQuYml0V2lkdGg/PzMyO3JldHVybiA2NH1mdW5jdGlvbiBVcSgkLFgpe2xldCBRPSQubGVuZ3RoLFo9bmV3IEludDMyQXJyYXkoUSksSj1uZXcgVWludDhBcnJheShNYXRoLmNlaWwoUS84KSksWT0wO2ZvcihsZXQgSD0wO0g8UTtIKyspe2xldCBXPSRbSF07aWYoVz09PW51bGx8fFc9PT12b2lkIDApe1krKztjb250aW51ZX1KW0g+PjNdfD0xPDwoSCY3KSxaW0hdPXR5cGVvZiBXPT09ImJpZ2ludCI/TnVtYmVyKFcpOld9cmV0dXJuIEMoe3R5cGU6WCxsZW5ndGg6USxudWxsQml0bWFwOlk+MD9KOnZvaWQgMCxkYXRhOlosbnVsbENvdW50Oll9KX1mdW5jdGlvbiBBSygkLFgpe2xldCBRPSQubGVuZ3RoLFo9bmV3IEJpZ0ludDY0QXJyYXkoUSksSj1uZXcgVWludDhBcnJheShNYXRoLmNlaWwoUS84KSksWT0wO2ZvcihsZXQgVz0wO1c8UTtXKyspe2xldCBQPSRbV107aWYoUD09PW51bGx8fFA9PT12b2lkIDApe1krKztjb250aW51ZX1KW1c+PjNdfD0xPDwoVyY3KSxaW1ddPXR5cGVvZiBQPT09ImJpZ2ludCI/UDpCaWdJbnQoUCl9bGV0IEg9bmV3IEludDMyQXJyYXkoWi5idWZmZXIpO3JldHVybiBDKHt0eXBlOlgsbGVuZ3RoOlEsbnVsbEJpdG1hcDpZPjA/Sjp2b2lkIDAsZGF0YTpILG51bGxDb3VudDpZfSl9ZnVuY3Rpb24gUnEoJCxYKXtsZXQgUT1YLmJ5dGVXaWR0aD8/KFguYml0V2lkdGg/WC5iaXRXaWR0aC84OjE2KSxaPSQubGVuZ3RoLEo9bmV3IFVpbnQ4QXJyYXkoWipRKSxZPW5ldyBVaW50OEFycmF5KE1hdGguY2VpbChaLzgpKSxIPTA7Zm9yKGxldCBXPTA7VzxaO1crKyl7bGV0IFA9JFtXXTtpZihQPT09bnVsbHx8UD09PXZvaWQgMCl7SCsrO2NvbnRpbnVlfVlbVz4+M118PTE8PChXJjcpO2xldCBHO2lmKFAgaW5zdGFuY2VvZiBVaW50OEFycmF5KUc9UDtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhQKSl7bGV0IHE9UDtHPW5ldyBVaW50OEFycmF5KHEuYnVmZmVyLHEuYnl0ZU9mZnNldCxxLmJ5dGVMZW5ndGgpfWVsc2UgRz1PcShDcShQKSxRKTtKLnNldChHLnN1YmFycmF5KDAsUSksVypRKX1yZXR1cm4gQyh7dHlwZTpYLGxlbmd0aDpaLG51bGxCaXRtYXA6SD4wP1k6dm9pZCAwLGRhdGE6bmV3IFVpbnQzMkFycmF5KEouYnVmZmVyLEouYnl0ZU9mZnNldCxKLmJ5dGVMZW5ndGgvNCksbnVsbENvdW50Okh9KX1mdW5jdGlvbiBDcSgkKXtyZXR1cm4gdHlwZW9mICQ9PT0iYmlnaW50Ij8kOkJpZ0ludChNYXRoLnRydW5jKE51bWJlcigkKSkpfWZ1bmN0aW9uIE9xKCQsWCl7bGV0IFE9bmV3IFVpbnQ4QXJyYXkoWCksWj0kO2lmKFo8MG4pWj0oMW48PEJpZ0ludChYKjgpKStaO2ZvcihsZXQgSj0wO0o8WDtKKyspUVtKXT1OdW1iZXIoWiYweGZmbiksWj4+PThuO3JldHVybiBRfWZ1bmN0aW9uIGtxKCQsWCl7bGV0IFE9WC5jaGlsZHJlblswXSxaPSQubGVuZ3RoLEo9bmV3IEludDMyQXJyYXkoWisxKSxZPVtdLEg9bmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKFovOCkpLFc9MDtmb3IobGV0IEc9MDtHPFo7RysrKXtKW0ddPVkubGVuZ3RoO2xldCBxPSRbR107aWYocT09bnVsbClXKys7ZWxzZXtIW0c+PjNdfD0xPDwoRyY3KTtsZXQgTD1BcnJheS5pc0FycmF5KHEpP3E6dHlwZW9mIHFbU3ltYm9sLml0ZXJhdG9yXT09PSJmdW5jdGlvbiI/QXJyYXkuZnJvbShxKTpudWxsO2lmKEwpZm9yKGxldCBOIG9mIEwpWS5wdXNoKE4pfX1KW1pdPVkubGVuZ3RoO2xldCBQPVkubGVuZ3RoPjA/R1ooWSxRLnR5cGUpOktRKFEudHlwZSk7cmV0dXJuIEMoe3R5cGU6WCxsZW5ndGg6WixudWxsQ291bnQ6VyxudWxsQml0bWFwOlc+MD9IOnZvaWQgMCxjaGlsZDpQLG9mZnNldDowLHZhbHVlT2Zmc2V0czpKfSl9ZnVuY3Rpb24ganEoJCxYKXtsZXQgUT0kLmxlbmd0aCxaPVguY2hpbGRyZW5bMF0sSj1aLnR5cGUuY2hpbGRyZW5bMF0sWT1aLnR5cGUuY2hpbGRyZW5bMV0sSD1uZXcgSW50MzJBcnJheShRKzEpLFc9W10sUD1bXSxHPW5ldyBVaW50OEFycmF5KE1hdGguY2VpbChRLzgpKSxxPTA7Zm9yKGxldCBrPTA7azxRO2srKyl7SFtrXT1XLmxlbmd0aDtsZXQgUz0kW2tdO2lmKFM9PW51bGwpcSsrO2Vsc2V7R1trPj4zXXw9MTw8KGsmNyk7bGV0IHM9QXJyYXkuaXNBcnJheShTKT9TOlMgaW5zdGFuY2VvZiBNYXA/QXJyYXkuZnJvbShTLmVudHJpZXMoKSk6dHlwZW9mIFNbU3ltYm9sLml0ZXJhdG9yXT09PSJmdW5jdGlvbiI/QXJyYXkuZnJvbShTKTp0eXBlb2YgUz09PSJvYmplY3QiP09iamVjdC5lbnRyaWVzKFMpOltdO2ZvcihsZXRbUDgsRDhdb2YgcylXLnB1c2goUDgpLFAucHVzaChEOCl9fUhbUV09Vy5sZW5ndGg7bGV0IEw9Vy5sZW5ndGg+MD9HWihXLEoudHlwZSk6S1EoSi50eXBlKSxOPVAubGVuZ3RoPjA/R1ooUCxZLnR5cGUpOktRKFkudHlwZSksVT1DKHt0eXBlOloudHlwZSxsZW5ndGg6Vy5sZW5ndGgsY2hpbGRyZW46W0wsTl0sbnVsbENvdW50OjB9KTtyZXR1cm4gQyh7dHlwZTpYLGxlbmd0aDpRLG51bGxDb3VudDpxLG51bGxCaXRtYXA6cT4wP0c6dm9pZCAwLGNoaWxkOlUsb2Zmc2V0OjAsdmFsdWVPZmZzZXRzOkh9KX1mdW5jdGlvbiBTcSgkLFgpe2xldCBRPVguY2hpbGRyZW4sWj0kLmxlbmd0aCxKPW5ldyBVaW50OEFycmF5KE1hdGguY2VpbChaLzgpKSxZPTAsSD1RLm1hcCgoKT0+W10pO2ZvcihsZXQgUD0wO1A8WjtQKyspe2xldCBHPSRbUF07aWYoRz09bnVsbCl7WSsrO2ZvcihsZXQgcT0wO3E8US5sZW5ndGg7cSsrKUhbcV0ucHVzaChudWxsKX1lbHNle0pbUD4+M118PTE8PChQJjcpO2ZvcihsZXQgcT0wO3E8US5sZW5ndGg7cSsrKXtsZXQgTD1RW3FdLm5hbWU7SFtxXS5wdXNoKEdbTF0/P0dbcV0/P251bGwpfX19bGV0IFc9US5tYXAoKFAsRyk9PkdaKEhbR10sUC50eXBlKSk7cmV0dXJuIEMoe3R5cGU6WCxsZW5ndGg6WixudWxsQ291bnQ6WSxudWxsQml0bWFwOlk+MD9KOnZvaWQgMCxjaGlsZHJlbjpXfSl9ZnVuY3Rpb24gS1EoJCl7aWYoUi5pc0xpc3QoJCkpcmV0dXJuIEMoe3R5cGU6JCxsZW5ndGg6MCxudWxsQ291bnQ6MCxjaGlsZDpLUSgkLmNoaWxkcmVuWzBdLnR5cGUpLHZhbHVlT2Zmc2V0czpuZXcgSW50MzJBcnJheShbMF0pfSk7aWYoUi5pc01hcCgkKSlyZXR1cm4gQyh7dHlwZTokLGxlbmd0aDowLG51bGxDb3VudDowLGNoaWxkOktRKCQuY2hpbGRyZW5bMF0udHlwZSksdmFsdWVPZmZzZXRzOm5ldyBJbnQzMkFycmF5KFswXSl9KTtpZihSLmlzU3RydWN0KCQpKXtsZXQgWD0kLmNoaWxkcmVuLm1hcCgoUSk9PktRKFEudHlwZSkpO3JldHVybiBDKHt0eXBlOiQsbGVuZ3RoOjAsbnVsbENvdW50OjAsY2hpbGRyZW46WH0pfXJldHVybiBDKHt0eXBlOiQsbGVuZ3RoOjAsbnVsbENvdW50OjB9KX1mdW5jdGlvbiB3MCgkLFgsUSl7bGV0IFo9WCxKPVo/LmRhdGE/LlswXTtyZXR1cm4gd3EoJCxaLEosUSl9ZnVuY3Rpb24gRHEoJCxYLFEpe2lmKHR5cGVvZiAkPy5pc1ZhbGlkPT09ImZ1bmN0aW9uIilyZXR1cm4gJC5pc1ZhbGlkKFEpO2xldCBaPVg/Lm51bGxCaXRtYXA7aWYoWiYmWi5sZW5ndGg+MClyZXR1cm4oWltRPj4zXT4+KFEmNykmMSk9PT0xO3JldHVybiEwfWZ1bmN0aW9uIHdxKCQsWCxRLFope2lmKCFEcShYLFEsWikpcmV0dXJuIG51bGw7c3dpdGNoKCQudHlwZUlkKXtjYXNlIDE6cmV0dXJuIG51bGw7Y2FzZSA2OnJldHVybiBYLmdldChaKTtjYXNlIDI6e2xldCBZPSQuYml0V2lkdGg/PzMyLEg9UT8udmFsdWVzPy5bWl07aWYoWT09PTY0KXJldHVybiB0eXBlb2YgSD09PSJiaWdpbnQiP0g6QmlnSW50KEgpO3JldHVybiBOdW1iZXIoSCl9Y2FzZSAzOnJldHVybiBOdW1iZXIoUT8udmFsdWVzPy5bWl0pO2Nhc2UgNTpjYXNlIDIwOnJldHVybiBTdHJpbmcoWC5nZXQoWikpO2Nhc2UgNDpjYXNlIDE5OmNhc2UgMTU6cmV0dXJuIFZxKFguZ2V0KFopKTtjYXNlIDc6cmV0dXJuIEJxKCQsUSxaKTtjYXNlIDg6e2xldCBZPVE/LnZhbHVlcz8uW1pdO2lmKCQudW5pdD09PUo4LkRBWSlyZXR1cm4gTnVtYmVyKFkpO3JldHVybiB0eXBlb2YgWT09PSJiaWdpbnQiP1k6QmlnSW50KFkpfWNhc2UgOTp7bGV0IFk9UT8udmFsdWVzPy5bWl07aWYoKCQuYml0V2lkdGg/PzMyKT09PTY0KXJldHVybiB0eXBlb2YgWT09PSJiaWdpbnQiP1k6QmlnSW50KFkpO3JldHVybiBOdW1iZXIoWSl9Y2FzZSAxMDpjYXNlIDE4OntsZXQgWT1RPy52YWx1ZXM/LltaXTtyZXR1cm4gdHlwZW9mIFk9PT0iYmlnaW50Ij9ZOkJpZ0ludChZKX1jYXNlIDEzOnJldHVybiBfcSgkLFgsWik7Y2FzZSAxNDpyZXR1cm4gVHEoJCxYLFEsWik7Y2FzZSAxMjpjYXNlIDE2OnJldHVybiB4cSgkLFgsUSxaKTtjYXNlIDE3OnJldHVybiBncSgkLFgsUSxaKTtjYXNlLTE6cmV0dXJuIHZxKCQsWCxRLFopO2RlZmF1bHQ6cmV0dXJuIFguZ2V0KFopfX1mdW5jdGlvbiBWcSgkKXtpZigkPT1udWxsKXJldHVybiBudWxsO2lmKCQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiAkO2lmKEFycmF5QnVmZmVyLmlzVmlldygkKSl7bGV0IFg9JDtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWC5idWZmZXIsWC5ieXRlT2Zmc2V0LFguYnl0ZUxlbmd0aCl9cmV0dXJuICR9ZnVuY3Rpb24gQnEoJCxYLFEpe2xldCBaPSQuYnl0ZVdpZHRoPz8oJC5iaXRXaWR0aD8kLmJpdFdpZHRoLzg6MTYpLEo9WC52YWx1ZXMsWT1aLzQsSD1RKlksVz1uZXcgVWludDhBcnJheShaKTtmb3IobGV0IFA9MDtQPFk7UCsrKXtsZXQgRz1KW0grUF0+Pj4wO1dbUCo0XT1HJjI1NSxXW1AqNCsxXT1HPj4+OCYyNTUsV1tQKjQrMl09Rz4+PjE2JjI1NSxXW1AqNCszXT1HPj4+MjQmMjU1fXJldHVybiBJcShXKX1mdW5jdGlvbiBJcSgkKXtsZXQgWD0wbjtmb3IobGV0IFE9JC5sZW5ndGgtMTtRPj0wO1EtLSlYPVg8PDhufEJpZ0ludCgkW1FdKTtpZigkWyQubGVuZ3RoLTFdJjEyOClYLT0xbjw8QmlnSW50KCQubGVuZ3RoKjgpO3JldHVybiBYfWZ1bmN0aW9uIF9xKCQsWCxRKXtsZXQgWj0kLmNoaWxkcmVuLEo9e307Zm9yKGxldCBZPTA7WTxaLmxlbmd0aDtZKyspe2xldCBIPVpbWV0sVz10eXBlb2YgWC5nZXRDaGlsZEF0PT09ImZ1bmN0aW9uIj9YLmdldENoaWxkQXQoWSk6WC5jaGlsZHJlbj8uW1ldO2lmKCFXKXtKW0gubmFtZV09bnVsbDtjb250aW51ZX1KW0gubmFtZV09dzAoSC50eXBlLFcsUSl9cmV0dXJuIEp9ZnVuY3Rpb24gVHEoJCxYLFEsWil7bGV0IEo9JC5jaGlsZHJlbixZPVE/LnR5cGVJZHMsSD1ZP1lbWl06Si5sZW5ndGg+MD8wOi0xLFc9JC50eXBlSWRUb0NoaWxkSW5kZXgsUD1XJiZXW0hdIT09dm9pZCAwP1dbSF06SCxHPUpbUF07aWYoIUcpcmV0dXJue3RhZzpudWxsLHZhbHVlOm51bGx9O2xldCBxPVE/LnZhbHVlT2Zmc2V0cyxMPXE/cVtaXTpaLE49dHlwZW9mIFguZ2V0Q2hpbGRBdD09PSJmdW5jdGlvbiI/WC5nZXRDaGlsZEF0KFApOlguY2hpbGRyZW4/LltQXSxVPU4/dzAoRy50eXBlLE4sTCk6bnVsbDtyZXR1cm57dGFnOkcubmFtZSx2YWx1ZTpVfX1mdW5jdGlvbiB4cSgkLFgsUSxaKXtsZXQgSj0kLmNoaWxkcmVuWzBdLFk9dHlwZW9mIFguZ2V0Q2hpbGRBdD09PSJmdW5jdGlvbiI/WC5nZXRDaGlsZEF0KDApOlguY2hpbGRyZW4/LlswXSxIPVE/LnZhbHVlT2Zmc2V0cyxXLFA7aWYoSClXPUhbWl0sUD1IW1orMV07ZWxzZXtsZXQgcT0kLmxpc3RTaXplPz8wO1c9WipxLFA9VytxfWxldCBHPVtdO2ZvcihsZXQgcT1XO3E8UDtxKyspRy5wdXNoKHcwKEoudHlwZSxZLHEpKTtyZXR1cm4gR31mdW5jdGlvbiBncSgkLFgsUSxaKXtsZXQgSj0kLmNoaWxkcmVuWzBdLFk9Si50eXBlLmNoaWxkcmVuWzBdLEg9Si50eXBlLmNoaWxkcmVuWzFdLFc9UT8udmFsdWVPZmZzZXRzLFA9dHlwZW9mIFguZ2V0Q2hpbGRBdD09PSJmdW5jdGlvbiI/WC5nZXRDaGlsZEF0KDApOlguY2hpbGRyZW4/LlswXSxHPVAmJih0eXBlb2YgUC5nZXRDaGlsZEF0PT09ImZ1bmN0aW9uIj9QLmdldENoaWxkQXQoMCk6UC5jaGlsZHJlbj8uWzBdKSxxPVAmJih0eXBlb2YgUC5nZXRDaGlsZEF0PT09ImZ1bmN0aW9uIj9QLmdldENoaWxkQXQoMSk6UC5jaGlsZHJlbj8uWzFdKSxMPVc/V1taXTowLE49Vz9XW1orMV06MCxVPVtdO2ZvcihsZXQgaz1MO2s8TjtrKyspVS5wdXNoKFt3MChZLnR5cGUsRyxrKSx3MChILnR5cGUscSxrKV0pO3JldHVybiBVfWZ1bmN0aW9uIHZxKCQsWCxRLFope2xldCBKPSQuZGljdGlvbmFyeTtpZihRJiZRLmRpY3Rpb25hcnkmJlEudmFsdWVzKXtsZXQgWT1OdW1iZXIoUS52YWx1ZXNbWl0pLEg9US5kaWN0aW9uYXJ5O3JldHVybiB3MChKLEgsWSl9cmV0dXJuIFguZ2V0KFopfWZ1bmN0aW9uIFVIKCQsWCl7cmV0dXJuIGE4KCQsWCkuZGF0YVswXX1mdW5jdGlvbiBSJCgkLFgpe2xldCBRPVg7aWYoJC5sZW5ndGg9PT0wKXJldHVybiBhJChRKTtsZXQgWj17fTtmb3IobGV0IEogb2YgUS5maWVsZHMpWltKLm5hbWVdPSQubWFwKChZKT0+WVtKLm5hbWVdPz9udWxsKTtyZXR1cm4gdDgoWixRKX1mdW5jdGlvbiB0OCgkLFgsUT0icmljaCIpe2xldCBaPVgsSj1aLmZpZWxkcy5sZW5ndGg+MD8kW1ouZmllbGRzWzBdLm5hbWVdPy5sZW5ndGg/PzA6MCxZPVouZmllbGRzLm1hcCgoUCk9PntsZXQgRz0kW1AubmFtZV07aWYoIUcpcmV0dXJuIEMoe3R5cGU6UC50eXBlLGxlbmd0aDpKLG51bGxDb3VudDpKfSk7bGV0IHE9bTAoUC50eXBlKSxMPVE9PT0icmF3Ij9xLnJhd1RvQ2Fub25pY2FsOnEucmljaFRvQ2Fub25pY2FsLE49Ry5tYXAoKFUpPT5MLmNhbGwocSxVKSk7cmV0dXJuIEk0KFAudHlwZSxOKX0pLEg9bmV3IGwoWi5maWVsZHMpLFc9Qyh7dHlwZTpILGxlbmd0aDpKLGNoaWxkcmVuOlksbnVsbENvdW50OjB9KTtyZXR1cm4gbmV3IGcoWixXKX1mdW5jdGlvbipOMCgkLFg9InJpY2giKXtsZXQgUT0kLFo9US5zY2hlbWEuZmllbGRzLm1hcCgoSik9Pm0wKEoudHlwZSkpO2ZvcihsZXQgSj0wO0o8US5udW1Sb3dzO0orKyl7bGV0IFk9e307Zm9yKGxldCBIPTA7SDxRLnNjaGVtYS5maWVsZHMubGVuZ3RoO0grKyl7bGV0IFc9US5zY2hlbWEuZmllbGRzW0hdLFA9US5nZXRDaGlsZChXLm5hbWUpO2lmKCFQKXtZW1cubmFtZV09bnVsbDtjb250aW51ZX1sZXQgRz13MChXLnR5cGUsUCxKKSxxPVpbSF07WVtXLm5hbWVdPVg9PT0icmF3Ij9xLmNhbm9uaWNhbFRvUmF3KEcpOnEuY2Fub25pY2FsVG9SaWNoKEcpfXlpZWxkIFl9fWZ1bmN0aW9uIHo2KCQpe2lmKCEkKXJldHVybnt9O2xldCBYPSQ7aWYoWC5udW1Sb3dzPT09MClyZXR1cm57fTtsZXQgUT17fTtmb3IobGV0IFogb2YgWC5zY2hlbWEuZmllbGRzKXtsZXQgSj1YLmdldENoaWxkKFoubmFtZSk7aWYoSil7bGV0IFk9Wi50eXBlLEg9dzAoWSxKLDApO1FbWi5uYW1lXT1tMChZKS5jYW5vbmljYWxUb1JpY2goSCl9fXJldHVybiBRfWZ1bmN0aW9uIF80KCQsWD0wKXtpZigkJiZ0eXBlb2YgJD09PSJvYmplY3QiJiYiZGljdGlvbmFyeSJpbiAkJiYidmFsdWVzImluICQmJnR5cGVvZiAkLmRpY3Rpb25hcnk/LmdldD09PSJmdW5jdGlvbiIpe2xldCBRPSQsWj1RLm51bGxCaXRtYXA7aWYoWiYmWi5sZW5ndGg+MCl7aWYoKFpbWD4+M10+PihYJjcpJjEpPT09MClyZXR1cm4gbnVsbH1sZXQgSj1OdW1iZXIoUS52YWx1ZXNbWF0pO3JldHVybiAkLmRpY3Rpb25hcnkuZ2V0KEopfXJldHVybiAkfWZ1bmN0aW9uIFQ0KCQpe2lmKCEkKXJldHVybnt9O2xldCBYPSQ7aWYoWC5udW1Sb3dzPT09MClyZXR1cm57fTtsZXQgUT17fTtmb3IobGV0IFogb2YgWC5zY2hlbWEuZmllbGRzKXtsZXQgSj1YLmdldENoaWxkKFoubmFtZSk7aWYoSil7bGV0IFk9Wi50eXBlLEg9bTAoWSkuY2Fub25pY2FsVG9SaWNoKHcwKFksSiwwKSksVz1aLm5hbWUsUDtpZihaLm5hbWUuc3RhcnRzV2l0aCgic2VjcmV0XyIpKXtsZXQgRz1aLm1ldGFkYXRhPy5nZXQ/Ligic2VjcmV0X3R5cGUiKTtpZihHKVc9RyxQPVoubWV0YWRhdGE/LmdldD8uKCJzY29wZSIpPz92b2lkIDB9aWYoSCYmdHlwZW9mIEg9PT0ib2JqZWN0IiYmIUFycmF5QnVmZmVyLmlzVmlldyhIKSl7bGV0IEc9ey4uLkh9O2lmKFcgaW4gUSl0aHJvdyBFcnJvcihgYmF0Y2hUb1NlY3JldERpY3Q6IGR1cGxpY2F0ZSBzZWNyZXRfdHlwZSAnJHtXfScgKHNjb3BlPSR7UD8/Im5vbmUifSkuIFVzZSBzY29wZWQgc2VjcmV0cyB3aXRoIGRpc3RpbmN0IHNjb3BlcyB0byBhdm9pZCBjb2xsaXNpb25zLmApO2lmKFFbV109RyxQKVFbYCR7V306JHtQfWBdPUd9ZWxzZSBpZihIPT09bnVsbHx8SD09PXZvaWQgMCk7ZWxzZSBRW1ddPXt9fX1yZXR1cm4gUX1mdW5jdGlvbiBxWigkKXtpZih0eXBlb2YgJD09PSJiaWdpbnQiKXJldHVybiBOdW1iZXIoJCk7cmV0dXJuICR9ZnVuY3Rpb24gelooJCxYKXtsZXQgUT0kLFo9US5udW1Sb3dzLEo9MDtmb3IobGV0IFc9MDtXPFo7VysrKWlmKFhbV10pSisrO2lmKEo9PT1aKXJldHVybiBRO2lmKEo9PT0wKXJldHVybiBhJChRLnNjaGVtYSk7bGV0IFk9W107Zm9yKGxldCBXPTA7VzxaO1crKylpZihYW1ddKVkucHVzaChXKTtsZXQgSD17fTtmb3IobGV0IFcgb2YgUS5zY2hlbWEuZmllbGRzKXtsZXQgUD1RLmdldENoaWxkKFcubmFtZSksRz1XLnR5cGUscT1tMChHKTtIW1cubmFtZV09WS5tYXAoKEwpPT5xLmNhbm9uaWNhbFRvUmljaCh3MChHLFAsTCkpKX1yZXR1cm4gdDgoSCxRLnNjaGVtYSl9TDAoKTtmdW5jdGlvbiBVSygkLFgsUSl7Zm9yKGxldCBaIG9mIFgpe2lmKFo8LTEpdGhyb3cgRXJyb3IoYCR7JH06IHVuZXhwZWN0ZWQgbmVnYXRpdmUgcHJvamVjdGlvbiBJRCAke1p9IChvbmx5IC0xIGZvciByb3dfaWQgaXMgYWxsb3dlZClgKTtpZihaPj1RKWNvbnNvbGUud2FybihgJHskfTogcHJvamVjdGlvbiBJRCAke1p9IGlzIG91dCBvZiBib3VuZHMgKHNjaGVtYSBoYXMgJHtRfSBmaWVsZHMpLCBpZ25vcmluZ2ApfXJldHVybiBYLmZpbHRlcigoWik9Plo+PTAmJlo8USl9ZnVuY3Rpb24gUFEoJCxYKXtsZXQgUT1YO2lmKCEkKXJldHVybiBRO2xldCBaPVVLKCJwcm9qZWN0U2NoZW1hIiwkLFEuZmllbGRzLmxlbmd0aCk7aWYoWi5sZW5ndGg9PT0wKXJldHVybiBRO3JldHVybiBuZXcgQihaLm1hcCgoSik9PlEuZmllbGRzW0pdKSl9ZnVuY3Rpb24gRVooJCxYKXtsZXQgUT1YO2lmKCEkKXJldHVybiBRO2xldCBaPVVLKCJwcm9qZWN0QmF0Y2giLCQsUS5zY2hlbWEuZmllbGRzLmxlbmd0aCk7aWYoWi5sZW5ndGg9PT0wKXJldHVybiBRO2xldCBKPVBRKCQsUS5zY2hlbWEpLFk9Wi5tYXAoKFApPT57cmV0dXJuIFEuZ2V0Q2hpbGRBdChQKS5kYXRhWzBdfSksSD1uZXcgbChKLmZpZWxkcyksVz1DKHt0eXBlOkgsbGVuZ3RoOlEubnVtUm93cyxjaGlsZHJlbjpZLG51bGxDb3VudDowfSk7cmV0dXJuIG5ldyBnKEosVyl9TDAoKTtmdW5jdGlvbiBSSCgkLFgpe2xldCBRPSQ7cmV0dXJuIG5ldyBnKFEuc2NoZW1hLFEuZGF0YSxYKX1MMCgpO2Z1bmN0aW9uIHQkKCQpe2xldCBYPW5ldyBaJDtyZXR1cm4gWC5yZXNldCh2b2lkIDAsJCksWC5jbG9zZSgpLFgudG9VaW50OEFycmF5KCEwKX1mdW5jdGlvbiBlJCgkKXtsZXQgWD1BOC5mcm9tKCQpLFE9Wy4uLlhdO2lmKFEubGVuZ3RoPjApcmV0dXJuIFFbMF0uc2NoZW1hO2lmKFguc2NoZW1hKXJldHVybiBYLnNjaGVtYTt0aHJvdyBFcnJvcigiQ2Fubm90IGRlc2VyaWFsaXplIHNjaGVtYSBmcm9tIGVtcHR5IElQQyBzdHJlYW0iKX1mdW5jdGlvbiB5OCgkKXtsZXQgWD0kLFE9bmV3IFokO3JldHVybiBRLnJlc2V0KHZvaWQgMCxYLnNjaGVtYSksUS5fd3JpdGVSZWNvcmRCYXRjaChYKSxRLmNsb3NlKCksUS50b1VpbnQ4QXJyYXkoITApfWZ1bmN0aW9uIEYwKCQpe2xldCBYPUE4LmZyb20oJCksUT1bLi4uWF07aWYoUS5sZW5ndGg9PT0wKXtsZXQgWj1YLnNjaGVtYT8/bmV3IEIoW10pO3JldHVybiBhJChaKX1yZXR1cm4gUVswXX1MMCgpO2Z1bmN0aW9uIGhxKCQpe2xldCBYPSQ7cmV0dXJuWyQudHlwZUlkLFgudW5pdD8/IiIsWC5iaXRXaWR0aD8/IiIsWC5wcmVjaXNpb24/PyIiLFguc2NhbGU/PyIiLFguYnl0ZVdpZHRoPz8iIl0uam9pbigiOiIpfWZ1bmN0aW9uIEU2KCQsWCl7bGV0IFE9WDtpZihRLnR5cGVJZD09PTEpcmV0dXJuIEMoe3R5cGU6USxsZW5ndGg6JC5sZW5ndGgsbnVsbENvdW50OiQubGVuZ3RofSk7bGV0IFo9bTAoWCksSj0kLm1hcCgoWSk9PloucmljaFRvQ2Fub25pY2FsKFkpKTtyZXR1cm4gSTQoWCxKKX1mdW5jdGlvbiBDSCgkKXtpZigkLmxlbmd0aD09PTApe2xldCBOPW5ldyB3KCIwIixuZXcgTzgsITApLFU9bmV3IFIxKFswXSxbTl0pLGs9Qyh7dHlwZTpVLGxlbmd0aDowLHR5cGVJZHM6bmV3IEludDhBcnJheSgwKSxjaGlsZHJlbjpbQyh7dHlwZTpuZXcgTzgsbGVuZ3RoOjAsbnVsbENvdW50OjB9KV19KSxTPUMoe3R5cGU6VSxsZW5ndGg6MCx0eXBlSWRzOm5ldyBJbnQ4QXJyYXkoMCksY2hpbGRyZW46W0Moe3R5cGU6bmV3IE84LGxlbmd0aDowLG51bGxDb3VudDowfSldfSk7cmV0dXJuIFJLKFtdLGssUyxbXSxbXSxbXSxbXSxbXSxVKX1sZXQgWD1bXSxRPW5ldyBNYXAsWj1bXTtmb3IobGV0IE4gb2YgJCl7bGV0IFU9aHEoTi5hcnJvd1R5cGUpLGs9US5nZXQoVSk7aWYoaz09PXZvaWQgMClrPVgubGVuZ3RoLFEuc2V0KFUsayksWC5wdXNoKE4uYXJyb3dUeXBlKTtaLnB1c2goayl9bGV0IEo9W10sWT1bXSxIPVtdLFc9W107Zm9yKGxldFtOLFVdb2YgWC5lbnRyaWVzKCkpe0oucHVzaChuZXcgdyhTdHJpbmcoTiksVSwhMCkpLFcucHVzaChOKTtsZXQgaz0kLm1hcCgocyxQOCk9PlpbUDhdPT09Tj9zLm1pbjpudWxsKSxTPSQubWFwKChzLFA4KT0+WltQOF09PT1OP3MubWF4Om51bGwpO1kucHVzaChFNihrLFUpKSxILnB1c2goRTYoUyxVKSl9bGV0IFA9bmV3IFIxKFcsSiksRz1JbnQ4QXJyYXkuZnJvbShaKSxxPUMoe3R5cGU6UCxsZW5ndGg6JC5sZW5ndGgsdHlwZUlkczpHLGNoaWxkcmVuOll9KSxMPUMoe3R5cGU6UCxsZW5ndGg6JC5sZW5ndGgsdHlwZUlkczpHLGNoaWxkcmVuOkh9KTtyZXR1cm4gUksoJC5tYXAoKE4pPT5OLmNvbHVtbk5hbWUpLHEsTCwkLm1hcCgoTik9Pk4uaGFzTnVsbCksJC5tYXAoKE4pPT5OLmhhc05vdE51bGwpLCQubWFwKChOKT0+Ti5kaXN0aW5jdENvdW50PT1udWxsP251bGw6QmlnSW50KE4uZGlzdGluY3RDb3VudCkpLCQubWFwKChOKT0+Ti5jb250YWluc1VuaWNvZGUpLCQubWFwKChOKT0+Ti5tYXhTdHJpbmdMZW5ndGg9PW51bGw/bnVsbDpCaWdJbnQoTi5tYXhTdHJpbmdMZW5ndGgpKSxQKX1mdW5jdGlvbiBSSygkLFgsUSxaLEosWSxILFcsUCl7bGV0IEc9bmV3IEIoW25ldyB3KCJjb2x1bW5fbmFtZSIsbmV3IF84LCExKSxuZXcgdygibWluIixQLCEwKSxuZXcgdygibWF4IixQLCEwKSxuZXcgdygiaGFzX251bGwiLG5ldyBTOCwhMSksbmV3IHcoImhhc19ub3RfbnVsbCIsbmV3IFM4LCExKSxuZXcgdygiZGlzdGluY3RfY291bnQiLG5ldyBiOCwhMCksbmV3IHcoImNvbnRhaW5zX3VuaWNvZGUiLG5ldyBTOCwhMCksbmV3IHcoIm1heF9zdHJpbmdfbGVuZ3RoIixuZXcgRSQsITApXSkscT0kLmxlbmd0aCxMPVtFNigkLG5ldyBfOCksWCxRLEU2KFosbmV3IFM4KSxFNihKLG5ldyBTOCksRTYoWSxuZXcgYjgpLEU2KEgsbmV3IFM4KSxFNihXLG5ldyBFJCldLE49bmV3IGwoRy5maWVsZHMpLFU9Qyh7dHlwZTpOLGxlbmd0aDpxLGNoaWxkcmVuOkwsbnVsbENvdW50OjB9KTtyZXR1cm4gbmV3IGcoRyxVKX12YXIgQ0s9e25hbWU6ImFycm93LWpzIn07ZnVuY3Rpb24gT0goJCl7cmV0dXJuICR9dmFye1RpbWVVbml0OmpILERhdGVVbml0OnlxLEludGVydmFsVW5pdDptcSxVbmlvbk1vZGU6ZnEsc2NoZW1hOkZ9PWtIO2Z1bmN0aW9uIEsoJCxYLFEsWil7cmV0dXJuIE4xKCQsWCxRLFopfXZhciBNWj0oKT0+TDQoKSxfPSgpPT5ONCgpO3ZhciBmMD0oKT0+SFEoKSxHUT0oKT0+UVooKSxlOD0oKT0+WlooKTt2YXIgTFo9KCk9Pk80KCksej0oKT0+azQoKSxNPSgpPT5qNCgpO3ZhciBUaz17WyRYLlNFQ09ORF06InMiLFskWC5NSUxMSVNFQ09ORF06Im1zIixbJFguTUlDUk9TRUNPTkRdOiJ1cyIsWyRYLk5BTk9TRUNPTkRdOiJucyJ9O2Z1bmN0aW9uIFNIKCQsWCl7cmV0dXJuIFM0KCQsWD8/bnVsbCl9ZnVuY3Rpb24gZigkKXtyZXR1cm4gRDQoJCl9ZnVuY3Rpb24gRjEoJCl7cmV0dXJuIEhaKCQpfWZ1bmN0aW9uIGIwKCQsWCxRKXtyZXR1cm4gdzQoJCxYLFEpfWZ1bmN0aW9uIHAwKCQsWCxRLFope3JldHVybiBWNCgkLFgsUSxaKX1jbGFzcyBNNntwb3NpdGlvbmFsO25hbWVkO2FyZ3VtZW50c1NjaGVtYTtjb25zdHJ1Y3RvcigkPVtdLFg9bmV3IE1hcCxRPW51bGwpe3RoaXMucG9zaXRpb25hbD0kLHRoaXMubmFtZWQ9WCx0aGlzLmFyZ3VtZW50c1NjaGVtYT1RfWdldCgkLFgpe2lmKHR5cGVvZiAkPT09Im51bWJlciIpe2lmKCQ8dGhpcy5wb3NpdGlvbmFsLmxlbmd0aCl7bGV0IFE9dGhpcy5wb3NpdGlvbmFsWyRdO2lmKFE9PT1udWxsfHxRPT09dm9pZCAwKXJldHVybiBYIT09dm9pZCAwP1g6bnVsbDtyZXR1cm4gT0soUSl9aWYoWCE9PXZvaWQgMClyZXR1cm4gWDt0aHJvdyBFcnJvcihgUG9zaXRpb25hbCBhcmd1bWVudCAkeyR9IG5vdCBmb3VuZGApfWlmKHRoaXMubmFtZWQuaGFzKCQpKXtsZXQgUT10aGlzLm5hbWVkLmdldCgkKTtpZihRPT09bnVsbHx8UT09PXZvaWQgMClyZXR1cm4gWCE9PXZvaWQgMD9YOm51bGw7cmV0dXJuIE9LKFEpfWlmKFghPT12b2lkIDApcmV0dXJuIFg7dGhyb3cgRXJyb3IoYE5hbWVkIGFyZ3VtZW50ICckeyR9JyBub3QgZm91bmRgKX1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMucG9zaXRpb25hbC5sZW5ndGh9fWZ1bmN0aW9uIE9LKCQpe2lmKCQ9PT1udWxsfHwkPT09dm9pZCAwKXJldHVybiBudWxsO2lmKHR5cGVvZiAkIT09Im9iamVjdCIpcmV0dXJuICQ7aWYodHlwZW9mICQudmFsdWVPZj09PSJmdW5jdGlvbiIpe2xldCBYO3RyeXtYPSQudmFsdWVPZigpfWNhdGNoe3JldHVybiAkfWlmKHR5cGVvZiBYPT09ImJpZ2ludCIpe2lmKFg+PU51bWJlci5NSU5fU0FGRV9JTlRFR0VSJiZYPD1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUilyZXR1cm4gTnVtYmVyKFgpO3JldHVybiBYfXJldHVybiBYfXJldHVybiAkfXZhciBESDsoKFopPT57Wi5TQ0FMQVI9InNjYWxhciI7Wi5UQUJMRT0idGFibGUiO1ouQUdHUkVHQVRFPSJhZ2dyZWdhdGUifSkoREh8fD17fSk7dmFyIGtLPSJ2Z2lfYXJnIixqSz0ibmFtZWQiLFNLPSJ2Z2lfdHlwZSIsREs9InRhYmxlIix3Sz0iYW55IixWSz0idmdpX3ZhcmFyZ3MiLEJLPSJ0cnVlIixJSz0idmdpX2NvbnN0IixfSz0idHJ1ZSIsVEs9InZnaV9kb2MiLHhLPSJ2Z2lfZGVmYXVsdCIsZ0s9InZnaV9jaG9pY2VzIix2Sz0idmdpX3JhbmdlIixoSz0idmdpX3BhdHRlcm4iO2Z1bmN0aW9uIEowKCQpe2lmKCQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiAkO2lmKCQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcilyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoJCk7aWYodHlwZW9mIEJ1ZmZlcjwidSImJkJ1ZmZlci5pc0J1ZmZlcigkKSlyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoJCk7aWYoJCYmJC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcilyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoJC5idWZmZXIsJC5ieXRlT2Zmc2V0LCQuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyBVaW50OEFycmF5KDApfWZ1bmN0aW9uIHFRKCQpe2lmKHR5cGVvZiAkPT09InN0cmluZyIpcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgkKTtsZXQgWD1KMCgkKTtpZihYLmxlbmd0aD09PTAmJiQhPW51bGwpdGhyb3cgRXJyb3IoYENhbm5vdCBjb252ZXJ0ICR7dHlwZW9mICR9IHRvIFVpbnQ4QXJyYXlgKTtyZXR1cm4gWH1mdW5jdGlvbiBOWigkLFgpe2xldCBRPXt9O2ZvcihsZXQgWiBvZiAkLmZpZWxkcyl7bGV0IEo9WFtaLm5hbWVdO2lmKEY2KFoudHlwZSkmJloudHlwZS5iaXRXaWR0aD09PTY0JiZ0eXBlb2YgSj09PSJudW1iZXIiKUo9QmlnSW50KEopO1FbWi5uYW1lXT1bSl19cmV0dXJuIHQ4KFEsJCl9ZnVuY3Rpb24gbUsoJCl7bGV0IFg9W10sUT17fTtmb3IobGV0IFc9MDtXPCQucG9zaXRpb25hbC5sZW5ndGg7VysrKXtsZXQgUD0kLnBvc2l0aW9uYWxbV10sRz1gcG9zaXRpb25hbF8ke1d9YDtYLnB1c2goSyhHLHlLKFApLCEwKSksUVtHXT1QfWZvcihsZXRbVyxQXW9mICQubmFtZWQpe2xldCBHPWBuYW1lZF8ke1d9YDtYLnB1c2goSyhHLHlLKFApLCEwKSksUVtHXT1QfWxldCBaPUYxKFgpLEo9RihbSygiYXJncyIsWiwhMCldKSxZPXt9O2ZvcihsZXQgVyBvZiBYKXtsZXQgUD1RW1cubmFtZV07aWYoRjYoVy50eXBlKSYmVy50eXBlLmJpdFdpZHRoPT09NjQmJnR5cGVvZiBQPT09Im51bWJlciIpUD1CaWdJbnQoUCk7WVtXLm5hbWVdPVB9bGV0IEg9dDgoe2FyZ3M6W1ldfSxKKTtyZXR1cm4geTgoSCl9ZnVuY3Rpb24geUsoJCl7aWYoJD09PW51bGx8fCQ9PT12b2lkIDApcmV0dXJuIE1aKCk7aWYodHlwZW9mICQ9PT0ic3RyaW5nIilyZXR1cm4geigpO2lmKHR5cGVvZiAkPT09ImJvb2xlYW4iKXJldHVybiBfKCk7aWYodHlwZW9mICQ9PT0ibnVtYmVyIilyZXR1cm4gZTgoKTtpZih0eXBlb2YgJD09PSJiaWdpbnQiKXJldHVybiBlOCgpO2lmKCQgaW5zdGFuY2VvZiBVaW50OEFycmF5fHwkIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpcmV0dXJuIE0oKTtyZXR1cm4geigpfXZhciBmSz1GKFtLKCJmdW5jdGlvbl9uYW1lIix6KCksITEpLEsoImFyZ3VtZW50cyIsTSgpLCExKSxLKCJmdW5jdGlvbl90eXBlIix6KCksITEpLEsoImlucHV0X3NjaGVtYSIsTSgpLCEwKSxLKCJzZXR0aW5ncyIsTSgpLCEwKSxLKCJzZWNyZXRzIixNKCksITApLEsoImF0dGFjaF9vcGFxdWVfZGF0YSIsTSgpLCEwKSxLKCJ0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YSIsTSgpLCEwKSxLKCJyZXNvbHZlZF9zZWNyZXRzX3Byb3ZpZGVkIixfKCksITEpLEsoImF0X3VuaXQiLHooKSwhMCksSygiYXRfdmFsdWUiLHooKSwhMCksSygic2NoZW1hX25hbWUiLHooKSwhMCldKSxwcT1GMShbSygiZm9ybWF0Iix6KCksITEpLEsoImZpbGVfcGF0aCIseigpLCExKSxLKCJleHBlY3RlZF9zY2hlbWEiLE0oKSwhMSldKSxjcT1LKCJjb3B5X2Zyb20iLHBxLCEwKSx1cT1GMShbSygiZm9ybWF0Iix6KCksITEpLEsoImZpbGVfcGF0aCIseigpLCExKV0pLGRxPUsoImNvcHlfdG8iLHVxLCEwKSxMUz1GKFtLKCJvdXRwdXRfc2NoZW1hIixNKCksITEpLEsoIm9wYXF1ZV9kYXRhIixNKCksITApLEsoImxvb2t1cF9zZWNyZXRfdHlwZXMiLGYoSygiaXRlbSIseigpLCEwKSksITEpLEsoImxvb2t1cF9zY29wZXMiLGYoSygiaXRlbSIseigpLCEwKSksITEpLEsoImxvb2t1cF9uYW1lcyIsZihLKCJpdGVtIix6KCksITApKSwhMSldKTtmdW5jdGlvbiBGWigkKXtsZXQgWD17ZnVuY3Rpb25fbmFtZTokLmZ1bmN0aW9uX25hbWUsYXJndW1lbnRzOm1LKCQuYXJndW1lbnRzKSxmdW5jdGlvbl90eXBlOiQuZnVuY3Rpb25fdHlwZSxpbnB1dF9zY2hlbWE6JC5pbnB1dF9zY2hlbWE/dCQoJC5pbnB1dF9zY2hlbWEpOm51bGwsc2V0dGluZ3M6JC5zZXR0aW5ncz95OCgkLnNldHRpbmdzKTpudWxsLHNlY3JldHM6JC5zZWNyZXRzP3k4KCQuc2VjcmV0cyk6bnVsbCxhdHRhY2hfb3BhcXVlX2RhdGE6JC5hdHRhY2hfb3BhcXVlX2RhdGE/P251bGwsdHJhbnNhY3Rpb25fb3BhcXVlX2RhdGE6JC50cmFuc2FjdGlvbl9vcGFxdWVfZGF0YT8/bnVsbCxyZXNvbHZlZF9zZWNyZXRzX3Byb3ZpZGVkOiQucmVzb2x2ZWRfc2VjcmV0c19wcm92aWRlZD8/ITEsYXRfdW5pdDokLmF0X3VuaXQ/P251bGwsYXRfdmFsdWU6JC5hdF92YWx1ZT8/bnVsbCxzY2hlbWFfbmFtZTokLnNjaGVtYV9uYW1lPz9udWxsfSxRPVtdO2lmKCQuY29weV9mcm9tKVEucHVzaChjcSksWC5jb3B5X2Zyb209e2Zvcm1hdDokLmNvcHlfZnJvbS5mb3JtYXQsZmlsZV9wYXRoOiQuY29weV9mcm9tLmZpbGVfcGF0aCxleHBlY3RlZF9zY2hlbWE6dCQoJC5jb3B5X2Zyb20uZXhwZWN0ZWRfc2NoZW1hKX07aWYoJC5jb3B5X3RvKVEucHVzaChkcSksWC5jb3B5X3RvPXtmb3JtYXQ6JC5jb3B5X3RvLmZvcm1hdCxmaWxlX3BhdGg6JC5jb3B5X3RvLmZpbGVfcGF0aH07aWYoUS5sZW5ndGg+MCl7bGV0IFo9RihbLi4uZksuZmllbGRzLC4uLlFdKTtyZXR1cm4gTlooWixYKX1yZXR1cm4gTlooZkssWCl9ZnVuY3Rpb24gd0goJCl7bGV0IFg9KFEpPT57aWYoIVEpcmV0dXJuW107cmV0dXJuKEFycmF5LmlzQXJyYXkoUSk/UTpbLi4uUV0pLmZpbHRlcigoSik9PkohPW51bGwpLm1hcChTdHJpbmcpfTtyZXR1cm57b3V0cHV0X3NjaGVtYTplJChxUSgkLm91dHB1dF9zY2hlbWEpKSxvcGFxdWVfZGF0YTokLm9wYXF1ZV9kYXRhP3FRKCQub3BhcXVlX2RhdGEpOm51bGwsbG9va3VwX3NlY3JldF90eXBlczpYKCQubG9va3VwX3NlY3JldF90eXBlcyksbG9va3VwX3Njb3BlczpYKCQubG9va3VwX3Njb3BlcyksbG9va3VwX25hbWVzOlgoJC5sb29rdXBfbmFtZXMpfX12YXIgbnE9RihbSygiYmluZF9jYWxsIixNKCksITEpLEsoIm91dHB1dF9zY2hlbWEiLE0oKSwhMSksSygiYmluZF9vcGFxdWVfZGF0YSIsTSgpLCEwKSxLKCJwcm9qZWN0aW9uX2lkcyIsZihLKCJpdGVtIixlOCgpLCExKSksITApLEsoInB1c2hkb3duX2ZpbHRlcnMiLE0oKSwhMCksSygiam9pbl9rZXlzIixmKEsoIml0ZW0iLE0oKSwhMCkpLCExKSxLKCJwaGFzZSIseigpLCEwKSxLKCJleGVjdXRpb25faWQiLE0oKSwhMCksSygiaW5pdF9vcGFxdWVfZGF0YSIsTSgpLCEwKSxLKCJzdWJzdHJlYW1faWQiLE0oKSwhMCksSygib3JkZXJfYnlfY29sdW1uX25hbWUiLHooKSwhMCksSygib3JkZXJfYnlfZGlyZWN0aW9uIix6KCksITApLEsoIm9yZGVyX2J5X251bGxfb3JkZXIiLHooKSwhMCksSygib3JkZXJfYnlfbGltaXQiLGU4KCksITApLEsoInRhYmxlc2FtcGxlX3BlcmNlbnRhZ2UiLExaKCksITApLEsoInRhYmxlc2FtcGxlX3NlZWQiLGU4KCksITApLEsoImZpbmFsaXplX3N0YXRlX2lkIixNKCksITApXSksQ1M9RihbSygiZXhlY3V0aW9uX2lkIixNKCksITEpLEsoIm9wYXF1ZV9kYXRhIixNKCksITApLEsoIm1heF93b3JrZXJzIixlOCgpLCExKV0pO2Z1bmN0aW9uIFZIKCQpe2xldCBYPUZaKCQuYmluZF9jYWxsKSxaPXtiaW5kX2NhbGw6eTgoWCksb3V0cHV0X3NjaGVtYTp0JCgkLm91dHB1dF9zY2hlbWEpLGJpbmRfb3BhcXVlX2RhdGE6JC5iaW5kX29wYXF1ZV9kYXRhPz9udWxsLHByb2plY3Rpb25faWRzOiQucHJvamVjdGlvbl9pZHM/Lm1hcCgoSik9PkJpZ0ludChKKSk/P251bGwscHVzaGRvd25fZmlsdGVyczokLnB1c2hkb3duX2ZpbHRlcnM/eTgoJC5wdXNoZG93bl9maWx0ZXJzKTpudWxsLGpvaW5fa2V5czooJC5qb2luX2tleXM/P1tdKS5tYXAoKEopPT55OChKKSkscGhhc2U6JC5waGFzZT8/bnVsbCxleGVjdXRpb25faWQ6JC5leGVjdXRpb25faWQ/P251bGwsaW5pdF9vcGFxdWVfZGF0YTokLmluaXRfb3BhcXVlX2RhdGE/P251bGwsc3Vic3RyZWFtX2lkOiQuc3Vic3RyZWFtX2lkPz9udWxsLG9yZGVyX2J5X2NvbHVtbl9uYW1lOiQub3JkZXJfYnlfY29sdW1uX25hbWU/P251bGwsb3JkZXJfYnlfZGlyZWN0aW9uOiQub3JkZXJfYnlfZGlyZWN0aW9uPz9udWxsLG9yZGVyX2J5X251bGxfb3JkZXI6JC5vcmRlcl9ieV9udWxsX29yZGVyPz9udWxsLG9yZGVyX2J5X2xpbWl0OiQub3JkZXJfYnlfbGltaXQ/P251bGwsdGFibGVzYW1wbGVfcGVyY2VudGFnZTokLnRhYmxlc2FtcGxlX3BlcmNlbnRhZ2U/P251bGwsdGFibGVzYW1wbGVfc2VlZDokLnRhYmxlc2FtcGxlX3NlZWQ/P251bGwsZmluYWxpemVfc3RhdGVfaWQ6JC5maW5hbGl6ZV9zdGF0ZV9pZD8/bnVsbH07cmV0dXJuIE5aKG5xLFopfWZ1bmN0aW9uIEJIKCQpe3JldHVybntleGVjdXRpb25faWQ6cVEoJC5leGVjdXRpb25faWQpLG9wYXF1ZV9kYXRhOiQub3BhcXVlX2RhdGE/cVEoJC5vcGFxdWVfZGF0YSk6bnVsbCxtYXhfd29ya2VyczpOdW1iZXIoJC5tYXhfd29ya2Vycyl9fWZ1bmN0aW9uIFpYKCQsWCl7bGV0IFE9RjAoWCk7aWYoUS5udW1Sb3dzPT09MCl7bGV0IEo9JC5maWVsZHMubWFwKChZKT0+WS5uYW1lKS5qb2luKCIsIik7dGhyb3cgRXJyb3IoYGRlY29kZUFTRDogZW1wdHkgYmF0Y2ggKGV4cGVjdGVkIDEgcm93IGZvciAke0p9KWApfWxldCBaPXt9O2ZvcihsZXQgSiBvZiAkLmZpZWxkcyl7bGV0IFk9US5nZXRDaGlsZChKLm5hbWUpLEg9WT9ZLmdldCgwKTpudWxsO1pbSi5uYW1lXT1JSChILEoudHlwZSl9cmV0dXJuIFp9ZnVuY3Rpb24gSUgoJCxYKXtpZigkPT1udWxsKXJldHVybiBudWxsO2lmKGk0KFgpKXtsZXQgUT1YLmNoaWxkcmVuWzBdLnR5cGUsWj1bXTtmb3IobGV0IEogb2YgJClaLnB1c2goSUgoSixRKSk7cmV0dXJuIFp9aWYodDQoWCkpe2xldCBRPXt9O2lmKCRbU3ltYm9sLml0ZXJhdG9yXSl7Zm9yKGxldCBaIG9mICQpaWYoQXJyYXkuaXNBcnJheShaKSlRW1N0cmluZyhaWzBdKV09U3RyaW5nKFpbMV0/PyIiKTtlbHNlIGlmKFomJnR5cGVvZiBaPT09Im9iamVjdCIpe2xldCBKPVoua2V5Pz9aWzBdLFk9Wi52YWx1ZT8/WlsxXTtRW1N0cmluZyhKKV09WT09bnVsbD8iIjpTdHJpbmcoWSl9fWVsc2UgaWYodHlwZW9mICQ9PT0ib2JqZWN0Iilmb3IobGV0W1osSl1vZiBPYmplY3QuZW50cmllcygkKSlRW1N0cmluZyhaKV09Sj09bnVsbD8iIjpTdHJpbmcoSik7cmV0dXJuIFF9aWYoYTQoWCkpe2xldCBRPVguY2hpbGRyZW4sWj17fTtmb3IobGV0IEogb2YgUSlaW0oubmFtZV09SUgoJFtKLm5hbWVdLEoudHlwZSk7cmV0dXJuIFp9aWYoZTQoWCkpcmV0dXJuICQ9PW51bGw/bnVsbDpTdHJpbmcoJCk7aWYoczQoWCkpcmV0dXJuIG9xKCQpO2lmKEY2KFgpJiZYLmJpdFdpZHRoPT09NjQpe2lmKHR5cGVvZiAkPT09ImJpZ2ludCIpe2lmKCQ+PUJpZ0ludChOdW1iZXIuTUlOX1NBRkVfSU5URUdFUikmJiQ8PUJpZ0ludChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikpcmV0dXJuIE51bWJlcigkKTtyZXR1cm4gJH1yZXR1cm4gJH1pZihyNChYKSlyZXR1cm4gQm9vbGVhbigkKTtyZXR1cm4gJH1mdW5jdGlvbiBvcSgkKXtpZigkIGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gJDtpZigkIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpcmV0dXJuIG5ldyBVaW50OEFycmF5KCQpO2lmKCQmJiQuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpcmV0dXJuIG5ldyBVaW50OEFycmF5KCQuYnVmZmVyLCQuYnl0ZU9mZnNldCwkLmJ5dGVMZW5ndGgpO3JldHVybiBuZXcgVWludDhBcnJheSgwKX12YXIgYks9RihbSygibmFtZSIseigpLCExKSxLKCJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIix6KCksITApLEsoImRhdGFfdmVyc2lvbl9zcGVjIix6KCksITApLEsoImF0dGFjaF9vcHRpb25fc3BlY3MiLGYoSygiaXRlbSIsTSgpLCEwKSksITEpLEsoInJlbGVhc2VzIixmKEsoIml0ZW0iLEYxKFtLKCJ2ZXJzaW9uIix6KCksITEpLEsoInJlbGVhc2VkX2F0IixTSChqSC5NSUNST1NFQ09ORCwiVVRDIiksITEpLEsoInN1bW1hcnkiLHooKSwhMSksSygibm90ZXNfdXJsIix6KCksITApXSksITApKSwhMSksSygic291cmNlX3VybCIseigpLCEwKV0pLHBLPUYoW0soImNvbW1lbnQiLHooKSwhMCksSygidGFncyIsYjAoSygia2V5Iix6KCksITEpLEsoInZhbHVlIix6KCksITApLCExKSwhMSksSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITEpLEsoIm5hbWUiLHooKSwhMSksSygiZXN0aW1hdGVkX29iamVjdF9jb3VudCIsYjAoSygia2V5Iix6KCksITEpLEsoInZhbHVlIixlOCgpLCEwKSwhMSksITApXSksY0s9RihbSygiY29tbWVudCIseigpLCEwKSxLKCJ0YWdzIixiMChLKCJrZXkiLHooKSwhMSksSygidmFsdWUiLHooKSwhMCksITEpLCExKSxLKCJuYW1lIix6KCksITEpLEsoInNjaGVtYV9uYW1lIix6KCksITEpLEsoImNvbHVtbnMiLE0oKSwhMSksSygibm90X251bGxfY29uc3RyYWludHMiLGYoSygiaXRlbSIsR1EoKSwhMCkpLCExKSxLKCJ1bmlxdWVfY29uc3RyYWludHMiLGYoSygiaXRlbSIsZihLKCJpdGVtIixHUSgpLCEwKSksITApKSwhMSksSygiY2hlY2tfY29uc3RyYWludHMiLGYoSygiaXRlbSIseigpLCEwKSksITEpLEsoInByaW1hcnlfa2V5X2NvbnN0cmFpbnRzIixmKEsoIml0ZW0iLGYoSygiaXRlbSIsR1EoKSwhMCkpLCEwKSksITEpLEsoImZvcmVpZ25fa2V5X2NvbnN0cmFpbnRzIixmKEsoIml0ZW0iLE0oKSwhMCkpLCExKSxLKCJzdXBwb3J0c19pbnNlcnQiLF8oKSwhMSksSygic3VwcG9ydHNfdXBkYXRlIixfKCksITEpLEsoInN1cHBvcnRzX2RlbGV0ZSIsXygpLCExKSxLKCJzdXBwb3J0c19yZXR1cm5pbmciLF8oKSwhMSksSygic3VwcG9ydHNfY29sdW1uX3N0YXRpc3RpY3MiLF8oKSwhMSksSygic2Nhbl9mdW5jdGlvbiIsTSgpLCExKSxLKCJpbnNlcnRfZnVuY3Rpb24iLE0oKSwhMSksSygidXBkYXRlX2Z1bmN0aW9uIixNKCksITEpLEsoImRlbGV0ZV9mdW5jdGlvbiIsTSgpLCExKSxLKCJjYXJkaW5hbGl0eV9lc3RpbWF0ZSIsZTgoKSwhMSksSygiY2FyZGluYWxpdHlfbWF4IixlOCgpLCExKSxLKCJjb2x1bW5fc3RhdGlzdGljcyIsTSgpLCExKSxLKCJiaW5kX3Jlc3VsdCIsTSgpLCExKSxLKCJyZXF1aXJlZF9maWx0ZXJzIixmKEsoIml0ZW0iLGYoSygiaXRlbSIseigpLCEwKSksITApKSwhMSldKSx1Sz1GKFtLKCJjb21tZW50Iix6KCksITApLEsoInRhZ3MiLGIwKEsoImtleSIseigpLCExKSxLKCJ2YWx1ZSIseigpLCEwKSwhMSksITEpLEsoIm5hbWUiLHooKSwhMSksSygic2NoZW1hX25hbWUiLHooKSwhMSksSygiZGVmaW5pdGlvbiIseigpLCExKSxLKCJjb2x1bW5fY29tbWVudHMiLGIwKEsoImtleSIseigpLCExKSxLKCJ2YWx1ZSIseigpLCEwKSwhMSksITEpXSksZEs9RihbSygiY29tbWVudCIseigpLCEwKSxLKCJ0YWdzIixiMChLKCJrZXkiLHooKSwhMSksSygidmFsdWUiLHooKSwhMCksITEpLCExKSxLKCJuYW1lIix6KCksITEpLEsoInNjaGVtYV9uYW1lIix6KCksITEpLEsoImZ1bmN0aW9uX3R5cGUiLHAwKHooKSxmMCgpKSwhMSksSygiYXJndW1lbnRzIixNKCksITEpLEsoIm91dHB1dF9zY2hlbWEiLE0oKSwhMSksSygic3RhYmlsaXR5IixwMCh6KCksZjAoKSksITApLEsoIm51bGxfaGFuZGxpbmciLHAwKHooKSxmMCgpKSwhMCksSygiZGVzY3JpcHRpb24iLHooKSwhMSksSygiZXhhbXBsZXMiLGYoSygiaXRlbSIsRjEoW0soInNxbCIseigpLCExKSxLKCJkZXNjcmlwdGlvbiIseigpLCExKSxLKCJleHBlY3RlZF9vdXRwdXQiLHooKSwhMCldKSwhMCkpLCExKSxLKCJjYXRlZ29yaWVzIixmKEsoIml0ZW0iLHooKSwhMCkpLCExKSxLKCJwcm9qZWN0aW9uX3B1c2hkb3duIixfKCksITApLEsoImZpbHRlcl9wdXNoZG93biIsXygpLCEwKSxLKCJzYW1wbGluZ19wdXNoZG93biIsXygpLCEwKSxLKCJsYXRlX21hdGVyaWFsaXphdGlvbiIsXygpLCEwKSxLKCJzdXBwb3J0ZWRfZXhwcmVzc2lvbl9maWx0ZXJzIixmKEsoIml0ZW0iLHooKSwhMCkpLCExKSxLKCJvcmRlcl9wcmVzZXJ2YXRpb24iLHAwKHooKSxmMCgpKSwhMCksSygibWF4X3dvcmtlcnMiLEdRKCksITEpLEsoInN1cHBvcnRzX2JhdGNoX2luZGV4IixfKCksITEpLEsoInBhcnRpdGlvbl9raW5kIixwMCh6KCksZjAoKSksITEpLEsoIm9yZGVyX2RlcGVuZGVudCIscDAoeigpLGYwKCkpLCExKSxLKCJkaXN0aW5jdF9kZXBlbmRlbnQiLHAwKHooKSxmMCgpKSwhMSksSygic3VwcG9ydHNfd2luZG93IixfKCksITEpLEsoInN0cmVhbWluZ19wYXJ0aXRpb25lZCIsXygpLCExKSxLKCJoYXNfZmluYWxpemUiLF8oKSwhMSksSygic291cmNlX29yZGVyX2RlcGVuZGVudCIsXygpLCExKSxLKCJzaW5rX29yZGVyX2RlcGVuZGVudCIsXygpLCExKSxLKCJyZXF1aXJlc19pbnB1dF9iYXRjaF9pbmRleCIsXygpLCExKSxLKCJpbnB1dF9mcm9tX2FyZ3MiLF8oKSwhMSksSygicmVxdWlyZWRfc2V0dGluZ3MiLGYoSygiaXRlbSIseigpLCEwKSksITEpLEsoInJlcXVpcmVkX3NlY3JldHMiLGYoSygiaXRlbSIsRjEoW0soInNlY3JldF90eXBlIix6KCksITEpLEsoInNjb3BlIix6KCksITApLEsoInNlY3JldF9uYW1lIix6KCksITApXSksITApKSwhMSldKSxsSz1GKFtLKCJjb21tZW50Iix6KCksITApLEsoInRhZ3MiLGIwKEsoImtleSIseigpLCExKSxLKCJ2YWx1ZSIseigpLCEwKSwhMSksITEpLEsoIm5hbWUiLHooKSwhMSksSygic2NoZW1hX25hbWUiLHooKSwhMSksSygibWFjcm9fdHlwZSIscDAoeigpLGYwKCkpLCExKSxLKCJwYXJhbWV0ZXJzIixmKEsoIml0ZW0iLHooKSwhMCkpLCExKSxLKCJwYXJhbWV0ZXJfZGVmYXVsdF92YWx1ZXMiLE0oKSwhMSksSygiZGVmaW5pdGlvbiIseigpLCExKSxLKCJhcmd1bWVudHNfc2NoZW1hIixNKCksITEpXSksc3E9RihbSygiY29tbWVudCIseigpLCEwKSxLKCJ0YWdzIixiMChLKCJrZXkiLHooKSwhMSksSygidmFsdWUiLHooKSwhMCksITEpLCExKSxLKCJuYW1lIix6KCksITEpLEsoInNjaGVtYV9uYW1lIix6KCksITEpLEsoInRhYmxlX25hbWUiLHooKSwhMSksSygiaW5kZXhfdHlwZSIseigpLCExKSxLKCJjb25zdHJhaW50X3R5cGUiLHAwKHooKSxmMCgpKSwhMSksSygiZXhwcmVzc2lvbnMiLGYoSygiaXRlbSIseigpLCEwKSksITEpLEsoIm9wdGlvbnMiLGIwKEsoImtleSIseigpLCExKSxLKCJ2YWx1ZSIseigpLCEwKSwhMSksITEpXSksbVM9RihbSygiY29tbWVudCIseigpLCEwKSxLKCJ0YWdzIixiMChLKCJrZXkiLHooKSwhMSksSygidmFsdWUiLHooKSwhMCksITEpLCExKSxLKCJmb3JtYXRfbmFtZSIseigpLCExKSxLKCJoYW5kbGVyIix6KCksITEpLEsoIm9wdGlvbnMiLE0oKSwhMSksSygiZGlyZWN0aW9uIix6KCksITEpLEsoImRlc2NyaXB0aW9uIix6KCksITEpLEsoIm9yZGVyZWQiLF8oKSwhMSldKSxmUz1GKFtLKCJmdW5jdGlvbl9uYW1lIix6KCksITEpLEsoImFyZ3VtZW50cyIsTSgpLCExKSxLKCJyZXF1aXJlZF9leHRlbnNpb25zIixmKEsoIml0ZW0iLHooKSwhMCkpLCExKV0pLGJTPUYoW0soImJyYW5jaGVzIixmKEsoIml0ZW0iLE0oKSwhMCkpLCExKSxLKCJyZXF1aXJlZF9leHRlbnNpb25zIixmKEsoIml0ZW0iLHooKSwhMCkpLCExKV0pLHBTPUYoW0soImZ1bmN0aW9uX25hbWUiLHooKSwhMSksSygiYXJndW1lbnRzIixNKCksITEpLEsoImJyYW5jaF9maWx0ZXIiLHooKSwhMCksSygid3JpdGFibGUiLF8oKSwhMSksSygic291cmNlX2NhdGFsb2ciLHooKSwhMCksSygic291cmNlX3NjaGVtYSIseigpLCEwKSxLKCJzb3VyY2VfdGFibGUiLHooKSwhMCldKSxjUz1GKFtLKCJhbGlhcyIseigpLCExKSxLKCJ0YXJnZXQiLHooKSwhMSksSygiZGJfdHlwZSIseigpLCExKSxLKCJvcHRpb25zIixiMChLKCJrZXkiLHooKSwhMSksSygidmFsdWUiLHooKSwhMCksITEpLCExKSxLKCJoaWRkZW4iLF8oKSwhMSksSygicmVxdWlyZWQiLF8oKSwhMSksSygic2VjcmV0X3JlZiIseigpLCExKV0pLHVTPUYoW0soIm91dHB1dF9zY2hlbWEiLE0oKSwhMSksSygiZXhlY3V0aW9uX2lkIixNKCksITEpXSksZFM9RihbXSksbFM9RihbXSksblM9RihbSygicmVzdWx0X2JhdGNoIixNKCksITEpXSksb1M9RihbSygicmVzdWx0X2JhdGNoIixNKCksITEpXSksc1M9RihbXSksclM9RihbSygiZXhlY3V0aW9uX2lkIixNKCksITEpXSksaVM9RihbXSksYVM9RihbSygicmVzdWx0X2JhdGNoIixNKCksITEpXSksdFM9RihbSygicmVzdWx0X2JhdGNoIixNKCksITEpXSksZVM9RihbXSksJEQ9RihbXSksWEQ9RihbSygib3V0cHV0X3NjaGVtYSIsTSgpLCExKSxLKCJvcGFxdWVfZGF0YSIsTSgpLCExKSxLKCJsb29rdXBfc2VjcmV0X3R5cGVzIixmKEsoIml0ZW0iLHooKSwhMCkpLCExKSxLKCJsb29rdXBfc2NvcGVzIixmKEsoIml0ZW0iLHooKSwhMCkpLCExKSxLKCJsb29rdXBfbmFtZXMiLGYoSygiaXRlbSIseigpLCEwKSksITEpXSksUUQ9RihbSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITEpLEsoInN1cHBvcnRzX3RyYW5zYWN0aW9ucyIsXygpLCExKSxLKCJzdXBwb3J0c190aW1lX3RyYXZlbCIsXygpLCExKSxLKCJjYXRhbG9nX3ZlcnNpb25fZnJvemVuIixfKCksITEpLEsoImNhdGFsb2dfdmVyc2lvbiIsZTgoKSwhMSksSygiYXR0YWNoX29wYXF1ZV9kYXRhX3JlcXVpcmVkIixfKCksITEpLEsoImRlZmF1bHRfc2NoZW1hIix6KCksITEpLEsoInNldHRpbmdzIixmKEsoIml0ZW0iLE0oKSwhMCkpLCExKSxLKCJzZWNyZXRfdHlwZXMiLGYoSygiaXRlbSIsTSgpLCEwKSksITEpLEsoImF0dGFjaF9jYXRhbG9ncyIsZihLKCJpdGVtIixNKCksITApKSwhMSksSygiY29tbWVudCIseigpLCEwKSxLKCJ0YWdzIixiMChLKCJrZXkiLHooKSwhMSksSygidmFsdWUiLHooKSwhMCksITEpLCExKSxLKCJzdXBwb3J0c19jb2x1bW5fc3RhdGlzdGljcyIsXygpLCExKSxLKCJnbG9iYWxfZnVuY3Rpb25zIixmKEsoIml0ZW0iLE0oKSwhMCkpLCExKSxLKCJnbG9iYWxfZnVuY3Rpb25fcHJlZml4Iix6KCksITEpLEsoInJlc29sdmVkX2RhdGFfdmVyc2lvbiIseigpLCEwKSxLKCJyZXNvbHZlZF9pbXBsZW1lbnRhdGlvbl92ZXJzaW9uIix6KCksITApXSksWkQ9RihbSygiaXRlbXMiLGYoSygiaXRlbSIsTSgpLCEwKSksITEpXSksSkQ9RihbSygiaXRlbXMiLGYoSygiaXRlbSIsTSgpLCEwKSksITEpXSksWUQ9RihbSygiaXRlbXMiLGYoSygiaXRlbSIsTSgpLCEwKSksITEpXSksSEQ9RihbSygiaXRlbXMiLGYoSygiaXRlbSIsTSgpLCEwKSksITEpXSksV0Q9RihbSygiaXRlbXMiLGYoSygiaXRlbSIsTSgpLCEwKSksITEpXSksS0Q9RihbSygiaXRlbXMiLGYoSygiaXRlbSIsTSgpLCEwKSksITEpXSksUEQ9RihbSygiaXRlbXMiLGYoSygiaXRlbSIsTSgpLCEwKSksITEpXSksR0Q9RihbSygiaXRlbXMiLGYoSygiaXRlbSIsTSgpLCEwKSksITEpXSkscUQ9RihbSygiaXRlbXMiLGYoSygiaXRlbSIsTSgpLCEwKSksITEpXSksekQ9RihbSygiaXRlbXMiLGYoSygiaXRlbSIsTSgpLCEwKSksITEpXSksRUQ9RihbSygiaXRlbXMiLGYoSygiaXRlbSIsTSgpLCEwKSksITEpXSksTUQ9RihbSygiaXRlbXMiLGYoSygiaXRlbSIsTSgpLCEwKSksITEpXSksTEQ9RihbSygidHJhbnNhY3Rpb25fb3BhcXVlX2RhdGEiLE0oKSwhMCldKSxORD1GKFtLKCJ2ZXJzaW9uIixlOCgpLCExKV0pLEZEPUYoW0soIml0ZW1zIixmKEsoIml0ZW0iLE0oKSwhMCkpLCExKV0pLEFEPUYoW0soImZpbmFsaXplX3N0YXRlX2lkcyIsZihLKCJpdGVtIixNKCksITApKSwhMSldKSxVRD1GKFtdKSxSRD1GKFtLKCJzdGF0ZV9pZCIsTSgpLCExKV0pLENEPUYoW0soImVzdGltYXRlIixlOCgpLCEwKSxLKCJtYXgiLGU4KCksITApXSksT0Q9RihbSygia2V5cyIsZihLKCJpdGVtIix6KCksITApKSwhMSksSygidmFsdWVzIixmKEsoIml0ZW0iLHooKSwhMCkpLCExKV0pLGtEPUYoW0soInJlcXVlc3QiLE0oKSwhMSldKSxqRD1GKFtLKCJyZXF1ZXN0IixNKCksITEpXSksU0Q9RihbSygicmVxdWVzdCIsTSgpLCExKV0pLEREPUYoW0soInJlcXVlc3QiLE0oKSwhMSldKSx3RD1GKFtLKCJyZXF1ZXN0IixNKCksITEpXSksVkQ9RihbSygicmVxdWVzdCIsTSgpLCExKV0pLEJEPUYoW0soInJlcXVlc3QiLE0oKSwhMSldKSxJRD1GKFtLKCJyZXF1ZXN0IixNKCksITEpXSksX0Q9RihbSygicmVxdWVzdCIsTSgpLCExKV0pLFREPUYoW0soInJlcXVlc3QiLE0oKSwhMSldKSx4RD1GKFtLKCJyZXF1ZXN0IixNKCksITEpXSksZ0Q9RihbSygicmVxdWVzdCIsTSgpLCExKV0pLHZEPUYoW0soInJlcXVlc3QiLE0oKSwhMSldKSxoRD1GKFtLKCJyZXF1ZXN0IixNKCksITEpXSkseUQ9RihbXSksbUQ9RihbSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITEpLEsoInRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhIixNKCksITApXSksZkQ9RihbSygicmVxdWVzdCIsTSgpLCExKV0pLGJEPUYoW0soImF0dGFjaF9vcGFxdWVfZGF0YSIsTSgpLCExKV0pLHBEPUYoW0soIm5hbWUiLHooKSwhMSldKSxjRD1GKFtLKCJyZXF1ZXN0IixNKCksITEpXSksdUQ9RihbSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITEpLEsoInNjaGVtYV9uYW1lIix6KCksITEpLEsoIm5hbWUiLHooKSwhMSksSygiaWdub3JlX25vdF9mb3VuZCIsXygpLCExKSxLKCJjYXNjYWRlIixfKCksITEpLEsoInRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhIixNKCksITApXSksZEQ9RihbSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITEpLEsoInNjaGVtYV9uYW1lIix6KCksITEpLEsoIm5hbWUiLHooKSwhMSksSygidHJhbnNhY3Rpb25fb3BhcXVlX2RhdGEiLE0oKSwhMCldKSxsRD1GKFtLKCJyZXF1ZXN0IixNKCksITEpXSksbkQ9RihbSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITEpLEsoInNjaGVtYV9uYW1lIix6KCksITEpLEsoIm5hbWUiLHooKSwhMSksSygiaWdub3JlX25vdF9mb3VuZCIsXygpLCExKSxLKCJ0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YSIsTSgpLCEwKV0pLG9EPUYoW0soImF0dGFjaF9vcGFxdWVfZGF0YSIsTSgpLCExKSxLKCJzY2hlbWFfbmFtZSIseigpLCExKSxLKCJuYW1lIix6KCksITEpLEsoInRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhIixNKCksITApXSksc0Q9RihbSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITEpLEsoIm5hbWUiLHooKSwhMSksSygidHlwZSIscDAoeigpLGYwKCkpLCExKSxLKCJ0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YSIsTSgpLCEwKV0pLHJEPUYoW0soImF0dGFjaF9vcGFxdWVfZGF0YSIsTSgpLCExKSxLKCJuYW1lIix6KCksITEpLEsoInRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhIixNKCksITApXSksaUQ9RihbSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITEpLEsoIm5hbWUiLHooKSwhMSksSygidHlwZSIscDAoeigpLGYwKCkpLCExKSxLKCJ0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YSIsTSgpLCEwKV0pLGFEPUYoW0soImF0dGFjaF9vcGFxdWVfZGF0YSIsTSgpLCExKSxLKCJuYW1lIix6KCksITEpLEsoInRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhIixNKCksITApXSksdEQ9RihbSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITEpLEsoIm5hbWUiLHooKSwhMSksSygidHJhbnNhY3Rpb25fb3BhcXVlX2RhdGEiLE0oKSwhMCldKSxlRD1GKFtLKCJhdHRhY2hfb3BhcXVlX2RhdGEiLE0oKSwhMSksSygibmFtZSIseigpLCExKSxLKCJvbl9jb25mbGljdCIscDAoeigpLGYwKCkpLCExKSxLKCJjb21tZW50Iix6KCksITApLEsoInRhZ3MiLGIwKEsoImtleSIseigpLCExKSxLKCJ2YWx1ZSIseigpLCEwKSwhMSksITApLEsoInRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhIixNKCksITApXSksJHc9RihbSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITEpLEsoIm5hbWUiLHooKSwhMSksSygiaWdub3JlX25vdF9mb3VuZCIsXygpLCExKSxLKCJjYXNjYWRlIixfKCksITEpLEsoInRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhIixNKCksITApXSksWHc9RihbSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITEpLEsoIm5hbWUiLHooKSwhMSksSygidHJhbnNhY3Rpb25fb3BhcXVlX2RhdGEiLE0oKSwhMCldKSxRdz1GKFtLKCJhdHRhY2hfb3BhcXVlX2RhdGEiLE0oKSwhMSksSygidHJhbnNhY3Rpb25fb3BhcXVlX2RhdGEiLE0oKSwhMCldKSxadz1GKFtLKCJhdHRhY2hfb3BhcXVlX2RhdGEiLE0oKSwhMSksSygic2NoZW1hX25hbWUiLHooKSwhMSksSygibmFtZSIseigpLCExKSxLKCJjb2x1bW5fZGVmaW5pdGlvbiIsTSgpLCExKSxLKCJpZ25vcmVfbm90X2ZvdW5kIixfKCksITEpLEsoImlmX2NvbHVtbl9ub3RfZXhpc3RzIixfKCksITEpLEsoInRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhIixNKCksITApXSksSnc9RihbSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITEpLEsoInNjaGVtYV9uYW1lIix6KCksITEpLEsoIm5hbWUiLHooKSwhMSksSygiY29sdW1uX25hbWUiLHooKSwhMSksSygiY29tbWVudCIseigpLCEwKSxLKCJpZ25vcmVfbm90X2ZvdW5kIixfKCksITEpLEsoInRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhIixNKCksITApXSksWXc9RihbSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITEpLEsoInNjaGVtYV9uYW1lIix6KCksITEpLEsoIm5hbWUiLHooKSwhMSksSygiY29sdW1uX25hbWUiLHooKSwhMSksSygiaWdub3JlX25vdF9mb3VuZCIsXygpLCExKSxLKCJ0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YSIsTSgpLCEwKV0pLEh3PUYoW0soImF0dGFjaF9vcGFxdWVfZGF0YSIsTSgpLCExKSxLKCJzY2hlbWFfbmFtZSIseigpLCExKSxLKCJuYW1lIix6KCksITEpLEsoImNvbHVtbl9uYW1lIix6KCksITEpLEsoImV4cHJlc3Npb24iLHooKSwhMSksSygiaWdub3JlX25vdF9mb3VuZCIsXygpLCExKSxLKCJ0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YSIsTSgpLCEwKV0pLFd3PUYoW0soImF0dGFjaF9vcGFxdWVfZGF0YSIsTSgpLCExKSxLKCJzY2hlbWFfbmFtZSIseigpLCExKSxLKCJuYW1lIix6KCksITEpLEsoImNvbHVtbl9uYW1lIix6KCksITEpLEsoImlnbm9yZV9ub3RfZm91bmQiLF8oKSwhMSksSygiaWZfY29sdW1uX2V4aXN0cyIsXygpLCExKSxLKCJjYXNjYWRlIixfKCksITEpLEsoInRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhIixNKCksITApXSksS3c9RihbSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITEpLEsoInNjaGVtYV9uYW1lIix6KCksITEpLEsoIm5hbWUiLHooKSwhMSksSygiY29sdW1uX25hbWUiLHooKSwhMSksSygibmV3X2NvbHVtbl9uYW1lIix6KCksITEpLEsoImlnbm9yZV9ub3RfZm91bmQiLF8oKSwhMSksSygidHJhbnNhY3Rpb25fb3BhcXVlX2RhdGEiLE0oKSwhMCldKSxQdz1GKFtLKCJhdHRhY2hfb3BhcXVlX2RhdGEiLE0oKSwhMSksSygic2NoZW1hX25hbWUiLHooKSwhMSksSygibmFtZSIseigpLCExKSxLKCJ0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YSIsTSgpLCEwKV0pLEd3PUYoW0soImF0dGFjaF9vcGFxdWVfZGF0YSIsTSgpLCExKSxLKCJzY2hlbWFfbmFtZSIseigpLCExKSxLKCJuYW1lIix6KCksITEpLEsoImNvbHVtbl9kZWZpbml0aW9uIixNKCksITEpLEsoImV4cHJlc3Npb24iLHooKSwhMCksSygiaWdub3JlX25vdF9mb3VuZCIsXygpLCExKSxLKCJ0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YSIsTSgpLCEwKV0pLHF3PUYoW0soImF0dGFjaF9vcGFxdWVfZGF0YSIsTSgpLCExKSxLKCJzY2hlbWFfbmFtZSIseigpLCExKSxLKCJuYW1lIix6KCksITEpLEsoImNvbW1lbnQiLHooKSwhMCksSygiaWdub3JlX25vdF9mb3VuZCIsXygpLCExKSxLKCJ0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YSIsTSgpLCEwKV0pLHp3PUYoW0soInJlcXVlc3QiLE0oKSwhMSldKSxFdz1GKFtLKCJhdHRhY2hfb3BhcXVlX2RhdGEiLE0oKSwhMSksSygic2NoZW1hX25hbWUiLHooKSwhMSksSygibmFtZSIseigpLCExKSxLKCJ0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YSIsTSgpLCEwKV0pLE13PUYoW0soImF0dGFjaF9vcGFxdWVfZGF0YSIsTSgpLCExKSxLKCJzY2hlbWFfbmFtZSIseigpLCExKSxLKCJuYW1lIix6KCksITEpLEsoImlnbm9yZV9ub3RfZm91bmQiLF8oKSwhMSksSygiY2FzY2FkZSIsXygpLCExKSxLKCJ0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YSIsTSgpLCEwKV0pLEx3PUYoW0soImF0dGFjaF9vcGFxdWVfZGF0YSIsTSgpLCExKSxLKCJzY2hlbWFfbmFtZSIseigpLCExKSxLKCJuYW1lIix6KCksITEpLEsoImF0X3VuaXQiLHooKSwhMCksSygiYXRfdmFsdWUiLHooKSwhMCksSygidHJhbnNhY3Rpb25fb3BhcXVlX2RhdGEiLE0oKSwhMCldKSxOdz1GKFtLKCJhdHRhY2hfb3BhcXVlX2RhdGEiLE0oKSwhMSksSygic2NoZW1hX25hbWUiLHooKSwhMSksSygibmFtZSIseigpLCExKSxLKCJ0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YSIsTSgpLCEwKSxLKCJ3cml0YWJsZV9icmFuY2hfZnVuY3Rpb25fbmFtZSIseigpLCEwKV0pLEZ3PUYoW0soImF0dGFjaF9vcGFxdWVfZGF0YSIsTSgpLCExKSxLKCJzY2hlbWFfbmFtZSIseigpLCExKSxLKCJuYW1lIix6KCksITEpLEsoImNvbHVtbl9uYW1lIix6KCksITEpLEsoImlnbm9yZV9ub3RfZm91bmQiLF8oKSwhMSksSygidHJhbnNhY3Rpb25fb3BhcXVlX2RhdGEiLE0oKSwhMCldKSxBdz1GKFtLKCJhdHRhY2hfb3BhcXVlX2RhdGEiLE0oKSwhMSksSygic2NoZW1hX25hbWUiLHooKSwhMSksSygibmFtZSIseigpLCExKSxLKCJjb2x1bW5fbmFtZSIseigpLCExKSxLKCJpZ25vcmVfbm90X2ZvdW5kIixfKCksITEpLEsoInRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhIixNKCksITApXSksVXc9RihbSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITEpLEsoInNjaGVtYV9uYW1lIix6KCksITEpLEsoIm5hbWUiLHooKSwhMSksSygibmV3X25hbWUiLHooKSwhMSksSygiaWdub3JlX25vdF9mb3VuZCIsXygpLCExKSxLKCJ0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YSIsTSgpLCEwKV0pLFJ3PUYoW0soImF0dGFjaF9vcGFxdWVfZGF0YSIsTSgpLCExKSxLKCJzY2hlbWFfbmFtZSIseigpLCExKSxLKCJuYW1lIix6KCksITEpLEsoImF0X3VuaXQiLHooKSwhMCksSygiYXRfdmFsdWUiLHooKSwhMCksSygidHJhbnNhY3Rpb25fb3BhcXVlX2RhdGEiLE0oKSwhMCldKSxDdz1GKFtLKCJhdHRhY2hfb3BhcXVlX2RhdGEiLE0oKSwhMSksSygic2NoZW1hX25hbWUiLHooKSwhMSksSygibmFtZSIseigpLCExKSxLKCJhdF91bml0Iix6KCksITApLEsoImF0X3ZhbHVlIix6KCksITApLEsoInRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhIixNKCksITApXSksT3c9RihbSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITEpLEsoInNjaGVtYV9uYW1lIix6KCksITEpLEsoIm5hbWUiLHooKSwhMSksSygidHJhbnNhY3Rpb25fb3BhcXVlX2RhdGEiLE0oKSwhMCldKSxrdz1GKFtLKCJhdHRhY2hfb3BhcXVlX2RhdGEiLE0oKSwhMSldKSxqdz1GKFtLKCJhdHRhY2hfb3BhcXVlX2RhdGEiLE0oKSwhMSksSygidHJhbnNhY3Rpb25fb3BhcXVlX2RhdGEiLE0oKSwhMSldKSxTdz1GKFtLKCJhdHRhY2hfb3BhcXVlX2RhdGEiLE0oKSwhMSksSygidHJhbnNhY3Rpb25fb3BhcXVlX2RhdGEiLE0oKSwhMSldKSxEdz1GKFtLKCJhdHRhY2hfb3BhcXVlX2RhdGEiLE0oKSwhMSksSygidHJhbnNhY3Rpb25fb3BhcXVlX2RhdGEiLE0oKSwhMCldKSx3dz1GKFtLKCJhdHRhY2hfb3BhcXVlX2RhdGEiLE0oKSwhMSksSygic2NoZW1hX25hbWUiLHooKSwhMSksSygibmFtZSIseigpLCExKSxLKCJjb21tZW50Iix6KCksITApLEsoImlnbm9yZV9ub3RfZm91bmQiLF8oKSwhMSksSygidHJhbnNhY3Rpb25fb3BhcXVlX2RhdGEiLE0oKSwhMCldKSxWdz1GKFtLKCJhdHRhY2hfb3BhcXVlX2RhdGEiLE0oKSwhMSksSygic2NoZW1hX25hbWUiLHooKSwhMSksSygibmFtZSIseigpLCExKSxLKCJkZWZpbml0aW9uIix6KCksITEpLEsoIm9uX2NvbmZsaWN0IixwMCh6KCksZjAoKSksITEpLEsoInRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhIixNKCksITApXSksQnc9RihbSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITEpLEsoInNjaGVtYV9uYW1lIix6KCksITEpLEsoIm5hbWUiLHooKSwhMSksSygiaWdub3JlX25vdF9mb3VuZCIsXygpLCExKSxLKCJjYXNjYWRlIixfKCksITEpLEsoInRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhIixNKCksITApXSksSXc9RihbSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITEpLEsoInNjaGVtYV9uYW1lIix6KCksITEpLEsoIm5hbWUiLHooKSwhMSksSygidHJhbnNhY3Rpb25fb3BhcXVlX2RhdGEiLE0oKSwhMCldKSxfdz1GKFtLKCJhdHRhY2hfb3BhcXVlX2RhdGEiLE0oKSwhMSksSygic2NoZW1hX25hbWUiLHooKSwhMSksSygibmFtZSIseigpLCExKSxLKCJuZXdfbmFtZSIseigpLCExKSxLKCJpZ25vcmVfbm90X2ZvdW5kIixfKCksITEpLEsoInRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhIixNKCksITApXSksVHc9RihbSygicmVxdWVzdCIsTSgpLCExKV0pLHh3PUYoW0soInJlcXVlc3QiLE0oKSwhMSldKSxndz1GKFtLKCJyZXF1ZXN0IixNKCksITEpXSksdnc9RihbSygicmVxdWVzdCIsTSgpLCExKV0pLGh3PUYoW0soInJlcXVlc3QiLE0oKSwhMSldKSx5dz1GKFtLKCJyZXF1ZXN0IixNKCksITEpXSksbXc9RihbSygicmVxdWVzdCIsTSgpLCExKV0pO3ZhciBfSD0oJCk9PlpYKGJLLCQpO3ZhciBUSD0oJCk9PlpYKGRLLCQpO3ZhciB4ND0oJCk9PlpYKGxLLCQpO3ZhciBnND0oJCk9PlpYKHBLLCQpO3ZhciB2ND0oJCk9PlpYKGNLLCQpO3ZhciBoND0oJCk9PlpYKHVLLCQpO2Z1bmN0aW9uIG5LKCQpe2xldCBYPSQuYXJndW1lbnRzLFE9W10sWj17fTtpZihYIT1udWxsKXtsZXQgSD1GMChKMChYKSk7Zm9yKGxldCBXIG9mIEguc2NoZW1hLmZpZWxkcyl7bGV0IFA9SC5nZXRDaGlsZChXLm5hbWUpLEc9UD9QLmdldCgwKTpudWxsO2lmKFcubmFtZS5zdGFydHNXaXRoKCJhcmdfIikpe2xldCBxPXBhcnNlSW50KFcubmFtZS5zbGljZSg0KSwxMCk7d2hpbGUoUS5sZW5ndGg8PXEpUS5wdXNoKG51bGwpO1FbcV09R31lbHNlIFpbVy5uYW1lXT1HfX1sZXQgSj0kLnJlcXVpcmVkX2V4dGVuc2lvbnMsWT1KPT1udWxsP1tdOihBcnJheS5pc0FycmF5KEopP0o6Wy4uLkpdKS5maWx0ZXIoKEgpPT5IIT1udWxsKS5tYXAoU3RyaW5nKTtyZXR1cm57ZnVuY3Rpb25OYW1lOlN0cmluZygkLmZ1bmN0aW9uX25hbWU/PyIiKSxwb3NpdGlvbmFsQXJndW1lbnRzOlEsbmFtZWRBcmd1bWVudHM6WixyZXF1aXJlZEV4dGVuc2lvbnM6WX19ZnVuY3Rpb24gQVooJCl7cmV0dXJue3JlcXVlc3Q6eTgoJCl9fWZ1bmN0aW9uIFYwKCQpe2xldCBYPUowKCQucmVzdWx0KSxRPUYwKFgpO3JldHVybiB6NihRKX1mdW5jdGlvbiBycSgkKXtpZigkPT09bnVsbClyZXR1cm4gTVooKTtpZih0eXBlb2YgJD09PSJzdHJpbmciKXJldHVybiB6KCk7aWYodHlwZW9mICQ9PT0iYmlnaW50IilyZXR1cm4gZTgoKTtpZih0eXBlb2YgJD09PSJudW1iZXIiKXtpZighTnVtYmVyLmlzRmluaXRlKCQpKXRocm93IFR5cGVFcnJvcihgQXR0YWNoIG9wdGlvbiBudW1iZXIgdmFsdWVzIG11c3QgYmUgZmluaXRlIChnb3QgJHskfSkuIFVzZSBhIGJpZ2ludCBmb3IgaW50ZWdlcnMgb3IgYSBmaW5pdGUgbnVtYmVyIGZvciBmbG9hdHMuYCk7cmV0dXJuIExaKCl9aWYodHlwZW9mICQ9PT0iYm9vbGVhbiIpcmV0dXJuIF8oKTtpZigkIGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gTSgpO3Rocm93IFR5cGVFcnJvcihgVW5zdXBwb3J0ZWQgYXR0YWNoIG9wdGlvbiB2YWx1ZSB0eXBlOiAke3R5cGVvZiAkfS4gU3VwcG9ydGVkOiBzdHJpbmcsIG51bWJlciwgYmlnaW50LCBib29sZWFuLCBudWxsLCBVaW50OEFycmF5LmApfWZ1bmN0aW9uIHhIKCQpe2lmKCEkKXJldHVybiBudWxsO2xldCBYPU9iamVjdC5lbnRyaWVzKCQpO2lmKFgubGVuZ3RoPT09MClyZXR1cm4gbnVsbDtsZXQgUT1bXSxaPXt9O2ZvcihsZXRbSCxXXW9mIFgpe2xldCBQPXJxKFcpO1EucHVzaChLKEgsUCwhMCkpLFpbSF09W1ddfWxldCBKPUYoUSksWT10OChaLEopO3JldHVybiB5OChZKX1jbGFzcyBVWiBleHRlbmRzIEVycm9ye2Vycm9yVHlwZTtlcnJvck1lc3NhZ2U7cmVtb3RlVHJhY2ViYWNrO2NvbnN0cnVjdG9yKCQsWCxRKXtzdXBlcihgJHskfTogJHtYfWApO3RoaXMuZXJyb3JUeXBlPSQsdGhpcy5lcnJvck1lc3NhZ2U9WCx0aGlzLnJlbW90ZVRyYWNlYmFjaz1RLHRoaXMubmFtZT0iUnBjRXJyb3IifX1jbGFzcyB1OCBleHRlbmRzIEVycm9ye3JlbW90ZVRyYWNlYmFjaztlcnJvclR5cGU7Y29uc3RydWN0b3IoJCxYKXtzdXBlcigkLFg/LmNhdXNlIT1udWxsP3tjYXVzZTpYLmNhdXNlfTp2b2lkIDApO2lmKHRoaXMubmFtZT0iVmdpQ2xpZW50RXJyb3IiLFg/LnJlbW90ZVRyYWNlYmFjayl0aGlzLnJlbW90ZVRyYWNlYmFjaz1YLnJlbW90ZVRyYWNlYmFjaztpZihYPy5lcnJvclR5cGUpdGhpcy5lcnJvclR5cGU9WC5lcnJvclR5cGV9c3RhdGljIGZyb21ScGNFcnJvcigkKXtsZXQgWD1gJHskLmVycm9yVHlwZX06ICR7JC5lcnJvck1lc3NhZ2V9YCxRPSQucmVtb3RlVHJhY2ViYWNrP2Ake1h9CgpSZW1vdGUgdHJhY2ViYWNrOgokeyQucmVtb3RlVHJhY2ViYWNrfWA6WDtyZXR1cm4gbmV3IHU4KFEse3JlbW90ZVRyYWNlYmFjazokLnJlbW90ZVRyYWNlYmFja3x8dm9pZCAwLGVycm9yVHlwZTokLmVycm9yVHlwZSxjYXVzZTokfSl9fWZ1bmN0aW9uIG9LKCQpe3JldHVybnthc3luYyBjYWxsKFgsUSl7dHJ5e3JldHVybiBhd2FpdCAkLmNhbGwoWCxRKX1jYXRjaChaKXtpZihaIGluc3RhbmNlb2YgVVopdGhyb3cgdTguZnJvbVJwY0Vycm9yKFopO3Rocm93IFp9fSxhc3luYyBzdHJlYW0oWCxRKXt0cnl7cmV0dXJuIGF3YWl0ICQuc3RyZWFtKFgsUSl9Y2F0Y2goWil7aWYoWiBpbnN0YW5jZW9mIFVaKXRocm93IHU4LmZyb21ScGNFcnJvcihaKTt0aHJvdyBafX0sZGVzY3JpYmU6KCk9PiQuZGVzY3JpYmUoKSxjbG9zZTooKT0+JC5jbG9zZSgpfX1mdW5jdGlvbiAkMSgkLFgpe2lmKCEkKXJldHVybltdO3JldHVybihBcnJheS5pc0FycmF5KCQpPyQ6Wy4uLiRdKS5maWx0ZXIoKFopPT5aIT1udWxsKS5tYXAoKFopPT5YKEowKFopKSl9ZnVuY3Rpb24gc0soJCl7bGV0IFg9e307aWYoISQpcmV0dXJuIFg7bGV0IFE9JDtpZih0eXBlb2YgUVtTeW1ib2wuaXRlcmF0b3JdIT09ImZ1bmN0aW9uIilyZXR1cm4gWDtmb3IobGV0IFogb2YgUSlpZihBcnJheS5pc0FycmF5KFopKVhbU3RyaW5nKFpbMF0pXT1TdHJpbmcoWlsxXSk7ZWxzZSBpZihaJiZ0eXBlb2YgWj09PSJvYmplY3QiKXtsZXQgSj1aO1hbU3RyaW5nKEoua2V5Pz9KWzBdPz8iIildPVN0cmluZyhKLnZhbHVlPz9KWzFdPz8iIil9cmV0dXJuIFh9ZnVuY3Rpb24gUlooJCl7aWYoU3ltYm9sLmFzeW5jSXRlcmF0b3IgaW4gJClyZXR1cm4gJFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtsZXQgWD0kW1N5bWJvbC5pdGVyYXRvcl0oKTtyZXR1cm57YXN5bmMgbmV4dCgpe3JldHVybiBYLm5leHQoKX19fWNsYXNzIGdIe3JwYztkZWZhdWx0QXR0YWNoT3BhcXVlRGF0YTtjb25zdHJ1Y3RvcigkLFgpe3RoaXMucnBjPW9LKCQpLHRoaXMuZGVmYXVsdEF0dGFjaE9wYXF1ZURhdGE9WD8uYXR0YWNoT3BhcXVlRGF0YT8/bnVsbH1hc3luYyBfZG9CaW5kKCQsWCxRLFosSixZLEgsVz1udWxsLFApe2xldCBHPXtmdW5jdGlvbl9uYW1lOiQsYXJndW1lbnRzOlEsZnVuY3Rpb25fdHlwZTpYLGlucHV0X3NjaGVtYTpaLHNldHRpbmdzOko/P251bGwsc2VjcmV0czpZPz9udWxsLGF0dGFjaF9vcGFxdWVfZGF0YTpXPz90aGlzLmRlZmF1bHRBdHRhY2hPcGFxdWVEYXRhLHRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhOkg/P251bGwscmVzb2x2ZWRfc2VjcmV0c19wcm92aWRlZDohMX0scT1GWihHKSxMPWF3YWl0IHRoaXMucnBjLmNhbGwoImJpbmQiLEFaKHEpKTtpZighTCl0aHJvdyBuZXcgdTgoImJpbmQgcmV0dXJuZWQgbnVsbCIpO2xldCBOPVYwKEwpLFU9d0goTik7aWYoUClQKFUpO3JldHVybntyZXF1ZXN0OkcscmVzcG9uc2U6VX19YXN5bmMgX2RvSW5pdCgkLFgsUSl7bGV0IFo9UT8ub3JkZXJCeT8/bnVsbCxKPVE/LnRhYmxlc2FtcGxlPz9udWxsLFk9e2JpbmRfY2FsbDokLG91dHB1dF9zY2hlbWE6WC5vdXRwdXRfc2NoZW1hLGJpbmRfb3BhcXVlX2RhdGE6WC5vcGFxdWVfZGF0YSxwcm9qZWN0aW9uX2lkczpRPy5wcm9qZWN0aW9uSWRzPz9udWxsLHB1c2hkb3duX2ZpbHRlcnM6UT8ucHVzaGRvd25GaWx0ZXJzPz9udWxsLGpvaW5fa2V5czpRPy5qb2luS2V5cz8/W10scGhhc2U6UT8ucGhhc2U/P251bGwsZmluYWxpemVfc3RhdGVfaWQ6bnVsbCxvcmRlcl9ieV9jb2x1bW5fbmFtZTpaPy5jb2x1bW5OYW1lPz9udWxsLG9yZGVyX2J5X2RpcmVjdGlvbjpaPy5kaXJlY3Rpb24/P251bGwsb3JkZXJfYnlfbnVsbF9vcmRlcjpaPy5udWxsT3JkZXI/P251bGwsb3JkZXJfYnlfbGltaXQ6Wj8ubGltaXQ9PW51bGw/bnVsbDpCaWdJbnQoWi5saW1pdCksdGFibGVzYW1wbGVfcGVyY2VudGFnZTpKPy5wZXJjZW50YWdlPz9udWxsLHRhYmxlc2FtcGxlX3NlZWQ6Sj8uc2VlZD09bnVsbD9udWxsOkJpZ0ludChKLnNlZWQpLGV4ZWN1dGlvbl9pZDpRPy5leGVjdXRpb25JZD8/bnVsbCxpbml0X29wYXF1ZV9kYXRhOm51bGwsc3Vic3RyZWFtX2lkOm51bGx9LEg9VkgoWSksVz1hd2FpdCB0aGlzLnJwYy5zdHJlYW0oImluaXQiLEFaKEgpKSxQPVcuaGVhZGVyO2lmKCFQKXRocm93IG5ldyB1OCgiaW5pdCBkaWQgbm90IHJldHVybiBhIGhlYWRlciIpO2xldCBHPUJIKFApO3JldHVybntzZXNzaW9uOlcsaW5pdFJlc3BvbnNlOkd9fWFzeW5jKnRhYmxlRnVuY3Rpb24oJCl7bGV0IFg9JC5hcmd1bWVudHM/P25ldyBNNix7cmVxdWVzdDpRLHJlc3BvbnNlOlp9PWF3YWl0IHRoaXMuX2RvQmluZCgkLmZ1bmN0aW9uTmFtZSwidGFibGUiLFgsbnVsbCwkLnNldHRpbmdzPz9udWxsLG51bGwsJC50cmFuc2FjdGlvbk9wYXF1ZURhdGE/P251bGwsJC5hdHRhY2hPcGFxdWVEYXRhPz9udWxsLCQub25CaW5kPz9udWxsKSx7c2Vzc2lvbjpKfT1hd2FpdCB0aGlzLl9kb0luaXQoUSxaLHtwcm9qZWN0aW9uSWRzOiQucHJvamVjdGlvbklkcyxwdXNoZG93bkZpbHRlcnM6JC5wdXNoZG93bkZpbHRlcnMsb3JkZXJCeTokLm9yZGVyQnksdGFibGVzYW1wbGU6JC50YWJsZXNhbXBsZSxqb2luS2V5czokLmpvaW5LZXlzfSksWT1aLm91dHB1dF9zY2hlbWE7dHJ5e2ZvciBhd2FpdChsZXQgSCBvZiBKKWlmKEgubGVuZ3RoPjApeWllbGQgUiQoSCxZKX1maW5hbGx5e0ouY2xvc2UoKX19YXN5bmMqc2NhbGFyRnVuY3Rpb25Sb3dzKCQpe2xldCBYPVJaKCQuaW5wdXQpLFE9YXdhaXQgWC5uZXh0KCk7aWYoUS5kb25lKXRocm93IG5ldyB1OChgc2NhbGFyRnVuY3Rpb24oJHskLmZ1bmN0aW9uTmFtZX0pOiBpbnB1dCBpdGVyYXRvciB5aWVsZGVkIG5vIGJhdGNoZXM7IGF0IGxlYXN0IG9uZSBiYXRjaCBpcyByZXF1aXJlZCB0byBkZXRlcm1pbmUgdGhlIGlucHV0IHNjaGVtYWApO2xldCBaPVEudmFsdWUsSj1aLnNjaGVtYSxZPSQuYXJndW1lbnRzPz9uZXcgTTYse3JlcXVlc3Q6SCxyZXNwb25zZTpXfT1hd2FpdCB0aGlzLl9kb0JpbmQoJC5mdW5jdGlvbk5hbWUsInNjYWxhciIsWSxKLCQuc2V0dGluZ3M/P251bGwsJC5zZWNyZXRzPz9udWxsLCQudHJhbnNhY3Rpb25PcGFxdWVEYXRhPz9udWxsLCQuYXR0YWNoT3BhcXVlRGF0YT8/bnVsbCwkLm9uQmluZD8/bnVsbCkse3Nlc3Npb246UH09YXdhaXQgdGhpcy5fZG9Jbml0KEgsVyk7dHJ5e2xldCBHPWF3YWl0IFAuZXhjaGFuZ2UoWy4uLk4wKFopXSk7aWYoRy5sZW5ndGg+MCl5aWVsZCBHO2ZvciBhd2FpdChsZXQgcSBvZntbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5YfSl7bGV0IEw9YXdhaXQgUC5leGNoYW5nZShbLi4uTjAocSldKTtpZihMLmxlbmd0aD4wKXlpZWxkIEx9fWZpbmFsbHl7UC5jbG9zZSgpfX1hc3luYypzY2FsYXJGdW5jdGlvbigkKXtsZXQgWD1SWigkLmlucHV0KSxRPWF3YWl0IFgubmV4dCgpO2lmKFEuZG9uZSl0aHJvdyBuZXcgdTgoYHNjYWxhckZ1bmN0aW9uKCR7JC5mdW5jdGlvbk5hbWV9KTogaW5wdXQgaXRlcmF0b3IgeWllbGRlZCBubyBiYXRjaGVzOyBhdCBsZWFzdCBvbmUgYmF0Y2ggaXMgcmVxdWlyZWQgdG8gZGV0ZXJtaW5lIHRoZSBpbnB1dCBzY2hlbWFgKTtsZXQgWj1RLnZhbHVlLEo9Wi5zY2hlbWEsWT0kLmFyZ3VtZW50cz8/bmV3IE02LHtyZXF1ZXN0OkgscmVzcG9uc2U6V309YXdhaXQgdGhpcy5fZG9CaW5kKCQuZnVuY3Rpb25OYW1lLCJzY2FsYXIiLFksSiwkLnNldHRpbmdzPz9udWxsLCQuc2VjcmV0cz8/bnVsbCwkLnRyYW5zYWN0aW9uT3BhcXVlRGF0YT8/bnVsbCwkLmF0dGFjaE9wYXF1ZURhdGE/P251bGwsJC5vbkJpbmQ/P251bGwpLHtzZXNzaW9uOlB9PWF3YWl0IHRoaXMuX2RvSW5pdChILFcpLEc9Vy5vdXRwdXRfc2NoZW1hO3RyeXtsZXQgcT1hd2FpdCBQLmV4Y2hhbmdlKFsuLi5OMChaKV0pO2lmKHEubGVuZ3RoPjApeWllbGQgUiQocSxHKTtmb3IgYXdhaXQobGV0IEwgb2Z7W1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+WH0pe2xldCBOPWF3YWl0IFAuZXhjaGFuZ2UoWy4uLk4wKEwpXSk7aWYoTi5sZW5ndGg+MCl5aWVsZCBSJChOLEcpfX1maW5hbGx5e1AuY2xvc2UoKX19YXN5bmMqdGFibGVJbk91dEZ1bmN0aW9uUm93cygkKXtsZXQgWD1SWigkLmlucHV0KSxRPWF3YWl0IFgubmV4dCgpO2lmKFEuZG9uZSl0aHJvdyBuZXcgdTgoYHRhYmxlSW5PdXRGdW5jdGlvbigkeyQuZnVuY3Rpb25OYW1lfSk6IGlucHV0IGl0ZXJhdG9yIHlpZWxkZWQgbm8gYmF0Y2hlczsgYXQgbGVhc3Qgb25lIGJhdGNoIGlzIHJlcXVpcmVkIHRvIGRldGVybWluZSB0aGUgaW5wdXQgc2NoZW1hYCk7bGV0IFo9US52YWx1ZSxKPVouc2NoZW1hLFk9JC5hcmd1bWVudHM/P25ldyBNNix7cmVxdWVzdDpILHJlc3BvbnNlOld9PWF3YWl0IHRoaXMuX2RvQmluZCgkLmZ1bmN0aW9uTmFtZSwidGFibGUiLFksSiwkLnNldHRpbmdzPz9udWxsLG51bGwsJC50cmFuc2FjdGlvbk9wYXF1ZURhdGE/P251bGwsJC5hdHRhY2hPcGFxdWVEYXRhPz9udWxsLCQub25CaW5kPz9udWxsKSx7c2Vzc2lvbjpQLGluaXRSZXNwb25zZTpHfT1hd2FpdCB0aGlzLl9kb0luaXQoSCxXLHtwcm9qZWN0aW9uSWRzOiQucHJvamVjdGlvbklkcyxwdXNoZG93bkZpbHRlcnM6JC5wdXNoZG93bkZpbHRlcnMscGhhc2U6IklOUFVUIixvcmRlckJ5OiQub3JkZXJCeSx0YWJsZXNhbXBsZTokLnRhYmxlc2FtcGxlLGpvaW5LZXlzOiQuam9pbktleXN9KTt0cnl7bGV0IEw9YXdhaXQgUC5leGNoYW5nZShbLi4uTjAoWildKTtpZihMLmxlbmd0aD4wKXlpZWxkIEw7Zm9yIGF3YWl0KGxldCBOIG9me1tTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9Plh9KXtsZXQgVT1hd2FpdCBQLmV4Y2hhbmdlKFsuLi5OMChOKV0pO2lmKFUubGVuZ3RoPjApeWllbGQgVX19ZmluYWxseXtQLmNsb3NlKCl9bGV0e3Nlc3Npb246cX09YXdhaXQgdGhpcy5fZG9Jbml0KEgsVyx7cHJvamVjdGlvbklkczokLnByb2plY3Rpb25JZHMscHVzaGRvd25GaWx0ZXJzOiQucHVzaGRvd25GaWx0ZXJzLHBoYXNlOiJGSU5BTElaRSIsZXhlY3V0aW9uSWQ6Ry5leGVjdXRpb25faWQsb3JkZXJCeTokLm9yZGVyQnksdGFibGVzYW1wbGU6JC50YWJsZXNhbXBsZSxqb2luS2V5czokLmpvaW5LZXlzfSk7dHJ5e2ZvciBhd2FpdChsZXQgTCBvZiBxKWlmKEwubGVuZ3RoPjApeWllbGQgTH1maW5hbGx5e3EuY2xvc2UoKX19YXN5bmMqdGFibGVJbk91dEZ1bmN0aW9uKCQpe2xldCBYPVJaKCQuaW5wdXQpLFE9YXdhaXQgWC5uZXh0KCk7aWYoUS5kb25lKXRocm93IG5ldyB1OChgdGFibGVJbk91dEZ1bmN0aW9uKCR7JC5mdW5jdGlvbk5hbWV9KTogaW5wdXQgaXRlcmF0b3IgeWllbGRlZCBubyBiYXRjaGVzOyBhdCBsZWFzdCBvbmUgYmF0Y2ggaXMgcmVxdWlyZWQgdG8gZGV0ZXJtaW5lIHRoZSBpbnB1dCBzY2hlbWFgKTtsZXQgWj1RLnZhbHVlLEo9Wi5zY2hlbWEsWT0kLmFyZ3VtZW50cz8/bmV3IE02LHtyZXF1ZXN0OkgscmVzcG9uc2U6V309YXdhaXQgdGhpcy5fZG9CaW5kKCQuZnVuY3Rpb25OYW1lLCJ0YWJsZSIsWSxKLCQuc2V0dGluZ3M/P251bGwsbnVsbCwkLnRyYW5zYWN0aW9uT3BhcXVlRGF0YT8/bnVsbCwkLmF0dGFjaE9wYXF1ZURhdGE/P251bGwsJC5vbkJpbmQ/P251bGwpLHtzZXNzaW9uOlAsaW5pdFJlc3BvbnNlOkd9PWF3YWl0IHRoaXMuX2RvSW5pdChILFcse3Byb2plY3Rpb25JZHM6JC5wcm9qZWN0aW9uSWRzLHB1c2hkb3duRmlsdGVyczokLnB1c2hkb3duRmlsdGVycyxwaGFzZToiSU5QVVQiLG9yZGVyQnk6JC5vcmRlckJ5LHRhYmxlc2FtcGxlOiQudGFibGVzYW1wbGUsam9pbktleXM6JC5qb2luS2V5c30pLHE9Vy5vdXRwdXRfc2NoZW1hO3RyeXtsZXQgTj1hd2FpdCBQLmV4Y2hhbmdlKFsuLi5OMChaKV0pO2lmKE4ubGVuZ3RoPjApeWllbGQgUiQoTixxKTtmb3IgYXdhaXQobGV0IFUgb2Z7W1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+WH0pe2xldCBrPWF3YWl0IFAuZXhjaGFuZ2UoWy4uLk4wKFUpXSk7aWYoay5sZW5ndGg+MCl5aWVsZCBSJChrLHEpfX1maW5hbGx5e1AuY2xvc2UoKX1sZXR7c2Vzc2lvbjpMfT1hd2FpdCB0aGlzLl9kb0luaXQoSCxXLHtwcm9qZWN0aW9uSWRzOiQucHJvamVjdGlvbklkcyxwdXNoZG93bkZpbHRlcnM6JC5wdXNoZG93bkZpbHRlcnMscGhhc2U6IkZJTkFMSVpFIixleGVjdXRpb25JZDpHLmV4ZWN1dGlvbl9pZCxvcmRlckJ5OiQub3JkZXJCeSx0YWJsZXNhbXBsZTokLnRhYmxlc2FtcGxlLGpvaW5LZXlzOiQuam9pbktleXN9KTt0cnl7Zm9yIGF3YWl0KGxldCBOIG9mIEwpaWYoTi5sZW5ndGg+MCl5aWVsZCBSJChOLHEpfWZpbmFsbHl7TC5jbG9zZSgpfX1hc3luYyp0YWJsZUZ1bmN0aW9uUm93cygkKXtsZXQgWD0kLmFyZ3VtZW50cz8/bmV3IE02LHtyZXF1ZXN0OlEscmVzcG9uc2U6Wn09YXdhaXQgdGhpcy5fZG9CaW5kKCQuZnVuY3Rpb25OYW1lLCJ0YWJsZSIsWCxudWxsLCQuc2V0dGluZ3M/P251bGwsbnVsbCwkLnRyYW5zYWN0aW9uT3BhcXVlRGF0YT8/bnVsbCwkLmF0dGFjaE9wYXF1ZURhdGE/P251bGwsJC5vbkJpbmQ/P251bGwpLHtzZXNzaW9uOkp9PWF3YWl0IHRoaXMuX2RvSW5pdChRLFose3Byb2plY3Rpb25JZHM6JC5wcm9qZWN0aW9uSWRzLHB1c2hkb3duRmlsdGVyczokLnB1c2hkb3duRmlsdGVycyxvcmRlckJ5OiQub3JkZXJCeSx0YWJsZXNhbXBsZTokLnRhYmxlc2FtcGxlLGpvaW5LZXlzOiQuam9pbktleXN9KTt0cnl7Zm9yIGF3YWl0KGxldCBZIG9mIEopaWYoWS5sZW5ndGg+MCl5aWVsZCBZfWZpbmFsbHl7Si5jbG9zZSgpfX1hc3luYyBjYXRhbG9nc0luZm8oKXtsZXQgJD1hd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX2NhdGFsb2dzIix7fSk7aWYoISQpcmV0dXJuW107bGV0IFg9VjAoJCk7cmV0dXJuICQxKFguaXRlbXMsX0gpfWFzeW5jIGNhdGFsb2dzKCl7cmV0dXJuKGF3YWl0IHRoaXMuY2F0YWxvZ3NJbmZvKCkpLm1hcCgoWCk9PlgubmFtZSl9YXN5bmMgY2F0YWxvZ0F0dGFjaCgkLFgpe2lmKFg/Lm9wdGlvbnMhPW51bGwmJlg/Lm9wdGlvbnNCeXRlcyE9bnVsbCl0aHJvdyBuZXcgdTgoImNhdGFsb2dBdHRhY2g6IGNhbm5vdCBzcGVjaWZ5IGJvdGggYG9wdGlvbnNgIGFuZCBgb3B0aW9uc0J5dGVzYCIpO2xldCBRO2lmKFg/Lm9wdGlvbnNCeXRlcyE9bnVsbClRPVgub3B0aW9uc0J5dGVzLmJ5dGVMZW5ndGg9PT0wP251bGw6WC5vcHRpb25zQnl0ZXM7ZWxzZSBRPXhIKFg/Lm9wdGlvbnMpO2xldCBaPUYoW0soIm5hbWUiLHooKSwhMSksSygib3B0aW9ucyIsTSgpLCEwKSxLKCJkYXRhX3ZlcnNpb25fc3BlYyIseigpLCEwKSxLKCJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIix6KCksITApXSksSj10OCh7bmFtZTpbJF0sb3B0aW9uczpbUV0sZGF0YV92ZXJzaW9uX3NwZWM6W1g/LmRhdGFWZXJzaW9uU3BlYz8/bnVsbF0saW1wbGVtZW50YXRpb25fdmVyc2lvbjpbWD8uaW1wbGVtZW50YXRpb25WZXJzaW9uPz9udWxsXX0sWiksWT1hd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX2F0dGFjaCIsQVooSikpO2lmKCFZKXRocm93IG5ldyB1OCgiY2F0YWxvZ19hdHRhY2ggcmV0dXJuZWQgbnVsbCIpO2xldCBIPVYwKFkpO3JldHVybnthdHRhY2hfb3BhcXVlX2RhdGE6SjAoSC5hdHRhY2hfb3BhcXVlX2RhdGEpLHN1cHBvcnRzX3RyYW5zYWN0aW9uczpILnN1cHBvcnRzX3RyYW5zYWN0aW9ucz8/ITEsc3VwcG9ydHNfdGltZV90cmF2ZWw6SC5zdXBwb3J0c190aW1lX3RyYXZlbD8/ITEsY2F0YWxvZ192ZXJzaW9uX2Zyb3plbjpILmNhdGFsb2dfdmVyc2lvbl9mcm96ZW4/PyExLGNhdGFsb2dfdmVyc2lvbjpOdW1iZXIoSC5jYXRhbG9nX3ZlcnNpb24/PzApLGF0dGFjaF9vcGFxdWVfZGF0YV9yZXF1aXJlZDpILmF0dGFjaF9vcGFxdWVfZGF0YV9yZXF1aXJlZD8/ITAsZGVmYXVsdF9zY2hlbWE6SC5kZWZhdWx0X3NjaGVtYT8/Im1haW4iLHNldHRpbmdzOkguc2V0dGluZ3M/KEFycmF5LmlzQXJyYXkoSC5zZXR0aW5ncyk/SC5zZXR0aW5nczpbLi4uSC5zZXR0aW5nc10pLm1hcChKMCk6W10sc2VjcmV0X3R5cGVzOkguc2VjcmV0X3R5cGVzPyhBcnJheS5pc0FycmF5KEguc2VjcmV0X3R5cGVzKT9ILnNlY3JldF90eXBlczpbLi4uSC5zZWNyZXRfdHlwZXNdKS5tYXAoSjApOltdLGF0dGFjaF9jYXRhbG9nczpILmF0dGFjaF9jYXRhbG9ncz8oQXJyYXkuaXNBcnJheShILmF0dGFjaF9jYXRhbG9ncyk/SC5hdHRhY2hfY2F0YWxvZ3M6Wy4uLkguYXR0YWNoX2NhdGFsb2dzXSkubWFwKEowKTpbXSxjb21tZW50OkguY29tbWVudD8/bnVsbCx0YWdzOnNLKEgudGFncyksc3VwcG9ydHNfY29sdW1uX3N0YXRpc3RpY3M6SC5zdXBwb3J0c19jb2x1bW5fc3RhdGlzdGljcz8/ITEsZ2xvYmFsX2Z1bmN0aW9uczpILmdsb2JhbF9mdW5jdGlvbnM/KEFycmF5LmlzQXJyYXkoSC5nbG9iYWxfZnVuY3Rpb25zKT9ILmdsb2JhbF9mdW5jdGlvbnM6Wy4uLkguZ2xvYmFsX2Z1bmN0aW9uc10pLm1hcChKMCk6W10sZ2xvYmFsX2Z1bmN0aW9uX3ByZWZpeDpILmdsb2JhbF9mdW5jdGlvbl9wcmVmaXg/PyIiLHJlc29sdmVkX2RhdGFfdmVyc2lvbjpILnJlc29sdmVkX2RhdGFfdmVyc2lvbj8/bnVsbCxyZXNvbHZlZF9pbXBsZW1lbnRhdGlvbl92ZXJzaW9uOkgucmVzb2x2ZWRfaW1wbGVtZW50YXRpb25fdmVyc2lvbj8/bnVsbH19YXN5bmMgY2F0YWxvZ0RldGFjaCgkKXthd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX2RldGFjaCIse2F0dGFjaF9vcGFxdWVfZGF0YTokfSl9YXN5bmMgY2F0YWxvZ0NyZWF0ZSgkLFgsUSl7bGV0IFo7aWYoUT09bnVsbClaPW51bGw7ZWxzZSBpZihRIGluc3RhbmNlb2YgVWludDhBcnJheSlaPVEuYnl0ZUxlbmd0aD09PTA/bnVsbDpRO2Vsc2V7aWYoUS5vcHRpb25zIT1udWxsJiZRLm9wdGlvbnNCeXRlcyE9bnVsbCl0aHJvdyBuZXcgdTgoImNhdGFsb2dDcmVhdGU6IGNhbm5vdCBzcGVjaWZ5IGJvdGggYG9wdGlvbnNgIGFuZCBgb3B0aW9uc0J5dGVzYCIpO2lmKFEub3B0aW9uc0J5dGVzIT1udWxsKVo9US5vcHRpb25zQnl0ZXMuYnl0ZUxlbmd0aD09PTA/bnVsbDpRLm9wdGlvbnNCeXRlcztlbHNlIFo9eEgoUS5vcHRpb25zKX1hd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX2NyZWF0ZSIse25hbWU6JCxvbl9jb25mbGljdDpYLG9wdGlvbnM6Wn0pfWFzeW5jIGNhdGFsb2dEcm9wKCQpe2F3YWl0IHRoaXMucnBjLmNhbGwoImNhdGFsb2dfZHJvcCIse25hbWU6JH0pfWFzeW5jIGNhdGFsb2dWZXJzaW9uKCQsWCl7bGV0IFE9YXdhaXQgdGhpcy5ycGMuY2FsbCgiY2F0YWxvZ192ZXJzaW9uIix7YXR0YWNoX29wYXF1ZV9kYXRhOiQsdHJhbnNhY3Rpb25fb3BhcXVlX2RhdGE6WD8/bnVsbH0pO2lmKCFRKXRocm93IG5ldyB1OCgiY2F0YWxvZ192ZXJzaW9uIHJldHVybmVkIG51bGwiKTtsZXQgWj1WMChRKTtyZXR1cm4gTnVtYmVyKFoudmVyc2lvbj8/MCl9YXN5bmMgdHJhbnNhY3Rpb25CZWdpbigkKXtsZXQgWD1hd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX3RyYW5zYWN0aW9uX2JlZ2luIix7YXR0YWNoX29wYXF1ZV9kYXRhOiR9KTtpZighWCl0aHJvdyBuZXcgdTgoInRyYW5zYWN0aW9uX2JlZ2luIHJldHVybmVkIG51bGwiKTtsZXQgUT1WMChYKTtpZighUS50cmFuc2FjdGlvbl9vcGFxdWVfZGF0YSl0aHJvdyBuZXcgdTgoInRyYW5zYWN0aW9uX2JlZ2luIHJldHVybmVkIG5vIHRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhIik7cmV0dXJuIEowKFEudHJhbnNhY3Rpb25fb3BhcXVlX2RhdGEpfWFzeW5jIHRyYW5zYWN0aW9uQ29tbWl0KCQsWCl7YXdhaXQgdGhpcy5ycGMuY2FsbCgiY2F0YWxvZ190cmFuc2FjdGlvbl9jb21taXQiLHthdHRhY2hfb3BhcXVlX2RhdGE6JCx0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YTpYfSl9YXN5bmMgdHJhbnNhY3Rpb25Sb2xsYmFjaygkLFgpe2F3YWl0IHRoaXMucnBjLmNhbGwoImNhdGFsb2dfdHJhbnNhY3Rpb25fcm9sbGJhY2siLHthdHRhY2hfb3BhcXVlX2RhdGE6JCx0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YTpYfSl9YXN5bmMgc2NoZW1hcygkLFgpe2xldCBRPWF3YWl0IHRoaXMucnBjLmNhbGwoImNhdGFsb2dfc2NoZW1hcyIse2F0dGFjaF9vcGFxdWVfZGF0YTokLHRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhOlg/P251bGx9KTtpZighUSlyZXR1cm5bXTtsZXQgWj1WMChRKTtyZXR1cm4gJDEoWi5pdGVtcyxnNCl9YXN5bmMgc2NoZW1hR2V0KCQsWCxRKXtsZXQgWj1hd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX3NjaGVtYV9nZXQiLHthdHRhY2hfb3BhcXVlX2RhdGE6JCxuYW1lOlgsdHJhbnNhY3Rpb25fb3BhcXVlX2RhdGE6UT8/bnVsbH0pO2lmKCFaKXJldHVybiBudWxsO2xldCBKPVYwKFopLFk9JDEoSi5pdGVtcyxnNCk7cmV0dXJuIFkubGVuZ3RoPjA/WVswXTpudWxsfWFzeW5jIHNjaGVtYUNyZWF0ZSgkLFgsUSl7bGV0IFo9UT8udGFncz9uZXcgTWFwKE9iamVjdC5lbnRyaWVzKFEudGFncykpOm51bGw7YXdhaXQgdGhpcy5ycGMuY2FsbCgiY2F0YWxvZ19zY2hlbWFfY3JlYXRlIix7YXR0YWNoX29wYXF1ZV9kYXRhOiQsbmFtZTpYLG9uX2NvbmZsaWN0OlE/Lm9uQ29uZmxpY3Q/PyJlcnJvciIsY29tbWVudDpRPy5jb21tZW50Pz9udWxsLHRhZ3M6Wix0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YTpRPy50cmFuc2FjdGlvbk9wYXF1ZURhdGE/P251bGx9KX1hc3luYyBzY2hlbWFEcm9wKCQsWCxRLFosSil7YXdhaXQgdGhpcy5ycGMuY2FsbCgiY2F0YWxvZ19zY2hlbWFfZHJvcCIse2F0dGFjaF9vcGFxdWVfZGF0YTokLG5hbWU6WCxpZ25vcmVfbm90X2ZvdW5kOlE/PyExLGNhc2NhZGU6Wj8/ITEsdHJhbnNhY3Rpb25fb3BhcXVlX2RhdGE6Sj8/bnVsbH0pfWFzeW5jIHNjaGVtYUNvbnRlbnRzVGFibGVzKCQsWCxRKXtsZXQgWj1hd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX3NjaGVtYV9jb250ZW50c190YWJsZXMiLHthdHRhY2hfb3BhcXVlX2RhdGE6JCxuYW1lOlgsdHJhbnNhY3Rpb25fb3BhcXVlX2RhdGE6UT8/bnVsbH0pO2lmKCFaKXJldHVybltdO2xldCBKPVYwKFopO3JldHVybiAkMShKLml0ZW1zLHY0KX1hc3luYyBzY2hlbWFDb250ZW50c1ZpZXdzKCQsWCxRKXtsZXQgWj1hd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX3NjaGVtYV9jb250ZW50c192aWV3cyIse2F0dGFjaF9vcGFxdWVfZGF0YTokLG5hbWU6WCx0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YTpRPz9udWxsfSk7aWYoIVopcmV0dXJuW107bGV0IEo9VjAoWik7cmV0dXJuICQxKEouaXRlbXMsaDQpfWFzeW5jIHNjaGVtYUNvbnRlbnRzRnVuY3Rpb25zKCQsWCxRLFope2xldCBKPWF3YWl0IHRoaXMucnBjLmNhbGwoImNhdGFsb2dfc2NoZW1hX2NvbnRlbnRzX2Z1bmN0aW9ucyIse2F0dGFjaF9vcGFxdWVfZGF0YTokLG5hbWU6WCx0eXBlOlEsdHJhbnNhY3Rpb25fb3BhcXVlX2RhdGE6Wj8/bnVsbH0pO2lmKCFKKXJldHVybltdO2xldCBZPVYwKEopO3JldHVybiAkMShZLml0ZW1zLFRIKX1hc3luYyB0YWJsZUdldCgkLFgsUSxaKXtsZXQgSj1hd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX3RhYmxlX2dldCIse2F0dGFjaF9vcGFxdWVfZGF0YTokLHNjaGVtYV9uYW1lOlgsbmFtZTpRLHRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhOlo/P251bGx9KTtpZighSilyZXR1cm4gbnVsbDtsZXQgWT1WMChKKSxIPSQxKFkuaXRlbXMsdjQpO3JldHVybiBILmxlbmd0aD4wP0hbMF06bnVsbH1hc3luYyB0YWJsZUNyZWF0ZSgkLFgsUSxaLEosWSxILFcsUCl7YXdhaXQgdGhpcy5ycGMuY2FsbCgiY2F0YWxvZ190YWJsZV9jcmVhdGUiLHthdHRhY2hfb3BhcXVlX2RhdGE6JCxzY2hlbWFfbmFtZTpYLG5hbWU6USxjb2x1bW5zOlosb25fY29uZmxpY3Q6Sixub3RfbnVsbF9jb25zdHJhaW50czpZPz9udWxsLHVuaXF1ZV9jb25zdHJhaW50czpIPz9udWxsLGNoZWNrX2NvbnN0cmFpbnRzOlc/P251bGwsdHJhbnNhY3Rpb25fb3BhcXVlX2RhdGE6UD8/bnVsbH0pfWFzeW5jIHRhYmxlRHJvcCgkLFgsUSxaLEosWSl7YXdhaXQgdGhpcy5ycGMuY2FsbCgiY2F0YWxvZ190YWJsZV9kcm9wIix7YXR0YWNoX29wYXF1ZV9kYXRhOiQsc2NoZW1hX25hbWU6WCxuYW1lOlEsaWdub3JlX25vdF9mb3VuZDpaPz8hMSxjYXNjYWRlOko/PyExLHRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhOlk/P251bGx9KX1hc3luYyB0YWJsZVNjYW5GdW5jdGlvbkdldCgkLFgsUSxaLEosWSl7bGV0IEg9YXdhaXQgdGhpcy5ycGMuY2FsbCgiY2F0YWxvZ190YWJsZV9zY2FuX2Z1bmN0aW9uX2dldCIse2F0dGFjaF9vcGFxdWVfZGF0YTokLHNjaGVtYV9uYW1lOlgsbmFtZTpRLGF0X3VuaXQ6Wj8/bnVsbCxhdF92YWx1ZTpKPz9udWxsLHRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhOlk/P251bGx9KTtpZighSCl0aHJvdyBuZXcgdTgoInRhYmxlX3NjYW5fZnVuY3Rpb25fZ2V0IHJldHVybmVkIG51bGwiKTtyZXR1cm4gbksoVjAoSCkpfWFzeW5jIHRhYmxlQ29tbWVudFNldCgkLFgsUSxaLEosWSl7YXdhaXQgdGhpcy5ycGMuY2FsbCgiY2F0YWxvZ190YWJsZV9jb21tZW50X3NldCIse2F0dGFjaF9vcGFxdWVfZGF0YTokLHNjaGVtYV9uYW1lOlgsbmFtZTpRLGNvbW1lbnQ6Wj8/bnVsbCxpZ25vcmVfbm90X2ZvdW5kOko/P251bGwsdHJhbnNhY3Rpb25fb3BhcXVlX2RhdGE6WT8/bnVsbH0pfWFzeW5jIHRhYmxlUmVuYW1lKCQsWCxRLFosSixZKXthd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX3RhYmxlX3JlbmFtZSIse2F0dGFjaF9vcGFxdWVfZGF0YTokLHNjaGVtYV9uYW1lOlgsbmFtZTpRLG5ld19uYW1lOlosaWdub3JlX25vdF9mb3VuZDpKPz9udWxsLHRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhOlk/P251bGx9KX1hc3luYyB0YWJsZUNvbHVtbkFkZCgkLFgsUSxaLEosWSxILFcpe2F3YWl0IHRoaXMucnBjLmNhbGwoImNhdGFsb2dfdGFibGVfY29sdW1uX2FkZCIse2F0dGFjaF9vcGFxdWVfZGF0YTokLHNjaGVtYV9uYW1lOlgsbmFtZTpRLGNvbHVtbl9uYW1lOlosY29sdW1uX3R5cGU6SixkZWZhdWx0X3ZhbHVlOlk/P251bGwsaWdub3JlX25vdF9mb3VuZDpIPz9udWxsLHRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhOlc/P251bGx9KX1hc3luYyB0YWJsZUNvbHVtbkRyb3AoJCxYLFEsWixKLFkpe2F3YWl0IHRoaXMucnBjLmNhbGwoImNhdGFsb2dfdGFibGVfY29sdW1uX2Ryb3AiLHthdHRhY2hfb3BhcXVlX2RhdGE6JCxzY2hlbWFfbmFtZTpYLG5hbWU6USxjb2x1bW5fbmFtZTpaLGlnbm9yZV9ub3RfZm91bmQ6Sj8/bnVsbCx0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YTpZPz9udWxsfSl9YXN5bmMgdGFibGVDb2x1bW5SZW5hbWUoJCxYLFEsWixKLFksSCl7YXdhaXQgdGhpcy5ycGMuY2FsbCgiY2F0YWxvZ190YWJsZV9jb2x1bW5fcmVuYW1lIix7YXR0YWNoX29wYXF1ZV9kYXRhOiQsc2NoZW1hX25hbWU6WCxuYW1lOlEsY29sdW1uX25hbWU6WixuZXdfbmFtZTpKLGlnbm9yZV9ub3RfZm91bmQ6WT8/bnVsbCx0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YTpIPz9udWxsfSl9YXN5bmMgdGFibGVDb2x1bW5EZWZhdWx0U2V0KCQsWCxRLFosSixZLEgpe2F3YWl0IHRoaXMucnBjLmNhbGwoImNhdGFsb2dfdGFibGVfY29sdW1uX2RlZmF1bHRfc2V0Iix7YXR0YWNoX29wYXF1ZV9kYXRhOiQsc2NoZW1hX25hbWU6WCxuYW1lOlEsY29sdW1uX25hbWU6WixkZWZhdWx0X3ZhbHVlOkosaWdub3JlX25vdF9mb3VuZDpZPz9udWxsLHRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhOkg/P251bGx9KX1hc3luYyB0YWJsZUNvbHVtbkRlZmF1bHREcm9wKCQsWCxRLFosSixZKXthd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX3RhYmxlX2NvbHVtbl9kZWZhdWx0X2Ryb3AiLHthdHRhY2hfb3BhcXVlX2RhdGE6JCxzY2hlbWFfbmFtZTpYLG5hbWU6USxjb2x1bW5fbmFtZTpaLGlnbm9yZV9ub3RfZm91bmQ6Sj8/bnVsbCx0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YTpZPz9udWxsfSl9YXN5bmMgdGFibGVDb2x1bW5UeXBlQ2hhbmdlKCQsWCxRLFosSixZLEgpe2F3YWl0IHRoaXMucnBjLmNhbGwoImNhdGFsb2dfdGFibGVfY29sdW1uX3R5cGVfY2hhbmdlIix7YXR0YWNoX29wYXF1ZV9kYXRhOiQsc2NoZW1hX25hbWU6WCxuYW1lOlEsY29sdW1uX2RlZmluaXRpb246WixleHByZXNzaW9uOko/P251bGwsaWdub3JlX25vdF9mb3VuZDpZPz8hMSx0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YTpIPz9udWxsfSl9YXN5bmMgdGFibGVOb3ROdWxsU2V0KCQsWCxRLFosSixZKXthd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX3RhYmxlX25vdF9udWxsX3NldCIse2F0dGFjaF9vcGFxdWVfZGF0YTokLHNjaGVtYV9uYW1lOlgsbmFtZTpRLGNvbHVtbl9uYW1lOlosaWdub3JlX25vdF9mb3VuZDpKPz9udWxsLHRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhOlk/P251bGx9KX1hc3luYyB0YWJsZU5vdE51bGxEcm9wKCQsWCxRLFosSixZKXthd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX3RhYmxlX25vdF9udWxsX2Ryb3AiLHthdHRhY2hfb3BhcXVlX2RhdGE6JCxzY2hlbWFfbmFtZTpYLG5hbWU6USxjb2x1bW5fbmFtZTpaLGlnbm9yZV9ub3RfZm91bmQ6Sj8/bnVsbCx0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YTpZPz9udWxsfSl9YXN5bmMgdmlld0dldCgkLFgsUSxaKXtsZXQgSj1hd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX3ZpZXdfZ2V0Iix7YXR0YWNoX29wYXF1ZV9kYXRhOiQsc2NoZW1hX25hbWU6WCxuYW1lOlEsdHJhbnNhY3Rpb25fb3BhcXVlX2RhdGE6Wj8/bnVsbH0pO2lmKCFKKXJldHVybiBudWxsO2xldCBZPVYwKEopLEg9JDEoWS5pdGVtcyxoNCk7cmV0dXJuIEgubGVuZ3RoPjA/SFswXTpudWxsfWFzeW5jIHZpZXdDcmVhdGUoJCxYLFEsWixKLFkpe2F3YWl0IHRoaXMucnBjLmNhbGwoImNhdGFsb2dfdmlld19jcmVhdGUiLHthdHRhY2hfb3BhcXVlX2RhdGE6JCxzY2hlbWFfbmFtZTpYLG5hbWU6USxkZWZpbml0aW9uOlosb25fY29uZmxpY3Q6Six0cmFuc2FjdGlvbl9vcGFxdWVfZGF0YTpZPz9udWxsfSl9YXN5bmMgdmlld0Ryb3AoJCxYLFEsWixKLFkpe2F3YWl0IHRoaXMucnBjLmNhbGwoImNhdGFsb2dfdmlld19kcm9wIix7YXR0YWNoX29wYXF1ZV9kYXRhOiQsc2NoZW1hX25hbWU6WCxuYW1lOlEsaWdub3JlX25vdF9mb3VuZDpaPz8hMSxjYXNjYWRlOko/PyExLHRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhOlk/P251bGx9KX1hc3luYyB2aWV3UmVuYW1lKCQsWCxRLFosSixZKXthd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX3ZpZXdfcmVuYW1lIix7YXR0YWNoX29wYXF1ZV9kYXRhOiQsc2NoZW1hX25hbWU6WCxuYW1lOlEsbmV3X25hbWU6WixpZ25vcmVfbm90X2ZvdW5kOko/P251bGwsdHJhbnNhY3Rpb25fb3BhcXVlX2RhdGE6WT8/bnVsbH0pfWFzeW5jIHZpZXdDb21tZW50U2V0KCQsWCxRLFosSixZKXthd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX3ZpZXdfY29tbWVudF9zZXQiLHthdHRhY2hfb3BhcXVlX2RhdGE6JCxzY2hlbWFfbmFtZTpYLG5hbWU6USxjb21tZW50Olo/P251bGwsaWdub3JlX25vdF9mb3VuZDpKPz9udWxsLHRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhOlk/P251bGx9KX1hc3luYyBtYWNyb0dldCgkLFgsUSxaKXtsZXQgSj1hd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX21hY3JvX2dldCIse2F0dGFjaF9vcGFxdWVfZGF0YTokLHNjaGVtYV9uYW1lOlgsbmFtZTpRLHRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhOlo/P251bGx9KTtpZighSilyZXR1cm4gbnVsbDtsZXQgWT1WMChKKSxIPSQxKFkuaXRlbXMseDQpO3JldHVybiBILmxlbmd0aD4wP0hbMF06bnVsbH1hc3luYyBzY2hlbWFDb250ZW50c01hY3JvcygkLFgsUSxaKXtsZXQgSj1hd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX3NjaGVtYV9jb250ZW50c19tYWNyb3MiLHthdHRhY2hfb3BhcXVlX2RhdGE6JCxuYW1lOlgsdHlwZTpRLHRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhOlo/P251bGx9KTtpZighSilyZXR1cm5bXTtsZXQgWT1WMChKKTtyZXR1cm4gJDEoWS5pdGVtcyx4NCl9YXN5bmMgbWFjcm9DcmVhdGUoJCxYLFEsWixKLFksSCxXLFAsRyl7bGV0IHE9RihbSygiYXR0YWNoX29wYXF1ZV9kYXRhIixNKCksITApLEsoInNjaGVtYV9uYW1lIix6KCksITEpLEsoIm5hbWUiLHooKSwhMSksSygibWFjcm9fdHlwZSIseigpLCExKSxLKCJwYXJhbWV0ZXJzIixmKEsoIml0ZW0iLHooKSwhMSkpLCExKSxLKCJkZWZpbml0aW9uIix6KCksITEpLEsoIm9uX2NvbmZsaWN0Iix6KCksITEpLEsoInBhcmFtZXRlcl9kZWZhdWx0X3ZhbHVlcyIsTSgpLCEwKSxLKCJhcmd1bWVudHNfc2NoZW1hIixNKCksITApLEsoInRyYW5zYWN0aW9uX29wYXF1ZV9kYXRhIixNKCksITApXSksTD10OCh7YXR0YWNoX29wYXF1ZV9kYXRhOlskXSxzY2hlbWFfbmFtZTpbWF0sbmFtZTpbUV0sbWFjcm9fdHlwZTpbWl0scGFyYW1ldGVyczpbSl0sZGVmaW5pdGlvbjpbWV0sb25fY29uZmxpY3Q6W0hdLHBhcmFtZXRlcl9kZWZhdWx0X3ZhbHVlczpbVz8/bnVsbF0sYXJndW1lbnRzX3NjaGVtYTpbUD8/bnVsbF0sdHJhbnNhY3Rpb25fb3BhcXVlX2RhdGE6W0c/P251bGxdfSxxKTthd2FpdCB0aGlzLnJwYy5jYWxsKCJjYXRhbG9nX21hY3JvX2NyZWF0ZSIsQVooTCkpfWFzeW5jIG1hY3JvRHJvcCgkLFgsUSxaLEope2F3YWl0IHRoaXMucnBjLmNhbGwoImNhdGFsb2dfbWFjcm9fZHJvcCIse2F0dGFjaF9vcGFxdWVfZGF0YTokLHNjaGVtYV9uYW1lOlgsbmFtZTpRLGlnbm9yZV9ub3RfZm91bmQ6Wj8/ITEsdHJhbnNhY3Rpb25fb3BhcXVlX2RhdGE6Sj8/bnVsbH0pfWNsb3NlKCl7dGhpcy5ycGMuY2xvc2UoKX19ZnVuY3Rpb24gcksoJCl7bGV0IFg9W10sUT0wO2ZvcihsZXQgWiBvZiAkLmZpZWxkcyl7bGV0IEo9Wi5tZXRhZGF0YSxIPUouZ2V0KGtLKT09PWpLP1oubmFtZTpRKyssVz1KLmdldChTSyksUD1XPT09REssRz1XPT09d0sscT1KLmdldChWSyk9PT1CSyxMPUouZ2V0KElLKT09PV9LLE49Si5nZXQoVEspPz8iIixVPUouZ2V0KHhLKSxrPUouZ2V0KGdLKSxTPUouZ2V0KHZLKSxzPUouZ2V0KGhLKTtYLnB1c2goe25hbWU6Wi5uYW1lLHBvc2l0aW9uOkgsYXJyb3dUeXBlOloudHlwZSxpc1RhYmxlSW5wdXQ6UCxpc0FueVR5cGU6Ryxpc1ZhcmFyZ3M6cSxpc0NvbnN0OkwsZG9jOk4sZGVmYXVsdEpzb246VSxjaG9pY2VzSnNvbjprLHJhbmdlTm90YXRpb246UyxwYXR0ZXJuOnN9KX1yZXR1cm4gWH12YXIgcFY9RihbSygibmFtZSIseigpLCExKSxLKCJkZXNjcmlwdGlvbiIseigpLCExKSxLKCJ0eXBlIixNKCksITEpLEsoImRlZmF1bHRfdmFsdWUiLE0oKSwhMCksSygicmVxdWlyZWQiLF8oKSwhMCldKTtmdW5jdGlvbiBpSygkKXtsZXQgWD1bLi4uTjAoRjAoJCkpXVswXTtpZihYPT09dm9pZCAwKXRocm93IEVycm9yKCJDYW5ub3QgZGVzZXJpYWxpemUgQXR0YWNoT3B0aW9uU3BlYyBmcm9tIGFuIGVtcHR5IGJhdGNoIik7bGV0IFo9ZSQoSjAoWC50eXBlKSkuZmllbGRzWzBdLnR5cGUsSixZPVguZGVmYXVsdF92YWx1ZTtpZihZIT1udWxsKXtsZXQgSD1KMChZKTtpZihILmxlbmd0aD4wKUo9Wy4uLk4wKEYwKEgpKV1bMF0/LnZhbHVlfXJldHVybntuYW1lOlN0cmluZyhYLm5hbWUpLGRlc2NyaXB0aW9uOlN0cmluZyhYLmRlc2NyaXB0aW9uPz8iIiksdHlwZTpaLC4uLko9PT12b2lkIDB8fEo9PT1udWxsP3t9OntkZWZhdWx0Okp9LHJlcXVpcmVkOlgucmVxdWlyZWQ9PT0hMH19ZnVuY3Rpb24gYUsoJCl7cmV0dXJuIEFycmF5LmZyb20oJCxpSyl9TDAoKTt2YXIgQ1o9InZnaV9ycGMubWV0aG9kIixKWD0idmdpX3JwYy5sb2dfbGV2ZWwiLHRLPSJ2Z2lfcnBjLmxvZ19tZXNzYWdlIix2SD0idmdpX3JwYy5sb2dfZXh0cmEiLE9aPSJ2Z2lfcnBjLnJlcXVlc3RfdmVyc2lvbiIseTQ9IjEiO3ZhciBlSz0idmdpX3JwYy5wcm90b2NvbF9uYW1lIjt2YXIgbTQ9InZnaV9ycGMucHJvdG9jb2xfdmVyc2lvbiIsaEg9Il9fZGVzY3JpYmVfXyIsVDE9InZnaV9ycGMuc3RyZWFtX3N0YXRlI2I2NCIsa1o9InZnaV9ycGMuY2FsbF9zdGF0ZSNiNjQiO3ZhciBmND0idmdpX3JwYy5sb2NhdGlvbiIseUg9InZnaV9ycGMubG9jYXRpb24uc2hhMjU2IjtjbGFzcyBCOCBleHRlbmRzIEVycm9ye2Vycm9yVHlwZTtlcnJvck1lc3NhZ2U7cmVtb3RlVHJhY2ViYWNrO2NvbnN0cnVjdG9yKCQsWCxRKXtzdXBlcihgJHskfTogJHtYfWApO3RoaXMuZXJyb3JUeXBlPSQ7dGhpcy5lcnJvck1lc3NhZ2U9WDt0aGlzLnJlbW90ZVRyYWNlYmFjaz1RO3RoaXMubmFtZT0iUnBjRXJyb3IifX1MMCgpO2Z1bmN0aW9uIGlxKCQpe3JldHVybiB0eXBlb2YgJD09PSJvYmplY3QiJiYkIT09bnVsbCYmdHlwZW9mICQuYnVmZmVycz09PSJvYmplY3QifWZ1bmN0aW9uICRQKCQsWCl7bGV0IFE9LTE7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KCQpKVE9JC5ieXRlTGVuZ3RoO2Vsc2UgaWYoJCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKVE9JC5ieXRlTGVuZ3RoO2Vsc2UgaWYoaXEoJCkpZm9yKGxldCBaIG9mIE9iamVjdC52YWx1ZXMoJC5idWZmZXJzKSl7bGV0IEo9Wj8uYnl0ZUxlbmd0aDtpZih0eXBlb2YgSj09PSJudW1iZXIiJiZKPlEpUT1KfWVsc2UgaWYodHlwZW9mICQ9PT0ic3RyaW5nIilRPSQubGVuZ3RoO2lmKFE+MjE0NzQ4MzY0MCl0aHJvdyBSYW5nZUVycm9yKGAke1h9IGlzICR7UX0gYnl0ZXM7IHRoaXMgVHlwZVNjcmlwdCB3b3JrZXIgY2FuIGVuY29kZSBhdCBtb3N0IDIxNDc0ODM2NDAgKDIgR2lCIC0gOCkuIEJvdGggQXJyb3cgYmFja2VuZHMgYWxpZ24gYnVmZmVycyB3aXRoIChieXRlTGVuZ3RoICsgNykgJiB+NywgYW5kIHRoZSBiaXR3aXNlICYgdHJ1bmNhdGVzIHRvIGludDMyLCBzbyBhIGxhcmdlciB2YWx1ZSB3b3VsZCBiZSBzZW50IGFzIGEgbmVnYXRpdmUgYm9keUxlbmd0aC4gVGhlIHdpcmUgYW5kIHRoZSBgKyJwcm90b2NvbCBjYXJyeSBpdCBmaW5lIOKAlCB0aGUgbGltaXQgaXMgdGhlIEphdmFTY3JpcHQgQXJyb3cgZW5jb2RlcnMnLCBub3QgdmdpLXJwYydzLiIpfXZhciBtSD0oKT0+bmV3IGI4O3ZhciBiND0oKT0+bmV3IF84O3ZhciBmSD0oJD1udWxsKT0+bmV3IFEwKE8uTUlDUk9TRUNPTkQsJCk7ZnVuY3Rpb24gRVEoJCxYLFE9ITAsWil7cmV0dXJuIG5ldyB3KCQsWCxRLFo/P25ldyBNYXApfWZ1bmN0aW9uIHA0KCQsWCl7cmV0dXJuIG5ldyBCKCQsWD8/bmV3IE1hcCl9ZnVuY3Rpb24gYkgoJCl7bGV0IFg9QTguZnJvbSgkKSxRPVsuLi5YXTtpZihRLmxlbmd0aD4wKXJldHVybiBRWzBdLnNjaGVtYTtpZihYLnNjaGVtYSlyZXR1cm4gWC5zY2hlbWE7dGhyb3cgRXJyb3IoIkNhbm5vdCBkZXNlcmlhbGl6ZSBzY2hlbWEgZnJvbSBlbXB0eSBJUEMgc3RyZWFtIil9ZnVuY3Rpb24gYzQoJCl7bGV0IFg9QTguZnJvbSgkKSxRPVsuLi5YXTtpZihRLmxlbmd0aD09PTApe2xldCBaPVguc2NoZW1hPz9uZXcgQihbXSksSj1uZXcgbChaLmZpZWxkcyksWT1DKHt0eXBlOkosbGVuZ3RoOjAsY2hpbGRyZW46W10sbnVsbENvdW50OjB9KTtyZXR1cm4gbmV3IGcoWixZKX1yZXR1cm4gUVswXX1mdW5jdGlvbiBqWigkLFgpe2xldCBRPSQsWj1RLmZpZWxkcy5tYXAoKEgpPT56UShILnR5cGUpKSxKPW5ldyBsKFEuZmllbGRzKSxZPUMoe3R5cGU6SixsZW5ndGg6MCxjaGlsZHJlbjpaLG51bGxDb3VudDowfSk7cmV0dXJuIG5ldyBnKFEsWSxYKX1mdW5jdGlvbiB6USgkKXtsZXQgWD17RGF0YVR5cGU6UixEYXRhOm59O2lmKFguRGF0YVR5cGUuaXNTdHJ1Y3QoJCkpe2xldCBRPSQuY2hpbGRyZW4ubWFwKChaKT0+elEoWi50eXBlKSk7cmV0dXJuIEMoe3R5cGU6JCxsZW5ndGg6MCxjaGlsZHJlbjpRLG51bGxDb3VudDowfSl9aWYoWC5EYXRhVHlwZS5pc0xpc3QoJCkpe2xldCBRPXpRKCQuY2hpbGRyZW5bMF0udHlwZSk7cmV0dXJuIEMoe3R5cGU6JCxsZW5ndGg6MCxjaGlsZDpRLG51bGxDb3VudDowLHZhbHVlT2Zmc2V0czpuZXcgSW50MzJBcnJheShbMF0pfSl9aWYoWC5EYXRhVHlwZS5pc0ZpeGVkU2l6ZUxpc3QoJCkpe2xldCBRPXpRKCQuY2hpbGRyZW5bMF0udHlwZSk7cmV0dXJuIEMoe3R5cGU6JCxsZW5ndGg6MCxjaGlsZDpRLG51bGxDb3VudDowfSl9aWYoWC5EYXRhVHlwZS5pc01hcCgkKSl7bGV0IFE9JC5jaGlsZHJlblswXT8udHlwZSxaPVE/elEoUSk6Qyh7dHlwZTpuZXcgbChbXSksbGVuZ3RoOjAsY2hpbGRyZW46W10sbnVsbENvdW50OjB9KTtyZXR1cm4gQyh7dHlwZTokLGxlbmd0aDowLGNoaWxkOlosbnVsbENvdW50OjAsdmFsdWVPZmZzZXRzOm5ldyBJbnQzMkFycmF5KFswXSl9KX1pZihYLkRhdGFUeXBlLmlzVW5pb24oJCkpe2xldCBRPSQuY2hpbGRyZW4ubWFwKChaKT0+elEoWi50eXBlKSk7aWYoWC5EYXRhVHlwZS5pc0RlbnNlVW5pb24oJCkpcmV0dXJuIEMoe3R5cGU6JCxsZW5ndGg6MCx0eXBlSWRzOm5ldyBJbnQ4QXJyYXkoMCksdmFsdWVPZmZzZXRzOm5ldyBJbnQzMkFycmF5KDApLGNoaWxkcmVuOlEsbnVsbENvdW50OjB9KTtyZXR1cm4gQyh7dHlwZTokLGxlbmd0aDowLHR5cGVJZHM6bmV3IEludDhBcnJheSgwKSxjaGlsZHJlbjpRLG51bGxDb3VudDowfSl9cmV0dXJuIEMoe3R5cGU6JCxsZW5ndGg6MCxudWxsQ291bnQ6MH0pfWZ1bmN0aW9uIHU0KCQsWCxRKXtsZXQgWj0kLEo9e0RhdGFUeXBlOlIsRGF0YTpufSxZPVouZmllbGRzLm1hcCgoUCk9PntsZXQgRz1YW1AubmFtZV07aWYoJFAoRyxQLm5hbWUpLEcgaW5zdGFuY2VvZiBKLkRhdGEpcmV0dXJuIEc7cmV0dXJuIGE4KFtHXSxQLnR5cGUpLmRhdGFbMF19KSxIPW5ldyBsKFouZmllbGRzKSxXPUMoe3R5cGU6SCxsZW5ndGg6MSxjaGlsZHJlbjpZLG51bGxDb3VudDowfSk7cmV0dXJuIG5ldyBnKFosVyxRKX1mdW5jdGlvbiBwSCgkLFgpe2xldCBRPW5ldyBaJDtRLnJlc2V0KHZvaWQgMCwkKTtmb3IobGV0IFogb2YgWClRLl93cml0ZVJlY29yZEJhdGNoKFopO3JldHVybiBRLmNsb3NlKCksUS50b1VpbnQ4QXJyYXkoITApfXZhciBhcT0oJCxYKT0+e2lmKCQudHlwZUlkPT09WC50eXBlSWQpcmV0dXJuITE7aWYoJC5jb25zdHJ1Y3Rvcj09PVguY29uc3RydWN0b3IpcmV0dXJuITE7cmV0dXJuITB9LFhQPSgkKT0+JC50eXBlSWQ9PT1FLkludHx8JC50eXBlSWQ9PT1FLkZsb2F0O2Z1bmN0aW9uIGNIKCQsWCl7bGV0IFE9JDtpZihRLm51bVJvd3M9PT0wKXJldHVybiAkO2xldCBaPVg7aWYoUS5zY2hlbWEuZmllbGRzLmxlbmd0aCE9PVouZmllbGRzLmxlbmd0aCl0aHJvdyBUeXBlRXJyb3IoYEZpZWxkIGNvdW50IG1pc21hdGNoOiBleHBlY3RlZCAke1ouZmllbGRzLmxlbmd0aH0sIGdvdCAke1Euc2NoZW1hLmZpZWxkcy5sZW5ndGh9YCk7Zm9yKGxldCBQPTA7UDxaLmZpZWxkcy5sZW5ndGg7UCsrKWlmKFEuc2NoZW1hLmZpZWxkc1tQXS5uYW1lIT09Wi5maWVsZHNbUF0ubmFtZSl0aHJvdyBUeXBlRXJyb3IoYEZpZWxkIG5hbWUgbWlzbWF0Y2ggYXQgaW5kZXggJHtQfTogZXhwZWN0ZWQgJyR7Wi5maWVsZHNbUF0ubmFtZX0nLCBnb3QgJyR7US5zY2hlbWEuZmllbGRzW1BdLm5hbWV9J2ApO2xldCBKPSExLFk9Wi5maWVsZHMubWFwKChQLEcpPT57bGV0IHE9US5kYXRhLmNoaWxkcmVuW0ddLEw9cS50eXBlLE49UC50eXBlO2lmKEw9PT1OKXJldHVybiBxO2lmKCFhcShMLE4pKXJldHVybiBKPSEwLHEuY2xvbmUoTik7aWYoWFAoTCkmJlhQKE4pKXtKPSEwO2xldCBVPVEuZ2V0Q2hpbGRBdChHKSxrPVtdO2ZvcihsZXQgUz0wO1M8US5udW1Sb3dzO1MrKyl7bGV0IHM9VS5nZXQoUyk7ay5wdXNoKHR5cGVvZiBzPT09ImJpZ2ludCI/TnVtYmVyKHMpOnMpfXJldHVybiBhOChrLE4pLmRhdGFbMF19cmV0dXJuIEo9ITAscS5jbG9uZShOKX0pO2lmKCFKKXJldHVybiAkO2xldCBIPW5ldyBsKFouZmllbGRzKSxXPUMoe3R5cGU6SCxsZW5ndGg6US5udW1Sb3dzLGNoaWxkcmVuOlksbnVsbENvdW50OlEuZGF0YS5udWxsQ291bnQsbnVsbEJpdG1hcDpRLmRhdGEubnVsbEJpdG1hcH0pO3JldHVybiBuZXcgZyhaLFcsUS5tZXRhZGF0YSl9ckgoKTtmdW5jdGlvbiBLUCgkLFgpe3JldHVybiBqWigkLFgpfWZ1bmN0aW9uIEY5KCQpe2xldCBYPW5ldyBVUkwoJCk7aWYoWC5wcm90b2NvbCE9PSJodHRwczoiKXRocm93IEVycm9yKGBFeHRlcm5hbCBsb2NhdGlvbiBVUkwgbXVzdCB1c2UgSFRUUFMsIGdvdCAiJHtYLnByb3RvY29sfSJgKX1hc3luYyBmdW5jdGlvbiBBOSgkKXtsZXQgWD1uZXcgQXJyYXlCdWZmZXIoJC5ieXRlTGVuZ3RoKTtuZXcgVWludDhBcnJheShYKS5zZXQoJCk7bGV0IFE9YXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoIlNIQS0yNTYiLFgpO3JldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KFEpKS5tYXAoKFopPT5aLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikpLmpvaW4oIiIpfWZ1bmN0aW9uIHgxKCQpe2lmKCQubnVtUm93cyE9PTApcmV0dXJuITE7bGV0IFg9JC5tZXRhZGF0YTtpZighWClyZXR1cm4hMTtyZXR1cm4gWC5oYXMoZjQpJiYhWC5oYXMoSlgpfWZ1bmN0aW9uIFBQKCQsWCxRKXtsZXQgWj1uZXcgTWFwO2lmKFouc2V0KGY0LFgpLFEpWi5zZXQoeUgsUSk7cmV0dXJuIEtQKCQsWil9YXN5bmMgZnVuY3Rpb24gSFgoJCxYKXtpZighWClyZXR1cm4gJDtpZigheDEoJCkpcmV0dXJuICQ7bGV0IFE9JC5tZXRhZGF0YT8uZ2V0KGY0KTtpZighUSlyZXR1cm4gJDtsZXQgWj1YLnVybFZhbGlkYXRvcj09PW51bGw/dm9pZCAwOlgudXJsVmFsaWRhdG9yPz9GOTtpZihaKVooUSk7bGV0IEo9YXdhaXQgZmV0Y2goUSk7aWYoIUoub2spdGhyb3cgRXJyb3IoYEV4dGVybmFsIGxvY2F0aW9uIGZldGNoIGZhaWxlZDogJHtKLnN0YXR1c30gJHtKLnN0YXR1c1RleHR9IFt1cmw6ICR7UX1dYCk7bGV0IFk9bmV3IFVpbnQ4QXJyYXkoYXdhaXQgSi5hcnJheUJ1ZmZlcigpKTtpZihKLmhlYWRlcnMuZ2V0KCJDb250ZW50LUVuY29kaW5nIik9PT0ienN0ZCIpe2xldCBHPVkuYnl0ZUxlbmd0aCoxNjtZPW5ldyBVaW50OEFycmF5KGF3YWl0IHNIKFksRykpfWxldCBXPSQubWV0YWRhdGE/LmdldCh5SCk7aWYoVyl7bGV0IEc9YXdhaXQgQTkoWSk7aWYoRyE9PVcpdGhyb3cgRXJyb3IoYFNIQS0yNTYgY2hlY2tzdW0gbWlzbWF0Y2ggZm9yICR7UX06IGV4cGVjdGVkICR7V30sIGdvdCAke0d9YCl9bGV0IFA9YzQoWSk7aWYoUC5udW1Sb3dzPT09MCYmUC5zY2hlbWEuZmllbGRzLmxlbmd0aD09PTApdGhyb3cgRXJyb3IoYE5vIGRhdGEgYmF0Y2ggZm91bmQgaW4gZXh0ZXJuYWwgSVBDIHN0cmVhbSBmcm9tICR7UX1gKTtyZXR1cm4gUH1hc3luYyBmdW5jdGlvbiBVOSgkLFgsUSl7bGV0IFo9WC53cml0YWJsZS5nZXRXcml0ZXIoKSxKPVgucmVhZGFibGUuZ2V0UmVhZGVyKCksWT1uZXcgVWludDhBcnJheSgkLmJ5dGVMZW5ndGgpO1kuc2V0KCQpO2xldCBIPShhc3luYygpPT57YXdhaXQgWi53cml0ZShZKSxhd2FpdCBaLmNsb3NlKCl9KSgpLFc9W10sUD0wO3doaWxlKCEwKXtsZXR7dmFsdWU6TCxkb25lOk59PWF3YWl0IEoucmVhZCgpO2lmKE4pYnJlYWs7bGV0IFU9TDtpZihQKz1VLmJ5dGVMZW5ndGgsUSE9bnVsbCYmUD5RKXRocm93IEVycm9yKGBnemlwIGRlY29tcHJlc3NlZCBzaXplICgke1B9KSBleGNlZWRzIGNhcCAoJHtRfSlgKTtXLnB1c2goVSl9YXdhaXQgSDtsZXQgRz1uZXcgVWludDhBcnJheShQKSxxPTA7Zm9yKGxldCBMIG9mIFcpRy5zZXQoTCxxKSxxKz1MLmJ5dGVMZW5ndGg7cmV0dXJuIEd9YXN5bmMgZnVuY3Rpb24gR1AoJCxYKXtyZXR1cm4gVTkoJCxuZXcgRGVjb21wcmVzc2lvblN0cmVhbSgiZ3ppcCIpLFgpfXZhciBnMT0iYXBwbGljYXRpb24vdm5kLmFwYWNoZS5hcnJvdy5zdHJlYW0iO3ZhciBRST1wNChbRVEoImNvdW50IixtSCgpLCEwKV0pLFpJPXA0KFtFUSgidXBsb2FkX3VybCIsYjQoKSwhMSksRVEoImRvd25sb2FkX3VybCIsYjQoKSwhMSksRVEoImV4cGlyZXNfYXQiLGZIKCJVVEMiKSwhMSldKTtmdW5jdGlvbiBMNigkLFgpe2xldCBRPVgubWFwKChaKT0+Y0goWiwkKSk7cmV0dXJuIHBIKCQsUSl9ZnVuY3Rpb24gcVAoJCxYKXtsZXQgUT0kLmdldChYKT8/JC5nZXQoWC50b0xvd2VyQ2FzZSgpKTtpZihRPT1udWxsKXJldHVybiBudWxsO2xldCBaPU51bWJlci5wYXJzZUludChRLDEwKTtyZXR1cm4gTnVtYmVyLmlzRmluaXRlKFopP1o6bnVsbH1mdW5jdGlvbiB6UCgkKXtsZXQgUT0oJC5nZXQoIlZHSS1VcGxvYWQtVVJMLVN1cHBvcnQiKT8/JC5nZXQoIlZHSS1VcGxvYWQtVVJMLVN1cHBvcnQiLnRvTG93ZXJDYXNlKCkpKT09PSJ0cnVlIixaPW51bGwsSj0kLmdldCgiQ2FjaGUtQ29udHJvbCIpPz8kLmdldCgiY2FjaGUtY29udHJvbCIpO2lmKEopZm9yKGxldCBZIG9mIEouc3BsaXQoIiwiKSl7bGV0IEg9WS50cmltKCkudG9Mb3dlckNhc2UoKTtpZihILnN0YXJ0c1dpdGgoIm1heC1hZ2U9Iikpe2xldCBXPU51bWJlci5wYXJzZUZsb2F0KEguc2xpY2UoOCkpO2lmKE51bWJlci5pc0Zpbml0ZShXKSlaPURhdGUubm93KCkrVyoxMDAwO2JyZWFrfX1yZXR1cm57bWF4UmVxdWVzdEJ5dGVzOnFQKCQsIlZHSS1NYXgtUmVxdWVzdC1CeXRlcyIpLHVwbG9hZFVybFN1cHBvcnQ6USxtYXhVcGxvYWRCeXRlczpxUCgkLCJWR0ktTWF4LVVwbG9hZC1CeXRlcyIpLGNhY2hlRXhwaXJlc0F0Olp9fWZ1bmN0aW9uIEVQKCQpe2lmKCEkKXJldHVybiExO2lmKCQuY2FjaGVFeHBpcmVzQXQ9PW51bGwpcmV0dXJuITA7cmV0dXJuIERhdGUubm93KCk8JC5jYWNoZUV4cGlyZXNBdH12YXIgUjk9WyJ6c3RkIiwiZ3ppcCJdO3ZhciBIST1bLi4uUjksImlkZW50aXR5Il07dmFyIGlIPSJDb250ZW50LUVuY29kaW5nIixhSD0iWC1WR0ktQ29udGVudC1FbmNvZGluZyI7ZnVuY3Rpb24gQzkoJCl7bGV0IFg9JC5nZXQoYUgpPy50cmltKCkudG9Mb3dlckNhc2UoKTtpZihYJiZYIT09ImlkZW50aXR5IilyZXR1cm57Y29kZWM6WCxjdXN0b206ITB9O2lmKCQuZ2V0KGlIKT8udHJpbSgpLnRvTG93ZXJDYXNlKCk9PT0ienN0ZCIpcmV0dXJue2NvZGVjOiJ6c3RkIixjdXN0b206ITF9O3JldHVybntjb2RlYzpudWxsLGN1c3RvbTohMX19YXN5bmMgZnVuY3Rpb24gTVEoJCxYLFEpe2xldHtjb2RlYzpaLGN1c3RvbTpKfT1DOSgkKTtpZighWilyZXR1cm4gWDtpZihaPT09Imd6aXAiKXJldHVybiBuZXcgVWludDhBcnJheShhd2FpdCBHUChYKSk7aWYoWj09PSJ6c3RkIil7aWYoIVEpdGhyb3cgbmV3IEI4KCJQcm90b2NvbEVycm9yIiwiU2VydmVyIHNlbnQgYSB6c3RkLWVuY29kZWQgcmVzcG9uc2UgYnV0IHRoaXMgY2xpZW50IGhhcyBubyB6c3RkIGRlY29kZXIuIEluc3RhbGwgdGhlIG9wdGlvbmFsIHpzdGQgZGVwZW5kZW5jeSwgb3IgY29uZmlndXJlIHRoZSBzZXJ2ZXIgbm90IHRvIG5lZ290aWF0ZSB6c3RkLiIsIiIpO3JldHVybiBuZXcgVWludDhBcnJheShhd2FpdCBRKFgpKX10aHJvdyBuZXcgQjgoIlByb3RvY29sRXJyb3IiLGBVbnN1cHBvcnRlZCByZXNwb25zZSBlbmNvZGluZyAnJHtafScke0o/YCAoJHthSH0pYDpgICgke2lIfSlgfS5gLCIiKX1MMCgpO0wwKCk7TDAoKTt2YXIgTzk9NjcxMDg4NjQ7ZnVuY3Rpb24gazkoJCl7bGV0IFg9JDtyZXR1cm4gdHlwZW9mIFg/LnJlYWQ9PT0iZnVuY3Rpb24iJiZ0eXBlb2YgWD8ucGlwZT09PSJmdW5jdGlvbiJ9ZnVuY3Rpb24gajkoJCl7cmV0dXJuIG5ldyBQcm94eSgkLHtnZXQoWCxRKXtpZihRPT09InJlYWQiKXJldHVybihKKT0+WC5yZWFkKHR5cGVvZiBKPT09Im51bWJlciI/TWF0aC5taW4oSixPOSk6Sik7bGV0IFo9UmVmbGVjdC5nZXQoWCxRLFgpO3JldHVybiB0eXBlb2YgWj09PSJmdW5jdGlvbiI/Wi5iaW5kKFgpOlp9fSl9Y2xhc3MgbjR7cmVhZGVyO2luaXRpYWxpemVkPSExO3N0cmVhbUVuZGVkPSExO2NvbnN0cnVjdG9yKCQpe3RoaXMucmVhZGVyPSR9c3RhdGljIGFzeW5jIGNyZWF0ZSgkKXtsZXQgWD1rOSgkKT9qOSgkKTokLFE9YXdhaXQgQTguZnJvbShYKTtpZihhd2FpdCBRLm9wZW4oe2F1dG9EZXN0cm95OiExfSksUS5jbG9zZWQpdGhyb3cgRXJyb3IoIklucHV0IHN0cmVhbSBjbG9zZWQgYmVmb3JlIGZpcnN0IElQQyBtZXNzYWdlIik7cmV0dXJuIG5ldyBuNChRKX1hc3luYyByZWFkU3RyZWFtKCl7aWYodGhpcy5pbml0aWFsaXplZCl7aWYoYXdhaXQgdGhpcy5yZWFkZXIucmVzZXQoKS5vcGVuKCksdGhpcy5yZWFkZXIuY2xvc2VkKXJldHVybiBudWxsfXRoaXMuaW5pdGlhbGl6ZWQ9ITA7bGV0ICQ9dGhpcy5yZWFkZXIuc2NoZW1hO2lmKCEkKXJldHVybiBudWxsO2xldCBYPVtdO3doaWxlKCEwKXtsZXQgUT1hd2FpdCB0aGlzLnJlYWRlci5uZXh0KCk7aWYoUS5kb25lKWJyZWFrO2lmKFEudmFsdWUuY29uc3RydWN0b3IubmFtZT09PSJfSW50ZXJuYWxFbXB0eVBsYWNlaG9sZGVyUmVjb3JkQmF0Y2giKWJyZWFrO1gucHVzaChRLnZhbHVlKX1yZXR1cm57c2NoZW1hOiQsYmF0Y2hlczpYfX1hc3luYyBvcGVuTmV4dFN0cmVhbSgpe2lmKHRoaXMuaW5pdGlhbGl6ZWQpe2lmKGF3YWl0IHRoaXMucmVhZGVyLnJlc2V0KCkub3BlbigpLHRoaXMucmVhZGVyLmNsb3NlZClyZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5pbml0aWFsaXplZD0hMCx0aGlzLnN0cmVhbUVuZGVkPSExLHRoaXMucmVhZGVyLnNjaGVtYT8/bnVsbH1hc3luYyByZWFkTmV4dEJhdGNoKCl7aWYodGhpcy5zdHJlYW1FbmRlZClyZXR1cm4gbnVsbDtsZXQgJD1hd2FpdCB0aGlzLnJlYWRlci5uZXh0KCk7aWYoJC5kb25lKXJldHVybiB0aGlzLnN0cmVhbUVuZGVkPSEwLG51bGw7aWYoJC52YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lPT09Il9JbnRlcm5hbEVtcHR5UGxhY2Vob2xkZXJSZWNvcmRCYXRjaCIpcmV0dXJuIHRoaXMuc3RyZWFtRW5kZWQ9ITAsbnVsbDtyZXR1cm4gJC52YWx1ZX1hc3luYyBjYW5jZWwoKXthd2FpdCB0aGlzLnJlYWRlci5jYW5jZWwoKX19ZnVuY3Rpb24gTVAoJCl7aWYodHlwZW9mICQ9PT0ic3RyaW5nIilyZXR1cm4gbmV3IF84O2lmKHR5cGVvZiAkPT09ImJvb2xlYW4iKXJldHVybiBuZXcgUzg7aWYodHlwZW9mICQ9PT0iYmlnaW50IilyZXR1cm4gbmV3IGI4O2lmKHR5cGVvZiAkPT09Im51bWJlciIpcmV0dXJuIG5ldyB0MDtpZigkIGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gbmV3IFQwO3JldHVybiBuZXcgXzh9ZnVuY3Rpb24gdEgoJCxYKXtpZihYPT1udWxsKXJldHVybiBYO2lmKFIuaXNJbnQoJCkmJiQuYml0V2lkdGg9PT02NCl7aWYodHlwZW9mIFg9PT0ibnVtYmVyIilyZXR1cm4gQmlnSW50KFgpO3JldHVybiBYfWlmKFIuaXNNYXAoJCkpe2lmKFggaW5zdGFuY2VvZiBNYXApe2xldCBaPSQuY2hpbGRyZW5bMF0udHlwZS5jaGlsZHJlblsxXS50eXBlLEo9bmV3IE1hcDtmb3IobGV0W1ksSF1vZiBYKUouc2V0KFksdEgoWixIKSk7cmV0dXJuIEp9cmV0dXJuIFh9aWYoUi5pc0xpc3QoJCkpe2lmKEFycmF5LmlzQXJyYXkoWCkpe2xldCBRPSQuY2hpbGRyZW5bMF0udHlwZTtyZXR1cm4gWC5tYXAoKFopPT50SChRLFopKX1yZXR1cm4gWH1yZXR1cm4gWH1mdW5jdGlvbiBXWCgkLFgsUSxaKXtsZXQgSj1uZXcgTWFwO2lmKEouc2V0KENaLFEpLEouc2V0KE9aLHk0KSxaPy5wcm90b2NvbFZlcnNpb24pSi5zZXQobTQsWi5wcm90b2NvbFZlcnNpb24pO2lmKCQuZmllbGRzLmxlbmd0aD09PTApe2xldCBXPWpaKCQsSik7cmV0dXJuIEw2KCQsW1ddKX1sZXQgWT17fTtmb3IobGV0IFcgb2YgJC5maWVsZHMpe2xldCBQPVhbVy5uYW1lXTtZW1cubmFtZV09UD09PXZvaWQgMD9udWxsOnRIKFcudHlwZSxQKX1sZXQgSD11NCgkLFksSik7cmV0dXJuIEw2KCQsW0hdKX1hc3luYyBmdW5jdGlvbiB2MSgkKXtsZXQgWD1hd2FpdCBBOC5mcm9tKCQpO2F3YWl0IFgub3BlbigpO2xldCBRPVguc2NoZW1hO2lmKCFRKXRocm93IG5ldyBCOCgiUHJvdG9jb2xFcnJvciIsIkVtcHR5IElQQyBzdHJlYW06IG5vIHNjaGVtYSIsIiIpO2xldCBaPVgucmVhZEFsbCgpO3JldHVybntzY2hlbWE6USxiYXRjaGVzOlp9fWZ1bmN0aW9uIGMwKCQsWCl7bGV0IFE9JC5tZXRhZGF0YTtpZighUSlyZXR1cm4hMTtsZXQgWj1RLmdldChKWCk7aWYoIVopcmV0dXJuITE7bGV0IEo9US5nZXQodEspPz8iIjtpZihaPT09IkVYQ0VQVElPTiIpe2xldCBZPVEuZ2V0KHZIKSxIPSJScGNFcnJvciIsVz1KLFA9IiI7aWYoWSl0cnl7bGV0IEc9SlNPTi5wYXJzZShZKTtIPUcuZXhjZXB0aW9uX3R5cGU/PyJScGNFcnJvciIsVz1HLmV4Y2VwdGlvbl9tZXNzYWdlPz9KLFA9Ry50cmFjZWJhY2s/PyIifWNhdGNoe310aHJvdyBuZXcgQjgoSCxXLFApfWlmKFgpe2xldCBZPVEuZ2V0KHZIKSxIO2lmKFkpdHJ5e0g9SlNPTi5wYXJzZShZKX1jYXRjaHt9WCh7bGV2ZWw6WixtZXNzYWdlOkosZXh0cmE6SH0pfXJldHVybiEwfWZ1bmN0aW9uIGgxKCQpe2xldCBYPVtdO2ZvcihsZXQgUT0wO1E8JC5udW1Sb3dzO1ErKyl7bGV0IFo9e307Zm9yKGxldCBKPTA7SjwkLnNjaGVtYS5maWVsZHMubGVuZ3RoO0orKyl7bGV0IFk9JC5zY2hlbWEuZmllbGRzW0pdLEg9JC5nZXRDaGlsZEF0KEopPy5nZXQoUSk7aWYodHlwZW9mIEg9PT0iYmlnaW50Iil7aWYoSD49QmlnSW50KE51bWJlci5NSU5fU0FGRV9JTlRFR0VSKSYmSDw9QmlnSW50KE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSlIPU51bWJlcihIKX1aW1kubmFtZV09SH1YLnB1c2goWil9cmV0dXJuIFh9YXN5bmMgZnVuY3Rpb24gTFAoJCl7bGV0IFg9bmV3IFJlYWRhYmxlU3RyZWFtKHtzdGFydChRKXtRLmVucXVldWUoJCksUS5jbG9zZSgpfX0pO3JldHVybiBuNC5jcmVhdGUoWCl9ZnVuY3Rpb24gZUgoJCl7cmV0dXJuIGJIKCQpfWFzeW5jIGZ1bmN0aW9uIFM5KCQsWCl7bGV0IFE9bnVsbDtmb3IobGV0IFcgb2YgJCl7aWYoVy5udW1Sb3dzPT09MCl7YzAoVyxYKTtjb250aW51ZX1RPVd9aWYoIVEpdGhyb3cgRXJyb3IoIkVtcHR5IF9fZGVzY3JpYmVfXyByZXNwb25zZSIpO2xldCBaPVEubWV0YWRhdGEsSj1aPy5nZXQoZUspPz8iIixZPVo/LmdldChtNCk/PyIiLEg9W107Zm9yKGxldCBXPTA7VzxRLm51bVJvd3M7VysrKXtsZXQgUD1RLmdldENoaWxkQXQoMCkuZ2V0KFcpLEc9US5nZXRDaGlsZEF0KDEpLmdldChXKSxxPVEuZ2V0Q2hpbGRBdCgyKS5nZXQoVyksTD1RLmdldENoaWxkQXQoMykuZ2V0KFcpLE49US5nZXRDaGlsZEF0KDQpLmdldChXKSxVPVEuZ2V0Q2hpbGRBdCg1KS5nZXQoVyksaz1RLmdldENoaWxkQXQoNik/LmdldChXKSxTPWF3YWl0IGVIKEwpLHM9YXdhaXQgZUgoTiksUDg9e25hbWU6UCx0eXBlOkcscGFyYW1zU2NoZW1hOlMscmVzdWx0U2NoZW1hOnN9O2lmKEc9PT0ic3RyZWFtIilQOC5vdXRwdXRTY2hlbWE9cztpZihVJiZrKVA4LmhlYWRlclNjaGVtYT1hd2FpdCBlSChrKTtILnB1c2goUDgpfXJldHVybntwcm90b2NvbE5hbWU6Sixwcm90b2NvbFZlcnNpb246WSxtZXRob2RzOkh9fWFzeW5jIGZ1bmN0aW9uICRXKCQsWCl7bGV0IFE9WD8ucHJlZml4Pz8iIixaPW5ldyBCKFtdKSxKPVdYKFose30saEgpLFk9eyJDb250ZW50LVR5cGUiOmcxfTtpZihYPy5hdXRob3JpemF0aW9uKVkuQXV0aG9yaXphdGlvbj1YLmF1dGhvcml6YXRpb247bGV0IEg9WD8uY29tcHJlc3Npb25MZXZlbCxXPVg/LmNvbXByZXNzRm4sUD1YPy5kZWNvbXByZXNzRm4sRz1KO2lmKEghPW51bGwmJlcpWVsiQ29udGVudC1FbmNvZGluZyJdPSJ6c3RkIixHPWF3YWl0IFcoSixIKTtpZihIIT1udWxsJiZQKVlbIkFjY2VwdC1FbmNvZGluZyJdPSJ6c3RkIjtsZXQgcT1hd2FpdCBmZXRjaChgJHskfSR7UX0vJHtoSH1gLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6WSxib2R5Okd9KTtpZihxLnN0YXR1cz09PTQwMSl0aHJvdyBuZXcgQjgoIkF1dGhlbnRpY2F0aW9uRXJyb3IiLCJBdXRoZW50aWNhdGlvbiByZXF1aXJlZCIsIiIpO2xldCBMPW5ldyBVaW50OEFycmF5KGF3YWl0IHEuYXJyYXlCdWZmZXIoKSksTj1uZXcgVWludDhBcnJheShhd2FpdCBNUShxLmhlYWRlcnMsTCxQKSkse2JhdGNoZXM6VX09YXdhaXQgdjEoTik7cmV0dXJuIFM5KFUpfUwwKCk7ZnVuY3Rpb24gRDkoJCxYKXtyZXR1cm4gWD09PW51bGw/JDpgJHskLmxlbmd0aH06JHskfSR7WH1gfWZ1bmN0aW9uIFhXKCQpe2xldCBYPSQuaW5kZXhPZigiOiIpO2lmKFg8MClyZXR1cm57Y3Vyc29yOiQsY2FsbFRva2VuOm51bGx9O2xldCBRPU51bWJlcigkLnNsaWNlKDAsWCkpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKFEpfHxRPDApcmV0dXJue2N1cnNvcjokLGNhbGxUb2tlbjpudWxsfTtsZXQgWj0kLnNsaWNlKFgrMSk7aWYoUT5aLmxlbmd0aClyZXR1cm57Y3Vyc29yOiQsY2FsbFRva2VuOm51bGx9O2xldCBKPVouc2xpY2UoUSk7cmV0dXJue2N1cnNvcjpaLnNsaWNlKDAsUSksY2FsbFRva2VuOko9PT0iIj9udWxsOkp9fWNsYXNzIG80e19iYXNlVXJsO19wcmVmaXg7X21ldGhvZDtfc3RhdGVUb2tlbjtfY2FsbFN0YXRlVG9rZW47X291dHB1dFNjaGVtYTtfaW5wdXRTY2hlbWE7X29uTG9nO19wZW5kaW5nQmF0Y2hlcztfZmluaXNoZWQ7X2hlYWRlcjtfY29tcHJlc3Npb25MZXZlbDtfY29tcHJlc3NGbjtfZGVjb21wcmVzc0ZuO19hdXRob3JpemF0aW9uO19leHRlcm5hbENvbmZpZztfcG9zdEZuO2NvbnN0cnVjdG9yKCQpe3RoaXMuX2Jhc2VVcmw9JC5iYXNlVXJsLHRoaXMuX3ByZWZpeD0kLnByZWZpeCx0aGlzLl9tZXRob2Q9JC5tZXRob2QsdGhpcy5fc3RhdGVUb2tlbj0kLnN0YXRlVG9rZW4sdGhpcy5fY2FsbFN0YXRlVG9rZW49JC5jYWxsU3RhdGVUb2tlbj8/bnVsbCx0aGlzLl9vdXRwdXRTY2hlbWE9JC5vdXRwdXRTY2hlbWEsdGhpcy5faW5wdXRTY2hlbWE9JC5pbnB1dFNjaGVtYSx0aGlzLl9vbkxvZz0kLm9uTG9nLHRoaXMuX3BlbmRpbmdCYXRjaGVzPSQucGVuZGluZ0JhdGNoZXMsdGhpcy5fZmluaXNoZWQ9JC5maW5pc2hlZCx0aGlzLl9oZWFkZXI9JC5oZWFkZXIsdGhpcy5fY29tcHJlc3Npb25MZXZlbD0kLmNvbXByZXNzaW9uTGV2ZWwsdGhpcy5fY29tcHJlc3NGbj0kLmNvbXByZXNzRm4sdGhpcy5fZGVjb21wcmVzc0ZuPSQuZGVjb21wcmVzc0ZuLHRoaXMuX2F1dGhvcml6YXRpb249JC5hdXRob3JpemF0aW9uLHRoaXMuX2V4dGVybmFsQ29uZmlnPSQuZXh0ZXJuYWxDb25maWcsdGhpcy5fcG9zdEZuPSQucG9zdEZufWFzeW5jIF9wb3N0KCQsWCl7aWYodGhpcy5fcG9zdEZuKXJldHVybiB0aGlzLl9wb3N0Rm4oJCxYKTtyZXR1cm4gZmV0Y2goJCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnRoaXMuX2J1aWxkSGVhZGVycygpLGJvZHk6YXdhaXQgdGhpcy5fcHJlcGFyZUJvZHkoWCl9KX1nZXQgaGVhZGVyKCl7cmV0dXJuIHRoaXMuX2hlYWRlcn1fdG9rZW5NZXRhZGF0YSgkKXtsZXQgWD1uZXcgTWFwO2lmKFguc2V0KFQxLCQpLHRoaXMuX2NhbGxTdGF0ZVRva2VuIT09bnVsbClYLnNldChrWix0aGlzLl9jYWxsU3RhdGVUb2tlbik7cmV0dXJuIFh9X3Jlc3VtZVRva2VuKCl7cmV0dXJuIHRoaXMuX3N0YXRlVG9rZW49PT1udWxsP251bGw6RDkodGhpcy5fc3RhdGVUb2tlbix0aGlzLl9jYWxsU3RhdGVUb2tlbil9X2J1aWxkSGVhZGVycygpe2xldCAkPXsiQ29udGVudC1UeXBlIjpnMX07aWYodGhpcy5fY29tcHJlc3Npb25MZXZlbCE9bnVsbCYmdGhpcy5fY29tcHJlc3NGbikkWyJDb250ZW50LUVuY29kaW5nIl09InpzdGQiO2lmKHRoaXMuX2NvbXByZXNzaW9uTGV2ZWwhPW51bGwmJnRoaXMuX2RlY29tcHJlc3NGbikkWyJBY2NlcHQtRW5jb2RpbmciXT0ienN0ZCI7aWYodGhpcy5fYXV0aG9yaXphdGlvbikkLkF1dGhvcml6YXRpb249dGhpcy5fYXV0aG9yaXphdGlvbjtyZXR1cm4gJH1hc3luYyBfcHJlcGFyZUJvZHkoJCl7aWYodGhpcy5fY29tcHJlc3Npb25MZXZlbCE9bnVsbCYmdGhpcy5fY29tcHJlc3NGbilyZXR1cm4gYXdhaXQgdGhpcy5fY29tcHJlc3NGbigkLHRoaXMuX2NvbXByZXNzaW9uTGV2ZWwpO3JldHVybiAkfWFzeW5jIF9yZWFkUmVzcG9uc2UoJCl7bGV0IFg9bmV3IFVpbnQ4QXJyYXkoYXdhaXQgJC5hcnJheUJ1ZmZlcigpKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgTVEoJC5oZWFkZXJzLFgsdGhpcy5fZGVjb21wcmVzc0ZuKSl9YXN5bmMgZXhjaGFuZ2UoJCl7aWYodGhpcy5fc3RhdGVUb2tlbj09PW51bGwpdGhyb3cgbmV3IEI4KCJQcm90b2NvbEVycm9yIiwiU3RyZWFtIGhhcyBmaW5pc2hlZCDigJQgbm8gc3RhdGUgdG9rZW4gYXZhaWxhYmxlIiwiIik7aWYoJC5sZW5ndGg9PT0wKXtsZXQgUD10aGlzLl9pbnB1dFNjaGVtYT8/dGhpcy5fb3V0cHV0U2NoZW1hLEc9dGhpcy5fYnVpbGRFbXB0eUJhdGNoKFApLHE9bmV3IGcoUCxHLmRhdGEsdGhpcy5fdG9rZW5NZXRhZGF0YSh0aGlzLl9zdGF0ZVRva2VuKSk7cmV0dXJuIHRoaXMuX2RvRXhjaGFuZ2UoUCxbcV0pfWxldCBRPU9iamVjdC5rZXlzKCRbMF0pLm1hcCgoUCk9PntsZXQgRztmb3IobGV0IE4gb2YgJClpZihOW1BdIT1udWxsKXtHPU5bUF07YnJlYWt9bGV0IHE9TVAoRyksTD0kLnNvbWUoKE4pPT5OW1BdPT1udWxsKTtyZXR1cm4gbmV3IHcoUCxxLEwpfSksWj1uZXcgQihRKSxKPVouZmllbGRzLm1hcCgoUCk9PntsZXQgRz0kLm1hcCgocSk9PnFbUC5uYW1lXSk7cmV0dXJuIGE4KEcsUC50eXBlKS5kYXRhWzBdfSksWT1uZXcgbChaLmZpZWxkcyksSD1DKHt0eXBlOlksbGVuZ3RoOiQubGVuZ3RoLGNoaWxkcmVuOkosbnVsbENvdW50OjB9KSxXPW5ldyBnKFosSCx0aGlzLl90b2tlbk1ldGFkYXRhKHRoaXMuX3N0YXRlVG9rZW4pKTtyZXR1cm4gdGhpcy5fZG9FeGNoYW5nZShaLFtXXSl9YXN5bmMgX2RvRXhjaGFuZ2UoJCxYKXtsZXQgUT1MNigkLFgpLFo9YXdhaXQgdGhpcy5fcG9zdChgJHt0aGlzLl9iYXNlVXJsfSR7dGhpcy5fcHJlZml4fS8ke3RoaXMuX21ldGhvZH0vZXhjaGFuZ2VgLFEpO2lmKFouc3RhdHVzPT09NDAxKXRocm93IG5ldyBCOCgiQXV0aGVudGljYXRpb25FcnJvciIsIkF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkIiwiIik7bGV0IEo9YXdhaXQgdGhpcy5fcmVhZFJlc3BvbnNlKFopLHtiYXRjaGVzOll9PWF3YWl0IHYxKEopLEg9W107Zm9yKGxldCBXIG9mIFkpe2lmKFcubnVtUm93cz09PTApe2MwKFcsdGhpcy5fb25Mb2cpO2xldCBHPVcubWV0YWRhdGE/LmdldChUMSk7aWYoRyl0aGlzLl9zdGF0ZVRva2VuPUc7Y29udGludWV9bGV0IFA9Vy5tZXRhZGF0YT8uZ2V0KFQxKTtpZihQKXRoaXMuX3N0YXRlVG9rZW49UDtIPWgxKFcpfXJldHVybiBIfV9idWlsZEVtcHR5QmF0Y2goJCl7bGV0IFg9JC5maWVsZHMubWFwKChKKT0+e3JldHVybiBDKHt0eXBlOkoudHlwZSxsZW5ndGg6MCxudWxsQ291bnQ6MH0pfSksUT1uZXcgbCgkLmZpZWxkcyksWj1DKHt0eXBlOlEsbGVuZ3RoOjAsY2hpbGRyZW46WCxudWxsQ291bnQ6MH0pO3JldHVybiBuZXcgZygkLFopfWFzeW5jKltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtmb3IobGV0ICQgb2YgdGhpcy5fcGVuZGluZ0JhdGNoZXMpe2lmKCQubnVtUm93cz09PTApaWYoeDEoJCkpJD1hd2FpdCBIWCgkLHRoaXMuX2V4dGVybmFsQ29uZmlnKTtlbHNle2MwKCQsdGhpcy5fb25Mb2cpO2NvbnRpbnVlfXlpZWxkIGgxKCQpfWlmKHRoaXMuX3BlbmRpbmdCYXRjaGVzPVtdLHRoaXMuX2ZpbmlzaGVkKXJldHVybjtpZih0aGlzLl9zdGF0ZVRva2VuPT09bnVsbClyZXR1cm47d2hpbGUoITApe2xldCAkPXRoaXMuX3N0YXRlVG9rZW47aWYoJD09PW51bGwpcmV0dXJuO2xldCBYPWF3YWl0IHRoaXMuX3NlbmRDb250aW51YXRpb24oJCkse2JhdGNoZXM6UX09YXdhaXQgdjEoWCksWj0hMTtmb3IobGV0IEogb2YgUSl7aWYoSi5udW1Sb3dzPT09MCl7bGV0IFk9Si5tZXRhZGF0YT8uZ2V0KFQxKTtpZihZKXt0aGlzLl9zdGF0ZVRva2VuPVksWj0hMDtjb250aW51ZX1pZih4MShKKSlKPWF3YWl0IEhYKEosdGhpcy5fZXh0ZXJuYWxDb25maWcpO2Vsc2V7YzAoSix0aGlzLl9vbkxvZyk7Y29udGludWV9fXlpZWxkIGgxKEopfWlmKCFaKWJyZWFrfX1hc3luYyBuZXh0V2l0aFRva2VuKCl7bGV0ICQ9Im5leHRXaXRoVG9rZW4gcmVxdWlyZXMgb25lIGRhdGEgYmF0Y2ggcGVyIHJlc3BvbnNlOyB0aGUgdXBzdHJlYW0gd29ya2VyIGJ1ZmZlcmVkIG11bHRpcGxlIChjb25maWd1cmVkIG1heF9yZXNwb25zZV9ieXRlcz8pIjt3aGlsZSh0aGlzLl9wZW5kaW5nQmF0Y2hlcy5sZW5ndGg+MCl7bGV0IFk9dGhpcy5fcGVuZGluZ0JhdGNoZXMuc2hpZnQoKTtpZihZLm51bVJvd3M9PT0wKWlmKHgxKFkpKVk9YXdhaXQgSFgoWSx0aGlzLl9leHRlcm5hbENvbmZpZyk7ZWxzZXtjMChZLHRoaXMuX29uTG9nKTtjb250aW51ZX1pZih0aGlzLl9wZW5kaW5nQmF0Y2hlcy5zb21lKChIKT0+SC5udW1Sb3dzPjB8fHgxKEgpKSl0aHJvdyBFcnJvcigkKTtyZXR1cm57cm93czpoMShZKSx0b2tlbjp0aGlzLl9yZXN1bWVUb2tlbigpfX1pZih0aGlzLl9maW5pc2hlZHx8dGhpcy5fc3RhdGVUb2tlbj09PW51bGwpcmV0dXJuIHRoaXMuX2ZpbmlzaGVkPSEwLG51bGw7bGV0IFg9YXdhaXQgdGhpcy5fc2VuZENvbnRpbnVhdGlvbih0aGlzLl9zdGF0ZVRva2VuKSx7YmF0Y2hlczpRfT1hd2FpdCB2MShYKSxaPW51bGwsSj1udWxsO2ZvcihsZXQgWSBvZiBRKXtpZihZLm51bVJvd3M9PT0wKXtsZXQgSD1ZLm1ldGFkYXRhPy5nZXQoVDEpO2lmKEgpe0o9SDtjb250aW51ZX1pZih4MShZKSlZPWF3YWl0IEhYKFksdGhpcy5fZXh0ZXJuYWxDb25maWcpO2Vsc2V7YzAoWSx0aGlzLl9vbkxvZyk7Y29udGludWV9fWlmKFohPT1udWxsKXRocm93IEVycm9yKCQpO1o9aDEoWSl9aWYodGhpcy5fc3RhdGVUb2tlbj1KLFo9PT1udWxsKXJldHVybiB0aGlzLl9maW5pc2hlZD0hMCxudWxsO3JldHVybntyb3dzOlosdG9rZW46dGhpcy5fcmVzdW1lVG9rZW4oKX19c2Vla1RvVG9rZW4oJCl7bGV0e2N1cnNvcjpYLGNhbGxUb2tlbjpRfT1YVygkKTt0aGlzLl9wZW5kaW5nQmF0Y2hlcz1bXSx0aGlzLl9zdGF0ZVRva2VuPVgsdGhpcy5fY2FsbFN0YXRlVG9rZW49USx0aGlzLl9maW5pc2hlZD0hMX1hc3luYyBfc2VuZENvbnRpbnVhdGlvbigkKXtsZXQgWD1uZXcgQihbXSksUT10aGlzLl90b2tlbk1ldGFkYXRhKCQpLFo9bmV3IGwoWC5maWVsZHMpLEo9Qyh7dHlwZTpaLGxlbmd0aDoxLGNoaWxkcmVuOltdLG51bGxDb3VudDowfSksWT1uZXcgZyhYLEosUSksSD1MNihYLFtZXSksVz1hd2FpdCB0aGlzLl9wb3N0KGAke3RoaXMuX2Jhc2VVcmx9JHt0aGlzLl9wcmVmaXh9LyR7dGhpcy5fbWV0aG9kfS9leGNoYW5nZWAsSCk7aWYoVy5zdGF0dXM9PT00MDEpdGhyb3cgbmV3IEI4KCJBdXRoZW50aWNhdGlvbkVycm9yIiwiQXV0aGVudGljYXRpb24gcmVxdWlyZWQiLCIiKTtyZXR1cm4gdGhpcy5fcmVhZFJlc3BvbnNlKFcpfWNsb3NlKCl7fX1MMCgpO3ZhciBOUD0iX191cGxvYWRfdXJsX18iLHc5PW5ldyBCKFtuZXcgdygiY291bnQiLG5ldyBiOCwhMSldKTthc3luYyBmdW5jdGlvbiBWOSgkLFgsUSxaKXtsZXQgSj1XWCh3OSx7Y291bnQ6QmlnSW50KFEpfSxOUCksWT17IkNvbnRlbnQtVHlwZSI6ZzF9O2lmKFopWS5BdXRob3JpemF0aW9uPVo7bGV0IEg9YXdhaXQgZmV0Y2goYCR7JH0ke1h9LyR7TlB9L2luaXRgLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6WSxib2R5Okp9KTtpZihILnN0YXR1cz09PTQwNCl0aHJvdyBuZXcgQjgoIk5vdFN1cHBvcnRlZCIsIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHVwbG9hZCBVUkxzIiwiIik7aWYoSC5zdGF0dXM9PT00MDEpdGhyb3cgbmV3IEI4KCJBdXRoZW50aWNhdGlvbkVycm9yIiwiQXV0aGVudGljYXRpb24gcmVxdWlyZWQiLCIiKTtpZighSC5vayl0aHJvdyBuZXcgQjgoIkh0dHBFcnJvciIsYF9fdXBsb2FkX3VybF9fL2luaXQgZmFpbGVkOiBIVFRQICR7SC5zdGF0dXN9YCwiIik7bGV0IFc9bmV3IFVpbnQ4QXJyYXkoYXdhaXQgSC5hcnJheUJ1ZmZlcigpKSxQPWF3YWl0IEE4LmZyb20oVyk7YXdhaXQgUC5vcGVuKCk7bGV0IEc9W107Zm9yKGxldCBxIG9mIFAucmVhZEFsbCgpKXtpZihxLm51bVJvd3M9PT0wKWNvbnRpbnVlO2ZvcihsZXQgTD0wO0w8cS5udW1Sb3dzO0wrKyl7bGV0IE49cS5nZXRDaGlsZEF0KDApPy5nZXQoTCksVT1xLmdldENoaWxkQXQoMSk/LmdldChMKSxrPXEuZ2V0Q2hpbGRBdCgyKT8uZ2V0KEwpLFM7aWYoayBpbnN0YW5jZW9mIERhdGUpUz1rO2Vsc2UgaWYodHlwZW9mIGs9PT0iYmlnaW50IilTPW5ldyBEYXRlKE51bWJlcihrLzEwMDBuKSk7ZWxzZSBpZih0eXBlb2Ygaz09PSJudW1iZXIiKVM9bmV3IERhdGUoayk7ZWxzZSBTPW5ldyBEYXRlO0cucHVzaCh7dXBsb2FkVXJsOk4sZG93bmxvYWRVcmw6VSxleHBpcmVzQXQ6U30pfX1pZihHLmxlbmd0aD09PTApdGhyb3cgbmV3IEI4KCJQcm90b2NvbEVycm9yIiwiU2VydmVyIHJldHVybmVkIG5vIHVwbG9hZCBVUkxzIiwiIik7cmV0dXJuIEd9YXN5bmMgZnVuY3Rpb24gQjkoJCxYKXtsZXQgUT1hd2FpdCBBOC5mcm9tKCQpO2F3YWl0IFEub3BlbigpO2xldCBaPVEuc2NoZW1hO2lmKCFaKXRocm93IG5ldyBCOCgiUHJvdG9jb2xFcnJvciIsIk9yaWdpbmFsIHJlcXVlc3QgYm9keSBoYXMgbm8gc2NoZW1hIiwiIik7bGV0IEo9US5yZWFkQWxsKCk7aWYoSi5sZW5ndGg9PT0wKXRocm93IG5ldyBCOCgiUHJvdG9jb2xFcnJvciIsIk9yaWdpbmFsIHJlcXVlc3QgYm9keSBoYXMgbm8gYmF0Y2hlcyIsIiIpO2xldCBIPUpbMF0ubWV0YWRhdGE/P25ldyBNYXAsVz1QUChaLFgpLFA9bmV3IE1hcChXLm1ldGFkYXRhPz9uZXcgTWFwKSxHPUguZ2V0KENaKSxxPUguZ2V0KE9aKT8/eTQ7aWYoRylQLnNldChDWixHKTtQLnNldChPWixxKTtmb3IobGV0W1Usa11vZiBIKWlmKCFQLmhhcyhVKSlQLnNldChVLGspO2xldHtSZWNvcmRCYXRjaDpMfT1hd2FpdCBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChMMCgpLEdLKSksTj1uZXcgTChaLFcuZGF0YSxQKTtyZXR1cm4gTDYoWixbTl0pfWFzeW5jIGZ1bmN0aW9uIFFXKCQsWCl7bGV0IFo9KGF3YWl0IFY5KFguYmFzZVVybCxYLnByZWZpeCwxLFguYXV0aG9yaXphdGlvbikpWzBdO2lmKFgudXJsVmFsaWRhdG9yKVgudXJsVmFsaWRhdG9yKFoudXBsb2FkVXJsKSxYLnVybFZhbGlkYXRvcihaLmRvd25sb2FkVXJsKTtsZXQgSj1hd2FpdCBmZXRjaChaLnVwbG9hZFVybCx7bWV0aG9kOiJQVVQiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOmcxfSxib2R5OiR9KTtpZighSi5vayl0aHJvdyBuZXcgQjgoIkV4dGVybmFsVXBsb2FkRmFpbGVkIixgUFVUIHRvIHVwbG9hZCBVUkwgZmFpbGVkOiBIVFRQICR7Si5zdGF0dXN9YCwiIik7cmV0dXJuIEI5KCQsWi5kb3dubG9hZFVybCl9ZnVuY3Rpb24gSTkoJCxYKXtsZXQgUT0oWD8ucHJlZml4Pz8iIikucmVwbGFjZSgvXC8rJC8sIiIpLFo9WD8ub25Mb2csSj1YPy5jb21wcmVzc2lvbkxldmVsLFk9WD8uYXV0aG9yaXphdGlvbixIPVg/LmV4dGVybmFsTG9jYXRpb24sVz1udWxsLFA9IiIsRyxxLEw9ITEsTj1udWxsO2Z1bmN0aW9uIFUoail7bGV0IFo4PXpQKGouaGVhZGVycyk7aWYoWjgubWF4UmVxdWVzdEJ5dGVzIT1udWxsfHxaOC51cGxvYWRVcmxTdXBwb3J0KU49Wjh9YXN5bmMgZnVuY3Rpb24gayhqKXtsZXQgWjg9RVAoTik/TjpudWxsO2lmKCFaOClyZXR1cm4gajtpZighWjgudXBsb2FkVXJsU3VwcG9ydClyZXR1cm4gajtpZihaOC5tYXhSZXF1ZXN0Qnl0ZXM9PW51bGx8fGouYnl0ZUxlbmd0aDw9WjgubWF4UmVxdWVzdEJ5dGVzKXJldHVybiBqO3JldHVybiBRVyhqLHtiYXNlVXJsOiQscHJlZml4OlEsYXV0aG9yaXphdGlvbjpZLHVybFZhbGlkYXRvcjpIPy51cmxWYWxpZGF0b3I/P251bGx9KX1hc3luYyBmdW5jdGlvbiBTKGosWjgpe2xldCAkMD1hd2FpdCBrKFo4KSxFOD1hd2FpdCBmZXRjaChqLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6UDgoKSxib2R5OmF3YWl0IEQ4KCQwKX0pO2lmKFUoRTgpLEU4LnN0YXR1cz09PTQxMyYmTj8udXBsb2FkVXJsU3VwcG9ydCYmWjguYnl0ZUxlbmd0aD4wKXtsZXQgSTg9YXdhaXQgUVcoWjgse2Jhc2VVcmw6JCxwcmVmaXg6USxhdXRob3JpemF0aW9uOlksdXJsVmFsaWRhdG9yOkg/LnVybFZhbGlkYXRvcj8/bnVsbH0pO0U4PWF3YWl0IGZldGNoKGose21ldGhvZDoiUE9TVCIsaGVhZGVyczpQOCgpLGJvZHk6YXdhaXQgRDgoSTgpfSksVShFOCl9cmV0dXJuIEU4fWFzeW5jIGZ1bmN0aW9uIHMoKXtpZihMfHxKPT1udWxsKXJldHVybjt0cnl7bGV0IGo9YXdhaXQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAockgoKSxXUCkpO0c9ai56c3RkQ29tcHJlc3MscT1qLnpzdGREZWNvbXByZXNzfWNhdGNoe31MPSEwfWZ1bmN0aW9uIFA4KCl7bGV0IGo9eyJDb250ZW50LVR5cGUiOmcxfTtpZihKIT1udWxsJiZHKWpbIkNvbnRlbnQtRW5jb2RpbmciXT0ienN0ZCI7aWYoSiE9bnVsbCYmcSlqWyJBY2NlcHQtRW5jb2RpbmciXT0ienN0ZCI7aWYoWSlqLkF1dGhvcml6YXRpb249WTtyZXR1cm4gan1hc3luYyBmdW5jdGlvbiBEOChqKXtpZihKIT1udWxsJiZHKXJldHVybiBhd2FpdCBHKGosSik7cmV0dXJuIGp9ZnVuY3Rpb24gVDgoail7aWYoai5zdGF0dXM9PT00MDEpdGhyb3cgbmV3IEI4KCJBdXRoZW50aWNhdGlvbkVycm9yIiwiQXV0aGVudGljYXRpb24gcmVxdWlyZWQiLCIiKX1hc3luYyBmdW5jdGlvbiB4JChqKXtsZXQgWjg9bmV3IFVpbnQ4QXJyYXkoYXdhaXQgai5hcnJheUJ1ZmZlcigpKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgTVEoai5oZWFkZXJzLFo4LHEpKX1hc3luYyBmdW5jdGlvbiB4OCgpe2lmKFcpcmV0dXJuIFc7YXdhaXQgcygpO2xldCBqPWF3YWl0ICRXKCQse3ByZWZpeDpRLGF1dGhvcml6YXRpb246WSxjb21wcmVzc2lvbkxldmVsOkosY29tcHJlc3NGbjpHLGRlY29tcHJlc3NGbjpxfSk7cmV0dXJuIFc9bmV3IE1hcChqLm1ldGhvZHMubWFwKChaOCk9PltaOC5uYW1lLFo4XSkpLFA9ai5wcm90b2NvbFZlcnNpb24sV31yZXR1cm57YXN5bmMgY2FsbChqLFo4KXthd2FpdCBzKCk7bGV0IEU4PShhd2FpdCB4OCgpKS5nZXQoaik7aWYoIUU4KXRocm93IEVycm9yKGBVbmtub3duIG1ldGhvZDogJyR7an0nYCk7bGV0IEk4PXsuLi5FOC5kZWZhdWx0cz8/e30sLi4uWjg/P3t9fSx1MD1XWChFOC5wYXJhbXNTY2hlbWEsSTgsaix7cHJvdG9jb2xWZXJzaW9uOlB9KSxBMD1hd2FpdCBTKGAkeyR9JHtRfS8ke2p9YCx1MCk7VDgoQTApO2xldCBVMD1hd2FpdCB4JChBMCkse2JhdGNoZXM6Rzh9PWF3YWl0IHYxKFUwKSxpPW51bGw7Zm9yKGxldCBCMCBvZiBHOCl7aWYoQjAubnVtUm93cz09PTApaWYoeDEoQjApKUIwPWF3YWl0IEhYKEIwLEgpO2Vsc2V7YzAoQjAsWik7Y29udGludWV9aT1CMH1pZighaSlyZXR1cm4gbnVsbDtsZXQgdzg9aDEoaSk7aWYodzgubGVuZ3RoPT09MClyZXR1cm4gbnVsbDtsZXQgWTA9dzhbMF07aWYoRTgucmVzdWx0U2NoZW1hLmZpZWxkcy5sZW5ndGg9PT0wKXJldHVybiBudWxsO3JldHVybiBZMH0sYXN5bmMgc3RyZWFtKGosWjgpe2F3YWl0IHMoKTtsZXQgRTg9KGF3YWl0IHg4KCkpLmdldChqKTtpZighRTgpdGhyb3cgRXJyb3IoYFVua25vd24gbWV0aG9kOiAnJHtqfSdgKTtsZXQgSTg9ey4uLkU4LmRlZmF1bHRzPz97fSwuLi5aOD8/e319LHUwPVdYKEU4LnBhcmFtc1NjaGVtYSxJOCxqLHtwcm90b2NvbFZlcnNpb246UH0pLEEwPWF3YWl0IFMoYCR7JH0ke1F9LyR7an0vaW5pdGAsdTApO1Q4KEEwKTtsZXQgVTA9YXdhaXQgeCQoQTApLEc4PW51bGwsaT1udWxsLHc4PW51bGwsWTA9W10sQjA9ITEsWDE9bnVsbDtpZihFOC5oZWFkZXJTY2hlbWEpe2xldCBONj1hd2FpdCBMUChVMCkseTE9YXdhaXQgTjYucmVhZFN0cmVhbSgpO2lmKHkxKWZvcihsZXQgbDggb2YgeTEuYmF0Y2hlcyl7aWYobDgubnVtUm93cz09PTApe2MwKGw4LFopO2NvbnRpbnVlfWxldCBBMT1oMShsOCk7aWYoQTEubGVuZ3RoPjApRzg9QTFbMF19bGV0IEokPWF3YWl0IE42LnJlYWRTdHJlYW0oKTtpZihKJClYMT1KJC5zY2hlbWE7bGV0IEgwPVtdO2lmKEokKWZvcihsZXQgbDggb2YgSiQuYmF0Y2hlcyl7aWYobDgubnVtUm93cz09PTApe2xldCBBMT1sOC5tZXRhZGF0YT8uZ2V0KFQxKTtpZihBMSl7aT1BMSx3OD1sOC5tZXRhZGF0YT8uZ2V0KGtaKT8/dzg7Y29udGludWV9aWYobDgubWV0YWRhdGE/LmdldChKWCk9PT0iRVhDRVBUSU9OIil7SDAucHVzaChsOCk7Y29udGludWV9YzAobDgsWik7Y29udGludWV9WTAucHVzaChsOCl9aWYoSDAubGVuZ3RoPjApaWYoWTAubGVuZ3RoPjB8fGkhPT1udWxsKVkwLnB1c2goLi4uSDApO2Vsc2UgZm9yKGxldCBsOCBvZiBIMCljMChsOCxaKTtpZighSiQmJiFpKUIwPSEwfWVsc2V7bGV0e3NjaGVtYTpONixiYXRjaGVzOnkxfT1hd2FpdCB2MShVMCk7WDE9TjY7bGV0IEokPVtdO2ZvcihsZXQgSDAgb2YgeTEpe2lmKEgwLm51bVJvd3M9PT0wKXtsZXQgbDg9SDAubWV0YWRhdGE/LmdldChUMSk7aWYobDgpe2k9bDgsdzg9SDAubWV0YWRhdGE/LmdldChrWik/P3c4O2NvbnRpbnVlfWlmKEgwLm1ldGFkYXRhPy5nZXQoSlgpPT09IkVYQ0VQVElPTiIpe0okLnB1c2goSDApO2NvbnRpbnVlfWMwKEgwLFopO2NvbnRpbnVlfVkwLnB1c2goSDApfWlmKEokLmxlbmd0aD4wKWlmKFkwLmxlbmd0aD4wfHxpIT09bnVsbClZMC5wdXNoKC4uLkokKTtlbHNlIGZvcihsZXQgSDAgb2YgSiQpYzAoSDAsWil9aWYoWTAubGVuZ3RoPT09MCYmaT09PW51bGwpQjA9ITA7bGV0IExRPShYMSYmWDEuZmllbGRzLmxlbmd0aD4wP1gxOm51bGwpPz8oWTAubGVuZ3RoPjA/WTBbMF0uc2NoZW1hOm51bGwpPz9FOC5vdXRwdXRTY2hlbWE/P0U4LnJlc3VsdFNjaGVtYTtyZXR1cm4gbmV3IG80KHtiYXNlVXJsOiQscHJlZml4OlEsbWV0aG9kOmosc3RhdGVUb2tlbjppLGNhbGxTdGF0ZVRva2VuOnc4LG91dHB1dFNjaGVtYTpMUSxpbnB1dFNjaGVtYTpFOC5pbnB1dFNjaGVtYSxvbkxvZzpaLHBlbmRpbmdCYXRjaGVzOlkwLGZpbmlzaGVkOkIwLGhlYWRlcjpHOCxjb21wcmVzc2lvbkxldmVsOkosY29tcHJlc3NGbjpHLGRlY29tcHJlc3NGbjpxLGF1dGhvcml6YXRpb246WSxleHRlcm5hbENvbmZpZzpILHBvc3RGbjpTfSl9LGFzeW5jIHJlc3VtZVN0cmVhbShqLFo4LCQwKXthd2FpdCBzKCk7bGV0e2N1cnNvcjpFOCxjYWxsVG9rZW46STh9PVhXKFo4KTtyZXR1cm4gbmV3IG80KHtiYXNlVXJsOiQscHJlZml4OlEsbWV0aG9kOmosc3RhdGVUb2tlbjpFOCxjYWxsU3RhdGVUb2tlbjpJOCxvdXRwdXRTY2hlbWE6JDA/P25ldyBCKFtdKSxvbkxvZzpaLHBlbmRpbmdCYXRjaGVzOltdLGZpbmlzaGVkOiExLGhlYWRlcjpudWxsLGNvbXByZXNzaW9uTGV2ZWw6Sixjb21wcmVzc0ZuOkcsZGVjb21wcmVzc0ZuOnEsYXV0aG9yaXphdGlvbjpZLGV4dGVybmFsQ29uZmlnOkgscG9zdEZuOlN9KX0sYXN5bmMgZGVzY3JpYmUoKXtyZXR1cm4gYXdhaXQgcygpLCRXKCQse3ByZWZpeDpRLGF1dGhvcml6YXRpb246WSxjb21wcmVzc2lvbkxldmVsOkosY29tcHJlc3NGbjpHLGRlY29tcHJlc3NGbjpxfSl9LGNsb3NlKCl7fX19ZXhwb3J0e3JLIGFzIHNjaGVtYVRvQXJndW1lbnRTcGVjcyxJOSBhcyBodHRwQ29ubmVjdCxlJCBhcyBkZXNlcmlhbGl6ZVNjaGVtYSxhSyBhcyBkZXNlcmlhbGl6ZUF0dGFjaE9wdGlvblNwZWNzLHU4IGFzIFZnaUNsaWVudEVycm9yLGdIIGFzIFZnaUNsaWVudCxLOCBhcyBUeXBlSWQsREggYXMgRnVuY3Rpb25UeXBlfTsK";
14
+
15
+ function decodeBase64(b64: string): Uint8Array {
16
+ // atob is available on Node >=16, Bun, Deno, and workerd.
17
+ const bin = atob(b64);
18
+ const out = new Uint8Array(bin.length);
19
+ for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);
20
+ return out;
21
+ }
22
+
23
+ /** The vendored VGI browser client bundle, decoded to its raw bytes. */
24
+ export const CLIENT_BUNDLE_BYTES: Uint8Array = decodeBase64(CLIENT_BUNDLE_B64);